Просмотр исходного кода

First steps of 3D editor, fixed ray picking in virtual scenes, added support for overlay wireframe in SceneMesh

Ivan Safrin 12 лет назад
Родитель
Сommit
d3458b48a1
25 измененных файлов с 324 добавлено и 3455 удалено
  1. 3 0
      Core/Contents/Include/PolyCamera.h
  2. 2 2
      Core/Contents/Include/PolyGLRenderer.h
  3. 3 1
      Core/Contents/Include/PolyRenderer.h
  4. 2 0
      Core/Contents/Include/PolyScene.h
  5. 4 1
      Core/Contents/Include/PolySceneMesh.h
  6. 5 0
      Core/Contents/Source/PolyCamera.cpp
  7. 8 3
      Core/Contents/Source/PolyGLRenderer.cpp
  8. 4 2
      Core/Contents/Source/PolyScene.cpp
  9. 21 3
      Core/Contents/Source/PolySceneMesh.cpp
  10. 6 0
      IDE/Build/Mac OS X/Polycode.xcodeproj/project.pbxproj
  11. 80 0
      IDE/Contents/Include/PolycodeEntityEditor.h
  12. 1 0
      IDE/Contents/Include/PolycodeIDEApp.h
  13. 1 0
      IDE/Contents/Include/PolycodeMeshEditor.h
  14. 0 412
      IDE/Contents/Include/PolycodeScreenEditor.h
  15. 0 0
      IDE/Contents/Resources/FileTemplates/Graphics/Entity.entity
  16. 0 0
      IDE/Contents/Resources/FileTemplates/Graphics/Sprite.sprite
  17. BIN
      IDE/Contents/Resources/Images/entity_editor/move_gizmo.png
  18. BIN
      IDE/Contents/Resources/Images/entity_editor/new_entity.png
  19. BIN
      IDE/Contents/Resources/Images/entity_editor/rotate_gizmo.png
  20. BIN
      IDE/Contents/Resources/Images/entity_editor/scale_gizmo.png
  21. BIN
      IDE/Contents/Resources/Images/entity_editor/sidebar.png
  22. BIN
      IDE/Contents/Resources/Images/entity_editor/siderbar_separator.png
  23. 182 0
      IDE/Contents/Source/PolycodeEntityEditor.cpp
  24. 2 1
      IDE/Contents/Source/PolycodeIDEApp.cpp
  25. 0 3030
      IDE/Contents/Source/PolycodeScreenEditor.cpp

+ 3 - 0
Core/Contents/Include/PolyCamera.h

@@ -157,6 +157,8 @@ namespace Polycode {
 			
 			Matrix4 getProjectionMatrix();
 			
+			Polycode::Rectangle getViewport();
+			
 			/**
 			* Toggles the frustum culling of the camera. (Defaults to true).
 			*/
@@ -173,6 +175,7 @@ namespace Polycode {
 		protected:
 		
 			Matrix4 projectionMatrix;	
+			Polycode::Rectangle viewport;
 			Number orthoSizeX;
 			Number orthoSizeY;
 			

+ 2 - 2
Core/Contents/Include/PolyGLRenderer.h

@@ -154,8 +154,8 @@ namespace Polycode {
 		void enableScissor(bool val);
 		void setScissorBox(Polycode::Rectangle box);		
 		
-		Vector3 projectRayFrom2DCoordinate(Number x, Number y, Matrix4 cameraMatrix, Matrix4 projectionMatrix);
-
+		Vector3 projectRayFrom2DCoordinate(Number x, Number y, const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Polycode::Rectangle &viewport);
+		Polycode::Rectangle getViewport();
 		
 		void setLineSize(Number lineSize);
 		void setPointSize(Number pointSize);

+ 3 - 1
Core/Contents/Include/PolyRenderer.h

@@ -113,6 +113,8 @@ namespace Polycode {
 		void setViewportSize(int w, int h);
 		void setViewportSizeAndFOV(int w, int h, Number fov);
 		virtual void resetViewport() = 0;
+		
+		virtual Polycode::Rectangle getViewport() = 0;
 				
 		virtual void loadIdentity() = 0;		
 		virtual void setOrthoMode(Number xSize=0.0f, Number ySize=0.0f, bool centered = false) = 0;
@@ -241,7 +243,7 @@ namespace Polycode {
 		
 		void setExposureLevel(Number level);
 		
-		virtual Vector3 projectRayFrom2DCoordinate(Number x, Number y, Matrix4 cameraMatrix, Matrix4 projectionMatrix) = 0;
+		virtual Vector3 projectRayFrom2DCoordinate(Number x, Number y, const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Polycode::Rectangle &viewport) = 0;
 		
 		virtual Vector2 Project(const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Vector3 &coordiante) const = 0;
 		

+ 2 - 0
Core/Contents/Include/PolyScene.h

@@ -182,6 +182,8 @@ namespace Polycode {
 						
 		Entity rootEntity;
 		
+		Vector2 sceneMouseAdjust;
+		
 	protected:
 		
 		void initScene(int sceneType, bool virtualScene);

+ 4 - 1
Core/Contents/Include/PolySceneMesh.h

@@ -171,7 +171,10 @@ namespace Polycode {
 			* If true, will delete its Skeleton upon destruction. (defaults to true)
 			*/ 			
 			bool ownsSkeleton;
-		
+			
+			bool overlayWireframe;
+			Color wireFrameColor;			
+			
 		protected:
 		
 			bool useVertexBuffer;

+ 5 - 0
Core/Contents/Source/PolyCamera.cpp

@@ -394,6 +394,10 @@ Matrix4 Camera::getProjectionMatrix() {
 	return projectionMatrix;
 }
 
+Polycode::Rectangle Camera::getViewport() {
+	return viewport;
+}
+
 void Camera::doCameraTransform() {
 	renderer->setClippingPlanes(nearClipPlane, farClipPlane);
 
@@ -406,6 +410,7 @@ void Camera::doCameraTransform() {
 	}	
 	renderer->setExposureLevel(exposureLevel);
 
+	viewport = renderer->getViewport();
 	projectionMatrix = renderer->getProjectionMatrix();
 
 	if(matrixDirty) {

+ 8 - 3
Core/Contents/Source/PolyGLRenderer.cpp

@@ -293,7 +293,13 @@ Vector2 OpenGLRenderer::Project(const Matrix4 &cameraMatrix, const Matrix4 &proj
 	return Vector2(coords[0], yRes-coords[1]);
 }
 
-Vector3 OpenGLRenderer::projectRayFrom2DCoordinate(Number x, Number y, Matrix4 cameraMatrix, Matrix4 projectionMatrix) {
+Polycode::Rectangle OpenGLRenderer::getViewport() {
+	GLint vp[4];
+	glGetIntegerv( GL_VIEWPORT, vp );
+	return Polycode::Rectangle(vp[0], vp[1], vp[2], vp[3]); 
+}
+
+Vector3 OpenGLRenderer::projectRayFrom2DCoordinate(Number x, Number y, const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Polycode::Rectangle &viewport) {
 	GLdouble nearPlane[3],farPlane[3];
 
 	GLdouble mv[16];
@@ -306,8 +312,7 @@ Vector3 OpenGLRenderer::projectRayFrom2DCoordinate(Number x, Number y, Matrix4 c
 		mv[i] = cmv.ml[i];
 	}
 
-	GLint vp[4];
-	glGetIntegerv( GL_VIEWPORT, vp );
+	GLint vp[4] = {viewport.x, viewport.y, viewport.w, viewport.h};
 
 	GLdouble _sceneProjectionMatrix[16];
 	for(int i=0; i < 16; i++) {

+ 4 - 2
Core/Contents/Source/PolyScene.cpp

@@ -268,10 +268,12 @@ void Scene::RenderDepthOnly(Camera *targetCamera) {
 void Scene::handleEvent(Event *event) {
 	if(event->getDispatcher() == core->getInput() && rootEntity.processInputEvents) {
 		InputEvent *inputEvent = (InputEvent*) event;
-		Vector3 dir =  renderer->projectRayFrom2DCoordinate(inputEvent->mousePosition.x, inputEvent->mousePosition.y, activeCamera->getConcatenatedMatrix(), activeCamera->getProjectionMatrix());				
+		Polycode::Rectangle viewport = activeCamera->getViewport();
+		viewport.x = sceneMouseAdjust.x;
+		viewport.y = sceneMouseAdjust.y;
+		Vector3 dir =  renderer->projectRayFrom2DCoordinate(inputEvent->mousePosition.x, inputEvent->mousePosition.y, activeCamera->getConcatenatedMatrix(), activeCamera->getProjectionMatrix(), viewport);
 		Vector3 pos;
 		
-		
 		switch(sceneType) {
 			case SCENE_2D:
 			{

+ 21 - 3
Core/Contents/Source/PolySceneMesh.cpp

@@ -57,6 +57,7 @@ SceneMesh::SceneMesh(const String& fileName) : Entity(), texture(NULL), material
 	lineWidth = 1.0;
 	pointSize = 1.0;
 	pointSmooth = false;
+	overlayWireframe = false;
 }
 
 SceneMesh::SceneMesh(Mesh *mesh) : Entity(), texture(NULL), material(NULL), skeleton(NULL), localShaderOptions(NULL) {
@@ -71,7 +72,8 @@ SceneMesh::SceneMesh(Mesh *mesh) : Entity(), texture(NULL), material(NULL), skel
 	ownsSkeleton = true;	
 	lineWidth = 1.0;
 	pointSize = 1.0;
-	pointSmooth = false;	
+	pointSmooth = false;
+	overlayWireframe = false;		
 		
 }
 
@@ -85,7 +87,8 @@ SceneMesh::SceneMesh(int meshType) : texture(NULL), material(NULL), skeleton(NUL
 	lineSmooth = false;
 	ownsMesh = true;
 	ownsSkeleton = true;	
-	lineWidth = 1.0;	
+	lineWidth = 1.0;
+	overlayWireframe = false;		
 }
 
 void SceneMesh::setMesh(Mesh *mesh) {
@@ -292,13 +295,28 @@ void SceneMesh::Render() {
 		else
 			renderer->setTexture(NULL);
 	}
-	
+		
 	if(useVertexBuffer) {
 		renderer->drawVertexBuffer(mesh->getVertexBuffer(), mesh->useVertexColors);
 	} else {
 		renderMeshLocally();
 	}
 	
+	if(overlayWireframe) {
+		bool depthTestVal = depthTest;
+		renderer->enableDepthTest(false);
+		renderer->setRenderMode(Renderer::RENDER_MODE_WIREFRAME);
+		renderer->setVertexColor(wireFrameColor.r, wireFrameColor.g, wireFrameColor.b, wireFrameColor.a);
+		
+		if(useVertexBuffer) {
+			renderer->drawVertexBuffer(mesh->getVertexBuffer(), mesh->useVertexColors);
+		} else {
+			renderMeshLocally();
+		}
+		renderer->enableDepthTest(depthTestVal);		
+		renderer->setRenderMode(Renderer::RENDER_MODE_NORMAL);		
+	}	
+	
 	if(material) 
 		renderer->clearShader();
 	

+ 6 - 0
IDE/Build/Mac OS X/Polycode.xcodeproj/project.pbxproj

@@ -36,6 +36,7 @@
 		6DC67A541656F693004FD1EF /* TextureBrowser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DC67A531656F693004FD1EF /* TextureBrowser.cpp */; };
 		6DC825791648571E006AFC03 /* ExportProjectWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DC825781648571E006AFC03 /* ExportProjectWindow.cpp */; };
 		6DCAFD4314B519C900039F34 /* ExampleBrowserWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DCAFD4214B519C900039F34 /* ExampleBrowserWindow.cpp */; };
+		6DCB6026181F1F4B006701AF /* PolycodeEntityEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DCB6025181F1F4B006701AF /* PolycodeEntityEditor.cpp */; };
 		6DCE857A12AE018800566FAE /* PolycodeEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DCE857812AE018800566FAE /* PolycodeEditor.cpp */; };
 		6DCE857B12AE018800566FAE /* PolycodeEditorManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DCE857912AE018800566FAE /* PolycodeEditorManager.cpp */; };
 		6DCE85B712AE082B00566FAE /* PolycodeImageEditor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DCE85B612AE082B00566FAE /* PolycodeImageEditor.cpp */; };
@@ -130,6 +131,8 @@
 		6DC8257B16485726006AFC03 /* ExportProjectWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExportProjectWindow.h; sourceTree = "<group>"; };
 		6DCAFD4214B519C900039F34 /* ExampleBrowserWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExampleBrowserWindow.cpp; sourceTree = "<group>"; };
 		6DCAFD4614B51A2D00039F34 /* ExampleBrowserWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExampleBrowserWindow.h; sourceTree = "<group>"; };
+		6DCB6023181F1F44006701AF /* PolycodeEntityEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeEntityEditor.h; sourceTree = "<group>"; };
+		6DCB6025181F1F4B006701AF /* PolycodeEntityEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PolycodeEntityEditor.cpp; sourceTree = "<group>"; };
 		6DCE857612AE018000566FAE /* PolycodeEditor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeEditor.h; sourceTree = "<group>"; };
 		6DCE857712AE018000566FAE /* PolycodeEditorManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PolycodeEditorManager.h; sourceTree = "<group>"; };
 		6DCE857812AE018800566FAE /* PolycodeEditor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PolycodeEditor.cpp; sourceTree = "<group>"; };
@@ -277,6 +280,7 @@
 		6D80E91212AB53FB0037A708 /* Include */ = {
 			isa = PBXGroup;
 			children = (
+				6DCB6023181F1F44006701AF /* PolycodeEntityEditor.h */,
 				6D0F6B5F18170C0400C5327F /* PolycodeMeshEditor.h */,
 				6D8A845A16F593C800F3BA08 /* PolycodeClipboard.h */,
 				6DC67A561656F699004FD1EF /* TextureBrowser.h */,
@@ -312,6 +316,7 @@
 		6D80E91812AB53FB0037A708 /* Source */ = {
 			isa = PBXGroup;
 			children = (
+				6DCB6025181F1F4B006701AF /* PolycodeEntityEditor.cpp */,
 				6D0F6B6118170C1000C5327F /* PolycodeMeshEditor.cpp */,
 				6D128ABC174A9940007B0375 /* SettingsWindow.cpp */,
 				6D8A845C16F593D000F3BA08 /* PolycodeClipboard.cpp */,
@@ -456,6 +461,7 @@
 				6D8A845D16F593D000F3BA08 /* PolycodeClipboard.cpp in Sources */,
 				6D128ABD174A9940007B0375 /* SettingsWindow.cpp in Sources */,
 				6D0F6B6218170C1000C5327F /* PolycodeMeshEditor.cpp in Sources */,
+				6DCB6026181F1F4B006701AF /* PolycodeEntityEditor.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

+ 80 - 0
IDE/Contents/Include/PolycodeEntityEditor.h

@@ -0,0 +1,80 @@
+/*
+ Copyright (C) 2012 by Ivan Safrin
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+ 
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ */
+ 
+#pragma once
+
+#include "PolycodeEditor.h"
+#include "PolyUIElement.h"
+#include <Polycode.h>
+#include "PolycodeUI.h"
+
+using namespace Polycode;
+
+class TransformGizmo : public Entity {
+	public:
+		TransformGizmo();
+		~TransformGizmo();
+		
+		
+};
+
+class EntityEditorMainView : public UIElement {
+		public:
+			EntityEditorMainView();
+			~EntityEditorMainView();
+			
+			void handleEvent(Event *event);			
+			void Resize(Number width, Number height);
+			void Update();
+			
+		protected:
+		
+			Entity *sideBar;
+			UIRect *headerBg;	
+			
+			Scene *mainScene;
+			SceneRenderTexture *renderTexture;
+			UIRect *renderTextureShape;			
+
+			TransformGizmo *transformGizmo;
+};
+
+class PolycodeEntityEditor : public PolycodeEditor {
+	public:
+		PolycodeEntityEditor();
+		virtual ~PolycodeEntityEditor();
+		
+		bool openFile(OSFileEntry filePath);
+		void Resize(int x, int y);
+		
+	protected:
+	
+		EntityEditorMainView *mainView;
+		UIHSizer *mainSizer;
+	
+};
+
+class PolycodeEntityEditorFactory : public PolycodeEditorFactory {
+	public:
+		PolycodeEntityEditorFactory() : PolycodeEditorFactory() { extensions.push_back("entity"); }
+		PolycodeEditor *createEditor() { return new PolycodeEntityEditor(); }
+};

+ 1 - 0
IDE/Contents/Include/PolycodeIDEApp.h

@@ -41,6 +41,7 @@
 #include "PolycodeProjectEditor.h"
 #include "PolycodeSpriteEditor.h"
 #include "PolycodeMeshEditor.h"
+#include "PolycodeEntityEditor.h"
 
 #include "PolycodeToolLauncher.h"
 

+ 1 - 0
IDE/Contents/Include/PolycodeMeshEditor.h

@@ -45,6 +45,7 @@ class PolycodeMeshEditor : public PolycodeEditor {
 	protected:
 	
 		Scene *previewScene;
+		
 		SceneLight *mainLight;
 		SceneLight *secondLight;		
 		SceneRenderTexture *renderTexture;

+ 0 - 412
IDE/Contents/Include/PolycodeScreenEditor.h

@@ -1,412 +0,0 @@
-/*
- Copyright (C) 2012 by Ivan Safrin
- 
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- 
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- 
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- */
- 
-#pragma once
-
-#include "PolycodeEditor.h"
-#include <Polycode.h>
-#include <PolycodeUI.h>
-#include "PolycodeProps.h"
-
-#if defined(__APPLE__) && defined(__MACH__)
-	#define COPYMOD_1 KEY_RALT
-	#define COPYMOD_2 KEY_LALT
-#elif defined _WINDOWS
-	#define COPYMOD_1 KEY_RCTRL
-	#define COPYMOD_2 KEY_LCTRL
-#else
-	#define COPYMOD_1 KEY_RCTRL
-	#define COPYMOD_2 KEY_LCTRL
-#endif
-
-using namespace Polycode;
-
-#ifdef _WINDOWS
-#define round (int)
-#endif
-
-class EntityBrowserData  {
-	public:
-		Entity *entity;
-};
-
-class PolycodeScreenEditorActionDataEntry {
-	public:
-		PolycodeScreenEditorActionDataEntry(){
-			entity = NULL;
-			parentEntity = NULL;
-		}
-		PolycodeScreenEditorActionDataEntry(Vector3 vec3, Number number);	
-		PolycodeScreenEditorActionDataEntry(Vector3 vec3);
-		PolycodeScreenEditorActionDataEntry(Number number);
-		PolycodeScreenEditorActionDataEntry(Entity *entity);
-		Vector3 vec3;
-		Number number;
-		Entity *entity;
-		Entity *parentEntity;		
-};
-
-class PolycodeScreenEditorActionData : public PolycodeEditorActionData {
-	public:
-		PolycodeScreenEditorActionData() {
-			reverse = true;
-		}
-		virtual ~PolycodeScreenEditorActionData(){}
-		
-		std::vector<PolycodeScreenEditorActionDataEntry> entries;
-		PolycodeScreenEditorActionDataEntry entry;
-		bool reverse;
-};
-
-class EntityTreeView : public UIElement {
-	public:
-		EntityTreeView(Entity *rootEntity);
-		~EntityTreeView();
-		
-		void Resize(Number width, Number height);
-		void handleEvent(Event *event);	
-		
-		void syncNodeToEntity(UITree *node, Entity *entity);
-		
-		void setRootEntity(Entity *entity);
-		
-		void Refresh();
-
-		Entity *selectedEntity;
-		Entity *targetLayer;
-		
-		UIImageButton *newLayerButton;
-		UIImageButton *targetLayerButton;
-		
-						
-	protected:	
-	
-		Entity *rootEntity;
-			
-		bool dontSendSelectionEvent;
-	
-		UITreeContainer *treeContainer;
-			
-		ScenePrimitive *headerBg;		
-		ScenePrimitive *bg;		
-				
-};
-
-class PropertiesSizer : public UIElement {
-	public:
-		PropertiesSizer();
-		~PropertiesSizer();
-		
-		void Resize(Number width, Number height);
-		
-		UIVSizer *sizer;
-};
-
-
-class EntityNameDisplay : public Entity {
-	public:
-		EntityNameDisplay(Entity *targetEntity);
-		~EntityNameDisplay();
-		
-		void Update();
-		
-		SceneLabel *label;
-		SceneLabel *tagsLabel;		
-		Entity *targetEntity;
-};
-
-class PolycodeScreenEditorMain : public UIElement {
-	public:
-		
-		PolycodeScreenEditorMain(PolycodeEditor *editor);
-		virtual ~PolycodeScreenEditorMain();	
-			
-		void Resize(Number width, Number height);	
-		void syncTransformToSelected();	
-		Entity *addNewLayer(String layerName);	
-		void updateCursor();		
-		void selectEntity(Entity *entity, bool doAction = true);
-		void resetSelectedEntityTransforms();
-		void setMode(int newMode);	
-		void handleEvent(Event *event);	
-		void resizePreviewScreen();		
-		void handleDroppedFile(OSFileEntry file, Number x, Number y);		
-		bool hasSelected(Entity *entity);
-		
-		void deleteEntity(Entity *entity);
-	
-		void applyEditorOnly(Entity *entity);
-		void applyEditorOnlyChildren(Entity *entity);
-		void applyEditorProperties(Entity *entity);
-			
-		void processEventForEntity(Entity *childEntity, InputEvent *inputEvent);
-	
-		void createParticleRef(SceneParticleEmitter *target);
-		void createSoundRef(SceneSound *target);
-		void createEntityRef(Entity *entity);
-		
-		void doAction(String actionName, PolycodeEditorActionData *data);
-		
-		void setRefVisibility(bool val);
-		void setEntityRefVisibility(Entity *entity, bool val);
-		
-		void getCenterAndSizeForSelected(Vector2 *center, Number *width, Number *height);
-	
-		void handleMouseDown(Vector2 position);
-		void handleMouseMove(Vector2 position);
-		void handleMouseUp(Vector2 position);
-		
-		void setGrid(int gridSize);
-		
-		void adjustForSnap(Vector2 *position);
-		
-		void setCurrentLayer(Entity *newLayer, bool doAction = true);
-		Entity *getCurrentLayer();
-		
-		String Copy(void **data);
-		void Paste(void *data, String clipboardType);
-		void destroyClipboardData(void *data, String type);
-		
-		static const int MODE_SELECT = 0;
-		static const int MODE_SHAPE = 1;
-		static const int MODE_ZOOM = 2;
-		static const int MODE_PAN = 3;
-		static const int MODE_IMAGE = 4;
-		static const int MODE_TEXT = 5;
-		static const int MODE_PARENT = 6;
-		static const int MODE_ENTITY = 7;
-		static const int MODE_SOUND = 8;
-		static const int MODE_LINK = 9;
-		static const int MODE_SPRITE = 10;
-		static const int MODE_PARTICLES = 11;
-																
-		std::vector<Entity*> layers;
-		
-		PropList *entityProps;
-		
-		Entity *layerBaseEntity;		
-						
-//		Entity *selectedEntity;
-		std::vector<Entity*> selectedEntities;		
-		
-		Transform2DSheet *transform2dSheet;
-		EntitySheet *entitySheet;
-		UIImageSheet *imageSheet;
-		SceneLabelSheet *labelSheet;
-		SoundSheet *soundSheet;
-		EntityPropSheet *entityPropSheet;
-		SceneEntityInstanceSheet *instanceSheet;
-		SceneSpriteSheet *spriteSheet;
-		ScreenParticleSheet *particleSheet;
-		
-		EntityTreeView *treeView;
-		
-		Entity *objectBaseEntity;		
-		Entity *placingPreviewEntity;												
-		bool multiSelect;
-		
-		PolycodeEditor *editor;	
-		Entity *baseEntity;			
-	protected:
-	
-		PolycodeScreenEditorActionData *beforeData;
-		Entity *currentLayer;	
-	
-		int gridSize;
-		bool gridSnap;
-		
-		bool pixelSnap;
-	
-		ScenePrimitive *previewShape;
-		UIImage *previewImage;
-		SceneEntityInstance *previewInstance;		
-		SceneLabel *previewLabel;							
-		Entity *previewEntity;
-		SceneParticleEmitter *previewEmitter;
-							
-		SceneSound *previewSound;
-		SceneSprite *previewSprite;
-											
-		SceneMesh *grid;
-
-		bool firstResize;
-		
-		bool firstMove;
-
-		int placementCount;
-	
-		
-		Number previewAspectRatio;
-
-		bool placing;
-		bool moving;
-		bool scalingY;
-		bool scalingX;		
-		bool rotating;
-		bool panning;
-		bool zooming;
-		bool zoomingMoved;
-		
-		bool parenting;
-		Entity *parentingChild;
-		SceneLine *parentingLine;
-		
-		
-		int lastMode;
-		
-		Vector2 basePanPosition;
-		Vector2 zoomBasePosition;
-		Vector2 zoomBaseMousePosition;
-		Vector2 baseScaleScreenPosition;
-				
-		Number baseZoomScale;
-		
-		Number baseRotateAngle;
-		
-		int selectedEntityPositionMode;
-		
-		Vector3 baseScale;
-		
-		Vector2 mouseBase;
-		std::vector<Vector2> baseEntityPositions;
-		std::vector<Vector2> baseEntityScales;
-		std::vector<Number> baseRotateAngles;
-		Vector2 groupCenterPoint;
-		Number groupRoll;
-		Number baseAngle;
-	
-		ScenePrimitive *placingShape;	
-		Vector2 placingAnchor;
-		
-		ScenePrimitive *screenPreviewShape;
-		ScenePrimitive *sizePreviewShape;
-				
-		Vector2 dragOffset;
-		bool isDraggingEntity;
-		bool isScalingEntity;
-		
-
-		
-		Entity *screenTransform;
-		ScenePrimitive *screenTransformShape;
-		UIImage *transformRotator;
-
-		UIImage *transformScalerY;
-		UIImage *transformScalerX;		
-		UIImage *transformScalerXY;
-							
-		UIImage *centerImage;
-		
-		Entity *properties;
-		ScenePrimitive *propertiesBg;
-
-		Entity *viewOptions;
-		ScenePrimitive *viewOptionsBg;
-		
-		UITextInput *gridSizeInput;
-		UICheckBox *gridCheckBox;
-		
-		UICheckBox *pixelSnapBox;
-		UICheckBox *gridSnapBox;
-		
-		UICheckBox *showRefsBox;
-		
-		UITextInput *scaleInput;
-		
-		Entity *toolPalette;
-		ScenePrimitive *toolPaletteBg;
-		
-		UIImageButton *arrowToolButton;
-		UIImageButton *shapeToolButton;
-		UIImageButton *zoomToolButton;
-		UIImageButton *panToolButton;
-		UIImageButton *imageToolButton;
-		UIImageButton *textToolButton;
-		UIImageButton *parentToolButton;
-		UIImageButton *entityToolButton;
-		UIImageButton *soundToolButton;
-		UIImageButton *spriteToolButton;
-		UIImageButton *particlesToolButton;
-				
-		UIImageButton *linkToolButton;
-						
-		UIComboBox *aspectComboBox;
-		UIComboBox *zoomComboBox;
-		
-		UIButton *moveUpButton;
-		UIButton *moveDownButton;
-		UIButton *moveTopButton;
-		UIButton *moveBottomButton;
-		UIButton *unparentButton;
-								
-		Number zooms[16];
-						
-		Number aspects[16];
-				
-		UIImage *selectorImage;
-		int mode;	
-};
-
-class EntityClipboardData {
-	public:
-		EntityClipboardData(){}
-		
-		std::vector<Entity*> entities;
-};
-
-class PolycodeScreenEditor : public PolycodeEditor {
-	public:
-		PolycodeScreenEditor();
-		virtual ~PolycodeScreenEditor();
-	
-		bool openFile(OSFileEntry filePath);
-		void Resize(int x, int y);
-		
-		String Copy(void **data);
-		void Paste(void *data, String clipboardType);
-		void destroyClipboardData(void *data, String type);
-
-		void Activate();		
-		
-		void saveCurveToObject(ObjectEntry *entry, BezierCurve *curve);
-		void saveEntityToObjectEntry(Entity *entity, ObjectEntry *entry);
-		void saveFile();
-		
-		void doAction(String actionName, PolycodeEditorActionData *data);
-					
-		void handleDroppedFile(OSFileEntry file, Number x, Number y);
-
-		void handleEvent(Event *event);
-
-	protected:
-
-		UIHSizer *mainSizer;
-		PropertiesSizer *propSizer;
-		EntityTreeView *treeView;
-		PolycodeScreenEditorMain *editorMain;
-};
-
-class PolycodeScreenEditorFactory : public PolycodeEditorFactory {
-	public:
-		PolycodeScreenEditorFactory() : PolycodeEditorFactory() { extensions.push_back("entity2d"); }
-		PolycodeEditor *createEditor() { return new PolycodeScreenEditor(); }
-};

+ 0 - 0
IDE/Contents/Resources/FileTemplates/2D/2D Entity.entity2d → IDE/Contents/Resources/FileTemplates/Graphics/Entity.entity


+ 0 - 0
IDE/Contents/Resources/FileTemplates/2D/Sprite.sprite → IDE/Contents/Resources/FileTemplates/Graphics/Sprite.sprite


BIN
IDE/Contents/Resources/Images/entity_editor/move_gizmo.png


BIN
IDE/Contents/Resources/Images/entity_editor/new_entity.png


BIN
IDE/Contents/Resources/Images/entity_editor/rotate_gizmo.png


BIN
IDE/Contents/Resources/Images/entity_editor/scale_gizmo.png


BIN
IDE/Contents/Resources/Images/entity_editor/sidebar.png


BIN
IDE/Contents/Resources/Images/entity_editor/siderbar_separator.png


+ 182 - 0
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -0,0 +1,182 @@
+/*
+ Copyright (C) 2012 by Ivan Safrin
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+ 
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+ */
+ 
+#include "PolycodeEntityEditor.h"
+
+TransformGizmo::TransformGizmo() : Entity() {
+		
+	SceneMesh *yLine = new SceneMesh(Mesh::LINE_MESH);	
+	Polycode::Polygon *poly = new Polycode::Polygon();
+	poly->addVertex(0.0, 0.0, 0.0);
+	poly->addVertex(0.0, 1.0, 0.0);	
+	yLine->getMesh()->addPolygon(poly);
+	yLine->getMesh()->dirtyArrays();
+	yLine->depthTest = false;
+	yLine->setColor(0.0, 1.0, 0.0, 1.0);
+	addChild(yLine);
+
+	SceneMesh *xLine = new SceneMesh(Mesh::LINE_MESH);	
+	poly = new Polycode::Polygon();
+	poly->addVertex(0.0, 0.0, 0.0);
+	poly->addVertex(1.0, 0.0, 0.0);	
+	xLine->getMesh()->addPolygon(poly);
+	xLine->getMesh()->dirtyArrays();
+	xLine->depthTest = false;
+	xLine->setColor(1.0, 0.0, 0.0, 1.0);
+	addChild(xLine);
+
+	SceneMesh *zLine = new SceneMesh(Mesh::LINE_MESH);	
+	poly = new Polycode::Polygon();
+	poly->addVertex(0.0, 0.0, 0.0);
+	poly->addVertex(0.0, 0.0, 1.0);	
+	zLine->getMesh()->addPolygon(poly);
+	zLine->getMesh()->dirtyArrays();
+	zLine->depthTest = false;
+	zLine->setColor(0.0, 0.0, 1.0, 1.0);
+	addChild(zLine);
+	
+	ScenePrimitive *yArrow = new ScenePrimitive(ScenePrimitive::TYPE_CONE, 0.2, 0.05, 12);
+	yArrow->setColor(0.0, 1.0, 0.0, 1.0);
+	yArrow->setPosition(0.0, 1.0, 0.0);
+	addChild(yArrow);
+	
+	ScenePrimitive *xArrow = new ScenePrimitive(ScenePrimitive::TYPE_CONE, 0.2, 0.05, 12);
+	xArrow->setColor(1.0, 0.0, 0.0, 1.0);
+	xArrow->setPosition(1.0, 0.0, 0.0);
+	xArrow->Roll(-90);
+	addChild(xArrow);
+
+	ScenePrimitive *zArrow = new ScenePrimitive(ScenePrimitive::TYPE_CONE, 0.2, 0.05, 12);
+	zArrow->setColor(0.0, 0.0, 1.0, 1.0);
+	zArrow->setPosition(0.0, 0.0, 1.0);
+	zArrow->Pitch(90);
+	addChild(zArrow);
+	
+}
+
+TransformGizmo::~TransformGizmo() {
+
+}
+
+EntityEditorMainView::EntityEditorMainView() {
+	processInputEvents = true;
+
+	mainScene = new Scene(Scene::SCENE_3D, true);		
+	renderTexture = new SceneRenderTexture(mainScene, mainScene->getDefaultCamera(), 512, 512);
+	mainScene->clearColor.setColor(0.2, 0.2, 0.2, 1.0);	
+	mainScene->useClearColor = true;
+	mainScene->rootEntity.processInputEvents = true;
+	
+	renderTextureShape = new UIRect(256, 256);
+	renderTextureShape->setAnchorPoint(-1.0, -1.0, 0.0);	
+	renderTextureShape->setTexture(renderTexture->getTargetTexture());
+	addChild(renderTextureShape);
+	renderTextureShape->setPosition(0, 30);
+	
+	sideBar = new Entity();
+	addChild(sideBar);
+	sideBar->setPosition(0, 30);
+	
+	UIImage *sidebarBg = new UIImage("Images/entity_editor/sidebar.png");
+	sideBar->addChild(sidebarBg);
+	
+	headerBg = new UIRect(10,10);
+	addChild(headerBg);
+	headerBg->setAnchorPoint(-1.0, -1.0, 0.0);
+	headerBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderBgColor"));
+	
+	
+	mainScene->getDefaultCamera()->setPosition(10, 10, 10);
+	mainScene->getDefaultCamera()->lookAt(Vector3());
+			
+	// TEMPORARY!	
+	
+	ScenePrimitive  *testCube = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 3.0, 1.0, 1.0);
+	testCube->processInputEvents = true;
+	testCube->setColor(0.5, 0.5, 0.5, 1.0);
+//	testCube->setPosition(5, 7, 2);
+	mainScene->addChild(testCube);
+	testCube->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
+	testCube->wireFrameColor = Color(1.0, 0.8, 0.3, 1.0);
+	
+	transformGizmo = new TransformGizmo();
+	mainScene->addChild(transformGizmo);
+	
+}
+
+void EntityEditorMainView::Update() {
+	Number scale = transformGizmo->getPosition().distance(mainScene->getDefaultCamera()->getPosition()) * 0.1;
+	transformGizmo->setScale(scale, scale, scale);
+}
+
+void EntityEditorMainView::handleEvent(Event *event) {
+	if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN ) {
+		InputEvent *inputEvent = (InputEvent*) event;
+		if(inputEvent->mouseButton == CoreInput::MOUSE_BUTTON1) {
+			Entity* targetEntity = (Entity*) event->getDispatcher();
+			
+			transformGizmo->setPosition(targetEntity->getConcatenatedMatrix().getPosition());
+			
+			SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
+			if(sceneMesh) {
+				sceneMesh->overlayWireframe = true;
+			}
+		}
+	}
+}
+
+EntityEditorMainView::~EntityEditorMainView() {
+	
+}
+			
+void EntityEditorMainView::Resize(Number width, Number height) {
+	headerBg->Resize(width, 30);
+	
+	mainScene->sceneMouseAdjust.x = renderTextureShape->getScreenPositionForMainCamera().x;
+	mainScene->sceneMouseAdjust.y = CoreServices::getInstance()->getCore()->getYRes() - (renderTextureShape->getScreenPositionForMainCamera().y + renderTextureShape->getHeight());
+	
+	renderTexture->resizeRenderTexture(width, height-30);
+	renderTextureShape->setTexture(renderTexture->getTargetTexture());		
+	renderTextureShape->Resize(width, height-30);
+}
+
+PolycodeEntityEditor::PolycodeEntityEditor() : PolycodeEditor(true){
+	mainSizer = new UIHSizer(300, 300, 200, false);
+	addChild(mainSizer);
+	
+	mainView = new EntityEditorMainView();
+	mainSizer->addLeftChild(mainView);
+}
+
+PolycodeEntityEditor::~PolycodeEntityEditor() {
+}
+
+bool PolycodeEntityEditor::openFile(OSFileEntry filePath) {	
+	PolycodeEditor::openFile(filePath);	
+	return true;
+}
+
+void PolycodeEntityEditor::Resize(int x, int y) {
+	mainSizer->Resize(x, y);
+	PolycodeEditor::Resize(x,y);
+}
+

+ 2 - 1
IDE/Contents/Source/PolycodeIDEApp.cpp

@@ -141,7 +141,8 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	editorManager->registerEditorFactory(new PolycodeProjectEditorFactory(projectManager));
 	editorManager->registerEditorFactory(new PolycodeSpriteEditorFactory());
 	editorManager->registerEditorFactory(new PolycodeMeshEditorFactory());
-		
+	editorManager->registerEditorFactory(new PolycodeEntityEditorFactory());
+			
 	screen->addChild(globalMenu);	
 				
 	frame->console->applyTheme();

+ 0 - 3030
IDE/Contents/Source/PolycodeScreenEditor.cpp

@@ -1,3030 +0,0 @@
-/*
- Copyright (C) 2012 by Ivan Safrin
- 
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- 
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- 
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- */
- 
-#include "PolycodeScreenEditor.h"
-#include "PolycodeFrame.h"
-
-extern UIColorPicker *globalColorPicker;
-extern PolycodeFrame *globalFrame;
-extern UIGlobalMenu *globalMenu;
-
-PolycodeScreenEditorActionDataEntry::PolycodeScreenEditorActionDataEntry(Entity *entity) {
-	this->entity = entity;
-	this->parentEntity = (Entity*)entity->getParentEntity();
-}
-
-PolycodeScreenEditorActionDataEntry::PolycodeScreenEditorActionDataEntry(Vector3 vec3, Number number) {
-	this->vec3 = vec3;
-	this->number = number;	
-}
-
-PolycodeScreenEditorActionDataEntry::PolycodeScreenEditorActionDataEntry(Vector3 vec3) {
-	this->vec3 = vec3;
-}
-
-PolycodeScreenEditorActionDataEntry::PolycodeScreenEditorActionDataEntry(Number number) {
-	this->number = number;
-}
-
-EntityNameDisplay::EntityNameDisplay(Entity *targetEntity) : Entity() {
-	label = new SceneLabel(targetEntity->id, 10, "mono");
-	label->setColor(1.0, 1.0, 0.0, 1.0);
-	label->setPosition(10, -20);
-	
-	tagsLabel = new SceneLabel(targetEntity->id, 10, "mono");
-	tagsLabel->setColor(1.0, 0.0, 1.0, 1.0);
-	tagsLabel->setPosition(10, 20);
-
-	
-	addChild(label);
-	addChild(tagsLabel);
-	
-	editorOnly = true;
-	this->targetEntity = targetEntity;
-	
-}
-
-void EntityNameDisplay::Update() {
-	label->setText(targetEntity->id);
-	
-	String tagString = "";
-	for(int i=0; i < targetEntity->getNumTags(); i++) {
-		if(i != 0) {
-			tagString += ",";
-		}
-		tagString += targetEntity->getTagAtIndex(i);
-	}
-	tagsLabel->setText(tagString);
-	
-}
-
-EntityNameDisplay::~EntityNameDisplay() {
-
-}
-
-EntityTreeView::EntityTreeView(Entity *rootEntity) : UIElement() {
-
-	this->rootEntity = rootEntity;
-
-	targetLayer = NULL;
-
-	bg = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE,10,10);
-	addChild(bg);
-	bg->setAnchorPoint(-1.0, -1.0, 0.0);
-	bg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderBgColor"));
-	bg->blockMouseInput = true;
-	bg->processInputEvents = true;
-	
-	headerBg = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE,10,10);
-	addChild(headerBg);
-	headerBg->setAnchorPoint(-1.0, -1.0, 0.0);
-	headerBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderBgColor"));
-	
-	SceneLabel *label = new SceneLabel("TREE VIEW", 18, "section", Label::ANTIALIAS_FULL);
-	label->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderFontColor"));
-	addChild(label);
-	label->setPosition(10, 3);
-	
-	treeContainer = new UITreeContainer("Images/entity_icon.png", L"Entity", 200, 555);
-	treeContainer->getRootNode()->toggleCollapsed();
-	treeContainer->getRootNode()->addEventListener(this, UITreeEvent::SELECTED_EVENT);
-	treeContainer->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-	treeContainer->setPosition(0, 30);
-	
-	EntityBrowserData *data = new EntityBrowserData();
-	data->entity = rootEntity;
-	treeContainer->getRootNode()->setUserData((void*) data)	;	
-	
-	addChild(treeContainer);	
-	
-	newLayerButton = new UIImageButton("Images/new_layer.png");
-	addChild(newLayerButton);
-
-	targetLayerButton = new UIImageButton("Images/target_layer.png");
-	addChild(targetLayerButton);
-
-	
-	dontSendSelectionEvent = false;
-	
-}
-
-void EntityTreeView::setRootEntity(Entity *entity) {
-	rootEntity = entity;
-	EntityBrowserData *oldData = (EntityBrowserData*)treeContainer->getRootNode()->getUserData();
-	if(oldData)
-		delete oldData;
-	
-	EntityBrowserData *data = new EntityBrowserData();
-	data->entity = rootEntity;
-	treeContainer->getRootNode()->setUserData((void*) data)	;	
-}
-
-void EntityTreeView::syncNodeToEntity(UITree *node, Entity *entity) {
-
-	// remove non existing and set proper ids, 
-	
-	std::vector<UITree*> nodesToRemove;
-
-	for(int i=0; i < node->getNumTreeChildren(); i++) {
-		UITree *child = node->getTreeChild(i);
-		
-		bool hasChild = false;
-		for(int j=0; j < entity->getNumChildren(); j++) {
-			if(!entity->getChildAtIndex(j)->editorOnly) {
-			if(((EntityBrowserData*)child->getUserData())->entity == entity->getChildAtIndex(j)) {
-				hasChild = true;
-				
-				String entityName = entity->getChildAtIndex(j)->id;
-				if(entity->getChildAtIndex(j) == targetLayer) {
-					entityName += " (current)";
-				}
-				
-				if(child->getLabelText() != entityName) {
-					child->setLabelText(entityName);
-				}
-				
-				if(entity->getChildAtIndex(j) == selectedEntity) {
-					dontSendSelectionEvent = true;				
-					child->setSelected();
-				}
-				
-			}
-			}
-		}
-
-		if(!hasChild) {
-			nodesToRemove.push_back(child);
-		}
-	}
-	
-	for(int i=0; i < nodesToRemove.size(); i++) {
-		node->removeTreeChild(nodesToRemove[i]);
-	}
-	
-	std::vector<Entity*> entitiesToAdd;
-	
-	for(int j=0; j < entity->getNumChildren(); j++) {	
-		if(!entity->getChildAtIndex(j)->editorOnly) {	
-		bool hasEntity = false;			
-		for(int i=0; i < node->getNumTreeChildren(); i++) {
-			UITree *child = node->getTreeChild(i);
-			if(((EntityBrowserData*)child->getUserData())->entity == entity->getChildAtIndex(j)) {
-				hasEntity = true;
-			}
-		}
-		
-		if(!hasEntity) {
-			entitiesToAdd.push_back(entity->getChildAtIndex(j));
-		}
-		}
-	}
-	
-	for(int i=0; i < entitiesToAdd.size(); i++) {
-	
-		String entityName = entitiesToAdd[i]->id;
-		if(entitiesToAdd[i] == targetLayer) {
-			entityName += " (current)";
-		}
-	
-		UITree *newNode = node->addTreeChild("Images/entity_icon.png", entityName);
-		EntityBrowserData *data = new EntityBrowserData();
-		data->entity = entitiesToAdd[i];		
-		newNode->setUserData((void*)data);				
-		
-		if(entitiesToAdd[i] == selectedEntity) {
-			dontSendSelectionEvent = true;
-			newNode->setSelected();
-		}
-	}
-	
-	for(int i=0; i < node->getNumTreeChildren(); i++) {
-		UITree *child = node->getTreeChild(i);
-		syncNodeToEntity(child, ((EntityBrowserData*)child->getUserData())->entity);
-	}
-}
-
-void EntityTreeView::Refresh() {
-	syncNodeToEntity(treeContainer->getRootNode(), rootEntity);
-}
-
-void EntityTreeView::handleEvent(Event *event) {
-	
-	if(event->getDispatcher() == treeContainer->getRootNode()) {
-		if(event->getEventCode() == UITreeEvent::SELECTED_EVENT){ 			
-			if(!dontSendSelectionEvent) {
-				EntityBrowserData *data = (EntityBrowserData *)treeContainer->getRootNode()->getSelectedNode()->getUserData();
-				selectedEntity =  data->entity;
-				dispatchEvent(new Event(), Event::CHANGE_EVENT);
-			}
-			dontSendSelectionEvent = false;
-		}
-	}
-//
-//	if(event->getEventCode() == Event::CHANGE_EVENT && event->getEventType() == "Event") {
-//		for(int i=0; i < layers.size(); i++) {
-//			if(event->getDispatcher() == layers[i]) {
-//				currentLayer->setSelected(false);
-//				layers[i]->setSelected(true);
-//				currentLayer = layers[i];				
-//				dispatchEvent(new Event(), Event::CHANGE_EVENT);
-//			}
-//		}
-//	}
-/*
-	if(event->getDispatcher() == treeContainer->getRootNode()) {
-		if(event->getEventCode() == UITreeEvent::SELECTED_EVENT){ 
-			selectedNode = treeContainer->getRootNode()->getSelectedNode();			
-			MaterialBrowserData *data = (MaterialBrowserData *)selectedNode->getUserData();
-			selectedData =  data;
-			dispatchEvent(new Event(), Event::CHANGE_EVENT);
-		}
-	}
-	*/
-	Entity::handleEvent(event);
-}
-
-
-EntityTreeView::~EntityTreeView() {
-
-}
-
-
-void EntityTreeView::Resize(Number width, Number height) {
-	setWidth(width);
-	setHeight(height);
-	
-	bg->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, width, height);
-	headerBg->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, width, 30);
-	
-	newLayerButton->setPosition(width- 30, 3);		
-	targetLayerButton->setPosition(width- 55, 3);	
-		
-	treeContainer->Resize(width, height-30);
-}
-
-
-PolycodeScreenEditorMain::PolycodeScreenEditorMain(PolycodeEditor *editor) {
-	this->editor = editor;
-	firstMove = false;
-
-	multiSelect = false;
-	currentLayer = NULL;
-	treeView = NULL;
-	placementCount = 0;
-	beforeData = NULL;
-	
-	currentLayer = NULL;
-	
-	Config *conf = CoreServices::getInstance()->getConfig();	
-	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
-
-	isScalingEntity = false;	
-	isDraggingEntity = false; 
-		
-	baseEntity = new Entity();
-	addChild(baseEntity);
-	baseEntity->processInputEvents = true;
-		
-	baseEntity->setAnchorPoint(0.0, 0.0, 0.0);	
-
-	objectBaseEntity = new Entity();
-	baseEntity->addChild(objectBaseEntity);
-	objectBaseEntity->processInputEvents = true;
-
-	sizePreviewShape = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1, 1);
-	baseEntity->addChild(sizePreviewShape);
-	sizePreviewShape->setColor(1.0, 1.0, 1.0, 0.0);
-	
-	screenPreviewShape = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1, 1);
-	baseEntity->addChild(screenPreviewShape);
-	screenPreviewShape->setColor(1.0, 1.0, 1.0, 0.0);
-
-	layerBaseEntity = new Entity();
-	layerBaseEntity->processInputEvents = true;
-	objectBaseEntity->addChild(layerBaseEntity);
-	
-	setCurrentLayer(layerBaseEntity);
-
-	placingPreviewEntity = new Entity();
-	objectBaseEntity->addChild(placingPreviewEntity);
-	
-	previewEntity = new UIImage("Images/ScreenEditor/entity_marker.png");
-	placingPreviewEntity->addChild(previewEntity);
-	previewEntity->setAnchorPoint(0.0, 0.0, 0.0);
-	previewEntity->billboardMode = true;
-	previewEntity->billboardIgnoreScale = true;
-	
-	previewSound = new SceneSound("test.wav", 50, 100);
-	placingPreviewEntity->addChild(previewSound);
-				
-	createSoundRef(previewSound);
-
-	
-	previewEmitter = new SceneParticleEmitter("default.png", Particle::BILLBOARD_PARTICLE, ParticleEmitter::CONTINUOUS_EMITTER, 2.0, 30, Vector3(0.0, -40.0, 0.0), Vector3(0.0, 0.0, 0.0), Vector3(0.0, 0.0, 0.0), Vector3(10.0, 10.0, 0.0));
-	placingPreviewEntity->addChild(previewEmitter);
-	createParticleRef(previewEmitter);
-	
-	previewShape = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 100, 100);
-	placingPreviewEntity->addChild(previewShape);
-	previewShape->setColor(1.0, 1.0, 1.0, 0.5);
-
-	previewLabel = new SceneLabel("Text", 24);
-	previewLabel->setAnchorPoint(0.0, 0.0, 0.0);
-	placingPreviewEntity->addChild(previewLabel);
-	previewLabel->setColor(1.0, 1.0, 1.0, 0.5);
-	previewLabel->positionAtBaseline = false;
-
-	previewSprite = new SceneSprite("default/default.sprite");
-	previewSprite->setAnchorPoint(0.0, 0.0, 0.0);	
-	placingPreviewEntity->addChild(previewSprite);
-	previewSprite->setColor(1.0, 1.0, 1.0, 0.5);
-	previewSprite->getResourceEntry()->reloadOnFileModify = true;
-		
-	previewImage = new UIImage("default.png");
-	previewImage->setAnchorPoint(0.0, 0.0, 0.0);
-	placingPreviewEntity->addChild(previewImage);
-	previewImage->setColor(1.0, 1.0, 1.0, 0.5);
-
-	previewInstance = new SceneEntityInstance("default/default.entity2d");
-	previewInstance->setAnchorPoint(0.0, 0.0, 0.0);
-	placingPreviewEntity->addChild(previewInstance);
-	previewInstance->setColor(1.0, 1.0, 1.0, 0.5);
-	previewInstance->getResourceEntry()->reloadOnFileModify = true;
-	previewInstance->getResourceEntry()->addEventListener(this, Event::RESOURCE_RELOAD_EVENT);
-	
-	CoreServices::getInstance()->getResourceManager()->addResource(previewInstance->getResourceEntry());	
-	CoreServices::getInstance()->getResourceManager()->addResource(previewSprite->getResourceEntry());	
-	
-	grid = false;
-	setGrid(16);
-	
-	gridSnap = false;
-	pixelSnap = true;
-
-	centerImage = new UIImage("Images/ScreenEditor/screenCenter.png");
-	centerImage->setAnchorPoint(0.0, 0.0, 0.0);
-	baseEntity->addChild(centerImage);
-	
-	baseEntity->setPosition(256,256);
-	firstResize = true;
-	
-	baseEntity->setWidth(20000);
-	baseEntity->setHeight(20000);
-		
-
-	CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
-	CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_KEYUP);
-
-	baseEntity->addEventListener(this, InputEvent::EVENT_MOUSEUP);
-	baseEntity->addEventListener(this, InputEvent::EVENT_MOUSEUP_OUTSIDE);
-	baseEntity->addEventListener(this, InputEvent::EVENT_MOUSEMOVE);
-	baseEntity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-	baseEntity->addEventListener(this, InputEvent::EVENT_MOUSEOUT);
-	baseEntity->processInputEvents = true;
-
-
-	screenTransformShape = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 10, 10);
-//	screenTransformShape->strokeColor = Color(0.0, 0.3, 1.0, 1.0);
-	screenTransformShape->lineSmooth = true;
-//	screenTransformShape->strokeEnabled = true;
-	screenTransformShape->setColor(1.0, 1.0, 1.0, 0.0);
-	baseEntity->addChild(screenTransformShape);		
-
-
-	screenTransform = new Entity();
-	baseEntity->addChild(screenTransform);	
-	screenTransform->visible = false;
-	screenTransform->processInputEvents = true;
-	
-	CoreServices::getInstance()->getRenderer()->setTextureFilteringMode(Renderer::TEX_FILTERING_LINEAR);
-	
-	UIImage *base = new UIImage("Images/ScreenEditor/transform_base.png");
-	base->setAnchorPoint(0.0, 0.0, 0.0);
-	screenTransform->addChild(base);
-	
-	transformRotator = new UIImage("Images/ScreenEditor/transform_rotator.png");
-	transformRotator->setAnchorPoint(0.0, 0.0, 0.0);
-	transformRotator->setPosition(-40, 40);
-	screenTransform->addChild(transformRotator);
-	transformRotator->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-	transformRotator->processInputEvents = true;
-	transformRotator->blockMouseInput = true;
-
-	transformScalerY = new UIImage("Images/ScreenEditor/transform_scaler.png");
-	transformScalerY->setColor(0.0, 0.5, 1.0, 0.7);
-	transformScalerY->setAnchorPoint(0.0, 0.0, 0.0);
-	transformScalerY->setPosition(0, -50);
-	screenTransform->addChild(transformScalerY);	
-	transformScalerY->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-	transformScalerY->processInputEvents = true;
-	transformScalerY->blockMouseInput = true;
-	transformScalerY->setScale(0.7, 0.7);
-	
-	transformScalerX = new UIImage("Images/ScreenEditor/transform_scaler.png");
-	transformScalerX->setColor(1.0, 0.5, 0.0, 0.7);
-	transformScalerX->setAnchorPoint(0.0, 0.0, 0.0);
-	transformScalerX->setRoll(90);
-	transformScalerX->setPosition(50, 0);
-	screenTransform->addChild(transformScalerX);	
-	transformScalerX->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-	transformScalerX->processInputEvents = true;
-	transformScalerX->blockMouseInput = true;
-	transformScalerX->setScale(0.7, 0.7);
-		
-	transformScalerXY = new UIImage("Images/ScreenEditor/transform_scaler.png");
-	transformScalerXY->setColor(1.0, 1.0, 1.0, 0.7);
-	transformScalerXY->setAnchorPoint(0.0, 0.0, 0.0);
-	transformScalerXY->setRoll(-45);
-	transformScalerXY->setPosition(40, -40);
-	screenTransform->addChild(transformScalerXY);
-	transformScalerXY->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-	transformScalerXY->processInputEvents = true;
-	transformScalerXY->blockMouseInput = true;
-	
-	
-	
-	CoreServices::getInstance()->getRenderer()->setTextureFilteringMode(Renderer::TEX_FILTERING_NEAREST);
-	
-	viewOptions = new Entity();
-	addChild(viewOptions);
-	viewOptions->processInputEvents = true;
-	viewOptions->blockMouseInput = true;
-			
-	viewOptionsBg = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 20,20);
-	viewOptionsBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderBgColor"));
-	viewOptionsBg->setAnchorPoint(-1.0, -1.0, 0.0);
-	viewOptions->addChild(viewOptionsBg);
-	
-	viewOptionsBg->blockMouseInput = true;
-	viewOptionsBg->processInputEvents = true;
-	
-
-	SceneLabel *label = new SceneLabel("GRID", 18, "section", Label::ANTIALIAS_FULL);
-	label->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderFontColor"));
-	viewOptions->addChild(label);
-	label->setPosition(10, 3);
-	
-	gridSizeInput = new UITextInput(false, 40, 12);
-	gridSizeInput->setText("16");
-	viewOptions->addChild(gridSizeInput);
-	gridSizeInput->setPosition(60, 4);
-	gridSizeInput->addEventListener(this, UIEvent::CHANGE_EVENT);
-	
-	gridCheckBox = new UICheckBox("On", true);
-	gridCheckBox->addEventListener(this, UIEvent::CHANGE_EVENT);
-	viewOptions->addChild(gridCheckBox);
-	gridCheckBox->setPosition(115, 5);
-
-	label = new SceneLabel("SNAP", 18, "section", Label::ANTIALIAS_FULL);
-	label->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderFontColor"));
-	viewOptions->addChild(label);
-	label->setPosition(180, 3);
-
-	pixelSnapBox = new UICheckBox("Pixel", true);
-	pixelSnapBox->addEventListener(this, UIEvent::CHANGE_EVENT);	
-	viewOptions->addChild(pixelSnapBox);
-	pixelSnapBox->setPosition(230, 5);
-
-	gridSnapBox = new UICheckBox("Grid", true);
-	gridSnapBox->addEventListener(this, UIEvent::CHANGE_EVENT);
-	viewOptions->addChild(gridSnapBox);
-	gridSnapBox->setPosition(290, 5);
-	gridSnapBox->setChecked(false);
-	
-	label = new SceneLabel("SHOW", 18, "section", Label::ANTIALIAS_FULL);
-	label->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderFontColor"));
-	viewOptions->addChild(label);
-	label->setPosition(360, 3);
-	
-	showRefsBox = new UICheckBox("Refs", true);
-	showRefsBox->addEventListener(this, UIEvent::CHANGE_EVENT);
-	viewOptions->addChild(showRefsBox);
-	showRefsBox->setPosition(420, 5);	
-		
-	properties = new Entity();
-	addChild(properties);
-	properties->processInputEvents = true;
-	properties->blockMouseInput = true;
-			
-	propertiesBg = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 20,20);
-	propertiesBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderBgColor"));
-	propertiesBg->setAnchorPoint(-1.0, -1.0, 0.0);
-	properties->addChild(propertiesBg);
-	propertiesBg->blockMouseInput = true;
-	propertiesBg->processInputEvents = true;
-	
-	label = new SceneLabel("SCREEN RATIO", 18, "section", Label::ANTIALIAS_FULL);
-	label->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderFontColor"));
-	properties->addChild(label);
-	label->setPosition(10, 3);
-	
-	scaleInput = new UITextInput(false, 70, 12);
-	scaleInput->setText("1.0");
-	properties->addChild(scaleInput);
-	scaleInput->setPosition(140, 4);
-	scaleInput->addEventListener(this, UIEvent::CHANGE_EVENT);
-	
-	label = new SceneLabel("PREVIEW ASPECT", 18, "section", Label::ANTIALIAS_FULL);
-	label->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderFontColor"));
-	properties->addChild(label);
-	label->setPosition(230, 3);
-	
-	aspectComboBox = new UIComboBox(globalMenu, 80);
-	aspectComboBox->addComboItem("4:3");
-	aspectComboBox->addComboItem("16:9");
-	aspectComboBox->addComboItem("16:10");
-	aspectComboBox->addComboItem("3:2");
-	aspectComboBox->addComboItem("1:1");
-	
-	aspectComboBox->addEventListener(this, UIEvent::CHANGE_EVENT);
-	
-	aspects[0] = 4.0/3.0;
-	aspects[1] = 16.0/9.0;
-	aspects[2] = 16/10.0;
-	aspects[3] = 3.0/2.0;
-	aspects[4] = 1.0;
-							
-	aspectComboBox->setSelectedIndex(0);
-	properties->addChild(aspectComboBox);
-	aspectComboBox->setPosition(380, 2);
-			
-	label = new SceneLabel("ZOOM", 18, "section", Label::ANTIALIAS_FULL);
-	label->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiHeaderFontColor"));
-	properties->addChild(label);
-	label->setPosition(470, 3);
-			
-	zoomComboBox = new UIComboBox(globalMenu, 80);
-	zoomComboBox->addComboItem("8:1");
-	zoomComboBox->addComboItem("4:1");
-	zoomComboBox->addComboItem("2:1");
-	zoomComboBox->addComboItem("1:1");
-	zoomComboBox->addComboItem("1:2");
-	zoomComboBox->addComboItem("1:4");
-	zoomComboBox->addComboItem("1:8");
-	zoomComboBox->addComboItem("Free");
-	
-	zooms[0] = 8.0;
-	zooms[1] = 4.0;
-	zooms[2] = 2.0;
-	zooms[3] = 1.0;
-	zooms[4] = 1.0/2.0;
-	zooms[5] = 1.0/4.0;
-	zooms[6] = 1.0/8.0;						
-							
-	zoomComboBox->setSelectedIndex(3);
-	
-	zoomComboBox->addEventListener(this, UIEvent::CHANGE_EVENT);	
-	properties->addChild(zoomComboBox);
-	zoomComboBox->setPosition(530, 2);
-			
-	toolPalette = new Entity();
-	toolPalette->setPosition(0, 30);
-	toolPalette->processInputEvents = true;
-	toolPalette->blockMouseInput = true;
-	addChild(toolPalette);
-	
-	toolPaletteBg = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 80, 20);
-	toolPaletteBg->setAnchorPoint(-1.0, -1.0, 0.0);
-	toolPaletteBg->color.setColorHexFromString(CoreServices::getInstance()->getConfig()->getStringValue("Polycode", "uiSmallHeaderBgColor"));
-	toolPalette->addChild(toolPaletteBg);
-	toolPaletteBg->processInputEvents = true;
-	toolPaletteBg->blockMouseInput = true;
-	Number yOffset = 15.0;
-		
-	selectorImage = new UIImage("Images/ScreenEditor/selector.png");
-	selectorImage->setColor(0.0, 0.0, 0.0, 0.3);
-	toolPalette->addChild(selectorImage);
-	
-	arrowToolButton = new UIImageButton("Images/ScreenEditor/arrow.png");
-	arrowToolButton->addEventListener(this, UIEvent::CLICK_EVENT);
-	toolPalette->addChild(arrowToolButton);
-	arrowToolButton->setPosition(12, yOffset);
-
-	imageToolButton = new UIImageButton("Images/ScreenEditor/image.png");
-	toolPalette->addChild(imageToolButton);
-	imageToolButton->addEventListener(this, UIEvent::CLICK_EVENT);		
-	imageToolButton->setPosition(42, yOffset);
-
-	entityToolButton = new UIImageButton("Images/ScreenEditor/screen_entity.png");
-	toolPalette->addChild(entityToolButton);
-	entityToolButton->addEventListener(this, UIEvent::CLICK_EVENT);		
-	entityToolButton->setPosition(72, yOffset);
-
-
-	yOffset += 32;
-	
-	textToolButton = new UIImageButton("Images/ScreenEditor/text.png");
-	toolPalette->addChild(textToolButton);
-	textToolButton->addEventListener(this, UIEvent::CLICK_EVENT);		
-	textToolButton->setPosition(12, yOffset);
-
-	shapeToolButton = new UIImageButton("Images/ScreenEditor/shape.png");
-	toolPalette->addChild(shapeToolButton);
-	shapeToolButton->addEventListener(this, UIEvent::CLICK_EVENT);	
-	shapeToolButton->setPosition(42, yOffset);
-
-	soundToolButton = new UIImageButton("Images/ScreenEditor/screen_sound.png");
-	toolPalette->addChild(soundToolButton);
-	soundToolButton->addEventListener(this, UIEvent::CLICK_EVENT);	
-	soundToolButton->setPosition(72, yOffset);
-
-
-	yOffset += 32;
-	
-	zoomToolButton = new UIImageButton("Images/ScreenEditor/zoom.png");
-	toolPalette->addChild(zoomToolButton);
-	zoomToolButton->addEventListener(this, UIEvent::CLICK_EVENT);		
-	zoomToolButton->setPosition(12, yOffset);
-
-	panToolButton = new UIImageButton("Images/ScreenEditor/pan.png");
-	toolPalette->addChild(panToolButton);
-	panToolButton->addEventListener(this, UIEvent::CLICK_EVENT);		
-	panToolButton->setPosition(42, yOffset);
-	
-	parentToolButton = new UIImageButton("Images/ScreenEditor/link.png");
-	toolPalette->addChild(parentToolButton);
-	parentToolButton->addEventListener(this, UIEvent::CLICK_EVENT);		
-	parentToolButton->setPosition(72, yOffset);
-
-	yOffset += 32;
-	
-	linkToolButton = new UIImageButton("Images/link_entity.png");
-	toolPalette->addChild(linkToolButton);
-	linkToolButton->addEventListener(this, UIEvent::CLICK_EVENT);		
-	linkToolButton->setPosition(12, yOffset);	
-
-	spriteToolButton = new UIImageButton("Images/ScreenEditor/sprite_icon.png");
-	toolPalette->addChild(spriteToolButton);
-	spriteToolButton->addEventListener(this, UIEvent::CLICK_EVENT);		
-	spriteToolButton->setPosition(42, yOffset);	
-
-	particlesToolButton = new UIImageButton("Images/particle_system_icon.png");
-	toolPalette->addChild(particlesToolButton);
-	particlesToolButton->addEventListener(this, UIEvent::CLICK_EVENT);		
-	particlesToolButton->setPosition(72, yOffset);	
-
-
-	yOffset += 64;
-
-	moveUpButton = new UIButton("Move Up", 90);
-	moveUpButton->addEventListener(this, UIEvent::CLICK_EVENT);	
-	moveUpButton->setPosition(5, yOffset);
-	toolPalette->addChild(moveUpButton);
-
-	yOffset += 32;	
-	moveDownButton = new UIButton("Move Down", 90);
-	moveDownButton->setPosition(5, yOffset);
-	moveDownButton->addEventListener(this, UIEvent::CLICK_EVENT);		
-	toolPalette->addChild(moveDownButton);
-
-	yOffset += 32;	
-	moveTopButton = new UIButton("Move To Front", 90);
-	moveTopButton->setPosition(5, yOffset);
-	moveTopButton->addEventListener(this, UIEvent::CLICK_EVENT);			
-	toolPalette->addChild(moveTopButton);
-
-	yOffset += 32;	
-	moveBottomButton = new UIButton("Move To Back", 90);
-	moveBottomButton->setPosition(5, yOffset);
-	moveBottomButton->addEventListener(this, UIEvent::CLICK_EVENT);				
-	toolPalette->addChild(moveBottomButton);
-
-	yOffset += 64;	
-	unparentButton = new UIButton("Unparent", 90);
-	unparentButton->setPosition(5, yOffset);
-	unparentButton->addEventListener(this, UIEvent::CLICK_EVENT);	
-	toolPalette->addChild(unparentButton);
-
-
-	selectorImage->setPosition(arrowToolButton->getPosition().x - 4, arrowToolButton->getPosition().y - 4);
-	
-	placing = false;
-	moving = false;
-	scalingY = false;
-	scalingX = false;	
-	rotating = false;
-	zooming = false;
-	panning = false;
-	
-	lastMode = MODE_SELECT;
-	
-	previewAspectRatio = aspects[0];
-	
-	
-	entityProps = new PropList();
-	
-	particleSheet = new ScreenParticleSheet();
-	particleSheet->addEventListener(this, Event::CHANGE_EVENT);	
-	particleSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);		
-	entityProps->addPropSheet(particleSheet);
-
-	spriteSheet = new SceneSpriteSheet();
-	spriteSheet->addEventListener(this, Event::CHANGE_EVENT);
-	spriteSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);	
-	entityProps->addPropSheet(spriteSheet);
-	
-	instanceSheet = new SceneEntityInstanceSheet();
-	instanceSheet->addEventListener(this, Event::CHANGE_EVENT);	
-	instanceSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
-	entityProps->addPropSheet(instanceSheet);
-
-	labelSheet = new SceneLabelSheet();
-	labelSheet->addEventListener(this, Event::CHANGE_EVENT);	
-	labelSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);	
-	entityProps->addPropSheet(labelSheet);
-
-	soundSheet = new SoundSheet();
-	entityProps->addPropSheet(soundSheet);
-	soundSheet->addEventListener(this, Event::CHANGE_EVENT);
-	soundSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
-	
-	imageSheet = new UIImageSheet();
-	entityProps->addPropSheet(imageSheet);
-	imageSheet->addEventListener(this, Event::CHANGE_EVENT);	
-	imageSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
-	
-	shapeSheet = new ShapeSheet();
-	shapeSheet->addEventListener(this, Event::CHANGE_EVENT);
-	shapeSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
-	entityProps->addPropSheet(shapeSheet);
-
-	transform2dSheet = new Transform2DSheet();
-	transform2dSheet->addEventListener(this, Event::CHANGE_EVENT);
-	transform2dSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);	
-	entityProps->addPropSheet(transform2dSheet);
-	
-	entitySheet = new EntitySheet();
-	entityProps->addPropSheet(entitySheet);
-	entitySheet->addEventListener(this, Event::CHANGE_EVENT);	
-	entitySheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
-					
-	entityPropSheet = new EntityPropSheet();
-	entityPropSheet->addEventListener(this, Event::CHANGE_EVENT);	
-	entityPropSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
-	entityProps->addPropSheet(entityPropSheet);	
-	
-	entityProps->updateProps();		
-	
-	parenting = false;
-	parentingChild = NULL;	
-	
-	parentingLine = new SceneLine(Vector3(), Vector3(0,0,0));
-	parentingLine->setLineWidth(4.0);
-	parentingLine->setColor(0.0, 0.5, 1.0, 0.5);
-	baseEntity->addChild(parentingLine);
-	
-	setMode(MODE_SELECT);	
-}
-
-void PolycodeScreenEditorMain::setGrid(int gridSize) {
-
-	this->gridSize = gridSize;
-
-	Polycode::Polygon *gridPoly = new Polycode::Polygon();
-	int gridLen = 300;
-	
-	for(int x=0; x < gridLen+1; x++) {
-		gridPoly->addVertex(x * gridSize,0, 0);
-		gridPoly->addVertex(x * gridSize,gridSize * gridLen, 0);		
-	}
-
-	for(int y=0; y < gridLen+1; y++) {
-		gridPoly->addVertex(0, y * gridSize, 0);
-		gridPoly->addVertex(gridSize * gridLen, y * gridSize, 0);		
-	}	
-
-	if(grid) {
-		grid->getMesh()->clearMesh();
-		grid->getMesh()->addPolygon(gridPoly);
-	} else {
-		Mesh *gridMesh = new Mesh(Mesh::LINE_MESH);
-		gridMesh->addPolygon(gridPoly);
-	
-		grid = new SceneMesh(gridMesh);
-		grid->setColor(1.0, 1.0, 1.0, 0.1);
-		objectBaseEntity->addChild(grid);		
-	}
-
-	grid->setPosition(-(gridSize * gridLen)/2, -(gridSize * gridLen)/2);
-}
-
-PolycodeScreenEditorMain::~PolycodeScreenEditorMain() {
-	CoreServices::getInstance()->getCore()->getInput()->removeAllHandlersForListener(this);
-	setOwnsChildrenRecursive(true);
-}
-
-void PolycodeScreenEditorMain::doAction(String actionName, PolycodeEditorActionData *data) {
-	PolycodeScreenEditorActionData *screenData = (PolycodeScreenEditorActionData*)data;
-	if(actionName == "move") {
-		for(int i=0; i < selectedEntities.size(); i++) {
-			selectedEntities[i]->position = screenData->entries[i].vec3;
-		}
-		syncTransformToSelected();
-	} else if(actionName == "scale") {
-		for(int i=0; i < selectedEntities.size(); i++) {
-			selectedEntities[i]->scale = screenData->entries[i].vec3;
-		}	
-		syncTransformToSelected();		
-	} else if(actionName == "rotate") {
-		for(int i=0; i < selectedEntities.size(); i++) {
-			selectedEntities[i]->position = screenData->entries[i].vec3;		
-			selectedEntities[i]->setRoll(screenData->entries[i].number);
-		}
-		syncTransformToSelected();			
-	} else if(actionName == "select") {
-			selectEntity(NULL, false);	
-			if(data) {
-				bool oldMultiSelect = multiSelect;
-				multiSelect = true;
-				for(int i=0; i < screenData->entries.size(); i++) {
-					selectEntity(screenData->entries[i].entity, false);
-				}					
-				multiSelect = oldMultiSelect;				
-			}
-		syncTransformToSelected();			
-	} else if(actionName == "set_current_layer") {
-		if(screenData->entry.entity) {
-			setCurrentLayer(screenData->entry.entity, false);
-		}
-	} else if(actionName == "delete") {
-		if(screenData->reverse) {
-			bool oldMultiSelect = multiSelect;
-			multiSelect = true;
-			for(int i=0; i < screenData->entries.size(); i++) {
-				screenData->entries[i].parentEntity->addChild(screenData->entries[i].entity);
-				selectEntity(screenData->entries[i].entity, false);
-			}					
-			multiSelect = oldMultiSelect;		
-		} else {
-			for(int i=0; i < screenData->entries.size(); i++) {
-				deleteEntity(screenData->entries[i].entity);
-			}					
-			selectEntity(NULL, false);
-		}
-	} else if(actionName == "paste") {
-		if(screenData->reverse) {
-			for(int i=0; i < screenData->entries.size(); i++) {
-				deleteEntity(screenData->entries[i].entity);
-			}		
-		} else {
-			bool oldMultiSelect = multiSelect;
-			multiSelect = true;
-			for(int i=0; i < screenData->entries.size(); i++) {
-				screenData->entries[i].parentEntity->addChild(screenData->entries[i].entity);
-				selectEntity(screenData->entries[i].entity, false);
-			}
-			multiSelect = oldMultiSelect;			
-		}
-		if(treeView) {
-			treeView->Refresh();		
-		}					
-	} else if(actionName == "create_entity") {	
-		if(screenData->reverse) {
-			deleteEntity(screenData->entry.entity);
-		} else {
-			screenData->entry.parentEntity->addChild(screenData->entry.entity);			
-		}
-		
-		if(treeView) {
-			treeView->Refresh();		
-		}			
-					
-	} else if(actionName == "prop_change") {
-		PolycodeEditorPropActionData *propData = (PolycodeEditorPropActionData*) data;
-		propData->sheet->applyPropActionData(propData);
-	}
-}
-
-void PolycodeScreenEditorMain::syncTransformToSelected() {
-	sizePreviewShape->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, layerBaseEntity->getWidth() * objectBaseEntity->getScale().x, layerBaseEntity->getHeight() * objectBaseEntity->getScale().x);
-
-
-	if(selectedEntities.size() == 0)
-		return;
-	
-	Entity *selectedEntity = selectedEntities[0];
-	
-	objectBaseEntity->rebuildTransformMatrix();	
-	selectedEntity->rebuildTransformMatrix();
-	
-
-	if(selectedEntities.size() == 1) {
-
-		screenTransformShape->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, selectedEntity->getWidth(),selectedEntity->getHeight());	
-		Matrix4 final = selectedEntity->getConcatenatedMatrixRelativeTo(baseEntity);
-		screenTransform->setPosition(final.getPosition());
-		screenTransformShape->dirtyMatrix(false);
-		screenTransformShape->setTransformByMatrixPure(final);		
-		screenTransform->rotation.roll = selectedEntity->getCombinedRoll();
-	} else {
-			
-		Vector3 center;
-		Number width;
-		Number height;
-		getCenterAndSizeForSelected(&center, &width, &height);
-		
-		screenTransform->setPosition(center.x, center.y);
-		screenTransformShape->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, width, height);
-		screenTransformShape->setPosition(center);
-		
-		screenTransform->rotation.roll = groupRoll * TODEGREES;
-	}
-	
-	screenTransform->rebuildTransformMatrix();
-	
-}
-
-void PolycodeScreenEditorMain::getCenterAndSizeForSelected(Vector2 *center, Number *width, Number *height) {
-		// Calculate corners transformed into base entity space and get center and 
-		// transformed bounding vertices
-		
-		std::vector<Vector3> corners;
-		
-		for(int i=0; i < selectedEntities.size(); i++) {
-			Entity *entity = selectedEntities[i];
-			Vector3 tl = Vector3(-entity->getWidth()/2.0, -entity->getHeight()/2.0, 0.0);
-			Vector3 tr = Vector3(entity->getWidth()/2.0, -entity->getHeight()/2.0, 0.0);
-			Vector3 bl = Vector3(-entity->getWidth()/2.0, entity->getHeight()/2.0, 0.0);
-			Vector3 br = Vector3(entity->getWidth()/2.0, entity->getHeight()/2.0, 0.0);
-			
-			Matrix4 final = entity->getConcatenatedMatrixRelativeTo(baseEntity);			
-			
-			tl = final * tl;
-			tr = final * tr;
-			bl = final * bl;
-			br = final * br;
-												
-			corners.push_back(tl);
-			corners.push_back(tr);
-			corners.push_back(bl);
-			corners.push_back(br);									
-		}
-		
-		Vector3 min = Vector3(3.4E+38, 3.4E+38, 0.0);
-		Vector3 max = Vector3(-3.4E+38, -3.4E+38, 0.0);		
-				
-		for(int i=0; i < corners.size(); i++) {
-			if(corners[i].x < min.x) {
-				min.x = corners[i].x;
-			}
-			if(corners[i].y < min.y) {
-				min.y = corners[i].y;
-			}
-			
-			if(corners[i].x > max.x) {
-				max.x = corners[i].x;
-			}
-			if(corners[i].y > max.y) {
-				max.y = corners[i].y;
-			}						
-		}						
-		
-		*width = fabs(max.x - min.x);
-		*height = fabs(max.y - min.y);
-
-		center->x = min.x + (*width/2.0);
-		center->y = min.y + (*height/2.0);
-
-		
-}
-
-
-void PolycodeScreenEditorMain::updateCursor() {
-	switch(mode) {
-		case MODE_SELECT:
-			CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);
-		break;
-		case MODE_IMAGE:
-		case MODE_TEXT:		
-		case MODE_SHAPE:
-		case MODE_PARENT:		
-		case MODE_ENTITY:				
-		case MODE_SOUND:
-		case MODE_LINK:
-		case MODE_SPRITE:	
-		case MODE_PARTICLES:				
-			CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_CROSSHAIR);
-		break;
-		case MODE_ZOOM:
-			CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_CROSSHAIR);		
-		break;
-		case MODE_PAN:
-			CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_OPEN_HAND);		
-		break;
-		default:
-			CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);		
-		break;
-	}
-}
-
-void PolycodeScreenEditorMain::handleMouseUp(Vector2 position) {
-
-	switch(mode) {
-		case MODE_PARENT:
-			if(parenting) {
-//				parentingLine->visible = false;
-//				parenting = false;
-			}
-		break;
-		case MODE_PAN:
-			panning = false;
-		break;
-		case MODE_ZOOM:
-		{
-			if(!zoomingMoved) {
-			
-				Number zoomChange = 2.0;
-				
-				if(CoreServices::getInstance()->getCore()->getInput()->getKeyState(KEY_LALT) ||
-					CoreServices::getInstance()->getCore()->getInput()->getKeyState(KEY_RALT)) {
-					zoomChange = 1.0/zoomChange;
-				} 
-	
-			
-				Number newScale = baseZoomScale * zoomChange;
-				if(newScale < 0.1) 
-					newScale = 0.1;
-					
-				objectBaseEntity->setScale(newScale, newScale);					
-								
-				Vector2 centerPosition = Vector2(getWidth()/2.0, getHeight()/2.0);
-				
-				Vector2 finalPosition = Vector2(				
-					((centerPosition.x)) - (zoomBaseMousePosition.x / baseZoomScale * newScale),
-					((centerPosition.y)) - (zoomBaseMousePosition.y / baseZoomScale * newScale)
-				);				
-
-				baseEntity->setPosition(finalPosition);				
-				resizePreviewScreen();
-				syncTransformToSelected();
-								
-				// set zoom selection box to Free zoom
-				zoomComboBox->setSelectedIndex(7);				
-			}
-			zooming = false;
-		}
-		break;
-		case MODE_SELECT:	
-		{
-			Vector2 trans = (CoreServices::getInstance()->getCore()->getInput()->getMousePosition() - mouseBase);
-			if(trans.length() > 0) {
-		
-			if(moving) {
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				for(int i=0; i < selectedEntities.size(); i++) {
-					data->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]->position));
-				}
-				editor->didAction("move", beforeData, data);
-			} else if(scalingX || scalingY) {
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				for(int i=0; i < selectedEntities.size(); i++) {
-					data->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]->scale));
-				}
-				editor->didAction("scale", beforeData, data);
-			} else if(rotating) {
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				for(int i=0; i < selectedEntities.size(); i++) {
-					data->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]->position, selectedEntities[i]->getRotation()));
-				}
-				editor->didAction("rotate", beforeData, data);
-			}
-			}
-			
-			moving = false;
-			scalingY = false;
-			scalingX = false;
-			rotating = false;
-		}
-		break;	
-		case MODE_SHAPE:
-		break;
-	}
-}
-
-void PolycodeScreenEditorMain::adjustForSnap(Vector2 *position) {
-	if(gridSnap) {
-		position->x = round(((Number)position->x)/((Number)gridSize)) * gridSize;
-		position->y = round(((Number)position->y)/((Number)gridSize)) * gridSize;	
-	} else if(pixelSnap) {
-		position->x = round(((Number)position->x));
-		position->y = round(((Number)position->y));
-	}			
-}
-
-void PolycodeScreenEditorMain::handleMouseMove(Vector2 position) {
-	switch(mode) {
-	
-		case MODE_PARENT:
-		{
-			if(parenting) {
-				parentingLine->setEnd(position);
-			}
-		}
-		break;
-		case MODE_PAN:
-		{
-			if(panning) {
-			Number moveModifier =  1.0;//  / objectBaseEntity->getScale().x;
-			Vector2 trans = (CoreServices::getInstance()->getCore()->getInput()->getMousePosition() - mouseBase) * moveModifier; 
-				
-			baseEntity->setPosition(basePanPosition.x + trans.x, basePanPosition.y + trans.y); 
-		}
-		}
-		break;
-		case MODE_ZOOM:
-		{
-			if(zooming) {
-				Vector2 mousePosition = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();
-				Vector2 offset = mousePosition-mouseBase;
-				Number newScale = baseZoomScale + ((offset.x-offset.y) * 0.002);
-				if(newScale < 0.1) 
-					newScale = 0.1;
-					
-				objectBaseEntity->setScale(newScale, newScale);					
-				
-				Vector2 centerPosition = Vector2(getWidth()/2.0, getHeight()/2.0);
-				
-				Vector2 finalPosition = Vector2(				
-					((centerPosition.x)) - (zoomBasePosition.x / baseZoomScale * newScale),
-					((centerPosition.y)) - (zoomBasePosition.y / baseZoomScale * newScale)
-				);				
-
-				baseEntity->setPosition(finalPosition);
-				
-				resizePreviewScreen();
-				syncTransformToSelected();
-				
-				// set zoom selection box to Free zoom
-				zoomComboBox->setSelectedIndex(7);
-				zoomingMoved = true;
-			}
-		}
-		break;
-		case MODE_SELECT:
-		{
-		
-			if(rotating) {
-			
-				Vector2 diff = CoreServices::getInstance()->getCore()->getInput()->getMousePosition() - baseScaleScreenPosition;
-				diff.Normalize();
-				Number newAngle = atan2(diff.x, diff.y);				
-			
-				if(selectedEntities.size() == 1) {
-					selectedEntities[0]->setRoll(baseRotateAngles[0] - (TODEGREES * (newAngle-baseAngle)));
-				} else {
-				
-					groupRoll = -(newAngle-baseAngle);
-					
-					for(int i=0; i < selectedEntities.size(); i++) {
-						Vector3 v3Center = Vector3(groupCenterPoint.x,groupCenterPoint.y,0.0);
-						
-						Vector3 v3CenterRelative = selectedEntities[i]->getParentEntity()->getConcatenatedMatrixRelativeTo(baseEntity).Inverse() * v3Center;	
-						
-						selectedEntities[i]->setRoll(baseRotateAngles[i] - (TODEGREES * (newAngle-baseAngle)));						
-						
-						Number s = sin(newAngle-baseAngle);
-						Number c = cos(newAngle-baseAngle);
-
-						Vector2 p = baseEntityPositions[i];
-						p.x -= v3CenterRelative.x;
-						p.y -= v3CenterRelative.y;
-
-						Number xnew = p.x * c + p.y * s;
-						Number ynew = -p.x * s + p.y * c;
-
-						p.x = xnew + v3CenterRelative.x;
-						p.y = ynew + v3CenterRelative.y;																
-						
-						selectedEntities[i]->setPosition(p.x, p.y);
-					}
-				
-				}
-				syncTransformToSelected();			
-			} 
-			else if(scalingY && scalingX) {
-				Vector2 newMousePosition = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();
-				Vector2 trans = newMousePosition - mouseBase;
-								
-				Number baseDist = mouseBase.distance(baseScaleScreenPosition);
-				Number newDist = newMousePosition.distance(baseScaleScreenPosition);	
-				Number scaleMod = 0.04;
-				Number newScale = newDist - baseDist;
-
-				for(int i=0; i < selectedEntities.size(); i++) {												
-					Number newScaleX, newScaleY;
-					if(baseEntityScales[i].x < 0.0) {
-						newScaleX = (baseEntityScales[i].x - (newScale * scaleMod));					
-					} else {
-						newScaleX = (baseEntityScales[i].x + (newScale * scaleMod));					
-					}
-					
-					if(baseEntityScales[i].y < 0.0) {
-						newScaleY = (baseEntityScales[i].y - (newScale * scaleMod));					
-					} else {
-						newScaleY = (baseEntityScales[i].y + (newScale * scaleMod));					
-					}					
-					
-					selectedEntities[i]->setScale(newScaleX, newScaleY);
-				}
-				syncTransformToSelected();					
-			} else if(scalingY) {												
-				Vector2 trans = CoreServices::getInstance()->getCore()->getInput()->getMousePosition() - mouseBase;
-				for(int i=0; i < selectedEntities.size(); i++) {			
-							
-					Vector3 trans3 = Vector3(trans.x, trans.y, 0.0);
-				
-					Quaternion q;								
-					q.fromAxes(0.0, 0.0, -selectedEntities[i]->getCombinedRoll());
-					trans3 = q.applyTo(trans3);
-								
-					Number scaleMod = 0.04;
-					
-					if(baseEntityScales[i].y < 0.0) {
-						selectedEntities[i]->setScaleY(baseEntityScales[i].y + (trans3.y * scaleMod));
-					} else {
-						selectedEntities[i]->setScaleY(baseEntityScales[i].y - (trans3.y * scaleMod));	
-					}					
-																	
-				}
-				syncTransformToSelected();					
-			} else if(scalingX) {				
-				
-				Vector2 trans = CoreServices::getInstance()->getCore()->getInput()->getMousePosition() - mouseBase;
-			
-				for(int i=0; i < selectedEntities.size(); i++) {			
-					Vector3 trans3 = Vector3(trans.x, trans.y, 0.0);
-					Quaternion q;
-				
-					q.fromAxes(0.0, 0.0, -selectedEntities[i]->getCombinedRoll());
-					trans3 = q.applyTo(trans3);
-								
-					Number scaleMod = 0.04;
-					
-					if(baseEntityScales[i].x < 0.0) {			
-						selectedEntities[i]->setScaleX(baseEntityScales[i].x - (trans3.x * scaleMod));		
-					} else {
-						selectedEntities[i]->setScaleX(baseEntityScales[i].x + (trans3.x * scaleMod));							
-					}
-				}
-				syncTransformToSelected();	
-				
-			}  else if(moving) {
-
-				Vector2 trans = (CoreServices::getInstance()->getCore()->getInput()->getMousePosition() - mouseBase);
-
-				for(int i=0; i < selectedEntities.size(); i++) {
-					Vector3 trans3 = Vector3(trans.x, trans.y, 0.0);
-				
-					Vector3 trans3_a = baseEntity->getConcatenatedMatrix() * trans3;				
-					Vector3 trans3_b = selectedEntities[i]->getParentEntity()->getConcatenatedMatrix().Inverse() * trans3_a;
-				
-					trans3_b = trans3_b - selectedEntities[i]->getParentEntity()->getConcatenatedMatrixRelativeTo(baseEntity).Inverse().getPosition();
-					
-				
-					Vector2 newPosition = Vector2(baseEntityPositions[i].x + trans3_b.x, baseEntityPositions[i].y + trans3_b.y);
-				
-					adjustForSnap(&newPosition);
-				
-					selectedEntities[i]->setPosition(newPosition); 
-				}
-				
-				syncTransformToSelected();
-			}
-		}
-		break;
-		case MODE_SHAPE:
-		{
-				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				adjustForSnap(&newPosition);
-				previewShape->setPosition(newPosition);		
-		}
-		break;
-		case MODE_IMAGE:
-		{
-				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				adjustForSnap(&newPosition);		
-			previewImage->setPosition(newPosition);	
-		}
-		break;
-		case MODE_PARTICLES:
-		{
-				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				adjustForSnap(&newPosition);		
-			previewEmitter->setPosition(newPosition);	
-		}
-		break;		
-		case MODE_TEXT:				
-		{
-				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				adjustForSnap(&newPosition);		
-			previewLabel->setPosition(newPosition);				
-		}
-		break;
-		case MODE_LINK:				
-		{
-				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				adjustForSnap(&newPosition);		
-			previewInstance->setPosition(newPosition);				
-		}
-		break;		
-		case MODE_ENTITY:				
-		{
-				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				adjustForSnap(&newPosition);		
-			previewEntity->setPosition(newPosition);				
-		}
-		case MODE_SOUND:				
-		{
-				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				adjustForSnap(&newPosition);		
-			previewSound->setPosition(newPosition);				
-		}		
-		case MODE_SPRITE:
-		{
-				Vector2 newPosition = Vector2(position.x / objectBaseEntity->getScale2D().x, position.y /objectBaseEntity->getScale2D().y);			
-				adjustForSnap(&newPosition);		
-			previewSprite->setPosition(newPosition);				
-		}			
-		
-		break;		
-	}
-}
-
-void PolycodeScreenEditorMain::handleMouseDown(Vector2 position) {
-	switch(mode) {
-		case MODE_PAN:
-			mouseBase = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();
-			panning = true;
-			basePanPosition = baseEntity->getPosition2D();
-		break;
-		case MODE_SELECT:	
-		{
-		}
-		break;
-		case MODE_ZOOM:
-		{
-			mouseBase = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();
-			zooming = true;
-			baseZoomScale = objectBaseEntity->getScale().x;
-			basePanPosition = baseEntity->getPosition2D();
-			Vector2 centerPosition = Vector2(getWidth()/2.0, getHeight()/2.0);
-			zoomBasePosition.x = (centerPosition.x - baseEntity->position.x);
-			zoomBasePosition.y = (centerPosition.y - baseEntity->position.y);
-			zoomingMoved = false;
-			zoomBaseMousePosition = position;
-		}
-		break;
-		case MODE_TEXT:
-		{
-				SceneLabel *placingLabel = new SceneLabel(previewLabel->getText(), previewLabel->getLabel()->getSize(), previewLabel->getLabel()->getFont()->getFontName());
-				placingLabel->setAnchorPoint(0.0, 0.0, 0.0);
-				placingLabel->setPosition(previewLabel->getPosition2D());
-				placingLabel->processInputEvents = true;
-				placingLabel->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-				placingLabel->addEventListener(this, InputEvent::EVENT_MOUSEUP);
-				placingLabel->id = "SceneLabel."+String::IntToString(placementCount);		
-				placingLabel->blockMouseInput = true;
-				placingLabel->positionAtBaseline = false;
-				currentLayer->addChild(placingLabel);
-				placementCount++;
-				
-				if(treeView) {
-					treeView->Refresh();		
-				}
-				
-				PolycodeScreenEditorActionData *beforeData = new PolycodeScreenEditorActionData();
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				data->reverse = false;
-				data->entry = PolycodeScreenEditorActionDataEntry(placingLabel);
-				beforeData->entry = PolycodeScreenEditorActionDataEntry(placingLabel);
-				editor->didAction("create_entity", beforeData, data);
-		}
-		break;		
-		case MODE_IMAGE:
-		{
-				UIImage *placingImage = new UIImage(previewImage->getTexture()->getResourcePath());
-				placingImage->setAnchorPoint(0.0, 0.0, 0.0);
-				placingImage->setPosition(previewImage->getPosition2D());
-				placingImage->processInputEvents = true;
-				placingImage->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);	
-				placingImage->addEventListener(this, InputEvent::EVENT_MOUSEUP);
-				placingImage->id = "UIImage."+String::IntToString(placementCount);
-				placingImage->blockMouseInput = true;
-				placingImage->getTexture()->reloadOnFileModify = true;
-				currentLayer->addChild(placingImage);
-				placementCount++;
-					
-				if(treeView) {
-					treeView->Refresh();		
-				}	
-				
-				PolycodeScreenEditorActionData *beforeData = new PolycodeScreenEditorActionData();
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				data->reverse = false;
-				data->entry = PolycodeScreenEditorActionDataEntry(placingImage);
-				beforeData->entry = PolycodeScreenEditorActionDataEntry(placingImage);
-				editor->didAction("create_entity", beforeData, data);
-											
-		}
-		break;		
-		case MODE_SHAPE:
-		{
-				ScenePrimitive *placingShape = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 100, 100);			
-				placingShape->setPosition(previewShape->getPosition2D());
-				placingShape->processInputEvents = true;
-				placingShape->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-				placingShape->addEventListener(this, InputEvent::EVENT_MOUSEUP);				
-				currentLayer->addChild(placingShape);
-				placingShape->id = "ScenePrimitive."+String::IntToString(placementCount);			
-				
-				placingShape->blockMouseInput = true;				
-				*placingShape = *previewShape;
-				placementCount++;	
-
-				if(treeView) {
-					treeView->Refresh();		
-				}
-				
-				PolycodeScreenEditorActionData *beforeData = new PolycodeScreenEditorActionData();
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				data->reverse = false;
-				data->entry = PolycodeScreenEditorActionDataEntry(placingShape);
-				beforeData->entry = PolycodeScreenEditorActionDataEntry(placingShape);				
-				editor->didAction("create_entity", beforeData, data);
-															
-		}
-		break;
-		case MODE_PARTICLES:
-		{
-				SceneParticleEmitter *placingEmitter = new SceneParticleEmitter("default.png", Particle::BILLBOARD_PARTICLE, ParticleEmitter::CONTINUOUS_EMITTER, 2.0, 30, Vector3(0.0, -40.0, 0.0), Vector3(0.0, 0.0, 0.0), Vector3(0.0, 0.0, 0.0), Vector3(10.0, 10.0, 0.0));
-
-				placingEmitter->setPosition(previewEmitter->getPosition2D());
-				placingEmitter->processInputEvents = true;
-				placingEmitter->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-				placingEmitter->addEventListener(this, InputEvent::EVENT_MOUSEUP);				
-				currentLayer->addChild(placingEmitter);
-				placingEmitter->id = "SceneParticleEmitter."+String::IntToString(placementCount);
-				placingEmitter->blockMouseInput = true;				
-				placementCount++;	
-				
-				placingEmitter->emitterRadius = previewEmitter->emitterRadius;
-				placingEmitter->dirVector = previewEmitter->dirVector;
-				placingEmitter->gravVector = previewEmitter->gravVector;
-				placingEmitter->deviation = previewEmitter->deviation;
-				
-				placingEmitter->brightnessDeviation = previewEmitter->brightnessDeviation;
-				placingEmitter->particleSize = previewEmitter->particleSize;
-				placingEmitter->perlinModSize = previewEmitter->perlinModSize;
-				placingEmitter->perlinEnabled = previewEmitter->perlinEnabled;
-				placingEmitter->particleSpeedMod = previewEmitter->particleSpeedMod;
-				
-				placingEmitter->rotationSpeed = previewEmitter->rotationSpeed;
-				placingEmitter->lifespan = previewEmitter->lifespan;
-				placingEmitter->particleSpeedMod = previewEmitter->particleSpeedMod;
-				placingEmitter->setParticleCount(previewEmitter->getNumParticles());						
-
-				placingEmitter->rotationFollowsPath = previewEmitter->rotationFollowsPath;
-				placingEmitter->useScaleCurves = previewEmitter->useScaleCurves;
-				placingEmitter->scaleCurve = previewEmitter->scaleCurve;
-
-				placingEmitter->useColorCurves = previewEmitter->useColorCurves;
-				
-				placingEmitter->colorCurveR = previewEmitter->colorCurveR;
-				placingEmitter->colorCurveG = previewEmitter->colorCurveG;
-				placingEmitter->colorCurveB = previewEmitter->colorCurveB;
-				placingEmitter->colorCurveA = previewEmitter->colorCurveA;																
-				placingEmitter->setParticleBlendingMode(previewEmitter->getParticleBlendingMode());
-				
-				placingEmitter->setParticleTexture(previewEmitter->getParticleTexture());
-
-				placingEmitter->setAnchorPoint(0.0, 0.0, 0.0);
-
-				placingEmitter->setWidth(placingEmitter->emitterRadius.x);
-				placingEmitter->setHeight(placingEmitter->emitterRadius.y);			
-
-				createParticleRef(placingEmitter);
-				
-				if(treeView) {
-					treeView->Refresh();		
-				}
-				
-				PolycodeScreenEditorActionData *beforeData = new PolycodeScreenEditorActionData();
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				data->reverse = false;
-				data->entry = PolycodeScreenEditorActionDataEntry(placingEmitter);
-				beforeData->entry = PolycodeScreenEditorActionDataEntry(placingEmitter);				
-				editor->didAction("create_entity", beforeData, data);
-																										
-		}
-		break;			
-		case MODE_SPRITE:
-		{
-				SceneSprite *placingSprite = new SceneSprite(previewSprite->getFileName());			
-				placingSprite->setPosition(previewSprite->getPosition2D());
-				placingSprite->processInputEvents = true;
-				placingSprite->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-				placingSprite->addEventListener(this, InputEvent::EVENT_MOUSEUP);				
-				currentLayer->addChild(placingSprite);
-				placingSprite->id = "SceneSprite."+String::IntToString(placementCount);
-				placingSprite->blockMouseInput = true;
-				placingSprite->getTexture()->reloadOnFileModify = true;
-				placingSprite->getResourceEntry()->reloadOnFileModify = true;
-								
-				if(previewSprite->getCurrentAnimation()) {
-						placingSprite->playAnimation(previewSprite->getCurrentAnimation()->name, 0, false);
-				}
-				
-				placementCount++;	
-
-
-				if(treeView) {
-					treeView->Refresh();		
-				}
-				
-				PolycodeScreenEditorActionData *beforeData = new PolycodeScreenEditorActionData();
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				data->reverse = false;
-				data->entry = PolycodeScreenEditorActionDataEntry(placingSprite);
-				beforeData->entry = PolycodeScreenEditorActionDataEntry(placingSprite);				
-				editor->didAction("create_entity", beforeData, data);
-																										
-		}
-		break;		
-		case MODE_LINK:
-		{
-				SceneEntityInstance *placingInstance = new SceneEntityInstance(previewInstance->getFileName());
-				placingInstance->setPosition(previewInstance->getPosition2D());
-				placingInstance->processInputEvents = true;
-				placingInstance->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-				placingInstance->addEventListener(this, InputEvent::EVENT_MOUSEUP);				
-				currentLayer->addChild(placingInstance);
-				placingInstance->id = "ScreenInstance."+String::IntToString(placementCount);				
-				placingInstance->blockMouseInput = true;
-				placementCount++;	
-								
-				applyEditorProperties(placingInstance);
-
-				if(treeView) {
-					treeView->Refresh();		
-				}
-
-				PolycodeScreenEditorActionData *beforeData = new PolycodeScreenEditorActionData();
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				data->reverse = false;
-				data->entry = PolycodeScreenEditorActionDataEntry(placingInstance);
-				beforeData->entry = PolycodeScreenEditorActionDataEntry(placingInstance);				
-				editor->didAction("create_entity", beforeData, data);
-															
-		}
-		break;		
-		case MODE_ENTITY:
-		{
-				Entity *placingEntity = new Entity();
-				placingEntity->setPosition(previewEntity->getPosition2D());
-				placingEntity->processInputEvents = true;
-				placingEntity->setAnchorPoint(0.0, 0.0, 0.0);
-				placingEntity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-				placingEntity->addEventListener(this, InputEvent::EVENT_MOUSEUP);				
-				placingEntity->setWidth(50);
-				placingEntity->setHeight(50);				
-				currentLayer->addChild(placingEntity);
-				placingEntity->id = "Entity."+String::IntToString(placementCount);
-				placingEntity->blockMouseInput = true;	
-				placementCount++;
-								
-				createEntityRef(placingEntity);				
-
-				if(treeView) {
-					treeView->Refresh();		
-				}
-
-				PolycodeScreenEditorActionData *beforeData = new PolycodeScreenEditorActionData();
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				data->reverse = false;
-				data->entry = PolycodeScreenEditorActionDataEntry(placingEntity);
-				beforeData->entry = PolycodeScreenEditorActionDataEntry(placingEntity);				
-				editor->didAction("create_entity", beforeData, data);
-				
-								
-		}
-		break;
-		case MODE_SOUND:
-		{
-				Sound *sound = previewSound->getSound();
-				
-				SceneSound *placingSound = new SceneSound(sound->getFileName(), sound->getReferenceDistance(), sound->getMaxDistance());
-				placingSound->setPosition(previewSound->getPosition2D());
-				placingSound->processInputEvents = true;
-				placingSound->setAnchorPoint(0.0, 0.0, 0.0);
-				placingSound->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-				placingSound->addEventListener(this, InputEvent::EVENT_MOUSEUP);				
-				placingSound->setWidth(50);
-				placingSound->setHeight(50);				
-				currentLayer->addChild(placingSound);
-				placingSound->id = "SceneSound."+String::IntToString(placementCount);
-				placingSound->blockMouseInput = true;	
-				placementCount++;
-				
-				createSoundRef(placingSound);
-								
-			
-				if(treeView) {
-					treeView->Refresh();		
-				}
-
-				PolycodeScreenEditorActionData *beforeData = new PolycodeScreenEditorActionData();
-				PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-				data->reverse = false;
-				data->entry = PolycodeScreenEditorActionDataEntry(placingSound);
-				beforeData->entry = PolycodeScreenEditorActionDataEntry(placingSound);				
-				editor->didAction("create_entity", beforeData, data);
-				
-																				
-		}
-		break;		
-	}
-}
-
-void PolycodeScreenEditorMain::applyEditorOnly(Entity *entity) {
-	entity->editorOnly = true;
-	entity->removeAllHandlersForListener(this);
-	for(int i=0; i < entity->getNumChildren(); i++) {
-		applyEditorOnly((Entity*)entity->getChildAtIndex(i));
-	}
-}
-
-void PolycodeScreenEditorMain::createEntityRef(Entity *entity) {
-	UIImage *markerImage = new UIImage("Images/ScreenEditor/entity_marker.png");
-	entity->addChild(markerImage);
-	markerImage->setAnchorPoint(0.0, 0.0, 0.0);
-	markerImage->editorOnly = true;
-	markerImage->billboardMode = true;
-	markerImage->billboardIgnoreScale = true;
-	markerImage->addTag("editorRef");
-	
-	EntityNameDisplay *nameDisplay = new EntityNameDisplay(entity);
-	entity->addChild(nameDisplay);
-	nameDisplay->billboardMode = true;
-	nameDisplay->billboardIgnoreScale = true;
-	
-}
-
-void PolycodeScreenEditorMain::createParticleRef(SceneParticleEmitter *target) {
-
-	UIImage *markerImage = new UIImage("Images/particle_system_icon_editor.png");
-	markerImage->addTag("editorRef");
-	markerImage->setColor(0.0, 1.0, 1.0, 1.0);
-	target->addChild(markerImage);
-	markerImage->setAnchorPoint(0.0, 0.0, 0.0);
-	markerImage->editorOnly = true;
-	markerImage->billboardMode = true;
-	markerImage->billboardIgnoreScale = true;
-	
-	ScenePrimitive *refRect = new ScenePrimitive(ScenePrimitive::TYPE_VPLANE, target->emitterRadius.x, target->emitterRadius.y);
-	
-	refRect->strokeEnabled = true;
-	refRect->strokeWidth = 1.0;
-	refRect->addTag("editorRef");
-	refRect->id = "refRect";
-	refRect->setStrokeColor(1.0, 1.0, 0.0, 0.5);
-	refRect->setColor(0.0, 0.0, 0.0, 0.0);
-	target->addChild(refRect);
-	refRect->editorOnly = true;				
-		
-}
-
-void PolycodeScreenEditorMain::createSoundRef(SceneSound *target) {
-	UIImage *markerImage = new UIImage("Images/ScreenEditor/screen_sound_icon.png");
-	target->addChild(markerImage);
-	markerImage->setAnchorPoint(0.0, 0.0, 0.0);
-	markerImage->editorOnly = true;
-	markerImage->billboardMode = true;
-	markerImage->billboardIgnoreScale = true;
-	markerImage->addTag("editorRef");
-		
-	ScenePrimitive *refCircle = new ScenePrimitive(ScenePrimitive::SHAPE_CIRCLE, target->getSound()->getReferenceDistance(), target->getSound()->getReferenceDistance(), 16);
-	refCircle->strokeEnabled = true;
-	refCircle->strokeWidth = 1.0;
-	refCircle->id = "refCircle";
-	refCircle->setStrokeColor(1.0, 0.5, 0.0, 0.5);
-	refCircle->setColor(0.0, 0.0, 0.0, 0.0);
-	target->addChild(refCircle);
-	refCircle->editorOnly = true;				
-	refCircle->addTag("editorRef");
-		
-	ScenePrimitive *maxCircle = new ScenePrimitive(ScenePrimitive::SHAPE_CIRCLE, target->getSound()->getMaxDistance(), target->getSound()->getMaxDistance(), 16);
-	maxCircle->strokeEnabled = true;
-	maxCircle->strokeWidth = 1.0;
-	maxCircle->id = "maxCircle";				
-	maxCircle->addTag("editorRef");	
-	maxCircle->setStrokeColor(0.0, 1.0, 1.0, 0.5);
-	maxCircle->setColor(0.0, 0.0, 0.0, 0.0);
-	target->addChild(maxCircle);
-	maxCircle->editorOnly = true;
-}
-
-bool PolycodeScreenEditorMain::hasSelected(Entity *entity) {
-	for(int i=0; i < selectedEntities.size(); i++) {
-		if(selectedEntities[i] == entity) {
-			return true;
-		}
-	}
-	return false;
-}
-
-void PolycodeScreenEditorMain::resetSelectedEntityTransforms() {
-	baseEntityPositions.clear();
-	baseEntityScales.clear();
-	baseRotateAngles.clear();
-	
-	for(int i=0; i < selectedEntities.size(); i++) {
-		baseEntityPositions.push_back(selectedEntities[i]->getPosition2D());	
-		baseEntityScales.push_back(selectedEntities[i]->getScale2D());
-		baseRotateAngles.push_back(selectedEntities[i]->getRotation());
-	}
-	
-	Number width;
-	Number height;
-	getCenterAndSizeForSelected(&groupCenterPoint, &width, &height);					
-	
-	groupRoll = 0;
-}
-
-void PolycodeScreenEditorMain::selectEntity(Entity *entity, bool doAction) {
-
-	((Entity*)baseEntity->getParentEntity())->focusChild(baseEntity);
-
-	if(entity != NULL) {
-		if(hasSelected(entity)) {
-			resetSelectedEntityTransforms();
-			return;
-		}
-	}	
-	
-	if(doAction) {
-		beforeData = new PolycodeScreenEditorActionData();
-		for(int i=0; i < selectedEntities.size(); i++) {
-			beforeData->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]));
-		}		
-	}	
-
-	transform2dSheet->entity = NULL;
-	entitySheet->entity = NULL;
-	shapeSheet->shape = NULL;
-	imageSheet->image = NULL;
-	labelSheet->label = NULL;
-	soundSheet->sound = NULL;
-	instanceSheet->instance = NULL;
-	particleSheet->emitter = NULL;
-	spriteSheet->sprite = NULL;
-	entityPropSheet->entity = NULL;
-	EntitySheet->entity = NULL;
-				
-	if(!entity) {
-		selectedEntities.clear();
-		screenTransform->visible = false;
-		screenTransform->enabled = false;
-		screenTransformShape->visible = false;			
-		entityProps->updateProps();
-		selectedEntities.clear();
-		baseEntityPositions.clear();
-		if(treeView) {
-			treeView->Refresh();		
-		}
-		if(doAction) {
-			editor->didAction("select", beforeData, NULL, false);
-		}
-		return;
-	}
-	
-	if(!multiSelect) {
-		selectedEntities.clear();
-	}
-		
-	selectedEntities.push_back(entity);
-	
-	resetSelectedEntityTransforms();
-	
-	Entity *parent = NULL;
-	parent = (Entity*)entity->getParentEntity();
-	
-	if(entity->getEntityProp("editor_type") != "layer" && entity != layerBaseEntity) {	
-		transform2dSheet->entity = entity;
-	}
-	
-	if(entity != layerBaseEntity && entity->getEntityProp("editor_type") != "layer") {
-		entitySheet->entity = entity;
-		entityPropSheet->entity = entity;
-		EntitySheet->entity = entity;
-	} else {
-		entitySheet->entity = entity;
-		if(entity == layerBaseEntity) {
-			entityPropSheet->entity = entity;		
-			EntitySheet->entity = entity;			
-		}
-	}
-
-	if(dynamic_cast<SceneParticleEmitter*>(entity)) {
-		particleSheet->emitter = (SceneParticleEmitter*) entity;
-	}
-	
-	if(dynamic_cast<SceneSprite*>(entity)) {
-		spriteSheet->sprite = (SceneSprite*) entity;
-	}
-	
-	if(dynamic_cast<ScenePrimitive*>(entity)) {
-		shapeSheet->shape = (ScenePrimitive*) entity;
-		EntitySheet->entity = NULL;
-	}
-
-	if(dynamic_cast<UIImage*>(entity)) {
-		imageSheet->image = (UIImage*) entity;
-	}
-
-	if(dynamic_cast<SceneLabel*>(entity)) {
-		labelSheet->label = (SceneLabel*) entity;
-	}
-
-	if(dynamic_cast<SceneSound*>(entity)) {
-		soundSheet->sound = ((SceneSound*) entity);
-	}
-	
-	if(dynamic_cast<SceneEntityInstance*>(entity) && entity != layerBaseEntity) {
-		instanceSheet->instance = ((SceneEntityInstance*) entity);
-	}
-			
-		
-	if(entity->getEntityProp("editor_type") != "layer" && entity != layerBaseEntity) {
-		screenTransform->visible = true;
-		screenTransform->enabled = true;	
-		screenTransformShape->visible = true;
-	} else {
-		screenTransform->visible = false;
-		screenTransform->enabled = false;	
-		screenTransformShape->visible = false;	
-	}
-	
-	syncTransformToSelected();	
-		
-	entityProps->updateProps();	
-	
-	if(treeView) {
-		treeView->Refresh();		
-	}
-	
-	if(doAction) {
-		PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-		for(int i=0; i < selectedEntities.size(); i++) {
-			data->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]));
-		}			
-		editor->didAction("select", beforeData, data, false);
-	}	
-	
-	dispatchEvent(new Event(), Event::CHANGE_EVENT);
-}
-
-void PolycodeScreenEditorMain::resizePreviewScreen() {
-	previewAspectRatio = aspects[aspectComboBox->getSelectedIndex()];
-	Number scaleVal = 1.0/atof(scaleInput->getText().c_str());		
-	screenPreviewShape->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, 1.0/scaleVal * previewAspectRatio * objectBaseEntity->getScale().x, 1.0/scaleVal * objectBaseEntity->getScale().x);
-	
-	sizePreviewShape->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, layerBaseEntity->getWidth() * objectBaseEntity->getScale().x, layerBaseEntity->getHeight() * objectBaseEntity->getScale().x);
-
-}
-
-void PolycodeScreenEditorMain::setRefVisibility(bool val) {
-		setEntityRefVisibility(objectBaseEntity, val);
-}
-
-void PolycodeScreenEditorMain::setEntityRefVisibility(Entity *entity, bool val) {
-	if(entity->editorOnly == true) {
-		if(entity->hasTag("editorRef")) {
-			entity->visible = val;
-		}
-	}
-	
-	for(int i=0; i < entity->getNumChildren(); i++) {
-		setEntityRefVisibility((Entity*)entity->getChildAtIndex(i), val);
-	}
-}
-
-void PolycodeScreenEditorMain::deleteEntity(Entity *entity) {				
-	if(entity == layerBaseEntity) {
-		PolycodeConsole::print("You cannot delete the root entity.\n");
-	} else if(entity->getEntityProp("editor_type") == "layer" && layers.size() == 1) {
-		PolycodeConsole::print("You cannot delete the last layer.\n");						
-	} else {
-		entity->ownsChildren = true;
-		entity->getParentEntity()->removeChild(entity);
-
-		if(entity->getEntityProp("editor_type") == "layer") {
-			for(int i=0; i < layers.size(); i++) {
-				if(layers[i] == entity) {
-					layers.erase(layers.begin()+i);
-				}
-			}
-		}							
-
-		if(entity == currentLayer) {
-				setCurrentLayer(layers[0]);
-				treeView->targetLayer = currentLayer;
-		}
-		treeView->Refresh();
-	}
-}
-
-void PolycodeScreenEditorMain::handleEvent(Event *event) {
-
-	if(event->getEventCode() == Event::RESOURCE_RELOAD_EVENT && event->getEventType() == "") {
-			SceneEntityInstanceResourceEntry *entry = dynamic_cast<SceneEntityInstanceResourceEntry*>(event->getDispatcher());
-			if(entry) {	
-				applyEditorProperties(entry->getInstance());
-				applyEditorOnlyChildren(entry->getInstance());				
-			}
-	}
-	
-	if(!editor->enabled)
-		return;		
-
-	InputEvent *inputEvent = (InputEvent*) event;		
-	if(event->getEventCode() == UIEvent::CHANGE_EVENT && event->getEventType() == "UIEvent") {
-
-
-		if(event->getDispatcher() == pixelSnapBox) {
-			pixelSnap = pixelSnapBox->isChecked();
-		} else if(event->getDispatcher() == gridSnapBox) {
-			gridSnap = gridSnapBox->isChecked();
-		} else if(event->getDispatcher() == gridSizeInput) {
-			setGrid(atoi(gridSizeInput->getText().c_str()));
-		} else if(event->getDispatcher() == gridCheckBox) {
-			grid->visible = gridCheckBox->isChecked();
-		} else if(event->getDispatcher() == scaleInput) {
-			resizePreviewScreen();
-		} else if(event->getDispatcher() == zoomComboBox) {
-			if(zoomComboBox->getSelectedIndex() != 7) {
-				Number newScale = zooms[zoomComboBox->getSelectedIndex()];
-				objectBaseEntity->setScale(newScale, newScale);
-//				baseEntity->setPosition(getWidth()/2.0, getHeight()/2.0);
-				resizePreviewScreen();
-				syncTransformToSelected();				
-			}
-		}else if(event->getDispatcher() == aspectComboBox) {
-			resizePreviewScreen();
-		} else if(event->getDispatcher() == showRefsBox) {
-			setRefVisibility(showRefsBox->isChecked());
-			sizePreviewShape->visible = showRefsBox->isChecked();
-		}
-	}
-
-	if(event->getDispatcher() == particleSheet && event->getEventType() == "") {	
-		if(particleSheet->emitter) {
-		ScenePrimitive *refRect = (ScenePrimitive*) particleSheet->emitter->getEntityById("refRect", false);
-		if(refRect) {
-			refRect->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, particleSheet->emitter->emitterRadius.x, particleSheet->emitter->emitterRadius.y);
-			particleSheet->emitter->setWidth(particleSheet->emitter->emitterRadius.x);
-			particleSheet->emitter->setHeight(particleSheet->emitter->emitterRadius.y);			
-		}
-		}
-
-	}
-	
-	if(event->getDispatcher() == soundSheet && event->getEventType() == "") {	
-		ScenePrimitive *refCircle = (ScenePrimitive*) soundSheet->sound->getEntityById("refCircle", false);
-		if(refCircle) {
-			refCircle->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, soundSheet->sound->getSound()->getReferenceDistance(), soundSheet->sound->getSound()->getReferenceDistance());
-		}
-
-		ScenePrimitive *maxCircle = (ScenePrimitive*) soundSheet->sound->getEntityById("maxCircle", false);
-		if(maxCircle) {
-			maxCircle->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, soundSheet->sound->getSound()->getMaxDistance(), soundSheet->sound->getSound()->getMaxDistance());
-		}
-
-		
-	}
-
-	if(event->getDispatcher() == entityPropSheet && event->getEventType() == "") {
-			entityProps->updateSize();
-			entityProps->scrollContainer->setScrollValue(0.0, 1.0);
-	}
-	
-	if(event->getEventCode() == PropEvent::EVENT_PROP_CHANGE) {
-		PropEvent *propEvent  = (PropEvent*) event;
-		editor->didAction("prop_change", propEvent->beforeData, propEvent->afterData);
-	}
-	
-	if((event->getDispatcher() == transform2dSheet || event->getDispatcher() == labelSheet || event->getDispatcher() == imageSheet || event->getDispatcher() == shapeSheet || event->getDispatcher() == EntitySheet) && event->getEventType() == "") {
-		syncTransformToSelected();
-		treeView->Refresh();		
-	}
-	
-	if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
-		if(event->getEventCode() == InputEvent::EVENT_KEYDOWN) {
-			switch(inputEvent->key) {
-				case Polycode::KEY_ESCAPE:
-					if(selectedEntities.size() > 0) {
-						scalingY = false;
-						scalingX = false;
-						moving = false;
-						rotating = false;
-						selectEntity(NULL);
-					}
-				break;
-				case Polycode::KEY_BACKSPACE:
-				{
-					if(selectedEntities.size() > 0 && baseEntity->hasFocus) {
-							
-						PolycodeScreenEditorActionData *oldData = new PolycodeScreenEditorActionData();
-						PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-						data->reverse = false;
-						for(int i=0; i < selectedEntities.size(); i++) {
-							oldData->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]));
-							data->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]));
-						}			
-					
-						for(int i=0; i < selectedEntities.size(); i++) {
-							deleteEntity(selectedEntities[i]);
-						}
-									
-						editor->didAction("delete", oldData, data); 						
-						selectEntity(NULL, false);
-					}
-				}
-				break;
-				case Polycode::KEY_SPACE:
-				{
-					if(mode != MODE_PAN) {
-						lastMode = mode;
-						mode = MODE_PAN;
-						updateCursor();
-					}
-				}	
-				break;				
-				case Polycode::KEY_RSHIFT:
-				case Polycode::KEY_LSHIFT:
-					multiSelect = true;
-				break;
-				default:
-					// We don't care about the other keys
-				break;
-			}
-		}
-		
-		if(event->getEventCode() == InputEvent::EVENT_KEYUP) {
-			switch(inputEvent->key) {
-				case Polycode::KEY_SPACE:
-				{
-					if(mode == MODE_PAN) {
-						mode = lastMode;
-						panning = false;
-						updateCursor();					
-					}
-				}	
-				break;
-				case Polycode::KEY_RSHIFT:
-				case Polycode::KEY_LSHIFT:
-					multiSelect = false;
-				break;
-				default:
-					// We don't care about the other keys
-				break;
-			}
-		}
-	
-		
-	}
-
-	if(event->getDispatcher() == transformScalerXY) {
-		if(selectedEntities.size() > 0) {
-			scalingY = true;
-			scalingX = true;			
-			resetSelectedEntityTransforms();
-			beforeData = new PolycodeScreenEditorActionData();
-			for(int i=0; i < selectedEntities.size(); i++) {
-				beforeData->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]->scale));
-			}			
-			mouseBase = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();			
-			baseScaleScreenPosition = screenTransform->getScreenPosition();
-		}	
-	} else if(event->getDispatcher() == transformScalerY) {
-		if(selectedEntities.size() > 0) {
-			scalingY = true;
-			resetSelectedEntityTransforms();
-			beforeData = new PolycodeScreenEditorActionData();			
-			for(int i=0; i < selectedEntities.size(); i++) {
-				beforeData->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]->scale));
-			}						
-			mouseBase = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();			
-		}
-	} else if(event->getDispatcher() == transformScalerX) {
-		if(selectedEntities.size() > 0) {
-			scalingX = true;
-			resetSelectedEntityTransforms();
-			beforeData = new PolycodeScreenEditorActionData();			
-			for(int i=0; i < selectedEntities.size(); i++) {
-				beforeData->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]->scale));
-			}						
-			mouseBase = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();			
-		}
-	} else if(event->getDispatcher() == transformRotator) {
-		if(selectedEntities.size() > 0) {
-			baseScaleScreenPosition = screenTransform->getScreenPosition();		
-			rotating = true;
-			resetSelectedEntityTransforms();
-			mouseBase = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();
-			beforeData = new PolycodeScreenEditorActionData();			
-			for(int i=0; i < selectedEntities.size(); i++) {
-				beforeData->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]->position, selectedEntities[i]->getRotation()));
-			}
-			
-			Vector2 diff = mouseBase - screenTransform->getScreenPosition();
-			baseAngle = atan2(diff.x, diff.y);
-			groupRoll = -baseAngle;
-		}
-	}
-	
-
-	if(event->getEventCode() == UIEvent::CLICK_EVENT && event->getEventType() == "UIEvent") {
-	
-		if(event->getDispatcher() == moveUpButton) {
-			for(int i=0; i < selectedEntities.size(); i++) {
-				if(selectedEntities[i]->getParentEntity()) {
-					((Entity*)selectedEntities[i]->getParentEntity())->moveChildUp(selectedEntities[i]);
-				}
-			}
-		}
-
-		if(event->getDispatcher() == moveDownButton) {
-			for(int i=0; i < selectedEntities.size(); i++) {
-				if(selectedEntities[i]->getParentEntity()) {
-					((Entity*)selectedEntities[i]->getParentEntity())->moveChildDown(selectedEntities[i]);
-				}
-			}
-		}
-
-		if(event->getDispatcher() == moveTopButton) {
-			for(int i=0; i < selectedEntities.size(); i++) {
-				if(selectedEntities[i]->getParentEntity()) {
-					((Entity*)selectedEntities[i]->getParentEntity())->moveChildTop(selectedEntities[i]);
-				}
-			}
-		}
-
-		if(event->getDispatcher() == moveTopButton) {
-			for(int i=0; i < selectedEntities.size(); i++) {
-				if(selectedEntities[i]->getParentEntity()) {
-					((Entity*)selectedEntities[i]->getParentEntity())->moveChildTop(selectedEntities[i]);
-				}
-			}
-		}
-
-		if(event->getDispatcher() == moveBottomButton) {
-			for(int i=0; i < selectedEntities.size(); i++) {
-				if(selectedEntities[i]->getParentEntity()) {
-					((Entity*)selectedEntities[i]->getParentEntity())->moveChildBottom(selectedEntities[i]);
-				}
-			}
-		}
-
-		if(event->getDispatcher() == unparentButton) {
-			for(int i=0; i < selectedEntities.size(); i++) {
-				if(selectedEntities[i]->getParentEntity()) {
-					selectedEntities[i]->getParentEntity()->removeChild(selectedEntities[i]);
-					currentLayer->addChild(selectedEntities[i]);
-				}
-			}
-			syncTransformToSelected();			
-		}
-			
-	
-		if(event->getDispatcher() == arrowToolButton) {
-			selectorImage->setPosition(arrowToolButton->getPosition().x - 4, arrowToolButton->getPosition().y - 4);
-			setMode(MODE_SELECT);
-		}
-
-		if(event->getDispatcher() == shapeToolButton) {
-			selectorImage->setPosition(shapeToolButton->getPosition().x - 4, shapeToolButton->getPosition().y - 4);
-			setMode(MODE_SHAPE);
-		}
-
-		if(event->getDispatcher() == soundToolButton) {
-			selectorImage->setPosition(soundToolButton->getPosition().x - 4, soundToolButton->getPosition().y - 4);
-			setMode(MODE_SOUND);
-		}
-
-
-		if(event->getDispatcher() == zoomToolButton) {
-			selectorImage->setPosition(zoomToolButton->getPosition().x - 4, zoomToolButton->getPosition().y - 4);
-			setMode(MODE_ZOOM);
-		}
-
-		if(event->getDispatcher() == panToolButton) {
-			selectorImage->setPosition(panToolButton->getPosition().x - 4, panToolButton->getPosition().y - 4);
-			setMode(MODE_PAN);
-		}
-
-		if(event->getDispatcher() == imageToolButton) {
-			selectorImage->setPosition(imageToolButton->getPosition().x - 4, imageToolButton->getPosition().y - 4);
-			setMode(MODE_IMAGE);
-		}
-
-		if(event->getDispatcher() == textToolButton) {
-			selectorImage->setPosition(textToolButton->getPosition().x - 4, textToolButton->getPosition().y - 4);
-			setMode(MODE_TEXT);
-		}
-		
-		if(event->getDispatcher() == parentToolButton) {
-			selectorImage->setPosition(parentToolButton->getPosition().x - 4, parentToolButton->getPosition().y - 4);
-			setMode(MODE_PARENT);
-		}
-
-		if(event->getDispatcher() == linkToolButton) {
-			selectorImage->setPosition(linkToolButton->getPosition().x - 4, linkToolButton->getPosition().y - 4);
-			setMode(MODE_LINK);
-		}
-
-		if(event->getDispatcher() == spriteToolButton) {
-			selectorImage->setPosition(spriteToolButton->getPosition().x - 4, spriteToolButton->getPosition().y - 4);
-			setMode(MODE_SPRITE);
-		}
-
-		if(event->getDispatcher() == particlesToolButton) {
-			selectorImage->setPosition(particlesToolButton->getPosition().x - 4, particlesToolButton->getPosition().y - 4);
-			setMode(MODE_PARTICLES);
-		}
-
-
-
-		if(event->getDispatcher() == entityToolButton) {
-			selectorImage->setPosition(entityToolButton->getPosition().x - 4, entityToolButton->getPosition().y - 4);
-			setMode(MODE_ENTITY);
-		}
-	}
-		
-	if(currentLayer) {
-		for(int i=0; i < currentLayer->getNumChildren(); i++) {
-			Entity* childEntity = (Entity*) currentLayer->getChildAtIndex(i);
-			processEventForEntity(childEntity, inputEvent);
-		}
-	}
-	
-	if(event->getDispatcher() == baseEntity) {
-		switch (event->getEventCode()) {
-			case InputEvent::EVENT_MOUSEDOWN:
-				firstMove = true;
-				handleMouseDown(inputEvent->mousePosition);
-				focusChild(baseEntity);
-			break;		
-			case InputEvent::EVENT_MOUSEUP:
-			case InputEvent::EVENT_MOUSEUP_OUTSIDE:			
-				firstMove = false;
-				handleMouseUp(inputEvent->mousePosition);
-			break;
-			case InputEvent::EVENT_MOUSEOUT:
-				CoreServices::getInstance()->getCore()->setCursor(Core::CURSOR_ARROW);
-			break;
-			case InputEvent::EVENT_MOUSEMOVE:
-			{
-				if(firstMove) {
-					Core *core = CoreServices::getInstance()->getCore();
-					if((core->getInput()->getKeyState(COPYMOD_1) || core->getInput()->getKeyState(COPYMOD_2)) && selectedEntities.size() > 0) {
-						void *data;
-						String type = Copy(&data);
-						if(data) {
-							Paste(data, type);
-							destroyClipboardData(data, type);
-						}
-						beforeData = new PolycodeScreenEditorActionData();						
-						for(int i=0; i < selectedEntities.size(); i++) {
-							beforeData->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]->position));
-						}															
-					}
-					firstMove = false;					
-				}
-				updateCursor();
-				handleMouseMove(inputEvent->mousePosition);
-			}
-			break;			
-		}
-		return;
-	}
-
-}
-
-void PolycodeScreenEditorMain::processEventForEntity(Entity *childEntity, InputEvent *inputEvent) {
-
-		for(int i=0; i < childEntity->getNumChildren(); i++) {
-			processEventForEntity((Entity*)childEntity->getChildAtIndex(i), inputEvent);
-		}
-
-		if(inputEvent->getDispatcher() == childEntity) {
-		
-			if(inputEvent->getEventCode() == InputEvent::EVENT_MOUSEUP) {
-				if(mode == MODE_PARENT && parenting == true) {
-					parenting = false;
-					if(parentingChild && (parentingChild != childEntity)) {
-						parentingChild->getParentEntity()->removeChild(parentingChild);
-						childEntity->addChild(parentingChild);
-						syncTransformToSelected();						
-					}
-					parentingLine->visible = false;
-				}
-			}
-							
-			if(inputEvent->getEventCode() == InputEvent::EVENT_MOUSEDOWN) {
-				if(mode == MODE_SELECT) {
-					selectEntity(childEntity);
-					if(selectedEntities.size() > 0) {
-						moving = true;
-						beforeData = new PolycodeScreenEditorActionData();						
-						for(int i=0; i < selectedEntities.size(); i++) {
-							beforeData->entries.push_back(PolycodeScreenEditorActionDataEntry(selectedEntities[i]->position));
-						}									
-						mouseBase = CoreServices::getInstance()->getCore()->getInput()->getMousePosition();
-					}					
-					return;
-				}
-
-				if(mode == MODE_PARENT) {
-					parenting = true;
-					parentingChild = childEntity;
-					parentingLine->visible = true;
-					
-					Matrix4 m1 = childEntity->getConcatenatedMatrix();
-					Matrix4 m2 = baseEntity->getConcatenatedMatrix();
-					
-					Matrix4 final = m1 - m2;
-					Vector3 pos;
-					
-					pos = final * pos;
-					
-					parentingLine->setStart(Vector2(pos.x, pos.y));
-					parentingLine->setEnd(Vector2(pos.x, pos.y));
-					return;
-				}
-			}
-		}
-}
-
-
-Entity *PolycodeScreenEditorMain::addNewLayer(String layerName) {
-	Entity *newLayer = new Entity();
-	newLayer->id = layerName;
-	layerBaseEntity->addChild(newLayer);
-	setCurrentLayer(newLayer, false);
-	treeView->targetLayer = newLayer;	
-	newLayer->setEntityProp("editor_type", "layer");	
-	selectEntity(currentLayer);	
-	layers.push_back(newLayer);
-	treeView->Refresh();	
-	return newLayer;
-}
-
-void PolycodeScreenEditorMain::setMode(int newMode) {
-	mode = newMode;
-
-	previewShape->visible = false;
-	previewImage->visible = false;
-	previewLabel->visible = false;
-	previewEntity->visible = false;
-	previewSound->visible = false;
-	previewInstance->visible = false;	
-	previewSprite->visible = false;	
-	previewEmitter->visible = false;	
-			
-	parentingLine->visible = false;
-	parenting = false;
-	
-	selectEntity(NULL, false);
-	
-	switch(mode) {
-		case MODE_SHAPE:
-			previewShape->visible = true;	
-			shapeSheet->shape = previewShape;
-			entityProps->updateProps();					
-		break;
-		case MODE_IMAGE:
-			previewImage->visible = true;	
-			imageSheet->image = previewImage;
-			entityProps->updateProps();					
-		break;
-		case MODE_TEXT:
-			previewLabel->visible = true;	
-			labelSheet->label = previewLabel;
-			entityProps->updateProps();				
-		break;
-		case MODE_ENTITY:
-			previewEntity->visible = true;	
-			entityProps->updateProps();				
-		break;
-		case MODE_SOUND:
-			previewSound->visible = true;
-			soundSheet->sound = previewSound;
-			entityProps->updateProps();				
-		break;
-		case MODE_LINK:
-			previewInstance->visible = true;
-			instanceSheet->instance = previewInstance;
-			entityProps->updateProps();				
-		break;
-		case MODE_SPRITE:
-			previewSprite->visible = true;
-			spriteSheet->sprite = previewSprite;
-			entityProps->updateProps();				
-		break;
-		case MODE_PARTICLES:
-			previewEmitter->visible = true;
-			particleSheet->emitter =  previewEmitter;
-			entityProps->updateProps();				
-		break;
-
-	}
-
-}
-
-Entity *PolycodeScreenEditorMain::getCurrentLayer() {
-	return currentLayer;
-}
-
-void PolycodeScreenEditorMain::setCurrentLayer(Entity *newLayer, bool doAction) {
-
-	if(doAction) {
-		beforeData = new PolycodeScreenEditorActionData();
-		beforeData->entry.entity = currentLayer;
-	}
-
-	if(currentLayer) {
-		currentLayer->processInputEvents = false;
-	}
-	currentLayer = newLayer;
-	if(currentLayer) {
-		currentLayer->processInputEvents = true;
-	}
-	
-	if(doAction) {
-		PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-		data->entry.entity = currentLayer;
-		editor->didAction("set_current_layer", beforeData, data, false);
-	}
-	dispatchEvent(new Event(), Event::CHANGE_EVENT);
-}
-
-void PolycodeScreenEditorMain::Resize(Number width, Number height) {
-
-
-	viewOptionsBg->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, ceil(width), 30);
-	viewOptions->setPosition(0, height-30);
-
-	propertiesBg->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, ceil(width), 30);
-	
-	toolPaletteBg->setPrimitiveOptions(ScenePrimitive::TYPE_VPLANE, 100,height-60);
-			
-	if(firstResize && width > 0.0 && height > 0.0) {
-		baseEntity->setPosition(width/2.0, height/2.0);
-		firstResize = false;
-	}
-	
-	UIElement::Resize(getWidth(), getHeight());
-}
-
-void PolycodeScreenEditorMain::handleDroppedFile(OSFileEntry file, Number x, Number y) {
-
-	Entity *newEntity = NULL;
-	
-	if(file.extension == "png") {
-		UIImage *newImage = new UIImage(file.fullPath);
-		newImage->setAnchorPoint(0.0, 0.0, 0.0);
-		currentLayer->addChild(newImage);
-		newImage->setPosition(x-baseEntity->getPosition2D().x,y-baseEntity->getPosition2D().y);
-		newEntity = newImage;
-		newImage->processInputEvents = true;
-	}
-	
-	if(newEntity) {
-		newEntity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-		newEntity->blockMouseInput = true;
-	}
-}
-
-PolycodeScreenEditor::PolycodeScreenEditor() : PolycodeEditor(true){
-
-	mainSizer = new UIHSizer(100,100,340,false);
-	addChild(mainSizer);	
-
-	editorMain = new PolycodeScreenEditorMain(this);
-	editorMain->addEventListener(this, Event::CHANGE_EVENT);
-	mainSizer->addLeftChild(editorMain);
-	
-	propSizer = new PropertiesSizer();
-	mainSizer->addRightChild(propSizer);
-	
-	treeView = new EntityTreeView(editorMain->layerBaseEntity);
-	treeView->addEventListener(this, Event::CHANGE_EVENT);
-
-	editorMain->treeView = treeView;
-
-	treeView->newLayerButton->addEventListener(this, UIEvent::CLICK_EVENT);
-	treeView->targetLayerButton->addEventListener(this, UIEvent::CLICK_EVENT);
-		
-	propSizer->sizer->addTopChild(treeView);
-	propSizer->sizer->addBottomChild(editorMain->entityProps);
-	
-	propSizer->sizer->blockMouseInput = true;
-
-	treeView->Refresh();
-}
-
-String PolycodeScreenEditor::Copy(void **data) {
-	if(editorMain->baseEntity->hasFocus) {
-		return editorMain->Copy(data);
-	} else {
-		return "";
-	}
-}
-
-void PolycodeScreenEditor::Paste(void *data, String clipboardType) {
-	if(editorMain->baseEntity->hasFocus) {
-		editorMain->Paste(data, clipboardType);
-	}
-}
-
-void PolycodeScreenEditor::destroyClipboardData(void *data, String type) {
-	editorMain->destroyClipboardData(data, type);
-}
-
-String PolycodeScreenEditorMain::Copy(void **data) {
-	if(selectedEntities.size() > 0) {
-		EntityClipboardData *newData = new EntityClipboardData();
-		for(int i=0; i < selectedEntities.size(); i++) {
-			Entity *clone = (Entity*)selectedEntities[i]->Clone(true, true);
-			newData->entities.push_back(clone);
-		}
-		*data = (void*) newData;
-	}
-	return "Entity";
-}
-
-void PolycodeScreenEditorMain::Paste(void *data, String clipboardType) {
-	if(!data)
-		return;
-	if(clipboardType == "Entity") {
-		selectEntity(NULL);
-		multiSelect = true;
-		EntityClipboardData *newData = (EntityClipboardData*) data;
-		if(currentLayer) {
-		
-			PolycodeScreenEditorActionData *beforeData = new PolycodeScreenEditorActionData();
-			PolycodeScreenEditorActionData *data = new PolycodeScreenEditorActionData();
-			data->reverse = false;
-	
-			for(int i=0; i < newData->entities.size(); i++) {
-				Entity *entity = (Entity*) newData->entities[i]->Clone(true, true);
-				entity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);
-				entity->addEventListener(this, InputEvent::EVENT_MOUSEUP);
-				
-				bool addToLayer = true;
-				if(selectedEntities.size() > 0) {
-					if(selectedEntities[0] != currentLayer) {
-						selectedEntities[0]->getParentEntity()->addChild(entity);
-						addToLayer = false;
-					}
-				}
-				
-				if(addToLayer) {
-					currentLayer->addChild(entity);
-				}
-				applyEditorProperties(entity);
-				selectEntity(entity, false);
-
-				beforeData->entries.push_back(PolycodeScreenEditorActionDataEntry(entity));				
-				data->entries.push_back(PolycodeScreenEditorActionDataEntry(entity));
-				
-			}
-			
-			editor->didAction("paste", beforeData, data);			
-		}
-		multiSelect = false;
-	}
-	if(treeView) {
-		treeView->Refresh();		
-	}											
-}
-
-void PolycodeScreenEditorMain::destroyClipboardData(void *data, String type) {
-	if(type == "Entity") {
-		EntityClipboardData *oldData = (EntityClipboardData*) data;
-		for(int i=0; i < oldData->entities.size(); i++) {
-			delete oldData->entities[i];
-		}
-		delete oldData;
-	}
-}
-
-void PolycodeScreenEditor::Activate() {
-	editorMain->labelSheet->refreshFonts();
-}
-
-void PolycodeScreenEditor::doAction(String actionName, PolycodeEditorActionData *data) {
-	editorMain->doAction(actionName, data);
-}
-
-void PolycodeScreenEditor::saveCurveToObject(ObjectEntry *entry, BezierCurve *curve) {
-	ObjectEntry *controlPoints = entry->addChild("controlPoints");
-	
-	for(int i=0; i < curve->getNumControlPoints(); i++) {
-		ObjectEntry *controlPointEntry = controlPoints->addChild("controlPoint");
-		ObjectEntry *pt1 = controlPointEntry->addChild("pt1");
-		pt1->addChild("x", curve->getControlPoint(i)->p1.x);
-		pt1->addChild("y", curve->getControlPoint(i)->p1.y);		
-
-		ObjectEntry *pt2 = controlPointEntry->addChild("pt2");
-		pt2->addChild("x", curve->getControlPoint(i)->p2.x);
-		pt2->addChild("y", curve->getControlPoint(i)->p2.y);		
-
-		ObjectEntry *pt3 = controlPointEntry->addChild("pt3");
-		pt3->addChild("x", curve->getControlPoint(i)->p3.x);
-		pt3->addChild("y", curve->getControlPoint(i)->p3.y);		
-
-	}
-}
-
-void PolycodeScreenEditor::saveEntityToObjectEntry(Entity *entity, ObjectEntry *entry) {
-
-	if(entity->editorOnly)
-		return;
-
-	entry->addChild("id", entity->id);
-	
-	//if(entity->getNumTags() > 0) {
-	String tagString = "";
-	for(int i=0; i < entity->getNumTags(); i++) {
-		if(i != 0) {
-			tagString += ",";
-		}
-		tagString += entity->getTagAtIndex(i);
-	}
-	entry->addChild("tags", tagString);
-	//}
-
-	if(entity->entityProps.size() > 0) {
-		ObjectEntry *props = entry->addChild("props");		
-		for(int i=0; i < entity->entityProps.size(); i++) {
-			ObjectEntry *prop = props->addChild("prop");
-			prop->addChild("name", entity->entityProps[i].propName);
-			prop->addChild("value", entity->entityProps[i].propValue);
-		}
-	}
-
-	if(dynamic_cast<SceneEntityInstance*>(entity) && entity != editorMain->layerBaseEntity) {
-		if(!(*(entry))["type"])
-			entry->addChild("type", "SceneEntityInstance");
-		SceneEntityInstance *instance = (SceneEntityInstance*) entity;
-		ObjectEntry *instanceEntry = entry->addChild("SceneEntityInstance");		
-		instanceEntry->addChild("filePath", instance->getFileName());
-	}
-	
-	if(dynamic_cast<UIImage*>(entity)) {
-		if(!(*(entry))["type"])
-			entry->addChild("type", "UIImage");
-		UIImage *image = (UIImage*) entity;
-		ObjectEntry *imageEntry = entry->addChild("UIImage");		
-		imageEntry->addChild("filePath", image->getTexture()->getResourcePath());
-	}
-
-	
-	if(dynamic_cast<SceneParticleEmitter*>(entity)) {
-		if(!(*(entry))["type"])
-			entry->addChild("type", "SceneParticleEmitter");
-			
-		SceneParticleEmitter *emitter = (SceneParticleEmitter*) entity;
-		
-		ObjectEntry *emitterEntry = entry->addChild("SceneParticleEmitter");		
-
-		emitterEntry->addChild("texturePath", emitter->getParticleTexture()->getResourcePath());
-		emitterEntry->addChild("radiusX", emitter->emitterRadius.x);
-		emitterEntry->addChild("radiusY", emitter->emitterRadius.y);
-
-		emitterEntry->addChild("dirX", emitter->dirVector.x);
-		emitterEntry->addChild("dirY", emitter->dirVector.y);
-
-		emitterEntry->addChild("deviationX", emitter->deviation.x);
-		emitterEntry->addChild("deviationY", emitter->deviation.y);
-
-		emitterEntry->addChild("gravX", emitter->gravVector.x);
-		emitterEntry->addChild("gravY", emitter->gravVector.y);
-
-		emitterEntry->addChild("brightnessDeviation", emitter->brightnessDeviation);
-		emitterEntry->addChild("particleSize", emitter->particleSize);
-		emitterEntry->addChild("perlinModSize", emitter->perlinModSize);
-		emitterEntry->addChild("perlinEnabled", emitter->perlinEnabled);
-		emitterEntry->addChild("particleSpeedMod", emitter->particleSpeedMod);
-
-		emitterEntry->addChild("rotationSpeed", emitter->rotationSpeed);
-		emitterEntry->addChild("rotationFollowsPath", emitter->rotationFollowsPath);
-		emitterEntry->addChild("lifespan", emitter->lifespan);
-		emitterEntry->addChild("particleCount", (int)emitter->getNumParticles());
-
-		emitterEntry->addChild("useScaleCurves", emitter->useScaleCurves);
-		emitterEntry->addChild("useColorCurves", emitter->useColorCurves);
-
-		emitterEntry->addChild("ignoreParentMatrix", emitter->getIgnoreParentMatrix());
-
-		saveCurveToObject(emitterEntry->addChild("scaleCurve"), &emitter->scaleCurve);
-
-		saveCurveToObject(emitterEntry->addChild("colorCurveR"), &emitter->colorCurveR);
-		saveCurveToObject(emitterEntry->addChild("colorCurveG"), &emitter->colorCurveG);
-		saveCurveToObject(emitterEntry->addChild("colorCurveB"), &emitter->colorCurveB);
-		saveCurveToObject(emitterEntry->addChild("colorCurveA"), &emitter->colorCurveA);						
-
-		emitterEntry->addChild("particleBlendMode", (int)emitter->getParticleBlendingMode());		
-		
-	}
-		
-	
-	if(dynamic_cast<SceneSprite*>(entity)) {
-		if(!(*(entry))["type"])
-			entry->addChild("type", "SceneSprite");
-		SceneSprite *sprite = (SceneSprite*) entity;
-		
-		ObjectEntry *spriteEntry = entry->addChild("SceneSprite");
-		spriteEntry->addChild("filePath", sprite->getFileName());
-		
-		String animName = "";
-		if(sprite->getCurrentAnimation()) {
-			animName = sprite->getCurrentAnimation()->name;
-		}
-		spriteEntry->addChild("anim", animName);
-	}	
-	
-	if(dynamic_cast<SceneLabel*>(entity)) {
-		SceneLabel *label = (SceneLabel*) entity;
-		
-		if(!(*(entry))["type"])
-			entry->addChild("type", "SceneLabel");
-		ObjectEntry *labelEntry = entry->addChild("SceneLabel");		
-		labelEntry->addChild("text", label->getText());
-		labelEntry->addChild("font", label->getLabel()->getFont()->getFontName());
-		labelEntry->addChild("size", (int)label->getLabel()->getSize());
-		labelEntry->addChild("aaMode", (int)label->getLabel()->getAntialiasMode());
-	}
-	
-	if(dynamic_cast<SceneSound*>(entity)) {
-		SceneSound *sound = (SceneSound*) entity;
-		
-		if(!(*(entry))["type"])
-			entry->addChild("type", "SceneSound");
-		ObjectEntry *soundEntry = entry->addChild("SceneSound");		
-		soundEntry->addChild("filePath", sound->getSound()->getFileName());
-		soundEntry->addChild("refDistance", sound->getSound()->getReferenceDistance());
-		soundEntry->addChild("maxDistance", sound->getSound()->getMaxDistance());
-		soundEntry->addChild("volume", sound->getSound()->getVolume());
-		soundEntry->addChild("pitch", sound->getSound()->getPitch());		
-	}	
-	
-	if(dynamic_cast<ScenePrimitive*>(entity)) {
-		if(!(*(entry))["type"])
-			entry->addChild("type", "ScenePrimitive");	
-		ScenePrimitive *shape = (ScenePrimitive*) entity;
-		ObjectEntry *shapeEntry = entry->addChild("ScenePrimitive");
-		shapeEntry->addChild("type", shape->getShapeType());
-		shapeEntry->addChild("width", shape->getWidth());
-		shapeEntry->addChild("height", shape->getHeight());
-		
-
-		shapeEntry->addChild("strokeEnabled", shape->strokeEnabled);
-		shapeEntry->addChild("strokeColorR", shape->strokeColor.r);
-		shapeEntry->addChild("strokeColorG", shape->strokeColor.g);
-		shapeEntry->addChild("strokeColorB", shape->strokeColor.b);
-		shapeEntry->addChild("strokeColorA", shape->strokeColor.a);
-		shapeEntry->addChild("strokeWidth", shape->strokeWidth);
-
-	}
-
-	if(!(*(entry))["type"])
-		entry->addChild("type", "Entity");
-	
-	entry->addChild("colorR", entity->color.r);
-	entry->addChild("colorG", entity->color.g);
-	entry->addChild("colorB", entity->color.b);
-	entry->addChild("colorA", entity->color.a);
-	
-	entry->addChild("blendMode", entity->blendingMode);
-	
-	entry->addChild("scaleX", entity->scale.x);	
-	entry->addChild("scaleY", entity->scale.y);
-	
-	entry->addChild("positionMode", entity->getPositionMode());	
-
-	entry->addChild("rotation", entity->getRotation());	
-	
-	entry->addChild("posX", entity->position.x);	
-	entry->addChild("posY", entity->position.y);
-	
-	entry->addChild("width", entity->getWidth());
-	entry->addChild("height", entity->getHeight());
-		
-	ObjectEntry *children = NULL;
-	
-	for(int i=0; i < entity->getNumChildren(); i++) {
-		if(!entity->getChildAtIndex(i)->editorOnly) {
-			if(!children)
-				children = entry->addChild("children");		
-			ObjectEntry *child = children->addChild("child");
-			saveEntityToObjectEntry((Entity*)entity->getChildAtIndex(i), child);
-		}
-	}
-}
-
-void PolycodeScreenEditor::saveFile() {
-	Object saveObject;
-	
-	saveObject.root.name = "Screen";
-	ObjectEntry *children = saveObject.root.addChild("root");
-	
-	saveEntityToObjectEntry(editorMain->layerBaseEntity, children);	
-//	saveObject.saveToXML("/Users/ivansafrin/Desktop/test2.xml");
-	saveObject.saveToBinary(filePath);
-	setHasChanges(false);	
-}
-
-void PolycodeScreenEditor::handleEvent(Event *event) {
-
-	if(event->getEventType() == "" && event->getEventCode() == Event::CHANGE_EVENT) {
-		if(event->getDispatcher() == treeView) {			
-			editorMain->selectEntity((Entity*)treeView->selectedEntity);
-		}
-
-		if(event->getDispatcher() == editorMain) {
-			if(editorMain->selectedEntities.size() > 0) {
-				treeView->selectedEntity = editorMain->selectedEntities[0];			
-			} else {
-				treeView->selectedEntity = NULL;
-			}
-			treeView->targetLayer = editorMain->getCurrentLayer();
-			treeView->Refresh();				
-		}
-
-	}
-
-	if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CLICK_EVENT) {
-		if(event->getDispatcher() == treeView->newLayerButton) {
-			editorMain->addNewLayer("new_layer");
-		}
-
-		if(event->getDispatcher() == treeView->targetLayerButton) {
-			if(treeView->selectedEntity->getEntityProp("editor_type") == "layer") {
-				printf("setting new layer\n");
-				editorMain->setCurrentLayer((Entity*)treeView->selectedEntity);
-				treeView->targetLayer = editorMain->getCurrentLayer();
-				treeView->Refresh();				
-			} else {
-				PolycodeConsole::print("Select a layer to set as default layer.\n");
-			}
-		}
-
-	}
-	PolycodeEditor::handleEvent(event);
-}
-
-PolycodeScreenEditor::~PolycodeScreenEditor() {
-	delete mainSizer;
-	delete propSizer;
-	delete treeView;
-	delete editorMain;
-}
-
-void PolycodeScreenEditorMain::applyEditorOnlyChildren(Entity *entity) {
-	for(int i=0; i < entity->getNumChildren(); i++) {
-		applyEditorOnly((Entity*)entity->getChildAtIndex(i));
-	}
-}
-
-void PolycodeScreenEditorMain::applyEditorProperties(Entity *entity) {
-	
-	for(int i=0; i < entity->getNumChildren(); i++) {
-		applyEditorProperties((Entity*)entity->getChildAtIndex(i));
-	}
-
-	if(dynamic_cast<SceneEntityInstance*>(entity) && entity != layerBaseEntity) {
-		SceneEntityInstance *instance = (((SceneEntityInstance*)entity));
-		instance->cloneUsingReload = true;
-		applyEditorOnlyChildren(instance);
-		instance->getResourceEntry()->reloadOnFileModify = true;		
-		if(!CoreServices::getInstance()->getResourceManager()->hasResource(instance->getResourceEntry())) { 
-			instance->getResourceEntry()->addEventListener(this, Event::RESOURCE_RELOAD_EVENT);
-			CoreServices::getInstance()->getResourceManager()->addResource(instance->getResourceEntry());
-		}
-	} else if(dynamic_cast<SceneSprite*>(entity)) {	
-		SceneSprite *sprite = (((SceneSprite*)entity));	
-		sprite->getResourceEntry()->reloadOnFileModify = true;
-		if(!CoreServices::getInstance()->getResourceManager()->hasResource(sprite->getResourceEntry())) { 
-			CoreServices::getInstance()->getResourceManager()->addResource(sprite->getResourceEntry());
-		}		
-	} else if(dynamic_cast<ScenePrimitive*>(entity)) {
-	} else if(dynamic_cast<UIImage*>(entity)) {
-	} else if(dynamic_cast<SceneLabel*>(entity)) {
-
-	} else if(dynamic_cast<SceneSound*>(entity)) {
-		createSoundRef((SceneSound*)entity);
-	} else if(dynamic_cast<SceneParticleEmitter*>(entity)) {
-		createParticleRef((SceneParticleEmitter*)entity);		
-	} else {	
-		if(entity != layerBaseEntity && entity->getEntityProp("editor_type") != "layer") {
-			createEntityRef(entity);
-		}
-	}
-	
-	if(dynamic_cast<SceneMesh*>(entity)) {	
-		Texture *texture = ((SceneMesh*)entity)->getTexture();
-		if(texture) {
-			texture->reloadOnFileModify = true;
-		}
-	}
-	
-	if(entity->getEntityProp("editor_type") != "layer") {
-		entity->processInputEvents = true;
-	}
-	entity->blockMouseInput = true;
-	entity->addEventListener(this, InputEvent::EVENT_MOUSEDOWN);	
-	entity->addEventListener(this, InputEvent::EVENT_MOUSEUP);	
-//	entity->setAnchorPoint(0.0, 0.0, 0.0);
-
-}
-		
-bool PolycodeScreenEditor::openFile(OSFileEntry filePath) {
-	PolycodeEditor::openFile(filePath);	
-		
-	SceneEntityInstance *loadedInstance = new SceneEntityInstance(filePath.fullPath);
-	
-	editorMain->layerBaseEntity = loadedInstance;
-	editorMain->objectBaseEntity->addChild(loadedInstance);
-
-	editorMain->applyEditorProperties(editorMain->layerBaseEntity);
-
-	if(editorMain->layerBaseEntity->getNumChildren() == 0) {
-		editorMain->addNewLayer("default_layer");
-	} else {
-		editorMain->setCurrentLayer((Entity*)editorMain->layerBaseEntity->getChildAtIndex(0), false);
-		treeView->targetLayer = editorMain->getCurrentLayer();
-		
-		for(int i=0; i < editorMain->layerBaseEntity->getNumChildren(); i++) {
-			editorMain->layers.push_back((Entity*)editorMain->layerBaseEntity->getChildAtIndex(i));
-		}
-	}
-
-	((Entity*)(editorMain->layerBaseEntity->getParentEntity()))->moveChildBottom(editorMain->layerBaseEntity);
-
-	if(treeView) {
-		treeView->setRootEntity(editorMain->layerBaseEntity);
-		treeView->Refresh();
-	}
-	
-	editorMain->syncTransformToSelected();
-	
-	return true;
-}
-
-void PolycodeScreenEditor::handleDroppedFile(OSFileEntry file, Number x, Number y) {
-	editorMain->handleDroppedFile(file, x, y);
-}
-
-void PolycodeScreenEditor::Resize(int x, int y) {
-	PolycodeEditor::Resize(x,y);	
-	mainSizer->Resize(x,y);
-}
-
-PropertiesSizer::PropertiesSizer() : UIElement() {
-	sizer = new UIVSizer(100, 100, 220, true);
-	
-	addChild(sizer);
-}
-
-PropertiesSizer::~PropertiesSizer() {
-
-}
-
-void PropertiesSizer::Resize(Number width, Number height) {
-	sizer->Resize(getWidth(), getHeight());
-	UIElement::Resize(getWidth(), getHeight());
-}
-
-
-