diff --git a/GlitchyEngine/src/Editor/EditorFlags.bf b/GlitchyEngine/src/Editor/EditorFlags.bf index 4efc3bb..fda3db1 100644 --- a/GlitchyEngine/src/Editor/EditorFlags.bf +++ b/GlitchyEngine/src/Editor/EditorFlags.bf @@ -5,4 +5,5 @@ enum EditorFlags Default = 0, HideInHierarchy = 1, HideInScene = 2, + DontSave = 4 } diff --git a/GlitchyEngine/src/World/Components/Components.bf b/GlitchyEngine/src/World/Components/Components.bf index 7d83ad5..2faa3c3 100644 --- a/GlitchyEngine/src/World/Components/Components.bf +++ b/GlitchyEngine/src/World/Components/Components.bf @@ -36,16 +36,6 @@ namespace GlitchyEngine.World } } - /// If an entity has the EditorComponent it won't be displayed in the scene hierarchy. - struct EditorComponent - { - bool b = false; - public this() - { - - } - } - [Component("Sprite Renderer")] struct SpriteRendererComponent { diff --git a/GlitchyEngine/src/World/Scene.bf b/GlitchyEngine/src/World/Scene.bf index 98f5c79..c35b294 100644 --- a/GlitchyEngine/src/World/Scene.bf +++ b/GlitchyEngine/src/World/Scene.bf @@ -143,7 +143,6 @@ namespace GlitchyEngine.World // Copy components CopyComponents(this, target); CopyComponents(this, target); - CopyComponents(this, target); CopyComponents(this, target); CopyComponents(this, target); CopyComponents(this, target); @@ -153,6 +152,8 @@ namespace GlitchyEngine.World CopyComponents(this, target); CopyComponents(this, target); CopyComponents(this, target); + + CopyComponents(this, target); if (copyScripts) { @@ -193,15 +194,30 @@ namespace GlitchyEngine.World Entity sourceEntity = .(sourceHandle, source); Entity targetEntity = target.GetEntityByID(sourceEntity.UUID); - targetEntity.AddComponent(*sourceComponent); + + if (targetEntity.TryGetComponent(let targetComponent)) + { + *targetComponent = *sourceComponent; + } + else + { + targetEntity.AddComponent(*sourceComponent); + } } } private static void CopyComponent(Entity source, Entity target) where TComponent : struct, new { - if (source.TryGetComponent(let component)) + if (source.TryGetComponent(let sourceComponent)) { - target.AddComponent(*component); + if (target.TryGetComponent(let targetComponent)) + { + *targetComponent = *sourceComponent; + } + else + { + target.AddComponent(*sourceComponent); + } } } @@ -901,7 +917,6 @@ namespace GlitchyEngine.World CopyComponent(original, copy); CopyComponent(original, copy); - CopyComponent(original, copy); CopyComponent(original, copy); CopyComponent(original, copy); CopyComponent(original, copy); @@ -911,6 +926,8 @@ namespace GlitchyEngine.World CopyComponent(original, copy); CopyComponent(original, copy); CopyComponent(original, copy); + + CopyComponent(original, copy); // Copy ScriptComponent... needs extra handling for the script instances if (original.TryGetComponent(let sourceScript)) diff --git a/GlitchyEngine/src/World/SceneSerializer.bf b/GlitchyEngine/src/World/SceneSerializer.bf index bf73355..4bd2a32 100644 --- a/GlitchyEngine/src/World/SceneSerializer.bf +++ b/GlitchyEngine/src/World/SceneSerializer.bf @@ -10,6 +10,7 @@ using GlitchyEngine.Renderer; using GlitchyEngine.Content; using GlitchyEngine.Scripting; using GlitchyEngine.Serialization; +using GlitchyEngine.World.Components; namespace GlitchyEngine.World; @@ -72,8 +73,7 @@ class SceneSerializer { Entity entity = .(e, _scene); - // TODO: also serialize object with EditorComponent (e.g. to save the location of the editor camera) - if (entity.HasComponent()) + if (entity.EditorFlags.HasFlag(.DontSave)) continue; SerializeEntity(writer, entity); @@ -113,8 +113,6 @@ class SceneSerializer { Serialize.Value(writer, "Id", entity.UUID); - SerializeComponent(writer, entity, "EditorComponent", scope (component) => {}); - SerializeComponent(writer, entity, "NameComponent", scope (component) => { Serialize.Value(writer, "Name", component.Name); @@ -245,41 +243,11 @@ class SceneSerializer _objectsNotWritten.Remove(entity.UUID); } + }); - //if (component.HasScript) - // TODO: Thats not a good check, I think. At least we know the script class is valid - //if (ScriptEngine.GetScriptClass(component.ScriptClassName) != null) - //{ - //Serialize.Value(writer, "Fields", ); - - // TODO: Serialize Script Instance! - /*let fields = ScriptEngine.GetScriptFieldMap(entity); - - writer.Identifier("Fields"); - - using (writer.ArrayBlock()) - { - for (var (fieldName, fieldInstance) in fields) - { - if (fieldInstance.Type == .None) - continue; - - switch (fieldInstance.Type) - { - case .Enum, .Class, .Struct: - // TODO: implement - default: - writer.Identifier(fieldName); - - String str = scope .(); - fieldInstance.Type.ToString(str); - writer.Type(str); - - Serialize.Value(writer, ValueView(fieldInstance.Type.GetBeefType(), &fieldInstance.[Friend]_data), gBonEnv); - } - } - }*/ - //} + SerializeComponent(writer, entity, "Editor", scope (component) => + { + Serialize.Value(writer, "Flags", component.Flags); }); } @@ -450,8 +418,6 @@ class SceneSerializer switch(identifier) { - case "EditorComponent": - Try!(DeserializeComponent(reader, entity, scope (component) => { return .Ok; })); case "NameComponent": Try!(DeserializeComponent(reader, entity, scope (component) => { @@ -698,6 +664,13 @@ class SceneSerializer SerializedObject.BonDeserialize(reader, _serializedObjects, gBonEnv); } + return .Ok; + })); + case "Editor": + Try!(DeserializeComponent(reader, entity, scope (component) => + { + Try!(Deserialize.Value(reader, "Flags", out component.Flags)); + return .Ok; })); default: diff --git a/ScriptCore/Editor/EditorFlags.cs b/ScriptCore/Editor/EditorFlags.cs index 7c2fc27..1181160 100644 --- a/ScriptCore/Editor/EditorFlags.cs +++ b/ScriptCore/Editor/EditorFlags.cs @@ -17,4 +17,8 @@ public enum EditorFlags : byte /// The entity is hidden in the scene. /// HideInScene = 2, + /// + /// The entity will not be saved. + /// + DontSave = 4 }