diff options
Diffstat (limited to 'support/magicleap/Servo2D/code/src.gen/PrismSceneManager.cpp')
-rw-r--r-- | support/magicleap/Servo2D/code/src.gen/PrismSceneManager.cpp | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/support/magicleap/Servo2D/code/src.gen/PrismSceneManager.cpp b/support/magicleap/Servo2D/code/src.gen/PrismSceneManager.cpp new file mode 100644 index 00000000000..7a8aee9f3ff --- /dev/null +++ b/support/magicleap/Servo2D/code/src.gen/PrismSceneManager.cpp @@ -0,0 +1,124 @@ +// -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- +// +// THE CONTENTS OF THIS FILE IS GENERATED BY CODE AND +// ANY MODIFICATIONS WILL BE OVERWRITTEN +// +// -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- + +// %BANNER_BEGIN% +// --------------------------------------------------------------------- +// %COPYRIGHT_BEGIN% +// +// Copyright (c) 2018 Magic Leap, Inc. All Rights Reserved. +// Use of this file is governed by the Creator Agreement, located +// here: https://id.magicleap.com/creator-terms +// +// %COPYRIGHT_END% +// --------------------------------------------------------------------- +// %BANNER_END% + +// %SRC_VERSION%: 1 + +#include <PrismSceneManager.h> + +#include <ml_logging.h> + +PrismSceneManager::CreateSpawnedSceneUserData PrismSceneManager::createSpawnedSceneUserData[scenes::numberOfExternalScenes]; + +PrismSceneManager::PrismSceneManager(lumin::Prism* prism) +: prism_(prism) { + + if (!prism_) { + ML_LOG(Error, "PrismSceneManager nullptr prism"); + abort(); + } + + for (int i = 0; i < sizeof(sceneStates_)/sizeof(sceneStates_[0]); ++i) { + sceneStates_[i] = SceneState::Unloaded; + } +} + +void PrismSceneManager::setSceneState(const SceneDescriptor & sceneDescriptor, SceneState newState) { + + const int sceneIndex = sceneDescriptor.getIndex(); + SceneState& sceneState = sceneStates_[sceneIndex]; + std::string& objectModelName = objectModelNames_[sceneIndex]; + + if (sceneState == SceneState::Unloaded && (newState == SceneState::ResourceModelLoaded || newState == SceneState::ResourceAndObjectModelLoaded)) { + if (!prism_->loadResourceModel(sceneDescriptor.getResourceModelPath())) { + ML_LOG(Error, "PrismSceneManager failed to load resource model"); + abort(); + } + sceneState = SceneState::ResourceModelLoaded; + } + + if (sceneState == SceneState::ResourceModelLoaded && newState == SceneState::ResourceAndObjectModelLoaded) { + std::string& objectModelName = objectModelNames_[sceneIndex]; + if (!prism_->loadObjectModel(sceneDescriptor.getSceneGraphPath(), objectModelName)) { + ML_LOG(Error, "PrismSceneManager failed to load object model"); + abort(); + } + sceneState = SceneState::ResourceAndObjectModelLoaded; + } + + if (sceneState == SceneState::ResourceAndObjectModelLoaded && (newState == SceneState::ResourceModelLoaded || newState == SceneState::Unloaded)) { + if (!prism_->unloadObjectModel(objectModelName)) { + ML_LOG(Error, "PrismSceneManager failed to unload object model"); + abort(); + } + sceneState = SceneState::ResourceModelLoaded; + objectModelName.clear(); + } + + // Currently there is no effective way to unload the resource model +} + +SpawnedSceneBase* PrismSceneManager::spawnScene(const SceneDescriptor & sceneDescriptor) { + + lumin::Node* root = createNodeTree(sceneDescriptor); + if (!root) { + return nullptr; + } + + const int index = sceneDescriptor.getIndex(); + CreateSpawnedScene css = createSpawnedScene[index]; + SpawnedSceneBase* const spawnedScene = (*css)(sceneDescriptor, root); + + CreateSpawnedSceneHandlers ch = createSpawnedSceneHandlers[index]; + SpawnedSceneHandlers* const handlers = (*ch)(*spawnedScene); + spawnedScene->handlers = handlers; + + CreateSpawnedSceneUserData cssud = createSpawnedSceneUserData[sceneDescriptor.getIndex()]; + if (cssud) { + spawnedScene->userData = (*cssud)(*spawnedScene); + } + return spawnedScene; +} + +lumin::Node* PrismSceneManager::spawn(const SceneDescriptor & sceneDescriptor) { + SpawnedSceneBase* spawnedSceneBase = spawnScene(sceneDescriptor); + if (!spawnedSceneBase) { + return nullptr; + } + lumin::Node* root = spawnedSceneBase->root; + return root; +} + +lumin::Node* PrismSceneManager::createNodeTree(const SceneDescriptor & sceneDescriptor) { + setSceneState(sceneDescriptor, SceneState::ResourceAndObjectModelLoaded); + const int sceneIndex = sceneDescriptor.getIndex(); + std::string& objectModelName = objectModelNames_[sceneIndex]; + + lumin::Node* root = prism_->createAll(objectModelName); + if (!root) { + ML_LOG(Error, "PrismSceneManager failed to create the scene. Is the scene empty?"); + return nullptr; + } + + return root; +} + +void PrismSceneManager::setUserDataCreator(const SceneDescriptor & sceneDescriptor, CreateSpawnedSceneUserData cssud) { + createSpawnedSceneUserData[sceneDescriptor.getIndex()] = cssud ; +} + |