diff options
Diffstat (limited to 'src/modules/ray/ray_object_sphere.h')
-rw-r--r-- | src/modules/ray/ray_object_sphere.h | 74 |
1 files changed, 0 insertions, 74 deletions
diff --git a/src/modules/ray/ray_object_sphere.h b/src/modules/ray/ray_object_sphere.h index 0077a68..71b6334 100644 --- a/src/modules/ray/ray_object_sphere.h +++ b/src/modules/ray/ray_object_sphere.h @@ -1,13 +1,8 @@ #ifndef _RAY_OBJECT_SPHERE_H #define _RAY_OBJECT_SPHERE_H -#include <math.h> - #include "ray_3f.h" -#include "ray_camera.h" -#include "ray_color.h" #include "ray_object_type.h" -#include "ray_ray.h" #include "ray_surface.h" @@ -16,75 +11,6 @@ typedef struct ray_object_sphere_t { ray_surface_t surface; ray_3f_t center; float radius; - struct { - ray_3f_t primary_v; - float primary_dot_vv; - float r2; - float r_inv; - } _prepared; } ray_object_sphere_t; - -static void ray_object_sphere_prepare(ray_object_sphere_t *sphere, ray_camera_t *camera) -{ - sphere->_prepared.primary_v = ray_3f_sub(&sphere->center, &camera->position); - sphere->_prepared.primary_dot_vv = ray_3f_dot(&sphere->_prepared.primary_v, &sphere->_prepared.primary_v); - - sphere->_prepared.r2 = sphere->radius * sphere->radius; - - /* to divide by radius via multiplication in ray_object_sphere_normal() */ - sphere->_prepared.r_inv = 1.0f / sphere->radius; -} - - -static inline int ray_object_sphere_intersects_ray(ray_object_sphere_t *sphere, unsigned depth, ray_ray_t *ray, float *res_distance) -{ - ray_3f_t v = sphere->_prepared.primary_v; - float dot_vv = sphere->_prepared.primary_dot_vv; - float b, disc; - - if (depth) { - v = ray_3f_sub(&sphere->center, &ray->origin); - dot_vv = ray_3f_dot(&v, &v); - } - - b = ray_3f_dot(&v, &ray->direction); - disc = sphere->_prepared.r2 - (dot_vv - (b * b)); - if (disc > 0) { - float i1, i2; - - disc = sqrtf(disc); - - i1 = b - disc; - i2 = b + disc; - - if (i2 > 0 && i1 > 0) { - *res_distance = i1; - return 1; - } - } - - return 0; -} - - -/* return the normal of the surface at the specified point */ -static inline ray_3f_t ray_object_sphere_normal(ray_object_sphere_t *sphere, ray_3f_t *point) -{ - ray_3f_t normal; - - normal = ray_3f_sub(point, &sphere->center); - normal = ray_3f_mult_scalar(&normal, sphere->_prepared.r_inv); /* normalize without the sqrt() */ - - return normal; -} - - -/* return the surface of the sphere @ point */ -static inline ray_surface_t ray_object_sphere_surface(ray_object_sphere_t *sphere, ray_3f_t *point) -{ - /* uniform solids for now... */ - return sphere->surface; -} - #endif |