source: GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/RenderTechniques/OgreDepthShadowRecieverRenderTechnique.cpp @ 2180

Revision 2180, 11.0 KB checked in by szirmay, 17 years ago (diff)
Line 
1#include "OgreDepthShadowRecieverRenderTechnique.h"
2#include "OgreTechniqueGroup.h"
3#include "OgreIlluminationManager.h"
4#include "OgreDepthShadowMapRenderingRun.h"
5
6OgreDepthShadowRecieverRenderTechnique::OgreDepthShadowRecieverRenderTechnique(
7                                                                                                int maxlights,
8                                                                                                String shadowVertexProgram,
9                                                                                                String shadowFragmentProgram,
10                                                                                                String WorldViewProjParamName,
11                                                                                                String WorldParamName,
12                                                                                                bool setLightViewMatrix,
13                                                                                                bool setLightViewProjMatrix,
14                                                                                                bool setLightProjFarPlane,
15                                                                                                String lightViewProjParamName,
16                                                                                                String lightViewParamName,
17                                                                                                String lightFarPlaneParamName,
18                                                                                                Pass* pass,
19                                                                                                OgreRenderable* parentRenderable,
20                                                                                                OgreTechniqueGroup* parentTechniqueGroup)
21                                                        :RenderTechnique( parentRenderable, parentTechniqueGroup),
22                                                        OgreRenderTechnique(pass, parentRenderable, parentTechniqueGroup),
23                                                        DepthShadowRecieverRenderTechnique(parentRenderable, parentTechniqueGroup)
24{
25        this->maxlights = maxlights;
26        this->shadowVertexProgram = shadowVertexProgram ;
27        this->shadowFragmentProgram = shadowFragmentProgram;
28        this->setLightViewMatrix = setLightViewMatrix;
29        this->setLightViewProjMatrix = setLightViewProjMatrix;
30        this->setLightProjFarPlane = setLightProjFarPlane;
31        this->lightViewProjParamName = lightViewProjParamName;
32        this->lightViewParamName = lightViewParamName;
33        this->lightFarPlaneParamName = lightFarPlaneParamName;
34        this->WorldParamName = WorldParamName;
35        this->WorldViewProjParamName = WorldViewProjParamName;
36               
37        //insert new passes
38        Ogre::Technique* techn = pass->getParent();
39        Technique::PassIterator it = techn->getPassIterator();
40       
41        int index = 0;
42        while(it.hasMoreElements())
43        {
44                if( it.getNext() == pass)
45                        break;
46                index++;
47                it.moveNext();
48        }
49       
50        index++;
51        for(int i = 0; i < maxlights; i++)
52        {
53                int lastpass = techn->getNumPasses();
54                Pass* newpass = techn->createPass();
55                passes.push_back(newpass);
56
57                newpass->setVertexProgram(shadowVertexProgram);
58                newpass->setFragmentProgram(shadowFragmentProgram);
59               
60                GpuProgramParameters* Vparams = newpass->getVertexProgramParameters().getPointer();
61                Vparams->setNamedAutoConstant(WorldViewProjParamName,
62                                                                        GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);       
63                Vparams->setNamedAutoConstant(WorldParamName,
64                                                                        GpuProgramParameters::ACT_WORLD_MATRIX);
65                GpuProgramParameters* Fparams = newpass->getFragmentProgramParameters().getPointer();
66               
67                TextureUnitState* st = newpass->createTextureUnitState();               
68                st->setTextureFiltering(TFO_ANISOTROPIC);
69                st->setTextureAddressingMode(TextureUnitState::TAM_BORDER);
70                st->setTextureBorderColour(ColourValue::White);
71
72                newpass->setSceneBlending(SBT_MODULATE);
73                //newpass->setSceneBlending(SBF_ONE, SBF_ZERO);
74
75                newpass->setDepthBias(1);
76                techn->movePass(lastpass, index);                       
77        }
78       
79}
80
81OgreDepthShadowRecieverRenderTechnique::~OgreDepthShadowRecieverRenderTechnique()
82{
83
84}
85
86void OgreDepthShadowRecieverRenderTechnique::update(unsigned long frameNum)
87{
88        LightList lights;
89        Root::getSingleton()._getCurrentSceneManager()->_populateLightList(
90                                                ((OgreSharedRuns*) sharedRuns)->getRootPosition(),
91                                                        100000.0,
92                                                        lights);
93
94        //fill passes
95        unsigned int l = 0;
96        for(unsigned int i = 0; i < passes.size(); i++)
97        {
98                while(lights.size() != l && !lights.at(l)->getCastShadows())
99                 l++;
100
101                if(lights.size() > l)
102                {
103                       
104                                //create run if not exists
105                                OgreIlluminationManager::getSingleton().createPerLightRun(lights.at(l)->getName(),
106                                                                                                                                                        ILLUMRUN_DEPTH_SHADOWMAP);
107                                //update light depth map
108                                OgreIlluminationManager::getSingleton().updatePerLightRun(lights.at(l)->getName(),
109                                                                                                                                                        ILLUMRUN_DEPTH_SHADOWMAP,
110                                                                                                                                                        frameNum);
111                               
112                                //set texture to pass
113                                OgreDepthShadowMapRenderingRun* depthRun =
114                                        (OgreDepthShadowMapRenderingRun*) OgreIlluminationManager::getSingleton()
115                                                                                                                .getPerLightRun(lights.at(l)->getName(),
116                                                                                                                ILLUMRUN_DEPTH_SHADOWMAP)->asOgreRenderingRun();
117                                               
118                                passes.at(i)->getTextureUnitState(0)->setTextureName(
119                                        depthRun->getDepthMapTextureName());
120                       
121                                //TODO: set matrices
122                                GpuProgramParametersSharedPtr fpParams = passes.at(i)->getFragmentProgramParameters();
123                                GpuProgramParametersSharedPtr vpParams = passes.at(i)->getVertexProgramParameters();
124                       
125                                //fpParams->setNamedConstant("lightViewProj", depthRun->getLightViewProjMatrix());
126                                if(setLightViewProjMatrix)
127                                        vpParams->setNamedConstant(lightViewProjParamName, depthRun->getLightViewProjMatrix());
128                                if(setLightViewMatrix)
129                                        vpParams->setNamedConstant(lightViewParamName, depthRun->getLightViewMatrix());
130                                if(setLightProjFarPlane)
131                                        fpParams->setNamedConstant(lightFarPlaneParamName, depthRun->getLightFarPlane());
132                               
133                               
134                                passes.at(i)->setActive(true);
135                       
136                }       
137                else
138                        passes.at(i)->setActive(false);
139
140        }
141}
142
143
144///Technique parsers
145namespace DepthShadowRecieverParsers
146{
147        void parseMaxLights(String& params, RenderTechniqueFactory* factory)
148        {
149                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
150                f->maxlights =  StringConverter::parseInt(params);
151        }
152
153        void parseVertexProgram(String& params, RenderTechniqueFactory* factory)
154        {
155                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
156                f->shadowVertexProgram =  params;
157        }
158
159        void parseFragmentProgram(String& params, RenderTechniqueFactory* factory)
160        {
161                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
162                f->shadowFragmentProgram =  params;
163        }
164
165        void parseSetLightViewProj(String& params, RenderTechniqueFactory* factory)
166        {
167                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
168                StringVector vecparams = StringUtil::split(params, " \t");
169                f->setLightViewProjMatrix = StringConverter::parseBool(vecparams[0]);
170                if(f->setLightViewProjMatrix && vecparams.size() > 1)
171                        f->lightViewProjParamName =  vecparams[1];
172        }
173
174        void parseSetLightView(String& params, RenderTechniqueFactory* factory)
175        {
176                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
177                StringVector vecparams = StringUtil::split(params, " \t");
178                f->setLightViewMatrix = StringConverter::parseBool(vecparams[0]);
179                if(f->setLightViewMatrix && vecparams.size() > 1)
180                        f->lightViewParamName =  vecparams[1];
181        }
182
183        void parseSetLightFarPlane(String& params, RenderTechniqueFactory* factory)
184        {
185                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
186                StringVector vecparams = StringUtil::split(params, " \t");
187                f->setLightProjFarPlane = StringConverter::parseBool(vecparams[0]);
188                if(f->setLightProjFarPlane && vecparams.size() > 1)
189                        f->lightFarPlaneParamName =  vecparams[1];
190        }
191
192        void parseLightProjParamName(String& params, RenderTechniqueFactory* factory)
193        {
194                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
195                f->lightViewProjParamName =  params;
196        }
197
198        void parseLightViewParamName(String& params, RenderTechniqueFactory* factory)
199        {
200                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
201                f->lightViewParamName =  params;
202        }
203
204        void parseWorldViewProjParamName(String& params, RenderTechniqueFactory* factory)
205        {
206                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
207                f->WorldViewProjParamName =  params;
208        }
209
210        void parseWorldParamName(String& params, RenderTechniqueFactory* factory)
211        {
212                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
213                f->WorldParamName =  params;
214        }
215
216        void parseLightFarPlaneParamName(String& params, RenderTechniqueFactory* factory)
217        {
218                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
219                f->lightFarPlaneParamName =  params;
220        }
221}
222
223OgreDepthShadowRecieverRenderTechniqueFactory::OgreDepthShadowRecieverRenderTechniqueFactory()
224{
225        typeName = "DepthShadowReciever";
226
227        using namespace DepthShadowRecieverParsers;
228        //register parsers
229        this->attributeParsers.insert(AttribParserList::value_type("max_light_count", (ILLUM_ATTRIBUTE_PARSER) parseMaxLights));
230        this->attributeParsers.insert(AttribParserList::value_type("vertex_program_name", (ILLUM_ATTRIBUTE_PARSER) parseVertexProgram));
231        this->attributeParsers.insert(AttribParserList::value_type("fragment_program_name", (ILLUM_ATTRIBUTE_PARSER) parseFragmentProgram));
232        this->attributeParsers.insert(AttribParserList::value_type("set_light_viewproj", (ILLUM_ATTRIBUTE_PARSER) parseSetLightViewProj));
233        this->attributeParsers.insert(AttribParserList::value_type("set_light_view", (ILLUM_ATTRIBUTE_PARSER) parseSetLightView));
234        this->attributeParsers.insert(AttribParserList::value_type("set_light_farplane", (ILLUM_ATTRIBUTE_PARSER) parseSetLightFarPlane));
235        this->attributeParsers.insert(AttribParserList::value_type("light_viewproj_param_name", (ILLUM_ATTRIBUTE_PARSER) parseLightProjParamName));
236        this->attributeParsers.insert(AttribParserList::value_type("light_view_param_name", (ILLUM_ATTRIBUTE_PARSER) parseLightViewParamName));
237        this->attributeParsers.insert(AttribParserList::value_type("world_view_proj_param_name", (ILLUM_ATTRIBUTE_PARSER) parseWorldViewProjParamName));
238        this->attributeParsers.insert(AttribParserList::value_type("world_param_name", (ILLUM_ATTRIBUTE_PARSER) parseWorldParamName));
239        this->attributeParsers.insert(AttribParserList::value_type("light_farplane_param_name", (ILLUM_ATTRIBUTE_PARSER) parseLightFarPlaneParamName));
240}
241
242OgreRenderTechnique* OgreDepthShadowRecieverRenderTechniqueFactory::createInstance(
243                                                                                IllumTechniqueParams* params,
244                                                                                Pass* pass,
245                                                                                OgreRenderable* parentRenderable,
246                                                                                OgreTechniqueGroup* parentTechniqueGroup)
247{       
248        //reset parameters
249        maxlights = 1;
250        shadowVertexProgram = "GTP/Basic/LightCPos_VS";
251        shadowFragmentProgram = "GTP/Basic/SM/Dist_PS";
252        setLightViewMatrix = false;
253        setLightViewProjMatrix = true;
254        setLightProjFarPlane = false;
255        lightViewProjParamName = "LightViewProj";
256        lightViewParamName = "LightView";
257        lightFarPlaneParamName = "lightFarPlane";
258        WorldViewProjParamName = "WorldViewProj";
259        WorldParamName = "World";
260
261        parseParams(params);
262
263        OgreDepthShadowRecieverRenderTechnique* result = new OgreDepthShadowRecieverRenderTechnique(
264                                                                                                maxlights,
265                                                                                                shadowVertexProgram,
266                                                                                                shadowFragmentProgram,
267                                                                                                WorldViewProjParamName,
268                                                                                                WorldParamName,
269                                                                                                setLightViewMatrix ,
270                                                                                                setLightViewProjMatrix,
271                                                                                                setLightProjFarPlane,
272                                                                                                lightViewProjParamName,
273                                                                                                lightViewParamName,
274                                                                                                lightFarPlaneParamName,
275                                                                                                pass,
276                                                                                                parentRenderable,
277                                                                                                parentTechniqueGroup); 
278
279        return result;
280}
281
Note: See TracBrowser for help on using the repository browser.