Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.86 KB | None | 0 0
  1. // Fill Triangle (Flat Non-Shaded) Edge Coefficients
  2. 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 )
  3. {
  4.     rdp_command( 0x08000000 | lft << 23 | level << 19 | tile << 16 | ((int)(yl * 4.0) & 0x3FFF) );
  5.     rdp_command( ((int)(ym * 4.0) & 0x3FFF) << 16 | ((int)(yh * 4.0) & 0x3FFF) );
  6.     rdp_command( (int)(xl * 65536.0) );
  7.     rdp_command( (int)(dxldy * 65536.0) );
  8.     rdp_command( (int)(xh * 65536.0) );
  9.     rdp_command( (int)(dxhdy * 65536.0) );
  10.     rdp_command( (int)(xm * 65536.0) );
  11.     rdp_command( (int)(dxmdy * 65536.0) );
  12. }
  13.  
  14. // Draw Fill Triangle (From 3 Unsorted X/Y Points, With Fill Color)
  15. void rdp_draw_fill_triangle( float x1, float y1, float x2, float y2, float x3, float y3 )
  16. {
  17.     float temp_x, temp_y;
  18.  
  19.     // Sort Vertices By Y Ascending To Find The Major, Mid & Low Edges
  20.     if( y1 > y2 ) { temp_x = x2, temp_y = y2; y2 = y1; y1 = temp_y; x2 = x1; x1 = temp_x; }
  21.     if( y2 > y3 ) { temp_x = x3, temp_y = y3; y3 = y2; y2 = temp_y; x3 = x2; x2 = temp_x; }
  22.     if( y1 > y2 ) { temp_x = x2, temp_y = y2; y2 = y1; y1 = temp_y; x2 = x1; x1 = temp_x; }
  23.  
  24.     // yh = y1, ym = y2, yl = y3
  25.     // xh = x1, xm = x1, xl = x2
  26.     // Calculate Inverse Slopes
  27.     float dxhdy = ( y3 == y1 ) ? 0 : ( ( x3 - x1 ) / ( y3 - y1 ) );
  28.     float dxmdy = ( y2 == y1 ) ? 0 : ( ( x2 - x1 ) / ( y2 - y1 ) );
  29.     float dxldy = ( y3 == y2 ) ? 0 : ( ( x3 - x2 ) / ( y3 - y2 ) );
  30.  
  31.     // Determine Triangle Winding Left Major Flag
  32.     int Hdx = x3 - x1; int Hdy = y3 - y1;
  33.     int Mdx = x2 - x1; int Mdy = y2 - y1;
  34.     int r = Hdx * Mdy - Hdy * Mdx;
  35.     int lft = r < 0 ? 1 : 0;
  36.  
  37.     // Command & Edge Coefficients
  38.     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
  39. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement