renderManager.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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 = 60;
  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], new float[pixelCount]);
  49. SDL_memset(mainCanvas->mBuffer, 0, mainCanvas->mPixelCount * sizeof(Uint32) );
  50. for(int i = 0; i < mainCanvas->mPixelCount;++i){
  51. mainCanvas->mDBuffer[i] = 2.0f;
  52. }
  53. return mainCanvas != NULL;
  54. }
  55. bool RenderManager::createRenderer(SDL_Window *window){
  56. mainRenderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC);
  57. if(mainRenderer == nullptr){
  58. printf("Could not create renderer context. Error: %s\n", SDL_GetError());
  59. return false;
  60. }
  61. return true;
  62. }
  63. void RenderManager::shutDown(){
  64. delete raster;
  65. delete mainCanvas->mBuffer;
  66. delete mainCanvas;
  67. screenTexture.free();
  68. SDL_DestroyRenderer(mainRenderer);
  69. mainRenderer = nullptr;
  70. }
  71. void RenderManager::render(Model *models, Matrix4 &viewMatrix){
  72. //Clear Screen back to black
  73. clearScreen();
  74. //Combination of both matrices
  75. Matrix4 viewProjectionMatrix = projectionMatrix*viewMatrix;
  76. Vector3 forward(viewMatrix(2,0),viewMatrix(2,1),viewMatrix(2,2));
  77. //Getting the meshes and faces
  78. Mesh * modelMesh = models->getMesh();
  79. std::vector<Vector3> * faces = &modelMesh->faces;
  80. std::vector<Vector3> * vertices = &modelMesh->vertices;
  81. //Kind of a vertex shader I guess?
  82. for (Vector3 f : *faces ){
  83. Vector3 v1 = viewProjectionMatrix.matMultVec((*vertices)[f.x-1]); //-1 because .obj file starts face count
  84. Vector3 v2 = viewProjectionMatrix.matMultVec((*vertices)[f.y-1]); // from 1. Should probably fix this
  85. Vector3 v3 = viewProjectionMatrix.matMultVec((*vertices)[f.z-1]); // At some point
  86. if(v1.x < -1 || v1.x > 1 || v1.y < -1 || v1.y > 1 || v1.z > 1 || v1.z < -1) continue;
  87. if(v2.x < -1 || v2.x > 1 || v2.y < -1 || v2.y > 1 || v2.z > 1 || v2.z < -1) continue;
  88. if(v3.x < -1 || v3.x > 1 || v3.y < -1 || v3.y > 1 || v3.z > 1 || v3.z < -1) continue;
  89. //Back face culling in world space
  90. Vector3 N1 = (*vertices)[f.y-1] - (*vertices)[f.x-1];
  91. Vector3 N2 = (*vertices)[f.z-1] - (*vertices)[f.x-1];
  92. Vector3 N = N1.crossProduct(N2);
  93. N = N.normalized();
  94. float intensity = N.dotProduct(forward);
  95. if(intensity > 0.0){
  96. //rasterizing
  97. raster->drawTriangles(v1,v2,v3,intensity);
  98. }
  99. }
  100. //Apply the pixel changes and redraw
  101. updateScreen();
  102. }
  103. void RenderManager::updateScreen(){
  104. screenTexture.updateTexture(mainCanvas->mBuffer);
  105. //Render texture to screen
  106. screenTexture.renderToScreen(mainRenderer);
  107. //Update screen to window
  108. SDL_RenderPresent( mainRenderer );
  109. }
  110. void RenderManager::clearScreen(){
  111. SDL_SetRenderDrawColor(mainRenderer, 0x00, 0x00, 0x00, 0xFF);
  112. SDL_RenderClear(mainRenderer);
  113. memset(mainCanvas->mBuffer,0, mainCanvas->mPitch*mainCanvas->mHeight);
  114. for(int i = 0; i < mainCanvas->mPixelCount;++i){
  115. mainCanvas->mDBuffer[i] = 2.0f;
  116. }
  117. }