source: GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/RenderingRuns/OgreColorCubeMapRenderingRun.cpp @ 790

Revision 790, 2.9 KB checked in by szirmay, 18 years ago (diff)
Line 
1#include "OgreColorCubeMapRenderingRun.h"
2#include "OgreIlluminationManager.h"
3
4
5
6OgreColorCubeMapRenderingRun::OgreColorCubeMapRenderingRun(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                                                        :ColorCubeMapRenderingRun(startFrame, updateInterval, resolution, useDistCalc, useFaceAngleCalc, distTolerance, angleTolerance, updateAllFace)
17                                                        , OgreRenderingRun(startFrame, updateInterval)
18                                                        , RenderingRun(startFrame, updateInterval)
19
20{
21        this->sharedRuns = sharedRuns;
22        this->name = name;
23       
24        createColorCubeMap();
25}
26
27void OgreColorCubeMapRenderingRun::createColorCubeMap()
28{
29        colorCubemapTexture = createCubeRenderTexture(name,
30                                                                                                sharedRuns->getRootPosition(),
31                                                                                                resolution,
32                                                                                                PF_FLOAT16_RGBA,
33                                                                                                //PF_R8G8B8A8,
34                                                                                                0);     
35}
36
37void OgreColorCubeMapRenderingRun::updateCubeFace(int facenum)
38{
39        sharedRuns->getRoot(ILLUMRUN_COLOR_CUBEMAP)->hide();
40
41        RenderTarget* rt = colorCubemapTexture->getBuffer(facenum, 0).getPointer()
42                                                        ->getRenderTarget();
43
44        Vector3 center = sharedRuns->getRootPosition(ILLUMRUN_COLOR_CUBEMAP);
45        rt->getViewport(0)->getCamera()->setPosition(center);
46        rt->update();
47
48        //rt->writeContentsToFile("cubbe" + StringConverter::toString(facenum) + ".dds");
49       
50        sharedRuns->getRoot(ILLUMRUN_COLOR_CUBEMAP)->restoreVisibility();
51}
52
53bool OgreColorCubeMapRenderingRun::faceNeedsUpdate(int facenum)
54{       
55        if(useDistCalc || useFaceAngleCalc)
56        {
57                float chance1 = 1.0;
58                float chance2 = 1.0;
59               
60                Camera* mainCamera = OgreIlluminationManager::getSingleton().getMainCamera();
61
62                if(useDistCalc)
63                {
64                        Vector3 cubemapPosition = sharedRuns->getRootPosition(ILLUMRUN_COLOR_CUBEMAP);
65                        float objradius = sharedRuns->getRootBoundingSphere(ILLUMRUN_COLOR_CUBEMAP).getRadius();
66                        float fov = mainCamera->getFOVy().valueRadians() / 2.0;
67                        float dist = (cubemapPosition - mainCamera->getPosition()).length();
68                        float vangle = Math::ASin( objradius / dist).valueRadians();
69                        float angleratio = vangle / fov;
70                        chance1 = Math::Pow(angleratio, 1.0 / distTolerance);
71                }
72
73                if(useFaceAngleCalc)
74                {
75                        Vector3 faceDir = getCubeMapFaceDirection(facenum);                     
76                        Vector3 cameraDir = mainCamera->getDirection();
77                        float angle = faceDir.dotProduct(-1 * cameraDir);
78                        float facingforward = (angle + 1) / 2.0;
79                        chance2 = Math::Pow(facingforward, 1.0 / angleTolerance);
80                }
81       
82                float dice = Math::UnitRandom();
83                float chance = chance1 * chance2;
84
85                if(dice < chance)
86                {       
87                        return true;
88                }
89                else
90                {
91                        return false;
92                }
93        }
94
95        return true;
96}
Note: See TracBrowser for help on using the repository browser.