From 3e54a7fec31d44b4c2f25ea68a1c8038f456ae1e Mon Sep 17 00:00:00 2001 From: xissburg Date: Fri, 5 Jul 2019 14:03:05 -0500 Subject: [PATCH] Create loadMainScene method and modify getFirstSceneNode. --- Samples/LoadMesh/main.cpp | 15 +++++++++++++++ include/Ogre_glTF.hpp | 2 ++ src/Ogre_glTF.cpp | 37 ++++++++++++++++++------------------- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/Samples/LoadMesh/main.cpp b/Samples/LoadMesh/main.cpp index 56e278b..aef1c74 100644 --- a/Samples/LoadMesh/main.cpp +++ b/Samples/LoadMesh/main.cpp @@ -57,6 +57,21 @@ int main() { auto adapter = gltf->loadFromFileSystem("../Media/damagedHelmet/damagedHelmet.gltf"); objectNode = adapter.getFirstSceneNode(smgr); + + // On a scene with multiple root objects `loadMainScene` can be used to load all objects. + /* + auto root = smgr->getRootSceneNode(); + adapter.loadMainScene(root, smgr); + auto childIt = root->getChildIterator(); + while(childIt.hasMoreElements()) + { + auto child = childIt.getNext(); + if(child->getName() == "UnityGlTF_root") + { + objectNode = static_cast(child); + break; + } + }*/ } catch(std::exception& e) { diff --git a/include/Ogre_glTF.hpp b/include/Ogre_glTF.hpp index 4848b24..aa0c53c 100644 --- a/include/Ogre_glTF.hpp +++ b/include/Ogre_glTF.hpp @@ -54,6 +54,8 @@ namespace Ogre_glTF ///Return the number of datablock stored size_t getDatablockCount(); + void loadMainScene(Ogre::SceneNode* parentNode, Ogre::SceneManager* smgr) const; + ///Construct an item for this object /// \param smgr pointer to the scene manager where we are creating the item Ogre::SceneNode* getFirstSceneNode(Ogre::SceneManager* smgr) const; diff --git a/src/Ogre_glTF.cpp b/src/Ogre_glTF.cpp index 7ecbb1e..dd14c61 100644 --- a/src/Ogre_glTF.cpp +++ b/src/Ogre_glTF.cpp @@ -57,29 +57,28 @@ loaderAdapter::loaderAdapter() : pimpl { std::make_unique() } { OgreLog("C loaderAdapter::~loaderAdapter() { OgreLog("Destructed adapter object..."); } -Ogre::SceneNode* loaderAdapter::getFirstSceneNode(Ogre::SceneManager* smgr) const +void loaderAdapter::loadMainScene(Ogre::SceneNode* parentNode, Ogre::SceneManager* smgr) const { - if(isOk()) - { - pimpl->textureImp.loadTextures(); + if(!isOk()) + return; - // Find a node which is not a child of another node - std::vector allChildren; - for(const auto& node : pimpl->model.nodes) - { - allChildren.insert(allChildren.end(), node.children.begin(), node.children.end()); - } - // Find a node index that is not preset in the allChildren array and build - // the hierarchy from there. - for(size_t i = 0; i < pimpl->model.nodes.size(); ++i) - { - if(std::find(allChildren.begin(), allChildren.end(), i) == allChildren.end()) { - return getSceneNode(i, smgr->getRootSceneNode(), smgr); - } - } + pimpl->textureImp.loadTextures(); + auto sceneIdx = pimpl->model.defaultScene >= 0 ? pimpl->model.defaultScene : 0; + const auto& scene = pimpl->model.scenes[sceneIdx]; + + for(auto nodeIdx : scene.nodes) + { + getSceneNode(nodeIdx, parentNode, smgr); } +} - return nullptr; +Ogre::SceneNode* loaderAdapter::getFirstSceneNode(Ogre::SceneManager* smgr) const +{ + if(!isOk()) + return nullptr; + + pimpl->textureImp.loadTextures(); + return getSceneNode(pimpl->model.scenes[0].nodes[0], smgr->getRootSceneNode(), smgr); } Ogre::SceneNode* loaderAdapter::getSceneNode(size_t index, Ogre::SceneNode* parentSceneNode, Ogre::SceneManager* smgr) const