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

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