#include <gp/coord.h>
#include <gp/colors.h>
#include "frame_buffer.h"
:Def: World Space:Def: Object Space:Def: Eye Space:Def: Clip Space:Def: Pixel (Window) Space
void
render_simple(pFrame_Buffer& demo_frame_buffer, bool first_time)
{
pCoor p0 = { 0, 0, 0 };
pCoor p1 = { 9, 6, -9 };
pCoor p2 = { 0, 5, -5 };
vector<pCoor> coors_os;
coors_os << p0 << p1 << p2; if ( first_time ) pCoors_print(coors_os,"Obj");
pCoor eye_location_os = 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;
pMatrix_Translate center_eye(-eye_location_os);
pMatrix_Rotation rotate_eye(eye_direction,pVect(0,0,-1));
pMatrix eye_from_object = rotate_eye * center_eye;
pMatrix_Frustum clip_from_eye
( -width_m/2, width_m/2, -height_m/2, height_m/2, 1, 5000 );
pMatrix_Translate recenter(pVect(1,1,0));
pMatrix_Scale scale( win_width/2, win_height/2, 1 );
pMatrix pixel_from_clip = scale * recenter;
vector<pCoor> coors_es = eye_from_object * coors_os;
if ( first_time ) pCoors_print(coors_es,"Eye");
vector<pCoor> coors_clip = clip_from_eye * coors_es;
if ( first_time ) pCoors_print(coors_clip,"Clip U");
coors_clip = homogenize( coors_clip );
if ( first_time ) pCoors_print(coors_clip,"Clip N");
vector<pCoor> coors_window = pixel_from_clip * coors_clip;
if ( first_time ) pCoors_print(coors_window,"Window");
pMatrix pixel_from_obj = pixel_from_clip * clip_from_eye * eye_from_object;
vector<pCoor> coors_w2 = homogenize( pixel_from_obj * coors_os );
if ( first_time ) pCoors_print(coors_w2,"Win N");
pCoor w0 = coors_w2[0];
pCoor w1 = coors_w2[1];
pCoor w2 = coors_w2[2];
pVect bx(w2,w0), by(w2,w1);
const float dx = 1/bx.mag(), dy = 1/by.mag();
for ( float x=0; x<=1; x += dx )
for ( float y=0; y<=1-x; y += dy )
if ( pCoor c = w2 + x * bx + y * by;
uint(c.x) < win_width || uint(c.y) < win_height )
demo_frame_buffer[ c.x + int(c.y) * win_width ] = 0xffffffff;
}
void
render_less_simple(pFrame_Buffer& demo_frame_buffer, bool first_time)
{
vector<pCoor> coors_os;
vector<uint32_t> colors;
coors_os << pCoor( 0, 0, 0 );
coors_os << pCoor( 9, 6, -9 ) << pCoor( 0, 7, -5 );
colors << 0xffffff;
coors_os << pCoor(7,4,-2) << pCoor(-3,5,-9) << pCoor(9,2,-2);
colors << 0xff0000;
uint32_t color_red = 0xff0000; uint32_t color_green = 0xff00;
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);
if ( first_time ) pCoors_print(coors_os,"Obj");
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;
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;
if ( first_time ) pCoors_print(coors_es,"Eye");
pMatrix_Frustum clip_from_eye
( -width_m/2, width_m/2, -height_m/2, height_m/2, 1, 5000 );
vector<pCoor> coors_clip = clip_from_eye * coors_es;
if ( first_time ) pCoors_print(coors_clip,"Clip U");
coors_clip = homogenize( coors_clip );
if ( first_time ) pCoors_print(coors_clip,"Clip N");
pMatrix_Translate recenter(pVect(1,1,0));
pMatrix_Scale scale( win_width/2, win_height/2, 1 );
pMatrix pixel_from_clip = scale * recenter;
vector<pCoor> coors_window = pixel_from_clip * coors_clip;
if ( first_time ) pCoors_print(coors_window,"Window");
pMatrix pixel_from_obj = pixel_from_clip * clip_from_eye * eye_from_object;
vector<pCoor> coors_w2 = homogenize( pixel_from_obj * coors_os );
if ( first_time ) pCoors_print(coors_w2,"Win N");
auto ic = colors.begin();
for ( auto it = coors_window.begin(); it != coors_window.end(); )
{
pCoor w0 = *it++, w1 = *it++, w2 = *it++;
uint32_t color = *ic++;
pVect v20(w2,w0), v21(w2,w1);
const float db0 = 1/max(fabs(v20.x),fabs(v20.y));
const float db1 = 1/max(fabs(v21.x),fabs(v21.y));
for ( float b0=0; b0<=1; b0 += db0 )
for ( float b1=0; b1<=1-b0; b1 += db1 )
{
pCoor c = w2 + b0 * v20 + b1 * v21;
if ( uint(c.x) >= win_width || uint(c.y) >= win_height ) continue;
demo_frame_buffer[ c.x + int(c.y) * win_width ] = color;
}
}
}
int
main(int argc, char **argv)
{
pFrame_Buffer demo_frame_buffer(argc,argv);
Render render( demo_frame_buffer );
RENDER_INSERT(render, render_simple);
RENDER_INSERT(render, render_less_simple);
render.run();
return 0;
}