Shader glossy_reflection_sample

Click on the filename to display or download the file.

glossy_reflection_sample.mi
declare shader 
    color "glossy_reflection_sample" ( 
        scalar "shiny" default 5, 
        integer "samples" default 8 ) 
    version 1 
    apply material 
end declare 

glossy_reflection_sample.c
#include "shader.h" 
#include "miaux.h" 
 
struct glossy_reflection_sample { 
    miScalar shiny; 
    miInteger samples; 
}; 
 
DLLEXPORT 
int glossy_reflection_sample_version(void) { return 1; } 
 
 
DLLEXPORT 
miBoolean glossy_reflection_sample ( 
    miColor *result, miState *state, struct glossy_reflection_sample *params  ) 
{ 
    miScalar shiny = *mi_eval_scalar(&params->shiny); 
    miUint samples = *mi_eval_integer(&params->samples); 
    miVector reflect_dir; 
    miColor reflect_color; 
    int sample_number = 0; 
    double sampled_dir[2]; 
 
    result->r = result->g = result->b = 0.0; 
    while (mi_sample(sampled_dir, &sample_number, state, 2, &samples)) { 
        mi_reflection_dir_glossy_x(&reflect_dir, state, shiny, sampled_dir); 
        if (!mi_trace_reflection(&reflect_color, state, &reflect_dir)) 
            mi_trace_environment(&reflect_color, state, &reflect_dir); 
        miaux_add_color(result, &reflect_color); 
    } 
    miaux_scale_color(result, 1.0 / (double)samples); 
 
    return miTRUE; 
} 

glossy_reflection_sample_util.c
void miaux_add_color(miColor *result, miColor *c) 
{ 
    result->r += c->r; 
    result->g += c->g; 
    result->b += c->b; 
    result->a += c->a; 
} 
 
void miaux_scale_color(miColor *result, miScalar scale) 
{ 
    result->r *= scale; 
    result->g *= scale; 
    result->b *= scale; 
} 

22 April 2008 23:40:18