Sfoglia il codice sorgente

Added SceneLight property sheet to editor, made Project/Unproject take a viewport parameter in Renderer, UI tweaks

Ivan Safrin 12 anni fa
parent
commit
b7d3d5b096

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

@@ -718,7 +718,7 @@ namespace Polycode {
 			bool blockMouseInput;
 			bool blockMouseInput;
 																					
 																					
 			void setHitbox(Number width, Number height) {}
 			void setHitbox(Number width, Number height) {}
-			Vector2 getScreenPosition(Matrix4 projectionMatrix, Matrix4 cameraMatrix);
+            Vector2 getScreenPosition(const Matrix4 &projectionMatrix, const Matrix4 &cameraMatrix, const Polycode::Rectangle &viewport);
 			Vector2 getScreenPositionForMainCamera();
 			Vector2 getScreenPositionForMainCamera();
 
 
 			bool hitTest(Number x, Number y) const { return false; }
 			bool hitTest(Number x, Number y) const { return false; }

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

@@ -121,7 +121,7 @@ namespace Polycode {
 		void bindFrameBufferTextureDepth(Texture *texture);		
 		void bindFrameBufferTextureDepth(Texture *texture);		
 		void unbindFramebuffers();
 		void unbindFramebuffers();
 		
 		
-		Vector2 Project(const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Vector3 &coordiante) const;
+		Vector2 Project(const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Polycode::Rectangle &viewport, const Vector3 &coordiante) const;
 		
 		
 		void cullFrontFaces(bool val);
 		void cullFrontFaces(bool val);
 				
 				
@@ -193,7 +193,7 @@ namespace Polycode {
 		void pushMatrix();
 		void pushMatrix();
 		void popMatrix();		
 		void popMatrix();		
 		
 		
-		Vector3 Unproject(Number x, Number y);
+		Vector3 Unproject(Number x, Number y, const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Polycode::Rectangle &viewport);
 		
 		
 		void setDepthFunction(int depthFunction);
 		void setDepthFunction(int depthFunction);
 						
 						

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

@@ -244,7 +244,7 @@ namespace Polycode {
 		
 		
 		virtual Vector3 projectRayFrom2DCoordinate(Number x, Number y, const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Polycode::Rectangle &viewport) = 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;
+		virtual Vector2 Project(const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Polycode::Rectangle &viewport, const Vector3 &coordiante) const = 0;
 		
 		
 		void enableShaders(bool flag);
 		void enableShaders(bool flag);
 		
 		
@@ -279,7 +279,7 @@ namespace Polycode {
 		static const int TEX_FILTERING_LINEAR = 1;
 		static const int TEX_FILTERING_LINEAR = 1;
 		
 		
 		
 		
-		virtual Vector3 Unproject(Number x, Number y) = 0;
+		virtual Vector3 Unproject(Number x, Number y, const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Polycode::Rectangle &viewport) = 0;
 		
 		
 		Color	ambientColor;
 		Color	ambientColor;
 		Color	clearColor;		
 		Color	clearColor;		

+ 13 - 4
Core/Contents/Include/PolySceneLight.h

@@ -157,7 +157,7 @@ namespace Polycode {
 			* @param val If set to true, enables this light to cast shadows.
 			* @param val If set to true, enables this light to cast shadows.
 			* @param resolution Resolution of the shadow map. (defaults to 256x256).
 			* @param resolution Resolution of the shadow map. (defaults to 256x256).
 			*/
 			*/
-			void enableShadows(bool val, Number resolution=256);
+			void enableShadows(bool val, unsigned int resolution=256);
 			
 			
 			/**
 			/**
 			* This sets the shadow map field of view. The larger the field of view, the more of the scene it encompasses, but the more quality it loses.
 			* This sets the shadow map field of view. The larger the field of view, the more of the scene it encompasses, but the more quality it loses.
@@ -165,6 +165,13 @@ namespace Polycode {
 			*/
 			*/
 			void setShadowMapFOV(Number fov);
 			void setShadowMapFOV(Number fov);
 		
 		
+            /**
+             * Returns the light's shadow map field of view.
+             */
+            Number getShadowMapFOV() const;
+        
+            unsigned int getShadowMapResolution() const;
+        
 			/**
 			/**
 			* Returns true if shadows are enabled.
 			* Returns true if shadows are enabled.
 			*/
 			*/
@@ -182,8 +189,8 @@ namespace Polycode {
 			
 			
 			void setLightImportance(int newImportance);
 			void setLightImportance(int newImportance);
 			int getLightImportance() const;
 			int getLightImportance() const;
-		
-			Entity *lightShape;
+        
+            void setLightType(int lightType);
 			
 			
 		protected:
 		protected:
 		
 		
@@ -206,9 +213,11 @@ namespace Polycode {
 			
 			
 			Matrix4 lightViewMatrix;
 			Matrix4 lightViewMatrix;
 		
 		
-			Number shadowMapRes;
+			unsigned int shadowMapRes;
 			Number shadowMapFOV;	
 			Number shadowMapFOV;	
 			bool shadowsEnabled;
 			bool shadowsEnabled;
+        
+            bool debugDraw;
 		
 		
 			Number distance;
 			Number distance;
 			Mesh *lightMesh;
 			Mesh *lightMesh;

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

@@ -452,9 +452,9 @@ Matrix4 Entity::getConcatenatedRollMatrix() const {
 		return transformMatrix;	
 		return transformMatrix;	
 }
 }
 
 
-Vector2 Entity::getScreenPosition(Matrix4 projectionMatrix, Matrix4 cameraMatrix) {
+Vector2 Entity::getScreenPosition(const Matrix4 &projectionMatrix, const Matrix4 &cameraMatrix, const Polycode::Rectangle &viewport) {
 	if(renderer){
 	if(renderer){
-		return renderer->Project(cameraMatrix, projectionMatrix, getConcatenatedMatrix().getPosition());
+		return renderer->Project(cameraMatrix, projectionMatrix, viewport, getConcatenatedMatrix().getPosition());
 	} else {
 	} else {
 		return Vector2();
 		return Vector2();
 	}
 	}
@@ -462,7 +462,7 @@ Vector2 Entity::getScreenPosition(Matrix4 projectionMatrix, Matrix4 cameraMatrix
 
 
 Vector2 Entity::getScreenPositionForMainCamera() {
 Vector2 Entity::getScreenPositionForMainCamera() {
 	if(renderer) {
 	if(renderer) {
-		return getScreenPosition(renderer->getProjectionMatrix(), renderer->getCameraMatrix());
+		return getScreenPosition(renderer->getProjectionMatrix(), renderer->getCameraMatrix(), renderer->getViewport());
 	} else {
 	} else {
 		return Vector2();
 		return Vector2();
 	}
 	}

+ 22 - 15
Core/Contents/Source/PolyGLRenderer.cpp

@@ -229,45 +229,52 @@ void OpenGLRenderer::resetViewport() {
 	glGetDoublev( GL_PROJECTION_MATRIX, sceneProjectionMatrix);
 	glGetDoublev( GL_PROJECTION_MATRIX, sceneProjectionMatrix);
 }
 }
 
 
-Vector3 OpenGLRenderer::Unproject(Number x, Number y) {
+Vector3 OpenGLRenderer::Unproject(Number x, Number y, const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Polycode::Rectangle &viewport) {
 	Vector3 coords;
 	Vector3 coords;
 	GLfloat wx, wy, wz;
 	GLfloat wx, wy, wz;
 	GLdouble cx, cy, cz;
 	GLdouble cx, cy, cz;
-	
+
 	GLdouble mv[16];
 	GLdouble mv[16];
-	glGetDoublev( GL_MODELVIEW_MATRIX, mv );
-	
-	GLdouble proj[16];
-	glGetDoublev( GL_PROJECTION_MATRIX, proj );
-	
-	GLint vp[4];
-	glGetIntegerv( GL_VIEWPORT, vp );
+	Matrix4 camInverse = cameraMatrix.Inverse();
+	Matrix4 cmv;
+	cmv.identity();
+	cmv = cmv * camInverse;
+    
+	for(int i=0; i < 16; i++) {
+		mv[i] = cmv.ml[i];
+	}
+    
+	GLint vp[4] = {viewport.x, viewport.y, viewport.w, viewport.h};
+    
+	GLdouble _sceneProjectionMatrix[16];
+	for(int i=0; i < 16; i++) {
+		_sceneProjectionMatrix[i] = projectionMatrix.ml[i];
+	}	
 	
 	
 	wx = ( Number ) x;
 	wx = ( Number ) x;
 	wy = ( Number ) vp[3] - ( Number ) y;
 	wy = ( Number ) vp[3] - ( Number ) y;
 	glReadPixels( x * backingResolutionScaleX, wy * backingResolutionScaleY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &wz );
 	glReadPixels( x * backingResolutionScaleX, wy * backingResolutionScaleY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &wz );
 	
 	
-	gluUnProject( wx, wy, wz, mv, proj, vp, &cx, &cy, &cz );
+	gluUnProject( wx, wy, wz, mv, _sceneProjectionMatrix, vp, &cx, &cy, &cz );
 	
 	
 	coords = Vector3( cx, cy, cz );
 	coords = Vector3( cx, cy, cz );
 	
 	
 	return coords;	
 	return coords;	
 }
 }
 
 
-Vector2 OpenGLRenderer::Project(const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Vector3 &coordiante) const {
+Vector2 OpenGLRenderer::Project(const Matrix4 &cameraMatrix, const Matrix4 &projectionMatrix, const Polycode::Rectangle &viewport, const Vector3 &coordiante) const {
     
     
 	GLdouble mv[16];
 	GLdouble mv[16];
 	Matrix4 camInverse = cameraMatrix.Inverse();	
 	Matrix4 camInverse = cameraMatrix.Inverse();	
 	Matrix4 cmv;
 	Matrix4 cmv;
 	cmv.identity();
 	cmv.identity();
 	cmv = cmv * camInverse;
 	cmv = cmv * camInverse;
-
-	GLint vp[4];
-	glGetIntegerv( GL_VIEWPORT, vp );
     
     
 	for(int i=0; i < 16; i++) {
 	for(int i=0; i < 16; i++) {
 		mv[i] = cmv.ml[i];
 		mv[i] = cmv.ml[i];
 	}
 	}
+    
+	GLint vp[4] = {viewport.x, viewport.y, viewport.w, viewport.h};
 
 
 	GLdouble _sceneProjectionMatrix[16];
 	GLdouble _sceneProjectionMatrix[16];
 	for(int i=0; i < 16; i++) {
 	for(int i=0; i < 16; i++) {
@@ -278,7 +285,7 @@ Vector2 OpenGLRenderer::Project(const Matrix4 &cameraMatrix, const Matrix4 &proj
 	
 	
 	gluProject(coordiante.x, coordiante.y, coordiante.z, mv, _sceneProjectionMatrix, vp, &coords[0], &coords[1], &coords[2]);
 	gluProject(coordiante.x, coordiante.y, coordiante.z, mv, _sceneProjectionMatrix, vp, &coords[0], &coords[1], &coords[2]);
 	
 	
-    return Vector2(coords[0] / backingResolutionScaleX, ((yRes*backingResolutionScaleY)-coords[1]) / backingResolutionScaleY);
+    return Vector2(coords[0] / backingResolutionScaleX, (viewport.h-coords[1]) / backingResolutionScaleY);
 }
 }
 
 
 Polycode::Rectangle OpenGLRenderer::getViewport() {
 Polycode::Rectangle OpenGLRenderer::getViewport() {

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

@@ -277,8 +277,8 @@ namespace Polycode {
 		for (int i=0 ; i < numSegments+1; i++) {
 		for (int i=0 ; i < numSegments+1; i++) {
 			Number v = ((Number)i)/((Number)numSegments);
 			Number v = ((Number)i)/((Number)numSegments);
 			Number pos = ((PI*2.0)/((Number)numSegments)) * i;
 			Number pos = ((PI*2.0)/((Number)numSegments)) * i;
-			Number x = sin(pos) * w;
-			Number y = cos(pos) * h;
+			Number x = sin(pos) * w * 0.5;
+			Number y = cos(pos) * h * 0.5;
 			
 			
 			if(i > 0) {
 			if(i > 0) {
                 polygon = new Polygon();
                 polygon = new Polygon();

+ 24 - 36
Core/Contents/Source/PolySceneLight.cpp

@@ -26,6 +26,7 @@
 #include "PolyCoreServices.h"
 #include "PolyCoreServices.h"
 #include "PolyMesh.h"
 #include "PolyMesh.h"
 #include "PolyRenderer.h"
 #include "PolyRenderer.h"
+#include "PolyScenePrimitive.h"
 #include "PolyScene.h"
 #include "PolyScene.h"
 
 
 using namespace Polycode;
 using namespace Polycode;
@@ -40,6 +41,7 @@ SceneLight::SceneLight(int type, Scene *parentScene, Number intensity, Number co
 	spotlightCutoff = 40;
 	spotlightCutoff = 40;
 	spotlightExponent = 10;
 	spotlightExponent = 10;
 		
 		
+    shadowMapRes = 256;
 	this->depthWrite = false;
 	this->depthWrite = false;
 	lightMesh = new Mesh(Mesh::QUAD_MESH);
 	lightMesh = new Mesh(Mesh::QUAD_MESH);
 	lightMesh->createBox(0.1,0.1,0.1);
 	lightMesh->createBox(0.1,0.1,0.1);
@@ -53,27 +55,13 @@ SceneLight::SceneLight(int type, Scene *parentScene, Number intensity, Number co
 	lightColor.setColor(1.0f,1.0f,1.0f,1.0f);
 	lightColor.setColor(1.0f,1.0f,1.0f,1.0f);
 	setSpotlightProperties(40,0.1);
 	setSpotlightProperties(40,0.1);
 	
 	
-	/*
-	if(type == SceneLight::SPOT_LIGHT) {
-		lightShape = new ScenePrimitive(ScenePrimitive::TYPE_CONE, 3, 1.0, 8);
-		lightShape->Translate(0,0,-1.5);
-		lightShape->setPitch(90.0);
-		lightShape->setColor(1.0,1.0,0.0, 0.75);
-		lightShape->renderWireframe = true;
-		addChild(lightShape);		
-	} else {
-		lightShape = new ScenePrimitive(ScenePrimitive::TYPE_BOX, 0.5, 0.5, 0.5);
-		lightShape->setColor(1.0,1.0,0.0, 0.75);
-		lightShape->renderWireframe = true;
-		addChild(lightShape);		
-	}
-	lightShape->castShadows = false;
-	lightShape->visible = false;
-	*/
-	
-	lightShape = NULL;
-	
 	lightImportance = 0;
 	lightImportance = 0;
+    
+    debugDraw = false;
+}
+
+void SceneLight::setLightType(int lightType) {
+    this->type = lightType;
 }
 }
 
 
 void SceneLight::setLightImportance(int newImportance) {
 void SceneLight::setLightImportance(int newImportance) {
@@ -84,18 +72,17 @@ int SceneLight::getLightImportance() const {
 	return lightImportance;
 	return lightImportance;
 }
 }
 
 
-
 void SceneLight::enableDebugDraw(bool val) {
 void SceneLight::enableDebugDraw(bool val) {
-	if(lightShape) {
-		lightShape->visible = val;
-	}
+    debugDraw = val;
 }
 }
 
 
-void SceneLight::enableShadows(bool val, Number resolution) {
+void SceneLight::enableShadows(bool val, unsigned int resolution) {
 	if(val) {
 	if(val) {
-		if(!zBufferTexture) {
-			CoreServices::getInstance()->getRenderer()->createRenderTextures(NULL, &zBufferTexture, resolution, resolution, false);
-		}
+        if(zBufferTexture) {
+            CoreServices::getInstance()->getMaterialManager()->deleteTexture(zBufferTexture);
+        }
+        
+        CoreServices::getInstance()->getRenderer()->createRenderTextures(NULL, &zBufferTexture, resolution, resolution, false);
 		if(!spotCamera) {
 		if(!spotCamera) {
 			spotCamera = new Camera(parentScene);
 			spotCamera = new Camera(parentScene);
 //			spotCamera->setPitch(-45.0f);
 //			spotCamera->setPitch(-45.0f);
@@ -127,10 +114,18 @@ void SceneLight::setShadowMapFOV(Number fov) {
 	shadowMapFOV = fov;
 	shadowMapFOV = fov;
 }
 }
 
 
+Number SceneLight::getShadowMapFOV() const {
+    return shadowMapFOV;
+}
+
 SceneLight::~SceneLight() {
 SceneLight::~SceneLight() {
 	printf("Destroying scene light...\n");
 	printf("Destroying scene light...\n");
 }
 }
 
 
+unsigned int SceneLight::getShadowMapResolution() const {
+    return shadowMapRes;
+}
+
 void SceneLight::renderDepthMap(Scene *scene) {
 void SceneLight::renderDepthMap(Scene *scene) {
 	CoreServices::getInstance()->getRenderer()->clearScreen();
 	CoreServices::getInstance()->getRenderer()->clearScreen();
 	CoreServices::getInstance()->getRenderer()->pushMatrix();
 	CoreServices::getInstance()->getRenderer()->pushMatrix();
@@ -160,14 +155,7 @@ Number SceneLight::getIntensity() const {
 }
 }
 
 
 void SceneLight::Render() {
 void SceneLight::Render() {
-/*
-	CoreServices::getInstance()->getRenderer()->setTexture(NULL);
-	CoreServices::getInstance()->getRenderer()->beginRenderOperation(lightMesh->getMeshType());
-	for(int i=0; i < lightMesh->getPolygonCount(); i++) {
-			CoreServices::getInstance()->getRenderer()->draw3DPolygon(lightMesh->getPolygon(i));
-	}
-	CoreServices::getInstance()->getRenderer()->endRenderOperation();	
-	*/
+    
 }
 }
 
 
 int SceneLight::getType() const {
 int SceneLight::getType() const {

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

@@ -47,5 +47,6 @@ class EntityEditorPropertyView : public UIElement {
         EntitySheet *entitySheet;
         EntitySheet *entitySheet;
         MaterialPropSheet *materialSheet;
         MaterialPropSheet *materialSheet;
         ScenePrimitiveSheet *primitiveSheet;
         ScenePrimitiveSheet *primitiveSheet;
+        SceneLightSheet *lightSheet;
 };
 };
 
 

+ 8 - 2
IDE/Contents/Include/PolycodeEntityEditor.h

@@ -43,13 +43,15 @@ class EntityEditorMainView : public UIElement {
             void createIcon(Entity *entity, String iconFile);
             void createIcon(Entity *entity, String iconFile);
             void setEditorProps(Entity *entity);
             void setEditorProps(Entity *entity);
     
     
-            void selectEntity(Entity *targetEntity);
+            void selectEntity(Entity *targetEntity, bool addToSelection = false);
     
     
 			void handleEvent(Event *event);
 			void handleEvent(Event *event);
 			void Resize(Number width, Number height);
 			void Resize(Number width, Number height);
 			void Update();
 			void Update();
             void addEntityFromMenu(String command);
             void addEntityFromMenu(String command);
-			
+    
+            void doEntityDeselect(Entity *targetEntity);
+            void doEntitySelect(Entity *targetEntity);
             void setEditorMode(int newMode);
             void setEditorMode(int newMode);
             Entity *getSelectedEntity();
             Entity *getSelectedEntity();
     
     
@@ -93,6 +95,10 @@ class PolycodeEntityEditor : public PolycodeEditor {
 		
 		
 		bool openFile(OSFileEntry filePath);
 		bool openFile(OSFileEntry filePath);
 		void Resize(int x, int y);
 		void Resize(int x, int y);
+    
+        void Activate();
+        void saveFile();
+    
 		
 		
         void handleEvent(Event *event);
         void handleEvent(Event *event);
     
     

+ 29 - 1
IDE/Contents/Include/PolycodeProps.h

@@ -554,6 +554,34 @@ class TransformSheet : public PropSheet {
         Vector3 lastRotation;
         Vector3 lastRotation;
 };
 };
 
 
+class SceneLightSheet : public PropSheet {
+    public:
+        SceneLightSheet();
+        ~SceneLightSheet();
+    
+        void setSceneLight(SceneLight *light);
+        void handleEvent(Event *event);
+    
+    protected:
+    
+        SceneLight *light;
+    
+        ComboProp *typeProp;
+        ColorProp *lightColorProp;
+        ColorProp *specularColorProp;
+        NumberProp *intensityProp;
+        SliderProp *constantAttenuationProp;
+        SliderProp *linearAttenuationProp;
+        SliderProp *quadraticAttenuationProp;
+    
+        NumberProp *spotlightCutoffProp;
+        SliderProp *spotlightExponentProp;
+    
+        BoolProp *castShadowsProp;
+        SliderProp *shadowMapFOVProp;
+        NumberProp *shadowResolutionProp;
+};
+
 class ScenePrimitiveSheet : public PropSheet {
 class ScenePrimitiveSheet : public PropSheet {
 public:
 public:
     ScenePrimitiveSheet();
     ScenePrimitiveSheet();
@@ -688,7 +716,7 @@ class PropList : public UIElement {
 		
 		
 		void updateProps();
 		void updateProps();
 		void updateSize();
 		void updateSize();
-		
+    
 		void addPropSheet(PropSheet *sheet);
 		void addPropSheet(PropSheet *sheet);
 		void handleEvent(Event *event);
 		void handleEvent(Event *event);
 		void Resize(Number width, Number height);
 		void Resize(Number width, Number height);

+ 8 - 1
IDE/Contents/Source/EntityEditorPropertyView.cpp

@@ -35,6 +35,10 @@ EntityEditorPropertyView::EntityEditorPropertyView() : UIElement() {
     entityProps->addPropSheet(materialSheet);
     entityProps->addPropSheet(materialSheet);
     materialSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
     materialSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
     
     
+    lightSheet = new SceneLightSheet();
+    entityProps->addPropSheet(lightSheet);
+    lightSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
+
     primitiveSheet = new ScenePrimitiveSheet();
     primitiveSheet = new ScenePrimitiveSheet();
     entityProps->addPropSheet(primitiveSheet);
     entityProps->addPropSheet(primitiveSheet);
     primitiveSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
     primitiveSheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
@@ -42,7 +46,6 @@ EntityEditorPropertyView::EntityEditorPropertyView() : UIElement() {
     entitySheet = new EntitySheet();
     entitySheet = new EntitySheet();
     entityProps->addPropSheet(entitySheet);
     entityProps->addPropSheet(entitySheet);
     entitySheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
     entitySheet->addEventListener(this, PropEvent::EVENT_PROP_CHANGE);
-    
 }
 }
 
 
 void EntityEditorPropertyView::Resize(Number width, Number height) {
 void EntityEditorPropertyView::Resize(Number width, Number height) {
@@ -52,6 +55,9 @@ void EntityEditorPropertyView::Resize(Number width, Number height) {
 
 
 void EntityEditorPropertyView::setEntity(Entity *entity) {
 void EntityEditorPropertyView::setEntity(Entity *entity) {
     
     
+    SceneLight *sceneLight = dynamic_cast<SceneLight*>(entity);
+    lightSheet->setSceneLight(sceneLight);
+    
     SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
     SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(entity);
     materialSheet->setSceneMesh(sceneMesh);
     materialSheet->setSceneMesh(sceneMesh);
 
 
@@ -60,6 +66,7 @@ void EntityEditorPropertyView::setEntity(Entity *entity) {
 
 
     entitySheet->setEntity(entity);
     entitySheet->setEntity(entity);
     transformSheet->setEntity(entity);
     transformSheet->setEntity(entity);
+        
     Resize(getWidth(), getHeight());
     Resize(getWidth(), getHeight());
 }
 }
 
 

+ 60 - 20
IDE/Contents/Source/PolycodeEntityEditor.cpp

@@ -25,6 +25,7 @@
 
 
 extern UIGlobalMenu *globalMenu;
 extern UIGlobalMenu *globalMenu;
 extern PolycodeFrame *globalFrame;
 extern PolycodeFrame *globalFrame;
+extern Scene *globalScene;
 
 
 EntityEditorMainView::EntityEditorMainView() {
 EntityEditorMainView::EntityEditorMainView() {
 	processInputEvents = true;
 	processInputEvents = true;
@@ -34,7 +35,7 @@ EntityEditorMainView::EntityEditorMainView() {
 	mainScene->clearColor.setColor(0.2, 0.2, 0.2, 1.0);	
 	mainScene->clearColor.setColor(0.2, 0.2, 0.2, 1.0);	
 	mainScene->useClearColor = true;
 	mainScene->useClearColor = true;
 	mainScene->rootEntity.processInputEvents = true;
 	mainScene->rootEntity.processInputEvents = true;
-	
+	   
 	renderTextureShape = new UIRect(256, 256);
 	renderTextureShape = new UIRect(256, 256);
 	renderTextureShape->setAnchorPoint(-1.0, -1.0, 0.0);	
 	renderTextureShape->setAnchorPoint(-1.0, -1.0, 0.0);	
 	renderTextureShape->setTexture(renderTexture->getTargetTexture());
 	renderTextureShape->setTexture(renderTexture->getTargetTexture());
@@ -198,7 +199,7 @@ void EntityEditorMainView::addEntityFromMenu(String command) {
     
     
     
     
     if(command == "add_light") {
     if(command == "add_light") {
-        SceneLight *newLight = new SceneLight(SceneLight::AREA_LIGHT, mainScene, 50);
+        SceneLight *newLight = new SceneLight(SceneLight::AREA_LIGHT, mainScene, 1.0);
         
         
         newLight->bBox = Vector3(0.5, 0.5, 0.5);
         newLight->bBox = Vector3(0.5, 0.5, 0.5);
         mainScene->addLight(newLight);
         mainScene->addLight(newLight);
@@ -271,31 +272,56 @@ void EntityEditorMainView::handleEvent(Event *event) {
         if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN ) {
         if(event->getEventCode() == InputEvent::EVENT_MOUSEDOWN ) {
             InputEvent *inputEvent = (InputEvent*) event;
             InputEvent *inputEvent = (InputEvent*) event;
 
 
+            CoreInput *input = CoreServices::getInstance()->getCore()->getInput();
             if(inputEvent->mouseButton == CoreInput::MOUSE_BUTTON2) {
             if(inputEvent->mouseButton == CoreInput::MOUSE_BUTTON2) {
                 Entity* targetEntity = (Entity*) event->getDispatcher();
                 Entity* targetEntity = (Entity*) event->getDispatcher();
-                selectEntity(targetEntity);
+                selectEntity(targetEntity, input->getKeyState(KEY_LSHIFT) || input->getKeyState(KEY_RSHIFT));
             }
             }
         }
         }
     }
     }
 }
 }
 
 
-void EntityEditorMainView::selectEntity(Entity *targetEntity) {
-    for(int i=0; i < selectedEntities.size(); i++) {
-        SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(selectedEntities[i]);
-        if(sceneMesh) {
-            sceneMesh->overlayWireframe = false;
-        }
+void EntityEditorMainView::doEntityDeselect(Entity *targetEntity) {
+    SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
+    if(sceneMesh) {
+        sceneMesh->overlayWireframe = false;
     }
     }
-    
-    selectedEntities.clear();
-    selectedEntities.push_back(targetEntity);
-    transformGizmo->setTransformSelection(selectedEntities);
-    dispatchEvent(new Event(), Event::CHANGE_EVENT);
-    
+}
+
+void EntityEditorMainView::doEntitySelect(Entity *targetEntity) {
     SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
     SceneMesh *sceneMesh = dynamic_cast<SceneMesh*>(targetEntity);
     if(sceneMesh) {
     if(sceneMesh) {
         sceneMesh->overlayWireframe = true;
         sceneMesh->overlayWireframe = true;
     }
     }
+}
+
+
+void EntityEditorMainView::selectEntity(Entity *targetEntity, bool addToSelection) {
+    
+    bool doNotReselect = false;
+    if(!addToSelection) {
+        for(int i=0; i < selectedEntities.size(); i++) {
+            doEntityDeselect(selectedEntities[i]);
+        }
+        selectedEntities.clear();
+    } else {
+        for(int i=0; i < selectedEntities.size(); i++) {
+            if(targetEntity == selectedEntities[i]) {
+                doEntityDeselect(targetEntity);
+                selectedEntities.erase(selectedEntities.begin() + i);
+                doNotReselect = true;
+                break;
+            }
+        }
+    }
+
+    if(!doNotReselect) {
+        selectedEntities.push_back(targetEntity);
+        doEntitySelect(targetEntity);
+    }
+    
+    transformGizmo->setTransformSelection(selectedEntities);
+    dispatchEvent(new Event(), Event::CHANGE_EVENT);
     
     
 }
 }
 
 
@@ -307,8 +333,10 @@ void EntityEditorMainView::Resize(Number width, Number height) {
 	headerBg->Resize(width, 30);
 	headerBg->Resize(width, 30);
 	modeSwitchDropdown->setPosition(width-110, 4);
 	modeSwitchDropdown->setPosition(width-110, 4);
     
     
-	mainScene->sceneMouseRect.x = renderTextureShape->getScreenPositionForMainCamera().x;
-	mainScene->sceneMouseRect.y = renderTextureShape->getScreenPositionForMainCamera().y;
+    Vector2 screenPos = renderTextureShape->getScreenPosition(globalScene->getDefaultCamera()->getProjectionMatrix(), globalScene->getDefaultCamera()->getTransformMatrix(), globalScene->getDefaultCamera()->getViewport());
+    
+	mainScene->sceneMouseRect.x = screenPos.x;
+	mainScene->sceneMouseRect.y = screenPos.y;
 	mainScene->sceneMouseRect.w = renderTextureShape->getWidth();
 	mainScene->sceneMouseRect.w = renderTextureShape->getWidth();
 	mainScene->sceneMouseRect.h = renderTextureShape->getHeight();
 	mainScene->sceneMouseRect.h = renderTextureShape->getHeight();
     mainScene->remapMouse = true;
     mainScene->remapMouse = true;
@@ -327,11 +355,14 @@ PolycodeEntityEditor::PolycodeEntityEditor() : PolycodeEditor(true){
     mainView->addEventListener(this, Event::CHANGE_EVENT);
     mainView->addEventListener(this, Event::CHANGE_EVENT);
 	mainSizer->addLeftChild(mainView);
 	mainSizer->addLeftChild(mainView);
     
     
-    rightSizer = new UIVSizer(10, 10, 150, true);
-    mainSizer->addRightChild(rightSizer);
+    mainSizer->setMinimumSize(200);
+    
+//    rightSizer = new UIVSizer(10, 10, 150, true);
+  //  mainSizer->addRightChild(rightSizer);
     
     
     propertyView = new EntityEditorPropertyView();
     propertyView = new EntityEditorPropertyView();
-    rightSizer->addBottomChild(propertyView);
+//    rightSizer->addBottomChild(propertyView);
+    mainSizer->addRightChild(propertyView);
 }
 }
 
 
 void PolycodeEntityEditor::handleEvent(Event *event) {
 void PolycodeEntityEditor::handleEvent(Event *event) {
@@ -355,6 +386,15 @@ bool PolycodeEntityEditor::openFile(OSFileEntry filePath) {
 	return true;
 	return true;
 }
 }
 
 
+void PolycodeEntityEditor::Activate() {
+    Resize(getWidth(), getHeight());
+}
+
+void PolycodeEntityEditor::saveFile() {
+    
+}
+
+
 void PolycodeEntityEditor::Resize(int x, int y) {
 void PolycodeEntityEditor::Resize(int x, int y) {
 	mainSizer->Resize(x, y);
 	mainSizer->Resize(x, y);
 	PolycodeEditor::Resize(x,y);
 	PolycodeEditor::Resize(x,y);

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

@@ -29,6 +29,7 @@ UIGlobalMenu *globalMenu;
 SyntaxHighlightTheme *globalSyntaxTheme;
 SyntaxHighlightTheme *globalSyntaxTheme;
 PolycodeClipboard *globalClipboard;
 PolycodeClipboard *globalClipboard;
 PolycodeEditorManager *globalEditorManager;
 PolycodeEditorManager *globalEditorManager;
+Scene *globalScene;
 
 
 PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	core = new POLYCODE_CORE(view, 1100, 700,false,true, 0, 0,60, -1, true);
 	core = new POLYCODE_CORE(view, 1100, 700,false,true, 0, 0,60, -1, true);
@@ -98,7 +99,9 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	UITextInput::setMenuSingleton(globalMenu);
 	UITextInput::setMenuSingleton(globalMenu);
 			
 			
 	
 	
-	Scene *screen = new Scene(Scene::SCENE_2D_TOPLEFT);	
+	Scene *screen = new Scene(Scene::SCENE_2D_TOPLEFT);
+    globalScene = screen;
+    
 	screen->rootEntity.processInputEvents = true;
 	screen->rootEntity.processInputEvents = true;
 //	screen->rootEntity.setDefaultScreenOptions(true);
 //	screen->rootEntity.setDefaultScreenOptions(true);
 
 
@@ -214,6 +217,10 @@ PolycodeIDEApp::PolycodeIDEApp(PolycodeView *view) : EventDispatcher() {
 	CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
 	CoreServices::getInstance()->getCore()->getInput()->addEventListener(this, InputEvent::EVENT_KEYDOWN);
 	
 	
 	applyFinalConfig();
 	applyFinalConfig();
+    
+    core->updateAndRender();
+    frame->Resize(core->getXRes(), core->getYRes());
+
 }
 }
 
 
 void PolycodeIDEApp::renameFile() {
 void PolycodeIDEApp::renameFile() {

+ 138 - 29
IDE/Contents/Source/PolycodeProps.cpp

@@ -175,17 +175,16 @@ void PropList::Resize(Number width, Number height) {
 	for(int i=0; i < props.size(); i++) {
 	for(int i=0; i < props.size(); i++) {
 		props[i]->setPosition(0, offsetY);
 		props[i]->setPosition(0, offsetY);
 		if(props[i]->enabled) {
 		if(props[i]->enabled) {
-		if(props[i]->collapsed) {
-			offsetY += 30;
-		} else {
-			offsetY += props[i]->propHeight;
-		}
+            if(props[i]->collapsed) {
+                offsetY += 30;
+            } else {
+                offsetY += props[i]->propHeight;
+            }
 		}
 		}
 		props[i]->Resize(getWidth(), getHeight());
 		props[i]->Resize(getWidth(), getHeight());
 	}
 	}
 	
 	
 	rebuildTransformMatrix();
 	rebuildTransformMatrix();
-	
 	scrollContainer->setContentSize(width, offsetY);
 	scrollContainer->setContentSize(width, offsetY);
 }
 }
 
 
@@ -239,7 +238,7 @@ PropSheet::PropSheet(String caption, String type) : UIElement() {
 		
 		
 	collapsed  = false;
 	collapsed  = false;
 	propTopPadding = 0;
 	propTopPadding = 0;
-	propHeight = 30;
+	propHeight = 0;
 }
 }
 
 
 void PropSheet::setCollapsed(bool val) {
 void PropSheet::setCollapsed(bool val) {
@@ -457,7 +456,7 @@ Vector2Prop::Vector2Prop(String caption) : PropProp(caption, "Vector2") {
 	propContents->addChild(positionY);
 	propContents->addChild(positionY);
 	positionY->setPosition(80, 0);
 	positionY->setPosition(80, 0);
 
 
-	setHeight(30);
+	setHeight(25);
 
 
 }
 }
 
 
@@ -528,7 +527,7 @@ CustomProp::CustomProp(String key, String value) : PropProp("", "Custom") {
 	propContents->addChild(removeButton);
 	propContents->addChild(removeButton);
 	removeButton->setPosition(-110, 6);
 	removeButton->setPosition(-110, 6);
 	
 	
-	setHeight(30);
+	setHeight(25);
 
 
 }
 }
 
 
@@ -574,12 +573,12 @@ StringProp::StringProp(String caption) : PropProp(caption, "String") {
 	stringEntry->setText("");
 	stringEntry->setText("");
 	propContents->addChild(stringEntry);
 	propContents->addChild(stringEntry);
 	stringEntry->setPosition(0, 0);
 	stringEntry->setPosition(0, 0);
-	setHeight(30);
+	setHeight(25);
 }
 }
 
 
 void StringProp::setPropWidth(Number width) {
 void StringProp::setPropWidth(Number width) {
-	stringEntry->Resize(floor((width - PROP_PADDING) * 0.5), stringEntry->getHeight());	
-	stringEntry->setPosition(width-105-PROP_PADDING-stringEntry->getWidth(), 2);
+    stringEntry->Resize(width-PROP_PADDING-propContents->getPosition().x, stringEntry->getHeight());
+	stringEntry->setPosition(0.0, 2);
 	
 	
 }
 }
 
 
@@ -620,19 +619,19 @@ SliderProp::SliderProp(String caption, Number min, Number max) : PropProp(captio
 	
 	
 	slider = new UIHSlider(min, max, 100);
 	slider = new UIHSlider(min, max, 100);
 	slider->addEventListener(this, UIEvent::CHANGE_EVENT);
 	slider->addEventListener(this, UIEvent::CHANGE_EVENT);
-	slider->setPosition(5, 8);
+	slider->setPosition(0, 8);
 	propContents->addChild(slider);
 	propContents->addChild(slider);
 	
 	
 	valueLabel = new UILabel("0.0", 10);
 	valueLabel = new UILabel("0.0", 10);
 	propContents->addChild(valueLabel);
 	propContents->addChild(valueLabel);
 	valueLabel->setPosition(120, 5);
 	valueLabel->setPosition(120, 5);
 	valueLabel->color.a = 1.0;
 	valueLabel->color.a = 1.0;
-	setHeight(30);
+	setHeight(25);
 }
 }
 
 
 void SliderProp::setPropWidth(Number width) {
 void SliderProp::setPropWidth(Number width) {
 	slider->Resize(width - propContents->getPosition().x - PROP_PADDING - 50, slider->getHeight());
 	slider->Resize(width - propContents->getPosition().x - PROP_PADDING - 50, slider->getHeight());
-	valueLabel->setPosition(width - propContents->getPosition().x - PROP_PADDING - 30, 5);	
+	valueLabel->setPosition(width - propContents->getPosition().x - PROP_PADDING - 30, 5);
 }
 }
 
 
 void SliderProp::handleEvent(Event *event) {
 void SliderProp::handleEvent(Event *event) {
@@ -676,20 +675,20 @@ SliderProp::~SliderProp() {
 
 
 NumberProp::NumberProp(String caption) : PropProp(caption, "Number") {
 NumberProp::NumberProp(String caption) : PropProp(caption, "Number") {
 
 
-	numberEntry = new UITextInput(false, 50, 12);
+	numberEntry = new UITextInput(false, 50, 20);
 	numberEntry->addEventListener(this, UIEvent::CHANGE_EVENT);
 	numberEntry->addEventListener(this, UIEvent::CHANGE_EVENT);
 	numberEntry->setText("0");
 	numberEntry->setText("0");
 	numberEntry->setNumberOnly(true);
 	numberEntry->setNumberOnly(true);
 	propContents->addChild(numberEntry);
 	propContents->addChild(numberEntry);
 	numberEntry->setPosition(0, 2);
 	numberEntry->setPosition(0, 2);
 
 
-	setHeight(30);
+	setHeight(25);
 
 
 }
 }
 
 
 void NumberProp::setPropWidth(Number width) {
 void NumberProp::setPropWidth(Number width) {
-	numberEntry->Resize(floor((width - PROP_PADDING) * 0.5), numberEntry->getHeight());	
-	numberEntry->setPosition(width-105-PROP_PADDING-numberEntry->getWidth(), 2);
+    numberEntry->Resize(width-PROP_PADDING-propContents->getPosition().x, numberEntry->getHeight());
+	numberEntry->setPosition(0.0, 2);
 }
 }
 
 
 void NumberProp::setPropData(PolycodeEditorPropActionData* data) {
 void NumberProp::setPropData(PolycodeEditorPropActionData* data) {
@@ -730,9 +729,9 @@ ColorProp::ColorProp(String caption) : PropProp(caption, "Color") {
 
 
 	colorEntry = new UIColorBox(globalColorPicker, Color(), 45, 25);
 	colorEntry = new UIColorBox(globalColorPicker, Color(), 45, 25);
 	colorEntry->addEventListener(this, UIEvent::CHANGE_EVENT);
 	colorEntry->addEventListener(this, UIEvent::CHANGE_EVENT);
-	colorEntry->setPosition(0, -2);
+	colorEntry->setPosition(-2, 0);
 	propContents->addChild(colorEntry);
 	propContents->addChild(colorEntry);
-	setHeight(30);
+	setHeight(25);
 
 
 }
 }
 
 
@@ -778,7 +777,7 @@ ComboProp::ComboProp(String caption) : PropProp(caption, "Combo") {
 	comboEntry->addEventListener(this, UIEvent::CHANGE_EVENT);
 	comboEntry->addEventListener(this, UIEvent::CHANGE_EVENT);
 	propContents->addChild(comboEntry);
 	propContents->addChild(comboEntry);
 	comboEntry->setPosition(-3, 0);
 	comboEntry->setPosition(-3, 0);
-	setHeight(30);
+	setHeight(25);
 }
 }
 
 
 void ComboProp::setPropWidth(Number width) {
 void ComboProp::setPropWidth(Number width) {
@@ -822,9 +821,9 @@ BoolProp::BoolProp(String caption) : PropProp(caption, "Bool") {
 
 
 	checkEntry = new UICheckBox("", false);
 	checkEntry = new UICheckBox("", false);
 	checkEntry->addEventListener(this, UIEvent::CHANGE_EVENT);
 	checkEntry->addEventListener(this, UIEvent::CHANGE_EVENT);
-	checkEntry->setPosition(0, 2);
+	checkEntry->setPosition(0, 4);
 	propContents->addChild(checkEntry);
 	propContents->addChild(checkEntry);
-	setHeight(30);
+	setHeight(25);
 
 
 }
 }
 
 
@@ -951,7 +950,7 @@ BezierRGBACurveProp::BezierRGBACurveProp(String caption) : PropProp(caption, "Be
 	changeButton->setPosition(0, 0);
 	changeButton->setPosition(0, 0);
 	changeButton->addEventListener(this, UIEvent::CLICK_EVENT);
 	changeButton->addEventListener(this, UIEvent::CLICK_EVENT);
 
 
-	setHeight(30);
+	setHeight(25);
 	
 	
 	curveR = NULL;
 	curveR = NULL;
 	curveG = NULL;
 	curveG = NULL;
@@ -985,7 +984,7 @@ BezierCurveProp::BezierCurveProp(String caption, String curveName) : PropProp(ca
 	changeButton->setPosition(0, 0);
 	changeButton->setPosition(0, 0);
 	changeButton->addEventListener(this, UIEvent::CLICK_EVENT);
 	changeButton->addEventListener(this, UIEvent::CLICK_EVENT);
 
 
-	setHeight(30);
+	setHeight(25);
 	
 	
 	curve = NULL;
 	curve = NULL;
 }
 }
@@ -1242,7 +1241,7 @@ ShaderPassProp::ShaderPassProp(Material *material, int shaderIndex) : PropProp("
 	editButton = new UIButton("Options", 30);
 	editButton = new UIButton("Options", 30);
 	editButton->addEventListener(this, UIEvent::CLICK_EVENT);
 	editButton->addEventListener(this, UIEvent::CLICK_EVENT);
 	propContents->addChild(editButton);
 	propContents->addChild(editButton);
-	setHeight(30);
+	setHeight(25);
 }
 }
 
 
 ShaderPassProp::~ShaderPassProp() {
 ShaderPassProp::~ShaderPassProp() {
@@ -1318,7 +1317,7 @@ TargetBindingProp::TargetBindingProp(Shader *shader, Material *material, ShaderB
 	textureComboBox->addEventListener(this, UIEvent::CHANGE_EVENT);
 	textureComboBox->addEventListener(this, UIEvent::CHANGE_EVENT);
 	propContents->addChild(textureComboBox);
 	propContents->addChild(textureComboBox);
 	
 	
-	setHeight(30);
+	setHeight(25);
 	
 	
 	if(typeComboBox->getSelectedIndex() == 1) {
 	if(typeComboBox->getSelectedIndex() == 1) {
 		textureComboBox->enabled = false;
 		textureComboBox->enabled = false;
@@ -1447,7 +1446,7 @@ RenderTargetProp::RenderTargetProp(ShaderRenderTarget *renderTarget, Material *m
 	typeComboBox->addEventListener(this, UIEvent::CHANGE_EVENT);
 	typeComboBox->addEventListener(this, UIEvent::CHANGE_EVENT);
 	propContents->addChild(typeComboBox);
 	propContents->addChild(typeComboBox);
 	
 	
-	setHeight(30);
+	setHeight(25);
 }
 }
 
 
 void RenderTargetProp::setPropWidth(Number width) {
 void RenderTargetProp::setPropWidth(Number width) {
@@ -2196,6 +2195,116 @@ void TransformSheet::handleEvent(Event *event) {
     PropSheet::handleEvent(event);
     PropSheet::handleEvent(event);
 }
 }
 
 
+SceneLightSheet::SceneLightSheet() : PropSheet("LIGHT", "scene_light") {
+    typeProp = new ComboProp("Type");
+    typeProp->comboEntry->addComboItem("Area");
+    typeProp->comboEntry->addComboItem("Spot");
+    addProp(typeProp);
+    
+    lightColorProp = new ColorProp("Light color");
+    addProp(lightColorProp);
+    
+    specularColorProp = new ColorProp("Specular color");
+    addProp(specularColorProp);
+    
+    intensityProp = new NumberProp("Intensity");
+    addProp(intensityProp);
+    
+    constantAttenuationProp = new SliderProp("Constant att.", 0.0, 1.0);
+    addProp(constantAttenuationProp);
+    
+    linearAttenuationProp = new SliderProp("Linear att.", 0.0, 1.0);
+    addProp(linearAttenuationProp);
+    
+    quadraticAttenuationProp = new SliderProp("Quadratic att.", 0.0, 1.0);
+    addProp(quadraticAttenuationProp);
+    
+    spotlightCutoffProp = new NumberProp("Spot cutoff");
+    addProp(spotlightCutoffProp);
+    
+    spotlightExponentProp = new SliderProp("Spot exponent", 0.0, 50.0);
+    addProp(spotlightExponentProp);
+    
+    castShadowsProp = new BoolProp("Cast shadows");
+    addProp(castShadowsProp);
+    
+    shadowMapFOVProp = new SliderProp("Shadow FOV", 1.0, 180.0);
+    addProp(shadowMapFOVProp);
+    
+    shadowResolutionProp = new NumberProp("Shadowmap res.");
+    addProp(shadowResolutionProp);
+
+    propHeight = 365;
+    light = NULL;
+    enabled = false;
+}
+
+SceneLightSheet::~SceneLightSheet() {
+    
+}
+
+void SceneLightSheet::setSceneLight(SceneLight *light) {
+    this->light = light;
+    
+    if(light) {
+        light->enableDebugDraw(true);
+        typeProp->set(light->getLightType());
+        lightColorProp->set(light->lightColor);
+        specularColorProp->set(light->specularLightColor);
+        intensityProp->set(light->getIntensity());
+        constantAttenuationProp->set(light->getConstantAttenuation());
+        linearAttenuationProp->set(light->getLinearAttenuation());
+        quadraticAttenuationProp->set(light->getQuadraticAttenuation());
+        
+        spotlightCutoffProp->set(light->getSpotlightCutoff());
+        spotlightExponentProp->set(light->getSpotlightExponent());
+        
+        castShadowsProp->set(light->areShadowsEnabled());
+        shadowMapFOVProp->set(light->getShadowMapFOV());
+        shadowResolutionProp->set(light->getShadowMapResolution());
+        
+        enabled = true;
+    } else {
+        enabled = false;
+    }
+}
+
+void SceneLightSheet::handleEvent(Event *event) {
+    if(!light) {
+        return;
+    }
+    
+    if(event->getEventCode() == Event::CHANGE_EVENT) {
+        if(event->getDispatcher() == typeProp) {
+            light->setLightType(typeProp->get());
+        } else if(event->getDispatcher() == lightColorProp) {
+            light->lightColor = lightColorProp->get();
+        } else if(event->getDispatcher() == specularColorProp) {
+            light->specularLightColor = specularColorProp->get();
+        } else if(event->getDispatcher() == intensityProp) {
+            light->setIntensity(intensityProp->get());
+        } else if(event->getDispatcher() == constantAttenuationProp) {
+            light->setAttenuation(constantAttenuationProp->get(), light->getLinearAttenuation(), light->getQuadraticAttenuation());
+        } else if(event->getDispatcher() == linearAttenuationProp) {
+            light->setAttenuation(light->getConstantAttenuation(), linearAttenuationProp->get(), light->getQuadraticAttenuation());
+        } else if(event->getDispatcher() == quadraticAttenuationProp) {
+            light->setAttenuation(light->getConstantAttenuation(), light->getLinearAttenuation(), quadraticAttenuationProp->get());
+        } else if(event->getDispatcher() == castShadowsProp) {
+            light->enableShadows(castShadowsProp->get(), shadowResolutionProp->get());
+        } else if(event->getDispatcher() == shadowMapFOVProp) {
+            light->setShadowMapFOV(shadowMapFOVProp->get());
+        } else if(event->getDispatcher() == shadowResolutionProp) {
+            light->enableShadows(castShadowsProp->get(), shadowResolutionProp->get());
+        } else if(event->getDispatcher() == spotlightCutoffProp) {
+            light->setSpotlightProperties(spotlightCutoffProp->get(), light->getSpotlightExponent());
+        } else if(event->getDispatcher() == spotlightExponentProp) {
+            light->setSpotlightProperties(light->getSpotlightCutoff(), spotlightExponentProp->get());
+        }
+
+    }
+    PropSheet::handleEvent(event);
+}
+
 ScenePrimitiveSheet::ScenePrimitiveSheet() : PropSheet("PRIMITIVE", "scene_primitive") {
 ScenePrimitiveSheet::ScenePrimitiveSheet() : PropSheet("PRIMITIVE", "scene_primitive") {
     typeProp = new ComboProp("Type");
     typeProp = new ComboProp("Type");
     typeProp->comboEntry->addComboItem("Box");
     typeProp->comboEntry->addComboItem("Box");

+ 1 - 0
Modules/Contents/UI/Include/PolyUITextInput.h

@@ -441,6 +441,7 @@ namespace Polycode {
 			int selectionR;
 			int selectionR;
 			
 			
 			UIRect *lineNumberBg;
 			UIRect *lineNumberBg;
+            Number textInputOffsetY;
 			
 			
 			int decoratorOffset;
 			int decoratorOffset;
 		
 		

+ 7 - 1
Modules/Contents/UI/Source/PolyUIScrollContainer.cpp

@@ -116,7 +116,13 @@ Number UIScrollContainer::getVScrollWidth() {
 }
 }
 
 
 void UIScrollContainer::setContentSize(Number newContentWidth, Number newContentHeight) {
 void UIScrollContainer::setContentSize(Number newContentWidth, Number newContentHeight) {
-	
+    
+    if(newContentWidth < 1.0)
+        newContentWidth = 1.0;
+    if(newContentHeight < 1.0)
+        newContentHeight = 1.0;
+
+
 	contentHeight = newContentHeight;
 	contentHeight = newContentHeight;
 	contentWidth = newContentWidth;
 	contentWidth = newContentWidth;
 	
 	

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

@@ -84,7 +84,7 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	
 	
 	Number rectHeight = height;
 	Number rectHeight = height;
 	if(!multiLine) {
 	if(!multiLine) {
-		rectHeight = fontSize+12;
+		rectHeight = fontSize+10;
 	} 
 	} 
 
 
 	linesContainer = new Entity();	
 	linesContainer = new Entity();	
@@ -97,7 +97,7 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	sb = conf->getNumericValue("Polycode", "textBgSkinB");
 	sb = conf->getNumericValue("Polycode", "textBgSkinB");
 	sl = conf->getNumericValue("Polycode", "textBgSkinL");
 	sl = conf->getNumericValue("Polycode", "textBgSkinL");
 
 
-	Number textInputOffsetY = conf->getNumericValue("Polycode", "uiTextInputFontOffsetY");
+	textInputOffsetY = conf->getNumericValue("Polycode", "uiTextInputFontOffsetY");
     if(multiLine) {
     if(multiLine) {
         textInputOffsetY = 0.0;
         textInputOffsetY = 0.0;
     }
     }
@@ -731,7 +731,7 @@ void UITextInput::Resize(Number width, Number height) {
 	
 	
 	textContainer->setWidth(fabs(this->getWidth() - textContainer->getPosition2D().x - padding));
 	textContainer->setWidth(fabs(this->getWidth() - textContainer->getPosition2D().x - padding));
 	textContainer->setHeight(fabs(this->getHeight() - textContainer->getPosition2D().y));
 	textContainer->setHeight(fabs(this->getHeight() - textContainer->getPosition2D().y));
-	textContainer->setPosition(padding + decoratorOffset, padding);
+	textContainer->setPosition(padding + decoratorOffset, padding + textInputOffsetY);
 }
 }
 
 
 int UITextInput::insertLine(String lineText) {
 int UITextInput::insertLine(String lineText) {

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

@@ -130,6 +130,7 @@ void UIVScrollBar::Scroll(Number amount) {
 }
 }
 
 
 void UIVScrollBar::setHandleRatio(Number newRatio) {
 void UIVScrollBar::setHandleRatio(Number newRatio) {
+    
 	scrollHandleHeight = getHeight()*newRatio;	
 	scrollHandleHeight = getHeight()*newRatio;	
 	
 	
 	if(scrollHandleHeight < minHandleSize)
 	if(scrollHandleHeight < minHandleSize)