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

Revision 1055, 6.9 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                                                                                                                Pass* pass,
17                                                                                                                OgreRenderable* parentRenderable,
18                                                                                                                OgreTechniqueGroup* parentTechniqueGroup)
19                                                        :OgreRenderTechnique( pass, parentRenderable, parentTechniqueGroup),
20                                                        HierarchicalParticleSystemTechnique(startFrame, impostorUpdateInterval, impostorResolution, useDistCalc, perspectiveRendering, parentRenderable, parentTechniqueGroup),
21                                                        RenderTechnique(parentRenderable, parentTechniqueGroup)
22{       
23        this->impostorTexID = impostorTexID;
24        this->childPSysScriptName = childPSysScriptName;
25        this->impostorMaterialName = impostorMaterialName;
26                                                                                                               
27       
28        if(sharedRuns->getRun(ILLUMRUN_HPP_IMPOSTOR) == 0)
29                sharedRuns->addRun(ILLUMRUN_HPP_IMPOSTOR, createChildPSysRenderingRun());       
30
31        //create the Particle system
32        String name = parentOgreRenderable->getName() + "_small_PSYS";
33        ParticleSystem* psys = Root::getSingleton()._getCurrentSceneManager()->createParticleSystem(name, childPSysScriptName);
34        SceneNode* node = Root::getSingleton()._getCurrentSceneManager()->getRootSceneNode()->createChildSceneNode();
35        node->attachObject(psys);
36        psys->setVisible(false);
37}
38
39
40OgreHierarchicalParticleSystemTechnique::~OgreHierarchicalParticleSystemTechnique()
41{
42
43}
44
45RenderingRun* OgreHierarchicalParticleSystemTechnique::createChildPSysRenderingRun()
46{
47        return new OgreChildPSystemRenderingRun( (OgreSharedRuns*) parentTechniqueGroup->getSharedRuns(),
48                                                                                                parentOgreRenderable->getName()  + "_HPP_IMPOSTOR",
49                                                                                                startFrame,
50                                                                                                impostorUpdateInterval,
51                                                                                                impostorResolution,
52                                                                                                perspectiveRendering,
53                                                                                                childPSysName,
54                                                                                                childPSysScriptName,
55                                                                                                useOwnMaterial,
56                                                                                                impostorMaterialName);
57}
58
59///Technique Parsers
60namespace HPSParsers
61{
62        void parseStartFrame(String& params, RenderTechniqueFactory* factory)
63        {
64                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
65                f->startFrame =  StringConverter::parseUnsignedLong(params);
66        }
67        void parseImpostorUpdateInterval(String& params, RenderTechniqueFactory* factory)
68        {
69                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
70                f->impostorUpdateInterval =  StringConverter::parseUnsignedLong(params);
71        }
72
73        void parseImpostorResolution(String& params, RenderTechniqueFactory* factory)
74        {
75                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
76                f->impostorResolution =  StringConverter::parseUnsignedInt(params);
77        }
78
79        void parseImpostorTexID(String& params, RenderTechniqueFactory* factory)
80        {
81                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
82                f->impostorTexID =  StringConverter::parseUnsignedInt(params);
83        }
84
85        void parseUseDistCalc(String& params, RenderTechniqueFactory* factory)
86        {
87        /*      OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
88                // format: on/off tolerance(float)
89                StringVector vecparams = StringUtil::split(params, " \t");
90
91                if(StringConverter::parseBool(vecparams[0]))//on
92                {
93                        f->useDistCalc = true;
94
95                        if(vecparams.size()>1)
96                        {                       
97                                f->distTolerance = StringConverter::parseReal(vecparams[1]);
98                        }
99                }
100                else
101                {
102                        f->useDistCalc = false;
103                }*/
104                ///TODO
105        }
106
107        void parsePerspectiveRendering(String& params, RenderTechniqueFactory* factory)
108        {
109                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
110                f->perspectiveRendering = StringConverter::parseBool(params);
111        }
112        void parseMaterialName(String& params, RenderTechniqueFactory* factory)
113        {
114                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
115                f->impostorMaterialName = params;
116                f->useOwnMaterial = false;
117        }
118        void parseScriptName(String& params, RenderTechniqueFactory* factory)
119        {
120                OgreHierarchicalParticleSystemTechniqueFactory* f = (OgreHierarchicalParticleSystemTechniqueFactory*) factory;
121                f->childPSysScriptName = params;
122        }
123
124       
125}
126///Technique factory
127OgreHierarchicalParticleSystemTechniqueFactory::OgreHierarchicalParticleSystemTechniqueFactory()
128{
129        typeName = "HPS";
130
131        using namespace HPSParsers;
132
133        //register parsers
134        this->attributeParsers.insert(AttribParserList::value_type("start_frame", (ILLUM_ATTRIBUTE_PARSER) parseStartFrame));
135        this->attributeParsers.insert(AttribParserList::value_type("update_interval", (ILLUM_ATTRIBUTE_PARSER) parseImpostorUpdateInterval));
136        this->attributeParsers.insert(AttribParserList::value_type("resolution", (ILLUM_ATTRIBUTE_PARSER) parseImpostorResolution));
137        this->attributeParsers.insert(AttribParserList::value_type("texture_unit_id", (ILLUM_ATTRIBUTE_PARSER) parseImpostorTexID));
138        this->attributeParsers.insert(AttribParserList::value_type("distance_calc", (ILLUM_ATTRIBUTE_PARSER) parseUseDistCalc));
139        this->attributeParsers.insert(AttribParserList::value_type("perspective", (ILLUM_ATTRIBUTE_PARSER) parsePerspectiveRendering));
140        this->attributeParsers.insert(AttribParserList::value_type("particle_script", (ILLUM_ATTRIBUTE_PARSER) parseScriptName));
141        this->attributeParsers.insert(AttribParserList::value_type("material", (ILLUM_ATTRIBUTE_PARSER) parseMaterialName));
142       
143}
144
145OgreRenderTechnique* OgreHierarchicalParticleSystemTechniqueFactory::createInstance(
146                                                                                IllumTechniqueParams* params,
147                                                                                Pass* pass,
148                                                                                OgreRenderable* parentRenderable,
149                                                                                OgreTechniqueGroup* parentTechniqueGroup)
150{       
151        impostorUpdateInterval = 1;
152        impostorResolution = 256;
153        startFrame = 1;
154        useDistCalc = false;
155        impostorTexID = 0;
156        perspectiveRendering = true;
157        impostorMaterialName = "";
158        childPSysScriptName = "";
159        bool useOwnMaterial = true;
160
161        parseParams(params);
162
163        OgreHierarchicalParticleSystemTechnique* result = new OgreHierarchicalParticleSystemTechnique(
164                                                                                                startFrame,
165                                                                                                impostorUpdateInterval,
166                                                                                                impostorResolution,
167                                                                                                impostorTexID,
168                                                                                                useDistCalc,
169                                                                                                perspectiveRendering,
170                                                                                                childPSysScriptName,
171                                                                                                useOwnMaterial,
172                                                                                                impostorMaterialName,
173                                                                                                pass,
174                                                                                                parentRenderable,
175                                                                                                parentTechniqueGroup);
176       
177        return result;
178}
179
Note: See TracBrowser for help on using the repository browser.