#include "OgrePMWeightComputeRenderingRun.h" #include "OgreIlluminationManager.h" #include "OgrePMEntryPointMapRenderingRun.h" #include "OgreDepthShadowMapRenderingRun.h" Texture* OgrePMWeightComputeRenderingRun::weightTexture = 0; Texture* OgrePMWeightComputeRenderingRun::allWeightsTexture = 0; OgrePMWeightComputeRenderingRun::OgrePMWeightComputeRenderingRun(String name, String LightName) : OgreRenderingRun(1, 1) , RenderingRun(1, 1) { this->name = name; weights = 0; this->light = Root::getSingleton()._getCurrentSceneManager()->getLight(LightName); createWeightMap(); OgreIlluminationManager::getSingleton().createGlobalRun(ILLUMRUN_PM_ENTRYPOINTMAP); } void OgrePMWeightComputeRenderingRun::createWeightMap() { if(allWeightsTexture == 0) { unsigned int entryPointCnt = OgreIlluminationManager::getSingleton().getPathMapEntryPoints().size(); int width = entryPointCnt / 4096; int height = 4096; TexturePtr texPtr = Ogre::TextureManager::getSingleton().createManual(name + "_ALL", "default", TEX_TYPE_2D, width, height, 0, 0, PF_FLOAT16_RGBA, TU_RENDERTARGET); allWeightsTexture = texPtr.getPointer(); //add viewport to rendertarget HardwarePixelBuffer* hpb = (allWeightsTexture->getBuffer()).getPointer(); RenderTarget* rt = hpb->getRenderTarget(); Camera* wc = Root::getSingleton()._getCurrentSceneManager()->createCamera(name + "_ALL_CAMERA"); Viewport* v = rt->addViewport(wc); v->setBackgroundColour(ColourValue::Black); v->setClearEveryFrame(false); v->setOverlaysEnabled(false); rt->setAutoUpdated(false); unsigned int clustercount = OgreIlluminationManager::getSingleton().getPathMapClusterLengthsSize(); width = clustercount; height = 1; texPtr = Ogre::TextureManager::getSingleton().createManual(name, "default", TEX_TYPE_2D, width, height, 0, 0, PF_FLOAT16_RGBA, TU_RENDERTARGET); weightTexture = texPtr.getPointer(); //add viewport to rendertarget hpb = (weightTexture->getBuffer()).getPointer(); rt = hpb->getRenderTarget(); wc = Root::getSingleton()._getCurrentSceneManager()->createCamera(name + "_CAMERA"); v = rt->addViewport(wc); v->setOverlaysEnabled(false); rt->setAutoUpdated(false); } } void OgrePMWeightComputeRenderingRun::updateFrame(unsigned long frameNum) { OgreIlluminationManager::getSingleton().updateGlobalRun(ILLUMRUN_PM_ENTRYPOINTMAP, frameNum); OgrePMEntryPointMapRenderingRun* PMEPrun = (OgrePMEntryPointMapRenderingRun*) OgreIlluminationManager::getSingleton().getGlobalRun(ILLUMRUN_PM_ENTRYPOINTMAP)->asOgreRenderingRun(); unsigned int entryPointCnt = OgreIlluminationManager::getSingleton().getPathMapEntryPoints().size(); int col = entryPointCnt / 4096; if(light->getType() == Light::LT_SPOTLIGHT) { OgreIlluminationManager::getSingleton().createPerLightRun(light->getName(), ILLUMRUN_DEPTH_SHADOWMAP); OgreIlluminationManager::getSingleton().updatePerLightRun(light->getName(), ILLUMRUN_DEPTH_SHADOWMAP, frameNum); OgreDepthShadowMapRenderingRun* SMrun = (OgreDepthShadowMapRenderingRun*) OgreIlluminationManager::getSingleton() .getPerLightRun(light->getName(), ILLUMRUN_DEPTH_SHADOWMAP)->asOgreRenderingRun(); MaterialPtr mat = MaterialManager::getSingleton().getByName("GTP/PathMap_ComputeWeights"); GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer(); Vector3 lightPos = light->getDerivedPosition(); Vector3 lightDir = light->getDerivedDirection(); lightDir.normalise(); Radian lightAngle = light->getSpotlightOuterAngle(); Fparams->setNamedConstant("nRadionColumns", col); Fparams->setNamedConstant("lightPos", lightPos); Fparams->setNamedConstant("lightDir", lightDir); Fparams->setNamedConstant("lightPower", light->getPowerScale()); Fparams->setNamedConstant("lightColor", light->getDiffuseColour()); Fparams->setNamedConstant("lightViewProj", SMrun->getLightViewProjMatrix()); Fparams->setNamedConstant("lightFarPlane", SMrun->getLightFarPlane()); Fparams->setNamedConstant("lightAttenuation", Vector4(light->getAttenuationRange(), light->getAttenuationConstant(), light->getAttenuationLinear(), light->getAttenuationQuadric())); Fparams->setNamedConstant("lightAngleCos", Math::Cos(lightAngle.valueRadians()/2.0)); Fparams->setNamedConstant("spotLightFalloff", light->getSpotlightFalloff()); mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName( PMEPrun->getEntryPointTextureName()); mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( SMrun->getDepthMapTextureName()); RenderTarget* rt = allWeightsTexture->getBuffer().getPointer()->getRenderTarget(); if(frameNum != rt->getLastFrameNumber()) rt->getViewport(0)->setClearEveryFrame(true); else rt->getViewport(0)->setClearEveryFrame(false); renderFullscreenQuad(mat->getName(), rt); // rt->writeContentsToFile("allweights.bmp"); // rt->writeContentsToFile("allweights.dds"); } else if(light->getType() == Light::LT_POINT) { OgreIlluminationManager::getSingleton().createPerLightRun(light->getName(), ILLUMRUN_DEPTH_SHADOWMAP); OgreIlluminationManager::getSingleton().updatePerLightRun(light->getName(), ILLUMRUN_DEPTH_SHADOWMAP, frameNum); OgreDepthShadowMapRenderingRun* SMrun = (OgreDepthShadowMapRenderingRun*) OgreIlluminationManager::getSingleton() .getPerLightRun(light->getName(), ILLUMRUN_DEPTH_SHADOWMAP)->asOgreRenderingRun(); MaterialPtr mat = MaterialManager::getSingleton().getByName("GTP/PathMap_ComputeWeights_Point"); GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer(); Vector3 lightPos = light->getDerivedPosition(); Fparams->setNamedConstant("nRadionColumns", col); Fparams->setNamedConstant("lightPos", lightPos); Fparams->setNamedConstant("lightPower", light->getPowerScale()); Fparams->setNamedConstant("lightColor", light->getDiffuseColour()); Fparams->setNamedConstant("lightFarPlane", SMrun->getLightFarPlane()); Fparams->setNamedConstant("lightAttenuation", Vector4(light->getAttenuationRange(), light->getAttenuationConstant(), light->getAttenuationLinear(), light->getAttenuationQuadric())); mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName( PMEPrun->getEntryPointTextureName()); mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( SMrun->getDepthMapTextureName()); RenderTarget* rt = allWeightsTexture->getBuffer().getPointer()->getRenderTarget(); if(frameNum != rt->getLastFrameNumber()) rt->getViewport(0)->setClearEveryFrame(true); else rt->getViewport(0)->setClearEveryFrame(false); renderFullscreenQuad(mat->getName(), rt); //rt->writeContentsToFile("allweights.dds"); } } void OgrePMWeightComputeRenderingRun::sumWeights(unsigned long frameNum) { RenderTarget* rt = weightTexture->getBuffer().getPointer()->getRenderTarget(); if(frameNum == rt->getLastFrameNumber())return; unsigned int entryPointCnt = OgreIlluminationManager::getSingleton().getPathMapEntryPoints().size(); int col = entryPointCnt / 4096; unsigned int clustercount = OgreIlluminationManager::getSingleton().getPathMapClusterLengthsSize(); OgrePMEntryPointMapRenderingRun* PMEPrun = (OgrePMEntryPointMapRenderingRun*) OgreIlluminationManager::getSingleton().getGlobalRun(ILLUMRUN_PM_ENTRYPOINTMAP)->asOgreRenderingRun(); MaterialPtr mat = MaterialManager::getSingleton().getByName("GTP/PathMap_SumWeights"); GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer(); Fparams->setNamedConstant("nRadionColumns", col); Fparams->setNamedConstant("clusterCount", (float) clustercount); mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName( PMEPrun->getEntryPointTextureName()); mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( PMEPrun->getClusterLengthTextureName()); mat->getTechnique(0)->getPass(0)->getTextureUnitState(2)->setTextureName( allWeightsTexture->getName()); renderFullscreenQuad(mat->getName(), rt); //rt->writeContentsToFile("clusterweights.bmp"); } void OgrePMWeightComputeRenderingRun::freeAllResources() { this->weightTexture = 0; this->allWeightsTexture = 0; TextureManager::getSingleton().remove(name); Root::getSingleton()._getCurrentSceneManager()->destroyCamera(name + "_CAMERA"); TextureManager::getSingleton().remove(name + "_ALL"); Root::getSingleton()._getCurrentSceneManager()->destroyCamera(name + "_ALL" + "_CAMERA"); }