source: GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/RenderingRuns/OgrePMWeightComputeRenderingRun.cpp @ 2200

Revision 2200, 4.7 KB checked in by szirmay, 17 years ago (diff)
Line 
1#include "OgrePMWeightComputeRenderingRun.h"
2#include "OgreIlluminationManager.h"
3#include "OgrePMEntryPointMapRenderingRun.h"
4
5OgrePMWeightComputeRenderingRun::OgrePMWeightComputeRenderingRun(String name, String LightName)
6                                                                                                                   : OgreRenderingRun(1, 1)
7                                                                                                                   , RenderingRun(1, 1)
8{
9        this->name = name;
10        weights = 0;
11       
12        this->light = Root::getSingleton()._getCurrentSceneManager()->getLight(LightName);
13        createWeightMap();
14
15        OgreIlluminationManager::getSingleton().createGlobalRun(ILLUMRUN_PM_ENTRYPOINTMAP);
16}
17
18void OgrePMWeightComputeRenderingRun::createWeightMap()
19{
20       
21        unsigned int entryPointCnt = OgreIlluminationManager::getSingleton().getPathMapEntryPoints().size();
22        int width = entryPointCnt / 4096;
23        int height = 4096;
24        TexturePtr texPtr = Ogre::TextureManager::getSingleton().createManual(name + "_ALL",
25                                                                                                                                                "default",
26                                                                                                                                                TEX_TYPE_2D,
27                                                                                                                                                width,
28                                                                                                                                                height,
29                                                                                                                                                0,
30                                                                                                                                                0,
31                                                                                                                                                PF_FLOAT32_RGBA,
32                                                                                                                                                TU_RENDERTARGET);
33         allWeightsTexture = texPtr.getPointer();
34         //add viewport to rendertarget
35         HardwarePixelBuffer* hpb = (allWeightsTexture->getBuffer()).getPointer();
36         RenderTarget* rt = hpb->getRenderTarget();
37         Camera* wc = Root::getSingleton()._getCurrentSceneManager()->createCamera(name + "_ALL_CAMERA");
38         Viewport* v = rt->addViewport(wc);
39         v->setOverlaysEnabled(false);
40         rt->setAutoUpdated(false);
41
42        unsigned int clustercount = OgreIlluminationManager::getSingleton().getPathMapClusterLengthsSize();
43        width = clustercount;
44        height = 1;
45        texPtr = Ogre::TextureManager::getSingleton().createManual(name,
46                                                                                                                                "default",
47                                                                                                                                TEX_TYPE_2D,
48                                                                                                                                width,
49                                                                                                                                height,
50                                                                                                                                0,
51                                                                                                                                0,
52                                                                                                                                PF_FLOAT32_RGBA,
53                                                                                                                                TU_RENDERTARGET);
54         weightTexture = texPtr.getPointer();
55         //add viewport to rendertarget
56         hpb = (weightTexture->getBuffer()).getPointer();
57         rt = hpb->getRenderTarget();
58         wc = Root::getSingleton()._getCurrentSceneManager()->createCamera(name + "_CAMERA");
59         v = rt->addViewport(wc);
60         v->setOverlaysEnabled(false);
61         rt->setAutoUpdated(false);
62}
63
64
65
66void OgrePMWeightComputeRenderingRun::updateFrame(unsigned long frameNum)
67{
68        OgreIlluminationManager::getSingleton().updateGlobalRun(ILLUMRUN_PM_ENTRYPOINTMAP, frameNum);
69        OgrePMEntryPointMapRenderingRun* PMEPrun = (OgrePMEntryPointMapRenderingRun*)
70                OgreIlluminationManager::getSingleton().getGlobalRun(ILLUMRUN_PM_ENTRYPOINTMAP)->asOgreRenderingRun();
71        unsigned int entryPointCnt = OgreIlluminationManager::getSingleton().getPathMapEntryPoints().size();
72        int col = entryPointCnt / 4096;
73               
74        if(light->getType() == Light::LT_SPOTLIGHT)
75        {
76                MaterialPtr mat = MaterialManager::getSingleton().getByName("GTP/PathMap_ComputeWeights");
77
78                GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer();
79                       
80                        Vector3 lightPos = light->getPosition();
81                        Vector3 lightDir = light->getDirection();
82                //      Radian lightAngle = light->getSpotlightOuterAngle();
83                       
84                        //Fparams->setNamedConstant("lightTransform", lightMatrix);
85                        Fparams->setNamedConstant("nRadionColumns", col);
86                        Fparams->setNamedConstant("lightPos", lightPos);
87                        Fparams->setNamedConstant("lightDir", lightDir);
88                       
89                        mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(
90                                                PMEPrun->getEntryPointTextureName());
91                               
92                        RenderTarget* rt = allWeightsTexture->getBuffer().getPointer()->getRenderTarget();
93                        renderFullscreenQuad(mat->getName(), rt);
94
95                        rt->writeContentsToFile("allweights.bmp");                     
96                        rt->writeContentsToFile("allweights.dds");
97        }
98        else
99        {
100                ///not implemented
101        }
102
103        unsigned int clustercount = OgreIlluminationManager::getSingleton().getPathMapClusterLengthsSize();
104
105        MaterialPtr mat = MaterialManager::getSingleton().getByName("GTP/PathMap_SumWeights");
106        GpuProgramParameters* Fparams = mat->getTechnique(0)->getPass(0)->getFragmentProgramParameters().getPointer();
107        Fparams->setNamedConstant("nRadionColumns", col);
108        Fparams->setNamedConstant("clusterCount", (float) clustercount);
109        mat->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(
110                                                PMEPrun->getEntryPointTextureName());
111        mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName(
112                                                PMEPrun->getClusterLengthTextureName());
113        mat->getTechnique(0)->getPass(0)->getTextureUnitState(2)->setTextureName(
114                                                allWeightsTexture->getName());
115       
116        RenderTarget* rt = weightTexture->getBuffer().getPointer()->getRenderTarget();
117        renderFullscreenQuad(mat->getName(), rt);
118
119        rt->writeContentsToFile("weights.bmp");
120        rt->writeContentsToFile("weights.dds");
121}
122
123
Note: See TracBrowser for help on using the repository browser.