Browse Source

Fixed an issue with value changed callback not triggering in GUISliderField
Fixed an issue where modifying a value in a filtered input-box would not properly delete the old value
Fixed a race condition in core thread startup
Fixed an issue with core object sync where dependant objects were not synced properly
Fixed an issue in renderer where camera with no render target would get items for rendering queued up which were never processed
Main camera state is properly serialized in managed code
Serialized light state is properly restored in managed code
Fixed an issue where many common managed types would not have their private data serialized

BearishSun 10 years ago
parent
commit
3c513f46dc

+ 1 - 0
BansheeCore/Include/BsCoreThread.h

@@ -129,6 +129,7 @@ private:
 	volatile bool mCoreThreadShutdown;
 
 	HThread mCoreThread;
+	bool mCoreThreadStarted;
 	BS_THREAD_ID_TYPE mSimThreadId;
 	BS_THREAD_ID_TYPE mCoreThreadId;
 	BS_MUTEX(mCommandQueueMutex)

+ 9 - 0
BansheeCore/Include/BsResourceHandle.h

@@ -204,6 +204,15 @@ namespace BansheeEngine
 			return *this;
 		}
 
+		/**
+		 * @brief	Normal assignment operator.
+		 */
+		TResourceHandle<T, WeakHandle>& operator=(const TResourceHandle<T, WeakHandle>& rhs)
+		{ 	
+			setHandleData(rhs.getHandleData());
+			return *this;
+		}
+
 		template<class _Ty>
 		struct Bool_struct
 		{

+ 3 - 0
BansheeCore/Source/BsCoreObjectManager.cpp

@@ -304,7 +304,10 @@ namespace BansheeEngine
 					for (auto& dependant : dependants)
 					{
 						if (!dependant->isCoreDirty())
+						{
+							dependant->mCoreDirtyFlags |= 0xFFFFFFFF; // To ensure the loop below doesn't skip it
 							dirtyDependants.insert(dependant);
+						}
 					}
 				}
 			}

+ 12 - 3
BansheeCore/Source/BsCoreThread.cpp

@@ -17,6 +17,7 @@ namespace BansheeEngine
 		, mMaxCommandNotifyId(0)
 		, mSyncedCoreAccessor(nullptr)
 		, mActiveFrameAlloc(0)
+		, mCoreThreadStarted(false)
 	{
 		for (UINT32 i = 0; i < NUM_FRAME_ALLOCS; i++)
 		{
@@ -68,7 +69,9 @@ namespace BansheeEngine
 		
 		// Need to wait to unsure thread ID is correctly set before continuing
 		BS_LOCK_MUTEX_NAMED(mThreadStartedMutex, lock)
-		BS_THREAD_WAIT(mCoreThreadStartedCondition, mThreadStartedMutex, lock)
+
+		while(!mCoreThreadStarted)
+			BS_THREAD_WAIT(mCoreThreadStartedCondition, mThreadStartedMutex, lock)
 #else
 		BS_EXCEPT(InternalErrorException, "Attempting to start a core thread but application isn't compiled with thread support.");
 #endif
@@ -80,8 +83,14 @@ namespace BansheeEngine
 #if !BS_FORCE_SINGLETHREADED_RENDERING
 		TaskScheduler::instance().removeWorker(); // One less worker because we are reserving one core for this thread
 
-		mCoreThreadId = BS_THREAD_CURRENT_ID;
-		mSyncedCoreAccessor = bs_new<CoreThreadAccessor<CommandQueueSync>>(BS_THREAD_CURRENT_ID);
+		{
+			BS_LOCK_MUTEX(mThreadStartedMutex);
+
+			mCoreThreadStarted = true;
+			mCoreThreadId = BS_THREAD_CURRENT_ID;
+			mSyncedCoreAccessor = bs_new<CoreThreadAccessor<CommandQueueSync>>(BS_THREAD_CURRENT_ID);
+		}
+
 		BS_THREAD_NOTIFY_ONE(mCoreThreadStartedCondition);
 
 		while(true)

+ 8 - 2
BansheeCore/Source/BsViewport.cpp

@@ -98,12 +98,18 @@ namespace BansheeEngine
 
 	UINT32 ViewportCore::getTargetWidth() const
 	{
-		return mTarget->getProperties().getWidth();
+		if (mTarget != nullptr)
+			return mTarget->getProperties().getWidth();
+
+		return 0;
 	}
 
 	UINT32 ViewportCore::getTargetHeight() const
 	{
-		return mTarget->getProperties().getHeight();
+		if (mTarget != nullptr)
+			return mTarget->getProperties().getHeight();
+
+		return 0;
 	}
 
 	void ViewportCore::syncToCore(const CoreSyncData& data)

+ 5 - 0
BansheeEditor/Include/BsGUISliderField.h

@@ -62,6 +62,11 @@ namespace BansheeEngine
 	protected:
 		virtual ~GUISliderField();
 
+		/**
+		 * @brief	Sets a new value in the input field/slider without setting off an event.
+		 */
+		void setValueInternal(float value);
+
 		/**
 		 * @copydoc	GUIElementContainer::styleUpdated
 		 */

+ 8 - 3
BansheeEditor/Source/BsGUISliderField.cpp

@@ -33,7 +33,7 @@ namespace BansheeEngine
 		mLayout->addNewElement<GUIFixedSpace>(5);
 		mLayout->addElement(mInputBox);
 
-		setValue(0);
+		setValueInternal(0);
 		mInputBox->setText(L"0");
 	}
 
@@ -48,6 +48,13 @@ namespace BansheeEngine
 	}
 
 	void GUISliderField::setValue(float value)
+	{
+		setValueInternal(value);
+
+		onValueChanged(value);
+	}
+
+	void GUISliderField::setValueInternal(float value)
 	{
 		float origValue = mSlider->getValue();
 		if (origValue != value)
@@ -118,8 +125,6 @@ namespace BansheeEngine
 	void GUISliderField::sliderChanged(float newValue)
 	{
 		setValue(mSlider->getValue());
-
-		onValueChanged(mSlider->getValue());
 	}
 
 	bool GUISliderField::floatFilter(const WString& str)

+ 4 - 1
BansheeEngine/Include/BsGUIInputBox.h

@@ -226,8 +226,11 @@ namespace BansheeEngine
 
 		/**
 		 * @brief	Deletes text that is currently selected.
+		 * 			
+		 * @param	internal	If internal not filter will be applied after the text is deleted, and no event will be 
+		 * 						triggered either.
 		 */
-		void deleteSelectedText();
+		void deleteSelectedText(bool internal = false);
 
 		/**
 		 * @brief	Returns currently selected text.

+ 4 - 4
BansheeEngine/Source/BsGUIInputBox.cpp

@@ -544,7 +544,7 @@ namespace BansheeEngine
 		Vector2I origSize = mDimensions.calculateSizeRange(_getOptimalSize()).optimal;
 
 		if(mSelectionShown)
-			deleteSelectedText();
+			deleteSelectedText(true);
 
 		UINT32 charIdx = gGUIManager().getInputCaretTool()->getCharIdxAtCaretPos();
 
@@ -1070,13 +1070,13 @@ namespace BansheeEngine
 		gGUIManager().getInputSelectionTool()->updateText(this, textDesc);
 	}
 
-	void GUIInputBox::deleteSelectedText()
+	void GUIInputBox::deleteSelectedText(bool internal)
 	{
 		UINT32 selStart = gGUIManager().getInputSelectionTool()->getSelectionStart();
 		UINT32 selEnd = gGUIManager().getInputSelectionTool()->getSelectionEnd();
 
 		bool filterOkay = true;
-		if(mFilter != nullptr)
+		if (!internal && mFilter != nullptr)
 		{
 			WString newText = mText;
 			newText.erase(newText.begin() + selStart, newText.begin() + selEnd);
@@ -1108,7 +1108,7 @@ namespace BansheeEngine
 
 			scrollTextToCaret();
 
-			if(!onValueChanged.empty())
+			if (!internal)
 				onValueChanged(mText);
 		}
 

+ 7 - 0
BansheeEngine/Source/BsProfilerOverlay.cpp

@@ -17,6 +17,8 @@
 #include "BsCamera.h"
 #include <BsHEString.h>
 
+#define BS_SHOW_PRECISE_PROFILING 0
+
 namespace BansheeEngine
 {
 	class BasicRowFiller
@@ -417,6 +419,11 @@ namespace BansheeEngine
 		mBasicLayoutContents->addNewElement<GUIFlexibleSpace>();
 		mPreciseLayoutContents->addNewElement<GUIFlexibleSpace>();
 
+#if BS_SHOW_PRECISE_PROFILING == 0
+		mPreciseLayoutLabels->setActive(false);
+		mPreciseLayoutContents->setActive(false);
+#endif
+
 		// Set up GPU sample areas
 		mGPULayoutFrameContents = mWidget->getPanel()->addNewElement<GUILayoutX>();
 		mGPULayoutFrameContentsLeft = mGPULayoutFrameContents->addNewElement<GUILayoutY>();

+ 0 - 5
BansheeEngine/Source/BsRenderQueue.cpp

@@ -83,11 +83,6 @@ namespace BansheeEngine
 			break;
 		}
 
-		if (mSortableElementIdx.size() > 1)
-		{
-			int a = 5;
-		}
-
 		// Sort only indices since we generate an entirely new data set anyway, it doesn't make sense to move sortable elements
 		std::sort(mSortableElementIdx.begin(), mSortableElementIdx.end(), std::bind(sortMethod, _1, _2, mSortableElements));
 

+ 14 - 2
MBansheeEditor/EditorApplication.cs

@@ -97,7 +97,12 @@ namespace BansheeEditor
         public static bool IsPlaying
         {
             get { return Internal_GetIsPlaying(); }
-            set { Internal_SetIsPlaying(value); }
+            set
+            {
+                ToggleToolbarItem("Play", value);
+                ToggleToolbarItem("Pause", false);
+                Internal_SetIsPlaying(value);
+            }
         }
 
         /// <summary>
@@ -108,7 +113,12 @@ namespace BansheeEditor
         public static bool IsPaused
         {
             get { return Internal_GetIsPaused(); }
-            set { Internal_SetIsPaused(value); }
+            set
+            {
+                ToggleToolbarItem("Play", !value);
+                ToggleToolbarItem("Pause", value);
+                Internal_SetIsPaused(value);
+            }
         }
 
         /// <summary>
@@ -637,6 +647,8 @@ namespace BansheeEditor
         /// </summary>
         public static void FrameStep()
         {
+            ToggleToolbarItem("Play", false);
+            ToggleToolbarItem("Pause", true);
             Internal_FrameStep();
         }
 

+ 3 - 1
MBansheeEngine/Camera.cs

@@ -229,7 +229,7 @@ namespace BansheeEngine
         public bool Main
         {
             get { return native.main; }
-            set { native.main = value; }
+            set { native.main = value; serializableData.main = value; }
         }
 
         /// <summary>
@@ -372,6 +372,7 @@ namespace BansheeEngine
             native.clearFlags = serializableData.clearFlags;
             native.priority = serializableData.priority;
             native.layers = serializableData.layers;
+            native.main = serializableData.main;
 
             // TODO - Make RenderTexture a resource so I can save/restore it?
         }
@@ -405,6 +406,7 @@ namespace BansheeEngine
             public ClearFlags clearFlags = ClearFlags.Color | ClearFlags.Depth | ClearFlags.Stencil;
             public int priority;
             public UInt64 layers = 0xFFFFFFFFFFFFFFFF;
+            public bool main;
         }
     }
 }

+ 9 - 20
MBansheeEngine/Light.cs

@@ -97,17 +97,6 @@ namespace BansheeEngine
             get { Native.UpdateTransform(SceneObject); return Native.Bounds; }
         }
 
-        private void OnInitialize()
-        {
-            serializableData.color = Color.White;
-            serializableData.spotAngle = new Degree(45);
-            serializableData.spotFalloffAngle = new Degree(40);
-            serializableData.range = 10.0f;
-            serializableData.intensity = 100.0f;
-            serializableData.type = LightType.Point;
-            serializableData.castShadows = false;
-        }
-
         private void OnReset()
         {
             if (_nativeLight != null)
@@ -127,7 +116,7 @@ namespace BansheeEngine
 
         private void OnUpdate()
         {
-            
+            _nativeLight.UpdateTransform(SceneObject);
         }
 
         private void OnDestroy()
@@ -139,15 +128,15 @@ namespace BansheeEngine
         /// Holds all data the light component needs to persist through serialization.
         /// </summary>
         [SerializeObject]
-        private struct SerializableData
+        private class SerializableData
         {
-            public Color color;
-            public Degree spotAngle;
-            public Degree spotFalloffAngle;
-            public float range;
-            public float intensity;
-            public LightType type;
-            public bool castShadows;
+            public Color color = Color.White;
+            public Degree spotAngle = new Degree(45);
+            public Degree spotFalloffAngle = new Degree(40);
+            public float range = 10.0f;
+            public float intensity = 100.0f;
+            public LightType type = LightType.Point;
+            public bool castShadows = false;
         }
     }
 }

+ 3 - 0
MBansheeEngine/Math/AABox.cs

@@ -8,7 +8,10 @@ namespace BansheeEngine
     [StructLayout(LayoutKind.Sequential), SerializeObject]
 	public struct AABox // Note: Must match C++ class AABox
 	{
+        [SerializeField]
         private Vector3 _minimum;
+
+        [SerializeField]
 		private Vector3 _maximum;
 
         /// <summary>

+ 5 - 0
MBansheeEngine/Math/BsRect3.cs

@@ -74,10 +74,15 @@ namespace BansheeEngine
             set { _extentVert = value; }
         }
 
+        [SerializeField]
 		private Vector3 _center;
+        [SerializeField]
         private Vector3 _axisHorz;
+        [SerializeField]
         private Vector3 _axisVert;
+        [SerializeField]
         private float _extentHorz;
+        [SerializeField]
         private float _extentVert;
 	};
 }

+ 1 - 0
MBansheeEngine/Math/Degree.cs

@@ -13,6 +13,7 @@ namespace BansheeEngine
     [StructLayout(LayoutKind.Sequential), SerializeObject]
 	public struct Degree // Note: Must match C++ class Degree
 	{
+        [SerializeField]
         readonly float value;
 
         /// <summary>

+ 1 - 0
MBansheeEngine/Math/Radian.cs

@@ -13,6 +13,7 @@ namespace BansheeEngine
     [StructLayout(LayoutKind.Sequential), SerializeObject]
     public struct Radian // Note: Must match C++ class Radian
     {
+        [SerializeField]
 		readonly float value;
 
         /// <summary>

+ 2 - 2
MBansheeEngine/Math/Rect2.cs

@@ -12,6 +12,8 @@ namespace BansheeEngine
     [StructLayout(LayoutKind.Sequential), SerializeObject]
     public struct Rect2 // Note: Must match C++ struct Rect2
     {
+        public float x, y, width, height;
+
         /// <summary>
         /// Creates a new 2D rectangle.
         /// </summary>
@@ -61,7 +63,5 @@ namespace BansheeEngine
         {
             return String.Format("(x:{0} y:{1} width:{2} height:{3})", x, y, width, height);
         }
-
-        public float x, y, width, height;
     }
 }

+ 2 - 2
MBansheeEngine/Math/Rect2I.cs

@@ -13,6 +13,8 @@ namespace BansheeEngine
     [StructLayout(LayoutKind.Sequential), SerializeObject]
     public struct Rect2I
     {
+        public int x, y, width, height;
+
         /// <summary>
         /// Creates a new 2D rectangle.
         /// </summary>
@@ -118,7 +120,5 @@ namespace BansheeEngine
         {
             return String.Format("(x:{0} y:{1} width:{2} height:{3})", x, y, width, height);
         }
-
-        public int x, y, width, height;
     }
 }

+ 3 - 0
MBansheeEngine/Sphere.cs

@@ -8,7 +8,10 @@ namespace BansheeEngine
     [StructLayout(LayoutKind.Sequential), SerializeObject]
     public struct Sphere // Note: Must match C++ enum Sphere
     {
+        [SerializeField]
         private float _radius;
+
+        [SerializeField]
         private Vector3 _center;
         
         /// <summary>

+ 12 - 4
RenderBeast/Source/BsRenderBeast.cpp

@@ -342,6 +342,10 @@ namespace BansheeEngine
 
 	void RenderBeast::_notifyCameraAdded(const CameraCore* camera)
 	{
+		SPtr<RenderTargetCore> renderTarget = camera->getViewport()->getTarget();
+		if (renderTarget == nullptr)
+			return;
+
 		CameraData& camData = mCameraData[camera];
 		camData.opaqueQueue = bs_shared_ptr_new<RenderQueue>(mCoreOptions->stateReductionMode);
 
@@ -352,10 +356,6 @@ namespace BansheeEngine
 		camData.transparentQueue = bs_shared_ptr_new<RenderQueue>(transparentStateReduction);
 
 		// Register in render target list
-		SPtr<RenderTargetCore> renderTarget = camera->getViewport()->getTarget();
-		if (renderTarget == nullptr)
-			return;
-
 		auto findIter = std::find_if(mRenderTargets.begin(), mRenderTargets.end(), 
 			[&](const RenderTargetData& x) { return x.target == renderTarget; });
 
@@ -463,6 +463,8 @@ namespace BansheeEngine
 	{
 		THROW_IF_NOT_CORE_THREAD;
 
+		gProfilerCPU().beginSample("renderAllCore");
+
 		// Note: I'm iterating over all sampler states every frame. If this ends up being a performance
 		// issue consider handling this internally in MaterialCore which can only do it when sampler states
 		// are actually modified after sync
@@ -493,10 +495,14 @@ namespace BansheeEngine
 			RenderAPICore::instance().endFrame();
 			RenderAPICore::instance().swapBuffers(target);
 		}
+
+		gProfilerCPU().endSample("renderAllCore");
 	}
 
 	void RenderBeast::render(RenderTargetData& rtData, UINT32 camIdx)
 	{
+		gProfilerCPU().beginSample("Render");
+
 		const CameraCore* camera = rtData.cameras[camIdx];
 		CameraData& camData = mCameraData[camera];
 
@@ -684,6 +690,8 @@ namespace BansheeEngine
 				callbackPair.second();
 			}
 		}
+
+		gProfilerCPU().endSample("Render");
 	}
 	
 	void RenderBeast::determineVisible(const CameraCore& camera)