Browse Source

- Working on the scene
- Adding Frustum

Panagiotis Christopoulos Charitos 14 năm trước cách đây
mục cha
commit
90a3a4061c

+ 3 - 0
anki/collision/CollisionShape.h

@@ -72,6 +72,9 @@ public:
 	/// Transform
 	virtual void transform(const Transform& trf) = 0;
 
+	virtual void accept(MutableVisitor&) = 0;
+	virtual void accept(ConstVisitor&) const = 0;
+
 private:
 	CollisionShapeType cid;
 };

+ 54 - 0
anki/collision/Frustum.cpp

@@ -0,0 +1,54 @@
+#include "anki/collision/Frustum.h"
+#include "anki/collision/LineSegment.h"
+
+
+namespace anki {
+
+
+//==============================================================================
+Frustum& Frustum::operator=(const Frustum& b)
+{
+	for(int i = 0; i < planes.size(); ++i)
+	{
+		planes[i] = b.planes[i];
+	}
+
+	eye = b.eye;
+
+	for(int i = 0; i < dirs.size(); ++i)
+	{
+		dirs[i] = b.dirs[i];
+	}
+}
+
+
+//==============================================================================
+float Frustum::testPlane(const Plane& p) const
+{
+	const Frustum& f = *this;
+	float o = 0.0;
+
+	for(uint i = 0; i < 4; i++)
+	{
+		LineSegment ls(f.getEye(), f.getDirections()[i]);
+		float t = ls.testPlane(p);
+
+		if(t == 0)
+		{
+			return 0.0;
+		}
+		else if(t < 0.0)
+		{
+			o = std::max(o, t);
+		}
+		else
+		{
+			o = std::min(o, t);
+		}
+	}
+
+	return o;
+}
+
+
+} // end namespace

+ 76 - 0
anki/collision/Frustum.h

@@ -0,0 +1,76 @@
+#ifndef ANKI_COLLISION_FRUSTUM_H
+#define ANKI_COLLISION_FRUSTUM_H
+
+#include "anki/collision/CollisionShape.h"
+#include "anki/math/Math.h"
+#include <boost/array.hpp>
+
+
+namespace anki {
+
+
+/// @addtogroup Collision
+/// @{
+
+/// Frustum collision shape
+///
+/// This shape consists from 6 planes. The planes are being used to find shapes
+/// that are inside the frustum
+class Frustum: public CollisionShape
+{
+public:
+	Frustum()
+		: CollisionShape(CST_FRUSTUM)
+	{}
+
+	Frustum(const Frustum& b)
+		: CollisionShape(CST_FRUSTUM)
+	{
+		*this = b;
+	}
+
+	Frustum(float fovX, float fovY, float zNear,
+		float zFar, const Transform& trf)
+		: CollisionShape(CST_FRUSTUM)
+	{
+		// XXX
+	}
+
+	/// Copy
+	Frustum& operator=(const Frustum& b);
+
+	/// Implements CollisionShape::testPlane
+	float testPlane(const Plane& p) const;
+
+	/// Implements CollisionShape::transform
+	void transform(const Transform& trf)
+	{
+		*this = getTransformed(trf);
+	}
+
+	Frustum getTransformed(const Transform& trf) const;
+
+	/// Implements CollisionShape::accept
+	void accept(MutableVisitor& v)
+	{
+		v.visit(*this);
+	}
+	/// Implements CollisionShape::accept
+	void accept(ConstVisitor& v) const
+	{
+		v.visit(*this);
+	}
+
+	/// Set all
+	void setAll(float fovX, float fovY, float zNear,
+		float zFar, const Transform& trf);
+
+private:
+	boost::array<Plane, 6> planes;
+	Vec3 eye; ///< The eye point
+	boost::array<Vec3, 4> dirs; ///< Directions
+};
+/// @}
+
+
+} // end namespace

+ 105 - 105
anki/scene/ModelNode.h

@@ -19,117 +19,117 @@ namespace anki {
 /// A fragment of the ModelNode
 class ModelPatchNode: public Renderable, public SceneNode
 {
-	public:
-		ModelPatchNode(const ModelPatch* modelPatch_, SceneNode* parent)
-			: SceneNode(SNT_RENDERABLE_NODE, parent->getScene(),
-				SNF_INHERIT_PARENT_TRANSFORM, parent), modelPatch(modelPatch_)
-		{
-			mtlr.reset(new MaterialRuntime(modelPatch->getMaterial()));
-		}
-
-		/// Implements SceneNode::getVisibilityCollisionShapeWorldSpace
-		const CollisionShape*
-			getVisibilityCollisionShapeWorldSpace() const
-		{
-			return &visibilityShapeWSpace;
-		}
-
-		void init(const char*)
-		{}
-
-		/// Re-implements SceneNode::moveUpdate
-		void moveUpdate()
-		{
-			visibilityShapeWSpace =
-				modelPatch->getMesh().getVisibilityShape().getTransformed(
-				getParent()->getWorldTransform());
-		}
-
-		/// Implements Renderable::getVao
-		const Vao& getVao(const PassLevelKey& k)
-		{
-			return modelPatch->getVao(k);
-		}
-
-		/// Implements Renderable::getVertexIdsNum
-		uint getVertexIdsNum(const PassLevelKey& k)
-		{
-			return modelPatch->getMesh().getVertsNum();
-		}
-
-		/// Implements Renderable::getMaterialRuntime
-		MaterialRuntime& getMaterialRuntime()
-		{
-			return *mtlr;
-		}
-
-		/// Implements Renderable::getWorldTransform
-		const Transform& getWorldTransform(const PassLevelKey&)
-		{
-			return SceneNode::getWorldTransform();
-		}
-
-		/// Implements Renderable::getPreviousWorldTransform
-		const Transform& getPreviousWorldTransform(
-			const PassLevelKey& k)
-		{
-			return SceneNode::getPrevWorldTransform();
-		}
-
-	private:
-		Obb visibilityShapeWSpace;
-		const ModelPatch* modelPatch;
-		boost::scoped_ptr<MaterialRuntime> mtlr; ///< Material runtime
+public:
+	ModelPatchNode(const ModelPatch* modelPatch_, SceneNode* parent)
+		: SceneNode(SNT_RENDERABLE_NODE, parent->getScene(),
+			SNF_INHERIT_PARENT_TRANSFORM, parent), modelPatch(modelPatch_)
+	{
+		mtlr.reset(new MaterialRuntime(modelPatch->getMaterial()));
+	}
+
+	/// Implements SceneNode::getVisibilityCollisionShapeWorldSpace
+	const CollisionShape*
+		getVisibilityCollisionShapeWorldSpace() const
+	{
+		return &visibilityShapeWSpace;
+	}
+
+	void init(const char*)
+	{}
+
+	/// Re-implements SceneNode::moveUpdate
+	void moveUpdate()
+	{
+		visibilityShapeWSpace =
+			modelPatch->getMesh().getVisibilityShape().getTransformed(
+			getParent()->getWorldTransform());
+	}
+
+	/// Implements Renderable::getVao
+	const Vao& getVao(const PassLevelKey& k)
+	{
+		return modelPatch->getVao(k);
+	}
+
+	/// Implements Renderable::getVertexIdsNum
+	uint getVertexIdsNum(const PassLevelKey& k)
+	{
+		return modelPatch->getMesh().getVertsNum();
+	}
+
+	/// Implements Renderable::getMaterialRuntime
+	MaterialRuntime& getMaterialRuntime()
+	{
+		return *mtlr;
+	}
+
+	/// Implements Renderable::getWorldTransform
+	const Transform& getWorldTransform(const PassLevelKey&)
+	{
+		return SceneNode::getWorldTransform();
+	}
+
+	/// Implements Renderable::getPreviousWorldTransform
+	const Transform& getPreviousWorldTransform(
+		const PassLevelKey& k)
+	{
+		return SceneNode::getPrevWorldTransform();
+	}
+
+private:
+	Obb visibilityShapeWSpace;
+	const ModelPatch* modelPatch;
+	boost::scoped_ptr<MaterialRuntime> mtlr; ///< Material runtime
 };
 
 
 /// The model scene node
 class ModelNode: public SceneNode
 {
-	public:
-		typedef boost::iterator_range<std::vector<ModelPatchNode*>::
-			const_iterator> ConstRangeModelPatchNodes;
-
-		typedef boost::iterator_range<std::vector<ModelPatchNode*>::
-			iterator> MutableRangeModelPatchNodes;
-
-		ModelNode(Scene& scene, ulong flags, SceneNode* parent);
-		virtual ~ModelNode();
-
-		/// @name Accessors
-		/// @{
-		ConstRangeModelPatchNodes getModelPatchNodes() const
-		{
-			return ConstRangeModelPatchNodes(patches.begin(), patches.end());
-		}
-		MutableRangeModelPatchNodes getModelPatchNodes()
-		{
-			return MutableRangeModelPatchNodes(patches.begin(), patches.end());
-		}
-
-		const Model& getModel() const
-		{
-			return *model;
-		}
-
-		const CollisionShape*
-			getVisibilityCollisionShapeWorldSpace() const
-		{
-			return &visibilityShapeWSpace;
-		}
-		/// @}
-
-		/// Initialize the node
-		/// - Load the resource
-		void init(const char* filename);
-
-		/// Update the bounding shape
-		void moveUpdate();
-
-	private:
-		ModelResourcePointer model;
-		std::vector<ModelPatchNode*> patches;
-		Obb visibilityShapeWSpace;
+public:
+	typedef boost::iterator_range<std::vector<ModelPatchNode*>::
+		const_iterator> ConstRangeModelPatchNodes;
+
+	typedef boost::iterator_range<std::vector<ModelPatchNode*>::
+		iterator> MutableRangeModelPatchNodes;
+
+	ModelNode(Scene& scene, ulong flags, SceneNode* parent);
+	virtual ~ModelNode();
+
+	/// @name Accessors
+	/// @{
+	ConstRangeModelPatchNodes getModelPatchNodes() const
+	{
+		return ConstRangeModelPatchNodes(patches.begin(), patches.end());
+	}
+	MutableRangeModelPatchNodes getModelPatchNodes()
+	{
+		return MutableRangeModelPatchNodes(patches.begin(), patches.end());
+	}
+
+	const Model& getModel() const
+	{
+		return *model;
+	}
+
+	const CollisionShape*
+		getVisibilityCollisionShapeWorldSpace() const
+	{
+		return &visibilityShapeWSpace;
+	}
+	/// @}
+
+	/// Initialize the node
+	/// - Load the resource
+	void init(const char* filename);
+
+	/// Update the bounding shape
+	void moveUpdate();
+
+private:
+	ModelResourcePointer model;
+	std::vector<ModelPatchNode*> patches;
+	Obb visibilityShapeWSpace;
 };
 
 

+ 89 - 90
anki/scene/Octree.h

@@ -13,104 +13,103 @@ namespace anki {
 /// XXX
 class OctreeNode
 {
-	public:
-		OctreeNode(const Aabb& aabb_, OctreeNode* parent_)
-		:	parent(parent_),
-		 	aabb(aabb_)
+public:
+	OctreeNode(const Aabb& aabb_, OctreeNode* parent_)
+		: parent(parent_), aabb(aabb_)
+	{
+		initArr();
+	}
+
+	/// @name Accessors
+	/// @{
+	const boost::array<OctreeNode*, 8>& getChildren() const
+	{
+		return children;
+	}
+
+	const OctreeNode* getParent() const
+	{
+		return parent;
+	}
+
+	const Aabb& getAabb() const
+	{
+		return aabb;
+	}
+	/// @}
+
+	bool isRoot() const
+	{
+		return parent == NULL;
+	}
+
+	void addChild(uint pos, OctreeNode& child)
+	{
+		child.parent = this;
+		children[pos] = &child;
+	}
+
+private:
+	boost::array<OctreeNode*, 8> children;
+	OctreeNode* parent;
+	Aabb aabb; ///< Including AABB
+
+	void initArr()
+	{
+		for(size_t i = 0; i < children.size(); ++i)
 		{
-			initArr();
-		}
-
-		/// @name Accessors
-		/// @{
-		const boost::array<OctreeNode*, 8>& getChildren() const
-		{
-			return children;
-		}
-
-		const OctreeNode* getParent() const
-		{
-			return parent;
-		}
-
-		const Aabb& getAabb() const
-		{
-			return aabb;
-		}
-		/// @}
-
-		bool isRoot() const
-		{
-			return parent == NULL;
-		}
-
-		void addChild(uint pos, OctreeNode& child)
-		{
-			child.parent = this;
-			children[pos] = &child;
-		}
-
-	private:
-		boost::array<OctreeNode*, 8> children;
-		OctreeNode* parent;
-		Aabb aabb; ///< Including AABB
-
-		void initArr()
-		{
-			for(size_t i = 0; i < children.size(); ++i)
-			{
-				children[i] = NULL;
-			}
+			children[i] = NULL;
 		}
+	}
 };
 
 
 /// XXX
 class Octree
 {
-	public:
-		Octree(const Aabb& aabb, uchar maxDepth, float looseness = 1.5);
-
-		/// @name Accessors
-		/// @{
-		const OctreeNode& getRoot() const
-		{
-			return *root;
-		}
-		OctreeNode& getRoot()
-		{
-			return *root;
-		}
-
-		uint getMaxDepth() const
-		{
-			return maxDepth;
-		}
-		/// @}
-
-		OctreeNode* place(const Aabb& aabb);
-
-	private:
-		OctreeNode* root;
-		boost::ptr_vector<OctreeNode> nodes; ///< For garbage collection
-		uint maxDepth;
-		float looseness;
-
-		//void createSubTree(uint rdepth, OctreeNode& parent);
-
-		OctreeNode* place(const Aabb& aabb, uint depth, OctreeNode& node);
-
-		void createChildren(OctreeNode& parent);
-
-		/// Calculate the AABB of a child given the parent's AABB and its
-		/// position
-		/// @param[in] i 0: left, 1: right
-		/// @param[in] j 0: down, 1: up
-		/// @param[in] k 0: back, 1: front
-		/// @param[in] parentAabb The parent's AABB
-		/// @param[out] out The out AABB
-		void calcAabb(uint i, uint j, uint k, const Aabb& parentAabb,
-			Aabb& out) const;
+public:
+	Octree(const Aabb& aabb, uchar maxDepth, float looseness = 1.5);
+
+	/// @name Accessors
+	/// @{
+	const OctreeNode& getRoot() const
+	{
+		return *root;
+	}
+	OctreeNode& getRoot()
+	{
+		return *root;
+	}
+
+	uint getMaxDepth() const
+	{
+		return maxDepth;
+	}
+	/// @}
+
+	OctreeNode* place(const Aabb& aabb);
+
+private:
+	OctreeNode* root;
+	boost::ptr_vector<OctreeNode> nodes; ///< For garbage collection
+	uint maxDepth;
+	float looseness;
+
+	//void createSubTree(uint rdepth, OctreeNode& parent);
+
+	OctreeNode* place(const Aabb& aabb, uint depth, OctreeNode& node);
+
+	void createChildren(OctreeNode& parent);
+
+	/// Calculate the AABB of a child given the parent's AABB and its
+	/// position
+	/// @param[in] i 0: left, 1: right
+	/// @param[in] j 0: down, 1: up
+	/// @param[in] k 0: back, 1: front
+	/// @param[in] parentAabb The parent's AABB
+	/// @param[out] out The out AABB
+	void calcAabb(uint i, uint j, uint k, const Aabb& parentAabb,
+		Aabb& out) const;
 };
 
 

+ 75 - 176
anki/scene/Scene.h

@@ -1,195 +1,94 @@
 #ifndef ANKI_SCENE_SCENE_H
 #define ANKI_SCENE_SCENE_H
 
-#include "anki/physics/PhysWorld.h"
-#include "anki/util/Assert.h"
-#include "anki/scene/VisibilityTester.h"
-#include <boost/scoped_ptr.hpp>
+#include "anki/scene/SceneNode.h"
 #include <boost/range/iterator_range.hpp>
 
 
 namespace anki {
 
 
-class SceneNode;
-class Light;
-class Camera;
-class Controller;
-class ParticleEmitterNode;
-class ModelNode;
-class SkinNode;
-
-
 /// The Scene contains all the dynamic entities
 class Scene
 {
-	public:
-		/// Typetraits
-		template<typename T>
-		struct Types
-		{
-			typedef std::vector<T*> Container;
-			typedef typename Container::iterator Iterator;
-			typedef typename Container::const_iterator ConstIterator;
-			typedef boost::iterator_range<Iterator> MutableRange;
-			typedef boost::iterator_range<ConstIterator> ConstRange;
-		};
-
-		enum
-		{
-			MAX_VISIBLE_NODES = 1024
-		};
-
-		Scene();
-		~Scene();
-
-		/// Put a node in the appropriate containers
-		void registerNode(SceneNode* node);
-		void unregisterNode(SceneNode* node);
-		void registerController(Controller* controller);
-		void unregisterController(Controller* controller);
-
-		void updateAllWorldStuff(float prevUpdateTime, float crntTime);
-		void updateAllControllers();
-
-		void doVisibilityTests(Camera& cam)
-		{
-			visibilityTester->test(cam);
-		}
-
-		/// @name Accessors
-		/// @{
-		const Vec3& getAmbientColor() const
-		{
-			return ambientCol;
-		}
-		Vec3& getAmbientColor()
-		{
-			return ambientCol;
-		}
-		void setAmbientColor(const Vec3& x)
-		{
-			ambientCol = x;
-		}
-
-		PhysWorld& getPhysWorld()
-		{
-			return *physPhysWorld;
-		}
-		const PhysWorld& getPhysWorld() const
-		{
-			return *physPhysWorld;
-		}
-
-		const VisibilityTester& getVisibilityTester() const
-		{
-			return *visibilityTester;
-		}
-
-		Types<SceneNode>::ConstRange getAllNodes() const
-		{
-			return Types<SceneNode>::ConstRange(nodes.begin(), nodes.end());
-		}
-		Types<SceneNode>::MutableRange getAllNodes()
-		{
-			return Types<SceneNode>::MutableRange(nodes.begin(), nodes.end());
-		}
-
-		Types<Light>::ConstRange getLights() const
-		{
-			return Types<Light>::ConstRange(lights.begin(), lights.end());
-		}
-		Types<Light>::MutableRange getLights()
-		{
-			return Types<Light>::MutableRange(lights.begin(), lights.end());
-		}
-
-		Types<Camera>::ConstRange getCameras() const
-		{
-			return Types<Camera>::ConstRange(cams.begin(), cams.end());
-		}
-		Types<Camera>::MutableRange getCameras()
-		{
-			return Types<Camera>::MutableRange(cams.begin(), cams.end());
-		}
-
-		Types<ParticleEmitterNode>::ConstRange getParticleEmitterNodes() const
-		{
-			return Types<ParticleEmitterNode>::ConstRange(
-				particleEmitterNodes.begin(),
-				particleEmitterNodes.end());
-		}
-		Types<ParticleEmitterNode>::MutableRange getParticleEmitterNodes()
-		{
-			return Types<ParticleEmitterNode>::MutableRange(
-				particleEmitterNodes.begin(),
-				particleEmitterNodes.end());
-		}
-
-
-		Types<ModelNode>::ConstRange getModelNodes() const
-		{
-			return Types<ModelNode>::ConstRange(modelNodes.begin(),
-				modelNodes.end());
-		}
-		Types<ModelNode>::MutableRange getModelNodes()
-		{
-			return Types<ModelNode>::MutableRange(modelNodes.begin(),
-				modelNodes.end());
-		}
-
-		Types<SkinNode>::ConstRange getSkinNodes() const
-		{
-			return Types<SkinNode>::ConstRange(skinNodes.begin(),
-				skinNodes.end());
-		}
-		Types<SkinNode>::MutableRange getSkinNodes()
-		{
-			return Types<SkinNode>::MutableRange(skinNodes.begin(),
-				skinNodes.end());
-		}
-
-		const Types<Controller>::Container& getControllers() const
-		{
-			return controllers;
-		}
-		Types<Controller>::Container& getControllers()
-		{
-			return controllers;
-		}
-		/// @}
-
-	private:
-		/// @name Containers of scene's data
-		/// @{
-		Types<SceneNode>::Container nodes;
-		Types<Light>::Container lights;
-		Types<Camera>::Container cams;
-		Types<ParticleEmitterNode>::Container particleEmitterNodes;
-		Types<ModelNode>::Container modelNodes;
-		Types<SkinNode>::Container skinNodes;
-		Types<Controller>::Container controllers;
-		/// @}
-
-		Vec3 ambientCol; ///< The global ambient color
-		/// Connection with Bullet wrapper
-		boost::scoped_ptr<PhysWorld> physPhysWorld;
-		boost::scoped_ptr<VisibilityTester> visibilityTester;
-
-		/// Adds a node in a container
-		template<typename ContainerType, typename Type>
-		void putBackNode(ContainerType& container, Type* x);
-
-		/// Removes a node from a container
-		template<typename ContainerType, typename Type>
-		void eraseNode(ContainerType& container, Type* x);
+public:
+	template<typename T>
+	struct Types
+	{
+		typedef std::vector<T*> Container;
+		typedef typename Container::iterator Iterator;
+		typedef typename Container::const_iterator ConstIterator;
+		typedef boost::iterator_range<Iterator> MutableRange;
+		typedef boost::iterator_range<ConstIterator> ConstRange;
+	};
+
+	Scene();
+	~Scene();
+
+	/// Put a node in the appropriate containers
+	void registerNode(SceneNode* node);
+	void unregisterNode(SceneNode* node);
+
+	void update(float prevUpdateTime, float crntTime);
+
+	void doVisibilityTests(Camera& cam)
+	{
+		//XXX visibilityTester->test(cam);
+	}
+
+	/// @name Accessors
+	/// @{
+	const Vec3& getAmbientColor() const
+	{
+		return ambientCol;
+	}
+	Vec3& getAmbientColor()
+	{
+		return ambientCol;
+	}
+	void setAmbientColor(const Vec3& x)
+	{
+		ambientCol = x;
+	}
+
+	/*PhysWorld& getPhysWorld()
+	{
+		return *physPhysWorld;
+	}
+	const PhysWorld& getPhysWorld() const
+	{
+		return *physPhysWorld;
+	}
+
+	const VisibilityTester& getVisibilityTester() const
+	{
+		return *visibilityTester;
+	}*/
+
+	Types<SceneNode>::ConstRange getAllNodes() const
+	{
+		return Types<SceneNode>::ConstRange(nodes.begin(), nodes.end());
+	}
+	Types<SceneNode>::MutableRange getAllNodes()
+	{
+		return Types<SceneNode>::MutableRange(nodes.begin(), nodes.end());
+	}
+	/// @}
+
+private:
+	/// @name Containers of scene's data
+	/// @{
+	Types<SceneNode>::Container nodes;
+	/// @}
+
+	Vec3 ambientCol; ///< The global ambient color
+	/// Connection with Bullet wrapper
+	/*boost::scoped_ptr<PhysWorld> physPhysWorld;
+	boost::scoped_ptr<VisibilityTester> visibilityTester;*/
 };
 
 
 } // end namespace
 
 
-#include "anki/scene/Scene.inl.h"
-
-
 #endif

+ 18 - 1
anki/scene/SceneNode.cpp

@@ -1,9 +1,26 @@
 #include "anki/scene/SceneNode.h"
+#include "anki/scene/Scene.h"
 
 
 namespace anki {
 
 
+//==============================================================================
+SceneNode::SceneNode(const char* name_, long flags_,
+	SceneNode* parent, Scene* scene_)
+	: Base(this, parent), name(name_), flags(flags_), scene(scene_)
+{
+	scene->registerNode(this);
+}
+
+
+//==============================================================================
+SceneNode::~SceneNode()
+{
+	scene->unregisterNode(this);
+}
+
+
 //==============================================================================
 void SceneNode::updateWorldTransform()
 {
@@ -11,7 +28,7 @@ void SceneNode::updateWorldTransform()
 
 	if(getParent())
 	{
-		if(isFlagEnabled(SNF_INHERIT_PARENT_TRANSFORM))
+		if(isFlagEnabled(SNF_IGNORE_LOCAL_TRANSFORM))
 		{
 			wTrf = getParent()->getWorldTransform();
 		}

+ 33 - 7
anki/scene/SceneNode.h

@@ -10,6 +10,11 @@
 namespace anki {
 
 
+class Scene;
+class Renderable;
+class Frustum;
+
+
 /// @addtogroup scene
 /// @{
 
@@ -22,16 +27,20 @@ public:
 	enum SceneNodeFlags
 	{
 		SNF_NONE = 0,
-		SNF_INHERIT_PARENT_TRANSFORM = 1 ///< Ignore local transform
+		SNF_IGNORE_LOCAL_TRANSFORM = 1, ///< Get the parent's world transform
+		SNF_MOVED = 2 ///< Moved in the previous frame. The scene update sets it
 	};
 
 	/// The one and only constructor
 	/// @param flags The flags with the node properties
-	/// @param parent The nods's parent. Its nulptr only for the root node
-	explicit SceneNode(ulong flags, SceneNode* parent)
-		: Base(parent), flags(flags_)
-	{}
-
+	/// @param parent The nods's parent. It can be nullptr
+	explicit SceneNode(
+		const char* name,
+		long flags,
+		SceneNode* parent,
+		Scene* scene);
+
+	/// Unregister node
 	virtual ~SceneNode();
 
 	/// @name Accessors
@@ -103,13 +112,26 @@ public:
 
 	/// This is called every frame
 	virtual void frameUpdate(float prevUpdateTime, float crntTime)
-	{}
+	{
+		(void)prevUpdateTime;
+		(void)crntTime;
+	}
 
 	/// This is called if the node moved
 	virtual void moveUpdate()
 	{}
 	/// @}
 
+	virtual Renderable* getRenderable()
+	{
+		return NULL;
+	}
+
+	virtual Frustum* getFrustum()
+	{
+		return NULL;
+	}
+
 	/// @name Mess with the local transform
 	/// @{
 	void rotateLocalX(float angDegrees)
@@ -146,6 +168,8 @@ public:
 	void updateWorldTransform();
 
 private:
+	std::string name; ///< A unique name
+
 	Transform lTrf; ///< The transformation in local space
 
 	/// The transformation in world space (local combined with parent's
@@ -156,6 +180,8 @@ private:
 	Transform prevWTrf;
 
 	ulong flags; ///< The state flags
+
+	Scene* scene; ///< For registering and unregistering
 };
 /// @}
 

+ 14 - 12
anki/util/Object.h

@@ -16,7 +16,7 @@ class Object
 {
 public:
 	typedef T Value;
-	typedef std::vector<Object*> Container;
+	typedef std::vector<Value*> Container;
 	typedef boost::iterator_range<typename Container::const_iterator>
 		ConstIteratorRange;
 	typedef boost::iterator_range<typename Container::iterator>
@@ -24,12 +24,13 @@ public:
 
 	/// Calls addChild if parent is not NULL
 	/// @exception Exception
-	Object(Object* parent_)
-		: parent(NULL)
+	Object(Value* self_, Value* parent_)
+		: self(self_), parent(NULL)
 	{
+		ANKI_ASSERT(self != NULL && "Self can't be nullptr");
 		if(parent_ != NULL)
 		{
-			parent_->addChild(this);
+			parent_->addChild(self);
 		}
 	}
 
@@ -38,11 +39,11 @@ public:
 	{
 		if(parent != NULL)
 		{
-			parent->removeChild(this);
+			parent->removeChild(self);
 		}
 
 		// Remove all children
-		BOOST_FOREACH(Object* child, childs)
+		BOOST_FOREACH(Value* child, childs)
 		{
 			child->parent = NULL;
 		}
@@ -50,11 +51,11 @@ public:
 
 	/// @name Accessors
 	/// @{
-	const Object* getParent() const
+	const Value* getParent() const
 	{
 		return parent;
 	}
-	Object* getParent()
+	Value* getParent()
 	{
 		return parent;
 	}
@@ -75,17 +76,17 @@ public:
 	/// @}
 
 	/// Add a new child
-	void addChild(Object* child)
+	void addChild(Value* child)
 	{
 		ANKI_ASSERT(child != NULL && "Null arg");
 		ANKI_ASSERT(child->parent ==  NULL && "Child already has parent");
 
-		child->parent = this;
+		child->parent = self;
 		childs.push_back(child);
 	}
 
 	/// Remove a child
-	void removeChild(Object* child)
+	void removeChild(Value* child)
 	{
 		ANKI_ASSERT(child != NULL && "Null arg");
 
@@ -99,7 +100,8 @@ public:
 	}
 
 private:
-	Object* parent; ///< May be nullptr
+	Value* self;
+	Value* parent; ///< May be nullptr
 	Container childs;
 };
 

+ 419 - 265
docs/drafts/scene2.xmi

@@ -1,378 +1,510 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<XMI verified="false" xmi.version="1.2" timestamp="2011-12-23T18:54:18" xmlns:UML="http://schema.omg.org/spec/UML/1.3" >
+<XMI verified="false" xmi.version="1.2" timestamp="2011-12-29T04:41:49" xmlns:UML="http://schema.omg.org/spec/UML/1.3">
  <XMI.header>
   <XMI.documentation>
    <XMI.exporter>umbrello uml modeller http://uml.sf.net</XMI.exporter>
    <XMI.exporterVersion>1.5.8</XMI.exporterVersion>
    <XMI.exporterEncoding>UnicodeUTF8</XMI.exporterEncoding>
   </XMI.documentation>
-  <XMI.metamodel xmi.version="1.3" href="UML.xml" xmi.name="UML" />
+  <XMI.metamodel xmi.version="1.3" href="UML.xml" xmi.name="UML"/>
  </XMI.header>
  <XMI.content>
-  <UML:Model isSpecification="false" isAbstract="false" isLeaf="false" xmi.id="m1" isRoot="false" name="UML Model" >
+  <UML:Model isSpecification="false" isAbstract="false" isLeaf="false" xmi.id="m1" isRoot="false" name="UML Model">
    <UML:Namespace.ownedElement>
-    <UML:Stereotype visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="folder" name="folder" />
-    <UML:Stereotype visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="datatype" name="datatype" />
-    <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Logical View" name="Logical View" >
+    <UML:Stereotype visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="folder" name="folder"/>
+    <UML:Stereotype visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="datatype" name="datatype"/>
+    <UML:Stereotype visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="enum" name="enum"/>
+    <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Logical View" name="Logical View">
      <UML:Namespace.ownedElement>
-      <UML:Package stereotype="folder" visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Datatypes" name="Datatypes" >
+      <UML:Package stereotype="folder" visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Datatypes" name="Datatypes">
        <UML:Namespace.ownedElement>
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="zbqJPYCQnefR" name="int" />
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="2BMVEe9cFOaP" name="char" />
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="zMzwwkKvM9Ej" name="bool" />
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="hQAU3pu3zGWB" name="float" />
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="sfn72LUzhTvd" name="double" />
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="EDWYKiF17PUA" name="short" />
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="DMBCciLUL7ZL" name="long" />
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="S3K8VFjhRGFl" name="unsigned int" />
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="wUl3sFB5bNFB" name="unsigned short" />
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="3adOfCk8D4Gi" name="unsigned long" />
-        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="IzNjDaSA3DDv" name="string" />
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="zbqJPYCQnefR" name="int"/>
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="2BMVEe9cFOaP" name="char"/>
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="zMzwwkKvM9Ej" name="bool"/>
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="hQAU3pu3zGWB" name="float"/>
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="sfn72LUzhTvd" name="double"/>
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="EDWYKiF17PUA" name="short"/>
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="DMBCciLUL7ZL" name="long"/>
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="S3K8VFjhRGFl" name="unsigned int"/>
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="wUl3sFB5bNFB" name="unsigned short"/>
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="3adOfCk8D4Gi" name="unsigned long"/>
+        <UML:DataType stereotype="datatype" visibility="public" isSpecification="false" namespace="Datatypes" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="IzNjDaSA3DDv" name="string"/>
        </UML:Namespace.ownedElement>
       </UML:Package>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="SNy1kBAljn9P" name="SceneObject" />
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="rXBulrAiDtwn" name="SceneStatic" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="SNy1kBAljn9P" name="SceneObject"/>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="rXBulrAiDtwn" name="SceneStatic">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="DSP5dDFXtQKz" />
+        <UML:Generalization xmi.idref="DSP5dDFXtQKz"/>
        </UML:GeneralizableElement.generalization>
       </UML:Class>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="J6qXHlxchzMq" name="SceneNode" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="J6qXHlxchzMq" name="SceneNode">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="nzX15IngEBiV" />
+        <UML:Generalization xmi.idref="nzX15IngEBiV"/>
        </UML:GeneralizableElement.generalization>
        <UML:Classifier.feature>
-        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="DqiQZJDHpKfG" name="frameUpdate" />
-        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="mxnhfcJHH4qm" name="moveUpdate" />
-        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="zfiPC1aTps65" name="visibleUpdate" >
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="DqiQZJDHpKfG" name="frameUpdate"/>
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="mxnhfcJHH4qm" name="moveUpdate"/>
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="zfiPC1aTps65" name="visibleUpdate">
          <UML:BehavioralFeature.parameter>
-          <UML:Parameter visibility="private" isSpecification="false" xmi.id="BL9hjGjVIhhU" type="Z2oCygxy3epf" value="" name="frustum" />
+          <UML:Parameter visibility="private" isSpecification="false" xmi.id="BL9hjGjVIhhU" type="Z2oCygxy3epf" value="" name="frustum"/>
          </UML:BehavioralFeature.parameter>
         </UML:Operation>
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="SPg4o80rLkIE" name="getWorldTransform"/>
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="SoOg2Qz97mJe" name="getLocalTransform"/>
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="DDoIy5xBZff3" name="getPreviousWorldTransform"/>
        </UML:Classifier.feature>
       </UML:Class>
-      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="rHvioBRln7i8" name="" >
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="rHvioBRln7i8" name="">
        <UML:Association.connection>
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="false" isSpecification="false" xmi.id="xqDXlQUbVwdP" type="rXBulrAiDtwn" name="" aggregation="none" />
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="9SW5WTwNiq3U" type="SNy1kBAljn9P" name="" aggregation="none" />
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="false" isSpecification="false" xmi.id="xqDXlQUbVwdP" type="rXBulrAiDtwn" name="" aggregation="none"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="9SW5WTwNiq3U" type="SNy1kBAljn9P" name="" aggregation="none"/>
        </UML:Association.connection>
       </UML:Association>
-      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="mawuVk81TWV5" name="" >
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="mawuVk81TWV5" name="">
        <UML:Association.connection>
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="false" isSpecification="false" xmi.id="zSgPb8veeMbz" type="J6qXHlxchzMq" name="" aggregation="none" />
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="3P1XQSlA0g5V" type="SNy1kBAljn9P" name="" aggregation="none" />
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="false" isSpecification="false" xmi.id="zSgPb8veeMbz" type="J6qXHlxchzMq" name="" aggregation="none"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="3P1XQSlA0g5V" type="SNy1kBAljn9P" name="" aggregation="none"/>
        </UML:Association.connection>
       </UML:Association>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="JFHkOnc4nZlD" name="Camera" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="JFHkOnc4nZlD" name="Camera">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="1A3JNPhCUH5V" />
-        <UML:Generalization xmi.idref="5l6JyUr4ko1P" />
-        <UML:Generalization xmi.idref="nAuXyvwBw1mu" />
-        <UML:Generalization xmi.idref="xc3hGeG1xK9X" />
-        <UML:Generalization xmi.idref="6deEBqMPAeYr" />
+        <UML:Generalization xmi.idref="1A3JNPhCUH5V"/>
+        <UML:Generalization xmi.idref="5l6JyUr4ko1P"/>
+        <UML:Generalization xmi.idref="nAuXyvwBw1mu"/>
+        <UML:Generalization xmi.idref="xc3hGeG1xK9X"/>
+        <UML:Generalization xmi.idref="6deEBqMPAeYr"/>
+        <UML:Generalization xmi.idref="m9JNBShousbN"/>
        </UML:GeneralizableElement.generalization>
       </UML:Class>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="rG36YOguGgft" name="ModelNode" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="rG36YOguGgft" name="ModelNode">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="heUjIsJhJEXK" />
-        <UML:Generalization xmi.idref="EzYAJgfcpn2S" />
+        <UML:Generalization xmi.idref="heUjIsJhJEXK"/>
+        <UML:Generalization xmi.idref="EzYAJgfcpn2S"/>
+        <UML:Generalization xmi.idref="rUSa6y9PAq27"/>
        </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Attribute visibility="private" isSpecification="false" xmi.id="OlMOTXMLf3gj" type="PYT9spdRoBNv" name="modelPatchNodes"/>
+       </UML:Classifier.feature>
       </UML:Class>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="qRB4itQTVUH2" name="SkinNode" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="qRB4itQTVUH2" name="SkinNode">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="NfYgt5yDEDPZ" />
-        <UML:Generalization xmi.idref="ggqVRqwliqtq" />
+        <UML:Generalization xmi.idref="NfYgt5yDEDPZ"/>
+        <UML:Generalization xmi.idref="ggqVRqwliqtq"/>
+        <UML:Generalization xmi.idref="Dx5Ml5RPNuwQ"/>
        </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Attribute visibility="private" isSpecification="false" xmi.id="gj4DDh52nXDC" type="112Y3vw1DbQl" name="skinPatchNodes"/>
+       </UML:Classifier.feature>
       </UML:Class>
-      <UML:Dependency visibility="public" isSpecification="false" namespace="Logical View" supplier="SNy1kBAljn9P" xmi.id="hf7gdfiFWe3s" client="J6qXHlxchzMq" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="J6qXHlxchzMq" xmi.id="nzX15IngEBiV" parent="SNy1kBAljn9P" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="rXBulrAiDtwn" xmi.id="DSP5dDFXtQKz" parent="SNy1kBAljn9P" name="" />
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="0NjsdvgyuCHT" name="Light" >
+      <UML:Dependency visibility="public" isSpecification="false" namespace="Logical View" supplier="SNy1kBAljn9P" xmi.id="hf7gdfiFWe3s" client="J6qXHlxchzMq" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="J6qXHlxchzMq" xmi.id="nzX15IngEBiV" parent="SNy1kBAljn9P" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="rXBulrAiDtwn" xmi.id="DSP5dDFXtQKz" parent="SNy1kBAljn9P" name=""/>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="0NjsdvgyuCHT" name="Light">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="hpa94ecw4dQa" />
-        <UML:Generalization xmi.idref="A8w47iyQRoG5" />
-        <UML:Generalization xmi.idref="rbxnyzWmmgbb" />
-        <UML:Generalization xmi.idref="mDLBX4kpG6g7" />
+        <UML:Generalization xmi.idref="hpa94ecw4dQa"/>
+        <UML:Generalization xmi.idref="A8w47iyQRoG5"/>
+        <UML:Generalization xmi.idref="rbxnyzWmmgbb"/>
+        <UML:Generalization xmi.idref="mDLBX4kpG6g7"/>
+        <UML:Generalization xmi.idref="k63Y7SyC5fnB"/>
        </UML:GeneralizableElement.generalization>
       </UML:Class>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="tRKo3clH6yzT" name="Renderable" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="tRKo3clH6yzT" name="Renderable">
        <UML:Classifier.feature>
-        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="i1a0wMeuxyfs" name="getMaterial" />
-        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="hup81s2ak3bD" name="getVao" >
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="i1a0wMeuxyfs" name="getMaterial"/>
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="hup81s2ak3bD" name="getVao">
          <UML:BehavioralFeature.parameter>
-          <UML:Parameter visibility="private" isSpecification="false" xmi.id="u1jbuvlWp4f8" type="vgq4ym8aTrBV" value="" name="key" />
+          <UML:Parameter visibility="private" isSpecification="false" xmi.id="u1jbuvlWp4f8" type="vgq4ym8aTrBV" value="" name="key"/>
          </UML:BehavioralFeature.parameter>
         </UML:Operation>
-        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="anjW7OQ4M3wy" name="getWorldTransformation" >
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="anjW7OQ4M3wy" name="getWorldTransformation">
          <UML:BehavioralFeature.parameter>
-          <UML:Parameter visibility="private" isSpecification="false" xmi.id="08G3mMT7GKye" type="vgq4ym8aTrBV" value="" name="key" />
+          <UML:Parameter visibility="private" isSpecification="false" xmi.id="08G3mMT7GKye" type="vgq4ym8aTrBV" value="" name="key"/>
          </UML:BehavioralFeature.parameter>
         </UML:Operation>
-        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="T05FNZKbtIDV" name="getVertexIdsSize" >
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="T05FNZKbtIDV" name="getVertexIdsSize">
          <UML:BehavioralFeature.parameter>
-          <UML:Parameter visibility="private" isSpecification="false" xmi.id="tqt3pitW2xqp" type="vgq4ym8aTrBV" value="" name="key" />
+          <UML:Parameter visibility="private" isSpecification="false" xmi.id="tqt3pitW2xqp" type="vgq4ym8aTrBV" value="" name="key"/>
          </UML:BehavioralFeature.parameter>
         </UML:Operation>
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="5k8R7nYDjUlk" name="getProperties"/>
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="vVjn756QCL3I" name="getRenderingStages"/>
        </UML:Classifier.feature>
       </UML:Class>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Z2oCygxy3epf" name="Frustum" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Z2oCygxy3epf" name="Frustum">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="ZVdRgsuZKELN" />
-        <UML:Generalization xmi.idref="3MMBumzpG7XC" />
+        <UML:Generalization xmi.idref="ZVdRgsuZKELN"/>
+        <UML:Generalization xmi.idref="3MMBumzpG7XC"/>
        </UML:GeneralizableElement.generalization>
        <UML:Classifier.feature>
-        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="zZHMzsqTyJyB" name="insideFrustum" />
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="zZHMzsqTyJyB" name="isInside"/>
        </UML:Classifier.feature>
       </UML:Class>
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="Z2oCygxy3epf" xmi.id="ZVdRgsuZKELN" parent="J6qXHlxchzMq" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="1A3JNPhCUH5V" parent="Z2oCygxy3epf" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="0NjsdvgyuCHT" xmi.id="hpa94ecw4dQa" parent="Z2oCygxy3epf" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="rG36YOguGgft" xmi.id="heUjIsJhJEXK" parent="J6qXHlxchzMq" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="qRB4itQTVUH2" xmi.id="NfYgt5yDEDPZ" parent="J6qXHlxchzMq" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="5l6JyUr4ko1P" parent="Z2oCygxy3epf" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="nAuXyvwBw1mu" parent="tRKo3clH6yzT" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="0NjsdvgyuCHT" xmi.id="A8w47iyQRoG5" parent="Z2oCygxy3epf" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="0NjsdvgyuCHT" xmi.id="rbxnyzWmmgbb" parent="J6qXHlxchzMq" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="xc3hGeG1xK9X" parent="J6qXHlxchzMq" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="rG36YOguGgft" xmi.id="EzYAJgfcpn2S" parent="tRKo3clH6yzT" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="qRB4itQTVUH2" xmi.id="ggqVRqwliqtq" parent="tRKo3clH6yzT" name="" />
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="HWqxKhoAyn7H" name="StaticGeometry" >
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="Z2oCygxy3epf" xmi.id="ZVdRgsuZKELN" parent="J6qXHlxchzMq" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="1A3JNPhCUH5V" parent="Z2oCygxy3epf" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="0NjsdvgyuCHT" xmi.id="hpa94ecw4dQa" parent="Z2oCygxy3epf" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="rG36YOguGgft" xmi.id="heUjIsJhJEXK" parent="J6qXHlxchzMq" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="qRB4itQTVUH2" xmi.id="NfYgt5yDEDPZ" parent="J6qXHlxchzMq" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="5l6JyUr4ko1P" parent="Z2oCygxy3epf" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="nAuXyvwBw1mu" parent="tRKo3clH6yzT" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="0NjsdvgyuCHT" xmi.id="A8w47iyQRoG5" parent="Z2oCygxy3epf" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="0NjsdvgyuCHT" xmi.id="rbxnyzWmmgbb" parent="J6qXHlxchzMq" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="xc3hGeG1xK9X" parent="J6qXHlxchzMq" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="rG36YOguGgft" xmi.id="EzYAJgfcpn2S" parent="tRKo3clH6yzT" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="qRB4itQTVUH2" xmi.id="ggqVRqwliqtq" parent="tRKo3clH6yzT" name=""/>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="HWqxKhoAyn7H" name="StaticGeometry">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="JIEpiA19a1U1" />
-        <UML:Generalization xmi.idref="qMoQMJPMNT0s" />
-        <UML:Generalization xmi.idref="TDV00RrlHN2J" />
+        <UML:Generalization xmi.idref="JIEpiA19a1U1"/>
+        <UML:Generalization xmi.idref="qMoQMJPMNT0s"/>
+        <UML:Generalization xmi.idref="TDV00RrlHN2J"/>
        </UML:GeneralizableElement.generalization>
       </UML:Class>
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="HWqxKhoAyn7H" xmi.id="JIEpiA19a1U1" parent="rXBulrAiDtwn" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="HWqxKhoAyn7H" xmi.id="qMoQMJPMNT0s" parent="tRKo3clH6yzT" name="" />
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="pMvCpt3xbeEr" name="PerspectiveCamera" >
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="HWqxKhoAyn7H" xmi.id="JIEpiA19a1U1" parent="rXBulrAiDtwn" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="HWqxKhoAyn7H" xmi.id="qMoQMJPMNT0s" parent="tRKo3clH6yzT" name=""/>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="pMvCpt3xbeEr" name="PerspectiveCamera">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="WilVNneG7Bvd" />
+        <UML:Generalization xmi.idref="WilVNneG7Bvd"/>
        </UML:GeneralizableElement.generalization>
       </UML:Class>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="LwjR0FVi9FGO" name="OrthographicCamera" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="LwjR0FVi9FGO" name="OrthographicCamera">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="4ae9jZkMlSM2" />
+        <UML:Generalization xmi.idref="4ae9jZkMlSM2"/>
        </UML:GeneralizableElement.generalization>
       </UML:Class>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="OTT5nNmCL1f4" name="SpotLight" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="OTT5nNmCL1f4" name="SpotLight">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="YqiJI3JsTTMN" />
+        <UML:Generalization xmi.idref="YqiJI3JsTTMN"/>
        </UML:GeneralizableElement.generalization>
+       <UML:Classifier.feature>
+        <UML:Attribute visibility="private" isSpecification="false" xmi.id="XZmmvWRBCaep" type="pMvCpt3xbeEr" name="camera"/>
+       </UML:Classifier.feature>
       </UML:Class>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="9vKXhXVI6N4T" name="HemiLight" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="9vKXhXVI6N4T" name="HemiLight">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="Cz0aoGT9Dldx" />
+        <UML:Generalization xmi.idref="Cz0aoGT9Dldx"/>
        </UML:GeneralizableElement.generalization>
       </UML:Class>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="tlRLHbjj2mWP" name="PointLight" >
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="tlRLHbjj2mWP" name="PointLight">
        <UML:GeneralizableElement.generalization>
-        <UML:Generalization xmi.idref="gm47GOUMOqIu" />
-        <UML:Generalization xmi.idref="jhYwQBtoKUT2" />
+        <UML:Generalization xmi.idref="gm47GOUMOqIu"/>
+        <UML:Generalization xmi.idref="jhYwQBtoKUT2"/>
        </UML:GeneralizableElement.generalization>
       </UML:Class>
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="pMvCpt3xbeEr" xmi.id="WilVNneG7Bvd" parent="JFHkOnc4nZlD" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="LwjR0FVi9FGO" xmi.id="4ae9jZkMlSM2" parent="JFHkOnc4nZlD" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="OTT5nNmCL1f4" xmi.id="YqiJI3JsTTMN" parent="0NjsdvgyuCHT" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="tlRLHbjj2mWP" xmi.id="gm47GOUMOqIu" parent="0NjsdvgyuCHT" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="9vKXhXVI6N4T" xmi.id="Cz0aoGT9Dldx" parent="0NjsdvgyuCHT" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="tlRLHbjj2mWP" xmi.id="jhYwQBtoKUT2" parent="0NjsdvgyuCHT" name="" />
-      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="cYAw0dwLiHhZ" name="" >
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="pMvCpt3xbeEr" xmi.id="WilVNneG7Bvd" parent="JFHkOnc4nZlD" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="LwjR0FVi9FGO" xmi.id="4ae9jZkMlSM2" parent="JFHkOnc4nZlD" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="OTT5nNmCL1f4" xmi.id="YqiJI3JsTTMN" parent="0NjsdvgyuCHT" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="tlRLHbjj2mWP" xmi.id="gm47GOUMOqIu" parent="0NjsdvgyuCHT" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="9vKXhXVI6N4T" xmi.id="Cz0aoGT9Dldx" parent="0NjsdvgyuCHT" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="tlRLHbjj2mWP" xmi.id="jhYwQBtoKUT2" parent="0NjsdvgyuCHT" name=""/>
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="cYAw0dwLiHhZ" name="">
+       <UML:Association.connection>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="1" xmi.id="WopQ3ulvUlPW" type="Z2oCygxy3epf" name="" aggregation="aggregate"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="*" xmi.id="1JHwkwINSQHS" type="tRKo3clH6yzT" name="" aggregation="none"/>
+       </UML:Association.connection>
+      </UML:Association>
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="Hrso1XHFNAMm" name="">
+       <UML:Association.connection>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="1" xmi.id="0Fz2wn7dWjnO" type="Z2oCygxy3epf" name="" aggregation="aggregate"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="*" xmi.id="JSbYHg1ZWrLX" type="tRKo3clH6yzT" name="" aggregation="none"/>
+       </UML:Association.connection>
+      </UML:Association>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="aCSkjpKcYIQB" name="OctreeNode"/>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="CLERaYxl75Nb" name="Octree"/>
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="6hqsVP4y9lnT" name="">
+       <UML:Association.connection>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="1" xmi.id="LJkkUDAhXO67" type="CLERaYxl75Nb" name="" aggregation="aggregate"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="*" xmi.id="x1s26FbAvP0Q" type="aCSkjpKcYIQB" name="" aggregation="none"/>
+       </UML:Association.connection>
+      </UML:Association>
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="Ul3N4g6Lct9Q" name="">
+       <UML:Association.connection>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="1" xmi.id="5cEfnpZhUSVA" type="Z2oCygxy3epf" name="" aggregation="aggregate"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="*" xmi.id="iHE6z2cTldpq" type="aCSkjpKcYIQB" name="" aggregation="none"/>
+       </UML:Association.connection>
+      </UML:Association>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="Z2oCygxy3epf" xmi.id="3MMBumzpG7XC" parent="tRKo3clH6yzT" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="6deEBqMPAeYr" parent="Z2oCygxy3epf" name=""/>
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="7zcnD3kOQKlZ" name="">
        <UML:Association.connection>
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="1" xmi.id="WopQ3ulvUlPW" type="Z2oCygxy3epf" name="" aggregation="aggregate" />
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="*" xmi.id="1JHwkwINSQHS" type="tRKo3clH6yzT" name="" aggregation="none" />
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="HCMttJJucpaU" type="aCSkjpKcYIQB" name="" aggregation="aggregate"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="EO5Pdo9imlVx" type="tRKo3clH6yzT" name="" aggregation="none"/>
        </UML:Association.connection>
       </UML:Association>
-      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="Hrso1XHFNAMm" name="" >
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="0NjsdvgyuCHT" xmi.id="mDLBX4kpG6g7" parent="Z2oCygxy3epf" name=""/>
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="LxJc3xjPujQg" name="">
        <UML:Association.connection>
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="1" xmi.id="0Fz2wn7dWjnO" type="Z2oCygxy3epf" name="" aggregation="aggregate" />
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="*" xmi.id="JSbYHg1ZWrLX" type="tRKo3clH6yzT" name="" aggregation="none" />
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="MqeLM1vfVDhk" type="Z2oCygxy3epf" name="" aggregation="aggregate"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="yhluyyOJthtu" type="aCSkjpKcYIQB" name="" aggregation="none"/>
        </UML:Association.connection>
       </UML:Association>
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="aCSkjpKcYIQB" name="OctreeNode" />
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="CLERaYxl75Nb" name="Octree" />
-      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="6hqsVP4y9lnT" name="" >
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="cbKWKiAeWmxt" name="">
        <UML:Association.connection>
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="1" xmi.id="LJkkUDAhXO67" type="CLERaYxl75Nb" name="" aggregation="aggregate" />
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="*" xmi.id="x1s26FbAvP0Q" type="aCSkjpKcYIQB" name="" aggregation="none" />
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="false" isSpecification="false" xmi.id="lqWG1D0xsmsq" type="HWqxKhoAyn7H" name="" aggregation="none"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="iG8ZwzTYYl5r" type="J6qXHlxchzMq" name="" aggregation="none"/>
        </UML:Association.connection>
       </UML:Association>
-      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="Ul3N4g6Lct9Q" name="" >
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="HWqxKhoAyn7H" xmi.id="TDV00RrlHN2J" parent="J6qXHlxchzMq" name=""/>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="7qtCN74kkWxC" name="lklk"/>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="vgq4ym8aTrBV" name="PassLodKey"/>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="e1aG9DDOGL7s" name="Scene">
+       <UML:Classifier.feature>
+        <UML:Attribute visibility="private" isSpecification="false" xmi.id="imMDNtOADG1f" type="J6qXHlxchzMq" name="nodes"/>
+        <UML:Operation visibility="public" isSpecification="false" isQuery="false" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="IuNpzsprGl9N" name="getSceneNodes"/>
+       </UML:Classifier.feature>
+      </UML:Class>
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="npTGeUApNi3c" name="">
        <UML:Association.connection>
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="1" xmi.id="5cEfnpZhUSVA" type="Z2oCygxy3epf" name="" aggregation="aggregate" />
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" multiplicity="*" xmi.id="iHE6z2cTldpq" type="aCSkjpKcYIQB" name="" aggregation="none" />
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="d2MI3wWB7hXO" type="e1aG9DDOGL7s" name="" aggregation="aggregate"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="3eEBHp14cUJG" type="CLERaYxl75Nb" name="" aggregation="none"/>
        </UML:Association.connection>
       </UML:Association>
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="Z2oCygxy3epf" xmi.id="3MMBumzpG7XC" parent="tRKo3clH6yzT" name="" />
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="6deEBqMPAeYr" parent="Z2oCygxy3epf" name="" />
-      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="7zcnD3kOQKlZ" name="" >
+      <UML:Enumeration stereotype="enum" visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="uXYCja7WeNcm" name="SceneNodeFlags">
+       <UML:EnumerationLiteral visibility="public" isSpecification="false" namespace="uXYCja7WeNcm" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="GoRJcvD4hYMw" name="SNF_INHERIT_PARENT_TRANFORM"/>
+       <UML:EnumerationLiteral visibility="public" isSpecification="false" namespace="uXYCja7WeNcm" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Kpcl5qztHHTA" name="SNF_MOVED"/>
+      </UML:Enumeration>
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="cCU5jvTzzFUs" name="">
        <UML:Association.connection>
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="HCMttJJucpaU" type="aCSkjpKcYIQB" name="" aggregation="aggregate" />
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="EO5Pdo9imlVx" type="tRKo3clH6yzT" name="" aggregation="none" />
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="CmgnWldTfuk8" type="J6qXHlxchzMq" name="" aggregation="aggregate"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="3BesCVeoi9sR" type="uXYCja7WeNcm" name="" aggregation="none"/>
        </UML:Association.connection>
       </UML:Association>
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="0NjsdvgyuCHT" xmi.id="mDLBX4kpG6g7" parent="Z2oCygxy3epf" name="" />
-      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="LxJc3xjPujQg" name="" >
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="ZpkSnu1SkM7x" name="">
        <UML:Association.connection>
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="MqeLM1vfVDhk" type="Z2oCygxy3epf" name="" aggregation="aggregate" />
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="yhluyyOJthtu" type="aCSkjpKcYIQB" name="" aggregation="none" />
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="AfHeFzap43eH" type="e1aG9DDOGL7s" name="" aggregation="aggregate"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="eZ2I0HnX6Xzs" type="J6qXHlxchzMq" name="" aggregation="none"/>
        </UML:Association.connection>
       </UML:Association>
-      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="cbKWKiAeWmxt" name="" >
+      <UML:Association visibility="public" isSpecification="false" namespace="Logical View" xmi.id="ITF8Q7vFLgPj" name="">
        <UML:Association.connection>
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="false" isSpecification="false" xmi.id="lqWG1D0xsmsq" type="HWqxKhoAyn7H" name="" aggregation="none" />
-        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="iG8ZwzTYYl5r" type="J6qXHlxchzMq" name="" aggregation="none" />
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="lw9IWrxOqHNB" type="e1aG9DDOGL7s" name="" aggregation="aggregate"/>
+        <UML:AssociationEnd changeability="changeable" visibility="public" isNavigable="true" isSpecification="false" xmi.id="H67a6gUP8jVW" type="CLERaYxl75Nb" name="" aggregation="none"/>
        </UML:Association.connection>
       </UML:Association>
-      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="HWqxKhoAyn7H" xmi.id="TDV00RrlHN2J" parent="J6qXHlxchzMq" name="" />
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="7qtCN74kkWxC" name="lklk" />
-      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="vgq4ym8aTrBV" name="PassLodKey" />
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="0NjsdvgyuCHT" xmi.id="k63Y7SyC5fnB" parent="tRKo3clH6yzT" name=""/>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="OVIwhsCoFZ74" name="GeometryNode">
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="0emnFZrhG8yH"/>
+        <UML:Generalization xmi.idref="qh27nyOVj1gj"/>
+       </UML:GeneralizableElement.generalization>
+      </UML:Class>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="OVIwhsCoFZ74" xmi.id="0emnFZrhG8yH" parent="J6qXHlxchzMq" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="OVIwhsCoFZ74" xmi.id="qh27nyOVj1gj" parent="tRKo3clH6yzT" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="rG36YOguGgft" xmi.id="rUSa6y9PAq27" parent="OVIwhsCoFZ74" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="qRB4itQTVUH2" xmi.id="Dx5Ml5RPNuwQ" parent="OVIwhsCoFZ74" name=""/>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="PYT9spdRoBNv" name="ModelPatchNode">
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="CY13PB4kNxQ5"/>
+        <UML:Generalization xmi.idref="EPpaNDfFISa2"/>
+       </UML:GeneralizableElement.generalization>
+      </UML:Class>
+      <UML:Class visibility="public" isSpecification="false" namespace="Logical View" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="112Y3vw1DbQl" name="SkinPatchNode">
+       <UML:GeneralizableElement.generalization>
+        <UML:Generalization xmi.idref="crA1eMMXttC1"/>
+        <UML:Generalization xmi.idref="vmABEkD60kD0"/>
+       </UML:GeneralizableElement.generalization>
+      </UML:Class>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="112Y3vw1DbQl" xmi.id="crA1eMMXttC1" parent="tRKo3clH6yzT" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="PYT9spdRoBNv" xmi.id="CY13PB4kNxQ5" parent="tRKo3clH6yzT" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="PYT9spdRoBNv" xmi.id="EPpaNDfFISa2" parent="J6qXHlxchzMq" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="112Y3vw1DbQl" xmi.id="vmABEkD60kD0" parent="J6qXHlxchzMq" name=""/>
+      <UML:Generalization discriminator="" visibility="public" isSpecification="false" namespace="Logical View" child="JFHkOnc4nZlD" xmi.id="m9JNBShousbN" parent="tRKo3clH6yzT" name=""/>
      </UML:Namespace.ownedElement>
-     <XMI.extension xmi.extender="umbrello" >
+     <XMI.extension xmi.extender="umbrello">
       <diagrams>
-       <diagram showopsig="1" linecolor="#ff0000" snapx="10" showattribassocs="1" snapy="10" linewidth="0" showattsig="1" showpubliconly="1" showpackage="0" showstereotype="0" name="class diagram" font="Sans,10,-1,5,50,0,0,0,0,0" canvasheight="830" canvaswidth="1552" localid="" snapcsgrid="0" showgrid="0" showops="1" usefillcolor="1" fillcolor="#ffffc0" zoom="81" xmi.id="PbF0CcmZxcnO" documentation="" showscope="1" snapgrid="0" showatts="1" type="1" >
+       <diagram showopsig="1" linecolor="#ff0000" snapx="10" showattribassocs="1" snapy="10" linewidth="0" showattsig="1" isopen="1" showpackage="1" showpubliconly="1" showstereotype="1" name="class diagram" font="Sans Serif,9,-1,0,50,0,0,0,0,0" canvasheight="854" canvaswidth="1604" localid="" snapcsgrid="1" showgrid="1" showops="1" griddotcolor="#808080" backgroundcolor="#ffffff" usefillcolor="1" fillcolor="#ffff00" zoom="100" xmi.id="PbF0CcmZxcnO" documentation="" showscope="1" snapgrid="1" showatts="1" type="1">
         <widgets>
-         <classwidget linecolor="#ff0000" usesdiagramfillcolor="0" linewidth="none" showoperations="1" usesdiagramusefillcolor="0" showpubliconly="1" showpackage="0" x="424" showattsigs="601" y="98" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="235" isinstance="0" usefillcolor="1" fillcolor="#ffffc0" xmi.id="J6qXHlxchzMq" showscope="1" height="72" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="326" showattsigs="601" y="517" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="69" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="JFHkOnc4nZlD" showscope="1" height="38" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="757" showattsigs="601" y="511" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="94" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="rG36YOguGgft" showscope="1" height="32" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="942" showattsigs="601" y="506" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="80" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="qRB4itQTVUH2" showscope="1" height="32" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="627" showattsigs="601" y="513" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="47" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="0NjsdvgyuCHT" showscope="1" height="32" showopsigs="601" />
-         <classwidget linecolor="#ff0000" usesdiagramfillcolor="0" linewidth="none" showoperations="1" usesdiagramusefillcolor="0" showpubliconly="1" showpackage="0" x="884" showattsigs="601" y="331" showattributes="1" font="Sans Serif,10,-1,5,75,0,0,0,0,0" width="293" isinstance="0" usefillcolor="1" fillcolor="#ffffc0" xmi.id="tRKo3clH6yzT" showscope="1" height="88" showopsigs="601" />
-         <classwidget linecolor="#ff0000" usesdiagramfillcolor="0" linewidth="none" showoperations="1" usesdiagramusefillcolor="0" showpubliconly="1" showpackage="0" x="437" showattsigs="601" y="336" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="124" isinstance="0" usefillcolor="1" fillcolor="#ffffc0" xmi.id="Z2oCygxy3epf" showscope="1" height="40" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="136" showattsigs="601" y="415" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="124" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="HWqxKhoAyn7H" showscope="1" height="32" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="173" showattsigs="601" y="656" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="154" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="pMvCpt3xbeEr" showscope="1" height="32" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="341" showattsigs="601" y="657" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="164" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="LwjR0FVi9FGO" showscope="1" height="32" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="558" showattsigs="601" y="661" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="81" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="OTT5nNmCL1f4" showscope="1" height="32" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="754" showattsigs="601" y="661" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="85" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="9vKXhXVI6N4T" showscope="1" height="32" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="657" showattsigs="601" y="661" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="85" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="tlRLHbjj2mWP" showscope="1" height="32" showopsigs="601" />
-         <notewidget width="313" x="1199" noteType="0" y="330" usesdiagramusefillcolor="1" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="229" linecolor="none" xmi.id="eCXMZulyodF1" usefillcolor="1" linewidth="none" font="Sans,10,-1,5,50,0,0,0,0,0" text="Renderable is the entity that renders in one or more from MS, BS, IS, DBGS, DPS stages. It contains only stuff that renderer needs and nothing else.&#xa;&#xa;The renderables are, ModelPatchNodes, SkinPatchNodes or lights&#xa;&#xa;Renderable flags:&#xa;MOVABLE&#xa;RENDER_ONLY_CHILDREN&#xa;DEBUG" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="912" showattsigs="601" y="103" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="98" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="aCSkjpKcYIQB" showscope="1" height="32" showopsigs="601" />
-         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="0" x="876" showattsigs="601" y="10" showattributes="1" font="Sans,10,-1,5,50,0,0,0,0,0" width="59" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="CLERaYxl75Nb" showscope="1" height="32" showopsigs="601" />
-         <notewidget width="268" x="109" noteType="0" y="56" usesdiagramusefillcolor="1" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="89" linecolor="none" xmi.id="tsst9QuOreU7" usefillcolor="1" linewidth="none" font="Sans,10,-1,5,50,0,0,0,0,0" text="SceneNode is the basis of all scene&#xa;related objects" />
-         <notewidget width="117" x="1260" noteType="0" y="142" usesdiagramusefillcolor="1" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="135" linecolor="none" xmi.id="C5MU06Rmn4O7" usefillcolor="1" linewidth="none" font="Sans,10,-1,5,50,0,0,0,0,0" text="Passes:&#xa;- 0: MS&#xa;- 1: BS&#xa;- 2: IS&#xa;- 3: DP" />
-         <notewidget width="179" x="1031" noteType="0" y="104" usesdiagramusefillcolor="1" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="130" linecolor="none" xmi.id="uLDYJh1g4PSb" usefillcolor="1" linewidth="none" font="Sans,10,-1,5,50,0,0,0,0,0" text="The OctreeNode contains Renderables" />
+         <classwidget linecolor="#ff0000" usesdiagramfillcolor="0" linewidth="none" showoperations="1" usesdiagramusefillcolor="0" showpubliconly="1" showpackage="1" x="420" showattsigs="601" showstereotype="1" y="130" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="250" isinstance="0" usefillcolor="1" fillcolor="#ffffc0" xmi.id="J6qXHlxchzMq" showscope="1" height="130" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="120" showattsigs="601" showstereotype="1" y="520" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="70" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="JFHkOnc4nZlD" showscope="1" height="40" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="710" showattsigs="601" showstereotype="1" y="660" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="100" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="rG36YOguGgft" showscope="1" height="40" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="840" showattsigs="601" showstereotype="1" y="660" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="80" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="qRB4itQTVUH2" showscope="1" height="40" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="430" showattsigs="601" showstereotype="1" y="510" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="50" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="0NjsdvgyuCHT" showscope="1" height="40" showopsigs="601"/>
+         <classwidget linecolor="#ff0000" usesdiagramfillcolor="0" linewidth="none" showoperations="1" usesdiagramusefillcolor="0" showpubliconly="1" showpackage="1" x="880" showattsigs="601" showstereotype="1" y="330" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="310" isinstance="0" usefillcolor="1" fillcolor="#ffffc0" xmi.id="tRKo3clH6yzT" showscope="1" height="110" showopsigs="601"/>
+         <classwidget linecolor="#ff0000" usesdiagramfillcolor="0" linewidth="none" showoperations="1" usesdiagramusefillcolor="0" showpubliconly="1" showpackage="1" x="280" showattsigs="601" showstereotype="1" y="430" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="130" isinstance="0" usefillcolor="1" fillcolor="#ffffc0" xmi.id="Z2oCygxy3epf" showscope="1" height="40" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="0" showattsigs="601" showstereotype="1" y="660" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="160" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="pMvCpt3xbeEr" showscope="1" height="40" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="180" showattsigs="601" showstereotype="1" y="680" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="170" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="LwjR0FVi9FGO" showscope="1" height="40" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="390" showattsigs="601" showstereotype="1" y="660" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="90" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="OTT5nNmCL1f4" showscope="1" height="40" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="590" showattsigs="601" showstereotype="1" y="660" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="90" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="9vKXhXVI6N4T" showscope="1" height="40" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="490" showattsigs="601" showstereotype="1" y="660" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="90" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="tlRLHbjj2mWP" showscope="1" height="40" showopsigs="601"/>
+         <notewidget width="200" x="1200" noteType="0" y="330" usesdiagramusefillcolor="1" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="270" linecolor="none" xmi.id="eCXMZulyodF1" usefillcolor="1" linewidth="none" font="Sans Serif,9,-1,0,50,0,0,0,0,0" text="Renderable is the entity that renders in one or more from MS, BS, IS, DBGS, DPS stages. It contains only stuff that renderer needs and nothing else.&#xa;&#xa;The renderables are, ModelPatchNodes, SkinPatchNodes or lights&#xa;&#xa;Renderable flags:&#xa;MOVABLE&#xa;RENDER_ONLY_CHILDREN&#xa;DEBUG"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="920" showattsigs="601" showstereotype="1" y="200" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="100" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="aCSkjpKcYIQB" showscope="1" height="40" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="880" showattsigs="601" showstereotype="1" y="100" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="60" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="CLERaYxl75Nb" showscope="1" height="40" showopsigs="601"/>
+         <notewidget width="160" x="310" noteType="0" y="40" usesdiagramusefillcolor="1" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="80" linecolor="none" xmi.id="tsst9QuOreU7" usefillcolor="1" linewidth="none" font="Sans Serif,9,-1,0,50,0,0,0,0,0" text="SceneNode is the basis of all scene related objects"/>
+         <notewidget width="120" x="1260" noteType="0" y="140" usesdiagramusefillcolor="1" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="140" linecolor="none" xmi.id="C5MU06Rmn4O7" usefillcolor="1" linewidth="none" font="Sans Serif,9,-1,0,50,0,0,0,0,0" text="Passes:&#xa;- 0: MS&#xa;- 1: BS&#xa;- 2: IS&#xa;- 3: DP"/>
+         <notewidget width="180" x="1030" noteType="0" y="100" usesdiagramusefillcolor="1" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="130" linecolor="none" xmi.id="uLDYJh1g4PSb" usefillcolor="1" linewidth="none" font="Sans Serif,9,-1,0,50,0,0,0,0,0" text="The OctreeNode contains Renderables"/>
+         <classwidget linecolor="#ff0000" usesdiagramfillcolor="0" linewidth="none" showoperations="1" usesdiagramusefillcolor="0" showpubliconly="1" showpackage="1" x="690" showattsigs="601" showstereotype="1" y="10" showattributes="1" font="Sans Serif,9,-1,5,50,0,0,0,0,0" width="140" isinstance="0" usefillcolor="1" fillcolor="#ffff00" xmi.id="e1aG9DDOGL7s" showscope="1" height="60" showopsigs="601"/>
+         <enumwidget width="240" x="80" y="180" usesdiagramusefillcolor="0" usesdiagramfillcolor="0" isinstance="0" fillcolor="#ffffc0" height="100" linecolor="#ff0000" xmi.id="uXYCja7WeNcm" showpackage="0" usefillcolor="1" linewidth="none" font="Sans Serif,9,-1,5,50,0,0,0,0,0"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="780" showattsigs="601" showstereotype="1" y="510" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="120" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="OVIwhsCoFZ74" showscope="1" height="50" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="690" showattsigs="601" showstereotype="1" y="780" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="130" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="PYT9spdRoBNv" showscope="1" height="60" showopsigs="601"/>
+         <classwidget linecolor="none" usesdiagramfillcolor="1" linewidth="none" showoperations="1" usesdiagramusefillcolor="1" showpubliconly="1" showpackage="1" x="840" showattsigs="601" showstereotype="1" y="780" showattributes="1" font="Sans Serif,9,-1,0,50,0,0,0,0,0" width="120" isinstance="0" usefillcolor="1" fillcolor="none" xmi.id="112Y3vw1DbQl" showscope="1" height="60" showopsigs="601"/>
+         <notewidget width="230" showstereotype="1" x="1370" noteType="0" y="720" usesdiagramusefillcolor="1" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="130" linecolor="none" xmi.id="B67nr6LzdJvV" usefillcolor="1" linewidth="none" font="Sans Serif,9,-1,0,50,0,0,0,0,0" text="Things to note:&#xa;- Bucket objects&#xa;- Replacable Scene&#xa;- Particle emitter"/>
         </widgets>
         <messages/>
         <associations>
-         <assocwidget indexa="1" indexb="4" widgetaid="rG36YOguGgft" linecolor="none" totalcounta="3" xmi.id="heUjIsJhJEXK" widgetbid="J6qXHlxchzMq" totalcountb="6" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="2" widgetaid="0NjsdvgyuCHT" linecolor="none" totalcounta="2" xmi.id="rbxnyzWmmgbb" widgetbid="J6qXHlxchzMq" totalcountb="6" type="500" linewidth="none">
+          <linepath>
+           <startpoint startx="430" starty="510"/>
+           <endpoint endx="430" endy="260"/>
+          </linepath>
+         </assocwidget>
+         <assocwidget indexa="1" indexb="1" widgetaid="JFHkOnc4nZlD" linecolor="none" totalcounta="2" xmi.id="xc3hGeG1xK9X" widgetbid="J6qXHlxchzMq" totalcountb="6" type="500" linewidth="none">
+          <linepath>
+           <startpoint startx="190" starty="520"/>
+           <endpoint endx="420" endy="260"/>
+          </linepath>
+         </assocwidget>
+         <assocwidget indexa="1" indexb="1" widgetaid="pMvCpt3xbeEr" linecolor="none" totalcounta="2" xmi.id="WilVNneG7Bvd" widgetbid="JFHkOnc4nZlD" totalcountb="3" type="500" linewidth="none">
+          <linepath>
+           <startpoint startx="160" starty="660"/>
+           <endpoint endx="160" endy="560"/>
+          </linepath>
+         </assocwidget>
+         <assocwidget indexa="1" indexb="2" widgetaid="LwjR0FVi9FGO" linecolor="none" totalcounta="2" xmi.id="4ae9jZkMlSM2" widgetbid="JFHkOnc4nZlD" totalcountb="3" type="500" linewidth="none">
+          <linepath>
+           <startpoint startx="190" starty="680"/>
+           <endpoint endx="190" endy="560"/>
+          </linepath>
+         </assocwidget>
+         <assocwidget indexa="1" indexb="1" widgetaid="OTT5nNmCL1f4" linecolor="none" totalcounta="2" xmi.id="YqiJI3JsTTMN" widgetbid="0NjsdvgyuCHT" totalcountb="4" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="788" starty="511" />
-           <endpoint endx="580" endy="170" />
+           <startpoint startx="480" starty="660"/>
+           <endpoint endx="480" endy="550"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="5" widgetaid="qRB4itQTVUH2" linecolor="none" totalcounta="3" xmi.id="NfYgt5yDEDPZ" widgetbid="J6qXHlxchzMq" totalcountb="6" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="3" widgetaid="9vKXhXVI6N4T" linecolor="none" totalcounta="2" xmi.id="Cz0aoGT9Dldx" widgetbid="0NjsdvgyuCHT" totalcountb="4" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="968" starty="506" />
-           <endpoint endx="619" endy="170" />
+           <startpoint startx="590" starty="660"/>
+           <endpoint endx="480" endy="550"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="3" widgetaid="JFHkOnc4nZlD" linecolor="none" totalcounta="2" xmi.id="nAuXyvwBw1mu" widgetbid="tRKo3clH6yzT" totalcountb="4" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="2" widgetaid="tlRLHbjj2mWP" linecolor="none" totalcounta="2" xmi.id="jhYwQBtoKUT2" widgetbid="0NjsdvgyuCHT" totalcountb="4" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="395" starty="536" />
-           <endpoint endx="884" endy="397" />
+           <startpoint startx="490" starty="660"/>
+           <endpoint endx="480" endy="550"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="2" indexb="3" widgetaid="0NjsdvgyuCHT" linecolor="none" totalcounta="3" xmi.id="rbxnyzWmmgbb" widgetbid="J6qXHlxchzMq" totalcountb="6" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="1" widgetaid="CLERaYxl75Nb" linecolor="none" totalcounta="2" xmi.id="6hqsVP4y9lnT" widgetbid="aCSkjpKcYIQB" totalcountb="2" type="501" linewidth="none">
           <linepath>
-           <startpoint startx="658" starty="513" />
-           <endpoint endx="541" endy="170" />
+           <startpoint startx="940" starty="140"/>
+           <endpoint endx="940" endy="200"/>
           </linepath>
+          <floatingtext width="20" x="900" y="140" usesdiagramusefillcolor="1" posttext="" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="20" role="701" linecolor="none" xmi.id="xfhMBtQwKDoR" usefillcolor="1" linewidth="none" font="Sans Serif,9,-1,0,50,0,0,0,0,0" text="1" pretext=""/>
+          <floatingtext width="20" x="960" y="180" usesdiagramusefillcolor="1" posttext="" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="20" role="702" linecolor="none" xmi.id="DyWRYaUhP2tu" usefillcolor="1" linewidth="none" font="Sans Serif,9,-1,0,50,0,0,0,0,0" text="*" pretext=""/>
          </assocwidget>
-         <assocwidget indexa="1" indexb="2" widgetaid="JFHkOnc4nZlD" linecolor="none" totalcounta="3" xmi.id="xc3hGeG1xK9X" widgetbid="J6qXHlxchzMq" totalcountb="6" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="1" widgetaid="JFHkOnc4nZlD" linecolor="none" totalcounta="3" xmi.id="6deEBqMPAeYr" widgetbid="Z2oCygxy3epf" totalcountb="3" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="349" starty="517" />
-           <endpoint endx="502" endy="170" />
+           <startpoint startx="190" starty="520"/>
+           <endpoint endx="280" endy="470"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="2" indexb="1" widgetaid="rG36YOguGgft" linecolor="none" totalcounta="3" xmi.id="EzYAJgfcpn2S" widgetbid="tRKo3clH6yzT" totalcountb="3" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="1" widgetaid="aCSkjpKcYIQB" linecolor="none" totalcounta="2" xmi.id="7zcnD3kOQKlZ" widgetbid="tRKo3clH6yzT" totalcountb="2" type="501" linewidth="none">
           <linepath>
-           <startpoint startx="819" starty="511" />
-           <endpoint endx="981" endy="419" />
+           <startpoint startx="1010" starty="240"/>
+           <endpoint endx="1010" endy="330"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="2" indexb="2" widgetaid="qRB4itQTVUH2" linecolor="none" totalcounta="3" xmi.id="ggqVRqwliqtq" widgetbid="tRKo3clH6yzT" totalcountb="3" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="2" widgetaid="0NjsdvgyuCHT" linecolor="none" totalcounta="2" xmi.id="mDLBX4kpG6g7" widgetbid="Z2oCygxy3epf" totalcountb="3" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="995" starty="506" />
-           <endpoint endx="1079" endy="419" />
+           <startpoint startx="430" starty="510"/>
+           <endpoint endx="410" endy="470"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="2" widgetaid="HWqxKhoAyn7H" linecolor="none" totalcounta="2" xmi.id="qMoQMJPMNT0s" widgetbid="tRKo3clH6yzT" totalcountb="4" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="1" widgetaid="J6qXHlxchzMq" linecolor="none" totalcounta="2" xmi.id="cCU5jvTzzFUs" widgetbid="uXYCja7WeNcm" totalcountb="2" type="501" linewidth="none">
           <linepath>
-           <startpoint startx="260" starty="431" />
-           <endpoint endx="884" endy="375" />
+           <startpoint startx="420" starty="180"/>
+           <endpoint endx="320" endy="180"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="1" widgetaid="pMvCpt3xbeEr" linecolor="none" totalcounta="2" xmi.id="WilVNneG7Bvd" widgetbid="JFHkOnc4nZlD" totalcountb="3" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="1" widgetaid="e1aG9DDOGL7s" linecolor="none" totalcounta="2" xmi.id="ZpkSnu1SkM7x" widgetbid="J6qXHlxchzMq" totalcountb="3" type="501" linewidth="none">
           <linepath>
-           <startpoint startx="250" starty="656" />
-           <endpoint endx="349" endy="555" />
+           <startpoint startx="690" starty="70"/>
+           <endpoint endx="670" endy="130"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="2" widgetaid="LwjR0FVi9FGO" linecolor="none" totalcounta="2" xmi.id="4ae9jZkMlSM2" widgetbid="JFHkOnc4nZlD" totalcountb="3" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="1" widgetaid="e1aG9DDOGL7s" linecolor="none" totalcounta="4" xmi.id="ITF8Q7vFLgPj" widgetbid="CLERaYxl75Nb" totalcountb="2" type="501" linewidth="none">
           <linepath>
-           <startpoint startx="423" starty="657" />
-           <endpoint endx="372" endy="555" />
+           <startpoint startx="830" starty="70"/>
+           <endpoint endx="880" endy="100"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="1" widgetaid="OTT5nNmCL1f4" linecolor="none" totalcounta="2" xmi.id="YqiJI3JsTTMN" widgetbid="0NjsdvgyuCHT" totalcountb="4" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="2" widgetaid="0NjsdvgyuCHT" linecolor="none" totalcounta="2" xmi.id="k63Y7SyC5fnB" widgetbid="tRKo3clH6yzT" totalcountb="3" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="598" starty="661" />
-           <endpoint endx="638" endy="545" />
+           <startpoint startx="480" starty="510"/>
+           <endpoint endx="880" endy="440"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="3" widgetaid="9vKXhXVI6N4T" linecolor="none" totalcounta="2" xmi.id="Cz0aoGT9Dldx" widgetbid="0NjsdvgyuCHT" totalcountb="4" type="500" linewidth="none" >
+         <assocwidget indexa="3" indexb="2" visibilityA="0" widgetaid="e1aG9DDOGL7s" visibilityB="0" linecolor="none" changeabilityA="900" totalcounta="4" xmi.id="imMDNtOADG1f" changeabilityB="900" widgetbid="J6qXHlxchzMq" totalcountb="3" type="510" linewidth="none">
           <linepath>
-           <startpoint startx="796" starty="661" />
-           <endpoint endx="662" endy="545" />
+           <startpoint startx="690" starty="70"/>
+           <endpoint endx="670" endy="130"/>
           </linepath>
+          <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="670" showstereotype="1" y="90" text="nodes" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="-" role="710" width="50" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="hCFuhz6denzn" height="20"/>
          </assocwidget>
-         <assocwidget indexa="1" indexb="2" widgetaid="tlRLHbjj2mWP" linecolor="none" totalcounta="2" xmi.id="jhYwQBtoKUT2" widgetbid="0NjsdvgyuCHT" totalcountb="4" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="5" widgetaid="OVIwhsCoFZ74" linecolor="none" totalcounta="2" xmi.id="0emnFZrhG8yH" widgetbid="J6qXHlxchzMq" totalcountb="6" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="699" starty="661" />
-           <endpoint endx="650" endy="545" />
+           <startpoint startx="780" starty="510"/>
+           <endpoint endx="670" endy="260"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="1" widgetaid="CLERaYxl75Nb" linecolor="none" totalcounta="2" xmi.id="6hqsVP4y9lnT" widgetbid="aCSkjpKcYIQB" totalcountb="2" type="501" linewidth="none" >
+         <assocwidget indexa="1" indexb="1" widgetaid="rG36YOguGgft" linecolor="none" totalcounta="2" xmi.id="rUSa6y9PAq27" widgetbid="OVIwhsCoFZ74" totalcountb="3" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="905" starty="42" />
-           <endpoint endx="961" endy="103" />
+           <startpoint startx="810" starty="660"/>
+           <endpoint endx="810" endy="560"/>
           </linepath>
-          <floatingtext width="16" x="895" y="46" usesdiagramusefillcolor="1" posttext="" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="20" role="701" linecolor="none" xmi.id="53wEI1dRPk8Y" usefillcolor="1" linewidth="none" font="Sans Serif,10,-1,5,50,0,0,0,0,0" text="1" pretext="" />
-          <floatingtext width="15" x="957" y="79" usesdiagramusefillcolor="1" posttext="" usesdiagramfillcolor="1" isinstance="0" fillcolor="none" height="20" role="702" linecolor="none" xmi.id="xLlh1NJFEf3x" usefillcolor="1" linewidth="none" font="Sans Serif,10,-1,5,50,0,0,0,0,0" text="*" pretext="" />
          </assocwidget>
-         <assocwidget indexa="1" indexb="1" widgetaid="Z2oCygxy3epf" linecolor="none" totalcounta="2" xmi.id="3MMBumzpG7XC" widgetbid="tRKo3clH6yzT" totalcountb="4" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="2" widgetaid="qRB4itQTVUH2" linecolor="none" totalcounta="2" xmi.id="Dx5Ml5RPNuwQ" widgetbid="OVIwhsCoFZ74" totalcountb="3" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="561" starty="356" />
-           <endpoint endx="884" endy="353" />
+           <startpoint startx="900" starty="660"/>
+           <endpoint endx="900" endy="560"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="2" indexb="1" widgetaid="JFHkOnc4nZlD" linecolor="none" totalcounta="3" xmi.id="6deEBqMPAeYr" widgetbid="Z2oCygxy3epf" totalcountb="3" type="500" linewidth="none" >
+         <assocwidget indexa="2" indexb="2" widgetaid="112Y3vw1DbQl" linecolor="none" totalcounta="4" xmi.id="crA1eMMXttC1" widgetbid="tRKo3clH6yzT" totalcountb="3" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="372" starty="517" />
-           <endpoint endx="478" endy="376" />
+           <startpoint startx="950" starty="780"/>
+           <endpoint endx="950" endy="440"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="2" indexb="1" widgetaid="aCSkjpKcYIQB" linecolor="none" totalcounta="3" xmi.id="7zcnD3kOQKlZ" widgetbid="tRKo3clH6yzT" totalcountb="2" type="501" linewidth="none" >
+         <assocwidget indexa="3" indexb="1" widgetaid="PYT9spdRoBNv" linecolor="none" totalcounta="4" xmi.id="CY13PB4kNxQ5" widgetbid="tRKo3clH6yzT" totalcountb="3" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="977" starty="135" />
-           <endpoint endx="1030" endy="331" />
+           <startpoint startx="820" starty="780"/>
+           <endpoint endx="880" endy="440"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="2" widgetaid="0NjsdvgyuCHT" linecolor="none" totalcounta="3" xmi.id="mDLBX4kpG6g7" widgetbid="Z2oCygxy3epf" totalcountb="3" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="3" widgetaid="PYT9spdRoBNv" linecolor="none" totalcounta="4" xmi.id="EPpaNDfFISa2" widgetbid="J6qXHlxchzMq" totalcountb="6" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="642" starty="513" />
-           <endpoint endx="519" endy="376" />
+           <startpoint startx="690" starty="780"/>
+           <endpoint endx="670" endy="260"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="1" widgetaid="Z2oCygxy3epf" linecolor="none" totalcounta="2" xmi.id="LxJc3xjPujQg" widgetbid="aCSkjpKcYIQB" totalcountb="3" type="501" linewidth="none" >
+         <assocwidget indexa="1" indexb="4" widgetaid="112Y3vw1DbQl" linecolor="none" totalcounta="4" xmi.id="vmABEkD60kD0" widgetbid="J6qXHlxchzMq" totalcountb="6" type="500" linewidth="none">
           <linepath>
-           <startpoint startx="499" starty="336" />
-           <endpoint endx="944" endy="135" />
+           <startpoint startx="840" starty="780"/>
+           <endpoint endx="670" endy="260"/>
           </linepath>
          </assocwidget>
-         <assocwidget indexa="1" indexb="1" widgetaid="HWqxKhoAyn7H" linecolor="none" totalcounta="2" xmi.id="TDV00RrlHN2J" widgetbid="J6qXHlxchzMq" totalcountb="6" type="500" linewidth="none" >
+         <assocwidget indexa="1" indexb="2" visibilityA="0" widgetaid="rG36YOguGgft" visibilityB="0" linecolor="none" changeabilityA="900" totalcounta="2" xmi.id="OlMOTXMLf3gj" changeabilityB="900" widgetbid="PYT9spdRoBNv" totalcountb="4" type="510" linewidth="none">
           <linepath>
-           <startpoint startx="198" starty="415" />
-           <endpoint endx="463" endy="170" />
+           <startpoint startx="780" starty="700"/>
+           <endpoint endx="780" endy="780"/>
+          </linepath>
+          <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="740" showstereotype="1" y="740" text="modelPatchNodes" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="-" role="710" width="120" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="eQhzbWOoSuFy" height="20"/>
+         </assocwidget>
+         <assocwidget indexa="1" indexb="3" visibilityA="0" widgetaid="qRB4itQTVUH2" visibilityB="0" linecolor="none" changeabilityA="900" totalcounta="2" xmi.id="gj4DDh52nXDC" changeabilityB="900" widgetbid="112Y3vw1DbQl" totalcountb="4" type="510" linewidth="none">
+          <linepath>
+           <startpoint startx="920" starty="700"/>
+           <endpoint endx="920" endy="780"/>
+          </linepath>
+          <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="880" showstereotype="1" y="740" text="skinPatchNodes" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="-" role="710" width="110" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="UheshXkOhzJN" height="20"/>
+         </assocwidget>
+         <assocwidget indexa="1" indexb="1" visibilityA="0" widgetaid="OTT5nNmCL1f4" visibilityB="0" linecolor="none" changeabilityA="900" totalcounta="2" xmi.id="XZmmvWRBCaep" changeabilityB="900" widgetbid="pMvCpt3xbeEr" totalcountb="2" type="510" linewidth="none">
+          <linepath>
+           <startpoint startx="390" starty="660"/>
+           <endpoint endx="160" endy="660"/>
+          </linepath>
+          <floatingtext linecolor="none" usesdiagramfillcolor="1" linewidth="none" usesdiagramusefillcolor="1" x="160" showstereotype="1" y="660" text="camera" font="Sans Serif,9,-1,0,50,0,0,0,0,0" pretext="-" role="710" width="60" isinstance="0" posttext="" usefillcolor="1" fillcolor="none" xmi.id="wN0aBxLnL3kw" height="20"/>
+         </assocwidget>
+         <assocwidget indexa="2" indexb="1" widgetaid="JFHkOnc4nZlD" linecolor="none" totalcounta="3" xmi.id="m9JNBShousbN" widgetbid="tRKo3clH6yzT" totalcountb="3" type="500" linewidth="none">
+          <linepath>
+           <startpoint startx="190" starty="520"/>
+           <endpoint endx="880" endy="440"/>
           </linepath>
          </assocwidget>
         </associations>
@@ -380,79 +512,101 @@
       </diagrams>
      </XMI.extension>
     </UML:Model>
-    <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Use Case View" name="Use Case View" >
+    <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Use Case View" name="Use Case View">
      <UML:Namespace.ownedElement/>
     </UML:Model>
-    <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Component View" name="Component View" >
+    <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Component View" name="Component View">
      <UML:Namespace.ownedElement/>
     </UML:Model>
-    <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Deployment View" name="Deployment View" >
+    <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Deployment View" name="Deployment View">
      <UML:Namespace.ownedElement/>
     </UML:Model>
-    <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Entity Relationship Model" name="Entity Relationship Model" >
+    <UML:Model stereotype="folder" visibility="public" isSpecification="false" namespace="m1" isAbstract="false" isLeaf="false" isRoot="false" xmi.id="Entity Relationship Model" name="Entity Relationship Model">
      <UML:Namespace.ownedElement/>
     </UML:Model>
    </UML:Namespace.ownedElement>
   </UML:Model>
  </XMI.content>
- <XMI.extensions xmi.extender="umbrello" >
-  <docsettings viewid="PbF0CcmZxcnO" uniqueid="tqt3pitW2xqp" documentation="" />
+ <XMI.extensions xmi.extender="umbrello">
+  <docsettings viewid="PbF0CcmZxcnO" uniqueid="vVjn756QCL3I" documentation=""/>
   <listview>
-   <listitem open="1" type="800" label="Views" >
-    <listitem open="1" type="801" id="Logical View" >
-     <listitem open="0" type="807" id="PbF0CcmZxcnO" label="class diagram" />
-     <listitem open="1" type="813" id="JFHkOnc4nZlD" />
-     <listitem open="1" type="813" id="Z2oCygxy3epf" >
-      <listitem open="0" type="815" id="zZHMzsqTyJyB" />
+   <listitem open="1" type="800" id="Views">
+    <listitem open="1" type="801" id="Logical View">
+     <listitem open="0" type="807" id="PbF0CcmZxcnO" label="class diagram"/>
+     <listitem open="1" type="813" id="JFHkOnc4nZlD"/>
+     <listitem open="1" type="813" id="Z2oCygxy3epf">
+      <listitem open="0" type="815" id="zZHMzsqTyJyB"/>
+     </listitem>
+     <listitem open="1" type="813" id="OVIwhsCoFZ74"/>
+     <listitem open="1" type="813" id="9vKXhXVI6N4T"/>
+     <listitem open="1" type="813" id="0NjsdvgyuCHT"/>
+     <listitem open="1" type="813" id="rG36YOguGgft">
+      <listitem open="0" type="814" id="OlMOTXMLf3gj"/>
+     </listitem>
+     <listitem open="1" type="813" id="PYT9spdRoBNv"/>
+     <listitem open="1" type="813" id="CLERaYxl75Nb"/>
+     <listitem open="1" type="813" id="aCSkjpKcYIQB"/>
+     <listitem open="1" type="813" id="LwjR0FVi9FGO"/>
+     <listitem open="1" type="813" id="vgq4ym8aTrBV"/>
+     <listitem open="1" type="813" id="pMvCpt3xbeEr"/>
+     <listitem open="1" type="813" id="tlRLHbjj2mWP"/>
+     <listitem open="1" type="813" id="tRKo3clH6yzT">
+      <listitem open="0" type="815" id="i1a0wMeuxyfs"/>
+      <listitem open="0" type="815" id="hup81s2ak3bD"/>
+      <listitem open="0" type="815" id="anjW7OQ4M3wy"/>
+      <listitem open="0" type="815" id="T05FNZKbtIDV"/>
+      <listitem open="0" type="815" id="5k8R7nYDjUlk"/>
+      <listitem open="0" type="815" id="vVjn756QCL3I"/>
+     </listitem>
+     <listitem open="1" type="813" id="e1aG9DDOGL7s">
+      <listitem open="0" type="814" id="imMDNtOADG1f"/>
+      <listitem open="0" type="815" id="IuNpzsprGl9N"/>
+     </listitem>
+     <listitem open="1" type="813" id="J6qXHlxchzMq">
+      <listitem open="0" type="815" id="DqiQZJDHpKfG"/>
+      <listitem open="0" type="815" id="mxnhfcJHH4qm"/>
+      <listitem open="0" type="815" id="zfiPC1aTps65"/>
+      <listitem open="0" type="815" id="SPg4o80rLkIE"/>
+      <listitem open="0" type="815" id="SoOg2Qz97mJe"/>
+      <listitem open="0" type="815" id="DDoIy5xBZff3"/>
+     </listitem>
+     <listitem open="1" type="813" id="SNy1kBAljn9P"/>
+     <listitem open="1" type="813" id="rXBulrAiDtwn"/>
+     <listitem open="1" type="813" id="qRB4itQTVUH2">
+      <listitem open="0" type="814" id="gj4DDh52nXDC"/>
      </listitem>
-     <listitem open="1" type="813" id="9vKXhXVI6N4T" />
-     <listitem open="1" type="813" id="0NjsdvgyuCHT" />
-     <listitem open="1" type="813" id="rG36YOguGgft" />
-     <listitem open="1" type="813" id="CLERaYxl75Nb" />
-     <listitem open="1" type="813" id="aCSkjpKcYIQB" />
-     <listitem open="1" type="813" id="LwjR0FVi9FGO" />
-     <listitem open="1" type="813" id="vgq4ym8aTrBV" />
-     <listitem open="1" type="813" id="pMvCpt3xbeEr" />
-     <listitem open="1" type="813" id="tlRLHbjj2mWP" />
-     <listitem open="1" type="813" id="tRKo3clH6yzT" >
-      <listitem open="0" type="815" id="i1a0wMeuxyfs" />
-      <listitem open="0" type="815" id="hup81s2ak3bD" />
-      <listitem open="0" type="815" id="anjW7OQ4M3wy" />
-      <listitem open="0" type="815" id="T05FNZKbtIDV" />
+     <listitem open="1" type="813" id="112Y3vw1DbQl"/>
+     <listitem open="1" type="813" id="OTT5nNmCL1f4">
+      <listitem open="0" type="814" id="XZmmvWRBCaep"/>
      </listitem>
-     <listitem open="1" type="813" id="J6qXHlxchzMq" >
-      <listitem open="0" type="815" id="DqiQZJDHpKfG" />
-      <listitem open="0" type="815" id="mxnhfcJHH4qm" />
-      <listitem open="0" type="815" id="zfiPC1aTps65" />
+     <listitem open="1" type="813" id="HWqxKhoAyn7H"/>
+     <listitem open="1" type="813" id="7qtCN74kkWxC"/>
+     <listitem open="0" type="830" id="Datatypes">
+      <listitem open="1" type="829" id="zMzwwkKvM9Ej"/>
+      <listitem open="1" type="829" id="2BMVEe9cFOaP"/>
+      <listitem open="1" type="829" id="sfn72LUzhTvd"/>
+      <listitem open="1" type="829" id="hQAU3pu3zGWB"/>
+      <listitem open="1" type="829" id="zbqJPYCQnefR"/>
+      <listitem open="1" type="829" id="DMBCciLUL7ZL"/>
+      <listitem open="1" type="829" id="EDWYKiF17PUA"/>
+      <listitem open="1" type="829" id="IzNjDaSA3DDv"/>
+      <listitem open="1" type="829" id="S3K8VFjhRGFl"/>
+      <listitem open="1" type="829" id="3adOfCk8D4Gi"/>
+      <listitem open="1" type="829" id="wUl3sFB5bNFB"/>
      </listitem>
-     <listitem open="1" type="813" id="SNy1kBAljn9P" />
-     <listitem open="1" type="813" id="rXBulrAiDtwn" />
-     <listitem open="1" type="813" id="qRB4itQTVUH2" />
-     <listitem open="1" type="813" id="OTT5nNmCL1f4" />
-     <listitem open="1" type="813" id="HWqxKhoAyn7H" />
-     <listitem open="1" type="813" id="7qtCN74kkWxC" />
-     <listitem open="0" type="830" id="Datatypes" >
-      <listitem open="1" type="829" id="zMzwwkKvM9Ej" />
-      <listitem open="1" type="829" id="2BMVEe9cFOaP" />
-      <listitem open="1" type="829" id="sfn72LUzhTvd" />
-      <listitem open="1" type="829" id="hQAU3pu3zGWB" />
-      <listitem open="1" type="829" id="zbqJPYCQnefR" />
-      <listitem open="1" type="829" id="DMBCciLUL7ZL" />
-      <listitem open="1" type="829" id="EDWYKiF17PUA" />
-      <listitem open="1" type="829" id="IzNjDaSA3DDv" />
-      <listitem open="1" type="829" id="S3K8VFjhRGFl" />
-      <listitem open="1" type="829" id="3adOfCk8D4Gi" />
-      <listitem open="1" type="829" id="wUl3sFB5bNFB" />
+     <listitem open="1" type="831" id="uXYCja7WeNcm">
+      <listitem open="0" type="839" id="GoRJcvD4hYMw"/>
+      <listitem open="0" type="839" id="Kpcl5qztHHTA"/>
      </listitem>
     </listitem>
-    <listitem open="1" type="802" id="Use Case View" />
-    <listitem open="1" type="821" id="Component View" />
-    <listitem open="1" type="827" id="Deployment View" />
-    <listitem open="1" type="836" id="Entity Relationship Model" />
+    <listitem open="1" type="802" id="Use Case View"/>
+    <listitem open="1" type="821" id="Component View"/>
+    <listitem open="1" type="827" id="Deployment View"/>
+    <listitem open="1" type="836" id="Entity Relationship Model"/>
    </listitem>
   </listview>
   <codegeneration>
-   <codegenerator language="C++" />
+   <codegenerator language="C++"/>
   </codegeneration>
  </XMI.extensions>
 </XMI>