Guest User

Untitled

a guest
Feb 21st, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.91 KB | None | 0 0
  1. #include <math.h>
  2.  
  3. #define SCREEN_WIDTH 320
  4. #define SCREEN_HEIGHT 240
  5. float screenMidW = (float)SCREEN_WIDTH / 2.0f;
  6. float screenMidH = (float)SCREEN_HEIGHT / 2.0f;
  7.  
  8. float rotSineIdx = 0.0f, rotSineVal = 0.0f;
  9.  
  10. typedef struct
  11. {
  12.     float x, y, z;
  13. } VECTOR;
  14.  
  15. VECTOR newp[8], oldp[8];
  16. VECTOR cube[8] =
  17. {
  18.     { -1.0f, -1.0f, -1.0f }, /* 1 top left */
  19.     {  1.0f, -1.0f, -1.0f }, /* 1 top right */
  20.     { -1.0f,  1.0f, -1.0f }, /* 1 bottom left */
  21.     {  1.0f,  1.0f, -1.0f }, /* 1 bottom right */
  22.     { -1.0f, -1.0f,  1.0f }, /* 2 top left */
  23.     {  1.0f, -1.0f,  1.0f }, /* 2 top right */
  24.     { -1.0f,  1.0f,  1.0f }, /* 2 bottom left */
  25.     {  1.0f,  1.0f,  1.0f }  /* 2 bottom right */
  26. };
  27.  
  28. __forceinline void lineTo(unsigned int *pixbuf, float x1, float x2, float y1, float y2);
  29.  
  30. void drawCube(unsigned int *backbuf)
  31. {
  32.     /* update sinus/cosinus index */
  33.     rotSineVal = rotSineIdx * 3.141592654f / 180.0f;
  34.  
  35.     rotSineIdx += 1.0f;
  36.     if (rotSineIdx >= 360.0f)
  37.     {
  38.         rotSineIdx -= 360.0f;
  39.     }
  40.  
  41.     {
  42.         int i;
  43.         for (i = 0; i < 8; i++)
  44.         {
  45.             /* backup points */
  46.             oldp[i].x = cube[i].x;
  47.             oldp[i].y = cube[i].y;
  48.             oldp[i].z = cube[i].z;
  49.  
  50.             /* rotate points */
  51.             {
  52.                 float newCos = cosf(rotSineVal);
  53.                 float newSin = sinf(rotSineVal);
  54.  
  55.                 newp[i].x = ((oldp[i].x * newCos) - (oldp[i].y * newSin));
  56.                 newp[i].y = ((oldp[i].x * newSin) + (oldp[i].y * newCos));
  57.                 newp[i].z = oldp[i].z;
  58.  
  59.                 oldp[i].y = newp[i].y;
  60.                 oldp[i].z = newp[i].z;
  61.  
  62.                 newp[i].y = ((oldp[i].y * newCos) - (oldp[i].z * newSin));
  63.                 newp[i].z = ((oldp[i].y * newSin) + (oldp[i].z * newCos));
  64.                 oldp[i].x = newp[i].x;
  65.  
  66.                 oldp[i].z = newp[i].z;
  67.  
  68.                 newp[i].z = ((oldp[i].z * newCos) - (oldp[i].x * newSin));
  69.                 newp[i].x = ((oldp[i].z * newSin) + (oldp[i].x * newCos));
  70.             }
  71.  
  72.             /* project x/y points */
  73.             {
  74.                 float dist = 10.0f;
  75.                 float FOV = 384.0f;
  76.  
  77.                 newp[i].x = (newp[i].x / (newp[i].z + dist)) * FOV + screenMidW;
  78.                 newp[i].y = (newp[i].y / (newp[i].z + dist)) * FOV + screenMidH;
  79.             }
  80.         }
  81.     }
  82.  
  83.     /* render lines between new x/y positions */
  84.     lineTo(backbuf, newp[0].x, newp[1].x, newp[0].y, newp[1].y);
  85.     lineTo(backbuf, newp[0].x, newp[2].x, newp[0].y, newp[2].y);
  86.     lineTo(backbuf, newp[1].x, newp[3].x, newp[1].y, newp[3].y);
  87.     lineTo(backbuf, newp[2].x, newp[3].x, newp[2].y, newp[3].y);
  88.     lineTo(backbuf, newp[0].x, newp[4].x, newp[0].y, newp[4].y);
  89.     lineTo(backbuf, newp[1].x, newp[5].x, newp[1].y, newp[5].y);
  90.     lineTo(backbuf, newp[2].x, newp[6].x, newp[2].y, newp[6].y);
  91.     lineTo(backbuf, newp[3].x, newp[7].x, newp[3].y, newp[7].y);
  92.     lineTo(backbuf, newp[4].x, newp[5].x, newp[4].y, newp[5].y);
  93.     lineTo(backbuf, newp[4].x, newp[6].x, newp[4].y, newp[6].y);
  94.     lineTo(backbuf, newp[5].x, newp[7].x, newp[5].y, newp[7].y);
  95.     lineTo(backbuf, newp[6].x, newp[7].x, newp[6].y, newp[7].y);
  96. }
  97.  
  98. /* Bresenham's line algorithm */
  99. __forceinline void lineTo(unsigned int *pixbuf, float x1, float x2, float y1, float y2)
  100. {
  101.     int delta_x, ix, delta_y, iy;
  102.  
  103.     int nx1 = (int)x1;
  104.     int nx2 = (int)x2;
  105.     int ny1 = (int)y1;
  106.     int ny2 = (int)y2;
  107.  
  108.     #define ABS(a) (((a) < 0) ? -(a) : (a))
  109.  
  110.     delta_x = (nx2 - nx1);
  111.     ix = (delta_x > 0) - (delta_x < 0);
  112.     delta_x = ABS(delta_x) * 2;
  113.  
  114.     delta_y = (ny2 - ny1);
  115.     iy = ((delta_y > 0) - (delta_y < 0));
  116.     delta_y = ABS(delta_y) * 2;
  117.  
  118.     pixbuf[ny1 * SCREEN_WIDTH + nx1] = 0x00FFFFFF;
  119.  
  120.     if (delta_x >= delta_y)
  121.     {
  122.         int error = delta_y - (delta_x / 2);
  123.  
  124.         while (nx1 != nx2)
  125.         {
  126.             if (error >= 0)
  127.             {
  128.                 if (error || (ix > 0))
  129.                 {
  130.                     ny1 += iy;
  131.                     error -= delta_x;
  132.                 }
  133.             }
  134.  
  135.             nx1 += ix;
  136.             error += delta_y;
  137.  
  138.             pixbuf[ny1 * SCREEN_WIDTH + nx1] = 0x00FFFFFF;
  139.         }
  140.     }
  141.     else
  142.     {
  143.         int error = delta_x - (delta_y / 2);
  144.  
  145.         while (ny1 != ny2)
  146.         {
  147.             if (error >= 0)
  148.             {
  149.                 if (error || (iy > 0))
  150.                 {
  151.                     nx1 += ix;
  152.                     error -= delta_y;
  153.                 }
  154.             }
  155.  
  156.             ny1 += iy;
  157.             error += delta_x;
  158.  
  159.             pixbuf[ny1 * SCREEN_WIDTH + nx1] = 0x00FFFFFF;
  160.         }
  161.     }
  162. }
Add Comment
Please, Sign In to add comment