Click on the filename to display or download the file.
bump_ripple.mi
declare shader
color "bump_ripple" (
vector "center" default .5 .5 0,
scalar "frequency" default 1,
scalar "amplitude" default .5,
scalar "nearby" default .01 )
version 1
apply material
end declare
bump_ripple.c
#include "shader.h"
#include "miaux.h"
struct bump_ripple {
miVector center;
miScalar frequency;
miScalar amplitude;
miScalar nearby;
};
DLLEXPORT
int bump_ripple_version(void) { return(1); }
DLLEXPORT
miBoolean bump_ripple (
miColor *result, miState *state, struct bump_ripple *params )
{
double ripple_here, ripple_over, ripple_up,
change_going_over, change_going_up;
miVector here, over, up;
miVector center = *mi_eval_vector(¶ms->center);
miScalar frequency = *mi_eval_scalar(¶ms->frequency);
miScalar amplitude = *mi_eval_scalar(¶ms->amplitude);
miScalar nearby = *mi_eval_scalar(¶ms->nearby);
miVector bump_basis_u = state->bump_x_list[0];
miVector bump_basis_v = state->bump_y_list[0];
here = state->tex_list[0];
miaux_set_vector(&over, here.x + nearby, here.y, here.z);
miaux_set_vector(&up, here.x, here.y + nearby, here.z);
ripple_here = miaux_sinusoid(mi_vector_dist(¢er, &here),
frequency, amplitude);
ripple_over = miaux_sinusoid(mi_vector_dist(¢er, &over),
frequency, amplitude);
ripple_up = miaux_sinusoid(mi_vector_dist(¢er, &up),
frequency, amplitude);
change_going_over = ripple_over - ripple_here;
change_going_up = ripple_over - ripple_up;
mi_vector_mul(&bump_basis_u, -change_going_over);
mi_vector_mul(&bump_basis_v, -change_going_up);
mi_vector_to_object(state, &state->normal, &state->normal);
mi_vector_add(&state->normal, &state->normal, &bump_basis_u);
mi_vector_add(&state->normal, &state->normal, &bump_basis_v);
mi_vector_normalize(&state->normal);
mi_vector_from_object(state, &state->normal, &state->normal);
return miTRUE;
}
bump_ripple_util.c
void miaux_set_vector(miVector *v, double x, double y, double z)
{
v->x = x;
v->y = y;
v->z = z;
}
double miaux_sinusoid_fit(
double v, double oldmin, double oldmax, double newmin, double newmax)
{
return miaux_fit(sin(miaux_fit(v, oldmin, oldmax, -M_PI_2, M_PI_2)),
-1, 1,
newmin, newmax);
}
22 April 2008 23:40:33