summaryrefslogtreecommitdiff
path: root/src/modules/ray/ray_scene.c
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2017-09-13 13:55:22 -0700
committerVito Caputo <vcaputo@pengaru.com>2017-09-13 13:59:19 -0700
commit121846b0e35607bf8b48d5ce304a65e2657be455 (patch)
tree7877e16b4b4949d65f3fc46373c5850cb72b4f88 /src/modules/ray/ray_scene.c
parentcf586253932e04f3c5a2be2c3d6d3ff5b1301ce0 (diff)
ray: cleanup ray_camera_frame_t fragments
Previously every fb_fragment_t (and thus thread) was constructing its own ray_camera_frame_t view into the scene, duplicating some work. Instead introduce ray_camera_fragment_t to encapsulate the truly per-fragment state and make ray_scene_render_fragment() operate on just this stuff with a reference to a shared ray_camera_frame_t prepared once per-frame. Some minor ray_camera.c cleanups sneak in as well (prefer multiply instead of divide, whitespace cleanups...)
Diffstat (limited to 'src/modules/ray/ray_scene.c')
-rw-r--r--src/modules/ray/ray_scene.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/modules/ray/ray_scene.c b/src/modules/ray/ray_scene.c
index 2026f6d..cf8fb44 100644
--- a/src/modules/ray/ray_scene.c
+++ b/src/modules/ray/ray_scene.c
@@ -189,22 +189,22 @@ static inline ray_color_t trace_ray(ray_scene_t *scene, ray_ray_t *primary_ray)
}
-void ray_scene_render_fragment(ray_scene_t *scene, ray_camera_t *camera, fb_fragment_t *fragment)
+void ray_scene_render_fragment(ray_scene_t *scene, fb_fragment_t *fb_fragment)
{
- ray_camera_frame_t frame;
+ unsigned stride = fb_fragment->stride / 4;
+ uint32_t *buf = fb_fragment->buf;
+ ray_camera_fragment_t fragment;
ray_ray_t ray;
- uint32_t *buf = fragment->buf;
- unsigned stride = fragment->stride / 4;
- ray_camera_frame_begin(camera, fragment, &ray, &frame);
+ ray_camera_fragment_begin(&scene->_prepared.frame, fb_fragment, &ray, &fragment);
do {
do {
*buf = ray_color_to_uint32_rgb(trace_ray(scene, &ray));
buf++;
- } while (ray_camera_frame_x_step(&frame));
+ } while (ray_camera_fragment_x_step(&fragment));
buf += stride;
- } while (ray_camera_frame_y_step(&frame));
+ } while (ray_camera_fragment_y_step(&fragment));
}
@@ -216,6 +216,7 @@ void ray_scene_prepare(ray_scene_t *scene, ray_camera_t *camera)
unsigned i;
scene->_prepared.ambient_light = ray_3f_mult_scalar(&scene->ambient_color, scene->ambient_brightness);
+ ray_camera_frame_prepare(camera, &scene->_prepared.frame);
for (i = 0; i < scene->n_objects; i++)
ray_object_prepare(&scene->objects[i], camera);
© All Rights Reserved