rasterizer.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "rasterizer.h"
  2. #include "vector"
  3. #include "array"
  4. #include <algorithm>
  5. const SDL_PixelFormat* Rasterizer::mappingFormat( SDL_AllocFormat(PIXEL_FORMAT));
  6. void Rasterizer::makeCoolPattern(){
  7. Uint32 red = SDL_MapRGBA(mappingFormat, 0xFF,0x00,0x00,0xFF);
  8. Uint32 green = SDL_MapRGBA(mappingFormat, 0x00,0xFF,0x00,0xFF);
  9. Uint32 blue = SDL_MapRGBA(mappingFormat, 0x00,0x00,0xFF,0xFF);
  10. for(int y = 0; y < mCanvas->mHeight; ++y){
  11. for(int x = 0; x < mCanvas->mWidth; ++x){
  12. Uint8 r = x*y % 256;
  13. Uint8 g = y % 256;
  14. Uint8 b = x % 256;
  15. Uint32 color = SDL_MapRGBA(mappingFormat, r,g,b,0xFF);
  16. setPixelColor(color, x, y);
  17. }
  18. }
  19. }
  20. void Rasterizer::testPattern(){
  21. Uint32 red = SDL_MapRGBA(mappingFormat, 0xFF,0x00,0x00,0xFF);
  22. Uint32 green = SDL_MapRGBA(mappingFormat, 0x00,0xFF,0x00,0xFF);
  23. Uint32 blue = SDL_MapRGBA(mappingFormat, 0x00,0x00,0xFF,0xFF);
  24. setPixelColor(red,600,200);
  25. setPixelColor(green,400,200);
  26. setPixelColor(blue,200,200);
  27. }
  28. //Should probably do something fancier in the future
  29. void Rasterizer::drawTriangles(Vector3 &v0, Vector3 &v1, Vector3 &v2 ){
  30. std::array<int, 3> xVerts;
  31. std::array<int, 3> yVerts;
  32. xVerts[0] = (v0.x + 1 ) * mCanvas->mWidth * 0.5;
  33. yVerts[0] = (-v0.y + 1 ) * mCanvas->mHeight * 0.5;
  34. xVerts[1] = (v1.x +1 ) * mCanvas->mWidth * 0.5;
  35. yVerts[1] = (-v1.y +1 ) * mCanvas->mHeight * 0.5;
  36. xVerts[2] = (v2.x +1 ) * mCanvas->mWidth * 0.5;
  37. yVerts[2] = (-v2.y +1 ) * mCanvas->mHeight * 0.5;
  38. int xMax = *std::max_element(xVerts.begin(),xVerts.end());
  39. int yMax = *std::max_element(yVerts.begin(),yVerts.end());
  40. int xMin = *std::min_element(xVerts.begin(),xVerts.end());
  41. int yMin = *std::min_element(yVerts.begin(),yVerts.end());
  42. for(int y = yMin; y < yMax; ++y){
  43. for(int x = xMin; x < xMax; ++x){
  44. float edge1 = (x-xVerts[0])*(yVerts[1]-yVerts[0])
  45. - (xVerts[1]-xVerts[0])*(y-yVerts[0]);
  46. float edge2 = (x-xVerts[1])*(yVerts[2]-yVerts[1])
  47. - (xVerts[2]-xVerts[1])*(y-yVerts[1]);
  48. float edge3 = (x-xVerts[2])*(yVerts[0]-yVerts[2])
  49. - (xVerts[0]-xVerts[2])*(y-yVerts[2]);
  50. if(edge1 >= 0 && edge2 >= 0 && edge3 >= 0){
  51. setPixelColor(white, x, y);
  52. }
  53. }
  54. }
  55. }
  56. void Rasterizer::drawWireFrame(Vector3 &v1, Vector3 &v2, Vector3 &v3 ){
  57. drawLine(v1, v2, red);
  58. drawLine(v2, v3, green);
  59. drawLine(v1, v3, blue);
  60. }
  61. void Rasterizer::drawLine(Vector3 &vertex1, Vector3 &vertex2, Uint32 &color){
  62. int x1 = (vertex1.x + 1 ) * mCanvas->mWidth * 0.5;
  63. int y1 = (-vertex1.y + 1 ) * mCanvas->mHeight * 0.5;
  64. int x2 = (vertex2.x +1 ) * mCanvas->mWidth * 0.5;
  65. int y2 = (-vertex2.y +1 ) * mCanvas->mHeight * 0.5;
  66. //transpose line if it is too steep
  67. bool steep = false;
  68. if (std::abs(x1-x2) < std::abs(y1-y2) ){
  69. std::swap(x1,y1);
  70. std::swap(x2,y2);
  71. steep = true;
  72. }
  73. //Redefine line so that it is left to right
  74. if ( x1 > x2 ){
  75. std::swap(x1,x2);
  76. std::swap(y1,y2);
  77. }
  78. int dx = x2 - x1;
  79. int dy = y2 - y1;
  80. int derror2 = std::abs(dy)*2;
  81. int error2 = 0;
  82. int y = y1;
  83. for(int x=x1; x <= x2 ; x++){
  84. if(steep){
  85. setPixelColor(color, y, x);
  86. }
  87. else{
  88. setPixelColor(color, x, y);
  89. }
  90. error2 += derror2;
  91. if (error2 > dx){
  92. y += (y2 > y1 ? 1 : -1);
  93. error2 -= dx*2;
  94. }
  95. }
  96. }
  97. void Rasterizer::setPixelColor(Uint32 color, int x, int y){
  98. int arrayCoordinates = convertCoordinates(x,y);
  99. if( ((x >= 0 ) && (y >= 0)) && ((x < mCanvas->mWidth ) && (y < mCanvas->mHeight)) ){
  100. mCanvas->mBuffer[arrayCoordinates] = color;
  101. }
  102. }
  103. int Rasterizer::convertCoordinates(int x, int y){
  104. return ((y * mCanvas->mWidth) + x);
  105. }