ソースを参照

Fixed an issue where element bounds weren't being properly updated

Marko Pintera 12 年 前
コミット
a0a7b1ee1d

+ 5 - 0
BansheeEngine/Include/BsGUIButton.h

@@ -45,6 +45,11 @@ namespace BansheeEngine
 		 */
 		 */
 		virtual void updateRenderElementsInternal();
 		virtual void updateRenderElementsInternal();
 
 
+		/**
+		 * @copydoc GUIElement::updateBounds()
+		 */
+		virtual void updateBounds();
+
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 
 

+ 2 - 1
BansheeEngine/Include/BsGUIElement.h

@@ -108,7 +108,8 @@ namespace BansheeEngine
 
 
 		const GUILayoutOptions& _getLayoutOptions() const { return mLayoutOptions; }
 		const GUILayoutOptions& _getLayoutOptions() const { return mLayoutOptions; }
 	protected:
 	protected:
-		virtual void updateRenderElementsInternal() = 0;
+		virtual void updateRenderElementsInternal();
+		virtual void updateBounds() = 0;
 
 
 		void setLayoutOptions(const GUILayoutOptions& layoutOptions);
 		void setLayoutOptions(const GUILayoutOptions& layoutOptions);
 		
 		

+ 5 - 0
BansheeEngine/Include/BsGUIInputBox.h

@@ -43,6 +43,11 @@ namespace BansheeEngine
 		 */
 		 */
 		virtual void updateRenderElementsInternal();
 		virtual void updateRenderElementsInternal();
 
 
+		/**
+		 * @copydoc GUIElement::updateBounds()
+		 */
+		virtual void updateBounds();
+
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 
 

+ 5 - 0
BansheeEngine/Include/BsGUILabel.h

@@ -45,6 +45,11 @@ namespace BansheeEngine
 		 */
 		 */
 		virtual void updateRenderElementsInternal();
 		virtual void updateRenderElementsInternal();
 
 
+		/**
+		 * @copydoc GUIElement::updateBounds()
+		 */
+		virtual void updateBounds();
+
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 	private:
 	private:

+ 5 - 0
BansheeEngine/Include/BsGUIScrollArea.h

@@ -44,6 +44,11 @@ namespace BansheeEngine
 		 */
 		 */
 		virtual void updateRenderElementsInternal();
 		virtual void updateRenderElementsInternal();
 
 
+		/**
+		 * @copydoc GUIElement::updateBounds()
+		 */
+		virtual void updateBounds();
+
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 	private:
 	private:

+ 5 - 0
BansheeEngine/Include/BsGUIScrollBar.h

@@ -47,6 +47,11 @@ namespace BansheeEngine
 		 */
 		 */
 		virtual void updateRenderElementsInternal();
 		virtual void updateRenderElementsInternal();
 
 
+		/**
+		 * @copydoc GUIElement::updateBounds()
+		 */
+		virtual void updateBounds();
+
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 
 

+ 5 - 0
BansheeEngine/Include/BsGUIScrollBarHandle.h

@@ -54,6 +54,11 @@ namespace BansheeEngine
 		 */
 		 */
 		virtual void updateRenderElementsInternal();
 		virtual void updateRenderElementsInternal();
 
 
+		/**
+		 * @copydoc GUIElement::updateBounds()
+		 */
+		virtual void updateBounds();
+
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 	private:
 	private:

+ 5 - 0
BansheeEngine/Include/BsGUITexture.h

@@ -54,6 +54,11 @@ namespace BansheeEngine
 		 */
 		 */
 		virtual void updateRenderElementsInternal();
 		virtual void updateRenderElementsInternal();
 
 
+		/**
+		 * @copydoc GUIElement::updateBounds()
+		 */
+		virtual void updateBounds();
+
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 
 

+ 5 - 0
BansheeEngine/Include/BsGUIToggle.h

@@ -45,6 +45,11 @@ namespace BansheeEngine
 		 */
 		 */
 		virtual void updateRenderElementsInternal();
 		virtual void updateRenderElementsInternal();
 
 
+		/**
+		 * @copydoc GUIElement::updateBounds()
+		 */
+		virtual void updateBounds();
+
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 
 

+ 5 - 0
BansheeEngine/Include/BsGUIWindowFrame.h

@@ -44,6 +44,11 @@ namespace BansheeEngine
 		 */
 		 */
 		virtual void updateRenderElementsInternal();
 		virtual void updateRenderElementsInternal();
 
 
+		/**
+		 * @copydoc GUIElement::updateBounds()
+		 */
+		virtual void updateBounds();
+
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 
 

+ 5 - 0
BansheeEngine/Include/BsGUIWindowMover.h

@@ -44,6 +44,11 @@ namespace BansheeEngine
 		 */
 		 */
 		virtual void updateRenderElementsInternal();
 		virtual void updateRenderElementsInternal();
 
 
+		/**
+		 * @copydoc GUIElement::updateBounds()
+		 */
+		virtual void updateBounds();
+
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalWidth() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 		virtual CM::UINT32 _getOptimalHeight() const;
 	private:
 	private:

+ 7 - 1
BansheeEngine/Source/BsGUIButton.cpp

@@ -99,7 +99,6 @@ namespace BansheeEngine
 		mImageDesc.height = mHeight;
 		mImageDesc.height = mHeight;
 
 
 		mImageSprite->update(mImageDesc);
 		mImageSprite->update(mImageDesc);
-		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 		mNumImageRenderElements = mImageSprite->getNumRenderElements();
 		mNumImageRenderElements = mImageSprite->getNumRenderElements();
 
 
 		TEXT_SPRITE_DESC textDesc;
 		TEXT_SPRITE_DESC textDesc;
@@ -115,6 +114,13 @@ namespace BansheeEngine
 		textDesc.vertAlign = mStyle->textVertAlign;
 		textDesc.vertAlign = mStyle->textVertAlign;
 
 
 		mTextSprite->update(textDesc);
 		mTextSprite->update(textDesc);
+
+		GUIElement::updateRenderElementsInternal();
+	}
+
+	void GUIButton::updateBounds()
+	{
+		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 	}
 	}
 
 
 	UINT32 GUIButton::_getOptimalWidth() const
 	UINT32 GUIButton::_getOptimalWidth() const

+ 13 - 2
BansheeEngine/Source/BsGUIElement.cpp

@@ -27,6 +27,11 @@ namespace BansheeEngine
 		_markAsClean();
 		_markAsClean();
 	}
 	}
 
 
+	void GUIElement::updateRenderElementsInternal()
+	{
+		updateBounds();
+	}
+
 	void GUIElement::setLayoutOptions(const GUILayoutOptions& layoutOptions) 
 	void GUIElement::setLayoutOptions(const GUILayoutOptions& layoutOptions) 
 	{
 	{
 		if(layoutOptions.maxWidth < layoutOptions.minWidth)
 		if(layoutOptions.maxWidth < layoutOptions.minWidth)
@@ -75,9 +80,12 @@ namespace BansheeEngine
 	void GUIElement::_setOffset(const CM::Int2& offset) 
 	void GUIElement::_setOffset(const CM::Int2& offset) 
 	{ 
 	{ 
 		if(mOffset != offset)
 		if(mOffset != offset)
+		{
 			markMeshAsDirty();
 			markMeshAsDirty();
 
 
-		mOffset = offset;
+			mOffset = offset;
+			updateBounds();
+		}
 	}
 	}
 
 
 	void GUIElement::_setWidth(UINT32 width) 
 	void GUIElement::_setWidth(UINT32 width) 
@@ -99,9 +107,12 @@ namespace BansheeEngine
 	void GUIElement::_setClipRect(const CM::Rect& clipRect) 
 	void GUIElement::_setClipRect(const CM::Rect& clipRect) 
 	{ 
 	{ 
 		if(mClipRect != clipRect)
 		if(mClipRect != clipRect)
+		{
 			markMeshAsDirty();
 			markMeshAsDirty();
 
 
-		mClipRect = clipRect; 
+			mClipRect = clipRect; 
+			updateBounds();
+		}
 	}
 	}
 
 
 	Rect GUIElement::getVisibleBounds() const
 	Rect GUIElement::getVisibleBounds() const

+ 7 - 1
BansheeEngine/Source/BsGUIInputBox.cpp

@@ -117,7 +117,6 @@ namespace BansheeEngine
 		mImageDesc.height = mHeight;
 		mImageDesc.height = mHeight;
 
 
 		mImageSprite->update(mImageDesc);
 		mImageSprite->update(mImageDesc);
-		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 
 
 		TEXT_SPRITE_DESC textDesc = getTextDesc();
 		TEXT_SPRITE_DESC textDesc = getTextDesc();
 		mTextSprite->update(textDesc);
 		mTextSprite->update(textDesc);
@@ -133,6 +132,13 @@ namespace BansheeEngine
 			gGUIManager().getInputSelectionTool()->updateText(textDesc, getTextOffset(), mTextOffset); // TODO - These shouldn't be here. Only call this when one of these parameters changes.
 			gGUIManager().getInputSelectionTool()->updateText(textDesc, getTextOffset(), mTextOffset); // TODO - These shouldn't be here. Only call this when one of these parameters changes.
 			gGUIManager().getInputSelectionTool()->updateSprite();
 			gGUIManager().getInputSelectionTool()->updateSprite();
 		}
 		}
+
+		GUIElement::updateRenderElementsInternal();
+	}
+
+	void GUIInputBox::updateBounds()
+	{
+		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 	}
 	}
 
 
 	Sprite* GUIInputBox::renderElemToSprite(UINT32 renderElemIdx, UINT32& localRenderElemIdx) const
 	Sprite* GUIInputBox::renderElemToSprite(UINT32 renderElemIdx, UINT32& localRenderElemIdx) const

+ 6 - 0
BansheeEngine/Source/BsGUILabel.cpp

@@ -49,6 +49,12 @@ namespace BansheeEngine
 		mDesc.height = mHeight;
 		mDesc.height = mHeight;
 
 
 		mTextSprite->update(mDesc);
 		mTextSprite->update(mDesc);
+
+		GUIElement::updateRenderElementsInternal();
+	}
+
+	void GUILabel::updateBounds()
+	{
 		mBounds = mTextSprite->getBounds(mOffset, mClipRect);
 		mBounds = mTextSprite->getBounds(mOffset, mClipRect);
 	}
 	}
 
 

+ 8 - 1
BansheeEngine/Source/BsGUIScrollArea.cpp

@@ -44,7 +44,14 @@ namespace BansheeEngine
 	}
 	}
 
 
 	void GUIScrollArea::updateRenderElementsInternal()
 	void GUIScrollArea::updateRenderElementsInternal()
-	{ }
+	{
+		GUIElement::updateRenderElementsInternal();
+	}
+
+	void GUIScrollArea::updateBounds()
+	{
+		mBounds = Rect(0, 0, 0, 0); // We don't want any mouse input for this element. This is just a container.
+	}
 
 
 	UINT32 GUIScrollArea::_getOptimalWidth() const
 	UINT32 GUIScrollArea::_getOptimalWidth() const
 	{
 	{

+ 7 - 0
BansheeEngine/Source/BsGUIScrollBar.cpp

@@ -86,6 +86,13 @@ namespace BansheeEngine
 		desc.height = mHeight;
 		desc.height = mHeight;
 
 
 		mImageSprite->update(desc);
 		mImageSprite->update(desc);
+
+		GUIElement::updateRenderElementsInternal();
+	}
+
+	void GUIScrollBar::updateBounds()
+	{
+		mBounds = Rect(0, 0, 0, 0); // We don't want any mouse input for this element. This is just a container.
 	}
 	}
 
 
 	UINT32 GUIScrollBar::_getOptimalWidth() const
 	UINT32 GUIScrollBar::_getOptimalWidth() const

+ 6 - 0
BansheeEngine/Source/BsGUIScrollBarHandle.cpp

@@ -110,6 +110,12 @@ namespace BansheeEngine
 		}
 		}
 
 
 		mImageSprite->update(desc);
 		mImageSprite->update(desc);
+		
+		GUIElement::updateRenderElementsInternal();
+	}
+
+	void GUIScrollBarHandle::updateBounds()
+	{
 		mBounds = Rect(mOffset.x, mOffset.y, mWidth, mHeight);
 		mBounds = Rect(mOffset.x, mOffset.y, mWidth, mHeight);
 
 
 		Rect localClipRect(mClipRect.x + mOffset.x, mClipRect.y + mOffset.y, mClipRect.width, mClipRect.height);
 		Rect localClipRect(mClipRect.x + mOffset.x, mClipRect.y + mOffset.y, mClipRect.width, mClipRect.height);

+ 6 - 0
BansheeEngine/Source/BsGUITexture.cpp

@@ -158,6 +158,12 @@ namespace BansheeEngine
 		}
 		}
 
 
 		mImageSprite->update(mDesc);
 		mImageSprite->update(mDesc);
+		
+		GUIElement::updateRenderElementsInternal();
+	}
+
+	void GUITexture::updateBounds()
+	{
 		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 	}
 	}
 
 

+ 7 - 1
BansheeEngine/Source/BsGUIToggle.cpp

@@ -99,7 +99,6 @@ namespace BansheeEngine
 		mImageDesc.height = mHeight;
 		mImageDesc.height = mHeight;
 
 
 		mImageSprite->update(mImageDesc);
 		mImageSprite->update(mImageDesc);
-		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 		mNumImageRenderElements = mImageSprite->getNumRenderElements();
 		mNumImageRenderElements = mImageSprite->getNumRenderElements();
 
 
 		TEXT_SPRITE_DESC textDesc;
 		TEXT_SPRITE_DESC textDesc;
@@ -115,6 +114,13 @@ namespace BansheeEngine
 		textDesc.vertAlign = mStyle->textVertAlign;
 		textDesc.vertAlign = mStyle->textVertAlign;
 
 
 		mTextSprite->update(textDesc);
 		mTextSprite->update(textDesc);
+
+		GUIElement::updateRenderElementsInternal();
+	}
+
+	void GUIToggle::updateBounds()
+	{
+		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 	}
 	}
 
 
 	UINT32 GUIToggle::_getOptimalWidth() const
 	UINT32 GUIToggle::_getOptimalWidth() const

+ 5 - 0
BansheeEngine/Source/BsGUIWindowFrame.cpp

@@ -164,6 +164,11 @@ namespace BansheeEngine
 		mDesc.height = mHeight;
 		mDesc.height = mHeight;
 
 
 		mImageSprite->update(mDesc);
 		mImageSprite->update(mDesc);
+		GUIElement::updateRenderElementsInternal();
+	}
+
+	void GUIWindowFrame::updateBounds()
+	{
 		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 	}
 	}
 
 

+ 6 - 0
BansheeEngine/Source/BsGUIWindowMover.cpp

@@ -84,6 +84,12 @@ namespace BansheeEngine
 		mDesc.height = mHeight;
 		mDesc.height = mHeight;
 
 
 		mImageSprite->update(mDesc);
 		mImageSprite->update(mDesc);
+		
+		GUIElement::updateRenderElementsInternal();
+	}
+
+	void GUIWindowMover::updateBounds()
+	{
 		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 		mBounds = mImageSprite->getBounds(mOffset, mClipRect);
 	}
 	}
 
 

+ 8 - 0
BansheeEngine/Source/BsSprite.cpp

@@ -207,16 +207,24 @@ namespace BansheeEngine
 		Vector2 max;
 		Vector2 max;
 
 
 		// Find starting point
 		// Find starting point
+		bool foundStartingPoint = false;
 		for(auto& renderElem : mCachedRenderElements)
 		for(auto& renderElem : mCachedRenderElements)
 		{
 		{
 			if(renderElem.vertices != nullptr && renderElem.numQuads > 0)
 			if(renderElem.vertices != nullptr && renderElem.numQuads > 0)
 			{
 			{
 				min = renderElem.vertices[0];
 				min = renderElem.vertices[0];
 				max = renderElem.vertices[0];
 				max = renderElem.vertices[0];
+				foundStartingPoint = true;
 				break;
 				break;
 			}
 			}
 		}
 		}
 
 
+		if(!foundStartingPoint)
+		{
+			mBounds = Rect(0, 0, 0, 0);
+			return;
+		}
+
 		// Calculate bounds
 		// Calculate bounds
 		for(auto& renderElem : mCachedRenderElements)
 		for(auto& renderElem : mCachedRenderElements)
 		{
 		{

+ 0 - 2
TODO.txt

@@ -30,8 +30,6 @@ IMMEDIATE:
     - Make sure GUI system uses a dummy texture if one isn't available
     - Make sure GUI system uses a dummy texture if one isn't available
 	- SpriteTexture keeps a static reference to DUmmyTexture which I need to release before shutdown
 	- SpriteTexture keeps a static reference to DUmmyTexture which I need to release before shutdown
 
 
-- Seems the mouse-over bounds aren't right on the Tab button (I can't select it if I mouse over the bottom part)
-- When clipping scrolled GUIButton the text doesn't seem to get clipped properly
 - Test if horizontal + vert scroll works together
 - Test if horizontal + vert scroll works together
 - After resize scroll bar buttons don't work
 - After resize scroll bar buttons don't work
 - Scroll bar doesn't update its hover state properly (or its perpetually in hover state).
 - Scroll bar doesn't update its hover state properly (or its perpetually in hover state).