Click on the filename to display or download the file.
shadow_breakpoint.mi
declare shader
color "shadow_breakpoint" (
color "color" default 1 1 1,
color "transparency" default .5 .5 .5,
scalar "breakpoint" default .5 )
version 1
apply shadow
end declare
shadow_breakpoint.c
#include "shader.h"
#include "miaux.h"
DLLEXPORT
int shadow_breakpoint_version(void) { return 1; }
struct shadow_breakpoint {
miColor color;
miColor transparency;
miScalar breakpoint;
};
DLLEXPORT
miBoolean shadow_breakpoint (
miColor *result, miState *state, struct shadow_breakpoint *params )
{
miColor *color = mi_eval_color(¶ms->color);
miColor *transparency = mi_eval_color(¶ms->transparency);
miScalar breakpoint = *mi_eval_scalar(¶ms->breakpoint);
result->r *= miaux_shadow_breakpoint (color->r, transparency->r, breakpoint );
result->g *= miaux_shadow_breakpoint (color->g, transparency->g, breakpoint );
result->b *= miaux_shadow_breakpoint (color->b, transparency->b, breakpoint );
return miaux_all_channels_equal(result, 0.0) ? miFALSE : miTRUE;
}
shadow_breakpoint_util.c
double miaux_shadow_breakpoint (
double color, double transparency, double breakpoint )
{
if (transparency < breakpoint)
return miaux_fit(transparency, 0, breakpoint, 0, color);
else
return miaux_fit(transparency, breakpoint, 1, color, 1);
}
double miaux_fit(
double v, double oldmin, double oldmax, double newmin, double newmax)
{
return newmin + ((v - oldmin) / (oldmax - oldmin)) * (newmax - newmin);
}
miBoolean miaux_all_channels_equal(miColor *c, miScalar v)
{
if (c->r == v && c->g == v && c->b == v && c->a == v)
return miTRUE;
else
return miFALSE;
}
22 April 2008 23:40:14