Blender V4.3
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
12
13namespace blender::eevee {
14
15class Instance;
16
17inline float4x4 cubeface_mat(int face)
18{
19 switch (face) {
20 default:
21 case 0:
22 /* Pos X */
23 return float4x4({0.0f, 0.0f, -1.0f, 0.0f},
24 {0.0f, -1.0f, 0.0f, 0.0f},
25 {-1.0f, 0.0f, 0.0f, 0.0f},
26 {0.0f, 0.0f, 0.0f, 1.0f});
27 case 1:
28 /* Neg X */
29 return float4x4({0.0f, 0.0f, 1.0f, 0.0f},
30 {0.0f, -1.0f, 0.0f, 0.0f},
31 {1.0f, 0.0f, 0.0f, 0.0f},
32 {0.0f, 0.0f, 0.0f, 1.0f});
33 case 2:
34 /* Pos Y */
35 return float4x4({1.0f, 0.0f, 0.0f, 0.0f},
36 {0.0f, 0.0f, -1.0f, 0.0f},
37 {0.0f, 1.0f, 0.0f, 0.0f},
38 {0.0f, 0.0f, 0.0f, 1.0f});
39 case 3:
40 /* Neg Y */
41 return float4x4({1.0f, 0.0f, 0.0f, 0.0f},
42 {0.0f, 0.0f, 1.0f, 0.0f},
43 {0.0f, -1.0f, 0.0f, 0.0f},
44 {0.0f, 0.0f, 0.0f, 1.0f});
45 case 4:
46 /* Pos Z */
47 return float4x4({1.0f, 0.0f, 0.0f, 0.0f},
48 {0.0f, -1.0f, 0.0f, 0.0f},
49 {0.0f, 0.0f, -1.0f, 0.0f},
50 {0.0f, 0.0f, 0.0f, 1.0f});
51 case 5:
52 /* Neg Z */
53 return float4x4({-1.0f, 0.0f, 0.0f, 0.0f},
54 {0.0f, -1.0f, 0.0f, 0.0f},
55 {0.0f, 0.0f, 1.0f, 0.0f},
56 {0.0f, 0.0f, 0.0f, 1.0f});
57 }
58}
59
60inline void cubeface_winmat_get(float4x4 &winmat, float near, float far)
61{
62 /* Simple 90 degree FOV projection. */
63 perspective_m4(winmat.ptr(), -near, near, -near, near, near, far);
64}
65
66/* -------------------------------------------------------------------- */
70inline bool operator==(const CameraData &a, const CameraData &b)
71{
72 return compare_m4m4(a.persmat.ptr(), b.persmat.ptr(), FLT_MIN) && (a.uv_scale == b.uv_scale) &&
73 (a.uv_bias == b.uv_bias) && (a.equirect_scale == b.equirect_scale) &&
74 (a.equirect_bias == b.equirect_bias) && (a.fisheye_fov == b.fisheye_fov) &&
75 (a.fisheye_lens == b.fisheye_lens) && (a.type == b.type);
76}
77
78inline bool operator!=(const CameraData &a, const CameraData &b)
79{
80 return !(a == b);
81}
82
85/* -------------------------------------------------------------------- */
92class Camera {
93 private:
94 Instance &inst_;
95
96 CameraData &data_;
97
98 struct {
100 float radius;
101 } bound_sphere;
102
103 float overscan_;
104 bool overscan_changed_;
106 bool is_camera_object_ = false;
108 Object *last_camera_object_ = nullptr;
109 bool camera_changed_ = false;
110
111 public:
112 Camera(Instance &inst, CameraData &data) : inst_(inst), data_(data){};
114
115 void init();
116 void sync();
117
121 const CameraData &data_get() const
122 {
123 BLI_assert(data_.initialized);
124 return data_;
125 }
126 bool is_panoramic() const
127 {
128 return eevee::is_panoramic(data_.type);
129 }
130 bool is_orthographic() const
131 {
132 return data_.type == CAMERA_ORTHO;
133 }
134 bool is_perspective() const
135 {
136 return data_.type == CAMERA_PERSP;
137 }
138 bool is_camera_object() const
139 {
140 return is_camera_object_;
141 }
142 const float3 &position() const
143 {
144 return data_.viewinv.location();
145 }
146 const float3 &forward() const
147 {
148 return data_.viewinv.z_axis();
149 }
150 const float3 &bound_center() const
151 {
152 return bound_sphere.center;
153 }
154 const float &bound_radius() const
155 {
156 return bound_sphere.radius;
157 }
158 float overscan() const
159 {
160 return overscan_;
161 }
162 bool overscan_changed() const
163 {
164 return overscan_changed_;
165 }
166 bool camera_changed() const
167 {
168 return camera_changed_;
169 }
170
171 private:
172 void update_bounds();
173};
174
177} // namespace blender::eevee
#define BLI_assert(a)
Definition BLI_assert.h:50
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)
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.
local_group_size(16, 16) .push_constant(Type b
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
const c_style_mat & ptr() const