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

Revision 2027, 11.1 KB checked in by szirmay, 17 years ago (diff)
Line 
1#include "OgreCausticCasterRenderTechnique.h"
2#include "OgreTechniqueGroup.h"
3#include "OgreCausticCubeMapRenderingRun.h"
4#include "OgrePhotonMapRenderingRun.h"
5#include "OgreCubeMapRenderingRun.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 OgreCubeMapRenderingRun((OgreSharedRuns*) sharedRuns,
122                                                                                parentOgreRenderable->getName()  + "_DISTANCECUBEMAP",
123                                                                                startFrame,
124                                                                                photonMapUpdateInterval,
125                                                                                causticCubeMapResolution,
126                                                                                0,
127                                                                                0,
128                                                                                0,
129                                                                                0,
130                                                                                updateAllFace,
131                                                                                false,
132                                                                                true,
133                                                                                "",
134                                                                                "GameTools/DistanceShader",
135                                                                                false,                                                                         
136                                                                                ILLUMRUN_DISTANCE_CUBEMAP);
137
138}
139
140const String& OgreCausticCasterRenderTechnique::getCausticCubeMapName()
141{
142        return ((OgreCausticCubeMapRenderingRun*) sharedRuns->getRun(ILLUMRUN_CAUSTIC_CUBEMAP)->asOgreRenderingRun())->
143                getCausticCubeMapTextureName();
144}
145
146
147///Technique Parsers
148namespace CausticCasterParsers
149{
150        void parseStartFrame(String& params, RenderTechniqueFactory* factory)
151        {
152                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
153                f->startFrame =  StringConverter::parseUnsignedLong(params);
154        }
155        void parsePhotonMapUpdateInterval(String& params, RenderTechniqueFactory* factory)
156        {
157                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
158                f->photonMapUpdateInterval =  StringConverter::parseUnsignedLong(params);
159        }
160
161        void parsePhotonMapResolution(String& params, RenderTechniqueFactory* factory)
162        {
163                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
164                f->photonMapResolution =  StringConverter::parseUnsignedInt(params);
165        }
166
167        void parseCausticCubeMapResolution(String& params, RenderTechniqueFactory* factory)
168        {
169                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
170                f->causticCubeMapResolution =  StringConverter::parseUnsignedInt(params);
171        }
172
173        void parseTexID(String& params, RenderTechniqueFactory* factory)
174        {
175                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
176                f->photonMapTexID =  StringConverter::parseUnsignedInt(params);
177        }
178
179        void parseUseDistance(String& params, RenderTechniqueFactory* factory)
180        {
181                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
182                f->useDistance = StringConverter::parseBool(params);
183        }
184
185        void parseUpdateAllFace(String& params, RenderTechniqueFactory* factory)
186        {
187                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
188                f->updateAllFace =  StringConverter::parseBool(params);
189        }
190
191        void parsePhotonMapMaterial(String& params, RenderTechniqueFactory* factory)
192        {
193                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
194                f->photonMapMaterialName =  params;
195        }
196
197        void parseCauMapMaterial(String& params, RenderTechniqueFactory* factory)
198        {
199                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
200                f->causticMapMaterialName =  params;
201        }
202
203        void parseAttenuation(String& params, RenderTechniqueFactory* factory)
204        {
205                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
206                f->attenuation =  StringConverter::parseReal(params);
207        }
208
209        void parseUseTriangles(String& params, RenderTechniqueFactory* factory)
210        {
211                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
212                f->useTriangles =  StringConverter::parseBool(params);
213        }
214
215        void parseBlurCauCubeMap(String& params, RenderTechniqueFactory* factory)
216        {
217                OgreCausticCasterRenderTechniqueFactory* f = (OgreCausticCasterRenderTechniqueFactory*) factory;
218                f->blurCauCubeMap =  StringConverter::parseBool(params);
219        }
220}
221
222
223///Technique factory
224OgreCausticCasterRenderTechniqueFactory::OgreCausticCasterRenderTechniqueFactory()
225{
226        typeName = "CausticCaster";
227       
228        using namespace CausticCasterParsers;
229
230        //register parsers
231        this->attributeParsers.insert(AttribParserList::value_type("start_frame", (ILLUM_ATTRIBUTE_PARSER) parseStartFrame));
232        this->attributeParsers.insert(AttribParserList::value_type("update_interval", (ILLUM_ATTRIBUTE_PARSER) parsePhotonMapUpdateInterval));
233        this->attributeParsers.insert(AttribParserList::value_type("photonmap_resolution", (ILLUM_ATTRIBUTE_PARSER) parsePhotonMapResolution));
234        this->attributeParsers.insert(AttribParserList::value_type("caustic_cubemap_resolution", (ILLUM_ATTRIBUTE_PARSER) parseCausticCubeMapResolution));
235        this->attributeParsers.insert(AttribParserList::value_type("photon_map_material", (ILLUM_ATTRIBUTE_PARSER) parsePhotonMapMaterial));
236        this->attributeParsers.insert(AttribParserList::value_type("caustic_map_material", (ILLUM_ATTRIBUTE_PARSER) parseCauMapMaterial));
237        this->attributeParsers.insert(AttribParserList::value_type("photon_map_tex_id", (ILLUM_ATTRIBUTE_PARSER) parseTexID));
238        this->attributeParsers.insert(AttribParserList::value_type("distance_impostor", (ILLUM_ATTRIBUTE_PARSER) parseUseDistance));
239        this->attributeParsers.insert(AttribParserList::value_type("update_all_face", (ILLUM_ATTRIBUTE_PARSER) parseUpdateAllFace));
240        this->attributeParsers.insert(AttribParserList::value_type("attenuation", (ILLUM_ATTRIBUTE_PARSER) parseAttenuation));
241        this->attributeParsers.insert(AttribParserList::value_type("use_triangles", (ILLUM_ATTRIBUTE_PARSER) parseUseTriangles));
242        this->attributeParsers.insert(AttribParserList::value_type("blur_caustic_cubemap", (ILLUM_ATTRIBUTE_PARSER) parseBlurCauCubeMap));
243       
244}
245
246OgreRenderTechnique* OgreCausticCasterRenderTechniqueFactory::createInstance(
247                                                                                IllumTechniqueParams* params,
248                                                                                Pass* pass,
249                                                                                OgreRenderable* parentRenderable,
250                                                                                OgreTechniqueGroup* parentTechniqueGroup)
251{       
252        //reset parameters
253        attenuation = 1.0;
254        startFrame = 1;
255        photonMapUpdateInterval = 1;
256        photonMapResolution = 64;
257        causticCubeMapResolution = 128;
258        photonMapMaterialName = "GameTools/PhotonMapCaustic";
259        causticMapMaterialName = "GameTools/Cau";
260        photonMapTexID = 0;
261        useDistance = true;
262        updateAllFace = false;
263        useTriangles = false;
264        blurCauCubeMap = false;
265
266        parseParams(params);
267
268        OgreCausticCasterRenderTechnique* result = new OgreCausticCasterRenderTechnique(
269                                                                                                startFrame,
270                                                                                                photonMapUpdateInterval,
271                                                                                                photonMapResolution,
272                                                                                                causticCubeMapResolution,
273                                                                                                photonMapMaterialName,
274                                                                                                causticMapMaterialName,
275                                                                                                photonMapTexID,
276                                                                                                updateAllFace,
277                                                                                                useDistance,
278                                                                                                attenuation,
279                                                                                                useTriangles,
280                                                                                                blurCauCubeMap,
281                                                                                                pass,
282                                                                                                parentRenderable,
283                                                                                                parentTechniqueGroup);
284       
285        return result;
286}
Note: See TracBrowser for help on using the repository browser.