From 531368437bfb865247204fa78235428028170081 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Mon, 9 Nov 2009 21:36:35 -0500 Subject: Correct dmnsn_color_illuminate(). --- libdimension/color.c | 28 ++++++++++++++++++---------- libdimension/raytrace.c | 2 +- 2 files changed, 19 insertions(+), 11 deletions(-) (limited to 'libdimension') diff --git a/libdimension/color.c b/libdimension/color.c index 4589824..2089326 100644 --- a/libdimension/color.c +++ b/libdimension/color.c @@ -301,15 +301,23 @@ dmnsn_color_illuminate(dmnsn_color light, dmnsn_color color) dmnsn_CIE_Lab Lab1 = dmnsn_Lab_from_color(light, dmnsn_whitepoint); dmnsn_CIE_Lab Lab2 = dmnsn_Lab_from_color(color, dmnsn_whitepoint); - double dot = Lab1.L*Lab2.L + Lab1.a*Lab2.a + Lab1.b*Lab2.b; - double norm = sqrt(Lab2.L*Lab2.L + Lab2.a*Lab2.a + Lab2.b*Lab2.b); - - if (norm == 0.0) - return dmnsn_black; - - dmnsn_CIE_Lab Lab = { .L = dot*Lab2.L/norm/100.0, - .a = dot*Lab2.a/norm, - .b = dot*Lab2.b/norm }; + /* + * This is derived from the simple illumination equation for RGB color: + * RGB' = (R_light*R_color, G_light*G_color, B_light*B_color) + * + * CIE L*a*b* may be transformed to an RGB colorspace by considering `a' + * to be the green -> magenta opponent process (from negative to positive), + * and `b' to be the blue -> yellow opponent process: + * RGB = (L + a + b, L - a + b, L + a - b) + * + * The reverse transformation is: + * Lab = ((G + B)/2, (R - G)/2, (R - B)/2) + */ + dmnsn_CIE_Lab Lab = { + .L = (Lab1.L*Lab2.L + (Lab1.b - Lab1.a)*(Lab2.b - Lab2.a))/100.0, + .a = (Lab1.a*(Lab2.L + Lab2.b) + Lab2.a*(Lab1.L + Lab1.b))/100.0, + .b = (Lab1.b*(Lab2.L + Lab2.a) + Lab2.b*(Lab1.L + Lab1.a))/100.0 + }; dmnsn_color ret = dmnsn_color_from_Lab(Lab, dmnsn_whitepoint); ret.filter = color.filter; @@ -318,7 +326,7 @@ dmnsn_color_illuminate(dmnsn_color light, dmnsn_color color) return ret; } -/* Find the perceptual difference between two colors, using CIE L*a*b*. */ +/* Find the perceptual difference between two colors, using CIE L*a*b* */ double dmnsn_color_difference(dmnsn_color color1, dmnsn_color color2) { diff --git a/libdimension/raytrace.c b/libdimension/raytrace.c index 63385a7..74bfefc 100644 --- a/libdimension/raytrace.c +++ b/libdimension/raytrace.c @@ -295,7 +295,7 @@ dmnsn_raytrace_shadow(dmnsn_intersection *intersection, dmnsn_scene *scene, finish = texture->finish ? texture->finish : scene->default_texture->finish; } - dmnsn_color illum = dmnsn_color_mul(0.3, color); + dmnsn_color illum = dmnsn_color_mul(0.1, color); const dmnsn_light *light; unsigned int i; -- cgit v1.2.3