Shader spotlight

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(&params->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