Blender V4.3
draw_view.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
20#include "DRW_gpu_wrapper.hh"
21#include "DRW_render.hh"
22
23#include "draw_shader_shared.hh"
24
25namespace blender::draw {
26
27class Manager;
28
29/* TODO: de-duplicate. */
33
34class View {
35 friend Manager;
36
37 protected:
47
48 const char *debug_name_;
49
50 int view_len_ = 0;
51
52 bool is_inverted_ = false;
53 bool do_visibility_ = true;
54 bool dirty_ = true;
55 bool frozen_ = false;
56 bool procedural_ = false;
57
58 public:
59 View(const char *name, int view_len = 1, bool procedural = false)
60 : visibility_buf_(name), debug_name_(name), view_len_(view_len), procedural_(procedural)
61 {
62 BLI_assert(view_len <= DRW_VIEW_MAX);
63 }
64
65 /* For compatibility with old system. Will be removed at some point. */
66 View(const char *name, const DRWView *view)
67 : visibility_buf_(name), debug_name_(name), view_len_(1)
68 {
69 this->sync(view);
70 }
71
72 void sync(const float4x4 &view_mat, const float4x4 &win_mat, int view_id = 0);
73
74 /* For compatibility with old system. Will be removed at some point. */
75 void sync(const DRWView *view);
76
78 void visibility_test(bool enable)
79 {
80 do_visibility_ = enable;
81 }
82
89
90 bool is_persp(int view_id = 0) const
91 {
92 BLI_assert(view_id < view_len_);
93 return data_[view_id].winmat[3][3] == 0.0f;
94 }
95
96 bool is_inverted(int view_id = 0) const
97 {
98 BLI_assert(view_id < view_len_);
99 UNUSED_VARS_NDEBUG(view_id);
100 return is_inverted_;
101 }
102
103 float far_clip(int view_id = 0) const
104 {
105 BLI_assert(view_id < view_len_);
106 if (is_persp(view_id)) {
107 return -data_[view_id].winmat[3][2] / (data_[view_id].winmat[2][2] + 1.0f);
108 }
109 return -(data_[view_id].winmat[3][2] - 1.0f) / data_[view_id].winmat[2][2];
110 }
111
112 float near_clip(int view_id = 0) const
113 {
114 BLI_assert(view_id < view_len_);
115 if (is_persp(view_id)) {
116 return -data_[view_id].winmat[3][2] / (data_[view_id].winmat[2][2] - 1.0f);
117 }
118 return -(data_[view_id].winmat[3][2] + 1.0f) / data_[view_id].winmat[2][2];
119 }
120
121 const float3 &location(int view_id = 0) const
122 {
123 BLI_assert(view_id < view_len_);
124 return data_[view_id].viewinv.location();
125 }
126
127 const float3 &forward(int view_id = 0) const
128 {
129 BLI_assert(view_id < view_len_);
130 return data_[view_id].viewinv.z_axis();
131 }
132
133 const float4x4 &viewmat(int view_id = 0) const
134 {
135 BLI_assert(view_id < view_len_);
136 return data_[view_id].viewmat;
137 }
138
139 const float4x4 &viewinv(int view_id = 0) const
140 {
141 BLI_assert(view_id < view_len_);
142 return data_[view_id].viewinv;
143 }
144
145 const float4x4 &winmat(int view_id = 0) const
146 {
147 BLI_assert(view_id < view_len_);
148 return data_[view_id].winmat;
149 }
150
151 const float4x4 &wininv(int view_id = 0) const
152 {
153 BLI_assert(view_id < view_len_);
154 return data_[view_id].wininv;
155 }
156
157 /* Compute and return the perspective matrix. */
158 const float4x4 persmat(int view_id = 0) const
159 {
160 BLI_assert(view_id < view_len_);
161 return data_[view_id].winmat * data_[view_id].viewmat;
162 }
163
165 {
166 return (view_len_ == 1) ? 0 : divide_ceil_u(view_len_, 32);
167 }
168
173
174 protected:
176 void bind();
177 virtual void compute_visibility(ObjectBoundsBuf &bounds,
178 ObjectInfosBuf &infos,
179 uint resource_len,
180 bool debug_freeze);
182
184
185 /* WARNING: These 3 functions must be called in order */
186 void frustum_boundbox_calc(int view_id);
187 void frustum_culling_planes_calc(int view_id);
188 void frustum_culling_sphere_calc(int view_id);
189};
190
191} // namespace blender::draw
#define BLI_assert(a)
Definition BLI_assert.h:50
MINLINE uint divide_ceil_u(uint a, uint b)
unsigned int uint
#define UNUSED_VARS_NDEBUG(...)
const float3 & location(int view_id=0) const
Definition draw_view.hh:121
UniformArrayBuffer< ViewCullingData, DRW_VIEW_MAX > culling_
Definition draw_view.hh:41
void visibility_test(bool enable)
Definition draw_view.hh:78
View(const char *name, const DRWView *view)
Definition draw_view.hh:66
View(const char *name, int view_len=1, bool procedural=false)
Definition draw_view.hh:59
VisibilityBuf visibility_buf_
Definition draw_view.hh:46
bool is_inverted(int view_id=0) const
Definition draw_view.hh:96
bool is_persp(int view_id=0) const
Definition draw_view.hh:90
const float4x4 & winmat(int view_id=0) const
Definition draw_view.hh:145
const float4x4 persmat(int view_id=0) const
Definition draw_view.hh:158
const float4x4 & viewmat(int view_id=0) const
Definition draw_view.hh:133
float near_clip(int view_id=0) const
Definition draw_view.hh:112
void compute_procedural_bounds()
Definition draw_view.cc:233
UniformArrayBuffer< ViewMatrices, DRW_VIEW_MAX > data_freeze_
Definition draw_view.hh:43
virtual void compute_visibility(ObjectBoundsBuf &bounds, ObjectInfosBuf &infos, uint resource_len, bool debug_freeze)
Definition draw_view.cc:247
UniformArrayBuffer< ViewMatrices, DRW_VIEW_MAX > data_
Definition draw_view.hh:40
UniformArrayBuffer< ViewCullingData, DRW_VIEW_MAX > culling_freeze_
Definition draw_view.hh:44
UniformArrayBuffer< ViewMatrices, DRW_VIEW_MAX > & matrices_ubo_get()
Definition draw_view.hh:169
const float4x4 & viewinv(int view_id=0) const
Definition draw_view.hh:139
virtual VisibilityBuf & get_visibility_buffer()
Definition draw_view.cc:304
void frustum_culling_sphere_calc(int view_id)
Definition draw_view.cc:106
const float4x4 & wininv(int view_id=0) const
Definition draw_view.hh:151
const float3 & forward(int view_id=0) const
Definition draw_view.hh:127
int visibility_word_per_draw() const
Definition draw_view.hh:164
void frustum_boundbox_calc(int view_id)
Definition draw_view.cc:44
float far_clip(int view_id=0) const
Definition draw_view.hh:103
const char * debug_name_
Definition draw_view.hh:48
void sync(const float4x4 &view_mat, const float4x4 &win_mat, int view_id=0)
Definition draw_view.cc:20
void frustum_culling_planes_calc(int view_id)
Definition draw_view.cc:90
#define DRW_VIEW_MAX