Jelajahi Sumber

Merge pull request #355 from samiamwork/cleanup_and_screenentity_2

Remove need for parentAdjust in ScreenEntity and add UIMenuDivider (with scissor fixed)
Ivan Safrin 12 tahun lalu
induk
melakukan
f0d7a3b15a
53 mengubah file dengan 505 tambahan dan 432 penghapusan
  1. 5 1
      Bindings/Scripts/create_lua_library/CppHeaderParser.py
  2. 5 5
      Core/Contents/Include/PolyEntity.h
  3. 3 0
      Core/Contents/Include/PolyGlobals.h
  4. 4 4
      Core/Contents/Include/PolyParticleEmitter.h
  5. 31 0
      Core/Contents/Include/PolyRectangle.h
  6. 14 13
      Core/Contents/Include/PolyScreenEntity.h
  7. 2 2
      Core/Contents/Include/PolyScreenEntityInstance.h
  8. 2 2
      Core/Contents/Include/PolyScreenImage.h
  9. 2 2
      Core/Contents/Include/PolyScreenLabel.h
  10. 2 2
      Core/Contents/Include/PolyScreenShape.h
  11. 2 2
      Core/Contents/Include/PolyScreenSound.h
  12. 2 2
      Core/Contents/Include/PolyScreenSprite.h
  13. 11 27
      Core/Contents/Source/PolyEntity.cpp
  14. 2 2
      Core/Contents/Source/PolyGLES1Renderer.cpp
  15. 2 2
      Core/Contents/Source/PolyGLRenderer.cpp
  16. 0 1
      Core/Contents/Source/PolyGLSLShader.cpp
  17. 1 1
      Core/Contents/Source/PolyGLSLShaderModule.cpp
  18. 4 4
      Core/Contents/Source/PolyParticleEmitter.cpp
  19. 22 0
      Core/Contents/Source/PolyRectangle.cpp
  20. 168 217
      Core/Contents/Source/PolyScreenEntity.cpp
  21. 2 2
      Core/Contents/Source/PolyScreenEntityInstance.cpp
  22. 5 5
      Core/Contents/Source/PolyScreenImage.cpp
  23. 3 3
      Core/Contents/Source/PolyScreenLabel.cpp
  24. 4 4
      Core/Contents/Source/PolyScreenShape.cpp
  25. 2 2
      Core/Contents/Source/PolyScreenSound.cpp
  26. 2 2
      Core/Contents/Source/PolyScreenSprite.cpp
  27. 80 17
      IDE/Build/Mac OS X/English.lproj/MainMenu.xib
  28. 4 24
      IDE/Build/Mac OS X/Polycode.xcodeproj/project.pbxproj
  29. 5 9
      IDE/Build/Mac OS X/PolycodeAppDelegate.h
  30. 8 0
      IDE/Build/Mac OS X/PolycodeAppDelegate.m
  31. 0 1
      IDE/Contents/Source/ExampleBrowserWindow.cpp
  32. 0 1
      IDE/Contents/Source/NewFileWindow.cpp
  33. 0 1
      IDE/Contents/Source/NewProjectWindow.cpp
  34. 0 1
      IDE/Contents/Source/PolycodeConsole.cpp
  35. 0 3
      IDE/Contents/Source/PolycodeProject.cpp
  36. 6 6
      IDE/Contents/Source/PolycodeProjectBrowser.cpp
  37. 0 1
      IDE/Contents/Source/PolycodeRemoteDebugger.cpp
  38. 9 9
      IDE/Contents/Source/PolycodeScreenEditor.cpp
  39. 0 1
      IDE/Contents/Source/PolycodeTextEditor.cpp
  40. 0 1
      IDE/Contents/Source/TextureBrowser.cpp
  41. 2 2
      Modules/Contents/UI/Include/PolyUIBox.h
  42. 2 1
      Modules/Contents/UI/Include/PolyUIHScrollBar.h
  43. 22 0
      Modules/Contents/UI/Include/PolyUIMenu.h
  44. 4 1
      Modules/Contents/UI/Include/PolyUITree.h
  45. 4 1
      Modules/Contents/UI/Include/PolyUIVScrollBar.h
  46. 1 1
      Modules/Contents/UI/Source/PolyUIBox.cpp
  47. 1 1
      Modules/Contents/UI/Source/PolyUIHScrollBar.cpp
  48. 48 8
      Modules/Contents/UI/Source/PolyUIMenu.cpp
  49. 2 2
      Modules/Contents/UI/Source/PolyUIScrollContainer.cpp
  50. 2 2
      Modules/Contents/UI/Source/PolyUITextInput.cpp
  51. 1 1
      Modules/Contents/UI/Source/PolyUITree.cpp
  52. 1 1
      Modules/Contents/UI/Source/PolyUIVScrollBar.cpp
  53. 1 29
      Player/Contents/Source/PolycodePlayer.cpp

+ 5 - 1
Bindings/Scripts/create_lua_library/CppHeaderParser.py

@@ -1974,7 +1974,11 @@ class CppHeader( _CppHeader ):
             num_newlines = len(filter(lambda a: a=="\n", m))
             headerFileStr = headerFileStr.replace(m, "\n" * num_newlines)        
         headerFileStr = re.sub(r'extern[ ]+"[Cc]"[ ]*', "", headerFileStr)
-                
+
+        #Filter out "using" statements since they aren't properly handled currently
+        # TODO: properly handle "using" statements
+        headerFileStr = re.sub(r'using[\t ]+[^\n\r]+', "", headerFileStr)
+
         self.braceDepth = 0
         lex.lex()
         lex.input(headerFileStr)

+ 5 - 5
Core/Contents/Include/PolyEntity.h

@@ -86,12 +86,12 @@ namespace Polycode {
  			* @param ignoreEditorOnly If true, ignore all child entities where editorOnly is set to true (will still clone the entity you call Clone() on even if its editorOnly flag is set to true.
  			* @return The clone of the entity.
  			*/
-			virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly);
+			virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly) const;
 
 			/**
  			* This method must be implemented by all subvlasses implementing Clone.
  			*/
-			virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly);
+			virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const;
 		
 		
 			// ----------------------------------------------------------------------------------------------------------------
@@ -603,7 +603,7 @@ namespace Polycode {
 			* Returns the user data pointer.
 			* @return User data pointer
 			*/			
-			void *getUserData();
+			void *getUserData() const;
 				
 			/**
 			* Sets the entity's blending mode.
@@ -612,8 +612,8 @@ namespace Polycode {
 			*/
 			void setBlendingMode(int newBlendingMode);
 			
-			Entity *getEntityById(String id, bool recursive);
-			std::vector<Entity*> getEntitiesByTag(String tag, bool recursive);
+			Entity *getEntityById(String id, bool recursive) const;
+			std::vector<Entity*> getEntitiesByTag(String tag, bool recursive) const;
 						
 			Vector3 getChildCenter() const;
 			

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

@@ -39,6 +39,9 @@ THE SOFTWARE.
 	#pragma warning(disable:4996)
 	#pragma warning(disable:4309)
 	#define NULL 0
+	// Prevent windows.h includes from generating min/max macros that
+	// clash with the templates in <algorithm>
+	#define NOMINMAX
 
 
 #endif

+ 4 - 4
Core/Contents/Include/PolyParticleEmitter.h

@@ -228,7 +228,7 @@ namespace Polycode {
 			
 			Number particleSize;
 			
-			Texture *getParticleTexture();
+			Texture *getParticleTexture() const;
 			
 			void setParticleTexture(Texture *texture);
 		
@@ -242,7 +242,7 @@ namespace Polycode {
 							
 			int emitterType;
 			
-			bool getIgnoreParentMatrix();			
+			bool getIgnoreParentMatrix() const;
 			void setIgnoreParentMatrix(bool val);
 											
 		protected:
@@ -332,8 +332,8 @@ namespace Polycode {
 		ScreenParticleEmitter(const String& imageFile, int particleType, int emitterType, Number lifespan, unsigned int numParticles, Vector3 direction, Vector3 gravity, Vector3 deviation, Vector3 emitterRadius, Mesh *particleMesh = NULL, ScreenMesh *emitter = NULL);
 		virtual ~ScreenParticleEmitter();		
 		
-		virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly);
-		virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly);
+		virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly) const;
+		virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const;
 		
 		/**
 		* Returns the emitter (helper method for LUA).

+ 31 - 0
Core/Contents/Include/PolyRectangle.h

@@ -45,6 +45,37 @@ namespace Polycode {
 			*/						
 			void setRect(Number x, Number y, Number w, Number h);
 
+			/**
+			* Return a Rectangle formed by clipping this rectangle to the
+			* bounds of the passed rectangle.
+			*/
+			Rectangle Clipped(const Rectangle& rect) const;
+
+			/**
+			* Return the minimum X coordinate (the left edge).
+			*/
+			Number minX() const { return x; }
+
+			/**
+			* Return the maximum X coordinate (the right edge).
+			*/
+			Number maxX() const { return x + w; }
+
+			/**
+			 * Return the minimum Y coordinate (the top edge in a Y-down coordinate
+			 * system).
+			 */
+			Number minY() const { return y; }
+
+			/**
+			* Return the maximum Y coordinate (the bottom edge in a Y-down coordinate
+			* system).
+			*/
+			Number maxY() const { return y + h; }
+
+			bool operator==(const Rectangle& rect) const;
+			bool operator!=(const Rectangle& rect) const { return !(*this == rect); }
+
 			/**
 			* X position
 			*/									

+ 14 - 13
Core/Contents/Include/PolyScreenEntity.h

@@ -53,8 +53,8 @@ class _PolyExport ScreenEntity : public Entity {
 		ScreenEntity();
 		virtual ~ScreenEntity();
 		
-		virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly);
-		virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly);
+		virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly) const;
+		virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const;
 
 		void addEntity(Entity *newChild);
 		
@@ -98,11 +98,11 @@ class _PolyExport ScreenEntity : public Entity {
 		*/						
 		Number getRotation() const;
 			
-		MouseEventResult _onMouseDown(Number x, Number y, int mouseButton, int timestamp, Vector2 parentAdjust = Vector2(0,0));
-		MouseEventResult _onMouseUp(Number x, Number y, int mouseButton, int timestamp, Vector2 parentAdjust = Vector2(0,0));
-		MouseEventResult _onMouseMove(Number x, Number y, int timestamp, Vector2 parentAdjust = Vector2(0,0));
-		MouseEventResult _onMouseWheelUp(Number x, Number y, int timestamp, Vector2 parentAdjust = Vector2(0,0));
-		MouseEventResult _onMouseWheelDown(Number x, Number y, int timestamp, Vector2 parentAdjust = Vector2(0,0));
+		MouseEventResult _onMouseDown(Number x, Number y, int mouseButton, int timestamp);
+		MouseEventResult _onMouseUp(Number x, Number y, int mouseButton, int timestamp);
+		MouseEventResult _onMouseMove(Number x, Number y, int timestamp);
+		MouseEventResult _onMouseWheelUp(Number x, Number y, int timestamp);
+		MouseEventResult _onMouseWheelDown(Number x, Number y, int timestamp);
 	
 		virtual void onMouseDown(Number x, Number y){}
 		virtual void onMouseUp(Number x, Number y){}
@@ -113,12 +113,13 @@ class _PolyExport ScreenEntity : public Entity {
 		void _onKeyDown(PolyKEY key, wchar_t charCode);	
 		void _onKeyUp(PolyKEY key, wchar_t charCode);	
 		
-		Matrix4 getScreenConcatenatedMatrix();
+		Matrix4 getScreenConcatenatedMatrix() const;
 		
 		virtual void onKeyDown(PolyKEY key, wchar_t charCode){}
 		virtual void onKeyUp(PolyKEY key, wchar_t charCode){}
 		
-		bool hitTest(Number x, Number y);
+		bool hitTest(Number x, Number y) const;
+		bool hitTest(Vector2 v) const;
 	
 		Matrix4 buildPositionMatrix();
 		void adjustMatrixForChildren();
@@ -168,7 +169,7 @@ class _PolyExport ScreenEntity : public Entity {
 		 * Get the position mode.
 		 * @see setPositionMode()
 		 */
-		int getPositionMode();
+		int getPositionMode() const;
 
 		/**
 		 * Set a rectangle to which dragging will be restricted.
@@ -273,7 +274,7 @@ class _PolyExport ScreenEntity : public Entity {
 		 * Note: Make sure only entities of type ScreenEntity have the tag you're
 		 *       querying, or otherwise you will be treating an Entity as ScreenEntity.
 		 */
-		ScreenEntity *getScreenEntityById(String id, bool recursive);
+		ScreenEntity *getScreenEntityById(String id, bool recursive) const;
 
 		/**
 		 * Does the same as getEntitiesByID, but casts each result to ScreenEntity.
@@ -281,7 +282,7 @@ class _PolyExport ScreenEntity : public Entity {
 		 * Note: Make sure only entities of type ScreenEntity have the tag you're
 		 *       querying, or otherwise you will be treating an Entity as ScreenEntity.
 		 */
-		std::vector<ScreenEntity*> getScreenEntitiesByTag(String tag, bool recursive);
+		std::vector<ScreenEntity*> getScreenEntitiesByTag(String tag, bool recursive) const;
 		
 		/**
 		* If set to true, will block mouse events for underlaying entities.
@@ -299,7 +300,7 @@ class _PolyExport ScreenEntity : public Entity {
 		 * Get the hitbox of this ScreenEntity.
 		 * @see setHitBox()
 		 */
-		Rectangle getHitbox();
+		Rectangle getHitbox() const;
 
 
 		void setHitbox(Number width, Number height);

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

@@ -48,8 +48,8 @@ class ScreenEntityInstance : public ScreenEntity {
 
 		virtual ~ScreenEntityInstance();
 	
-		virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly);
-		virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly);
+		virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly) const;
+		virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const;
 		
 		void reloadEntityInstance();
 

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

@@ -63,8 +63,8 @@ namespace Polycode {
 		
 		virtual ~ScreenImage();
 		
-		virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly);
-		virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly);
+		virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly) const;
+		virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const;
 
 		/**
 		* Changes which part of the image is displayed.

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

@@ -45,8 +45,8 @@ namespace Polycode {
 			ScreenLabel(const String& text, int size, const String& fontName = "sans", int amode = 0, bool premultiplyAlpha = false);
 			virtual ~ScreenLabel();		
 		
-			virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly);
-			virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly);
+			virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly) const;
+			virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const;
 					
 			/**
 			* Sets a new text to the screen label.

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

@@ -44,8 +44,8 @@ namespace Polycode {
 			*/
 			ScreenShape(int shapeType, Number option1=0, Number option2=0, Number option3=0, Number option4=0);
 		
-			virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly);
-			virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly);
+			virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly) const;
+			virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const;
 				
 			virtual ~ScreenShape();
 			void Render();

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

@@ -47,8 +47,8 @@ namespace Polycode {
 			ScreenSound(const String& fileName, Number referenceDistance, Number maxDistance);
 			virtual ~ScreenSound();			
 
-			virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly);
-			virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly);
+			virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly) const;
+			virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const;
 
 			void Update();			
 			

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

@@ -75,8 +75,8 @@ class _PolyExport ScreenSprite : public ScreenShape
 		
 		virtual ~ScreenSprite();
 		
-		virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly);
-		virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly);
+		virtual Entity *Clone(bool deepClone, bool ignoreEditorOnly) const;
+		virtual void applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const;
 
 		/**
 		* Adds a new animation to the sprite. Animations are added by specifying a list of frame indexes and then can be played back by the specified name.

+ 11 - 27
Core/Contents/Source/PolyEntity.cpp

@@ -63,7 +63,7 @@ Entity::Entity() : EventDispatcher() {
 	tags = NULL;
 }
 
-Entity *Entity::getEntityById(String id, bool recursive) {
+Entity *Entity::getEntityById(String id, bool recursive) const {
 	for(int i=0;i<children.size();i++) {
 		if(children[i]->id == id) {
 			return children[i];
@@ -79,13 +79,13 @@ Entity *Entity::getEntityById(String id, bool recursive) {
 	return NULL;
 }
 
-Entity *Entity::Clone(bool deepClone, bool ignoreEditorOnly) {
+Entity *Entity::Clone(bool deepClone, bool ignoreEditorOnly) const {
 	Entity *newEntity = new Entity();
 	applyClone(newEntity, deepClone, ignoreEditorOnly);
 	return newEntity;
 }
 
-void Entity::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) {
+void Entity::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
 	clone->ownsChildren = ownsChildren;
 	clone->position = position;
 	clone->rotation = rotation;
@@ -139,7 +139,7 @@ void Entity::setOwnsChildrenRecursive(bool val) {
 	}
 }
 
-std::vector<Entity*> Entity::getEntitiesByTag(String tag, bool recursive) {
+std::vector<Entity*> Entity::getEntitiesByTag(String tag, bool recursive) const {
 
 	std::vector<Entity*> retVector;
 
@@ -162,7 +162,7 @@ void Entity::setUserData(void *userData) {
 	this->userData = userData;
 }
 
-void *Entity::getUserData() {
+void *Entity::getUserData() const {
 	return userData;
 }
 
@@ -405,31 +405,15 @@ void Entity::transformAndRender() {
 		isScissorEnabled = renderer->isScissorEnabled();
 		oldScissorBox = renderer->getScissorBox();
 		renderer->enableScissor(true);
-		
-		Polycode::Rectangle finalScrissorBox = scissorBox;		
-		
-		// make sure that our scissor box is constrained to the parent one if it exists
-		if(isScissorEnabled) {
-			if(finalScrissorBox.x < oldScissorBox.x)
-				finalScrissorBox.x = oldScissorBox.x;
-			if(finalScrissorBox.x > oldScissorBox.x + oldScissorBox.w)
-				finalScrissorBox.x = oldScissorBox.x + oldScissorBox.w;
-
-				
-			if(finalScrissorBox.x+finalScrissorBox.w > oldScissorBox.x + oldScissorBox.w)
-				finalScrissorBox.w = oldScissorBox.x + oldScissorBox.w - finalScrissorBox.x;
 
-			if(finalScrissorBox.y < oldScissorBox.y)
-				finalScrissorBox.y = oldScissorBox.y;
-			if(finalScrissorBox.y > oldScissorBox.y + oldScissorBox.h)
-				finalScrissorBox.y = oldScissorBox.y + oldScissorBox.h;
-
-			if(finalScrissorBox.y+finalScrissorBox.h > oldScissorBox.y + oldScissorBox.h)
-				finalScrissorBox.h = oldScissorBox.y + oldScissorBox.h - finalScrissorBox.y;
+		Rectangle finalScissorBox = scissorBox;
 
+		// make sure that our scissor box is constrained to the parent one if it exists
+		if(isScissorEnabled) {
+			finalScissorBox = finalScissorBox.Clipped(renderer->getScissorBox());
 		}
-		
-		renderer->setScissorBox(finalScrissorBox);
+
+		renderer->setScissorBox(finalScissorBox);
 	}
 		
 	renderer->pushMatrix();

+ 2 - 2
Core/Contents/Source/PolyGLES1Renderer.cpp

@@ -47,7 +47,7 @@ void OpenGLES1Renderer::Resize(int xRes, int yRes) {
     glLoadIdentity();
 	gluPerspective(fov,(GLfloat)xRes/(GLfloat)yRes,nearPlane,farPlane);
 	glViewport(0, 0, xRes, yRes);
-	glScissor(0, 0, xRes, yRes);
+	setScissorBox(0, 0, xRex, yRes);
 	
 	glMatrixMode(GL_MODELVIEW);
 	glLineWidth(1);
@@ -707,4 +707,4 @@ void OpenGLES1Renderer::EndRender() {
 
 OpenGLES1Renderer::~OpenGLES1Renderer() {
 	
-}
+}

+ 2 - 2
Core/Contents/Source/PolyGLRenderer.cpp

@@ -168,7 +168,7 @@ void OpenGLRenderer::Resize(int xRes, int yRes) {
     glLoadIdentity();
 	gluPerspective(fov,(GLfloat)xRes/(GLfloat)yRes,nearPlane,farPlane);
 	glViewport(0, 0, xRes, yRes);
-	glScissor(0, 0, xRes, yRes);
+	setScissorBox(Rectangle(0, 0, xRes, yRes));
 	
 	glMatrixMode(GL_MODELVIEW);
 	glLineWidth(1);
@@ -188,7 +188,7 @@ void OpenGLRenderer::Resize(int xRes, int yRes) {
 	GLint numBuffers;
 	glGetIntegerv(GL_MAX_DRAW_BUFFERS, &numBuffers);
 //	Logger::log("MAX_DRAW_BUFFERS: %d \n", numBuffers);
-	
+
 }
 
 void OpenGLRenderer::setDepthFunction(int depthFunction) {

+ 0 - 1
Core/Contents/Source/PolyGLSLShader.cpp

@@ -196,7 +196,6 @@ void GLSLShader::linkProgram() {
 		char name[128];
 		glGetActiveUniform(shader_id, GLuint(i), sizeof(name)-1, &name_len, &num, &type, name );
 		name[name_len] = 0;
-		GLuint location = glGetUniformLocation( shader_id, name );
 		
 		if(!(String(name).find("gl_") == 0)) {
 		switch(type) {

+ 1 - 1
Core/Contents/Source/PolyGLSLShaderModule.cpp

@@ -132,7 +132,7 @@ Shader *GLSLShaderModule::createShader(String name, String vpName, String fpName
 }
 
 Shader *GLSLShaderModule::createShader(TiXmlNode *node) {
-	TiXmlNode* pChild, *pChild2, *pChild3;	
+	TiXmlNode* pChild;
 	GLSLProgram *vp = NULL;
 	GLSLProgram *fp = NULL;
 	GLSLShader *retShader = NULL;

+ 4 - 4
Core/Contents/Source/PolyParticleEmitter.cpp

@@ -96,13 +96,13 @@ ScreenParticleEmitter::~ScreenParticleEmitter(){
 	}
 }
 
-Entity *ScreenParticleEmitter::Clone(bool deepClone, bool ignoreEditorOnly) {
+Entity *ScreenParticleEmitter::Clone(bool deepClone, bool ignoreEditorOnly) const {
 	ScreenParticleEmitter *newEmitter = new ScreenParticleEmitter("default.png", Particle::BILLBOARD_PARTICLE, ParticleEmitter::CONTINUOUS_EMITTER, 2.0, 0, 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));
 	applyClone(newEmitter, deepClone, ignoreEditorOnly);
 	return newEmitter;
 }
 
-void ScreenParticleEmitter::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) {
+void ScreenParticleEmitter::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
 	ScreenParticleEmitter *_clone = (ScreenParticleEmitter*) clone;
 
 	_clone->emitterRadius = this->emitterRadius;
@@ -214,7 +214,7 @@ ParticleEmitter::ParticleEmitter(const String& imageFile, Mesh *particleMesh, in
 	useScaleCurves = false;	
 }
 
-bool ParticleEmitter::getIgnoreParentMatrix() {
+bool ParticleEmitter::getIgnoreParentMatrix() const {
 	return ignoreParentMatrix;
 }
 
@@ -226,7 +226,7 @@ void ParticleEmitter::setIgnoreParentMatrix(bool val) {
 }
 
 
-Texture *ParticleEmitter::getParticleTexture() {
+Texture *ParticleEmitter::getParticleTexture() const {
 	return particleTexture;
 }
 

+ 22 - 0
Core/Contents/Source/PolyRectangle.cpp

@@ -21,6 +21,7 @@
 */
 
 #include "PolyRectangle.h"
+#include <algorithm> // for min/max
 
 using namespace Polycode;
 
@@ -30,3 +31,24 @@ void Rectangle::setRect(Number x, Number y, Number w, Number h) {
 	this->w = w;
 	this->h = h;		
 }
+
+Rectangle Rectangle::Clipped(const Rectangle& rect) const
+{
+	Rectangle result;
+
+	result.x = std::min(std::max(x, rect.x), rect.maxX());
+	result.w = std::max(std::min(maxX(), rect.maxX()), result.x) - result.x;
+
+	result.y = std::min(std::max(y, rect.y), rect.maxY());
+	result.h = std::max(std::min(maxY(), rect.maxY()), result.y) - result.y;
+
+	return result;
+}
+
+bool Rectangle::operator==(const Rectangle& rect) const
+{
+	if( x == rect.x && y == rect.y && w == rect.w && h == rect.h)
+		return true;
+
+	return false;
+}

+ 168 - 217
Core/Contents/Source/PolyScreenEntity.cpp

@@ -37,7 +37,7 @@ ScreenEntity::ScreenEntity() : Entity() {
 	color = Color(1.0f,1.0f,1.0f,1.0f);
 	width = 0;
 	height = 0;
-	setHitbox(1, 1);
+	setHitbox(0, 0);
 	backfaceCulled = false;
 	positionMode = POSITION_TOPLEFT;
 	mouseOver = false;
@@ -67,13 +67,13 @@ ScreenEntity::ScreenEntity() : Entity() {
 	
 }
 
-Entity *ScreenEntity::Clone(bool deepClone, bool ignoreEditorOnly) {
+Entity *ScreenEntity::Clone(bool deepClone, bool ignoreEditorOnly) const {
 	ScreenEntity *newEntity = new ScreenEntity();
 	applyClone(newEntity, deepClone, ignoreEditorOnly);
 	return newEntity;
 }
 
-void ScreenEntity::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) {
+void ScreenEntity::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
 	Entity::applyClone(clone, deepClone, ignoreEditorOnly);
 
 	ScreenEntity *_clone = (ScreenEntity*) clone;
@@ -272,31 +272,46 @@ bool isPointInsidePolygon2D(Polycode::Polygon *poly, const Vector2 &p) {
 }
 
 
-bool ScreenEntity::hitTest(const Number x, const Number y) {
+bool ScreenEntity::hitTest(const Number x, const Number y) const {
 
 	Vector3 v;	
 	Polygon testPoly;
+
+	// matrix will give the center of the entity
+	Matrix4 screenMatrix = getScreenConcatenatedMatrix();
+	if(positionMode == POSITION_TOPLEFT) {
+		// Translate hitbox so it matches the visible object bounds
+		// This is a bit of a hack because ScreenEntities are expected
+		// to rotate about their center and not their center point.
+		Matrix4 retMatrix;
+		retMatrix.setPosition(width/2.0, height/2.0, 0.0);
+		screenMatrix = screenMatrix * retMatrix;
+	}
 	
-	Matrix4 transformMatrix = getConcatenatedMatrix();
 	v = Vector3(hit.x, hit.y, 0);
-	v = transformMatrix * v;
+	v = screenMatrix * v;
 	testPoly.addVertex(v.x, v.y, 0.0);
 	
 	v = Vector3(hit.x+hit.w, hit.y, 0);
-	v = transformMatrix * v;
+	v = screenMatrix * v;
 	testPoly.addVertex(v.x, v.y, 0.0);
 
 	v = Vector3(hit.x+hit.w, hit.y+hit.h, 0);
-	v = transformMatrix * v;
+	v = screenMatrix * v;
 	testPoly.addVertex(v.x, v.y, 0.0);
 
 	v = Vector3(hit.x,hit.y+hit.h, 0);
-	v = transformMatrix * v;
+	v = screenMatrix * v;
 	testPoly.addVertex(v.x, v.y, 0.0);
 		
 	return isPointInsidePolygon2D(&testPoly, Vector2(x,y));
 }
 
+bool ScreenEntity::hitTest(Vector2 v) const
+{
+	return hitTest(v.x, v.y);
+}
+
 void ScreenEntity::setPositionMode(int newPositionMode) {
 	positionMode = newPositionMode;
 }
@@ -315,7 +330,7 @@ void ScreenEntity::_onKeyUp(PolyKEY key, wchar_t charCode) {
 	}
 }
 
-int ScreenEntity::getPositionMode() {
+int ScreenEntity::getPositionMode() const {
 	return positionMode;
 }
 
@@ -333,7 +348,7 @@ void ScreenEntity::clearDragLimits() {
 	dragLimits = NULL;
 }
 
-Rectangle ScreenEntity::getHitbox() {
+Rectangle ScreenEntity::getHitbox() const {
 	return hit;
 }
 
@@ -354,24 +369,23 @@ bool ScreenEntity::isDragged() {
 	return dragged;
 }
 
-Matrix4 ScreenEntity::getScreenConcatenatedMatrix() {
+Matrix4 ScreenEntity::getScreenConcatenatedMatrix() const {
 	Matrix4 retMatrix = transformMatrix;
 	if(positionMode == POSITION_TOPLEFT) {
-		Vector3 pos = retMatrix.getPosition();
-		retMatrix.setPosition(pos.x + width/2.0, pos.y + height/2.0, 0);
+		retMatrix.setPosition(position.x, position.y, position.z);
 	}
 	
 	if(parentEntity) {
-		return retMatrix * ((ScreenEntity*)parentEntity)->getScreenConcatenatedMatrix();		
+		return retMatrix * ((ScreenEntity*)parentEntity)->getScreenConcatenatedMatrix();
 	} else {
-		return retMatrix;	
-	}	
+		return retMatrix;
+	}
 }
 
-MouseEventResult ScreenEntity::_onMouseMove(Number x, Number y, int timestamp, Vector2 parentAdjust) {
+MouseEventResult ScreenEntity::_onMouseMove(Number x, Number y, int timestamp) {
 
 	if(dragged) {
-		Vector3 localCoordinate = Vector3(x+(parentAdjust.x*2.0),y+(parentAdjust.y*2.0),0);				
+		Vector3 localCoordinate = Vector3(x,y,0);
 				
 		if(parentEntity) {
 			Matrix4 inverse = ((ScreenEntity*)parentEntity)->getScreenConcatenatedMatrix().Inverse();
@@ -390,133 +404,100 @@ MouseEventResult ScreenEntity::_onMouseMove(Number x, Number y, int timestamp, V
 				position.y = dragLimits->y + dragLimits->h;
 		}
 	}
-	
 
 	MouseEventResult ret;
 	ret.hit = false;
 	ret.blocked = false;
 
-
 	if(processInputEvents && enabled) {
-	if(hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
-	
-	
-		Vector3 localCoordinate = Vector3(x+(parentAdjust.x*2.0),y+(parentAdjust.y*2.0),0);		
-		Matrix4 inverse = getConcatenatedMatrix().Inverse();
-		localCoordinate = inverse * localCoordinate;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.x += hit.w/2.0;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.y += hit.h/2.0;
+		if(hitTest(x,y)) {
 
+			Vector3 localCoordinate = Vector3(x,y,0);
+			Matrix4 inverse = getScreenConcatenatedMatrix().Inverse();
+			localCoordinate = inverse * localCoordinate;
 
-		
-		onMouseMove(localCoordinate.x,localCoordinate.y);
-		xmouse = localCoordinate.x;
-		ymouse = localCoordinate.y;
-		
-		dispatchEvent(new InputEvent(Vector2(localCoordinate.x,localCoordinate.y)-parentAdjust, timestamp), InputEvent::EVENT_MOUSEMOVE);
-		
-		if(!mouseOver) {
-				dispatchEvent(new InputEvent(Vector2(localCoordinate.x,localCoordinate.y)-parentAdjust, timestamp), InputEvent::EVENT_MOUSEOVER);
-				mouseOver = true;
-		}
-		ret.hit = true;
-		if(blockMouseInput) {
-			ret.blocked = true;
+			onMouseMove(localCoordinate.x,localCoordinate.y);
+			xmouse = localCoordinate.x;
+			ymouse = localCoordinate.y;
+
+			dispatchEvent(new InputEvent(Vector2(localCoordinate.x,localCoordinate.y), timestamp), InputEvent::EVENT_MOUSEMOVE);
+
+			if(!mouseOver) {
+					dispatchEvent(new InputEvent(Vector2(localCoordinate.x,localCoordinate.y), timestamp), InputEvent::EVENT_MOUSEOVER);
+					mouseOver = true;
+			}
+			ret.hit = true;
+			if(blockMouseInput) {
+				ret.blocked = true;
+			}
+
+		} else {
+			if(mouseOver) {
+
+				Vector3 localCoordinate = Vector3(x,y,0);
+				Matrix4 inverse = getScreenConcatenatedMatrix().Inverse();
+				localCoordinate = inverse * localCoordinate;
+
+				dispatchEvent(new InputEvent(Vector2(localCoordinate.x,localCoordinate.y), timestamp), InputEvent::EVENT_MOUSEOUT);
+				mouseOver = false;
+			}
 		}
 
-		
-	} else {
-		if(mouseOver) {
-		
-		Vector3 localCoordinate = Vector3(x+(parentAdjust.x*2.0),y+(parentAdjust.y*2.0),0);		
-		Matrix4 inverse = getConcatenatedMatrix().Inverse();
-		localCoordinate = inverse * localCoordinate;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.x += hit.w/2.0;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.y += hit.h/2.0;
-		
-		
-			dispatchEvent(new InputEvent(Vector2(localCoordinate.x,localCoordinate.y)-parentAdjust, timestamp), InputEvent::EVENT_MOUSEOUT);
-			mouseOver = false;
-		}		
-	}	
-
-		for(int i=children.size()-1;i>=0;i--) {			
-			Vector2 adjust = parentAdjust;
-			if(positionMode == POSITION_TOPLEFT)
-				adjust += Vector2(floor(width/2.0), floor(height/2.0));
-			
-			MouseEventResult childRes = ((ScreenEntity*)children[i])->_onMouseMove(x,y, timestamp, adjust);
+		for(int i=children.size()-1;i>=0;i--) {
+			MouseEventResult childRes = ((ScreenEntity*)children[i])->_onMouseMove(x,y, timestamp);
 			if(childRes.hit)
 				ret.hit = true;
-			if(childRes.blocked)
+			if(childRes.blocked) {
 				ret.blocked = true;
-			if(childRes.blocked)
 				break;
+			}
 		}
 	}
 	
 	return ret;
 }
 
-MouseEventResult ScreenEntity::_onMouseUp(Number x, Number y, int mouseButton, int timestamp, Vector2 parentAdjust) {
+MouseEventResult ScreenEntity::_onMouseUp(Number x, Number y, int mouseButton, int timestamp) {
 	MouseEventResult ret;
 	ret.hit = false;
 	ret.blocked = false;
-
 	
 	if(processInputEvents && enabled) {
-	if(hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
-		Vector3 localCoordinate = Vector3(x+(parentAdjust.x*2.0),y+(parentAdjust.y*2.0),0);
-		
-		Matrix4 inverse = getConcatenatedMatrix().Inverse();
-		localCoordinate = inverse * localCoordinate;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.x += hit.w/2.0;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.y += hit.h/2.0;
+		if(hitTest(x,y)) {
+			Vector3 localCoordinate = Vector3(x,y,0);
 
-		
-		onMouseUp(localCoordinate.x,localCoordinate.y);		
-		InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x,localCoordinate.y)-parentAdjust, timestamp);		
-		inputEvent->mouseButton = mouseButton;
-		dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEUP);
-		
-		ret.hit = true;
-		if(blockMouseInput) {
-			ret.blocked = true;
-		}
+			Matrix4 inverse = getScreenConcatenatedMatrix().Inverse();
+			localCoordinate = inverse * localCoordinate;
 
-	} else {
-		Vector3 localCoordinate = Vector3(x+(parentAdjust.x*2.0),y+(parentAdjust.y*2.0),0);
-		
-		Matrix4 inverse = getConcatenatedMatrix().Inverse();
-		localCoordinate = inverse * localCoordinate;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.x += hit.w/2.0;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.y += hit.h/2.0;
+			onMouseUp(localCoordinate.x,localCoordinate.y);
+			InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x,localCoordinate.y), timestamp);
+			inputEvent->mouseButton = mouseButton;
+			dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEUP);
 
-		
-		InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x,localCoordinate.y)-parentAdjust, timestamp);		
-		inputEvent->mouseButton = mouseButton;
-		dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEUP_OUTSIDE);	
-	}
+			ret.hit = true;
+			if(blockMouseInput) {
+				ret.blocked = true;
+			}
+
+		} else {
+			Vector3 localCoordinate = Vector3(x,y,0);
+
+			Matrix4 inverse = getScreenConcatenatedMatrix().Inverse();
+			localCoordinate = inverse * localCoordinate;
+
+			InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x,localCoordinate.y), timestamp);
+			inputEvent->mouseButton = mouseButton;
+			dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEUP_OUTSIDE);
+		}
 
-		for(int i=children.size()-1;i>=0;i--) {			
-			Vector2 adjust = parentAdjust;
-			if(positionMode == POSITION_TOPLEFT)
-				adjust += Vector2(floor(width/2.0), floor(height/2.0));
-			MouseEventResult childRes = ((ScreenEntity*)children[i])->_onMouseUp(x,y, mouseButton, timestamp, adjust);
+		for(int i=children.size()-1;i>=0;i--) {
+			MouseEventResult childRes = ((ScreenEntity*)children[i])->_onMouseUp(x,y, mouseButton, timestamp);
 			if(childRes.hit)
 				ret.hit = true;
-			if(childRes.blocked)
+			if(childRes.blocked) {
 				ret.blocked = true;
-			if(childRes.blocked)
 				break;
+			}
 			
 		}
 	}
@@ -524,92 +505,75 @@ MouseEventResult ScreenEntity::_onMouseUp(Number x, Number y, int mouseButton, i
 	return ret;
 }
 
-MouseEventResult ScreenEntity::_onMouseWheelUp(Number x, Number y, int timestamp, Vector2 parentAdjust) {
+MouseEventResult ScreenEntity::_onMouseWheelUp(Number x, Number y, int timestamp) {
 
 	MouseEventResult ret;
 	ret.hit = false;
 	ret.blocked = false;
 	
 	if(processInputEvents && enabled) {
-	if(hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
-		Vector3 localCoordinate = Vector3(x+(parentAdjust.x*2.0),y+(parentAdjust.y*2.0),0);
-		
-		Matrix4 inverse = getConcatenatedMatrix().Inverse();
-		localCoordinate = inverse * localCoordinate;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.x += hit.w/2.0;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.y += hit.h/2.0;
+		if(hitTest(x,y)) {
+			Vector3 localCoordinate = Vector3(x,y,0);
 
-		
-		onMouseWheelUp(localCoordinate.x,localCoordinate.y);
-		
-		InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x,localCoordinate.y)-parentAdjust, timestamp);		
-		dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEWHEEL_UP);
-		
-		ret.hit = true;
-		if(blockMouseInput) {
-			ret.blocked = true;
-		}
+			Matrix4 inverse = getScreenConcatenatedMatrix().Inverse();
+			localCoordinate = inverse * localCoordinate;
 
-	}
+			onMouseWheelUp(localCoordinate.x,localCoordinate.y);
+
+			InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x,localCoordinate.y), timestamp);
+			dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEWHEEL_UP);
 
-		for(int i=children.size()-1;i>=0;i--) {			
-			Vector2 adjust = parentAdjust;
-			if(positionMode == POSITION_TOPLEFT)
-				adjust += Vector2(floor(width/2.0), floor(height/2.0));
-			MouseEventResult childRes = ((ScreenEntity*)children[i])->_onMouseWheelUp(x,y, timestamp, adjust);
+			ret.hit = true;
+			if(blockMouseInput) {
+				ret.blocked = true;
+			}
+
+		}
+
+		for(int i=children.size()-1;i>=0;i--) {
+			MouseEventResult childRes = ((ScreenEntity*)children[i])->_onMouseWheelUp(x,y, timestamp);
 			if(childRes.hit)
 				ret.hit = true;
-			if(childRes.blocked)
+			if(childRes.blocked) {
 				ret.blocked = true;
-			if(childRes.blocked)
 				break;
+			}
 		}
 	}
 	return ret;	
 }
 
-MouseEventResult ScreenEntity::_onMouseWheelDown(Number x, Number y, int timestamp, Vector2 parentAdjust) {
+MouseEventResult ScreenEntity::_onMouseWheelDown(Number x, Number y, int timestamp) {
 	MouseEventResult ret;
 	ret.hit = false;
 	ret.blocked = false;
 	
 	if(processInputEvents && enabled) {
-	if(hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
-		Vector3 localCoordinate = Vector3(x+(parentAdjust.x*2.0),y+(parentAdjust.y*2.0),0);
-		
-		Matrix4 inverse = getConcatenatedMatrix().Inverse();
-		localCoordinate = inverse * localCoordinate;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.x += hit.w/2.0;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.y += hit.h/2.0;
+		if(hitTest(x,y)) {
+			Vector3 localCoordinate = Vector3(x,y,0);
 
-		
-		onMouseWheelDown(localCoordinate.x,localCoordinate.y);
-		
-		InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x,localCoordinate.y)-parentAdjust, timestamp);		
-		dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEWHEEL_DOWN);
-		
-		ret.hit = true;
-		if(blockMouseInput) {
-			ret.blocked = true;
+			Matrix4 inverse = getScreenConcatenatedMatrix().Inverse();
+			localCoordinate = inverse * localCoordinate;
+
+			onMouseWheelDown(localCoordinate.x,localCoordinate.y);
+
+			InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x,localCoordinate.y), timestamp);
+			dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEWHEEL_DOWN);
+
+			ret.hit = true;
+			if(blockMouseInput) {
+				ret.blocked = true;
+			}
 		}
-	}
 
-		for(int i=children.size()-1;i>=0;i--) {			
-			Vector2 adjust = parentAdjust;
-			if(positionMode == POSITION_TOPLEFT)
-				adjust += Vector2(floor(width/2.0), floor(height/2.0));
-			
-			MouseEventResult childRes = ((ScreenEntity*)children[i])->_onMouseWheelDown(x,y, timestamp, adjust);
+		for(int i=children.size()-1;i>=0;i--) {
+			MouseEventResult childRes = ((ScreenEntity*)children[i])->_onMouseWheelDown(x,y, timestamp);
 			if(childRes.hit)
 				ret.hit = true;
-			if(childRes.blocked)
+			if(childRes.blocked) {
 				ret.blocked = true;
-			if(childRes.blocked)
 				break;
+			}
 			
 		}
 	}
@@ -617,68 +581,55 @@ MouseEventResult ScreenEntity::_onMouseWheelDown(Number x, Number y, int timesta
 	return ret;
 }
 
-
-MouseEventResult ScreenEntity::_onMouseDown(Number x, Number y, int mouseButton, int timestamp, Vector2 parentAdjust) {
+MouseEventResult ScreenEntity::_onMouseDown(Number x, Number y, int mouseButton, int timestamp) {
 	MouseEventResult ret;
 	ret.hit = false;
 	ret.blocked = false;
-			
+
 	if(processInputEvents && enabled) {
-	if(hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
-		Vector3 localCoordinate = Vector3(x+(parentAdjust.x*2.0),y+(parentAdjust.y*2.0),0);
-		
-		Matrix4 inverse = getConcatenatedMatrix().Inverse();
-		localCoordinate = inverse * localCoordinate;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.x += hit.w/2.0;
-		if(positionMode == POSITION_TOPLEFT)
-			localCoordinate.y += hit.h/2.0;
+		if(hitTest(x,y)) {
+			Vector3 localCoordinate = Vector3(x,y,0);
 
-		
-		onMouseDown(localCoordinate.x,localCoordinate.y);
-		
-		InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x,localCoordinate.y)-parentAdjust, timestamp);
-		
-		inputEvent->mouseButton = mouseButton;
-		dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEDOWN);
-		
-		if(timestamp - lastClickTicks < 400) {
-			InputEvent *inputEvent = new InputEvent(Vector2(x,y), timestamp);
-			inputEvent->mouseButton = mouseButton;			
-			dispatchEvent(inputEvent, InputEvent::EVENT_DOUBLECLICK);
-		}
-		lastClickTicks = timestamp;		
-		ret.hit = true;
-		if(blockMouseInput) {
-			ret.blocked = true;
+			Matrix4 inverse = getScreenConcatenatedMatrix().Inverse();
+			localCoordinate = inverse * localCoordinate;
+
+			onMouseDown(localCoordinate.x,localCoordinate.y);
+
+			InputEvent *inputEvent = new InputEvent(Vector2(localCoordinate.x,localCoordinate.y), timestamp);
+
+			inputEvent->mouseButton = mouseButton;
+			dispatchEvent(inputEvent, InputEvent::EVENT_MOUSEDOWN);
+
+			if(timestamp - lastClickTicks < 400) {
+				InputEvent *inputEvent = new InputEvent(Vector2(x,y), timestamp);
+				inputEvent->mouseButton = mouseButton;
+				dispatchEvent(inputEvent, InputEvent::EVENT_DOUBLECLICK);
+			}
+			lastClickTicks = timestamp;
+			ret.hit = true;
+			if(blockMouseInput) {
+				ret.blocked = true;
+			}
 		}
-	}
 
-	for(int i=children.size()-1;i>=0;i--) {			
-			Vector2 adjust = parentAdjust;
-			if(positionMode == POSITION_TOPLEFT)
-				adjust += Vector2(floor(width/2.0), floor(height/2.0));
-			MouseEventResult childRes = ((ScreenEntity*)children[i])->_onMouseDown(x,y, mouseButton, timestamp, adjust);
+		for(int i=children.size()-1;i>=0;i--) {
+			MouseEventResult childRes = ((ScreenEntity*)children[i])->_onMouseDown(x,y, mouseButton, timestamp);
 			if(childRes.hit)
 				ret.hit = true;
-			if(childRes.blocked)
+			if(childRes.blocked) {
 				ret.blocked = true;
-			if(childRes.blocked)
 				break;
+			}
 		}
-	}		
+	}
 	
 	return ret;
 }
 
 Vector2 ScreenEntity::getScreenPosition() const {
-	Vector2 ret = getPosition2D();
-	
-	if(parentEntity) {
-		return ret + ((ScreenEntity*)parentEntity)->getScreenPosition();
-	} else {
-		return ret;
-	}
+	Matrix4 screenTransform = getScreenConcatenatedMatrix();
+	Vector3 screenPosition = screenTransform.getPosition();
+	return Vector2(screenPosition.x, screenPosition.y);
 }
 
 void ScreenEntity::setRotation(Number rotation) {
@@ -707,7 +658,7 @@ Matrix4 ScreenEntity::buildPositionMatrix() {
 			posMatrix.m[3][1] = position.y*matrixAdj;
 			posMatrix.m[3][2] = position.z*matrixAdj;
 		break;
-	}	
+	}
 	
 	
 	if(snapToPixels) {
@@ -729,11 +680,11 @@ void ScreenEntity::adjustMatrixForChildren() {
 	}
 }
 
-ScreenEntity *ScreenEntity::getScreenEntityById(String id, bool recursive) {
+ScreenEntity *ScreenEntity::getScreenEntityById(String id, bool recursive) const {
 	return (ScreenEntity*)getEntityById(id, recursive);
 }
 
-std::vector<ScreenEntity*> ScreenEntity::getScreenEntitiesByTag(String tag, bool recursive) {
+std::vector<ScreenEntity*> ScreenEntity::getScreenEntitiesByTag(String tag, bool recursive) const {
 	std::vector<Entity*> entities = getEntitiesByTag(tag, recursive);
 	std::vector<ScreenEntity*> retEntities;
 	for(int i=0; i < entities.size(); i++) {

+ 2 - 2
Core/Contents/Source/PolyScreenEntityInstance.cpp

@@ -77,7 +77,7 @@ ScreenEntityInstanceResourceEntry *ScreenEntityInstance::getResourceEntry() {
 	return resourceEntry;
 }
 
-Entity *ScreenEntityInstance::Clone(bool deepClone, bool ignoreEditorOnly) {
+Entity *ScreenEntityInstance::Clone(bool deepClone, bool ignoreEditorOnly) const {
 	ScreenEntityInstance *newEntity;
 	if(cloneUsingReload) {
 		newEntity = new ScreenEntityInstance(fileName);
@@ -88,7 +88,7 @@ Entity *ScreenEntityInstance::Clone(bool deepClone, bool ignoreEditorOnly) {
 	return newEntity;
 }
 
-void ScreenEntityInstance::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) {
+void ScreenEntityInstance::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
 	if(cloneUsingReload) {
 		ScreenEntity::applyClone(clone, false, ignoreEditorOnly);
 	} else {

+ 5 - 5
Core/Contents/Source/PolyScreenImage.cpp

@@ -46,7 +46,7 @@ ScreenImage::ScreenImage(const String& fileName) : ScreenShape(ScreenShape::SHAP
 	height = texture->getHeight();	
 	setShapeSize(width, height);	
 	
-	positionMode = POSITION_TOPLEFT;
+	setPositionMode(POSITION_TOPLEFT);
 }
 
 ScreenImage::ScreenImage(Image *image) : ScreenShape(ScreenShape::SHAPE_RECT,1,1) {
@@ -59,7 +59,7 @@ ScreenImage::ScreenImage(Image *image) : ScreenShape(ScreenShape::SHAPE_RECT,1,1
 	height = texture->getHeight();	
 	setShapeSize(width, height);	
 	
-	positionMode = POSITION_TOPLEFT;	
+	setPositionMode(POSITION_TOPLEFT);	
 }
 
 ScreenImage::ScreenImage(Texture *texture) : ScreenShape(ScreenShape::SHAPE_RECT,1,1) {
@@ -72,20 +72,20 @@ ScreenImage::ScreenImage(Texture *texture) : ScreenShape(ScreenShape::SHAPE_RECT
 	height = texture->getHeight();	
 	setShapeSize(width, height);	
 	
-	positionMode = POSITION_TOPLEFT;	
+	setPositionMode(POSITION_TOPLEFT);
 }
 
 ScreenImage::~ScreenImage() {
 
 }
 
-Entity *ScreenImage::Clone(bool deepClone, bool ignoreEditorOnly) {
+Entity *ScreenImage::Clone(bool deepClone, bool ignoreEditorOnly) const {
 	ScreenImage *newImage = new ScreenImage(getTexture()->getResourcePath());
 	applyClone(newImage, deepClone, ignoreEditorOnly);
 	return newImage;
 }
 
-void ScreenImage::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) {
+void ScreenImage::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
 	ScreenShape::applyClone(clone, deepClone, ignoreEditorOnly);
 }
 

+ 3 - 3
Core/Contents/Source/PolyScreenLabel.cpp

@@ -37,7 +37,7 @@ ScreenLabel::ScreenLabel(const String& text, int size, const String& fontName, i
 	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size, amode, premultiplyAlpha);
 	texture = NULL;
 	updateTexture();
-	positionMode = POSITION_TOPLEFT;
+	setPositionMode(POSITION_TOPLEFT);
 	colorAffectsChildren = false;
 	positionAtBaseline = true;
 }
@@ -50,13 +50,13 @@ Label *ScreenLabel::getLabel() const {
 	return label;
 }
 
-Entity *ScreenLabel::Clone(bool deepClone, bool ignoreEditorOnly) {
+Entity *ScreenLabel::Clone(bool deepClone, bool ignoreEditorOnly) const {
 	ScreenLabel *newLabel = new ScreenLabel(getText(), label->getSize(), label->getFont()->getFontName(), label->getAntialiasMode());
 	applyClone(newLabel, deepClone, ignoreEditorOnly);
 	return newLabel;
 }
 
-void ScreenLabel::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) {
+void ScreenLabel::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
 	ScreenShape::applyClone(clone, deepClone, ignoreEditorOnly);
 	ScreenLabel *_clone = (ScreenLabel*) clone;
 	_clone->positionAtBaseline = positionAtBaseline;

+ 4 - 4
Core/Contents/Source/PolyScreenShape.cpp

@@ -45,7 +45,7 @@ ScreenShape::ScreenShape(int shapeType, Number option1, Number option2, Number o
 		
 	buildShapeMesh();
 	
-	positionMode = POSITION_CENTER;
+	setPositionMode(POSITION_CENTER);
 	strokeEnabled = false;
 }
 
@@ -66,19 +66,19 @@ void ScreenShape::operator=(const ScreenShape& copy) {
 	
 	strokeColor = copy.strokeColor;
 	
-	positionMode = POSITION_CENTER;
+	setPositionMode(POSITION_CENTER);
 	strokeEnabled = copy.strokeEnabled;	
 
 }
 
-Entity *ScreenShape::Clone(bool deepClone, bool ignoreEditorOnly) {
+Entity *ScreenShape::Clone(bool deepClone, bool ignoreEditorOnly) const {
 	ScreenShape *newEntity = new ScreenShape(ScreenShape::SHAPE_RECT, 1,1);
 	applyClone(newEntity, deepClone, ignoreEditorOnly);
 	return newEntity;
 
 }
 
-void ScreenShape::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) {
+void ScreenShape::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
 	ScreenEntity::applyClone(clone, deepClone, ignoreEditorOnly);
 	ScreenShape *_clone = (ScreenShape*) clone;
 	*_clone = *this;

+ 2 - 2
Core/Contents/Source/PolyScreenSound.cpp

@@ -50,13 +50,13 @@ void ScreenSoundListener::Update() {
 
 }
 
-Entity *ScreenSound::Clone(bool deepClone, bool ignoreEditorOnly) {
+Entity *ScreenSound::Clone(bool deepClone, bool ignoreEditorOnly) const {
 	ScreenSound *newSound = new ScreenSound(sound->getFileName(), sound->getReferenceDistance(), sound->getMaxDistance());
 	applyClone(newSound, deepClone, ignoreEditorOnly);
 	return newSound;
 }
 
-void ScreenSound::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) {
+void ScreenSound::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
 	ScreenEntity::applyClone(clone, deepClone, ignoreEditorOnly);
 }
 

+ 2 - 2
Core/Contents/Source/PolyScreenSprite.cpp

@@ -43,7 +43,7 @@ ScreenSprite::ScreenSprite(const String& fileName) : ScreenShape(ScreenShape::SH
 	loadFromFile(fileName);
 }
 
-Entity *ScreenSprite::Clone(bool deepClone, bool ignoreEditorOnly) {
+Entity *ScreenSprite::Clone(bool deepClone, bool ignoreEditorOnly) const {
 	ScreenSprite *newSprite = new ScreenSprite(getTexture()->getResourcePath(), spriteWidth, spriteHeight);
 	for(int i=0; i < animations.size(); i++) {
 		newSprite->addAnimation(animations[i]->name, animations[i]->frames, animations[i]->speed);
@@ -55,7 +55,7 @@ Entity *ScreenSprite::Clone(bool deepClone, bool ignoreEditorOnly) {
 	return newSprite;
 }
 
-void ScreenSprite::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) {
+void ScreenSprite::applyClone(Entity *clone, bool deepClone, bool ignoreEditorOnly) const {
 	ScreenShape::applyClone(clone, deepClone, ignoreEditorOnly);
 	
 }

+ 80 - 17
IDE/Build/Mac OS X/English.lproj/MainMenu.xib

@@ -1,23 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
 	<data>
-		<int key="IBDocument.SystemTarget">1060</int>
-		<string key="IBDocument.SystemVersion">11E53</string>
-		<string key="IBDocument.InterfaceBuilderVersion">2182</string>
-		<string key="IBDocument.AppKitVersion">1138.47</string>
-		<string key="IBDocument.HIToolboxVersion">569.00</string>
+		<int key="IBDocument.SystemTarget">1080</int>
+		<string key="IBDocument.SystemVersion">12D78</string>
+		<string key="IBDocument.InterfaceBuilderVersion">3084</string>
+		<string key="IBDocument.AppKitVersion">1187.37</string>
+		<string key="IBDocument.HIToolboxVersion">626.00</string>
 		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
-			<string key="NS.object.0">2182</string>
+			<string key="NS.object.0">3084</string>
 		</object>
 		<object class="NSArray" key="IBDocument.IntegratedClassDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
-			<string>NSOpenGLView</string>
-			<string>NSWindowTemplate</string>
-			<string>NSView</string>
+			<string>NSCustomObject</string>
 			<string>NSMenu</string>
 			<string>NSMenuItem</string>
-			<string>NSCustomObject</string>
+			<string>NSOpenGLView</string>
+			<string>NSView</string>
+			<string>NSWindowTemplate</string>
 		</object>
 		<object class="NSArray" key="IBDocument.PluginDependencies">
 			<bool key="EncodedWithXMLCoder">YES</bool>
@@ -683,7 +683,7 @@
 				<int key="NSWindowStyleMask">13</int>
 				<int key="NSWindowBacking">2</int>
 				<string key="NSWindowRect">{{335, 390}, {800, 600}}</string>
-				<int key="NSWTFlags">1954021376</int>
+				<int key="NSWTFlags">1685585920</int>
 				<string key="NSWindowTitle">Polycode</string>
 				<string key="NSWindowClass">NSWindow</string>
 				<nil key="NSViewClass"/>
@@ -697,10 +697,10 @@
 						<object class="NSOpenGLView" id="633009941">
 							<reference key="NSNextResponder" ref="439893737"/>
 							<int key="NSvFlags">1298</int>
-							<object class="NSPSMatrix" key="NSDrawMatrix"/>
 							<string key="NSFrameSize">{800, 600}</string>
 							<reference key="NSSuperview" ref="439893737"/>
 							<reference key="NSWindow"/>
+							<reference key="NSNextKeyView"/>
 							<object class="NSOpenGLPixelFormat" key="NSPixelFormat">
 								<object class="NSMutableData" key="NSPixelAttributes">
 									<bytes key="NS.bytes">AAAAYAAAAAA</bytes>
@@ -713,7 +713,7 @@
 					<reference key="NSWindow"/>
 					<reference key="NSNextKeyView" ref="633009941"/>
 				</object>
-				<string key="NSScreenRect">{{0, 0}, {1680, 1028}}</string>
+				<string key="NSScreenRect">{{0, 0}, {1440, 900}}</string>
 				<string key="NSMinSize">{400, 222}</string>
 				<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
 				<int key="NSWindowCollectionBehavior">128</int>
@@ -1987,6 +1987,73 @@
 		<object class="IBClassDescriber" key="IBDocument.Classes">
 			<object class="NSMutableArray" key="referencedPartialClassDescriptions">
 				<bool key="EncodedWithXMLCoder">YES</bool>
+				<object class="IBPartialClassDescription">
+					<string key="className">NSDocument</string>
+					<object class="NSMutableDictionary" key="actions">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>printDocument:</string>
+							<string>revertDocumentToSaved:</string>
+							<string>runPageLayout:</string>
+							<string>saveDocument:</string>
+							<string>saveDocumentAs:</string>
+							<string>saveDocumentTo:</string>
+						</object>
+						<object class="NSArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+							<string>id</string>
+						</object>
+					</object>
+					<object class="NSMutableDictionary" key="actionInfosByName">
+						<bool key="EncodedWithXMLCoder">YES</bool>
+						<object class="NSArray" key="dict.sortedKeys">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<string>printDocument:</string>
+							<string>revertDocumentToSaved:</string>
+							<string>runPageLayout:</string>
+							<string>saveDocument:</string>
+							<string>saveDocumentAs:</string>
+							<string>saveDocumentTo:</string>
+						</object>
+						<object class="NSArray" key="dict.values">
+							<bool key="EncodedWithXMLCoder">YES</bool>
+							<object class="IBActionInfo">
+								<string key="name">printDocument:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">revertDocumentToSaved:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">runPageLayout:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">saveDocument:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">saveDocumentAs:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+							<object class="IBActionInfo">
+								<string key="name">saveDocumentTo:</string>
+								<string key="candidateClassName">id</string>
+							</object>
+						</object>
+					</object>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/NSDocument.h</string>
+					</object>
+				</object>
 				<object class="IBPartialClassDescription">
 					<string key="className">PolycodeAppDelegate</string>
 					<string key="superclassName">NSObject</string>
@@ -2190,10 +2257,6 @@
 		</object>
 		<int key="IBDocument.localizationMode">0</int>
 		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
-		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
-			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
-			<integer value="1060" key="NS.object.0"/>
-		</object>
 		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
 			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
 			<integer value="3000" key="NS.object.0"/>

+ 4 - 24
IDE/Build/Mac OS X/Polycode.xcodeproj/project.pbxproj

@@ -503,21 +503,11 @@
 				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"\"$(SRCROOT)/../../../Core/Build/Mac OS X/build/Debug\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/libpng/projects/xcode/build/Release\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/physfs/Release\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/zlib/projects/xcode/Untitled/build/Debug\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/freetype\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/physfs/XcodeProject/physfs/build/Debug\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/physfs/Debug\"",
-					"\"$(SRCROOT)/../../../Modules/Build/Mac OS X/build/Debug\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/zlib\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/libpng\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/luajit/src\"",
 					"\"$(SRCROOT)/../../../Release/Darwin/Framework/Core/lib\"",
 					"\"$(SRCROOT)/../../../Release/Darwin/Framework/Core/Dependencies/lib\"",
 					"\"$(SRCROOT)/../../../Release/Darwin/Framework/Modules/lib\"",
 				);
+				MACOSX_DEPLOYMENT_TARGET = 10.6;
 				PRODUCT_NAME = Polycode;
 			};
 			name = Debug;
@@ -541,21 +531,11 @@
 				INSTALL_PATH = "$(HOME)/Applications";
 				LIBRARY_SEARCH_PATHS = (
 					"$(inherited)",
-					"\"$(SRCROOT)/../../../Core/Build/Mac OS X/build/Debug\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/libpng/projects/xcode/build/Release\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/physfs/Release\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/zlib/projects/xcode/Untitled/build/Debug\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/freetype\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/physfs/XcodeProject/physfs/build/Debug\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/physfs/Debug\"",
-					"\"$(SRCROOT)/../../../Modules/Build/Mac OS X/build/Debug\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/zlib\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/libpng\"",
-					"\"$(SRCROOT)/../../../Core/Dependencies/luajit/src\"",
 					"\"$(SRCROOT)/../../../Release/Darwin/Framework/Core/lib\"",
 					"\"$(SRCROOT)/../../../Release/Darwin/Framework/Core/Dependencies/lib\"",
 					"\"$(SRCROOT)/../../../Release/Darwin/Framework/Modules/lib\"",
 				);
+				MACOSX_DEPLOYMENT_TARGET = 10.6;
 				PRODUCT_NAME = Polycode;
 			};
 			name = Release;
@@ -581,7 +561,7 @@
 				);
 				ONLY_ACTIVE_ARCH = YES;
 				PREBINDING = NO;
-				SDKROOT = macosx10.6;
+				SDKROOT = macosx;
 			};
 			name = Debug;
 		};
@@ -605,7 +585,7 @@
 				);
 				ONLY_ACTIVE_ARCH = YES;
 				PREBINDING = NO;
-				SDKROOT = macosx10.6;
+				SDKROOT = macosx;
 			};
 			name = Release;
 		};

+ 5 - 9
IDE/Build/Mac OS X/PolycodeAppDelegate.h

@@ -14,21 +14,17 @@
 
 using namespace Polycode;
 
+@class PolycodeAppDelegate;
+
 class PolycodeAppEventHandler : public EventHandler {
 	
 public:
 	PolycodeAppEventHandler() {}
 	~PolycodeAppEventHandler() {}
 	
-	void handleEvent(Event *evt) {
-		switch(evt->getEventCode()) {
-			case PolycodeIDEApp::EVENT_SHOW_MENU:
-				[appDelegate showProjectMenu];
-			break;
-		}
-	}
-	
-	id appDelegate;
+	void handleEvent(Event *evt);
+
+	PolycodeAppDelegate* appDelegate;
 };
 
 @interface PolycodeAppDelegate : NSObject <NSApplicationDelegate> {

+ 8 - 0
IDE/Build/Mac OS X/PolycodeAppDelegate.m

@@ -8,6 +8,14 @@
 
 #import "PolycodeAppDelegate.h"
 
+void PolycodeAppEventHandler::handleEvent(Event *evt) {
+	switch(evt->getEventCode()) {
+		case PolycodeIDEApp::EVENT_SHOW_MENU:
+			[appDelegate showProjectMenu];
+			break;
+	}
+}
+
 @implementation PolycodeAppDelegate
 
 @synthesize window;

+ 0 - 1
IDE/Contents/Source/ExampleBrowserWindow.cpp

@@ -31,7 +31,6 @@ ExampleBrowserWindow::ExampleBrowserWindow() : UIWindow(L"Example Browser", 320,
 	
 	Config *conf = CoreServices::getInstance()->getConfig();	
 	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
-	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");
 	
 	
 	templateContainer = new UITreeContainer("boxIcon.png", L"Examples", 320, 410-topPadding-padding-padding-40);	

+ 0 - 1
IDE/Contents/Source/NewFileWindow.cpp

@@ -27,7 +27,6 @@ NewFileWindow::NewFileWindow() : UIWindow(L"Create New File", 580, 280) {
 	
 	Config *conf = CoreServices::getInstance()->getConfig();	
 	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
-	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");
 	
 	closeOnEscape = true;	
 	

+ 0 - 1
IDE/Contents/Source/NewProjectWindow.cpp

@@ -34,7 +34,6 @@ NewProjectWindow::NewProjectWindow() : UIWindow(L"Create New Project", 480, 280)
 	
 	Config *conf = CoreServices::getInstance()->getConfig();	
 	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
-	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");
 	
 	
 	templateContainer = new UITreeContainer("boxIcon.png", L"Templates", 200, 300-topPadding-padding-padding);	

+ 0 - 1
IDE/Contents/Source/PolycodeConsole.cpp

@@ -92,7 +92,6 @@ BackTraceWindow::BackTraceWindow() : UIElement() {
 
 	Config *conf = CoreServices::getInstance()->getConfig();	
 	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
-	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");		
 
 	labelBg = new ScreenShape(ScreenShape::SHAPE_RECT, 20,30);
 	labelBg->setPositionMode(ScreenEntity::POSITION_TOPLEFT);

+ 0 - 3
IDE/Contents/Source/PolycodeProject.cpp

@@ -215,9 +215,6 @@ bool PolycodeProject::saveFile() {
 	}
 
 	
-	unsigned int afMap[6] = {0,1,2,4,8,16};
-	unsigned int aaMap[4] = {0,2,4,6};
-		
 	configFile.root["antiAliasingLevel"]->intVal = data.aaLevel;
 	configFile.root["anisotropyLevel"]->intVal = data.anisotropy;
 	configFile.root["vSync"]->boolVal = data.vSync;

+ 6 - 6
IDE/Contents/Source/PolycodeProjectBrowser.cpp

@@ -102,7 +102,7 @@ void PolycodeProjectBrowser::handleEvent(Event *event) {
 
 	if(event->getDispatcher() == contextMenu) {
 		UIMenuItem *item = contextMenu->getSelectedItem();
-		
+
 		PolycodeProjectBrowserEvent *bEvent = new PolycodeProjectBrowserEvent();			
 		bEvent->command = item->_id;
 		dispatchEvent(bEvent, PolycodeProjectBrowserEvent::HANDLE_MENU_COMMAND);
@@ -119,13 +119,13 @@ void PolycodeProjectBrowser::handleEvent(Event *event) {
 
 			contextMenu->addOption("New File", "add_new_file");
 			contextMenu->addOption("New Project", "add_new_project");
-			contextMenu->addOption("New Folder", "add_new_folder");			
-			contextMenu->addOption("----------------", "");			
+			contextMenu->addOption("New Folder", "add_new_folder");
+			contextMenu->addDivider();
 			contextMenu->addOption("Add external files", "add_files");			
-			contextMenu->addOption("----------------", "");
+			contextMenu->addDivider();
 			contextMenu->addOption("Refresh", "refresh");
 			contextMenu->addOption("Rename", "rename");						
-			contextMenu->addOption("----------------", "");		
+			contextMenu->addDivider();
 			contextMenu->addOption("Remove", "remove");
 
 			contextMenu->fitToScreenVertical();
@@ -197,7 +197,7 @@ void PolycodeProjectBrowser::parseFolderIntoNode(UITree *node, String spath, Pol
 				data->fileEntry = entry;
 				data->type = 1;
 				data->parentProject = parentProject;			
-				UITree *newChild = node->addTreeChild("file.png", entry.name, (void*) data);
+				node->addTreeChild("file.png", entry.name, (void*) data);
 			}
 		}
 	}		

+ 0 - 1
IDE/Contents/Source/PolycodeRemoteDebugger.cpp

@@ -59,7 +59,6 @@ void PolycodeRemoteDebugger::handleEvent(Event *event) {
 	for(int i=0; i < debuggerClients.size(); i++) {
 		if(event->getDispatcher() == debuggerClients[i]->client) {		
 			ServerClientEvent *clientEvent = (ServerClientEvent*) event;
-			DebuggerClient *client = debuggerClients[i];
 			switch(clientEvent->getEventCode()) {
 				case ServerClientEvent::EVENT_CLIENT_DATA:				
 					switch(clientEvent->dataType) {			

+ 9 - 9
IDE/Contents/Source/PolycodeScreenEditor.cpp

@@ -296,8 +296,6 @@ PolycodeScreenEditorMain::PolycodeScreenEditorMain(PolycodeEditor *editor) {
 	
 	Config *conf = CoreServices::getInstance()->getConfig();	
 	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
-	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");	
-	Number padding = conf->getNumericValue("Polycode", "uiWindowSkinPadding");	
 
 	isScalingEntity = false;	
 	isDraggingEntity = false; 
@@ -2088,6 +2086,9 @@ void PolycodeScreenEditorMain::handleEvent(Event *event) {
 				case Polycode::KEY_LSHIFT:
 					multiSelect = true;
 				break;
+				default:
+					// We don't care about the other keys
+				break;
 			}
 		}
 		
@@ -2105,7 +2106,10 @@ void PolycodeScreenEditorMain::handleEvent(Event *event) {
 				case Polycode::KEY_RSHIFT:
 				case Polycode::KEY_LSHIFT:
 					multiSelect = false;
-				break;				
+				break;
+				default:
+					// We don't care about the other keys
+				break;
 			}
 		}
 	
@@ -2818,10 +2822,6 @@ void PolycodeScreenEditor::saveEntityToObjectEntry(ScreenEntity *entity, ObjectE
 
 	}
 
-	if(dynamic_cast<ScreenSound*>(entity)) {
-		ScreenSound *sound = ((ScreenSound*) entity);
-	}
-	
 	if(!(*(entry))["type"])
 		entry->addChild("type", "ScreenEntity");
 	
@@ -2890,7 +2890,7 @@ void PolycodeScreenEditor::handleEvent(Event *event) {
 
 	if(event->getEventType() == "UIEvent" && event->getEventCode() == UIEvent::CLICK_EVENT) {
 		if(event->getDispatcher() == treeView->newLayerButton) {
-			ScreenEntity *newLayer = editorMain->addNewLayer("new_layer");
+			editorMain->addNewLayer("new_layer");
 		}
 
 		if(event->getDispatcher() == treeView->targetLayerButton) {
@@ -2979,7 +2979,7 @@ bool PolycodeScreenEditor::openFile(OSFileEntry filePath) {
 	editorMain->applyEditorProperties(editorMain->layerBaseEntity);
 
 	if(editorMain->layerBaseEntity->getNumChildren() == 0) {
-		ScreenEntity *newLayer = editorMain->addNewLayer("default_layer");
+		editorMain->addNewLayer("default_layer");
 	} else {
 		editorMain->setCurrentLayer((ScreenEntity*)editorMain->layerBaseEntity->getChildAtIndex(0), false);
 		treeView->targetLayer = editorMain->getCurrentLayer();

+ 0 - 1
IDE/Contents/Source/PolycodeTextEditor.cpp

@@ -230,7 +230,6 @@ std::vector<SyntaxHighlightToken> PolycodeSyntaxHighlighter::parseGLSL(String te
 			}
 
 			if(ch == '*' && lastSeparator == '/' && mode != MODE_STRING) {
-				unsigned int old_mode = mode;
 				tokens[tokens.size()-1].type = MODE_COMMENT;
 				tokens[tokens.size()-2].type = MODE_COMMENT;				
 				mode = MODE_COMMENT;				

+ 0 - 1
IDE/Contents/Source/TextureBrowser.cpp

@@ -168,7 +168,6 @@ AssetBrowser::AssetBrowser() : UIWindow(L"Asset Browser", 850, 500) {
 	
 	Config *conf = CoreServices::getInstance()->getConfig();	
 	String fontName = conf->getStringValue("Polycode", "uiDefaultFontName");
-	int fontSize = conf->getNumericValue("Polycode", "uiDefaultFontSize");
 	
 	closeOnEscape = true;	
 	

+ 2 - 2
Modules/Contents/UI/Include/PolyUIBox.h

@@ -23,11 +23,11 @@
 #pragma once
 #include "PolyGlobals.h"
 #include "PolyScreenImage.h"
-#include "PolyScreenEntity.h"
+#include "PolyUIElement.h"
 
 namespace Polycode {
 	
-	class _PolyExport UIBox : public ScreenEntity {
+	class _PolyExport UIBox : public UIElement {
 	public:
 		UIBox(String imageFile, Number t, Number r, Number b, Number l, Number boxWidth, Number boxHeight);
 		~UIBox();

+ 2 - 1
Modules/Contents/UI/Include/PolyUIHScrollBar.h

@@ -23,10 +23,11 @@
 #pragma once
 #include "PolyGlobals.h"
 #include "PolyUIBox.h"
+#include "PolyUIElement.h"
 
 namespace Polycode {
 	
-	class _PolyExport UIHScrollBar : public ScreenEntity {
+	class _PolyExport UIHScrollBar : public UIElement {
 	public:
 		UIHScrollBar(Number width, Number height, Number initialRatio);
 		~UIHScrollBar();

+ 22 - 0
Modules/Contents/UI/Include/PolyUIMenu.h

@@ -26,6 +26,7 @@
 #include "PolyUIBox.h"
 
 namespace Polycode {
+	class ScreenLine;
 
 	/**
 	 * An single selectable entry in an UIMenu
@@ -34,6 +35,8 @@ namespace Polycode {
 		public:
 			UIMenuItem(String label, String _id, void *data, Number comboWidth, Number comboHeight);
 			~UIMenuItem();
+
+			virtual bool isSelectable();
 			
 			/**
 			 * The user-data associated with this entry, as set in UIMenu::addOption()
@@ -54,10 +57,22 @@ namespace Polycode {
 			String _id;
 
 		protected:
+			UIMenuItem();
+
 			ScreenLabel *itemLabel;
 			friend class UIMenu;
 	};
 
+	class _PolyExport UIMenuDivider : public UIMenuItem {
+	public:
+		UIMenuDivider(Number comboWidth, Number comboHeight);
+		~UIMenuDivider();
+		bool isSelectable();
+
+	protected:
+		ScreenLine* line;
+	};
+
 	/** 
 	 * A dropdown menu.
 	 *
@@ -86,6 +101,13 @@ namespace Polycode {
 			 */
 			UIMenuItem *addOption(String label, String _id, void *data = NULL);
 
+			/**
+			 * Add a non-selectable entry to the dropdown
+			 * used to separate sections of the menu
+			 *
+			 */
+			UIMenuItem *addDivider();
+
 			/**
 			 * Returns the currently selected item.
 			 *

+ 4 - 1
Modules/Contents/UI/Include/PolyUITree.h

@@ -22,6 +22,7 @@
 
 #pragma once
 #include "PolyGlobals.h"
+#include "PolyUIElement.h"
 #include "PolyScreenLabel.h"
 #include "PolyScreenImage.h"
 #include "PolyScreenShape.h"
@@ -35,8 +36,10 @@ using std::vector;
 
 namespace Polycode {
 
-	class _PolyExport UITree : public ScreenEntity {
+	class _PolyExport UITree : public UIElement {
 		public:
+			using UIElement::Resize;
+
 			UITree(String icon, String text, Number treeWidth, Number treeOffset=0);
 			~UITree();
 			

+ 4 - 1
Modules/Contents/UI/Include/PolyUIVScrollBar.h

@@ -22,12 +22,15 @@
 
 #pragma once
 #include "PolyGlobals.h"
+#include "PolyUIElement.h"
 #include "PolyUIBox.h"
 
 namespace Polycode {
 	
-	class _PolyExport UIVScrollBar : public ScreenEntity {
+	class _PolyExport UIVScrollBar : public UIElement {
 	public:
+		using UIElement::Resize;
+
 		UIVScrollBar(Number width, Number height, Number initialRatio);
 		~UIVScrollBar();
 		

+ 1 - 1
Modules/Contents/UI/Source/PolyUIBox.cpp

@@ -24,7 +24,7 @@
 
 using namespace Polycode;
 
-UIBox::UIBox(String imageFile, Number t, Number r, Number b, Number l, Number boxWidth, Number boxHeight) : ScreenEntity() {
+UIBox::UIBox(String imageFile, Number t, Number r, Number b, Number l, Number boxWidth, Number boxHeight) : UIElement() {
 	
 	setPositionMode(ScreenEntity::POSITION_TOPLEFT);	
 	

+ 1 - 1
Modules/Contents/UI/Source/PolyUIHScrollBar.cpp

@@ -29,7 +29,7 @@
 
 using namespace Polycode;
 
-UIHScrollBar::UIHScrollBar(Number width, Number height, Number initialRatio) : ScreenEntity() {
+UIHScrollBar::UIHScrollBar(Number width, Number height, Number initialRatio) : UIElement() {
 	
 	scrollValue = 0;
 	

+ 48 - 8
Modules/Contents/UI/Source/PolyUIMenu.cpp

@@ -27,6 +27,7 @@
 #include "PolyCoreServices.h"
 #include "PolyCore.h"
 #include "PolyConfig.h"
+#include "PolyScreenLine.h"
 
 using namespace Polycode;
 
@@ -42,15 +43,43 @@ UIMenuItem::UIMenuItem(String label, String _id, void *data, Number comboWidth,
 	Number paddingY = conf->getNumericValue("Polycode", "uiMenuTextOffsetY");	
 
 	itemLabel = new ScreenLabel(label, fontSize, fontName);
-	itemLabel->setPosition(paddingX, floor(((comboHeight/2.0) - itemLabel->getHeight()/2.0) + paddingY));	
+	itemLabel->setPosition(paddingX, floor(((comboHeight/2.0) - itemLabel->getHeight()/2.0) + paddingY));
 	addChild(itemLabel);
 	
 	this->_id = _id;
 	this->data = data;
 }
 
+UIMenuItem::UIMenuItem() : UIElement(), data(NULL), itemLabel(NULL) {
+}
+
+bool UIMenuItem::isSelectable()
+{
+	return true;
+}
+
 UIMenuItem::~UIMenuItem() {
-	delete itemLabel;
+	if(itemLabel)
+		delete itemLabel;
+}
+
+UIMenuDivider::UIMenuDivider(Number comboWidth, Number comboHeight) : UIMenuItem() {
+	Config *conf    = CoreServices::getInstance()->getConfig();
+	Number paddingX = conf->getNumericValue("Polycode", "uiMenuSelectorPadding");
+
+	line = new ScreenLine(Vector2(paddingX, comboHeight/2.0), Vector2(comboWidth-paddingX, comboHeight/2.0));
+	line->setLineWidth(1.0);
+	line->setColor(Color(0.0, 0.0, 0.0, 0.7));
+	addChild(line);
+}
+
+UIMenuDivider::~UIMenuDivider() {
+	delete line;
+}
+
+bool UIMenuDivider::isSelectable()
+{
+	return false;
 }
 
 UIMenu::UIMenu(Number menuWidth) : UIElement() {
@@ -147,7 +176,8 @@ void UIMenu::fitToScreenVertical() {
 		}
 	}
 }
-				
+
+
 void UIMenu::handleEvent(Event *event) {
 
 	if(event->getDispatcher() == CoreServices::getInstance()->getCore()->getInput()) {
@@ -162,8 +192,8 @@ void UIMenu::handleEvent(Event *event) {
 		if((event->getEventCode() == InputEvent::EVENT_MOUSEDOWN || (event->getEventCode() == InputEvent::EVENT_MOUSEUP && initialMouse != inputEvent->getMousePosition())) && !ignoreMouse) {
 			if(selectorBox->visible) {
 				dispatchEvent(new UIEvent(), UIEvent::OK_EVENT);
-			} else {
-				dispatchEvent(new UIEvent(), UIEvent::CANCEL_EVENT);				
+			} else if(!dropDownBox->hitTest(inputEvent->getMousePosition())) {
+				dispatchEvent(new UIEvent(), UIEvent::CANCEL_EVENT);
 			}
 		}
 	}
@@ -180,7 +210,7 @@ void UIMenu::handleEvent(Event *event) {
 				InputEvent *inputEvent = (InputEvent*) event;
 				selectedOffset = floor(((inputEvent->getMousePosition().y-selectorPadding)-paddingY)/menuItemHeight);
 					
-				if(selectedOffset >= 0 && selectedOffset < items.size()) {
+				if(selectedOffset >= 0 && selectedOffset < items.size() && items[selectedOffset]->isSelectable()) {
 					selectorBox->visible = true;				
 					selectorBox->setPosition(paddingX,paddingY+(selectedOffset*menuItemHeight) - selectorPadding);
 				} else {
@@ -200,8 +230,6 @@ UIMenu::~UIMenu() {
 	if(!ownsChildren) {	
 		delete dropDownBox;
 	}
-	
-	CoreServices::getInstance()->getCore()->getInput()->removeAllHandlersForListener(this);
 }
 
 UIMenuItem *UIMenu::addOption(String label, String _id, void *data) {
@@ -214,6 +242,18 @@ UIMenuItem *UIMenu::addOption(String label, String _id, void *data) {
 	return newItem;
 }
 
+UIMenuItem *UIMenu::addDivider()
+{
+	Number newItemHeight = menuItemHeight;
+	UIMenuItem *newItem = new UIMenuDivider(menuWidth, newItemHeight);
+	items.push_back(newItem);
+	dropDownBox->addChild(newItem);
+	newItem->setPosition(0, paddingY+nextItemHeight);
+	nextItemHeight += newItemHeight;
+	dropDownBox->resizeBox(menuWidth, nextItemHeight + (paddingY*2.0));
+	return newItem;
+}
+
 void UIMenu::Resize(Number width, Number height) {
 	UIElement::Resize(width, height);
 }

+ 2 - 2
Modules/Contents/UI/Source/PolyUIScrollContainer.cpp

@@ -51,7 +51,7 @@ UIScrollContainer::UIScrollContainer(ScreenEntity *scrolledEntity, bool hScroll,
 	scrollChild = scrolledEntity;
 	addChild(scrollChild);
 	
-	scrollChild->enableScissor = true;
+	enableScissor = true;
 	
 	vScrollBar = new UIVScrollBar(defaultScrollSize, height, height / scrolledEntity->getHeight());
 	addChild(vScrollBar);
@@ -166,7 +166,7 @@ void UIScrollContainer::scrollHorizontal(Number amount) {
 
 void UIScrollContainer::Update() {
 	Vector2 pos = getScreenPosition();
-	scrollChild->scissorBox.setRect(pos.x,pos.y, width, height);	
+	scissorBox.setRect(pos.x, pos.y, width, height);
 }
 
 void UIScrollContainer::handleEvent(Event *event) {

+ 2 - 2
Modules/Contents/UI/Source/PolyUITextInput.cpp

@@ -60,7 +60,7 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	
 	numLines = 0;
 	
-	this->positionMode = ScreenEntity::POSITION_TOPLEFT;
+	setPositionMode(POSITION_TOPLEFT);
 	Config *conf = CoreServices::getInstance()->getConfig();	
 	
 	if(multiLine)
@@ -93,7 +93,6 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	
 	textContainer = new UIElement();
 	textContainer->ownsChildren = true;
-	textContainer->enableScissor = true;
 
 	linesContainer->addChild(textContainer);
 	if(multiLine) {
@@ -179,6 +178,7 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 		addChild(scrollContainer);
 	} else {
 		addChild(linesContainer);
+		textContainer->enableScissor = true;
 	}
 		
 	undoStateIndex = 0;

+ 1 - 1
Modules/Contents/UI/Source/PolyUITree.cpp

@@ -29,7 +29,7 @@
 
 using namespace Polycode;
 
-UITree::UITree(String icon, String text, Number treeWidth, Number treeOffset) : ScreenEntity() {
+UITree::UITree(String icon, String text, Number treeWidth, Number treeOffset) : UIElement() {
 		
 	processInputEvents = true;
 	willDrag = false;

+ 1 - 1
Modules/Contents/UI/Source/PolyUIVScrollBar.cpp

@@ -30,7 +30,7 @@
 
 using namespace Polycode;
 
-UIVScrollBar::UIVScrollBar(Number width, Number height, Number initialRatio) : ScreenEntity() {
+UIVScrollBar::UIVScrollBar(Number width, Number height, Number initialRatio) : UIElement() {
 
 	scrollValue = 0;
 	

+ 1 - 29
Player/Contents/Source/PolycodePlayer.cpp

@@ -86,35 +86,7 @@ PolycodeRemoteDebuggerClient::~PolycodeRemoteDebuggerClient() {
 	client->Disconnect();
 }
 
-extern "C" {	
-
-	
-static void dumpstack (lua_State *L) {
-  int i;
-  int top=lua_gettop(L);
-  printf("dumpstack -- \n");
-  for (i=1; i<=top; i++) {
-    printf("%d\t%s\t",i,luaL_typename(L,i));
-    switch (lua_type(L, i)) {
-      case LUA_TNUMBER:
-        printf("%g\n",lua_tonumber(L,i));
-        break;
-      case LUA_TSTRING:
-        printf("%s\n",lua_tostring(L,i));
-        break;
-      case LUA_TBOOLEAN:
-        printf("%s\n", (lua_toboolean(L, i) ? "true" : "false"));
-        break;
-      case LUA_TNIL:
-        printf("%s\n", "nil");
-        break;
-      default:
-        printf("%p\n",lua_topointer(L,i));
-        break;
-    }
-  }
-  printf("dumpstack -- END\n");
-}	
+extern "C" {
 
 //	extern int luaopen_Tau(lua_State* L); // declare the wrapped module
 		//	loadFileIntoState(L, "Polycode Player.app/Contents/Resources/API/class.lua");