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

Revision 836, 5.5 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_BILINEAR);         
54
55                newpass->setSceneBlending(SBT_MODULATE);
56               
57                techn->movePass(lastpass, index);                       
58        }
59       
60}
61
62OgreDepthShadowRecieverRenderTechnique::~OgreDepthShadowRecieverRenderTechnique()
63{
64
65}
66
67void OgreDepthShadowRecieverRenderTechnique::update(unsigned long frameNum)
68{
69        LightList lights;
70        Root::getSingleton()._getCurrentSceneManager()->_populateLightList(
71                                                ((OgreSharedRuns*) sharedRuns)->getRootPosition(),
72                                                        100000.0,
73                                                        lights);
74       
75        //fill passes
76        for(unsigned int i = 0; i < passes.size(); i++)
77        {
78                if(lights.size() > i)
79                {
80                        //create run if not exists
81                        OgreIlluminationManager::getSingleton().createPerLightRun(lights.at(i)->getName(),
82                                                                                                                                                ILLUMRUN_DEPTH_SHADOWMAP);
83                        //update light depth map
84                        OgreIlluminationManager::getSingleton().updatePerLightRun(lights.at(i)->getName(),
85                                                                                                                                                ILLUMRUN_DEPTH_SHADOWMAP,
86                                                                                                                                                frameNum);
87                       
88                        //set texture to pass
89                        OgreDepthShadowMapRenderingRun* depthRun =
90                                (OgreDepthShadowMapRenderingRun*) OgreIlluminationManager::getSingleton()
91                                                                                                        .getPerLightRun(lights.at(i)->getName(),
92                                                                                                        ILLUMRUN_DEPTH_SHADOWMAP)->asOgreRenderingRun();
93                                       
94                        passes.at(i)->getTextureUnitState(0)->setTextureName(
95                                depthRun->getDepthMapTextureName());
96
97                        //TODO: set matrices
98                        GpuProgramParametersSharedPtr fpParams = passes.at(i)->getFragmentProgramParameters();
99                        fpParams->setNamedConstant("lightView", depthRun->getLightViewMatrix());
100                        fpParams->setNamedConstant("lightViewProj", depthRun->getLightViewProjMatrix());
101                       
102                        passes.at(i)->setActive(true);
103                }       
104                else
105                        passes.at(i)->setActive(false);
106
107        }
108}
109
110
111///Technique parsers
112namespace DepthShadowRecieverParsers
113{
114        void parseMaxLights(String& params, RenderTechniqueFactory* factory)
115        {
116                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
117                f->maxlights =  StringConverter::parseInt(params);
118        }
119
120        void parseVertexProgram(String& params, RenderTechniqueFactory* factory)
121        {
122                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
123                f->shadowVertexProgram =  params;
124        }
125
126        void parseFragmentProgram(String& params, RenderTechniqueFactory* factory)
127        {
128                OgreDepthShadowRecieverRenderTechniqueFactory* f = (OgreDepthShadowRecieverRenderTechniqueFactory*) factory;
129                f->shadowFragmentProgram =  params;
130        }
131}
132
133OgreDepthShadowRecieverRenderTechniqueFactory::OgreDepthShadowRecieverRenderTechniqueFactory()
134{
135        typeName = "DepthShadowReciever";
136
137        using namespace DepthShadowRecieverParsers;
138        //register parsers
139        this->attributeParsers.insert(AttribParserList::value_type("max_light_count", (ILLUM_ATTRIBUTE_PARSER) parseMaxLights));
140        this->attributeParsers.insert(AttribParserList::value_type("vertex_program_name", (ILLUM_ATTRIBUTE_PARSER) parseVertexProgram));
141        this->attributeParsers.insert(AttribParserList::value_type("fragment_program_name", (ILLUM_ATTRIBUTE_PARSER) parseFragmentProgram));
142}
143
144OgreRenderTechnique* OgreDepthShadowRecieverRenderTechniqueFactory::createInstance(
145                                                                                IllumTechniqueParams* params,
146                                                                                Pass* pass,
147                                                                                OgreRenderable* parentRenderable,
148                                                                                OgreTechniqueGroup* parentTechniqueGroup)
149{       
150        //reset parameters
151        maxlights = 1;
152        shadowVertexProgram = "GameTools/ShadowMap/ShadowVS";
153        shadowFragmentProgram = "GameTools/ShadowMap/ShadowPS";
154
155        parseParams(params);
156
157        OgreDepthShadowRecieverRenderTechnique* result = new OgreDepthShadowRecieverRenderTechnique(
158                                                                                                maxlights,
159                                                                                                shadowVertexProgram,
160                                                                                                shadowFragmentProgram,
161                                                                                                pass,
162                                                                                                parentRenderable,
163                                                                                                parentTechniqueGroup); 
164
165        return result;
166}
167
Note: See TracBrowser for help on using the repository browser.