Blender V4.3
Grid.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
12#include <cstring> // for memset
13#include <float.h>
14#include <stdint.h> // For POINTER_FROM_UINT, i.e. uintptr_t.
15#include <vector>
16
17#include "Geom.h"
18#include "GeomUtils.h"
19#include "Polygon.h"
20
22
23#include "BLI_utildefines.h"
24
25#ifdef WITH_CXX_GUARDEDALLOC
26# include "MEM_guardedalloc.h"
27#endif
28
29using namespace std;
30
31namespace Freestyle {
32
33using namespace Geometry;
34
35typedef vector<Polygon3r *> OccludersSet;
36
37//
38// Class to define cells used by the regular grid
39//
41
42class Cell {
43 public:
44 Cell(Vec3r &orig)
45 {
46 _orig = orig;
47 }
48
49 virtual ~Cell() {}
50
51 inline void addOccluder(Polygon3r *o)
52 {
53 if (o) {
54 _occluders.push_back(o);
55 }
56 }
57
58 inline const Vec3r &getOrigin()
59 {
60 return _orig;
61 }
62
64 {
65 return _occluders;
66 }
67
68 private:
69 Vec3r _orig;
70 OccludersSet _occluders;
71
72#ifdef WITH_CXX_GUARDEDALLOC
73 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:Cell")
74#endif
75};
76
78 public:
79 virtual ~GridVisitor(){}; // soc
80
81 virtual void discoverCell(Cell * /*cell*/) {}
82
83 virtual void examineOccluder(Polygon3r * /*occ*/) {}
84
85 virtual void finishCell(Cell * /*cell*/) {}
86
87 virtual bool stop()
88 {
89 return false;
90 }
91
92#ifdef WITH_CXX_GUARDEDALLOC
93 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:GridVisitor")
94#endif
95};
96
99 public:
101
102 virtual void examineOccluder(Polygon3r *occ);
103
105 {
106 return occluders_;
107 }
108
109 void clear()
110 {
111 occluders_.clear();
112 }
113
114 private:
115 OccludersSet &occluders_;
116};
117
122 // soc - changed order to remove warnings
123 public:
124 double u_, v_, t_;
125
126 private:
127 Polygon3r *occluder_;
128 Vec3r ray_org_, ray_dir_, cell_size_;
129 Cell *current_cell_;
130
131 public:
132 firstIntersectionGridVisitor(const Vec3r &ray_org, const Vec3r &ray_dir, const Vec3r &cell_size)
133 : GridVisitor(),
134 u_(0),
135 v_(0),
136 t_(DBL_MAX),
137 occluder_(0),
138 ray_org_(ray_org),
139 ray_dir_(ray_dir),
140 cell_size_(cell_size),
141 current_cell_(0)
142 {
143 }
144
146
147 virtual void discoverCell(Cell *cell)
148 {
149 current_cell_ = cell;
150 }
151
152 virtual void examineOccluder(Polygon3r *occ);
153
154 virtual bool stop();
155
157 {
158 return occluder_;
159 }
160};
161
162//
163// Class to define a regular grid used for ray casting computations
164//
166
167class Grid {
168 public:
170 Grid() {}
171
172 virtual ~Grid()
173 {
174 clear();
175 }
176
180 virtual void clear();
181
190 virtual void configure(const Vec3r &orig, const Vec3r &size, uint nb);
191
197 inline void getCellCoordinates(const Vec3r &p, Vec3u &res)
198 {
199 int tmp;
200 for (int i = 0; i < 3; i++) {
201 tmp = (int)((p[i] - _orig[i]) / _cell_size[i]);
202 if (tmp < 0) {
203 res[i] = 0;
204 }
205 else if ((uint)tmp >= _cells_nb[i]) {
206 res[i] = _cells_nb[i] - 1;
207 }
208 else {
209 res[i] = tmp;
210 }
211 }
212 }
213
215 virtual void fillCell(const Vec3u &coord, Cell &cell) = 0;
216
218 virtual Cell *getCell(const Vec3u &coord) = 0;
219
225 inline Cell *getCell(const Vec3r &p)
226 {
227 Vec3u coord;
228 getCellCoordinates(p, coord);
229 return getCell(coord);
230 }
231
239 inline void getCellOrigin(const Vec3u &cell_coord, Vec3r &orig)
240 {
241 for (uint i = 0; i < 3; i++) {
242 orig[i] = _orig[i] + cell_coord[i] * _cell_size[i];
243 }
244 }
245
254 inline void getCellBox(const Vec3u &cell_coord, Vec3r &min_out, Vec3r &max_out)
255 {
256 getCellOrigin(cell_coord, min_out);
257 max_out = min_out + _cell_size;
258 }
259
264 void insertOccluder(Polygon3r *occluder);
265
267 void addOccluder(Polygon3r *occluder)
268 {
269 _occluders.push_back(occluder);
270 }
271
276 void castRay(const Vec3r &orig, const Vec3r &end, OccludersSet &occluders, uint timestamp);
277
278 // Prepares to cast ray without generating OccludersSet
279 void initAcceleratedRay(const Vec3r &orig, const Vec3r &end, uint timestamp);
280
285 void castInfiniteRay(const Vec3r &orig,
286 const Vec3r &dir,
287 OccludersSet &occluders,
288 uint timestamp);
289
290 // Prepares to cast ray without generating OccludersSet.
291 bool initAcceleratedInfiniteRay(const Vec3r &orig, const Vec3r &dir, uint timestamp);
292
298 const Vec3r &orig, const Vec3r &dir, double &t, double &u, double &v, uint timestamp);
299
301 void initRay(const Vec3r &orig, const Vec3r &end, uint timestamp);
302
306 bool initInfiniteRay(const Vec3r &orig, const Vec3r &dir, uint timestamp);
307
309 inline const Vec3r &getOrigin() const
310 {
311 return _orig;
312 }
313
314 inline Vec3r gridSize() const
315 {
316 return _size;
317 }
318
319 inline Vec3r getCellSize() const
320 {
321 return _cell_size;
322 }
323
324 // ARB profiling only:
326 {
327 return &_occluders;
328 }
329
331 {
332 cerr << "Cells nb : " << _cells_nb << endl;
333 cerr << "Cell size : " << _cell_size << endl;
334 cerr << "Origin : " << _orig << endl;
335 cerr << "Occluders nb : " << _occluders.size() << endl;
336 }
337
338 protected:
340 inline void castRayInternal(GridVisitor &visitor)
341 {
342 Cell *current_cell = nullptr;
343 do {
344 current_cell = getCell(_current_cell);
345 if (current_cell) {
346 visitor.discoverCell(current_cell);
347 OccludersSet &occluders =
348 current_cell->getOccluders(); // FIXME: I had forgotten the ref &
349 for (OccludersSet::iterator it = occluders.begin(); it != occluders.end(); it++) {
350 if (POINTER_AS_UINT((*it)->userdata2) != _timestamp) {
351 (*it)->userdata2 = POINTER_FROM_UINT(_timestamp);
352 visitor.examineOccluder(*it);
353 }
354 }
355 visitor.finishCell(current_cell);
356 }
357 } while ((!visitor.stop()) && (nextRayCell(_current_cell, _current_cell)));
358 }
359
361 bool nextRayCell(Vec3u &current_cell, Vec3u &next_cell);
362
364
365 Vec3u _cells_nb; // number of cells for x,y,z axis
366 Vec3r _cell_size; // cell x,y,z dimensions
367 Vec3r _size; // grid x,y,x dimensions
368 Vec3r _orig; // grid origin
369
370 Vec3r _ray_dir; // direction vector for the ray
371 Vec3u _current_cell; // The current cell being processed (designated by its 3 coordinates)
372 Vec3r _pt; // Points corresponding to the incoming and outgoing intersections of one cell with
373 // the ray
374 real _t_end; // To know when we are at the end of the ray
376
377 // OccludersSet _ray_occluders; // Set storing the occluders contained in the cells traversed by
378 // a ray
379 OccludersSet _occluders; // List of all occluders inserted in the grid
380
381#ifdef WITH_CXX_GUARDEDALLOC
382 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:Grid")
383#endif
384};
385
386//
387// Class to walk through occluders in grid without building intermediate data structures
388//
390
392 public:
393 VirtualOccludersSet(Grid &_grid) : grid(_grid){};
396 Polygon3r *next(bool stopOnNewCell);
397
398 private:
399 Polygon3r *firstOccluderFromNextCell();
400 Grid &grid;
401 OccludersSet::iterator it, end;
402
403#ifdef WITH_CXX_GUARDEDALLOC
404 MEM_CXX_CLASS_ALLOC_FUNCS("Freestyle:VirtualOccludersSet")
405#endif
406};
407
408} /* namespace Freestyle */
unsigned int uint
#define POINTER_AS_UINT(i)
#define POINTER_FROM_UINT(i)
Configuration definitions.
Various tools for geometry.
Vectors and Matrices (useful type definitions)
Read Guarded memory(de)allocation.
Class to define a polygon.
ATTR_WARN_UNUSED_RESULT const BMVert * v
void addOccluder(Polygon3r *o)
Definition Grid.h:51
virtual ~Cell()
Definition Grid.h:49
const Vec3r & getOrigin()
Definition Grid.h:58
Cell(Vec3r &orig)
Definition Grid.h:44
OccludersSet & getOccluders()
Definition Grid.h:63
virtual void discoverCell(Cell *)
Definition Grid.h:81
virtual void examineOccluder(Polygon3r *)
Definition Grid.h:83
virtual void finishCell(Cell *)
Definition Grid.h:85
virtual bool stop()
Definition Grid.h:87
virtual ~GridVisitor()
Definition Grid.h:79
OccludersSet _occluders
Definition Grid.h:379
OccludersSet * getOccluders()
Definition Grid.h:325
Vec3r gridSize() const
Definition Grid.h:314
void initAcceleratedRay(const Vec3r &orig, const Vec3r &end, uint timestamp)
void getCellCoordinates(const Vec3r &p, Vec3u &res)
Definition Grid.h:197
const Vec3r & getOrigin() const
Definition Grid.h:309
bool initAcceleratedInfiniteRay(const Vec3r &orig, const Vec3r &dir, uint timestamp)
void castInfiniteRay(const Vec3r &orig, const Vec3r &dir, OccludersSet &occluders, uint timestamp)
Definition Grid.cpp:294
void getCellBox(const Vec3u &cell_coord, Vec3r &min_out, Vec3r &max_out)
Definition Grid.h:254
real _t_end
Definition Grid.h:374
void addOccluder(Polygon3r *occluder)
Definition Grid.h:267
bool nextRayCell(Vec3u &current_cell, Vec3u &next_cell)
Definition Grid.cpp:228
Vec3r getCellSize() const
Definition Grid.h:319
Vec3u _current_cell
Definition Grid.h:371
virtual void configure(const Vec3r &orig, const Vec3r &size, uint nb)
Definition Grid.cpp:100
Vec3r _cell_size
Definition Grid.h:366
void getCellOrigin(const Vec3u &cell_coord, Vec3r &orig)
Definition Grid.h:239
virtual ~Grid()
Definition Grid.h:172
Vec3r _pt
Definition Grid.h:372
bool initInfiniteRay(const Vec3r &orig, const Vec3r &dir, uint timestamp)
Definition Grid.cpp:345
Vec3r _size
Definition Grid.h:367
virtual void clear()
Definition Grid.cpp:84
virtual void fillCell(const Vec3u &coord, Cell &cell)=0
Polygon3r * castRayToFindFirstIntersection(const Vec3r &orig, const Vec3r &dir, double &t, double &u, double &v, uint timestamp)
Definition Grid.cpp:308
void insertOccluder(Polygon3r *occluder)
Definition Grid.cpp:144
void castRayInternal(GridVisitor &visitor)
Definition Grid.h:340
Vec3u _cells_nb
Definition Grid.h:365
void castRay(const Vec3r &orig, const Vec3r &end, OccludersSet &occluders, uint timestamp)
Definition Grid.cpp:287
virtual Cell * getCell(const Vec3u &coord)=0
void initRay(const Vec3r &orig, const Vec3r &end, uint timestamp)
Definition Grid.cpp:329
Vec3r _orig
Definition Grid.h:368
uint _timestamp
Definition Grid.h:363
void displayDebug()
Definition Grid.h:330
Cell * getCell(const Vec3r &p)
Definition Grid.h:225
Vec3r _ray_dir
Definition Grid.h:370
Polygon3r * next(bool stopOnNewCell)
VirtualOccludersSet(Grid &_grid)
Definition Grid.h:393
OccludersSet & occluders()
Definition Grid.h:104
allOccludersGridVisitor(OccludersSet &occluders)
Definition Grid.h:100
virtual void examineOccluder(Polygon3r *occ)
Definition Grid.cpp:21
virtual void discoverCell(Cell *cell)
Definition Grid.h:147
firstIntersectionGridVisitor(const Vec3r &ray_org, const Vec3r &ray_dir, const Vec3r &cell_size)
Definition Grid.h:132
virtual void examineOccluder(Polygon3r *occ)
Definition Grid.cpp:37
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
inherits from class Rep
Definition AppCanvas.cpp:20
vector< Polygon3r * > OccludersSet
Definition Grid.h:35
double real
Definition Precision.h:14