From 73ef51a819138e50b3d0b162d61a9f272fe07d01 Mon Sep 17 00:00:00 2001 From: Vito Caputo Date: Fri, 12 May 2017 15:17:52 -0700 Subject: ray: add ray_scene_prepare() object precomputing Just embed a _prepared struct in the object where precomputed stuff can be cached. Gets called once before rendering, which ends up calling the object-specific ray_object_$type_prepare() methods per object. --- src/modules/ray/ray_object_sphere.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src/modules/ray/ray_object_sphere.h') diff --git a/src/modules/ray/ray_object_sphere.h b/src/modules/ray/ray_object_sphere.h index 8a91316..cb8e665 100644 --- a/src/modules/ray/ray_object_sphere.h +++ b/src/modules/ray/ray_object_sphere.h @@ -15,14 +15,23 @@ typedef struct ray_object_sphere_t { ray_surface_t surface; ray_3f_t center; float radius; + struct { + float r2; + } _prepared; } ray_object_sphere_t; +static void ray_object_sphere_prepare(ray_object_sphere_t *sphere) +{ + sphere->_prepared.r2 = sphere->radius * sphere->radius; +} + + static inline int ray_object_sphere_intersects_ray(ray_object_sphere_t *sphere, ray_ray_t *ray, float *res_distance) { ray_3f_t v = ray_3f_sub(&ray->origin, &sphere->center); float b = ray_3f_dot(&v, &ray->direction); - float disc = (sphere->radius * sphere->radius) - (ray_3f_dot(&v, &v) - (b * b)); + float disc = sphere->_prepared.r2 - (ray_3f_dot(&v, &v) - (b * b)); if (disc > 0) { float i1, i2; -- cgit v1.2.1