#include "OgreCausticRecieverRenderTechnique.h" #include "OgreTechniqueGroup.h" #include "OgreIlluminationManager.h" #include "OgreCausticCubeMapRenderingRun.h" #include "OgreDistanceCubeMapRenderingRun.h" OgreCausticRecieverRenderTechnique::OgreCausticRecieverRenderTechnique( int maxcasters, String causticVertexProgram, String causticFragmentProgram, Pass* pass, OgreRenderable* parentRenderable, OgreTechniqueGroup* parentTechniqueGroup) :RenderTechnique( parentRenderable, parentTechniqueGroup), OgreRenderTechnique(pass, parentRenderable, parentTechniqueGroup), CausticRecieverRenderTechnique(parentRenderable, parentTechniqueGroup) { this->maxcasters = maxcasters; this->causticVertexProgram = causticVertexProgram; this->causticFragmentProgram = causticFragmentProgram; //insert new passes Ogre::Technique* techn = pass->getParent(); Technique::PassIterator it = techn->getPassIterator(); int index = 0; while(it.hasMoreElements()) { if( it.getNext() == pass) break; index++; it.moveNext(); } index++; for(int i = 0; i < maxcasters; i++) { int lastpass = techn->getNumPasses(); Pass* newpass = techn->createPass(); passes.push_back(newpass); newpass->setVertexProgram(causticVertexProgram); newpass->setFragmentProgram(causticFragmentProgram); GpuProgramParameters* Vparams = newpass->getVertexProgramParameters().getPointer(); Vparams->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); Vparams->setNamedAutoConstant("world", GpuProgramParameters::ACT_WORLD_MATRIX); GpuProgramParameters* Fparams = newpass->getFragmentProgramParameters().getPointer(); Fparams->setNamedConstant("cubeMapCameraPosition", Vector3(0,0,0)); TextureUnitState* st = newpass->createTextureUnitState(); TextureUnitState* st2 = newpass->createTextureUnitState(); st->setTextureFiltering(TFO_BILINEAR); st2->setTextureFiltering(TFO_BILINEAR); newpass->setSceneBlending(SBT_ADD); techn->movePass(lastpass, index); } } OgreCausticRecieverRenderTechnique::~OgreCausticRecieverRenderTechnique() { } void OgreCausticRecieverRenderTechnique::update(unsigned long frameNum) { //find nearest casters causticCasters.clear(); OgreIlluminationManager::getSingleton().getNearestCausticCasters( ((OgreSharedRuns*)sharedRuns)->getRootPosition(), &causticCasters, maxcasters); //fill passes for(unsigned int i = 0; i < passes.size(); i++) { if(causticCasters.size() > i) { //update caustic caster causticCasters.at(i)->updateRun(ILLUMRUN_PHOTONMAP, frameNum); causticCasters.at(i)->updateRun(ILLUMRUN_CAUSTIC_CUBEMAP, frameNum); //set texture to pass OgreCausticCubeMapRenderingRun* cauCubeRun = (OgreCausticCubeMapRenderingRun*) causticCasters.at(i)-> getRun(ILLUMRUN_CAUSTIC_CUBEMAP)->asOgreRenderingRun(); passes.at(i)->getTextureUnitState(0)->setTextureName( cauCubeRun->getCausticCubeMapTextureName()); OgreDistanceCubeMapRenderingRun* cauPhotonRun = (OgreDistanceCubeMapRenderingRun*) causticCasters.at(i)-> getRun(ILLUMRUN_DISTANCE_CUBEMAP)->asOgreRenderingRun(); passes.at(i)->getTextureUnitState(1)->setTextureName( cauPhotonRun->getDistanceCubeMapTextureName()); //set caster position GpuProgramParameters* Fparams = passes.at(i)->getFragmentProgramParameters().getPointer(); Fparams->setNamedConstant("cubeMapCameraPosition", causticCasters.at(i)->getRootPosition(ILLUMRUN_CAUSTIC_CUBEMAP)); passes.at(i)->setActive(true); } else passes.at(i)->setActive(false); } }