PolyRenderer.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. /*
  2. * PolyRenderer.cpp
  3. * TAU
  4. *
  5. * Created by Ivan Safrin on 3/12/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolyRenderer.h"
  10. using namespace Polycode;
  11. Renderer::Renderer() : currentTexture(NULL), xRes(0), yRes(0), renderMode(0), orthoMode(false), lightingEnabled(false), clearColor(0.2f, 0.2f, 0.2f, 0.0) {
  12. textureFilteringMode = TEX_FILTERING_LINEAR;
  13. currentMaterial = NULL;
  14. numLights = 0;
  15. exposureLevel = 1;
  16. shadersEnabled = true;
  17. currentFrameBufferTexture = NULL;
  18. previousFrameBufferTexture = NULL;
  19. currentMaterial = NULL;
  20. numLights = 0;
  21. numAreaLights = 0;
  22. numSpotLights = 0;
  23. exposureLevel = 1;
  24. shadersEnabled = true;
  25. currentShaderModule = NULL;
  26. currentFrameBufferTexture = NULL;
  27. previousFrameBufferTexture = NULL;
  28. fov = 45.0;
  29. }
  30. Renderer::~Renderer() {
  31. }
  32. void Renderer::enableShaders(bool flag) {
  33. shadersEnabled = flag;
  34. }
  35. void Renderer::setCameraMatrix(Matrix4 matrix) {
  36. cameraMatrix = matrix;
  37. }
  38. void Renderer::clearLights() {
  39. numLights = 0;
  40. numAreaLights = 0;
  41. numSpotLights = 0;
  42. lights.clear();
  43. areaLights.clear();
  44. spotLights.clear();
  45. shadowMapTextures.clear();
  46. }
  47. void Renderer::addShadowMap(Texture *texture) {
  48. shadowMapTextures.push_back(texture);
  49. }
  50. void Renderer::setExposureLevel(float level) {
  51. exposureLevel = level;
  52. }
  53. bool Renderer::rayTriangleIntersect(Vector3 ray_origin, Vector3 ray_direction, Vector3 vert0, Vector3 vert1, Vector3 vert2, Vector3 *hitPoint)
  54. {
  55. float t,u,v;
  56. t = 0; u = 0; v = 0;
  57. Vector3 edge1 = vert1 - vert0;
  58. Vector3 edge2 = vert2 - vert0;
  59. Vector3 tvec, pvec, qvec;
  60. float det, inv_det;
  61. pvec = ray_direction.crossProduct(edge2);
  62. det = edge1.dot(pvec);
  63. if (det > -0.00001f)
  64. return false;
  65. inv_det = 1.0f / det;
  66. tvec = ray_origin - vert0;
  67. u = tvec.dot(pvec) * inv_det;
  68. if (u < -0.001f || u > 1.001f)
  69. return false;
  70. qvec = tvec.crossProduct(edge1);
  71. v = ray_direction.dot(qvec) * inv_det;
  72. if (v < -0.001f || u + v > 1.001f)
  73. return false;
  74. t = edge2.dot(qvec) * inv_det;
  75. if (t <= 0)
  76. return false;
  77. hitPoint->x = ray_origin.x+t*ray_direction.x;
  78. hitPoint->y = ray_origin.y+t*ray_direction.y;
  79. hitPoint->z = ray_origin.z+t*ray_direction.z;
  80. return true;
  81. }
  82. void Renderer::addShaderModule(PolycodeShaderModule *module) {
  83. shaderModules.push_back(module);
  84. }
  85. void Renderer::addLight(Vector3 position, Vector3 direction, int type, Color color, float distance, float intensity, Matrix4 *textureMatrix) {
  86. numLights++;
  87. LightInfo info;
  88. if(textureMatrix != NULL) {
  89. info.textureMatrix = *textureMatrix;
  90. }
  91. info.intensity = intensity;
  92. info.type = type;
  93. info.dir = direction;
  94. info.distance = distance;
  95. info.color.set(color.r, color.g, color.b);
  96. info.position = position;
  97. lights.push_back(info);
  98. switch(type) {
  99. case 0: //area light
  100. areaLights.push_back(info);
  101. numAreaLights++;
  102. break;
  103. case 1: //spot light
  104. spotLights.push_back(info);
  105. numSpotLights++;
  106. break;
  107. }
  108. }
  109. Matrix4 Renderer::getCameraMatrix() {
  110. return cameraMatrix;
  111. }
  112. void Renderer::setCameraPosition(Vector3 pos) {
  113. cameraPosition = pos;
  114. pos = pos * -1;
  115. this->translate3D(&pos);
  116. }
  117. void Renderer::billboardMatrixWithScale(Vector3 scale) {
  118. Matrix4 matrix = getModelviewMatrix();
  119. matrix.m[0][0] = 1.0f*scale.x;
  120. matrix.m[0][1] = 0;
  121. matrix.m[0][2] = 0;
  122. matrix.m[1][0] = 0;
  123. matrix.m[1][1] = 1.0f*scale.y;
  124. matrix.m[1][2] = 0;
  125. matrix.m[2][0] = 0;
  126. matrix.m[2][1] = 0;
  127. matrix.m[2][2] = 1.0f*scale.z;
  128. setModelviewMatrix(matrix);
  129. }
  130. void Renderer::billboardMatrix() {
  131. Matrix4 matrix = getModelviewMatrix();
  132. matrix.m[0][0] = 1;
  133. matrix.m[0][1] = 0;
  134. matrix.m[0][2] = 0;
  135. matrix.m[1][0] = 0;
  136. matrix.m[1][1] = 1;
  137. matrix.m[1][2] = 0;
  138. matrix.m[2][0] = 0;
  139. matrix.m[2][1] = 0;
  140. matrix.m[2][2] = 1;
  141. setModelviewMatrix(matrix);
  142. }
  143. void Renderer::pushDataArrayForMesh(Mesh *mesh, int arrayType) {
  144. if(mesh->arrayDirtyMap[arrayType] == true || mesh->renderDataArrays[arrayType] == NULL) {
  145. if(mesh->renderDataArrays[arrayType] != NULL) {
  146. free(mesh->renderDataArrays[arrayType]->arrayPtr);
  147. }
  148. mesh->renderDataArrays[arrayType] = createRenderDataArrayForMesh(mesh, arrayType);
  149. mesh->arrayDirtyMap[arrayType] = false;
  150. }
  151. pushRenderDataArray(mesh->renderDataArrays[arrayType]);
  152. }
  153. int Renderer::getXRes() {
  154. return xRes;
  155. }
  156. int Renderer::getYRes() {
  157. return yRes;
  158. }
  159. void Renderer::setAmbientColor(float r, float g, float b) {
  160. ambientColor.setColor(r,g,b,1.0f);
  161. }
  162. void Renderer::setClearColor(Color color) {
  163. setClearColor(color.r, color.g, color.b);
  164. }
  165. void Renderer::setRenderMode(int newRenderMode) {
  166. renderMode = newRenderMode;
  167. }
  168. void Renderer::setTextureFilteringMode(int mode) {
  169. textureFilteringMode = mode;
  170. }
  171. int Renderer::getRenderMode() {
  172. return renderMode;
  173. }