Intro
the previous simpler diffuse doesn't have a light loop to automatically go through all the lights in the scene and apply it to the shader. This simple diffuse shader will use a light array type to gather the lights in the scene and apply it tothe shader.MI Source
declare shader color "jc_simple_diffuse" ( color "diffuse" default 1 1 1, array light "lights") version 1 apply material end declare
C Source
#include "shader.h"
DLLEXPORT
struct jc_simple_diffuse {
miColor diffuse;
int i_light; //index to first light, the i_ prefix can be attached to arrays to get the index
int n_light; //number of lights, the n_ prefix can be attached to arrays to get the size of the array
miTag light[1];
};
DLLEXPORT
int jc_simple_diffuse_version(void) {return(1);}
DLLEXPORT
miBoolean jc_simple_diffuse(
miColor *result,
miState *state,
struct jc_simple_diffuse *params) {
miColor *diffuse = mi_eval_color(¶ms->diffuse);
int n_l = *mi_eval_integer(¶ms->n_light); //number of lights
int i_l = *mi_eval_integer(¶ms->i_light); //offset to first light
miTag *light = mi_eval_tag(¶ms->light) + i_l; //name of light + offset, ie light1, or light23
miColor light_color;
miVector dir;
miScalar dot_nl;
int i, samples;
for(i = 0; i < n_l; i++, light++) {//go through all the lights
samples = 0;
if(mi_sample_light(&light_color, &dir, &dot_nl, state, *light, &samples)) {
result->r += diffuse->r * light_color.r * dot_nl;
result->g += diffuse->g * light_color.g * dot_nl;
result->b += diffuse->b * light_color.b * dot_nl;
}
}
return(miTRUE);
}
Notes
the light array type comes with the use i_ and n_ prefix in the struct portion of the C source. i_ gives the index to the first light, and n_ gives the number of lights. The miTag string is the same as a light type except its in array form now, light[1], note, not light[0], because 0 is the base address of the array(i think).

0 comments:
Post a Comment