renderManager.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #include "renderManager.h"
  2. RenderManager::RenderManager(){
  3. }
  4. RenderManager::~RenderManager(){
  5. }
  6. bool RenderManager::startUp(WindowManager WindowManager){
  7. //Get our current window and create a renderer for it.
  8. SDL_Window * mainWindow = WindowManager.getWindow();
  9. if( !createRenderer(mainWindow) ){
  10. return false;
  11. }
  12. else{
  13. if( !createScreenTexture() ){
  14. return false;
  15. }
  16. else{
  17. if( !createCanvas() ){
  18. printf("Could not build canvas.\n");
  19. return false;
  20. }
  21. //Create rasterizer to begin drawing
  22. raster = new Rasterizer(mainCanvas);
  23. createProjectionMatrix();
  24. return true;
  25. }
  26. }
  27. }
  28. void RenderManager::createProjectionMatrix(){
  29. float fov = 75;
  30. float aspectRatio = mainCanvas->mWidth / (float)mainCanvas->mHeight;
  31. float near = 0.1;
  32. float far = 100;
  33. projectionMatrix = Matrix4::makeProjectionMatrix(fov, aspectRatio, near,far);
  34. }
  35. bool RenderManager::createScreenTexture(){
  36. if(! screenTexture.createBlank(mainRenderer, WindowManager::SCREEN_WIDTH, WindowManager::SCREEN_HEIGHT)){
  37. printf("Could not create texture. Error: %s\n", SDL_GetError());
  38. return false;
  39. }
  40. return true;
  41. }
  42. bool RenderManager::createCanvas(){
  43. int pixelCount = WindowManager::SCREEN_WIDTH * WindowManager::SCREEN_HEIGHT;
  44. int pitch = WindowManager::SCREEN_WIDTH * sizeof(Uint32);
  45. mainCanvas = new Canvas(WindowManager::SCREEN_WIDTH,
  46. WindowManager::SCREEN_HEIGHT,
  47. pixelCount, pitch,
  48. new Uint32[pixelCount]);
  49. SDL_memset(mainCanvas->mBuffer, 0, mainCanvas->mPixelCount * sizeof(Uint32) );
  50. return mainCanvas != NULL;
  51. }
  52. bool RenderManager::createRenderer(SDL_Window *window){
  53. mainRenderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
  54. if(mainRenderer == nullptr){
  55. printf("Could not create renderer context. Error: %s\n", SDL_GetError());
  56. return false;
  57. }
  58. return true;
  59. }
  60. void RenderManager::shutDown(){
  61. delete raster;
  62. delete mainCanvas->mBuffer;
  63. delete mainCanvas;
  64. screenTexture.free();
  65. SDL_DestroyRenderer(mainRenderer);
  66. mainRenderer = nullptr;
  67. }
  68. void RenderManager::render(Model *models, Matrix4 &viewMatrix){
  69. //Clear Screen back to black
  70. clearScreen();
  71. //Combination of both matrices
  72. Matrix4 viewProjectionMatrix = projectionMatrix*viewMatrix;
  73. //Getting the meshes and faces
  74. Mesh * modelMesh = models->getMesh();
  75. std::vector<Vector3> * faces = &modelMesh->faces;
  76. std::vector<Vector3> * vertices = &modelMesh->vertices;
  77. for (Vector3 f : *faces ){
  78. Vector3 v1 = viewProjectionMatrix.matMultVec((*vertices)[f.x-1]); //-1 because .obj file starts face count
  79. Vector3 v2 = viewProjectionMatrix.matMultVec((*vertices)[f.y-1]); // from 1. Should probably fix this
  80. Vector3 v3 = viewProjectionMatrix.matMultVec((*vertices)[f.z-1]); // At some point
  81. if(v1.x < -1 || v1.x > 1 || v1.y < -1 || v1.y > 1 || v1.z > 1 || v1.z < -1) continue;
  82. if(v2.x < -1 || v2.x > 1 || v2.y < -1 || v2.y > 1 || v2.z > 1 || v2.z < -1) continue;
  83. if(v3.x < -1 || v3.x > 1 || v3.y < -1 || v3.y > 1 || v3.z > 1 || v3.z < -1) continue;
  84. raster->drawModels(v1,v2,v3);
  85. }
  86. //Rasterizing
  87. //Apply the pixel changes and redraw
  88. updateScreen();
  89. }
  90. void RenderManager::updateScreen(){
  91. screenTexture.updateTexture(mainCanvas->mBuffer);
  92. //Render texture to screen
  93. screenTexture.renderToScreen(mainRenderer);
  94. //Update screen to window
  95. SDL_RenderPresent( mainRenderer );
  96. }
  97. void RenderManager::clearScreen(){
  98. SDL_SetRenderDrawColor(mainRenderer, 0x00, 0x00, 0x00, 0xFF);
  99. SDL_RenderClear(mainRenderer);
  100. memset(mainCanvas->mBuffer,0, mainCanvas->mPitch*mainCanvas->mHeight);
  101. }