Shader shadow_breakpoint

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(&params->color); 
    miColor *transparency = mi_eval_color(&params->transparency); 
    miScalar breakpoint = *mi_eval_scalar(&params->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