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

Revision 1330, 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        psys->_notifyCurrentCamera(impostorCamera);
72       
73        psysNode->_updateBounds();
74        AxisAlignedBox bb = psysNode->_getWorldAABB(); 
75       
76        float r = (bb.getMaximum() - bb.getMinimum()).length() / 2.0;
77        sysRad = r;
78        center = bb.getCenter();
79        Vector3 dir = center - mainCam->getPosition();
80        float d = dir.normalise();
81       
82        if (d <= r * 1.2)//too close
83        {
84                d = r * 1.2;
85                impostorCamera->setPosition(center - dir * d);
86        }
87
88    impostorCamera->setDirection(dir);
89
90        //r = 200;
91       
92        if(perspectiveRendering)
93        {
94                impostorCamera->setProjectionType(PT_PERSPECTIVE);
95                impostorCamera->setAspectRatio(1.0);
96                Radian a = Math::ASin(r / d) * 2.0;
97                impostorCamera->setFOVy( a );
98                impostorCamera->setNearClipDistance(d - r);
99                impostorCamera->setFarClipDistance(d + r);             
100        }
101        else
102        {
103                impostorCamera->setPosition(center);
104                impostorCamera->setProjectionType(PT_ORTHOGRAPHIC);
105                Matrix4 m;
106                m = Matrix4::IDENTITY;
107                float scale = 1.0 / r;
108                m.setScale(Vector3(scale, scale, scale));
109                impostorCamera->setCustomProjectionMatrix(true, m);
110        }       
111
112        //
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(".dds");
129        //rt->writeContentsToFile(filename);
130        framecount++;   
131       
132        if(!useOwnMaterial)
133                restoreMaterials();
134}
135
Note: See TracBrowser for help on using the repository browser.