Make and/or improve on the set range utility found in maya.
Methodology
1. Given an oldmin and oldmax, find the range by oldmax - oldmin.
2. Given an newmin and newmin, find the range by newmax - newmin.
3. For a given point P, find the range of P by P - oldmin.
4. Find the current_factor by (Step3/Step1)
5. Find the new_factor by (Step4 * Step2) + newmin
Quick Test
1. Given a distance of 20 to 80
2. Map to new range from 0 to 10
3. Lets use a value of 50
4. (50 - 20) / (80 - 20) = 30 / 60 = 0.5
5. 0.5 * (10 - 0) + 0 = 5 = Works out fine.
declare shader color "set_range" ( vector "value" default 0 0 0, vector "oldmin" default 0 0 0, vector "oldmax" default 0 0 0, vector "newmin" default 0 0 0, vector "newmax" default 1 1 1, ) apply material end declare
C Source
#include "shader.h"
struct set_range {
miVector value;
miVector oldmin;
miVector oldmax;
miVector newmin;
miVector newmax;
};
miBoolean set_range(miColor *result, miState *state, struct set_range *params) {
miVector *value = mi_eval_vector(¶ms->value);
miVector *oldmin = mi_eval_vector(¶ms->oldmin);
miVector *oldmax = mi_eval_vector(¶ms->oldmax);
miVector *newmin = mi_eval_vector(¶ms->newmin);
miVector *newmax = mi_eval_vector(¶ms->newmax);
result->r = newmin->x + ((value->x - oldmin->x)/(oldmax->x - oldmin->x)) * (newmax->x - newmin->x);
result->g = newmin->y + ((value->y - oldmin->y)/(oldmax->y - oldmin->y)) * (newmax->y - newmin->y);
result->b = newmin->z + ((value->z - oldmin->z)/(oldmax->z - oldmin->z)) * (newmax->z - newmin->z);
return miTRUE;
}
Notes
Note that i choose to use vectors for all my inputs, its a design choice as its better to have more than to have less. It be a real pain if I have to create 3 nodes just to correct a color.

0 comments:
Post a Comment