Click on the filename to display or download the file.
spotlight.mi
declare shader
color "spotlight" (
color "light_color" default 1 1 1, )
version 1
apply light
end declare
spotlight.c
#include "shader.h"
#include "miaux.h"
struct spotlight {
miColor light_color;
};
DLLEXPORT
int spotlight_version(void) { return 1; }
DLLEXPORT
miBoolean spotlight (
miColor *result, miState *state, struct spotlight *params )
{
miTag light_tag = miaux_current_light_tag(state);
if (miaux_offset_spread_from_light(state, light_tag)
> miaux_light_spread(state, light_tag)) {
*result = *mi_eval_color(¶ms->light_color);
return mi_trace_shadow(result, state);
}
else
return miFALSE;
}
spotlight_util.c
miTag miaux_current_light_tag(miState *state)
{
miTag light_tag;
mi_query(miQ_INST_ITEM, state, state->light_instance, &light_tag);
return light_tag;
}
miScalar miaux_offset_spread_from_light(miState *state, miTag light_tag)
{
miVector light_direction, light_to_sample_point;
mi_query(miQ_LIGHT_DIRECTION, state, light_tag, &light_direction);
mi_vector_normalize(&light_direction);
mi_vector_to_light(state, &light_to_sample_point, &state->dir);
mi_vector_normalize(&light_to_sample_point);
return mi_vector_dot(&light_to_sample_point, &light_direction);
}
miScalar miaux_light_spread(miState *state, miTag light_tag)
{
miScalar light_spread;
mi_query(miQ_LIGHT_SPREAD, state, light_tag, &light_spread);
return light_spread;
}
22 April 2008 23:40:04