Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void RasterizeTriangle( Point4 p1, Point4 p2, Point4 p3, Color c )
- {
- Point4 T, M, B;
- Point4 zT, zM, zB;
- f32 x, y, mL, mR, xL, xR;
- bool M_is_left;
- if ( p1.y < p2.y ) // 1, 2, 5
- {
- if( p1.y < p3.y ) // 1, 2
- {
- if( p2.y < p3.y ) // 1
- {
- T = p1;
- M = p2;
- B = p3;
- zT = p1;
- zM = p2;
- zB = p3;
- M_is_left = true;
- }
- else // 2
- {
- T = p1;
- M = p3;
- B = p2;
- zT = p1;
- zM = p3;
- zB = p2;
- M_is_left = false;
- }
- }
- else // 5
- {
- T = p3;
- M = p1;
- B = p2;
- zT = p3;
- zM = p1;
- zB = p2;
- M_is_left = true;
- }
- }
- else if( p2.y <= p1.y ) // 3, 4, 6
- {
- if( p2.y < p3.y ) // 3, 4
- {
- if( p3.y < p1.y ) // 3
- {
- T = p2;
- M = p3;
- B = p1;
- zT = p2;
- zM = p3;
- zB = p1;
- M_is_left = true;
- }
- else // 4
- {
- T = p2;
- M = p1;
- B = p3;
- zT = p2;
- zM = p1;
- zB = p3;
- M_is_left = false;
- }
- }
- else // 6
- {
- T = p3;
- M = p2;
- B = p1;
- zT = p3;
- zM = p2;
- zB = p1;
- M_is_left = false;
- }
- }
- if( M_is_left )
- {
- mL = ( ( M.x - T.x ) / ( M.y - T.y ) );
- mR = ( ( B.x - T.x ) / ( B.y - T.y ) );
- }
- else
- {
- mL = ( ( B.x - T.x ) / ( B.y - T.y ) );
- mR = ( ( M.x - T.x ) / ( M.y - T.y ) );
- }
- // POINT INIT
- y = T.y;
- xL = T.x;
- xR = xL;
- // DB INIT
- // z1
- Vector4 MTz1 = ( M - T );
- MTz1.z = zM.x - zT.x;
- Vector4 BTz1 = ( B - T );
- BTz1.z = zB.x - zT.x;
- // z2
- Vector4 MTz2 = ( M - T );
- MTz2.z = zM.y - zT.y;
- Vector4 BTz2 = ( B - T );
- BTz2.z = zB.y - zT.y;
- // z3
- Vector4 MTz3 = ( M - T );
- MTz3.z = zM.z - zT.z;
- Vector4 BTz3 = ( B - T );
- BTz3.z = zB.z - zT.z;
- Point4 z1;
- z1.x = MTz1.x * BTz1.x;
- z1.y = MTz1.y * BTz1.y;
- z1.z = MTz1.z * BTz1.z;
- Point4 z2;
- z2.x = MTz2.x * BTz2.x;
- z2.y = MTz2.y * BTz2.y;
- z2.z = MTz2.z * BTz2.z;
- Point4 z3;
- z3.x = MTz3.x * BTz3.x;
- z3.y = MTz3.y * BTz3.y;
- z3.z = MTz3.z * BTz3.z;
- Point4 zz0 = zT;
- Point4 zz = zz0;
- Point4 zX( (-z3.x / z3.z), (-z3.x / z3.z), (-z3.x / z3.z) );
- Point4 zY( (-z3.y / z3.z), (-z3.y / z3.z), (-z3.y / z3.z) );
- // DRAW THE TOP HALF
- for( y = ceil(T.y); y < ceil(M.y); ++y )
- {
- zz = zz0;
- for( x = ceil(xL); x < ceil(xR); ++x )
- {
- DBSetPixel(Point4(x,y,zz.z),c.r,c.g,c.b);
- //DBSetPixel(Point4(x,y,p1.z),c.r,c.g,c.b);
- zz.x += zX.x;
- zz.y += zX.y;
- zz.z += zX.z;
- }
- xL += mL;
- xR += mR;
- zz0.x += ((zX.x * mL) + zY.x);
- zz0.y += ((zX.y * mL) + zY.y);
- zz0.z += ((zX.z * mL) + zY.z);
- }
- // READJUST SLOPE
- if( M_is_left )
- {
- mL = ( ( B.x - M.x ) / ( B.y - M.y ) );
- xL = M.x;
- }
- else
- {
- mR = ( ( B.x - M.x ) / ( B.y - M.y ) );
- xR = M.x;
- }
- // DRAW THE BOTTOM HALF
- for( y = ceil(M.y); y < ceil(B.y); ++y )
- {
- zz = zz0;
- for( x = ceil(xL); x < ceil(xR); ++x )
- {
- DBSetPixel(Point4(x,y,zz.z),c.r,c.g,c.b);
- //DBSetPixel(Point4(x,y,p1.z),c.r,c.g,c.b);
- zz.x += zX.x;
- zz.y += zX.y;
- zz.z += zX.z;
- }
- xL += mL;
- xR += mR;
- zz0.x += ((zX.x * mL) + zY.x);
- zz0.y += ((zX.y * mL) + zY.y);
- zz0.z += ((zX.z * mL) + zY.z);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement