Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Fill Triangle (Flat Non-Shaded) Edge Coefficients
- void rdp_fill_triangle( uint8_t lft, uint8_t level, uint8_t tile, float yl, float ym, float yh, float xl, float dxldy, float xh, float dxhdy, float xm, float dxmdy )
- {
- rdp_command( 0x08000000 | lft << 23 | level << 19 | tile << 16 | ((int)(yl * 4.0) & 0x3FFF) );
- rdp_command( ((int)(ym * 4.0) & 0x3FFF) << 16 | ((int)(yh * 4.0) & 0x3FFF) );
- rdp_command( (int)(xl * 65536.0) );
- rdp_command( (int)(dxldy * 65536.0) );
- rdp_command( (int)(xh * 65536.0) );
- rdp_command( (int)(dxhdy * 65536.0) );
- rdp_command( (int)(xm * 65536.0) );
- rdp_command( (int)(dxmdy * 65536.0) );
- }
- // Draw Fill Triangle (From 3 Unsorted X/Y Points, With Fill Color)
- void rdp_draw_fill_triangle( float x1, float y1, float x2, float y2, float x3, float y3 )
- {
- float temp_x, temp_y;
- // Sort Vertices By Y Ascending To Find The Major, Mid & Low Edges
- if( y1 > y2 ) { temp_x = x2, temp_y = y2; y2 = y1; y1 = temp_y; x2 = x1; x1 = temp_x; }
- if( y2 > y3 ) { temp_x = x3, temp_y = y3; y3 = y2; y2 = temp_y; x3 = x2; x2 = temp_x; }
- if( y1 > y2 ) { temp_x = x2, temp_y = y2; y2 = y1; y1 = temp_y; x2 = x1; x1 = temp_x; }
- // yh = y1, ym = y2, yl = y3
- // xh = x1, xm = x1, xl = x2
- // Calculate Inverse Slopes
- float dxhdy = ( y3 == y1 ) ? 0 : ( ( x3 - x1 ) / ( y3 - y1 ) );
- float dxmdy = ( y2 == y1 ) ? 0 : ( ( x2 - x1 ) / ( y2 - y1 ) );
- float dxldy = ( y3 == y2 ) ? 0 : ( ( x3 - x2 ) / ( y3 - y2 ) );
- // Determine Triangle Winding Left Major Flag
- int Hdx = x3 - x1; int Hdy = y3 - y1;
- int Mdx = x2 - x1; int Mdy = y2 - y1;
- int r = Hdx * Mdy - Hdy * Mdx;
- int lft = r < 0 ? 1 : 0;
- // Command & Edge Coefficients
- rdp_fill_triangle( lft, 0, 0, y3, y2, y1, x2, dxldy, x1, dxhdy, x1, dxmdy ); // lft, Level, Tile, YL, YM, YH, XL,DxLDy, XH,DxHDy, XM, DxMDy
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement