Browse Source

Made Sprite coordinates more intuitive so (0, 0) is always top-left
Correct sprite bounds calculations

Marko Pintera 12 năm trước cách đây
mục cha
commit
24e810bcbd

+ 13 - 13
BansheeEngine/Source/BsD3D11BuiltinMaterialFactory.cpp

@@ -49,8 +49,8 @@ namespace BansheeEngine
 	void D3D11BuiltinMaterialFactory::initSpriteTextShader()
 	{
 		String vsCode = "										\
-			float halfViewportWidth;							\
-			float halfViewportHeight;							\
+			float invViewportWidth;								\
+			float invViewportHeight;							\
 			float4x4 worldTransform;							\
 																\
 			void vs_main(										\
@@ -60,9 +60,9 @@ namespace BansheeEngine
 			out float2 oUv : TEXCOORD0)							\
 			{													\
 				float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1));	\
-																\
-				float tfrmdX = (tfrmdPos.x / halfViewportWidth) - 1.0f;			\
-				float tfrmdY = (tfrmdPos.y / halfViewportHeight) + 1.0f;		\
+																				\
+				float tfrmdX = -1.0f + (tfrmdPos.x * invViewportWidth);			\
+				float tfrmdY = 1.0f - (tfrmdPos.y * invViewportHeight);			\
 																\
 				oPosition = float4(tfrmdX, tfrmdY, 0, 1);		\
 				oUv = uv;										\
@@ -88,8 +88,8 @@ namespace BansheeEngine
 		mSpriteTextShader = Shader::create("TextSpriteShader");
 
 		mSpriteTextShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
-		mSpriteTextShader->addParameter("halfViewportWidth", "halfViewportWidth", GPDT_FLOAT1);
-		mSpriteTextShader->addParameter("halfViewportHeight", "halfViewportHeight", GPDT_FLOAT1);
+		mSpriteTextShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
+		mSpriteTextShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
 		mSpriteTextShader->addParameter("mainTexSamp", "mainTexSamp", GPOT_SAMPLER2D);
 		mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
 
@@ -111,8 +111,8 @@ namespace BansheeEngine
 	void D3D11BuiltinMaterialFactory::initSpriteImageShader()
 	{
 		String vsCode = "										\
-						float halfViewportWidth;							\
-						float halfViewportHeight;							\
+						float invViewportWidth;								\
+						float invViewportHeight;							\
 						float4x4 worldTransform;							\
 						\
 						void vs_main(										\
@@ -123,8 +123,8 @@ namespace BansheeEngine
 						{													\
 						float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1));	\
 						\
-						float tfrmdX = (tfrmdPos.x / halfViewportWidth) - 1.0f;			\
-						float tfrmdY = (tfrmdPos.y / halfViewportHeight) + 1.0f;		\
+						float tfrmdX = -1.0f + (tfrmdPos.x * invViewportWidth);			\
+						float tfrmdY = 1.0f - (tfrmdPos.y * invViewportHeight);			\
 						\
 						oPosition = float4(tfrmdX, tfrmdY, 0, 1);		\
 						oUv = uv;										\
@@ -150,8 +150,8 @@ namespace BansheeEngine
 		mSpriteImageShader = Shader::create("ImageSpriteShader");
 
 		mSpriteImageShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
-		mSpriteImageShader->addParameter("halfViewportWidth", "halfViewportWidth", GPDT_FLOAT1);
-		mSpriteImageShader->addParameter("halfViewportHeight", "halfViewportHeight", GPDT_FLOAT1);
+		mSpriteImageShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
+		mSpriteImageShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
 		mSpriteImageShader->addParameter("mainTexSamp", "mainTexSamp", GPOT_SAMPLER2D);
 		mSpriteImageShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
 

+ 12 - 12
BansheeEngine/Source/BsD3D9BuiltinMaterialFactory.cpp

@@ -49,8 +49,8 @@ namespace BansheeEngine
 	void D3D9BuiltinMaterialFactory::initSpriteTextShader()
 	{
 		String vsCode = "										\
-			float halfViewportWidth;							\
-			float halfViewportHeight;							\
+			float invViewportWidth;								\
+			float invViewportHeight;							\
 			float4x4 worldTransform;							\
 																\
 			void vs_main(										\
@@ -61,8 +61,8 @@ namespace BansheeEngine
 			{													\
 				float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1));	\
 																\
-				float tfrmdX = ((tfrmdPos.x - 0.5f) / halfViewportWidth) - 1.0f;			\
-				float tfrmdY = ((tfrmdPos.y + 0.5f) / halfViewportHeight) + 1.0f;		\
+				float tfrmdX = -1.0f + ((tfrmdPos.x - 0.5f) * invViewportWidth);			\
+				float tfrmdY = 1.0f - ((tfrmdPos.y + 0.5f) * invViewportHeight);			\
 																\
 				oPosition = float4(tfrmdX, tfrmdY, 0, 1);		\
 				oUv = uv;										\
@@ -87,8 +87,8 @@ namespace BansheeEngine
 		mSpriteTextShader = Shader::create("TextSpriteShader");
 
 		mSpriteTextShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
-		mSpriteTextShader->addParameter("halfViewportWidth", "halfViewportWidth", GPDT_FLOAT1);
-		mSpriteTextShader->addParameter("halfViewportHeight", "halfViewportHeight", GPDT_FLOAT1);
+		mSpriteTextShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
+		mSpriteTextShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
 		mSpriteTextShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
 		mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
 
@@ -110,8 +110,8 @@ namespace BansheeEngine
 	void D3D9BuiltinMaterialFactory::initSpriteImageShader()
 	{
 		String vsCode = "										\
-						float halfViewportWidth;							\
-						float halfViewportHeight;							\
+						float invViewportWidth;								\
+						float invViewportHeight;							\
 						float4x4 worldTransform;							\
 						\
 						void vs_main(										\
@@ -122,8 +122,8 @@ namespace BansheeEngine
 						{													\
 						float4 tfrmdPos = mul(worldTransform, float4(inPos.xy, 0, 1));	\
 						\
-						float tfrmdX = ((tfrmdPos.x - 0.5f) / halfViewportWidth) - 1.0f;			\
-						float tfrmdY = ((tfrmdPos.y + 0.5f) / halfViewportHeight) + 1.0f;		\
+						float tfrmdX = -1.0f + ((tfrmdPos.x - 0.5f) * invViewportWidth);			\
+						float tfrmdY = 1.0f - ((tfrmdPos.y + 0.5f) * invViewportHeight);			\
 						\
 						oPosition = float4(tfrmdX, tfrmdY, 0, 1);		\
 						oUv = uv;										\
@@ -148,8 +148,8 @@ namespace BansheeEngine
 		mSpriteImageShader = Shader::create("ImageSpriteShader");
 
 		mSpriteImageShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
-		mSpriteImageShader->addParameter("halfViewportWidth", "halfViewportWidth", GPDT_FLOAT1);
-		mSpriteImageShader->addParameter("halfViewportHeight", "halfViewportHeight", GPDT_FLOAT1);
+		mSpriteImageShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
+		mSpriteImageShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
 		mSpriteImageShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
 		mSpriteImageShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
 

+ 12 - 12
BansheeEngine/Source/BsGLBuiltinMaterialFactory.cpp

@@ -50,8 +50,8 @@ namespace BansheeEngine
 	{
 		String vsCode = "#version 400\n							\
 						\
-						uniform float halfViewportWidth;		\
-						uniform float halfViewportHeight;		\
+						uniform float invViewportWidth;			\
+						uniform float invViewportHeight;		\
 						uniform mat4 worldTransform;			\
 						\
 						in vec3 cm_position;					\
@@ -61,8 +61,8 @@ namespace BansheeEngine
 						{																	\
 						vec4 tfrmdPos = worldTransform * vec4(cm_position.xy, 0, 1);		\
 						\
-						float tfrmdX = (tfrmdPos.x / halfViewportWidth) - 1.0f;	\
-						float tfrmdY = (tfrmdPos.y / halfViewportHeight) + 1.0f;	\
+						float tfrmdX = -1.0f + (tfrmdPos.x * invViewportWidth);				\
+						float tfrmdY = 1.0f - (tfrmdPos.y * invViewportHeight);				\
 						\
 						gl_Position = vec4(tfrmdX, tfrmdY, 0, 1);							\
 						texcoord0 = cm_texcoord0;											\
@@ -90,8 +90,8 @@ namespace BansheeEngine
 		mSpriteTextShader = Shader::create("TextSpriteShader");
 
 		mSpriteTextShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
-		mSpriteTextShader->addParameter("halfViewportWidth", "halfViewportWidth", GPDT_FLOAT1);
-		mSpriteTextShader->addParameter("halfViewportHeight", "halfViewportHeight", GPDT_FLOAT1);
+		mSpriteTextShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
+		mSpriteTextShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
 		mSpriteTextShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
 		mSpriteTextShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
 
@@ -114,8 +114,8 @@ namespace BansheeEngine
 	{
 		String vsCode = "#version 400\n							\
 						\
-						uniform float halfViewportWidth;		\
-						uniform float halfViewportHeight;		\
+						uniform float invViewportWidth;			\
+						uniform float invViewportHeight;		\
 						uniform mat4 worldTransform;			\
 						\
 						in vec3 cm_position;					\
@@ -125,8 +125,8 @@ namespace BansheeEngine
 						{																	\
 						vec4 tfrmdPos = worldTransform * vec4(cm_position.xy, 0, 1);		\
 						\
-						float tfrmdX = (tfrmdPos.x / halfViewportWidth) - 1.0f;	\
-						float tfrmdY = (tfrmdPos.y / halfViewportHeight) + 1.0f;	\
+						float tfrmdX = -1.0f + (tfrmdPos.x * invViewportWidth);				\
+						float tfrmdY = 1.0f - (tfrmdPos.y * invViewportHeight);				\
 						\
 						gl_Position = vec4(tfrmdX, tfrmdY, 0, 1);							\
 						texcoord0 = cm_texcoord0;											\
@@ -154,8 +154,8 @@ namespace BansheeEngine
 		mSpriteImageShader = Shader::create("ImageSpriteShader");
 
 		mSpriteImageShader->addParameter("worldTransform", "worldTransform", GPDT_MATRIX_4X4);
-		mSpriteImageShader->addParameter("halfViewportWidth", "halfViewportWidth", GPDT_FLOAT1);
-		mSpriteImageShader->addParameter("halfViewportHeight", "halfViewportHeight", GPDT_FLOAT1);
+		mSpriteImageShader->addParameter("invViewportWidth", "invViewportWidth", GPDT_FLOAT1);
+		mSpriteImageShader->addParameter("invViewportHeight", "invViewportHeight", GPDT_FLOAT1);
 		mSpriteImageShader->addParameter("mainTexSamp", "mainTexture", GPOT_SAMPLER2D);
 		mSpriteImageShader->addParameter("mainTexture", "mainTexture", GPOT_TEXTURE2D);
 

+ 1 - 0
BansheeEngine/Source/BsGUILabel.cpp

@@ -27,6 +27,7 @@ namespace BansheeEngine
 		mDesc.clipRect = Rect(0, 0, fixedWidth, fixedHeight);
 		mDesc.horzAlign = horzAlign;
 		mDesc.vertAlign = vertAlign;
+		mDesc.offset = Point(10, 20);
 		mTextSprite->update(mDesc);
 
 		mBounds = mTextSprite->getBounds();

+ 5 - 2
BansheeEngine/Source/BsGUIWidget.cpp

@@ -205,8 +205,11 @@ namespace BansheeEngine
 
 			// TODO - Possible optimization. I currently divide by width/height inside the shader, while it
 			// might be more optimal to just scale the mesh as the resolution changes?
-			material->setFloat("halfViewportWidth", camera->getViewport()->getWidth() * 0.5f);
-			material->setFloat("halfViewportHeight", camera->getViewport()->getHeight() * 0.5f);
+			float invViewportWidth = 1.0f / (camera->getViewport()->getWidth() * 0.5f);
+			float invViewportHeight = 1.0f / (camera->getViewport()->getHeight() * 0.5f);
+
+			material->setFloat("invViewportWidth", invViewportWidth);
+			material->setFloat("invViewportHeight", invViewportHeight);
 			material->setMat4("worldTransform", SO()->getWorldTfrm());
 
 			if(material == nullptr || !material.isLoaded())

+ 29 - 21
BansheeEngine/Source/BsImageSprite.cpp

@@ -69,7 +69,7 @@ namespace BansheeEngine
 			renderElem.indexes[i * 6 + 5] = i * 4 + 2;
 		}
 
-		Point offset = desc.offset + getAnchorOffset(desc.anchor, desc.width, desc.height);
+		Point offset = getAnchorOffset(desc.anchor, desc.width, desc.height);
 		Vector2 uvOffset(0.0f, 0.0f);
 		Vector2 uvScale(1.0f, 1.0f);
 		
@@ -92,56 +92,56 @@ namespace BansheeEngine
 			// Top left
 			renderElem.vertices[0] = Vector2((float)offset.x, (float)offset.y);
 			renderElem.vertices[1] = Vector2((float)offset.x + leftBorder, (float)offset.y);
-			renderElem.vertices[2] = Vector2((float)offset.x, (float)offset.y - topBorder);
-			renderElem.vertices[3] = Vector2((float)offset.x + leftBorder, (float)offset.y - topBorder);
+			renderElem.vertices[2] = Vector2((float)offset.x, middleStart);
+			renderElem.vertices[3] = Vector2((float)offset.x + leftBorder, middleStart);
 
 			// Top center
 			renderElem.vertices[4] = Vector2(topCenterStart, (float)offset.y);
 			renderElem.vertices[5] = Vector2(topCenterStart + centerWidth, (float)offset.y);
-			renderElem.vertices[6] = Vector2(topCenterStart, (float)offset.y - topBorder);
-			renderElem.vertices[7] = Vector2(topCenterStart + centerWidth, (float)offset.y - topBorder);
+			renderElem.vertices[6] = Vector2(topCenterStart, middleStart);
+			renderElem.vertices[7] = Vector2(topCenterStart + centerWidth, middleStart);
 
 			// Top right
 			renderElem.vertices[8] = Vector2(topRightStart, (float)offset.y);
 			renderElem.vertices[9] = Vector2(topRightStart + rightBorder, (float)offset.y);
-			renderElem.vertices[10] = Vector2(topRightStart, (float)offset.y - topBorder);
-			renderElem.vertices[11] = Vector2(topRightStart + rightBorder, (float)offset.y - topBorder);
+			renderElem.vertices[10] = Vector2(topRightStart, middleStart);
+			renderElem.vertices[11] = Vector2(topRightStart + rightBorder, middleStart);
 
 			// Middle left
 			renderElem.vertices[12] = Vector2((float)offset.x, middleStart);
 			renderElem.vertices[13] = Vector2((float)offset.x + leftBorder, middleStart);
-			renderElem.vertices[14] = Vector2((float)offset.x, middleStart - centerHeight);
-			renderElem.vertices[15] = Vector2((float)offset.x + leftBorder, middleStart - centerHeight);
+			renderElem.vertices[14] = Vector2((float)offset.x, bottomStart);
+			renderElem.vertices[15] = Vector2((float)offset.x + leftBorder, bottomStart);
 
 			// Middle center
 			renderElem.vertices[16] = Vector2(topCenterStart, middleStart);
 			renderElem.vertices[17] = Vector2(topCenterStart + centerWidth, middleStart);
-			renderElem.vertices[18] = Vector2(topCenterStart, middleStart - centerHeight);
-			renderElem.vertices[19] = Vector2(topCenterStart + centerWidth, middleStart - centerHeight);
+			renderElem.vertices[18] = Vector2(topCenterStart, bottomStart);
+			renderElem.vertices[19] = Vector2(topCenterStart + centerWidth, bottomStart);
 
 			// Middle right
 			renderElem.vertices[20] = Vector2(topRightStart, middleStart);
 			renderElem.vertices[21] = Vector2(topRightStart + rightBorder, middleStart);
-			renderElem.vertices[22] = Vector2(topRightStart, middleStart - centerHeight);
-			renderElem.vertices[23] = Vector2(topRightStart + rightBorder, middleStart - centerHeight);
+			renderElem.vertices[22] = Vector2(topRightStart, bottomStart);
+			renderElem.vertices[23] = Vector2(topRightStart + rightBorder, bottomStart);
 
 			// Bottom left
 			renderElem.vertices[24] = Vector2((float)offset.x, bottomStart);
 			renderElem.vertices[25] = Vector2((float)offset.x + leftBorder, bottomStart);
-			renderElem.vertices[26] = Vector2((float)offset.x, bottomStart - bottomBorder);
-			renderElem.vertices[27] = Vector2((float)offset.x + leftBorder, bottomStart - bottomBorder);
+			renderElem.vertices[26] = Vector2((float)offset.x, bottomStart + bottomBorder);
+			renderElem.vertices[27] = Vector2((float)offset.x + leftBorder, bottomStart + bottomBorder);
 
 			// Bottom center
 			renderElem.vertices[28] = Vector2(topCenterStart, bottomStart);
 			renderElem.vertices[29] = Vector2(topCenterStart + centerWidth, bottomStart);
-			renderElem.vertices[30] = Vector2(topCenterStart, bottomStart - bottomBorder);
-			renderElem.vertices[31] = Vector2(topCenterStart + centerWidth, bottomStart - bottomBorder);
+			renderElem.vertices[30] = Vector2(topCenterStart, bottomStart + bottomBorder);
+			renderElem.vertices[31] = Vector2(topCenterStart + centerWidth, bottomStart + bottomBorder);
 
 			// Bottom right
 			renderElem.vertices[32] = Vector2(topRightStart, bottomStart);
 			renderElem.vertices[33] = Vector2(topRightStart + rightBorder, bottomStart);
-			renderElem.vertices[34] = Vector2(topRightStart, bottomStart - bottomBorder);
-			renderElem.vertices[35] = Vector2(topRightStart + rightBorder, bottomStart - bottomBorder);
+			renderElem.vertices[34] = Vector2(topRightStart, bottomStart + bottomBorder);
+			renderElem.vertices[35] = Vector2(topRightStart + rightBorder, bottomStart + bottomBorder);
 
 			float invWidth = 1.0f / (float)desc.width;
 			float invHeight = 1.0f / (float)desc.height;
@@ -218,8 +218,8 @@ namespace BansheeEngine
 		{
 			renderElem.vertices[0] = Vector2((float)offset.x, (float)offset.y);
 			renderElem.vertices[1] = Vector2((float)offset.x + desc.width, (float)offset.y);
-			renderElem.vertices[2] = Vector2((float)offset.x, (float)offset.y - desc.height);
-			renderElem.vertices[3] = Vector2((float)offset.x + desc.width, (float)offset.y - desc.height);
+			renderElem.vertices[2] = Vector2((float)offset.x, (float)offset.y + desc.height);
+			renderElem.vertices[3] = Vector2((float)offset.x + desc.width, (float)offset.y + desc.height);
 
 			renderElem.uvs[0] = desc.texture->transformUV(Vector2(uvOffset.x, uvOffset.y));
 			renderElem.uvs[1] = desc.texture->transformUV(Vector2(uvOffset.x + uvScale.x, uvOffset.y));
@@ -232,6 +232,14 @@ namespace BansheeEngine
 			clipToRect(renderElem.vertices, renderElem.uvs, renderElem.numQuads, desc.clipRect);
 		}
 
+		// Apply offset
+		UINT32 numVertices = renderElem.numQuads * 4;
+		for(size_t i = 0; i < numVertices; i++)
+		{
+			renderElem.vertices[i].x += (float)desc.offset.x;
+			renderElem.vertices[i].y += (float)desc.offset.y;
+		}
+
 		updateBounds();
 	}
 }

+ 12 - 10
BansheeEngine/Source/BsSprite.cpp

@@ -158,7 +158,7 @@ namespace BansheeEngine
 		float left = (float)clipRect.x;
 		float right = (float)clipRect.x + clipRect.width;
 		float top = (float)clipRect.y;
-		float bottom = (float)clipRect.y - clipRect.height;
+		float bottom = (float)clipRect.y + clipRect.height;
 
 		for(UINT32 i = 0; i < numQuads; i++)
 		{
@@ -166,11 +166,13 @@ namespace BansheeEngine
 
 			// Attempt to skip those that are definitely not clipped
 			if(vertices[vertIdx + 0].x >= left && vertices[vertIdx + 1].x <= right &&
-				vertices[vertIdx + 0].y <= top && vertices[vertIdx + 2].y >= bottom)
+				vertices[vertIdx + 0].y >= top && vertices[vertIdx + 2].y <= bottom)
 			{
 				continue;
 			}
 
+			// TODO - Skip those that are 100% clipped as well
+
 			float du = (uv[vertIdx + 1].x - uv[vertIdx + 0].x) / (vertices[vertIdx + 1].x - vertices[vertIdx + 0].x);
 			float dv = (uv[vertIdx + 0].y - uv[vertIdx + 2].y) / (vertices[vertIdx + 0].y - vertices[vertIdx + 2].y);
 
@@ -193,22 +195,22 @@ namespace BansheeEngine
 			uv[vertIdx + 3].x -= uvRightOffset;
 
 			// Clip top
-			float newTop = Math::Clamp(vertices[vertIdx + 0].y, bottom, top);
-			float uvTopOffset = (vertices[vertIdx + 0].y - newTop) * dv;
+			float newTop = Math::Clamp(vertices[vertIdx + 0].y, top, bottom);
+			float uvTopOffset = (newTop - vertices[vertIdx + 0].y) * dv;
 
 			vertices[vertIdx + 0].y = newTop;
 			vertices[vertIdx + 1].y = newTop;
-			uv[vertIdx + 0].y -= uvTopOffset;
-			uv[vertIdx + 1].y -= uvTopOffset;
+			uv[vertIdx + 0].y += uvTopOffset;
+			uv[vertIdx + 1].y += uvTopOffset;
 
 			// Clip bottom
-			float newBottom = Math::Clamp(vertices[vertIdx + 2].y, bottom, top);
-			float uvBottomOffset = (newBottom - vertices[vertIdx + 2].y) * dv;
+			float newBottom = Math::Clamp(vertices[vertIdx + 2].y, top, bottom);
+			float uvBottomOffset = (vertices[vertIdx + 2].y - newBottom) * dv;
 
 			vertices[vertIdx + 2].y = newBottom;
 			vertices[vertIdx + 3].y = newBottom;
-			uv[vertIdx + 2].y += uvBottomOffset;
-			uv[vertIdx + 3].y += uvBottomOffset;
+			uv[vertIdx + 2].y -= uvBottomOffset;
+			uv[vertIdx + 3].y -= uvBottomOffset;
 		}
 	}
 }

+ 15 - 4
BansheeEngine/Source/BsTextSprite.cpp

@@ -201,7 +201,7 @@ namespace BansheeEngine
 					for(auto charIter = chars.begin(); charIter != chars.end(); ++charIter)
 					{
 						INT32 curX = penX + charIter->xOffset;
-						INT32 curY = -((INT32)baselineY - charIter->yOffset);
+						INT32 curY = ((INT32)baselineY - charIter->yOffset);
 
 						UINT32 curVert = faceOffsets[charIter->page] * 4;
 						UINT32 curIndex = faceOffsets[charIter->page] * 6;
@@ -210,8 +210,8 @@ namespace BansheeEngine
 
 						renderElem.vertices[curVert + 0] = Vector2((float)curX, (float)curY);
 						renderElem.vertices[curVert + 1] = Vector2((float)(curX + charIter->width), (float)curY);
-						renderElem.vertices[curVert + 2] = Vector2((float)curX, (float)curY - (float)charIter->height);
-						renderElem.vertices[curVert + 3] = Vector2((float)(curX + charIter->width), (float)curY - (float)charIter->height);
+						renderElem.vertices[curVert + 2] = Vector2((float)curX, (float)curY + (float)charIter->height);
+						renderElem.vertices[curVert + 3] = Vector2((float)(curX + charIter->width), (float)curY + (float)charIter->height);
 
 						renderElem.uvs[curVert + 0] = Vector2(charIter->uvX, charIter->uvY);
 						renderElem.uvs[curVert + 1] = Vector2(charIter->uvX + charIter->uvWidth, charIter->uvY);
@@ -376,7 +376,7 @@ namespace BansheeEngine
 		}
 
 		// Calc horizontal alignment offset and set final line positions
-		Point offset = desc.offset + getAnchorOffset(desc.anchor, desc.width, desc.height);
+		Point offset = getAnchorOffset(desc.anchor, desc.width, desc.height);
 		UINT32 curY = 0;
 		for(size_t i = 0; i < textLines.size(); i++)
 		{
@@ -446,6 +446,17 @@ namespace BansheeEngine
 			}
 		}
 
+		// Apply offset
+		for(auto& renderElem : mCachedRenderElements)
+		{
+			UINT32 numVertices = renderElem.numQuads * 4;
+			for(size_t i = 0; i < numVertices; i++)
+			{
+				renderElem.vertices[i].x += (float)desc.offset.x;
+				renderElem.vertices[i].y += (float)desc.offset.y;
+			}
+		}
+
 		updateBounds();
 	}
 }

+ 2 - 2
CamelotClient/CamelotClient.cpp

@@ -30,9 +30,9 @@
 #include "CmRTTIType.h"
 #include "CmCursor.h"
 
-#define DX11
+//#define DX11
 //#define DX9
-//#define GL
+#define GL
 
 using namespace CamelotFramework;
 using namespace BansheeEditor;

+ 3 - 2
CamelotClient/CmEditorWindow.cpp

@@ -66,7 +66,8 @@ namespace BansheeEditor
 	void EditorWindow::update()
 	{
 		Int2 cursorPos = Cursor::getWindowPosition(*mRenderWindow);
-
-		//mDbgLabel->setText(toString(cursorPos.x) + ", " + toString(cursorPos.y));
+		
+		mDbgLabel->setText(toString(mDbgLabel->getBounds().x) + ", " + toString(mDbgLabel->getBounds().y) + ", " + 
+			toString(mDbgLabel->getBounds().width) + " - " + toString(mDbgLabel->getBounds().height));
 	}
 }