diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2017-06-02 13:39:42 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2017-06-02 13:39:42 -0700 |
commit | 902e535fce76b7790a4c010651b2233ed3945781 (patch) | |
tree | 56d0f20507aadcd2945a870ce597472034b2282e | |
parent | a2ca88eba63a98b50a5a7d037d476a9b041c5413 (diff) |
ray: skip intersection tests on reflector objects
We can just assume the object which reflected the ray being tracing
isn't going to be intersected. Maybe later this assumption no longer
holds true, but it is true for now.
-rw-r--r-- | src/modules/ray/ray_scene.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/modules/ray/ray_scene.c b/src/modules/ray/ray_scene.c index b5d1e81..2df4a5d 100644 --- a/src/modules/ray/ray_scene.c +++ b/src/modules/ray/ray_scene.c @@ -12,7 +12,7 @@ #define MAX_RECURSION_DEPTH 4 -static ray_color_t trace_ray(ray_scene_t *scene, ray_ray_t *ray, unsigned depth); +static ray_color_t trace_ray(ray_scene_t *scene, ray_object_t *reflector, ray_ray_t *ray, unsigned depth); /* Determine if the ray is obstructed by an object within the supplied distance, for shadows */ @@ -124,7 +124,7 @@ static inline ray_color_t shade_ray(ray_scene_t *scene, ray_ray_t *ray, ray_obje reflected_ray.origin = intersection; reflected_ray.direction = ray_3f_sub(&ray->direction, &reflected_ray.direction); - reflection = trace_ray(scene, &reflected_ray, depth); + reflection = trace_ray(scene, object, &reflected_ray, depth); reflection = ray_3f_mult_scalar(&reflection, surface.specular); color = ray_3f_add(&color, &reflection); } @@ -136,7 +136,7 @@ static inline ray_color_t shade_ray(ray_scene_t *scene, ray_ray_t *ray, ray_obje } -static ray_color_t trace_ray(ray_scene_t *scene, ray_ray_t *ray, unsigned depth) +static ray_color_t trace_ray(ray_scene_t *scene, ray_object_t *reflector, ray_ray_t *ray, unsigned depth) { ray_object_t *nearest_object = NULL; float nearest_object_distance = INFINITY; @@ -146,14 +146,20 @@ static ray_color_t trace_ray(ray_scene_t *scene, ray_ray_t *ray, unsigned depth) depth++; for (i = 0; i < scene->n_objects; i++) { - float distance; + ray_object_t *object = &scene->objects[i]; + float distance; + + /* Don't bother checking if a reflected ray intersects the object reflecting it, + * reflector = NULL for primary rays, which will never compare as true here. */ + if (object == reflector) + continue; /* Does this ray intersect object? */ - if (ray_object_intersects_ray(&scene->objects[i], depth, ray, &distance)) { + if (ray_object_intersects_ray(object, depth, ray, &distance)) { /* Is it the nearest intersection? */ if (distance < nearest_object_distance) { - nearest_object = &scene->objects[i]; + nearest_object = object; nearest_object_distance = distance; } } @@ -178,7 +184,7 @@ void ray_scene_render_fragment(ray_scene_t *scene, ray_camera_t *camera, fb_frag ray_camera_frame_begin(camera, fragment, &ray, &frame); do { do { - *buf = ray_color_to_uint32_rgb(trace_ray(scene, &ray, 0)); + *buf = ray_color_to_uint32_rgb(trace_ray(scene, NULL, &ray, 0)); buf++; } while (ray_camera_frame_x_step(&frame)); |