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

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 "PolyQuaternion.h"
 #include "PolyColor.h"
+#include "PolyRectangle.h"
 #include <vector>
 
 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.
@@ -597,7 +589,9 @@ namespace Polycode {
 			
 			Vector3 bBox;			
 			bool ignoreParentMatrix;
-			bool isMask;
+						
+			bool enableScissor;	
+			Polycode::Rectangle scissorBox;			
 		
 		protected:
 		
@@ -611,8 +605,6 @@ namespace Polycode {
 			Vector3 position;
 			Vector3 scale;		
 		
-			bool hasMask;
-		
 			bool lockMatrix;
 			bool matrixDirty;
 			Matrix4 transformMatrix;
@@ -629,8 +621,6 @@ namespace Polycode {
 			Quaternion qRoll;			
 			Quaternion rotationQuat;	
 		
-			Entity *maskEntity;
-		
 		
 			Renderer *renderer;
 	};

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

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

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

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

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

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

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

@@ -51,10 +51,8 @@ Entity::Entity() {
 	renderWireframe  = false;
 	colorAffectsChildren = true;
 	visibilityAffectsChildren = true;
-	maskEntity = NULL;
-	isMask = false;
-	hasMask = false;
 	ownsChildren = false;
+	enableScissor = false;
 }
 
 void Entity::setUserData(void *userData) {
@@ -266,31 +264,6 @@ Matrix4 Entity::getConcatenatedRollMatrix() const {
 		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() {
 	if(!renderer || !enabled)
@@ -300,14 +273,11 @@ void Entity::transformAndRender() {
 		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();
 	if(ignoreParentMatrix && parentEntity) {
 		renderer->multModelviewMatrix(parentEntity->getConcatenatedMatrix().inverse());
@@ -324,10 +294,6 @@ void Entity::transformAndRender() {
 		}
 	}
 
-	if(hasMask) {
-		renderer->enableDepthWrite(false);
-		renderer->enableDepthTest(true);		
-	} else {
 	if(!depthWrite)
 		renderer->enableDepthWrite(false);
 	else
@@ -337,7 +303,6 @@ void Entity::transformAndRender() {
 		renderer->enableDepthTest(false);
 	else
 		renderer->enableDepthTest(true);
- 	}
 		 
 	renderer->enableAlphaTest(alphaTest);
 	
@@ -364,22 +329,18 @@ void Entity::transformAndRender() {
 				
 	renderer->setRenderMode(mode);	
 	renderer->popMatrix();
-	
-	if(hasMask) {
-		renderer->clearBuffer(false, true);
-	}
-	
+		
 	if(!depthWrite)
 		renderer->enableDepthWrite(true);
 	
 	
-	if(hasMask) {
-		renderer->setDepthFunction(Renderer::DEPTH_FUNCTION_LEQUAL);
-	}
-	
 	if(depthOnly) {
 		renderer->drawToColorBuffer(true);
 	}	
+	
+	if(enableScissor) {
+		renderer->enableScissor(false);
+	}
 }
 
 void Entity::setRenderer(Renderer *renderer) {
@@ -392,11 +353,7 @@ void Entity::setRenderer(Renderer *renderer) {
 void Entity::addEntity(Entity *newChild) {
 	newChild->setRenderer(renderer);
 	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;
 	farPlane = 100.0f;
 	verticesToDraw = 0;
+	
+	glDisable(GL_SCISSOR_TEST);
 }
 
 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) {
 	if(enable)
 		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;	
 	
-	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(processInputEvents && enabled) {
@@ -386,11 +386,11 @@ bool ScreenEntity::_onMouseUp(Number x, Number y, int mouseButton, int timestamp
 	
 	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(processInputEvents && enabled) {
@@ -449,11 +449,11 @@ void ScreenEntity::_onMouseWheelUp(Number x, Number y, int timestamp, Vector2 pa
 	
 	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(processInputEvents && enabled) {
@@ -497,11 +497,11 @@ void ScreenEntity::_onMouseWheelDown(Number x, Number y, int timestamp, Vector2
 	
 	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(processInputEvents && enabled) {
@@ -547,11 +547,11 @@ bool ScreenEntity::_onMouseDown(Number x, Number y, int mouseButton, int timesta
 	
 	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(processInputEvents && enabled) {
@@ -599,6 +599,16 @@ bool ScreenEntity::_onMouseDown(Number x, Number y, int mouseButton, int timesta
 	return retVal;
 }
 
+Vector2 ScreenEntity::getScreenPosition() const {
+	Vector2 ret = getPosition2D();
+	
+	if(parentEntity) {
+		return ret + ((ScreenEntity*)parentEntity)->getScreenPosition();
+	} else {
+		return ret;
+	}
+}
+
 void ScreenEntity::setRotation(Number rotation) {
 	setRoll(rotation);
 }

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

@@ -24,17 +24,20 @@
 #include "PolyGlobals.h"
 #include "PolyUIVScrollBar.h"
 #include "PolyUIHScrollBar.h"
+#include "PolyUIElement.h"
 
 namespace Polycode {
 	
-	class _PolyExport UIScrollContainer : public ScreenEntity {
+	class _PolyExport UIScrollContainer : public UIElement {
 	public:
 		UIScrollContainer(ScreenEntity *scrolledEntity, bool hScroll, bool vScroll, Number width, Number height);
 		~UIScrollContainer();
 		
 		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 onMouseWheelUp(Number x, Number y);		
@@ -49,7 +52,6 @@ namespace Polycode {
 		Number contentHeight;
 		
 		ScreenEntity *scrollChild;		
-		ScreenShape *maskShape;		
 		
 		bool hasHScroll;
 		bool hasVScroll;

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

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

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

@@ -29,7 +29,7 @@
 
 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);
 	
@@ -47,17 +47,11 @@ UIScrollContainer::UIScrollContainer(ScreenEntity *scrolledEntity, bool hScroll,
 	Number uiScrollPanePadding = conf->getNumericValue("Polycode", "uiScrollPanePadding");			
 	
 	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;
 	addChild(scrollChild);
 	
-	scrollChild->setMask(maskShape);
-	
+	scrollChild->enableScissor = true;
 	
 	vScrollBar = new UIVScrollBar(defaultScrollSize, height, height / scrolledEntity->getHeight());
 	addChild(vScrollBar);
@@ -73,22 +67,23 @@ UIScrollContainer::UIScrollContainer(ScreenEntity *scrolledEntity, bool hScroll,
 	hScrollBar->addEventListener(this, Event::CHANGE_EVENT);
 	if(!hScroll)
 		hScrollBar->enabled = false;
-	
-	
-	
+			
 	setContentSize(scrollChild->getWidth()*scrollChild->getScale().x, scrollChild->getHeight()*scrollChild->getScale().y);
 	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);
 	
-	maskShape->setShapeSize(x, y);
-	vScrollBar->Resize(y);
+	
+	vScrollBar->Resize(height);
 	setContentSize(contentWidth, contentHeight);
-	vScrollBar->setPositionY(0);
+	vScrollBar->setPosition(width-vScrollBar->getWidth(), 0);
+	
+	matrixDirty = true;
+	
 }
 
 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) {
 	if(event->getDispatcher() == vScrollBar) {
 		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;
 	addChild(selectorRectBottom);
 		
-	insertLine(true);	
 	
 	blinkerRect = new ScreenShape(ScreenShape::SHAPE_RECT, 1, fontSize+4,0,0);
 	blinkerRect->setPositionMode(ScreenEntity::POSITION_TOPLEFT);
@@ -128,6 +127,19 @@ UITextInput::UITextInput(bool multiLine, Number width, Number height) : UIElemen
 	setHitbox(width, rectHeight);
 	
 	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) {
@@ -295,6 +307,10 @@ void UITextInput::Resize(Number width, Number height) {
 	this->height = height;	
 	matrixDirty = true;	
 	setHitbox(width,height);
+
+	if(scrollContainer) {
+		scrollContainer->Resize(width, height);
+	}
 }
 
 int UITextInput::insertLine(bool after) {
@@ -304,7 +320,7 @@ int UITextInput::insertLine(bool after) {
 	ScreenLabel *newLine = new ScreenLabel(L"", fontSize, fontName, Label::ANTIALIAS_FULL);
 	newLine->setColor(0,0,0,1);
 	lineHeight = newLine->getHeight();
-	addChild(newLine);
+	linesContainer->addChild(newLine);
 	
 	if(after) {	
 		
@@ -333,7 +349,7 @@ int UITextInput::insertLine(bool after) {
 	} else {	
 		// do we even need that? I don't think so.
 	}	
-	
+		
 	dispatchEvent(new UIEvent(), UIEvent::CHANGE_EVENT);
 	return 1;	
 }
@@ -342,6 +358,11 @@ void UITextInput::restructLines() {
 	for(int i=0; i < lines.size(); i++) {
 		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) {
@@ -541,7 +562,7 @@ void UITextInput::insertText(String text) {
 			numLines++;		
 			ScreenLabel *newLine = new ScreenLabel(L"", fontSize, fontName, Label::ANTIALIAS_FULL);
 			newLine->setColor(0,0,0,1);
-			addChild(newLine);			
+			linesContainer->addChild(newLine);			
 			lines.push_back(newLine);
 			newLine->setText(strings[i]);
 		}