Blender V5.0
eevee_camera.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2021 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
10
11#include "BLI_math_geom.h"
12#include "BLI_math_matrix.h"
13
14#include "BKE_camera.h"
15
17
18namespace blender::eevee {
19
20class Instance;
21
22inline float4x4 cubeface_mat(int face)
23{
24 switch (face) {
25 default:
26 case 0:
27 /* Pos X */
28 return float4x4({0.0f, 0.0f, -1.0f, 0.0f},
29 {0.0f, -1.0f, 0.0f, 0.0f},
30 {-1.0f, 0.0f, 0.0f, 0.0f},
31 {0.0f, 0.0f, 0.0f, 1.0f});
32 case 1:
33 /* Neg X */
34 return float4x4({0.0f, 0.0f, 1.0f, 0.0f},
35 {0.0f, -1.0f, 0.0f, 0.0f},
36 {1.0f, 0.0f, 0.0f, 0.0f},
37 {0.0f, 0.0f, 0.0f, 1.0f});
38 case 2:
39 /* Pos Y */
40 return float4x4({1.0f, 0.0f, 0.0f, 0.0f},
41 {0.0f, 0.0f, -1.0f, 0.0f},
42 {0.0f, 1.0f, 0.0f, 0.0f},
43 {0.0f, 0.0f, 0.0f, 1.0f});
44 case 3:
45 /* Neg Y */
46 return float4x4({1.0f, 0.0f, 0.0f, 0.0f},
47 {0.0f, 0.0f, 1.0f, 0.0f},
48 {0.0f, -1.0f, 0.0f, 0.0f},
49 {0.0f, 0.0f, 0.0f, 1.0f});
50 case 4:
51 /* Pos Z */
52 return float4x4({1.0f, 0.0f, 0.0f, 0.0f},
53 {0.0f, -1.0f, 0.0f, 0.0f},
54 {0.0f, 0.0f, -1.0f, 0.0f},
55 {0.0f, 0.0f, 0.0f, 1.0f});
56 case 5:
57 /* Neg Z */
58 return float4x4({-1.0f, 0.0f, 0.0f, 0.0f},
59 {0.0f, -1.0f, 0.0f, 0.0f},
60 {0.0f, 0.0f, 1.0f, 0.0f},
61 {0.0f, 0.0f, 0.0f, 1.0f});
62 }
63}
64
65inline void cubeface_winmat_get(float4x4 &winmat, float near, float far)
66{
67 /* Simple 90 degree FOV projection. */
68 perspective_m4(winmat.ptr(), -near, near, -near, near, near, far);
69}
70
71/* -------------------------------------------------------------------- */
74
75inline bool operator==(const CameraData &a, const CameraData &b)
76{
77 return compare_m4m4(a.persmat.ptr(), b.persmat.ptr(), FLT_MIN) && (a.uv_scale == b.uv_scale) &&
78 (a.uv_bias == b.uv_bias) && (a.equirect_scale == b.equirect_scale) &&
79 (a.equirect_bias == b.equirect_bias) && (a.fisheye_fov == b.fisheye_fov) &&
80 (a.fisheye_lens == b.fisheye_lens) && (a.type == b.type);
81}
82
83inline bool operator!=(const CameraData &a, const CameraData &b)
84{
85 return !(a == b);
86}
87
89
90/* -------------------------------------------------------------------- */
93
97class Camera {
98 private:
99 Instance &inst_;
100
101 CameraData &data_;
102
103 struct {
105 float radius;
106 } bound_sphere;
107
108 float overscan_ = -1.0f;
109 bool overscan_changed_;
111 bool is_camera_object_ = false;
113 Object *last_camera_object_ = nullptr;
114 bool camera_changed_ = false;
115
116 public:
117 Camera(Instance &inst, CameraData &data) : inst_(inst), data_(data) {};
119
120 void init();
121 void sync();
122
126 const CameraData &data_get() const
127 {
128 BLI_assert(data_.initialized);
129 return data_;
130 }
131 bool is_panoramic() const
132 {
133 return eevee::is_panoramic(data_.type);
134 }
135 bool is_orthographic() const
136 {
137 return data_.type == CAMERA_ORTHO;
138 }
139 bool is_perspective() const
140 {
141 return data_.type == CAMERA_PERSP;
142 }
143 bool is_camera_object() const
144 {
145 return is_camera_object_;
146 }
147 const float3 &position() const
148 {
149 return data_.viewinv.location();
150 }
151 const float3 &forward() const
152 {
153 return data_.viewinv.z_axis();
154 }
155 const float3 &bound_center() const
156 {
157 return bound_sphere.center;
158 }
159 const float &bound_radius() const
160 {
161 return bound_sphere.radius;
162 }
163 float overscan() const
164 {
165 return overscan_;
166 }
167 bool overscan_changed() const
168 {
169 return overscan_changed_;
170 }
171 bool camera_changed() const
172 {
173 return camera_changed_;
174 }
175
176 private:
177 void update_bounds();
178
179 CameraParams v3d_camera_params_get() const;
180};
181
183
184} // namespace blender::eevee
Camera data-block and utility functions.
#define BLI_assert(a)
Definition BLI_assert.h:46
void perspective_m4(float mat[4][4], float left, float right, float bottom, float top, float nearClip, float farClip)
bool compare_m4m4(const float mat1[4][4], const float mat2[4][4], float limit)
BMesh const char void * data
const float3 & forward() const
const float3 & position() const
bool is_orthographic() const
bool overscan_changed() const
const float & bound_radius() const
const CameraData & data_get() const
Camera(Instance &inst, CameraData &data)
bool is_perspective() const
bool camera_changed() const
const float3 & bound_center() const
bool is_camera_object() const
A running instance of the engine.
void cubeface_winmat_get(float4x4 &winmat, float near, float far)
static bool is_panoramic(eCameraType type)
bool operator!=(const CameraData &a, const CameraData &b)
float4x4 cubeface_mat(int face)
bool operator==(const CameraData &a, const CameraData &b)
MatBase< float, 4, 4 > float4x4
VecBase< float, 3 > float3
const c_style_mat & ptr() const