Updated Servo2D to LRE v0.22.0

This commit is contained in:
Alan Jeffrey 2019-08-09 14:59:13 -05:00
parent 6775c69da1
commit deb06ffcec
29 changed files with 791 additions and 174 deletions

14
support/magicleap/Servo2D/.gitignore vendored Normal file
View file

@ -0,0 +1,14 @@
.DS_Store
*.log
*.json.dirty
*.json.lock
*.pyc
*.sln
*.vcxproj*
*.previous
*.draft
pipeline/cache/intermediate/
.out/
.vscode/
.vs/

View file

@ -51,4 +51,4 @@ CXXFLAGS = \
USES = \ USES = \
lumin_runtime \ lumin_runtime \
code/srcsGen code/srcs

View file

@ -1,5 +1,10 @@
<?xml version="1.0" encoding="ASCII"?> <?xml version="1.0" encoding="ASCII"?>
<mlproject:mlproject xmlns:mlproject="http://www.magicleap.com/uidesigner/mlproject" generated="true"> <mlproject:mlproject xmlns:mlproject="http://www.magicleap.com/uidesigner/mlproject" generated="true" srcGenVersion="1">
<designFile path="scenes/Servo2D.design"/> <designFile path="scenes/Servo2D.design"/>
<pipelineDirectory path="pipeline"/> <pipelineDirectory path="pipeline"/>
<preferences key="srcgen.directories.src" value="src"/>
<preferences key="srcgen.directories.basedir" value="code"/>
<preferences key="srcgen.directories.inc" value="inc"/>
<preferences key="srcgen.directories.incgen" value="inc.gen"/>
<preferences key="srcgen.directories.srcgen" value="src.gen"/>
</mlproject:mlproject> </mlproject:mlproject>

View file

@ -1,5 +1,6 @@
USES = \
USES = "scenes" "pipeline/cache/AssetManifest" scenes \
pipeline/cache/AssetManifest
DATAS = \ DATAS = \
fonts.xml : etc/fonts.xml fonts.xml : etc/fonts.xml

View file

@ -0,0 +1,74 @@
// -- 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
#pragma once
#include <lumin/Prism.h>
#include <lumin/node/Node.h>
#include <SceneDescriptor.h>
#include <SpawnedSceneBase.h>
#include <SpawnedSceneUserData.h>
#include <scenes.h>
class PrismSceneManager {
public:
typedef std::function<SpawnedSceneUserData*(SpawnedSceneBase&)> (*CreateSpawnedSceneUserData);
static void setUserDataCreator(const SceneDescriptor & sceneDescriptor, CreateSpawnedSceneUserData createSpawnedSceneUserData);
public:
PrismSceneManager(lumin::Prism* prism);
enum class SceneState {
Unloaded,
ResourceModelLoaded,
ResourceAndObjectModelLoaded,
};
void setSceneState(const SceneDescriptor & sceneDescriptor, SceneState sceneState);
SceneState getSceneState(const SceneDescriptor & sceneDescriptor, SceneState sceneState) const;
SpawnedSceneBase* spawnScene(const SceneDescriptor & sceneDescriptor);
lumin::Node* spawn(const SceneDescriptor & sceneDescriptor);
private:
typedef SpawnedSceneBase* (*CreateSpawnedScene)(const SceneDescriptor& sceneDescriptor, lumin::Node* root);
static const CreateSpawnedScene createSpawnedScene[scenes::numberOfExternalScenes];
typedef SpawnedSceneHandlers* (*CreateSpawnedSceneHandlers)(SpawnedSceneBase& spawnedScene);
static const CreateSpawnedSceneHandlers createSpawnedSceneHandlers[scenes::numberOfExternalScenes];
static CreateSpawnedSceneUserData createSpawnedSceneUserData[scenes::numberOfExternalScenes];
private:
lumin::Node* createNodeTree(const SceneDescriptor & sceneDescriptor);
private:
lumin::Prism* prism_;
SceneState sceneStates_[scenes::numberOfExternalScenes];
std::string objectModelNames_[scenes::numberOfExternalScenes];
};

View file

@ -1,9 +1,9 @@
// -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- // -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING --
// //
// THE CONTENTS OF THIS FILE IS GENERATED BY CODE AND // THE CONTENTS OF THIS FILE IS GENERATED BY CODE AND
// ANY MODIFICATIONS WILL BE OVERWRITTEN // ANY MODIFICATIONS WILL BE OVERWRITTEN
// //
// -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- // -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING --
// %BANNER_BEGIN% // %BANNER_BEGIN%
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@ -17,6 +17,8 @@
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// %BANNER_END% // %BANNER_END%
// %SRC_VERSION%: 1
#pragma once #pragma once
#include <string> #include <string>
@ -26,23 +28,31 @@
class SceneDescriptor { class SceneDescriptor {
public: public:
typedef std::map<std::string /* exportedNodeName */, const std::string& /* exportedNodeId */> ExportedNodeReferences; typedef std::map<std::string /* externalNodeName */, const std::string& /* externalNodeId */> ExternalNodeReferences;
SceneDescriptor(const char* exportedName, const char* id, const char* sceneGraphFilePath, const char* resourceModelFilePath, const ExportedNodeReferences& exportedNodeReferences, bool initiallyInstanced); SceneDescriptor(int index, const char* externalName, const char* id, const char* sceneGraphFilePath, const char* resourceModelFilePath, const ExternalNodeReferences& externalNodeReferences, bool initiallySpawned);
const std::string& getExportedName() const; const std::string& getExternalName() const;
const std::string& getId() const; const std::string& getId() const;
const std::string& getSceneGraphPath() const; const std::string& getSceneGraphPath() const;
const std::string& getResourceModelPath() const; const std::string& getResourceModelPath() const;
const ExportedNodeReferences & getExportedNodeReferences() const; const ExternalNodeReferences & getExternalNodeReferences() const;
bool getInitiallyInstanced() const; bool getInitiallySpawned() const;
private: private:
std::string exportedName_;
friend class PrismSceneManager;
int getIndex() const;
private:
int index_;
std::string externalName_;
std::string id_; std::string id_;
std::string sceneGraphPath_; std::string sceneGraphPath_;
std::string resourceModelPath_; std::string resourceModelPath_;
const ExportedNodeReferences& exportedNodeReferences_; const ExternalNodeReferences& externalNodeReferences_;
bool initiallyInstanced_; bool initiallySpawned_;
}; };
typedef std::map<std::string /* exportedName */, const SceneDescriptor&> SceneDescriptorReferences; bool operator<(const SceneDescriptor& a, const SceneDescriptor& b);

View file

@ -0,0 +1,63 @@
// -- 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
#pragma once
#include <SpawnedSceneBase.h>
#include <SpawnedSceneHandlers.h>
#include <lumin/node/LineNode.h>
#include <lumin/node/QuadNode.h>
#include <lumin/ui/node/UiButton.h>
#include <lumin/ui/node/UiPanel.h>
#include <lumin/ui/node/UiTextEdit.h>
namespace scenes {
namespace Servo2D {
namespace externalNodes {
extern const std::string contentPanel;
extern const std::string content;
extern const std::string backButton;
extern const std::string fwdButton;
extern const std::string urlBar;
extern const std::string laser;
}
struct SpawnedScene : public SpawnedSceneBase {
SpawnedScene(const SceneDescriptor& sceneDescriptor, lumin::Node* root);
~SpawnedScene();
lumin::ui::UiPanel* contentPanel;
lumin::QuadNode* content;
lumin::ui::UiButton* backButton;
lumin::ui::UiButton* fwdButton;
lumin::ui::UiTextEdit* urlBar;
lumin::LineNode* laser;
};
SpawnedSceneBase* createSpawnedScene(const SceneDescriptor& sceneDescriptor, lumin::Node* root);
SpawnedSceneHandlers* createSpawnedSceneHandlers(SpawnedSceneBase& spawnedScene);
extern const SceneDescriptor descriptor;
}
}

View file

@ -0,0 +1,43 @@
// -- 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
#pragma once
#include <lumin/node/Node.h>
class SceneDescriptor;
class SpawnedSceneHandlers;
struct SpawnedSceneUserData;
struct SpawnedSceneBase {
SpawnedSceneBase(const SceneDescriptor &sd, lumin::Node* rt);
virtual ~SpawnedSceneBase();
SpawnedSceneBase() = delete;
SpawnedSceneBase(const SpawnedSceneBase&) = delete;
SpawnedSceneBase(const SpawnedSceneBase&&) = delete;
const SceneDescriptor& sceneDescriptor;
lumin::Node* root = nullptr;
SpawnedSceneHandlers* handlers = nullptr;
SpawnedSceneUserData* userData = nullptr;
};

View file

@ -0,0 +1,31 @@
// -- 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
#pragma once
struct SpawnedSceneBase;
class SpawnedSceneHandlers {
public:
SpawnedSceneHandlers(SpawnedSceneBase& ssb);
virtual ~SpawnedSceneHandlers();
};

View file

@ -0,0 +1,27 @@
// -- 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
#pragma once
struct SpawnedSceneUserData {
virtual ~SpawnedSceneUserData();
};

View file

@ -1,9 +1,9 @@
// -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- // -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING --
// //
// THE CONTENTS OF THIS FILE IS GENERATED BY CODE AND // THE CONTENTS OF THIS FILE IS GENERATED BY CODE AND
// ANY MODIFICATIONS WILL BE OVERWRITTEN // ANY MODIFICATIONS WILL BE OVERWRITTEN
// //
// -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- // -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING --
// %BANNER_BEGIN% // %BANNER_BEGIN%
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@ -17,20 +17,17 @@
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// %BANNER_END% // %BANNER_END%
// %SRC_VERSION%: 1
#pragma once #pragma once
#include <SceneDescriptor.h> #include <SceneDescriptor.h>
#include <map>
namespace Servo2D_exportedNodes {
extern const std::string contentPanel;
extern const std::string content;
extern const std::string backButton;
extern const std::string fwdButton;
extern const std::string urlBar;
extern const std::string laser;
}
namespace scenes { namespace scenes {
extern const SceneDescriptor Servo2D; const int numberOfExternalScenes = 1;
extern const SceneDescriptorReferences exportedScenes;
typedef std::map<std::string /* externalName */, const SceneDescriptor& /* sceneDescription */> SceneDescriptorReferences;
extern const SceneDescriptorReferences externalScenes;
} }

View file

@ -2,10 +2,13 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
#include <GLES/gl.h>
#include <lumin/LandscapeApp.h> #include <lumin/LandscapeApp.h>
#include <lumin/Prism.h> #include <lumin/Prism.h>
#include <lumin/event/ServerEvent.h> #include <lumin/event/ServerEvent.h>
#include <SceneDescriptor.h>
#include <PrismSceneManager.h>
#include <GLES/gl.h>
#include <lumin/event/GestureInputEventData.h> #include <lumin/event/GestureInputEventData.h>
#include <lumin/event/KeyInputEventData.h> #include <lumin/event/KeyInputEventData.h>
#include <lumin/event/ControlTouchPadInputEventData.h> #include <lumin/event/ControlTouchPadInputEventData.h>
@ -17,7 +20,6 @@
#include <lumin/ui/node/UiButton.h> #include <lumin/ui/node/UiButton.h>
#include <lumin/ui/node/UiPanel.h> #include <lumin/ui/node/UiPanel.h>
#include <lumin/ui/node/UiTextEdit.h> #include <lumin/ui/node/UiTextEdit.h>
#include <SceneDescriptor.h>
typedef struct Opaque ServoInstance; typedef struct Opaque ServoInstance;
@ -85,25 +87,20 @@ protected:
int deInit() override; int deInit() override;
/** /**
* Returns the size of the Prism, default = +/- (1.0f, 1.0f, 1.0f) meters. * Returns the initial size of the Prism
* Used in createPrism(). * Used in createPrism().
*/ */
const glm::vec3 getInitialPrismExtents() const; const glm::vec3 getInitialPrismSize() const;
/** /**
* Creates the prism, updates the private variable prism_ with the created prism. * Creates the prism, updates the private variable prism_ with the created prism.
*/ */
int createInitialPrism(); void createInitialPrism();
/** /**
* Initializes and creates the scene of all scenes marked as initially instanced * Initializes and creates the scene of all scenes marked as initially instanced
*/ */
void instanceInitialScenes(); void spawnInitialScenes();
/**
* Initializes and creates the scene of the scene and instances it into the prism
*/
lumin::Node* instanceScene(const SceneDescriptor & sceneToInit);
/** /**
* Run application login * Run application login
@ -133,6 +130,7 @@ protected:
private: private:
lumin::Prism* prism_ = nullptr; // represents the bounded space where the App renders. lumin::Prism* prism_ = nullptr; // represents the bounded space where the App renders.
PrismSceneManager* prismSceneManager_ = nullptr;
lumin::PlanarResource* plane_ = nullptr; // the plane we're rendering into lumin::PlanarResource* plane_ = nullptr; // the plane we're rendering into
lumin::QuadNode* content_node_ = nullptr; // the node containing the plane lumin::QuadNode* content_node_ = nullptr; // the node containing the plane
lumin::ui::UiPanel* content_panel_ = nullptr; // the panel containing the node lumin::ui::UiPanel* content_panel_ = nullptr; // the panel containing the node

View file

@ -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 ;
}

View file

@ -1,9 +1,9 @@
// -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- // -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING --
// //
// THE CONTENTS OF THIS FILE IS GENERATED BY CODE AND // THE CONTENTS OF THIS FILE IS GENERATED BY CODE AND
// ANY MODIFICATIONS WILL BE OVERWRITTEN // ANY MODIFICATIONS WILL BE OVERWRITTEN
// //
// -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- // -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING -- WARNING --
// %BANNER_BEGIN% // %BANNER_BEGIN%
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
@ -17,20 +17,27 @@
// --------------------------------------------------------------------- // ---------------------------------------------------------------------
// %BANNER_END% // %BANNER_END%
// %SRC_VERSION%: 1
#include <SceneDescriptor.h> #include <SceneDescriptor.h>
SceneDescriptor::SceneDescriptor(const char * exportedName, const char * id, const char * sceneGraphPath, const char * resourceModelPath, const ExportedNodeReferences& exportedNodeReferences, bool initiallyInstanced) SceneDescriptor::SceneDescriptor(int index, const char * externalName, const char * id, const char * sceneGraphPath, const char * resourceModelPath, const ExternalNodeReferences& externalNodeReferences, bool initiallySpawned)
: :
exportedName_(exportedName), index_(index),
externalName_(externalName),
id_(id), id_(id),
sceneGraphPath_(sceneGraphPath), sceneGraphPath_(sceneGraphPath),
resourceModelPath_(resourceModelPath), resourceModelPath_(resourceModelPath),
exportedNodeReferences_(exportedNodeReferences), externalNodeReferences_(externalNodeReferences),
initiallyInstanced_(initiallyInstanced) { initiallySpawned_(initiallySpawned) {
} }
const std::string & SceneDescriptor::getExportedName() const { int SceneDescriptor::getIndex() const {
return exportedName_; return index_;
}
const std::string & SceneDescriptor::getExternalName() const {
return externalName_;
} }
const std::string & SceneDescriptor::getId() const { const std::string & SceneDescriptor::getId() const {
@ -45,10 +52,15 @@ const std::string & SceneDescriptor::getResourceModelPath() const {
return resourceModelPath_; return resourceModelPath_;
} }
const SceneDescriptor::ExportedNodeReferences & SceneDescriptor::getExportedNodeReferences() const { const SceneDescriptor::ExternalNodeReferences & SceneDescriptor::getExternalNodeReferences() const {
return exportedNodeReferences_; return externalNodeReferences_;
} }
bool SceneDescriptor::getInitiallyInstanced() const { bool SceneDescriptor::getInitiallySpawned() const {
return initiallyInstanced_; return initiallySpawned_;
} }
bool operator<(const SceneDescriptor& a, const SceneDescriptor& b) {
return a.getExternalName() < b.getExternalName();
}

View file

@ -0,0 +1,117 @@
// -- 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 <SceneDescriptor.h>
#include <SpawnedSceneBase.h>
#include <Servo2D/Servo2D.h>
namespace scenes {
namespace Servo2D {
SpawnedScene::SpawnedScene(const SceneDescriptor& sceneDescriptor, lumin::Node* root)
: SpawnedSceneBase(sceneDescriptor, root) {
contentPanel = lumin::ui::UiPanel::CastFrom(root->findChild(externalNodes::contentPanel));
content = lumin::QuadNode::CastFrom(root->findChild(externalNodes::content));
backButton = lumin::ui::UiButton::CastFrom(root->findChild(externalNodes::backButton));
fwdButton = lumin::ui::UiButton::CastFrom(root->findChild(externalNodes::fwdButton));
urlBar = lumin::ui::UiTextEdit::CastFrom(root->findChild(externalNodes::urlBar));
laser = lumin::LineNode::CastFrom(root->findChild(externalNodes::laser));
}
SpawnedScene::~SpawnedScene() {
}
SpawnedSceneBase* createSpawnedScene(const SceneDescriptor& sceneDescriptor, lumin::Node* root) {
using namespace externalNodes;
SpawnedScene* spawnedScene = new SpawnedScene(sceneDescriptor, root);
return spawnedScene;
}
class Handlers : public SpawnedSceneHandlers
{
public:
Handlers(SpawnedScene& ss);
private:
struct contentPanelHandlers {
contentPanelHandlers(SpawnedScene& ss);
};
contentPanelHandlers contentPanelHandlers_;
struct contentHandlers {
contentHandlers(SpawnedScene& ss);
};
contentHandlers contentHandlers_;
struct backButtonHandlers {
backButtonHandlers(SpawnedScene& ss);
};
backButtonHandlers backButtonHandlers_;
struct fwdButtonHandlers {
fwdButtonHandlers(SpawnedScene& ss);
};
fwdButtonHandlers fwdButtonHandlers_;
struct urlBarHandlers {
urlBarHandlers(SpawnedScene& ss);
};
urlBarHandlers urlBarHandlers_;
struct laserHandlers {
laserHandlers(SpawnedScene& ss);
};
laserHandlers laserHandlers_;
};
Handlers::contentPanelHandlers::contentPanelHandlers(SpawnedScene& ss)
{
}
Handlers::contentHandlers::contentHandlers(SpawnedScene& ss)
{
}
Handlers::backButtonHandlers::backButtonHandlers(SpawnedScene& ss)
{
}
Handlers::fwdButtonHandlers::fwdButtonHandlers(SpawnedScene& ss)
{
}
Handlers::urlBarHandlers::urlBarHandlers(SpawnedScene& ss)
{
}
Handlers::laserHandlers::laserHandlers(SpawnedScene& ss)
{
}
Handlers::Handlers(SpawnedScene& ss)
: SpawnedSceneHandlers(ss),
contentPanelHandlers_(ss),
contentHandlers_(ss),
backButtonHandlers_(ss),
fwdButtonHandlers_(ss),
urlBarHandlers_(ss),
laserHandlers_(ss)
{
}
SpawnedSceneHandlers* createSpawnedSceneHandlers(SpawnedSceneBase& ssb) {
return new Handlers(static_cast<SpawnedScene&>(ssb));
}
}
}

View file

@ -0,0 +1,35 @@
// -- 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 <SpawnedSceneBase.h>
#include <SpawnedSceneHandlers.h>
#include <SpawnedSceneUserData.h>
SpawnedSceneBase::SpawnedSceneBase(const SceneDescriptor &sd, lumin::Node* rt)
: sceneDescriptor(sd),
root(rt) {
}
SpawnedSceneBase::~SpawnedSceneBase() {
delete handlers;
delete userData;
}

View file

@ -0,0 +1,29 @@
// -- 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 <SpawnedSceneHandlers.h>
SpawnedSceneHandlers::SpawnedSceneHandlers(SpawnedSceneBase& ssb) {
}
SpawnedSceneHandlers::~SpawnedSceneHandlers() {
}

View file

@ -0,0 +1,26 @@
// -- 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 <SpawnedSceneUserData.h>
SpawnedSceneUserData::~SpawnedSceneUserData() {
}

View file

@ -0,0 +1,76 @@
// -- 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 <scenes.h>
#include <Servo2D/Servo2D.h>
namespace scenes {
namespace Servo2D {
namespace externalNodes {
extern const std::string contentPanel = "contentPanel";
extern const std::string content = "content";
extern const std::string backButton = "backButton";
extern const std::string fwdButton = "fwdButton";
extern const std::string urlBar = "urlBar";
extern const std::string laser = "laser";
}
const SceneDescriptor::ExternalNodeReferences externalNodesMap = {
{"contentPanel", externalNodes::contentPanel},
{"content", externalNodes::content},
{"backButton", externalNodes::backButton},
{"fwdButton", externalNodes::fwdButton},
{"urlBar", externalNodes::urlBar},
{"laser", externalNodes::laser}
};
const SceneDescriptor descriptor(
0,
"Servo2D",
"root",
"/assets/scenes/Servo2D.scene.xml",
"/assets/scenes/Servo2D.scene.res.xml",
externalNodesMap,
true);
}
const SceneDescriptorReferences externalScenes = {
{Servo2D::descriptor.getExternalName(), Servo2D::descriptor}
};
struct VerifyNumberOfExternalScenes {
VerifyNumberOfExternalScenes() { assert(externalScenes.size() == numberOfExternalScenes); }
};
VerifyNumberOfExternalScenes verifyNumberOfExternalScenes;
}
const PrismSceneManager::CreateSpawnedScene PrismSceneManager::createSpawnedScene[scenes::numberOfExternalScenes] = {
::scenes::Servo2D::createSpawnedScene
};
const PrismSceneManager::CreateSpawnedSceneHandlers PrismSceneManager::createSpawnedSceneHandlers[scenes::numberOfExternalScenes] = {
static_cast<CreateSpawnedSceneHandlers>(::scenes::Servo2D::createSpawnedSceneHandlers)
};

View file

@ -1,53 +0,0 @@
// -- 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%
#include <scenesGen.h>
namespace Servo2D_exportedNodes {
const std::string contentPanel = "contentPanel";
const std::string content = "content";
const std::string backButton = "backButton";
const std::string fwdButton = "fwdButton";
const std::string urlBar = "urlBar";
const std::string laser = "laser";
}
namespace scenes {
const SceneDescriptor::ExportedNodeReferences Servo2D_exportedNodesMap = {
{"contentPanel", Servo2D_exportedNodes::contentPanel},
{"content", Servo2D_exportedNodes::content},
{"backButton", Servo2D_exportedNodes::backButton},
{"fwdButton", Servo2D_exportedNodes::fwdButton},
{"urlBar", Servo2D_exportedNodes::urlBar},
{"laser", Servo2D_exportedNodes::laser}
};
const SceneDescriptor Servo2D(
"Servo2D",
"root",
"/assets/scenes/scenes/Servo2D.scene.xml",
"/assets/scenes/scenes/Servo2D.scene.res.xml",
Servo2D_exportedNodesMap,
true);
const SceneDescriptorReferences exportedScenes = {
{Servo2D.getExportedName(), Servo2D}
};
}

View file

@ -2,13 +2,15 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
#include <Servo2D.h> #include <Servo2D/Servo2D.h>
#include <lumin/node/RootNode.h> #include <lumin/node/RootNode.h>
#include <lumin/node/QuadNode.h>
#include <lumin/ui/Cursor.h> #include <lumin/ui/Cursor.h>
#include <ml_logging.h> #include <ml_logging.h>
#include <scenesGen.h> #include <scenes.h>
#include <SceneDescriptor.h> #include <PrismSceneManager.h>
#include <Servo2D.h>
#include <lumin/node/QuadNode.h>
#include <lumin/ui/Keyboard.h> #include <lumin/ui/Keyboard.h>
#include <EGL/egl.h> #include <EGL/egl.h>
#include <GLES/gl.h> #include <GLES/gl.h>
@ -90,30 +92,26 @@ Servo2D::~Servo2D() {
ML_LOG(Debug, "Servo2D Destructor."); ML_LOG(Debug, "Servo2D Destructor.");
} }
// The prism dimensions const glm::vec3 Servo2D::getInitialPrismSize() const {
const glm::vec3 Servo2D::getInitialPrismExtents() const {
return glm::vec3(PRISM_W, PRISM_H, PRISM_D); return glm::vec3(PRISM_W, PRISM_H, PRISM_D);
} }
// Create the prism for Servo void Servo2D::createInitialPrism() {
int Servo2D::createInitialPrism() { prism_ = requestNewPrism(getInitialPrismSize());
prism_ = requestNewPrism(getInitialPrismExtents());
if (!prism_) { if (!prism_) {
ML_LOG(Error, "Servo2D Error creating default prism."); ML_LOG(Error, "Servo2D Error creating default prism.");
return 1; abort();
} }
return 0; prismSceneManager_ = new PrismSceneManager(prism_);
} }
// Initialize a Servo instance
int Servo2D::init() { int Servo2D::init() {
ML_LOG(Debug, "Servo2D Initializing."); ML_LOG(Debug, "Servo2D Initializing.");
// Set up the prism
createInitialPrism(); createInitialPrism();
lumin::ui::Cursor::SetScale(prism_, 0.03f); lumin::ui::Cursor::SetScale(prism_, 0.03f);
instanceInitialScenes(); spawnInitialScenes();
// Check privileges // Check privileges
if (checkPrivilege(lumin::PrivilegeId::kInternet) != lumin::PrivilegeResult::kGranted) { if (checkPrivilege(lumin::PrivilegeId::kInternet) != lumin::PrivilegeResult::kGranted) {
@ -135,7 +133,7 @@ int Servo2D::init() {
return 1; return 1;
} }
std::string content_node_id = Servo2D_exportedNodes::content; std::string content_node_id = scenes::Servo2D::externalNodes::content;
content_node_ = lumin::QuadNode::CastFrom(prism_->findNode(content_node_id, root_node)); content_node_ = lumin::QuadNode::CastFrom(prism_->findNode(content_node_id, root_node));
if (!content_node_) { if (!content_node_) {
ML_LOG(Error, "Servo2D Failed to get content node"); ML_LOG(Error, "Servo2D Failed to get content node");
@ -144,7 +142,9 @@ int Servo2D::init() {
} }
content_node_->setTriggerable(true); content_node_->setTriggerable(true);
content_panel_ = lumin::ui::UiPanel::CastFrom(prism_->findNode(Servo2D_exportedNodes::contentPanel, root_node)); content_panel_ = lumin::ui::UiPanel::CastFrom(
prism_->findNode(scenes::Servo2D::externalNodes::contentPanel, root_node)
);
if (!content_panel_) { if (!content_panel_) {
ML_LOG(Error, "Servo2D Failed to get content panel"); ML_LOG(Error, "Servo2D Failed to get content panel");
abort(); abort();
@ -193,7 +193,7 @@ int Servo2D::init() {
} }
// Add a callback to the back button // Add a callback to the back button
std::string back_button_id = Servo2D_exportedNodes::backButton; std::string back_button_id = scenes::Servo2D::externalNodes::backButton;
back_button_ = lumin::ui::UiButton::CastFrom(prism_->findNode(back_button_id, root_node)); back_button_ = lumin::ui::UiButton::CastFrom(prism_->findNode(back_button_id, root_node));
if (!back_button_) { if (!back_button_) {
ML_LOG(Error, "Servo2D Failed to get back button"); ML_LOG(Error, "Servo2D Failed to get back button");
@ -203,7 +203,7 @@ int Servo2D::init() {
back_button_->onActivateSub(std::bind(traverse_servo, servo_, -1)); back_button_->onActivateSub(std::bind(traverse_servo, servo_, -1));
// Add a callback to the forward button // Add a callback to the forward button
std::string fwd_button_id = Servo2D_exportedNodes::fwdButton; std::string fwd_button_id = scenes::Servo2D::externalNodes::fwdButton;
fwd_button_ = lumin::ui::UiButton::CastFrom(prism_->findNode(fwd_button_id, root_node)); fwd_button_ = lumin::ui::UiButton::CastFrom(prism_->findNode(fwd_button_id, root_node));
if (!fwd_button_) { if (!fwd_button_) {
ML_LOG(Error, "Servo2D Failed to get forward button"); ML_LOG(Error, "Servo2D Failed to get forward button");
@ -213,7 +213,7 @@ int Servo2D::init() {
fwd_button_->onActivateSub(std::bind(traverse_servo, servo_, +1)); fwd_button_->onActivateSub(std::bind(traverse_servo, servo_, +1));
// Add a callback to the URL bar // Add a callback to the URL bar
std::string url_bar_id = Servo2D_exportedNodes::urlBar; std::string url_bar_id = scenes::Servo2D::externalNodes::urlBar;
url_bar_ = lumin::ui::UiTextEdit::CastFrom(prism_->findNode(url_bar_id, root_node)); url_bar_ = lumin::ui::UiTextEdit::CastFrom(prism_->findNode(url_bar_id, root_node));
if (!url_bar_) { if (!url_bar_) {
ML_LOG(Error, "Servo2D Failed to get URL bar"); ML_LOG(Error, "Servo2D Failed to get URL bar");
@ -227,7 +227,7 @@ int Servo2D::init() {
url_bar_->onFocusLostSub(std::bind(&Servo2D::urlBarEventListener, this)); url_bar_->onFocusLostSub(std::bind(&Servo2D::urlBarEventListener, this));
// Add the laser pointer // Add the laser pointer
laser_ = lumin::LineNode::CastFrom(prism_->findNode(Servo2D_exportedNodes::laser, root_node)); laser_ = lumin::LineNode::CastFrom(prism_->findNode(scenes::Servo2D::externalNodes::laser, root_node));
if (!laser_) { if (!laser_) {
ML_LOG(Error, "Servo2D Failed to get laser"); ML_LOG(Error, "Servo2D Failed to get laser");
abort(); abort();
@ -244,39 +244,21 @@ int Servo2D::deInit() {
return 0; return 0;
} }
lumin::Node* Servo2D::instanceScene(const SceneDescriptor& scene) { void Servo2D::spawnInitialScenes() {
// Load resources.
if (!prism_->loadResourceModel(scene.getResourceModelPath())) {
ML_LOG(Info, "No resource model loaded");
}
// Load a scene file.
std::string editorObjectModelName;
if (!prism_->loadObjectModel(scene.getSceneGraphPath(), editorObjectModelName)) {
ML_LOG(Error, "Servo2D Failed to load object model");
abort();
return nullptr;
}
// Add scene to this prism.
lumin::Node* newTree = prism_->createAll(editorObjectModelName);
if (!prism_->getRootNode()->addChild(newTree)) {
ML_LOG(Error, "Servo2D Failed to add newTree to the prism root node");
abort();
return nullptr;
}
return newTree;
}
void Servo2D::instanceInitialScenes() {
// Iterate over all the exported scenes // Iterate over all the exported scenes
for (auto& exportedSceneEntry : scenes::exportedScenes ) { for (auto& exportedSceneEntry : scenes::externalScenes ) {
// If this scene was marked to be instanced at app initialization, do it // If this scene was marked to be instanced at app initialization, do it
const SceneDescriptor &sd = exportedSceneEntry.second; const SceneDescriptor &sd = exportedSceneEntry.second;
if (sd.getInitiallyInstanced()) { if (sd.getInitiallySpawned()) {
instanceScene(sd); lumin::Node* const spawnedRoot = prismSceneManager_->spawn(sd);
if (spawnedRoot) {
if (!prism_->getRootNode()->addChild(spawnedRoot)) {
ML_LOG(Error, "Servo2D Failed to add spawnedRoot to the prism root node");
abort();
}
}
} }
} }
} }

View file

@ -0,0 +1,8 @@
SRCS = \
src.gen/scenes.cpp \
src.gen/Servo2D/Servo2D.cpp \
src.gen/PrismSceneManager.cpp \
src.gen/SceneDescriptor.cpp \
src.gen/SpawnedSceneBase.cpp \
src.gen/SpawnedSceneHandlers.cpp \
src.gen/SpawnedSceneUserData.cpp \

View file

@ -1,3 +0,0 @@
SRCS = \
src.gen/scenesGen.cpp \
src.gen/SceneDescriptor.cpp \

View file

@ -1 +0,0 @@
DATAS=

View file

@ -22,7 +22,7 @@
"lap/types/file/png" "lap/types/file/png"
] ]
}, },
"checkpoint-hash": "74689acde6571e19f86366dd94d8890be66acfceb26d14ac3ca14228fa31959087b8771fbb5a86764b4e7dc121bd78c3b0ee4c9c0716f0d91c90a59315f8acd8", "checkpoint-hash": "b1a5b4c3dfe7a6c0a3068dd837adfa07364f5016ddef9e6698090ba3544ccf921abba715182f372e25d65a9b6b13fdf11f12e436482cc3bace76f56876bd2251",
"templates": [ "templates": [
"lap/template/passthru_material_from_kmat", "lap/template/passthru_material_from_kmat",
"lap/template/passthru_model_from_fbx", "lap/template/passthru_model_from_fbx",

View file

@ -1,3 +1,3 @@
DATAS = \ DATAS = \
scenes/Servo2D.scene.res.xml : assets/scenes/scenes/Servo2D.scene.res.xml \ scenes/Servo2D.scene.res.xml : assets/scenes/Servo2D.scene.res.xml \
scenes/Servo2D.scene.xml : assets/scenes/scenes/Servo2D.scene.xml scenes/Servo2D.scene.xml : assets/scenes/Servo2D.scene.xml

View file

@ -1,10 +1,11 @@
<?xml version="1.0" encoding="ASCII"?> <?xml version="1.0" encoding="ASCII"?>
<design:rootNode xmlns:design="http://www.magicleap.com/uidesigner/rcp/document/design" name="root" nodeTypeId="lumin.root" modelId="lumin" version="1.8.0"> <design:rootNode xmlns:design="http://www.magicleap.com/uidesigner/rcp/document/design" name="root" nodeTypeId="lumin.root" modelId="lumin" version="1.11.1">
<property id="name" value="root"/> <property id="name" value="root"/>
<property id="sceneName" value="Servo2D"/>
<node name="contentPanel" nodeTypeId="lumin.ui.panel"> <node name="contentPanel" nodeTypeId="lumin.ui.panel">
<property id="cursorInitialPosition"/> <property id="cursorInitialPosition"/>
<property id="edgeConstraint"/> <property id="edgeConstraint"/>
<property id="externalName" value="contentPanel"/> <property id="external" value="true"/>
<property id="gravityWellProperties"> <property id="gravityWellProperties">
<property id="boundaryShape"> <property id="boundaryShape">
<property id="size"/> <property id="size"/>
@ -25,7 +26,7 @@
<property id="rotation"/> <property id="rotation"/>
<property id="scale"/> <property id="scale"/>
<node name="content" nodeTypeId="lumin.quad"> <node name="content" nodeTypeId="lumin.quad">
<property id="externalName" value="content"/> <property id="external" value="true"/>
<property id="name" value="content"/> <property id="name" value="content"/>
<property id="position"> <property id="position">
<property id="x" value="-0.25"/> <property id="x" value="-0.25"/>
@ -84,7 +85,7 @@
<property id="y" value="0.05"/> <property id="y" value="0.05"/>
</property> </property>
<node name="backButton" nodeTypeId="lumin.ui.button"> <node name="backButton" nodeTypeId="lumin.ui.button">
<property id="externalName" value="backButton"/> <property id="external" value="true"/>
<property id="gravityWellProperties"> <property id="gravityWellProperties">
<property id="boundaryShape"> <property id="boundaryShape">
<property id="size"/> <property id="size"/>
@ -105,7 +106,7 @@
<property id="width" value="0.1"/> <property id="width" value="0.1"/>
</node> </node>
<node name="fwdButton" nodeTypeId="lumin.ui.button"> <node name="fwdButton" nodeTypeId="lumin.ui.button">
<property id="externalName" value="fwdButton"/> <property id="external" value="true"/>
<property id="gravityWellProperties"> <property id="gravityWellProperties">
<property id="boundaryShape"> <property id="boundaryShape">
<property id="size"/> <property id="size"/>
@ -127,7 +128,7 @@
<property id="alignment"> <property id="alignment">
<property id="verticalAlignment" value="Center"/> <property id="verticalAlignment" value="Center"/>
</property> </property>
<property id="externalName" value="urlBar"/> <property id="external" value="true"/>
<property id="gravityWellProperties"> <property id="gravityWellProperties">
<property id="boundaryShape"> <property id="boundaryShape">
<property id="size"/> <property id="size"/>
@ -153,7 +154,7 @@
</node> </node>
<node name="laser" nodeTypeId="lumin.line"> <node name="laser" nodeTypeId="lumin.line">
<property id="color" value="0 0 0 0"/> <property id="color" value="0 0 0 0"/>
<property id="externalName" value="laser"/> <property id="external" value="true"/>
<property id="name" value="laser"/> <property id="name" value="laser"/>
<property id="opaque" value="false"/> <property id="opaque" value="false"/>
<property id="points"> <property id="points">

View file

@ -0,0 +1 @@
<ResourceModel version="1"></ResourceModel>

View file

@ -1,19 +1,19 @@
<ObjectModel name="Servo2D" version="1"> <ObjectModel name="Servo2D" version="1">
<TransformNode/> <TransformNode/>
<UiPanel gravityWellEnabled="false" gravityWellRoundness="0.000000" gravityWellSize="0.000000, 0.000000" gravityWellSnap="ClosestEdge" name="contentPanel" pos="0.000000, 0.060000, 0.000000" shape="[size:[0.5,0.44], roundness: 0, offset[0,0,0]]"> <UiPanel bottomEdgeConstraint="0.000000" gravityWellRoundness="0.000000" gravityWellSize="0.000000, 0.000000" gravityWellSnap="ClosestEdge" leftEdgeConstraint="0.000000" name="contentPanel" pos="0,0.06,0" rightEdgeConstraint="0.000000" shape="[size:[0.5,0.44], roundness: 0, offset:[0,0,0]]" topEdgeConstraint="0.000000">
<QuadNode castShadow="false" name="content" pos="-0.250000, -0.220000, -0.000000" receiveShadow="false" shader="UnlitColorTex2d" size="0.500000, 0.500000"/> <QuadNode castShadow="false" name="content" pos="-0.25,-0.22,-0" receiveShadow="false" shader="MAX" size="0.500000, 0.500000"/>
</UiPanel> </UiPanel>
<UiLinearLayout alignment="Top, Center" gravityWellEnabled="false" gravityWellRoundness="0.000000" gravityWellSize="0.000000, 0.000000" gravityWellSnap="ClosestEdge" itemAlignment="Center, Left" itemPadding="0.000000, 0.010000, 0.000000, 0.010000" name="uiLinearLayout1" orientation="Horizontal" pos="0.000000, -0.200000, 0.000000" size="0.500000, 0.050000"> <UiLinearLayout alignment="Top, Center" gravityWellRoundness="0.000000" gravityWellSize="0.000000, 0.000000" gravityWellSnap="ClosestEdge" itemAlignment="Center, Left" itemPadding="0.000000, 0.010000, 0.000000, 0.010000" name="uiLinearLayout1" orientation="Horizontal" pos="0,-0.2,0" size="0.500000, 0.050000">
<Content> <Content>
<UiButton gravityWellEnabled="false" gravityWellRoundness="0.000000" gravityWellSize="0.000000, 0.000000" gravityWellSnap="ClosestEdge" name="backButton" pos="0.000000, -0.600000, 0.000000" size="0.100000, 0.100000" text="Back" textSize="0.050000"/> <UiButton gravityWellRoundness="0.000000" gravityWellSize="0.000000, 0.000000" gravityWellSnap="ClosestEdge" name="backButton" pos="0,-0.6,0" size="0.100000, 0.100000" text="Back" textSize="0.050000"/>
</Content> </Content>
<Content> <Content>
<UiButton gravityWellEnabled="false" gravityWellRoundness="0.000000" gravityWellSize="0.000000, 0.000000" gravityWellSnap="ClosestEdge" name="fwdButton" size="0.100000, 0.100000" text="Fwd" textSize="0.050000"/> <UiButton gravityWellRoundness="0.000000" gravityWellSize="0.000000, 0.000000" gravityWellSnap="ClosestEdge" name="fwdButton" size="0.100000, 0.100000" text="Fwd" textSize="0.050000"/>
</Content> </Content>
<Content> <Content>
<UiTextEdit alignment="Center, Left" gravityWellEnabled="false" gravityWellRoundness="0.000000" gravityWellSize="0.000000, 0.000000" gravityWellSnap="ClosestEdge" name="urlBar" scrollSpeed="0.500000" size="0.600000, 0.050000" textSize="0.050000"/> <UiTextEdit alignment="Center, Left" font="DefaultRes_Font_LominoUI_Rg" gravityWellRoundness="0.000000" gravityWellSize="0.000000, 0.000000" gravityWellSnap="ClosestEdge" name="urlBar" scrollSpeed="0.500000" size="0.600000, 0.050000" textSize="0.050000"/>
</Content> </Content>
</UiLinearLayout> </UiLinearLayout>
<LineNode castShadow="false" color="0.000000, 0.000000, 0.000000, 0.000000" name="laser" opaque="false" points="0.000000, 0.000000, 0.000000, 1.000000, 1.000000, 1.000000" receiveShadow="false" shader="Line"/> <LineNode castShadow="false" color="0,0,0,0" name="laser" opaque="false" points="0.000000, 0.000000, 0.000000, 1.000000, 1.000000, 1.000000" receiveShadow="false" shader="Line"/>
<QuadNode castShadow="false" color="0.157206, 0.092197, 0.481788, 1.000000" name="bevel" pos="-0.260000, -0.170000, -0.010000" receiveShadow="false" shader="UnlitColorTex2d" size="0.520000, 0.520000"/> <QuadNode castShadow="false" color="0.1572062,0.09219654,0.4817875,1" name="bevel" pos="-0.26,-0.17,-0.01" receiveShadow="false" shader="MAX" size="0.520000, 0.520000"/>
</ObjectModel> </ObjectModel>