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(¶ms->center);
miScalar radius = *mi_eval_scalar(¶ms->radius);
miScalar center_value = *mi_eval_scalar(¶ms->center_value);
miScalar radius_value = *mi_eval_scalar(¶ms->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