From 6787a9219748575cd63aaadd483f49a4fd83b543 Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Sat, 9 Jan 2010 20:38:51 -0500 Subject: Implement reflection. --- libdimension/finish_combination.c | 40 +++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'libdimension/finish_combination.c') diff --git a/libdimension/finish_combination.c b/libdimension/finish_combination.c index 045db96..bcfc1c9 100644 --- a/libdimension/finish_combination.c +++ b/libdimension/finish_combination.c @@ -34,10 +34,10 @@ dmnsn_finish_combination_fn(const dmnsn_finish *finish, { dmnsn_finish **params = finish->ptr; if (params[0]->finish_fn && params[1]->finish_fn) { - return dmnsn_color_add((*params[0]->finish_fn)(params[0], light, color, ray, - normal, viewer), - (*params[1]->finish_fn)(params[1], light, color, ray, - normal, viewer)); + return dmnsn_color_add( + (*params[0]->finish_fn)(params[0], light, color, ray, normal, viewer), + (*params[1]->finish_fn)(params[1], light, color, ray, normal, viewer) + ); } else if (params[0]->finish_fn) { return (*params[0]->finish_fn)(params[0], light, color, ray, normal, viewer); @@ -66,6 +66,26 @@ dmnsn_finish_combination_ambient_fn(const dmnsn_finish *finish, } } +static dmnsn_color +dmnsn_finish_combination_reflection_fn(const dmnsn_finish *finish, + dmnsn_color reflect, dmnsn_color color, + dmnsn_vector ray, dmnsn_vector normal) +{ + dmnsn_finish **params = finish->ptr; + if (params[0]->reflection_fn && params[1]->reflection_fn) { + return dmnsn_color_add( + (*params[0]->reflection_fn)(params[0], reflect, color, ray, normal), + (*params[1]->reflection_fn)(params[1], reflect, color, ray, normal) + ); + } else if (params[0]->reflection_fn) { + return (*params[0]->reflection_fn)(params[0], reflect, color, ray, normal); + } else if (params[1]->reflection_fn) { + return (*params[1]->reflection_fn)(params[1], reflect, color, ray, normal); + } else { + return dmnsn_black; + } +} + static void dmnsn_finish_combination_free_fn(void *ptr) { @@ -93,8 +113,16 @@ dmnsn_new_finish_combination(dmnsn_finish *f1, dmnsn_finish *f2) params[1] = f2; finish->ptr = params; - finish->finish_fn = &dmnsn_finish_combination_fn; - finish->ambient_fn = &dmnsn_finish_combination_ambient_fn; + + if (f1->finish_fn || f2->finish_fn) + finish->finish_fn = &dmnsn_finish_combination_fn; + + if (f1->ambient_fn || f2->ambient_fn) + finish->ambient_fn = &dmnsn_finish_combination_ambient_fn; + + if (f1->reflection_fn || f2->reflection_fn) + finish->reflection_fn = &dmnsn_finish_combination_reflection_fn; + finish->free_fn = &dmnsn_finish_combination_free_fn; return finish; -- cgit v1.2.3