Shader fog

Click on the filename to display or download the file.

fog.mi
declare shader  
    color "fog" ( 
	scalar "full_fade_distance" default 10, 
	color "fog_color" default 1 1 1 ) 
    version 1 
    apply volume 
end declare 

fog.c
#include "shader.h" 
#include "miaux.h" 
 
struct fog { 
    miScalar full_fade_distance; 
    miColor fog_color; 
}; 
 
DLLEXPORT 
int fog_version(void) { return 1; } 
 
DLLEXPORT 
miBoolean fog ( 
     miColor *result, miState *state, struct fog *params  ) 
{ 
    miScalar full_fade_distance = *mi_eval_scalar(&params->full_fade_distance); 
    miColor *fog_color = mi_eval_color(&params->fog_color); 
 
    if (state->dist > full_fade_distance || state->dist == 0.0) 
        *result = *fog_color; 
    else  
        miaux_blend_colors( 
            result, fog_color, result, state->dist/full_fade_distance); 
 
    return miTRUE; 
} 

fog_util.c
void miaux_blend_colors(miColor *result,  
			miColor *color1, miColor *color2, miScalar factor) 
{ 
    result->r = miaux_blend(color1->r, color2->r, factor); 
    result->g = miaux_blend(color1->g, color2->g, factor); 
    result->b = miaux_blend(color1->b, color2->b, factor); 
} 
 
double miaux_blend(miScalar a, miScalar b, miScalar factor) 
{ 
    return a * factor + b * (1.0 - factor); 
} 

22 April 2008 23:40:49