Blender  V3.3
eevee_camera.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2021 Blender Foundation. */
3 
4 #pragma once
5 
10 #include "eevee_shader_shared.hh"
11 
12 namespace blender::eevee {
13 
14 class Instance;
15 
16 static const float cubeface_mat[6][4][4] = {
17  /* Pos X */
18  {{0.0f, 0.0f, -1.0f, 0.0f},
19  {0.0f, -1.0f, 0.0f, 0.0f},
20  {-1.0f, 0.0f, 0.0f, 0.0f},
21  {0.0f, 0.0f, 0.0f, 1.0f}},
22  /* Neg X */
23  {{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  /* Pos Y */
28  {{1.0f, 0.0f, 0.0f, 0.0f},
29  {0.0f, 0.0f, -1.0f, 0.0f},
30  {0.0f, 1.0f, 0.0f, 0.0f},
31  {0.0f, 0.0f, 0.0f, 1.0f}},
32  /* Neg Y */
33  {{1.0f, 0.0f, 0.0f, 0.0f},
34  {0.0f, 0.0f, 1.0f, 0.0f},
35  {0.0f, -1.0f, 0.0f, 0.0f},
36  {0.0f, 0.0f, 0.0f, 1.0f}},
37  /* Pos Z */
38  {{1.0f, 0.0f, 0.0f, 0.0f},
39  {0.0f, -1.0f, 0.0f, 0.0f},
40  {0.0f, 0.0f, -1.0f, 0.0f},
41  {0.0f, 0.0f, 0.0f, 1.0f}},
42  /* Neg Z */
43  {{-1.0f, 0.0f, 0.0f, 0.0f},
44  {0.0f, -1.0f, 0.0f, 0.0f},
45  {0.0f, 0.0f, 1.0f, 0.0f},
46  {0.0f, 0.0f, 0.0f, 1.0f}},
47 };
48 
49 inline void cubeface_winmat_get(float4x4 &winmat, float near, float far)
50 {
51  /* Simple 90° FOV projection. */
52  perspective_m4(winmat.ptr(), -near, near, -near, near, near, far);
53 }
54 
55 /* -------------------------------------------------------------------- */
59 inline bool operator==(const CameraData &a, const CameraData &b)
60 {
61  return compare_m4m4(a.persmat.ptr(), b.persmat.ptr(), FLT_MIN) && (a.uv_scale == b.uv_scale) &&
62  (a.uv_bias == b.uv_bias) && (a.equirect_scale == b.equirect_scale) &&
63  (a.equirect_bias == b.equirect_bias) && (a.fisheye_fov == b.fisheye_fov) &&
64  (a.fisheye_lens == b.fisheye_lens) && (a.type == b.type);
65 }
66 
67 inline bool operator!=(const CameraData &a, const CameraData &b)
68 {
69  return !(a == b);
70 }
71 
74 /* -------------------------------------------------------------------- */
81 class Camera {
82  private:
83  Instance &inst_;
84 
86  CameraDataBuf data_;
87 
88  public:
89  Camera(Instance &inst) : inst_(inst){};
90  ~Camera(){};
91 
92  void init();
93  void sync();
94 
98  const CameraData &data_get() const
99  {
100  BLI_assert(data_.initialized);
101  return data_;
102  }
103  const GPUUniformBuf *ubo_get() const
104  {
105  return data_;
106  }
107  bool is_panoramic() const
108  {
109  return eevee::is_panoramic(data_.type);
110  }
111  bool is_orthographic() const
112  {
113  return data_.type == CAMERA_ORTHO;
114  }
115  const float3 &position() const
116  {
117  return *reinterpret_cast<const float3 *>(data_.viewinv[3]);
118  }
119  const float3 &forward() const
120  {
121  return *reinterpret_cast<const float3 *>(data_.viewinv[2]);
122  }
123 };
124 
127 } // namespace blender::eevee
#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)
Definition: math_geom.c:4542
bool compare_m4m4(const float mat1[4][4], const float mat2[4][4], float limit)
Definition: math_matrix.c:1425
struct GPUUniformBuf GPUUniformBuf
const CameraData & data_get() const
Definition: eevee_camera.hh:98
bool is_panoramic() const
Camera(Instance &inst)
Definition: eevee_camera.hh:89
bool is_orthographic() const
const GPUUniformBuf * ubo_get() const
const float3 & forward() const
const float3 & position() const
A running instance of the engine.
smooth(Type::VEC3, "prev") .smooth(Type CameraData
T * data_
Definition: eval_output.h:163
static unsigned a[3]
Definition: RandGen.cpp:78
void cubeface_winmat_get(float4x4 &winmat, float near, float far)
Definition: eevee_camera.hh:49
bool operator!=(const CameraData &a, const CameraData &b)
Definition: eevee_camera.hh:67
bool operator==(const CameraData &a, const CameraData &b)
Definition: eevee_camera.hh:59
static const float cubeface_mat[6][4][4]
Definition: eevee_camera.hh:16
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
c_style_float4x4 & ptr()