#include "OgreConvolvedCubeMapRenderTechnique.h" #include "OgreTechniqueGroup.h" #include "OgreReducedCubeMapRenderingRun.h" #include "OgreCubeMapRenderingRun.h" OgreConvolvedCubeMapRenderTechnique::OgreConvolvedCubeMapRenderTechnique(unsigned long startFrame, unsigned long cubeMapUpdateInterval, unsigned int cubeMapResolution, unsigned int reducedCubeMapResolution, unsigned char texID, bool useDistCalc, bool useFaceAngleCalc, float distTolerance, float angleTolerance, bool updateAllFace, bool renderSelf, bool renderEnvironment, String selfMaterial, String environmentMaterial, Pass* pass, OgreRenderable* parentRenderable, OgreTechniqueGroup* parentTechniqueGroup) : OgreCubeMapRenderTechnique(startFrame, cubeMapUpdateInterval, cubeMapResolution, texID, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace, renderSelf, renderEnvironment, selfMaterial, environmentMaterial, layer, pass, parentRenderable, parentTechniqueGroup), CubeMapRenderTechnique(startFrame, cubeMapUpdateInterval, cubeMapResolution, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace, renderSelf, renderEnvironment, layer, parentRenderable, parentTechniqueGroup), ConvolvedCubeMapRenderTechnique(startFrame, cubeMapUpdateInterval, cubeMapResolution, reducedCubeMapResolution, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace, renderSelf, renderEnvironment, parentRenderable, parentTechniqueGroup), RenderTechnique(parentRenderable, parentTechniqueGroup) { texturePostFix = "_COLORCUBEMAP"; if(sharedRuns->getRun(ILLUMRUN_COLOR_CUBEMAP) == 0) sharedRuns->addRun(ILLUMRUN_COLOR_CUBEMAP, createCubeMapRun()); if(sharedRuns->getRun(ILLUMRUN_REDUCED_CUBEMAP) == 0) sharedRuns->addRun(ILLUMRUN_REDUCED_CUBEMAP, createReducedCubeMapRun()); colorCubeMapRunChanged(sharedRuns->getRun(ILLUMRUN_COLOR_CUBEMAP)); reducedCubeMapRunChanged(sharedRuns->getRun(ILLUMRUN_REDUCED_CUBEMAP)); } OgreConvolvedCubeMapRenderTechnique::~OgreConvolvedCubeMapRenderTechnique() { } void OgreConvolvedCubeMapRenderTechnique::update(unsigned long frameNum) { ConvolvedCubeMapRenderTechnique::update(frameNum); } void OgreConvolvedCubeMapRenderTechnique::reducedCubeMapRunChanged(RenderingRun* run) { OgreReducedCubeMapRenderingRun* cuberun =(OgreReducedCubeMapRenderingRun*) (run->asOgreRenderingRun()); String cubemapname = cuberun->getReducedCubeMapTextureName(); pass->getTextureUnitState(texID)->setTextureName(cubemapname); } void OgreConvolvedCubeMapRenderTechnique::colorCubeMapRunChanged(RenderingRun* run) { OgreCubeMapRenderingRun* cuberun =(OgreCubeMapRenderingRun*) (run->asOgreRenderingRun()); String cubemapname = cuberun->getCubeMapTextureName(); OgreReducedCubeMapRenderingRun* rr = (OgreReducedCubeMapRenderingRun*) sharedRuns->getRun(ILLUMRUN_REDUCED_CUBEMAP)->asOgreRenderingRun(); rr->colorCubeMapChanged(cubemapname); } RenderingRun* OgreConvolvedCubeMapRenderTechnique::createReducedCubeMapRun() { return new OgreReducedCubeMapRenderingRun( (OgreSharedRuns*) parentTechniqueGroup->getSharedRuns(), parentOgreRenderable->getName() + "_COLORCUBEMAP_REDUCED", startFrame, cubeMapUpdateInterval, reducedCubeMapResolution, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace); } ///Technique Parsers namespace ConvolvedCubemapParsers { void parseReducedCubeMapResolution(String& params, RenderTechniqueFactory* factory) { OgreConvoledCubeMapRenderTechniqueFactory* f = (OgreConvoledCubeMapRenderTechniqueFactory*) factory; f->reducedCubeMapResolution = StringConverter::parseUnsignedInt(params); } } ///Technique factory OgreConvoledCubeMapRenderTechniqueFactory::OgreConvoledCubeMapRenderTechniqueFactory() { typeName = "ReducedColorCubeMap"; using namespace ConvolvedCubemapParsers; this->attributeParsers.insert(AttribParserList::value_type("reduced_resolution", (ILLUM_ATTRIBUTE_PARSER) parseReducedCubeMapResolution)); } OgreRenderTechnique* OgreConvoledCubeMapRenderTechniqueFactory::createInstance( IllumTechniqueParams* params, Pass* pass, OgreRenderable* parentRenderable, OgreTechniqueGroup* parentTechniqueGroup) { reducedCubeMapResolution = 8; OgreCubeMapRenderTechniqueFactory::resetParams(); OgreCubeMapRenderTechniqueFactory::parseParams(params); parseParams(params); OgreConvolvedCubeMapRenderTechnique* result = new OgreConvolvedCubeMapRenderTechnique( startFrame, cubeMapUpdateInterval, cubeMapResolution, reducedCubeMapResolution, texID, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace, renderSelf, renderEnvironment, selfMaterial, environmentMaterial, pass, parentRenderable, parentTechniqueGroup); return result; }