Shader equirectangular

Click on the filename to display or download the file.

equirectangular.mi
declare shader 
    color "equirectangular" () 
    version 1 
    apply lens 
    scanline off 
    trace on 
end declare 

equirectangular.c
#include "shader.h" 
#include "miaux.h" 
 
DLLEXPORT 
int equirectangular_version(void) { return 1; } 
 
DLLEXPORT 
miBoolean equirectangular ( 
    miColor *result, miState *state, void *params  ) 
{ 
    miMatrix matrix; 
    miVector eye_ray_direction = {0, 0, -1}; 
    miScalar x_fractional_position =  
        state->raster_x / state->camera->x_resolution; 
    miScalar y_fractional_position =  
        state->raster_y / state->camera->y_resolution; 
 
    mi_matrix_rotate( 
        matrix, 
        miaux_fit(y_fractional_position, 0, 1, -M_PI/2, M_PI/2), 
        miaux_fit(x_fractional_position, 0, 1, M_PI, -M_PI), 
        0); 
    mi_vector_transform(&eye_ray_direction, &eye_ray_direction, matrix); 
 
    return mi_trace_eye(result, state, &state->org, &eye_ray_direction); 
} 

equirectangular_util.c
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:59