Guest User

Untitled

a guest
Feb 21st, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.85 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.             float dist = 10.0f;
  46.             float FOV = 384.0f;
  47.  
  48.             /* backup points */
  49.             oldp[i].x = cube[i].x;
  50.             oldp[i].y = cube[i].y;
  51.             oldp[i].z = cube[i].z;
  52.  
  53.             /* rotate points */
  54.             {
  55.                 float newCos = cosf(rotSineVal);
  56.                 float newSin = sinf(rotSineVal);
  57.  
  58.                 newp[i].x = ((oldp[i].x * newCos) - (oldp[i].y * newSin));
  59.                 newp[i].y = ((oldp[i].x * newSin) + (oldp[i].y * newCos));
  60.                 newp[i].z = oldp[i].z;
  61.  
  62.                 oldp[i].y = newp[i].y;
  63.                 oldp[i].z = newp[i].z;
  64.  
  65.                 newp[i].y = ((oldp[i].y * newCos) - (oldp[i].z * newSin));
  66.                 newp[i].z = ((oldp[i].y * newSin) + (oldp[i].z * newCos));
  67.                 oldp[i].x = newp[i].x;
  68.  
  69.                 oldp[i].z = newp[i].z;
  70.  
  71.                 newp[i].z = ((oldp[i].z * newCos) - (oldp[i].x * newSin));
  72.                 newp[i].x = ((oldp[i].z * newSin) + (oldp[i].x * newCos));
  73.             }
  74.  
  75.             /* project x/y points */
  76.             newp[i].x = (newp[i].x / (newp[i].z + dist)) * FOV + screenMidW;
  77.             newp[i].y = (newp[i].y / (newp[i].z + dist)) * FOV + screenMidH;
  78.         }
  79.     }
  80.  
  81.     /* render x/y positions */
  82.     lineTo(backbuf, newp[0].x, newp[1].x, newp[0].y, newp[1].y);
  83.     lineTo(backbuf, newp[0].x, newp[2].x, newp[0].y, newp[2].y);
  84.     lineTo(backbuf, newp[1].x, newp[3].x, newp[1].y, newp[3].y);
  85.     lineTo(backbuf, newp[2].x, newp[3].x, newp[2].y, newp[3].y);
  86.     lineTo(backbuf, newp[0].x, newp[4].x, newp[0].y, newp[4].y);
  87.     lineTo(backbuf, newp[1].x, newp[5].x, newp[1].y, newp[5].y);
  88.     lineTo(backbuf, newp[2].x, newp[6].x, newp[2].y, newp[6].y);
  89.     lineTo(backbuf, newp[3].x, newp[7].x, newp[3].y, newp[7].y);
  90.     lineTo(backbuf, newp[4].x, newp[5].x, newp[4].y, newp[5].y);
  91.     lineTo(backbuf, newp[4].x, newp[6].x, newp[4].y, newp[6].y);
  92.     lineTo(backbuf, newp[5].x, newp[7].x, newp[5].y, newp[7].y);
  93.     lineTo(backbuf, newp[6].x, newp[7].x, newp[6].y, newp[7].y);
  94. }
  95.  
  96. __forceinline void lineTo(unsigned int *pixbuf, float x1, float x2, float y1, float y2)
  97. {
  98.     int delta_x, ix, delta_y, iy;
  99.  
  100.     int nx1 = (int)x1;
  101.     int nx2 = (int)x2;
  102.     int ny1 = (int)y1;
  103.     int ny2 = (int)y2;
  104.  
  105.     #define ABS(a) (((a) < 0) ? -(a) : (a))
  106.  
  107.     delta_x = (nx2 - nx1);
  108.     ix = (delta_x > 0) - (delta_x < 0);
  109.     delta_x = ABS(delta_x) * 2;
  110.  
  111.     delta_y = (ny2 - ny1);
  112.     iy = ((delta_y > 0) - (delta_y < 0));
  113.     delta_y = ABS(delta_y) * 2;
  114.  
  115.     pixbuf[ny1 * SCREEN_WIDTH + nx1] = 0x00FFFFFF;
  116.  
  117.     if (delta_x >= delta_y)
  118.     {
  119.         int error = delta_y - (delta_x / 2);
  120.  
  121.         while (nx1 != nx2)
  122.         {
  123.             if (error >= 0)
  124.             {
  125.                 if (error || (ix > 0))
  126.                 {
  127.                     ny1 += iy;
  128.                     error -= delta_x;
  129.                 }
  130.             }
  131.  
  132.             nx1 += ix;
  133.             error += delta_y;
  134.  
  135.             pixbuf[ny1 * SCREEN_WIDTH + nx1] = 0x00FFFFFF;
  136.         }
  137.     }
  138.     else
  139.     {
  140.         int error = delta_x - (delta_y / 2);
  141.  
  142.         while (ny1 != ny2)
  143.         {
  144.             if (error >= 0)
  145.             {
  146.                 if (error || (iy > 0))
  147.                 {
  148.                     nx1 += ix;
  149.                     error -= delta_y;
  150.                 }
  151.             }
  152.  
  153.             ny1 += iy;
  154.             error += delta_x;
  155.  
  156.             pixbuf[ny1 * SCREEN_WIDTH + nx1] = 0x00FFFFFF;
  157.         }
  158.     }
  159. }
Add Comment
Please, Sign In to add comment