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)
RevLine 
[1055]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,
[1330]16                                                                                                                bool useVParam,
17                                                                                                                String VParamRadius,
18                                                                                                                bool useFParam,
19                                                                                                                String FParamRadius,
[1055]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;
[1062]30        this->useOwnMaterial = useOwnMaterial;
[1330]31        this->VParamRadius = VParamRadius;
32        this->FParamRadius = FParamRadius;
33        this->useVParam = useVParam;
34        this->useFParam = useFParam;
[1055]35       
36        //create the Particle system
[1062]37        childPSysName = parentOgreRenderable->getName() + "_small_PSYS";
38        ParticleSystem* psys = Root::getSingleton()._getCurrentSceneManager()->createParticleSystem(childPSysName, childPSysScriptName);
[1055]39        SceneNode* node = Root::getSingleton()._getCurrentSceneManager()->getRootSceneNode()->createChildSceneNode();
40        node->attachObject(psys);
41        psys->setVisible(false);
[1062]42       
43        if(sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR) == 0)
44                sharedRuns->addRun(ILLUMRUN_HPP_IMPOSTOR, createChildPSysRenderingRun());       
45
[1330]46        ((OgreChildPSystemRenderingRun*) sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR)->asOgreRenderingRun())->setNode(node);
[1062]47        impostorChanged(sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR));
[1055]48}
49
50
51OgreHierarchicalParticleSystemTechnique::~OgreHierarchicalParticleSystemTechnique()
52{
53
54}
55
[1062]56void OgreHierarchicalParticleSystemTechnique::impostorChanged(RenderingRun* run)
57{
58        OgreChildPSystemRenderingRun* r = (OgreChildPSystemRenderingRun*) run->asOgreRenderingRun();
59        pass->getTextureUnitState(impostorTexID)->setTextureName(r->getImpostorTextureName());
60}
61
[1055]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
[1330]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
[1055]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        }
[1330]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        }
[1055]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));
[1330]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));
[1055]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 = "";
[1330]201        useOwnMaterial = true;
202        VParamRadius = "";
203        FParamRadius = "";
204        useVParam = false;
205        useFParam = false;
[1055]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,
[1330]219                                                                                                useVParam,
220                                                                                                VParamRadius,
221                                                                                                useFParam,
222                                                                                                FParamRadius,
[1055]223                                                                                                pass,
224                                                                                                parentRenderable,
225                                                                                                parentTechniqueGroup);
226       
227        return result;
228}
229
[1062]230
Note: See TracBrowser for help on using the repository browser.