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

Revision 1055, 5.9 KB checked in by szirmay, 18 years ago (diff)
Line 
1#include "OgreCausticRecieverRenderTechnique.h"
2#include "OgreTechniqueGroup.h"
3#include "OgreIlluminationManager.h"
4#include "OgreCausticCubeMapRenderingRun.h"
5#include "OgreDistanceCubeMapRenderingRun.h"
6
7OgreCausticRecieverRenderTechnique::OgreCausticRecieverRenderTechnique(
8                                                                                                int maxcasters,
9                                                                                                String causticVertexProgram,
10                                                                                                String causticFragmentProgram,
11                                                                                                Pass* pass,
12                                                                                                OgreRenderable* parentRenderable,
13                                                                                                OgreTechniqueGroup* parentTechniqueGroup)
14                                                        :RenderTechnique( parentRenderable, parentTechniqueGroup),
15                                                        OgreRenderTechnique(pass, parentRenderable, parentTechniqueGroup),
16                                                        CausticRecieverRenderTechnique(parentRenderable, parentTechniqueGroup)
17{
18        this->maxcasters = maxcasters;
19        this->causticVertexProgram = causticVertexProgram;
20        this->causticFragmentProgram = causticFragmentProgram;
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 < maxcasters; i++)
37        {
38                int lastpass = techn->getNumPasses();
39                Pass* newpass = techn->createPass();
40                passes.push_back(newpass);
41
42                newpass->setVertexProgram(causticVertexProgram);
43                newpass->setFragmentProgram(causticFragmentProgram);
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                Fparams->setNamedConstant("cubeMapCameraPosition", Vector3(0,0,0));
52
53                TextureUnitState* st = newpass->createTextureUnitState();
54                TextureUnitState* st2 = newpass->createTextureUnitState();
55
56                st->setTextureFiltering(TFO_BILINEAR);
57                st2->setTextureFiltering(TFO_BILINEAR);
58
59                newpass->setSceneBlending(SBF_DEST_COLOUR, SBF_ONE);
60                newpass->setDepthBias(5);
61                //newpass->setSceneBlending(SBT_ADD);
62               
63                techn->movePass(lastpass, index);                       
64        }
65       
66}
67
68OgreCausticRecieverRenderTechnique::~OgreCausticRecieverRenderTechnique()
69{
70
71}
72
73void OgreCausticRecieverRenderTechnique::update(unsigned long frameNum)
74{
75        //find nearest casters
76        causticCasters.clear();
77        OgreIlluminationManager::getSingleton().getNearestCausticCasters(
78                                ((OgreSharedRuns*)sharedRuns)->getRootPosition(),
79                                &causticCasters,
80                                maxcasters);
81        //fill passes
82        for(unsigned int i = 0; i < passes.size(); i++)
83        {
84                if(causticCasters.size() > i)
85                {
86                       
87                        //update caustic caster
88                        causticCasters.at(i)->updateRun(ILLUMRUN_PHOTONMAP, frameNum); 
89                        causticCasters.at(i)->updateRun(ILLUMRUN_CAUSTIC_CUBEMAP, frameNum);
90
91                        //set texture to pass
92                        OgreCausticCubeMapRenderingRun* cauCubeRun =
93                                (OgreCausticCubeMapRenderingRun*) causticCasters.at(i)->
94                                        getRun(ILLUMRUN_CAUSTIC_CUBEMAP)->asOgreRenderingRun();
95                        passes.at(i)->getTextureUnitState(0)->setTextureName(
96                                cauCubeRun->getCausticCubeMapTextureName());
97
98                        OgreDistanceCubeMapRenderingRun* cauPhotonRun =
99                                (OgreDistanceCubeMapRenderingRun*) causticCasters.at(i)->
100                                        getRun(ILLUMRUN_DISTANCE_CUBEMAP)->asOgreRenderingRun();
101                        passes.at(i)->getTextureUnitState(1)->setTextureName(
102                                cauPhotonRun->getDistanceCubeMapTextureName());
103                       
104                        //set caster position
105                        GpuProgramParameters* Fparams = passes.at(i)->getFragmentProgramParameters().getPointer();
106                        Fparams->setNamedConstant("cubeMapCameraPosition",
107                                causticCasters.at(i)->getRootPosition(ILLUMRUN_CAUSTIC_CUBEMAP));
108                        Fparams->setNamedConstant("attenuation", cauCubeRun->getAttenuation());
109                        passes.at(i)->setActive(true);
110                }       
111                else
112                        passes.at(i)->setActive(false);
113
114        }
115}
116
117
118namespace CausticRecieverParsers
119{
120        ///Technique parsers
121        void parseMaxCasters(String& params, RenderTechniqueFactory* factory)
122        {
123                OgreCausticRecieverRenderTechniqueFactory* f = (OgreCausticRecieverRenderTechniqueFactory*) factory;
124                f->maxcasters =  StringConverter::parseInt(params);
125        }
126
127        void parseVertexProgram(String& params, RenderTechniqueFactory* factory)
128        {
129                OgreCausticRecieverRenderTechniqueFactory* f = (OgreCausticRecieverRenderTechniqueFactory*) factory;
130                f->causticVertexProgram =  params;
131        }
132
133        void parseFragmentProgram(String& params, RenderTechniqueFactory* factory)
134        {
135                OgreCausticRecieverRenderTechniqueFactory* f = (OgreCausticRecieverRenderTechniqueFactory*) factory;
136                f->causticFragmentProgram =  params;
137        }
138       
139}
140OgreCausticRecieverRenderTechniqueFactory::OgreCausticRecieverRenderTechniqueFactory()
141{
142        typeName = "CausticReciever";
143
144        using namespace CausticRecieverParsers;
145        //register parsers
146        this->attributeParsers.insert(AttribParserList::value_type("max_caster_count", (ILLUM_ATTRIBUTE_PARSER) parseMaxCasters));
147        this->attributeParsers.insert(AttribParserList::value_type("vertex_program_name", (ILLUM_ATTRIBUTE_PARSER) parseVertexProgram));
148        this->attributeParsers.insert(AttribParserList::value_type("fragment_program_name", (ILLUM_ATTRIBUTE_PARSER) parseFragmentProgram));
149       
150}
151
152OgreRenderTechnique* OgreCausticRecieverRenderTechniqueFactory::createInstance(
153                                                                                IllumTechniqueParams* params,
154                                                                                Pass* pass,
155                                                                                OgreRenderable* parentRenderable,
156                                                                                OgreTechniqueGroup* parentTechniqueGroup)
157{       
158        //reset parameters
159        maxcasters = 1;
160        causticVertexProgram = "GameTools/Caustic/DefaultVS";
161        causticFragmentProgram = "GameTools/Caustic/DefaultPS";
162
163        parseParams(params);
164
165        OgreCausticRecieverRenderTechnique* result = new OgreCausticRecieverRenderTechnique(
166                                                                                                maxcasters,
167                                                                                                causticVertexProgram,
168                                                                                                causticFragmentProgram,
169                                                                                                pass,
170                                                                                                parentRenderable,
171                                                                                                parentTechniqueGroup);
172
173        return result;
174}
Note: See TracBrowser for help on using the repository browser.