Browse Source

Fixed an issue where a destroyed core object would cause a crash when previously being queued for core sync
- This solves the crash on project unload

BearishSun 10 years ago
parent
commit
8f27ad6744
2 changed files with 17 additions and 23 deletions
  1. 17 18
      BansheeCore/Source/BsCoreObjectManager.cpp
  2. 0 5
      MBansheeEditor/ProjectWindow.cs

+ 17 - 18
BansheeCore/Source/BsCoreObjectManager.cpp

@@ -50,31 +50,30 @@ namespace BansheeEngine
 		UINT64 internalId = object->getInternalID();
 		UINT64 internalId = object->getInternalID();
 
 
 		// If dirty, we generate sync data before it is destroyed
 		// If dirty, we generate sync data before it is destroyed
-		if (object->isCoreDirty())
 		{
 		{
 			BS_LOCK_MUTEX(mObjectsMutex);
 			BS_LOCK_MUTEX(mObjectsMutex);
+			bool isDirty = object->isCoreDirty() || (mDirtyObjects.find(internalId) != mDirtyObjects.end());
 
 
-			SPtr<CoreObjectCore> coreObject = object->getCore();
-			if (coreObject != nullptr)
+			if (isDirty)
 			{
 			{
-				CoreSyncData objSyncData = object->syncToCore(gCoreThread().getFrameAlloc());
+				SPtr<CoreObjectCore> coreObject = object->getCore();
+				if (coreObject != nullptr)
+				{
+					CoreSyncData objSyncData = object->syncToCore(gCoreThread().getFrameAlloc());
 				
 				
-				mDestroyedSyncData.push_back(CoreStoredSyncObjData(coreObject, internalId, objSyncData));
+					mDestroyedSyncData.push_back(CoreStoredSyncObjData(coreObject, internalId, objSyncData));
 
 
-				DirtyObjectData& dirtyObjData = mDirtyObjects[internalId];
-				dirtyObjData.syncDataId = (INT32)mDestroyedSyncData.size() - 1;
-				dirtyObjData.object = nullptr;
-			}
-			else
-			{
-				DirtyObjectData& dirtyObjData = mDirtyObjects[internalId];
-				dirtyObjData.syncDataId = -1;
-				dirtyObjData.object = nullptr;
+					DirtyObjectData& dirtyObjData = mDirtyObjects[internalId];
+					dirtyObjData.syncDataId = (INT32)mDestroyedSyncData.size() - 1;
+					dirtyObjData.object = nullptr;
+				}
+				else
+				{
+					DirtyObjectData& dirtyObjData = mDirtyObjects[internalId];
+					dirtyObjData.syncDataId = -1;
+					dirtyObjData.object = nullptr;
+				}
 			}
 			}
-		}
-
-		{
-			BS_LOCK_MUTEX(mObjectsMutex);
 
 
 			mObjects.erase(internalId);
 			mObjects.erase(internalId);
 		}
 		}

+ 0 - 5
MBansheeEditor/ProjectWindow.cs

@@ -219,13 +219,8 @@ namespace BansheeEditor
         private void RefreshRecentProjects()
         private void RefreshRecentProjects()
         {
         {
             GUILayout scrollLayout = recentProjectsArea.Layout;
             GUILayout scrollLayout = recentProjectsArea.Layout;
-            Debug.Log("SCROLL LAYOUT: " + (scrollLayout != null));
-
             while (scrollLayout.ChildCount > 0)
             while (scrollLayout.ChildCount > 0)
-            {
-                Debug.Log("COUNT: " + scrollLayout.ChildCount + " - " + (scrollLayout.GetChild(0) != null));
                 scrollLayout.GetChild(0).Destroy();
                 scrollLayout.GetChild(0).Destroy();
-            }
 
 
             RecentProject[] recentProjects = EditorSettings.RecentProjects;
             RecentProject[] recentProjects = EditorSettings.RecentProjects;
             Array.Sort(recentProjects, (a, b) => a.accessTimestamp.CompareTo(b.accessTimestamp));
             Array.Sort(recentProjects, (a, b) => a.accessTimestamp.CompareTo(b.accessTimestamp));