From bf42d20f980c60a32e976757e4d4f510ff90835e Mon Sep 17 00:00:00 2001 From: gugus Date: Sun, 2 Oct 2011 13:05:08 +0200 Subject: [PATCH 01/55] Fixed some compilation errors on windows. Note that it works on my computer, but it *might* not work on older versions of windows. --- components/files/path.hpp | 2 +- components/files/windowspath.cpp | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/components/files/path.hpp b/components/files/path.hpp index 0788cefb15..23c702bbb3 100644 --- a/components/files/path.hpp +++ b/components/files/path.hpp @@ -30,7 +30,7 @@ #include namespace Files { typedef LinuxPath TargetPathType; } -#elif defined(__WIN32) || defined(__WINDOWS__) +#elif defined(__WIN32) || defined(__WINDOWS__) || defined (_WINDOWS) #include namespace Files { typedef WindowsPath TargetPathType; } diff --git a/components/files/windowspath.cpp b/components/files/windowspath.cpp index f42f149c14..b971cbbbfe 100644 --- a/components/files/windowspath.cpp +++ b/components/files/windowspath.cpp @@ -5,7 +5,10 @@ #include #include -#include +#include +#include + +#pragma comment(lib, "Shlwapi.lib") namespace Files { From 9126bb27b65b49a2dc6d63887789c16e85e49a2e Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Tue, 18 Oct 2011 19:50:19 -0400 Subject: [PATCH 02/55] empty functions --- apps/openmw/mwrender/rendering_manager.cpp | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/apps/openmw/mwrender/rendering_manager.cpp b/apps/openmw/mwrender/rendering_manager.cpp index e7ef93858b..f7a55aa5e7 100644 --- a/apps/openmw/mwrender/rendering_manager.cpp +++ b/apps/openmw/mwrender/rendering_manager.cpp @@ -2,6 +2,8 @@ namespace MWRender { + + RenderingManager::RenderingManager (SkyManager *skyManager) : mSkyManager(skyManager) { @@ -13,6 +15,37 @@ RenderingManager::~RenderingManager () delete mSkyManager; } +void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ + +} +void RenderingManager::addObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store){ + +} +void RenderingManager::removeObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store){ + +} +void RenderingManager::moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position){ + +} +void RenderingManager::scaleObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& scale){ + +} +void RenderingManager::rotateObject (const MWWorld::Ptr& ptr, const::Ogre::Quaternion& orientation){ + +} +void RenderingManager::moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Vector3& position, MWWorld::Ptr::CellStore *store){ + +} +void RenderingManager::setPhysicsDebugRendering (bool){ + +} +bool RenderingManager::getPhysicsDebugRendering() const{ + return true; +} +void RenderingManager::update (float duration){ + + + void RenderingManager::skyEnable () { mSkyManager->enable(); From 0992f1e9036b381e2e49b04323040e5262033a15 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Tue, 18 Oct 2011 21:02:42 -0400 Subject: [PATCH 03/55] Applying Gus's Windows fix --- apps/openmw/mwrender/rendering_manager.cpp | 1 + components/files/path.hpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/rendering_manager.cpp b/apps/openmw/mwrender/rendering_manager.cpp index f7a55aa5e7..e648a64511 100644 --- a/apps/openmw/mwrender/rendering_manager.cpp +++ b/apps/openmw/mwrender/rendering_manager.cpp @@ -45,6 +45,7 @@ bool RenderingManager::getPhysicsDebugRendering() const{ void RenderingManager::update (float duration){ +} void RenderingManager::skyEnable () { diff --git a/components/files/path.hpp b/components/files/path.hpp index 0788cefb15..23c702bbb3 100644 --- a/components/files/path.hpp +++ b/components/files/path.hpp @@ -30,7 +30,7 @@ #include namespace Files { typedef LinuxPath TargetPathType; } -#elif defined(__WIN32) || defined(__WINDOWS__) +#elif defined(__WIN32) || defined(__WINDOWS__) || defined (_WINDOWS) #include namespace Files { typedef WindowsPath TargetPathType; } From c52ae6825f1a4d033aceaa79c275c0770ff1a946 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Tue, 18 Oct 2011 21:04:31 -0400 Subject: [PATCH 04/55] Applying Gus's Windows fix2 --- components/files/windowspath.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/files/windowspath.cpp b/components/files/windowspath.cpp index f42f149c14..0b913d8ea0 100644 --- a/components/files/windowspath.cpp +++ b/components/files/windowspath.cpp @@ -5,7 +5,10 @@ #include #include -#include +#include + +#include +#pragma comment(lib, "Shlwapi.lib") namespace Files { From d0f922ec5d3419880f090fe77c42be7ad310a92c Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Thu, 20 Oct 2011 13:55:56 -0400 Subject: [PATCH 05/55] Moved SkyManager creation --- apps/openmw/mwrender/rendering_manager.cpp | 5 ++--- apps/openmw/mwrender/rendering_manager.hpp | 3 ++- apps/openmw/mwworld/world.cpp | 4 +--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwrender/rendering_manager.cpp b/apps/openmw/mwrender/rendering_manager.cpp index e648a64511..afa63fc3ec 100644 --- a/apps/openmw/mwrender/rendering_manager.cpp +++ b/apps/openmw/mwrender/rendering_manager.cpp @@ -4,10 +4,9 @@ namespace MWRender { -RenderingManager::RenderingManager (SkyManager *skyManager) : - mSkyManager(skyManager) +RenderingManager::RenderingManager (Ogre::RenderWindow* window, Ogre::Camera* cam, const boost::filesystem2::path& resDir) { - + mSkyManager = MWRender::SkyManager::create(window, cam, resDir); } RenderingManager::~RenderingManager () diff --git a/apps/openmw/mwrender/rendering_manager.hpp b/apps/openmw/mwrender/rendering_manager.hpp index d456716d3d..ac14ee3898 100644 --- a/apps/openmw/mwrender/rendering_manager.hpp +++ b/apps/openmw/mwrender/rendering_manager.hpp @@ -7,13 +7,14 @@ #include "../mwworld/ptr.hpp" #include #include +#include namespace MWRender { class RenderingManager { public: - RenderingManager(SkyManager *skyManager); + RenderingManager(Ogre::RenderWindow* window, Ogre::Camera* cam, const boost::filesystem2::path& resDir); ~RenderingManager(); void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 78827f150a..cee73a4334 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -207,9 +207,7 @@ namespace MWWorld mPhysEngine = physEng; mWorldScene = new Scene(environment, this, mScene, mPhysics); - mRenderingManager = new MWRender::RenderingManager( - MWRender::SkyManager::create(renderer.getWindow(), mScene.getCamera(), resDir) - ); + mRenderingManager = new MWRender::RenderingManager(renderer.getWindow(), mScene.getCamera(), resDir); } World::~World() From 3315de8b4a5aced23163c2af7183fe3ba2f07229 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Thu, 20 Oct 2011 15:02:19 -0400 Subject: [PATCH 06/55] Naming convention change --- apps/openmw/CMakeLists.txt | 4 +- apps/openmw/mwrender/renderingmanager.cpp | 85 +++++++++++++++++++++++ apps/openmw/mwrender/renderingmanager.hpp | 52 ++++++++++++++ apps/openmw/mwworld/world.hpp | 2 +- 4 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 apps/openmw/mwrender/renderingmanager.cpp create mode 100644 apps/openmw/mwrender/renderingmanager.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 54abb948a4..9510273af6 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -16,7 +16,7 @@ set(GAME_HEADER source_group(game FILES ${GAME} ${GAME_HEADER}) set(GAMEREND - mwrender/rendering_manager.cpp + mwrender/renderingmanager.cpp mwrender/mwscene.cpp mwrender/cellimp.cpp mwrender/interior.cpp @@ -25,7 +25,7 @@ set(GAMEREND mwrender/player.cpp ) set(GAMEREND_HEADER - mwrender/rendering_manager.hpp + mwrender/renderingmanager.hpp mwrender/cell.hpp mwrender/cellimp.hpp mwrender/mwscene.hpp diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp new file mode 100644 index 0000000000..f083d206d6 --- /dev/null +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -0,0 +1,85 @@ +#include "renderingmanager.hpp" + +namespace MWRender { + + + +RenderingManager::RenderingManager (Ogre::RenderWindow* window, Ogre::Camera* cam, const boost::filesystem2::path& resDir) +{ + mSkyManager = MWRender::SkyManager::create(window, cam, resDir); +} + +RenderingManager::~RenderingManager () +{ + delete mSkyManager; +} + +void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ + +} +void RenderingManager::addObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store){ + +} +void RenderingManager::removeObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store){ + +} +void RenderingManager::moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position){ + +} +void RenderingManager::scaleObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& scale){ + +} +void RenderingManager::rotateObject (const MWWorld::Ptr& ptr, const::Ogre::Quaternion& orientation){ + +} +void RenderingManager::moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Vector3& position, MWWorld::Ptr::CellStore *store){ + +} +void RenderingManager::setPhysicsDebugRendering (bool){ + +} +bool RenderingManager::getPhysicsDebugRendering() const{ + return true; +} +void RenderingManager::update (float duration){ + + +} + +void RenderingManager::skyEnable () +{ + mSkyManager->enable(); +} + +void RenderingManager::skyDisable () +{ + mSkyManager->disable(); +} + +void RenderingManager::skySetHour (double hour) +{ + mSkyManager->setHour(hour); +} + + +void RenderingManager::skySetDate (int day, int month) +{ + mSkyManager->setDate(day, month); +} + +int RenderingManager::skyGetMasserPhase() const +{ + return mSkyManager->getMasserPhase(); +} + +int RenderingManager::skyGetSecundaPhase() const +{ + return mSkyManager->getSecundaPhase(); +} + +void RenderingManager::skySetMoonColour (bool red) +{ + mSkyManager->setMoonColour(red); +} + +} diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp new file mode 100644 index 0000000000..ac14ee3898 --- /dev/null +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -0,0 +1,52 @@ +#ifndef _GAME_RENDERING_MANAGER_H +#define _GAME_RENDERING_MANAGER_H + + +#include "sky.hpp" + +#include "../mwworld/ptr.hpp" +#include +#include +#include + +namespace MWRender +{ + +class RenderingManager { + public: + RenderingManager(Ogre::RenderWindow* window, Ogre::Camera* cam, const boost::filesystem2::path& resDir); + ~RenderingManager(); + + void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? + + void addObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store); + void removeObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store); + + void moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position); + void scaleObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& scale); + void rotateObject (const MWWorld::Ptr& ptr, const::Ogre::Quaternion& orientation); + void moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Vector3& position, MWWorld::Ptr::CellStore *store); + + void setPhysicsDebugRendering (bool); + bool getPhysicsDebugRendering() const; + + void update (float duration); + + void skyEnable (); + void skyDisable (); + void skySetHour (double hour); + void skySetDate (int day, int month); + int skyGetMasserPhase() const; + int skyGetSecundaPhase() const; + void skySetMoonColour (bool red); + + private: + + SkyManager* mSkyManager; + + +}; + +} + +#endif diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index 978f14c8ea..e661ef362a 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -9,7 +9,7 @@ #include #include "../mwrender/mwscene.hpp" -#include "../mwrender/rendering_manager.hpp" +#include "../mwrender/renderingmanager.hpp" #include "refdata.hpp" #include "ptr.hpp" From fcf404d27b435d20bcf0867454e00011ead87375 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Thu, 20 Oct 2011 18:15:30 -0400 Subject: [PATCH 07/55] GetFacedHandle in Physics. RenderingManager constructor code added --- apps/openmw/mwrender/renderingmanager.cpp | 56 ++++++++++++++++++++++- apps/openmw/mwrender/renderingmanager.hpp | 42 +++++++++++++++-- apps/openmw/mwworld/physicssystem.cpp | 17 +++++++ apps/openmw/mwworld/physicssystem.hpp | 1 + apps/openmw/mwworld/world.cpp | 3 +- 5 files changed, 113 insertions(+), 6 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index f083d206d6..095323dea1 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -1,12 +1,64 @@ #include "renderingmanager.hpp" +#include + +#include "OgreRoot.h" +#include "OgreRenderWindow.h" +#include "OgreSceneManager.h" +#include "OgreViewport.h" +#include "OgreCamera.h" +#include "OgreTextureManager.h" + +#include "../mwworld/world.hpp" // these includes can be removed once the static-hack is gone +#include "../mwworld/ptr.hpp" +#include + +#include "player.hpp" + +using namespace MWRender; +using namespace Ogre; + namespace MWRender { -RenderingManager::RenderingManager (Ogre::RenderWindow* window, Ogre::Camera* cam, const boost::filesystem2::path& resDir) +RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem2::path& resDir) :rend(_rend) { - mSkyManager = MWRender::SkyManager::create(window, cam, resDir); + camera = rend.getCamera(); + mSkyManager = MWRender::SkyManager::create(rend.getWindow(), camera, resDir); + + + rend.createScene("PlayerCam", 55, 5); + + // Set default mipmap level (NB some APIs ignore this) + TextureManager::getSingleton().setDefaultNumMipmaps(5); + + // Load resources + ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); + + // Turn the entire scene (represented by the 'root' node) -90 + // degrees around the x axis. This makes Z go upwards, and Y go into + // the screen (when x is to the right.) This is the orientation that + // Morrowind uses, and it automagically makes everything work as it + // should. + + SceneNode *rt = rend.getScene()->getRootSceneNode(); + mwRoot = rt->createChildSceneNode(); + mwRoot->pitch(Degree(-90)); + + //used to obtain ingame information of ogre objects (which are faced or selected) + mRaySceneQuery = rend.getScene()->createRayQuery(Ray()); + + Ogre::SceneNode *playerNode = mwRoot->createChildSceneNode ("player"); + playerNode->pitch(Degree(90)); + Ogre::SceneNode *cameraYawNode = playerNode->createChildSceneNode(); + Ogre::SceneNode *cameraPitchNode = cameraYawNode->createChildSceneNode(); + cameraPitchNode->attachObject(camera); + + + mPlayer = new MWRender::Player (camera, playerNode->getName()); + + } RenderingManager::~RenderingManager () diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index ac14ee3898..ec03e970a0 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -4,17 +4,53 @@ #include "sky.hpp" -#include "../mwworld/ptr.hpp" +#include #include #include + +#include +#include + +#include "../mwworld/ptr.hpp" + #include +namespace Ogre +{ + class Camera; + class Viewport; + class SceneManager; + class SceneNode; + class RaySceneQuery; + class Quaternion; + class Vector3; +} + +namespace MWWorld +{ + class World; +} + namespace MWRender { - + class Player; class RenderingManager { + + OEngine::Render::OgreRenderer &rend; + Ogre::Camera* camera; + + /// Root node for all objects added to the scene. This is rotated so + /// that the OGRE coordinate system matches that used internally in + /// Morrowind. + Ogre::SceneNode *mwRoot; + Ogre::RaySceneQuery *mRaySceneQuery; + + OEngine::Physic::PhysicEngine* eng; + + MWRender::Player *mPlayer; + public: - RenderingManager(Ogre::RenderWindow* window, Ogre::Camera* cam, const boost::filesystem2::path& resDir); + RenderingManager(OEngine::Render::OgreRenderer& _rend, const boost::filesystem2::path& resDir); ~RenderingManager(); void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? diff --git a/apps/openmw/mwworld/physicssystem.cpp b/apps/openmw/mwworld/physicssystem.cpp index fa617a9c72..b06fa1a48b 100644 --- a/apps/openmw/mwworld/physicssystem.cpp +++ b/apps/openmw/mwworld/physicssystem.cpp @@ -10,6 +10,7 @@ #include "OgreTextureManager.h" +using namespace Ogre; namespace MWWorld { @@ -23,6 +24,22 @@ namespace MWWorld { } + std::pair PhysicsSystem::getFacedHandle (MWWorld::World& world) + { + std::string handle = ""; + + //get a ray pointing to the center of the viewport + Ray centerRay = mRender.getCamera()->getCameraToViewportRay( + mRender.getViewport()->getWidth()/2, + mRender.getViewport()->getHeight()/2); + //let's avoid the capsule shape of the player. + centerRay.setOrigin(centerRay.getOrigin() + 20*centerRay.getDirection()); + btVector3 from(centerRay.getOrigin().x,-centerRay.getOrigin().z,centerRay.getOrigin().y); + btVector3 to(centerRay.getPoint(500).x,-centerRay.getPoint(500).z,centerRay.getPoint(500).y); + + return mEngine->rayTest(from,to); + } + std::vector< std::pair > PhysicsSystem::doPhysics (float duration, const std::vector >& actors) diff --git a/apps/openmw/mwworld/physicssystem.hpp b/apps/openmw/mwworld/physicssystem.hpp index 7f7bfdcbb5..17640c0744 100644 --- a/apps/openmw/mwworld/physicssystem.hpp +++ b/apps/openmw/mwworld/physicssystem.hpp @@ -32,6 +32,7 @@ namespace MWWorld void scaleObject (const std::string& handle, float scale); bool toggleCollisionMode(); + std::pair getFacedHandle (MWWorld::World& world); private: OEngine::Render::OgreRenderer &mRender; diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index cee73a4334..4174e64579 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -207,7 +207,8 @@ namespace MWWorld mPhysEngine = physEng; mWorldScene = new Scene(environment, this, mScene, mPhysics); - mRenderingManager = new MWRender::RenderingManager(renderer.getWindow(), mScene.getCamera(), resDir); + mRenderingManager = new MWRender::RenderingManager(renderer, + resDir); } World::~World() From 47593f3641fbbd8ffef4d595a5f4502f71356a6a Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Thu, 20 Oct 2011 19:35:49 -0400 Subject: [PATCH 08/55] Removing old files --- apps/openmw/mwrender/rendering_manager.cpp | 85 ---------------------- apps/openmw/mwrender/rendering_manager.hpp | 52 ------------- 2 files changed, 137 deletions(-) delete mode 100644 apps/openmw/mwrender/rendering_manager.cpp delete mode 100644 apps/openmw/mwrender/rendering_manager.hpp diff --git a/apps/openmw/mwrender/rendering_manager.cpp b/apps/openmw/mwrender/rendering_manager.cpp deleted file mode 100644 index afa63fc3ec..0000000000 --- a/apps/openmw/mwrender/rendering_manager.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include "rendering_manager.hpp" - -namespace MWRender { - - - -RenderingManager::RenderingManager (Ogre::RenderWindow* window, Ogre::Camera* cam, const boost::filesystem2::path& resDir) -{ - mSkyManager = MWRender::SkyManager::create(window, cam, resDir); -} - -RenderingManager::~RenderingManager () -{ - delete mSkyManager; -} - -void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ - -} -void RenderingManager::addObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store){ - -} -void RenderingManager::removeObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store){ - -} -void RenderingManager::moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position){ - -} -void RenderingManager::scaleObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& scale){ - -} -void RenderingManager::rotateObject (const MWWorld::Ptr& ptr, const::Ogre::Quaternion& orientation){ - -} -void RenderingManager::moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Vector3& position, MWWorld::Ptr::CellStore *store){ - -} -void RenderingManager::setPhysicsDebugRendering (bool){ - -} -bool RenderingManager::getPhysicsDebugRendering() const{ - return true; -} -void RenderingManager::update (float duration){ - - -} - -void RenderingManager::skyEnable () -{ - mSkyManager->enable(); -} - -void RenderingManager::skyDisable () -{ - mSkyManager->disable(); -} - -void RenderingManager::skySetHour (double hour) -{ - mSkyManager->setHour(hour); -} - - -void RenderingManager::skySetDate (int day, int month) -{ - mSkyManager->setDate(day, month); -} - -int RenderingManager::skyGetMasserPhase() const -{ - return mSkyManager->getMasserPhase(); -} - -int RenderingManager::skyGetSecundaPhase() const -{ - return mSkyManager->getSecundaPhase(); -} - -void RenderingManager::skySetMoonColour (bool red) -{ - mSkyManager->setMoonColour(red); -} - -} diff --git a/apps/openmw/mwrender/rendering_manager.hpp b/apps/openmw/mwrender/rendering_manager.hpp deleted file mode 100644 index ac14ee3898..0000000000 --- a/apps/openmw/mwrender/rendering_manager.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _GAME_RENDERING_MANAGER_H -#define _GAME_RENDERING_MANAGER_H - - -#include "sky.hpp" - -#include "../mwworld/ptr.hpp" -#include -#include -#include - -namespace MWRender -{ - -class RenderingManager { - public: - RenderingManager(Ogre::RenderWindow* window, Ogre::Camera* cam, const boost::filesystem2::path& resDir); - ~RenderingManager(); - - void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? - - void addObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store); - void removeObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store); - - void moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position); - void scaleObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& scale); - void rotateObject (const MWWorld::Ptr& ptr, const::Ogre::Quaternion& orientation); - void moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Vector3& position, MWWorld::Ptr::CellStore *store); - - void setPhysicsDebugRendering (bool); - bool getPhysicsDebugRendering() const; - - void update (float duration); - - void skyEnable (); - void skyDisable (); - void skySetHour (double hour); - void skySetDate (int day, int month); - int skyGetMasserPhase() const; - int skyGetSecundaPhase() const; - void skySetMoonColour (bool red); - - private: - - SkyManager* mSkyManager; - - -}; - -} - -#endif From 30ba9b74daf60afd7d781423e6c9cef23f9ddab3 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 22 Oct 2011 00:15:15 -0400 Subject: [PATCH 09/55] Simple Debugging class --- apps/openmw/mwrender/mwscene.cpp | 18 ++++++++++++++++++ apps/openmw/mwrender/mwscene.hpp | 9 +++++++++ apps/openmw/mwrender/renderingmanager.hpp | 2 ++ 3 files changed, 29 insertions(+) diff --git a/apps/openmw/mwrender/mwscene.cpp b/apps/openmw/mwrender/mwscene.cpp index 900b4d249d..cabed7beeb 100644 --- a/apps/openmw/mwrender/mwscene.cpp +++ b/apps/openmw/mwrender/mwscene.cpp @@ -18,6 +18,24 @@ using namespace MWRender; using namespace Ogre; +Debugging::Debugging(OEngine::Physic::PhysicEngine* engine){ + eng = engine; +} + +bool Debugging::toggleRenderMode (int mode){ + switch (mode) + { + case MWWorld::World::Render_CollisionDebug: + + // TODO use a proper function instead of accessing the member variable + // directly. + eng->setDebugRenderingMode (!eng->isDebugCreated); + return eng->isDebugCreated; + } + + return false; +} + MWScene::MWScene(OEngine::Render::OgreRenderer &_rend , OEngine::Physic::PhysicEngine* physEng) : rend(_rend) { diff --git a/apps/openmw/mwrender/mwscene.hpp b/apps/openmw/mwrender/mwscene.hpp index 9186790351..d68fb6ad57 100644 --- a/apps/openmw/mwrender/mwscene.hpp +++ b/apps/openmw/mwrender/mwscene.hpp @@ -28,6 +28,15 @@ namespace MWRender { class Player; + class Debugging{ + OEngine::Physic::PhysicEngine* eng; + + + public: + Debugging(OEngine::Physic::PhysicEngine* engine); + bool toggleRenderMode (int mode); + }; + /// \brief 3D-scene (rendering and physics) class MWScene diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index ec03e970a0..8c76f8f26f 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -34,6 +34,8 @@ namespace MWWorld namespace MWRender { class Player; + + class RenderingManager { OEngine::Render::OgreRenderer &rend; From 6efc61b9dfc131a2863bb8c6fd3f88c8965df62d Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Mon, 24 Oct 2011 13:42:36 -0400 Subject: [PATCH 10/55] Removal of MWScene; Object listing fixed --- apps/openmw/engine.cpp | 11 +++- apps/openmw/mwrender/exterior.cpp | 43 +++++++------- apps/openmw/mwrender/exterior.hpp | 6 +- apps/openmw/mwrender/interior.cpp | 33 ++++++----- apps/openmw/mwrender/interior.hpp | 8 +-- apps/openmw/mwrender/mwscene.cpp | 71 +---------------------- apps/openmw/mwrender/mwscene.hpp | 40 ------------- apps/openmw/mwrender/renderingmanager.cpp | 20 ++++--- apps/openmw/mwrender/renderingmanager.hpp | 8 ++- apps/openmw/mwworld/scene.cpp | 8 +-- apps/openmw/mwworld/scene.hpp | 6 +- apps/openmw/mwworld/world.cpp | 37 ++++++------ apps/openmw/mwworld/world.hpp | 4 +- 13 files changed, 100 insertions(+), 195 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 4e58e8a4ca..90b476df7d 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -68,20 +68,25 @@ void OMW::Engine::executeLocalScripts() void OMW::Engine::updateFocusReport (float duration) { + if ((mFocusTDiff += duration)>0.25) { mFocusTDiff = 0; std::string name; - + std::string handle = mEnvironment.mWorld->getFacedHandle(); if (!handle.empty()) { MWWorld::Ptr ptr = mEnvironment.mWorld->getPtrViaHandle (handle); - if (!ptr.isEmpty()) + if (!ptr.isEmpty()){ name = MWWorld::Class::get (ptr).getName (ptr); + if (!name.empty()) + std::cout << "Object: " << name << std::endl; + + } } if (name!=mFocusName) @@ -284,6 +289,8 @@ void OMW::Engine::setReportFocus (bool report) void OMW::Engine::go() { + mFocusTDiff = 0; + mReportFocus = true; assert (!mEnvironment.mWorld); assert (!mCellName.empty()); assert (!mMaster.empty()); diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index 9dd82c68f1..9cc8fd5641 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -1,4 +1,5 @@ #include "exterior.hpp" +#include "renderingmanager.hpp" #include #include @@ -34,11 +35,11 @@ bool ExteriorCellRender::lightOutQuadInLin = false; int ExteriorCellRender::uniqueID = 0; ExteriorCellRender::ExteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, - MWScene &_scene, MWWorld::PhysicsSystem *physics) - : mCell(_cell), mEnvironment (environment), mScene(_scene), mPhysics(physics), mBase(NULL), mInsert(NULL), mAmbientMode (0) + RenderingManager &_rendering, MWWorld::PhysicsSystem *physics) + : mCell(_cell), mEnvironment (environment), mRendering(_rendering), mPhysics(physics), mBase(NULL), mInsert(NULL), mAmbientMode (0) { uniqueID = uniqueID +1; - sg = mScene.getMgr()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); + sg = mRendering.getMgr()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); } @@ -126,7 +127,7 @@ void ExteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, mNpcPart = parent->createChildSceneNode(sceneNodeName); MeshPtr good2 = NifOgre::NIFLoader::load(mesh); - MovableObject *ent = mScene.getMgr()->createEntity(mesh); + MovableObject *ent = mRendering.getMgr()->createEntity(mesh); if(translateFirst){ @@ -214,7 +215,7 @@ void ExteriorCellRender::insertMesh(const std::string &mesh) assert (mInsert); NifOgre::NIFLoader::load(mesh); - Entity *ent = mScene.getMgr()->createEntity(mesh); + Entity *ent = mRendering.getMgr()->createEntity(mesh); if(!isStatic) { @@ -224,7 +225,7 @@ void ExteriorCellRender::insertMesh(const std::string &mesh) { sg->addEntity(ent,mInsert->_getDerivedPosition(),mInsert->_getDerivedOrientation(),mInsert->_getDerivedScale()); sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); - mScene.getMgr()->destroyEntity(ent); + mRendering.getMgr()->destroyEntity(ent); } if (mInsertMesh.empty()) mInsertMesh = mesh; @@ -249,7 +250,7 @@ void ExteriorCellRender::insertLight(float r, float g, float b, float radius) { assert (mInsert); - Ogre::Light *light = mScene.getMgr()->createLight(); + Ogre::Light *light = mRendering.getMgr()->createLight(); light->setDiffuseColour (r, g, b); float cval=0.0f, lval=0.0f, qval=0.0f; @@ -305,7 +306,7 @@ void ExteriorCellRender::configureAmbient() // Create a "sun" that shines light downwards. It doesn't look // completely right, but leave it for now. - Ogre::Light *light = mScene.getMgr()->createLight(); + Ogre::Light *light = mRendering.getMgr()->createLight(); Ogre::ColourValue colour; colour.setAsABGR (mCell.cell->ambi.sunlight); light->setDiffuseColour (colour); @@ -322,9 +323,9 @@ void ExteriorCellRender::configureFog() float high = 4500 + 9000 * (1-mCell.cell->ambi.fogDensity); float low = 200; - mScene.getMgr()->setFog (FOG_LINEAR, color, 0, low, high); - mScene.getCamera()->setFarClipDistance (high + 10); - mScene.getViewport()->setBackgroundColour (color); + mRendering.getMgr()->setFog (FOG_LINEAR, color, 0, low, high); + mRendering.getCamera()->setFarClipDistance (high + 10); + mRendering.getViewport()->setBackgroundColour (color); } void ExteriorCellRender::setAmbientMode() @@ -333,17 +334,17 @@ void ExteriorCellRender::setAmbientMode() { case 0: - mScene.getMgr()->setAmbientLight(mAmbientColor); + mRendering.getMgr()->setAmbientLight(mAmbientColor); break; case 1: - mScene.getMgr()->setAmbientLight(0.7f*mAmbientColor + 0.3f*ColourValue(1,1,1)); + mRendering.getMgr()->setAmbientLight(0.7f*mAmbientColor + 0.3f*ColourValue(1,1,1)); break; case 2: - mScene.getMgr()->setAmbientLight(ColourValue(1,1,1)); + mRendering.getMgr()->setAmbientLight(ColourValue(1,1,1)); break; } } @@ -351,7 +352,7 @@ void ExteriorCellRender::setAmbientMode() void ExteriorCellRender::show() { // FIXME: this one may be the bug - mBase = mScene.getRoot()->createChildSceneNode(); + mBase = mRendering.getRoot()->createChildSceneNode(); configureAmbient(); configureFog(); @@ -400,14 +401,14 @@ void ExteriorCellRender::destroy() { destroyAllAttachedMovableObjects(mBase); mBase->removeAndDestroyAllChildren(); - mScene.getMgr()->destroySceneNode(mBase); + mRendering.getMgr()->destroySceneNode(mBase); } mBase = 0; if (sg) { - mScene.getMgr()->destroyStaticGeometry (sg); + mRendering.getMgr()->destroyStaticGeometry (sg); sg = 0; } } @@ -434,21 +435,21 @@ void ExteriorCellRender::toggleLight() void ExteriorCellRender::enable (const std::string& handle) { if (!handle.empty()) - mScene.getMgr()->getSceneNode (handle)->setVisible (true); + mRendering.getMgr()->getSceneNode (handle)->setVisible (true); } void ExteriorCellRender::disable (const std::string& handle) { if (!handle.empty()) - mScene.getMgr()->getSceneNode (handle)->setVisible (false); + mRendering.getMgr()->getSceneNode (handle)->setVisible (false); } void ExteriorCellRender::deleteObject (const std::string& handle) { if (!handle.empty()) { - Ogre::SceneNode *node = mScene.getMgr()->getSceneNode (handle); + Ogre::SceneNode *node = mRendering.getMgr()->getSceneNode (handle); node->removeAndDestroyAllChildren(); - mScene.getMgr()->destroySceneNode (node); + mRendering.getMgr()->destroySceneNode (node); } } diff --git a/apps/openmw/mwrender/exterior.hpp b/apps/openmw/mwrender/exterior.hpp index d8f6b9b96c..17973db468 100644 --- a/apps/openmw/mwrender/exterior.hpp +++ b/apps/openmw/mwrender/exterior.hpp @@ -21,7 +21,7 @@ namespace MWWorld namespace MWRender { - class MWScene; + class RenderingManager; /** This class is responsible for inserting meshes and other @@ -49,7 +49,7 @@ namespace MWRender ESMS::CellStore &mCell; MWWorld::Environment &mEnvironment; - MWScene &mScene; + RenderingManager &mRendering; MWWorld::PhysicsSystem *mPhysics; /// The scene node that contains all objects belonging to this @@ -103,7 +103,7 @@ namespace MWRender public: ExteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, - MWScene &_scene, MWWorld::PhysicsSystem *physics); + RenderingManager &_rendering, MWWorld::PhysicsSystem *physics); virtual ~ExteriorCellRender() { destroy(); } diff --git a/apps/openmw/mwrender/interior.cpp b/apps/openmw/mwrender/interior.cpp index bfde4b04e0..13149eb555 100644 --- a/apps/openmw/mwrender/interior.cpp +++ b/apps/openmw/mwrender/interior.cpp @@ -1,4 +1,5 @@ #include "interior.hpp" +#include "renderingmanager.hpp" #include #include @@ -108,7 +109,7 @@ void InteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, MeshPtr good2 = NifOgre::NIFLoader::load(mesh); - MovableObject *ent = scene.getMgr()->createEntity(mesh); + MovableObject *ent = mRendering.getMgr()->createEntity(mesh); //ent->extr // MovableObject *ent2 = scene.getMgr()->createEntity(bounds @@ -185,7 +186,7 @@ void InteriorCellRender::insertMesh(const std::string &mesh) assert (insert); NifOgre::NIFLoader::load(mesh); - MovableObject *ent = scene.getMgr()->createEntity(mesh); + MovableObject *ent = mRendering.getMgr()->createEntity(mesh); insert->attachObject(ent); if (mInsertMesh.empty()) @@ -211,7 +212,7 @@ void InteriorCellRender::insertLight(float r, float g, float b, float radius) { assert (insert); - Ogre::Light *light = scene.getMgr()->createLight(); + Ogre::Light *light = mRendering.getMgr()->createLight(); light->setDiffuseColour (r, g, b); float cval=0.0f, lval=0.0f, qval=0.0f; @@ -267,7 +268,7 @@ void InteriorCellRender::configureAmbient() // Create a "sun" that shines light downwards. It doesn't look // completely right, but leave it for now. - Ogre::Light *light = scene.getMgr()->createLight(); + Ogre::Light *light = mRendering.getMgr()->createLight(); Ogre::ColourValue colour; colour.setAsABGR (cell.cell->ambi.sunlight); light->setDiffuseColour (colour); @@ -284,9 +285,9 @@ void InteriorCellRender::configureFog() float high = 4500 + 9000 * (1-cell.cell->ambi.fogDensity); float low = 200; - scene.getMgr()->setFog (FOG_LINEAR, color, 0, low, high); - scene.getCamera()->setFarClipDistance (high + 10); - scene.getViewport()->setBackgroundColour (color); + mRendering.getMgr()->setFog (FOG_LINEAR, color, 0, low, high); + mRendering.getCamera()->setFarClipDistance (high + 10); + mRendering.getViewport()->setBackgroundColour (color); } void InteriorCellRender::setAmbientMode() @@ -295,24 +296,24 @@ void InteriorCellRender::setAmbientMode() { case 0: - scene.getMgr()->setAmbientLight(ambientColor); + mRendering.getMgr()->setAmbientLight(ambientColor); break; case 1: - scene.getMgr()->setAmbientLight(0.7f*ambientColor + 0.3f*ColourValue(1,1,1)); + mRendering.getMgr()->setAmbientLight(0.7f*ambientColor + 0.3f*ColourValue(1,1,1)); break; case 2: - scene.getMgr()->setAmbientLight(ColourValue(1,1,1)); + mRendering.getMgr()->setAmbientLight(ColourValue(1,1,1)); break; } } void InteriorCellRender::show() { - base = scene.getRoot()->createChildSceneNode(); + base = mRendering.getRoot()->createChildSceneNode(); configureAmbient(); configureFog(); @@ -331,7 +332,7 @@ void InteriorCellRender::destroy() if(base) { base->removeAndDestroyAllChildren(); - scene.getMgr()->destroySceneNode(base); + mRendering.getMgr()->destroySceneNode(base); } base = NULL; @@ -359,22 +360,22 @@ void InteriorCellRender::toggleLight() void InteriorCellRender::enable (const std::string& handle) { if (!handle.empty()) - scene.getMgr()->getSceneNode (handle)->setVisible (true); + mRendering.getMgr()->getSceneNode (handle)->setVisible (true); } void InteriorCellRender::disable (const std::string& handle) { if (!handle.empty()) - scene.getMgr()->getSceneNode (handle)->setVisible (false); + mRendering.getMgr()->getSceneNode (handle)->setVisible (false); } void InteriorCellRender::deleteObject (const std::string& handle) { if (!handle.empty()) { - Ogre::SceneNode *node = scene.getMgr()->getSceneNode (handle); + Ogre::SceneNode *node = mRendering.getMgr()->getSceneNode (handle); node->removeAndDestroyAllChildren(); - scene.getMgr()->destroySceneNode (node); + mRendering.getMgr()->destroySceneNode (node); } } diff --git a/apps/openmw/mwrender/interior.hpp b/apps/openmw/mwrender/interior.hpp index 16fca0898c..9329d5b79e 100644 --- a/apps/openmw/mwrender/interior.hpp +++ b/apps/openmw/mwrender/interior.hpp @@ -20,7 +20,7 @@ namespace MWWorld namespace MWRender { - class MWScene; + class RenderingManager; /** This class is responsible for inserting meshes and other @@ -48,7 +48,7 @@ namespace MWRender ESMS::CellStore &cell; MWWorld::Environment &mEnvironment; - MWScene &scene; + MWRender::RenderingManager &mRendering; MWWorld::PhysicsSystem *mPhysics; /// The scene node that contains all objects belonging to this @@ -95,8 +95,8 @@ namespace MWRender public: InteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, - MWScene &_scene, MWWorld::PhysicsSystem *physics) - : cell(_cell), mEnvironment (environment), scene(_scene), base(NULL), insert(NULL), ambientMode (0) + RenderingManager &_rendering, MWWorld::PhysicsSystem *physics) + : cell(_cell), mEnvironment (environment), mRendering(_rendering), base(NULL), insert(NULL), ambientMode (0) { mPhysics = physics; } diff --git a/apps/openmw/mwrender/mwscene.cpp b/apps/openmw/mwrender/mwscene.cpp index cabed7beeb..0201c82080 100644 --- a/apps/openmw/mwrender/mwscene.cpp +++ b/apps/openmw/mwrender/mwscene.cpp @@ -22,6 +22,7 @@ Debugging::Debugging(OEngine::Physic::PhysicEngine* engine){ eng = engine; } + bool Debugging::toggleRenderMode (int mode){ switch (mode) { @@ -35,73 +36,3 @@ bool Debugging::toggleRenderMode (int mode){ return false; } - -MWScene::MWScene(OEngine::Render::OgreRenderer &_rend , OEngine::Physic::PhysicEngine* physEng) - : rend(_rend) -{ - eng = physEng; - rend.createScene("PlayerCam", 55, 5); - - // Set default mipmap level (NB some APIs ignore this) - TextureManager::getSingleton().setDefaultNumMipmaps(5); - - // Load resources - ResourceGroupManager::getSingleton().initialiseAllResourceGroups(); - - // Turn the entire scene (represented by the 'root' node) -90 - // degrees around the x axis. This makes Z go upwards, and Y go into - // the screen (when x is to the right.) This is the orientation that - // Morrowind uses, and it automagically makes everything work as it - // should. - SceneNode *rt = rend.getScene()->getRootSceneNode(); - mwRoot = rt->createChildSceneNode(); - mwRoot->pitch(Degree(-90)); - - //used to obtain ingame information of ogre objects (which are faced or selected) - mRaySceneQuery = rend.getScene()->createRayQuery(Ray()); - - Ogre::SceneNode *playerNode = mwRoot->createChildSceneNode ("player"); - playerNode->pitch(Degree(90)); - Ogre::SceneNode *cameraYawNode = playerNode->createChildSceneNode(); - Ogre::SceneNode *cameraPitchNode = cameraYawNode->createChildSceneNode(); - cameraPitchNode->attachObject(getCamera()); - - - mPlayer = new MWRender::Player (getCamera(), playerNode->getName()); -} - -MWScene::~MWScene() -{ - delete mPlayer; -} - -std::pair MWScene::getFacedHandle (MWWorld::World& world) -{ - std::string handle = ""; - - //get a ray pointing to the center of the viewport - Ray centerRay = getCamera()->getCameraToViewportRay( - getViewport()->getWidth()/2, - getViewport()->getHeight()/2); - //let's avoid the capsule shape of the player. - centerRay.setOrigin(centerRay.getOrigin() + 20*centerRay.getDirection()); - btVector3 from(centerRay.getOrigin().x,-centerRay.getOrigin().z,centerRay.getOrigin().y); - btVector3 to(centerRay.getPoint(500).x,-centerRay.getPoint(500).z,centerRay.getPoint(500).y); - - return eng->rayTest(from,to); -} - -bool MWScene::toggleRenderMode (int mode) -{ - switch (mode) - { - case MWWorld::World::Render_CollisionDebug: - - // TODO use a proper function instead of accessing the member variable - // directly. - eng->setDebugRenderingMode (!eng->isDebugCreated); - return eng->isDebugCreated; - } - - return false; -} diff --git a/apps/openmw/mwrender/mwscene.hpp b/apps/openmw/mwrender/mwscene.hpp index d68fb6ad57..b48cfaee2a 100644 --- a/apps/openmw/mwrender/mwscene.hpp +++ b/apps/openmw/mwrender/mwscene.hpp @@ -37,47 +37,7 @@ namespace MWRender bool toggleRenderMode (int mode); }; - /// \brief 3D-scene (rendering and physics) - class MWScene - { - OEngine::Render::OgreRenderer &rend; - - /// Root node for all objects added to the scene. This is rotated so - /// that the OGRE coordinate system matches that used internally in - /// Morrowind. - Ogre::SceneNode *mwRoot; - Ogre::RaySceneQuery *mRaySceneQuery; - - OEngine::Physic::PhysicEngine* eng; - - MWRender::Player *mPlayer; - - public: - - MWScene (OEngine::Render::OgreRenderer &_rend , OEngine::Physic::PhysicEngine* physEng); - - ~MWScene(); - - Ogre::Camera *getCamera() { return rend.getCamera(); } - Ogre::SceneNode *getRoot() { return mwRoot; } - Ogre::SceneManager *getMgr() { return rend.getScene(); } - Ogre::Viewport *getViewport() { return rend.getViewport(); } - Ogre::RaySceneQuery *getRaySceneQuery() { return mRaySceneQuery; } - MWRender::Player *getPlayer() { return mPlayer; } - - /// Gets the handle of the object the player is looking at - /// pair - /// name is empty and distance = -1 if there is no object which - /// can be faced - std::pair getFacedHandle (MWWorld::World& world); - - /// Toggle render mode - /// \todo Using an int instead of a enum here to avoid cyclic includes. Will be fixed - /// when the mw*-refactoring is done. - /// \return Resulting mode - bool toggleRenderMode (int mode); - }; } #endif diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 095323dea1..df4eab336f 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -22,13 +22,14 @@ namespace MWRender { -RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem2::path& resDir) :rend(_rend) +RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir) :rend(_rend) { - camera = rend.getCamera(); - mSkyManager = MWRender::SkyManager::create(rend.getWindow(), camera, resDir); - + + + //std::cout << "ONE"; rend.createScene("PlayerCam", 55, 5); + mSkyManager = MWRender::SkyManager::create(rend.getWindow(), getCamera(), resDir); // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipmaps(5); @@ -41,7 +42,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const // the screen (when x is to the right.) This is the orientation that // Morrowind uses, and it automagically makes everything work as it // should. - + //std::cout << "TWO"; SceneNode *rt = rend.getScene()->getRootSceneNode(); mwRoot = rt->createChildSceneNode(); mwRoot->pitch(Degree(-90)); @@ -53,16 +54,17 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const playerNode->pitch(Degree(90)); Ogre::SceneNode *cameraYawNode = playerNode->createChildSceneNode(); Ogre::SceneNode *cameraPitchNode = cameraYawNode->createChildSceneNode(); - cameraPitchNode->attachObject(camera); - - - mPlayer = new MWRender::Player (camera, playerNode->getName()); + cameraPitchNode->attachObject(getCamera()); + std::cout <<"TWOF\n"; + mPlayer = new MWRender::Player (getCamera(), playerNode->getName()); + //std::cout << "Three"; } RenderingManager::~RenderingManager () { + delete mPlayer; delete mSkyManager; } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 8c76f8f26f..f7b5f80eb4 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -52,7 +52,7 @@ class RenderingManager { MWRender::Player *mPlayer; public: - RenderingManager(OEngine::Render::OgreRenderer& _rend, const boost::filesystem2::path& resDir); + RenderingManager(OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir); ~RenderingManager(); void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? @@ -77,7 +77,11 @@ class RenderingManager { int skyGetMasserPhase() const; int skyGetSecundaPhase() const; void skySetMoonColour (bool red); - + Ogre::SceneManager *getMgr() { return rend.getScene(); } + Ogre::Camera *getCamera() { return rend.getCamera(); } + Ogre::Viewport *getViewport() { return rend.getViewport(); } + Ogre::SceneNode *getRoot() { return mwRoot; } + MWRender::Player *getPlayer() { return mPlayer; } private: SkyManager* mSkyManager; diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index da9bff6b2e..a0fe0e6100 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -137,7 +137,7 @@ namespace MWWorld { Ptr::CellStore *cell = mWorld->getExterior(x, y); - loadCell (cell, new MWRender::ExteriorCellRender (*cell, mEnvironment, mScene, mPhysics)); + loadCell (cell, new MWRender::ExteriorCellRender (*cell, mEnvironment, mRendering, mPhysics)); } } @@ -168,8 +168,8 @@ namespace MWWorld mCellChanged = true; } - Scene::Scene (Environment& environment, World *world, MWRender::MWScene& scene, PhysicsSystem *physics) - : mScene (scene), mCurrentCell (0), + Scene::Scene (Environment& environment, World *world, MWRender::RenderingManager& rm, PhysicsSystem *physics) + : mRendering(rm), mCurrentCell (0), mCellChanged (false), mEnvironment (environment), mWorld(world), mPhysics(physics) { } @@ -205,7 +205,7 @@ namespace MWWorld std::cout << "cellName:" << cellName << std::endl; Ptr::CellStore *cell = mWorld->getInterior(cellName); - loadCell (cell, new MWRender::InteriorCellRender (*cell, mEnvironment, mScene, mPhysics)); + loadCell (cell, new MWRender::InteriorCellRender (*cell, mEnvironment, mRendering, mPhysics)); // adjust player mCurrentCell = cell; diff --git a/apps/openmw/mwworld/scene.hpp b/apps/openmw/mwworld/scene.hpp index 9e43a98a5e..8612c707bd 100644 --- a/apps/openmw/mwworld/scene.hpp +++ b/apps/openmw/mwworld/scene.hpp @@ -14,7 +14,7 @@ #include "refdata.hpp" #include "ptr.hpp" #include "globals.hpp" - +#include "../mwrender/renderingmanager.hpp" #include namespace Ogre @@ -57,7 +57,7 @@ namespace MWWorld private: - MWRender::MWScene& mScene; + MWRender::RenderingManager mRendering; Ptr::CellStore *mCurrentCell; // the cell, the player is in CellRenderCollection mActiveCells; bool mCellChanged; @@ -69,7 +69,7 @@ namespace MWWorld bool adjustPlayerPos = true); public: - Scene (Environment& environment, World *world, MWRender::MWScene& scene, PhysicsSystem *physics); + Scene (Environment& environment, World *world, MWRender::RenderingManager& rm, PhysicsSystem *physics); ~Scene(); diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 4174e64579..fbc702b0ad 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -176,8 +176,8 @@ namespace MWWorld const Files::Collections& fileCollections, const std::string& master, const boost::filesystem::path& resDir, bool newGame, Environment& environment, const std::string& encoding) - : mScene (renderer,physEng), mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), - mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) + : mRendering (renderer,resDir), mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), + mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this), mDebugging(physEng) { mPhysEngine = physEng; @@ -192,7 +192,7 @@ namespace MWWorld mEsm.open (masterPath.string()); mStore.load (mEsm); - mPlayer = new MWWorld::Player (mScene.getPlayer(), mStore.npcs.find ("player"), *this); + mPlayer = new MWWorld::Player (mRendering.getPlayer(), mStore.npcs.find ("player"), *this); mPhysics->addActor (mPlayer->getPlayer().getRefData().getHandle(), "", Ogre::Vector3 (0, 0, 0)); // global variables @@ -206,9 +206,8 @@ namespace MWWorld mPhysEngine = physEng; - mWorldScene = new Scene(environment, this, mScene, mPhysics); - mRenderingManager = new MWRender::RenderingManager(renderer, - resDir); + mWorldScene = new Scene(environment, this, mRendering, mPhysics); + } World::~World() @@ -397,7 +396,7 @@ namespace MWWorld mGlobalVariables->setFloat ("gamehour", hour); - mRenderingManager->skySetHour (hour); + mRendering.skySetHour (hour); if (days>0) setDay (days + mGlobalVariables->getInt ("day")); @@ -432,7 +431,7 @@ namespace MWWorld mGlobalVariables->setInt ("day", day); mGlobalVariables->setInt ("month", month); - mRenderingManager->skySetDate (day, month); + mRendering.skySetDate (day, month); } void World::setMonth (int month) @@ -453,7 +452,7 @@ namespace MWWorld if (years>0) mGlobalVariables->setInt ("year", years+mGlobalVariables->getInt ("year")); - mRenderingManager->skySetDate (mGlobalVariables->getInt ("day"), month); + mRendering.skySetDate (mGlobalVariables->getInt ("day"), month); } bool World::toggleSky() @@ -461,34 +460,34 @@ namespace MWWorld if (mSky) { mSky = false; - mRenderingManager->skyDisable(); + mRendering.skyDisable(); return false; } else { mSky = true; // TODO check for extorior or interior with sky. - mRenderingManager->skySetHour (mGlobalVariables->getFloat ("gamehour")); - mRenderingManager->skySetDate (mGlobalVariables->getInt ("day"), + mRendering.skySetHour (mGlobalVariables->getFloat ("gamehour")); + mRendering.skySetDate (mGlobalVariables->getInt ("day"), mGlobalVariables->getInt ("month")); - mRenderingManager->skyEnable(); + mRendering.skyEnable(); return true; } } int World::getMasserPhase() const { - return mRenderingManager->skyGetMasserPhase(); + return mRendering.skyGetMasserPhase(); } int World::getSecundaPhase() const { - return mRenderingManager->skyGetSecundaPhase(); + return mRendering.skyGetSecundaPhase(); } void World::setMoonColour (bool red) { - mRenderingManager->skySetMoonColour (red); + mRendering.skySetMoonColour (red); } float World::getTimeScaleFactor() const @@ -513,7 +512,7 @@ namespace MWWorld std::string World::getFacedHandle() { - std::pair result = mScene.getFacedHandle (*this); + std::pair result = mPhysics->getFacedHandle (*this); if (result.first.empty() || result.second>getStore().gameSettings.find ("iMaxActivateDist")->i) @@ -577,7 +576,7 @@ namespace MWWorld // \todo cell change for non-player ref // \todo this should go into the new scene class and eventually into the objects/actors classes. - mScene.getMgr()->getSceneNode (ptr.getRefData().getHandle())-> + mRendering.getMgr()->getSceneNode (ptr.getRefData().getHandle())-> setPosition (Ogre::Vector3 (x, y, z)); } @@ -652,7 +651,7 @@ namespace MWWorld bool World::toggleRenderMode (RenderMode mode) { - return mScene.toggleRenderMode (mode); + return mDebugging.toggleRenderMode (mode); } std::pair World::createRecord (const ESM::Potion& record) diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index e661ef362a..5d196278a7 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -65,7 +65,8 @@ namespace MWWorld private: - MWRender::MWScene mScene; + MWRender::RenderingManager mRendering; + MWRender::Debugging mDebugging; MWWorld::Scene *mWorldScene; MWWorld::Player *mPlayer; ESM::ESMReader mEsm; @@ -75,7 +76,6 @@ namespace MWWorld MWWorld::PhysicsSystem *mPhysics; bool mSky; Environment& mEnvironment; - MWRender::RenderingManager *mRenderingManager; int mNextDynamicRecord; Cells mCells; From 0c8aa7fae33c94b4d166693c96e2b8ea9116901a Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Mon, 24 Oct 2011 13:55:10 -0400 Subject: [PATCH 11/55] Removing Object: --- apps/openmw/engine.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 90b476df7d..03ec4a479d 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -83,8 +83,6 @@ void OMW::Engine::updateFocusReport (float duration) if (!ptr.isEmpty()){ name = MWWorld::Class::get (ptr).getName (ptr); - if (!name.empty()) - std::cout << "Object: " << name << std::endl; } } From 965ff245977009ad3f2906ed16ed8be75249f48f Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Mon, 24 Oct 2011 13:57:12 -0400 Subject: [PATCH 12/55] Removing Object: --- apps/openmw/engine.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index 03ec4a479d..e8c324e9a6 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -288,7 +288,6 @@ void OMW::Engine::setReportFocus (bool report) void OMW::Engine::go() { mFocusTDiff = 0; - mReportFocus = true; assert (!mEnvironment.mWorld); assert (!mCellName.empty()); assert (!mMaster.empty()); From d4f63443e643975b59d2dcbe6f35bc08739815b0 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Mon, 24 Oct 2011 22:11:36 -0400 Subject: [PATCH 13/55] Hiding the rendering manager; crash eliminated --- apps/openmw/mwrender/exterior.cpp | 44 ++++++++++++----------- apps/openmw/mwrender/exterior.hpp | 5 +-- apps/openmw/mwrender/interior.cpp | 32 ++++++++--------- apps/openmw/mwrender/interior.hpp | 8 +++-- apps/openmw/mwrender/renderingmanager.cpp | 7 ++-- apps/openmw/mwrender/renderingmanager.hpp | 3 +- apps/openmw/mwworld/scene.cpp | 10 +++--- apps/openmw/mwworld/scene.hpp | 5 +-- apps/openmw/mwworld/world.cpp | 8 +++-- 9 files changed, 66 insertions(+), 56 deletions(-) diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index 9cc8fd5641..358e19a7c2 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -35,11 +35,13 @@ bool ExteriorCellRender::lightOutQuadInLin = false; int ExteriorCellRender::uniqueID = 0; ExteriorCellRender::ExteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, - RenderingManager &_rendering, MWWorld::PhysicsSystem *physics) - : mCell(_cell), mEnvironment (environment), mRendering(_rendering), mPhysics(physics), mBase(NULL), mInsert(NULL), mAmbientMode (0) + OEngine::Render::OgreRenderer& renderer, Ogre::SceneNode *mwRoot,MWWorld::PhysicsSystem *physics) + : mCell(_cell), mEnvironment (environment), mRenderer(renderer), mPhysics(physics), mBase(NULL), mInsert(NULL), mAmbientMode (0) { + mMwRoot = mwRoot; uniqueID = uniqueID +1; - sg = mRendering.getMgr()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); + sg = mRenderer.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); + } @@ -127,7 +129,7 @@ void ExteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, mNpcPart = parent->createChildSceneNode(sceneNodeName); MeshPtr good2 = NifOgre::NIFLoader::load(mesh); - MovableObject *ent = mRendering.getMgr()->createEntity(mesh); + MovableObject *ent = mRenderer.getScene()->createEntity(mesh); if(translateFirst){ @@ -215,7 +217,7 @@ void ExteriorCellRender::insertMesh(const std::string &mesh) assert (mInsert); NifOgre::NIFLoader::load(mesh); - Entity *ent = mRendering.getMgr()->createEntity(mesh); + Entity *ent = mRenderer.getScene()->createEntity(mesh); if(!isStatic) { @@ -225,7 +227,7 @@ void ExteriorCellRender::insertMesh(const std::string &mesh) { sg->addEntity(ent,mInsert->_getDerivedPosition(),mInsert->_getDerivedOrientation(),mInsert->_getDerivedScale()); sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); - mRendering.getMgr()->destroyEntity(ent); + mRenderer.getScene()->destroyEntity(ent); } if (mInsertMesh.empty()) mInsertMesh = mesh; @@ -250,7 +252,7 @@ void ExteriorCellRender::insertLight(float r, float g, float b, float radius) { assert (mInsert); - Ogre::Light *light = mRendering.getMgr()->createLight(); + Ogre::Light *light = mRenderer.getScene()->createLight(); light->setDiffuseColour (r, g, b); float cval=0.0f, lval=0.0f, qval=0.0f; @@ -306,7 +308,7 @@ void ExteriorCellRender::configureAmbient() // Create a "sun" that shines light downwards. It doesn't look // completely right, but leave it for now. - Ogre::Light *light = mRendering.getMgr()->createLight(); + Ogre::Light *light = mRenderer.getScene()->createLight(); Ogre::ColourValue colour; colour.setAsABGR (mCell.cell->ambi.sunlight); light->setDiffuseColour (colour); @@ -323,9 +325,9 @@ void ExteriorCellRender::configureFog() float high = 4500 + 9000 * (1-mCell.cell->ambi.fogDensity); float low = 200; - mRendering.getMgr()->setFog (FOG_LINEAR, color, 0, low, high); - mRendering.getCamera()->setFarClipDistance (high + 10); - mRendering.getViewport()->setBackgroundColour (color); + mRenderer.getScene()->setFog (FOG_LINEAR, color, 0, low, high); + mRenderer.getCamera()->setFarClipDistance (high + 10); + mRenderer.getViewport()->setBackgroundColour (color); } void ExteriorCellRender::setAmbientMode() @@ -334,17 +336,17 @@ void ExteriorCellRender::setAmbientMode() { case 0: - mRendering.getMgr()->setAmbientLight(mAmbientColor); + mRenderer.getScene()->setAmbientLight(mAmbientColor); break; case 1: - mRendering.getMgr()->setAmbientLight(0.7f*mAmbientColor + 0.3f*ColourValue(1,1,1)); + mRenderer.getScene()->setAmbientLight(0.7f*mAmbientColor + 0.3f*ColourValue(1,1,1)); break; case 2: - mRendering.getMgr()->setAmbientLight(ColourValue(1,1,1)); + mRenderer.getScene()->setAmbientLight(ColourValue(1,1,1)); break; } } @@ -352,7 +354,7 @@ void ExteriorCellRender::setAmbientMode() void ExteriorCellRender::show() { // FIXME: this one may be the bug - mBase = mRendering.getRoot()->createChildSceneNode(); + mBase = mMwRoot->createChildSceneNode(); configureAmbient(); configureFog(); @@ -401,14 +403,14 @@ void ExteriorCellRender::destroy() { destroyAllAttachedMovableObjects(mBase); mBase->removeAndDestroyAllChildren(); - mRendering.getMgr()->destroySceneNode(mBase); + mRenderer.getScene()->destroySceneNode(mBase); } mBase = 0; if (sg) { - mRendering.getMgr()->destroyStaticGeometry (sg); + mRenderer.getScene()->destroyStaticGeometry (sg); sg = 0; } } @@ -435,21 +437,21 @@ void ExteriorCellRender::toggleLight() void ExteriorCellRender::enable (const std::string& handle) { if (!handle.empty()) - mRendering.getMgr()->getSceneNode (handle)->setVisible (true); + mRenderer.getScene()->getSceneNode (handle)->setVisible (true); } void ExteriorCellRender::disable (const std::string& handle) { if (!handle.empty()) - mRendering.getMgr()->getSceneNode (handle)->setVisible (false); + mRenderer.getScene()->getSceneNode (handle)->setVisible (false); } void ExteriorCellRender::deleteObject (const std::string& handle) { if (!handle.empty()) { - Ogre::SceneNode *node = mRendering.getMgr()->getSceneNode (handle); + Ogre::SceneNode *node = mRenderer.getScene()->getSceneNode (handle); node->removeAndDestroyAllChildren(); - mRendering.getMgr()->destroySceneNode (node); + mRenderer.getScene()->destroySceneNode (node); } } diff --git a/apps/openmw/mwrender/exterior.hpp b/apps/openmw/mwrender/exterior.hpp index 17973db468..c736251287 100644 --- a/apps/openmw/mwrender/exterior.hpp +++ b/apps/openmw/mwrender/exterior.hpp @@ -49,7 +49,8 @@ namespace MWRender ESMS::CellStore &mCell; MWWorld::Environment &mEnvironment; - RenderingManager &mRendering; + OEngine::Render::OgreRenderer& mRenderer; + Ogre::SceneNode *mMwRoot; MWWorld::PhysicsSystem *mPhysics; /// The scene node that contains all objects belonging to this @@ -103,7 +104,7 @@ namespace MWRender public: ExteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, - RenderingManager &_rendering, MWWorld::PhysicsSystem *physics); + OEngine::Render::OgreRenderer& renderer, Ogre::SceneNode *mwRoot, MWWorld::PhysicsSystem *physics); virtual ~ExteriorCellRender() { destroy(); } diff --git a/apps/openmw/mwrender/interior.cpp b/apps/openmw/mwrender/interior.cpp index 13149eb555..cbbab484aa 100644 --- a/apps/openmw/mwrender/interior.cpp +++ b/apps/openmw/mwrender/interior.cpp @@ -109,7 +109,7 @@ void InteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, MeshPtr good2 = NifOgre::NIFLoader::load(mesh); - MovableObject *ent = mRendering.getMgr()->createEntity(mesh); + MovableObject *ent = mRenderer.getScene()->createEntity(mesh); //ent->extr // MovableObject *ent2 = scene.getMgr()->createEntity(bounds @@ -186,7 +186,7 @@ void InteriorCellRender::insertMesh(const std::string &mesh) assert (insert); NifOgre::NIFLoader::load(mesh); - MovableObject *ent = mRendering.getMgr()->createEntity(mesh); + MovableObject *ent = mRenderer.getScene()->createEntity(mesh); insert->attachObject(ent); if (mInsertMesh.empty()) @@ -212,7 +212,7 @@ void InteriorCellRender::insertLight(float r, float g, float b, float radius) { assert (insert); - Ogre::Light *light = mRendering.getMgr()->createLight(); + Ogre::Light *light = mRenderer.getScene()->createLight(); light->setDiffuseColour (r, g, b); float cval=0.0f, lval=0.0f, qval=0.0f; @@ -268,7 +268,7 @@ void InteriorCellRender::configureAmbient() // Create a "sun" that shines light downwards. It doesn't look // completely right, but leave it for now. - Ogre::Light *light = mRendering.getMgr()->createLight(); + Ogre::Light *light = mRenderer.getScene()->createLight(); Ogre::ColourValue colour; colour.setAsABGR (cell.cell->ambi.sunlight); light->setDiffuseColour (colour); @@ -285,9 +285,9 @@ void InteriorCellRender::configureFog() float high = 4500 + 9000 * (1-cell.cell->ambi.fogDensity); float low = 200; - mRendering.getMgr()->setFog (FOG_LINEAR, color, 0, low, high); - mRendering.getCamera()->setFarClipDistance (high + 10); - mRendering.getViewport()->setBackgroundColour (color); + mRenderer.getScene()->setFog (FOG_LINEAR, color, 0, low, high); + mRenderer.getCamera()->setFarClipDistance (high + 10); + mRenderer.getViewport()->setBackgroundColour (color); } void InteriorCellRender::setAmbientMode() @@ -296,24 +296,24 @@ void InteriorCellRender::setAmbientMode() { case 0: - mRendering.getMgr()->setAmbientLight(ambientColor); + mRenderer.getScene()->setAmbientLight(ambientColor); break; case 1: - mRendering.getMgr()->setAmbientLight(0.7f*ambientColor + 0.3f*ColourValue(1,1,1)); + mRenderer.getScene()->setAmbientLight(0.7f*ambientColor + 0.3f*ColourValue(1,1,1)); break; case 2: - mRendering.getMgr()->setAmbientLight(ColourValue(1,1,1)); + mRenderer.getScene()->setAmbientLight(ColourValue(1,1,1)); break; } } void InteriorCellRender::show() { - base = mRendering.getRoot()->createChildSceneNode(); + base = mMwRoot->createChildSceneNode(); configureAmbient(); configureFog(); @@ -332,7 +332,7 @@ void InteriorCellRender::destroy() if(base) { base->removeAndDestroyAllChildren(); - mRendering.getMgr()->destroySceneNode(base); + mRenderer.getScene()->destroySceneNode(base); } base = NULL; @@ -360,22 +360,22 @@ void InteriorCellRender::toggleLight() void InteriorCellRender::enable (const std::string& handle) { if (!handle.empty()) - mRendering.getMgr()->getSceneNode (handle)->setVisible (true); + mRenderer.getScene()->getSceneNode (handle)->setVisible (true); } void InteriorCellRender::disable (const std::string& handle) { if (!handle.empty()) - mRendering.getMgr()->getSceneNode (handle)->setVisible (false); + mRenderer.getScene()->getSceneNode (handle)->setVisible (false); } void InteriorCellRender::deleteObject (const std::string& handle) { if (!handle.empty()) { - Ogre::SceneNode *node = mRendering.getMgr()->getSceneNode (handle); + Ogre::SceneNode *node = mRenderer.getScene()->getSceneNode (handle); node->removeAndDestroyAllChildren(); - mRendering.getMgr()->destroySceneNode (node); + mRenderer.getScene()->destroySceneNode (node); } } diff --git a/apps/openmw/mwrender/interior.hpp b/apps/openmw/mwrender/interior.hpp index 9329d5b79e..237d689c46 100644 --- a/apps/openmw/mwrender/interior.hpp +++ b/apps/openmw/mwrender/interior.hpp @@ -48,7 +48,8 @@ namespace MWRender ESMS::CellStore &cell; MWWorld::Environment &mEnvironment; - MWRender::RenderingManager &mRendering; + OEngine::Render::OgreRenderer& mRenderer; + Ogre::SceneNode *mMwRoot; MWWorld::PhysicsSystem *mPhysics; /// The scene node that contains all objects belonging to this @@ -95,9 +96,10 @@ namespace MWRender public: InteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, - RenderingManager &_rendering, MWWorld::PhysicsSystem *physics) - : cell(_cell), mEnvironment (environment), mRendering(_rendering), base(NULL), insert(NULL), ambientMode (0) + OEngine::Render::OgreRenderer& renderer, Ogre::SceneNode *mwRoot, MWWorld::PhysicsSystem *physics) + : cell(_cell), mEnvironment (environment), mRenderer(renderer), base(NULL), insert(NULL), ambientMode (0) { + mMwRoot = mwRoot; mPhysics = physics; } diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index df4eab336f..46cf89edc5 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -29,7 +29,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const //std::cout << "ONE"; rend.createScene("PlayerCam", 55, 5); - mSkyManager = MWRender::SkyManager::create(rend.getWindow(), getCamera(), resDir); + mSkyManager = MWRender::SkyManager::create(rend.getWindow(), rend.getCamera(), resDir); // Set default mipmap level (NB some APIs ignore this) TextureManager::getSingleton().setDefaultNumMipmaps(5); @@ -54,10 +54,9 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const playerNode->pitch(Degree(90)); Ogre::SceneNode *cameraYawNode = playerNode->createChildSceneNode(); Ogre::SceneNode *cameraPitchNode = cameraYawNode->createChildSceneNode(); - cameraPitchNode->attachObject(getCamera()); - std::cout <<"TWOF\n"; + cameraPitchNode->attachObject(rend.getCamera()); - mPlayer = new MWRender::Player (getCamera(), playerNode->getName()); + mPlayer = new MWRender::Player (rend.getCamera(), playerNode->getName()); //std::cout << "Three"; } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index f7b5f80eb4..dcac7625dd 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -77,9 +77,8 @@ class RenderingManager { int skyGetMasserPhase() const; int skyGetSecundaPhase() const; void skySetMoonColour (bool red); + OEngine::Render::OgreRenderer& getOgreRenderer(){return rend;} Ogre::SceneManager *getMgr() { return rend.getScene(); } - Ogre::Camera *getCamera() { return rend.getCamera(); } - Ogre::Viewport *getViewport() { return rend.getViewport(); } Ogre::SceneNode *getRoot() { return mwRoot; } MWRender::Player *getPlayer() { return mPlayer; } private: diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index a0fe0e6100..4f425ac65d 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -137,7 +137,7 @@ namespace MWWorld { Ptr::CellStore *cell = mWorld->getExterior(x, y); - loadCell (cell, new MWRender::ExteriorCellRender (*cell, mEnvironment, mRendering, mPhysics)); + loadCell (cell, new MWRender::ExteriorCellRender (*cell, mEnvironment, mRenderer, mMwRoot, mPhysics)); } } @@ -168,10 +168,12 @@ namespace MWWorld mCellChanged = true; } - Scene::Scene (Environment& environment, World *world, MWRender::RenderingManager& rm, PhysicsSystem *physics) - : mRendering(rm), mCurrentCell (0), + //We need the ogre renderer and a scene node. + Scene::Scene (Environment& environment, World *world, OEngine::Render::OgreRenderer& renderer, Ogre::SceneNode *mwRoot, PhysicsSystem *physics) + : mRenderer(renderer), mCurrentCell (0), mCellChanged (false), mEnvironment (environment), mWorld(world), mPhysics(physics) { + mMwRoot = mwRoot; } Scene::~Scene() @@ -205,7 +207,7 @@ namespace MWWorld std::cout << "cellName:" << cellName << std::endl; Ptr::CellStore *cell = mWorld->getInterior(cellName); - loadCell (cell, new MWRender::InteriorCellRender (*cell, mEnvironment, mRendering, mPhysics)); + loadCell (cell, new MWRender::InteriorCellRender (*cell, mEnvironment, mRenderer, mMwRoot, mPhysics)); // adjust player mCurrentCell = cell; diff --git a/apps/openmw/mwworld/scene.hpp b/apps/openmw/mwworld/scene.hpp index 8612c707bd..68b65adfaf 100644 --- a/apps/openmw/mwworld/scene.hpp +++ b/apps/openmw/mwworld/scene.hpp @@ -57,7 +57,8 @@ namespace MWWorld private: - MWRender::RenderingManager mRendering; + OEngine::Render::OgreRenderer& mRenderer; + Ogre::SceneNode *mMwRoot; Ptr::CellStore *mCurrentCell; // the cell, the player is in CellRenderCollection mActiveCells; bool mCellChanged; @@ -69,7 +70,7 @@ namespace MWWorld bool adjustPlayerPos = true); public: - Scene (Environment& environment, World *world, MWRender::RenderingManager& rm, PhysicsSystem *physics); + Scene (Environment& environment, World *world, OEngine::Render::OgreRenderer& renderer, Ogre::SceneNode *mwRoot, PhysicsSystem *physics); ~Scene(); diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index fbc702b0ad..1949b6731f 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -179,6 +179,7 @@ namespace MWWorld : mRendering (renderer,resDir), mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this), mDebugging(physEng) { + std::cout << "Creating myworld\n"; mPhysEngine = physEng; mPhysics = new PhysicsSystem(renderer, physEng); @@ -206,7 +207,8 @@ namespace MWWorld mPhysEngine = physEng; - mWorldScene = new Scene(environment, this, mRendering, mPhysics); + mWorldScene = new Scene(environment, this, mRendering.getOgreRenderer(), mRendering.getRoot(), mPhysics); + std::cout << "After mworldscene\n"; } @@ -214,8 +216,10 @@ namespace MWWorld { delete mWorldScene; delete mGlobalVariables; - delete mPlayer; + delete mPhysics; + + delete mPlayer; } const ESM::Cell *World::getExterior (const std::string& cellName) const From c3a492bf7463dd38e4a2240902b5b6fdd5f6d6e4 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Tue, 25 Oct 2011 14:06:44 -0400 Subject: [PATCH 14/55] Debugging file renamed --- apps/openmw/CMakeLists.txt | 4 ++-- apps/openmw/mwrender/{mwscene.cpp => debugging.cpp} | 2 +- apps/openmw/mwrender/{mwscene.hpp => debugging.hpp} | 0 apps/openmw/mwrender/exterior.cpp | 2 -- apps/openmw/mwrender/interior.cpp | 1 - apps/openmw/mwworld/scene.hpp | 1 - apps/openmw/mwworld/world.cpp | 1 - apps/openmw/mwworld/world.hpp | 2 +- 8 files changed, 4 insertions(+), 9 deletions(-) rename apps/openmw/mwrender/{mwscene.cpp => debugging.cpp} (97%) rename apps/openmw/mwrender/{mwscene.hpp => debugging.hpp} (100%) diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 9510273af6..86e0adc8df 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -17,7 +17,7 @@ source_group(game FILES ${GAME} ${GAME_HEADER}) set(GAMEREND mwrender/renderingmanager.cpp - mwrender/mwscene.cpp + mwrender/debugging.cpp mwrender/cellimp.cpp mwrender/interior.cpp mwrender/exterior.cpp @@ -28,7 +28,7 @@ set(GAMEREND_HEADER mwrender/renderingmanager.hpp mwrender/cell.hpp mwrender/cellimp.hpp - mwrender/mwscene.hpp + mwrender/debugging.hpp mwrender/interior.hpp mwrender/exterior.hpp mwrender/sky.hpp diff --git a/apps/openmw/mwrender/mwscene.cpp b/apps/openmw/mwrender/debugging.cpp similarity index 97% rename from apps/openmw/mwrender/mwscene.cpp rename to apps/openmw/mwrender/debugging.cpp index 0201c82080..60b299acd1 100644 --- a/apps/openmw/mwrender/mwscene.cpp +++ b/apps/openmw/mwrender/debugging.cpp @@ -1,4 +1,4 @@ -#include "mwscene.hpp" +#include "debugging.hpp" #include diff --git a/apps/openmw/mwrender/mwscene.hpp b/apps/openmw/mwrender/debugging.hpp similarity index 100% rename from apps/openmw/mwrender/mwscene.hpp rename to apps/openmw/mwrender/debugging.hpp diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp index 358e19a7c2..1118156ba8 100644 --- a/apps/openmw/mwrender/exterior.cpp +++ b/apps/openmw/mwrender/exterior.cpp @@ -8,9 +8,7 @@ #include #include -#include "mwscene.hpp" #include -#include "mwscene.hpp" #include using namespace MWRender; diff --git a/apps/openmw/mwrender/interior.cpp b/apps/openmw/mwrender/interior.cpp index cbbab484aa..aa13f22929 100644 --- a/apps/openmw/mwrender/interior.cpp +++ b/apps/openmw/mwrender/interior.cpp @@ -9,7 +9,6 @@ #include #include -#include "mwscene.hpp" #include #include diff --git a/apps/openmw/mwworld/scene.hpp b/apps/openmw/mwworld/scene.hpp index 68b65adfaf..6af86a0711 100644 --- a/apps/openmw/mwworld/scene.hpp +++ b/apps/openmw/mwworld/scene.hpp @@ -8,7 +8,6 @@ #include -#include "../mwrender/mwscene.hpp" #include "physicssystem.hpp" #include "refdata.hpp" diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 1949b6731f..dfacffc5b5 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -208,7 +208,6 @@ namespace MWWorld mPhysEngine = physEng; mWorldScene = new Scene(environment, this, mRendering.getOgreRenderer(), mRendering.getRoot(), mPhysics); - std::cout << "After mworldscene\n"; } diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index 5d196278a7..b1ce69b3d0 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -8,7 +8,7 @@ #include -#include "../mwrender/mwscene.hpp" +#include "../mwrender/debugging.hpp" #include "../mwrender/renderingmanager.hpp" #include "refdata.hpp" From 33ecd8b66cb7b5a313b2c8ca5b3905cc2c4c442f Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 29 Oct 2011 09:50:11 +0200 Subject: [PATCH 15/55] fixed collision toggling bug --- apps/openmw/mwworld/physicssystem.cpp | 41 +++++++++++++++------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/apps/openmw/mwworld/physicssystem.cpp b/apps/openmw/mwworld/physicssystem.cpp index b06fa1a48b..067c42151a 100644 --- a/apps/openmw/mwworld/physicssystem.cpp +++ b/apps/openmw/mwworld/physicssystem.cpp @@ -1,3 +1,5 @@ +#include + #include "physicssystem.hpp" #include "../mwworld/ptr.hpp" #include "../mwworld/world.hpp" // FIXME @@ -154,28 +156,31 @@ namespace MWWorld { for(std::map::iterator it = mEngine->PhysicActorMap.begin(); it != mEngine->PhysicActorMap.end();it++) { - OEngine::Physic::PhysicActor* act = it->second; - bool cmode = act->getCollisionMode(); - if(cmode) + if (it->first=="player") { - act->enableCollisions(false); - act->setGravity(0.); - act->setVerticalVelocity(0); - mFreeFly = true; - return false; - } - else - { - mFreeFly = false; - act->enableCollisions(true); - act->setGravity(4.); - act->setVerticalVelocity(0); - return true; + OEngine::Physic::PhysicActor* act = it->second; + + bool cmode = act->getCollisionMode(); + if(cmode) + { + act->enableCollisions(false); + act->setGravity(0.); + act->setVerticalVelocity(0); + mFreeFly = true; + return false; + } + else + { + mFreeFly = false; + act->enableCollisions(true); + act->setGravity(4.); + act->setVerticalVelocity(0); + return true; + } } } - return false; // This should never happen, but it shall not bother us now, since - // this part of the code needs a rewrite anyway. + throw std::logic_error ("can't find player"); } } From 583e7221efb0733f6d92f6aa0244cc2d0e9a55cb Mon Sep 17 00:00:00 2001 From: Marc Zinnschlag Date: Sat, 29 Oct 2011 09:55:22 +0200 Subject: [PATCH 16/55] silenced a warning and removed some tabs --- apps/openmw/mwworld/world.cpp | 14 +++++++------- apps/openmw/mwworld/world.hpp | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index dfacffc5b5..fafea5e129 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -176,10 +176,10 @@ namespace MWWorld const Files::Collections& fileCollections, const std::string& master, const boost::filesystem::path& resDir, bool newGame, Environment& environment, const std::string& encoding) - : mRendering (renderer,resDir), mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), - mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this), mDebugging(physEng) + : mRendering (renderer,resDir), mDebugging(physEng), mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), + mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) { - std::cout << "Creating myworld\n"; + std::cout << "Creating myworld\n"; mPhysEngine = physEng; mPhysics = new PhysicsSystem(renderer, physEng); @@ -208,17 +208,17 @@ namespace MWWorld mPhysEngine = physEng; mWorldScene = new Scene(environment, this, mRendering.getOgreRenderer(), mRendering.getRoot(), mPhysics); - + } World::~World() { delete mWorldScene; delete mGlobalVariables; - + delete mPhysics; - - delete mPlayer; + + delete mPlayer; } const ESM::Cell *World::getExterior (const std::string& cellName) const diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index b1ce69b3d0..b00b8deade 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -66,7 +66,7 @@ namespace MWWorld private: MWRender::RenderingManager mRendering; - MWRender::Debugging mDebugging; + MWRender::Debugging mDebugging; MWWorld::Scene *mWorldScene; MWWorld::Player *mPlayer; ESM::ESMReader mEsm; From 241cf2555d7f646297cbf13ac3386810e737b9a0 Mon Sep 17 00:00:00 2001 From: gugus Date: Sat, 29 Oct 2011 13:35:43 +0200 Subject: [PATCH 17/55] Fixe collision shape bug. --- components/nifbullet/bullet_nif_loader.cpp | 34 +++++----------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/components/nifbullet/bullet_nif_loader.cpp b/components/nifbullet/bullet_nif_loader.cpp index 32ca8c41c7..82e9d7adc5 100644 --- a/components/nifbullet/bullet_nif_loader.cpp +++ b/components/nifbullet/bullet_nif_loader.cpp @@ -231,7 +231,7 @@ void ManualBulletShapeLoader::handleNode(Nif::Node *node, int flags, else if (node->recType == Nif::RC_NiTriShape && (isCollisionNode || !hasCollisionNode)) { cShape->collide = true; - handleNiTriShape(dynamic_cast(node), flags,finalRot,finalPos,finalScale,raycastingOnly); + handleNiTriShape(dynamic_cast(node), flags,finalRot,finalPos,parentScale,raycastingOnly); } else if(node->recType == Nif::RC_RootCollisionNode) { @@ -269,27 +269,6 @@ void ManualBulletShapeLoader::handleNiTriShape(Nif::NiTriShape *shape, int flags // bother setting it up. return; - btTransform tr; - tr.setRotation(getbtQuat(parentRot)); - tr.setOrigin(btVector3(parentPos.x,parentPos.y,parentPos.z)); - - // Bounding box collision isn't implemented, always use mesh for now. - /*if (bbcollide) - { - return; - std::cout << "bbcolide?"; - //TODO: check whether it's half box or not (is there a /2?) - NodeShape = new btBoxShape(btVector3(shape->boundXYZ->array[0]/2.,shape->boundXYZ->array[1]/2.,shape->boundXYZ->array[2]/2.)); - std::cout << "bbcolide12121212121"; - currentShape->addChildShape(tr,NodeShape); - std::cout << "aaaaaaaaaaaaa"; - return; - collide = true; - bbcollide = false; - }*/ - - /* Do in-place transformation.the only needed transfo is the scale. (maybe not in fact) - */ Nif::NiTriShapeData *data = shape->data.getPtr(); @@ -298,10 +277,13 @@ void ManualBulletShapeLoader::handleNiTriShape(Nif::NiTriShape *shape, int flags for(unsigned int i=0; i < data->triangles.length; i = i+3) { - btVector3 b1(vertices[triangles[i+0]*3]*parentScale,vertices[triangles[i+0]*3+1]*parentScale,vertices[triangles[i+0]*3+2]*parentScale); - btVector3 b2(vertices[triangles[i+1]*3]*parentScale,vertices[triangles[i+1]*3+1]*parentScale,vertices[triangles[i+1]*3+2]*parentScale); - btVector3 b3(vertices[triangles[i+2]*3]*parentScale,vertices[triangles[i+2]*3+1]*parentScale,vertices[triangles[i+2]*3+2]*parentScale); - mTriMesh->addTriangle(b1,b2,b3); + Ogre::Vector3 b1(vertices[triangles[i+0]*3]*parentScale,vertices[triangles[i+0]*3+1]*parentScale,vertices[triangles[i+0]*3+2]*parentScale); + Ogre::Vector3 b2(vertices[triangles[i+1]*3]*parentScale,vertices[triangles[i+1]*3+1]*parentScale,vertices[triangles[i+1]*3+2]*parentScale); + Ogre::Vector3 b3(vertices[triangles[i+2]*3]*parentScale,vertices[triangles[i+2]*3+1]*parentScale,vertices[triangles[i+2]*3+2]*parentScale); + b1 = parentRot * b1 + parentPos; + b2 = parentRot * b2 + parentPos; + b3 = parentRot * b3 + parentPos; + mTriMesh->addTriangle(btVector3(b1.x,b1.y,b1.z),btVector3(b2.x,b2.y,b2.z),btVector3(b3.x,b3.y,b3.z)); } } From db734876235cdef88d8168b903c6476e78e0e12a Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 29 Oct 2011 18:52:57 -0400 Subject: [PATCH 18/55] Physics fix and cmake changes --- apps/openmw/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 4723ff1d74..54495063b1 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -16,7 +16,7 @@ set(GAME_HEADER source_group(game FILES ${GAME} ${GAME_HEADER}) add_openmw_dir (mwrender - rendering_manager mwscene cellimp interior exterior sky player + renderingmanager debugging cellimp interior exterior sky player ) add_openmw_dir (mwinput From 1083db5582d89e80be34940228a09bb97f970f2f Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sun, 30 Oct 2011 00:25:29 -0400 Subject: [PATCH 19/55] Hiding debugging --- apps/openmw/mwrender/renderingmanager.cpp | 5 ++++- apps/openmw/mwrender/renderingmanager.hpp | 5 ++++- apps/openmw/mwworld/world.cpp | 4 ++-- apps/openmw/mwworld/world.hpp | 2 +- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 46cf89edc5..89429d061e 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -22,7 +22,7 @@ namespace MWRender { -RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir) :rend(_rend) +RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine) :rend(_rend), mDebugging(engine) { @@ -134,5 +134,8 @@ void RenderingManager::skySetMoonColour (bool red) { mSkyManager->setMoonColour(red); } +bool RenderingManager::toggleRenderMode(int mode){ + return mDebugging.toggleRenderMode(mode); +} } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index dcac7625dd..917be1b229 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -3,6 +3,7 @@ #include "sky.hpp" +#include "debugging.hpp" #include #include @@ -50,10 +51,12 @@ class RenderingManager { OEngine::Physic::PhysicEngine* eng; MWRender::Player *mPlayer; + MWRender::Debugging mDebugging; public: - RenderingManager(OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir); + RenderingManager(OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine); ~RenderingManager(); + bool toggleRenderMode(int mode); void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index fafea5e129..2aadaae11b 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -176,7 +176,7 @@ namespace MWWorld const Files::Collections& fileCollections, const std::string& master, const boost::filesystem::path& resDir, bool newGame, Environment& environment, const std::string& encoding) - : mRendering (renderer,resDir), mDebugging(physEng), mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), + : mRendering (renderer,resDir, physEng),mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) { std::cout << "Creating myworld\n"; @@ -654,7 +654,7 @@ namespace MWWorld bool World::toggleRenderMode (RenderMode mode) { - return mDebugging.toggleRenderMode (mode); + return mRendering.toggleRenderMode (mode); } std::pair World::createRecord (const ESM::Potion& record) diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index b00b8deade..ca1759e00d 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -66,7 +66,7 @@ namespace MWWorld private: MWRender::RenderingManager mRendering; - MWRender::Debugging mDebugging; + MWWorld::Scene *mWorldScene; MWWorld::Player *mPlayer; ESM::ESMReader mEsm; From e1558e8e14cb22bcda807bf4ff8fee81b067e885 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sun, 30 Oct 2011 16:59:40 -0400 Subject: [PATCH 20/55] Changing refdata --- apps/openmw/mwworld/refdata.hpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwworld/refdata.hpp b/apps/openmw/mwworld/refdata.hpp index a9613248e6..af52ab2b00 100644 --- a/apps/openmw/mwworld/refdata.hpp +++ b/apps/openmw/mwworld/refdata.hpp @@ -22,7 +22,9 @@ namespace MWWorld { class RefData { - std::string mHandle; + Ogre::SceneNode* mHandle; + + std::string baseNode; MWScript::Locals mLocals; // if we find the overhead of heaving a locals // object in the refdata of refs without a script, @@ -43,12 +45,18 @@ namespace MWWorld public: - RefData() : mHasLocals (false), mEnabled (true), mCount (1) {} + RefData() : mHasLocals (false), mEnabled (true), mCount (1){ mHandle = 0;} - std::string getHandle() + Ogre::SceneNode* getHandle() { return mHandle; } + std::string getBaseNode(){ + return baseNode; + } + void setBaseNode(const std::string& node){ + baseNode = node; + } int getCount() const { @@ -64,10 +72,6 @@ namespace MWWorld } } - void setHandle (const std::string& handle) - { - mHandle = handle; - } void setCount (int count) { From 15fae749ae2fa3eec8543aeb7539f90fa37b99cb Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sun, 30 Oct 2011 17:31:49 -0400 Subject: [PATCH 21/55] Changing refdata2 --- apps/openmw/mwworld/refdata.hpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/apps/openmw/mwworld/refdata.hpp b/apps/openmw/mwworld/refdata.hpp index af52ab2b00..e64e3bf305 100644 --- a/apps/openmw/mwworld/refdata.hpp +++ b/apps/openmw/mwworld/refdata.hpp @@ -12,6 +12,7 @@ #include "../mwmechanics/movement.hpp" #include "containerstore.hpp" +#include namespace ESM { @@ -22,9 +23,8 @@ namespace MWWorld { class RefData { - Ogre::SceneNode* mHandle; + Ogre::SceneNode* mBaseNode; - std::string baseNode; MWScript::Locals mLocals; // if we find the overhead of heaving a locals // object in the refdata of refs without a script, @@ -45,18 +45,15 @@ namespace MWWorld public: - RefData() : mHasLocals (false), mEnabled (true), mCount (1){ mHandle = 0;} + RefData() : mHasLocals (false), mEnabled (true), mCount (1) {mBaseNode = 0;} - Ogre::SceneNode* getHandle() + std::string getHandle() { - return mHandle; + return mBaseNode->getName(); + } + void setSceneNode(Ogre::SceneNode* base){ + mBaseNode = base; } - std::string getBaseNode(){ - return baseNode; - } - void setBaseNode(const std::string& node){ - baseNode = node; - } int getCount() const { From 86d3cec1aa4c485746a2ab1f6b45731237e034f3 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sun, 30 Oct 2011 22:38:15 -0400 Subject: [PATCH 22/55] Changing refdata3 --- apps/openmw/mwworld/refdata.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/openmw/mwworld/refdata.hpp b/apps/openmw/mwworld/refdata.hpp index e64e3bf305..0abca5ac01 100644 --- a/apps/openmw/mwworld/refdata.hpp +++ b/apps/openmw/mwworld/refdata.hpp @@ -45,13 +45,13 @@ namespace MWWorld public: - RefData() : mHasLocals (false), mEnabled (true), mCount (1) {mBaseNode = 0;} + RefData() : mHasLocals (false), mEnabled (true), mCount (1),mBaseNode(0) {} std::string getHandle() { return mBaseNode->getName(); } - void setSceneNode(Ogre::SceneNode* base){ + void setBaseNode(Ogre::SceneNode* base){ mBaseNode = base; } From 3761271c59dcbb59400c1463e9c084f71c56e7c7 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Mon, 31 Oct 2011 00:04:06 -0400 Subject: [PATCH 23/55] Empty creature, objects, npc --- apps/openmw/mwrender/cellimp.hpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/openmw/mwrender/cellimp.hpp b/apps/openmw/mwrender/cellimp.hpp index 664fed64f0..9c600a5080 100644 --- a/apps/openmw/mwrender/cellimp.hpp +++ b/apps/openmw/mwrender/cellimp.hpp @@ -28,6 +28,15 @@ namespace MWRender /// Base class for cell render, that implements inserting references into a cell in a /// cell type- and render-engine-independent way. + class NPC{ + + }; + class Creature{ + + }; + class Obj{ + + }; class CellRenderImp { public: From f1bc5b0ab62d1b909ee84522451c01e87d843598 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Mon, 31 Oct 2011 23:59:16 -0400 Subject: [PATCH 24/55] Objects started, RenderingInterface --- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwrender/cellimp.hpp | 9 --------- apps/openmw/mwrender/creatures.cpp | 2 ++ apps/openmw/mwrender/creatures.hpp | 5 +++++ apps/openmw/mwrender/npcs.cpp | 2 ++ apps/openmw/mwrender/npcs.hpp | 5 +++++ apps/openmw/mwrender/objects.cpp | 16 +++++++++++++++ apps/openmw/mwrender/objects.hpp | 18 +++++++++++++++++ apps/openmw/mwrender/renderingmanager.cpp | 15 ++++++++++++++ apps/openmw/mwrender/renderingmanager.hpp | 24 +++++++++++++++++++---- 10 files changed, 84 insertions(+), 14 deletions(-) create mode 100644 apps/openmw/mwrender/creatures.cpp create mode 100644 apps/openmw/mwrender/creatures.hpp create mode 100644 apps/openmw/mwrender/npcs.cpp create mode 100644 apps/openmw/mwrender/npcs.hpp create mode 100644 apps/openmw/mwrender/objects.cpp create mode 100644 apps/openmw/mwrender/objects.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 54495063b1..4d3dace037 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -16,7 +16,7 @@ set(GAME_HEADER source_group(game FILES ${GAME} ${GAME_HEADER}) add_openmw_dir (mwrender - renderingmanager debugging cellimp interior exterior sky player + renderingmanager debugging cellimp interior exterior sky player npcs creatures objects ) add_openmw_dir (mwinput diff --git a/apps/openmw/mwrender/cellimp.hpp b/apps/openmw/mwrender/cellimp.hpp index 9c600a5080..664fed64f0 100644 --- a/apps/openmw/mwrender/cellimp.hpp +++ b/apps/openmw/mwrender/cellimp.hpp @@ -28,15 +28,6 @@ namespace MWRender /// Base class for cell render, that implements inserting references into a cell in a /// cell type- and render-engine-independent way. - class NPC{ - - }; - class Creature{ - - }; - class Obj{ - - }; class CellRenderImp { public: diff --git a/apps/openmw/mwrender/creatures.cpp b/apps/openmw/mwrender/creatures.cpp new file mode 100644 index 0000000000..9989512492 --- /dev/null +++ b/apps/openmw/mwrender/creatures.cpp @@ -0,0 +1,2 @@ +#include "creatures.hpp" +using namespace MWRender; \ No newline at end of file diff --git a/apps/openmw/mwrender/creatures.hpp b/apps/openmw/mwrender/creatures.hpp new file mode 100644 index 0000000000..e884d5de4f --- /dev/null +++ b/apps/openmw/mwrender/creatures.hpp @@ -0,0 +1,5 @@ +namespace MWRender{ +class Creatures{ + +}; +} \ No newline at end of file diff --git a/apps/openmw/mwrender/npcs.cpp b/apps/openmw/mwrender/npcs.cpp new file mode 100644 index 0000000000..7012ccb184 --- /dev/null +++ b/apps/openmw/mwrender/npcs.cpp @@ -0,0 +1,2 @@ +#include "npcs.hpp" +using namespace MWRender; diff --git a/apps/openmw/mwrender/npcs.hpp b/apps/openmw/mwrender/npcs.hpp new file mode 100644 index 0000000000..861be6fc96 --- /dev/null +++ b/apps/openmw/mwrender/npcs.hpp @@ -0,0 +1,5 @@ +namespace MWRender{ +class Npcs{ + +}; +} diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp new file mode 100644 index 0000000000..9f91eb7913 --- /dev/null +++ b/apps/openmw/mwrender/objects.cpp @@ -0,0 +1,16 @@ +#include "objects.hpp" + +using namespace MWRender; + +void Objects::insertBegin (ESM::CellRef &ref, bool static_){ + +} +void Objects::insertMesh(const std::string &mesh){ + +} +void Objects::insertLight(float r, float g, float b, float radius){ + +} +void Objects::insertObjectPhysics(){ + +} \ No newline at end of file diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp new file mode 100644 index 0000000000..8a8b1ceaec --- /dev/null +++ b/apps/openmw/mwrender/objects.hpp @@ -0,0 +1,18 @@ +#include "components/esm_store/cell_store.hpp" + +#include "../mwworld/refdata.hpp" + +namespace MWRender{ +class Objects{ +public: + Objects(){} + ~Objects(){} + void insertBegin (ESM::CellRef &ref, bool static_ = false); + void insertMesh(const std::string &mesh); + + /// insert a light related to the most recent insertBegin call. + void insertLight(float r, float g, float b, float radius); + void insertObjectPhysics(); + +}; +} \ No newline at end of file diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 89429d061e..d3d17b86b8 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -15,6 +15,7 @@ #include "player.hpp" + using namespace MWRender; using namespace Ogre; @@ -67,6 +68,20 @@ RenderingManager::~RenderingManager () delete mSkyManager; } +MWRender::Npcs& RenderingManager::getNPCs(){ + return npcs; +} +MWRender::Objects& RenderingManager::getObjects(){ + return objects; +} +MWRender::Creatures& RenderingManager::getCreatures(){ + return creatures; +} +MWRender::Player* RenderingManager::getPlayer(){ + return mPlayer; +} + + void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 917be1b229..0e7fc87a95 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -15,6 +15,9 @@ #include "../mwworld/ptr.hpp" #include +#include "objects.hpp" +#include "npcs.hpp" +#include "creatures.hpp" namespace Ogre { @@ -34,13 +37,22 @@ namespace MWWorld namespace MWRender { - class Player; - + class Player; + class RenderingInterface{ + public: + virtual MWRender::Npcs& getNPCs(); + virtual MWRender::Creatures& getCreatures(); + virtual MWRender::Objects& getObjects(); + virtual MWRender::Player* getPlayer(); + }; -class RenderingManager { +class RenderingManager: private RenderingInterface { OEngine::Render::OgreRenderer &rend; Ogre::Camera* camera; + MWRender::Npcs npcs; + MWRender::Creatures creatures; + MWRender::Objects objects; /// Root node for all objects added to the scene. This is rotated so /// that the OGRE coordinate system matches that used internally in @@ -56,6 +68,10 @@ class RenderingManager { public: RenderingManager(OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine); ~RenderingManager(); + virtual MWRender::Npcs& getNPCs(); + virtual MWRender::Creatures& getCreatures(); + virtual MWRender::Objects& getObjects(); + virtual MWRender::Player* getPlayer(); bool toggleRenderMode(int mode); void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? @@ -83,7 +99,7 @@ class RenderingManager { OEngine::Render::OgreRenderer& getOgreRenderer(){return rend;} Ogre::SceneManager *getMgr() { return rend.getScene(); } Ogre::SceneNode *getRoot() { return mwRoot; } - MWRender::Player *getPlayer() { return mPlayer; } + private: SkyManager* mSkyManager; From 3d43a4cd33fcac91c7109ab27c90f7d1b95c69fe Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Tue, 1 Nov 2011 13:46:57 -0400 Subject: [PATCH 25/55] Made recommended changes --- apps/openmw/mwrender/objects.cpp | 9 +++------ apps/openmw/mwrender/objects.hpp | 14 ++++++++------ apps/openmw/mwrender/renderingmanager.cpp | 4 ++-- apps/openmw/mwrender/renderingmanager.hpp | 4 ++-- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 9f91eb7913..3ad011b932 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -2,15 +2,12 @@ using namespace MWRender; -void Objects::insertBegin (ESM::CellRef &ref, bool static_){ +void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ } -void Objects::insertMesh(const std::string &mesh){ +void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ } -void Objects::insertLight(float r, float g, float b, float radius){ +void Objects::insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius){ } -void Objects::insertObjectPhysics(){ - -} \ No newline at end of file diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index 8a8b1ceaec..75752284d6 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -1,18 +1,20 @@ #include "components/esm_store/cell_store.hpp" #include "../mwworld/refdata.hpp" +#include "../mwworld/ptr.hpp" namespace MWRender{ class Objects{ +private: + OEngine::Render::OgreRenderer &rend; public: - Objects(){} + Objects(OEngine::Render::OgreRenderer& _rend): rend(_rend){} ~Objects(){} - void insertBegin (ESM::CellRef &ref, bool static_ = false); - void insertMesh(const std::string &mesh); + void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_); + void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); + void insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius); /// insert a light related to the most recent insertBegin call. - void insertLight(float r, float g, float b, float radius); - void insertObjectPhysics(); - + }; } \ No newline at end of file diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index d3d17b86b8..61fe9bf179 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -77,8 +77,8 @@ MWRender::Objects& RenderingManager::getObjects(){ MWRender::Creatures& RenderingManager::getCreatures(){ return creatures; } -MWRender::Player* RenderingManager::getPlayer(){ - return mPlayer; +MWRender::Player& RenderingManager::getPlayer(){ + return (*mPlayer); } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 0e7fc87a95..9f751959d9 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -43,7 +43,7 @@ namespace MWRender virtual MWRender::Npcs& getNPCs(); virtual MWRender::Creatures& getCreatures(); virtual MWRender::Objects& getObjects(); - virtual MWRender::Player* getPlayer(); + virtual MWRender::Player& getPlayer(); }; class RenderingManager: private RenderingInterface { @@ -71,7 +71,7 @@ class RenderingManager: private RenderingInterface { virtual MWRender::Npcs& getNPCs(); virtual MWRender::Creatures& getCreatures(); virtual MWRender::Objects& getObjects(); - virtual MWRender::Player* getPlayer(); + virtual MWRender::Player& getPlayer(); bool toggleRenderMode(int mode); void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? From 5822221ae1a60016cab961cfd4649cd793eb5c4b Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Tue, 1 Nov 2011 13:47:36 -0400 Subject: [PATCH 26/55] Made recommended changes --- apps/openmw/mwworld/world.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 2aadaae11b..821179d38e 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -9,6 +9,7 @@ #include "../mwrender/sky.hpp" #include "../mwrender/interior.hpp" #include "../mwrender/exterior.hpp" +#include "../mwrender/player.hpp" #include "../mwmechanics/mechanicsmanager.hpp" @@ -193,7 +194,8 @@ namespace MWWorld mEsm.open (masterPath.string()); mStore.load (mEsm); - mPlayer = new MWWorld::Player (mRendering.getPlayer(), mStore.npcs.find ("player"), *this); + MWRender::Player* play = &(mRendering.getPlayer()); + mPlayer = new MWWorld::Player (play, mStore.npcs.find ("player"), *this); mPhysics->addActor (mPlayer->getPlayer().getRefData().getHandle(), "", Ogre::Vector3 (0, 0, 0)); // global variables From c2181d209144de326e7b6b48138ebc85aa0d292f Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Wed, 2 Nov 2011 00:13:33 -0400 Subject: [PATCH 27/55] Dealing with scenenodes --- apps/openmw/mwrender/creatures.hpp | 2 ++ apps/openmw/mwrender/npcs.hpp | 1 + apps/openmw/mwrender/objects.cpp | 7 +++++ apps/openmw/mwrender/objects.hpp | 6 ++++- apps/openmw/mwrender/renderingmanager.cpp | 5 ++-- apps/openmw/mwrender/renderingmanager.hpp | 33 ++++++++++++----------- 6 files changed, 35 insertions(+), 19 deletions(-) diff --git a/apps/openmw/mwrender/creatures.hpp b/apps/openmw/mwrender/creatures.hpp index e884d5de4f..17946f0504 100644 --- a/apps/openmw/mwrender/creatures.hpp +++ b/apps/openmw/mwrender/creatures.hpp @@ -1,3 +1,5 @@ +#include + namespace MWRender{ class Creatures{ diff --git a/apps/openmw/mwrender/npcs.hpp b/apps/openmw/mwrender/npcs.hpp index 861be6fc96..c9701f1951 100644 --- a/apps/openmw/mwrender/npcs.hpp +++ b/apps/openmw/mwrender/npcs.hpp @@ -1,3 +1,4 @@ +#include namespace MWRender{ class Npcs{ diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 3ad011b932..ed32a8786f 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -1,9 +1,15 @@ #include "objects.hpp" +#include using namespace MWRender; void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ + ptr.getRefData().setBaseNode(mBase); + assert (!mInsert); + isStatic = static_; + // Create and place scene node for this object + mInsert = mBase->createChildSceneNode(); } void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ @@ -11,3 +17,4 @@ void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ void Objects::insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius){ } + diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index 75752284d6..e382fb05b2 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -2,13 +2,17 @@ #include "../mwworld/refdata.hpp" #include "../mwworld/ptr.hpp" +#include namespace MWRender{ class Objects{ private: OEngine::Render::OgreRenderer &rend; + Ogre::SceneNode *mBase; + Ogre::SceneNode *mInsert; + bool isStatic; public: - Objects(OEngine::Render::OgreRenderer& _rend): rend(_rend){} + Objects(OEngine::Render::OgreRenderer& _rend): rend(_rend){mBase = rend.getScene()->getRootSceneNode(); } ~Objects(){} void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_); void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 61fe9bf179..952388fd41 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -1,4 +1,5 @@ #include "renderingmanager.hpp" +#include "objects.hpp" #include @@ -23,7 +24,7 @@ namespace MWRender { -RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine) :rend(_rend), mDebugging(engine) +RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine) :rend(_rend), mDebugging(engine), objects(rend) { @@ -58,8 +59,8 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const cameraPitchNode->attachObject(rend.getCamera()); mPlayer = new MWRender::Player (rend.getCamera(), playerNode->getName()); + //std::cout << "Three"; - } RenderingManager::~RenderingManager () diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 9f751959d9..e8989d7409 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -48,22 +48,7 @@ namespace MWRender class RenderingManager: private RenderingInterface { - OEngine::Render::OgreRenderer &rend; - Ogre::Camera* camera; - MWRender::Npcs npcs; - MWRender::Creatures creatures; - MWRender::Objects objects; - - /// Root node for all objects added to the scene. This is rotated so - /// that the OGRE coordinate system matches that used internally in - /// Morrowind. - Ogre::SceneNode *mwRoot; - Ogre::RaySceneQuery *mRaySceneQuery; - - OEngine::Physic::PhysicEngine* eng; - - MWRender::Player *mPlayer; - MWRender::Debugging mDebugging; + public: RenderingManager(OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine); @@ -103,6 +88,22 @@ class RenderingManager: private RenderingInterface { private: SkyManager* mSkyManager; + OEngine::Render::OgreRenderer &rend; + Ogre::Camera* camera; + MWRender::Npcs npcs; + MWRender::Creatures creatures; + MWRender::Objects objects; + + /// Root node for all objects added to the scene. This is rotated so + /// that the OGRE coordinate system matches that used internally in + /// Morrowind. + Ogre::SceneNode *mwRoot; + Ogre::RaySceneQuery *mRaySceneQuery; + + OEngine::Physic::PhysicEngine* eng; + + MWRender::Player *mPlayer; + MWRender::Debugging mDebugging; }; From d49a02abe5324b98e3da30405d395f2ae9a64841 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Wed, 2 Nov 2011 22:41:48 -0400 Subject: [PATCH 28/55] new insertBegin() --- apps/openmw/mwrender/objects.cpp | 21 +++++++++++++++++---- apps/openmw/mwrender/objects.hpp | 5 ++--- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index ed32a8786f..25308962db 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -4,12 +4,25 @@ using namespace MWRender; void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ - ptr.getRefData().setBaseNode(mBase); - assert (!mInsert); + Ogre::SceneNode* root = rend.getScene()->getRootSceneNode(); + Ogre::SceneNode* cellnode; + if(cellSceneNodes.find(ptr.getCell()) == cellSceneNodes.end()) + { + //Create the scenenode and put it in the map + cellnode = root->createChildSceneNode(); + cellSceneNodes[ptr.getCell()] = cellnode; + assert(!cellnode->getChildIterator()->begin()); //Is this right? + } + else + { + cellnode = (cellSceneNodes.find(ptr.getCell()))->second; + } + Ogre::SceneNode* insert = cellnode->createChildSceneNode(); + + ptr.getRefData().setBaseNode(insert); isStatic = static_; - // Create and place scene node for this object - mInsert = mBase->createChildSceneNode(); + } void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index e382fb05b2..53a3745ed7 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -8,11 +8,10 @@ namespace MWRender{ class Objects{ private: OEngine::Render::OgreRenderer &rend; - Ogre::SceneNode *mBase; - Ogre::SceneNode *mInsert; + std::map cellSceneNodes; bool isStatic; public: - Objects(OEngine::Render::OgreRenderer& _rend): rend(_rend){mBase = rend.getScene()->getRootSceneNode(); } + Objects(OEngine::Render::OgreRenderer& _rend): rend(_rend){} ~Objects(){} void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_); void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); From 9ac627c93113b5bda1587813f5365db1be8a19fa Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Wed, 2 Nov 2011 22:45:58 -0400 Subject: [PATCH 29/55] Commenting out assert --- apps/openmw/mwrender/objects.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 25308962db..97e0864298 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -11,7 +11,7 @@ void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ //Create the scenenode and put it in the map cellnode = root->createChildSceneNode(); cellSceneNodes[ptr.getCell()] = cellnode; - assert(!cellnode->getChildIterator()->begin()); //Is this right? + //assert(!cellnode->getChildIterator()->begin()); //Is this right? } else { From edf85b26f9f12298d0ce32f30a0e4addfd44b968 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Thu, 3 Nov 2011 19:40:37 -0400 Subject: [PATCH 30/55] Insert Mesh, Insert Light, insertBegin improved --- apps/openmw/mwrender/objects.cpp | 95 ++++++++++++++++++++++++++++++-- apps/openmw/mwrender/objects.hpp | 25 ++++++++- 2 files changed, 111 insertions(+), 9 deletions(-) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 97e0864298..963d03e125 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -1,33 +1,116 @@ #include "objects.hpp" #include +#include using namespace MWRender; +using namespace Ogre; + +bool Objects::lightConst = false; +float Objects::lightConstValue = 0.0f; + +bool Objects::lightLinear = true; +int Objects::lightLinearMethod = 1; +float Objects::lightLinearValue = 3; +float Objects::lightLinearRadiusMult = 1; + +bool Objects::lightQuadratic = false; +int Objects::lightQuadraticMethod = 2; +float Objects::lightQuadraticValue = 16; +float Objects::lightQuadraticRadiusMult = 1; + +bool Objects::lightOutQuadInLin = false; + +int Objects::uniqueID = 0; void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ - Ogre::SceneNode* root = rend.getScene()->getRootSceneNode(); + Ogre::SceneNode* root = mRend.getScene()->getRootSceneNode(); Ogre::SceneNode* cellnode; - if(cellSceneNodes.find(ptr.getCell()) == cellSceneNodes.end()) + if(mCellSceneNodes.find(ptr.getCell()) == mCellSceneNodes.end()) { //Create the scenenode and put it in the map cellnode = root->createChildSceneNode(); - cellSceneNodes[ptr.getCell()] = cellnode; - //assert(!cellnode->getChildIterator()->begin()); //Is this right? + mCellSceneNodes[ptr.getCell()] = cellnode; } else { - cellnode = (cellSceneNodes.find(ptr.getCell()))->second; + cellnode = (mCellSceneNodes.find(ptr.getCell()))->second; } Ogre::SceneNode* insert = cellnode->createChildSceneNode(); - + const float *f = ptr.getCellRef().pos.pos; + insert->setPosition(f[0], f[1], f[2]); + insert->setScale(ptr.getCellRef().scale, ptr.getCellRef().scale, ptr.getCellRef().scale); + + // Convert MW rotation to a quaternion: + f = ptr.getCellRef().pos.rot; + + // Rotate around X axis + Quaternion xr(Radian(-f[0]), Vector3::UNIT_X); + + // Rotate around Y axis + Quaternion yr(Radian(-f[1]), Vector3::UNIT_Y); + + // Rotate around Z axis + Quaternion zr(Radian(-f[2]), Vector3::UNIT_Z); + + // Rotates first around z, then y, then x + insert->setOrientation(xr*yr*zr); + if (!enabled) + insert->setVisible (false); ptr.getRefData().setBaseNode(insert); isStatic = static_; } void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ + Ogre::SceneNode* insert = mRend.getScene()->getSceneNode(ptr.getRefData().getHandle()); + assert(insert); + + NifOgre::NIFLoader::load(mesh); + Entity *ent = mRend.getScene()->createEntity(mesh); + + if(!isStatic) + { + insert->attachObject(ent); + } + else + { + sg->addEntity(ent,insert->_getDerivedPosition(),insert->_getDerivedOrientation(),insert->_getDerivedScale()); + sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); + mRend.getScene()->destroyEntity(ent); + } } void Objects::insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius){ + Ogre::SceneNode* insert = mRend.getScene()->getSceneNode(ptr.getRefData().getHandle()); + assert(insert); + Ogre::Light *light = mRend.getScene()->createLight(); + light->setDiffuseColour (r, g, b); + float cval=0.0f, lval=0.0f, qval=0.0f; + + if(lightConst) + cval = lightConstValue; + if(!lightOutQuadInLin) + { + if(lightLinear) + radius *= lightLinearRadiusMult; + if(lightQuadratic) + radius *= lightQuadraticRadiusMult; + + if(lightLinear) + lval = lightLinearValue / pow(radius, lightLinearMethod); + if(lightQuadratic) + qval = lightQuadraticValue / pow(radius, lightQuadraticMethod); + } + else + { + // FIXME: + // Do quadratic or linear, depending if we're in an exterior or interior + // cell, respectively. Ignore lightLinear and lightQuadratic. + } + + light->setAttenuation(10*radius, cval, lval, qval); + + insert->attachObject(light); } diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index 53a3745ed7..1b17223652 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -7,11 +7,30 @@ namespace MWRender{ class Objects{ private: - OEngine::Render::OgreRenderer &rend; - std::map cellSceneNodes; + OEngine::Render::OgreRenderer &mRend; + std::map mCellSceneNodes; bool isStatic; + Ogre::StaticGeometry *sg; + static int uniqueID; + static bool lightConst; + static float lightConstValue; + + static bool lightLinear; + static int lightLinearMethod; + static float lightLinearValue; + static float lightLinearRadiusMult; + + static bool lightQuadratic; + static int lightQuadraticMethod; + static float lightQuadraticValue; + static float lightQuadraticRadiusMult; + + static bool lightOutQuadInLin; public: - Objects(OEngine::Render::OgreRenderer& _rend): rend(_rend){} + Objects(OEngine::Render::OgreRenderer& _rend): mRend(_rend){ + uniqueID = uniqueID +1; + sg = mRend.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); + } ~Objects(){} void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_); void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); From e04100606358f065fc455b883cc253d0f73984af Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Thu, 3 Nov 2011 23:47:15 -0400 Subject: [PATCH 31/55] Adding light and fog functions --- apps/openmw/mwrender/renderingmanager.cpp | 67 +++++++++++++++++++++++ apps/openmw/mwrender/renderingmanager.hpp | 12 +++- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 952388fd41..b07251f53f 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -154,4 +154,71 @@ bool RenderingManager::toggleRenderMode(int mode){ return mDebugging.toggleRenderMode(mode); } +void RenderingManager::configureFog(ESMS::CellStore &mCell) +{ + Ogre::ColourValue color; + color.setAsABGR (mCell.cell->ambi.fog); + + float high = 4500 + 9000 * (1-mCell.cell->ambi.fogDensity); + float low = 200; + + rend.getScene()->setFog (FOG_LINEAR, color, 0, low, high); + rend.getCamera()->setFarClipDistance (high + 10); + rend.getViewport()->setBackgroundColour (color); +} + +void RenderingManager::setAmbientMode() +{ + switch (mAmbientMode) + { + case 0: + + rend.getScene()->setAmbientLight(mAmbientColor); + break; + + case 1: + + rend.getScene()->setAmbientLight(0.7f*mAmbientColor + 0.3f*ColourValue(1,1,1)); + break; + + case 2: + + rend.getScene()->setAmbientLight(ColourValue(1,1,1)); + break; + } +} + +void RenderingManager::configureAmbient(ESMS::CellStore &mCell) +{ + mAmbientColor.setAsABGR (mCell.cell->ambi.ambient); + setAmbientMode(); + + // Create a "sun" that shines light downwards. It doesn't look + // completely right, but leave it for now. + Ogre::Light *light = rend.getScene()->createLight(); + Ogre::ColourValue colour; + colour.setAsABGR (mCell.cell->ambi.sunlight); + light->setDiffuseColour (colour); + light->setType(Ogre::Light::LT_DIRECTIONAL); + light->setDirection(0,-1,0); +} +// Switch through lighting modes. + +void RenderingManager::toggleLight() +{ + if (mAmbientMode==2) + mAmbientMode = 0; + else + ++mAmbientMode; + + switch (mAmbientMode) + { + case 0: std::cout << "Setting lights to normal\n"; break; + case 1: std::cout << "Turning the lights up\n"; break; + case 2: std::cout << "Turning the lights to full\n"; break; + } + + setAmbientMode(); +} + } diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index e8989d7409..0d2375febe 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -57,6 +57,8 @@ class RenderingManager: private RenderingInterface { virtual MWRender::Creatures& getCreatures(); virtual MWRender::Objects& getObjects(); virtual MWRender::Player& getPlayer(); + + void toggleLight(); bool toggleRenderMode(int mode); void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? @@ -86,7 +88,10 @@ class RenderingManager: private RenderingInterface { Ogre::SceneNode *getRoot() { return mwRoot; } private: - + void configureAmbient(ESMS::CellStore &mCell); + /// configure fog according to cell + void configureFog(ESMS::CellStore &mCell); + void setAmbientMode(); SkyManager* mSkyManager; OEngine::Render::OgreRenderer &rend; Ogre::Camera* camera; @@ -94,6 +99,11 @@ class RenderingManager: private RenderingInterface { MWRender::Creatures creatures; MWRender::Objects objects; + // 0 normal, 1 more bright, 2 max + int mAmbientMode; + + Ogre::ColourValue mAmbientColor; + /// Root node for all objects added to the scene. This is rotated so /// that the OGRE coordinate system matches that used internally in /// Morrowind. From 6c80e75deb1d3e480d351f2991bedfc59aef5407 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Fri, 4 Nov 2011 21:48:52 -0400 Subject: [PATCH 32/55] More Objects functionality --- apps/openmw/mwrender/objects.cpp | 48 +++++++++++++++++++++++++++++++- apps/openmw/mwrender/objects.hpp | 6 ++-- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 963d03e125..1f2ee1978a 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -33,8 +33,11 @@ void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ } else { - cellnode = (mCellSceneNodes.find(ptr.getCell()))->second; + cellnode = mCellSceneNodes[ptr.getCell()]; } + + + Ogre::SceneNode* insert = cellnode->createChildSceneNode(); const float *f = ptr.getCellRef().pos.pos; insert->setPosition(f[0], f[1], f[2]); @@ -74,8 +77,23 @@ void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ } else { + Ogre::StaticGeometry* sg; + if(mSG.find(ptr.getCell()) == mSG.end()) + { + uniqueID = uniqueID +1; + sg = mRend.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); + //Create the scenenode and put it in the map + mSG[ptr.getCell()] = sg; + } + else + { + sg = mSG[ptr.getCell()]; + } + sg->addEntity(ent,insert->_getDerivedPosition(),insert->_getDerivedOrientation(),insert->_getDerivedScale()); sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); + + sg->build(); //Is this the right place for building? mRend.getScene()->destroyEntity(ent); } @@ -114,3 +132,31 @@ void Objects::insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, f insert->attachObject(light); } +void Objects::deleteObject (const std::string& handle) +{ + if (!handle.empty()) + { + Ogre::SceneNode *node = mRend.getScene()->getSceneNode (handle); + node->removeAndDestroyAllChildren(); + mRend.getScene()->destroySceneNode (node); + } +} + +void Objects::removeCell(const MWWorld::Ptr& ptr){ + if(mCellSceneNodes.find(ptr.getCell()) != mCellSceneNodes.end()) + { + Ogre::SceneNode* base = mCellSceneNodes[ptr.getCell()]; + base->removeAndDestroyAllChildren(); + mRend.getScene()->destroySceneNode(base); + base = 0; + } + + + if(mSG.find(ptr.getCell()) != mSG.end()) + { + Ogre::StaticGeometry* sg = mSG[ptr.getCell()]; + mRend.getScene()->destroyStaticGeometry (sg); + sg = 0; + } +} + diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index 1b17223652..6bd1d31c6a 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -9,8 +9,8 @@ class Objects{ private: OEngine::Render::OgreRenderer &mRend; std::map mCellSceneNodes; + std::map mSG; bool isStatic; - Ogre::StaticGeometry *sg; static int uniqueID; static bool lightConst; static float lightConstValue; @@ -28,13 +28,13 @@ private: static bool lightOutQuadInLin; public: Objects(OEngine::Render::OgreRenderer& _rend): mRend(_rend){ - uniqueID = uniqueID +1; - sg = mRend.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); } ~Objects(){} void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_); void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); void insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius); + void deleteObject (const std::string& handle); + void removeCell(const MWWorld::Ptr& ptr); /// insert a light related to the most recent insertBegin call. From 8edcd4d15baea16bf7434416bdb51d902b00c8cc Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Fri, 4 Nov 2011 21:57:39 -0400 Subject: [PATCH 33/55] removing tabs --- apps/openmw/mwrender/objects.cpp | 126 +++++++++++++++---------------- apps/openmw/mwrender/objects.hpp | 17 ++--- 2 files changed, 71 insertions(+), 72 deletions(-) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 1f2ee1978a..429dae71d7 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -23,91 +23,91 @@ bool Objects::lightOutQuadInLin = false; int Objects::uniqueID = 0; void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ - Ogre::SceneNode* root = mRend.getScene()->getRootSceneNode(); - Ogre::SceneNode* cellnode; - if(mCellSceneNodes.find(ptr.getCell()) == mCellSceneNodes.end()) - { + Ogre::SceneNode* root = mRend.getScene()->getRootSceneNode(); + Ogre::SceneNode* cellnode; + if(mCellSceneNodes.find(ptr.getCell()) == mCellSceneNodes.end()) + { //Create the scenenode and put it in the map cellnode = root->createChildSceneNode(); - mCellSceneNodes[ptr.getCell()] = cellnode; + mCellSceneNodes[ptr.getCell()] = cellnode; } else - { - cellnode = mCellSceneNodes[ptr.getCell()]; - } + { + cellnode = mCellSceneNodes[ptr.getCell()]; + } - Ogre::SceneNode* insert = cellnode->createChildSceneNode(); - const float *f = ptr.getCellRef().pos.pos; - insert->setPosition(f[0], f[1], f[2]); - insert->setScale(ptr.getCellRef().scale, ptr.getCellRef().scale, ptr.getCellRef().scale); + Ogre::SceneNode* insert = cellnode->createChildSceneNode(); + const float *f = ptr.getCellRef().pos.pos; + insert->setPosition(f[0], f[1], f[2]); + insert->setScale(ptr.getCellRef().scale, ptr.getCellRef().scale, ptr.getCellRef().scale); - // Convert MW rotation to a quaternion: - f = ptr.getCellRef().pos.rot; + // Convert MW rotation to a quaternion: + f = ptr.getCellRef().pos.rot; - // Rotate around X axis - Quaternion xr(Radian(-f[0]), Vector3::UNIT_X); + // Rotate around X axis + Quaternion xr(Radian(-f[0]), Vector3::UNIT_X); - // Rotate around Y axis - Quaternion yr(Radian(-f[1]), Vector3::UNIT_Y); + // Rotate around Y axis + Quaternion yr(Radian(-f[1]), Vector3::UNIT_Y); - // Rotate around Z axis - Quaternion zr(Radian(-f[2]), Vector3::UNIT_Z); + // Rotate around Z axis + Quaternion zr(Radian(-f[2]), Vector3::UNIT_Z); - // Rotates first around z, then y, then x - insert->setOrientation(xr*yr*zr); - if (!enabled) - insert->setVisible (false); + // Rotates first around z, then y, then x + insert->setOrientation(xr*yr*zr); + if (!enabled) + insert->setVisible (false); ptr.getRefData().setBaseNode(insert); - isStatic = static_; + isStatic = static_; } void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ - Ogre::SceneNode* insert = mRend.getScene()->getSceneNode(ptr.getRefData().getHandle()); - assert(insert); + Ogre::SceneNode* insert = mRend.getScene()->getSceneNode(ptr.getRefData().getHandle()); + assert(insert); - NifOgre::NIFLoader::load(mesh); - Entity *ent = mRend.getScene()->createEntity(mesh); + NifOgre::NIFLoader::load(mesh); + Entity *ent = mRend.getScene()->createEntity(mesh); - if(!isStatic) - { - insert->attachObject(ent); - } - else - { - Ogre::StaticGeometry* sg; - if(mSG.find(ptr.getCell()) == mSG.end()) - { - uniqueID = uniqueID +1; - sg = mRend.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); - //Create the scenenode and put it in the map - mSG[ptr.getCell()] = sg; - } - else - { - sg = mSG[ptr.getCell()]; - } + if(!isStatic) + { + insert->attachObject(ent); + } + else + { + Ogre::StaticGeometry* sg; + if(mSG.find(ptr.getCell()) == mSG.end()) + { + uniqueID = uniqueID +1; + sg = mRend.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); + //Create the scenenode and put it in the map + mSG[ptr.getCell()] = sg; + } + else + { + sg = mSG[ptr.getCell()]; + } - sg->addEntity(ent,insert->_getDerivedPosition(),insert->_getDerivedOrientation(),insert->_getDerivedScale()); - sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); + sg->addEntity(ent,insert->_getDerivedPosition(),insert->_getDerivedOrientation(),insert->_getDerivedScale()); + sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); - sg->build(); //Is this the right place for building? - mRend.getScene()->destroyEntity(ent); - } + sg->build(); //Is this the right place for building? + mRend.getScene()->destroyEntity(ent); + } } void Objects::insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius){ - Ogre::SceneNode* insert = mRend.getScene()->getSceneNode(ptr.getRefData().getHandle()); - assert(insert); - Ogre::Light *light = mRend.getScene()->createLight(); - light->setDiffuseColour (r, g, b); + Ogre::SceneNode* insert = mRend.getScene()->getSceneNode(ptr.getRefData().getHandle()); + assert(insert); + Ogre::Light *light = mRend.getScene()->createLight(); + light->setDiffuseColour (r, g, b); - float cval=0.0f, lval=0.0f, qval=0.0f; + float cval=0.0f, lval=0.0f, qval=0.0f; - if(lightConst) - cval = lightConstValue; + if(lightConst) + cval = lightConstValue; if(!lightOutQuadInLin) { if(lightLinear) @@ -145,10 +145,10 @@ void Objects::deleteObject (const std::string& handle) void Objects::removeCell(const MWWorld::Ptr& ptr){ if(mCellSceneNodes.find(ptr.getCell()) != mCellSceneNodes.end()) { - Ogre::SceneNode* base = mCellSceneNodes[ptr.getCell()]; - base->removeAndDestroyAllChildren(); - mRend.getScene()->destroySceneNode(base); - base = 0; + Ogre::SceneNode* base = mCellSceneNodes[ptr.getCell()]; + base->removeAndDestroyAllChildren(); + mRend.getScene()->destroySceneNode(base); + base = 0; } diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index 6bd1d31c6a..da21300b7d 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -10,9 +10,9 @@ private: OEngine::Render::OgreRenderer &mRend; std::map mCellSceneNodes; std::map mSG; - bool isStatic; - static int uniqueID; - static bool lightConst; + bool isStatic; + static int uniqueID; + static bool lightConst; static float lightConstValue; static bool lightLinear; @@ -27,14 +27,13 @@ private: static bool lightOutQuadInLin; public: - Objects(OEngine::Render::OgreRenderer& _rend): mRend(_rend){ - } + Objects(OEngine::Render::OgreRenderer& _rend): mRend(_rend){} ~Objects(){} - void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_); + void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_); void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); - void insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius); - void deleteObject (const std::string& handle); - void removeCell(const MWWorld::Ptr& ptr); + void insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius); + void deleteObject (const std::string& handle); + void removeCell(const MWWorld::Ptr& ptr); /// insert a light related to the most recent insertBegin call. From c11b3a57c1fef17f31ea14c0decedf0050647926 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 5 Nov 2011 14:57:33 -0400 Subject: [PATCH 34/55] Made buildStaticGeometry function --- apps/openmw/mwrender/objects.cpp | 9 ++++++++- apps/openmw/mwrender/objects.hpp | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 429dae71d7..0632255be5 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -93,7 +93,7 @@ void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ sg->addEntity(ent,insert->_getDerivedPosition(),insert->_getDerivedOrientation(),insert->_getDerivedScale()); sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); - sg->build(); //Is this the right place for building? + mRend.getScene()->destroyEntity(ent); } @@ -159,4 +159,11 @@ void Objects::removeCell(const MWWorld::Ptr& ptr){ sg = 0; } } +void Objects::buildStaticGeometry(const MWWorld::Ptr& ptr){ + if(mSG.find(ptr.getCell()) != mSG.end()) + { + Ogre::StaticGeometry* sg = mSG[ptr.getCell()]; + sg->build(); + } +} diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index da21300b7d..ebb52906a7 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -34,6 +34,8 @@ public: void insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius); void deleteObject (const std::string& handle); void removeCell(const MWWorld::Ptr& ptr); + void buildStaticGeometry(const MWWorld::Ptr& ptr); + /// insert a light related to the most recent insertBegin call. From 469086747e5cfbec8247986fb5ba29319ef8918a Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Mon, 7 Nov 2011 23:35:39 -0500 Subject: [PATCH 35/55] Compile error fix;RenderingInterface separated; buildStaticGeometry argument changed --- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwrender/objects.cpp | 9 +++++---- apps/openmw/mwrender/objects.hpp | 4 ++-- apps/openmw/mwrender/renderinginterface.hpp | 12 ++++++++++++ apps/openmw/mwrender/renderingmanager.cpp | 1 - apps/openmw/mwrender/renderingmanager.hpp | 14 ++++---------- 6 files changed, 24 insertions(+), 18 deletions(-) create mode 100644 apps/openmw/mwrender/renderinginterface.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 4d3dace037..c41c089c65 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -16,7 +16,7 @@ set(GAME_HEADER source_group(game FILES ${GAME} ${GAME_HEADER}) add_openmw_dir (mwrender - renderingmanager debugging cellimp interior exterior sky player npcs creatures objects + renderingmanager debugging cellimp interior exterior sky player npcs creatures objects renderinginterface ) add_openmw_dir (mwinput diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 0632255be5..b9147d75dd 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -2,8 +2,9 @@ #include #include -using namespace MWRender; using namespace Ogre; +using namespace MWRender; + bool Objects::lightConst = false; float Objects::lightConstValue = 0.0f; @@ -159,10 +160,10 @@ void Objects::removeCell(const MWWorld::Ptr& ptr){ sg = 0; } } -void Objects::buildStaticGeometry(const MWWorld::Ptr& ptr){ - if(mSG.find(ptr.getCell()) != mSG.end()) +void Objects::buildStaticGeometry(ESMS::CellStore& cell){ + if(mSG.find(&cell) != mSG.end()) { - Ogre::StaticGeometry* sg = mSG[ptr.getCell()]; + Ogre::StaticGeometry* sg = mSG[&cell]; sg->build(); } } diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index ebb52906a7..e830d09937 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -5,8 +5,8 @@ #include namespace MWRender{ + class Objects{ -private: OEngine::Render::OgreRenderer &mRend; std::map mCellSceneNodes; std::map mSG; @@ -34,7 +34,7 @@ public: void insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius); void deleteObject (const std::string& handle); void removeCell(const MWWorld::Ptr& ptr); - void buildStaticGeometry(const MWWorld::Ptr& ptr); + void buildStaticGeometry(ESMS::CellStore &cell); /// insert a light related to the most recent insertBegin call. diff --git a/apps/openmw/mwrender/renderinginterface.hpp b/apps/openmw/mwrender/renderinginterface.hpp new file mode 100644 index 0000000000..28f3b61fcc --- /dev/null +++ b/apps/openmw/mwrender/renderinginterface.hpp @@ -0,0 +1,12 @@ +#include "objects.hpp" +#include "npcs.hpp" +#include "creatures.hpp" +namespace MWRender{ +class RenderingInterface{ + public: + virtual MWRender::Npcs& getNPCs() = 0; + virtual MWRender::Creatures& getCreatures() = 0; + virtual MWRender::Objects& getObjects() = 0; + virtual MWRender::Player& getPlayer() = 0; + }; +} \ No newline at end of file diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index b07251f53f..c21ce8a43a 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -1,5 +1,4 @@ #include "renderingmanager.hpp" -#include "objects.hpp" #include diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 0d2375febe..16e8e5af41 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -4,6 +4,7 @@ #include "sky.hpp" #include "debugging.hpp" +#include "renderinginterface.hpp" #include #include @@ -15,9 +16,8 @@ #include "../mwworld/ptr.hpp" #include -#include "objects.hpp" -#include "npcs.hpp" -#include "creatures.hpp" + + namespace Ogre { @@ -38,13 +38,7 @@ namespace MWWorld namespace MWRender { class Player; - class RenderingInterface{ - public: - virtual MWRender::Npcs& getNPCs(); - virtual MWRender::Creatures& getCreatures(); - virtual MWRender::Objects& getObjects(); - virtual MWRender::Player& getPlayer(); - }; + class RenderingManager: private RenderingInterface { From a7652bcb0c9fe7991282bf2824b1d8e9345220d7 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Wed, 9 Nov 2011 13:53:29 -0500 Subject: [PATCH 36/55] Yacoby's changes on Objects --- apps/openmw/mwrender/objects.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index b9147d75dd..57e6c65018 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -40,7 +40,7 @@ void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ Ogre::SceneNode* insert = cellnode->createChildSceneNode(); - const float *f = ptr.getCellRef().pos.pos; + const float *f = ptr.getRefData().getPosition().pos; insert->setPosition(f[0], f[1], f[2]); insert->setScale(ptr.getCellRef().scale, ptr.getCellRef().scale, ptr.getCellRef().scale); From 1faa07b2794a076daacca441e0341c0c5a3a101f Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Wed, 9 Nov 2011 15:47:06 -0500 Subject: [PATCH 37/55] insertObjectRendering proposed --- apps/openmw/mwclass/lockpick.cpp | 11 ++++------- apps/openmw/mwclass/lockpick.hpp | 3 +-- apps/openmw/mwworld/class.cpp | 3 +-- apps/openmw/mwworld/class.hpp | 6 ++++-- apps/openmw/mwworld/world.cpp | 1 - 5 files changed, 10 insertions(+), 14 deletions(-) diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index 3a94fce261..1296a4144b 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -9,25 +9,22 @@ #include "../mwworld/actiontake.hpp" #include "../mwrender/cellimp.hpp" - +#include "../mwrender/renderinginterface.hpp" #include "containerutil.hpp" namespace MWClass { - void Lockpick::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Lockpick::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + MWRender::Objects objects = renderingInterface.getObjects(); if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + objects.insertMesh(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/lockpick.hpp b/apps/openmw/mwclass/lockpick.hpp index bb9866b8cf..9b02dce7f9 100644 --- a/apps/openmw/mwclass/lockpick.hpp +++ b/apps/openmw/mwclass/lockpick.hpp @@ -9,8 +9,7 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering virtual std::string getName (const MWWorld::Ptr& ptr) const; diff --git a/apps/openmw/mwworld/class.cpp b/apps/openmw/mwworld/class.cpp index 670cf90b20..396d92cacf 100644 --- a/apps/openmw/mwworld/class.cpp +++ b/apps/openmw/mwworld/class.cpp @@ -21,8 +21,7 @@ namespace MWWorld throw std::runtime_error ("class does not support ID retrieval"); } - void Class::insertObj (const Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Class::insertObjectRendering (const Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { } diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp index 8ad9ba58fe..470235bb00 100644 --- a/apps/openmw/mwworld/class.hpp +++ b/apps/openmw/mwworld/class.hpp @@ -9,6 +9,7 @@ #include "action.hpp" #include "containerstore.hpp" #include "refdata.hpp" +#include "../mwrender/renderinginterface.hpp" namespace Ogre { @@ -59,8 +60,9 @@ namespace MWWorld ///< Return ID of \a ptr or throw an exception, if class does not support ID retrieval /// (default implementation: throw an exception) - virtual void insertObj (const Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + + + virtual void insertObjectRendering (const Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering (default implementation: don't render anything). virtual void enable (const Ptr& ptr, MWWorld::Environment& environment) const; diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index fbe3884279..a4e909ffc7 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -180,7 +180,6 @@ namespace MWWorld : mRendering (renderer,resDir, physEng),mPlayer (0), mLocalScripts (mStore), mGlobalVariables (0), mSky (false), mEnvironment (environment), mNextDynamicRecord (0), mCells (mStore, mEsm, *this) { - std::cout << "Creating myworld\n"; mPhysEngine = physEng; mPhysics = new PhysicsSystem(renderer, physEng); From 042bceb54771260e81c532fa6ca90869b08d9cdc Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Wed, 9 Nov 2011 18:06:55 -0500 Subject: [PATCH 38/55] Changes to insertObjectRendering; Proposed insertObject --- apps/openmw/mwclass/lockpick.cpp | 18 +++++++++++++++++- apps/openmw/mwclass/lockpick.hpp | 2 ++ apps/openmw/mwworld/class.cpp | 3 +++ apps/openmw/mwworld/class.hpp | 2 ++ apps/openmw/mwworld/physicssystem.cpp | 11 +++++++++++ apps/openmw/mwworld/physicssystem.hpp | 4 ++++ 6 files changed, 39 insertions(+), 1 deletion(-) diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index 1296a4144b..e8e9799a28 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -21,13 +21,29 @@ namespace MWClass assert (ref->base != NULL); const std::string &model = ref->base->model; - MWRender::Objects objects = renderingInterface.getObjects(); + if (!model.empty()) { + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, true, false); objects.insertMesh(ptr, "meshes\\" + model); } } + void Lockpick::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + assert (ref->base != NULL); + std::string handle = ptr.getRefData().getHandle(); + if(!handle.empty()){ + physics.insertObjectPhysics(handle); + } + + } + + std::string Lockpick::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/lockpick.hpp b/apps/openmw/mwclass/lockpick.hpp index 9b02dce7f9..979a3b5acc 100644 --- a/apps/openmw/mwclass/lockpick.hpp +++ b/apps/openmw/mwclass/lockpick.hpp @@ -12,6 +12,8 @@ namespace MWClass virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwworld/class.cpp b/apps/openmw/mwworld/class.cpp index 396d92cacf..a80405e137 100644 --- a/apps/openmw/mwworld/class.cpp +++ b/apps/openmw/mwworld/class.cpp @@ -24,6 +24,9 @@ namespace MWWorld void Class::insertObjectRendering (const Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { + } + void Class::insertObject(const Ptr& ptr, MWWorld::PhysicsSystem& physics) const{ + } void Class::enable (const Ptr& ptr, MWWorld::Environment& environment) const diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp index 470235bb00..1a2a4f7768 100644 --- a/apps/openmw/mwworld/class.hpp +++ b/apps/openmw/mwworld/class.hpp @@ -10,6 +10,7 @@ #include "containerstore.hpp" #include "refdata.hpp" #include "../mwrender/renderinginterface.hpp" +#include "physicssystem.hpp" namespace Ogre { @@ -63,6 +64,7 @@ namespace MWWorld virtual void insertObjectRendering (const Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; + virtual void insertObject(const Ptr& ptr, MWWorld::PhysicsSystem& physics) const; ///< Add reference into a cell for rendering (default implementation: don't render anything). virtual void enable (const Ptr& ptr, MWWorld::Environment& environment) const; diff --git a/apps/openmw/mwworld/physicssystem.cpp b/apps/openmw/mwworld/physicssystem.cpp index 067c42151a..8ef0ca9685 100644 --- a/apps/openmw/mwworld/physicssystem.cpp +++ b/apps/openmw/mwworld/physicssystem.cpp @@ -183,4 +183,15 @@ namespace MWWorld throw std::logic_error ("can't find player"); } + void PhysicsSystem::insertObjectPhysics(const std::string& handle){ + Ogre::SceneNode* node = mRender.getScene()->getSceneNode(handle); + addObject (handle, handle, node->getOrientation(), + node->getScale().x, node->getPosition()); + } + + void PhysicsSystem::insertActorPhysics(const std::string& handle){ + Ogre::SceneNode* node = mRender.getScene()->getSceneNode(handle); + addActor (handle, handle, node->getPosition()); + } + } diff --git a/apps/openmw/mwworld/physicssystem.hpp b/apps/openmw/mwworld/physicssystem.hpp index 17640c0744..72f834f6eb 100644 --- a/apps/openmw/mwworld/physicssystem.hpp +++ b/apps/openmw/mwworld/physicssystem.hpp @@ -34,6 +34,10 @@ namespace MWWorld bool toggleCollisionMode(); std::pair getFacedHandle (MWWorld::World& world); + void insertObjectPhysics(const std::string& handle); + + void insertActorPhysics(const std::string& handle); + private: OEngine::Render::OgreRenderer &mRender; OEngine::Physic::PhysicEngine* mEngine; From f4e7bd6dfdb5a0280359310b3bc5979ba7433cd8 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Fri, 11 Nov 2011 00:20:53 -0500 Subject: [PATCH 39/55] Made some recommended changes --- apps/openmw/mwclass/creature.cpp | 2 +- apps/openmw/mwclass/lockpick.cpp | 7 +++---- apps/openmw/mwclass/lockpick.hpp | 2 +- apps/openmw/mwrender/renderingmanager.cpp | 4 ++-- apps/openmw/mwrender/renderingmanager.hpp | 6 ++++-- apps/openmw/mwworld/class.cpp | 2 +- apps/openmw/mwworld/class.hpp | 2 +- apps/openmw/mwworld/physicssystem.cpp | 12 ++++++------ apps/openmw/mwworld/physicssystem.hpp | 4 ++-- apps/openmw/mwworld/refdata.hpp | 3 +++ 10 files changed, 24 insertions(+), 20 deletions(-) diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 2e223c918c..f78e400d24 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -36,7 +36,7 @@ namespace MWClass MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); cellRender.insertMesh("meshes\\" + model); cellRender.insertActorPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + } } diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index e8e9799a28..32f2311b3f 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -30,15 +30,14 @@ namespace MWClass } } - void Lockpick::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics) const + void Lockpick::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); - std::string handle = ptr.getRefData().getHandle(); - if(!handle.empty()){ - physics.insertObjectPhysics(handle); + if(ptr.getRefData().getBaseNode()){ + physics.insertObjectPhysics(ptr); } } diff --git a/apps/openmw/mwclass/lockpick.hpp b/apps/openmw/mwclass/lockpick.hpp index 979a3b5acc..074a07c936 100644 --- a/apps/openmw/mwclass/lockpick.hpp +++ b/apps/openmw/mwclass/lockpick.hpp @@ -12,7 +12,7 @@ namespace MWClass virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering - virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics) const; + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index c21ce8a43a..39c1bca7a1 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -85,10 +85,10 @@ MWRender::Player& RenderingManager::getPlayer(){ void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ } -void RenderingManager::addObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store){ +void RenderingManager::addObject (const MWWorld::Ptr& ptr){ } -void RenderingManager::removeObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store){ +void RenderingManager::removeObject (const MWWorld::Ptr& ptr){ } void RenderingManager::moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position){ diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 16e8e5af41..0508fa54db 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -57,12 +57,14 @@ class RenderingManager: private RenderingInterface { void removeCell (MWWorld::Ptr::CellStore *store); // TODO do we want this? - void addObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store); - void removeObject (const MWWorld::Ptr& ptr, MWWorld::Ptr::CellStore *store); + void addObject (const MWWorld::Ptr& ptr); + void removeObject (const MWWorld::Ptr& ptr); void moveObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& position); void scaleObject (const MWWorld::Ptr& ptr, const Ogre::Vector3& scale); void rotateObject (const MWWorld::Ptr& ptr, const::Ogre::Quaternion& orientation); + + /// \param store Cell the object was in previously (\a ptr has already been updated to the new cell). void moveObjectToCell (const MWWorld::Ptr& ptr, const Ogre::Vector3& position, MWWorld::Ptr::CellStore *store); void setPhysicsDebugRendering (bool); diff --git a/apps/openmw/mwworld/class.cpp b/apps/openmw/mwworld/class.cpp index a80405e137..b4f93576a0 100644 --- a/apps/openmw/mwworld/class.cpp +++ b/apps/openmw/mwworld/class.cpp @@ -25,7 +25,7 @@ namespace MWWorld { } - void Class::insertObject(const Ptr& ptr, MWWorld::PhysicsSystem& physics) const{ + void Class::insertObject(const Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const{ } diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp index 1a2a4f7768..706b11aaad 100644 --- a/apps/openmw/mwworld/class.hpp +++ b/apps/openmw/mwworld/class.hpp @@ -64,7 +64,7 @@ namespace MWWorld virtual void insertObjectRendering (const Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; - virtual void insertObject(const Ptr& ptr, MWWorld::PhysicsSystem& physics) const; + virtual void insertObject(const Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; ///< Add reference into a cell for rendering (default implementation: don't render anything). virtual void enable (const Ptr& ptr, MWWorld::Environment& environment) const; diff --git a/apps/openmw/mwworld/physicssystem.cpp b/apps/openmw/mwworld/physicssystem.cpp index 8ef0ca9685..6ba4805aaf 100644 --- a/apps/openmw/mwworld/physicssystem.cpp +++ b/apps/openmw/mwworld/physicssystem.cpp @@ -183,15 +183,15 @@ namespace MWWorld throw std::logic_error ("can't find player"); } - void PhysicsSystem::insertObjectPhysics(const std::string& handle){ - Ogre::SceneNode* node = mRender.getScene()->getSceneNode(handle); - addObject (handle, handle, node->getOrientation(), + void PhysicsSystem::insertObjectPhysics(const MWWorld::Ptr& ptr){ + Ogre::SceneNode* node = ptr.getRefData().getBaseNode(); + addObject (node->getName(), node->getName(), node->getOrientation(), node->getScale().x, node->getPosition()); } - void PhysicsSystem::insertActorPhysics(const std::string& handle){ - Ogre::SceneNode* node = mRender.getScene()->getSceneNode(handle); - addActor (handle, handle, node->getPosition()); + void PhysicsSystem::insertActorPhysics(const MWWorld::Ptr& ptr){ + Ogre::SceneNode* node = ptr.getRefData().getBaseNode(); + addActor (node->getName(), node->getName(), node->getPosition()); } } diff --git a/apps/openmw/mwworld/physicssystem.hpp b/apps/openmw/mwworld/physicssystem.hpp index 72f834f6eb..8fbcd05217 100644 --- a/apps/openmw/mwworld/physicssystem.hpp +++ b/apps/openmw/mwworld/physicssystem.hpp @@ -34,9 +34,9 @@ namespace MWWorld bool toggleCollisionMode(); std::pair getFacedHandle (MWWorld::World& world); - void insertObjectPhysics(const std::string& handle); + void insertObjectPhysics(const MWWorld::Ptr& ptr); - void insertActorPhysics(const std::string& handle); + void insertActorPhysics(const MWWorld::Ptr& ptr); private: OEngine::Render::OgreRenderer &mRender; diff --git a/apps/openmw/mwworld/refdata.hpp b/apps/openmw/mwworld/refdata.hpp index 062c5942ec..6cef9da19d 100644 --- a/apps/openmw/mwworld/refdata.hpp +++ b/apps/openmw/mwworld/refdata.hpp @@ -55,6 +55,9 @@ namespace MWWorld { return mBaseNode->getName(); } + Ogre::SceneNode* getBaseNode(){ + return mBaseNode; + } void setBaseNode(Ogre::SceneNode* base){ mBaseNode = base; } From 62d8d1add22a70b2e8e8adb69e63e98b66a1dd89 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Fri, 11 Nov 2011 14:37:42 -0500 Subject: [PATCH 40/55] more recommended changes --- apps/openmw/mwclass/lockpick.cpp | 6 ++++-- apps/openmw/mwrender/objects.cpp | 2 +- apps/openmw/mwworld/physicssystem.hpp | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index 32f2311b3f..c80e5ab7cd 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -25,7 +25,7 @@ namespace MWClass if (!model.empty()) { MWRender::Objects objects = renderingInterface.getObjects(); - objects.insertBegin(ptr, true, false); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } } @@ -35,8 +35,10 @@ namespace MWClass ESMS::LiveCellRef *ref = ptr.get(); + + const std::string &model = ref->base->model; assert (ref->base != NULL); - if(ptr.getRefData().getBaseNode()){ + if(!model.empty()){ physics.insertObjectPhysics(ptr); } diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 57e6c65018..8a42167998 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -66,7 +66,7 @@ void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ } void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ - Ogre::SceneNode* insert = mRend.getScene()->getSceneNode(ptr.getRefData().getHandle()); + Ogre::SceneNode* insert = ptr.getRefData().getBaseNode(); assert(insert); NifOgre::NIFLoader::load(mesh); diff --git a/apps/openmw/mwworld/physicssystem.hpp b/apps/openmw/mwworld/physicssystem.hpp index 8fbcd05217..789c81c45d 100644 --- a/apps/openmw/mwworld/physicssystem.hpp +++ b/apps/openmw/mwworld/physicssystem.hpp @@ -4,6 +4,7 @@ #include #include #include +#include "ptr.hpp" namespace MWWorld { From c7dadec8401a54d22580acaebfe60b2944c9cd6c Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Fri, 11 Nov 2011 23:01:12 -0500 Subject: [PATCH 41/55] Updating the rest of mwclass --- apps/openmw/mwclass/activator.cpp | 25 +++- apps/openmw/mwclass/activator.hpp | 5 +- apps/openmw/mwclass/apparatus.cpp | 25 +++- apps/openmw/mwclass/apparatus.hpp | 5 +- apps/openmw/mwclass/armor.cpp | 24 ++- apps/openmw/mwclass/armor.hpp | 5 +- apps/openmw/mwclass/book.cpp | 25 +++- apps/openmw/mwclass/book.hpp | 5 +- apps/openmw/mwclass/clothing.cpp | 25 +++- apps/openmw/mwclass/clothing.hpp | 5 +- apps/openmw/mwclass/container.cpp | 25 +++- apps/openmw/mwclass/container.hpp | 5 +- apps/openmw/mwclass/creature.cpp | 25 +++- apps/openmw/mwclass/creature.hpp | 5 +- apps/openmw/mwclass/door.cpp | 27 +++- apps/openmw/mwclass/door.hpp | 5 +- apps/openmw/mwclass/ingredient.cpp | 26 +++- apps/openmw/mwclass/ingredient.hpp | 5 +- apps/openmw/mwclass/light.cpp | 35 +++-- apps/openmw/mwclass/light.hpp | 5 +- apps/openmw/mwclass/misc.cpp | 25 +++- apps/openmw/mwclass/misc.hpp | 5 +- apps/openmw/mwclass/npc.cpp | 227 ++--------------------------- apps/openmw/mwclass/npc.hpp | 5 +- apps/openmw/mwclass/potion.cpp | 25 +++- apps/openmw/mwclass/potion.hpp | 5 +- apps/openmw/mwclass/probe.cpp | 21 ++- apps/openmw/mwclass/probe.hpp | 5 +- apps/openmw/mwclass/repair.cpp | 25 +++- apps/openmw/mwclass/repair.hpp | 5 +- apps/openmw/mwclass/static.cpp | 25 +++- apps/openmw/mwclass/static.hpp | 5 +- apps/openmw/mwclass/weapon.cpp | 25 +++- apps/openmw/mwclass/weapon.hpp | 5 +- 34 files changed, 369 insertions(+), 351 deletions(-) diff --git a/apps/openmw/mwclass/activator.cpp b/apps/openmw/mwclass/activator.cpp index 4d4b7aeaae..cd34997d23 100644 --- a/apps/openmw/mwclass/activator.cpp +++ b/apps/openmw/mwclass/activator.cpp @@ -11,23 +11,36 @@ namespace MWClass { - void Activator::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Activator::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Activator::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Activator::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/activator.hpp b/apps/openmw/mwclass/activator.hpp index 3b48796ac9..08be8a5ff1 100644 --- a/apps/openmw/mwclass/activator.hpp +++ b/apps/openmw/mwclass/activator.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/apparatus.cpp b/apps/openmw/mwclass/apparatus.cpp index ddf96d1be9..6f23614e21 100644 --- a/apps/openmw/mwclass/apparatus.cpp +++ b/apps/openmw/mwclass/apparatus.cpp @@ -14,23 +14,36 @@ namespace MWClass { - void Apparatus::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Apparatus::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Apparatus::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Apparatus::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/apparatus.hpp b/apps/openmw/mwclass/apparatus.hpp index c2e6e25e12..9a5a9b9558 100644 --- a/apps/openmw/mwclass/apparatus.hpp +++ b/apps/openmw/mwclass/apparatus.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/armor.cpp b/apps/openmw/mwclass/armor.cpp index 9452fea161..f409bb9b07 100644 --- a/apps/openmw/mwclass/armor.cpp +++ b/apps/openmw/mwclass/armor.cpp @@ -14,23 +14,35 @@ namespace MWClass { - void Armor::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Armor::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Armor::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Armor::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/armor.hpp b/apps/openmw/mwclass/armor.hpp index 040342a69f..123713a38b 100644 --- a/apps/openmw/mwclass/armor.hpp +++ b/apps/openmw/mwclass/armor.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/book.cpp b/apps/openmw/mwclass/book.cpp index c2d3c4aa81..f9c20b8e81 100644 --- a/apps/openmw/mwclass/book.cpp +++ b/apps/openmw/mwclass/book.cpp @@ -14,23 +14,36 @@ namespace MWClass { - void Book::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Book::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Book::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Book::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/book.hpp b/apps/openmw/mwclass/book.hpp index 70d1bca3b5..6e38ea0d3d 100644 --- a/apps/openmw/mwclass/book.hpp +++ b/apps/openmw/mwclass/book.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/clothing.cpp b/apps/openmw/mwclass/clothing.cpp index 7c69573ed5..0dc2b46157 100644 --- a/apps/openmw/mwclass/clothing.cpp +++ b/apps/openmw/mwclass/clothing.cpp @@ -14,23 +14,36 @@ namespace MWClass { - void Clothing::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Clothing::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Clothing::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Clothing::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/clothing.hpp b/apps/openmw/mwclass/clothing.hpp index fb88e25dfd..353f7f606c 100644 --- a/apps/openmw/mwclass/clothing.hpp +++ b/apps/openmw/mwclass/clothing.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index ad2ab8d655..e24177d6ce 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -11,23 +11,36 @@ namespace MWClass { - void Container::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Container::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Container::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Container::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/container.hpp b/apps/openmw/mwclass/container.hpp index de54a9e68e..9d65927f8d 100644 --- a/apps/openmw/mwclass/container.hpp +++ b/apps/openmw/mwclass/container.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index f78e400d24..2eca305393 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -23,23 +23,36 @@ namespace MWClass return ref->base->mId; } - void Creature::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Creature::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh("meshes\\" + model); - cellRender.insertActorPhysics(); - + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Creature::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertActorPhysics(ptr); + } + + } + void Creature::enable (const MWWorld::Ptr& ptr, MWWorld::Environment& environment) const { environment.mMechanicsManager->addActor (ptr); diff --git a/apps/openmw/mwclass/creature.hpp b/apps/openmw/mwclass/creature.hpp index 9f6708f401..e1657b2c71 100644 --- a/apps/openmw/mwclass/creature.hpp +++ b/apps/openmw/mwclass/creature.hpp @@ -12,10 +12,11 @@ namespace MWClass virtual std::string getId (const MWWorld::Ptr& ptr) const; ///< Return ID of \a ptr - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual void enable (const MWWorld::Ptr& ptr, MWWorld::Environment& environment) const; ///< Enable reference; only does the non-rendering part diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index e32e3ef4eb..9e2b17b2e1 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -18,23 +18,36 @@ namespace MWClass { - void Door::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Door::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { - ESMS::LiveCellRef *ref = + ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Door::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Door::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/door.hpp b/apps/openmw/mwclass/door.hpp index aecb117d36..aecb4224cc 100644 --- a/apps/openmw/mwclass/door.hpp +++ b/apps/openmw/mwclass/door.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/ingredient.cpp b/apps/openmw/mwclass/ingredient.cpp index e2c9b072f2..1ef695b447 100644 --- a/apps/openmw/mwclass/ingredient.cpp +++ b/apps/openmw/mwclass/ingredient.cpp @@ -14,23 +14,37 @@ namespace MWClass { - void Ingredient::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Ingredient::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Ingredient::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Ingredient::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/ingredient.hpp b/apps/openmw/mwclass/ingredient.hpp index 8b781ba2f0..6c74096659 100644 --- a/apps/openmw/mwclass/ingredient.hpp +++ b/apps/openmw/mwclass/ingredient.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index f32378002f..8e7f32a6c9 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -18,33 +18,42 @@ namespace MWClass { - void Light::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Light::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - - // Extract the color and convert to floating point + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); const int color = ref->base->data.color; - const float r = ((color >> 0) & 0xFF) / 255.0f; - const float g = ((color >> 8) & 0xFF) / 255.0f; + const float r = ((color >> 0) & 0xFF) / 255.0f; + const float g = ((color >> 8) & 0xFF) / 255.0f; const float b = ((color >> 16) & 0xFF) / 255.0f; const float radius = float (ref->base->data.radius); - cellRender.insertLight (r, g, b, radius); - - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + objects.insertLight (r, g, b, radius); } } + void Light::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + void Light::enable (const MWWorld::Ptr& ptr, MWWorld::Environment& environment) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/light.hpp b/apps/openmw/mwclass/light.hpp index 5a1a15b1d4..7df82ae5db 100644 --- a/apps/openmw/mwclass/light.hpp +++ b/apps/openmw/mwclass/light.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual void enable (const MWWorld::Ptr& ptr, MWWorld::Environment& environment) const; ///< Enable reference; only does the non-rendering part /// \attention This is not the same as the script instruction with the same name. References diff --git a/apps/openmw/mwclass/misc.cpp b/apps/openmw/mwclass/misc.cpp index 84560d009c..d331fd35bf 100644 --- a/apps/openmw/mwclass/misc.cpp +++ b/apps/openmw/mwclass/misc.cpp @@ -14,23 +14,36 @@ namespace MWClass { - void Miscellaneous::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Miscellaneous::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Miscellaneous::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Miscellaneous::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/misc.hpp b/apps/openmw/mwclass/misc.hpp index 81262cbee8..cb18583156 100644 --- a/apps/openmw/mwclass/misc.hpp +++ b/apps/openmw/mwclass/misc.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index 83161ebeb3..ccca0f6884 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -32,229 +32,34 @@ namespace MWClass return ref->base->mId; } - void Npc::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Npc::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { - //Ogre::SceneNode *chest; ESMS::LiveCellRef *ref = ptr.get(); - //Store scenenodes by npc's name + bodypart [0] , npc's name + bodypart [1] - //Ex. Fargothchest , Fargothneck - assert (ref->base != NULL); - - std::string hairID = ref->base->hair; - std::string headID = ref->base->head; - - // very ugly workaround to stop OGRE from chocking on non-unique scene node handles - static int uniqueId = 0; - - std::ostringstream stream; - stream << "npc$" << uniqueId++; - - std::string npcName = stream.str(); // ref->base->name; - //std::cout << "NPC: " << npcName << "\n"; - - //get the part of the bodypart id which describes the race and the gender - std::string bodyRaceID = headID.substr(0, headID.find_last_of("head_") - 4); - std::string headModel = "meshes\\" + - environment.mWorld->getStore().bodyParts.find(headID)->model; - - std::string hairModel = "meshes\\" + - environment.mWorld->getStore().bodyParts.find(hairID)->model; - - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - - - //TODO: define consts for each bodypart e.g. chest, foot, wrist... and put the parts in the - // right place - const ESM::BodyPart *bodyPart = - environment.mWorld->getStore().bodyParts.search (bodyRaceID + "chest"); - - //bodyPart->model-> - Ogre::Vector3 pos = Ogre::Vector3( 20, 20, 20); - Ogre::Vector3 axis = Ogre::Vector3( 0, 0, 1); - Ogre::Radian angle = Ogre::Radian(0); - - std::string addresses[6] = {"", "", "", "","", ""}; - std::string addresses2[6] = {"", "", "", "", "", ""}; - std::string upperleft[5] = {"", "", "", "", ""}; - std::string upperright[5] = {"", "", "", "", ""}; - std::string neckandup[5] = {"", "", "","",""}; - int numbers = 0; - int uppernumbers = 0; - int neckNumbers = 0; - - if (bodyPart){ - - cellRender.insertMesh("meshes\\" + bodyPart->model, pos, axis, angle, npcName + "chest", addresses, numbers, true); //2 0 - addresses2[numbers] = npcName + "chest"; - addresses[numbers++] = npcName + "chest"; - upperleft[uppernumbers] = npcName + "chest"; - upperright[uppernumbers++] = npcName + "chest"; - neckandup[neckNumbers++] = npcName + "chest"; - } - - - const ESM::BodyPart *upperleg = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "upper leg"); - const ESM::BodyPart *groin = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "groin"); - const ESM::BodyPart *arm = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "upper arm"); - const ESM::BodyPart *neck = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "neck"); - const ESM::BodyPart *knee = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "knee"); - const ESM::BodyPart *ankle = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "ankle"); - const ESM::BodyPart *foot = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "foot"); - const ESM::BodyPart *feet = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "feet"); - const ESM::BodyPart *tail = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "tail"); - const ESM::BodyPart *wrist = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "wrist"); - const ESM::BodyPart *forearm = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "forearm"); - const ESM::BodyPart *hand = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "hand.1st"); - const ESM::BodyPart *hands = environment.mWorld->getStore().bodyParts.search (bodyRaceID + "hands.1st"); - - - Ogre::Vector3 pos2 = Ogre::Vector3( 0, .5, 75); - - if (groin){ - cellRender.insertMesh("meshes\\" + groin->model, pos2, axis, kOgrePi, npcName + "groin", addresses, numbers); - addresses2[numbers] = npcName + "groin"; - addresses[numbers++] = npcName + "groin"; - } - if (tail) { - cellRender.insertMesh("tail\\" + tail->model, Ogre::Vector3(0 , 0, -76), axis, kOgrePi, npcName + "tail", addresses, numbers, "tail"); - } - - - if(upperleg){ - cellRender.insertMesh ("meshes\\" + upperleg->model, Ogre::Vector3( 6, 0, -16), axis, kOgrePi, npcName + "upper leg", addresses, numbers); //-18 - cellRender.insertMesh ("meshes\\" + upperleg->model, Ogre::Vector3( -6, 0, -16), axis, Ogre::Radian(0), npcName + "upper leg2", addresses2, numbers); - addresses2[numbers] = npcName + "upper leg2"; - addresses[numbers++] = npcName + "upper leg"; - cellRender.scaleMesh(Ogre::Vector3(1, -1, 1), addresses, numbers); - } - if(knee) + const std::string &model = ref->base->model; + + if (!model.empty()) { - cellRender.insertMesh ("meshes\\" + knee->model, Ogre::Vector3( 0, -1, -23), axis, Ogre::Radian(0), npcName + "knee", addresses, numbers); - //cellRender.rotateMesh(Ogre::Vector3(0, 1, 0), Ogre::Radian (1), npcName + "upper arm"); - cellRender.insertMesh ("meshes\\" + knee->model, Ogre::Vector3( 0, -1, -23), axis, Ogre::Radian(0), npcName + "knee2", addresses2, numbers); - - addresses2[numbers] = npcName + "knee2"; - addresses[numbers++] = npcName + "knee"; + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } - if(ankle){ + } - cellRender.insertMesh ("meshes\\" + ankle->model, Ogre::Vector3( 0, 0, -20), axis, Ogre::Radian(0), npcName + "ankle", addresses, numbers); //-1 - cellRender.insertMesh ("meshes\\" + ankle->model, Ogre::Vector3( 0,0, -20), axis, Ogre::Radian(0), npcName + "ankle2", addresses2, numbers); //-1 + void Npc::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); - addresses2[numbers] = npcName + "ankle2"; - addresses[numbers++] = npcName + "ankle"; - } - if(foot){ - if(bodyRaceID.compare("b_n_khajiit_m_") == 0) - { - feet = foot; - } - else - { - cellRender.insertMesh ("meshes\\" + foot->model, Ogre::Vector3( 0, -4, -15), axis, Ogre::Radian(0), npcName + "foot", addresses, numbers); - cellRender.insertMesh ("meshes\\" + foot->model, Ogre::Vector3( 0, -4, -15), axis, Ogre::Radian(0), npcName + "foot2", addresses2, numbers); - addresses2[numbers] = npcName + "foot2"; - addresses[numbers++] = npcName + "foot"; - } - //cellRender.scaleMesh(Ogre::Vector3(1, -1, 1), addresses, numbers); - } - if(feet){ - - cellRender.insertMesh ("foot\\" + feet->model, Ogre::Vector3( 7, 4, -16), axis, kOgrePi, npcName + "foot", addresses, numbers); //9, 0, -14 - - cellRender.insertMesh ("foot\\" + feet->model, Ogre::Vector3( 7, 4, -16), axis, kOgrePi, npcName + "foot2", addresses2, numbers); - addresses2[numbers] = npcName + "foot2"; - addresses[numbers++] = npcName + "foot"; - //cellRender.scaleMesh(Ogre::Vector3(1, -1, 1), addresses, numbers); + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertActorPhysics(ptr); } - - if (arm){ - //010 - cellRender.insertMesh("meshes\\" + arm->model, Ogre::Vector3(-12.5, 0, 104), Ogre::Vector3(0, 1, 0), -kOgrePiOverTwo, npcName + "upper arm", upperleft, uppernumbers); //1, 0,.75 - //cellRender.rotateMesh(Ogre::Vector3(1, 0, 0), Ogre::Radian (.45), upperarmpath, 2); //-.5, 0, -.75 - cellRender.insertMesh("meshes\\" + arm->model, Ogre::Vector3(12.5, 0, 105), Ogre::Vector3(-.5, 0, -.75), kOgrePi, npcName + "upper arm2", upperright, uppernumbers); - upperleft[uppernumbers] = npcName + "upper arm"; - upperright[uppernumbers++] = npcName + "upper arm2"; - cellRender.scaleMesh(Ogre::Vector3(1, -1, 1), upperleft, uppernumbers); //1 -1 1 - cellRender.rotateMesh(Ogre::Vector3(0, .1, 0), kOgrePiOverTwo, upperleft, uppernumbers); - } - - if (forearm) - { - //addresses[1] = npcName + "upper arm"; - cellRender.insertMesh("meshes\\" + forearm->model, Ogre::Vector3(-12.5, 0, 0), Ogre::Vector3(0, 0, 0), kOgrePi, npcName + "forearm", upperleft, uppernumbers); - cellRender.insertMesh("meshes\\" + forearm->model, Ogre::Vector3(-12.5, 0, 0), Ogre::Vector3(0, 0, 0), kOgrePi, npcName + "forearm2", upperright, uppernumbers); - upperleft[uppernumbers] = npcName + "forearm"; - upperright[uppernumbers++] = npcName + "forearm2"; - } - //else - // std::cout << npcName << "has no forearm"; - if (wrist) - { - if(upperleft[uppernumbers - 1].compare(npcName + "upper arm") == 0) - { - cellRender.insertMesh("meshes\\b\\B_N_Argonian_M_Forearm.nif", Ogre::Vector3(-12.5, 0, 0), Ogre::Vector3(0, 0, 0), kOgrePi, npcName + "forearm", upperleft, uppernumbers); - cellRender.insertMesh("meshes\\b\\B_N_Argonian_M_Forearm.nif", Ogre::Vector3(-12.5, 0, 0), Ogre::Vector3(0, 0, 0), kOgrePi, npcName + "forearm2", upperright, uppernumbers); - upperleft[uppernumbers] = npcName + "forearm"; - upperright[uppernumbers++] = npcName + "forearm2"; - - } - cellRender.insertMesh("meshes\\" + wrist->model, Ogre::Vector3(-9.5, 0, 0), Ogre::Vector3(0, 0, 0), kOgrePi, npcName + "wrist", upperleft, uppernumbers); - cellRender.insertMesh("meshes\\" + wrist->model, Ogre::Vector3(-9.5, 0, 0), Ogre::Vector3(0, 0, 0), kOgrePi, npcName + "wrist2", upperright, uppernumbers); - upperleft[uppernumbers] = npcName + "wrist"; - upperright[uppernumbers++] = npcName + "wrist2"; - } - - - if(hand) - { - std::string pass; - if(hand->model.compare("b\\B_N_Dark Elf_F_Hands.1st.NIF")==0 && bodyRaceID.compare("b_n_dark elf_m_") == 0) - pass = "b\\B_N_Dark Elf_M_Hands.1st.NIF"; - else - pass = hand->model; - cellRender.insertMesh("meshes\\" + pass, Ogre::Vector3(42, 1, -110), Ogre::Vector3(0, 0, 0), kOgrePi, npcName + "hand", upperleft, uppernumbers,false); //0, 100, -100 0,0,120 - cellRender.insertMesh("meshes\\" + pass, Ogre::Vector3(42, 1, -110), Ogre::Vector3(0, 0,0), kOgrePi, npcName + "hand2", upperright, uppernumbers, false); //0, 100, -100 0,0,120 - upperleft[uppernumbers] = npcName + "hand"; - upperright[uppernumbers++] = npcName + "hand2"; - cellRender.scaleMesh(Ogre::Vector3(1, -1, 1), upperleft, uppernumbers); - cellRender.scaleMesh(Ogre::Vector3(1, -1, 1), upperright, uppernumbers); - } - if(hands) - { - std::string pass; - if(hands->model.compare("b\\B_N_Redguard_F_Hands.1st.nif")==0 && bodyRaceID.compare("b_n_redguard_m_") == 0) - pass = "b\\B_N_Redguard_M_Hands.1st.nif"; - else if(hands->model.compare("b\\B_N_Imperial_M_Hands.1st.nif") == 0 && bodyRaceID.compare("b_n_nord_m_") == 0) - pass = "b\\B_N_Nord_M_Hands.1st.nif"; - else - pass =hands->model; //-50, 0, -120 - cellRender.insertMesh("meshes\\" + pass, Ogre::Vector3(42, 1,-110), Ogre::Vector3(0, 0, 0), kOgrePi, npcName + "hand", upperleft, uppernumbers, false); //0, 100, -100 42, 0, -110 - cellRender.insertMesh("meshes\\" + pass, Ogre::Vector3(42, 1, -110), Ogre::Vector3(0, 0, 0), kOgrePi, npcName + "hand2", upperright, uppernumbers, false); //0, 100, -100 0,0,120 - upperleft[uppernumbers] = npcName + "hand"; - upperright[uppernumbers++] = npcName + "hand2"; - cellRender.scaleMesh(Ogre::Vector3(1, -1, 1), upperleft, uppernumbers); - cellRender.scaleMesh(Ogre::Vector3(1, -1, 1), upperright, uppernumbers); - } - - //neck will reset chest counter - if(neck) - { - cellRender.insertMesh ("meshes\\" + neck->model, Ogre::Vector3( 0, 0, 120), axis, kOgrePi, npcName + "neck", neckandup, neckNumbers); - neckandup[neckNumbers++] = npcName + "neck"; - } - cellRender.insertMesh (headModel, Ogre::Vector3( 0, 0, 5), axis, Ogre::Radian(0), npcName + "head", neckandup, neckNumbers); - neckandup[neckNumbers++] = npcName + "head"; - cellRender.insertMesh (hairModel, Ogre::Vector3( 0, -1, 0), axis, Ogre::Radian(0), npcName + "hair", neckandup, neckNumbers); - - cellRender.insertActorPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); } void Npc::enable (const MWWorld::Ptr& ptr, MWWorld::Environment& environment) const diff --git a/apps/openmw/mwclass/npc.hpp b/apps/openmw/mwclass/npc.hpp index 9f29878da4..095f0de417 100644 --- a/apps/openmw/mwclass/npc.hpp +++ b/apps/openmw/mwclass/npc.hpp @@ -12,10 +12,11 @@ namespace MWClass virtual std::string getId (const MWWorld::Ptr& ptr) const; ///< Return ID of \a ptr - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual void enable (const MWWorld::Ptr& ptr, MWWorld::Environment& environment) const; ///< Enable reference; only does the non-rendering part diff --git a/apps/openmw/mwclass/potion.cpp b/apps/openmw/mwclass/potion.cpp index 7cd6db223f..2eb1bbfa45 100644 --- a/apps/openmw/mwclass/potion.cpp +++ b/apps/openmw/mwclass/potion.cpp @@ -14,23 +14,36 @@ namespace MWClass { - void Potion::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Potion::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Potion::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Potion::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/potion.hpp b/apps/openmw/mwclass/potion.hpp index 9bf3b34a8e..e1a54db3c7 100644 --- a/apps/openmw/mwclass/potion.hpp +++ b/apps/openmw/mwclass/potion.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/probe.cpp b/apps/openmw/mwclass/probe.cpp index b92f5ff267..59d836446c 100644 --- a/apps/openmw/mwclass/probe.cpp +++ b/apps/openmw/mwclass/probe.cpp @@ -14,29 +14,34 @@ namespace MWClass { - void Probe::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Probe::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } - std::string Probe::getName (const MWWorld::Ptr& ptr) const + void Probe::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const { ESMS::LiveCellRef *ref = ptr.get(); - return ref->base->name; + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + } boost::shared_ptr Probe::activate (const MWWorld::Ptr& ptr, diff --git a/apps/openmw/mwclass/probe.hpp b/apps/openmw/mwclass/probe.hpp index 11399d2f6e..287dd04755 100644 --- a/apps/openmw/mwclass/probe.hpp +++ b/apps/openmw/mwclass/probe.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/repair.cpp b/apps/openmw/mwclass/repair.cpp index d52f04e536..320e3827ef 100644 --- a/apps/openmw/mwclass/repair.cpp +++ b/apps/openmw/mwclass/repair.cpp @@ -14,23 +14,36 @@ namespace MWClass { - void Repair::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Repair::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Repair::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Repair::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/repair.hpp b/apps/openmw/mwclass/repair.hpp index 3da591e01b..174197d9a9 100644 --- a/apps/openmw/mwclass/repair.hpp +++ b/apps/openmw/mwclass/repair.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/static.cpp b/apps/openmw/mwclass/static.cpp index 5691f92baa..372606acea 100644 --- a/apps/openmw/mwclass/static.cpp +++ b/apps/openmw/mwclass/static.cpp @@ -9,23 +9,36 @@ namespace MWClass { - void Static::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Static::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData, true); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Static::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Static::getName (const MWWorld::Ptr& ptr) const { return ""; diff --git a/apps/openmw/mwclass/static.hpp b/apps/openmw/mwclass/static.hpp index abbf6cd5f5..a4b1d8c547 100644 --- a/apps/openmw/mwclass/static.hpp +++ b/apps/openmw/mwclass/static.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/weapon.cpp b/apps/openmw/mwclass/weapon.cpp index 5dcc94fc8e..dd52ed4953 100644 --- a/apps/openmw/mwclass/weapon.cpp +++ b/apps/openmw/mwclass/weapon.cpp @@ -14,23 +14,36 @@ namespace MWClass { - void Weapon::insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const + void Weapon::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { ESMS::LiveCellRef *ref = ptr.get(); assert (ref->base != NULL); const std::string &model = ref->base->model; + if (!model.empty()) { - MWRender::Rendering rendering (cellRender, ref->ref, ref->mData); - cellRender.insertMesh ("meshes\\" + model); - cellRender.insertObjectPhysics(); - ref->mData.setHandle (rendering.end (ref->mData.isEnabled())); + MWRender::Objects objects = renderingInterface.getObjects(); + objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + objects.insertMesh(ptr, "meshes\\" + model); } } + void Weapon::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + + const std::string &model = ref->base->model; + assert (ref->base != NULL); + if(!model.empty()){ + physics.insertObjectPhysics(ptr); + } + + } + std::string Weapon::getName (const MWWorld::Ptr& ptr) const { ESMS::LiveCellRef *ref = diff --git a/apps/openmw/mwclass/weapon.hpp b/apps/openmw/mwclass/weapon.hpp index d9c7653ddd..84c633ab31 100644 --- a/apps/openmw/mwclass/weapon.hpp +++ b/apps/openmw/mwclass/weapon.hpp @@ -9,10 +9,11 @@ namespace MWClass { public: - virtual void insertObj (const MWWorld::Ptr& ptr, MWRender::CellRenderImp& cellRender, - MWWorld::Environment& environment) const; + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; ///< Add reference into a cell for rendering + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. From 0b3bb2719f30b0575b37f14108f3515933dddaca Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 12 Nov 2011 00:19:22 -0500 Subject: [PATCH 42/55] Fixing some errors --- apps/openmw/mwclass/light.cpp | 2 +- apps/openmw/mwclass/lockpick.cpp | 1 - apps/openmw/mwrender/renderinginterface.hpp | 2 ++ apps/openmw/mwrender/renderingmanager.cpp | 1 - apps/openmw/mwrender/renderingmanager.hpp | 7 ++++++- apps/openmw/mwworld/class.hpp | 5 ++++- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index 8e7f32a6c9..3fb4559140 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -36,7 +36,7 @@ namespace MWClass const float g = ((color >> 8) & 0xFF) / 255.0f; const float b = ((color >> 16) & 0xFF) / 255.0f; const float radius = float (ref->base->data.radius); - objects.insertLight (r, g, b, radius); + objects.insertLight (ptr, r, g, b, radius); } } diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index c80e5ab7cd..8e782bb0f3 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -9,7 +9,6 @@ #include "../mwworld/actiontake.hpp" #include "../mwrender/cellimp.hpp" -#include "../mwrender/renderinginterface.hpp" #include "containerutil.hpp" namespace MWClass diff --git a/apps/openmw/mwrender/renderinginterface.hpp b/apps/openmw/mwrender/renderinginterface.hpp index 28f3b61fcc..fed1fd3ec1 100644 --- a/apps/openmw/mwrender/renderinginterface.hpp +++ b/apps/openmw/mwrender/renderinginterface.hpp @@ -1,6 +1,8 @@ #include "objects.hpp" #include "npcs.hpp" #include "creatures.hpp" +#include "player.hpp" +#define RENDERING_INTERFACE 1 namespace MWRender{ class RenderingInterface{ public: diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 39c1bca7a1..9242fac67e 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -13,7 +13,6 @@ #include "../mwworld/ptr.hpp" #include -#include "player.hpp" using namespace MWRender; diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 0508fa54db..f3bc7005da 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -4,7 +4,9 @@ #include "sky.hpp" #include "debugging.hpp" -#include "renderinginterface.hpp" +//Commented out for now, possibly do an ifdef if necessary, cla + + #include #include @@ -17,6 +19,9 @@ #include +#ifndef RENDERING_INTERFACE +#include "renderinginterface.hpp" +#endif namespace Ogre diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp index 706b11aaad..44de4888f7 100644 --- a/apps/openmw/mwworld/class.hpp +++ b/apps/openmw/mwworld/class.hpp @@ -9,8 +9,11 @@ #include "action.hpp" #include "containerstore.hpp" #include "refdata.hpp" -#include "../mwrender/renderinginterface.hpp" + #include "physicssystem.hpp" +#ifndef RENDERING_INTERFACE +#include "../mwrender/renderinginterface.hpp" +#endif namespace Ogre { From bc58ef28cdc6e135515349d90f9096c310cbdbe2 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 12 Nov 2011 15:58:22 -0500 Subject: [PATCH 43/55] Made corrections --- apps/openmw/mwclass/activator.cpp | 1 + apps/openmw/mwclass/apparatus.hpp | 1 + apps/openmw/mwclass/armor.hpp | 1 + apps/openmw/mwclass/book.hpp | 1 + apps/openmw/mwclass/clothing.hpp | 1 + apps/openmw/mwclass/container.hpp | 1 + apps/openmw/mwclass/creature.cpp | 6 +++--- apps/openmw/mwclass/creature.hpp | 1 + apps/openmw/mwclass/door.cpp | 1 + apps/openmw/mwclass/door.hpp | 1 + apps/openmw/mwclass/ingredient.hpp | 1 + apps/openmw/mwclass/itemlevlist.hpp | 5 +++++ apps/openmw/mwclass/light.hpp | 1 + apps/openmw/mwclass/lockpick.hpp | 1 + apps/openmw/mwclass/misc.hpp | 1 + apps/openmw/mwclass/npc.cpp | 7 ++++--- apps/openmw/mwclass/npc.hpp | 1 + apps/openmw/mwclass/potion.hpp | 1 + apps/openmw/mwclass/probe.hpp | 1 + apps/openmw/mwclass/repair.hpp | 1 + apps/openmw/mwclass/static.hpp | 1 + apps/openmw/mwclass/weapon.hpp | 1 + apps/openmw/mwrender/creatures.hpp | 5 ++++- apps/openmw/mwrender/npcs.hpp | 3 +++ apps/openmw/mwrender/objects.hpp | 6 +++++- apps/openmw/mwrender/renderinginterface.hpp | 15 +++++++++------ apps/openmw/mwrender/renderingmanager.cpp | 2 +- apps/openmw/mwrender/renderingmanager.hpp | 13 +++++++------ apps/openmw/mwworld/class.hpp | 5 +---- 29 files changed, 61 insertions(+), 25 deletions(-) diff --git a/apps/openmw/mwclass/activator.cpp b/apps/openmw/mwclass/activator.cpp index cd34997d23..fcad0d3336 100644 --- a/apps/openmw/mwclass/activator.cpp +++ b/apps/openmw/mwclass/activator.cpp @@ -1,5 +1,6 @@ #include "activator.hpp" +#include "../mwrender/objects.hpp" #include diff --git a/apps/openmw/mwclass/apparatus.hpp b/apps/openmw/mwclass/apparatus.hpp index 9a5a9b9558..4c8a2c0e2d 100644 --- a/apps/openmw/mwclass/apparatus.hpp +++ b/apps/openmw/mwclass/apparatus.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_APPARATUS_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/armor.hpp b/apps/openmw/mwclass/armor.hpp index 123713a38b..c5f9812b79 100644 --- a/apps/openmw/mwclass/armor.hpp +++ b/apps/openmw/mwclass/armor.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_ARMOR_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/book.hpp b/apps/openmw/mwclass/book.hpp index 6e38ea0d3d..f0e38cceba 100644 --- a/apps/openmw/mwclass/book.hpp +++ b/apps/openmw/mwclass/book.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_BOOK_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/clothing.hpp b/apps/openmw/mwclass/clothing.hpp index 353f7f606c..76c2c4a3e4 100644 --- a/apps/openmw/mwclass/clothing.hpp +++ b/apps/openmw/mwclass/clothing.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_CLOTHING_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/container.hpp b/apps/openmw/mwclass/container.hpp index 9d65927f8d..01763870ad 100644 --- a/apps/openmw/mwclass/container.hpp +++ b/apps/openmw/mwclass/container.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_CONTAINER_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 2eca305393..12978c0dc5 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -33,9 +33,9 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); - objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); - objects.insertMesh(ptr, "meshes\\" + model); + MWRender::Creatures creatures = renderingInterface.getCreatures(); + //creatures.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + //creatures.insertMesh(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/creature.hpp b/apps/openmw/mwclass/creature.hpp index e1657b2c71..f74cdf9910 100644 --- a/apps/openmw/mwclass/creature.hpp +++ b/apps/openmw/mwclass/creature.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_CREATURE_H #include "../mwworld/class.hpp" +#include "../mwrender/creatures.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index 9e2b17b2e1..5073afb126 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -13,6 +13,7 @@ #include "../mwworld/world.hpp" #include "../mwrender/cellimp.hpp" +#include "../mwrender/objects.hpp" #include diff --git a/apps/openmw/mwclass/door.hpp b/apps/openmw/mwclass/door.hpp index aecb4224cc..c230cf3576 100644 --- a/apps/openmw/mwclass/door.hpp +++ b/apps/openmw/mwclass/door.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_DOOR_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/ingredient.hpp b/apps/openmw/mwclass/ingredient.hpp index 6c74096659..47bd1a9e5c 100644 --- a/apps/openmw/mwclass/ingredient.hpp +++ b/apps/openmw/mwclass/ingredient.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_INGREDIENT_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/itemlevlist.hpp b/apps/openmw/mwclass/itemlevlist.hpp index 0b71b072c8..c7d630aee1 100644 --- a/apps/openmw/mwclass/itemlevlist.hpp +++ b/apps/openmw/mwclass/itemlevlist.hpp @@ -9,6 +9,11 @@ namespace MWClass { public: + virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; + ///< Add reference into a cell for rendering + + virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; + virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/light.hpp b/apps/openmw/mwclass/light.hpp index 7df82ae5db..34421ff513 100644 --- a/apps/openmw/mwclass/light.hpp +++ b/apps/openmw/mwclass/light.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_LIGHT_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/lockpick.hpp b/apps/openmw/mwclass/lockpick.hpp index 074a07c936..c5f1539b4c 100644 --- a/apps/openmw/mwclass/lockpick.hpp +++ b/apps/openmw/mwclass/lockpick.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_LOCKPICK_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/misc.hpp b/apps/openmw/mwclass/misc.hpp index cb18583156..36ee2c1b26 100644 --- a/apps/openmw/mwclass/misc.hpp +++ b/apps/openmw/mwclass/misc.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_MISC_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index ccca0f6884..6ecdc6e4e6 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -15,6 +15,7 @@ #include "../mwmechanics/mechanicsmanager.hpp" #include +#include "../mwrender/objects.hpp" namespace { @@ -42,9 +43,9 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); - objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); - objects.insertMesh(ptr, "meshes\\" + model); + MWRender::Npcs npcs = renderingInterface.getNPCs(); + //npcs.insertBegin(ptr, ptr.getRefData().isEnabled(), false); + //npcs.insertMesh(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/npc.hpp b/apps/openmw/mwclass/npc.hpp index 095f0de417..271d66392d 100644 --- a/apps/openmw/mwclass/npc.hpp +++ b/apps/openmw/mwclass/npc.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_NPC_H #include "../mwworld/class.hpp" +#include "../mwrender/npcs.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/potion.hpp b/apps/openmw/mwclass/potion.hpp index e1a54db3c7..85678121fb 100644 --- a/apps/openmw/mwclass/potion.hpp +++ b/apps/openmw/mwclass/potion.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_POTION_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/probe.hpp b/apps/openmw/mwclass/probe.hpp index 287dd04755..d3495bb480 100644 --- a/apps/openmw/mwclass/probe.hpp +++ b/apps/openmw/mwclass/probe.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_PROBE_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/repair.hpp b/apps/openmw/mwclass/repair.hpp index 174197d9a9..1e0ea51785 100644 --- a/apps/openmw/mwclass/repair.hpp +++ b/apps/openmw/mwclass/repair.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_REPAIR_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/static.hpp b/apps/openmw/mwclass/static.hpp index a4b1d8c547..be3fdb1804 100644 --- a/apps/openmw/mwclass/static.hpp +++ b/apps/openmw/mwclass/static.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_STATIC_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/weapon.hpp b/apps/openmw/mwclass/weapon.hpp index 84c633ab31..79bc4d4dec 100644 --- a/apps/openmw/mwclass/weapon.hpp +++ b/apps/openmw/mwclass/weapon.hpp @@ -2,6 +2,7 @@ #define GAME_MWCLASS_WEAPON_H #include "../mwworld/class.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { diff --git a/apps/openmw/mwrender/creatures.hpp b/apps/openmw/mwrender/creatures.hpp index 17946f0504..9aabb175bf 100644 --- a/apps/openmw/mwrender/creatures.hpp +++ b/apps/openmw/mwrender/creatures.hpp @@ -1,7 +1,10 @@ +#ifndef _GAME_RENDER_CREATURES_H +#define _GAME_RENDER_CREATURES_H #include namespace MWRender{ class Creatures{ }; -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/apps/openmw/mwrender/npcs.hpp b/apps/openmw/mwrender/npcs.hpp index c9701f1951..88ee5ca309 100644 --- a/apps/openmw/mwrender/npcs.hpp +++ b/apps/openmw/mwrender/npcs.hpp @@ -1,6 +1,9 @@ +#ifndef _GAME_RENDER_NPCS_H +#define _GAME_RENDER_NPCS_H #include namespace MWRender{ class Npcs{ }; } +#endif diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index e830d09937..0dd7fdd4c6 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -1,3 +1,6 @@ +#ifndef _GAME_RENDER_OBJECTS_H +#define _GAME_RENDER_OBJECTS_H + #include "components/esm_store/cell_store.hpp" #include "../mwworld/refdata.hpp" @@ -40,4 +43,5 @@ public: /// insert a light related to the most recent insertBegin call. }; -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/apps/openmw/mwrender/renderinginterface.hpp b/apps/openmw/mwrender/renderinginterface.hpp index fed1fd3ec1..ebd4af2bd3 100644 --- a/apps/openmw/mwrender/renderinginterface.hpp +++ b/apps/openmw/mwrender/renderinginterface.hpp @@ -1,14 +1,17 @@ -#include "objects.hpp" -#include "npcs.hpp" -#include "creatures.hpp" -#include "player.hpp" -#define RENDERING_INTERFACE 1 +#ifndef _GAME_RENDERING_INTERFACE_H +#define _GAME_RENDERING_INTERFACE_H namespace MWRender{ + class Npcs; + class Creatures; + class Objects; + class Player; class RenderingInterface{ public: virtual MWRender::Npcs& getNPCs() = 0; virtual MWRender::Creatures& getCreatures() = 0; virtual MWRender::Objects& getObjects() = 0; virtual MWRender::Player& getPlayer() = 0; + virtual ~RenderingInterface(){}; }; -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 9242fac67e..a413b0372b 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -12,7 +12,7 @@ #include "../mwworld/world.hpp" // these includes can be removed once the static-hack is gone #include "../mwworld/ptr.hpp" #include - +#include "renderinginterface.hpp" using namespace MWRender; diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index f3bc7005da..9e1f86372f 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -19,10 +19,11 @@ #include -#ifndef RENDERING_INTERFACE #include "renderinginterface.hpp" -#endif - +#include "npcs.hpp" +#include "creatures.hpp" +#include "objects.hpp" +#include "player.hpp" namespace Ogre { @@ -42,7 +43,7 @@ namespace MWWorld namespace MWRender { - class Player; + class RenderingManager: private RenderingInterface { @@ -51,7 +52,7 @@ class RenderingManager: private RenderingInterface { public: RenderingManager(OEngine::Render::OgreRenderer& _rend, const boost::filesystem::path& resDir, OEngine::Physic::PhysicEngine* engine); - ~RenderingManager(); + virtual ~RenderingManager(); virtual MWRender::Npcs& getNPCs(); virtual MWRender::Creatures& getCreatures(); virtual MWRender::Objects& getObjects(); @@ -96,7 +97,7 @@ class RenderingManager: private RenderingInterface { SkyManager* mSkyManager; OEngine::Render::OgreRenderer &rend; Ogre::Camera* camera; - MWRender::Npcs npcs; + MWRender::Npcs npcs; MWRender::Creatures creatures; MWRender::Objects objects; diff --git a/apps/openmw/mwworld/class.hpp b/apps/openmw/mwworld/class.hpp index 44de4888f7..706b11aaad 100644 --- a/apps/openmw/mwworld/class.hpp +++ b/apps/openmw/mwworld/class.hpp @@ -9,11 +9,8 @@ #include "action.hpp" #include "containerstore.hpp" #include "refdata.hpp" - -#include "physicssystem.hpp" -#ifndef RENDERING_INTERFACE #include "../mwrender/renderinginterface.hpp" -#endif +#include "physicssystem.hpp" namespace Ogre { From db57f0a1a5752914cd252a021e838a27bddb7bc1 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sun, 13 Nov 2011 18:19:29 -0500 Subject: [PATCH 44/55] more corrections --- apps/openmw/mwclass/itemlevlist.hpp | 5 ----- apps/openmw/mwclass/npc.cpp | 1 - apps/openmw/mwrender/renderingmanager.cpp | 1 - 3 files changed, 7 deletions(-) diff --git a/apps/openmw/mwclass/itemlevlist.hpp b/apps/openmw/mwclass/itemlevlist.hpp index c7d630aee1..0b71b072c8 100644 --- a/apps/openmw/mwclass/itemlevlist.hpp +++ b/apps/openmw/mwclass/itemlevlist.hpp @@ -9,11 +9,6 @@ namespace MWClass { public: - virtual void insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const; - ///< Add reference into a cell for rendering - - virtual void insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const; - virtual std::string getName (const MWWorld::Ptr& ptr) const; ///< \return name (the one that is to be presented to the user; not the internal one); /// can return an empty string. diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index 6ecdc6e4e6..a3171f5b55 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -15,7 +15,6 @@ #include "../mwmechanics/mechanicsmanager.hpp" #include -#include "../mwrender/objects.hpp" namespace { diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index a413b0372b..2a502279d6 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -12,7 +12,6 @@ #include "../mwworld/world.hpp" // these includes can be removed once the static-hack is gone #include "../mwworld/ptr.hpp" #include -#include "renderinginterface.hpp" using namespace MWRender; From dd466940595043100cff3c7d3f536664af970eff Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sun, 13 Nov 2011 23:14:18 -0500 Subject: [PATCH 45/55] Changing a lot of things in scene and world --- apps/openmw/mwworld/backup/scene.cpp | 275 +++++++++++++++++++++++++++ apps/openmw/mwworld/backup/scene.hpp | 106 +++++++++++ apps/openmw/mwworld/scene.cpp | 60 +++--- apps/openmw/mwworld/scene.hpp | 11 +- apps/openmw/mwworld/world.cpp | 89 +++++---- apps/openmw/mwworld/world.hpp | 2 +- 6 files changed, 474 insertions(+), 69 deletions(-) create mode 100644 apps/openmw/mwworld/backup/scene.cpp create mode 100644 apps/openmw/mwworld/backup/scene.hpp diff --git a/apps/openmw/mwworld/backup/scene.cpp b/apps/openmw/mwworld/backup/scene.cpp new file mode 100644 index 0000000000..93b4a80f46 --- /dev/null +++ b/apps/openmw/mwworld/backup/scene.cpp @@ -0,0 +1,275 @@ +#include "scene.hpp" +#include "world.hpp" + +#include "../mwrender/interior.hpp" +#include "../mwrender/exterior.hpp" + +#include "../mwmechanics/mechanicsmanager.hpp" + +#include "../mwsound/soundmanager.hpp" + +#include "ptr.hpp" +#include "environment.hpp" +#include "player.hpp" +#include "class.hpp" + +#include "cellfunctors.hpp" + +namespace { + +template +void insertCellRefList (T& cellRefList, ESMS::CellStore &cell) +{ + if (!cellRefList.list.empty()) + { + //const MWWorld::Class& class_ = MWWorld::Class::get (MWWorld::Ptr (&*cellRefList.list.begin(), &cell)); + + for (typename T::List::iterator it = cellRefList.list.begin(); + it != cellRefList.list.end(); it++) + { + if (it->mData.getCount() || it->mData.isEnabled()) + { + MWWorld::Ptr ptr (&*it, &cell); + /* TODO: call + * RenderingManager.insertObject + * class_.insertObjectPhysic + * class_.insertObjectMechanics + */ + } + } + } +} + +} + + +namespace MWWorld +{ + + void Scene::unloadCell (CellRenderCollection::iterator iter) + { + ListHandles functor; + iter->first->forEach(functor); + + { // silence annoying g++ warning + for (std::vector::const_iterator iter (functor.mHandles.begin()); + iter!=functor.mHandles.end(); ++iter) + mPhysics->removeObject (*iter); + } + + mWorld->getLocalScripts().clearCell (iter->first); + + mEnvironment.mMechanicsManager->dropActors (iter->first); + mEnvironment.mSoundManager->stopSound (iter->first); + delete iter->second; + mActiveCells.erase (iter); + } + + void Scene::loadCell (Ptr::CellStore *cell, MWRender::CellRender *render) + { + // register local scripts + mWorld->getLocalScripts().addCell (cell); + + // This connects the cell data with the rendering scene. + std::pair result = + mActiveCells.insert (std::make_pair (cell, render)); + + if (result.second) + { + // Load the cell and insert it into the renderer + result.first->second->show(); + } + } + + void Scene::playerCellChange (Ptr::CellStore *cell, const ESM::Position& position, + bool adjustPlayerPos) + { + if (adjustPlayerPos) + mWorld->getPlayer().setPos (position.pos[0], position.pos[1], position.pos[2]); + + mWorld->getPlayer().setCell (cell); + // TODO orientation + mEnvironment.mMechanicsManager->addActor (mWorld->getPlayer().getPlayer()); + mEnvironment.mMechanicsManager->watchActor (mWorld->getPlayer().getPlayer()); + } + + void Scene::changeCell (int X, int Y, const ESM::Position& position, bool adjustPlayerPos) + { + // remove active + mEnvironment.mMechanicsManager->removeActor (mWorld->getPlayer().getPlayer()); + + CellRenderCollection::iterator active = mActiveCells.begin(); + + while (active!=mActiveCells.end()) + { + if (!(active->first->cell->data.flags & ESM::Cell::Interior)) + { + if (std::abs (X-active->first->cell->data.gridX)<=1 && + std::abs (Y-active->first->cell->data.gridY)<=1) + { + // keep cells within the new 3x3 grid + ++active; + continue; + } + } + + unloadCell (active++); + } + + // Load cells + for (int x=X-1; x<=X+1; ++x) + for (int y=Y-1; y<=Y+1; ++y) + { + CellRenderCollection::iterator iter = mActiveCells.begin(); + + while (iter!=mActiveCells.end()) + { + assert (!(iter->first->cell->data.flags & ESM::Cell::Interior)); + + if (x==iter->first->cell->data.gridX && + y==iter->first->cell->data.gridY) + break; + + ++iter; + } + + if (iter==mActiveCells.end()) + { + Ptr::CellStore *cell = mWorld->getExterior(x, y); + + loadCell (cell, new MWRender::ExteriorCellRender (*cell, mEnvironment, mRendering.getOgreRenderer(), mMwRoot, mPhysics)); + } + } + + // find current cell + CellRenderCollection::iterator iter = mActiveCells.begin(); + + while (iter!=mActiveCells.end()) + { + assert (!(iter->first->cell->data.flags & ESM::Cell::Interior)); + + if (X==iter->first->cell->data.gridX && + Y==iter->first->cell->data.gridY) + break; + + ++iter; + } + + assert (iter!=mActiveCells.end()); + + mCurrentCell = iter->first; + + // adjust player + playerCellChange (mWorld->getExterior(X, Y), position, adjustPlayerPos); + + // Sky system + mWorld->adjustSky(); + + mCellChanged = true; + } + + //We need the ogre renderer and a scene node. + Scene::Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, Ogre::SceneNode *mwRoot, PhysicsSystem *physics) + : mRendering(rendering), mCurrentCell (0), + mCellChanged (false), mEnvironment (environment), mWorld(world), mPhysics(physics) + { + mMwRoot = mwRoot; + } + + Scene::~Scene() + { + for (CellRenderCollection::iterator iter (mActiveCells.begin()); + iter!=mActiveCells.end(); ++iter) + delete iter->second; + } + + bool Scene::hasCellChanged() const + { + return mCellChanged; + } + + const Scene::CellRenderCollection& Scene::getActiveCells() const + { + return mActiveCells; + } + + void Scene::changeToInteriorCell (const std::string& cellName, const ESM::Position& position) + { + // remove active + CellRenderCollection::iterator active = mActiveCells.begin(); + + while (active!=mActiveCells.end()) + { + unloadCell (active++); + } + + // Load cell. + std::cout << "cellName:" << cellName << std::endl; + Ptr::CellStore *cell = mWorld->getInterior(cellName); + + loadCell (cell, new MWRender::InteriorCellRender (*cell, mEnvironment, mRendering.getOgreRenderer(), mMwRoot, mPhysics)); + + // adjust player + mCurrentCell = cell; + playerCellChange (cell, position); + + // Sky system + mWorld->adjustSky(); + + mCellChanged = true; + //currentRegion->name = ""; + } + + void Scene::changeToExteriorCell (const ESM::Position& position) + { + int x = 0; + int y = 0; + + mWorld->positionToIndex (position.pos[0], position.pos[1], x, y); + + changeCell (x, y, position, true); + } + + Ptr::CellStore* Scene::getCurrentCell () + { + return mCurrentCell; + } + + void Scene::markCellAsUnchanged() + { + mCellChanged = false; + } + +/*#include +#include +#include + +#include "../mwworld/class.hpp" +#include "../mwworld/ptr.hpp"*/ + +void Scene::insertCell(ESMS::CellStore &cell) +{ + // Loop through all references in the cell + insertCellRefList (cell.activators, cell); + insertCellRefList (cell.potions, cell); + insertCellRefList (cell.appas, cell); + insertCellRefList (cell.armors, cell); + insertCellRefList (cell.books, cell); + insertCellRefList (cell.clothes, cell); + insertCellRefList (cell.containers, cell); + insertCellRefList (cell.creatures, cell); + insertCellRefList (cell.doors, cell); + insertCellRefList (cell.ingreds, cell); + insertCellRefList (cell.creatureLists, cell); + insertCellRefList (cell.itemLists, cell); + insertCellRefList (cell.lights, cell); + insertCellRefList (cell.lockpicks, cell); + insertCellRefList (cell.miscItems, cell); + insertCellRefList (cell.npcs, cell); + insertCellRefList (cell.probes, cell); + insertCellRefList (cell.repairs, cell); + insertCellRefList (cell.statics, cell); + insertCellRefList (cell.weapons, cell); +} + +} diff --git a/apps/openmw/mwworld/backup/scene.hpp b/apps/openmw/mwworld/backup/scene.hpp new file mode 100644 index 0000000000..e170f01530 --- /dev/null +++ b/apps/openmw/mwworld/backup/scene.hpp @@ -0,0 +1,106 @@ +#ifndef GAME_MWWORLD_SCENE_H +#define GAME_MWWORLD_SCENE_H + +#include +#include + +#include + +#include + +#include "physicssystem.hpp" + +#include "refdata.hpp" +#include "ptr.hpp" +#include "globals.hpp" +#include "../mwrender/renderingmanager.hpp" +#include + +namespace Ogre +{ + class Vector3; +} + +namespace ESM +{ + struct Position; +} + +namespace Files +{ + class Collections; +} + +namespace Render +{ + class OgreRenderer; +} + +namespace MWRender +{ + class SkyManager; + class CellRender; +} + +namespace MWWorld +{ + class Environment; + class Player; + + class Scene + { + + public: + + typedef std::map CellRenderCollection; + + private: + + //OEngine::Render::OgreRenderer& mRenderer; + Ogre::SceneNode *mMwRoot; + Ptr::CellStore *mCurrentCell; // the cell, the player is in + CellRenderCollection mActiveCells; + bool mCellChanged; + Environment& mEnvironment; + World *mWorld; + PhysicsSystem *mPhysics; + MWRender::RenderingManager& mRendering; + + void playerCellChange (Ptr::CellStore *cell, const ESM::Position& position, + bool adjustPlayerPos = true); + public: + + Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, Ogre::SceneNode *mwRoot, PhysicsSystem *physics); + + ~Scene(); + + void unloadCell (CellRenderCollection::iterator iter); + + void loadCell (Ptr::CellStore *cell, MWRender::CellRender *render); + + void changeCell (int X, int Y, const ESM::Position& position, bool adjustPlayerPos); + ///< Move from exterior to interior or from interior cell to a different + /// interior cell. + + Ptr::CellStore* getCurrentCell (); + + const CellRenderCollection& getActiveCells () const; + + bool hasCellChanged() const; + ///< Has the player moved to a different cell, since the last frame? + + void changeToInteriorCell (const std::string& cellName, const ESM::Position& position); + ///< Move to interior cell. + + void changeToExteriorCell (const ESM::Position& position); + ///< Move to exterior cell. + + void markCellAsUnchanged(); + +// std::string getFacedHandle(); + + void insertCell(ESMS::CellStore &cell); + }; +} + +#endif diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 4f425ac65d..56750eef0b 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -49,7 +49,9 @@ namespace MWWorld void Scene::unloadCell (CellRenderCollection::iterator iter) { ListHandles functor; - iter->first->forEach(functor); + Ptr::CellStore* cellstore = *iter; + + cellstore->forEach(functor); { // silence annoying g++ warning for (std::vector::const_iterator iter (functor.mHandles.begin()); @@ -57,28 +59,24 @@ namespace MWWorld mPhysics->removeObject (*iter); } - mWorld->getLocalScripts().clearCell (iter->first); + mWorld->getLocalScripts().clearCell (cellstore); - mEnvironment.mMechanicsManager->dropActors (iter->first); - mEnvironment.mSoundManager->stopSound (iter->first); - delete iter->second; + mEnvironment.mMechanicsManager->dropActors (cellstore); + mEnvironment.mSoundManager->stopSound (cellstore); + //delete iter->second; mActiveCells.erase (iter); } - void Scene::loadCell (Ptr::CellStore *cell, MWRender::CellRender *render) + void Scene::loadCell (Ptr::CellStore *cell) { // register local scripts mWorld->getLocalScripts().addCell (cell); // This connects the cell data with the rendering scene. - std::pair result = - mActiveCells.insert (std::make_pair (cell, render)); - - if (result.second) - { - // Load the cell and insert it into the renderer - result.first->second->show(); - } + mActiveCells.push_back(cell); + + mRendering.getObjects().buildStaticGeometry(*cell); + } void Scene::playerCellChange (Ptr::CellStore *cell, const ESM::Position& position, @@ -99,16 +97,18 @@ namespace MWWorld mEnvironment.mMechanicsManager->removeActor (mWorld->getPlayer().getPlayer()); CellRenderCollection::iterator active = mActiveCells.begin(); - + Ptr::CellStore* cellstore = *active; + while (active!=mActiveCells.end()) { - if (!(active->first->cell->data.flags & ESM::Cell::Interior)) + if (!(cellstore->cell->data.flags & ESM::Cell::Interior)) { - if (std::abs (X-active->first->cell->data.gridX)<=1 && - std::abs (Y-active->first->cell->data.gridY)<=1) + if (std::abs (X-cellstore->cell->data.gridX)<=1 && + std::abs (Y-cellstore->cell->data.gridY)<=1) { // keep cells within the new 3x3 grid ++active; + cellstore = *active; continue; } } @@ -121,13 +121,14 @@ namespace MWWorld for (int y=Y-1; y<=Y+1; ++y) { CellRenderCollection::iterator iter = mActiveCells.begin(); + Ptr::CellStore* cellstore = *iter; while (iter!=mActiveCells.end()) { assert (!(iter->first->cell->data.flags & ESM::Cell::Interior)); - if (x==iter->first->cell->data.gridX && - y==iter->first->cell->data.gridY) + if (x==cellstore->cell->data.gridX && + y==cellstore->cell->data.gridY) break; ++iter; @@ -137,19 +138,20 @@ namespace MWWorld { Ptr::CellStore *cell = mWorld->getExterior(x, y); - loadCell (cell, new MWRender::ExteriorCellRender (*cell, mEnvironment, mRenderer, mMwRoot, mPhysics)); + loadCell (cell); } } // find current cell CellRenderCollection::iterator iter = mActiveCells.begin(); + cellstore = *active; while (iter!=mActiveCells.end()) { assert (!(iter->first->cell->data.flags & ESM::Cell::Interior)); - if (X==iter->first->cell->data.gridX && - Y==iter->first->cell->data.gridY) + if (X==cellstore->cell->data.gridX && + Y==cellstore->cell->data.gridY) break; ++iter; @@ -157,7 +159,7 @@ namespace MWWorld assert (iter!=mActiveCells.end()); - mCurrentCell = iter->first; + mCurrentCell = cellstore; // adjust player playerCellChange (mWorld->getExterior(X, Y), position, adjustPlayerPos); @@ -169,8 +171,8 @@ namespace MWWorld } //We need the ogre renderer and a scene node. - Scene::Scene (Environment& environment, World *world, OEngine::Render::OgreRenderer& renderer, Ogre::SceneNode *mwRoot, PhysicsSystem *physics) - : mRenderer(renderer), mCurrentCell (0), + Scene::Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, Ogre::SceneNode *mwRoot, PhysicsSystem *physics) + : mRendering(rendering), mCurrentCell (0), mCellChanged (false), mEnvironment (environment), mWorld(world), mPhysics(physics) { mMwRoot = mwRoot; @@ -178,9 +180,9 @@ namespace MWWorld Scene::~Scene() { - for (CellRenderCollection::iterator iter (mActiveCells.begin()); + /*for (CellRenderCollection::iterator iter (mActiveCells.begin()); iter!=mActiveCells.end(); ++iter) - delete iter->second; + delete iter->second;*/ } bool Scene::hasCellChanged() const @@ -207,7 +209,7 @@ namespace MWWorld std::cout << "cellName:" << cellName << std::endl; Ptr::CellStore *cell = mWorld->getInterior(cellName); - loadCell (cell, new MWRender::InteriorCellRender (*cell, mEnvironment, mRenderer, mMwRoot, mPhysics)); + loadCell (cell); // adjust player mCurrentCell = cell; diff --git a/apps/openmw/mwworld/scene.hpp b/apps/openmw/mwworld/scene.hpp index 6af86a0711..f95c133705 100644 --- a/apps/openmw/mwworld/scene.hpp +++ b/apps/openmw/mwworld/scene.hpp @@ -52,30 +52,31 @@ namespace MWWorld public: - typedef std::map CellRenderCollection; + typedef std::list CellRenderCollection; private: - OEngine::Render::OgreRenderer& mRenderer; + //OEngine::Render::OgreRenderer& mRenderer; Ogre::SceneNode *mMwRoot; - Ptr::CellStore *mCurrentCell; // the cell, the player is in + Ptr::CellStore* mCurrentCell; // the cell, the player is in CellRenderCollection mActiveCells; bool mCellChanged; Environment& mEnvironment; World *mWorld; PhysicsSystem *mPhysics; + MWRender::RenderingManager& mRendering; void playerCellChange (Ptr::CellStore *cell, const ESM::Position& position, bool adjustPlayerPos = true); public: - Scene (Environment& environment, World *world, OEngine::Render::OgreRenderer& renderer, Ogre::SceneNode *mwRoot, PhysicsSystem *physics); + Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, Ogre::SceneNode *mwRoot, PhysicsSystem *physics); ~Scene(); void unloadCell (CellRenderCollection::iterator iter); - void loadCell (Ptr::CellStore *cell, MWRender::CellRender *render); + void loadCell (Ptr::CellStore *cell); void changeCell (int X, int Y, const ESM::Position& position, bool adjustPlayerPos); ///< Move from exterior to interior or from interior cell to a different diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index a4e909ffc7..12a6d26fd0 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -130,17 +130,20 @@ namespace MWWorld return Ptr(); } + /* MWRender::CellRender *World::searchRender (Ptr::CellStore *store) { - Scene::CellRenderCollection::const_iterator iter = mWorldScene->getActiveCells().find (store); - - if (iter!=mWorldScene->getActiveCells().end()) - { - return iter->second; - } + for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); + iter!=mWorldScene->getActiveCells().end(); ++iter) + { + Ptr::CellStore* cellstore = *iter; + if(store == cellstore){ + //return iter->second; + } + } return 0; - } + }*/ int World::getDaysPerMonth (int month) const { @@ -208,7 +211,7 @@ namespace MWWorld mPhysEngine = physEng; - mWorldScene = new Scene(environment, this, mRendering.getOgreRenderer(), mRendering.getRoot(), mPhysics); + mWorldScene = new Scene(environment, this, mRendering, mRendering.getRoot(), mPhysics); } @@ -308,7 +311,8 @@ namespace MWWorld for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); iter!=mWorldScene->getActiveCells().end(); ++iter) { - Ptr ptr = mCells.getPtr (name, *iter->first); + Ptr::CellStore* cellstore = *iter; + Ptr ptr = mCells.getPtr (name, *cellstore); if (!ptr.isEmpty()) return ptr; @@ -333,7 +337,8 @@ namespace MWWorld for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); iter!=mWorldScene->getActiveCells().end(); ++iter) { - Ptr ptr = getPtrViaHandle (handle, *iter->first); + Ptr::CellStore* cellstore = *iter; + Ptr ptr = getPtrViaHandle (handle, *cellstore); if (!ptr.isEmpty()) return ptr; @@ -348,13 +353,20 @@ namespace MWWorld { reference.getRefData().enable(); - if (MWRender::CellRender *render = searchRender (reference.getCell())) - { - render->enable (reference.getRefData().getHandle()); + + //render->enable (reference.getRefData().getHandle()); + for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); + iter!=mWorldScene->getActiveCells().end(); ++iter) + { + Ptr::CellStore* cellstore = *iter; + if(reference.getCell() == cellstore){ + Class::get (reference).enable (reference, mEnvironment); + break; + } + } - if (mWorldScene->getActiveCells().find (reference.getCell())!=mWorldScene->getActiveCells().end()) - Class::get (reference).enable (reference, mEnvironment); - } + + } } @@ -364,16 +376,20 @@ namespace MWWorld { reference.getRefData().disable(); - if (MWRender::CellRender *render = searchRender (reference.getCell())) - { - render->disable (reference.getRefData().getHandle()); - - if (mWorldScene->getActiveCells().find (reference.getCell())!=mWorldScene->getActiveCells().end()) + + //render->disable (reference.getRefData().getHandle()); + for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); + iter!=mWorldScene->getActiveCells().end(); ++iter) { - Class::get (reference).disable (reference, mEnvironment); - mEnvironment.mSoundManager->stopSound3D (reference); + Ptr::CellStore* cellstore = *iter; + if(reference.getCell() == cellstore){ + Class::get (reference).disable (reference, mEnvironment); + mEnvironment.mSoundManager->stopSound3D (reference); + break; + } } - } + + } } @@ -531,21 +547,26 @@ namespace MWWorld { ptr.getRefData().setCount (0); - if (MWRender::CellRender *render = searchRender (ptr.getCell())) - { - if (mWorldScene->getActiveCells().find (ptr.getCell())!=mWorldScene->getActiveCells().end()) + + for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); + iter!=mWorldScene->getActiveCells().end(); ++iter) { - Class::get (ptr).disable (ptr, mEnvironment); - mEnvironment.mSoundManager->stopSound3D (ptr); + Ptr::CellStore* cellstore = *iter; + if(ptr.getCell() == cellstore){ + Class::get (ptr).disable (ptr, mEnvironment); + mEnvironment.mSoundManager->stopSound3D (ptr); - mPhysics->removeObject (ptr.getRefData().getHandle()); + mPhysics->removeObject (ptr.getRefData().getHandle()); - mLocalScripts.remove (ptr); + mLocalScripts.remove (ptr); + break; + } } + - render->deleteObject (ptr.getRefData().getHandle()); - ptr.getRefData().setHandle (""); - } + //Should this go here or inside the for loop? + mRendering.getObjects().deleteObject (ptr.getRefData().getHandle()); + ptr.getRefData().setBaseNode(0); } } diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index ca1759e00d..4a26fd11af 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -88,7 +88,7 @@ namespace MWWorld Ptr getPtrViaHandle (const std::string& handle, Ptr::CellStore& cellStore); - MWRender::CellRender *searchRender (Ptr::CellStore *store); + //MWRender::CellRender *searchRender (Ptr::CellStore *store); int getDaysPerMonth (int month) const; From bc06d13d309c40dda73f1fe524472169ff38c237 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sun, 13 Nov 2011 23:17:56 -0500 Subject: [PATCH 46/55] Removing backups --- apps/openmw/mwworld/backup/scene.cpp | 275 --------------------------- apps/openmw/mwworld/backup/scene.hpp | 106 ----------- 2 files changed, 381 deletions(-) delete mode 100644 apps/openmw/mwworld/backup/scene.cpp delete mode 100644 apps/openmw/mwworld/backup/scene.hpp diff --git a/apps/openmw/mwworld/backup/scene.cpp b/apps/openmw/mwworld/backup/scene.cpp deleted file mode 100644 index 93b4a80f46..0000000000 --- a/apps/openmw/mwworld/backup/scene.cpp +++ /dev/null @@ -1,275 +0,0 @@ -#include "scene.hpp" -#include "world.hpp" - -#include "../mwrender/interior.hpp" -#include "../mwrender/exterior.hpp" - -#include "../mwmechanics/mechanicsmanager.hpp" - -#include "../mwsound/soundmanager.hpp" - -#include "ptr.hpp" -#include "environment.hpp" -#include "player.hpp" -#include "class.hpp" - -#include "cellfunctors.hpp" - -namespace { - -template -void insertCellRefList (T& cellRefList, ESMS::CellStore &cell) -{ - if (!cellRefList.list.empty()) - { - //const MWWorld::Class& class_ = MWWorld::Class::get (MWWorld::Ptr (&*cellRefList.list.begin(), &cell)); - - for (typename T::List::iterator it = cellRefList.list.begin(); - it != cellRefList.list.end(); it++) - { - if (it->mData.getCount() || it->mData.isEnabled()) - { - MWWorld::Ptr ptr (&*it, &cell); - /* TODO: call - * RenderingManager.insertObject - * class_.insertObjectPhysic - * class_.insertObjectMechanics - */ - } - } - } -} - -} - - -namespace MWWorld -{ - - void Scene::unloadCell (CellRenderCollection::iterator iter) - { - ListHandles functor; - iter->first->forEach(functor); - - { // silence annoying g++ warning - for (std::vector::const_iterator iter (functor.mHandles.begin()); - iter!=functor.mHandles.end(); ++iter) - mPhysics->removeObject (*iter); - } - - mWorld->getLocalScripts().clearCell (iter->first); - - mEnvironment.mMechanicsManager->dropActors (iter->first); - mEnvironment.mSoundManager->stopSound (iter->first); - delete iter->second; - mActiveCells.erase (iter); - } - - void Scene::loadCell (Ptr::CellStore *cell, MWRender::CellRender *render) - { - // register local scripts - mWorld->getLocalScripts().addCell (cell); - - // This connects the cell data with the rendering scene. - std::pair result = - mActiveCells.insert (std::make_pair (cell, render)); - - if (result.second) - { - // Load the cell and insert it into the renderer - result.first->second->show(); - } - } - - void Scene::playerCellChange (Ptr::CellStore *cell, const ESM::Position& position, - bool adjustPlayerPos) - { - if (adjustPlayerPos) - mWorld->getPlayer().setPos (position.pos[0], position.pos[1], position.pos[2]); - - mWorld->getPlayer().setCell (cell); - // TODO orientation - mEnvironment.mMechanicsManager->addActor (mWorld->getPlayer().getPlayer()); - mEnvironment.mMechanicsManager->watchActor (mWorld->getPlayer().getPlayer()); - } - - void Scene::changeCell (int X, int Y, const ESM::Position& position, bool adjustPlayerPos) - { - // remove active - mEnvironment.mMechanicsManager->removeActor (mWorld->getPlayer().getPlayer()); - - CellRenderCollection::iterator active = mActiveCells.begin(); - - while (active!=mActiveCells.end()) - { - if (!(active->first->cell->data.flags & ESM::Cell::Interior)) - { - if (std::abs (X-active->first->cell->data.gridX)<=1 && - std::abs (Y-active->first->cell->data.gridY)<=1) - { - // keep cells within the new 3x3 grid - ++active; - continue; - } - } - - unloadCell (active++); - } - - // Load cells - for (int x=X-1; x<=X+1; ++x) - for (int y=Y-1; y<=Y+1; ++y) - { - CellRenderCollection::iterator iter = mActiveCells.begin(); - - while (iter!=mActiveCells.end()) - { - assert (!(iter->first->cell->data.flags & ESM::Cell::Interior)); - - if (x==iter->first->cell->data.gridX && - y==iter->first->cell->data.gridY) - break; - - ++iter; - } - - if (iter==mActiveCells.end()) - { - Ptr::CellStore *cell = mWorld->getExterior(x, y); - - loadCell (cell, new MWRender::ExteriorCellRender (*cell, mEnvironment, mRendering.getOgreRenderer(), mMwRoot, mPhysics)); - } - } - - // find current cell - CellRenderCollection::iterator iter = mActiveCells.begin(); - - while (iter!=mActiveCells.end()) - { - assert (!(iter->first->cell->data.flags & ESM::Cell::Interior)); - - if (X==iter->first->cell->data.gridX && - Y==iter->first->cell->data.gridY) - break; - - ++iter; - } - - assert (iter!=mActiveCells.end()); - - mCurrentCell = iter->first; - - // adjust player - playerCellChange (mWorld->getExterior(X, Y), position, adjustPlayerPos); - - // Sky system - mWorld->adjustSky(); - - mCellChanged = true; - } - - //We need the ogre renderer and a scene node. - Scene::Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, Ogre::SceneNode *mwRoot, PhysicsSystem *physics) - : mRendering(rendering), mCurrentCell (0), - mCellChanged (false), mEnvironment (environment), mWorld(world), mPhysics(physics) - { - mMwRoot = mwRoot; - } - - Scene::~Scene() - { - for (CellRenderCollection::iterator iter (mActiveCells.begin()); - iter!=mActiveCells.end(); ++iter) - delete iter->second; - } - - bool Scene::hasCellChanged() const - { - return mCellChanged; - } - - const Scene::CellRenderCollection& Scene::getActiveCells() const - { - return mActiveCells; - } - - void Scene::changeToInteriorCell (const std::string& cellName, const ESM::Position& position) - { - // remove active - CellRenderCollection::iterator active = mActiveCells.begin(); - - while (active!=mActiveCells.end()) - { - unloadCell (active++); - } - - // Load cell. - std::cout << "cellName:" << cellName << std::endl; - Ptr::CellStore *cell = mWorld->getInterior(cellName); - - loadCell (cell, new MWRender::InteriorCellRender (*cell, mEnvironment, mRendering.getOgreRenderer(), mMwRoot, mPhysics)); - - // adjust player - mCurrentCell = cell; - playerCellChange (cell, position); - - // Sky system - mWorld->adjustSky(); - - mCellChanged = true; - //currentRegion->name = ""; - } - - void Scene::changeToExteriorCell (const ESM::Position& position) - { - int x = 0; - int y = 0; - - mWorld->positionToIndex (position.pos[0], position.pos[1], x, y); - - changeCell (x, y, position, true); - } - - Ptr::CellStore* Scene::getCurrentCell () - { - return mCurrentCell; - } - - void Scene::markCellAsUnchanged() - { - mCellChanged = false; - } - -/*#include -#include -#include - -#include "../mwworld/class.hpp" -#include "../mwworld/ptr.hpp"*/ - -void Scene::insertCell(ESMS::CellStore &cell) -{ - // Loop through all references in the cell - insertCellRefList (cell.activators, cell); - insertCellRefList (cell.potions, cell); - insertCellRefList (cell.appas, cell); - insertCellRefList (cell.armors, cell); - insertCellRefList (cell.books, cell); - insertCellRefList (cell.clothes, cell); - insertCellRefList (cell.containers, cell); - insertCellRefList (cell.creatures, cell); - insertCellRefList (cell.doors, cell); - insertCellRefList (cell.ingreds, cell); - insertCellRefList (cell.creatureLists, cell); - insertCellRefList (cell.itemLists, cell); - insertCellRefList (cell.lights, cell); - insertCellRefList (cell.lockpicks, cell); - insertCellRefList (cell.miscItems, cell); - insertCellRefList (cell.npcs, cell); - insertCellRefList (cell.probes, cell); - insertCellRefList (cell.repairs, cell); - insertCellRefList (cell.statics, cell); - insertCellRefList (cell.weapons, cell); -} - -} diff --git a/apps/openmw/mwworld/backup/scene.hpp b/apps/openmw/mwworld/backup/scene.hpp deleted file mode 100644 index e170f01530..0000000000 --- a/apps/openmw/mwworld/backup/scene.hpp +++ /dev/null @@ -1,106 +0,0 @@ -#ifndef GAME_MWWORLD_SCENE_H -#define GAME_MWWORLD_SCENE_H - -#include -#include - -#include - -#include - -#include "physicssystem.hpp" - -#include "refdata.hpp" -#include "ptr.hpp" -#include "globals.hpp" -#include "../mwrender/renderingmanager.hpp" -#include - -namespace Ogre -{ - class Vector3; -} - -namespace ESM -{ - struct Position; -} - -namespace Files -{ - class Collections; -} - -namespace Render -{ - class OgreRenderer; -} - -namespace MWRender -{ - class SkyManager; - class CellRender; -} - -namespace MWWorld -{ - class Environment; - class Player; - - class Scene - { - - public: - - typedef std::map CellRenderCollection; - - private: - - //OEngine::Render::OgreRenderer& mRenderer; - Ogre::SceneNode *mMwRoot; - Ptr::CellStore *mCurrentCell; // the cell, the player is in - CellRenderCollection mActiveCells; - bool mCellChanged; - Environment& mEnvironment; - World *mWorld; - PhysicsSystem *mPhysics; - MWRender::RenderingManager& mRendering; - - void playerCellChange (Ptr::CellStore *cell, const ESM::Position& position, - bool adjustPlayerPos = true); - public: - - Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, Ogre::SceneNode *mwRoot, PhysicsSystem *physics); - - ~Scene(); - - void unloadCell (CellRenderCollection::iterator iter); - - void loadCell (Ptr::CellStore *cell, MWRender::CellRender *render); - - void changeCell (int X, int Y, const ESM::Position& position, bool adjustPlayerPos); - ///< Move from exterior to interior or from interior cell to a different - /// interior cell. - - Ptr::CellStore* getCurrentCell (); - - const CellRenderCollection& getActiveCells () const; - - bool hasCellChanged() const; - ///< Has the player moved to a different cell, since the last frame? - - void changeToInteriorCell (const std::string& cellName, const ESM::Position& position); - ///< Move to interior cell. - - void changeToExteriorCell (const ESM::Position& position); - ///< Move to exterior cell. - - void markCellAsUnchanged(); - -// std::string getFacedHandle(); - - void insertCell(ESMS::CellStore &cell); - }; -} - -#endif From 58f103a75c604b7b4a6154b16d1b7309c39d1ff4 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Tue, 15 Nov 2011 23:31:18 -0500 Subject: [PATCH 47/55] Adding new insertCellRefList;Collection switched to a set --- apps/openmw/mwworld/scene.cpp | 88 +++++++++++++++++++++++++++++------ apps/openmw/mwworld/scene.hpp | 14 ++++-- apps/openmw/mwworld/world.cpp | 57 +++++------------------ apps/openmw/mwworld/world.hpp | 7 +-- 4 files changed, 98 insertions(+), 68 deletions(-) diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 56750eef0b..1dbe1f821f 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -17,6 +17,8 @@ namespace { + + template void insertCellRefList (T& cellRefList, ESMS::CellStore &cell) { @@ -37,6 +39,38 @@ void insertCellRefList (T& cellRefList, ESMS::CellStore &cell) */ } } + } +} +template +void insertCellRefList(MWRender::RenderingManager& rendering, MWWorld::Environment& environment, + T& cellRefList, ESMS::CellStore &cell, MWWorld::PhysicsSystem& physics) +{ + if (!cellRefList.list.empty()) + { + const MWWorld::Class& class_ = + MWWorld::Class::get (MWWorld::Ptr (&*cellRefList.list.begin(), &cell)); + + for (typename T::List::iterator it = cellRefList.list.begin(); + it != cellRefList.list.end(); it++) + { + if (it->mData.getCount() || it->mData.isEnabled()) + { + MWWorld::Ptr ptr (&*it, &cell); + + try + { + + class_.insertObjectRendering(ptr, rendering); + class_.insertObject(ptr, physics, environment); + class_.enable (ptr, environment); + } + catch (const std::exception& e) + { + std::string error ("error during rendering: "); + std::cerr << error + e.what() << std::endl; + } + } + } } } @@ -46,11 +80,11 @@ void insertCellRefList (T& cellRefList, ESMS::CellStore &cell) namespace MWWorld { - void Scene::unloadCell (CellRenderCollection::iterator iter) + void Scene::unloadCell (CellStoreCollection::iterator iter) { ListHandles functor; Ptr::CellStore* cellstore = *iter; - + cellstore->forEach(functor); { // silence annoying g++ warning @@ -73,9 +107,10 @@ namespace MWWorld mWorld->getLocalScripts().addCell (cell); // This connects the cell data with the rendering scene. - mActiveCells.push_back(cell); + mActiveCells.insert(cell); mRendering.getObjects().buildStaticGeometry(*cell); + insertCell(*cell, mEnvironment); } @@ -96,7 +131,7 @@ namespace MWWorld // remove active mEnvironment.mMechanicsManager->removeActor (mWorld->getPlayer().getPlayer()); - CellRenderCollection::iterator active = mActiveCells.begin(); + CellStoreCollection::iterator active = mActiveCells.begin(); Ptr::CellStore* cellstore = *active; while (active!=mActiveCells.end()) @@ -120,12 +155,12 @@ namespace MWWorld for (int x=X-1; x<=X+1; ++x) for (int y=Y-1; y<=Y+1; ++y) { - CellRenderCollection::iterator iter = mActiveCells.begin(); + CellStoreCollection::iterator iter = mActiveCells.begin(); Ptr::CellStore* cellstore = *iter; while (iter!=mActiveCells.end()) { - assert (!(iter->first->cell->data.flags & ESM::Cell::Interior)); + assert (!(cellstore->cell->data.flags & ESM::Cell::Interior)); if (x==cellstore->cell->data.gridX && y==cellstore->cell->data.gridY) @@ -143,7 +178,7 @@ namespace MWWorld } // find current cell - CellRenderCollection::iterator iter = mActiveCells.begin(); + CellStoreCollection::iterator iter = mActiveCells.begin(); cellstore = *active; while (iter!=mActiveCells.end()) @@ -171,18 +206,14 @@ namespace MWWorld } //We need the ogre renderer and a scene node. - Scene::Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, Ogre::SceneNode *mwRoot, PhysicsSystem *physics) + Scene::Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, PhysicsSystem *physics) : mRendering(rendering), mCurrentCell (0), mCellChanged (false), mEnvironment (environment), mWorld(world), mPhysics(physics) { - mMwRoot = mwRoot; } Scene::~Scene() { - /*for (CellRenderCollection::iterator iter (mActiveCells.begin()); - iter!=mActiveCells.end(); ++iter) - delete iter->second;*/ } bool Scene::hasCellChanged() const @@ -190,7 +221,7 @@ namespace MWWorld return mCellChanged; } - const Scene::CellRenderCollection& Scene::getActiveCells() const + const Scene::CellStoreCollection& Scene::getActiveCells() const { return mActiveCells; } @@ -198,7 +229,7 @@ namespace MWWorld void Scene::changeToInteriorCell (const std::string& cellName, const ESM::Position& position) { // remove active - CellRenderCollection::iterator active = mActiveCells.begin(); + CellStoreCollection::iterator active = mActiveCells.begin(); while (active!=mActiveCells.end()) { @@ -271,7 +302,34 @@ void Scene::insertCell(ESMS::CellStore &cell) insertCellRefList (cell.probes, cell); insertCellRefList (cell.repairs, cell); insertCellRefList (cell.statics, cell); - insertCellRefList (cell.weapons, cell); + insertCellRefList(cell.weapons, cell); } +void Scene::insertCell(ESMS::CellStore &cell, + MWWorld::Environment& environment) +{ + // Loop through all references in the cell + insertCellRefList(mRendering, environment, cell.activators, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.potions, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.appas, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.armors, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.books, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.clothes, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.containers, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.creatures, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.doors, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.ingreds, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.creatureLists, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.itemLists, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.lights, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.lockpicks, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.miscItems, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.npcs, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.probes, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.repairs, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.statics, cell, *mPhysics); + insertCellRefList(mRendering, environment, cell.weapons, cell, *mPhysics); +} + + } diff --git a/apps/openmw/mwworld/scene.hpp b/apps/openmw/mwworld/scene.hpp index f95c133705..c5183b58c8 100644 --- a/apps/openmw/mwworld/scene.hpp +++ b/apps/openmw/mwworld/scene.hpp @@ -14,6 +14,7 @@ #include "ptr.hpp" #include "globals.hpp" #include "../mwrender/renderingmanager.hpp" +#include "../mwrender/renderinginterface.hpp" #include namespace Ogre @@ -52,14 +53,14 @@ namespace MWWorld public: - typedef std::list CellRenderCollection; + typedef std::set CellStoreCollection; private: //OEngine::Render::OgreRenderer& mRenderer; Ogre::SceneNode *mMwRoot; Ptr::CellStore* mCurrentCell; // the cell, the player is in - CellRenderCollection mActiveCells; + CellStoreCollection mActiveCells; bool mCellChanged; Environment& mEnvironment; World *mWorld; @@ -68,13 +69,15 @@ namespace MWWorld void playerCellChange (Ptr::CellStore *cell, const ESM::Position& position, bool adjustPlayerPos = true); + + public: - Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, Ogre::SceneNode *mwRoot, PhysicsSystem *physics); + Scene (Environment& environment, World *world, MWRender::RenderingManager& rendering, PhysicsSystem *physics); ~Scene(); - void unloadCell (CellRenderCollection::iterator iter); + void unloadCell (CellStoreCollection::iterator iter); void loadCell (Ptr::CellStore *cell); @@ -84,7 +87,7 @@ namespace MWWorld Ptr::CellStore* getCurrentCell (); - const CellRenderCollection& getActiveCells () const; + const CellStoreCollection& getActiveCells () const; bool hasCellChanged() const; ///< Has the player moved to a different cell, since the last frame? @@ -100,6 +103,7 @@ namespace MWWorld // std::string getFacedHandle(); void insertCell(ESMS::CellStore &cell); + void insertCell(ESMS::CellStore &cell, MWWorld::Environment& environment); }; } diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 12a6d26fd0..3993468c0e 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -130,20 +130,6 @@ namespace MWWorld return Ptr(); } - /* - MWRender::CellRender *World::searchRender (Ptr::CellStore *store) - { - for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); - iter!=mWorldScene->getActiveCells().end(); ++iter) - { - Ptr::CellStore* cellstore = *iter; - if(store == cellstore){ - //return iter->second; - } - } - - return 0; - }*/ int World::getDaysPerMonth (int month) const { @@ -211,7 +197,7 @@ namespace MWWorld mPhysEngine = physEng; - mWorldScene = new Scene(environment, this, mRendering, mRendering.getRoot(), mPhysics); + mWorldScene = new Scene(environment, this, mRendering, mPhysics); } @@ -308,7 +294,7 @@ namespace MWWorld } // active cells - for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); + for (Scene::CellStoreCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); iter!=mWorldScene->getActiveCells().end(); ++iter) { Ptr::CellStore* cellstore = *iter; @@ -334,7 +320,7 @@ namespace MWWorld if (mPlayer->getPlayer().getRefData().getHandle()==handle) return mPlayer->getPlayer(); - for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); + for (Scene::CellStoreCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); iter!=mWorldScene->getActiveCells().end(); ++iter) { Ptr::CellStore* cellstore = *iter; @@ -355,17 +341,9 @@ namespace MWWorld //render->enable (reference.getRefData().getHandle()); - for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); - iter!=mWorldScene->getActiveCells().end(); ++iter) - { - Ptr::CellStore* cellstore = *iter; - if(reference.getCell() == cellstore){ - Class::get (reference).enable (reference, mEnvironment); - break; - } - } - - + if(mWorldScene->getActiveCells().find (reference.getCell()) != mWorldScene->getActiveCells().end()) + Class::get (reference).enable (reference, mEnvironment); + } } @@ -378,16 +356,10 @@ namespace MWWorld //render->disable (reference.getRefData().getHandle()); - for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); - iter!=mWorldScene->getActiveCells().end(); ++iter) - { - Ptr::CellStore* cellstore = *iter; - if(reference.getCell() == cellstore){ - Class::get (reference).disable (reference, mEnvironment); - mEnvironment.mSoundManager->stopSound3D (reference); - break; - } - } + if(mWorldScene->getActiveCells().find (reference.getCell())!=mWorldScene->getActiveCells().end()){ + Class::get (reference).disable (reference, mEnvironment); + mEnvironment.mSoundManager->stopSound3D (reference); + } } @@ -548,19 +520,14 @@ namespace MWWorld ptr.getRefData().setCount (0); - for (Scene::CellRenderCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); - iter!=mWorldScene->getActiveCells().end(); ++iter) - { - Ptr::CellStore* cellstore = *iter; - if(ptr.getCell() == cellstore){ + if (mWorldScene->getActiveCells().find (ptr.getCell())!=mWorldScene->getActiveCells().end()){ Class::get (ptr).disable (ptr, mEnvironment); mEnvironment.mSoundManager->stopSound3D (ptr); mPhysics->removeObject (ptr.getRefData().getHandle()); + mRendering.removeObject(ptr); mLocalScripts.remove (ptr); - break; - } } diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index 4a26fd11af..ea775453ac 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -88,7 +88,6 @@ namespace MWWorld Ptr getPtrViaHandle (const std::string& handle, Ptr::CellStore& cellStore); - //MWRender::CellRender *searchRender (Ptr::CellStore *store); int getDaysPerMonth (int month) const; @@ -133,9 +132,11 @@ namespace MWWorld Ptr getPtrViaHandle (const std::string& handle); ///< Return a pointer to a liveCellRef with the given Ogre handle. - + + /// \todo enable reference in the OGRE scene void enable (Ptr reference); - + + /// \todo 5disable reference in the OGRE scene void disable (Ptr reference); void advanceTime (double hours); From 9b94074472c5236eff0a2fdfcffe7e62748f7937 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Wed, 16 Nov 2011 16:22:13 -0500 Subject: [PATCH 48/55] addObject --- apps/openmw/mwrender/renderingmanager.cpp | 4 +++- apps/openmw/mwrender/renderingmanager.hpp | 2 +- apps/openmw/mwworld/scene.cpp | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 2a502279d6..1a4aee3c7c 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -84,7 +84,9 @@ void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ } void RenderingManager::addObject (const MWWorld::Ptr& ptr){ - + const MWWorld::Class& class_ = + MWWorld::Class::get (ptr); + class_.insertObjectRendering(ptr, *this); } void RenderingManager::removeObject (const MWWorld::Ptr& ptr){ diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 9e1f86372f..4e51442bd1 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -6,7 +6,7 @@ #include "debugging.hpp" //Commented out for now, possibly do an ifdef if necessary, cla - +#include "../mwworld/class.hpp" #include #include diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 1dbe1f821f..d07f9eb16d 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -60,7 +60,7 @@ void insertCellRefList(MWRender::RenderingManager& rendering, MWWorld::Environme try { - class_.insertObjectRendering(ptr, rendering); + rendering.addObject(ptr); class_.insertObject(ptr, physics, environment); class_.enable (ptr, environment); } From a0947cd432a5fd64ed3d949fb8c089a2c370491f Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Wed, 16 Nov 2011 21:15:49 -0500 Subject: [PATCH 49/55] Player handle changed;Interior removed;Exterior removed;Cellimp removed; Probe fixed --- apps/openmw/CMakeLists.txt | 2 +- apps/openmw/mwclass/probe.cpp | 11 +- apps/openmw/mwclass/probe.hpp | 2 +- apps/openmw/mwclass/static.cpp | 1 - apps/openmw/mwrender/cellimp.cpp | 67 ---- apps/openmw/mwrender/cellimp.hpp | 95 ----- apps/openmw/mwrender/exterior.cpp | 455 ---------------------- apps/openmw/mwrender/exterior.hpp | 139 ------- apps/openmw/mwrender/interior.cpp | 409 ------------------- apps/openmw/mwrender/interior.hpp | 133 ------- apps/openmw/mwrender/player.cpp | 4 +- apps/openmw/mwrender/player.hpp | 8 +- apps/openmw/mwrender/renderingmanager.cpp | 2 +- apps/openmw/mwworld/player.cpp | 3 +- apps/openmw/mwworld/scene.cpp | 2 - apps/openmw/mwworld/world.cpp | 2 - 16 files changed, 21 insertions(+), 1314 deletions(-) delete mode 100644 apps/openmw/mwrender/cellimp.cpp delete mode 100644 apps/openmw/mwrender/cellimp.hpp delete mode 100644 apps/openmw/mwrender/exterior.cpp delete mode 100644 apps/openmw/mwrender/exterior.hpp delete mode 100644 apps/openmw/mwrender/interior.cpp delete mode 100644 apps/openmw/mwrender/interior.hpp diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index 3608cbf146..e17a2cb25f 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -16,7 +16,7 @@ set(GAME_HEADER source_group(game FILES ${GAME} ${GAME_HEADER}) add_openmw_dir (mwrender - renderingmanager debugging cellimp interior exterior sky player npcs creatures objects renderinginterface + renderingmanager debugging sky player npcs creatures objects renderinginterface ) add_openmw_dir (mwinput diff --git a/apps/openmw/mwclass/probe.cpp b/apps/openmw/mwclass/probe.cpp index 59d836446c..72bdd292c2 100644 --- a/apps/openmw/mwclass/probe.cpp +++ b/apps/openmw/mwclass/probe.cpp @@ -8,9 +8,8 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" - #include "containerutil.hpp" +#include "../mwrender/objects.hpp" namespace MWClass { @@ -44,6 +43,14 @@ namespace MWClass } + + std::string Probe::getName (const MWWorld::Ptr& ptr) const + { + ESMS::LiveCellRef *ref = + ptr.get(); + + return ref->base->name; + } boost::shared_ptr Probe::activate (const MWWorld::Ptr& ptr, const MWWorld::Ptr& actor, const MWWorld::Environment& environment) const { diff --git a/apps/openmw/mwclass/probe.hpp b/apps/openmw/mwclass/probe.hpp index d3495bb480..d7b9df7385 100644 --- a/apps/openmw/mwclass/probe.hpp +++ b/apps/openmw/mwclass/probe.hpp @@ -2,7 +2,7 @@ #define GAME_MWCLASS_PROBE_H #include "../mwworld/class.hpp" -#include "../mwrender/objects.hpp" + namespace MWClass { diff --git a/apps/openmw/mwclass/static.cpp b/apps/openmw/mwclass/static.cpp index 372606acea..cdbd3bfe95 100644 --- a/apps/openmw/mwclass/static.cpp +++ b/apps/openmw/mwclass/static.cpp @@ -5,7 +5,6 @@ #include "../mwworld/ptr.hpp" -#include "../mwrender/cellimp.hpp" namespace MWClass { diff --git a/apps/openmw/mwrender/cellimp.cpp b/apps/openmw/mwrender/cellimp.cpp deleted file mode 100644 index 887941f059..0000000000 --- a/apps/openmw/mwrender/cellimp.cpp +++ /dev/null @@ -1,67 +0,0 @@ -#include "cellimp.hpp" - -#include -#include -#include - -#include "../mwworld/class.hpp" -#include "../mwworld/ptr.hpp" - -using namespace MWRender; - -template -void insertCellRefList (CellRenderImp& cellRender, MWWorld::Environment& environment, - T& cellRefList, ESMS::CellStore &cell) -{ - if (!cellRefList.list.empty()) - { - const MWWorld::Class& class_ = - MWWorld::Class::get (MWWorld::Ptr (&*cellRefList.list.begin(), &cell)); - - for (typename T::List::iterator it = cellRefList.list.begin(); - it != cellRefList.list.end(); it++) - { - if (it->mData.getCount() || it->mData.isEnabled()) - { - MWWorld::Ptr ptr (&*it, &cell); - - try - { - class_.insertObj (ptr, cellRender, environment); - class_.enable (ptr, environment); - } - catch (const std::exception& e) - { - std::string error ("error during rendering: "); - std::cerr << error + e.what() << std::endl; - } - } - } - } -} - -void CellRenderImp::insertCell(ESMS::CellStore &cell, - MWWorld::Environment& environment) -{ - // Loop through all references in the cell - insertCellRefList (*this, environment, cell.activators, cell); - insertCellRefList (*this, environment, cell.potions, cell); - insertCellRefList (*this, environment, cell.appas, cell); - insertCellRefList (*this, environment, cell.armors, cell); - insertCellRefList (*this, environment, cell.books, cell); - insertCellRefList (*this, environment, cell.clothes, cell); - insertCellRefList (*this, environment, cell.containers, cell); - insertCellRefList (*this, environment, cell.creatures, cell); - insertCellRefList (*this, environment, cell.doors, cell); - insertCellRefList (*this, environment, cell.ingreds, cell); - insertCellRefList (*this, environment, cell.creatureLists, cell); - insertCellRefList (*this, environment, cell.itemLists, cell); - insertCellRefList (*this, environment, cell.lights, cell); - insertCellRefList (*this, environment, cell.lockpicks, cell); - insertCellRefList (*this, environment, cell.miscItems, cell); - insertCellRefList (*this, environment, cell.npcs, cell); - insertCellRefList (*this, environment, cell.probes, cell); - insertCellRefList (*this, environment, cell.repairs, cell); - insertCellRefList (*this, environment, cell.statics, cell); - insertCellRefList (*this, environment, cell.weapons, cell); -} diff --git a/apps/openmw/mwrender/cellimp.hpp b/apps/openmw/mwrender/cellimp.hpp deleted file mode 100644 index c497b1d19c..0000000000 --- a/apps/openmw/mwrender/cellimp.hpp +++ /dev/null @@ -1,95 +0,0 @@ -#ifndef _GAME_RENDER_CELLIMP_H -#define _GAME_RENDER_CELLIMP_H - -#include - -#include "components/esm_store/cell_store.hpp" - -#include "../mwworld/refdata.hpp" -#include - -namespace Ogre -{ - class SceneNode; - class Vector3; -} - -namespace ESM -{ - class CellRef; -} - -namespace MWWorld -{ - class Environment; -} -namespace MWRender -{ - /// Base class for cell render, that implements inserting references into a cell in a - /// cell type- and render-engine-independent way. - - class CellRenderImp - { - public: - CellRenderImp() {} - virtual ~CellRenderImp() {} - - /// start inserting a new reference. - virtual void insertBegin (ESM::CellRef& ref, MWWorld::RefData& refData, bool static_ = false) = 0; - - virtual void rotateMesh(Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName[], int elements) = 0; - /// insert a mesh related to the most recent insertBegin call. - virtual void insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements, bool translateFirst) = 0; - virtual void insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements) = 0; - virtual void insertMesh(const std::string &mesh) = 0; - - virtual void scaleMesh(Ogre::Vector3 axis, std::string sceneNodeName[], int elements) = 0; - - virtual void insertObjectPhysics() = 0; - - virtual void insertActorPhysics() = 0; - - /// insert a light related to the most recent insertBegin call. - virtual void insertLight(float r, float g, float b, float radius) = 0; - - /// finish inserting a new reference and return a handle to it. - virtual std::string insertEnd (bool Enable) = 0; - - void insertCell(ESMS::CellStore &cell, MWWorld::Environment& environment); - - }; - - /// Exception-safe rendering - class Rendering - { - CellRenderImp& mCellRender; - bool mEnd; - - // not implemented - Rendering (const Rendering&); - Rendering& operator= (const Rendering&); - - public: - - Rendering (CellRenderImp& cellRender, ESM::CellRef& ref, MWWorld::RefData& refData, bool static_ = false) - : mCellRender (cellRender), mEnd (false) - { - mCellRender.insertBegin (ref, refData, static_); - } - - ~Rendering() - { - if (!mEnd) - mCellRender.insertEnd (false); - } - - std::string end (bool enable) - { - assert (!mEnd); - mEnd = true; - return mCellRender.insertEnd (enable); - } - }; -} - -#endif diff --git a/apps/openmw/mwrender/exterior.cpp b/apps/openmw/mwrender/exterior.cpp deleted file mode 100644 index d1eabe36eb..0000000000 --- a/apps/openmw/mwrender/exterior.cpp +++ /dev/null @@ -1,455 +0,0 @@ -#include "exterior.hpp" -#include "renderingmanager.hpp" - -#include -#include -#include -#include -#include - -#include -#include -#include - -using namespace MWRender; -using namespace Ogre; -using namespace ESMS; - -bool ExteriorCellRender::lightConst = false; -float ExteriorCellRender::lightConstValue = 0.0f; - -bool ExteriorCellRender::lightLinear = true; -int ExteriorCellRender::lightLinearMethod = 1; -float ExteriorCellRender::lightLinearValue = 3; -float ExteriorCellRender::lightLinearRadiusMult = 1; - -bool ExteriorCellRender::lightQuadratic = false; -int ExteriorCellRender::lightQuadraticMethod = 2; -float ExteriorCellRender::lightQuadraticValue = 16; -float ExteriorCellRender::lightQuadraticRadiusMult = 1; - -bool ExteriorCellRender::lightOutQuadInLin = false; - -int ExteriorCellRender::uniqueID = 0; - -ExteriorCellRender::ExteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, - OEngine::Render::OgreRenderer& renderer, Ogre::SceneNode *mwRoot,MWWorld::PhysicsSystem *physics) - : mCell(_cell), mEnvironment (environment), mRenderer(renderer), mPhysics(physics), mBase(NULL), mInsert(NULL), mAmbientMode (0) -{ - mMwRoot = mwRoot; - uniqueID = uniqueID +1; - sg = mRenderer.getScene()->createStaticGeometry( "sg" + Ogre::StringConverter::toString(uniqueID)); - -} - - - -void ExteriorCellRender::insertBegin (ESM::CellRef &ref, MWWorld::RefData& refData, bool static_) -{ - assert (!mInsert); - - isStatic = static_; - - // Create and place scene node for this object - mInsert = mBase->createChildSceneNode(); - - const float *f = ref.pos.pos; - mInsert->setPosition(f[0], f[1], f[2]); - mInsert->setScale(ref.scale, ref.scale, ref.scale); - - // Convert MW rotation to a quaternion: - f = ref.pos.rot; - - // Rotate around X axis - Quaternion xr(Radian(-f[0]), Vector3::UNIT_X); - - // Rotate around Y axis - Quaternion yr(Radian(-f[1]), Vector3::UNIT_Y); - - // Rotate around Z axis - Quaternion zr(Radian(-f[2]), Vector3::UNIT_Z); - - // Rotates first around z, then y, then x - mInsert->setOrientation(xr*yr*zr); - - mInsertMesh.clear(); -} - - -void ExteriorCellRender::rotateMesh(Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName[], int elements) -{ - assert(mInsert); - Ogre::SceneNode *parent = mInsert; - //std::cout << "ELEMENTS:" << elements; - for (int i = 0; i < elements; i++){ - if(sceneNodeName[i] != "" && parent->getChild(sceneNodeName[i])) - parent = dynamic_cast (parent->getChild(sceneNodeName[i])); - } - parent->rotate(axis, angle); -} -/* -void ExteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements){ - assert (mInsert); - //mInsert-> - Ogre::SceneNode *parent = mInsert; - for (int i = 0; i < elements; i++){ - if(sceneParent[i] != "" && parent->getChild(sceneParent[i])) - parent = dynamic_cast (parent->getChild(sceneParent[i])); - } - - mNpcPart = parent->createChildSceneNode(sceneNodeName); - NIFLoader::load(mesh); - MovableObject *ent = mScene.getMgr()->createEntity(mesh); - - mNpcPart->translate(vec); - mNpcPart->rotate(axis, angle); - // mNpcPart->translate(vec); - //mNpcPart->rotate(axis, angle); - mNpcPart->attachObject(ent); - //mNpcPart-> - -} -*/ -void ExteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements) -{ - insertMesh(mesh, vec, axis, angle, sceneNodeName, sceneParent, elements, true); -} -void ExteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements, bool translateFirst){ - - assert (mInsert); - //mInsert-> - Ogre::SceneNode *parent = mInsert; - for (int i = 0; i < elements; i++){ - if(sceneParent[i] != "" && parent->getChild(sceneParent[i])) - parent = dynamic_cast (parent->getChild(sceneParent[i])); - } - - mNpcPart = parent->createChildSceneNode(sceneNodeName); - MeshPtr good2 = NifOgre::NIFLoader::load(mesh); - - MovableObject *ent = mRenderer.getScene()->createEntity(mesh); - - - if(translateFirst){ - mNpcPart->translate(vec); - mNpcPart->rotate(axis, angle); - } - else{ - - mNpcPart->rotate(axis, angle); - mNpcPart->translate(vec); - } - mNpcPart->attachObject(ent); - - Ogre::MeshManager *m = MeshManager::getSingletonPtr(); - const std::string beast1 ="meshes\\b\\B_N_Khajiit_F_Skins.nif"; - const std::string beast2 ="meshes\\b\\B_N_Khajiit_M_Skins.nif"; - const std::string beast3 ="meshes\\b\\B_N_Argonian_F_Skins.nif"; - const std::string beast4 ="meshes\\b\\B_N_Argonian_M_Skins.nif"; - - const std::string beasttail1 ="tail\\b\\B_N_Khajiit_F_Skins.nif"; - const std::string beasttail2 ="tail\\b\\B_N_Khajiit_M_Skins.nif"; - const std::string beasttail3 ="tail\\b\\B_N_Argonian_F_Skins.nif"; - const std::string beasttail4 ="tail\\b\\B_N_Argonian_M_Skins.nif"; - - const std::string beastfoot1 ="foot\\b\\B_N_Khajiit_F_Skins.nif"; - const std::string beastfoot2 ="foot\\b\\B_N_Khajiit_M_Skins.nif"; - const std::string beastfoot3 ="foot\\b\\B_N_Argonian_F_Skins.nif"; - const std::string beastfoot4 ="foot\\b\\B_N_Argonian_M_Skins.nif"; - if(mesh.compare(beast1) == 0 && m->getByName(beasttail1).isNull()) - { - //std::cout << "CLONINGKHAJIITF\n"; - good2->reload(); - MeshPtr tail = good2->clone(beasttail1); - good2->reload(); - MeshPtr foot = good2->clone(beastfoot1); - good2->reload(); - } - else if(mesh.compare(beast2) == 0 && m->getByName(beasttail2).isNull()) - { - //std::cout << "CLONINGKHAJIITM\n"; - good2->reload(); - MeshPtr tail = good2->clone(beasttail2); - good2->reload(); - MeshPtr foot = good2->clone(beastfoot2); - good2->reload(); - } - else if(mesh.compare(beast3) == 0 && m->getByName(beasttail3).isNull()) - { - //std::cout << "CLONINGARGONIANF\n"; - good2->reload(); - MeshPtr tail = good2->clone(beasttail3); - good2->reload(); - MeshPtr foot = good2->clone(beastfoot3); - good2->reload(); - } - else if(mesh.compare(beast4) == 0 && m->getByName(beasttail4).isNull()) - { - //std::cout << "CLONINGARGONIANM\n"; - good2->reload(); - MeshPtr tail = good2->clone(beasttail4); - good2->reload(); - MeshPtr foot = good2->clone(beastfoot4); - good2->reload(); - } -} -// insert a mesh related to the most recent insertBegin call. - -void ExteriorCellRender::scaleMesh(Ogre::Vector3 axis, std::string sceneNodeName[], int elements) -{ - assert(mInsert); - Ogre::SceneNode *parent = mInsert; - //std::cout << "ELEMENTS:" << elements; - for (int i = 0; i < elements; i++){ - if(sceneNodeName[i] != "" && parent->getChild(sceneNodeName[i])) - parent = dynamic_cast (parent->getChild(sceneNodeName[i])); - } - parent->scale(axis); -} - -// insert a mesh related to the most recent insertBegin call. - - -void ExteriorCellRender::insertMesh(const std::string &mesh) -{ - assert (mInsert); - - NifOgre::NIFLoader::load(mesh); - Entity *ent = mRenderer.getScene()->createEntity(mesh); - - if(!isStatic) - { - mInsert->attachObject(ent); - } - else - { - sg->addEntity(ent,mInsert->_getDerivedPosition(),mInsert->_getDerivedOrientation(),mInsert->_getDerivedScale()); - sg->setRegionDimensions(Ogre::Vector3(100000,10000,100000)); - mRenderer.getScene()->destroyEntity(ent); - } - if (mInsertMesh.empty()) - mInsertMesh = mesh; -} - -void ExteriorCellRender::insertObjectPhysics() -{ - if (!mInsertMesh.empty()) - { - mPhysics->addObject (mInsert->getName(), mInsertMesh, mInsert->getOrientation(), - mInsert->getScale().x, mInsert->getPosition()); - } -} - -void ExteriorCellRender::insertActorPhysics() -{ - mPhysics->addActor (mInsert->getName(), mInsertMesh, mInsert->getPosition()); -} - -// insert a light related to the most recent insertBegin call. -void ExteriorCellRender::insertLight(float r, float g, float b, float radius) -{ - assert (mInsert); - - Ogre::Light *light = mRenderer.getScene()->createLight(); - light->setDiffuseColour (r, g, b); - - float cval=0.0f, lval=0.0f, qval=0.0f; - - if(lightConst) - cval = lightConstValue; - if(!lightOutQuadInLin) - { - if(lightLinear) - radius *= lightLinearRadiusMult; - if(lightQuadratic) - radius *= lightQuadraticRadiusMult; - - if(lightLinear) - lval = lightLinearValue / pow(radius, lightLinearMethod); - if(lightQuadratic) - qval = lightQuadraticValue / pow(radius, lightQuadraticMethod); - } - else - { - // FIXME: - // Do quadratic or linear, depending if we're in an exterior or interior - // cell, respectively. Ignore lightLinear and lightQuadratic. - } - - light->setAttenuation(10*radius, cval, lval, qval); - - mInsert->attachObject(light); -} - -// finish inserting a new reference and return a handle to it. - -std::string ExteriorCellRender::insertEnd (bool enable) -{ - assert (mInsert); - - std::string handle = mInsert->getName(); - - if (!enable) - mInsert->setVisible (false); - - mInsert = 0; - - return handle; -} - -// configure lighting according to cell - -void ExteriorCellRender::configureAmbient() -{ - mAmbientColor.setAsABGR (mCell.cell->ambi.ambient); - setAmbientMode(); - - // Create a "sun" that shines light downwards. It doesn't look - // completely right, but leave it for now. - Ogre::Light *light = mRenderer.getScene()->createLight(); - Ogre::ColourValue colour; - colour.setAsABGR (mCell.cell->ambi.sunlight); - light->setDiffuseColour (colour); - light->setType(Ogre::Light::LT_DIRECTIONAL); - light->setDirection(0,-1,0); -} - -// configure fog according to cell -void ExteriorCellRender::configureFog() -{ - Ogre::ColourValue color; - color.setAsABGR (mCell.cell->ambi.fog); - - float high = 4500 + 9000 * (1-mCell.cell->ambi.fogDensity); - float low = 200; - - mRenderer.getScene()->setFog (FOG_LINEAR, color, 0, low, high); - mRenderer.getCamera()->setFarClipDistance (high + 10); - mRenderer.getViewport()->setBackgroundColour (color); -} - -void ExteriorCellRender::setAmbientMode() -{ - switch (mAmbientMode) - { - case 0: - - mRenderer.getScene()->setAmbientLight(mAmbientColor); - break; - - case 1: - - mRenderer.getScene()->setAmbientLight(0.7f*mAmbientColor + 0.3f*ColourValue(1,1,1)); - break; - - case 2: - - mRenderer.getScene()->setAmbientLight(ColourValue(1,1,1)); - break; - } -} - -void ExteriorCellRender::show() -{ - // FIXME: this one may be the bug - mBase = mMwRoot->createChildSceneNode(); - - configureAmbient(); - configureFog(); - - insertCell(mCell, mEnvironment); - - sg->build(); -} - -void ExteriorCellRender::hide() -{ - if(mBase) - mBase->setVisible(false); -} - -void ExteriorCellRender::destroyAllAttachedMovableObjects(Ogre::SceneNode* i_pSceneNode) -{ - if ( !i_pSceneNode ) - { - assert( false ); - return; - } - - // Destroy all the attached objects - SceneNode::ObjectIterator itObject = i_pSceneNode->getAttachedObjectIterator(); - - while ( itObject.hasMoreElements() ) - { - MovableObject* pObject = static_cast(itObject.getNext()); - i_pSceneNode->getCreator()->destroyMovableObject( pObject ); - } - - // Recurse to child SceneNodes - SceneNode::ChildNodeIterator itChild = i_pSceneNode->getChildIterator(); - - while ( itChild.hasMoreElements() ) - { - SceneNode* pChildNode = static_cast(itChild.getNext()); - destroyAllAttachedMovableObjects( pChildNode ); - } -} - -void ExteriorCellRender::destroy() -{ - if(mBase) - { - destroyAllAttachedMovableObjects(mBase); - mBase->removeAndDestroyAllChildren(); - mRenderer.getScene()->destroySceneNode(mBase); - } - - mBase = 0; - - if (sg) - { - mRenderer.getScene()->destroyStaticGeometry (sg); - sg = 0; - } -} - -// Switch through lighting modes. - -void ExteriorCellRender::toggleLight() -{ - if (mAmbientMode==2) - mAmbientMode = 0; - else - ++mAmbientMode; - - switch (mAmbientMode) - { - case 0: std::cout << "Setting lights to normal\n"; break; - case 1: std::cout << "Turning the lights up\n"; break; - case 2: std::cout << "Turning the lights to full\n"; break; - } - - setAmbientMode(); -} - -void ExteriorCellRender::enable (const std::string& handle) -{ - if (!handle.empty()) - mRenderer.getScene()->getSceneNode (handle)->setVisible (true); -} - -void ExteriorCellRender::disable (const std::string& handle) -{ - if (!handle.empty()) - mRenderer.getScene()->getSceneNode (handle)->setVisible (false); -} - -void ExteriorCellRender::deleteObject (const std::string& handle) -{ - if (!handle.empty()) - { - Ogre::SceneNode *node = mRenderer.getScene()->getSceneNode (handle); - node->removeAndDestroyAllChildren(); - mRenderer.getScene()->destroySceneNode (node); - } -} diff --git a/apps/openmw/mwrender/exterior.hpp b/apps/openmw/mwrender/exterior.hpp deleted file mode 100644 index a0b86165aa..0000000000 --- a/apps/openmw/mwrender/exterior.hpp +++ /dev/null @@ -1,139 +0,0 @@ -#ifndef _GAME_RENDER_EXTERIOR_H -#define _GAME_RENDER_EXTERIOR_H - -#include "cell.hpp" -#include "cellimp.hpp" -#include "../mwworld/physicssystem.hpp" - -#include "OgreColourValue.h" -#include -#include - -namespace Ogre -{ - class SceneNode; -} - -namespace MWWorld -{ - class Environment; -} - -namespace MWRender -{ - class RenderingManager; - - /** - This class is responsible for inserting meshes and other - rendering objects from the given cell into the given rendering - scene. - */ - - class ExteriorCellRender : public CellRender, private CellRenderImp - { - - static bool lightConst; - static float lightConstValue; - - static bool lightLinear; - static int lightLinearMethod; - static float lightLinearValue; - static float lightLinearRadiusMult; - - static bool lightQuadratic; - static int lightQuadraticMethod; - static float lightQuadraticValue; - static float lightQuadraticRadiusMult; - - static bool lightOutQuadInLin; - - ESMS::CellStore &mCell; - MWWorld::Environment &mEnvironment; - OEngine::Render::OgreRenderer& mRenderer; - Ogre::SceneNode *mMwRoot; - MWWorld::PhysicsSystem *mPhysics; - - /// The scene node that contains all objects belonging to this - /// cell. - Ogre::SceneNode *mBase; - - Ogre::SceneNode *mInsert; - std::string mInsertMesh; - Ogre::SceneNode *mNpcPart; - - //the static geometry - Ogre::StaticGeometry *sg; - bool isStatic; - - // 0 normal, 1 more bright, 2 max - int mAmbientMode; - - Ogre::ColourValue mAmbientColor; - - /// start inserting a new reference. - virtual void insertBegin (ESM::CellRef &ref, MWWorld::RefData& refData, bool static_ = false); - - /// insert a mesh related to the most recent insertBegin call. - virtual void insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements); - virtual void insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements, bool translateFirst); - - virtual void insertMesh(const std::string &mesh); - - virtual void rotateMesh(Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName[], int elements); - virtual void scaleMesh(Ogre::Vector3 axis, std::string sceneNodeName[], int elements); - - virtual void insertObjectPhysics(); - - virtual void insertActorPhysics(); - - /// insert a light related to the most recent insertBegin call. - virtual void insertLight(float r, float g, float b, float radius); - - /// finish inserting a new reference and return a handle to it. - virtual std::string insertEnd (bool Enable); - - /// configure lighting according to cell - void configureAmbient(); - - /// configure fog according to cell - void configureFog(); - - void setAmbientMode(); - - - public: - - ExteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, - OEngine::Render::OgreRenderer& renderer, Ogre::SceneNode *mwRoot, MWWorld::PhysicsSystem *physics); - - virtual ~ExteriorCellRender() { destroy(); } - - /// Make the cell visible. Load the cell if necessary. - virtual void show(); - - /// Remove the cell from rendering, but don't remove it from - /// memory. - virtual void hide(); - - /// Destroy all rendering objects connected with this cell. - virtual void destroy(); // comment by Zini: shouldn't this go into the destructor? - - /// Switch through lighting modes. - void toggleLight(); - - /// Make the reference with the given handle visible. - virtual void enable (const std::string& handle); - - /// Make the reference with the given handle invisible. - virtual void disable (const std::string& handle); - - /// Remove the reference with the given handle permanently from the scene. - virtual void deleteObject (const std::string& handle); - - void destroyAllAttachedMovableObjects(Ogre::SceneNode* i_pSceneNode); - - static int uniqueID; - }; -} - -#endif diff --git a/apps/openmw/mwrender/interior.cpp b/apps/openmw/mwrender/interior.cpp deleted file mode 100644 index c6bddc2f02..0000000000 --- a/apps/openmw/mwrender/interior.cpp +++ /dev/null @@ -1,409 +0,0 @@ -#include "interior.hpp" -#include "renderingmanager.hpp" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -using namespace MWRender; -using namespace Ogre; -using namespace ESMS; - -bool InteriorCellRender::lightConst = false; -float InteriorCellRender::lightConstValue = 0.0f; - -bool InteriorCellRender::lightLinear = true; -int InteriorCellRender::lightLinearMethod = 1; -float InteriorCellRender::lightLinearValue = 3; -float InteriorCellRender::lightLinearRadiusMult = 1; - -bool InteriorCellRender::lightQuadratic = false; -int InteriorCellRender::lightQuadraticMethod = 2; -float InteriorCellRender::lightQuadraticValue = 16; -float InteriorCellRender::lightQuadraticRadiusMult = 1; - -bool InteriorCellRender::lightOutQuadInLin = false; - -// start inserting a new reference. - -void InteriorCellRender::insertBegin (ESM::CellRef &ref, MWWorld::RefData& refData, bool static_) -{ - assert (!insert); - - // Create and place scene node for this object - insert = base->createChildSceneNode(); - - const float *f = refData.getPosition().pos; - insert->setPosition(f[0], f[1], f[2]); - insert->setScale(ref.scale, ref.scale, ref.scale); - - // Convert MW rotation to a quaternion: - f = ref.pos.rot; - - // Rotate around X axis - Quaternion xr(Radian(-f[0]), Vector3::UNIT_X); - - // Rotate around Y axis - Quaternion yr(Radian(-f[1]), Vector3::UNIT_Y); - - // Rotate around Z axis - Quaternion zr(Radian(-f[2]), Vector3::UNIT_Z); - - // Rotates first around z, then y, then x - insert->setOrientation(xr*yr*zr); - - mInsertMesh.clear(); -} - -// insert a mesh related to the most recent insertBegin call. -void InteriorCellRender::rotateMesh(Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName[], int elements) -{ - assert(insert); - Ogre::SceneNode *parent = insert; - //std::cout << "ELEMENTS:" << elements; - for (int i = 0; i < elements; i++){ - if(sceneNodeName[i] != "" && parent->getChild(sceneNodeName[i])) - parent = dynamic_cast (parent->getChild(sceneNodeName[i])); - } - parent->rotate(axis, angle); -} -// insert a mesh related to the most recent insertBegin call. - -void InteriorCellRender::scaleMesh(Ogre::Vector3 axis, std::string sceneNodeName[], int elements) -{ - assert(insert); - Ogre::SceneNode *parent = insert; - //std::cout << "ELEMENTS:" << elements; - for (int i = 0; i < elements; i++){ - if(sceneNodeName[i] != "" && parent->getChild(sceneNodeName[i])) - parent = dynamic_cast (parent->getChild(sceneNodeName[i])); - } - parent->scale(axis); -} -void InteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements) -{ - insertMesh(mesh, vec, axis, angle, sceneNodeName, sceneParent, elements, true); -} -void InteriorCellRender::insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements, bool translateFirst){ - - assert (insert); - //insert-> - Ogre::SceneNode *parent = insert; - for (int i = 0; i < elements; i++){ - if(sceneParent[i] != "" && parent->getChild(sceneParent[i])) - parent = dynamic_cast (parent->getChild(sceneParent[i])); - } - - npcPart = parent->createChildSceneNode(sceneNodeName); - //npcPart->showBoundingBox(true); - - MeshPtr good2 = NifOgre::NIFLoader::load(mesh); - - MovableObject *ent = mRenderer.getScene()->createEntity(mesh); - //ent->extr - - // MovableObject *ent2 = scene.getMgr()->createEntity(bounds - // ); - //ent-> - //std::cout << mesh << bounds << "\n"; - - if(translateFirst){ - npcPart->translate(vec); - npcPart->rotate(axis, angle); - } - else{ - - npcPart->rotate(axis, angle); - npcPart->translate(vec); - } - - npcPart->attachObject(ent); - Ogre::MeshManager *m = MeshManager::getSingletonPtr(); - const std::string beast1 ="meshes\\b\\B_N_Khajiit_F_Skins.nif"; - const std::string beast2 ="meshes\\b\\B_N_Khajiit_M_Skins.nif"; - const std::string beast3 ="meshes\\b\\B_N_Argonian_F_Skins.nif"; - const std::string beast4 ="meshes\\b\\B_N_Argonian_M_Skins.nif"; - - const std::string beasttail1 ="tail\\b\\B_N_Khajiit_F_Skins.nif"; - const std::string beasttail2 ="tail\\b\\B_N_Khajiit_M_Skins.nif"; - const std::string beasttail3 ="tail\\b\\B_N_Argonian_F_Skins.nif"; - const std::string beasttail4 ="tail\\b\\B_N_Argonian_M_Skins.nif"; - - const std::string beastfoot1 ="foot\\b\\B_N_Khajiit_F_Skins.nif"; - const std::string beastfoot2 ="foot\\b\\B_N_Khajiit_M_Skins.nif"; - const std::string beastfoot3 ="foot\\b\\B_N_Argonian_F_Skins.nif"; - const std::string beastfoot4 ="foot\\b\\B_N_Argonian_M_Skins.nif"; - if(mesh.compare(beast1) == 0 && m->getByName(beasttail1).isNull()) - { - //std::cout << "CLONINGKHAJIITF\n"; - good2->reload(); - MeshPtr tail = good2->clone(beasttail1); - good2->reload(); - MeshPtr foot = good2->clone(beastfoot1); - good2->reload(); - } - else if(mesh.compare(beast2) == 0 && m->getByName(beasttail2).isNull()) - { - //std::cout << "CLONINGKHAJIITM\n"; - good2->reload(); - MeshPtr tail = good2->clone(beasttail2); - good2->reload(); - MeshPtr foot = good2->clone(beastfoot2); - good2->reload(); - } - else if(mesh.compare(beast3) == 0 && m->getByName(beasttail3).isNull()) - { - //std::cout << "CLONINGARGONIANF\n"; - good2->reload(); - MeshPtr tail = good2->clone(beasttail3); - good2->reload(); - MeshPtr foot = good2->clone(beastfoot3); - good2->reload(); - } - else if(mesh.compare(beast4) == 0 && m->getByName(beasttail4).isNull()) - { - //std::cout << "CLONINGARGONIANM\n"; - good2->reload(); - MeshPtr tail = good2->clone(beasttail4); - good2->reload(); - MeshPtr foot = good2->clone(beastfoot4); - good2->reload(); - } -} - -void InteriorCellRender::insertMesh(const std::string &mesh) -{ - assert (insert); - - NifOgre::NIFLoader::load(mesh); - MovableObject *ent = mRenderer.getScene()->createEntity(mesh); - insert->attachObject(ent); - - if (mInsertMesh.empty()) - mInsertMesh = mesh; -} - -void InteriorCellRender::insertObjectPhysics() -{ - if (!mInsertMesh.empty()) - { - mPhysics->addObject (insert->getName(), mInsertMesh, insert->getOrientation(), - insert->getScale().x, insert->getPosition()); - } -} - -void InteriorCellRender::insertActorPhysics() -{ - mPhysics->addActor (insert->getName(), mInsertMesh, insert->getPosition()); -} - -// insert a light related to the most recent insertBegin call. -void InteriorCellRender::insertLight(float r, float g, float b, float radius) -{ - assert (insert); - - Ogre::Light *light = mRenderer.getScene()->createLight(); - light->setDiffuseColour (r, g, b); - - float cval=0.0f, lval=0.0f, qval=0.0f; - - if(lightConst) - cval = lightConstValue; - if(!lightOutQuadInLin) - { - if(lightLinear) - radius *= lightLinearRadiusMult; - if(lightQuadratic) - radius *= lightQuadraticRadiusMult; - - if(lightLinear) - lval = lightLinearValue / pow(radius, lightLinearMethod); - if(lightQuadratic) - qval = lightQuadraticValue / pow(radius, lightQuadraticMethod); - } - else - { - // FIXME: - // Do quadratic or linear, depending if we're in an exterior or interior - // cell, respectively. Ignore lightLinear and lightQuadratic. - } - - light->setAttenuation(10*radius, cval, lval, qval); - - insert->attachObject(light); -} - -// finish inserting a new reference and return a handle to it. - -std::string InteriorCellRender::insertEnd (bool enable) -{ - assert (insert); - - std::string handle = insert->getName(); - - if (!enable) - insert->setVisible (false); - - insert = 0; - - return handle; -} - -// configure lighting according to cell - -void InteriorCellRender::configureAmbient() -{ - ambientColor.setAsABGR (cell.cell->ambi.ambient); - setAmbientMode(); - - // Create a "sun" that shines light downwards. It doesn't look - // completely right, but leave it for now. - Ogre::Light *light = mRenderer.getScene()->createLight(); - Ogre::ColourValue colour; - colour.setAsABGR (cell.cell->ambi.sunlight); - light->setDiffuseColour (colour); - light->setType(Ogre::Light::LT_DIRECTIONAL); - light->setDirection(0,-1,0); -} - -// configure fog according to cell -void InteriorCellRender::configureFog() -{ - Ogre::ColourValue color; - color.setAsABGR (cell.cell->ambi.fog); - - float high = 4500 + 9000 * (1-cell.cell->ambi.fogDensity); - float low = 200; - - mRenderer.getScene()->setFog (FOG_LINEAR, color, 0, low, high); - mRenderer.getCamera()->setFarClipDistance (high + 10); - mRenderer.getViewport()->setBackgroundColour (color); -} - -void InteriorCellRender::setAmbientMode() -{ - switch (ambientMode) - { - case 0: - - mRenderer.getScene()->setAmbientLight(ambientColor); - break; - - case 1: - - mRenderer.getScene()->setAmbientLight(0.7f*ambientColor + 0.3f*ColourValue(1,1,1)); - break; - - case 2: - - mRenderer.getScene()->setAmbientLight(ColourValue(1,1,1)); - break; - } -} - -void InteriorCellRender::show() -{ - base = mMwRoot->createChildSceneNode(); - - configureAmbient(); - configureFog(); - - insertCell(cell, mEnvironment); -} - -void InteriorCellRender::hide() -{ - if(base) - base->setVisible(false); -} - -void InteriorCellRender::destroy() -{ - if(base) - { - base->removeAndDestroyAllChildren(); - mRenderer.getScene()->destroySceneNode(base); - } - - base = NULL; -} - -// Switch through lighting modes. - -void InteriorCellRender::toggleLight() -{ - if (ambientMode==2) - ambientMode = 0; - else - ++ambientMode; - - switch (ambientMode) - { - case 0: std::cout << "Setting lights to normal\n"; break; - case 1: std::cout << "Turning the lights up\n"; break; - case 2: std::cout << "Turning the lights to full\n"; break; - } - - setAmbientMode(); -} - -void InteriorCellRender::enable (const std::string& handle) -{ - if (!handle.empty()) - mRenderer.getScene()->getSceneNode (handle)->setVisible (true); -} - -void InteriorCellRender::disable (const std::string& handle) -{ - if (!handle.empty()) - mRenderer.getScene()->getSceneNode (handle)->setVisible (false); -} - -void InteriorCellRender::deleteObject (const std::string& handle) -{ - if (!handle.empty()) - { - Ogre::SceneNode *node = mRenderer.getScene()->getSceneNode (handle); - node->removeAndDestroyAllChildren(); - mRenderer.getScene()->destroySceneNode (node); - } -} - -// Magic function from the internets. Might need this later. -/* -void Scene::DestroyAllAttachedMovableObjects( SceneNode* i_pSceneNode ) -{ - if ( !i_pSceneNode ) - { - ASSERT( false ); - return; - } - - // Destroy all the attached objects - SceneNode::ObjectIterator itObject = i_pSceneNode->getAttachedObjectIterator(); - - while ( itObject.hasMoreElements() ) - { - MovableObject* pObject = static_cast(itObject.getNext()); - i_pSceneNode->getCreator()->destroyMovableObject( pObject ); - } - - // Recurse to child SceneNodes - SceneNode::ChildNodeIterator itChild = i_pSceneNode->getChildIterator(); - - while ( itChild.hasMoreElements() ) - { - SceneNode* pChildNode = static_cast(itChild.getNext()); - DestroyAllAttachedMovableObjects( pChildNode ); - } -} -*/ diff --git a/apps/openmw/mwrender/interior.hpp b/apps/openmw/mwrender/interior.hpp deleted file mode 100644 index cc94e608f7..0000000000 --- a/apps/openmw/mwrender/interior.hpp +++ /dev/null @@ -1,133 +0,0 @@ -#ifndef _GAME_RENDER_INTERIOR_H -#define _GAME_RENDER_INTERIOR_H - -#include "cell.hpp" -#include "cellimp.hpp" -#include "../mwworld/physicssystem.hpp" - -#include "OgreColourValue.h" -#include - -namespace Ogre -{ - class SceneNode; -} - -namespace MWWorld -{ - class Environment; -} - -namespace MWRender -{ - class RenderingManager; - - /** - This class is responsible for inserting meshes and other - rendering objects from the given cell into the given rendering - scene. - */ - - class InteriorCellRender : public CellRender, private CellRenderImp - { - //static bool isChest; - static bool lightConst; - static float lightConstValue; - - static bool lightLinear; - static int lightLinearMethod; - static float lightLinearValue; - static float lightLinearRadiusMult; - - static bool lightQuadratic; - static int lightQuadraticMethod; - static float lightQuadraticValue; - static float lightQuadraticRadiusMult; - - static bool lightOutQuadInLin; - - ESMS::CellStore &cell; - MWWorld::Environment &mEnvironment; - OEngine::Render::OgreRenderer& mRenderer; - Ogre::SceneNode *mMwRoot; - MWWorld::PhysicsSystem *mPhysics; - - /// The scene node that contains all objects belonging to this - /// cell. - Ogre::SceneNode *base; - - Ogre::SceneNode *insert; - std::string mInsertMesh; - Ogre::SceneNode *npcPart; - - // 0 normal, 1 more bright, 2 max - int ambientMode; - - Ogre::ColourValue ambientColor; - - /// start inserting a new reference. - virtual void insertBegin (ESM::CellRef &ref, MWWorld::RefData& refData, bool static_ = false); - virtual void rotateMesh(Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName[], int elements); - virtual void scaleMesh(Ogre::Vector3 axis, std::string sceneNodeName[], int elements); - /// insert a mesh related to the most recent insertBegin call. - virtual void insertMesh(const std::string &mesh); - virtual void insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements); - virtual void insertMesh(const std::string &mesh, Ogre::Vector3 vec, Ogre::Vector3 axis, Ogre::Radian angle, std::string sceneNodeName, std::string sceneParent[], int elements, bool translateFirst); - - virtual void insertObjectPhysics(); - - virtual void insertActorPhysics(); - - /// insert a light related to the most recent insertBegin call. - virtual void insertLight(float r, float g, float b, float radius); - - /// finish inserting a new reference and return a handle to it. - virtual std::string insertEnd (bool Enable); - - /// configure lighting according to cell - void configureAmbient(); - - /// configure fog according to cell - void configureFog(); - - void setAmbientMode(); - - - public: - - InteriorCellRender(ESMS::CellStore &_cell, MWWorld::Environment& environment, - OEngine::Render::OgreRenderer& renderer, Ogre::SceneNode *mwRoot, MWWorld::PhysicsSystem *physics) - : cell(_cell), mEnvironment (environment), mRenderer(renderer), base(NULL), insert(NULL), ambientMode (0) - { - mMwRoot = mwRoot; - mPhysics = physics; - } - - virtual ~InteriorCellRender() { destroy(); } - - /// Make the cell visible. Load the cell if necessary. - //virtual void scaleMesh(Ogre::Vector3 axis, std::string sceneNodeName[], int elements); - virtual void show(); - - /// Remove the cell from rendering, but don't remove it from - /// memory. - virtual void hide(); - - /// Destroy all rendering objects connected with this cell. - virtual void destroy(); // comment by Zini: shouldn't this go into the destructor? - - /// Switch through lighting modes. - void toggleLight(); - - /// Make the reference with the given handle visible. - virtual void enable (const std::string& handle); - - /// Make the reference with the given handle invisible. - virtual void disable (const std::string& handle); - - /// Remove the reference with the given handle permanently from the scene. - virtual void deleteObject (const std::string& handle); - }; -} - -#endif diff --git a/apps/openmw/mwrender/player.cpp b/apps/openmw/mwrender/player.cpp index 7dcaeee096..7ed921218b 100644 --- a/apps/openmw/mwrender/player.cpp +++ b/apps/openmw/mwrender/player.cpp @@ -3,7 +3,7 @@ namespace MWRender { - Player::Player (Ogre::Camera *camera, const std::string& handle) - : mCamera (camera), mHandle (handle) + Player::Player (Ogre::Camera *camera, Ogre::SceneNode* node) + : mCamera (camera), mNode (node) {} } diff --git a/apps/openmw/mwrender/player.hpp b/apps/openmw/mwrender/player.hpp index f2d8191162..4306b8a95e 100644 --- a/apps/openmw/mwrender/player.hpp +++ b/apps/openmw/mwrender/player.hpp @@ -2,6 +2,7 @@ #define GAME_MWRENDER_PLAYER_H #include +#include namespace Ogre { @@ -14,15 +15,16 @@ namespace MWRender class Player { Ogre::Camera *mCamera; - std::string mHandle; + Ogre::SceneNode* mNode; public: - Player (Ogre::Camera *camera, const std::string& handle); + Player (Ogre::Camera *camera, Ogre::SceneNode* mNode); Ogre::Camera *getCamera() { return mCamera; } - std::string getHandle() const { return mHandle; } + std::string getHandle() const { return mNode->getName(); } + Ogre::SceneNode* getNode() {return mNode;} }; } diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 1a4aee3c7c..17403d659b 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -55,7 +55,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const Ogre::SceneNode *cameraPitchNode = cameraYawNode->createChildSceneNode(); cameraPitchNode->attachObject(rend.getCamera()); - mPlayer = new MWRender::Player (rend.getCamera(), playerNode->getName()); + mPlayer = new MWRender::Player (rend.getCamera(), playerNode); //std::cout << "Three"; } diff --git a/apps/openmw/mwworld/player.cpp b/apps/openmw/mwworld/player.cpp index db950b00ec..cc93f68c2b 100644 --- a/apps/openmw/mwworld/player.cpp +++ b/apps/openmw/mwworld/player.cpp @@ -22,7 +22,8 @@ namespace MWWorld playerPos[0] = playerPos[1] = playerPos[2] = 0; std::cout << renderer->getHandle(); - mPlayer.mData.setHandle (renderer->getHandle()); + + mPlayer.mData.setBaseNode(renderer->getNode()); /// \todo Do not make a copy of classes defined in esm/p records. mClass = new ESM::Class (*world.getStore().classes.find (player->cls)); } diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index d07f9eb16d..4721a30dc3 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -1,8 +1,6 @@ #include "scene.hpp" #include "world.hpp" -#include "../mwrender/interior.hpp" -#include "../mwrender/exterior.hpp" #include "../mwmechanics/mechanicsmanager.hpp" diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 3993468c0e..4ab46f0083 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -7,8 +7,6 @@ #include #include "../mwrender/sky.hpp" -#include "../mwrender/interior.hpp" -#include "../mwrender/exterior.hpp" #include "../mwrender/player.hpp" #include "../mwmechanics/mechanicsmanager.hpp" From 4dc59dfbdd660bb4938ab6b874eb05a7ab534efe Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Thu, 17 Nov 2011 17:10:27 -0500 Subject: [PATCH 50/55] Scenenode flip --- apps/openmw/mwclass/activator.cpp | 1 - apps/openmw/mwclass/apparatus.cpp | 1 - apps/openmw/mwclass/armor.cpp | 1 - apps/openmw/mwclass/book.cpp | 1 - apps/openmw/mwclass/clothing.cpp | 1 - apps/openmw/mwclass/container.cpp | 2 -- apps/openmw/mwclass/creature.cpp | 7 ++++--- apps/openmw/mwclass/door.cpp | 1 - apps/openmw/mwclass/ingredient.cpp | 1 - apps/openmw/mwclass/light.cpp | 2 -- apps/openmw/mwclass/lockpick.cpp | 1 - apps/openmw/mwclass/misc.cpp | 2 -- apps/openmw/mwclass/npc.cpp | 9 +++++---- apps/openmw/mwclass/potion.cpp | 1 - apps/openmw/mwclass/repair.cpp | 2 -- apps/openmw/mwclass/weapon.cpp | 1 - apps/openmw/mwrender/objects.cpp | 5 ++++- apps/openmw/mwrender/objects.hpp | 2 ++ apps/openmw/mwrender/renderingmanager.cpp | 3 +++ 19 files changed, 18 insertions(+), 26 deletions(-) diff --git a/apps/openmw/mwclass/activator.cpp b/apps/openmw/mwclass/activator.cpp index fcad0d3336..0cb640877c 100644 --- a/apps/openmw/mwclass/activator.cpp +++ b/apps/openmw/mwclass/activator.cpp @@ -8,7 +8,6 @@ #include "../mwworld/ptr.hpp" -#include "../mwrender/cellimp.hpp" namespace MWClass { diff --git a/apps/openmw/mwclass/apparatus.cpp b/apps/openmw/mwclass/apparatus.cpp index 6f23614e21..74305bead6 100644 --- a/apps/openmw/mwclass/apparatus.cpp +++ b/apps/openmw/mwclass/apparatus.cpp @@ -8,7 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" #include "containerutil.hpp" diff --git a/apps/openmw/mwclass/armor.cpp b/apps/openmw/mwclass/armor.cpp index f409bb9b07..457a988ef0 100644 --- a/apps/openmw/mwclass/armor.cpp +++ b/apps/openmw/mwclass/armor.cpp @@ -8,7 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" #include "containerutil.hpp" diff --git a/apps/openmw/mwclass/book.cpp b/apps/openmw/mwclass/book.cpp index f9c20b8e81..8b2c32dd2a 100644 --- a/apps/openmw/mwclass/book.cpp +++ b/apps/openmw/mwclass/book.cpp @@ -8,7 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" #include "containerutil.hpp" diff --git a/apps/openmw/mwclass/clothing.cpp b/apps/openmw/mwclass/clothing.cpp index 0dc2b46157..ac1b3e1395 100644 --- a/apps/openmw/mwclass/clothing.cpp +++ b/apps/openmw/mwclass/clothing.cpp @@ -8,7 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" #include "containerutil.hpp" diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index e24177d6ce..6fc6f8482f 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -7,8 +7,6 @@ #include "../mwworld/ptr.hpp" -#include "../mwrender/cellimp.hpp" - namespace MWClass { void Container::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 12978c0dc5..39cf946549 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -9,7 +9,6 @@ #include "../mwworld/actiontalk.hpp" #include "../mwworld/environment.hpp" -#include "../mwrender/cellimp.hpp" #include "../mwmechanics/mechanicsmanager.hpp" @@ -25,6 +24,7 @@ namespace MWClass void Creature::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { + /* ESMS::LiveCellRef *ref = ptr.get(); @@ -36,11 +36,12 @@ namespace MWClass MWRender::Creatures creatures = renderingInterface.getCreatures(); //creatures.insertBegin(ptr, ptr.getRefData().isEnabled(), false); //creatures.insertMesh(ptr, "meshes\\" + model); - } + }*/ } void Creature::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const { + /* ESMS::LiveCellRef *ref = ptr.get(); @@ -49,7 +50,7 @@ namespace MWClass assert (ref->base != NULL); if(!model.empty()){ physics.insertActorPhysics(ptr); - } + }*/ } diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index 5073afb126..ccd1515b4a 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -12,7 +12,6 @@ #include "../mwworld/environment.hpp" #include "../mwworld/world.hpp" -#include "../mwrender/cellimp.hpp" #include "../mwrender/objects.hpp" #include diff --git a/apps/openmw/mwclass/ingredient.cpp b/apps/openmw/mwclass/ingredient.cpp index 1ef695b447..42ae56fcee 100644 --- a/apps/openmw/mwclass/ingredient.cpp +++ b/apps/openmw/mwclass/ingredient.cpp @@ -8,7 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" #include "containerutil.hpp" diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index 3fb4559140..e846e56f88 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -10,8 +10,6 @@ #include "../mwworld/nullaction.hpp" #include "../mwworld/environment.hpp" -#include "../mwrender/cellimp.hpp" - #include "../mwsound/soundmanager.hpp" #include "containerutil.hpp" diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index 8e782bb0f3..f74536dfc5 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -8,7 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" #include "containerutil.hpp" namespace MWClass diff --git a/apps/openmw/mwclass/misc.cpp b/apps/openmw/mwclass/misc.cpp index d331fd35bf..97bbcce2e9 100644 --- a/apps/openmw/mwclass/misc.cpp +++ b/apps/openmw/mwclass/misc.cpp @@ -8,8 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" - #include "containerutil.hpp" namespace MWClass diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index a3171f5b55..47d62f96b0 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -11,8 +11,6 @@ #include "../mwworld/environment.hpp" #include "../mwworld/world.hpp" -#include "../mwrender/cellimp.hpp" - #include "../mwmechanics/mechanicsmanager.hpp" #include @@ -34,6 +32,7 @@ namespace MWClass void Npc::insertObjectRendering (const MWWorld::Ptr& ptr, MWRender::RenderingInterface& renderingInterface) const { + /* ESMS::LiveCellRef *ref = ptr.get(); @@ -45,11 +44,13 @@ namespace MWClass MWRender::Npcs npcs = renderingInterface.getNPCs(); //npcs.insertBegin(ptr, ptr.getRefData().isEnabled(), false); //npcs.insertMesh(ptr, "meshes\\" + model); - } + }*/ } void Npc::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics, MWWorld::Environment& environment) const { + + /* ESMS::LiveCellRef *ref = ptr.get(); @@ -58,7 +59,7 @@ namespace MWClass assert (ref->base != NULL); if(!model.empty()){ physics.insertActorPhysics(ptr); - } + }*/ } diff --git a/apps/openmw/mwclass/potion.cpp b/apps/openmw/mwclass/potion.cpp index 2eb1bbfa45..bf14c3cc8f 100644 --- a/apps/openmw/mwclass/potion.cpp +++ b/apps/openmw/mwclass/potion.cpp @@ -8,7 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" #include "containerutil.hpp" diff --git a/apps/openmw/mwclass/repair.cpp b/apps/openmw/mwclass/repair.cpp index 320e3827ef..28e65fa104 100644 --- a/apps/openmw/mwclass/repair.cpp +++ b/apps/openmw/mwclass/repair.cpp @@ -8,8 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" - #include "containerutil.hpp" namespace MWClass diff --git a/apps/openmw/mwclass/weapon.cpp b/apps/openmw/mwclass/weapon.cpp index dd52ed4953..b13480600e 100644 --- a/apps/openmw/mwclass/weapon.cpp +++ b/apps/openmw/mwclass/weapon.cpp @@ -8,7 +8,6 @@ #include "../mwworld/ptr.hpp" #include "../mwworld/actiontake.hpp" -#include "../mwrender/cellimp.hpp" #include "containerutil.hpp" diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 8a42167998..2e5a07b60b 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -23,8 +23,11 @@ bool Objects::lightOutQuadInLin = false; int Objects::uniqueID = 0; +void Objects::setMwRoot(Ogre::SceneNode* root){ + mwRoot = root; +} void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ - Ogre::SceneNode* root = mRend.getScene()->getRootSceneNode(); + Ogre::SceneNode* root = mwRoot; Ogre::SceneNode* cellnode; if(mCellSceneNodes.find(ptr.getCell()) == mCellSceneNodes.end()) { diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index 0dd7fdd4c6..9c5f796a11 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -13,6 +13,7 @@ class Objects{ OEngine::Render::OgreRenderer &mRend; std::map mCellSceneNodes; std::map mSG; + Ogre::SceneNode* mwRoot; bool isStatic; static int uniqueID; static bool lightConst; @@ -38,6 +39,7 @@ public: void deleteObject (const std::string& handle); void removeCell(const MWWorld::Ptr& ptr); void buildStaticGeometry(ESMS::CellStore &cell); + void setMwRoot(Ogre::SceneNode* root); /// insert a light related to the most recent insertBegin call. diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 17403d659b..9fb9dd98c3 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -45,6 +45,7 @@ RenderingManager::RenderingManager (OEngine::Render::OgreRenderer& _rend, const SceneNode *rt = rend.getScene()->getRootSceneNode(); mwRoot = rt->createChildSceneNode(); mwRoot->pitch(Degree(-90)); + objects.setMwRoot(mwRoot); //used to obtain ingame information of ogre objects (which are faced or selected) mRaySceneQuery = rend.getScene()->createRayQuery(Ray()); @@ -220,4 +221,6 @@ void RenderingManager::toggleLight() setAmbientMode(); } + + } From b3e104469989b1d8b2ced5ae35f0c21b342a8bf6 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Thu, 17 Nov 2011 18:08:48 -0500 Subject: [PATCH 51/55] Exterior cells --- apps/openmw/mwworld/scene.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index 4721a30dc3..fcf8603d35 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -134,6 +134,7 @@ namespace MWWorld while (active!=mActiveCells.end()) { + cellstore = *active; if (!(cellstore->cell->data.flags & ESM::Cell::Interior)) { if (std::abs (X-cellstore->cell->data.gridX)<=1 && @@ -141,7 +142,6 @@ namespace MWWorld { // keep cells within the new 3x3 grid ++active; - cellstore = *active; continue; } } @@ -154,10 +154,11 @@ namespace MWWorld for (int y=Y-1; y<=Y+1; ++y) { CellStoreCollection::iterator iter = mActiveCells.begin(); - Ptr::CellStore* cellstore = *iter; + while (iter!=mActiveCells.end()) { + cellstore = *iter; assert (!(cellstore->cell->data.flags & ESM::Cell::Interior)); if (x==cellstore->cell->data.gridX && @@ -177,10 +178,11 @@ namespace MWWorld // find current cell CellStoreCollection::iterator iter = mActiveCells.begin(); - cellstore = *active; + while (iter!=mActiveCells.end()) { + cellstore = *iter; assert (!(iter->first->cell->data.flags & ESM::Cell::Interior)); if (X==cellstore->cell->data.gridX && From 15fcdc8b724d2fcbc71bf03fe2450fde93d2e940 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Thu, 17 Nov 2011 19:38:52 -0500 Subject: [PATCH 52/55] Physics working --- apps/openmw/mwclass/activator.cpp | 2 +- apps/openmw/mwclass/apparatus.cpp | 2 +- apps/openmw/mwclass/armor.cpp | 2 +- apps/openmw/mwclass/book.cpp | 2 +- apps/openmw/mwclass/clothing.cpp | 2 +- apps/openmw/mwclass/container.cpp | 2 +- apps/openmw/mwclass/creature.cpp | 2 +- apps/openmw/mwclass/door.cpp | 2 +- apps/openmw/mwclass/ingredient.cpp | 2 +- apps/openmw/mwclass/light.cpp | 2 +- apps/openmw/mwclass/lockpick.cpp | 2 +- apps/openmw/mwclass/misc.cpp | 2 +- apps/openmw/mwclass/npc.cpp | 2 +- apps/openmw/mwclass/potion.cpp | 2 +- apps/openmw/mwclass/probe.cpp | 2 +- apps/openmw/mwclass/repair.cpp | 2 +- apps/openmw/mwclass/static.cpp | 2 +- apps/openmw/mwclass/weapon.cpp | 2 +- apps/openmw/mwworld/physicssystem.cpp | 8 ++++---- apps/openmw/mwworld/physicssystem.hpp | 4 ++-- apps/openmw/mwworld/scene.cpp | 11 ++++++++--- 21 files changed, 32 insertions(+), 27 deletions(-) diff --git a/apps/openmw/mwclass/activator.cpp b/apps/openmw/mwclass/activator.cpp index 0cb640877c..fcec0cccc2 100644 --- a/apps/openmw/mwclass/activator.cpp +++ b/apps/openmw/mwclass/activator.cpp @@ -36,7 +36,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/apparatus.cpp b/apps/openmw/mwclass/apparatus.cpp index 74305bead6..48ac64137f 100644 --- a/apps/openmw/mwclass/apparatus.cpp +++ b/apps/openmw/mwclass/apparatus.cpp @@ -38,7 +38,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/armor.cpp b/apps/openmw/mwclass/armor.cpp index 457a988ef0..477f9659d1 100644 --- a/apps/openmw/mwclass/armor.cpp +++ b/apps/openmw/mwclass/armor.cpp @@ -37,7 +37,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/book.cpp b/apps/openmw/mwclass/book.cpp index 8b2c32dd2a..8e9e2f75c7 100644 --- a/apps/openmw/mwclass/book.cpp +++ b/apps/openmw/mwclass/book.cpp @@ -38,7 +38,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/clothing.cpp b/apps/openmw/mwclass/clothing.cpp index ac1b3e1395..293e4a2009 100644 --- a/apps/openmw/mwclass/clothing.cpp +++ b/apps/openmw/mwclass/clothing.cpp @@ -38,7 +38,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index 6fc6f8482f..359cb10bfd 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -34,7 +34,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 39cf946549..4163786745 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -49,7 +49,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertActorPhysics(ptr); + physics.insertActorPhysics(ptr, "meshes\\" + model); }*/ } diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index ccd1515b4a..04dd7149d4 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -43,7 +43,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/ingredient.cpp b/apps/openmw/mwclass/ingredient.cpp index 42ae56fcee..008c50aa4b 100644 --- a/apps/openmw/mwclass/ingredient.cpp +++ b/apps/openmw/mwclass/ingredient.cpp @@ -39,7 +39,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index e846e56f88..25fd2dfc3e 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -47,7 +47,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index f74536dfc5..567ba5eed1 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -37,7 +37,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/misc.cpp b/apps/openmw/mwclass/misc.cpp index 97bbcce2e9..163d66959e 100644 --- a/apps/openmw/mwclass/misc.cpp +++ b/apps/openmw/mwclass/misc.cpp @@ -37,7 +37,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index 47d62f96b0..bc7fc93f88 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -58,7 +58,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertActorPhysics(ptr); + physics.insertActorPhysics(ptr, "meshes\\" + model); }*/ } diff --git a/apps/openmw/mwclass/potion.cpp b/apps/openmw/mwclass/potion.cpp index bf14c3cc8f..50b454fc2b 100644 --- a/apps/openmw/mwclass/potion.cpp +++ b/apps/openmw/mwclass/potion.cpp @@ -38,7 +38,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/probe.cpp b/apps/openmw/mwclass/probe.cpp index 72bdd292c2..b626e823d4 100644 --- a/apps/openmw/mwclass/probe.cpp +++ b/apps/openmw/mwclass/probe.cpp @@ -38,7 +38,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/repair.cpp b/apps/openmw/mwclass/repair.cpp index 28e65fa104..b8220516ba 100644 --- a/apps/openmw/mwclass/repair.cpp +++ b/apps/openmw/mwclass/repair.cpp @@ -37,7 +37,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/static.cpp b/apps/openmw/mwclass/static.cpp index cdbd3bfe95..573a64519d 100644 --- a/apps/openmw/mwclass/static.cpp +++ b/apps/openmw/mwclass/static.cpp @@ -33,7 +33,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwclass/weapon.cpp b/apps/openmw/mwclass/weapon.cpp index b13480600e..bd31a88966 100644 --- a/apps/openmw/mwclass/weapon.cpp +++ b/apps/openmw/mwclass/weapon.cpp @@ -38,7 +38,7 @@ namespace MWClass const std::string &model = ref->base->model; assert (ref->base != NULL); if(!model.empty()){ - physics.insertObjectPhysics(ptr); + physics.insertObjectPhysics(ptr, "meshes\\" + model); } } diff --git a/apps/openmw/mwworld/physicssystem.cpp b/apps/openmw/mwworld/physicssystem.cpp index 6ba4805aaf..eb5c3c91c8 100644 --- a/apps/openmw/mwworld/physicssystem.cpp +++ b/apps/openmw/mwworld/physicssystem.cpp @@ -183,15 +183,15 @@ namespace MWWorld throw std::logic_error ("can't find player"); } - void PhysicsSystem::insertObjectPhysics(const MWWorld::Ptr& ptr){ + void PhysicsSystem::insertObjectPhysics(const MWWorld::Ptr& ptr, const std::string model){ Ogre::SceneNode* node = ptr.getRefData().getBaseNode(); - addObject (node->getName(), node->getName(), node->getOrientation(), + addObject (node->getName(), model, node->getOrientation(), node->getScale().x, node->getPosition()); } - void PhysicsSystem::insertActorPhysics(const MWWorld::Ptr& ptr){ + void PhysicsSystem::insertActorPhysics(const MWWorld::Ptr& ptr, const std::string model){ Ogre::SceneNode* node = ptr.getRefData().getBaseNode(); - addActor (node->getName(), node->getName(), node->getPosition()); + addActor (node->getName(), model, node->getPosition()); } } diff --git a/apps/openmw/mwworld/physicssystem.hpp b/apps/openmw/mwworld/physicssystem.hpp index 789c81c45d..a447d7bc19 100644 --- a/apps/openmw/mwworld/physicssystem.hpp +++ b/apps/openmw/mwworld/physicssystem.hpp @@ -35,9 +35,9 @@ namespace MWWorld bool toggleCollisionMode(); std::pair getFacedHandle (MWWorld::World& world); - void insertObjectPhysics(const MWWorld::Ptr& ptr); + void insertObjectPhysics(const MWWorld::Ptr& ptr, std::string model); - void insertActorPhysics(const MWWorld::Ptr& ptr); + void insertActorPhysics(const MWWorld::Ptr&, std::string model); private: OEngine::Render::OgreRenderer &mRender; diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index fcf8603d35..f264afde8d 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -57,7 +57,6 @@ void insertCellRefList(MWRender::RenderingManager& rendering, MWWorld::Environme try { - rendering.addObject(ptr); class_.insertObject(ptr, physics, environment); class_.enable (ptr, environment); @@ -101,14 +100,17 @@ namespace MWWorld void Scene::loadCell (Ptr::CellStore *cell) { + std::cout << "Start load\n"; // register local scripts mWorld->getLocalScripts().addCell (cell); // This connects the cell data with the rendering scene. mActiveCells.insert(cell); - - mRendering.getObjects().buildStaticGeometry(*cell); + std::cout << "Before static\n"; + insertCell(*cell, mEnvironment); + mRendering.getObjects().buildStaticGeometry(*cell); + std::cout << "Done loading cell\n"; } @@ -228,6 +230,7 @@ namespace MWWorld void Scene::changeToInteriorCell (const std::string& cellName, const ESM::Position& position) { + std::cout << "Changing to interior\n"; // remove active CellStoreCollection::iterator active = mActiveCells.begin(); @@ -309,7 +312,9 @@ void Scene::insertCell(ESMS::CellStore &cell, MWWorld::Environment& environment) { // Loop through all references in the cell + std::cout << "Reflist1\n"; insertCellRefList(mRendering, environment, cell.activators, cell, *mPhysics); + std::cout << "Reflist2\n"; insertCellRefList(mRendering, environment, cell.potions, cell, *mPhysics); insertCellRefList(mRendering, environment, cell.appas, cell, *mPhysics); insertCellRefList(mRendering, environment, cell.armors, cell, *mPhysics); From 7319f7a8c6b4b8f8b59de46d90dfdc26372a3bb2 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 19 Nov 2011 01:01:19 -0500 Subject: [PATCH 53/55] Many bugs fixed related to changing cells --- apps/openmw/mwclass/activator.cpp | 2 +- apps/openmw/mwclass/apparatus.cpp | 2 +- apps/openmw/mwclass/armor.cpp | 2 +- apps/openmw/mwclass/book.cpp | 2 +- apps/openmw/mwclass/clothing.cpp | 2 +- apps/openmw/mwclass/container.cpp | 2 +- apps/openmw/mwclass/creature.cpp | 2 +- apps/openmw/mwclass/door.cpp | 2 +- apps/openmw/mwclass/ingredient.cpp | 2 +- apps/openmw/mwclass/light.cpp | 2 +- apps/openmw/mwclass/lockpick.cpp | 2 +- apps/openmw/mwclass/misc.cpp | 2 +- apps/openmw/mwclass/npc.cpp | 2 +- apps/openmw/mwclass/potion.cpp | 2 +- apps/openmw/mwclass/probe.cpp | 2 +- apps/openmw/mwclass/repair.cpp | 2 +- apps/openmw/mwclass/static.cpp | 2 +- apps/openmw/mwclass/weapon.cpp | 2 +- apps/openmw/mwrender/objects.cpp | 14 +++--- apps/openmw/mwrender/objects.hpp | 2 +- apps/openmw/mwrender/renderingmanager.cpp | 2 +- apps/openmw/mwrender/renderingmanager.hpp | 7 +-- apps/openmw/mwworld/cellfunctors.hpp | 6 +-- apps/openmw/mwworld/scene.cpp | 52 +++++++++++++---------- components/esm_store/cell_store.hpp | 2 +- 25 files changed, 64 insertions(+), 57 deletions(-) diff --git a/apps/openmw/mwclass/activator.cpp b/apps/openmw/mwclass/activator.cpp index fcec0cccc2..6749a2bfd1 100644 --- a/apps/openmw/mwclass/activator.cpp +++ b/apps/openmw/mwclass/activator.cpp @@ -21,7 +21,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/apparatus.cpp b/apps/openmw/mwclass/apparatus.cpp index 48ac64137f..30b308e70f 100644 --- a/apps/openmw/mwclass/apparatus.cpp +++ b/apps/openmw/mwclass/apparatus.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/armor.cpp b/apps/openmw/mwclass/armor.cpp index 477f9659d1..a8a431acf3 100644 --- a/apps/openmw/mwclass/armor.cpp +++ b/apps/openmw/mwclass/armor.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/book.cpp b/apps/openmw/mwclass/book.cpp index 8e9e2f75c7..011fd2c320 100644 --- a/apps/openmw/mwclass/book.cpp +++ b/apps/openmw/mwclass/book.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/clothing.cpp b/apps/openmw/mwclass/clothing.cpp index 293e4a2009..0214c72adf 100644 --- a/apps/openmw/mwclass/clothing.cpp +++ b/apps/openmw/mwclass/clothing.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/container.cpp b/apps/openmw/mwclass/container.cpp index 359cb10bfd..4157ce17ad 100644 --- a/apps/openmw/mwclass/container.cpp +++ b/apps/openmw/mwclass/container.cpp @@ -19,7 +19,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/creature.cpp b/apps/openmw/mwclass/creature.cpp index 4163786745..852701cce0 100644 --- a/apps/openmw/mwclass/creature.cpp +++ b/apps/openmw/mwclass/creature.cpp @@ -33,7 +33,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Creatures creatures = renderingInterface.getCreatures(); + MWRender::Creatures& creatures = renderingInterface.getCreatures(); //creatures.insertBegin(ptr, ptr.getRefData().isEnabled(), false); //creatures.insertMesh(ptr, "meshes\\" + model); }*/ diff --git a/apps/openmw/mwclass/door.cpp b/apps/openmw/mwclass/door.cpp index 04dd7149d4..26436a0128 100644 --- a/apps/openmw/mwclass/door.cpp +++ b/apps/openmw/mwclass/door.cpp @@ -28,7 +28,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/ingredient.cpp b/apps/openmw/mwclass/ingredient.cpp index 008c50aa4b..5e55010ebf 100644 --- a/apps/openmw/mwclass/ingredient.cpp +++ b/apps/openmw/mwclass/ingredient.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index 25fd2dfc3e..3890899b0e 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -26,7 +26,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); const int color = ref->base->data.color; diff --git a/apps/openmw/mwclass/lockpick.cpp b/apps/openmw/mwclass/lockpick.cpp index 567ba5eed1..636a8f0be5 100644 --- a/apps/openmw/mwclass/lockpick.cpp +++ b/apps/openmw/mwclass/lockpick.cpp @@ -22,7 +22,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/misc.cpp b/apps/openmw/mwclass/misc.cpp index 163d66959e..a2642d8d5b 100644 --- a/apps/openmw/mwclass/misc.cpp +++ b/apps/openmw/mwclass/misc.cpp @@ -22,7 +22,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/npc.cpp b/apps/openmw/mwclass/npc.cpp index bc7fc93f88..cce23407fe 100644 --- a/apps/openmw/mwclass/npc.cpp +++ b/apps/openmw/mwclass/npc.cpp @@ -41,7 +41,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Npcs npcs = renderingInterface.getNPCs(); + MWRender::Npcs& npcs = renderingInterface.getNPCs(); //npcs.insertBegin(ptr, ptr.getRefData().isEnabled(), false); //npcs.insertMesh(ptr, "meshes\\" + model); }*/ diff --git a/apps/openmw/mwclass/potion.cpp b/apps/openmw/mwclass/potion.cpp index 50b454fc2b..86d1e2a985 100644 --- a/apps/openmw/mwclass/potion.cpp +++ b/apps/openmw/mwclass/potion.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/probe.cpp b/apps/openmw/mwclass/probe.cpp index b626e823d4..a09a39e661 100644 --- a/apps/openmw/mwclass/probe.cpp +++ b/apps/openmw/mwclass/probe.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/repair.cpp b/apps/openmw/mwclass/repair.cpp index b8220516ba..f8755b2ebc 100644 --- a/apps/openmw/mwclass/repair.cpp +++ b/apps/openmw/mwclass/repair.cpp @@ -22,7 +22,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/static.cpp b/apps/openmw/mwclass/static.cpp index 573a64519d..946da311da 100644 --- a/apps/openmw/mwclass/static.cpp +++ b/apps/openmw/mwclass/static.cpp @@ -18,7 +18,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwclass/weapon.cpp b/apps/openmw/mwclass/weapon.cpp index bd31a88966..1fbd21f7cf 100644 --- a/apps/openmw/mwclass/weapon.cpp +++ b/apps/openmw/mwclass/weapon.cpp @@ -23,7 +23,7 @@ namespace MWClass if (!model.empty()) { - MWRender::Objects objects = renderingInterface.getObjects(); + MWRender::Objects& objects = renderingInterface.getObjects(); objects.insertBegin(ptr, ptr.getRefData().isEnabled(), false); objects.insertMesh(ptr, "meshes\\" + model); } diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 2e5a07b60b..e49e448aec 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -40,8 +40,6 @@ void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){ cellnode = mCellSceneNodes[ptr.getCell()]; } - - Ogre::SceneNode* insert = cellnode->createChildSceneNode(); const float *f = ptr.getRefData().getPosition().pos; insert->setPosition(f[0], f[1], f[2]); @@ -100,6 +98,7 @@ void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh){ mRend.getScene()->destroyEntity(ent); } + } void Objects::insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius){ @@ -146,19 +145,19 @@ void Objects::deleteObject (const std::string& handle) } } -void Objects::removeCell(const MWWorld::Ptr& ptr){ - if(mCellSceneNodes.find(ptr.getCell()) != mCellSceneNodes.end()) +void Objects::removeCell(MWWorld::Ptr::CellStore* store){ + if(mCellSceneNodes.find(store) != mCellSceneNodes.end()) { - Ogre::SceneNode* base = mCellSceneNodes[ptr.getCell()]; + Ogre::SceneNode* base = mCellSceneNodes[store]; base->removeAndDestroyAllChildren(); mRend.getScene()->destroySceneNode(base); base = 0; } - if(mSG.find(ptr.getCell()) != mSG.end()) + if(mSG.find(store) != mSG.end()) { - Ogre::StaticGeometry* sg = mSG[ptr.getCell()]; + Ogre::StaticGeometry* sg = mSG[store]; mRend.getScene()->destroyStaticGeometry (sg); sg = 0; } @@ -171,3 +170,4 @@ void Objects::buildStaticGeometry(ESMS::CellStore& cell){ } } + diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index 9c5f796a11..e7fb716b85 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -37,7 +37,7 @@ public: void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh); void insertLight (const MWWorld::Ptr& ptr, float r, float g, float b, float radius); void deleteObject (const std::string& handle); - void removeCell(const MWWorld::Ptr& ptr); + void removeCell(MWWorld::Ptr::CellStore* store); void buildStaticGeometry(ESMS::CellStore &cell); void setMwRoot(Ogre::SceneNode* root); diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp index 9fb9dd98c3..fffa6f3d66 100644 --- a/apps/openmw/mwrender/renderingmanager.cpp +++ b/apps/openmw/mwrender/renderingmanager.cpp @@ -82,7 +82,7 @@ MWRender::Player& RenderingManager::getPlayer(){ void RenderingManager::removeCell (MWWorld::Ptr::CellStore *store){ - + objects.removeCell(store); } void RenderingManager::addObject (const MWWorld::Ptr& ptr){ const MWWorld::Class& class_ = diff --git a/apps/openmw/mwrender/renderingmanager.hpp b/apps/openmw/mwrender/renderingmanager.hpp index 4e51442bd1..e4dc5deb40 100644 --- a/apps/openmw/mwrender/renderingmanager.hpp +++ b/apps/openmw/mwrender/renderingmanager.hpp @@ -88,11 +88,12 @@ class RenderingManager: private RenderingInterface { OEngine::Render::OgreRenderer& getOgreRenderer(){return rend;} Ogre::SceneManager *getMgr() { return rend.getScene(); } Ogre::SceneNode *getRoot() { return mwRoot; } - - private: - void configureAmbient(ESMS::CellStore &mCell); + void configureAmbient(ESMS::CellStore &mCell); /// configure fog according to cell void configureFog(ESMS::CellStore &mCell); + + private: + void setAmbientMode(); SkyManager* mSkyManager; OEngine::Render::OgreRenderer &rend; diff --git a/apps/openmw/mwworld/cellfunctors.hpp b/apps/openmw/mwworld/cellfunctors.hpp index 5ff801f01c..8bba898ce7 100644 --- a/apps/openmw/mwworld/cellfunctors.hpp +++ b/apps/openmw/mwworld/cellfunctors.hpp @@ -16,12 +16,12 @@ namespace MWWorld /// List all (Ogre-)handles. struct ListHandles { - std::vector mHandles; + std::vector mHandles; bool operator() (ESM::CellRef& ref, RefData& data) { - std::string handle = data.getHandle(); - if (!handle.empty()) + Ogre::SceneNode* handle = data.getBaseNode(); + if (handle) mHandles.push_back (handle); return true; } diff --git a/apps/openmw/mwworld/scene.cpp b/apps/openmw/mwworld/scene.cpp index f264afde8d..c9d477833b 100644 --- a/apps/openmw/mwworld/scene.cpp +++ b/apps/openmw/mwworld/scene.cpp @@ -79,38 +79,46 @@ namespace MWWorld void Scene::unloadCell (CellStoreCollection::iterator iter) { + ListHandles functor; - Ptr::CellStore* cellstore = *iter; - - cellstore->forEach(functor); + + MWWorld::Ptr::CellStore* active = *iter; + mRendering.removeCell(active); + + active->forEach(functor); - { // silence annoying g++ warning - for (std::vector::const_iterator iter (functor.mHandles.begin()); - iter!=functor.mHandles.end(); ++iter) - mPhysics->removeObject (*iter); + { + + + // silence annoying g++ warning + for (std::vector::const_iterator iter (functor.mHandles.begin()); + iter!=functor.mHandles.end(); ++iter){ + Ogre::SceneNode* node = *iter; + mPhysics->removeObject (node->getName()); + } } - - mWorld->getLocalScripts().clearCell (cellstore); - - mEnvironment.mMechanicsManager->dropActors (cellstore); - mEnvironment.mSoundManager->stopSound (cellstore); - //delete iter->second; + mWorld->getLocalScripts().clearCell (active); + mEnvironment.mMechanicsManager->dropActors (active); + mEnvironment.mSoundManager->stopSound (active); mActiveCells.erase (iter); } void Scene::loadCell (Ptr::CellStore *cell) { - std::cout << "Start load\n"; // register local scripts mWorld->getLocalScripts().addCell (cell); - // This connects the cell data with the rendering scene. - mActiveCells.insert(cell); - std::cout << "Before static\n"; - insertCell(*cell, mEnvironment); - mRendering.getObjects().buildStaticGeometry(*cell); - std::cout << "Done loading cell\n"; + + std::pair result = + mActiveCells.insert(cell); + if(result.second){ + insertCell(*cell, mEnvironment); + mRendering.getObjects().buildStaticGeometry(*cell); + mRendering.configureAmbient(*cell); + + } + } @@ -233,7 +241,7 @@ namespace MWWorld std::cout << "Changing to interior\n"; // remove active CellStoreCollection::iterator active = mActiveCells.begin(); - + std::cout << "Size: " << mActiveCells.size() << "\n"; while (active!=mActiveCells.end()) { unloadCell (active++); @@ -312,9 +320,7 @@ void Scene::insertCell(ESMS::CellStore &cell, MWWorld::Environment& environment) { // Loop through all references in the cell - std::cout << "Reflist1\n"; insertCellRefList(mRendering, environment, cell.activators, cell, *mPhysics); - std::cout << "Reflist2\n"; insertCellRefList(mRendering, environment, cell.potions, cell, *mPhysics); insertCellRefList(mRendering, environment, cell.appas, cell, *mPhysics); insertCellRefList(mRendering, environment, cell.armors, cell, *mPhysics); diff --git a/components/esm_store/cell_store.hpp b/components/esm_store/cell_store.hpp index 12f6444178..d064312f10 100644 --- a/components/esm_store/cell_store.hpp +++ b/components/esm_store/cell_store.hpp @@ -187,7 +187,7 @@ namespace ESMS ++iter) if (!functor (iter->ref, iter->mData)) return false; - + return true; } From d8367f4968420d956f666d9ff70e96266b9bf204 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 19 Nov 2011 17:45:05 -0500 Subject: [PATCH 54/55] Activation fix --- apps/openmw/engine.cpp | 4 ---- apps/openmw/mwworld/world.cpp | 22 ++-------------------- 2 files changed, 2 insertions(+), 24 deletions(-) diff --git a/apps/openmw/engine.cpp b/apps/openmw/engine.cpp index daa9b508e0..acff9c8be4 100644 --- a/apps/openmw/engine.cpp +++ b/apps/openmw/engine.cpp @@ -417,15 +417,11 @@ void OMW::Engine::activate() try { std::string handle = mEnvironment.mWorld->getFacedHandle(); - if (handle.empty()) return; - MWWorld::Ptr ptr = mEnvironment.mWorld->getPtrViaHandle (handle); - if (ptr.isEmpty()) return; - MWScript::InterpreterContext interpreterContext (mEnvironment, &ptr.getRefData().getLocals(), ptr); diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index 4ab46f0083..93cf19aef2 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -53,12 +53,13 @@ namespace for (iterator iter (refList.list.begin()); iter!=refList.list.end(); ++iter) { + if(iter->mData.getBaseNode()){ if (iter->mData.getHandle()==handle) { return &*iter; } + } } - return 0; } } @@ -70,61 +71,43 @@ namespace MWWorld if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.activators)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.potions)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.appas)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.armors)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.books)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.clothes)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.containers)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.creatures)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.doors)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.ingreds)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.lights)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.lockpicks)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.miscItems)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.npcs)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.probes)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.repairs)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.statics)) return Ptr (ref, &cell); - if (ESMS::LiveCellRef *ref = searchViaHandle (handle, cell.weapons)) return Ptr (ref, &cell); - return Ptr(); } @@ -317,7 +300,6 @@ namespace MWWorld { if (mPlayer->getPlayer().getRefData().getHandle()==handle) return mPlayer->getPlayer(); - for (Scene::CellStoreCollection::const_iterator iter (mWorldScene->getActiveCells().begin()); iter!=mWorldScene->getActiveCells().end(); ++iter) { From 7385948056da7eb6f87cda4c9b3a946c50094c08 Mon Sep 17 00:00:00 2001 From: Jason Hooks Date: Sat, 19 Nov 2011 20:22:56 -0500 Subject: [PATCH 55/55] Yet another crash fix --- apps/openmw/mwrender/objects.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index e49e448aec..ade1127af1 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -150,6 +150,7 @@ void Objects::removeCell(MWWorld::Ptr::CellStore* store){ { Ogre::SceneNode* base = mCellSceneNodes[store]; base->removeAndDestroyAllChildren(); + mCellSceneNodes.erase(store); mRend.getScene()->destroySceneNode(base); base = 0; } @@ -158,6 +159,7 @@ void Objects::removeCell(MWWorld::Ptr::CellStore* store){ if(mSG.find(store) != mSG.end()) { Ogre::StaticGeometry* sg = mSG[store]; + mSG.erase(store); mRend.getScene()->destroyStaticGeometry (sg); sg = 0; }