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

Added scissor test support, removed entity masking (never really worked anyway), masking in UIScrollContainer now uses the new scissor testing

Ivan Safrin 13 лет назад
Родитель
Сommit
bfb4c04ce1

+ 4 - 14
Core/Contents/Include/PolyEntity.h

@@ -26,6 +26,7 @@
 #include "PolyMatrix4.h"
 #include "PolyMatrix4.h"
 #include "PolyQuaternion.h"
 #include "PolyQuaternion.h"
 #include "PolyColor.h"
 #include "PolyColor.h"
+#include "PolyRectangle.h"
 #include <vector>
 #include <vector>
 
 
 namespace Polycode {
 namespace Polycode {
@@ -472,15 +473,6 @@ namespace Polycode {
 			*/
 			*/
 			//@{			
 			//@{			
 		
 		
-			/**
-			* Sets another entity as a mask for this entity (This is not really working properly right now).
-			*/
-			void setMask(Entity *mask);
-			
-			/**
-			* Removes the entity's mask.
-			*/
-			void clearMask();
 		
 		
 			/**
 			/**
 			* You can set a custom string identifier for user purposes.
 			* You can set a custom string identifier for user purposes.
@@ -597,7 +589,9 @@ namespace Polycode {
 			
 			
 			Vector3 bBox;			
 			Vector3 bBox;			
 			bool ignoreParentMatrix;
 			bool ignoreParentMatrix;
-			bool isMask;
+						
+			bool enableScissor;	
+			Polycode::Rectangle scissorBox;			
 		
 		
 		protected:
 		protected:
 		
 		
@@ -611,8 +605,6 @@ namespace Polycode {
 			Vector3 position;
 			Vector3 position;
 			Vector3 scale;		
 			Vector3 scale;		
 		
 		
-			bool hasMask;
-		
 			bool lockMatrix;
 			bool lockMatrix;
 			bool matrixDirty;
 			bool matrixDirty;
 			Matrix4 transformMatrix;
 			Matrix4 transformMatrix;
@@ -629,8 +621,6 @@ namespace Polycode {
 			Quaternion qRoll;			
 			Quaternion qRoll;			
 			Quaternion rotationQuat;	
 			Quaternion rotationQuat;	
 		
 		
-			Entity *maskEntity;
-		
 		
 		
 			Renderer *renderer;
 			Renderer *renderer;
 	};
 	};

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

@@ -147,6 +147,9 @@ namespace Polycode {
 		void rotate2D(Number angle);
 		void rotate2D(Number angle);
 		void scale2D(Vector2 *scale);
 		void scale2D(Vector2 *scale);
 		
 		
+		void enableScissor(bool val);
+		void setScissorBox(Polycode::Rectangle box);		
+		
 		Vector3 projectRayFrom2DCoordinate(Number x, Number y);
 		Vector3 projectRayFrom2DCoordinate(Number x, Number y);
 
 
 		void initOSSpecific();
 		void initOSSpecific();

+ 4 - 0
Core/Contents/Include/PolyRenderer.h

@@ -26,6 +26,7 @@ THE SOFTWARE.
 #include "PolyMatrix4.h"
 #include "PolyMatrix4.h"
 #include "PolyVector2.h"
 #include "PolyVector2.h"
 #include "PolyImage.h"
 #include "PolyImage.h"
+#include "PolyRectangle.h"
 
 
 namespace Polycode {
 namespace Polycode {
 	
 	
@@ -189,6 +190,9 @@ namespace Polycode {
 		int getXRes();
 		int getXRes();
 		int getYRes();
 		int getYRes();
 		
 		
+		virtual void enableScissor(bool val) = 0;
+		virtual void setScissorBox(Polycode::Rectangle box) = 0;
+		
 		void setAnisotropyAmount(Number amount);
 		void setAnisotropyAmount(Number amount);
 		Number getAnisotropyAmount();
 		Number getAnisotropyAmount();
 		
 		

+ 1 - 0
Core/Contents/Include/PolyScreenEntity.h

@@ -164,6 +164,7 @@ class _PolyExport ScreenEntity : public Entity, public EventDispatcher {
 		void focusNextChild();
 		void focusNextChild();
 	
 	
 		Vector2 getPosition2D() const;
 		Vector2 getPosition2D() const;
+		Vector2 getScreenPosition() const;
 		
 		
 		static const int POSITION_TOPLEFT = 0;
 		static const int POSITION_TOPLEFT = 0;
 		static const int POSITION_CENTER = 1;
 		static const int POSITION_CENTER = 1;

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

@@ -51,10 +51,8 @@ Entity::Entity() {
 	renderWireframe  = false;
 	renderWireframe  = false;
 	colorAffectsChildren = true;
 	colorAffectsChildren = true;
 	visibilityAffectsChildren = true;
 	visibilityAffectsChildren = true;
-	maskEntity = NULL;
-	isMask = false;
-	hasMask = false;
 	ownsChildren = false;
 	ownsChildren = false;
+	enableScissor = false;
 }
 }
 
 
 void Entity::setUserData(void *userData) {
 void Entity::setUserData(void *userData) {
@@ -266,31 +264,6 @@ Matrix4 Entity::getConcatenatedRollMatrix() const {
 		return transformMatrix;	
 		return transformMatrix;	
 }
 }
 
 
-void Entity::setMask(Entity *mask) {	
-	mask->depthWrite = true;
-	mask->depthOnly = true;
-	mask->setPositionZ(-1.0);
-	mask->isMask = true;
-	mask->enabled = false;
-	maskEntity = mask;
-	hasMask = true;
-	
-//	for(int i=0; i < children.size(); i++) {
-//		children[i]->setMask(mask);
-//	}
-}
-
-void Entity::clearMask() {
-	maskEntity->depthWrite = false;
-	maskEntity->depthOnly = false;	
-	maskEntity->setPositionZ(0);	
-	maskEntity->enabled = true;
-	maskEntity = NULL;	
-	hasMask = false;	
-	for(int i=0; i < children.size(); i++) {
-		children[i]->clearMask();
-	}	
-}
 
 
 void Entity::transformAndRender() {
 void Entity::transformAndRender() {
 	if(!renderer || !enabled)
 	if(!renderer || !enabled)
@@ -300,14 +273,11 @@ void Entity::transformAndRender() {
 		renderer->drawToColorBuffer(false);
 		renderer->drawToColorBuffer(false);
 	}
 	}
 	
 	
-	if(hasMask) {
-		renderer->clearBuffer(false, true);
-		maskEntity->enabled = true;
-		maskEntity->transformAndRender();			
-		maskEntity->enabled = false;		
-		renderer->setDepthFunction(Renderer::DEPTH_FUNCTION_GREATER);
+	if(enableScissor) {
+		renderer->enableScissor(true);
+		renderer->setScissorBox(scissorBox);
 	}
 	}
-	
+		
 	renderer->pushMatrix();
 	renderer->pushMatrix();
 	if(ignoreParentMatrix && parentEntity) {
 	if(ignoreParentMatrix && parentEntity) {
 		renderer->multModelviewMatrix(parentEntity->getConcatenatedMatrix().inverse());
 		renderer->multModelviewMatrix(parentEntity->getConcatenatedMatrix().inverse());
@@ -324,10 +294,6 @@ void Entity::transformAndRender() {
 		}
 		}
 	}
 	}
 
 
-	if(hasMask) {
-		renderer->enableDepthWrite(false);
-		renderer->enableDepthTest(true);		
-	} else {
 	if(!depthWrite)
 	if(!depthWrite)
 		renderer->enableDepthWrite(false);
 		renderer->enableDepthWrite(false);
 	else
 	else
@@ -337,7 +303,6 @@ void Entity::transformAndRender() {
 		renderer->enableDepthTest(false);
 		renderer->enableDepthTest(false);
 	else
 	else
 		renderer->enableDepthTest(true);
 		renderer->enableDepthTest(true);
- 	}
 		 
 		 
 	renderer->enableAlphaTest(alphaTest);
 	renderer->enableAlphaTest(alphaTest);
 	
 	
@@ -364,22 +329,18 @@ void Entity::transformAndRender() {
 				
 				
 	renderer->setRenderMode(mode);	
 	renderer->setRenderMode(mode);	
 	renderer->popMatrix();
 	renderer->popMatrix();
-	
-	if(hasMask) {
-		renderer->clearBuffer(false, true);
-	}
-	
+		
 	if(!depthWrite)
 	if(!depthWrite)
 		renderer->enableDepthWrite(true);
 		renderer->enableDepthWrite(true);
 	
 	
 	
 	
-	if(hasMask) {
-		renderer->setDepthFunction(Renderer::DEPTH_FUNCTION_LEQUAL);
-	}
-	
 	if(depthOnly) {
 	if(depthOnly) {
 		renderer->drawToColorBuffer(true);
 		renderer->drawToColorBuffer(true);
 	}	
 	}	
+	
+	if(enableScissor) {
+		renderer->enableScissor(false);
+	}
 }
 }
 
 
 void Entity::setRenderer(Renderer *renderer) {
 void Entity::setRenderer(Renderer *renderer) {
@@ -392,11 +353,7 @@ void Entity::setRenderer(Renderer *renderer) {
 void Entity::addEntity(Entity *newChild) {
 void Entity::addEntity(Entity *newChild) {
 	newChild->setRenderer(renderer);
 	newChild->setRenderer(renderer);
 	newChild->setParentEntity(this);
 	newChild->setParentEntity(this);
-	children.push_back(newChild);
-	
-	if(hasMask) {
-		newChild->setMask(maskEntity);
-	}
+	children.push_back(newChild);	
 }
 }
 
 
 
 

+ 14 - 0
Core/Contents/Source/PolyGLRenderer.cpp

@@ -86,6 +86,8 @@ OpenGLRenderer::OpenGLRenderer() : Renderer() {
 	nearPlane = 0.1f;
 	nearPlane = 0.1f;
 	farPlane = 100.0f;
 	farPlane = 100.0f;
 	verticesToDraw = 0;
 	verticesToDraw = 0;
+	
+	glDisable(GL_SCISSOR_TEST);
 }
 }
 
 
 void OpenGLRenderer::setClippingPlanes(Number nearPlane_, Number farPlane_) {
 void OpenGLRenderer::setClippingPlanes(Number nearPlane_, Number farPlane_) {
@@ -379,6 +381,18 @@ void OpenGLRenderer::drawVertexBuffer(VertexBuffer *buffer, bool enableColorBuff
 	}
 	}
 }
 }
 
 
+void OpenGLRenderer::enableScissor(bool val) {
+	if(val) {
+		glEnable(GL_SCISSOR_TEST);
+	} else {
+		glDisable(GL_SCISSOR_TEST);	
+	}
+}
+
+void OpenGLRenderer::setScissorBox(Polycode::Rectangle box) {
+	glScissor(box.x, yRes-box.y-box.h, box.w, box.h);
+}
+
 void OpenGLRenderer::enableFog(bool enable) {
 void OpenGLRenderer::enableFog(bool enable) {
 	if(enable)
 	if(enable)
 		glEnable(GL_FOG);
 		glEnable(GL_FOG);

+ 35 - 25
Core/Contents/Source/PolyScreenEntity.cpp

@@ -316,11 +316,11 @@ void ScreenEntity::_onMouseMove(Number x, Number y, int timestamp, Vector2 paren
 	
 	
 	bool doTest = true;	
 	bool doTest = true;	
 	
 	
-	if(hasMask) {
-		if(!((ScreenEntity*)maskEntity)->hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
-			doTest = false;
-		}	
-	}
+//	if(hasMask) {
+//		if(!((ScreenEntity*)maskEntity)->hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
+//			doTest = false;
+//		}	
+//	}
 	
 	
 	if(doTest) {
 	if(doTest) {
 	if(processInputEvents && enabled) {
 	if(processInputEvents && enabled) {
@@ -386,11 +386,11 @@ bool ScreenEntity::_onMouseUp(Number x, Number y, int mouseButton, int timestamp
 	
 	
 	bool doTest = true;	
 	bool doTest = true;	
 	
 	
-	if(hasMask) {
-		if(!((ScreenEntity*)maskEntity)->hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
-			doTest = false;
-		}	
-	}
+//	if(hasMask) {
+//		if(!((ScreenEntity*)maskEntity)->hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
+//			doTest = false;
+//		}	
+//	}
 	
 	
 	if(doTest) {
 	if(doTest) {
 	if(processInputEvents && enabled) {
 	if(processInputEvents && enabled) {
@@ -449,11 +449,11 @@ void ScreenEntity::_onMouseWheelUp(Number x, Number y, int timestamp, Vector2 pa
 	
 	
 	bool doTest = true;	
 	bool doTest = true;	
 	
 	
-	if(hasMask) {
-		if(!((ScreenEntity*)maskEntity)->hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
-			doTest = false;
-		}	
-	}
+//	if(hasMask) {
+//		if(!((ScreenEntity*)maskEntity)->hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
+//			doTest = false;
+//		}	
+//	}
 	
 	
 	if(doTest) {
 	if(doTest) {
 	if(processInputEvents && enabled) {
 	if(processInputEvents && enabled) {
@@ -497,11 +497,11 @@ void ScreenEntity::_onMouseWheelDown(Number x, Number y, int timestamp, Vector2
 	
 	
 	bool doTest = true;	
 	bool doTest = true;	
 	
 	
-	if(hasMask) {
-		if(!((ScreenEntity*)maskEntity)->hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
-			doTest = false;
-		}	
-	}
+//	if(hasMask) {
+//		if(!((ScreenEntity*)maskEntity)->hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
+//			doTest = false;
+//		}	
+//	}
 	
 	
 	if(doTest) {
 	if(doTest) {
 	if(processInputEvents && enabled) {
 	if(processInputEvents && enabled) {
@@ -547,11 +547,11 @@ bool ScreenEntity::_onMouseDown(Number x, Number y, int mouseButton, int timesta
 	
 	
 	bool doTest = true;	
 	bool doTest = true;	
 	
 	
-	if(hasMask) {
-		if(!((ScreenEntity*)maskEntity)->hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
-			doTest = false;
-		}	
-	}
+//	if(hasMask) {
+//		if(!((ScreenEntity*)maskEntity)->hitTest(x+parentAdjust.x,y+parentAdjust.y)) {
+//			doTest = false;
+//		}	
+//	}
 	
 	
 	if(doTest) {
 	if(doTest) {
 	if(processInputEvents && enabled) {
 	if(processInputEvents && enabled) {
@@ -599,6 +599,16 @@ bool ScreenEntity::_onMouseDown(Number x, Number y, int mouseButton, int timesta
 	return retVal;
 	return retVal;
 }
 }
 
 
+Vector2 ScreenEntity::getScreenPosition() const {
+	Vector2 ret = getPosition2D();
+	
+	if(parentEntity) {
+		return ret + ((ScreenEntity*)parentEntity)->getScreenPosition();
+	} else {
+		return ret;
+	}
+}
+
 void ScreenEntity::setRotation(Number rotation) {
 void ScreenEntity::setRotation(Number rotation) {
 	setRoll(rotation);
 	setRoll(rotation);
 }
 }

+ 5 - 3
Modules/Contents/UI/Include/PolyUIScrollContainer.h

@@ -24,17 +24,20 @@
 #include "PolyGlobals.h"
 #include "PolyGlobals.h"
 #include "PolyUIVScrollBar.h"
 #include "PolyUIVScrollBar.h"
 #include "PolyUIHScrollBar.h"
 #include "PolyUIHScrollBar.h"
+#include "PolyUIElement.h"
 
 
 namespace Polycode {
 namespace Polycode {
 	
 	
-	class _PolyExport UIScrollContainer : public ScreenEntity {
+	class _PolyExport UIScrollContainer : public UIElement {
 	public:
 	public:
 		UIScrollContainer(ScreenEntity *scrolledEntity, bool hScroll, bool vScroll, Number width, Number height);
 		UIScrollContainer(ScreenEntity *scrolledEntity, bool hScroll, bool vScroll, Number width, Number height);
 		~UIScrollContainer();
 		~UIScrollContainer();
 		
 		
 		void setContentSize(Number newContentWidth, Number newContentHeight);
 		void setContentSize(Number newContentWidth, Number newContentHeight);
 		
 		
-		void Resize(int x, int y);
+		void Resize(Number width, Number height);
+		
+		void Update();
 		
 		
 		void onMouseWheelDown(Number x, Number y);
 		void onMouseWheelDown(Number x, Number y);
 		void onMouseWheelUp(Number x, Number y);		
 		void onMouseWheelUp(Number x, Number y);		
@@ -49,7 +52,6 @@ namespace Polycode {
 		Number contentHeight;
 		Number contentHeight;
 		
 		
 		ScreenEntity *scrollChild;		
 		ScreenEntity *scrollChild;		
-		ScreenShape *maskShape;		
 		
 		
 		bool hasHScroll;
 		bool hasHScroll;
 		bool hasVScroll;
 		bool hasVScroll;

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

@@ -34,6 +34,7 @@
 #include "PolyCoreInput.h"
 #include "PolyCoreInput.h"
 #include "PolyCore.h"
 #include "PolyCore.h"
 #include <vector>
 #include <vector>
+#include "PolyUIScrollContainer.h"
 
 
 using namespace std;
 using namespace std;
 
 
@@ -109,12 +110,16 @@ namespace Polycode {
 			int caretPosition;
 			int caretPosition;
 			bool doSelectToCaret;
 			bool doSelectToCaret;
 		
 		
+			ScreenEntity *linesContainer;
+		
 			bool multiLine;
 			bool multiLine;
 			Timer *blinkTimer;
 			Timer *blinkTimer;
 			UIBox *inputRect;
 			UIBox *inputRect;
 			ScreenShape *blinkerRect;
 			ScreenShape *blinkerRect;
 		
 		
 			Number caretImagePosition;
 			Number caretImagePosition;
+			
+			UIScrollContainer *scrollContainer;
 		
 		
 			String fontName;
 			String fontName;
 			Number fontSize;
 			Number fontSize;

+ 19 - 18
Modules/Contents/UI/Source/PolyUIScrollContainer.cpp

@@ -29,7 +29,7 @@
 
 
 using namespace Polycode;
 using namespace Polycode;
 
 
-UIScrollContainer::UIScrollContainer(ScreenEntity *scrolledEntity, bool hScroll, bool vScroll, Number width, Number height) : ScreenEntity() {
+UIScrollContainer::UIScrollContainer(ScreenEntity *scrolledEntity, bool hScroll, bool vScroll, Number width, Number height) : UIElement() {
 	
 	
 	scrolledEntity->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	scrolledEntity->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	
 	
@@ -47,17 +47,11 @@ UIScrollContainer::UIScrollContainer(ScreenEntity *scrolledEntity, bool hScroll,
 	Number uiScrollPanePadding = conf->getNumericValue("Polycode", "uiScrollPanePadding");			
 	Number uiScrollPanePadding = conf->getNumericValue("Polycode", "uiScrollPanePadding");			
 	
 	
 	defaultScrollSize = conf->getNumericValue("Polycode", "uiScrollDefaultSize");			
 	defaultScrollSize = conf->getNumericValue("Polycode", "uiScrollDefaultSize");			
-	
-	maskShape = new ScreenShape(ScreenShape::SHAPE_RECT, width, height);
-	maskShape->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
-	addChild(maskShape);
-	maskShape->setColor(1.0f,0,0,0.8f);
-	
+		
 	scrollChild = scrolledEntity;
 	scrollChild = scrolledEntity;
 	addChild(scrollChild);
 	addChild(scrollChild);
 	
 	
-	scrollChild->setMask(maskShape);
-	
+	scrollChild->enableScissor = true;
 	
 	
 	vScrollBar = new UIVScrollBar(defaultScrollSize, height, height / scrolledEntity->getHeight());
 	vScrollBar = new UIVScrollBar(defaultScrollSize, height, height / scrolledEntity->getHeight());
 	addChild(vScrollBar);
 	addChild(vScrollBar);
@@ -73,22 +67,23 @@ UIScrollContainer::UIScrollContainer(ScreenEntity *scrolledEntity, bool hScroll,
 	hScrollBar->addEventListener(this, Event::CHANGE_EVENT);
 	hScrollBar->addEventListener(this, Event::CHANGE_EVENT);
 	if(!hScroll)
 	if(!hScroll)
 		hScrollBar->enabled = false;
 		hScrollBar->enabled = false;
-	
-	
-	
+			
 	setContentSize(scrollChild->getWidth()*scrollChild->getScale().x, scrollChild->getHeight()*scrollChild->getScale().y);
 	setContentSize(scrollChild->getWidth()*scrollChild->getScale().x, scrollChild->getHeight()*scrollChild->getScale().y);
 	Resize(width, height);	
 	Resize(width, height);	
 }
 }
 
 
-void UIScrollContainer::Resize(int x, int y) {
-	width = x;
-	height = y;
+void UIScrollContainer::Resize(Number width, Number height) {
+	this->width = width;
+	this->height = height;
 	setHitbox(width, height);
 	setHitbox(width, height);
 	
 	
-	maskShape->setShapeSize(x, y);
-	vScrollBar->Resize(y);
+	
+	vScrollBar->Resize(height);
 	setContentSize(contentWidth, contentHeight);
 	setContentSize(contentWidth, contentHeight);
-	vScrollBar->setPositionY(0);
+	vScrollBar->setPosition(width-vScrollBar->getWidth(), 0);
+	
+	matrixDirty = true;
+	
 }
 }
 
 
 void UIScrollContainer::onMouseWheelUp(Number x, Number y) {
 void UIScrollContainer::onMouseWheelUp(Number x, Number y) {
@@ -127,6 +122,12 @@ void UIScrollContainer::setContentSize(Number newContentWidth, Number newContent
 	}	
 	}	
 }
 }
 
 
+void UIScrollContainer::Update() {
+	Vector2 pos = getScreenPosition();
+	printf("POS: %f,%f\n", pos.x, pos.y);
+	scrollChild->scissorBox.setRect(pos.x,pos.y, width, height);	
+}
+
 void UIScrollContainer::handleEvent(Event *event) {
 void UIScrollContainer::handleEvent(Event *event) {
 	if(event->getDispatcher() == vScrollBar) {
 	if(event->getDispatcher() == vScrollBar) {
 		if(event->getEventCode() == Event::CHANGE_EVENT) {
 		if(event->getEventCode() == Event::CHANGE_EVENT) {

+ 25 - 4
Modules/Contents/UI/Source/PolyUITextInput.cpp

@@ -110,7 +110,6 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	selectorRectBottom->visible = false;
 	selectorRectBottom->visible = false;
 	addChild(selectorRectBottom);
 	addChild(selectorRectBottom);
 		
 		
-	insertLine(true);	
 	
 	
 	blinkerRect = new ScreenShape(ScreenShape::SHAPE_RECT, 1, fontSize+4,0,0);
 	blinkerRect = new ScreenShape(ScreenShape::SHAPE_RECT, 1, fontSize+4,0,0);
 	blinkerRect->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
 	blinkerRect->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
@@ -128,6 +127,19 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	setHitbox(width, rectHeight);
 	setHitbox(width, rectHeight);
 	
 	
 	updateCaretPosition();
 	updateCaretPosition();
+		
+	linesContainer = new ScreenEntity();
+	
+	scrollContainer = NULL;
+	
+	if(multiLine) {
+		scrollContainer = new UIScrollContainer(linesContainer, false, true, 200, 200);
+		addChild(scrollContainer);
+	} else {
+		addChild(linesContainer);
+	}
+	
+	insertLine(true);		
 }
 }
 
 
 void UITextInput::setNumberOnly(bool val) {
 void UITextInput::setNumberOnly(bool val) {
@@ -295,6 +307,10 @@ void UITextInput::Resize(Number width, Number height) {
 	this->height = height;	
 	this->height = height;	
 	matrixDirty = true;	
 	matrixDirty = true;	
 	setHitbox(width,height);
 	setHitbox(width,height);
+
+	if(scrollContainer) {
+		scrollContainer->Resize(width, height);
+	}
 }
 }
 
 
 int UITextInput::insertLine(bool after) {
 int UITextInput::insertLine(bool after) {
@@ -304,7 +320,7 @@ int UITextInput::insertLine(bool after) {
 	ScreenLabel *newLine = new ScreenLabel(L"", fontSize, fontName, Label::ANTIALIAS_FULL);
 	ScreenLabel *newLine = new ScreenLabel(L"", fontSize, fontName, Label::ANTIALIAS_FULL);
 	newLine->setColor(0,0,0,1);
 	newLine->setColor(0,0,0,1);
 	lineHeight = newLine->getHeight();
 	lineHeight = newLine->getHeight();
-	addChild(newLine);
+	linesContainer->addChild(newLine);
 	
 	
 	if(after) {	
 	if(after) {	
 		
 		
@@ -333,7 +349,7 @@ int UITextInput::insertLine(bool after) {
 	} else {	
 	} else {	
 		// do we even need that? I don't think so.
 		// do we even need that? I don't think so.
 	}	
 	}	
-	
+		
 	dispatchEvent(new UIEvent(), UIEvent::CHANGE_EVENT);
 	dispatchEvent(new UIEvent(), UIEvent::CHANGE_EVENT);
 	return 1;	
 	return 1;	
 }
 }
@@ -342,6 +358,11 @@ void UITextInput::restructLines() {
 	for(int i=0; i < lines.size(); i++) {
 	for(int i=0; i < lines.size(); i++) {
 		lines[i]->setPosition(padding,padding + (i*(lineHeight+lineSpacing)) ,0.0f);		
 		lines[i]->setPosition(padding,padding + (i*(lineHeight+lineSpacing)) ,0.0f);		
 	}
 	}
+	
+	if(scrollContainer) {
+		scrollContainer->setContentSize(width,  (((lines.size()) * ((lineHeight+lineSpacing)))) - padding);
+	}	
+	
 }
 }
 
 
 void UITextInput::setText(String text) {
 void UITextInput::setText(String text) {
@@ -541,7 +562,7 @@ void UITextInput::insertText(String text) {
 			numLines++;		
 			numLines++;		
 			ScreenLabel *newLine = new ScreenLabel(L"", fontSize, fontName, Label::ANTIALIAS_FULL);
 			ScreenLabel *newLine = new ScreenLabel(L"", fontSize, fontName, Label::ANTIALIAS_FULL);
 			newLine->setColor(0,0,0,1);
 			newLine->setColor(0,0,0,1);
-			addChild(newLine);			
+			linesContainer->addChild(newLine);			
 			lines.push_back(newLine);
 			lines.push_back(newLine);
 			newLine->setText(strings[i]);
 			newLine->setText(strings[i]);
 		}
 		}