Click on the filename to display or download the file.
summed_noise_scalar.mi
declare shader
scalar "summed_noise_scalar" (
scalar "point_scale" default 1,
scalar "magnitude" default 1,
scalar "octave_scaling" default 2,
scalar "summing_weight" default 2,
integer "number_of_octaves" default 5 )
version 1
apply material, texture
end declare
summed_noise_scalar.c
#include "shader.h"
#include "miaux.h"
struct summed_noise_scalar {
miScalar point_scale;
miScalar magnitude;
miScalar octave_scaling;
miScalar summing_weight;
miInteger number_of_octaves;
};
DLLEXPORT
int summed_noise_scalar_version(void) { return(1); }
DLLEXPORT
miBoolean summed_noise_scalar (
miScalar *result, miState *state, struct summed_noise_scalar *params )
{
miVector object_point;
miScalar magnitude = *mi_eval_scalar(¶ms->magnitude), noise_sum;
mi_point_to_object(state, &object_point, &state->point);
mi_vector_mul(&object_point, *mi_eval_scalar(¶ms->point_scale));
noise_sum = miaux_summed_noise(&object_point,
*mi_eval_scalar(¶ms->summing_weight),
*mi_eval_scalar(¶ms->octave_scaling),
*mi_eval_integer(¶ms->number_of_octaves));
*result += miaux_fit(noise_sum, 0.0, 1.0, -magnitude, magnitude);
return miTRUE;
}
summed_noise_scalar_util.c
double miaux_summed_noise (
miVector *point,
double summing_weight, double octave_scaling, int octave_count)
{
int i;
double noise_value,
noise_sum = 0.0, noise_scale = 1.0, maximum_noise_sum = 0.0;
miVector scaled_point;
miaux_set_vector(&scaled_point, point->x, point->y, point->z);
for (i = 0; i < octave_count; i++) {
noise_value = mi_unoise_3d(&scaled_point);
noise_sum += noise_value / noise_scale;
maximum_noise_sum += 1.0 / noise_scale;
noise_scale *= summing_weight;
miaux_scale_vector(&scaled_point, octave_scaling);
}
return noise_sum/maximum_noise_sum;
}
void miaux_set_vector(miVector *v, double x, double y, double z)
{
v->x = x;
v->y = y;
v->z = z;
}
void miaux_scale_vector(miVector *result, miScalar scale)
{
result->x *= scale;
result->y *= scale;
result->z *= scale;
}
double miaux_fit(
double v, double oldmin, double oldmax, double newmin, double newmax)
{
return newmin + ((v - oldmin) / (oldmax - oldmin)) * (newmax - newmin);
}
22 April 2008 23:40:31