2
0
Эх сурвалжийг харах

PrefabDiff game object handle search no longer uses RTTI to determine field types since they might be incorrect because prefab diffs are not necessarily constructed according to RTTI

BearishSun 10 жил өмнө
parent
commit
9c5289c21e

+ 11 - 24
BansheeCore/Include/BsPrefabDiffRTTI.h

@@ -204,39 +204,26 @@ namespace BansheeEngine
 						continue;
 						continue;
 
 
 					SPtr<SerializedInstance> entryData = child.second.serialized;
 					SPtr<SerializedInstance> entryData = child.second.serialized;
-					if (curGenericField->isArray())
+					if (entryData == nullptr)
+						continue;
+
+					if (rtti_is_of_type<SerializedArray>(entryData))
 					{
 					{
 						SPtr<SerializedArray> arrayData = std::static_pointer_cast<SerializedArray>(entryData);
 						SPtr<SerializedArray> arrayData = std::static_pointer_cast<SerializedArray>(entryData);
-
-						switch (curGenericField->mType)
+						
+						for (auto& arrayElem : arrayData->entries)
 						{
 						{
-						case SerializableFT_ReflectablePtr:
-						case SerializableFT_Reflectable:
-						{
-							for (auto& arrayElem : arrayData->entries)
+							if (arrayElem.second.serialized != nullptr && rtti_is_of_type<SerializedObject>(arrayElem.second.serialized))
 							{
 							{
 								SPtr<SerializedObject> arrayElemData = std::static_pointer_cast<SerializedObject>(arrayElem.second.serialized);
 								SPtr<SerializedObject> arrayElemData = std::static_pointer_cast<SerializedObject>(arrayElem.second.serialized);
-
-								if (arrayElemData != nullptr)
-									findGameObjectHandles(arrayElemData, handleObjects);
+								findGameObjectHandles(arrayElemData, handleObjects);
 							}
 							}
 						}
 						}
-							break;
-						}
 					}
 					}
-					else
+					else if(rtti_is_of_type<SerializedObject>(entryData))
 					{
 					{
-						switch (curGenericField->mType)
-						{
-						case SerializableFT_ReflectablePtr:
-						case SerializableFT_Reflectable:
-						{
-							SPtr<SerializedObject> fieldObjectData = std::static_pointer_cast<SerializedObject>(entryData);
-							if (fieldObjectData != nullptr)
-								findGameObjectHandles(fieldObjectData, handleObjects);
-						}
-							break;
-						}
+						SPtr<SerializedObject> fieldObjectData = std::static_pointer_cast<SerializedObject>(entryData);
+						findGameObjectHandles(fieldObjectData, handleObjects);
 					}
 					}
 				}
 				}
 			}
 			}