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

Revision 836, 5.8 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->setSceneBlending(SBT_ADD);
61               
62                techn->movePass(lastpass, index);                       
63        }
64       
65}
66
67OgreCausticRecieverRenderTechnique::~OgreCausticRecieverRenderTechnique()
68{
69
70}
71
72void OgreCausticRecieverRenderTechnique::update(unsigned long frameNum)
73{
74        //find nearest casters
75        causticCasters.clear();
76        OgreIlluminationManager::getSingleton().getNearestCausticCasters(
77                                ((OgreSharedRuns*)sharedRuns)->getRootPosition(),
78                                &causticCasters,
79                                maxcasters);
80        //fill passes
81        for(unsigned int i = 0; i < passes.size(); i++)
82        {
83                if(causticCasters.size() > i)
84                {
85                       
86                        //update caustic caster
87                        causticCasters.at(i)->updateRun(ILLUMRUN_PHOTONMAP, frameNum); 
88                        causticCasters.at(i)->updateRun(ILLUMRUN_CAUSTIC_CUBEMAP, frameNum);
89
90                        //set texture to pass
91                        OgreCausticCubeMapRenderingRun* cauCubeRun =
92                                (OgreCausticCubeMapRenderingRun*) causticCasters.at(i)->
93                                        getRun(ILLUMRUN_CAUSTIC_CUBEMAP)->asOgreRenderingRun();
94                        passes.at(i)->getTextureUnitState(0)->setTextureName(
95                                cauCubeRun->getCausticCubeMapTextureName());
96
97                        OgreDistanceCubeMapRenderingRun* cauPhotonRun =
98                                (OgreDistanceCubeMapRenderingRun*) causticCasters.at(i)->
99                                        getRun(ILLUMRUN_DISTANCE_CUBEMAP)->asOgreRenderingRun();
100                        passes.at(i)->getTextureUnitState(1)->setTextureName(
101                                cauPhotonRun->getDistanceCubeMapTextureName());
102                       
103                        //set caster position
104                        GpuProgramParameters* Fparams = passes.at(i)->getFragmentProgramParameters().getPointer();
105                        Fparams->setNamedConstant("cubeMapCameraPosition",
106                                causticCasters.at(i)->getRootPosition(ILLUMRUN_CAUSTIC_CUBEMAP));
107                        passes.at(i)->setActive(true);
108                }       
109                else
110                        passes.at(i)->setActive(false);
111
112        }
113}
114
115
116namespace CausticRecieverParsers
117{
118        ///Technique parsers
119        void parseMaxCasters(String& params, RenderTechniqueFactory* factory)
120        {
121                OgreCausticRecieverRenderTechniqueFactory* f = (OgreCausticRecieverRenderTechniqueFactory*) factory;
122                f->maxcasters =  StringConverter::parseInt(params);
123        }
124
125        void parseVertexProgram(String& params, RenderTechniqueFactory* factory)
126        {
127                OgreCausticRecieverRenderTechniqueFactory* f = (OgreCausticRecieverRenderTechniqueFactory*) factory;
128                f->causticVertexProgram =  params;
129        }
130
131        void parseFragmentProgram(String& params, RenderTechniqueFactory* factory)
132        {
133                OgreCausticRecieverRenderTechniqueFactory* f = (OgreCausticRecieverRenderTechniqueFactory*) factory;
134                f->causticFragmentProgram =  params;
135        }
136}
137OgreCausticRecieverRenderTechniqueFactory::OgreCausticRecieverRenderTechniqueFactory()
138{
139        typeName = "CausticReciever";
140
141        using namespace CausticRecieverParsers;
142        //register parsers
143        this->attributeParsers.insert(AttribParserList::value_type("max_caster_count", (ILLUM_ATTRIBUTE_PARSER) parseMaxCasters));
144        this->attributeParsers.insert(AttribParserList::value_type("vertex_program_name", (ILLUM_ATTRIBUTE_PARSER) parseVertexProgram));
145        this->attributeParsers.insert(AttribParserList::value_type("fragment_program_name", (ILLUM_ATTRIBUTE_PARSER) parseFragmentProgram));
146}
147
148OgreRenderTechnique* OgreCausticRecieverRenderTechniqueFactory::createInstance(
149                                                                                IllumTechniqueParams* params,
150                                                                                Pass* pass,
151                                                                                OgreRenderable* parentRenderable,
152                                                                                OgreTechniqueGroup* parentTechniqueGroup)
153{       
154        //reset parameters
155        maxcasters = 1;
156        causticVertexProgram = "GameTools/Caustic/DefaultVS";
157        causticFragmentProgram = "GameTools/Caustic/DefaultPS";
158
159        parseParams(params);
160
161        OgreCausticRecieverRenderTechnique* result = new OgreCausticRecieverRenderTechnique(
162                                                                                                maxcasters,
163                                                                                                causticVertexProgram,
164                                                                                                causticFragmentProgram,
165                                                                                                pass,
166                                                                                                parentRenderable,
167                                                                                                parentTechniqueGroup);
168
169        return result;
170}
Note: See TracBrowser for help on using the repository browser.