23 occluders_.push_back(occ);
28 if (((inter.
x() >= box_min.
x()) && (inter.
x() < box_max.
x())) &&
29 ((inter.
y() >= box_min.
y()) && (inter.
y() < box_max.
y())) &&
30 ((inter.
z() >= box_min.
z()) && (inter.
z() < box_max.
z())))
43 Vec3d normal((occ)->getNormal());
46 double tmp_u, tmp_v, tmp_t;
47 if ((occ)->rayIntersect(ray_org_, ray_dir_, tmp_t, tmp_u, tmp_v)) {
48 if (
fabs(ray_dir_ * normal) > 0.0001) {
50 if (
inBox(ray_org_ + tmp_t * ray_dir_ / ray_dir_.
norm(),
55 Vec3d bboxdiag(_scene3d->bbox().getMax() - _scene3d->bbox().getMin());
56 if ((t > 1.0e-06 * (
min(
min(bboxdiag.
x(), bboxdiag.
y()), bboxdiag.
z()))) &&
86 if (!_occluders.empty()) {
87 for (OccludersSet::iterator it = _occluders.begin(); it != _occluders.end(); it++) {
93 _size =
Vec3r(0, 0, 0);
94 _cell_size =
Vec3r(0, 0, 0);
95 _orig =
Vec3r(0, 0, 0);
96 _cells_nb =
Vec3u(0, 0, 0);
105 real grid_vol = size[0] * size[1] * size[2];
108 double min = DBL_MAX;
111 for (
int i = 0; i < 3; ++i) {
116 if ((size[i] != 0) && (
min > size[i])) {
121 throw std::runtime_error(
"Warning: the 3D grid has more than one null dimension");
123 tmpSize[index] =
min;
124 _orig[index] = _orig[index] -
min / 2;
127 real cell_vol = grid_vol / nb;
129 real edge =
pow(cell_vol, 1.0 / 3.0);
133 for (i = 0; i < 3; i++) {
134 _cells_nb[i] =
uint(
floor(tmpSize[i] / edge)) + 1;
139 for (i = 0; i < 3; i++) {
140 _cell_size[i] = _size[i] / _cells_nb[i];
147 if (vertices.empty()) {
160 getCellCoordinates(max, imax);
161 getCellCoordinates(
min, imin);
169 vector<Vec3r>::const_iterator it;
172 if (vertices.size() == 3) {
175 for (it = vertices.begin(); it != vertices.end(); it++) {
176 triverts[i] =
Vec3r(*it);
180 Vec3r boxmin, boxmax;
182 for (
z = imin[2];
z <= imax[2];
z++) {
183 for (y = imin[1]; y <= imax[1]; y++) {
184 for (x = imin[0]; x <= imax[0]; x++) {
189 getCellBox(coord, boxmin, boxmax);
191 Vec3r boxcenter((boxmin + boxmax) / 2.0);
192 Vec3r boxhalfsize(_cell_size / 2.0);
196 Cell *cell = getCell(coord);
198 cell =
new Cell(boxmin);
199 fillCell(coord, *cell);
208 for (
z = imin[2];
z <= imax[2];
z++) {
209 for (y = imin[1]; y <= imax[1]; y++) {
210 for (x = imin[0]; x <= imax[0]; x++) {
214 Cell *cell = getCell(coord);
217 getCellOrigin(coord, orig);
218 cell =
new Cell(orig);
219 fillCell(coord, *cell);
230 next_cell = current_cell;
240 for (i = 0; i < 3; i++) {
241 if (_ray_dir[i] == 0) {
244 if (_ray_dir[i] > 0) {
245 t = (_cell_size[i] - _pt[i]) / _ray_dir[i];
248 t = -_pt[i] / _ray_dir[i];
258 _pt = pt_tmp + t_min * _ray_dir;
262 if (_ray_dir[coord] > 0) {
264 _pt[coord] -= _cell_size[coord];
266 if (next_cell[coord] >= _cells_nb[coord]) {
271 int tmp = next_cell[coord] - 1;
272 _pt[coord] = _cell_size[coord];
289 initRay(orig, end, timestamp);
291 castRayInternal(visitor);
300 bool inter = initInfiniteRay(orig, dir, timestamp);
305 castRayInternal(visitor);
309 const Vec3r &orig,
const Vec3r &dir,
double &t,
double &u,
double &
v,
uint timestamp)
313 bool inter = initInfiniteRay(orig, dir, timestamp);
318 castRayInternal(visitor);
331 _ray_dir = end - orig;
332 _t_end = _ray_dir.
norm();
334 _ray_dir.normalize();
335 _timestamp = timestamp;
337 for (
uint i = 0; i < 3; i++) {
338 _current_cell[i] =
uint(
floor((orig[i] - _orig[i]) / _cell_size[i]));
340 _pt[i] = orig[i] - _orig[i] - _current_cell[i] * _cell_size[i];
351 _timestamp = timestamp;
355 Vec3r boxMax(_orig + _size);
357 if (box.inside(orig)) {
358 for (
uint i = 0; i < 3; i++) {
359 _current_cell[i] =
uint(
floor((orig[i] - _orig[i]) / _cell_size[i]));
361 _pt[i] = orig[i] - _orig[i] - _current_cell[i] * _cell_size[i];
366 real tmin(-1.0), tmax(-1.0);
369 Vec3r newOrig = orig + tmin * _ray_dir;
370 for (
uint i = 0; i < 3; i++) {
371 _current_cell[i] =
uint(
floor((newOrig[i] - _orig[i]) / _cell_size[i]));
372 if (_current_cell[i] == _cells_nb[i]) {
373 _current_cell[i] = _cells_nb[i] - 1;
376 _pt[i] = newOrig[i] - _orig[i] - _current_cell[i] * _cell_size[i];
A class to hold a bounding box.
Base class to define a cell grid surrounding the bounding box of the scene.
ATTR_WARN_UNUSED_RESULT const BMVert * v
const btVector3 * getVertices() const
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
void addOccluder(Polygon3r *o)
const Vec3r & getOrigin()
void getBBox(Point &min, Point &max) const
const vector< Point > & getVertices() const
void castInfiniteRay(const Vec3r &orig, const Vec3r &dir, OccludersSet &occluders, uint timestamp)
bool nextRayCell(Vec3u ¤t_cell, Vec3u &next_cell)
virtual void configure(const Vec3r &orig, const Vec3r &size, uint nb)
bool initInfiniteRay(const Vec3r &orig, const Vec3r &dir, uint timestamp)
Polygon3r * castRayToFindFirstIntersection(const Vec3r &orig, const Vec3r &dir, double &t, double &u, double &v, uint timestamp)
void insertOccluder(Polygon3r *occluder)
void castRay(const Vec3r &orig, const Vec3r &end, OccludersSet &occluders, uint timestamp)
void initRay(const Vec3r &orig, const Vec3r &end, uint timestamp)
Vec< T, N > & normalize()
virtual void examineOccluder(Polygon3r *occ)
virtual void examineOccluder(Polygon3r *occ)
pow(value.r - subtrahend, 2.0)") .do_static_compilation(true)
ccl_device_inline float2 floor(const float2 a)
ccl_device_inline float2 fabs(const float2 a)
bool overlapTriangleBox(const Vec3r &boxcenter, const Vec3r &boxhalfsize, const Vec3r triverts[3])
bool intersectRayBBox(const Vec3r &orig, const Vec3r &dir, const Vec3r &boxMin, const Vec3r &boxMax, real t0, real t1, real &tmin, real &tmax, real)
VecMat::Vec3< uint > Vec3u
VecMat::Vec3< real > Vec3r
vector< Polygon3r * > OccludersSet
static bool inBox(const Vec3r &inter, const Vec3r &box_min, const Vec3r &box_max)