star-3d

Surface structuring for efficient 3D geometric queries
git clone git://git.meso-star.fr/star-3d.git
Log | Files | Refs | README | LICENSE

commit 80f570520522a99a886afc9b9691424fb0df412f
parent 55e38691d3b6983359e110c15d3f7cdaa257d7b8
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 18 Apr 2017 15:06:08 +0200

Fix the computation of the scene view AABB

The scene view AABB was wrongly computed when its associated scene
contains transformed instances.

Diffstat:
Msrc/s3d_scene_view.c | 27++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)

diff --git a/src/s3d_scene_view.c b/src/s3d_scene_view.c @@ -52,6 +52,13 @@ struct ray_extended : public RTCRay { /******************************************************************************* * Helper functions ******************************************************************************/ +static FINLINE int +aabb_is_degenerated(const float lower[3], const float upper[3]) +{ + ASSERT(lower && upper); + return lower[0] > upper[0] || lower[1] > upper[1] || lower[2] > upper[2]; +} + static FINLINE bool operator < (const struct fltui& it, const float val) { @@ -718,11 +725,21 @@ scene_view_compute_scene_aabb(struct s3d_scene_view* scnview) /* Note that the instance AABB was computed during its scnview * synchronisation. */ inst = geom->data.instance; - /* Transform local scene AABB in world space */ - f33_mulf3(lower, inst->transform, inst->scnview->lower); - f33_mulf3(upper, inst->transform, inst->scnview->upper); - f3_add(lower, inst->transform + 9, lower); - f3_add(upper, inst->transform + 9, upper); + if(aabb_is_degenerated(inst->scnview->lower, inst->scnview->upper)) { + /* Empty scene */ + f3_splat(lower, FLT_MAX); + f3_splat(upper,-FLT_MAX); + } else { + /* Transform local scene AABB bounds in world space */ + f33_mulf3(lower, inst->transform, inst->scnview->lower); + f33_mulf3(upper, inst->transform, inst->scnview->upper); + f3_add(lower, inst->transform + 9, lower); + f3_add(upper, inst->transform + 9, upper); + /* Define the world space AABB of the transformed local scene AABB */ + if(lower[0] > upper[0]) SWAP(float, lower[0], upper[0]); + if(lower[1] > upper[1]) SWAP(float, lower[1], upper[1]); + if(lower[2] > upper[2]) SWAP(float, lower[2], upper[2]); + } break; default: FATAL("Unreachable code\n"); break; }