Advertisement
SLiGerr

Untitled

Oct 9th, 2019
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. #include "olcConsoleGameEngine.h"
  2. using namespace std;
  3.  
  4. struct vec3d
  5. {
  6. float x, y, z;
  7. };
  8.  
  9. struct triangle
  10. {
  11. vec3d p[3];
  12. };
  13. struct mesh
  14. {
  15. vector<triangle> tris;
  16. };
  17.  
  18. struct mat4x4
  19. {
  20. float m[4][4] = { 0 };
  21. };
  22.  
  23.  
  24. class olcEngine3D : public olcConsoleGameEngine
  25. {
  26. public:
  27. olcEngine3D()
  28. {
  29. m_sAppName = L"3D Demo";
  30. olcEngine3D demo;
  31. if (demo.ConstructConsole(256, 240, 4, 4));
  32. demo.Start();
  33. }
  34. private:
  35. mesh meshCube;
  36. mat4x4 matProj;
  37.  
  38. void MultiplyMatrixVector(vec3d& i, vec3d& o, mat4x4& m)
  39. {
  40. o.x = i.x * m.m[0][0] + i.y * m.m[1][0] + i.z * m.m[2][0] + m.m[3][0];
  41. o.x = i.x * m.m[0][1] + i.y * m.m[1][1] + i.z * m.m[2][1] + m.m[3][1];
  42. o.x = i.x * m.m[0][2] + i.y * m.m[1][2] + i.z * m.m[2][2] + m.m[3][2];
  43. float w = i.x * m.m[0][3] + i.y * m.m[1][3] + i.z * m.m[2][3] + m.m[3][3];
  44.  
  45. if (w != 0.0f)
  46. {
  47. o.x /= w;
  48. o.y /= w;
  49. o.z /= w;
  50. }
  51. }
  52.  
  53. public:
  54. bool OnUserCreate() override
  55. {
  56. meshCube.tris = {
  57.  
  58. //South
  59. {0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f},
  60. {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f},
  61.  
  62. //East
  63. {1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f},
  64. {1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f},
  65.  
  66. //North
  67. {1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f},
  68. {1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f},
  69.  
  70. //West
  71. {0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f},
  72. {0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
  73.  
  74. //Top
  75. {0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f},
  76. {0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f},
  77.  
  78. //Bottom
  79. {1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
  80. {1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
  81.  
  82. };
  83.  
  84. //Projection Matrix
  85. float fNear = 0.1f;
  86. float fFar = 1000.0f;
  87. float fFov = 90.0f;
  88. float fAspectRatio = (float)ScreenHeight() / (float)ScreenWidth();
  89. float fFovRad = 1.0f / tanf(fFov * 0.5f / 180.0f * 3.14159f);
  90.  
  91. matProj.m[0][0] = fAspectRatio * fFovRad;
  92. matProj.m[1][1] = fFovRad;
  93.  
  94.  
  95.  
  96.  
  97. return true;
  98. }
  99.  
  100. bool OnUserUpdate(float fElapsedTime) override
  101. {
  102. Fill(0, 0, ScreenWidth(), ScreenHeight(), PIXEL_SOLID, FG_BLACK);
  103. for (auto tri : meshCube.tris)
  104. {
  105. triangle triProjected;
  106. MultiplyMatrixVector(tri.p[0], triProjected.p[0], matProj);
  107. MultiplyMatrixVector(tri.p[0], triProjected.p[0], matProj);
  108. MultiplyMatrixVector(tri.p[0], triProjected.p[0], matProj);
  109.  
  110. triProjected.p[0].x += 1.0f; triProjected.p[0].y += 1.0f;
  111. triProjected.p[1].x += 1.0f; triProjected.p[1].y += 1.0f;
  112. triProjected.p[2].x += 1.0f; triProjected.p[2].y += 1.0f;
  113.  
  114. triProjected.p[0].x *= 0.5f * (float)ScreenWidth();
  115. triProjected.p[1].x *= 0.5f * (float)ScreenWidth();
  116. triProjected.p[2].x *= 0.5f * (float)ScreenWidth();
  117.  
  118. triProjected.p[0].y *= 0.5f * (float)ScreenHeight();
  119. triProjected.p[1].y *= 0.5f * (float)ScreenHeight();
  120. triProjected.p[2].y *= 0.5f * (float)ScreenHeight();
  121.  
  122. DrawTriangle(triProjected.p[0].x, triProjected.p[0].y,
  123. triProjected.p[1].x, triProjected.p[1].y,
  124. triProjected.p[2].x, triProjected.p[2].y,
  125. PIXEL_SOLID, FG_WHITE);
  126. }
  127.  
  128. return true;
  129. }
  130.  
  131. };
  132.  
  133.  
  134. int main()
  135. {
  136. olcEngine3D();
  137. return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement