From 1ae2d3c6abd06cb76b151067c88a0b5d3a9090a7 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 24 Feb 2013 19:00:06 +0100 Subject: [PATCH 1/2] For light objects without an AttachLight bone, attach the light to the center of the object instead of the origin. --- apps/openmw/mwclass/light.cpp | 2 +- apps/openmw/mwrender/objects.cpp | 17 ++++++++++++++--- apps/openmw/mwrender/objects.hpp | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/apps/openmw/mwclass/light.cpp b/apps/openmw/mwclass/light.cpp index 9d0fe298b..c23e4b833 100644 --- a/apps/openmw/mwclass/light.cpp +++ b/apps/openmw/mwclass/light.cpp @@ -38,7 +38,7 @@ namespace MWClass if (!model.empty()) objects.insertMesh(ptr, "meshes\\" + model, true); else - objects.insertLight(ptr, NULL); + objects.insertLight(ptr, NULL, Ogre::Vector3(0,0,0)); } void Light::insertObject(const MWWorld::Ptr& ptr, MWWorld::PhysicsSystem& physics) const diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index c51cafc0e..06ddcb225 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -49,6 +49,12 @@ void Objects::clearSceneNode (Ogre::SceneNode *node) node->detachObject (object); mRenderer.getScene()->destroyMovableObject (object); } + + Ogre::Node::ChildNodeIterator it = node->getChildIterator (); + while (it.hasMoreElements ()) + { + clearSceneNode(static_cast(it.getNext ())); + } } void Objects::setMwRoot(Ogre::SceneNode* root) @@ -219,11 +225,11 @@ void Objects::insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh, bool if (light) { - insertLight(ptr, entities.mSkelBase); + insertLight(ptr, entities.mSkelBase, bounds.getCenter() - insert->_getDerivedPosition()); } } -void Objects::insertLight (const MWWorld::Ptr& ptr, Ogre::Entity* skelBase) +void Objects::insertLight (const MWWorld::Ptr& ptr, Ogre::Entity* skelBase, Ogre::Vector3 fallbackCenter) { Ogre::SceneNode* insert = mRenderer.getScene()->getSceneNode(ptr.getRefData().getHandle()); assert(insert); @@ -291,9 +297,14 @@ void Objects::insertLight (const MWWorld::Ptr& ptr, Ogre::Entity* skelBase) // If there's an AttachLight bone, attach the light to that, otherwise attach it to the base scene node if (skelBase && skelBase->getSkeleton ()->hasBone ("AttachLight")) + { skelBase->attachObjectToBone ("AttachLight", light); + } else - insert->attachObject(light); + { + Ogre::SceneNode* childNode = insert->createChildSceneNode (fallbackCenter); + childNode->attachObject(light); + } mLights.push_back(info); } diff --git a/apps/openmw/mwrender/objects.hpp b/apps/openmw/mwrender/objects.hpp index 283c05388..1a4829d9f 100644 --- a/apps/openmw/mwrender/objects.hpp +++ b/apps/openmw/mwrender/objects.hpp @@ -74,7 +74,7 @@ public: ~Objects(){} void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_); void insertMesh (const MWWorld::Ptr& ptr, const std::string& mesh, bool light=false); - void insertLight (const MWWorld::Ptr& ptr, Ogre::Entity* skelBase); + void insertLight (const MWWorld::Ptr& ptr, Ogre::Entity* skelBase, Ogre::Vector3 fallbackCenter); void enableLights(); void disableLights(); From f1a33093922a8f16a05e98af5b86c05eed9743f6 Mon Sep 17 00:00:00 2001 From: scrawl Date: Sun, 24 Feb 2013 19:03:25 +0100 Subject: [PATCH 2/2] forgot to destroy child scene nodes --- apps/openmw/mwrender/objects.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/openmw/mwrender/objects.cpp b/apps/openmw/mwrender/objects.cpp index 06ddcb225..53957152f 100644 --- a/apps/openmw/mwrender/objects.cpp +++ b/apps/openmw/mwrender/objects.cpp @@ -55,6 +55,7 @@ void Objects::clearSceneNode (Ogre::SceneNode *node) { clearSceneNode(static_cast(it.getNext ())); } + node->removeAndDestroyAllChildren (); } void Objects::setMwRoot(Ogre::SceneNode* root)