[1055] | 1 | #include "OgreChildPSystemRenderingRun.h"
|
---|
| 2 | #include "OgreIlluminationManager.h"
|
---|
| 3 | #include "OgreDistanceCubeMapRenderingRun.h"
|
---|
| 4 |
|
---|
| 5 |
|
---|
| 6 |
|
---|
| 7 | OgreChildPSystemRenderingRun::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 |
|
---|
| 32 | void 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);
|
---|
[1330] | 49 | //Viewport* v = rt->addViewport(OgreIlluminationManager::getSingleton().getMainCamera());
|
---|
| 50 | v->setBackgroundColour(ColourValue(0,0,0,0));
|
---|
[1055] | 51 | v->setOverlaysEnabled(false);
|
---|
| 52 | rt->setAutoUpdated(false);
|
---|
| 53 | }
|
---|
| 54 |
|
---|
| 55 | void 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 |
|
---|
[1062] | 64 | sharedRuns->getRoot()->updateBounds();
|
---|
[1330] | 65 | Vector3 center = sharedRuns->getRootPosition(ILLUMRUN_HPP_IMPOSTOR);
|
---|
[1055] | 66 | Camera* mainCam = OgreIlluminationManager::getSingleton().getMainCamera();
|
---|
| 67 | impostorCamera->setPosition(mainCam->getPosition());
|
---|
[1330] | 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();
|
---|
[1055] | 79 | float d = dir.normalise();
|
---|
[1330] | 80 |
|
---|
| 81 | if (d <= r * 1.2)//too close
|
---|
| 82 | {
|
---|
| 83 | d = r * 1.2;
|
---|
| 84 | impostorCamera->setPosition(center - dir * d);
|
---|
| 85 | }
|
---|
[1055] | 86 |
|
---|
[1330] | 87 | impostorCamera->setDirection(dir);
|
---|
| 88 |
|
---|
| 89 | //r = 200;
|
---|
| 90 |
|
---|
[1055] | 91 | if(perspectiveRendering)
|
---|
| 92 | {
|
---|
| 93 | impostorCamera->setProjectionType(PT_PERSPECTIVE);
|
---|
| 94 | impostorCamera->setAspectRatio(1.0);
|
---|
[1062] | 95 | Radian a = Math::ASin(r / d) * 2.0;
|
---|
[1330] | 96 | impostorCamera->setFOVy( a );
|
---|
| 97 | impostorCamera->setNearClipDistance(d - r);
|
---|
| 98 | impostorCamera->setFarClipDistance(d + r);
|
---|
[1055] | 99 | }
|
---|
| 100 | else
|
---|
| 101 | {
|
---|
[1330] | 102 | impostorCamera->setPosition(center);
|
---|
[1055] | 103 | impostorCamera->setProjectionType(PT_ORTHOGRAPHIC);
|
---|
| 104 | Matrix4 m;
|
---|
| 105 | m = Matrix4::IDENTITY;
|
---|
[1330] | 106 | float scale = 1.0 / r;
|
---|
[1055] | 107 | m.setScale(Vector3(scale, scale, scale));
|
---|
| 108 | impostorCamera->setCustomProjectionMatrix(true, m);
|
---|
| 109 | }
|
---|
| 110 |
|
---|
[1330] | 111 | //
|
---|
[1425] | 112 | psys->_notifyCurrentCamera(impostorCamera);
|
---|
[1055] | 113 | psys->_updateRenderQueue(rq);
|
---|
| 114 |
|
---|
| 115 | if(!useOwnMaterial)
|
---|
| 116 | setMaterialForRenderables(materialName,rq);
|
---|
| 117 |
|
---|
| 118 | RenderTarget* rt = impostorTexture->getBuffer().getPointer()->getRenderTarget();
|
---|
[1330] | 119 | sm->setFindVisibleObjects(false);
|
---|
[1055] | 120 | rt->update();
|
---|
[1330] | 121 | sm->setFindVisibleObjects(true);
|
---|
[1055] | 122 |
|
---|
| 123 |
|
---|
[1062] | 124 | static int framecount = 0;
|
---|
[1337] | 125 | String filename = "impostor_";
|
---|
[1062] | 126 | filename.append(this->name);
|
---|
| 127 | //filename.append(StringConverter::toString(framecount));
|
---|
[1337] | 128 | filename.append(".bmp");
|
---|
[1330] | 129 | //rt->writeContentsToFile(filename);
|
---|
[1062] | 130 | framecount++;
|
---|
| 131 |
|
---|
[1055] | 132 | if(!useOwnMaterial)
|
---|
| 133 | restoreMaterials();
|
---|
| 134 | }
|
---|
| 135 |
|
---|