source: GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/RenderTechniques/OgreCausticCasterRenderTechnique.cpp @ 836

Revision 836, 8.8 KB checked in by szirmay, 18 years ago (diff)
Line 
1#include "OgreCausticCasterRenderTechnique.h"
2#include "OgreTechniqueGroup.h"
3#include "OgreCausticCubeMapRenderingRun.h"
4#include "OgrePhotonMapRenderingRun.h"
5#include "OgreDistanceCubeMapRenderingRun.h"
6
7
8OgreCausticCasterRenderTechnique::OgreCausticCasterRenderTechnique(unsigned long startFrame,
9                                                                                                                                unsigned long photonMapUpdateInterval,
10                                                                                                                                unsigned int photonMapResolution,
11                                                                                                                                unsigned int causticCubeMapResolution,
12                                                                                                                                String photonMapMaterialName,
13                                                                                                                                String causticMapMaterialName,
14                                                                                                                                unsigned char photonMapTexID,
15                                                                                                                                bool updateAllFace,
16                                                                                                                                bool useDistance,
17                                                                                                                                Pass* pass,
18                                                                                                                                OgreRenderable* parentRenderable,
19                                                                                                                                OgreTechniqueGroup* parentTechniqueGroup)
20                                                        :OgreRenderTechnique( pass, parentRenderable, parentTechniqueGroup),
21                                                        CausticCasterRenderTechnique(startFrame, photonMapUpdateInterval, photonMapResolution, causticCubeMapResolution, updateAllFace, useDistance, parentRenderable, parentTechniqueGroup),
22                                                        RenderTechnique( parentRenderable, parentTechniqueGroup)
23{       
24        this->photonMapMaterialName = photonMapMaterialName;
25        this->causticMapMaterialName = causticMapMaterialName;
26        this->photonMapTexID = photonMapTexID;
27       
28        if(sharedRuns->getRun(ILLUMRUN_CAUSTIC_CUBEMAP) == 0)
29                sharedRuns->addRun(ILLUMRUN_CAUSTIC_CUBEMAP, createCausticCubeMapRun());
30        if(sharedRuns->getRun(ILLUMRUN_PHOTONMAP) == 0)
31                sharedRuns->addRun(ILLUMRUN_PHOTONMAP, createPhotonMapRun());
32
33        if(useDistance)
34        {
35                if(sharedRuns->getRun(ILLUMRUN_DISTANCE_CUBEMAP) == 0)
36                        sharedRuns->addRun(ILLUMRUN_DISTANCE_CUBEMAP, createDistanceCubeMapRun());
37                distanceCubeMapRunChanged(sharedRuns->getRun(ILLUMRUN_DISTANCE_CUBEMAP));
38        }
39
40        photonMapRunChanged(sharedRuns->getRun(ILLUMRUN_PHOTONMAP));
41        causticCubeMapRunChanged(sharedRuns->getRun(ILLUMRUN_CAUSTIC_CUBEMAP));
42}
43
44OgreCausticCasterRenderTechnique::~OgreCausticCasterRenderTechnique()
45{
46
47}
48
49void OgreCausticCasterRenderTechnique::photonMapRunChanged(RenderingRun* run)
50{
51        OgreCausticCubeMapRenderingRun* caurun = (OgreCausticCubeMapRenderingRun*)
52                                sharedRuns->getRun(ILLUMRUN_CAUSTIC_CUBEMAP)->asOgreRenderingRun();
53        caurun->photonMapChanged(sharedRuns->getRun(ILLUMRUN_PHOTONMAP));
54}
55
56void OgreCausticCasterRenderTechnique::distanceCubeMapRunChanged(RenderingRun* run)
57{
58        if(useDistance)
59        {
60                OgrePhotonMapRenderingRun* photonrun = (OgrePhotonMapRenderingRun*)
61                                        sharedRuns->getRun(ILLUMRUN_PHOTONMAP)->asOgreRenderingRun();
62                photonrun->distanceCubeMapChanged(sharedRuns->getRun(ILLUMRUN_DISTANCE_CUBEMAP));
63        }
64}
65
66void OgreCausticCasterRenderTechnique::causticCubeMapRunChanged(RenderingRun* run)
67{
68}
69
70RenderingRun* OgreCausticCasterRenderTechnique::createPhotonMapRun()
71{
72        return new OgrePhotonMapRenderingRun((OgreSharedRuns*) sharedRuns,
73                                                                                        parentOgreRenderable->getName()  + "_PHOTONMAP",
74                                                                                        startFrame,
75                                                                                        photonMapUpdateInterval,
76                                                                                        photonMapResolution,
77                                                                                        photonMapMaterialName,
78                                                                                        useDistance);
79
80}
81
82RenderingRun* OgreCausticCasterRenderTechnique::createCausticCubeMapRun()
83{
84        return new OgreCausticCubeMapRenderingRun((OgreSharedRuns*) sharedRuns,
85                                                                                                parentOgreRenderable->getName()  + "_CAUSTICCUBEMAP",
86                                                                                                startFrame,
87                                                                                                photonMapUpdateInterval,
88                                                                                                causticCubeMapResolution,
89                                                                                                causticMapMaterialName,
90                                                                                                photonMapTexID,
91                                                                                                updateAllFace
92                                                                                                );
93
94}
95
96RenderingRun* OgreCausticCasterRenderTechnique::createDistanceCubeMapRun()
97{
98        return new OgreDistanceCubeMapRenderingRun((OgreSharedRuns*) sharedRuns,
99                                                                                                parentOgreRenderable->getName()  + "_DISTANCECUBEMAP",
100                                                                                                startFrame,
101                                                                                                photonMapUpdateInterval,
102                                                                                                causticCubeMapResolution,
103                                                                                                0,
104                                                                                                0,
105                                                                                                0,
106                                                                                                0,
107                                                                                                updateAllFace
108                                                                                                );
109
110}
111
112String& OgreCausticCasterRenderTechnique::getCausticCubeMapName()
113{
114        return ((OgreCausticCubeMapRenderingRun*) sharedRuns->getRun(ILLUMRUN_CAUSTIC_CUBEMAP)->asOgreRenderingRun())->
115                getCausticCubeMapTextureName();
116}
117
118
119///Technique Parsers
120namespace CausticCasterParsers
121{
122        void parseStartFrame(String& params, RenderTechniqueFactory* factory)
123        {
124                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
125                f->startFrame =  StringConverter::parseUnsignedLong(params);
126        }
127        void parsePhotonMapUpdateInterval(String& params, RenderTechniqueFactory* factory)
128        {
129                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
130                f->photonMapUpdateInterval =  StringConverter::parseUnsignedLong(params);
131        }
132
133        void parsePhotonMapResolution(String& params, RenderTechniqueFactory* factory)
134        {
135                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
136                f->photonMapResolution =  StringConverter::parseUnsignedInt(params);
137        }
138
139        void parseCausticCubeMapResolution(String& params, RenderTechniqueFactory* factory)
140        {
141                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
142                f->causticCubeMapResolution =  StringConverter::parseUnsignedInt(params);
143        }
144
145        void parseTexID(String& params, RenderTechniqueFactory* factory)
146        {
147                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
148                f->photonMapTexID =  StringConverter::parseUnsignedInt(params);
149        }
150
151        void parseUseDistance(String& params, RenderTechniqueFactory* factory)
152        {
153                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
154                f->useDistance = StringConverter::parseBool(params);
155        }
156
157        void parseUpdateAllFace(String& params, RenderTechniqueFactory* factory)
158        {
159                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
160                f->updateAllFace =  StringConverter::parseBool(params);
161        }
162
163        void parsePhotonMapMaterial(String& params, RenderTechniqueFactory* factory)
164        {
165                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
166                f->photonMapMaterialName =  params;
167        }
168
169        void parseCauMapMaterial(String& params, RenderTechniqueFactory* factory)
170        {
171                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
172                f->causticMapMaterialName =  params;
173        }
174}
175
176
177///Technique factory
178OgreCausticCasterRenderTechniqueFactory::OgreCausticCasterRenderTechniqueFactory()
179{
180        typeName = "CausticCaster";
181       
182        using namespace CausticCasterParsers;
183
184        //register parsers
185        this->attributeParsers.insert(AttribParserList::value_type("start_frame", (ILLUM_ATTRIBUTE_PARSER) parseStartFrame));
186        this->attributeParsers.insert(AttribParserList::value_type("update_interval", (ILLUM_ATTRIBUTE_PARSER) parsePhotonMapUpdateInterval));
187        this->attributeParsers.insert(AttribParserList::value_type("photonmap_resolution", (ILLUM_ATTRIBUTE_PARSER) parsePhotonMapResolution));
188        this->attributeParsers.insert(AttribParserList::value_type("caustic_cubemap_resolution", (ILLUM_ATTRIBUTE_PARSER) parseCausticCubeMapResolution));
189        this->attributeParsers.insert(AttribParserList::value_type("photon_map_material", (ILLUM_ATTRIBUTE_PARSER) parsePhotonMapMaterial));
190        this->attributeParsers.insert(AttribParserList::value_type("caustic_map_material", (ILLUM_ATTRIBUTE_PARSER) parseCauMapMaterial));
191        this->attributeParsers.insert(AttribParserList::value_type("photon_map_tex_id", (ILLUM_ATTRIBUTE_PARSER) parseTexID));
192        this->attributeParsers.insert(AttribParserList::value_type("distance_impostor", (ILLUM_ATTRIBUTE_PARSER) parseUseDistance));
193        this->attributeParsers.insert(AttribParserList::value_type("update_all_face", (ILLUM_ATTRIBUTE_PARSER) parseUpdateAllFace));
194
195}
196
197OgreRenderTechnique* OgreCausticCasterRenderTechniqueFactory::createInstance(
198                                                                                IllumTechniqueParams* params,
199                                                                                Pass* pass,
200                                                                                OgreRenderable* parentRenderable,
201                                                                                OgreTechniqueGroup* parentTechniqueGroup)
202{       
203        //reset parameters
204        startFrame = 0;
205        photonMapUpdateInterval = 1;
206        photonMapResolution = 64;
207        causticCubeMapResolution = 128;
208        photonMapMaterialName = "GameTools/PhotonMapCaustic";
209        causticMapMaterialName = "GameTools/Cau";
210        photonMapTexID = 0;
211        useDistance = true;
212        updateAllFace = false;
213
214        parseParams(params);
215
216        OgreCausticCasterRenderTechnique* result = new OgreCausticCasterRenderTechnique(
217                                                                                                startFrame,
218                                                                                                photonMapUpdateInterval,
219                                                                                                photonMapResolution,
220                                                                                                causticCubeMapResolution,
221                                                                                                photonMapMaterialName,
222                                                                                                causticMapMaterialName,
223                                                                                                photonMapTexID,
224                                                                                                updateAllFace,
225                                                                                                useDistance,                                           
226                                                                                                pass,
227                                                                                                parentRenderable,
228                                                                                                parentTechniqueGroup);
229       
230        return result;
231}
Note: See TracBrowser for help on using the repository browser.