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

Finding resource dependencies will now properly consider resource handles that aren't loaded yet
When reimporting native resources in project library avoid loading its dependencies because their UUIDs can be changed in case the project library manifest is missing or obsolete
Camera & Renderable now properly restore their serialized data on load
Resolving resource handles to managed object instances now works even if the resource handle hasn't been loaded yet
"New scene" menu item

BearishSun 10 жил өмнө
parent
commit
c46c7f741a

+ 2 - 2
BansheeCore/Source/BsUtility.cpp

@@ -43,7 +43,7 @@ namespace BansheeEngine
 						for (UINT32 j = 0; j < numElements; j++)
 						for (UINT32 j = 0; j < numElements; j++)
 						{
 						{
 							HResource resource = (HResource&)reflectableField->getArrayValue(&obj, j);
 							HResource resource = (HResource&)reflectableField->getArrayValue(&obj, j);
-							if (resource != nullptr)
+							if (!resource.getUUID().empty())
 							{
 							{
 								ResourceDependency& dependency = dependencies[resource.getUUID()];
 								ResourceDependency& dependency = dependencies[resource.getUUID()];
 								dependency.resource = resource;
 								dependency.resource = resource;
@@ -54,7 +54,7 @@ namespace BansheeEngine
 					else
 					else
 					{
 					{
 						HResource resource = (HResource&)reflectableField->getValue(&obj);
 						HResource resource = (HResource&)reflectableField->getValue(&obj);
-						if (resource != nullptr)
+						if (!resource.getUUID().empty())
 						{
 						{
 							ResourceDependency& dependency = dependencies[resource.getUUID()];
 							ResourceDependency& dependency = dependencies[resource.getUUID()];
 							dependency.resource = resource;
 							dependency.resource = resource;

+ 7 - 3
BansheeEditor/Source/BsProjectLibrary.cpp

@@ -397,10 +397,12 @@ namespace BansheeEngine
 			{
 			{
 				// If meta exists make sure it is registered in the manifest before load, otherwise it will get assigned a new UUID.
 				// If meta exists make sure it is registered in the manifest before load, otherwise it will get assigned a new UUID.
 				// This can happen if library isn't properly saved before exiting the application.
 				// This can happen if library isn't properly saved before exiting the application.
-				if (resource->meta != nullptr && !mResourceManifest->uuidExists(resource->meta->getUUID()))
+				if (resource->meta != nullptr)
 					mResourceManifest->registerResource(resource->meta->getUUID(), resource->path);
 					mResourceManifest->registerResource(resource->meta->getUUID(), resource->path);
 
 
-				importedResource = gResources().load(resource->path);
+				// Don't load dependencies because we don't need them, but also because they might not be in the manifest
+				// which would screw up their UUIDs.
+				importedResource = gResources().load(resource->path, false);
 			}
 			}
 
 
 			if(resource->meta == nullptr)
 			if(resource->meta == nullptr)
@@ -444,7 +446,6 @@ namespace BansheeEngine
 					FileSystem::createDir(internalResourcesPath);
 					FileSystem::createDir(internalResourcesPath);
 
 
 				internalResourcesPath.setFilename(toWString(importedResource.getUUID()) + L".asset");
 				internalResourcesPath.setFilename(toWString(importedResource.getUUID()) + L".asset");
-
 				gResources().save(importedResource, internalResourcesPath, true);
 				gResources().save(importedResource, internalResourcesPath, true);
 
 
 				if (!isNativeResource)
 				if (!isNativeResource)
@@ -1233,7 +1234,10 @@ namespace BansheeEngine
 		{
 		{
 			String uuid = file.getFilename(false);
 			String uuid = file.getFilename(false);
 			if (mUUIDToPath.find(uuid) == mUUIDToPath.end())
 			if (mUUIDToPath.find(uuid) == mUUIDToPath.end())
+			{
+				mResourceManifest->unregisterResource(uuid);
 				toDelete.push_back(file);
 				toDelete.push_back(file);
+			}
 
 
 			return true;
 			return true;
 		};
 		};

+ 17 - 3
MBansheeEditor/EditorApplication.cs

@@ -187,11 +187,20 @@ namespace BansheeEditor
             codeManager.Update();
             codeManager.Update();
         }
         }
 
 
+        /// <summary>
+        /// Creates a new empty scene.
+        /// </summary>
+        [MenuItem("File/New Scene", 10051, true)]
+        private static void NewScene()
+        {
+            LoadScene(null);
+        }
+
         /// <summary>
         /// <summary>
         /// Opens a dialog that allows the user to select a new prefab to load as the current scene. If current scene
         /// Opens a dialog that allows the user to select a new prefab to load as the current scene. If current scene
         /// is modified the user is offered a chance to save it.
         /// is modified the user is offered a chance to save it.
         /// </summary>
         /// </summary>
-        [MenuItem("File/Open Scene", ButtonModifier.Ctrl, ButtonCode.L, 10050, true)]
+        [MenuItem("File/Open Scene", ButtonModifier.Ctrl, ButtonCode.L, 10050)]
         private static void LoadScene()
         private static void LoadScene()
         {
         {
             string[] scenePaths;
             string[] scenePaths;
@@ -248,13 +257,18 @@ namespace BansheeEditor
         /// Loads a prefab as the current scene at the specified path. If current scene is modified the user is offered a 
         /// Loads a prefab as the current scene at the specified path. If current scene is modified the user is offered a 
         /// chance to save it.
         /// chance to save it.
         /// </summary>
         /// </summary>
-        /// <param name="path">Path to a valid prefab relative to the resource folder.</param>
+        /// <param name="path">Path to a valid prefab relative to the resource folder. If path is empty a brand new
+        ///                    scene will be loaded.</param>
         public static void LoadScene(string path)
         public static void LoadScene(string path)
         {
         {
             Action<string> continueLoad =
             Action<string> continueLoad =
                 (scenePath) =>
                 (scenePath) =>
                 {
                 {
-                    Scene.Load(path);
+                    if (string.IsNullOrEmpty(path))
+                        Scene.Clear();
+                    else
+                        Scene.Load(path);
+
                     SetSceneDirty(false);
                     SetSceneDirty(false);
 
 
                     ProjectSettings.LastOpenScene = scenePath;
                     ProjectSettings.LastOpenScene = scenePath;

+ 11 - 25
MBansheeEngine/Camera.cs

@@ -340,20 +340,6 @@ namespace BansheeEngine
         /// <returns>3D point in view space.</returns>
         /// <returns>3D point in view space.</returns>
         public Vector3 UnprojectPoint(Vector3 value) { return native.UnprojectPoint(value); }
         public Vector3 UnprojectPoint(Vector3 value) { return native.UnprojectPoint(value); }
 
 
-        private void OnInitialize()
-        {
-            serializableData.aspectRatio = 1.333f;
-            serializableData.nearClipPlane = 1.0f;
-            serializableData.farClipPlane = 1000.0f;
-            serializableData.fieldOfView = new Degree(60);
-            serializableData.viewportRect = new Rect2(0, 0, 1, 1);
-            serializableData.projectionType = ProjectionType.Perspective;
-            serializableData.layers = 0xFFFFFFFFFFFFFFFF;
-            serializableData.clearColor = new Color(143.0f / 255.0f, 111.0f / 255.0f, 0);
-            serializableData.clearDepth = 1.0f;
-            serializableData.clearFlags = ClearFlags.Color | ClearFlags.Depth | ClearFlags.Stencil;
-        }
-
         private void OnReset()
         private void OnReset()
         {
         {
             if (native != null)
             if (native != null)
@@ -393,21 +379,21 @@ namespace BansheeEngine
         /// Holds all data the camera component needs to persist through serialization.
         /// Holds all data the camera component needs to persist through serialization.
         /// </summary>
         /// </summary>
         [SerializeObject]
         [SerializeObject]
-        internal struct SerializableData
+        internal class SerializableData
         {
         {
-            public float aspectRatio;
-            public float nearClipPlane;
-            public float farClipPlane;
-            public Degree fieldOfView;
-            public Rect2 viewportRect;
-            public ProjectionType projectionType;
+            public float aspectRatio = 1.333f;
+            public float nearClipPlane = 1.0f;
+            public float farClipPlane = 1000.0f;
+            public Degree fieldOfView = new Degree(60);
+            public Rect2 viewportRect = new Rect2(0, 0, 1, 1);
+            public ProjectionType projectionType = ProjectionType.Perspective;
             public float orthoHeight;
             public float orthoHeight;
-            public Color clearColor;
-            public float clearDepth;
+            public Color clearColor = new Color(143.0f / 255.0f, 111.0f / 255.0f, 0);
+            public float clearDepth = 1.0f;
             public UInt16 clearStencil;
             public UInt16 clearStencil;
-            public ClearFlags clearFlags;
+            public ClearFlags clearFlags = ClearFlags.Color | ClearFlags.Depth | ClearFlags.Stencil;
             public int priority;
             public int priority;
-            public UInt64 layers;
+            public UInt64 layers = 0xFFFFFFFFFFFFFFFF;
         }
         }
     }
     }
 }
 }

+ 3 - 9
MBansheeEngine/Renderable.cs

@@ -108,12 +108,6 @@ namespace BansheeEngine
             get { return _native.GetBounds(SceneObject); }
             get { return _native.GetBounds(SceneObject); }
         }
         }
 
 
-        private void OnInitialize()
-        {
-            serializableData.materials = new Material[0];
-            serializableData.layers = 1;
-        }
-
         private void OnReset()
         private void OnReset()
         {
         {
             if (_native != null)
             if (_native != null)
@@ -147,11 +141,11 @@ namespace BansheeEngine
         /// Holds all data the renderable component needs to persist through serialization.
         /// Holds all data the renderable component needs to persist through serialization.
         /// </summary>
         /// </summary>
         [SerializeObject]
         [SerializeObject]
-        private struct SerializableData
+        private class SerializableData
         {
         {
             public Mesh mesh;
             public Mesh mesh;
-            public Material[] materials;
-            public UInt64 layers;
+            public Material[] materials = new Material[0];
+            public UInt64 layers = 1;
         }
         }
     }
     }
 }
 }

+ 67 - 67
SBansheeEngine/Include/BsManagedSerializableFieldRTTI.h

@@ -23,18 +23,18 @@ namespace BansheeEngine
 			addPlainField("mFieldId", 1, &ManagedSerializableFieldKeyRTTI::getFieldId, &ManagedSerializableFieldKeyRTTI::setFieldId);
 			addPlainField("mFieldId", 1, &ManagedSerializableFieldKeyRTTI::getFieldId, &ManagedSerializableFieldKeyRTTI::setFieldId);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldKey";
 			static String name = "SerializableFieldKey";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldKey;
 			return TID_SerializableFieldKey;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldKey>();
 			return bs_shared_ptr_new<ManagedSerializableFieldKey>();
 		}
 		}
@@ -50,18 +50,18 @@ namespace BansheeEngine
 
 
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldData";
 			static String name = "SerializableFieldData";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldData;
 			return TID_SerializableFieldData;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			BS_EXCEPT(InvalidStateException, "Cannot instantiate an abstract class.");
 			BS_EXCEPT(InvalidStateException, "Cannot instantiate an abstract class.");
 		}
 		}
@@ -83,18 +83,18 @@ namespace BansheeEngine
 			addReflectablePtrField("mValue", 1, &ManagedSerializableFieldDataEntryRTTI::getValue, &ManagedSerializableFieldDataEntryRTTI::setValue);
 			addReflectablePtrField("mValue", 1, &ManagedSerializableFieldDataEntryRTTI::getValue, &ManagedSerializableFieldDataEntryRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataEntry";
 			static String name = "SerializableFieldDataEntry";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataEntry;
 			return TID_SerializableFieldDataEntry;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataEntry>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataEntry>();
 		}
 		}
@@ -112,18 +112,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataBoolRTTI::getValue, &ManagedSerializableFieldDataBoolRTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataBoolRTTI::getValue, &ManagedSerializableFieldDataBoolRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataBool";
 			static String name = "SerializableFieldDataBool";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataBool;
 			return TID_SerializableFieldDataBool;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataBool>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataBool>();
 		}
 		}
@@ -141,18 +141,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataCharRTTI::getValue, &ManagedSerializableFieldDataCharRTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataCharRTTI::getValue, &ManagedSerializableFieldDataCharRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataChar";
 			static String name = "SerializableFieldDataChar";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataChar;
 			return TID_SerializableFieldDataChar;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataBool>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataBool>();
 		}
 		}
@@ -170,18 +170,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataI8RTTI::getValue, &ManagedSerializableFieldDataI8RTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataI8RTTI::getValue, &ManagedSerializableFieldDataI8RTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataI8";
 			static String name = "SerializableFieldDataI8";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataI8;
 			return TID_SerializableFieldDataI8;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataI8>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataI8>();
 		}
 		}
@@ -199,18 +199,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataU8RTTI::getValue, &ManagedSerializableFieldDataU8RTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataU8RTTI::getValue, &ManagedSerializableFieldDataU8RTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataU8";
 			static String name = "SerializableFieldDataU8";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataU8;
 			return TID_SerializableFieldDataU8;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataU8>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataU8>();
 		}
 		}
@@ -228,18 +228,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataI16RTTI::getValue, &ManagedSerializableFieldDataI16RTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataI16RTTI::getValue, &ManagedSerializableFieldDataI16RTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataI16";
 			static String name = "SerializableFieldDataI16";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataI16;
 			return TID_SerializableFieldDataI16;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataI16>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataI16>();
 		}
 		}
@@ -257,18 +257,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataU16RTTI::getValue, &ManagedSerializableFieldDataU16RTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataU16RTTI::getValue, &ManagedSerializableFieldDataU16RTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataU16";
 			static String name = "SerializableFieldDataU16";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataU16;
 			return TID_SerializableFieldDataU16;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataU16>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataU16>();
 		}
 		}
@@ -286,18 +286,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataI32RTTI::getValue, &ManagedSerializableFieldDataI32RTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataI32RTTI::getValue, &ManagedSerializableFieldDataI32RTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataI32";
 			static String name = "SerializableFieldDataI32";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataI32;
 			return TID_SerializableFieldDataI32;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataI32>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataI32>();
 		}
 		}
@@ -315,18 +315,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataU32RTTI::getValue, &ManagedSerializableFieldDataU32RTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataU32RTTI::getValue, &ManagedSerializableFieldDataU32RTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataU32";
 			static String name = "SerializableFieldDataU32";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataU32;
 			return TID_SerializableFieldDataU32;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataU32>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataU32>();
 		}
 		}
@@ -344,18 +344,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataI64RTTI::getValue, &ManagedSerializableFieldDataI64RTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataI64RTTI::getValue, &ManagedSerializableFieldDataI64RTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataI64";
 			static String name = "SerializableFieldDataI64";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataI64;
 			return TID_SerializableFieldDataI64;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataI64>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataI64>();
 		}
 		}
@@ -373,18 +373,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataU64RTTI::getValue, &ManagedSerializableFieldDataU64RTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataU64RTTI::getValue, &ManagedSerializableFieldDataU64RTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataU64";
 			static String name = "SerializableFieldDataU64";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataU64;
 			return TID_SerializableFieldDataU64;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataU64>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataU64>();
 		}
 		}
@@ -402,18 +402,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataFloatRTTI::getValue, &ManagedSerializableFieldDataFloatRTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataFloatRTTI::getValue, &ManagedSerializableFieldDataFloatRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataFloat";
 			static String name = "SerializableFieldDataFloat";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataFloat;
 			return TID_SerializableFieldDataFloat;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataFloat>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataFloat>();
 		}
 		}
@@ -431,18 +431,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataDoubleRTTI::getValue, &ManagedSerializableFieldDataDoubleRTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataDoubleRTTI::getValue, &ManagedSerializableFieldDataDoubleRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataDouble";
 			static String name = "SerializableFieldDataDouble";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataDouble;
 			return TID_SerializableFieldDataDouble;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataDouble>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataDouble>();
 		}
 		}
@@ -460,18 +460,18 @@ namespace BansheeEngine
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataStringRTTI::getValue, &ManagedSerializableFieldDataStringRTTI::setValue);
 			addPlainField("mValue", 0, &ManagedSerializableFieldDataStringRTTI::getValue, &ManagedSerializableFieldDataStringRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataString";
 			static String name = "SerializableFieldDataString";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataString;
 			return TID_SerializableFieldDataString;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataString>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataString>();
 		}
 		}
@@ -481,7 +481,7 @@ namespace BansheeEngine
 	{
 	{
 	private:
 	private:
 		HResource& getValue(ManagedSerializableFieldDataResourceRef* obj) { return obj->value; }
 		HResource& getValue(ManagedSerializableFieldDataResourceRef* obj) { return obj->value; }
-		void setValue(ManagedSerializableFieldDataResourceRef* obj, HResource& val) { obj->value = val; }
+		void setValue(ManagedSerializableFieldDataResourceRef* obj, HResource& val) { obj->value = HResource(val); }
 
 
 	public:
 	public:
 		ManagedSerializableFieldDataResourceRefRTTI()
 		ManagedSerializableFieldDataResourceRefRTTI()
@@ -489,18 +489,18 @@ namespace BansheeEngine
 			addReflectableField("mValue", 0, &ManagedSerializableFieldDataResourceRefRTTI::getValue, &ManagedSerializableFieldDataResourceRefRTTI::setValue);
 			addReflectableField("mValue", 0, &ManagedSerializableFieldDataResourceRefRTTI::getValue, &ManagedSerializableFieldDataResourceRefRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataResourceRef";
 			static String name = "SerializableFieldDataResourceRef";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataResourceRef;
 			return TID_SerializableFieldDataResourceRef;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataResourceRef>();
 		}
 		}
@@ -518,18 +518,18 @@ namespace BansheeEngine
 			addReflectableField("mValue", 0, &ManagedSerializableFieldDataGameObjectRefRTTI::getValue, &ManagedSerializableFieldDataGameObjectRefRTTI::setValue);
 			addReflectableField("mValue", 0, &ManagedSerializableFieldDataGameObjectRefRTTI::getValue, &ManagedSerializableFieldDataGameObjectRefRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataGameObjectRef";
 			static String name = "SerializableFieldDataGameObjectRef";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataGameObjectRef;
 			return TID_SerializableFieldDataGameObjectRef;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataGameObjectRef>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataGameObjectRef>();
 		}
 		}
@@ -547,18 +547,18 @@ namespace BansheeEngine
 			addReflectablePtrField("mValue", 0, &ManagedSerializableFieldDataObjectRTTI::getValue, &ManagedSerializableFieldDataObjectRTTI::setValue);
 			addReflectablePtrField("mValue", 0, &ManagedSerializableFieldDataObjectRTTI::getValue, &ManagedSerializableFieldDataObjectRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataObject";
 			static String name = "SerializableFieldDataObject";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataObject;
 			return TID_SerializableFieldDataObject;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataObject>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataObject>();
 		}
 		}
@@ -576,18 +576,18 @@ namespace BansheeEngine
 			addReflectablePtrField("mValue", 0, &ManagedSerializableFieldDataArrayRTTI::getValue, &ManagedSerializableFieldDataArrayRTTI::setValue);
 			addReflectablePtrField("mValue", 0, &ManagedSerializableFieldDataArrayRTTI::getValue, &ManagedSerializableFieldDataArrayRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataArray";
 			static String name = "SerializableFieldDataArray";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataArray;
 			return TID_SerializableFieldDataArray;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataArray>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataArray>();
 		}
 		}
@@ -605,18 +605,18 @@ namespace BansheeEngine
 			addReflectablePtrField("mValue", 0, &ManagedSerializableFieldDataListRTTI::getValue, &ManagedSerializableFieldDataListRTTI::setValue);
 			addReflectablePtrField("mValue", 0, &ManagedSerializableFieldDataListRTTI::getValue, &ManagedSerializableFieldDataListRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataList";
 			static String name = "SerializableFieldDataList";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataList;
 			return TID_SerializableFieldDataList;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataList>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataList>();
 		}
 		}
@@ -634,18 +634,18 @@ namespace BansheeEngine
 			addReflectablePtrField("mValue", 0, &ManagedSerializableFieldDataDictionaryRTTI::getValue, &ManagedSerializableFieldDataDictionaryRTTI::setValue);
 			addReflectablePtrField("mValue", 0, &ManagedSerializableFieldDataDictionaryRTTI::getValue, &ManagedSerializableFieldDataDictionaryRTTI::setValue);
 		}
 		}
 
 
-		virtual const String& getRTTIName()
+		virtual const String& getRTTIName() override
 		{
 		{
 			static String name = "SerializableFieldDataDictionary";
 			static String name = "SerializableFieldDataDictionary";
 			return name;
 			return name;
 		}
 		}
 
 
-		virtual UINT32 getRTTIId()
+		virtual UINT32 getRTTIId() override
 		{
 		{
 			return TID_SerializableFieldDataDictionary;
 			return TID_SerializableFieldDataDictionary;
 		}
 		}
 
 
-		virtual std::shared_ptr<IReflectable> newRTTIObject()
+		virtual std::shared_ptr<IReflectable> newRTTIObject() override
 		{
 		{
 			return bs_shared_ptr_new<ManagedSerializableFieldDataDictionary>();
 			return bs_shared_ptr_new<ManagedSerializableFieldDataDictionary>();
 		}
 		}

+ 15 - 15
SBansheeEngine/Source/BsManagedSerializableField.cpp

@@ -617,7 +617,7 @@ namespace BansheeEngine
 
 
 			if(primitiveTypeInfo->mType == ScriptPrimitiveType::Texture2DRef)
 			if(primitiveTypeInfo->mType == ScriptPrimitiveType::Texture2DRef)
 			{
 			{
-				if(value)
+				if(!value.getUUID().empty())
 				{
 				{
 					HTexture texture = static_resource_cast<Texture>(value);
 					HTexture texture = static_resource_cast<Texture>(value);
 
 
@@ -631,7 +631,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::Texture3DRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::Texture3DRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HTexture texture = static_resource_cast<Texture>(value);
 					HTexture texture = static_resource_cast<Texture>(value);
 
 
@@ -645,7 +645,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::TextureCubeRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::TextureCubeRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HTexture texture = static_resource_cast<Texture>(value);
 					HTexture texture = static_resource_cast<Texture>(value);
 
 
@@ -659,7 +659,7 @@ namespace BansheeEngine
 			}
 			}
 			else if(primitiveTypeInfo->mType == ScriptPrimitiveType::SpriteTextureRef)
 			else if(primitiveTypeInfo->mType == ScriptPrimitiveType::SpriteTextureRef)
 			{
 			{
-				if(value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HSpriteTexture spriteTexture = static_resource_cast<SpriteTexture>(value);
 					HSpriteTexture spriteTexture = static_resource_cast<SpriteTexture>(value);
 
 
@@ -674,7 +674,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ShaderRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ShaderRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HShader shader = static_resource_cast<Shader>(value);
 					HShader shader = static_resource_cast<Shader>(value);
 
 
@@ -689,7 +689,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ShaderIncludeRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ShaderIncludeRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HShaderInclude shader = static_resource_cast<ShaderInclude>(value);
 					HShaderInclude shader = static_resource_cast<ShaderInclude>(value);
 
 
@@ -704,7 +704,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::MaterialRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::MaterialRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HMaterial material = static_resource_cast<Material>(value);
 					HMaterial material = static_resource_cast<Material>(value);
 
 
@@ -719,7 +719,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::MeshRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::MeshRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HMesh mesh = static_resource_cast<Mesh>(value);
 					HMesh mesh = static_resource_cast<Mesh>(value);
 
 
@@ -734,7 +734,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::PlainTextRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::PlainTextRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HPlainText plainText = static_resource_cast<PlainText>(value);
 					HPlainText plainText = static_resource_cast<PlainText>(value);
 
 
@@ -749,7 +749,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ScriptCodeRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ScriptCodeRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HScriptCode scriptCode = static_resource_cast<ScriptCode>(value);
 					HScriptCode scriptCode = static_resource_cast<ScriptCode>(value);
 
 
@@ -764,7 +764,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::PrefabRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::PrefabRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HPrefab prefab = static_resource_cast<Prefab>(value);
 					HPrefab prefab = static_resource_cast<Prefab>(value);
 
 
@@ -779,7 +779,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::FontRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::FontRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HFont font = static_resource_cast<Font>(value);
 					HFont font = static_resource_cast<Font>(value);
 
 
@@ -794,7 +794,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::StringTableRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::StringTableRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HStringTable stringTable = static_resource_cast<StringTable>(value);
 					HStringTable stringTable = static_resource_cast<StringTable>(value);
 
 
@@ -809,7 +809,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::GUISkinRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::GUISkinRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HGUISkin guiSkin = static_resource_cast<GUISkin>(value);
 					HGUISkin guiSkin = static_resource_cast<GUISkin>(value);
 
 
@@ -824,7 +824,7 @@ namespace BansheeEngine
 			}
 			}
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ManagedResourceRef)
 			else if (primitiveTypeInfo->mType == ScriptPrimitiveType::ManagedResourceRef)
 			{
 			{
-				if (value)
+				if (!value.getUUID().empty())
 				{
 				{
 					HManagedResource managedResource = static_resource_cast<ManagedResource>(value);
 					HManagedResource managedResource = static_resource_cast<ManagedResource>(value);
 
 

+ 0 - 4
TODO.txt

@@ -31,16 +31,12 @@ Other polish:
    - Custom inspectors can get rid of manual "isExpanded" bools and use the dictionary instead
    - Custom inspectors can get rid of manual "isExpanded" bools and use the dictionary instead
 
 
 Stage 2 polish:
 Stage 2 polish:
- - Prefabs
  - Game window
  - Game window
  - Game play/pause/step (+ save/restore objects on play/pause switch)
  - Game play/pause/step (+ save/restore objects on play/pause switch)
  - Resource hotswap
  - Resource hotswap
- - C# script compiling in editor
- - VS integration
  - When managed exception happens log an error and continue execution
  - When managed exception happens log an error and continue execution
   - Doing a pass over all methods referencing Internal_ methods ensuring they do proper checking on C# side would be good
   - Doing a pass over all methods referencing Internal_ methods ensuring they do proper checking on C# side would be good
  - Game publishing (Build window, collect resources, output exe, default viewport) (described below)
  - Game publishing (Build window, collect resources, output exe, default viewport) (described below)
- - Settings/Preferences window (+ menu entry)
  - Console window
  - Console window
 
 
 Optional:
 Optional: