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

Refactored GUI so it now internally works using arbitrary vertices/indices instead of quads, so more complex GUI objects can be rendered

BearishSun 9 лет назад
Родитель
Сommit
1d8c830496

+ 9 - 9
Source/BansheeEditor/Include/BsGUIColor.h

@@ -51,7 +51,7 @@ namespace BansheeEngine
 		 */
 		 */
 
 
 		/** @copydoc GUIElement::_getOptimalSize */
 		/** @copydoc GUIElement::_getOptimalSize */
-		virtual Vector2I _getOptimalSize() const override;
+		Vector2I _getOptimalSize() const override;
 
 
 		/** @} */
 		/** @} */
 	protected:
 	protected:
@@ -59,23 +59,23 @@ namespace BansheeEngine
 		virtual ~GUIColor();
 		virtual ~GUIColor();
 
 
 		/** @copydoc GUIElement::_getNumRenderElements() */
 		/** @copydoc GUIElement::_getNumRenderElements() */
-		virtual UINT32 _getNumRenderElements() const override;
+		UINT32 _getNumRenderElements() const override;
 
 
 		/** @copydoc GUIElement::_getMaterial() */
 		/** @copydoc GUIElement::_getMaterial() */
-		virtual const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
+		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 
 
-		/** @copydoc GUIElement::_getNumQuads() */
-		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
+		/** @copydoc GUIElement::_getMeshSize() */
+		void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const override;
 
 
 		/** @copydoc GUIElement::_fillBuffer() */
 		/** @copydoc GUIElement::_fillBuffer() */
-		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
+		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset, 
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::updateRenderElementsInternal() */
 		/** @copydoc GUIElement::updateRenderElementsInternal() */
-		virtual void updateRenderElementsInternal() override;
+		void updateRenderElementsInternal() override;
 
 
 		/** @copydoc GUIElement::_mouseEvent() */
 		/** @copydoc GUIElement::_mouseEvent() */
-		virtual bool _mouseEvent(const GUIMouseEvent& ev) override;
+		bool _mouseEvent(const GUIMouseEvent& ev) override;
 
 
 	private:
 	private:
 		static const float ALPHA_SPLIT_POSITION;
 		static const float ALPHA_SPLIT_POSITION;

+ 7 - 8
Source/BansheeEditor/Source/BsGUIColor.cpp

@@ -72,7 +72,7 @@ namespace BansheeEngine
 			return mColorSprite->getMaterialInfo(renderElementIdx);
 			return mColorSprite->getMaterialInfo(renderElementIdx);
 	}
 	}
 
 
-	UINT32 GUIColor::_getNumQuads(UINT32 renderElementIdx) const
+	void GUIColor::_getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const
 	{
 	{
 		UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
 		UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
 
 
@@ -82,7 +82,8 @@ namespace BansheeEngine
 		else
 		else
 			numQuads = mColorSprite->getNumQuads(renderElementIdx);
 			numQuads = mColorSprite->getNumQuads(renderElementIdx);
 
 
-		return numQuads;
+		numVertices = numQuads * 4;
+		numIndices = numQuads * 6;
 	}
 	}
 
 
 	void GUIColor::updateRenderElementsInternal()
 	void GUIColor::updateRenderElementsInternal()
@@ -112,18 +113,16 @@ namespace BansheeEngine
 		return GUIHelper::calcOptimalContentsSize(Vector2I(80, 10), *_getStyle(), _getDimensions()); // Arbitrary size
 		return GUIHelper::calcOptimalContentsSize(Vector2I(80, 10), *_getStyle(), _getDimensions()); // Arbitrary size
 	}
 	}
 
 
-	void GUIColor::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
+	void GUIColor::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 	{
 		UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
 		UINT32 alphaSpriteIdx = mColorSprite->getNumRenderElements();
 
 
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 		if(renderElementIdx < alphaSpriteIdx)
 		if(renderElementIdx < alphaSpriteIdx)
 		{
 		{
-			mColorSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, 
+			mColorSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
 				vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 				vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
-
-			return;
 		}
 		}
 		else if(renderElementIdx >= alphaSpriteIdx)
 		else if(renderElementIdx >= alphaSpriteIdx)
 		{
 		{
@@ -134,7 +133,7 @@ namespace BansheeEngine
 			Rect2I alphaClipRect = mLayoutData.getLocalClipRect();
 			Rect2I alphaClipRect = mLayoutData.getLocalClipRect();
 			alphaClipRect.x -= xOffset;
 			alphaClipRect.x -= xOffset;
 
 
-			mAlphaSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, 
+			mAlphaSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
 				vertexStride, indexStride, alphaSpriteIdx - renderElementIdx, alphaOffset, alphaClipRect);
 				vertexStride, indexStride, alphaSpriteIdx - renderElementIdx, alphaOffset, alphaClipRect);
 		}
 		}
 	}
 	}

+ 12 - 12
Source/BansheeEngine/Include/BsGUIButtonBase.h

@@ -55,10 +55,10 @@ namespace BansheeEngine
 		void _setState(GUIElementState state);
 		void _setState(GUIElementState state);
 
 
 		/** @copydoc GUIElement::_getOptimalSize */
 		/** @copydoc GUIElement::_getOptimalSize */
-		virtual Vector2I _getOptimalSize() const override;
+		Vector2I _getOptimalSize() const override;
 
 
 		/** @copydoc GUIElement::_getRenderElementDepthRange */
 		/** @copydoc GUIElement::_getRenderElementDepthRange */
-		virtual UINT32 _getRenderElementDepthRange() const override;
+		UINT32 _getRenderElementDepthRange() const override;
 
 
 		/** @} */
 		/** @} */
 	protected:
 	protected:
@@ -66,29 +66,29 @@ namespace BansheeEngine
 		virtual ~GUIButtonBase();
 		virtual ~GUIButtonBase();
 
 
 		/** @copydoc GUIElement::_getNumRenderElements */
 		/** @copydoc GUIElement::_getNumRenderElements */
-		virtual UINT32 _getNumRenderElements() const override;
+		UINT32 _getNumRenderElements() const override;
 
 
 		/** @copydoc GUIElement::_getMaterial */
 		/** @copydoc GUIElement::_getMaterial */
-		virtual const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
+		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 
 
-		/** @copydoc GUIElement::_getNumQuads */
-		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
+		/** @copydoc GUIElement::_getMeshSize() */
+		void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const override;
 
 
 		/** @copydoc GUIElement::_fillBuffer */
 		/** @copydoc GUIElement::_fillBuffer */
-		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
+		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::updateRenderElementsInternal */
 		/** @copydoc GUIElement::updateRenderElementsInternal */
-		virtual void updateRenderElementsInternal() override;
+		void updateRenderElementsInternal() override;
 
 
 		/** @copydoc GUIElement::_mouseEvent */
 		/** @copydoc GUIElement::_mouseEvent */
-		virtual bool _mouseEvent(const GUIMouseEvent& ev) override;
+		bool _mouseEvent(const GUIMouseEvent& ev) override;
 
 
 		/** @copydoc GUIElement::_getRenderElementDepth */
 		/** @copydoc GUIElement::_getRenderElementDepth */
-		virtual UINT32 _getRenderElementDepth(UINT32 renderElementIdx) const override;
+		UINT32 _getRenderElementDepth(UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::_getTooltip */
 		/** @copydoc GUIElement::_getTooltip */
-		virtual WString _getTooltip() const override;
+		WString _getTooltip() const override;
 
 
 		/** Creates or destroys the content image sprite depending if there is a content image for the active state. */
 		/** Creates or destroys the content image sprite depending if there is a content image for the active state. */
 		void refreshContentSprite();
 		void refreshContentSprite();

+ 4 - 4
Source/BansheeEngine/Include/BsGUICanvas.h

@@ -178,12 +178,12 @@ namespace BansheeEngine
 		/** @copydoc GUIElement::_getMaterial */
 		/** @copydoc GUIElement::_getMaterial */
 		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 
 
-		/** @copydoc GUIElement::_getNumQuads */
-		UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
+		/** @copydoc GUIElement::_getMeshSize() */
+		void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const override;
 
 
 		/** @copydoc GUIElement::_fillBuffer */
 		/** @copydoc GUIElement::_fillBuffer */
-		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
+		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::updateRenderElementsInternal */
 		/** @copydoc GUIElement::updateRenderElementsInternal */
 		void updateRenderElementsInternal() override;
 		void updateRenderElementsInternal() override;

+ 11 - 14
Source/BansheeEngine/Include/BsGUIElement.h

@@ -108,19 +108,13 @@ namespace BansheeEngine
 		virtual const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const = 0;
 		virtual const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const = 0;
 
 
 		/**
 		/**
-		 * Returns the number of quads that the specified render element will use. You will need this value when creating
-		 * the buffers before calling _fillBuffer().
-		 * 			
-		 * @return	Number of quads for the specified render element. 
+		 * Returns the number of vertices and indices that the specified render element will use. You will need this value
+		 * when creating the buffers before calling _fillBuffer().
 		 *
 		 *
 		 * @see		_getNumRenderElements()
 		 * @see		_getNumRenderElements()
 		 * @see		_fillBuffer()
 		 * @see		_fillBuffer()
-		 * 		
-		 * @note	
-		 * Number of vertices = Number of quads * 4
-		 * Number of indices = Number of quads * 6	
 		 */
 		 */
-		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const = 0;
+		virtual void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const = 0;
 
 
 		/**
 		/**
 		 * Fill the pre-allocated vertex, uv and index buffers with the mesh data for the specified render element.
 		 * Fill the pre-allocated vertex, uv and index buffers with the mesh data for the specified render element.
@@ -128,18 +122,21 @@ namespace BansheeEngine
 		 * @param[out]	vertices			Previously allocated buffer where to store the vertices.
 		 * @param[out]	vertices			Previously allocated buffer where to store the vertices.
 		 * @param[out]	uv					Previously allocated buffer where to store the uv coordinates.
 		 * @param[out]	uv					Previously allocated buffer where to store the uv coordinates.
 		 * @param[out]	indices				Previously allocated buffer where to store the indices.
 		 * @param[out]	indices				Previously allocated buffer where to store the indices.
-		 * @param[in]	startingQuad		At which quad should the method start filling the buffer.
-		 * @param[in]	maxNumQuads			Total number of quads the buffers were allocated for. Used only for memory 
+		 * @param[in]	vertexOffset		At which vertex should the method start filling the buffer.
+		 * @param[in]	indexOffset			At which index should the method start filling the buffer.
+		 * @param[in]	maxNumVerts			Total number of vertices the buffers were allocated for. Used only for memory
+		 *									safety.
+		 * @param[in]	maxNumIndices		Total number of indices the buffers were allocated for. Used only for memory
 		 *									safety.
 		 *									safety.
 		 * @param[in]	vertexStride		Number of bytes between of vertices in the provided vertex and uv data.
 		 * @param[in]	vertexStride		Number of bytes between of vertices in the provided vertex and uv data.
 		 * @param[in]	indexStride			Number of bytes between two indexes in the provided index data.
 		 * @param[in]	indexStride			Number of bytes between two indexes in the provided index data.
 		 * @param[in]	renderElementIdx	Zero-based index of the render element.
 		 * @param[in]	renderElementIdx	Zero-based index of the render element.
 		 *
 		 *
 		 * @see		_getNumRenderElements()
 		 * @see		_getNumRenderElements()
-		 * @see		_getNumQuads()
+		 * @see		_getMeshSize()
 		 */
 		 */
-		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const = 0;
+		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const = 0;
 
 
 		/**
 		/**
 		 * Recreates the internal render elements. Must be called before fillBuffer if element is dirty. Marks the element
 		 * Recreates the internal render elements. Must be called before fillBuffer if element is dirty. Marks the element

+ 7 - 7
Source/BansheeEngine/Include/BsGUIElementContainer.h

@@ -19,20 +19,20 @@ namespace BansheeEngine
 		virtual ~GUIElementContainer();
 		virtual ~GUIElementContainer();
 
 
 		/** @copydoc GUIElement::_getNumRenderElements */
 		/** @copydoc GUIElement::_getNumRenderElements */
-		virtual UINT32 _getNumRenderElements() const override;
+		UINT32 _getNumRenderElements() const override;
 
 
 		/** @copydoc GUIElement::_getMaterial */
 		/** @copydoc GUIElement::_getMaterial */
-		virtual const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
+		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 
 
-		/** @copydoc GUIElement::_getNumQuads */
-		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
+		/** @copydoc GUIElement::_getMeshSize() */
+		void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const override;
 
 
 		/** @copydoc GUIElement::_fillBuffer */
 		/** @copydoc GUIElement::_fillBuffer */
-		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
+		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::_getOptimalSize */
 		/** @copydoc GUIElement::_getOptimalSize */
-		virtual Vector2I _getOptimalSize() const override;
+		Vector2I _getOptimalSize() const override;
 
 
 		/** @copydoc GUIElement::_commandEvent */
 		/** @copydoc GUIElement::_commandEvent */
 		bool _commandEvent(const GUICommandEvent& event) override;
 		bool _commandEvent(const GUICommandEvent& event) override;

+ 20 - 20
Source/BansheeEngine/Include/BsGUIInputBox.h

@@ -90,10 +90,10 @@ namespace BansheeEngine
 		 */
 		 */
 
 
 		/** @copydoc GUIElement::_getElementType */
 		/** @copydoc GUIElement::_getElementType */
-		virtual ElementType _getElementType() const override { return ElementType::InputBox; }
+		ElementType _getElementType() const override { return ElementType::InputBox; }
 
 
 		/** @copydoc GUIElement::_getOptimalSize */
 		/** @copydoc GUIElement::_getOptimalSize */
-		virtual Vector2I _getOptimalSize() const override;
+		Vector2I _getOptimalSize() const override;
 
 
 		/** @} */
 		/** @} */
 	protected:
 	protected:
@@ -101,35 +101,35 @@ namespace BansheeEngine
 		virtual ~GUIInputBox();
 		virtual ~GUIInputBox();
 
 
 		/** @copydoc GUIElement::_getNumRenderElements() */
 		/** @copydoc GUIElement::_getNumRenderElements() */
-		virtual UINT32 _getNumRenderElements() const override;
+		UINT32 _getNumRenderElements() const override;
 
 
 		/** @copydoc GUIElement::_getMaterial() */
 		/** @copydoc GUIElement::_getMaterial() */
-		virtual const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
+		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 
 
-		/** @copydoc GUIElement::_getNumQuads() */
-		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
+		/** @copydoc GUIElement::_getMeshSize() */
+		void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const override;
 
 
 		/** @copydoc GUIElement::_fillBuffer() */
 		/** @copydoc GUIElement::_fillBuffer() */
-		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
+		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::updateRenderElementsInternal() */
 		/** @copydoc GUIElement::updateRenderElementsInternal() */
-		virtual void updateRenderElementsInternal() override;
+		void updateRenderElementsInternal() override;
 
 
 		/** @copydoc GUIElement::updateClippedBounds() */
 		/** @copydoc GUIElement::updateClippedBounds() */
-		virtual void updateClippedBounds() override;
+		void updateClippedBounds() override;
 
 
 		/** @copydoc GUIElement::_mouseEvent */
 		/** @copydoc GUIElement::_mouseEvent */
-		virtual bool _mouseEvent(const GUIMouseEvent& ev) override;
+		bool _mouseEvent(const GUIMouseEvent& ev) override;
 
 
 		/** @copydoc GUIElement::_textInputEvent */
 		/** @copydoc GUIElement::_textInputEvent */
-		virtual bool _textInputEvent(const GUITextInputEvent& ev) override;
+		bool _textInputEvent(const GUITextInputEvent& ev) override;
 
 
 		/** @copydoc GUIElement::_commandEvent */
 		/** @copydoc GUIElement::_commandEvent */
-		virtual bool _commandEvent(const GUICommandEvent& ev) override;
+		bool _commandEvent(const GUICommandEvent& ev) override;
 
 
 		/** @copydoc GUIElement::_virtualButtonEvent */
 		/** @copydoc GUIElement::_virtualButtonEvent */
-		virtual bool _virtualButtonEvent(const GUIVirtualButtonEvent& ev) override;
+		bool _virtualButtonEvent(const GUIVirtualButtonEvent& ev) override;
 
 
 		/**
 		/**
 		 * Returns how much to offset text due to scrolling.
 		 * Returns how much to offset text due to scrolling.
@@ -138,22 +138,22 @@ namespace BansheeEngine
 		 * This is used when text is larger than the input box itself. As the caret moves the text will scroll so that the
 		 * This is used when text is larger than the input box itself. As the caret moves the text will scroll so that the
 		 * caret remains visible, and how much scroll is applied is determined by this value.
 		 * caret remains visible, and how much scroll is applied is determined by this value.
 		 */
 		 */
-		virtual Vector2I _getTextInputOffset() const override;
+		Vector2I _getTextInputOffset() const override;
 
 
 		/** Returns rectangle in which the text can be displayed, in local coordinates (text will start at 0, 0). */
 		/** Returns rectangle in which the text can be displayed, in local coordinates (text will start at 0, 0). */
-		virtual Rect2I _getTextInputRect() const override;
+		Rect2I _getTextInputRect() const override;
 
 
 		/** @copydoc GUIElement::_getRenderElementDepth */
 		/** @copydoc GUIElement::_getRenderElementDepth */
-		virtual UINT32 _getRenderElementDepth(UINT32 renderElementIdx) const override;
+		UINT32 _getRenderElementDepth(UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::_getRenderElementDepthRange */
 		/** @copydoc GUIElement::_getRenderElementDepthRange */
-		virtual UINT32 _getRenderElementDepthRange() const override;
+		UINT32 _getRenderElementDepthRange() const override;
 
 
 		/** @copydoc GUIElement::_hasCustomCursor */
 		/** @copydoc GUIElement::_hasCustomCursor */
-		virtual bool _hasCustomCursor(const Vector2I position, CursorType& type) const override;
+		bool _hasCustomCursor(const Vector2I position, CursorType& type) const override;
 
 
 		/** @copydoc GUIElement::_getContextMenu */
 		/** @copydoc GUIElement::_getContextMenu */
-		virtual SPtr<GUIContextMenu> _getContextMenu() const override;
+		SPtr<GUIContextMenu> _getContextMenu() const override;
 	private:
 	private:
 		/**
 		/**
 		 * Retrieves a sprite from a render element index, and a local render element index that represents render element
 		 * Retrieves a sprite from a render element index, and a local render element index that represents render element

+ 9 - 9
Source/BansheeEngine/Include/BsGUILabel.h

@@ -69,30 +69,30 @@ namespace BansheeEngine
 		 */
 		 */
 
 
 		/** @copydoc GUIElement::_getOptimalSize */
 		/** @copydoc GUIElement::_getOptimalSize */
-		virtual Vector2I _getOptimalSize() const override;
+		Vector2I _getOptimalSize() const override;
 
 
 		/** @copydoc GUIElement::_getElementType */
 		/** @copydoc GUIElement::_getElementType */
-		virtual ElementType _getElementType() const override { return ElementType::Label; }
+		ElementType _getElementType() const override { return ElementType::Label; }
 
 
 		/** @} */
 		/** @} */
 	protected:
 	protected:
 		~GUILabel();
 		~GUILabel();
 
 
 		/** @copydoc GUIElement::_getNumRenderElements */
 		/** @copydoc GUIElement::_getNumRenderElements */
-		virtual UINT32 _getNumRenderElements() const override;
+		UINT32 _getNumRenderElements() const override;
 
 
 		/** @copydoc GUIElement::_getMaterial */
 		/** @copydoc GUIElement::_getMaterial */
-		virtual const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
+		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 
 
-		/** @copydoc GUIElement::_getNumQuads */
-		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
+		/** @copydoc GUIElement::_getMeshSize() */
+		void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const override;
 
 
 		/** @copydoc GUIElement::_fillBuffer */
 		/** @copydoc GUIElement::_fillBuffer */
-		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
+		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::updateRenderElementsInternal */
 		/** @copydoc GUIElement::updateRenderElementsInternal */
-		virtual void updateRenderElementsInternal() override;
+		void updateRenderElementsInternal() override;
 
 
 	private:
 	private:
 		GUILabel(const String& styleName, const GUIContent& content, const GUIDimensions& dimensions);
 		GUILabel(const String& styleName, const GUIContent& content, const GUIDimensions& dimensions);

+ 10 - 10
Source/BansheeEngine/Include/BsGUIScrollBar.h

@@ -77,29 +77,29 @@ namespace BansheeEngine
 		virtual ~GUIScrollBar();
 		virtual ~GUIScrollBar();
 
 
 		/** @copydoc GUIElement::_getNumRenderElements */
 		/** @copydoc GUIElement::_getNumRenderElements */
-		virtual UINT32 _getNumRenderElements() const override;
+		UINT32 _getNumRenderElements() const override;
 
 
 		/** @copydoc GUIElement::_getMaterial */
 		/** @copydoc GUIElement::_getMaterial */
-		virtual const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
+		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 
 
-		/** @copydoc GUIElement::_getNumQuads */
-		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
+		/** @copydoc GUIElement::_getMeshSize() */
+		void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const override;
 
 
 		/** @copydoc GUIElement::_fillBuffer */
 		/** @copydoc GUIElement::_fillBuffer */
-		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
+		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::updateRenderElementsInternal */
 		/** @copydoc GUIElement::updateRenderElementsInternal */
-		virtual void updateRenderElementsInternal() override;
+		void updateRenderElementsInternal() override;
 
 
 		/** @copydoc GUIElement::updateClippedBounds */
 		/** @copydoc GUIElement::updateClippedBounds */
-		virtual void updateClippedBounds() override;
+		void updateClippedBounds() override;
 
 
 		/** @copydoc GUIElement::_getRenderElementDepth */
 		/** @copydoc GUIElement::_getRenderElementDepth */
-		virtual UINT32 _getRenderElementDepth(UINT32 renderElementIdx) const override;
+		UINT32 _getRenderElementDepth(UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc	GUIElement::_getRenderElementDepthRange */
 		/** @copydoc	GUIElement::_getRenderElementDepthRange */
-		virtual UINT32 _getRenderElementDepthRange() const override;
+		UINT32 _getRenderElementDepthRange() const override;
 	private:
 	private:
 		/**
 		/**
 		 * Triggered whenever the scroll handle moves. Provided value represents the new position of the handle in percent
 		 * Triggered whenever the scroll handle moves. Provided value represents the new position of the handle in percent

+ 10 - 10
Source/BansheeEngine/Include/BsGUISliderHandle.h

@@ -96,35 +96,35 @@ namespace BansheeEngine
 		void _setHandlePos(float pct);
 		void _setHandlePos(float pct);
 
 
 		/** @copydoc GUIElement::_getOptimalSize */
 		/** @copydoc GUIElement::_getOptimalSize */
-		virtual Vector2I _getOptimalSize() const override;
+		Vector2I _getOptimalSize() const override;
 
 
 		/** @} */
 		/** @} */
 	protected:
 	protected:
 		~GUISliderHandle();
 		~GUISliderHandle();
 
 
 		/** @copydoc GUIElement::_getNumRenderElements() */
 		/** @copydoc GUIElement::_getNumRenderElements() */
-		virtual UINT32 _getNumRenderElements() const override;
+		UINT32 _getNumRenderElements() const override;
 
 
 		/** @copydoc GUIElement::_getMaterial() */
 		/** @copydoc GUIElement::_getMaterial() */
-		virtual const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
+		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 
 
-		/** @copydoc GUIElement::_getNumQuads() */
-		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
+		/** @copydoc GUIElement::_getMeshSize() */
+		void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const override;
 
 
 		/** @copydoc GUIElement::_fillBuffer() */
 		/** @copydoc GUIElement::_fillBuffer() */
-		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
+		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::updateRenderElementsInternal() */
 		/** @copydoc GUIElement::updateRenderElementsInternal() */
-		virtual void updateRenderElementsInternal() override;
+		void updateRenderElementsInternal() override;
 
 
 		/** @copydoc GUIElement::updateClippedBounds() */
 		/** @copydoc GUIElement::updateClippedBounds() */
-		virtual void updateClippedBounds() override;
+		void updateClippedBounds() override;
 	private:
 	private:
 		GUISliderHandle(bool horizontal, bool jumpOnClick, const String& styleName, const GUIDimensions& dimensions);
 		GUISliderHandle(bool horizontal, bool jumpOnClick, const String& styleName, const GUIDimensions& dimensions);
 
 
 		/** @copydoc GUIElement::_mouseEvent */
 		/** @copydoc GUIElement::_mouseEvent */
-		virtual bool _mouseEvent(const GUIMouseEvent& ev) override;
+		bool _mouseEvent(const GUIMouseEvent& ev) override;
 
 
 		/** Checks are the specified over the scroll handle. Coordinates are relative to the parent widget. */
 		/** Checks are the specified over the scroll handle. Coordinates are relative to the parent widget. */
 		bool isOnHandle(const Vector2I& pos) const;
 		bool isOnHandle(const Vector2I& pos) const;

+ 4 - 4
Source/BansheeEngine/Include/BsGUITexture.h

@@ -165,12 +165,12 @@ namespace BansheeEngine
 		/** @copydoc GUIElement::_getMaterial */
 		/** @copydoc GUIElement::_getMaterial */
 		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 
 
-		/** @copydoc GUIElement::_getNumQuads */
-		UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
+		/** @copydoc GUIElement::_getMeshSize() */
+		void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const override;
 
 
 		/** @copydoc GUIElement::_fillBuffer */
 		/** @copydoc GUIElement::_fillBuffer */
-		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
+		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::updateRenderElementsInternal */
 		/** @copydoc GUIElement::updateRenderElementsInternal */
 		void updateRenderElementsInternal() override;
 		void updateRenderElementsInternal() override;

+ 9 - 9
Source/BansheeEngine/Include/BsGUIViewport.h

@@ -56,7 +56,7 @@ namespace BansheeEngine
 		 */
 		 */
 
 
 		/** @copydoc GUIElement::_getOptimalSize */
 		/** @copydoc GUIElement::_getOptimalSize */
-		virtual Vector2I _getOptimalSize() const override;
+		Vector2I _getOptimalSize() const override;
 
 
 		/** @} */
 		/** @} */
 
 
@@ -64,23 +64,23 @@ namespace BansheeEngine
 		~GUIViewport();
 		~GUIViewport();
 
 
 		/** @copydoc GUIElement::_getNumRenderElements */
 		/** @copydoc GUIElement::_getNumRenderElements */
-		virtual UINT32 _getNumRenderElements() const override;
+		UINT32 _getNumRenderElements() const override;
 
 
 		/** @copydoc GUIElement::_getMaterial */
 		/** @copydoc GUIElement::_getMaterial */
-		virtual const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
+		const SpriteMaterialInfo& _getMaterial(UINT32 renderElementIdx) const override;
 
 
-		/** @copydoc GUIElement::_getNumQuads */
-		virtual UINT32 _getNumQuads(UINT32 renderElementIdx) const override;
+		/** @copydoc GUIElement::_getMeshSize() */
+		void _getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const override;
 
 
 		/** @copydoc GUIElement::_fillBuffer */
 		/** @copydoc GUIElement::_fillBuffer */
-		virtual void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, 
-			UINT32 maxNumQuads, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
+		void _fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const override;
 
 
 		/** @copydoc GUIElement::updateClippedBounds */
 		/** @copydoc GUIElement::updateClippedBounds */
-		virtual void updateClippedBounds() override;
+		void updateClippedBounds() override;
 
 
 		/** @copydoc GUIElement::updateRenderElementsInternal */
 		/** @copydoc GUIElement::updateRenderElementsInternal */
-		virtual void updateRenderElementsInternal() override;
+		void updateRenderElementsInternal() override;
 
 
 	private:
 	private:
 		GUIViewport(const String& styleName, const HCamera& camera, float aspectRatio, Degree fieldOfView, const GUIDimensions& dimensions);
 		GUIViewport(const String& styleName, const HCamera& camera, float aspectRatio, Degree fieldOfView, const GUIDimensions& dimensions);

+ 8 - 5
Source/BansheeEngine/Include/BsSprite.h

@@ -124,8 +124,11 @@ namespace BansheeEngine
 		 * @param[out]	vertices			Previously allocated buffer where to store the vertices.
 		 * @param[out]	vertices			Previously allocated buffer where to store the vertices.
 		 * @param[out]	uv					Previously allocated buffer where to store the uv coordinates.
 		 * @param[out]	uv					Previously allocated buffer where to store the uv coordinates.
 		 * @param[out]	indices				Previously allocated buffer where to store the indices.
 		 * @param[out]	indices				Previously allocated buffer where to store the indices.
-		 * @param[in]	startingQuad		At which quad should the method start filling the buffer.
-		 * @param[in]	maxNumQuads			Total number of quads the buffers were allocated for. Used only for memory 
+		 * @param[in]	vertexOffset		At which vertex should the method start filling the buffer.
+		 * @param[in]	indexOffset			At which index should the method start filling the buffer.
+		 * @param[in]	maxNumVerts			Total number of vertices the buffers were allocated for. Used only for memory 
+		 *									safety.
+		 * @param[in]	maxNumIndices		Total number of indices the buffers were allocated for. Used only for memory
 		 *									safety.
 		 *									safety.
 		 * @param[in]	vertexStride		Number of bytes between of vertices in the provided vertex and uv data.
 		 * @param[in]	vertexStride		Number of bytes between of vertices in the provided vertex and uv data.
 		 * @param[in]	indexStride			Number of bytes between two indexes in the provided index data.
 		 * @param[in]	indexStride			Number of bytes between two indexes in the provided index data.
@@ -137,9 +140,9 @@ namespace BansheeEngine
 		 * @see		getNumRenderElements()
 		 * @see		getNumRenderElements()
 		 * @see		getNumQuads()
 		 * @see		getNumQuads()
 		 */
 		 */
-		UINT32 fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-			UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx, const Vector2I& offset, 
-			const Rect2I& clipRect, bool clip = true) const;
+		UINT32 fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+			UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx, 
+			const Vector2I& offset, const Rect2I& clipRect, bool clip = true) const;
 
 
 		/**
 		/**
 		 * Clips the provided 2D vertices to the provided clip rectangle. The vertices must form axis aligned quads.
 		 * Clips the provided 2D vertices to the provided clip rectangle. The vertices must form axis aligned quads.

+ 8 - 7
Source/BansheeEngine/Source/BsGUIButtonBase.cpp

@@ -82,7 +82,7 @@ namespace BansheeEngine
 			return mImageSprite->getMaterialInfo(renderElementIdx);
 			return mImageSprite->getMaterialInfo(renderElementIdx);
 	}
 	}
 
 
-	UINT32 GUIButtonBase::_getNumQuads(UINT32 renderElementIdx) const
+	void GUIButtonBase::_getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const
 	{
 	{
 		UINT32 textSpriteIdx = mImageSprite->getNumRenderElements();
 		UINT32 textSpriteIdx = mImageSprite->getNumRenderElements();
 		UINT32 contentImgSpriteIdx = textSpriteIdx + mTextSprite->getNumRenderElements();
 		UINT32 contentImgSpriteIdx = textSpriteIdx + mTextSprite->getNumRenderElements();
@@ -95,7 +95,8 @@ namespace BansheeEngine
 		else
 		else
 			numQuads = mImageSprite->getNumQuads(renderElementIdx);
 			numQuads = mImageSprite->getNumQuads(renderElementIdx);
 
 
-		return numQuads;
+		numVertices = numQuads * 4;
+		numIndices = numQuads * 6;
 	}
 	}
 
 
 	void GUIButtonBase::updateRenderElementsInternal()
 	void GUIButtonBase::updateRenderElementsInternal()
@@ -193,8 +194,8 @@ namespace BansheeEngine
 		return 2;
 		return 2;
 	}
 	}
 
 
-	void GUIButtonBase::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
+	void GUIButtonBase::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 	{
 		UINT32 textSpriteIdx = mImageSprite->getNumRenderElements();
 		UINT32 textSpriteIdx = mImageSprite->getNumRenderElements();
 		UINT32 contentImgSpriteIdx = textSpriteIdx + mTextSprite->getNumRenderElements();
 		UINT32 contentImgSpriteIdx = textSpriteIdx + mTextSprite->getNumRenderElements();
@@ -203,7 +204,7 @@ namespace BansheeEngine
 		{
 		{
 			Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 			Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 
 
-			mImageSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, 
+			mImageSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
 				vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 				vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 
 
 			return;
 			return;
@@ -270,12 +271,12 @@ namespace BansheeEngine
 
 
 		if(renderElementIdx >= contentImgSpriteIdx)
 		if(renderElementIdx >= contentImgSpriteIdx)
 		{
 		{
-			mContentImageSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, 
+			mContentImageSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
 				vertexStride, indexStride, contentImgSpriteIdx - renderElementIdx, imageOffset, imageClipRect);
 				vertexStride, indexStride, contentImgSpriteIdx - renderElementIdx, imageOffset, imageClipRect);
 		}
 		}
 		else
 		else
 		{
 		{
-			mTextSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, 
+			mTextSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
 				vertexStride, indexStride, textSpriteIdx - renderElementIdx, textOffset, textClipRect);
 				vertexStride, indexStride, textSpriteIdx - renderElementIdx, textOffset, textClipRect);
 		}
 		}
 	}
 	}

+ 25 - 12
Source/BansheeEngine/Source/BsGUICanvas.cpp

@@ -199,25 +199,38 @@ namespace BansheeEngine
 		}
 		}
 	}
 	}
 
 
-	UINT32 GUICanvas::_getNumQuads(UINT32 renderElementIdx) const
+	void GUICanvas::_getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const
 	{
 	{
-		// TODO - This needs to be refactored to return triangle count instead
-
 		const CanvasElement& element = mElements[renderElementIdx];
 		const CanvasElement& element = mElements[renderElementIdx];
 		switch (element.type)
 		switch (element.type)
 		{
 		{
 		case CanvasElementType::Line:
 		case CanvasElementType::Line:
 			// TODO
 			// TODO
-			return 0;
+			numVertices = 0;
+			numIndices = 0;
+			break;
 		case CanvasElementType::Image:
 		case CanvasElementType::Image:
-			return element.imageSprite->getNumQuads(renderElementIdx);
+		{
+			UINT32 numQuads = element.imageSprite->getNumQuads(renderElementIdx);
+			numVertices = numQuads * 4;
+			numIndices = numQuads * 6;
+		}
 		case CanvasElementType::Text:
 		case CanvasElementType::Text:
-			return element.textSprite->getNumQuads(renderElementIdx);
+		{
+			UINT32 numQuads = element.textSprite->getNumQuads(renderElementIdx);
+			numVertices = numQuads * 4;
+			numIndices = numQuads * 6;
+		}
 		case CanvasElementType::Triangle:
 		case CanvasElementType::Triangle:
 			// TODO
 			// TODO
-			return 0;
+			numVertices = 0;
+			numIndices = 0;
+			break;
 		default:
 		default:
-			return 0;
+			// TODO
+			numVertices = 0;
+			numIndices = 0;
+			break;
 		}
 		}
 	}
 	}
 
 
@@ -295,8 +308,8 @@ namespace BansheeEngine
 		return Vector2I(10, 10);
 		return Vector2I(10, 10);
 	}
 	}
 
 
-	void GUICanvas::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads,
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
+	void GUICanvas::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 	{
 		const CanvasElement& element = mElements[renderElementIdx];
 		const CanvasElement& element = mElements[renderElementIdx];
 
 
@@ -316,7 +329,7 @@ namespace BansheeEngine
 			clipRect.x -= area.x;
 			clipRect.x -= area.x;
 			clipRect.y -= area.y;
 			clipRect.y -= area.y;
 
 
-			element.imageSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads,
+			element.imageSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
 				vertexStride, indexStride, renderElementIdx, offset, clipRect);
 				vertexStride, indexStride, renderElementIdx, offset, clipRect);
 		}
 		}
 			break;
 			break;
@@ -327,7 +340,7 @@ namespace BansheeEngine
 			clipRect.x += position.x;
 			clipRect.x += position.x;
 			clipRect.y += position.y;
 			clipRect.y += position.y;
 
 
-			element.textSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads,
+			element.textSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
 				vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 				vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 		}
 		}
 			break;
 			break;

+ 5 - 4
Source/BansheeEngine/Source/BsGUIElementContainer.cpp

@@ -25,13 +25,14 @@ namespace BansheeEngine
 		return dummy;
 		return dummy;
 	}
 	}
 
 
-	UINT32 GUIElementContainer::_getNumQuads(UINT32 renderElementIdx) const
+	void GUIElementContainer::_getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const
 	{
 	{
-		return 0;
+		numVertices = 0;
+		numIndices = 0;
 	}
 	}
 
 
-	void GUIElementContainer::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
+	void GUIElementContainer::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{ }
 	{ }
 
 
 	Vector2I GUIElementContainer::_getOptimalSize() const
 	Vector2I GUIElementContainer::_getOptimalSize() const

+ 8 - 5
Source/BansheeEngine/Source/BsGUIInputBox.cpp

@@ -129,12 +129,14 @@ namespace BansheeEngine
 		return sprite->getMaterialInfo(localRenderElementIdx);
 		return sprite->getMaterialInfo(localRenderElementIdx);
 	}
 	}
 
 
-	UINT32 GUIInputBox::_getNumQuads(UINT32 renderElementIdx) const
+	void GUIInputBox::_getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const
 	{
 	{
 		UINT32 localRenderElementIdx;
 		UINT32 localRenderElementIdx;
 		Sprite* sprite = renderElemToSprite(renderElementIdx, localRenderElementIdx);
 		Sprite* sprite = renderElemToSprite(renderElementIdx, localRenderElementIdx);
 
 
-		return sprite->getNumQuads(localRenderElementIdx);
+		UINT32 numQuads = sprite->getNumQuads(localRenderElementIdx);
+		numVertices = numQuads * 4;
+		numIndices = numQuads * 6;
 	}
 	}
 
 
 	void GUIInputBox::updateRenderElementsInternal()
 	void GUIInputBox::updateRenderElementsInternal()
@@ -383,15 +385,16 @@ namespace BansheeEngine
 		return false;
 		return false;
 	}
 	}
 
 
-	void GUIInputBox::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
+	void GUIInputBox::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 	{
 		UINT32 localRenderElementIdx;
 		UINT32 localRenderElementIdx;
 		Sprite* sprite = renderElemToSprite(renderElementIdx, localRenderElementIdx);
 		Sprite* sprite = renderElemToSprite(renderElementIdx, localRenderElementIdx);
 		Vector2I offset = renderElemToOffset(renderElementIdx);
 		Vector2I offset = renderElemToOffset(renderElementIdx);
 		Rect2I clipRect = renderElemToClipRect(renderElementIdx);
 		Rect2I clipRect = renderElemToClipRect(renderElementIdx);
 
 
-		sprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, vertexStride, indexStride, localRenderElementIdx, offset, clipRect);
+		sprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices, vertexStride, 
+			indexStride, localRenderElementIdx, offset, clipRect);
 	}
 	}
 
 
 	bool GUIInputBox::_mouseEvent(const GUIMouseEvent& ev)
 	bool GUIInputBox::_mouseEvent(const GUIMouseEvent& ev)

+ 8 - 5
Source/BansheeEngine/Source/BsGUILabel.cpp

@@ -29,9 +29,12 @@ namespace BansheeEngine
 		return mTextSprite->getMaterialInfo(renderElementIdx);
 		return mTextSprite->getMaterialInfo(renderElementIdx);
 	}
 	}
 
 
-	UINT32 GUILabel::_getNumQuads(UINT32 renderElementIdx) const
+	void GUILabel::_getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const
 	{
 	{
-		return mTextSprite->getNumQuads(renderElementIdx);
+		UINT32 numQuads = mTextSprite->getNumQuads(renderElementIdx);
+
+		numVertices = numQuads * 4;
+		numIndices = numQuads * 6;
 	}
 	}
 
 
 	void GUILabel::updateRenderElementsInternal()
 	void GUILabel::updateRenderElementsInternal()
@@ -56,12 +59,12 @@ namespace BansheeEngine
 		return GUIHelper::calcOptimalContentsSize(mContent, *_getStyle(), _getDimensions());
 		return GUIHelper::calcOptimalContentsSize(mContent, *_getStyle(), _getDimensions());
 	}
 	}
 
 
-	void GUILabel::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
+	void GUILabel::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 	{
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 
 
-		mTextSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, vertexStride, 
+		mTextSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices, vertexStride,
 			indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 			indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 	}
 	}
 
 

+ 23 - 12
Source/BansheeEngine/Source/BsGUIManager.cpp

@@ -58,7 +58,8 @@ namespace BansheeEngine
 	struct GUIMaterialGroup
 	struct GUIMaterialGroup
 	{
 	{
 		SpriteMaterialInfo matInfo;
 		SpriteMaterialInfo matInfo;
-		UINT32 numQuads;
+		UINT32 numVertices;
+		UINT32 numIndices;
 		UINT32 depth;
 		UINT32 depth;
 		UINT32 minDepth;
 		UINT32 minDepth;
 		Rect2I bounds;
 		Rect2I bounds;
@@ -570,14 +571,19 @@ namespace BansheeEngine
 						foundGroup->bounds = tfrmedBounds;
 						foundGroup->bounds = tfrmedBounds;
 						foundGroup->elements.push_back(GUIGroupElement(guiElem, renderElemIdx));
 						foundGroup->elements.push_back(GUIGroupElement(guiElem, renderElemIdx));
 						foundGroup->matInfo = matInfo;
 						foundGroup->matInfo = matInfo;
-						foundGroup->numQuads = guiElem->_getNumQuads(renderElemIdx);
+						guiElem->_getMeshSize(renderElemIdx, foundGroup->numVertices, foundGroup->numIndices);
 					}
 					}
 					else
 					else
 					{
 					{
 						foundGroup->bounds.encapsulate(tfrmedBounds);
 						foundGroup->bounds.encapsulate(tfrmedBounds);
 						foundGroup->elements.push_back(GUIGroupElement(guiElem, renderElemIdx));
 						foundGroup->elements.push_back(GUIGroupElement(guiElem, renderElemIdx));
 						foundGroup->minDepth = std::min(foundGroup->minDepth, elemDepth);
 						foundGroup->minDepth = std::min(foundGroup->minDepth, elemDepth);
-						foundGroup->numQuads += guiElem->_getNumQuads(renderElemIdx);
+						
+						UINT32 numVertices;
+						UINT32 numIndices;
+						guiElem->_getMeshSize(renderElemIdx, numVertices, numIndices);
+						foundGroup->numVertices += numVertices;
+						foundGroup->numIndices += numIndices;
 					}
 					}
 				}
 				}
 
 
@@ -631,7 +637,7 @@ namespace BansheeEngine
 						}
 						}
 					}
 					}
 
 
-					SPtr<MeshData> meshData = bs_shared_ptr_new<MeshData>(group->numQuads * 4, group->numQuads * 6, mVertexDesc);
+					SPtr<MeshData> meshData = bs_shared_ptr_new<MeshData>(group->numVertices, group->numIndices, mVertexDesc);
 
 
 					UINT8* vertices = meshData->getElementData(VES_POSITION);
 					UINT8* vertices = meshData->getElementData(VES_POSITION);
 					UINT8* uvs = meshData->getElementData(VES_TEXCOORD);
 					UINT8* uvs = meshData->getElementData(VES_TEXCOORD);
@@ -639,20 +645,25 @@ namespace BansheeEngine
 					UINT32 vertexStride = meshData->getVertexDesc()->getVertexStride();
 					UINT32 vertexStride = meshData->getVertexDesc()->getVertexStride();
 					UINT32 indexStride = meshData->getIndexElementSize();
 					UINT32 indexStride = meshData->getIndexElementSize();
 
 
-					UINT32 quadOffset = 0;
+					UINT32 indexOffset = 0;
+					UINT32 vertexOffset = 0;
 					for(auto& matElement : group->elements)
 					for(auto& matElement : group->elements)
 					{
 					{
-						matElement.element->_fillBuffer(vertices, uvs, indices, quadOffset, group->numQuads, vertexStride, indexStride, matElement.renderElement);
+						matElement.element->_fillBuffer(vertices, uvs, indices, vertexOffset, indexOffset, group->numVertices,
+							group->numIndices, vertexStride, indexStride, matElement.renderElement);
 
 
-						UINT32 numQuads = matElement.element->_getNumQuads(matElement.renderElement);
-						UINT32 indexStart = quadOffset * 6;
-						UINT32 indexEnd = indexStart + numQuads * 6;
-						UINT32 vertOffset = quadOffset * 4;
+						UINT32 numVertices;
+						UINT32 numIndices;
+						matElement.element->_getMeshSize(matElement.renderElement, numVertices, numIndices);
+
+						UINT32 indexStart = indexOffset;
+						UINT32 indexEnd = indexStart + numIndices;
 
 
 						for(UINT32 i = indexStart; i < indexEnd; i++)
 						for(UINT32 i = indexStart; i < indexEnd; i++)
-							indices[i] += vertOffset;
+							indices[i] += vertexOffset;
 
 
-						quadOffset += numQuads;
+						indexOffset += numIndices;
+						vertexOffset += numVertices;
 					}
 					}
 
 
 					if(groupIdx < (UINT32)renderData.cachedMeshes.size())
 					if(groupIdx < (UINT32)renderData.cachedMeshes.size())

+ 8 - 5
Source/BansheeEngine/Source/BsGUIScrollBar.cpp

@@ -73,9 +73,12 @@ namespace BansheeEngine
 		return mImageSprite->getMaterialInfo(renderElementIdx);
 		return mImageSprite->getMaterialInfo(renderElementIdx);
 	}
 	}
 
 
-	UINT32 GUIScrollBar::_getNumQuads(UINT32 renderElementIdx) const
+	void GUIScrollBar::_getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const
 	{
 	{
-		return mImageSprite->getNumQuads(renderElementIdx);
+		UINT32 numQuads = mImageSprite->getNumQuads(renderElementIdx);
+
+		numVertices = numQuads * 4;
+		numIndices = numQuads * 6;
 	}
 	}
 
 
 	void GUIScrollBar::updateRenderElementsInternal()
 	void GUIScrollBar::updateRenderElementsInternal()
@@ -114,11 +117,11 @@ namespace BansheeEngine
 		return 3;
 		return 3;
 	}
 	}
 
 
-	void GUIScrollBar::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
+	void GUIScrollBar::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 	{
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
-		mImageSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, 
+		mImageSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
 			vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 			vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 	}
 	}
 
 

+ 7 - 5
Source/BansheeEngine/Source/BsGUISliderHandle.cpp

@@ -79,9 +79,11 @@ namespace BansheeEngine
 		return mImageSprite->getMaterialInfo(renderElementIdx);
 		return mImageSprite->getMaterialInfo(renderElementIdx);
 	}
 	}
 
 
-	UINT32 GUISliderHandle::_getNumQuads(UINT32 renderElementIdx) const
+	void GUISliderHandle::_getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const
 	{
 	{
-		return mImageSprite->getNumQuads(renderElementIdx);
+		UINT32 numQuads = mImageSprite->getNumQuads(renderElementIdx);
+		numVertices = numQuads * 4;
+		numIndices = numQuads * 6;
 	}
 	}
 
 
 	void GUISliderHandle::updateRenderElementsInternal()
 	void GUISliderHandle::updateRenderElementsInternal()
@@ -135,8 +137,8 @@ namespace BansheeEngine
 		return Vector2I();
 		return Vector2I();
 	}
 	}
 
 
-	void GUISliderHandle::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
+	void GUISliderHandle::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 	{
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 		if(mHorizontal)
 		if(mHorizontal)
@@ -150,7 +152,7 @@ namespace BansheeEngine
 		else
 		else
 			clipRect.y -= getHandlePosPx();
 			clipRect.y -= getHandlePosPx();
 
 
-		mImageSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, 
+		mImageSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
 			vertexStride, indexStride, renderElementIdx, offset, clipRect);
 			vertexStride, indexStride, renderElementIdx, offset, clipRect);
 	}
 	}
 
 

+ 7 - 5
Source/BansheeEngine/Source/BsGUITexture.cpp

@@ -126,9 +126,11 @@ namespace BansheeEngine
 		return mImageSprite->getMaterialInfo(renderElementIdx);
 		return mImageSprite->getMaterialInfo(renderElementIdx);
 	}
 	}
 
 
-	UINT32 GUITexture::_getNumQuads(UINT32 renderElementIdx) const
+	void GUITexture::_getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const
 	{
 	{
-		return mImageSprite->getNumQuads(renderElementIdx);
+		UINT32 numQuads = mImageSprite->getNumQuads(renderElementIdx);
+		numVertices = numQuads * 4;
+		numIndices = numQuads * 6;
 	}
 	}
 
 
 	void GUITexture::updateRenderElementsInternal()
 	void GUITexture::updateRenderElementsInternal()
@@ -193,11 +195,11 @@ namespace BansheeEngine
 		return optimalSize;
 		return optimalSize;
 	}
 	}
 
 
-	void GUITexture::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
+	void GUITexture::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 	{
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
 		Vector2I offset(mLayoutData.area.x, mLayoutData.area.y);
-		mImageSprite->fillBuffer(vertices, uv, indices, startingQuad, maxNumQuads, 
+		mImageSprite->fillBuffer(vertices, uv, indices, vertexOffset, indexOffset, maxNumVerts, maxNumIndices,
 			vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 			vertexStride, indexStride, renderElementIdx, offset, mLayoutData.getLocalClipRect());
 	}
 	}
 }
 }

+ 5 - 4
Source/BansheeEngine/Source/BsGUIViewport.cpp

@@ -53,9 +53,10 @@ namespace BansheeEngine
 		return dummy;
 		return dummy;
 	}
 	}
 
 
-	UINT32 GUIViewport::_getNumQuads(UINT32 renderElementIdx) const
+	void GUIViewport::_getMeshSize(UINT32 renderElementIdx, UINT32& numVertices, UINT32& numIndices) const
 	{
 	{
-		return 0;
+		numVertices = 0;
+		numIndices = 0;
 	}
 	}
 
 
 	void GUIViewport::updateClippedBounds()
 	void GUIViewport::updateClippedBounds()
@@ -69,8 +70,8 @@ namespace BansheeEngine
 		return Vector2I(0, 0);
 		return Vector2I(0, 0);
 	}
 	}
 
 
-	void GUIViewport::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
+	void GUIViewport::_fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx) const
 	{
 	{
 
 
 	}
 	}

+ 12 - 11
Source/BansheeEngine/Source/BsSprite.cpp

@@ -42,22 +42,23 @@ namespace BansheeEngine
 		return mCachedRenderElements.at(renderElementIdx).numQuads;
 		return mCachedRenderElements.at(renderElementIdx).numQuads;
 	}
 	}
 
 
-	UINT32 Sprite::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 startingQuad, UINT32 maxNumQuads, 
-		UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx, const Vector2I& offset, const Rect2I& clipRect, bool clip) const
+	UINT32 Sprite::fillBuffer(UINT8* vertices, UINT8* uv, UINT32* indices, UINT32 vertexOffset, UINT32 indexOffset,
+		UINT32 maxNumVerts, UINT32 maxNumIndices, UINT32 vertexStride, UINT32 indexStride, UINT32 renderElementIdx, 
+		const Vector2I& offset, const Rect2I& clipRect, bool clip) const
 	{
 	{
 		const auto& renderElem = mCachedRenderElements.at(renderElementIdx);
 		const auto& renderElem = mCachedRenderElements.at(renderElementIdx);
 
 
-		UINT32 startVert = startingQuad * 4;
-		UINT32 startIndex = startingQuad * 6;
+		UINT32 startVert = vertexOffset;
+		UINT32 startIndex = indexOffset;
 
 
-		UINT32 maxVertIdx = maxNumQuads * 4;
-		UINT32 maxIndexIdx = maxNumQuads * 6;
+		UINT32 maxVertIdx = maxNumVerts;
+		UINT32 maxIndexIdx = maxNumIndices;
 
 
-		UINT32 mNumVertices = renderElem.numQuads * 4;
-		UINT32 mNumIndices = renderElem.numQuads * 6;
+		UINT32 numVertices = renderElem.numQuads * 4;
+		UINT32 numIndices = renderElem.numQuads * 6;
 
 
-		assert((startVert + mNumVertices) <= maxVertIdx);
-		assert((startIndex + mNumIndices) <= maxIndexIdx);
+		assert((startVert + numVertices) <= maxVertIdx);
+		assert((startIndex + numIndices) <= maxIndexIdx);
 
 
 		UINT8* vertDst = vertices + startVert * vertexStride;
 		UINT8* vertDst = vertices + startVert * vertexStride;
 		UINT8* uvDst = uv + startVert * vertexStride;
 		UINT8* uvDst = uv + startVert * vertexStride;
@@ -165,7 +166,7 @@ namespace BansheeEngine
 		}
 		}
 
 
 		if(indices != nullptr)
 		if(indices != nullptr)
-			memcpy(&indices[startIndex], renderElem.indexes, mNumIndices * sizeof(UINT32));
+			memcpy(&indices[startIndex], renderElem.indexes, numIndices * sizeof(UINT32));
 
 
 		return renderElem.numQuads;
 		return renderElem.numQuads;
 	}
 	}