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

Added a separate RTTI for WindowFrameWidget as it was being identifier a GUIWidget which was confusing EditorWindows
Loading a new scene no longer destroys persistent scene objects

BearishSun 10 лет назад
Родитель
Сommit
a2a5cfb434

+ 0 - 9
BansheeCore/Source/BsPrefabDiff.cpp

@@ -125,15 +125,6 @@ namespace BansheeEngine
 					component->_setInstanceData(instanceData);
 					component->_setInstanceData(instanceData);
 					object->addComponentInternal(component);
 					object->addComponentInternal(component);
 
 
-					/*
-					SPtr<SerializedObject> encodedPrefab = bs._encodeIntermediate(entry.get());
-					SPtr<SerializedObject> encodedInstance = bs._encodeIntermediate(component.get());
-
-					IDiff& diffHandler = entry->getRTTI()->getDiffHandler();
-					SPtr<SerializedObject> componentDiff = diffHandler.generateDiff(encodedPrefab, encodedInstance);
-					
-					diffHandler.applyDiff(entry.getInternalPtr(), componentDiff);*/
-
 					foundExisting = true;
 					foundExisting = true;
 					break;
 					break;
 				}
 				}

+ 1 - 1
BansheeCore/Source/BsPrefabUtility.cpp

@@ -93,7 +93,7 @@ namespace BansheeEngine
 			HSceneObject current = *iter;
 			HSceneObject current = *iter;
 			HPrefab prefabLink = static_resource_cast<Prefab>(gResources().loadFromUUID(current->mPrefabLinkUUID, false, false));
 			HPrefab prefabLink = static_resource_cast<Prefab>(gResources().loadFromUUID(current->mPrefabLinkUUID, false, false));
 
 
-			if (prefabLink != nullptr /*&& prefabLink->getHash() != current->mPrefabHash*/)
+			if (prefabLink != nullptr && prefabLink->getHash() != current->mPrefabHash)
 			{
 			{
 				// Save IDs, destroy original, create new, restore IDs
 				// Save IDs, destroy original, create new, restore IDs
 				SceneObjectProxy soProxy;
 				SceneObjectProxy soProxy;

+ 1 - 0
BansheeEditor/BansheeEditor.vcxproj

@@ -323,6 +323,7 @@
     <ClInclude Include="Include\BsGUIToggleField.h" />
     <ClInclude Include="Include\BsGUIToggleField.h" />
     <ClInclude Include="Include\BsGUIVector3Field.h" />
     <ClInclude Include="Include\BsGUIVector3Field.h" />
     <ClInclude Include="Include\BsGUIVector4Field.h" />
     <ClInclude Include="Include\BsGUIVector4Field.h" />
+    <ClInclude Include="Include\BsGUIWindowFrameWidgetRTTI.h" />
     <ClInclude Include="Include\BsHandleDrawManager.h" />
     <ClInclude Include="Include\BsHandleDrawManager.h" />
     <ClInclude Include="Include\BsHandleManager.h" />
     <ClInclude Include="Include\BsHandleManager.h" />
     <ClInclude Include="Include\BsHandleSliderManager.h" />
     <ClInclude Include="Include\BsHandleSliderManager.h" />

+ 3 - 0
BansheeEditor/BansheeEditor.vcxproj.filters

@@ -288,6 +288,9 @@
     <ClInclude Include="Include\BsGUISliderField.h">
     <ClInclude Include="Include\BsGUISliderField.h">
       <Filter>Header Files</Filter>
       <Filter>Header Files</Filter>
     </ClInclude>
     </ClInclude>
+    <ClInclude Include="Include\BsGUIWindowFrameWidgetRTTI.h">
+      <Filter>Header Files\RTTI</Filter>
+    </ClInclude>
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <ClCompile Include="Source\BsEditorCommand.cpp">
     <ClCompile Include="Source\BsEditorCommand.cpp">

+ 2 - 1
BansheeEditor/Include/BsEditorPrerequisites.h

@@ -131,6 +131,7 @@ namespace BansheeEngine
 		TID_EditorSettings = 40017,
 		TID_EditorSettings = 40017,
 		TID_RecentProject = 40018,
 		TID_RecentProject = 40018,
 		TID_Settings = 40019,
 		TID_Settings = 40019,
-		TID_ProjectSettings = 40020
+		TID_ProjectSettings = 40020,
+		TID_WindowFrameWidget = 40021
 	};
 	};
 }
 }

+ 10 - 0
BansheeEditor/Include/BsGUIWindowFrameWidget.h

@@ -55,5 +55,15 @@ namespace BansheeEngine
 		GUIPanel* mWindowFramePanel;
 		GUIPanel* mWindowFramePanel;
 		RenderWindow* mParentWindow;
 		RenderWindow* mParentWindow;
 		GUIWindowFrame* mWindowFrame;
 		GUIWindowFrame* mWindowFrame;
+
+		/************************************************************************/
+		/* 								RTTI		                     		*/
+		/************************************************************************/
+	public:
+		friend class CWindowFrameWidgetRTTI;
+		static RTTITypeBase* getRTTIStatic();
+		virtual RTTITypeBase* getRTTI() const override;
+
+		WindowFrameWidget() { } // Serialization only
 	};
 	};
 }
 }

+ 34 - 0
BansheeEditor/Include/BsGUIWindowFrameWidgetRTTI.h

@@ -0,0 +1,34 @@
+#pragma once
+
+#include "BsEditorPrerequisites.h"
+#include "BsRTTIType.h"
+#include "BsGUIWindowFrameWidget.h"
+#include "BsGameObjectRTTI.h"
+
+namespace BansheeEngine
+{
+	class BS_ED_EXPORT WindowFrameWidgetRTTI : public RTTIType <WindowFrameWidget, CGUIWidget, WindowFrameWidgetRTTI>
+	{
+	private:
+
+	public:
+		WindowFrameWidgetRTTI()
+		{ }
+
+		virtual const String& getRTTIName() override
+		{
+			static String name = "WindowFrameWidget";
+			return name;
+		}
+
+		virtual UINT32 getRTTIId() override
+		{
+			return TID_WindowFrameWidget;
+		}
+
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
+		{
+			return GameObjectRTTI::createGameObject<WindowFrameWidget>();
+		}
+	};
+}

+ 2 - 4
BansheeEditor/Source/BsEditorWidgetContainer.cpp

@@ -35,10 +35,8 @@ namespace BansheeEngine
 
 
 	EditorWidgetContainer::~EditorWidgetContainer()
 	EditorWidgetContainer::~EditorWidgetContainer()
 	{
 	{
-		for(auto& widget : mWidgets)
-		{
-			widget.second->close();
-		}
+		while (mWidgets.size() > 0)
+			mWidgets.begin()->second->close();
 
 
 		GUILayout::destroy(mTitleBarPanel);
 		GUILayout::destroy(mTitleBarPanel);
 		GUIElement::destroy(mTitleBar);
 		GUIElement::destroy(mTitleBar);

+ 11 - 0
BansheeEditor/Source/BsGUIWindowFrameWidget.cpp

@@ -1,4 +1,5 @@
 #include "BsGUIWindowFrameWidget.h"
 #include "BsGUIWindowFrameWidget.h"
+#include "BsGUIWindowFrameWidgetRTTI.h"
 #include "BsGUIPanel.h"
 #include "BsGUIPanel.h"
 #include "BsCGUIWidget.h"
 #include "BsCGUIWidget.h"
 #include "BsGUILayout.h"
 #include "BsGUILayout.h"
@@ -102,4 +103,14 @@ namespace BansheeEngine
 
 
 		Platform::setResizeNonClientAreas(*mParentWindow->getCore(), nonClientAreas);
 		Platform::setResizeNonClientAreas(*mParentWindow->getCore(), nonClientAreas);
 	}
 	}
+
+	RTTITypeBase* WindowFrameWidget::getRTTIStatic()
+	{
+		return WindowFrameWidgetRTTI::instance();
+	}
+
+	RTTITypeBase* WindowFrameWidget::getRTTI() const
+	{
+		return WindowFrameWidget::getRTTIStatic();
+	}
 }
 }

+ 3 - 0
MBansheeEditor/UnitTests.cs

@@ -265,6 +265,9 @@ namespace BansheeEditor
                 Debug.Log(output);
                 Debug.Log(output);
             };
             };
 
 
+            // Disabled because it's a slow test, enable only when relevant (or when a build machine is set up)
+            return;
+
             string oldScene = Scene.ActiveSceneUUID;
             string oldScene = Scene.ActiveSceneUUID;
             Scene.Clear();
             Scene.Clear();
 
 

+ 1 - 1
README.md

@@ -197,4 +197,4 @@ Banshee is offered completely free for personal or commercial use under the Gene
 
 
 Banshee is developed by Marko Pintera. I've been a professional game developer for the last five years working on various mid-sized titles. My interests lie in engine and graphics development which I spend most of my free time on.
 Banshee is developed by Marko Pintera. I've been a professional game developer for the last five years working on various mid-sized titles. My interests lie in engine and graphics development which I spend most of my free time on.
 
 
-Contact me at [e-mail] (http://scr.im/39d1) or add me at [LinkedIn] (https://goo.gl/t6pPPs). 
+Contact me at [e-mail] (http://scr.im/39d1) or add me on [LinkedIn] (https://goo.gl/t6pPPs). 

+ 12 - 0
SBansheeEngine/Source/BsScriptScene.cpp

@@ -39,6 +39,18 @@ namespace BansheeEngine
 
 
 			if (root != nullptr)
 			if (root != nullptr)
 			{
 			{
+				UINT32 numChildren = oldRoot->getNumChildren();
+				// Make sure to keep persistent objects
+				
+				UINT32 curIdx = 0;
+				for (UINT32 i = 0; i < numChildren; i++)
+				{
+					HSceneObject child = oldRoot->getChild(curIdx);
+
+					if (child->hasFlag(SOF_Persistent))
+						child->setParent(root, false);
+				}
+
 				gSceneManager()._setRootNode(root);
 				gSceneManager()._setRootNode(root);
 				oldRoot->destroy();
 				oldRoot->destroy();
 			}
 			}