Shader radial_falloff

Click on the filename to display or download the file.

radial_falloff.mi
declare shader 
    scalar "radial_falloff" ( 
	vector "center" default 0 0 0, 
	scalar "radius" default 1, 
	scalar "center_value" default 1, 
        scalar "radius_value" default 0	 ) 
    version 1 
    apply volume 
end declare 

radial_falloff.c
#include "shader.h" 
#include "miaux.h" 
 
DLLEXPORT 
int radial_falloff_version(void) { return 1; } 
 
struct radial_falloff { 
    miVector center; 
    miScalar radius; 
    miScalar center_value; 
    miScalar radius_value; 
}; 
 
DLLEXPORT 
miBoolean radial_falloff (  
    miScalar *result, miState *state, struct radial_falloff *params  ) 
{ 
    miVector *center = mi_eval_vector(&params->center); 
    miScalar radius = *mi_eval_scalar(&params->radius); 
    miScalar center_value = *mi_eval_scalar(&params->center_value); 
    miScalar radius_value = *mi_eval_scalar(&params->radius_value); 
    miScalar distance; 
    miVector point; 
 
    mi_vector_to_world(state, &point, &state->point); 
    distance = mi_vector_dist(center, &point); 
    *result = miaux_sinusoid_fit_clamp( 
        distance, 0.0, radius, center_value, radius_value); 
 
    return miTRUE; 
} 

radial_falloff_util.c
double miaux_sinusoid_fit_clamp( 
    double v, double oldmin, double oldmax, double newmin, double newmax) 
{ 
    return miaux_fit(sin(miaux_fit_clamp(v, oldmin, oldmax, -M_PI_2, M_PI_2)),  
		     -1, 1, newmin, newmax); 
} 
 
double miaux_fit( 
    double v, double oldmin, double oldmax, double newmin, double newmax)     
{ 
    return newmin + ((v - oldmin) / (oldmax - oldmin)) * (newmax - newmin); 
} 
 
double miaux_fit_clamp( 
    double v, double oldmin, double oldmax, double newmin, double newmax) 
{ 
    if (oldmin > oldmax) { 
	double temp = oldmin; 
        oldmin = oldmax; 
	oldmax = oldmin; 
	temp = newmin; 
        newmin = newmax; 
	newmax = newmin; 
    } 
    if (v < oldmin) 
	return newmin; 
    else if (v > oldmax) 
	return newmax; 
    else  
	return miaux_fit(v, oldmin, oldmax, newmin, newmax); 
} 

22 April 2008 23:40:56