summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@gnugeneration.com>2017-02-12 01:42:44 -0800
committerVito Caputo <vcaputo@gnugeneration.com>2017-02-12 01:47:08 -0800
commit59b3a2c6b4b121445eba1cb6fe925326edc42c39 (patch)
tree261ed704b2525e57755eed762e6f7975124d2e5d /src
parentd5417e24a7c054c1c907c3b4fe351af2e054a457 (diff)
ray: fixup ray_object_plane_intersects_ray() bug
We should only consider dot products > 0 as intersected, or >= something very close to 0 (epsilon). As-is resulted in planes moving with camera movement along the plane normal axis. Also fixes plane distance to be non-negative in the current scene.
Diffstat (limited to 'src')
-rw-r--r--src/modules/ray/ray.c2
-rw-r--r--src/modules/ray/ray_object_plane.h5
2 files changed, 4 insertions, 3 deletions
diff --git a/src/modules/ray/ray.c b/src/modules/ray/ray.c
index 951b1d7..8c9a001 100644
--- a/src/modules/ray/ray.c
+++ b/src/modules/ray/ray.c
@@ -26,7 +26,7 @@ static void ray(fb_fragment_t *fragment)
.specular = 0.2f,
},
.normal = { .x = 0.0, .y = 1.0, .z = 0.0 },
- .distance = -3.2f,
+ .distance = 3.2f,
}
}, {
.sphere = {
diff --git a/src/modules/ray/ray_object_plane.h b/src/modules/ray/ray_object_plane.h
index b33f342..8fb64c8 100644
--- a/src/modules/ray/ray_object_plane.h
+++ b/src/modules/ray/ray_object_plane.h
@@ -1,6 +1,7 @@
#ifndef _RAY_OBJECT_PLANE_H
#define _RAY_OBJECT_PLANE_H
+#include "ray_3f.h"
#include "ray_object_type.h"
#include "ray_ray.h"
#include "ray_surface.h"
@@ -18,8 +19,8 @@ static inline int ray_object_plane_intersects_ray(ray_object_plane_t *plane, ray
{
float d = ray_3f_dot(&plane->normal, &ray->direction);
- if (d != 0) {
- float distance = -(ray_3f_dot(&plane->normal, &ray->origin) + plane->distance) / d;
+ if (d >= 0.00001f) {
+ float distance = (ray_3f_dot(&plane->normal, &ray->origin) + plane->distance) / d;
if (distance > 0) {
*res_distance = distance;
© All Rights Reserved