#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
class World_S : public World_Base {
public:
World_S(pFrame_Buffer& fb):World_Base(fb){};
virtual void render(bool first_time); };
class World_L : public World_Base {
public:
World_L(pFrame_Buffer& fb):World_Base(fb){};
virtual void render(bool first_time); };
void
World_S::render(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");
if ( first_time ) eye_location_os = pCoor(1,.5,10.2);
switch ( frame_buffer.keyboard_key ) {
case FB_KEY_LEFT: eye_location_os.x += 0.1; break;
case FB_KEY_RIGHT: eye_location_os.x -= 0.1; break;
case FB_KEY_PAGE_UP: eye_location_os.y += 0.1; break;
case FB_KEY_PAGE_DOWN: eye_location_os.y -= 0.1; break;
case FB_KEY_UP: eye_location_os.z -= 0.1; break;
case FB_KEY_DOWN: eye_location_os.z += 0.1; break;
}
pVect eye_direction = pVect(0,0,-1);
const float width_m = 1.6; const float qn = 1; const uint win_width = frame_buffer.width_get();
const uint win_height = frame_buffer.height_get();
const float aspect = 1.0 * win_width / win_height;
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, qn, 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 )
frame_buffer[ c.x + int(c.y) * win_width ] = 0xffffffff;
}
void
World_L::render(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");
if ( first_time ) eye_location_os = pCoor(1,.5,10.2);
switch ( frame_buffer.keyboard_key ) {
case FB_KEY_LEFT: eye_location_os.x += 0.1; break;
case FB_KEY_RIGHT: eye_location_os.x -= 0.1; break;
case FB_KEY_PAGE_UP: eye_location_os.y += 0.1; break;
case FB_KEY_PAGE_DOWN: eye_location_os.y -= 0.1; break;
case FB_KEY_UP: eye_location_os.z -= 0.1; break;
case FB_KEY_DOWN: eye_location_os.z += 0.1; break;
}
pVect eye_direction = pVect(0,0,-1);
const uint win_width = frame_buffer.width_get();
const uint win_height = 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_os);
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, qn, 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;
frame_buffer[ c.x + int(c.y) * win_width ] = color;
}
}
}
int
main(int argc, char **argv)
{
pFrame_Buffer demo_frame_buffer(argc,argv);
World_S worlds(demo_frame_buffer);
World_L worldl(demo_frame_buffer);
WRender render(demo_frame_buffer);
WRENDER_INSERT(render, worlds);
WRENDER_INSERT(render, worldl);
render.run();
return 0;
}