source: GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/RenderTechniques/OgreHierarchicalParticleSystemTechnique.cpp @ 1330

Revision 1330, 9.0 KB checked in by szirmay, 18 years ago (diff)
Line 
1#include "OgreCubeMapRenderTechnique.h"
2#include "OgreTechniqueGroup.h"
3#include "OgreHierarchicalParticleSystemTechnique.h"
4#include "OgreChildPSystemRenderingRun.h"
5
6OgreHierarchicalParticleSystemTechnique::OgreHierarchicalParticleSystemTechnique(
7                                                                                                                unsigned long startFrame,
8                                                                                                                unsigned long impostorUpdateInterval,
9                                                                                                                unsigned int impostorResolution,
10                                                                                                                unsigned char impostorTexID,
11                                                                                                                bool useDistCalc,
12                                                                                                                bool perspectiveRendering,
13                                                                                                                String childPSysScriptName,
14                                                                                                                bool useOwnMaterial,
15                                                                                                                String impostorMaterialName,
16                                                                                                                bool useVParam,
17                                                                                                                String VParamRadius,
18                                                                                                                bool useFParam,
19                                                                                                                String FParamRadius,
20                                                                                                                Pass* pass,
21                                                                                                                OgreRenderable* parentRenderable,
22                                                                                                                OgreTechniqueGroup* parentTechniqueGroup)
23                                                        :OgreRenderTechnique( pass, parentRenderable, parentTechniqueGroup),
24                                                        HierarchicalParticleSystemTechnique(startFrame, impostorUpdateInterval, impostorResolution, useDistCalc, perspectiveRendering, parentRenderable, parentTechniqueGroup),
25                                                        RenderTechnique(parentRenderable, parentTechniqueGroup)
26{       
27        this->impostorTexID = impostorTexID;
28        this->childPSysScriptName = childPSysScriptName;
29        this->impostorMaterialName = impostorMaterialName;
30        this->useOwnMaterial = useOwnMaterial;
31        this->VParamRadius = VParamRadius;
32        this->FParamRadius = FParamRadius;
33        this->useVParam = useVParam;
34        this->useFParam = useFParam;
35       
36        //create the Particle system
37        childPSysName = parentOgreRenderable->getName() + "_small_PSYS";
38        ParticleSystem* psys = Root::getSingleton()._getCurrentSceneManager()->createParticleSystem(childPSysName, childPSysScriptName);
39        SceneNode* node = Root::getSingleton()._getCurrentSceneManager()->getRootSceneNode()->createChildSceneNode();
40        node->attachObject(psys);
41        psys->setVisible(false);
42       
43        if(sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR) == 0)
44                sharedRuns->addRun(ILLUMRUN_HPP_IMPOSTOR, createChildPSysRenderingRun());       
45
46        ((OgreChildPSystemRenderingRun*) sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR)->asOgreRenderingRun())->setNode(node);
47        impostorChanged(sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR));
48}
49
50
51OgreHierarchicalParticleSystemTechnique::~OgreHierarchicalParticleSystemTechnique()
52{
53
54}
55
56void OgreHierarchicalParticleSystemTechnique::impostorChanged(RenderingRun* run)
57{
58        OgreChildPSystemRenderingRun* r = (OgreChildPSystemRenderingRun*) run->asOgreRenderingRun();
59        pass->getTextureUnitState(impostorTexID)->setTextureName(r->getImpostorTextureName());
60}
61
62RenderingRun* OgreHierarchicalParticleSystemTechnique::createChildPSysRenderingRun()
63{
64        return new OgreChildPSystemRenderingRun( (OgreSharedRuns*) parentTechniqueGroup->getSharedRuns(),
65                                                                                                parentOgreRenderable->getName()  + "_HPP_IMPOSTOR",
66                                                                                                startFrame,
67                                                                                                impostorUpdateInterval,
68                                                                                                impostorResolution,
69                                                                                                perspectiveRendering,
70                                                                                                childPSysName,
71                                                                                                childPSysScriptName,
72                                                                                                useOwnMaterial,
73                                                                                                impostorMaterialName);
74}
75
76void OgreHierarchicalParticleSystemTechnique::update(unsigned long frameNum)
77{
78        HierarchicalParticleSystemTechnique::update(frameNum);
79
80        OgreChildPSystemRenderingRun* r = (OgreChildPSystemRenderingRun*)
81                                                                                        sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR)->asOgreRenderingRun();
82        float radius = r->getSmallSysRadius();
83        if(useVParam)
84                pass->getVertexProgramParameters()->setNamedConstant(VParamRadius, radius);
85        if(useFParam)
86                pass->getFragmentProgramParameters()->setNamedConstant(FParamRadius, radius);
87}
88
89///Technique Parsers
90namespace HPSParsers
91{
92        void parseStartFrame(String& params, RenderTechniqueFactory* factory)
93        {
94                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
95                f->startFrame =  StringConverter::parseUnsignedLong(params);
96        }
97        void parseImpostorUpdateInterval(String& params, RenderTechniqueFactory* factory)
98        {
99                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
100                f->impostorUpdateInterval =  StringConverter::parseUnsignedLong(params);
101        }
102
103        void parseImpostorResolution(String& params, RenderTechniqueFactory* factory)
104        {
105                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
106                f->impostorResolution =  StringConverter::parseUnsignedInt(params);
107        }
108
109        void parseImpostorTexID(String& params, RenderTechniqueFactory* factory)
110        {
111                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
112                f->impostorTexID =  StringConverter::parseUnsignedInt(params);
113        }
114
115        void parseUseDistCalc(String& params, RenderTechniqueFactory* factory)
116        {
117        /*      OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
118                // format: on/off tolerance(float)
119                StringVector vecparams = StringUtil::split(params, " \t");
120
121                if(StringConverter::parseBool(vecparams[0]))//on
122                {
123                        f->useDistCalc = true;
124
125                        if(vecparams.size()>1)
126                        {                       
127                                f->distTolerance = StringConverter::parseReal(vecparams[1]);
128                        }
129                }
130                else
131                {
132                        f->useDistCalc = false;
133                }*/
134                ///TODO
135        }
136
137        void parsePerspectiveRendering(String& params, RenderTechniqueFactory* factory)
138        {
139                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
140                f->perspectiveRendering = StringConverter::parseBool(params);
141        }
142        void parseMaterialName(String& params, RenderTechniqueFactory* factory)
143        {
144                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
145                f->impostorMaterialName = params;
146                f->useOwnMaterial = false;
147        }
148        void parseScriptName(String& params, RenderTechniqueFactory* factory)
149        {
150                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
151                f->childPSysScriptName = params;
152        }
153        void parseVparamRadius(String& params, RenderTechniqueFactory* factory)
154        {
155                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
156                f->VParamRadius = params;
157        }
158        void parseFparamRadius(String& params, RenderTechniqueFactory* factory)
159        {
160                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
161                f->FParamRadius = params;
162        }
163
164       
165}
166///Technique factory
167OgreHierarchicalParticleSystemTechniqueFactory::OgreHierarchicalParticleSystemTechniqueFactory()
168{
169        typeName = "HPS";
170
171        using namespace HPSParsers;
172
173        //register parsers
174        this->attributeParsers.insert(AttribParserList::value_type("start_frame", (ILLUM_ATTRIBUTE_PARSER) parseStartFrame));
175        this->attributeParsers.insert(AttribParserList::value_type("update_interval", (ILLUM_ATTRIBUTE_PARSER) parseImpostorUpdateInterval));
176        this->attributeParsers.insert(AttribParserList::value_type("resolution", (ILLUM_ATTRIBUTE_PARSER) parseImpostorResolution));
177        this->attributeParsers.insert(AttribParserList::value_type("texture_unit_id", (ILLUM_ATTRIBUTE_PARSER) parseImpostorTexID));
178        this->attributeParsers.insert(AttribParserList::value_type("distance_calc", (ILLUM_ATTRIBUTE_PARSER) parseUseDistCalc));
179        this->attributeParsers.insert(AttribParserList::value_type("perspective", (ILLUM_ATTRIBUTE_PARSER) parsePerspectiveRendering));
180        this->attributeParsers.insert(AttribParserList::value_type("particle_script", (ILLUM_ATTRIBUTE_PARSER) parseScriptName));
181        this->attributeParsers.insert(AttribParserList::value_type("material", (ILLUM_ATTRIBUTE_PARSER) parseMaterialName));
182        this->attributeParsers.insert(AttribParserList::value_type("vparam_radius", (ILLUM_ATTRIBUTE_PARSER) parseFparamRadius));
183        this->attributeParsers.insert(AttribParserList::value_type("fparam_radius", (ILLUM_ATTRIBUTE_PARSER) parseVparamRadius));
184       
185}
186
187OgreRenderTechnique* OgreHierarchicalParticleSystemTechniqueFactory::createInstance(
188                                                                                IllumTechniqueParams* params,
189                                                                                Pass* pass,
190                                                                                OgreRenderable* parentRenderable,
191                                                                                OgreTechniqueGroup* parentTechniqueGroup)
192{       
193        impostorUpdateInterval = 1;
194        impostorResolution = 256;
195        startFrame = 1;
196        useDistCalc = false;
197        impostorTexID = 0;
198        perspectiveRendering = true;
199        impostorMaterialName = "";
200        childPSysScriptName = "";
201        useOwnMaterial = true;
202        VParamRadius = "";
203        FParamRadius = "";
204        useVParam = false;
205        useFParam = false;
206
207        parseParams(params);
208
209        OgreHierarchicalParticleSystemTechnique* result = new OgreHierarchicalParticleSystemTechnique(
210                                                                                                startFrame,
211                                                                                                impostorUpdateInterval,
212                                                                                                impostorResolution,
213                                                                                                impostorTexID,
214                                                                                                useDistCalc,
215                                                                                                perspectiveRendering,
216                                                                                                childPSysScriptName,
217                                                                                                useOwnMaterial,
218                                                                                                impostorMaterialName,
219                                                                                                useVParam,
220                                                                                                VParamRadius,
221                                                                                                useFParam,
222                                                                                                FParamRadius,
223                                                                                                pass,
224                                                                                                parentRenderable,
225                                                                                                parentTechniqueGroup);
226       
227        return result;
228}
229
230
Note: See TracBrowser for help on using the repository browser.