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:
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;
}