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

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