#include "OgreSBBRenderTechnique.h" #include "OgreTechniqueGroup.h" #include "OgreIlluminationManager.h" #include "OgreSceneCameraDepthRenderingRun.h" OgreSBBRenderTechnique::OgreSBBRenderTechnique( unsigned char depthTexID, bool bindTexture, Pass* pass, OgreRenderable* parentRenderable, OgreTechniqueGroup* parentTechniqueGroup) :RenderTechnique( parentRenderable, parentTechniqueGroup), OgreRenderTechnique(pass, parentRenderable, parentTechniqueGroup), SBBRenderTechnique(parentRenderable, parentTechniqueGroup) { this->depthTexID = depthTexID; this->bindTexture = bindTexture; OgreIlluminationManager::getSingleton().createGlobalRun(ILLUMRUN_SCENE_CAMERA_DEPTH); OgreSceneCameraDepthRenderingRun* run = (OgreSceneCameraDepthRenderingRun*) OgreIlluminationManager::getSingleton().getGlobalRun(ILLUMRUN_SCENE_CAMERA_DEPTH)->asOgreRenderingRun(); Root::getSingleton().addFrameListener(this); OgreIlluminationManager::getSingleton().getMainViewport() ->getTarget()->addListener(this); OgreIlluminationManager::getSingleton().addUpdateListener(this); if(bindTexture) pass->getTextureUnitState(depthTexID)->setTextureName(run->getDepthTextureName()); } void OgreSBBRenderTechnique::preAllUpdates() { lastVisibility = parentOgreRenderable->isVisible(); parentOgreRenderable->setVisible(false); } void OgreSBBRenderTechnique::preRenderTargetUpdate (const RenderTargetEvent &evt) { //parentOgreRenderable->setVisible(lastVisibility); } void OgreSBBRenderTechnique::postRenderTargetUpdate (const RenderTargetEvent &evt) { //parentOgreRenderable->setVisible(false); } bool OgreSBBRenderTechnique::frameEnded (const FrameEvent &evt) { return true; } void OgreSBBRenderTechnique::postAllUpdates() { parentOgreRenderable->setVisible(lastVisibility); } OgreSBBRenderTechnique::~OgreSBBRenderTechnique() { } void OgreSBBRenderTechnique::update(unsigned long frameNum) { OgreIlluminationManager::getSingleton().updateGlobalRun(ILLUMRUN_SCENE_CAMERA_DEPTH, frameNum); } namespace SBBParsers { ///Technique parsers void parseDepthTexID(String& params, RenderTechniqueFactory* factory) { OgreSBBRenderTechniqueFactory* f = (OgreSBBRenderTechniqueFactory*) factory; f->depthTexID = StringConverter::parseUnsignedInt(params); } void parseBindTexture(String& params, RenderTechniqueFactory* factory) { OgreSBBRenderTechniqueFactory* f = (OgreSBBRenderTechniqueFactory*) factory; f->bindTexture = StringConverter::parseBool(params); } } OgreSBBRenderTechniqueFactory::OgreSBBRenderTechniqueFactory() { typeName = "SphericalBillboard"; using namespace SBBParsers; //register parsers this->attributeParsers.insert(AttribParserList::value_type("texture_unit_id", (ILLUM_ATTRIBUTE_PARSER) parseDepthTexID)); this->attributeParsers.insert(AttribParserList::value_type("bind_texture", (ILLUM_ATTRIBUTE_PARSER) parseBindTexture)); } OgreRenderTechnique* OgreSBBRenderTechniqueFactory::createInstance( IllumTechniqueParams* params, Pass* pass, OgreRenderable* parentRenderable, OgreTechniqueGroup* parentTechniqueGroup) { //reset parameters depthTexID = 1; bindTexture = true; parseParams(params); OgreSBBRenderTechnique* result = new OgreSBBRenderTechnique( depthTexID, bindTexture, pass, parentRenderable, parentTechniqueGroup); return result; }