#include "OgreFireRenderTechnique.h" #include "OgreTechniqueGroup.h" #include "OgreIlluminationManager.h" int FireRenderTarget::targetsize = 2; RenderTarget* colortexture; RenderTarget* heattexture; FireRenderTarget::FireRenderTarget() { int width = OgreIlluminationManager::getSingleton().getMainViewport()->getActualWidth() / targetsize; int height = OgreIlluminationManager::getSingleton().getMainViewport()->getActualHeight() / targetsize; renderTarget = Root::getSingleton().getRenderSystem()-> createMultiRenderTarget("ILLUM_FIRE_TEXTURE"); MultiRenderTarget* mrt = (MultiRenderTarget*) renderTarget; { TexturePtr texPtr = Ogre::TextureManager::getSingleton().createManual("ILLUM_FIRE_COLOR_TEXTURE", "default", TEX_TYPE_2D, width, height, 0, 0, PF_FLOAT16_RGBA, TU_RENDERTARGET); Texture* texture = texPtr.getPointer(); //add viewport to rendertarget HardwarePixelBuffer* hpb = (texture->getBuffer()).getPointer(); RenderTarget* rt = hpb->getRenderTarget(); colortexture = rt; RenderTexture* colorTex = (RenderTexture*) rt; mrt->bindSurface(0, colorTex); } { TexturePtr texPtr = Ogre::TextureManager::getSingleton().createManual("ILLUM_FIRE_HEAT_TEXTURE", "default", TEX_TYPE_2D, width, height, 0, 0, PF_FLOAT16_RGBA, TU_RENDERTARGET); Texture* texture = texPtr.getPointer(); //add viewport to rendertarget HardwarePixelBuffer* hpb = (texture->getBuffer()).getPointer(); RenderTarget* rt = hpb->getRenderTarget(); heattexture = rt; RenderTexture* heatTex = (RenderTexture*) rt; mrt->bindSurface(1, heatTex); } Viewport* v = mrt->addViewport(OgreIlluminationManager::getSingleton().getMainCamera()); v->setOverlaysEnabled(false); mrt->setAutoUpdated(false); SceneManager* sm = Root::getSingleton()._getCurrentSceneManager(); sm->getRenderQueue()->clear(); sm->setFindVisibleObjects(false); mrt->update(); sm->setFindVisibleObjects(true); } OgreFireRenderTechnique::OgreFireRenderTechnique( unsigned char depthTexID, Pass* pass, OgreRenderable* parentRenderable, OgreTechniqueGroup* parentTechniqueGroup) :RenderTechnique( parentRenderable, parentTechniqueGroup), OgreRenderTechnique(pass, parentRenderable, parentTechniqueGroup) { this->depthTexID = depthTexID; OgreIlluminationManager::getSingleton().createGlobalRun(ILLUMRUN_SCENE_CAMERA_DEPTH); OgreSceneCameraDepthRenderingRun* run = (OgreSceneCameraDepthRenderingRun*) OgreIlluminationManager::getSingleton().getGlobalRun(ILLUMRUN_SCENE_CAMERA_DEPTH)->asOgreRenderingRun(); pass->getTextureUnitState(depthTexID)->setTextureName(run->getDepthTextureName()); if(OgreIlluminationManager::getSingleton(). getGlobalTarget(ILLUM_GLOBAL_TARGET_FIREPARTICLES) == 0) { FireRenderTarget* frt = new FireRenderTarget(); OgreIlluminationManager::getSingleton(). addGlobalTarget(ILLUM_GLOBAL_TARGET_FIREPARTICLES, frt); } FireRenderTarget* frt = (FireRenderTarget*) OgreIlluminationManager::getSingleton(). getGlobalTarget(ILLUM_GLOBAL_TARGET_FIREPARTICLES); frt->renderTarget->addListener(this); OgreIlluminationManager::getSingleton().addUpdateListener(this); Root::getSingleton().addFrameListener(this); } void OgreFireRenderTechnique::preRenderTargetUpdate (const RenderTargetEvent &evt) { parentOgreRenderable->setVisible(lastVisibility); } void OgreFireRenderTechnique::postRenderTargetUpdate (const RenderTargetEvent &evt) { parentOgreRenderable->setVisible(false); } bool OgreFireRenderTechnique::frameEnded (const FrameEvent &evt) { parentOgreRenderable->setVisible(lastVisibility); return true; } void OgreFireRenderTechnique::preAllUpdates() { lastVisibility = parentOgreRenderable->isVisible(); parentOgreRenderable->setVisible(false); } OgreFireRenderTechnique::~OgreFireRenderTechnique() { } void OgreFireRenderTechnique::update(unsigned long frameNum) { OgreIlluminationManager::getSingleton().updateGlobalRun(ILLUMRUN_SCENE_CAMERA_DEPTH, frameNum); ///render the fire to a target FireRenderTarget* frt = (FireRenderTarget*) OgreIlluminationManager::getSingleton(). getGlobalTarget(ILLUM_GLOBAL_TARGET_FIREPARTICLES); SceneManager* sm = Root::getSingleton()._getCurrentSceneManager(); RenderQueue* rq = sm->getRenderQueue(); rq->clear(); rq->addRenderable(parentOgreRenderable->getRenderable()); sm->setFindVisibleObjects(false); frt->renderTarget->update(); sm->setFindVisibleObjects(true); //colortexture->writeContentsToFile("firecolor.tga"); //heattexture->writeContentsToFile("fireheat.tga"); } namespace FireParsers { ///Technique parsers void parseDepthTexID(String& params, RenderTechniqueFactory* factory) { OgreFireRenderTechniqueFactory* f = (OgreFireRenderTechniqueFactory*) factory; f->depthTexID = StringConverter::parseUnsignedInt(params); } } OgreFireRenderTechniqueFactory::OgreFireRenderTechniqueFactory() { typeName = "Fire"; using namespace FireParsers; //register parsers this->attributeParsers.insert(AttribParserList::value_type("texture_unit_id", (ILLUM_ATTRIBUTE_PARSER) parseDepthTexID)); } OgreRenderTechnique* OgreFireRenderTechniqueFactory::createInstance( IllumTechniqueParams* params, Pass* pass, OgreRenderable* parentRenderable, OgreTechniqueGroup* parentTechniqueGroup) { //reset parameters depthTexID = 1; parseParams(params); OgreFireRenderTechnique* result = new OgreFireRenderTechnique( depthTexID, pass, parentRenderable, parentTechniqueGroup); return result; }