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

Revision 1688, 11.0 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                                                                                                                                float attenuation,
18                                                                                                                                bool useTriangles,
19                                                                                                                                bool blurCauCubeMap,
20                                                                                                                                Pass* pass,
21                                                                                                                                OgreRenderable* parentRenderable,
22                                                                                                                                OgreTechniqueGroup* parentTechniqueGroup)
23                                                        :OgreRenderTechnique( pass, parentRenderable, parentTechniqueGroup),
24                                                        CausticCasterRenderTechnique(startFrame, photonMapUpdateInterval, photonMapResolution, causticCubeMapResolution, updateAllFace, useDistance, parentRenderable, parentTechniqueGroup),
25                                                        RenderTechnique( parentRenderable, parentTechniqueGroup)
26{       
27        this->attenuation = attenuation;
28        this->useTriangles = useTriangles;
29        this->photonMapMaterialName = photonMapMaterialName;
30        this->blurCauCubeMap = blurCauCubeMap;
31       
32        String newMaterialName = causticMapMaterialName + parentRenderable->getName() + "_clone";
33        Material* mat = (Material*) MaterialManager::getSingleton().getByName(causticMapMaterialName).getPointer();
34        Material* newMat = mat->clone(newMaterialName).getPointer();
35        this->causticMapMaterialName = newMat->getName();
36        //this->causticMapMaterialName =causticMapMaterialName;
37               
38        this->photonMapTexID = photonMapTexID;
39       
40        if(sharedRuns->getRun(ILLUMRUN_CAUSTIC_CUBEMAP) == 0)
41                sharedRuns->addRun(ILLUMRUN_CAUSTIC_CUBEMAP, createCausticCubeMapRun());
42        if(sharedRuns->getRun(ILLUMRUN_PHOTONMAP) == 0)
43                sharedRuns->addRun(ILLUMRUN_PHOTONMAP, createPhotonMapRun());
44
45        if(useDistance)
46        {
47                if(sharedRuns->getRun(ILLUMRUN_DISTANCE_CUBEMAP) == 0)
48                        sharedRuns->addRun(ILLUMRUN_DISTANCE_CUBEMAP, createDistanceCubeMapRun());
49                distanceCubeMapRunChanged(sharedRuns->getRun(ILLUMRUN_DISTANCE_CUBEMAP));
50        }
51
52        photonMapRunChanged(sharedRuns->getRun(ILLUMRUN_PHOTONMAP));
53        causticCubeMapRunChanged(sharedRuns->getRun(ILLUMRUN_CAUSTIC_CUBEMAP));
54}
55
56OgreCausticCasterRenderTechnique::~OgreCausticCasterRenderTechnique()
57{
58
59}
60
61void OgreCausticCasterRenderTechnique::photonMapRunChanged(RenderingRun* run)
62{
63        OgreCausticCubeMapRenderingRun* caurun = (OgreCausticCubeMapRenderingRun*)
64                                sharedRuns->getRun(ILLUMRUN_CAUSTIC_CUBEMAP)->asOgreRenderingRun();
65        caurun->photonMapChanged(sharedRuns->getRun(ILLUMRUN_PHOTONMAP));
66}
67
68void OgreCausticCasterRenderTechnique::distanceCubeMapRunChanged(RenderingRun* run)
69{
70        if(useDistance)
71        {
72                OgrePhotonMapRenderingRun* photonrun = (OgrePhotonMapRenderingRun*)
73                                        sharedRuns->getRun(ILLUMRUN_PHOTONMAP)->asOgreRenderingRun();
74                photonrun->distanceCubeMapChanged(sharedRuns->getRun(ILLUMRUN_DISTANCE_CUBEMAP));
75        }
76}
77void OgreCausticCasterRenderTechnique::distanceCubeMapRunUpdated(RenderingRun* run)
78{
79        if(useDistance)
80        {
81                OgrePhotonMapRenderingRun* photonrun = (OgrePhotonMapRenderingRun*)
82                                        sharedRuns->getRun(ILLUMRUN_PHOTONMAP)->asOgreRenderingRun();
83                photonrun->distanceCubeMapUpdated(sharedRuns->getRun(ILLUMRUN_DISTANCE_CUBEMAP));
84        }
85}
86void OgreCausticCasterRenderTechnique::causticCubeMapRunChanged(RenderingRun* run)
87{
88}
89
90RenderingRun* OgreCausticCasterRenderTechnique::createPhotonMapRun()
91{
92        return new OgrePhotonMapRenderingRun((OgreSharedRuns*) sharedRuns,
93                                                                                        parentOgreRenderable->getName()  + "_PHOTONMAP",
94                                                                                        startFrame,
95                                                                                        photonMapUpdateInterval,
96                                                                                        photonMapResolution,
97                                                                                        photonMapMaterialName,
98                                                                                        useDistance);
99
100}
101
102RenderingRun* OgreCausticCasterRenderTechnique::createCausticCubeMapRun()
103{
104        return new OgreCausticCubeMapRenderingRun((OgreSharedRuns*) sharedRuns,
105                                                                                                parentOgreRenderable->getName()  + "_CAUSTICCUBEMAP",
106                                                                                                startFrame,
107                                                                                                photonMapUpdateInterval,
108                                                                                                causticCubeMapResolution,
109                                                                                                causticMapMaterialName,
110                                                                                                photonMapTexID,
111                                                                                                updateAllFace,
112                                                                                                attenuation,
113                                                                                                useTriangles,
114                                                                                                blurCauCubeMap
115                                                                                                );
116
117}
118
119RenderingRun* OgreCausticCasterRenderTechnique::createDistanceCubeMapRun()
120{
121        return new OgreDistanceCubeMapRenderingRun((OgreSharedRuns*) sharedRuns,
122                                                                                                parentOgreRenderable->getName()  + "_DISTANCECUBEMAP",
123                                                                                                startFrame,
124                                                                                                photonMapUpdateInterval,
125                                                                                                causticCubeMapResolution,
126                                                                                                0,
127                                                                                                0,
128                                                                                                0,
129                                                                                                0,
130                                                                                                updateAllFace
131                                                                                                );
132
133}
134
135const String& OgreCausticCasterRenderTechnique::getCausticCubeMapName()
136{
137        return ((OgreCausticCubeMapRenderingRun*) sharedRuns->getRun(ILLUMRUN_CAUSTIC_CUBEMAP)->asOgreRenderingRun())->
138                getCausticCubeMapTextureName();
139}
140
141
142///Technique Parsers
143namespace CausticCasterParsers
144{
145        void parseStartFrame(String& params, RenderTechniqueFactory* factory)
146        {
147                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
148                f->startFrame =  StringConverter::parseUnsignedLong(params);
149        }
150        void parsePhotonMapUpdateInterval(String& params, RenderTechniqueFactory* factory)
151        {
152                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
153                f->photonMapUpdateInterval =  StringConverter::parseUnsignedLong(params);
154        }
155
156        void parsePhotonMapResolution(String& params, RenderTechniqueFactory* factory)
157        {
158                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
159                f->photonMapResolution =  StringConverter::parseUnsignedInt(params);
160        }
161
162        void parseCausticCubeMapResolution(String& params, RenderTechniqueFactory* factory)
163        {
164                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
165                f->causticCubeMapResolution =  StringConverter::parseUnsignedInt(params);
166        }
167
168        void parseTexID(String& params, RenderTechniqueFactory* factory)
169        {
170                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
171                f->photonMapTexID =  StringConverter::parseUnsignedInt(params);
172        }
173
174        void parseUseDistance(String& params, RenderTechniqueFactory* factory)
175        {
176                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
177                f->useDistance = StringConverter::parseBool(params);
178        }
179
180        void parseUpdateAllFace(String& params, RenderTechniqueFactory* factory)
181        {
182                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
183                f->updateAllFace =  StringConverter::parseBool(params);
184        }
185
186        void parsePhotonMapMaterial(String& params, RenderTechniqueFactory* factory)
187        {
188                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
189                f->photonMapMaterialName =  params;
190        }
191
192        void parseCauMapMaterial(String& params, RenderTechniqueFactory* factory)
193        {
194                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
195                f->causticMapMaterialName =  params;
196        }
197
198        void parseAttenuation(String& params, RenderTechniqueFactory* factory)
199        {
200                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
201                f->attenuation =  StringConverter::parseReal(params);
202        }
203
204        void parseUseTriangles(String& params, RenderTechniqueFactory* factory)
205        {
206                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
207                f->useTriangles =  StringConverter::parseBool(params);
208        }
209
210        void parseBlurCauCubeMap(String& params, RenderTechniqueFactory* factory)
211        {
212                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
213                f->blurCauCubeMap =  StringConverter::parseBool(params);
214        }
215}
216
217
218///Technique factory
219OgreCausticCasterRenderTechniqueFactory::OgreCausticCasterRenderTechniqueFactory()
220{
221        typeName = "CausticCaster";
222       
223        using namespace CausticCasterParsers;
224
225        //register parsers
226        this->attributeParsers.insert(AttribParserList::value_type("start_frame", (ILLUM_ATTRIBUTE_PARSER) parseStartFrame));
227        this->attributeParsers.insert(AttribParserList::value_type("update_interval", (ILLUM_ATTRIBUTE_PARSER) parsePhotonMapUpdateInterval));
228        this->attributeParsers.insert(AttribParserList::value_type("photonmap_resolution", (ILLUM_ATTRIBUTE_PARSER) parsePhotonMapResolution));
229        this->attributeParsers.insert(AttribParserList::value_type("caustic_cubemap_resolution", (ILLUM_ATTRIBUTE_PARSER) parseCausticCubeMapResolution));
230        this->attributeParsers.insert(AttribParserList::value_type("photon_map_material", (ILLUM_ATTRIBUTE_PARSER) parsePhotonMapMaterial));
231        this->attributeParsers.insert(AttribParserList::value_type("caustic_map_material", (ILLUM_ATTRIBUTE_PARSER) parseCauMapMaterial));
232        this->attributeParsers.insert(AttribParserList::value_type("photon_map_tex_id", (ILLUM_ATTRIBUTE_PARSER) parseTexID));
233        this->attributeParsers.insert(AttribParserList::value_type("distance_impostor", (ILLUM_ATTRIBUTE_PARSER) parseUseDistance));
234        this->attributeParsers.insert(AttribParserList::value_type("update_all_face", (ILLUM_ATTRIBUTE_PARSER) parseUpdateAllFace));
235        this->attributeParsers.insert(AttribParserList::value_type("attenuation", (ILLUM_ATTRIBUTE_PARSER) parseAttenuation));
236        this->attributeParsers.insert(AttribParserList::value_type("use_triangles", (ILLUM_ATTRIBUTE_PARSER) parseUseTriangles));
237        this->attributeParsers.insert(AttribParserList::value_type("blur_caustic_cubemap", (ILLUM_ATTRIBUTE_PARSER) parseBlurCauCubeMap));
238       
239}
240
241OgreRenderTechnique* OgreCausticCasterRenderTechniqueFactory::createInstance(
242                                                                                IllumTechniqueParams* params,
243                                                                                Pass* pass,
244                                                                                OgreRenderable* parentRenderable,
245                                                                                OgreTechniqueGroup* parentTechniqueGroup)
246{       
247        //reset parameters
248        attenuation = 1.0;
249        startFrame = 1;
250        photonMapUpdateInterval = 1;
251        photonMapResolution = 64;
252        causticCubeMapResolution = 128;
253        photonMapMaterialName = "GameTools/PhotonMapCaustic";
254        causticMapMaterialName = "GameTools/Cau";
255        photonMapTexID = 0;
256        useDistance = true;
257        updateAllFace = false;
258        useTriangles = false;
259        blurCauCubeMap = false;
260
261        parseParams(params);
262
263        OgreCausticCasterRenderTechnique* result = new OgreCausticCasterRenderTechnique(
264                                                                                                startFrame,
265                                                                                                photonMapUpdateInterval,
266                                                                                                photonMapResolution,
267                                                                                                causticCubeMapResolution,
268                                                                                                photonMapMaterialName,
269                                                                                                causticMapMaterialName,
270                                                                                                photonMapTexID,
271                                                                                                updateAllFace,
272                                                                                                useDistance,
273                                                                                                attenuation,
274                                                                                                useTriangles,
275                                                                                                blurCauCubeMap,
276                                                                                                pass,
277                                                                                                parentRenderable,
278                                                                                                parentTechniqueGroup);
279       
280        return result;
281}
Note: See TracBrowser for help on using the repository browser.