source: GTP/trunk/Lib/Illum/IllumModule/OgreIllumModule/src/RenderingRuns/OgreChildParticlesystemRenderingRun.cpp @ 1425

Revision 1425, 4.4 KB checked in by szirmay, 18 years ago (diff)
Line 
1#include "OgreChildPSystemRenderingRun.h"
2#include "OgreIlluminationManager.h"
3#include "OgreDistanceCubeMapRenderingRun.h"
4
5
6
7OgreChildPSystemRenderingRun::OgreChildPSystemRenderingRun(OgreSharedRuns* sharedRuns,
8                                                                                                                        String name,
9                                                                                                                        unsigned long startFrame,
10                                                                                                                        unsigned long updateInterval,
11                                                                                                                        unsigned int resolution,
12                                                                                                                        bool perspectiveRendering,
13                                                                                                                        String childParticleSystemName,
14                                                                                                                        String particleScriptName,
15                                                                                                                        bool useOwnMaterial,
16                                                                                                                        String materialName)
17                                                                                                                   :ChildPsystemRenderingRun(resolution, perspectiveRendering, startFrame, updateInterval)
18                                                                                                                   , OgreRenderingRun(startFrame, updateInterval)
19                                                                                                                   , RenderingRun(startFrame, updateInterval)
20{
21        this->sharedRuns = sharedRuns;
22        this->name = name;     
23        this->resolution = resolution;
24        this->materialName = materialName;
25        this->particleScriptName = particleScriptName;
26        this->perspectiveRendering = perspectiveRendering;
27        this->childParticleSystemName = childParticleSystemName;
28        this->useOwnMaterial = useOwnMaterial;
29        createImpostorTexture();       
30}
31
32void OgreChildPSystemRenderingRun::createImpostorTexture()
33{
34        TexturePtr texPtr = Ogre::TextureManager::getSingleton().createManual(name,
35                                                                                                                                                "default",
36                                                                                                                                                TEX_TYPE_2D,
37                                                                                                                                                resolution,
38                                                                                                                                                resolution,
39                                                                                                                                                0,
40                                                                                                                                                0,
41                                                                                                                                                PF_FLOAT16_RGBA,
42                                                                                                                                                TU_RENDERTARGET);
43         impostorTexture = texPtr.getPointer();
44         impostorCamera = Root::getSingleton()._getCurrentSceneManager()->createCamera(name + "_CAMERA");
45         //add viewport to rendertarget
46         HardwarePixelBuffer* hpb = (impostorTexture->getBuffer()).getPointer();
47         RenderTarget* rt = hpb->getRenderTarget();
48         Viewport* v = rt->addViewport(impostorCamera);
49         //Viewport* v = rt->addViewport(OgreIlluminationManager::getSingleton().getMainCamera());
50         v->setBackgroundColour(ColourValue(0,0,0,0));
51         v->setOverlaysEnabled(false);
52         rt->setAutoUpdated(false);
53}
54
55void OgreChildPSystemRenderingRun::updateFrame(unsigned long frameNum)
56{
57       
58        Material* mat = (Material*) MaterialManager::getSingleton().getByName(materialName).getPointer();
59
60    SceneManager* sm = Ogre::Root::getSingleton()._getCurrentSceneManager();
61        RenderQueue* rq = sm->getRenderQueue();
62        rq->clear();
63
64        sharedRuns->getRoot()->updateBounds();
65        Vector3 center = sharedRuns->getRootPosition(ILLUMRUN_HPP_IMPOSTOR);
66        Camera* mainCam = OgreIlluminationManager::getSingleton().getMainCamera();
67        impostorCamera->setPosition(mainCam->getPosition());
68       
69        psysNode->setPosition(center);
70        ParticleSystem* psys = Root::getSingleton()._getCurrentSceneManager()->getParticleSystem(childParticleSystemName);
71       
72        psysNode->_updateBounds();
73        AxisAlignedBox bb = psysNode->_getWorldAABB(); 
74       
75        float r = (bb.getMaximum() - bb.getMinimum()).length() / 2.0;
76        sysRad = r;
77        center = bb.getCenter();
78        Vector3 dir = center - mainCam->getPosition();
79        float d = dir.normalise();
80       
81        if (d <= r * 1.2)//too close
82        {
83                d = r * 1.2;
84                impostorCamera->setPosition(center - dir * d);
85        }
86
87    impostorCamera->setDirection(dir);
88
89        //r = 200;
90       
91        if(perspectiveRendering)
92        {
93                impostorCamera->setProjectionType(PT_PERSPECTIVE);
94                impostorCamera->setAspectRatio(1.0);
95                Radian a = Math::ASin(r / d) * 2.0;
96                impostorCamera->setFOVy( a );
97                impostorCamera->setNearClipDistance(d - r);
98                impostorCamera->setFarClipDistance(d + r);             
99        }
100        else
101        {
102                impostorCamera->setPosition(center);
103                impostorCamera->setProjectionType(PT_ORTHOGRAPHIC);
104                Matrix4 m;
105                m = Matrix4::IDENTITY;
106                float scale = 1.0 / r;
107                m.setScale(Vector3(scale, scale, scale));
108                impostorCamera->setCustomProjectionMatrix(true, m);
109        }       
110
111        //
112        psys->_notifyCurrentCamera(impostorCamera);
113        psys->_updateRenderQueue(rq);
114       
115        if(!useOwnMaterial)
116                setMaterialForRenderables(materialName,rq);
117       
118        RenderTarget* rt = impostorTexture->getBuffer().getPointer()->getRenderTarget();
119        sm->setFindVisibleObjects(false);
120        rt->update();   
121        sm->setFindVisibleObjects(true);
122       
123       
124        static int framecount = 0;
125        String filename = "impostor_";
126        filename.append(this->name);
127        //filename.append(StringConverter::toString(framecount));
128        filename.append(".bmp");
129        //rt->writeContentsToFile(filename);
130        framecount++;   
131       
132        if(!useOwnMaterial)
133                restoreMaterials();
134}
135
Note: See TracBrowser for help on using the repository browser.