Shader specular_refraction_simple

Click on the filename to display or download the file.

specular_refraction_simple.mi
declare shader 
    color "specular_refraction_simple" ( 
         scalar "index_of_refraction" default 1.33 ) 
    version 1 
    apply material 
end declare 

specular_refraction_simple.c
#include "shader.h" 
#include "miaux.h" 
 
struct specular_refraction_simple { 
    miScalar index_of_refraction; 
}; 
 
DLLEXPORT 
int specular_refraction_simple_version(void) { return 1; } 
 
DLLEXPORT 
miBoolean specular_refraction_simple ( 
    miColor *result, miState *state, struct specular_refraction_simple *params  ) 
{ 
    miScalar instance_ior = *mi_eval_scalar(&params->index_of_refraction); 
    miScalar vacuum_ior = 1.0, incoming_ior, outgoing_ior; 
    miVector direction; 
    if (miaux_ray_is_entering_material(state)) { 
        incoming_ior = vacuum_ior; 
        outgoing_ior = instance_ior; 
    } else { 
        incoming_ior = instance_ior; 
        outgoing_ior = vacuum_ior; 
    } 
    if (mi_refraction_dir(&direction, state, incoming_ior, outgoing_ior)) 
        mi_trace_refraction(result, state, &direction); 
    else { 
        mi_reflection_dir(&direction, state); 
        if (!mi_trace_reflection(result, state, &direction)) 
            mi_trace_environment(result, state, &direction); 
    } 
    return miTRUE; 
} 

specular_refraction_simple_util.c
miBoolean miaux_ray_is_entering_material(miState *state) 
{ 
    miState *s; 
    miBoolean entering = miTRUE; 
    for (s = state; s != NULL; s = s->parent) 
	if (s->material == state->material) 
	    entering = !entering; 
    return entering; 
} 

22 April 2008 23:40:19