summaryrefslogtreecommitdiff
path: root/src/modules/ray/ray_object_sphere.h
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2017-12-23 21:14:06 -0800
committerVito Caputo <vcaputo@pengaru.com>2017-12-23 21:17:24 -0800
commit8ab42d0fb70f5c74554350b10e35bd6b6a78ab1b (patch)
tree69c63d0962977b2db31bcb60f992ec2bff3d73f4 /src/modules/ray/ray_object_sphere.h
parent5c287c99a3fa8f137dc279b2253c628e83786afe (diff)
ray: split object render from object description
This moves the per-object _prepared state into ray_render_object_$type structs with all the rendering-related object methods switched to operate on the new render structs. Since the current rendering code just makes all these assumptions about light objects being point lights, I've just dropped all the stuff associated with rendering light objects for now. I think it will be refactored a bit later on when the rendering code stops hard-coding the point light stuff. These changes open up the possibility of constifying the scene and constituent objects, now that rendering doesn't shove the prepared state into the embedded _prepared object substructs.
Diffstat (limited to 'src/modules/ray/ray_object_sphere.h')
-rw-r--r--src/modules/ray/ray_object_sphere.h74
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
© All Rights Reserved