source: GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/RenderingRuns/OgreCubeMapRenderingRun.cpp @ 1722

Revision 1722, 4.4 KB checked in by szirmay, 18 years ago (diff)
Line 
1#include "OgreCubeMapRenderingRun.h"
2#include "OgreIlluminationManager.h"
3
4
5
6OgreCubeMapRenderingRun::OgreCubeMapRenderingRun(OgreSharedRuns* sharedRuns,
7                                                                                                                   String name,
8                                                                                                                   unsigned long startFrame,
9                                                                                                                   unsigned long updateInterval,
10                                                                                                                   unsigned int resolution,
11                                                                                                                   bool useDistCalc,
12                                                                                                                   bool useFaceAngleCalc,
13                                                                                                                   float distTolerance,
14                                                                                                                   float angleTolerance,
15                                                                                                                   bool updateAllFace,
16                                                                                                                   bool renderSelf,
17                                                                                                                   bool renderEnvironment,
18                                                                                                                   String selfMaterial,
19                                                                                                                   String environmentMaterial)
20                                                                                                                   :CubeMapRenderingRun(startFrame, updateInterval, resolution, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace, renderSelf, renderEnvironment)
21                                                        , OgreRenderingRun(startFrame, updateInterval)
22                                                        , RenderingRun(startFrame, updateInterval)
23
24{
25        this->sharedRuns = sharedRuns;
26        this->name = name;
27        this->selfMaterial = selfMaterial;
28        this->environmentMaterial = environmentMaterial;
29       
30        if(environmentMaterial == "")
31                useEnvMaterial = false;
32        else
33                useEnvMaterial = true;
34
35        if(selfMaterial == "")
36                useSelfMaterial = false;
37        else
38                useSelfMaterial = true;
39
40
41        createCubeMap();
42}
43
44void OgreCubeMapRenderingRun::createCubeMap()
45{
46        cubemapTexture = createCubeRenderTexture(name,
47                                                                                                sharedRuns->getRootPosition(),
48                                                                                                resolution,
49                                                                                                PF_FLOAT16_RGBA,
50                                                                                                //PF_R8G8B8A8,
51                                                                                                0);     
52}
53
54void OgreCubeMapRenderingRun::updateCubeFace(int facenum)
55{
56        OgreSharedRuns* root = (OgreSharedRuns*) sharedRuns->getRoot(ILLUMRUN_COLOR_CUBEMAP);
57        SceneManager* sm = Ogre::Root::getSingleton()._getCurrentSceneManager();
58        RenderQueue* rq = sm->getRenderQueue();
59       
60        RenderTarget* rt = cubemapTexture->getBuffer(facenum, 0).getPointer()->getRenderTarget();
61        Camera*  cam =  rt->getViewport(0)->getCamera();
62        Vector3 center = sharedRuns->getRootPosition(ILLUMRUN_COLOR_CUBEMAP);
63        cam->setPosition(center);
64
65        bool renderAllwithOwnColor = false;
66
67        if(renderSelf && renderEnvironment && !useSelfMaterial && !useEnvMaterial)
68                renderAllwithOwnColor = true;
69
70        if(!renderAllwithOwnColor)
71        {
72                root->hide();
73
74                if(renderEnvironment)
75                {
76                        if(useEnvMaterial)
77                        {
78                                setMaterialForVisibles(environmentMaterial, cam);
79                                sm->_queueSkiesForRendering(cam);                               
80                        }
81                        else
82                        {
83                                sm->_findVisibleObjects(cam, false);
84                                sm->_queueSkiesForRendering(cam);
85                                sm->setFindVisibleObjects(false);
86                        }
87                }
88                else
89                {
90                        rq->clear();
91                        sm->setFindVisibleObjects(false);               
92                }
93               
94                if(renderSelf)
95                {
96                        sharedRuns->getRoot(ILLUMRUN_COLOR_CUBEMAP)->restoreVisibility();
97                        if(useSelfMaterial)
98                                root->setMaterial(selfMaterial);
99                        root->addRenderablesToQueue(rq);
100                }
101        }
102       
103
104       
105        rt->update();
106
107        //rt->writeContentsToFile("cubbe" + StringConverter::toString(facenum) + ".dds");
108       
109        if(!renderAllwithOwnColor)
110        {
111                if(renderEnvironment && useEnvMaterial)
112                        restoreMaterials();
113                else
114                        sm->setFindVisibleObjects(true);
115               
116                if(!renderSelf)
117                        root->restoreVisibility();
118                else if(useSelfMaterial)
119                        root->restoreMaterial();
120        }
121}
122
123bool OgreCubeMapRenderingRun::faceNeedsUpdate(int facenum)
124{       
125        if(useDistCalc || useFaceAngleCalc)
126        {
127                float chance1 = 1.0;
128                float chance2 = 1.0;
129               
130                Camera* mainCamera = OgreIlluminationManager::getSingleton().getMainCamera();
131
132                if(useDistCalc)
133                {
134                        Vector3 cubemapPosition = sharedRuns->getRootPosition(ILLUMRUN_COLOR_CUBEMAP);
135                        float objradius = sharedRuns->getRootBoundingSphere(ILLUMRUN_COLOR_CUBEMAP).getRadius();
136                        float fov = mainCamera->getFOVy().valueRadians() / 2.0;
137                        float dist = (cubemapPosition - mainCamera->getPosition()).length();
138                        float vangle = Math::ASin( objradius / dist).valueRadians();
139                        float angleratio = vangle / fov;
140                        chance1 = Math::Pow(angleratio, 1.0 / distTolerance);
141                }
142
143                if(useFaceAngleCalc)
144                {
145                        Vector3 faceDir = getCubeMapFaceDirection(facenum);                     
146                        Vector3 cameraDir = mainCamera->getDirection();
147                        float angle = faceDir.dotProduct(-1 * cameraDir);
148                        float facingforward = (angle + 1) / 2.0;
149                        chance2 = Math::Pow(facingforward, 1.0 / angleTolerance);
150                }
151       
152                float dice = Math::UnitRandom();
153                float chance = chance1 * chance2;
154
155                if(dice < chance)
156                {       
157                        return true;
158                }
159                else
160                {
161                        return false;
162                }
163        }
164
165        return true;
166}
Note: See TracBrowser for help on using the repository browser.