Explorar o código

Modified profiler overlay so it doesn't render under the geometry
Camera layers are now properly used
GUIWidget now has proper RTTI data

Marko Pintera %!s(int64=10) %!d(string=hai) anos
pai
achega
4704613fa4

+ 3 - 1
BansheeCore/Include/BsCorePrerequisites.h

@@ -340,7 +340,9 @@ namespace BansheeEngine
 		TID_Prefab = 1077,
 		TID_PrefabDiff = 1078,
 		TID_PrefabObjectDiff = 1079,
-		TID_PrefabComponentDiff = 1080
+		TID_PrefabComponentDiff = 1080,
+		TID_GUIWidget = 1081,
+		TID_ProfilerOverlay = 1082
 	};
 }
 

+ 5 - 0
BansheeEditor/Include/BsEditorWindowBase.h

@@ -76,6 +76,11 @@ namespace BansheeEngine
 		 */
 		HGUIWidget getGUIWidget() const { return mGUI; }
 
+		/**
+		 * @brief	Returns the camera used for rendering the window GUI contents.
+		 */	
+		HCamera getGUICamera() const { return mCamera; }
+
 	protected:
 		EditorWindowBase(bool isModal = false);
 		EditorWindowBase(const RenderWindowPtr& renderWindow);

+ 4 - 1
BansheeEditor/Source/BsEditorWidget.cpp

@@ -27,7 +27,10 @@ namespace BansheeEngine
 
 	EditorWindowBase* EditorWidgetBase::getParentWindow() const
 	{
-		return mParent->getParentWindow();
+		if (mParent != nullptr)
+			return mParent->getParentWindow();
+		else
+			return nullptr;
 	}
 
 	void EditorWidgetBase::close()

+ 1 - 1
BansheeEditor/Source/BsEditorWindowBase.cpp

@@ -68,7 +68,7 @@ namespace BansheeEngine
 		mCamera = mSceneObject->addComponent<Camera>(renderWindow, 0.0f, 0.0f, 1.0f, 1.0f);
 		mCamera->setNearClipDistance(5);
 		mCamera->setAspectRatio(1.0f);
-		mCamera->setIgnoreSceneRenderables(true);
+		mCamera->setLayers(0);
 
 		mGUI = mSceneObject->addComponent<GUIWidget>(mCamera->getViewport().get());
 		mGUI->setDepth(128);

+ 2 - 0
BansheeEngine/BansheeEngine.vcxproj

@@ -272,6 +272,7 @@
     <ClInclude Include="Include\BsGUIProgressBar.h" />
     <ClInclude Include="Include\BsGUISkinRTTI.h" />
     <ClInclude Include="Include\BsGUISlider.h" />
+    <ClInclude Include="Include\BsGUIWidgetRTTI.h" />
     <ClInclude Include="Include\BsLight.h" />
     <ClInclude Include="Include\BsLightInternal.h" />
     <ClInclude Include="Include\BsLightInternalRTTI.h" />
@@ -363,6 +364,7 @@
     <ClCompile Include="Source\BsGUIButtonBase.cpp" />
     <ClCompile Include="Source\BsGUIContextMenu.cpp" />
     <ClInclude Include="Include\BsVirtualInput.h" />
+    <ClInclude Include="Include\BsProfilerOverlayRTTI.h" />
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsApplication.cpp" />

+ 6 - 0
BansheeEngine/BansheeEngine.vcxproj.filters

@@ -347,6 +347,12 @@
     <ClInclude Include="Include\BsLightRTTI.h">
       <Filter>Header Files\RTTI</Filter>
     </ClInclude>
+    <ClInclude Include="Include\BsGUIWidgetRTTI.h">
+      <Filter>Header Files\RTTI</Filter>
+    </ClInclude>
+    <ClInclude Include="Include\BsProfilerOverlayRTTI.h">
+      <Filter>Header Files\RTTI</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsGUIElement.cpp">

+ 0 - 10
BansheeEngine/Include/BsCamera.h

@@ -175,16 +175,6 @@ namespace BansheeEngine
 		 */
 		virtual float getOrthoWindowWidth() const { return mInternal->getOrthoWindowWidth(); }
 
-		/**
-		 * @copydoc	CameraHandler::setIgnoreSceneRenderables
-		 */
-		void setIgnoreSceneRenderables(bool value) { mInternal->setIgnoreSceneRenderables(value); }
-
-		/**
-		 * @copydoc	CameraHandler::getIgnoreSceneRenderables
-		 */
-		bool getIgnoreSceneRenderables() const { return mInternal->getIgnoreSceneRenderables(); }
-
 		/**
 		 * @copydoc	CameraHandler::getPriority
 		 */

+ 0 - 11
BansheeEngine/Include/BsCameraHandler.h

@@ -287,16 +287,6 @@ namespace BansheeEngine
 		 */
 		virtual float getOrthoWindowWidth() const;
 
-		/**
-		 * @brief	This option tells the renderer that this camera should ignore any renderable components.
-		 */
-		void setIgnoreSceneRenderables(bool value) { mIgnoreSceneRenderables = true; _markCoreDirty(); }
-
-		/**
-		 * @brief	This option tells the renderer that this camera should ignore any renderable components.
-		 */
-		bool getIgnoreSceneRenderables() const { return mIgnoreSceneRenderables; }
-
 		/**
 		 * @brief	Gets a priority that determines in which orders the cameras are rendered.
 		 *			This only applies to cameras rendering to the same render target. 
@@ -500,7 +490,6 @@ namespace BansheeEngine
 		bool mCustomProjMatrix; /**< Is custom projection matrix set. */
 
 		bool mFrustumExtentsManuallySet; /**< Are frustum extents manually set. */
-		bool mIgnoreSceneRenderables; /**< Should the camera ignore renderable components. */
 
 		mutable Matrix4 mProjMatrixRS; /**< Cached render-system specific projection matrix. */
 		mutable Matrix4 mProjMatrix; /**< Cached projection matrix that determines how are 3D points projected to a 2D viewport. */

+ 4 - 8
BansheeEngine/Include/BsCameraHandlerRTTI.h

@@ -51,9 +51,6 @@ namespace BansheeEngine
 		bool& getFrustumManual(CameraHandler* obj) { return obj->mFrustumExtentsManuallySet; }
 		void setFrustumManual(CameraHandler* obj, bool& val) { obj->mFrustumExtentsManuallySet = val; }
 
-		bool& getIgnoreSceneRenderables(CameraHandler* obj) { return obj->mIgnoreSceneRenderables; }
-		void setIgnoreSceneRenderables(CameraHandler* obj, bool& val) { obj->mIgnoreSceneRenderables = val; }
-
 		Matrix4& getProjMatrix(CameraHandler* obj) { return obj->mProjMatrix; }
 		void setProjMatrix(CameraHandler* obj, Matrix4& val) { obj->mProjMatrix = val; }
 
@@ -92,7 +89,6 @@ namespace BansheeEngine
 			addPlainField("mCustomViewMatrix", 11, &CameraHandlerRTTI::getCustomViewMatrix, &CameraHandlerRTTI::setCustomViewMatrix);
 			addPlainField("mCustomProjMatrix", 12, &CameraHandlerRTTI::getCustomProjMatrix, &CameraHandlerRTTI::setCustomProjMatrix);
 			addPlainField("mFrustumExtentsManuallySet", 13, &CameraHandlerRTTI::getFrustumManual, &CameraHandlerRTTI::setFrustumManual);
-			addPlainField("mIgnoreSceneRenderables", 14, &CameraHandlerRTTI::getIgnoreSceneRenderables, &CameraHandlerRTTI::setIgnoreSceneRenderables);
 			addPlainField("mProjMatrixRS", 15, &CameraHandlerRTTI::getProjMatrixRS, &CameraHandlerRTTI::setProjMatrixRS);
 			addPlainField("mProjMatrix", 16, &CameraHandlerRTTI::getProjMatrix, &CameraHandlerRTTI::setProjMatrix);
 			addPlainField("mViewMatrix", 17, &CameraHandlerRTTI::getViewMatrix, &CameraHandlerRTTI::setViewMatrix);
@@ -102,24 +98,24 @@ namespace BansheeEngine
 			addPlainField("mBottom", 21, &CameraHandlerRTTI::getBottom, &CameraHandlerRTTI::setBottom);
 		}
 
-		virtual void onDeserializationEnded(IReflectable* obj)
+		virtual void onDeserializationEnded(IReflectable* obj) override
 		{
 			CameraHandler* cameraHandler = static_cast<CameraHandler*>(obj);
 			cameraHandler->initialize();
 		}
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 			static String name = "CameraHandler";
 			return name;
 		}
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 			return TID_CameraHandler;
 		}
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 			return CameraHandler::createEmpty();
 		}

+ 12 - 2
BansheeEngine/Include/BsGUIWidget.h

@@ -163,12 +163,12 @@ namespace BansheeEngine
 		/**
 		 * @copydoc	Component::update
 		 */
-		virtual void update();
+		virtual void update() override;
 
 		/**
 		 * @copydoc	Component::onDestroyed
 		 */
-		virtual void onDestroyed();
+		virtual void onDestroyed() override;
 	private:
 		GUIWidget(const GUIWidget& other) { }
 
@@ -201,5 +201,15 @@ namespace BansheeEngine
 		mutable Vector<HMaterial> mCachedMaterials;
 
 		HGUISkin mSkin;
+
+		/************************************************************************/
+		/* 								RTTI		                     		*/
+		/************************************************************************/
+	public:
+		friend class GUIWidgetRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const override;
+
+		GUIWidget() { } // Serialization only
 	};
 }

+ 34 - 0
BansheeEngine/Include/BsGUIWidgetRTTI.h

@@ -0,0 +1,34 @@
+#pragma once
+
+#include "BsCorePrerequisites.h"
+#include "BsRTTIType.h"
+#include "BsGUIWidget.h"
+#include "BsGameObjectRTTI.h"
+
+namespace BansheeEngine
+{
+	class BS_EXPORT GUIWidgetRTTI : public RTTIType <GUIWidget, Component, GUIWidgetRTTI>
+	{
+	private:
+
+	public:
+		GUIWidgetRTTI()
+		{ }
+
+		virtual const String& getRTTIName() override
+		{
+			static String name = "GUIWidget";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId() override
+		{
+			return TID_GUIWidget;
+		}
+
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
+		{
+			return GameObjectRTTI::createGameObject<GUIWidget>();
+		}
+	};
+}

+ 10 - 0
BansheeEngine/Include/BsProfilerOverlay.h

@@ -55,6 +55,16 @@ namespace BansheeEngine
 
 	private:
 		ProfilerOverlayInternal* mInternal;
+
+		/************************************************************************/
+		/* 								RTTI		                     		*/
+		/************************************************************************/
+	public:
+		friend class ProfilerOverlayRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const override;
+
+		ProfilerOverlay() { } // Serialization only
 	};
 
 	/**

+ 34 - 0
BansheeEngine/Include/BsProfilerOverlayRTTI.h

@@ -0,0 +1,34 @@
+#pragma once
+
+#include "BsCorePrerequisites.h"
+#include "BsRTTIType.h"
+#include "BsProfilerOverlay.h"
+#include "BsGameObjectRTTI.h"
+
+namespace BansheeEngine
+{
+	class BS_EXPORT ProfilerOverlayRTTI : public RTTIType <ProfilerOverlay, Component, ProfilerOverlayRTTI>
+	{
+	private:
+
+	public:
+		ProfilerOverlayRTTI()
+		{ }
+
+		virtual const String& getRTTIName() override
+		{
+			static String name = "ProfilerOverlay";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId() override
+		{
+			return TID_ProfilerOverlay;
+		}
+
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
+		{
+			return GameObjectRTTI::createGameObject<ProfilerOverlay>();
+		}
+	};
+}

+ 2 - 5
BansheeEngine/Source/BsCameraHandler.cpp

@@ -20,8 +20,8 @@ namespace BansheeEngine
 	CameraHandlerBase::CameraHandlerBase(RenderTargetPtr target, float left, float top, float width, float height)
 		:mProjType(PT_PERSPECTIVE), mHorzFOV(Radian(Math::PI / 4.0f)), mFarDist(1000.0f),
 		mNearDist(0.05f), mAspect(1.33333333333333f), mOrthoHeight(1000), mRecalcFrustum(true), mRecalcFrustumPlanes(true),
-		mCustomViewMatrix(false), mCustomProjMatrix(false), mFrustumExtentsManuallySet(false), mIgnoreSceneRenderables(false),
-		mPriority(0), mLayers(0xFFFFFFFFFFFFFFFF), mRecalcView(true)
+		mCustomViewMatrix(false), mCustomProjMatrix(false), mFrustumExtentsManuallySet(false), mPriority(0), 
+		mLayers(0xFFFFFFFFFFFFFFFF), mRecalcView(true)
 	{
 		mViewMatrix = Matrix4::ZERO;
 		mProjMatrixRS = Matrix4::ZERO;
@@ -720,7 +720,6 @@ namespace BansheeEngine
 		dataPtr = rttiReadElem(mCustomViewMatrix, dataPtr);
 		dataPtr = rttiReadElem(mCustomProjMatrix, dataPtr);
 		dataPtr = rttiReadElem(mFrustumExtentsManuallySet, dataPtr);
-		dataPtr = rttiReadElem(mIgnoreSceneRenderables, dataPtr);
 
 		mRecalcFrustum = true;
 		mRecalcFrustumPlanes = true;
@@ -794,7 +793,6 @@ namespace BansheeEngine
 		size += rttiGetElemSize(mCustomProjMatrix);
 
 		size += rttiGetElemSize(mFrustumExtentsManuallySet);
-		size += rttiGetElemSize(mIgnoreSceneRenderables);
 
 		UINT8* buffer = allocator->alloc(size);
 
@@ -812,7 +810,6 @@ namespace BansheeEngine
 		dataPtr = rttiWriteElem(mCustomViewMatrix, dataPtr);
 		dataPtr = rttiWriteElem(mCustomProjMatrix, dataPtr);
 		dataPtr = rttiWriteElem(mFrustumExtentsManuallySet, dataPtr);
-		dataPtr = rttiWriteElem(mIgnoreSceneRenderables, dataPtr);
 
 		return CoreSyncData(buffer, size);
 	}

+ 11 - 0
BansheeEngine/Source/BsGUIWidget.cpp

@@ -15,6 +15,7 @@
 #include "BsViewport.h"
 #include "BsSceneObject.h"
 #include "BsRenderWindow.h"
+#include "BsGUIWidgetRTTI.h"
 
 namespace BansheeEngine
 {
@@ -335,4 +336,14 @@ namespace BansheeEngine
 	{
 
 	}
+
+	RTTITypeBase* GUIWidget::getRTTIStatic()
+	{
+		return GUIWidgetRTTI::instance();
+	}
+
+	RTTITypeBase* GUIWidget::getRTTI() const
+	{
+		return GUIWidget::getRTTIStatic();
+	}
 }

+ 11 - 0
BansheeEngine/Source/BsProfilerOverlay.cpp

@@ -13,6 +13,7 @@
 #include "BsBuiltinResources.h"
 #include "BsProfilingManager.h"
 #include "BsRenderTarget.h"
+#include "BsProfilerOverlayRTTI.h"
 
 namespace BansheeEngine
 {
@@ -307,6 +308,16 @@ namespace BansheeEngine
 		mInternal->update();
 	}
 
+	RTTITypeBase* ProfilerOverlay::getRTTIStatic()
+	{
+		return ProfilerOverlayRTTI::instance();
+	}
+
+	RTTITypeBase* ProfilerOverlay::getRTTI() const
+	{
+		return ProfilerOverlay::getRTTIStatic();
+	}
+
 	ProfilerOverlayInternal::ProfilerOverlayInternal(const ViewportPtr& target)
 		:mIsShown(true), mType(ProfilerOverlayType::CPUSamples)
 	{

+ 43 - 42
BansheeRenderer/Source/BsBansheeRenderer.cpp

@@ -269,11 +269,11 @@ namespace BansheeEngine
 			Vector<const CameraHandlerCore*>& cameras = renderTargetData.cameras;
 
 			RenderAPICore::instance().beginFrame();
+			RenderAPICore::instance().setRenderTarget(target);
 
 			for(auto& camera : cameras)
 			{
 				SPtr<ViewportCore> viewport = camera->getViewport();
-				RenderAPICore::instance().setRenderTarget(target);
 				RenderAPICore::instance().setViewport(viewport->getNormArea());
 
 				UINT32 clearBuffers = 0;
@@ -326,60 +326,61 @@ namespace BansheeEngine
 			}
 		}
 
-		if (!camera.getIgnoreSceneRenderables())
+		UINT64 cameraLayers = camera.getLayers();
+		ConvexVolume worldFrustum = camera.getWorldFrustum();
+
+		// Update per-object param buffers and queue render elements
+		for (auto& renderableData : mRenderables)
 		{
-			ConvexVolume worldFrustum = camera.getWorldFrustum();
+			RenderableHandlerCore* renderable = renderableData.renderable;
+			RenderableController* controller = renderableData.controller;
+			UINT32 renderableType = renderable->getRenderableType();
+			UINT32 rendererId = renderable->getRendererId();
+
+			if ((renderable->getLayer() & cameraLayers) == 0)
+				continue;
 
-			// Update per-object param buffers and queue render elements
-			for (auto& renderableData : mRenderables)
+			// Update buffers
+			for (auto& renderElem : renderableData.elements)
 			{
-				RenderableHandlerCore* renderable = renderableData.renderable;
-				RenderableController* controller = renderableData.controller;
-				UINT32 renderableType = renderable->getRenderableType();
-				UINT32 rendererId = renderable->getRendererId();
+				if (controller != nullptr)
+					controller->bindPerObjectBuffers(renderElem);
 
-				// Update buffers
-				for (auto& renderElem : renderableData.elements)
+				if (renderableType == RenType_LitTextured)
 				{
-					if (controller != nullptr)
-						controller->bindPerObjectBuffers(renderElem);
+					Matrix4 worldViewProjMatrix = viewProjMatrix * mWorldTransforms[rendererId];
+					mLitTexHandler->updatePerObjectBuffers(renderElem, worldViewProjMatrix);
+				}
 
-					if (renderableType == RenType_LitTextured)
-					{
-						Matrix4 worldViewProjMatrix = viewProjMatrix * mWorldTransforms[rendererId];
-						mLitTexHandler->updatePerObjectBuffers(renderElem, worldViewProjMatrix);
-					}
+				UINT32 numPasses = renderElem.material->getNumPasses();
+				for (UINT32 i = 0; i < numPasses; i++)
+				{
+					SPtr<PassParametersCore> passParams = renderElem.material->getPassParameters(i);
 
-					UINT32 numPasses = renderElem.material->getNumPasses();
-					for (UINT32 i = 0; i < numPasses; i++)
+					for (UINT32 j = 0; j < passParams->getNumParams(); j++)
 					{
-						SPtr<PassParametersCore> passParams = renderElem.material->getPassParameters(i);
-
-						for (UINT32 j = 0; j < passParams->getNumParams(); j++)
-						{
-							SPtr<GpuParamsCore> params = passParams->getParamByIdx(j);
-							if (params != nullptr)
-								params->updateHardwareBuffers();
-						}
+						SPtr<GpuParamsCore> params = passParams->getParamByIdx(j);
+						if (params != nullptr)
+							params->updateHardwareBuffers();
 					}
 				}
+			}
 
-				// Do frustum culling
-				// TODO - This is bound to be a bottleneck at some point. When it is ensure that intersect
-				// methods use vector operations, as it is trivial to update them.
-				const Sphere& boundingSphere = mWorldBounds[rendererId].getSphere();
-				if (worldFrustum.intersects(boundingSphere))
-				{
-					// More precise with the box
-					const AABox& boundingBox = mWorldBounds[rendererId].getBox();
+			// Do frustum culling
+			// TODO - This is bound to be a bottleneck at some point. When it is ensure that intersect
+			// methods use vector operations, as it is trivial to update them.
+			const Sphere& boundingSphere = mWorldBounds[rendererId].getSphere();
+			if (worldFrustum.intersects(boundingSphere))
+			{
+				// More precise with the box
+				const AABox& boundingBox = mWorldBounds[rendererId].getBox();
 
-					if (worldFrustum.intersects(boundingBox))
-					{
-						float distanceToCamera = (camera.getPosition() - boundingBox.getCenter()).length();
+				if (worldFrustum.intersects(boundingBox))
+				{
+					float distanceToCamera = (camera.getPosition() - boundingBox.getCenter()).length();
 
-						for (auto& renderElem : renderableData.elements)
-							renderQueue->add(&renderElem, distanceToCamera);
-					}
+					for (auto& renderElem : renderableData.elements)
+						renderQueue->add(&renderElem, distanceToCamera);
 				}
 			}
 		}

+ 1 - 1
ExampleProject/Main/Main.cpp

@@ -312,7 +312,7 @@ namespace BansheeEngine
 		guiCamera->setAspectRatio(1.0f);
 
 		// This camera should ignore any Renderable objects in the scene
-		guiCamera->setIgnoreSceneRenderables(true);
+		guiCamera->setLayers(0);
 
 		// Don't clear this camera as that would clear anything the main camera has rendered.
 		guiCamera->getViewport()->setRequiresClear(false, false, false);

+ 21 - 3
MBansheeEditor/Scene/SceneWindow.cs

@@ -46,6 +46,7 @@ namespace BansheeEditor
 
         // Profiler overlay
         private ProfilerOverlay activeProfilerOverlay;
+        private Camera profilerCamera;
         private VirtualButton toggleProfilerOverlayKey;
 
         // Drag & drop
@@ -165,6 +166,10 @@ namespace BansheeEditor
 
         private void OnEditorUpdate()
         {
+            // DEBUG ONLY
+            if (activeProfilerOverlay != null && Time.FrameDelta > 100.0f)
+                activeProfilerOverlay.Paused = true;
+
             if (HasFocus)
             {
                 if (VirtualInput.IsButtonUp(toggleProfilerOverlayKey))
@@ -411,14 +416,24 @@ namespace BansheeEditor
             if (EditorSettings.GetBool(ProfilerOverlayActiveKey))
             {
                 if (activeProfilerOverlay == null)
-                    activeProfilerOverlay = camera.SceneObject.AddComponent<ProfilerOverlay>();
+                {
+                    SceneObject profilerSO = new SceneObject("EditorProfilerOverlay");
+                    profilerCamera = profilerSO.AddComponent<Camera>();
+                    profilerCamera.Target = renderTexture;
+                    profilerCamera.ClearFlags = ClearFlags.None;
+                    profilerCamera.Priority = 1;
+                    profilerCamera.Layers = 0;
+
+                    activeProfilerOverlay = profilerSO.AddComponent<ProfilerOverlay>();
+                }
             }
             else
             {
                 if (activeProfilerOverlay != null)
                 {
-                    activeProfilerOverlay.SceneObject.RemoveComponent<ProfilerOverlay>();
+                    activeProfilerOverlay.SceneObject.Destroy();
                     activeProfilerOverlay = null;
+                    profilerCamera = null;
                 }
             }
         }
@@ -441,7 +456,7 @@ namespace BansheeEditor
                 sceneCameraSO.Position = new Vector3(0, 0.5f, 1);
                 sceneCameraSO.LookAt(new Vector3(0, 0, 0));
 
-                camera.Priority = 1;
+                camera.Priority = 2;
                 camera.NearClipPlane = 0.005f;
                 camera.FarClipPlane = 1000.0f;
                 camera.ClearColor = ClearColor;
@@ -463,6 +478,9 @@ namespace BansheeEditor
 		    // render target destroy/create cycle for every single pixel.
 
 		    camera.AspectRatio = width / (float)height;
+
+            if (profilerCamera != null)
+                profilerCamera.Target = renderTexture;
 	    }
     }
 }

+ 1 - 1
MBansheeEngine/CameraHandler.cs

@@ -16,7 +16,7 @@ namespace BansheeEngine
     [Flags]
     public enum ClearFlags
     {
-        Color = 0x01, Depth = 0x02, Stencil = 0x04
+        None = 0, Color = 0x01, Depth = 0x02, Stencil = 0x04
     }
 
     internal class CameraHandler : ScriptObject

+ 4 - 1
MBansheeEngine/ProfilerOverlay.cs

@@ -16,6 +16,8 @@ namespace BansheeEngine
     {
         private ProfilerOverlayInternal impl;
 
+        public bool Paused { get; set; }
+
         public void SetType(ProfilerOverlayType type)
         {
             impl.SetType(type);   
@@ -32,7 +34,8 @@ namespace BansheeEngine
 
         private void Update()
         {
-            impl.Update();
+            if(!Paused)
+                impl.Update();
         }
 
         private void OnDestroy()

+ 6 - 0
SBansheeEditor/Source/BsScriptEditorApplication.cpp

@@ -10,6 +10,12 @@
 #include "BsPrefabUtility.h"
 #include "BsSceneManager.h"
 #include "BsResources.h"
+#include "BsScriptEditorWindow.h"
+#include "BsEditorWindowBase.h"
+#include "BsProfilerOverlay.h"
+#include "BsGUIWidget.h"
+#include "BsSceneObject.h"
+#include "BsCamera.h"
 
 namespace BansheeEngine
 {

+ 4 - 11
TODO.txt

@@ -58,18 +58,11 @@ Code quality improvements:
 ----------------------------------------------------------------------
 Polish stage 1
 
-Finish up profiler overlay:
- - Add a way to add generic settings in EditorSettings.cs (e.g. key/value pairs)
- - Hook that up to SceneWindow
- - Add a shortcut (e.g. F12) to open/close profile overlay
- - Test if profiler overlay works
- - Continue with profiling the hang issue
-
-There's a large hang when doing certain operations like selecting a mesh in scene, or switching from center to pivot mode (possibly GC?)
-Crash on shutdown in mono_gchandle_free
-When selecting an gizmo icon the selection seems delayed and its gizmos flash for a frame before hiding (Can't reproduce atm but I saw it)
+IMPORTANT: Overlay camera will also draw renderables
+Track down the large performance spike
+
 ProjectLibrary seems to import some files on every start-up
-Handles don't seem to move at the same speed at the selected mesh (mostly visible with move handle)
+Crash on shutdown in mono_gchandle_free
 
 First screenshot work:
 - Inspector change contents on selection (and make sure the selected object/component looks okay)