ソースを参照

GUI widgets will now properly update if their render target changes
Added missing depth parameter to C# GUI widget

BearishSun 10 年 前
コミット
12f716afd9

+ 5 - 0
BansheeEngine/Source/BsCGUIWidget.cpp

@@ -93,6 +93,11 @@ namespace BansheeEngine
 			mInternal->_updateTransform(parent);
 			mParentHash = curHash;
 		}
+
+		if (parent->getActive() != mInternal->getIsActive())
+			mInternal->setIsActive(parent->getActive());
+
+		mInternal->_updateRT();
 	}
 
 	void CGUIWidget::onDestroyed()

+ 35 - 4
BansheeEngine/Source/BsGUIWidget.cpp

@@ -14,22 +14,30 @@ namespace BansheeEngine
 {
 	GUIWidget::GUIWidget(const CameraPtr& camera)
 		:mWidgetIsDirty(false), mCamera(camera), mDepth(0), mPanel(nullptr), mIsActive(true), 
-		mTransform(Matrix4::IDENTITY)
+		mTransform(Matrix4::IDENTITY), mCachedRTId(0)
 	{
 		construct(camera);
 	}
 
 	GUIWidget::GUIWidget(const HCamera& camera)
 		:mWidgetIsDirty(false), mCamera(camera->_getCamera()), mDepth(0), mPanel(nullptr), 
-		mIsActive(true), mTransform(Matrix4::IDENTITY)
+		mIsActive(true), mTransform(Matrix4::IDENTITY), mCachedRTId(0)
 	{
 		construct(mCamera);
 	}
 
 	void GUIWidget::construct(const CameraPtr& camera)
 	{
-		if(mCamera != nullptr)
-			mOwnerTargetResizedConn = mCamera->getViewport()->getTarget()->onResized.connect(std::bind(&GUIWidget::ownerTargetResized, this));
+		if (mCamera != nullptr)
+		{
+			RenderTargetPtr target = mCamera->getViewport()->getTarget();
+
+			if (target != nullptr)
+			{
+				mOwnerTargetResizedConn = target->onResized.connect(std::bind(&GUIWidget::ownerTargetResized, this));
+				mCachedRTId = target->getInternalID();
+			}
+		}
 
 		GUIManager::instance().registerWidget(this);
 
@@ -130,6 +138,29 @@ namespace BansheeEngine
 		mTransform = parent->getWorldTfrm();
 	}
 
+	void GUIWidget::_updateRT()
+	{
+		RenderTargetPtr rt;
+		UINT64 newRTId = 0;
+		if(mCamera != nullptr)
+		{
+			rt = mCamera->getViewport()->getTarget();
+			if (rt != nullptr)
+				newRTId = rt->getInternalID();
+		}
+
+		if(mCachedRTId != newRTId)
+		{
+			mCachedRTId = newRTId;
+
+			mOwnerTargetResizedConn.disconnect();
+			if(rt != nullptr)
+				mOwnerTargetResizedConn = rt->onResized.connect(std::bind(&GUIWidget::ownerTargetResized, this));
+
+			updateRootPanel();
+		}
+	}
+
 	void GUIWidget::_updateLayout()
 	{
 		bs_frame_mark();

+ 13 - 3
MBansheeEngine/GUI/GUIWidget.cs

@@ -14,7 +14,7 @@
         /// <summary>
         /// Skin used for rendering all the GUI elements belonging to this widget.
         /// </summary>
-        internal GUISkin Skin
+        public GUISkin Skin
         {
             get { return serializableData.skin; }
             set
@@ -28,7 +28,7 @@
         /// Determines to which camera are the GUI elements belonong to this widget rendered. If null then they will be
         /// rendered on the main camera.
         /// </summary>
-        internal Camera Camera
+        public Camera Camera
         {
             get { return serializableData.camera; }
             set
@@ -41,11 +41,21 @@
         /// <summary>
         /// Container into which all GUI elements belonging to this widget should be placed.
         /// </summary>
-        internal GUIPanel Panel
+        public GUIPanel Panel
         {
             get { return nativeGUIWidget.Panel; }
         }
 
+        /// <summary>
+        /// Depth that determines in which order are GUI widgets rendered. Widgets with lower depth are rendered in front
+        /// of widgets with higher depth.
+        /// </summary>
+        public short Depth
+        {
+            set { nativeGUIWidget.Depth = value; }
+            get { return nativeGUIWidget.Depth; }
+        }
+
         private void OnReset()
         {
             if (nativeGUIWidget != null)

+ 16 - 0
MBansheeEngine/NativeGUIWidget.cs

@@ -42,6 +42,16 @@ namespace BansheeEngine
             }
         }
 
+        /// <summary>
+        /// Depth that determines in which order are GUI widgets rendered. Widgets with lower depth are rendered in front
+        /// of widgets with higher depth.
+        /// </summary>
+        internal short Depth
+        {
+            set { Internal_SetDepth(mCachedPtr, value); }
+            get { return Internal_GetDepth(mCachedPtr); }
+        }
+
         /// <summary>
         /// Container into which all GUI elements belonging to this widget should be placed.
         /// </summary>
@@ -105,6 +115,12 @@ namespace BansheeEngine
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_SetCamera(IntPtr instance, IntPtr camera);
 
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern void Internal_SetDepth(IntPtr instance, short value);
+
+        [MethodImpl(MethodImplOptions.InternalCall)]
+        private static extern short Internal_GetDepth(IntPtr instance);
+
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_Destroy(IntPtr instance);
     }

+ 2 - 0
SBansheeEngine/Include/BsScriptGUIWidget.h

@@ -38,6 +38,8 @@ namespace BansheeEngine
 		static void internal_UpdateMainCamera(ScriptGUIWidget* instance, ScriptCamera* camera);
 		static void internal_SetSkin(ScriptGUIWidget* instance, ScriptGUISkin* skin);
 		static void internal_SetCamera(ScriptGUIWidget* instance, ScriptCamera* camera);
+		static void internal_SetDepth(ScriptGUIWidget* instance, INT8 value);
+		static INT8 internal_GetDepth(ScriptGUIWidget* instance);
 		static void internal_Destroy(ScriptGUIWidget* instance);
 	};
 }

+ 2 - 0
SBansheeEngine/Source/BsScriptGUI.cpp

@@ -60,6 +60,8 @@ namespace BansheeEngine
 		CameraPtr mainCamera = gSceneManager().getMainCamera().camera;
 		if (mainCamera != sGUIWidget->getCamera())
 			sGUIWidget->setCamera(mainCamera);
+
+		sGUIWidget->_updateRT();
 	}
 
 	void ScriptGUI::shutDown()

+ 13 - 0
SBansheeEngine/Source/BsScriptGUIWidget.cpp

@@ -38,6 +38,8 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_UpdateMainCamera", &ScriptGUIWidget::internal_UpdateMainCamera);
 		metaData.scriptClass->addInternalCall("Internal_SetSkin", &ScriptGUIWidget::internal_SetSkin);
 		metaData.scriptClass->addInternalCall("Internal_SetCamera", &ScriptGUIWidget::internal_SetCamera);
+		metaData.scriptClass->addInternalCall("Internal_SetDepth", &ScriptGUIWidget::internal_SetDepth);
+		metaData.scriptClass->addInternalCall("Internal_GetDepth", &ScriptGUIWidget::internal_GetDepth);
 		metaData.scriptClass->addInternalCall("Internal_Destroy", &ScriptGUIWidget::internal_Destroy);
 	}
 
@@ -54,6 +56,7 @@ namespace BansheeEngine
 		if (!parentSO.isDestroyed() && widget != nullptr)
 		{
 			widget->_updateTransform(parentSO);
+			widget->_updateRT();
 
 			if (parentSO->getActive() != widget->getIsActive())
 				widget->setIsActive(parentSO->getActive());
@@ -102,6 +105,16 @@ namespace BansheeEngine
 			widget->setCamera(nativeCamera);
 	}
 
+	void ScriptGUIWidget::internal_SetDepth(ScriptGUIWidget* instance, INT8 value)
+	{
+		instance->getInternal()->setDepth(value);
+	}
+
+	INT8 ScriptGUIWidget::internal_GetDepth(ScriptGUIWidget* instance)
+	{
+		return instance->getInternal()->getDepth();
+	}
+
 	void ScriptGUIWidget::internal_Destroy(ScriptGUIWidget* instance)
 	{
 		instance->destroy();