PolySceneLight.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * PolySceneLight.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 9/21/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolySceneLight.h"
  10. using namespace Polycode;
  11. SceneLight::SceneLight(int type, Number intensity, Number distance, Scene *parentScene) : SceneEntity() {
  12. this->type = type;
  13. this->intensity = intensity;
  14. this->distance = distance;
  15. this->depthWrite = false;
  16. lightMesh = new Mesh(Mesh::QUAD_MESH);
  17. lightMesh->createBox(0.1,0.1,0.1);
  18. bBoxRadius = lightMesh->getRadius();
  19. bBox = lightMesh->calculateBBox();
  20. shadowMapFOV = 70.0f;
  21. zBufferTexture = NULL;
  22. spotCamera = NULL;
  23. this->parentScene = parentScene;
  24. shadowsEnabled = false;
  25. }
  26. void SceneLight::enableShadows(bool val, Number resolution) {
  27. if(val) {
  28. if(!zBufferTexture) {
  29. CoreServices::getInstance()->getRenderer()->createRenderTextures(NULL, &zBufferTexture, resolution, resolution);
  30. }
  31. if(!spotCamera) {
  32. spotCamera = new Camera(parentScene);
  33. spotCamera->setPitch(-90.0f);
  34. addEntity(spotCamera);
  35. }
  36. shadowMapRes = resolution;
  37. shadowsEnabled = true;
  38. } else {
  39. shadowsEnabled = false;
  40. }
  41. }
  42. bool SceneLight::areShadowsEnabled() {
  43. return shadowsEnabled;
  44. }
  45. void SceneLight::setShadowMapFOV(Number fov) {
  46. }
  47. SceneLight::~SceneLight() {
  48. printf("Destroying scene light...\n");
  49. }
  50. void SceneLight::renderDepthMap(Scene *scene) {
  51. CoreServices::getInstance()->getRenderer()->clearScreen();
  52. CoreServices::getInstance()->getRenderer()->pushMatrix();
  53. CoreServices::getInstance()->getRenderer()->loadIdentity();
  54. CoreServices::getInstance()->getRenderer()->setViewportSize(shadowMapRes, shadowMapRes, shadowMapFOV);
  55. CoreServices::getInstance()->getRenderer()->bindFrameBufferTexture(zBufferTexture);
  56. scene->RenderDepthOnly(spotCamera);
  57. lightViewMatrix = CoreServices::getInstance()->getRenderer()->getModelviewMatrix() * CoreServices::getInstance()->getRenderer()->getProjectionMatrix();
  58. CoreServices::getInstance()->getRenderer()->unbindFramebuffers();
  59. CoreServices::getInstance()->getRenderer()->popMatrix();
  60. CoreServices::getInstance()->getRenderer()->setViewportSize(CoreServices::getInstance()->getCore()->getXRes(), CoreServices::getInstance()->getCore()->getYRes(), 45.0f);
  61. }
  62. Matrix4 SceneLight::getLightViewMatrix() {
  63. return lightViewMatrix;
  64. }
  65. Texture *SceneLight::getZBufferTexture() {
  66. return zBufferTexture;
  67. }
  68. Number SceneLight::getIntensity() {
  69. return intensity;
  70. }
  71. Number SceneLight::getDistance() {
  72. return distance;
  73. }
  74. void SceneLight::Render() {
  75. /*
  76. CoreServices::getInstance()->getRenderer()->setTexture(NULL);
  77. CoreServices::getInstance()->getRenderer()->beginRenderOperation(lightMesh->getMeshType());
  78. for(int i=0; i < lightMesh->getPolygonCount(); i++) {
  79. CoreServices::getInstance()->getRenderer()->draw3DPolygon(lightMesh->getPolygon(i));
  80. }
  81. CoreServices::getInstance()->getRenderer()->endRenderOperation();
  82. */
  83. }
  84. int SceneLight::getType() {
  85. return type;
  86. }