summaryrefslogtreecommitdiffstats
path: root/libdimension/bvst.c
diff options
context:
space:
mode:
Diffstat (limited to 'libdimension/bvst.c')
-rw-r--r--libdimension/bvst.c33
1 files changed, 6 insertions, 27 deletions
diff --git a/libdimension/bvst.c b/libdimension/bvst.c
index 9f9e94b..c0888bb 100644
--- a/libdimension/bvst.c
+++ b/libdimension/bvst.c
@@ -101,10 +101,9 @@ static void dmnsn_bvst_node_swallow(dmnsn_bvst_node *node,
void
dmnsn_bvst_insert(dmnsn_bvst *tree, dmnsn_object *object)
{
- dmnsn_bvst_node *node = dmnsn_new_bvst_node(), *parent = tree->root;
+ dmnsn_object_precompute(object);
- /* Store the inverse of the transformation matrix */
- object->trans_inv = dmnsn_matrix_inverse(object->trans);
+ dmnsn_bvst_node *node = dmnsn_new_bvst_node(), *parent = tree->root;
node->contains = NULL;
node->container = NULL;
@@ -112,8 +111,7 @@ dmnsn_bvst_insert(dmnsn_bvst *tree, dmnsn_object *object)
node->object = object;
/* Calculate the new bounding box */
- node->bounding_box = dmnsn_matrix_bounding_box_mul(object->trans,
- object->bounding_box);
+ node->bounding_box = object->bounding_box;
/* Now insert the node */
@@ -283,7 +281,6 @@ static bool dmnsn_ray_box_intersection(dmnsn_line ray, dmnsn_bounding_box box,
static dmnsn_bvst_search_result
dmnsn_bvst_search_recursive(dmnsn_bvst_node *node, dmnsn_line ray, double t)
{
- dmnsn_line ray_trans;
dmnsn_bvst_search_result result_temp, result = {
.node = NULL,
.intersected = false
@@ -303,14 +300,11 @@ dmnsn_bvst_search_recursive(dmnsn_bvst_node *node, dmnsn_line ray, double t)
if (dmnsn_bounding_box_contains(node->bounding_box, ray.x0)
|| dmnsn_ray_box_intersection(ray, node->bounding_box, t))
{
- /* Transform the ray according to the object */
- ray_trans = dmnsn_matrix_line_mul(node->object->trans_inv, ray);
-
- if (dmnsn_bounding_box_contains(node->object->bounding_box, ray_trans.x0)
- || dmnsn_ray_box_intersection(ray_trans, node->object->bounding_box, t))
+ if (dmnsn_bounding_box_contains(node->object->bounding_box, ray.x0)
+ || dmnsn_ray_box_intersection(ray, node->object->bounding_box, t))
{
result_temp.intersected =
- (*node->object->intersection_fn)(node->object, ray_trans,
+ (*node->object->intersection_fn)(node->object, ray,
&result_temp.intersection);
if (result_temp.intersected
@@ -319,21 +313,6 @@ dmnsn_bvst_search_recursive(dmnsn_bvst_node *node, dmnsn_line ray, double t)
result.intersected = true;
result.intersection = result_temp.intersection;
t = result.intersection.t;
-
- /* Transform the intersection back to the observer's view */
- result.intersection.ray = ray;
- result.intersection.normal = dmnsn_vector_normalize(
- dmnsn_vector_sub(
- dmnsn_matrix_vector_mul(
- node->object->trans,
- result.intersection.normal
- ),
- dmnsn_matrix_vector_mul(
- node->object->trans,
- dmnsn_zero
- )
- )
- );
}
}