summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/modules/ray/ray.c5
-rw-r--r--src/modules/ray/ray_scene.c6
-rw-r--r--src/modules/ray/ray_surface.h1
3 files changed, 8 insertions, 4 deletions
diff --git a/src/modules/ray/ray.c b/src/modules/ray/ray.c
index 6dc15a6..ad8a06b 100644
--- a/src/modules/ray/ray.c
+++ b/src/modules/ray/ray.c
@@ -24,6 +24,7 @@ static void ray(fb_fragment_t *fragment)
.color = { .x = 0.6, .y = 0.3, .z = 0.8 },
.diffuse = 1.0f,
.specular = 0.2f,
+ .highlight_exponent = 20.0f
},
.normal = { .x = 0.0, .y = 1.0, .z = 0.0 },
.distance = 2.0f,
@@ -35,6 +36,7 @@ static void ray(fb_fragment_t *fragment)
.color = { .x = 1.0, .y = 0.0, .z = 0.0 },
.diffuse = 1.0f,
.specular = 0.05f,
+ .highlight_exponent = 20.0f
},
.center = { .x = 0.5, .y = 1.0, .z = 0.0 },
.radius = 1.2f,
@@ -46,6 +48,7 @@ static void ray(fb_fragment_t *fragment)
.color = { .x = 0.0, .y = 0.0, .z = 1.0 },
.diffuse = 0.9f,
.specular = 0.4f,
+ .highlight_exponent = 20.0f
},
.center = { .x = -2.0, .y = 1.0, .z = 0.0 },
.radius = 0.9f,
@@ -57,6 +60,7 @@ static void ray(fb_fragment_t *fragment)
.color = { .x = 0.0, .y = 1.0, .z = 1.0 },
.diffuse = 0.9f,
.specular = 0.3f,
+ .highlight_exponent = 20.0f
},
.center = { .x = 2.0, .y = -1.0, .z = 0.0 },
.radius = 1.0f,
@@ -68,6 +72,7 @@ static void ray(fb_fragment_t *fragment)
.color = { .x = 0.0, .y = 1.0, .z = 0.0 },
.diffuse = 0.95f,
.specular = 0.85f,
+ .highlight_exponent = 20.0f
},
.center = { .x = 0.2, .y = -1.25, .z = 0.0 },
.radius = 0.6f,
diff --git a/src/modules/ray/ray_scene.c b/src/modules/ray/ray_scene.c
index 496c447..b4cddad 100644
--- a/src/modules/ray/ray_scene.c
+++ b/src/modules/ray/ray_scene.c
@@ -83,10 +83,8 @@ static inline ray_color_t shade_ray(ray_scene_t *scene, ray_ray_t *ray, ray_obje
diffuse = ray_3f_mult_scalar(&diffuse, surface.diffuse);
color = ray_3f_add(&color, &diffuse);
- /* FIXME: assumes light is a point for its color, and 20 is a constant "Phong exponent",
- * which should really be object/surface-specific
- */
- specular = ray_3f_mult_scalar(&scene->lights[i].light.emitter.point.surface.color, powf(rvec_lvec_dot, 20));
+ /* FIXME: assumes light is a point for its color */
+ specular = ray_3f_mult_scalar(&scene->lights[i].light.emitter.point.surface.color, powf(rvec_lvec_dot, surface.highlight_exponent));
specular = ray_3f_mult_scalar(&specular, surface.specular);
color = ray_3f_add(&color, &specular);
#else
diff --git a/src/modules/ray/ray_surface.h b/src/modules/ray/ray_surface.h
index b3e3c68..2e7544b 100644
--- a/src/modules/ray/ray_surface.h
+++ b/src/modules/ray/ray_surface.h
@@ -8,6 +8,7 @@
typedef struct ray_surface_t {
ray_color_t color;
float specular;
+ float highlight_exponent;
float diffuse;
} ray_surface_t;
© All Rights Reserved