Nuppiz

plotTriangleLineColorBlendedInt

Apr 8th, 2022 (edited)
684
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.18 KB | None | 0 0
  1. void plotTriangleLineColorBlendedInt(Vec2 p1, Vec2 p2, Vec2_int center, Span* edge, uint8_t start_color, uint8_t end_color)
  2. {
  3.     int offset;
  4.     int counter;
  5.     int x = (int)(p1.x + 0.5) + center.x;
  6.     int y = (int)(p1.y + 0.5) + center.y;
  7.     int x_diff = (int)(p2.x - p1.x + 0.5);
  8.     int y_diff = (int)(p2.y - p1.y + 0.5);
  9.     int x_sign = SIGN(x_diff);
  10.     int y_sign = SIGN(y_diff);
  11.    
  12.     int color = start_color;
  13.     int color_diff = end_color - start_color;
  14.     int color_sign = SIGN(color_diff);
  15.     int color_counter;
  16.     char* edge_name;
  17.  
  18.     uint8_t test_color;
  19.    
  20.     x_diff = abs(x_diff);
  21.     y_diff = abs(y_diff);
  22.     color_diff = abs(color_diff);
  23.  
  24.     if (edge == &LeftEdge)
  25.     {
  26.         test_color = 200;
  27.         edge_name = "Left";
  28.     }
  29.    
  30.     else if (edge == &RightEdge)
  31.     {
  32.         test_color = 112;
  33.         edge_name = "Right";
  34.     }
  35.    
  36.     if (y_diff > x_diff)
  37.     {
  38.         color_counter = y_diff/2;
  39.         counter = y_diff/2;
  40.         // beginning at y_diff/2 instead of 0 fixes a minor inaccuracy
  41.         for (offset = 0; offset < y_diff; offset++)
  42.         {
  43.             // move along the y coordinate
  44.             y += y_sign;
  45.             // check whether to move on the y coordinate
  46.             counter += x_diff;
  47.             while (counter > y_diff)
  48.             {
  49.                 counter -= y_diff;
  50.                 x += x_sign;
  51.             }
  52.             edge->offset[y] = x;
  53.             edge->color[y] = (uint8_t)color;
  54.             // check whether to step the color value forwards
  55.             color_counter += color_diff;
  56.             while (color_counter > y_diff)
  57.             {
  58.                 color_counter -= y_diff;
  59.                 color += color_sign;
  60.             }
  61.             //printf("Writing: %s Y: %d X:%d\n", edge_name, y, x);
  62.             //delay(100);
  63.             if (KEY_IS_PRESSED (KEY_Q))
  64.                 SET_PIXEL(edge->offset[y], y, test_color);
  65.             else if (KEY_IS_PRESSED (KEY_R))
  66.                 SET_PIXEL(edge->offset[y], y, edge->color[y]);
  67.         }
  68.     }
  69.  
  70.     else if (x_diff > y_diff)
  71.     {
  72.         color_counter = x_diff/2;
  73.         counter = x_diff/2;
  74.         // beginning at y_diff/2 instead of 0 fixes a minor inaccuracy
  75.         for (offset = 0; offset < x_diff; offset++)
  76.         {
  77.             // move along the x coordinate
  78.             x += x_sign;
  79.             // check whether to move on the x coordinate
  80.             counter += y_diff;
  81.             while (counter > x_diff)
  82.             {
  83.                 counter -= x_diff;
  84.                 y += y_sign;
  85.             }
  86.             edge->offset[y] = x;
  87.             edge->color[y] = (uint8_t)color;
  88.             // check whether to step the color value forwards
  89.             color_counter += color_diff;
  90.             while (color_counter > x_diff)
  91.             {
  92.                 color_counter -= x_diff;
  93.                 color += color_sign;
  94.             }
  95.             //printf("Writing: %s Y: %d X:%d\n", edge_name, y, x);
  96.             //delay(100);
  97.             if (KEY_IS_PRESSED (KEY_Q))
  98.                 SET_PIXEL(edge->offset[y], y, test_color);
  99.             else if (KEY_IS_PRESSED (KEY_R))
  100.                 SET_PIXEL(edge->offset[y], y, edge->color[y]);
  101.         }
  102.     }
  103. }
Add Comment
Please, Sign In to add comment