From 141732e737eb7e9a1677fc3b5aa9ebcd66de3aca Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Mon, 30 May 2011 23:24:36 -0600 Subject: Make lights more generic to support directional lights. --- libdimension/dimension/light.h | 35 +++++++++++++++++++++++++++++------ libdimension/dimension/scene.h | 7 +++++++ 2 files changed, 36 insertions(+), 6 deletions(-) (limited to 'libdimension/dimension') diff --git a/libdimension/dimension/light.h b/libdimension/dimension/light.h index 03de641..b41a524 100644 --- a/libdimension/dimension/light.h +++ b/libdimension/dimension/light.h @@ -23,27 +23,50 @@ * Lights. */ +#include + /* Forward-declar dmnsn_light */ typedef struct dmnsn_light dmnsn_light; /** - * Light callback. + * Light direction callback. + * @param[in] light The light itself. + * @param[in] v The point to illuminate. + * @return The direction of light rays pointing from \p v + */ +typedef dmnsn_line dmnsn_light_direction_fn(const dmnsn_light *light, + dmnsn_vector v); + +/** + * Light illumination callback. * @param[in] light The light itself. * @param[in] v The point to illuminate. * @return The color of the light at \p v. */ -typedef dmnsn_color dmnsn_light_fn(const dmnsn_light *light, dmnsn_vector v); +typedef dmnsn_color dmnsn_light_illumination_fn(const dmnsn_light *light, + dmnsn_vector v); + +/** + * Light shadow callback. + * @param[in] light The light itself. + * @param[in] t The line index of the closest shadow ray intersection. + * @return Whether the point is in shadow. + */ +typedef bool dmnsn_light_shadow_fn(const dmnsn_light *light, double t); /** A light. */ struct dmnsn_light { - dmnsn_vector x0; /**< Origin of light rays. */ - /* Callbacks */ - dmnsn_light_fn *light_fn; /**< Light callback. */ - dmnsn_free_fn *free_fn; /**< Desctructor callback. */ + dmnsn_light_direction_fn *direction_fn; /**< Direction callback. */ + dmnsn_light_illumination_fn *illumination_fn; /**< Illumination callback. */ + dmnsn_light_shadow_fn *shadow_fn; /**< Shadow callback. */ + dmnsn_free_fn *free_fn; /**< Desctructor callback. */ /** Generic pointer for light info. */ void *ptr; + + /** @internal Reference count. */ + dmnsn_refcount refcount; }; /** diff --git a/libdimension/dimension/scene.h b/libdimension/dimension/scene.h index b726a77..bb47ee9 100644 --- a/libdimension/dimension/scene.h +++ b/libdimension/dimension/scene.h @@ -99,6 +99,13 @@ void dmnsn_initialize_scene(dmnsn_scene *scene); */ void dmnsn_scene_set_canvas(dmnsn_scene *scene, dmnsn_canvas *canvas); +/** + * Add a light to a scene. + * @param[in,out] scene The scene to which to add the light. + * @param[in] object The object to light. + */ +void dmnsn_scene_add_light(dmnsn_scene *scene, dmnsn_light *light); + /** * Set the camera for a scene. * @param[in,out] scene The scene for which to set the canvas. -- cgit v1.2.3