#include "OgreDepthShadowMapRenderingRun.h" OgreDepthShadowMapRenderingRun::OgreDepthShadowMapRenderingRun(OgreSharedRuns* sharedRuns, String name, Light* light, unsigned int resolutionX, unsigned int resolutionY, String materialName ) :DepthShadowMapRenderingRun(resolutionX, resolutionY) , OgreRenderingRun(1, 1) , RenderingRun(1, 1) { this->light = light; this->sharedRuns = sharedRuns; this->name = name; this->materialName = materialName; createDepthMap(); } void OgreDepthShadowMapRenderingRun::createDepthMap() { TexturePtr texPtr = Ogre::TextureManager::getSingleton().createManual(name, "default", TEX_TYPE_2D, resolutionX, resolutionY, 0, 0, PF_FLOAT16_RGBA, TU_RENDERTARGET); depthMapTexture = texPtr.getPointer(); depthMapCamera = Root::getSingleton()._getCurrentSceneManager()->createCamera(name + "_CAMERA"); //add viewport to rendertarget HardwarePixelBuffer* hpb = (depthMapTexture->getBuffer()).getPointer(); RenderTarget* rt = hpb->getRenderTarget(); Viewport* v = rt->addViewport(depthMapCamera); v->setOverlaysEnabled(false); rt->setAutoUpdated(false); } void OgreDepthShadowMapRenderingRun::updateFrame(unsigned long frameNum) { refreshLight(); if(light->getType() == Light::LT_POINT) { updateDepthMap(); } else { updateDepthMap(); } } void OgreDepthShadowMapRenderingRun::updateDepthCubeFace(int facenum) { } void OgreDepthShadowMapRenderingRun::updateDepthMap() { setMaterialForVisibles(materialName, depthMapCamera, true); RenderTarget* rt = depthMapTexture->getBuffer().getPointer()->getRenderTarget(); SceneManager* sm = Root::getSingleton()._getCurrentSceneManager(); rt->update(); //rt->writeContentsToFile("shadowmap.dds"); restoreMaterials(); } void OgreDepthShadowMapRenderingRun::refreshLight() { if(light!= 0) { if(light->getType() == Light::LT_DIRECTIONAL) { Vector3 dir = light->getDirection(); depthMapCamera->setDirection( dir ); //TODO: where to put light depthMapCamera->setPosition( - dir * 100000 ); depthMapCamera->setProjectionType(PT_ORTHOGRAPHIC); } else if(light->getType() == Light::LT_SPOTLIGHT) { Vector3 dir = light->getDirection(); depthMapCamera->setDirection( dir ); Vector3 pos = light->getParentNode()->getWorldPosition(); depthMapCamera->setPosition(pos); depthMapCamera->setProjectionType(PT_PERSPECTIVE); depthMapCamera->setFOVy(light->getSpotlightOuterAngle()); } else//point light { Vector3 pos = light->getParentNode()->getWorldPosition(); Vector3 dir = -pos; depthMapCamera->setDirection( dir ); depthMapCamera->setPosition(pos); depthMapCamera->setProjectionType(PT_PERSPECTIVE); depthMapCamera->setFOVy(Radian(Degree(140))); depthMapCamera->setNearClipDistance(1); // depthMapCamera->setFarClipDistance(200); //OGRE_EXCEPT(0, "NOT implemented for Pointlight", "OgreDepthShadowMapRenderingRun::refreshLight"); /*Vector3 pos = light->getParentNode()->getWorldPosition(); Vector3 dir = -pos; depthMapCamera->setDirection( dir ); depthMapCamera->setPosition(pos); depthMapCamera->setProjectionType(PT_ORTHOGRAPHIC); depthMapCamera->*/ } } } Matrix4 OgreDepthShadowMapRenderingRun::getLightViewMatrix() { return depthMapCamera->getViewMatrix(); } Matrix4 OgreDepthShadowMapRenderingRun::getLightViewProjMatrix() { return depthMapCamera->getProjectionMatrix() * depthMapCamera->getViewMatrix(); }