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

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