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

Revision 790, 3.7 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(SBT_ADD);
60               
61                techn->movePass(lastpass, index);                       
62        }
63       
64}
65
66OgreCausticRecieverRenderTechnique::~OgreCausticRecieverRenderTechnique()
67{
68
69}
70
71void OgreCausticRecieverRenderTechnique::update(unsigned long frameNum)
72{
73        //find nearest casters
74        causticCasters.clear();
75        OgreIlluminationManager::getSingleton().getNearestCausticCasters(
76                                ((OgreSharedRuns*)sharedRuns)->getRootPosition(),
77                                &causticCasters,
78                                maxcasters);
79        //fill passes
80        for(unsigned int i = 0; i < passes.size(); i++)
81        {
82                if(causticCasters.size() > i)
83                {
84                       
85                        //update caustic caster
86                        causticCasters.at(i)->updateRun(ILLUMRUN_PHOTONMAP, frameNum); 
87                        causticCasters.at(i)->updateRun(ILLUMRUN_CAUSTIC_CUBEMAP, frameNum);
88
89                        //set texture to pass
90                        OgreCausticCubeMapRenderingRun* cauCubeRun =
91                                (OgreCausticCubeMapRenderingRun*) causticCasters.at(i)->
92                                        getRun(ILLUMRUN_CAUSTIC_CUBEMAP)->asOgreRenderingRun();
93                        passes.at(i)->getTextureUnitState(0)->setTextureName(
94                                cauCubeRun->getCausticCubeMapTextureName());
95
96                        OgreDistanceCubeMapRenderingRun* cauPhotonRun =
97                                (OgreDistanceCubeMapRenderingRun*) causticCasters.at(i)->
98                                        getRun(ILLUMRUN_DISTANCE_CUBEMAP)->asOgreRenderingRun();
99                        passes.at(i)->getTextureUnitState(1)->setTextureName(
100                                cauPhotonRun->getDistanceCubeMapTextureName());
101                       
102                        //set caster position
103                        GpuProgramParameters* Fparams = passes.at(i)->getFragmentProgramParameters().getPointer();
104                        Fparams->setNamedConstant("cubeMapCameraPosition",
105                                causticCasters.at(i)->getRootPosition(ILLUMRUN_CAUSTIC_CUBEMAP));
106                        passes.at(i)->setActive(true);
107                }       
108                else
109                        passes.at(i)->setActive(false);
110
111        }
112}
113
Note: See TracBrowser for help on using the repository browser.