From 5038d1f96af332e474a1e0a076bf5dead6855727 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Wed, 18 Nov 2009 23:30:38 -0500 Subject: Translucency support. --- libdimension/objects.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'libdimension/objects.c') diff --git a/libdimension/objects.c b/libdimension/objects.c index b5e4a32..845edfa 100644 --- a/libdimension/objects.c +++ b/libdimension/objects.c @@ -73,6 +73,10 @@ dmnsn_sphere_intersection_fn(const dmnsn_object *sphere, dmnsn_line line) intersection->t = t; intersection->normal = dmnsn_line_point(line, t); intersection->texture = sphere->texture; + + /* Flip the normal if we're inside the sphere */ + if (dmnsn_vector_dot(line.n, intersection->normal) > 0.0) + intersection->normal = dmnsn_vector_negate(intersection->normal); } } @@ -128,7 +132,7 @@ dmnsn_cube_intersection_fn(const dmnsn_object *cube, dmnsn_line line) && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; - normal = dmnsn_vector_construct(-1.0, 0.0, 0.0); + normal = dmnsn_vector_construct(-copysign(line.n.x, 1.0), 0.0, 0.0); } /* x = 1.0 */ @@ -138,7 +142,7 @@ dmnsn_cube_intersection_fn(const dmnsn_object *cube, dmnsn_line line) && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; - normal = dmnsn_vector_construct(1.0, 0.0, 0.0); + normal = dmnsn_vector_construct(-copysign(line.n.x, 1.0), 0.0, 0.0); } } @@ -150,7 +154,7 @@ dmnsn_cube_intersection_fn(const dmnsn_object *cube, dmnsn_line line) && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; - normal = dmnsn_vector_construct(0.0, -1.0, 0.0); + normal = dmnsn_vector_construct(0.0, -copysign(line.n.y, 1.0), 0.0); } /* y = 1.0 */ @@ -160,7 +164,7 @@ dmnsn_cube_intersection_fn(const dmnsn_object *cube, dmnsn_line line) && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; - normal = dmnsn_vector_construct(0.0, 1.0, 0.0); + normal = dmnsn_vector_construct(0.0, -copysign(line.n.y, 1.0), 0.0); } } @@ -172,7 +176,7 @@ dmnsn_cube_intersection_fn(const dmnsn_object *cube, dmnsn_line line) && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; - normal = dmnsn_vector_construct(0.0, 0.0, -1.0); + normal = dmnsn_vector_construct(0.0, 0.0, -copysign(line.n.z, 1.0)); } /* z = 1.0 */ @@ -182,7 +186,7 @@ dmnsn_cube_intersection_fn(const dmnsn_object *cube, dmnsn_line line) && t_temp >= 0.0 && (t < 0.0 || t_temp < t)) { t = t_temp; - normal = dmnsn_vector_construct(0.0, 0.0, 1.0); + normal = dmnsn_vector_construct(0.0, 0.0, -copysign(line.n.z, 1.0)); } } -- cgit v1.2.3