SHARE
TWEET

Untitled

a guest Feb 20th, 2019 58 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define OLC_PGE_APPLICATION
  2. #include "olcPixelGameEngine.h"
  3.  
  4.  
  5.  
  6. struct vec3d
  7. {
  8.     float x = 0;
  9.     float y = 0;
  10.     float z = 0;
  11. };  
  12.  
  13. struct LINE
  14. {
  15.     vec3d start,end;
  16. };
  17.  
  18. struct triangle
  19. {
  20.     vec3d p[3];
  21.     vec3d normal()
  22.     {
  23.         vec3d o, A, B;
  24.  
  25.         A = {p[1].x - p[0].x, p[1].y - p[0].y, p[1].z - p[0].z};
  26.         B = {p[2].x - p[0].x, p[2].y - p[0].y, p[2].z - p[0].z};
  27.        
  28.         o = {A.y * B.z - A.z * B.y, A.z * B.x - A.x * B.z, A.x * B.y - A.y * B.x};
  29.  
  30.         float l = sqrtf(o.x*o.x + o.y*o.y + o.z*o.z);
  31.         o.x /= l;
  32.         o.y /= l;
  33.         o.z /= l;
  34.         return o;
  35.     }
  36. };
  37.  
  38. struct mesh
  39. {
  40.     std::vector<triangle> tris;
  41. };
  42.  
  43.  
  44. struct mat4x4
  45. {
  46.     float m[4][4] = { 0.0 };
  47. };
  48.  
  49. class Example : public olc::PixelGameEngine
  50. {
  51. public:
  52.     Example()
  53.     {
  54.         sAppName = "rotatinCube";
  55.     }
  56. private:
  57.     mesh meshCube;
  58.     mat4x4 matProj;
  59.     float fTheta=0;
  60.     vec3d vCamera;
  61.  
  62.     void MultiplyMatrxVector(const vec3d &i, vec3d &o, const mat4x4 &m)
  63.     {
  64.         o.x     = i.x * m.m[0][0] + i.y * m.m[1][0] + i.z * m.m[2][0] + m.m[3][0];
  65.         o.y     = i.x * m.m[0][1] + i.y * m.m[1][1] + i.z * m.m[2][1] + m.m[3][1];
  66.         o.z     = i.x * m.m[0][2] + i.y * m.m[1][2] + i.z * m.m[2][2] + m.m[3][2];
  67.         float w = i.x * m.m[0][3] + i.y * m.m[1][3] + i.z * m.m[2][3] + m.m[3][3];
  68.  
  69.         if (w != 0.0f)
  70.         {
  71.             o.x /= w;
  72.             o.y /= w;
  73.             o.z /= w;
  74.         }
  75.     }
  76.  
  77. public:
  78.  
  79.     float dotProduct(vec3d &A, vec3d &B)
  80.     {
  81.         return (float)(A.x*B.x + A.y*B.y + A.z*B.z);
  82.     }
  83.     bool OnUserCreate() override
  84.     {
  85.  
  86.         meshCube.tris = {
  87.  
  88.         // SOUTH
  89.         { 0.0f, 0.0f, 0.0f,    0.0f, 1.0f, 0.0f,    1.0f, 1.0f, 0.0f },
  90.         { 0.0f, 0.0f, 0.0f,    1.0f, 1.0f, 0.0f,    1.0f, 0.0f, 0.0f },
  91.  
  92.         // EAST                                                      
  93.         { 1.0f, 0.0f, 0.0f,    1.0f, 1.0f, 0.0f,    1.0f, 1.0f, 1.0f },
  94.         { 1.0f, 0.0f, 0.0f,    1.0f, 1.0f, 1.0f,    1.0f, 0.0f, 1.0f },
  95.  
  96.         // NORTH                                                    
  97.         { 1.0f, 0.0f, 1.0f,    1.0f, 1.0f, 1.0f,    0.0f, 1.0f, 1.0f },
  98.         { 1.0f, 0.0f, 1.0f,    0.0f, 1.0f, 1.0f,    0.0f, 0.0f, 1.0f },
  99.  
  100.         // WEST                                                      
  101.         { 0.0f, 0.0f, 1.0f,    0.0f, 1.0f, 1.0f,    0.0f, 1.0f, 0.0f },
  102.         { 0.0f, 0.0f, 1.0f,    0.0f, 1.0f, 0.0f,    0.0f, 0.0f, 0.0f },
  103.  
  104.         // TOP                                                      
  105.         { 0.0f, 1.0f, 0.0f,    0.0f, 1.0f, 1.0f,    1.0f, 1.0f, 1.0f },
  106.         { 0.0f, 1.0f, 0.0f,    1.0f, 1.0f, 1.0f,    1.0f, 1.0f, 0.0f },
  107.  
  108.         // BOTTOM                                                    
  109.         { 1.0f, 0.0f, 1.0f,    0.0f, 0.0f, 1.0f,    0.0f, 0.0f, 0.0f },
  110.         { 1.0f, 0.0f, 1.0f,    0.0f, 0.0f, 0.0f,    1.0f, 0.0f, 0.0f },
  111.         };
  112.  
  113.         float fNear = 0.1f;
  114.         float fFar  = 1000.0f;
  115.         float fFov  = 90.0f;
  116.         float fAspectRatio = (float)ScreenHeight() / (float)ScreenWidth();
  117.         float fFovRad = 1.0f / tanf(fFov * 0.5 / 180.0f * 3.141592f );
  118.  
  119.         matProj.m[0][0] = fAspectRatio * fFovRad;
  120.         matProj.m[1][1] = fFovRad;
  121.         matProj.m[2][2] = fFar / (fFar - fNear);
  122.         matProj.m[3][2] = (-fFar * fNear) / (fFar - fNear);
  123.         matProj.m[2][3] = 1.0f;
  124.         matProj.m[3][3] = 0.0f;
  125.  
  126.         return true;
  127.     }
  128.  
  129.  
  130.     //vec3d matVecMult
  131.     bool OnUserUpdate(float fElapsedTime) override
  132.     {
  133.         // called once per frame
  134.  
  135.         FillRect(0,0,ScreenWidth(),ScreenHeight(),olc::BLACK);
  136.  
  137.         mat4x4 matRotZ, matRotX;
  138.         triangle triProjected, triTranslated,triRotatedZ, triRotatedZX;
  139.         vec3d normal, eyeLine;
  140.  
  141.         fTheta += 1.0f * fElapsedTime;
  142.  
  143.         matRotZ.m[0][0] = cosf(fTheta);
  144.         matRotZ.m[0][1] = sinf(fTheta);
  145.         matRotZ.m[1][0] = -sinf(fTheta);
  146.         matRotZ.m[1][1] = cosf(fTheta);
  147.         matRotZ.m[2][2] = 1;
  148.         matRotZ.m[3][3] = 1;
  149.  
  150.         matRotX.m[0][0] = 1;
  151.         matRotX.m[1][1] = cosf(fTheta);
  152.         matRotX.m[1][2] = sinf(fTheta);
  153.         matRotX.m[2][1] = -sinf(fTheta);
  154.         matRotX.m[2][2] = cosf(fTheta);
  155.         matRotX.m[3][3] = 1;
  156.  
  157.         for (auto tri : meshCube.tris)
  158.         {
  159.             for (int i = 0; i < 3; i++)
  160.             {
  161.                 MultiplyMatrxVector(tri.p[i], triRotatedZ.p[i],matRotZ);
  162.                 MultiplyMatrxVector(triRotatedZ.p[i], triRotatedZX.p[i],matRotX);
  163.  
  164.                 triTranslated = triRotatedZX;
  165.                 triTranslated.p[i].z = triRotatedZX.p[i].z + 3.0f;
  166.  
  167.                 MultiplyMatrxVector(triTranslated.p[i], triProjected.p[i], matProj);
  168.                 triProjected.p[i].x += 1.0f;
  169.                 triProjected.p[i].y += 1.0f;
  170.                 triProjected.p[i].x *= (0.5f * (float)ScreenWidth());
  171.                 triProjected.p[i].y *= (0.5f * (float)ScreenHeight());
  172.             }
  173.            
  174.             normal = triTranslated.normal();
  175.  
  176.             eyeLine.x = triTranslated.p[1].x - vCamera.x;
  177.             eyeLine.y = triTranslated.p[1].y - vCamera.y;
  178.             eyeLine.z = triTranslated.p[1].z - vCamera.z;
  179.            
  180.             if (dotProduct(normal,eyeLine) > 0.0f)
  181.             {
  182.                 DrawTriangle(triProjected.p[0].x, triProjected.p[0].y,
  183.                              triProjected.p[1].x, triProjected.p[1].y,
  184.                              triProjected.p[2].x, triProjected.p[2].y, olc::WHITE);
  185.             }
  186.  
  187.         }
  188.         return true;
  189.     }
  190. };
  191.  
  192.  
  193. int main()
  194. {
  195.     Example demo;
  196.     if (demo.Construct(256*2, 240*2, 1, 1))
  197.     {
  198.         demo.Start();
  199.     }
  200.  
  201.     return 0;
  202. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top