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

Revision 1628, 6.0 KB checked in by szirmay, 18 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                                                                                                Pass* pass,
11                                                                                                OgreRenderable* parentRenderable,
12                                                                                                OgreTechniqueGroup* parentTechniqueGroup)
13                                                        :RenderTechnique( parentRenderable, parentTechniqueGroup),
14                                                        OgreRenderTechnique(pass, parentRenderable, parentTechniqueGroup),
15                                                        DepthShadowRecieverRenderTechnique(parentRenderable, parentTechniqueGroup)
16{
17        this->maxlights = maxlights;
18        this->shadowVertexProgram = shadowVertexProgram ;
19        this->shadowFragmentProgram = shadowFragmentProgram;
20
21               
22        //insert new passes
23        Ogre::Technique* techn = pass->getParent();
24        Technique::PassIterator it = techn->getPassIterator();
25       
26        int index = 0;
27        while(it.hasMoreElements())
28        {
29                if( it.getNext() == pass)
30                        break;
31                index++;
32                it.moveNext();
33        }
34       
35        index++;
36        for(int i = 0; i < maxlights; i++)
37        {
38                int lastpass = techn->getNumPasses();
39                Pass* newpass = techn->createPass();
40                passes.push_back(newpass);
41
42                newpass->setVertexProgram(shadowVertexProgram);
43                newpass->setFragmentProgram(shadowFragmentProgram);
44               
45                GpuProgramParameters* Vparams = newpass->getVertexProgramParameters().getPointer();
46                Vparams->setNamedAutoConstant("worldViewProj",
47                                                                        GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);       
48                Vparams->setNamedAutoConstant("world",
49                                                                        GpuProgramParameters::ACT_WORLD_MATRIX);
50                GpuProgramParameters* Fparams = newpass->getFragmentProgramParameters().getPointer();
51               
52                TextureUnitState* st = newpass->createTextureUnitState();               
53                st->setTextureFiltering(TFO_ANISOTROPIC);
54                st->setTextureAddressingMode(TextureUnitState::TAM_BORDER);
55                st->setTextureBorderColour(ColourValue::White);
56
57                newpass->setSceneBlending(SBT_MODULATE);
58                //newpass->setSceneBlending(SBF_ONE, SBF_ZERO);
59                newpass->setDepthBias(1);
60                techn->movePass(lastpass, index);                       
61        }
62       
63}
64
65OgreDepthShadowRecieverRenderTechnique::~OgreDepthShadowRecieverRenderTechnique()
66{
67
68}
69
70void OgreDepthShadowRecieverRenderTechnique::update(unsigned long frameNum)
71{
72        LightList lights;
73        Root::getSingleton()._getCurrentSceneManager()->_populateLightList(
74                                                ((OgreSharedRuns*) sharedRuns)->getRootPosition(),
75                                                        100000.0,
76                                                        lights);
77
78        //fill passes
79        unsigned int l = 0;
80        for(unsigned int i = 0; i < passes.size(); i++)
81        {
82                while(lights.size() != l && !lights.at(l)->getCastShadows())
83                 l++;
84
85                if(lights.size() > l)
86                {
87                       
88                                //create run if not exists
89                                OgreIlluminationManager::getSingleton().createPerLightRun(lights.at(l)->getName(),
90                                                                                                                                                        ILLUMRUN_DEPTH_SHADOWMAP);
91                                //update light depth map
92                                OgreIlluminationManager::getSingleton().updatePerLightRun(lights.at(l)->getName(),
93                                                                                                                                                        ILLUMRUN_DEPTH_SHADOWMAP,
94                                                                                                                                                        frameNum);
95                               
96                                //set texture to pass
97                                OgreDepthShadowMapRenderingRun* depthRun =
98                                        (OgreDepthShadowMapRenderingRun*) OgreIlluminationManager::getSingleton()
99                                                                                                                .getPerLightRun(lights.at(l)->getName(),
100                                                                                                                ILLUMRUN_DEPTH_SHADOWMAP)->asOgreRenderingRun();
101                                               
102                                passes.at(i)->getTextureUnitState(0)->setTextureName(
103                                        depthRun->getDepthMapTextureName());
104                       
105                                //TODO: set matrices
106                                GpuProgramParametersSharedPtr fpParams = passes.at(i)->getFragmentProgramParameters();
107                                GpuProgramParametersSharedPtr vpParams = passes.at(i)->getVertexProgramParameters();
108                       
109                                //fpParams->setNamedConstant("lightViewProj", depthRun->getLightViewProjMatrix());
110                                vpParams->setNamedConstant("lightViewProj", depthRun->getLightViewProjMatrix());
111                               
112                                passes.at(i)->setActive(true);
113                       
114                }       
115                else
116                        passes.at(i)->setActive(false);
117
118        }
119}
120
121
122///Technique parsers
123namespace DepthShadowRecieverParsers
124{
125        void parseMaxLights(String& params, RenderTechniqueFactory* factory)
126        {
127                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
128                f->maxlights =  StringConverter::parseInt(params);
129        }
130
131        void parseVertexProgram(String& params, RenderTechniqueFactory* factory)
132        {
133                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
134                f->shadowVertexProgram =  params;
135        }
136
137        void parseFragmentProgram(String& params, RenderTechniqueFactory* factory)
138        {
139                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
140                f->shadowFragmentProgram =  params;
141        }
142}
143
144OgreDepthShadowRecieverRenderTechniqueFactory::OgreDepthShadowRecieverRenderTechniqueFactory()
145{
146        typeName = "DepthShadowReciever";
147
148        using namespace DepthShadowRecieverParsers;
149        //register parsers
150        this->attributeParsers.insert(AttribParserList::value_type("max_light_count", (ILLUM_ATTRIBUTE_PARSER) parseMaxLights));
151        this->attributeParsers.insert(AttribParserList::value_type("vertex_program_name", (ILLUM_ATTRIBUTE_PARSER) parseVertexProgram));
152        this->attributeParsers.insert(AttribParserList::value_type("fragment_program_name", (ILLUM_ATTRIBUTE_PARSER) parseFragmentProgram));
153}
154
155OgreRenderTechnique* OgreDepthShadowRecieverRenderTechniqueFactory::createInstance(
156                                                                                IllumTechniqueParams* params,
157                                                                                Pass* pass,
158                                                                                OgreRenderable* parentRenderable,
159                                                                                OgreTechniqueGroup* parentTechniqueGroup)
160{       
161        //reset parameters
162        maxlights = 1;
163        shadowVertexProgram = "GameTools/ShadowMap/ShadowVS";
164        shadowFragmentProgram = "GameTools/ShadowMap/ShadowPS";
165
166        parseParams(params);
167
168        OgreDepthShadowRecieverRenderTechnique* result = new OgreDepthShadowRecieverRenderTechnique(
169                                                                                                maxlights,
170                                                                                                shadowVertexProgram,
171                                                                                                shadowFragmentProgram,
172                                                                                                pass,
173                                                                                                parentRenderable,
174                                                                                                parentTechniqueGroup); 
175
176        return result;
177}
178
Note: See TracBrowser for help on using the repository browser.