forked from mirror/openmw-tes3mp
toggleCompositors command useful for debugging
This commit is contained in:
parent
5d4d35a02c
commit
11ebae3be2
8 changed files with 64 additions and 37 deletions
|
@ -16,6 +16,7 @@ source_group(game FILES ${GAME} ${GAME_HEADER})
|
||||||
add_openmw_dir (mwrender
|
add_openmw_dir (mwrender
|
||||||
renderingmanager debugging sky player animation npcanimation creatureanimation actors objects
|
renderingmanager debugging sky player animation npcanimation creatureanimation actors objects
|
||||||
renderinginterface localmap occlusionquery terrain terrainmaterial water shadows shaderhelper
|
renderinginterface localmap occlusionquery terrain terrainmaterial water shadows shaderhelper
|
||||||
|
compositors
|
||||||
)
|
)
|
||||||
|
|
||||||
add_openmw_dir (mwinput
|
add_openmw_dir (mwinput
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "shaderhelper.hpp"
|
#include "shaderhelper.hpp"
|
||||||
#include "localmap.hpp"
|
#include "localmap.hpp"
|
||||||
#include "water.hpp"
|
#include "water.hpp"
|
||||||
|
#include "compositors.hpp"
|
||||||
|
|
||||||
using namespace MWRender;
|
using namespace MWRender;
|
||||||
using namespace Ogre;
|
using namespace Ogre;
|
||||||
|
@ -29,6 +30,8 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const
|
||||||
{
|
{
|
||||||
mRendering.createScene("PlayerCam", Settings::Manager::getFloat("field of view", "General"), 5);
|
mRendering.createScene("PlayerCam", Settings::Manager::getFloat("field of view", "General"), 5);
|
||||||
|
|
||||||
|
mCompositors = new Compositors(mRendering.getViewport());
|
||||||
|
|
||||||
mWater = 0;
|
mWater = 0;
|
||||||
|
|
||||||
//The fog type must be set before any terrain objects are created as if the
|
//The fog type must be set before any terrain objects are created as if the
|
||||||
|
@ -67,15 +70,15 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const
|
||||||
// note that the order is important here
|
// note that the order is important here
|
||||||
if (useMRT())
|
if (useMRT())
|
||||||
{
|
{
|
||||||
CompositorManager::getSingleton().addCompositor(mRendering.getViewport(), "gbuffer");
|
mCompositors->addCompositor("gbuffer", 0);
|
||||||
CompositorManager::getSingleton().setCompositorEnabled(mRendering.getViewport(), "gbuffer", true);
|
mCompositors->setCompositorEnabled("gbuffer", true);
|
||||||
CompositorManager::getSingleton().addCompositor(mRendering.getViewport(), "Underwater");
|
mCompositors->addCompositor("Underwater", 1);
|
||||||
CompositorManager::getSingleton().addCompositor(mRendering.getViewport(), "gbufferFinalizer");
|
mCompositors->addCompositor("gbufferFinalizer", 2);
|
||||||
CompositorManager::getSingleton().setCompositorEnabled(mRendering.getViewport(), "gbufferFinalizer", true);
|
mCompositors->setCompositorEnabled("gbufferFinalizer", true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CompositorManager::getSingleton().addCompositor(mRendering.getViewport(), "UnderwaterNoMRT");
|
mCompositors->addCompositor("UnderwaterNoMRT", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Turn the entire scene (represented by the 'root' node) -90
|
// Turn the entire scene (represented by the 'root' node) -90
|
||||||
|
@ -120,6 +123,7 @@ RenderingManager::~RenderingManager ()
|
||||||
delete mTerrainManager;
|
delete mTerrainManager;
|
||||||
delete mLocalMap;
|
delete mLocalMap;
|
||||||
delete mOcclusionQuery;
|
delete mOcclusionQuery;
|
||||||
|
delete mCompositors;
|
||||||
}
|
}
|
||||||
|
|
||||||
MWRender::SkyManager* RenderingManager::getSkyManager()
|
MWRender::SkyManager* RenderingManager::getSkyManager()
|
||||||
|
@ -231,7 +235,7 @@ void RenderingManager::update (float duration){
|
||||||
void RenderingManager::waterAdded (MWWorld::Ptr::CellStore *store){
|
void RenderingManager::waterAdded (MWWorld::Ptr::CellStore *store){
|
||||||
if(store->cell->data.flags & store->cell->HasWater){
|
if(store->cell->data.flags & store->cell->HasWater){
|
||||||
if(mWater == 0)
|
if(mWater == 0)
|
||||||
mWater = new MWRender::Water(mRendering.getCamera(), mSkyManager, store->cell);
|
mWater = new MWRender::Water(mRendering.getCamera(), this, store->cell);
|
||||||
else
|
else
|
||||||
mWater->changeCell(store->cell);
|
mWater->changeCell(store->cell);
|
||||||
mWater->setActive(true);
|
mWater->setActive(true);
|
||||||
|
@ -292,35 +296,29 @@ void RenderingManager::skySetMoonColour (bool red){
|
||||||
|
|
||||||
bool RenderingManager::toggleRenderMode(int mode)
|
bool RenderingManager::toggleRenderMode(int mode)
|
||||||
{
|
{
|
||||||
if (mode != MWWorld::World::Render_Wireframe)
|
if (mode == MWWorld::World::Render_CollisionDebug || mode == MWWorld::World::Render_Pathgrid)
|
||||||
return mDebugging->toggleRenderMode(mode);
|
return mDebugging->toggleRenderMode(mode);
|
||||||
else // if (mode == MWWorld::World::Render_Wireframe)
|
else if (mode == MWWorld::World::Render_Wireframe)
|
||||||
{
|
{
|
||||||
if (mRendering.getCamera()->getPolygonMode() == PM_SOLID)
|
if (mRendering.getCamera()->getPolygonMode() == PM_SOLID)
|
||||||
{
|
{
|
||||||
// disable compositors
|
mCompositors->setEnabled(false);
|
||||||
if (useMRT())
|
|
||||||
{
|
|
||||||
CompositorManager::getSingleton().setCompositorEnabled(mRendering.getViewport(), "gbuffer", false);
|
|
||||||
CompositorManager::getSingleton().setCompositorEnabled(mRendering.getViewport(), "gbufferFinalizer", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
mRendering.getCamera()->setPolygonMode(PM_WIREFRAME);
|
mRendering.getCamera()->setPolygonMode(PM_WIREFRAME);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// re-enable compositors
|
mCompositors->setEnabled(true);
|
||||||
if (useMRT())
|
|
||||||
{
|
|
||||||
CompositorManager::getSingleton().setCompositorEnabled(mRendering.getViewport(), "gbuffer", true);
|
|
||||||
CompositorManager::getSingleton().setCompositorEnabled(mRendering.getViewport(), "gbufferFinalizer", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
mRendering.getCamera()->setPolygonMode(PM_SOLID);
|
mRendering.getCamera()->setPolygonMode(PM_SOLID);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else //if (mode == MWWorld::World::Render_Compositors)
|
||||||
|
{
|
||||||
|
return mCompositors->toggle();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderingManager::configureFog(ESMS::CellStore<MWWorld::RefData> &mCell)
|
void RenderingManager::configureFog(ESMS::CellStore<MWWorld::RefData> &mCell)
|
||||||
|
@ -518,4 +516,9 @@ void RenderingManager::switchToExterior()
|
||||||
mRendering.getScene()->setCameraRelativeRendering(true);
|
mRendering.getScene()->setCameraRelativeRendering(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Compositors* RenderingManager::getCompositors()
|
||||||
|
{
|
||||||
|
return mCompositors;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -47,6 +47,7 @@ namespace MWRender
|
||||||
class ShaderHelper;
|
class ShaderHelper;
|
||||||
class LocalMap;
|
class LocalMap;
|
||||||
class Water;
|
class Water;
|
||||||
|
class Compositors;
|
||||||
|
|
||||||
class RenderingManager: private RenderingInterface {
|
class RenderingManager: private RenderingInterface {
|
||||||
|
|
||||||
|
@ -67,6 +68,7 @@ class RenderingManager: private RenderingInterface {
|
||||||
/// to internal details of the rendering system anymore
|
/// to internal details of the rendering system anymore
|
||||||
|
|
||||||
SkyManager* getSkyManager();
|
SkyManager* getSkyManager();
|
||||||
|
Compositors* getCompositors();
|
||||||
|
|
||||||
void toggleLight();
|
void toggleLight();
|
||||||
bool toggleRenderMode(int mode);
|
bool toggleRenderMode(int mode);
|
||||||
|
@ -157,6 +159,8 @@ class RenderingManager: private RenderingInterface {
|
||||||
|
|
||||||
bool mSunEnabled;
|
bool mSunEnabled;
|
||||||
|
|
||||||
|
bool mCompositorsEnabled;
|
||||||
|
|
||||||
SkyManager* mSkyManager;
|
SkyManager* mSkyManager;
|
||||||
|
|
||||||
OcclusionQuery* mOcclusionQuery;
|
OcclusionQuery* mOcclusionQuery;
|
||||||
|
@ -192,6 +196,8 @@ class RenderingManager: private RenderingInterface {
|
||||||
MWRender::Shadows* mShadows;
|
MWRender::Shadows* mShadows;
|
||||||
|
|
||||||
MWRender::ShaderHelper* mShaderHelper;
|
MWRender::ShaderHelper* mShaderHelper;
|
||||||
|
|
||||||
|
MWRender::Compositors* mCompositors;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,24 +2,20 @@
|
||||||
#include <components/settings/settings.hpp>
|
#include <components/settings/settings.hpp>
|
||||||
#include "sky.hpp"
|
#include "sky.hpp"
|
||||||
#include "renderingmanager.hpp"
|
#include "renderingmanager.hpp"
|
||||||
|
#include "compositors.hpp"
|
||||||
|
|
||||||
using namespace Ogre;
|
using namespace Ogre;
|
||||||
|
|
||||||
namespace MWRender
|
namespace MWRender
|
||||||
{
|
{
|
||||||
|
|
||||||
Water::Water (Ogre::Camera *camera, SkyManager* sky, const ESM::Cell* cell) :
|
Water::Water (Ogre::Camera *camera, RenderingManager* rend, const ESM::Cell* cell) :
|
||||||
mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()),
|
mCamera (camera), mViewport (camera->getViewport()), mSceneManager (camera->getSceneManager()),
|
||||||
mIsUnderwater(false), mVisibilityFlags(0),
|
mIsUnderwater(false), mVisibilityFlags(0),
|
||||||
mReflectionTarget(0), mActive(1), mToggled(1),
|
mReflectionTarget(0), mActive(1), mToggled(1),
|
||||||
mReflectionRenderActive(false)
|
mReflectionRenderActive(false), mRendering(rend)
|
||||||
{
|
{
|
||||||
mSky = sky;
|
mSky = rend->getSkyManager();
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
CompositorManager::getSingleton().setCompositorEnabled(mViewport, "Water", false);
|
|
||||||
} catch(...) {}
|
|
||||||
|
|
||||||
mTop = cell->water;
|
mTop = cell->water;
|
||||||
|
|
||||||
|
@ -147,8 +143,6 @@ Water::~Water()
|
||||||
mWaterNode->detachObject(mWater);
|
mWaterNode->detachObject(mWater);
|
||||||
mSceneManager->destroyEntity(mWater);
|
mSceneManager->destroyEntity(mWater);
|
||||||
mSceneManager->destroySceneNode(mWaterNode);
|
mSceneManager->destroySceneNode(mWaterNode);
|
||||||
|
|
||||||
CompositorManager::getSingleton().removeCompositorChain(mViewport);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Water::changeCell(const ESM::Cell* cell)
|
void Water::changeCell(const ESM::Cell* cell)
|
||||||
|
@ -178,13 +172,13 @@ void Water::checkUnderwater(float y)
|
||||||
{
|
{
|
||||||
if (!mActive)
|
if (!mActive)
|
||||||
{
|
{
|
||||||
CompositorManager::getSingleton().setCompositorEnabled(mViewport, mCompositorName, false);
|
mRendering->getCompositors()->setCompositorEnabled(mCompositorName, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mIsUnderwater && y > mTop) || !mWater->isVisible() || mCamera->getPolygonMode() != Ogre::PM_SOLID)
|
if ((mIsUnderwater && y > mTop) || !mWater->isVisible() || mCamera->getPolygonMode() != Ogre::PM_SOLID)
|
||||||
{
|
{
|
||||||
CompositorManager::getSingleton().setCompositorEnabled(mViewport, mCompositorName, false);
|
mRendering->getCompositors()->setCompositorEnabled(mCompositorName, false);
|
||||||
|
|
||||||
// tell the shader we are not underwater
|
// tell the shader we are not underwater
|
||||||
Ogre::Pass* pass = mMaterial->getTechnique(0)->getPass(0);
|
Ogre::Pass* pass = mMaterial->getTechnique(0)->getPass(0);
|
||||||
|
@ -199,7 +193,7 @@ void Water::checkUnderwater(float y)
|
||||||
if (!mIsUnderwater && y < mTop && mWater->isVisible() && mCamera->getPolygonMode() == Ogre::PM_SOLID)
|
if (!mIsUnderwater && y < mTop && mWater->isVisible() && mCamera->getPolygonMode() == Ogre::PM_SOLID)
|
||||||
{
|
{
|
||||||
if (mUnderwaterEffect)
|
if (mUnderwaterEffect)
|
||||||
CompositorManager::getSingleton().setCompositorEnabled(mViewport, mCompositorName, true);
|
mRendering->getCompositors()->setCompositorEnabled(mCompositorName, true);
|
||||||
|
|
||||||
// tell the shader we are underwater
|
// tell the shader we are underwater
|
||||||
Ogre::Pass* pass = mMaterial->getTechnique(0)->getPass(0);
|
Ogre::Pass* pass = mMaterial->getTechnique(0)->getPass(0);
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
namespace MWRender {
|
namespace MWRender {
|
||||||
|
|
||||||
class SkyManager;
|
class SkyManager;
|
||||||
|
class RenderingManager;
|
||||||
|
|
||||||
/// Water rendering
|
/// Water rendering
|
||||||
class Water : public Ogre::RenderTargetListener, public Ogre::RenderQueueListener
|
class Water : public Ogre::RenderTargetListener, public Ogre::RenderQueueListener
|
||||||
|
@ -40,6 +41,7 @@ namespace MWRender {
|
||||||
|
|
||||||
void updateVisible();
|
void updateVisible();
|
||||||
|
|
||||||
|
RenderingManager* mRendering;
|
||||||
SkyManager* mSky;
|
SkyManager* mSky;
|
||||||
|
|
||||||
std::string mCompositorName;
|
std::string mCompositorName;
|
||||||
|
@ -55,7 +57,7 @@ namespace MWRender {
|
||||||
int mVisibilityFlags;
|
int mVisibilityFlags;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Water (Ogre::Camera *camera, SkyManager* sky, const ESM::Cell* cell);
|
Water (Ogre::Camera *camera, RenderingManager* rend, const ESM::Cell* cell);
|
||||||
~Water();
|
~Water();
|
||||||
|
|
||||||
void setActive(bool active);
|
void setActive(bool active);
|
||||||
|
|
|
@ -144,4 +144,5 @@ op 0x200014d: ModDisposition
|
||||||
op 0x200014e: ModDisposition, explicit reference
|
op 0x200014e: ModDisposition, explicit reference
|
||||||
op 0x200014f: ForceGreeting
|
op 0x200014f: ForceGreeting
|
||||||
op 0x2000150: ForceGreeting, explicit reference
|
op 0x2000150: ForceGreeting, explicit reference
|
||||||
opcodes 0x2000151-0x3ffffff unused
|
op 0x2000152: ToggleCompositors
|
||||||
|
opcodes 0x2000153-0x3ffffff unused
|
||||||
|
|
|
@ -194,6 +194,22 @@ namespace MWScript
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class OpToggleCompositors : public Interpreter::Opcode0
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void execute (Interpreter::Runtime& runtime)
|
||||||
|
{
|
||||||
|
InterpreterContext& context =
|
||||||
|
static_cast<InterpreterContext&> (runtime.getContext());
|
||||||
|
|
||||||
|
bool enabled = MWBase::Environment::get().getWorld()->toggleRenderMode(MWWorld::World::Render_Compositors);
|
||||||
|
|
||||||
|
context.report (enabled ?
|
||||||
|
"Compositors -> On" : "Compositors -> Off");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const int opcodeXBox = 0x200000c;
|
const int opcodeXBox = 0x200000c;
|
||||||
const int opcodeOnActivate = 0x200000d;
|
const int opcodeOnActivate = 0x200000d;
|
||||||
const int opcodeActivate = 0x2000075;
|
const int opcodeActivate = 0x2000075;
|
||||||
|
@ -208,6 +224,7 @@ namespace MWScript
|
||||||
const int opcodeFadeTo = 0x200013e;
|
const int opcodeFadeTo = 0x200013e;
|
||||||
const int opcodeToggleWater = 0x2000144;
|
const int opcodeToggleWater = 0x2000144;
|
||||||
const int opcodeTogglePathgrid = 0x2000146;
|
const int opcodeTogglePathgrid = 0x2000146;
|
||||||
|
const int opcodeToggleCompositors = 0x2000152;
|
||||||
|
|
||||||
void registerExtensions (Compiler::Extensions& extensions)
|
void registerExtensions (Compiler::Extensions& extensions)
|
||||||
{
|
{
|
||||||
|
@ -229,6 +246,7 @@ namespace MWScript
|
||||||
extensions.registerInstruction ("twa", "", opcodeToggleWater);
|
extensions.registerInstruction ("twa", "", opcodeToggleWater);
|
||||||
extensions.registerInstruction ("togglepathgrid", "", opcodeTogglePathgrid);
|
extensions.registerInstruction ("togglepathgrid", "", opcodeTogglePathgrid);
|
||||||
extensions.registerInstruction ("tpg", "", opcodeTogglePathgrid);
|
extensions.registerInstruction ("tpg", "", opcodeTogglePathgrid);
|
||||||
|
extensions.registerInstruction ("togglecompositors", "", opcodeToggleCompositors);
|
||||||
}
|
}
|
||||||
|
|
||||||
void installOpcodes (Interpreter::Interpreter& interpreter)
|
void installOpcodes (Interpreter::Interpreter& interpreter)
|
||||||
|
@ -247,6 +265,7 @@ namespace MWScript
|
||||||
interpreter.installSegment5 (opcodeFadeTo, new OpFadeTo);
|
interpreter.installSegment5 (opcodeFadeTo, new OpFadeTo);
|
||||||
interpreter.installSegment5 (opcodeTogglePathgrid, new OpTogglePathgrid);
|
interpreter.installSegment5 (opcodeTogglePathgrid, new OpTogglePathgrid);
|
||||||
interpreter.installSegment5 (opcodeToggleWater, new OpToggleWater);
|
interpreter.installSegment5 (opcodeToggleWater, new OpToggleWater);
|
||||||
|
interpreter.installSegment5 (opcodeToggleCompositors, new OpToggleCompositors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,8 @@ namespace MWWorld
|
||||||
{
|
{
|
||||||
Render_CollisionDebug,
|
Render_CollisionDebug,
|
||||||
Render_Wireframe,
|
Render_Wireframe,
|
||||||
Render_Pathgrid
|
Render_Pathgrid,
|
||||||
|
Render_Compositors
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in a new issue