Guest User

Untitled

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