diff options
author | Tavian Barnes <tavianator@gmail.com> | 2011-09-14 18:56:08 -0400 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2011-09-14 19:03:07 -0400 |
commit | 1374b946398544a28ac989c75570d4b7c6937873 (patch) | |
tree | d3f05e23b5c39201292bfaddaca23220de6652f7 /libdimension/dimension/object.h | |
parent | 4bfa19e5a0b426ea6ec99dfebaeb35e507136b74 (diff) | |
download | dimension-1374b946398544a28ac989c75570d4b7c6937873.tar.xz |
Transform normals as pseudovectors, not vectors.
Also clarify the vector transformation API. Instead of
dmnsn_transform_vector(), we have:
- dmnsn_transform_point()
- dmnsn_transform_direction()
- dmnsn_transform_normal()
Diffstat (limited to 'libdimension/dimension/object.h')
-rw-r--r-- | libdimension/dimension/object.h | 27 |
1 files changed, 5 insertions, 22 deletions
diff --git a/libdimension/dimension/object.h b/libdimension/dimension/object.h index 8254782..8b497ce 100644 --- a/libdimension/dimension/object.h +++ b/libdimension/dimension/object.h @@ -112,24 +112,6 @@ void dmnsn_delete_object(dmnsn_object *object); void dmnsn_initialize_object(dmnsn_object *object); /** - * Transform a surface normal vector. - * @param[in] trans The transformation matrix. - * @param[in] normal The normal vector to transform - * @return The transformed normal vector. - */ -DMNSN_INLINE dmnsn_vector -dmnsn_transform_normal(dmnsn_matrix trans, dmnsn_vector normal) -{ - return dmnsn_vector_normalized( - dmnsn_vector_sub( - dmnsn_transform_vector(trans, normal), - /* Optimized form of dmnsn_transform_vector(trans, dmnsn_zero) */ - dmnsn_new_vector(trans.n[0][3], trans.n[1][3], trans.n[2][3]) - ) - ); -} - -/** * Appropriately transform a ray, then test for an intersection. * @param[in] object The object to test. * @param[in] line The ray to test. @@ -144,9 +126,10 @@ dmnsn_object_intersection(const dmnsn_object *object, dmnsn_line line, intersection->object = NULL; if (object->intersection_fn(object, line_trans, intersection)) { /* Get us back into world coordinates */ - intersection->ray = line; - intersection->normal = dmnsn_transform_normal(object->trans, - intersection->normal); + intersection->ray = line; + intersection->normal = dmnsn_vector_normalized( + dmnsn_transform_normal(object->trans_inv, intersection->normal) + ); if (!intersection->object) { intersection->object = object; } @@ -166,6 +149,6 @@ dmnsn_object_intersection(const dmnsn_object *object, dmnsn_line line, DMNSN_INLINE bool dmnsn_object_inside(const dmnsn_object *object, dmnsn_vector point) { - point = dmnsn_transform_vector(object->trans_inv, point); + point = dmnsn_transform_point(object->trans_inv, point); return object->inside_fn(object, point); } |