From 59b3a2c6b4b121445eba1cb6fe925326edc42c39 Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Sun, 12 Feb 2017 01:42:44 -0800 Subject: 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. --- src/modules/ray/ray.c | 2 +- src/modules/ray/ray_object_plane.h | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src') 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; -- cgit v1.2.1