diff options
author | Vito Caputo <vcaputo@pengaru.com> | 2017-06-01 15:32:17 -0700 |
---|---|---|
committer | Vito Caputo <vcaputo@pengaru.com> | 2017-06-01 15:32:17 -0700 |
commit | ecdb3ebb4897a2a750d403a3389a12cb982cd113 (patch) | |
tree | 2631795853d924d7a399104d93f00ef789567eee | |
parent | f77ab1e77aa3c89c4e923395b6fd75f3cb0bc522 (diff) |
ray: perform ambient light color scale in prepare
Trivially removes a ray_3f_mult_scalar() from the hot path.
-rw-r--r-- | src/modules/ray/ray_scene.c | 5 | ||||
-rw-r--r-- | src/modules/ray/ray_scene.h | 16 |
2 files changed, 13 insertions, 8 deletions
diff --git a/src/modules/ray/ray_scene.c b/src/modules/ray/ray_scene.c index acd65d3..955bab6 100644 --- a/src/modules/ray/ray_scene.c +++ b/src/modules/ray/ray_scene.c @@ -57,8 +57,7 @@ static inline ray_color_t shade_ray(ray_scene_t *scene, ray_ray_t *ray, ray_obje unsigned i; surface = ray_object_surface(object, &intersection); - color = ray_3f_mult_scalar(&scene->ambient_color, scene->ambient_brightness); - color = ray_3f_mult(&surface.color, &color); + color = ray_3f_mult(&surface.color, &scene->_prepared.ambient_light); /* visit lights for shadows and illumination */ for (i = 0; i < scene->n_lights; i++) { @@ -186,6 +185,8 @@ void ray_scene_prepare(ray_scene_t *scene) { unsigned i; + scene->_prepared.ambient_light = ray_3f_mult_scalar(&scene->ambient_color, scene->ambient_brightness); + for (i = 0; i < scene->n_objects; i++) ray_object_prepare(&scene->objects[i]); } diff --git a/src/modules/ray/ray_scene.h b/src/modules/ray/ray_scene.h index d8a1e7a..820b16b 100644 --- a/src/modules/ray/ray_scene.h +++ b/src/modules/ray/ray_scene.h @@ -10,14 +10,18 @@ typedef union ray_object_t ray_object_t; typedef struct ray_scene_t { - ray_object_t *objects; - unsigned n_objects; + ray_object_t *objects; + unsigned n_objects; - ray_object_t *lights; - unsigned n_lights; + ray_object_t *lights; + unsigned n_lights; - ray_color_t ambient_color; - float ambient_brightness; + ray_color_t ambient_color; + float ambient_brightness; + + struct { + ray_color_t ambient_light; + } _prepared; } ray_scene_t; void ray_scene_prepare(ray_scene_t *scene); |