#include "OgreDistanceCubeMapRenderTechnique.h" #include "OgreTechniqueGroup.h" #include "OgreCubeMapRenderingRun.h" OgreDistanceCubeMapRenderTechnique::OgreDistanceCubeMapRenderTechnique(unsigned long startFrame, unsigned long cubeMapUpdateInterval, unsigned int cubeMapResolution, unsigned char texID, bool useDistCalc, bool useFaceAngleCalc, float distTolerance, float angleTolerance, bool updateAllFace, bool renderSelf, bool renderEnvironment, String selfMaterial, String environmentMaterial, int layer, bool getMinMax, bool attachToTexUnit, String minVariableName, String maxVariableName, Pass* pass, OgreRenderable* parentRenderable, OgreTechniqueGroup* parentTechniqueGroup) : OgreCubeMapRenderTechnique(startFrame, cubeMapUpdateInterval, cubeMapResolution, texID, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace, renderSelf, renderEnvironment, selfMaterial, environmentMaterial, layer, getMinMax, attachToTexUnit, minVariableName, maxVariableName, pass, parentRenderable, parentTechniqueGroup), CubeMapRenderTechnique(startFrame, cubeMapUpdateInterval, cubeMapResolution, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace, renderSelf, renderEnvironment, layer, parentRenderable, parentTechniqueGroup), DistanceCubeMapRenderTechnique(startFrame, cubeMapUpdateInterval, cubeMapResolution, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace, renderSelf, renderEnvironment, layer, parentRenderable, parentTechniqueGroup), RenderTechnique(parentRenderable, parentTechniqueGroup) { switch(layer) { case 0: texturePostFix = "_DISTANCECUBEMAP"; break; case 1: texturePostFix = "_DISTANCECUBEMAP_L1"; break; case 2: texturePostFix = "_DISTANCECUBEMAP_L2"; break; case 3: texturePostFix = "_DISTANCECUBEMAP_L3"; break; case 4: texturePostFix = "_DISTANCECUBEMAP_L4"; break; case 5: texturePostFix = "_DISTANCECUBEMAP_L5"; break; case 6: texturePostFix = "_DISTANCECUBEMAP_L6"; break; } if(sharedRuns->getRun(cubemapLayer) == 0) sharedRuns->addRun(cubemapLayer, createCubeMapRun()); distanceCubeMapRunChanged(sharedRuns->getRun(cubemapLayer)); } OgreDistanceCubeMapRenderTechnique::~OgreDistanceCubeMapRenderTechnique() { } void OgreDistanceCubeMapRenderTechnique::update(unsigned long frameNum) { DistanceCubeMapRenderTechnique::update(frameNum); } void OgreDistanceCubeMapRenderTechnique::distanceCubeMapRunChanged(RenderingRun* run) { OgreCubeMapRenderTechnique::cubeMapRunChanged(run); /* OgreCubeMapRenderingRun* cuberun =(OgreCubeMapRenderingRun*) (run->asOgreRenderingRun()); String cubemapname = cuberun->getCubeMapTextureName(); pass->getTextureUnitState(texID)->setTextureName(cubemapname);*/ } void OgreDistanceCubeMapRenderTechnique::distanceCubeMapRunUpdated(RenderingRun* run) { GpuProgramParametersSharedPtr fpParams = pass->getFragmentProgramParameters(); Vector3 center = ((OgreSharedRuns*) sharedRuns)->getRootPosition(cubemapLayer); fpParams->setNamedConstant("lastCenter",center); } ///Technique factory OgreDistanceCubeMapRenderTechniqueFactory::OgreDistanceCubeMapRenderTechniqueFactory() { typeName = "DistanceCubeMap"; } OgreRenderTechnique* OgreDistanceCubeMapRenderTechniqueFactory::createInstance( IllumTechniqueParams* params, Pass* pass, OgreRenderable* parentRenderable, OgreTechniqueGroup* parentTechniqueGroup) { OgreCubeMapRenderTechniqueFactory::resetParams(); texID = 1; environmentMaterial = "GameTools/DistanceShader"; selfMaterial = "GameTools/DistanceShader"; OgreCubeMapRenderTechniqueFactory::parseParams(params); parseParams(params); OgreDistanceCubeMapRenderTechnique* result = new OgreDistanceCubeMapRenderTechnique( startFrame, cubeMapUpdateInterval, cubeMapResolution, texID, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace, renderSelf, renderEnvironment, selfMaterial, environmentMaterial, layer, getMinMax, attachToTexUnit, minVariableName, maxVariableName, pass, parentRenderable, parentTechniqueGroup); return result; }