Shader glossy_reflection_sample_varying
|
Scenes
Home
|
Click on the filename to display or download the file.
glossy_reflection_sample_varying.mi
declare shader
color "glossy_reflection_sample_varying" (
scalar "shiny" default 5,
array integer "samples" )
version 1
apply material
end declare
glossy_reflection_sample_varying.c
#include "shader.h"
#include "miaux.h"
struct glossy_reflection_sample_varying {
miScalar shiny;
int i_samples;
int n_samples;
int samples[1];
};
DLLEXPORT
int glossy_reflection_sample_varying_version(void) { return 1; }
DLLEXPORT
miBoolean glossy_reflection_sample_varying (
miColor *result, miState *state,
struct glossy_reflection_sample_varying *params )
{
miScalar shiny = *mi_eval_scalar(¶ms->shiny);
int i_samples = *mi_eval_integer(¶ms->i_samples);
int n_samples = *mi_eval_integer(¶ms->n_samples);
int *samples = mi_eval_integer(params->samples) + i_samples;
miVector reflect_dir;
miColor reflect_color;
double sampled_dir[2];
int level = state->reflection_level, sample_number = 0;
miUint sample_count = samples[level >= n_samples ? n_samples - 1 : level];
if (sample_count == 1) {
mi_reflection_dir_glossy(&reflect_dir, state, shiny);
if (!mi_trace_reflection(result, state, &reflect_dir))
mi_trace_environment(result, state, &reflect_dir);
} else {
result->r = result->g = result->b = 0.0;
while (mi_sample(sampled_dir, &sample_number,
state, 2, &sample_count)) {
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)sample_count);
}
return miTRUE;
}
glossy_reflection_sample_varying_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:19