#include <gp/coord.h>
#include <gp/colors.h>
#include "frame_buffer.h"
void
render_ray_trace(pFrame_Buffer& demo_frame_buffer, bool first_time)
{
vector<pCoor> coors_os; vector<uint32_t> colors;
coors_os << pCoor( 0, 0, 0 ) << pCoor( 9, 6, -9 ) << pCoor( 0, 7, -5 );
colors << 0xffffffff;
coors_os << pCoor(7,4,-2) << pCoor(-3,5,-9) << pCoor(9,2,-2);
colors << 0xffff0000;
uint32_t color_red = 0xff;
uint32_t color_green = 0xff00ff00;
colors << color_red << color_green;
coors_os << pCoor(-4,0,-2) << pCoor(-4,2,-2) << pCoor(-2,0,-2);
coors_os << pCoor(-4,2,-2) << pCoor(-2,2,-2) << pCoor(-2,0,-2);
pCoor eye_location = pCoor(1,.5,10.2);
pVect eye_direction = pVect(0,0,-1);
const uint win_width = demo_frame_buffer.width_get();
const uint win_height = demo_frame_buffer.height_get();
const float aspect = 1.0 * win_width / win_height;
const float width_m = 1.6;
const float height_m = width_m / aspect;
const float qn = 1;
pMatrix_Translate center_eye(-eye_location);
pMatrix_Rotation rotate_eye(eye_direction,pVect(0,0,-1));
pMatrix eye_from_object = rotate_eye * center_eye;
vector<pCoor> coors_es = eye_from_object * coors_os;
pCoor window_ll_e( -width_m/2, -height_m/2, -qn); pCoor window_ul_e( -width_m/2, height_m/2, -qn); pCoor window_lr_e( +width_m/2, -height_m/2, -qn);
pVect window_dx_e = pVect( window_ll_e, window_lr_e ) / win_width;
pVect window_dy_e = pVect( window_ll_e, window_ul_e ) / win_height;
for ( uint yw = 0; yw < win_height; yw++ )
for ( uint xw = 0; xw < win_width; xw++ )
{
pCoor px_e = window_ll_e + window_dx_e * xw + window_dy_e * yw;
pVect ray(px_e);
float tmin = 1e10; auto ic = colors.begin();
for ( auto it = coors_es.begin(); it != coors_es.end(); )
{
pCoor e0 = *it++, e1 = *it++, e2 = *it++;
uint32_t color = *ic++;
pVect v01(e0,e1), v02(e0,e2);
pVect nt = cross(v01,v02);
float t = dot( pVect(e0), nt ) / dot( ray, nt );
if ( t >= tmin || t < 1 ) continue;
pCoor s = t * ray;
pVect v0s(e0,s);
pVect v01i = cross(nt,v01); float b2 = dot(v0s,v01i) / dot( v02,v01i );
if ( b2 < 0 || b2 > 1 ) continue;
pVect v02i = cross(nt,v02);
float b1 = dot( v0s, v02i) / dot(v01,v02i);
if ( b1 < 0 || b1 + b2 > 1 ) continue;
tmin = t;
# ifdef __cpp_multidimensional_subscript
demo_frame_buffer[ xw, yw ] = color; # else
demo_frame_buffer[ xw + yw * win_width ] = color;
# endif
}
}
}
int
main(int argc, char **argv)
{
pFrame_Buffer demo_frame_buffer(argc,argv);
Render render( demo_frame_buffer );
RENDER_INSERT(render, render_ray_trace);
render.run();
return 0;
}