source: GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/RenderTechniques/OgreFireRenderTechnique.cpp @ 2320

Revision 2320, 6.1 KB checked in by szirmay, 18 years ago (diff)
Line 
1#include "OgreFireRenderTechnique.h"
2#include "OgreTechniqueGroup.h"
3#include "OgreIlluminationManager.h"
4
5int FireRenderTarget::targetsize = 2;
6
7RenderTarget* colortexture;
8RenderTarget* heattexture;
9
10FireRenderTarget::FireRenderTarget()
11{
12        int width = OgreIlluminationManager::getSingleton().getMainViewport()->getActualWidth()
13                                / targetsize;
14        int height = OgreIlluminationManager::getSingleton().getMainViewport()->getActualHeight()
15                                / targetsize;
16       
17        renderTarget = Root::getSingleton().getRenderSystem()->
18                createMultiRenderTarget("ILLUM_FIRE_TEXTURE");
19        MultiRenderTarget* mrt = (MultiRenderTarget*) renderTarget;
20        {
21                TexturePtr texPtr = Ogre::TextureManager::getSingleton().createManual("ILLUM_FIRE_COLOR_TEXTURE",
22                                                                                                                                                        "default",
23                                                                                                                                                        TEX_TYPE_2D,
24                                                                                                                                                        width,
25                                                                                                                                                        height,
26                                                                                                                                                        0,
27                                                                                                                                                        0,
28                                                                                                                                                        PF_FLOAT16_RGBA,
29                                                                                                                                                        TU_RENDERTARGET);
30                Texture* texture = texPtr.getPointer();
31                //add viewport to rendertarget
32                HardwarePixelBuffer* hpb = (texture->getBuffer()).getPointer();
33                RenderTarget* rt = hpb->getRenderTarget();
34               
35                colortexture = rt;
36                RenderTexture* colorTex = (RenderTexture*) rt;
37                mrt->bindSurface(0, colorTex);
38        }
39
40        {
41                TexturePtr texPtr = Ogre::TextureManager::getSingleton().createManual("ILLUM_FIRE_HEAT_TEXTURE",
42                                                                                                                                                        "default",
43                                                                                                                                                        TEX_TYPE_2D,
44                                                                                                                                                        width,
45                                                                                                                                                        height,
46                                                                                                                                                        0,
47                                                                                                                                                        0,
48                                                                                                                                                        PF_FLOAT16_RGBA,
49                                                                                                                                                        TU_RENDERTARGET);
50                Texture* texture = texPtr.getPointer();
51                //add viewport to rendertarget
52                HardwarePixelBuffer* hpb = (texture->getBuffer()).getPointer();
53                RenderTarget* rt = hpb->getRenderTarget();
54               
55                heattexture = rt;
56                RenderTexture* heatTex = (RenderTexture*) rt;
57                mrt->bindSurface(1, heatTex);
58
59               
60        }
61        Viewport* v = mrt->addViewport(OgreIlluminationManager::getSingleton().getMainCamera());
62        v->setOverlaysEnabled(false);
63        mrt->setAutoUpdated(false);     
64
65        SceneManager* sm = Root::getSingleton()._getCurrentSceneManager();
66        sm->getRenderQueue()->clear();
67        sm->setFindVisibleObjects(false);
68        mrt->update();
69        sm->setFindVisibleObjects(true);
70}
71
72FireRenderTarget::~FireRenderTarget()
73{
74        TextureManager::getSingleton().remove("ILLUM_FIRE_COLOR_TEXTURE");
75        TextureManager::getSingleton().remove("ILLUM_FIRE_HEAT_TEXTURE");
76}
77
78OgreFireRenderTechnique::OgreFireRenderTechnique( unsigned char depthTexID,
79                                                                                                Pass* pass,
80                                                                                                OgreRenderable* parentRenderable,
81                                                                                                OgreTechniqueGroup* parentTechniqueGroup)
82                                                        :RenderTechnique( parentRenderable, parentTechniqueGroup),
83                                                        OgreRenderTechnique(pass, parentRenderable, parentTechniqueGroup)                                                       
84{
85        this->depthTexID = depthTexID;
86        OgreIlluminationManager::getSingleton().createGlobalRun(ILLUMRUN_SCENE_CAMERA_DEPTH);
87       
88       
89        OgreSceneCameraDepthRenderingRun* run = (OgreSceneCameraDepthRenderingRun*)
90                OgreIlluminationManager::getSingleton().getGlobalRun(ILLUMRUN_SCENE_CAMERA_DEPTH)->asOgreRenderingRun();
91       
92        pass->getTextureUnitState(depthTexID)->setTextureName(run->getDepthTextureName());
93       
94        if(OgreIlluminationManager::getSingleton().
95                getGlobalTarget(ILLUM_GLOBAL_TARGET_FIREPARTICLES) == 0)
96        {
97                FireRenderTarget* frt = new FireRenderTarget();
98                OgreIlluminationManager::getSingleton().
99                        addGlobalTarget(ILLUM_GLOBAL_TARGET_FIREPARTICLES, frt);
100        }
101       
102        FireRenderTarget* frt = (FireRenderTarget*) OgreIlluminationManager::getSingleton().
103                        getGlobalTarget(ILLUM_GLOBAL_TARGET_FIREPARTICLES);
104        frt->renderTarget->addListener(this);
105        OgreIlluminationManager::getSingleton().addUpdateListener(this);
106        Root::getSingleton().addFrameListener(this);
107}
108
109void  OgreFireRenderTechnique::preRenderTargetUpdate (const RenderTargetEvent &evt)
110{
111        parentOgreRenderable->setVisible(lastVisibility);
112}
113void  OgreFireRenderTechnique::postRenderTargetUpdate (const RenderTargetEvent &evt)
114{
115        parentOgreRenderable->setVisible(false);
116}
117
118bool  OgreFireRenderTechnique::frameEnded (const FrameEvent &evt)
119{
120        parentOgreRenderable->setVisible(lastVisibility);
121
122        return true;
123}
124void OgreFireRenderTechnique::preAllUpdates()
125{
126        lastVisibility = parentOgreRenderable->isVisible();
127        parentOgreRenderable->setVisible(false);
128}
129
130
131OgreFireRenderTechnique::~OgreFireRenderTechnique()
132{
133
134}
135
136void OgreFireRenderTechnique::update(unsigned long frameNum)
137{
138        OgreIlluminationManager::getSingleton().updateGlobalRun(ILLUMRUN_SCENE_CAMERA_DEPTH, frameNum);
139
140        ///render the fire to a target
141        FireRenderTarget* frt = (FireRenderTarget*) OgreIlluminationManager::getSingleton().
142                                        getGlobalTarget(ILLUM_GLOBAL_TARGET_FIREPARTICLES);
143       
144        SceneManager* sm = Root::getSingleton()._getCurrentSceneManager();
145        RenderQueue* rq = sm->getRenderQueue();
146        rq->clear();
147        rq->addRenderable(parentOgreRenderable->getRenderable());
148        sm->setFindVisibleObjects(false);
149       
150        frt->renderTarget->update();
151       
152        sm->setFindVisibleObjects(true);
153
154        //colortexture->writeContentsToFile("firecolor.tga");
155        //heattexture->writeContentsToFile("fireheat.tga");
156
157}
158
159namespace FireParsers
160{
161///Technique parsers
162        void parseDepthTexID(String& params, RenderTechniqueFactory* factory)
163        {
164                OgreFireRenderTechniqueFactory* f = (OgreFireRenderTechniqueFactory*) factory;
165                f->depthTexID =  StringConverter::parseUnsignedInt(params);
166        }
167}
168
169OgreFireRenderTechniqueFactory::OgreFireRenderTechniqueFactory()
170{
171        typeName = "Fire";
172       
173        using namespace FireParsers;
174       
175        //register parsers
176        this->attributeParsers.insert(AttribParserList::value_type("texture_unit_id", (ILLUM_ATTRIBUTE_PARSER) parseDepthTexID));
177}
178
179OgreRenderTechnique* OgreFireRenderTechniqueFactory::createInstance(
180                                                                                IllumTechniqueParams* params,
181                                                                                Pass* pass,
182                                                                                OgreRenderable* parentRenderable,
183                                                                                OgreTechniqueGroup* parentTechniqueGroup)
184{       
185        //reset parameters
186        depthTexID = 1;
187       
188        parseParams(params);
189
190        OgreFireRenderTechnique* result = new OgreFireRenderTechnique(
191                                                                                                depthTexID,
192                                                                                                pass,
193                                                                                                parentRenderable,
194                                                                                                parentTechniqueGroup);
195        return result;
196}
197
198
199
Note: See TracBrowser for help on using the repository browser.