Click on the filename to display or download the file.
ambient_occlusion_cutoff.mi
declare shader
color "ambient_occlusion_cutoff" (
integer "samples" default 8,
scalar "cutoff_distance" default 1, )
version 1
apply material
end declare
ambient_occlusion_cutoff.c
#include "shader.h"
#include "miaux.h"
struct ambient_occlusion_cutoff {
miUint samples;
miScalar cutoff_distance;
};
DLLEXPORT
int ambient_occlusion_cutoff_version(void) {return(1);}
DLLEXPORT
miBoolean ambient_occlusion_cutoff (
miColor *result, miState *state, struct ambient_occlusion_cutoff *params )
{
miUint samples = *mi_eval_integer(¶ms->samples);
miScalar cutoff_distance = *mi_eval_scalar(¶ms->cutoff_distance);
miVector trace_direction;
int object_hit = 0, sample_number = 0;
double sample[2], hit_fraction, ambient_exposure,
falloff_start, falloff_stop;
falloff_start = falloff_stop = cutoff_distance;
mi_ray_falloff(state, &falloff_start, &falloff_stop);
while (mi_sample(sample, &sample_number, state, 2, &samples)) {
mi_reflection_dir_diffuse_x(&trace_direction, state, sample);
if (mi_trace_probe(state, &trace_direction, &state->point))
object_hit++;
}
hit_fraction = ((double)object_hit / (double)samples);
ambient_exposure = 1.0 - hit_fraction;
result->r = result->g = result->b = ambient_exposure;
result->a = 1.0;
mi_ray_falloff(state, &falloff_start, &falloff_stop);
return miTRUE;
}
22 April 2008 23:40:28