From c164aeecaa4a9a51030601832f8d4940812d4fc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Sat, 18 Mar 2023 23:30:41 +0100 Subject: [PATCH] Copy scene when entering play mode --- .../src/EditWindows/ComponentEditWindow.bf | 19 +-- .../src/EditWindows/EntityHierarchyWindow.bf | 10 +- GlitchyEditor/src/Editor.bf | 3 + GlitchyEditor/src/EditorLayer.bf | 73 ++++++--- GlitchyEngine/src/Content/ModelLoader.bf | 154 ------------------ GlitchyEngine/src/Renderer/Renderer2D.bf | 2 +- GlitchyEngine/src/World/Components.bf | 2 +- GlitchyEngine/src/World/DebugNameComponent.bf | 26 --- GlitchyEngine/src/World/Entity.bf | 6 + GlitchyEngine/src/World/NameComponent.bf | 27 +++ GlitchyEngine/src/World/ParentComponent.bf | 10 -- GlitchyEngine/src/World/Scene.bf | 77 +++++++-- GlitchyEngine/src/World/SceneSerializer.bf | 10 +- GlitchyEngine/src/World/TransformComponent.bf | 1 + 14 files changed, 172 insertions(+), 248 deletions(-) delete mode 100644 GlitchyEngine/src/World/DebugNameComponent.bf create mode 100644 GlitchyEngine/src/World/NameComponent.bf delete mode 100644 GlitchyEngine/src/World/ParentComponent.bf diff --git a/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf b/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf index 4bd6e44..961af47 100644 --- a/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf +++ b/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf @@ -60,7 +60,7 @@ namespace GlitchyEditor.EditWindows ShowComponentEditor("Transform", entity, => ShowTransformComponentEditor); ShowComponentEditor("Camera", entity, => ShowCameraComponentEditor, => ShowComponentContextMenu); - ShowComponentEditor("Sprite Renderer", entity, => ShowSpriteRendererComponentEditor, => ShowComponentContextMenu); + ShowComponentEditor("Sprite Renderer", entity, => ShowSpriteRendererComponentEditor, => ShowComponentContextMenu); ShowComponentEditor("Mesh Renderer", entity, => ShowMeshRendererComponentEditor, => ShowComponentContextMenu); ShowComponentEditor("Light", entity, => ShowLightComponentEditor, => ShowComponentContextMenu); ShowComponentEditor("Mesh", entity, => ShowMeshComponentEditor, => ShowComponentContextMenu); @@ -117,18 +117,18 @@ namespace GlitchyEditor.EditWindows private static void ShowNameComponentEditor(Entity entity) { - if (!entity.HasComponent()) + if (!entity.HasComponent()) return; char8[256] nameBuffer = default; - DebugNameComponent* component = entity.GetComponent(); + NameComponent* component = entity.GetComponent(); - String name = null; + StringView name = null; if(component != null) { - name = component.DebugName; + name = component.Name; } else { @@ -142,11 +142,10 @@ namespace GlitchyEditor.EditWindows { if(component == null) { - component = entity.AddComponent(); + component = entity.AddComponent(); } - component.DebugName.Clear(); - component.DebugName.Append(&nameBuffer); + component.Name = StringView(&nameBuffer); } } @@ -250,7 +249,7 @@ namespace GlitchyEditor.EditWindows } } - private static void ShowSpriteRendererComponentEditor(Entity entity, SpriterRendererComponent* spriteRendererComponent) + private static void ShowSpriteRendererComponentEditor(Entity entity, SpriteRendererComponent* spriteRendererComponent) { ColorRGBA spriteColor = ColorRGBA.LinearToSRGB(spriteRendererComponent.Color); if (ImGui.ColorEdit4("Color", ref spriteColor)) @@ -548,7 +547,7 @@ namespace GlitchyEditor.EditWindows ImGui.Separator(); ShowComponentButton("Camera"); - ShowComponentButton("Sprite Renderer"); + ShowComponentButton("Sprite Renderer"); ShowComponentButton("Light"); ShowComponentButton("Rigidbody 2D"); ShowComponentButton("Box collider 2D"); diff --git a/GlitchyEditor/src/EditWindows/EntityHierarchyWindow.bf b/GlitchyEditor/src/EditWindows/EntityHierarchyWindow.bf index b8d4268..b969fd6 100644 --- a/GlitchyEditor/src/EditWindows/EntityHierarchyWindow.bf +++ b/GlitchyEditor/src/EditWindows/EntityHierarchyWindow.bf @@ -301,11 +301,11 @@ namespace GlitchyEditor.EditWindows { String name = null; - var nameComponent = tree.Value.GetComponent(); + var nameComponent = tree.Value.GetComponent(); if(nameComponent != null) { - name = nameComponent.DebugName; + name = scope:: .(nameComponent.Name); } else { @@ -501,13 +501,13 @@ namespace GlitchyEditor.EditWindows { Entity entity = .(entityId, _scene); - String name = null; + StringView name = null; - var nameComponent = entity.GetComponent(); + var nameComponent = entity.GetComponent(); if(nameComponent != null) { - name = nameComponent.DebugName; + name = nameComponent.Name; } else { diff --git a/GlitchyEditor/src/Editor.bf b/GlitchyEditor/src/Editor.bf index af374f1..e9bb3c0 100644 --- a/GlitchyEditor/src/Editor.bf +++ b/GlitchyEditor/src/Editor.bf @@ -26,6 +26,9 @@ namespace GlitchyEditor get => _scene; set { + if (_scene == value) + return; + _scene = value; _entityHierarchyWindow.SetContext(_scene); } diff --git a/GlitchyEditor/src/EditorLayer.bf b/GlitchyEditor/src/EditorLayer.bf index 45617aa..0641514 100644 --- a/GlitchyEditor/src/EditorLayer.bf +++ b/GlitchyEditor/src/EditorLayer.bf @@ -27,7 +27,9 @@ namespace GlitchyEditor BlendState _opaqueBlendState ~ _.ReleaseRef(); DepthStencilState _depthStencilState ~ _.ReleaseRef(); - Scene _scene ~ delete _; + Scene _activeScene ~ _?.ReleaseRef(); + Scene _editorScene ~ _?.ReleaseRef(); + String _sceneFilePath = new String() ~ delete _; public String SceneFilePath @@ -78,7 +80,8 @@ namespace GlitchyEditor InitGraphics(); - _scene = new Scene(); + _editorScene = new Scene(); + SetReference!(_activeScene, _editorScene); _camera = EditorCamera(Vector3(3.5f, 1.25f, 2.75f), Quaternion.FromEulerAngles(MathHelper.ToRadians(40), MathHelper.ToRadians(25), 0), MathHelper.ToRadians(75), 0.1f, 1); _camera.RenderTarget = _cameraTarget; @@ -163,7 +166,7 @@ namespace GlitchyEditor private void InitEditor() { - _editor = new Editor(_scene, _contentManager); + _editor = new Editor(_editorScene, _contentManager); _editor.SceneViewportWindow.ViewportSizeChanged.Add(new (s, e) => ViewportSizeChanged(s, e)); _editor.CurrentCamera = &_camera; @@ -176,6 +179,8 @@ namespace GlitchyEditor { _camera.Update(gameTime); + _editor.CurrentScene = _activeScene; + // Clear the swapchain-buffer RenderCommand.Clear(null, .Color | .Depth, .(0.2f, 0.2f, 0.2f), 1.0f, 0); @@ -185,9 +190,9 @@ namespace GlitchyEditor RenderCommand.SetDepthStencilState(_depthStencilState); if (_sceneState == .Edit) - _scene.UpdateEditor(gameTime, _camera, _viewportTarget, scope => DebugDraw3D, scope => DebugDraw2D); + _activeScene.UpdateEditor(gameTime, _camera, _viewportTarget, scope => DebugDraw3D, scope => DebugDraw2D); else if (_sceneState == .Play) - _scene.UpdateRuntime(gameTime, _viewportTarget); + _activeScene.UpdateRuntime(gameTime, _viewportTarget); RenderCommand.UnbindRenderTargets(); RenderCommand.SetRenderTarget(null, 0, true); @@ -226,9 +231,9 @@ namespace GlitchyEditor return Math.Clamp(1.5f - Vector3.Distance(_editor.CurrentCamera.Position, pos) / 50, 0, 1); } - for (var (entity, transform, camera) in _scene.[Friend]_ecsWorld.Enumerate()) + for (var (entity, transform, camera) in _activeScene.[Friend]_ecsWorld.Enumerate()) { - if (_editor.EntityHierarchyWindow.SelectedEntities.Contains(.(entity, _scene))) + if (_editor.EntityHierarchyWindow.SelectedEntities.Contains(.(entity, _activeScene))) { DebugRenderer.DrawViewFrustum(transform.WorldTransform, camera.Camera.Projection, _camera.Projection * _camera.View, .White); } @@ -240,9 +245,9 @@ namespace GlitchyEditor //Renderer2D.DrawQuad(world, _iconCamera, .White, .(0, 0, 1, 1), entity.Index); } - for (var (entity, transform, light) in _scene.[Friend]_ecsWorld.Enumerate()) + for (var (entity, transform, light) in _activeScene.[Friend]_ecsWorld.Enumerate()) { - if (_editor.EntityHierarchyWindow.SelectedEntities.Contains(.(entity, _scene))) + if (_editor.EntityHierarchyWindow.SelectedEntities.Contains(.(entity, _activeScene))) { Renderer.DrawRay(.Zero, .(0, 0, 20), ColorRGBA(light.SceneLight.Color, 1.0f), transform.WorldTransform); @@ -343,18 +348,30 @@ namespace GlitchyEditor private void OnScenePlay() { - _sceneState = .Play; _editor.SceneViewportWindow.EditorMode = false; + _sceneState = .Play; - _scene.OnRuntimeStart(); + using (Scene runtimeScene = new Scene()) + { + _editorScene.CopyTo(runtimeScene); + + runtimeScene.OnRuntimeStart(); + + SetReference!(_activeScene, runtimeScene); + } + + _editor.CurrentScene = _activeScene; } private void OnSceneStop() { - _scene.OnRuntimeStop(); + _activeScene.OnRuntimeStop(); + SetReference!(_activeScene, _editorScene); _editor.SceneViewportWindow.EditorMode = true; _sceneState = .Edit; + + _editor.CurrentScene = _activeScene; } // Just for testing @@ -488,13 +505,17 @@ namespace GlitchyEditor /// Creates a new scene. private void NewScene() { + OnSceneStop(); + SceneFilePath = null; - - delete _scene; - _scene = new Scene(); - _editor.CurrentScene = _scene; + + _editorScene.ReleaseRef(); + _editorScene = new Scene(); + _editor.CurrentScene = _editorScene; var vpSize = _editor.SceneViewportWindow.ViewportSize; - _scene.OnViewportResize((.)vpSize.X, (.)vpSize.Y); + _editorScene.OnViewportResize((.)vpSize.X, (.)vpSize.Y); + + SetReference!(_activeScene, _editorScene); _camera.Position = .(-1.5f, 1.5f, -2.5f); _camera.RotationEuler = .(MathHelper.ToRadians(25), MathHelper.ToRadians(35), 0); @@ -530,7 +551,7 @@ namespace GlitchyEditor return; } - SceneSerializer serializer = scope .(_scene); + SceneSerializer serializer = scope .(_editorScene); serializer.Serialize(SceneFilePath); } @@ -565,16 +586,20 @@ namespace GlitchyEditor /// Loads the given scene file. private void LoadSceneFile(StringView filename) { + OnSceneStop(); + SceneFilePath = scope String(filename); - delete _scene; - _scene = new Scene(); - _editor.CurrentScene = _scene; + _editorScene.ReleaseRef(); + _editorScene = new Scene(); + _editor.CurrentScene = _editorScene; var vpSize = _editor.SceneViewportWindow.ViewportSize; - _scene.OnViewportResize((.)vpSize.X, (.)vpSize.Y); + _editorScene.OnViewportResize((.)vpSize.X, (.)vpSize.Y); - SceneSerializer serializer = scope .(_scene); + SceneSerializer serializer = scope .(_editorScene); serializer.Deserialize(SceneFilePath); + + SetReference!(_activeScene, _editorScene); } private void DrawMainMenuBar() @@ -648,7 +673,7 @@ namespace GlitchyEditor _viewportTarget.Resize(sizeX, sizeY); _cameraTarget.Resize(sizeX, sizeY); - _scene.OnViewportResize(sizeX, sizeY); + _activeScene.OnViewportResize(sizeX, sizeY); _camera.OnViewportResize(sizeX, sizeY); } diff --git a/GlitchyEngine/src/Content/ModelLoader.bf b/GlitchyEngine/src/Content/ModelLoader.bf index 69eec26..11bce1c 100644 --- a/GlitchyEngine/src/Content/ModelLoader.bf +++ b/GlitchyEngine/src/Content/ModelLoader.bf @@ -229,160 +229,6 @@ namespace GlitchyEngine.Content return .Success; } - /*public static EcsEntity LoadModel(String filename, Material material, EcsWorld world, - List outClips, StringView entityName = StringView()) - { - CGLTF.Options options = .(); - CGLTF.Data* data; - CGLTF.Result result = CGLTF.ParseFile(options, filename, out data); - - Log.EngineLogger.Assert(result == .Success, "Failed to load model."); - - result = CGLTF.LoadBuffers(options, data, filename); - - Log.EngineLogger.Assert(result == .Success, "Failed to load buffers"); - - (EcsEntity entity, ?) = CreateEntity(world, entityName, .InvalidEntity); - - for(var node in data.Scenes[0].Nodes) - { - NodesToEntities(data, node, entity, world, material, outClips); - } - - CGLTF.Free(data); - - return entity; - }*/ - - private static (EcsEntity Entity, TransformComponent* Transform) CreateEntity(EcsWorld world, StringView? name, EcsEntity parent) - { - EcsEntity entity = world.NewEntity(); - - var nameComponent = world.AssignComponent(entity); - - if (name != null && name.Value.Ptr != null) - { - nameComponent.SetName(name.Value); - } - else - { - nameComponent.SetName("Unnamed Node"); - } - - /////TODO: !!!!!!!!REPORT!!!!!!!!!!!!! - // This works - TransformComponent cmp = .(); - var childTransform = world.AssignComponent(entity, cmp); - // This trashes the stack - //var childTransform = world.AssignComponent(entity); - childTransform.Parent = parent; - - return (entity, childTransform); - } - - /*private static void NodesToEntities(CGLTF.Data* data, CGLTF.Node* node, EcsEntity parentEntity, EcsWorld world, Material material, List clips) - { - (EcsEntity entity, TransformComponent* childTransform) = CreateEntity(world, node.Name == null ? null : StringView(node.Name), parentEntity); - - if(node.HasMatrix) - { - childTransform.LocalTransform = *(Matrix*)&node.Matrix; - } - else - { - if(node.HasTranslation) - childTransform.Position = *(Vector3*)&node.Translation; - else - childTransform.Position = .Zero; - - if(node.HasRotation) - childTransform.Rotation = *(Quaternion*)&node.Rotation; - else - childTransform.Rotation = .Identity; - - if(node.HasScale) - childTransform.Scale = *(Vector3*)&node.Scale; - else - childTransform.Scale = .(1, 1, 1); - } - - // Invert the Z-Axis of the root Node to convert the coordinate system from right-handed to left-handed - if(parentEntity == .InvalidEntity) - childTransform.Scale *= .(1, 1, -1); - - Skeleton skeleton = null; - - if(node.Skin != null) - { - skeleton = ExtractSkeleton(node.Skin); - - LoadAnimationClips(data, node.Skin, skeleton, clips); - } - - if(node.Mesh != null) - { - // If we have only one primitive, add it directly to the entity - if(node.Mesh.Primitives.Length == 1) - { - var mesh = world.AssignComponent(entity); - - using (var geo = PrimitiveToGeoBinding(node.Mesh.Primitives[0])) - { - mesh.Mesh = Content.ManageAsset(geo); - } - - if(skeleton == null) - { - var meshRenderer = world.AssignComponent(entity); - meshRenderer.Material = material.Handle; - } - else - { - var meshRenderer = world.AssignComponent(entity); - meshRenderer.Material = material; - meshRenderer.Skeleton = skeleton; - } - } - // otherwise one child-entity per primitive - else - { - for(var primitive in node.Mesh.Primitives) - { - EcsEntity meshEntity = world.NewEntity(); - - var meshParent = world.AssignComponent(meshEntity); - meshParent.Entity = entity; - - var mesh = world.AssignComponent(meshEntity); - - using (var geo = PrimitiveToGeoBinding(primitive)) - { - mesh.Mesh = Content.ManageAsset(geo); - } - - if(skeleton == null) - { - var meshRenderer = world.AssignComponent(meshEntity); - meshRenderer.Material = material.Handle; - } - else - { - var meshRenderer = world.AssignComponent(meshEntity); - meshRenderer.Material = material; - meshRenderer.Skeleton = skeleton; - } - } - } - } - - skeleton?.ReleaseRef(); - - for(var child in node.Children) - { - NodesToEntities(data, child, entity, world, material, clips); - } - }*/ - public static GeometryBinding PrimitiveToGeoBinding(CGLTF.Primitive primitive) { GeometryBinding binding = new GeometryBinding(); diff --git a/GlitchyEngine/src/Renderer/Renderer2D.bf b/GlitchyEngine/src/Renderer/Renderer2D.bf index 24f3a21..ff461b1 100644 --- a/GlitchyEngine/src/Renderer/Renderer2D.bf +++ b/GlitchyEngine/src/Renderer/Renderer2D.bf @@ -873,7 +873,7 @@ namespace GlitchyEngine.Renderer } } - public static void DrawSprite(Matrix transform, SpriterRendererComponent* spriteRenderer, uint32 entityId) + public static void DrawSprite(Matrix transform, SpriteRendererComponent* spriteRenderer, uint32 entityId) { if (spriteRenderer.IsCircle) DrawCircle(transform, spriteRenderer.Sprite.Get() ?? s_whiteTexture, spriteRenderer.Color, 1.0f, spriteRenderer.UvTransform, entityId); diff --git a/GlitchyEngine/src/World/Components.bf b/GlitchyEngine/src/World/Components.bf index 400c7af..274f3bc 100644 --- a/GlitchyEngine/src/World/Components.bf +++ b/GlitchyEngine/src/World/Components.bf @@ -45,7 +45,7 @@ namespace GlitchyEngine.World } [Component("Sprite Renderer")] - struct SpriterRendererComponent// : IDisposableComponent + struct SpriteRendererComponent// : IDisposableComponent { private AssetHandle _sprite = .Invalid; diff --git a/GlitchyEngine/src/World/DebugNameComponent.bf b/GlitchyEngine/src/World/DebugNameComponent.bf deleted file mode 100644 index f2c86bf..0000000 --- a/GlitchyEngine/src/World/DebugNameComponent.bf +++ /dev/null @@ -1,26 +0,0 @@ -using System; -namespace GlitchyEngine.World -{ - struct DebugNameComponent : IDisposableComponent - { - private String _debugName; - - public String DebugName - { - get => _debugName; - set mut => SetName(value); - } - - public void SetName(StringView name) mut - { - delete _debugName; - - _debugName = new String(name); - } - - public void Dispose() mut - { - DeleteAndNullify!(_debugName); - } - } -} diff --git a/GlitchyEngine/src/World/Entity.bf b/GlitchyEngine/src/World/Entity.bf index c7a7910..2b3e302 100644 --- a/GlitchyEngine/src/World/Entity.bf +++ b/GlitchyEngine/src/World/Entity.bf @@ -66,6 +66,12 @@ namespace GlitchyEngine.World public UUID UUID => GetComponent().ID; + public StringView Name + { + get => GetComponent().Name; + set => GetComponent().Name = value; + } + public TransformComponent* Transform => GetComponent(); public T* AddComponent(T value = T()) where T: struct, new diff --git a/GlitchyEngine/src/World/NameComponent.bf b/GlitchyEngine/src/World/NameComponent.bf new file mode 100644 index 0000000..b1aecb0 --- /dev/null +++ b/GlitchyEngine/src/World/NameComponent.bf @@ -0,0 +1,27 @@ +using System; +namespace GlitchyEngine.World +{ + struct NameComponent : IDisposableComponent + { + private String _name; + + public StringView Name + { + get => _name; + set mut => SetName(value); + } + + public void SetName(StringView name) mut + { + if (_name == null) + _name = new String(name); + else + _name.Set(name); + } + + public void Dispose() mut + { + DeleteAndNullify!(_name); + } + } +} diff --git a/GlitchyEngine/src/World/ParentComponent.bf b/GlitchyEngine/src/World/ParentComponent.bf deleted file mode 100644 index ef5e821..0000000 --- a/GlitchyEngine/src/World/ParentComponent.bf +++ /dev/null @@ -1,10 +0,0 @@ -namespace GlitchyEngine.World -{ - /** - * A Component that allows to specify a parent entity. - */ - public struct ParentComponent - { - public EcsEntity Entity; - } -} diff --git a/GlitchyEngine/src/World/Scene.bf b/GlitchyEngine/src/World/Scene.bf index 1d0666a..5cc9e65 100644 --- a/GlitchyEngine/src/World/Scene.bf +++ b/GlitchyEngine/src/World/Scene.bf @@ -11,7 +11,7 @@ namespace GlitchyEngine.World using internal ScriptableEntity; using internal GlitchyEngine.World; - class Scene + class Scene : RefCounter { internal EcsWorld _ecsWorld = new .() ~ delete _; @@ -26,6 +26,8 @@ namespace GlitchyEngine.World private AssetHandle _gammaCorrectEffect; + private uint32 _viewportWidth, _viewportHeight; + // Maps ids to the entities they represent. private Dictionary _idToEntity = new .() ~ delete _; @@ -56,7 +58,7 @@ namespace GlitchyEngine.World _onComponentAddedHandlers.Add(typeof(CameraComponent), (e, t, c) => { CameraComponent* cameraComponent = (.)c; - cameraComponent.Camera.SetViewportSize(e.Scene.ViewportWidth, e.Scene.ViewportHeight); + cameraComponent.Camera.SetViewportSize(e.Scene._viewportWidth, e.Scene._viewportHeight); }); RenderTargetGroupDescription desc = .(100, 100, @@ -82,6 +84,59 @@ namespace GlitchyEngine.World public ~this() { } + + public void CopyTo(Scene target) + { + // Copy entities + for (let sourceHandle in _ecsWorld.Enumerate()) + { + Entity sourceEntity = .(sourceHandle, this); + + target.CreateEntity(sourceEntity.Name, sourceEntity.UUID); + } + + // TODO: perhaps use reflection and comptime + // Copy components + //CopyComponents(this, target); /* Parent will be copied below*/ + CopyComponents(this, target); + CopyComponents(this, target); + CopyComponents(this, target); + CopyComponents(this, target); + CopyComponents(this, target); + CopyComponents(this, target); + CopyComponents(this, target); + CopyComponents(this, target); + CopyComponents(this, target); + + // Copy transforms + for (let (sourceHandle, sourceTransform) in _ecsWorld.Enumerate()) + { + Entity sourceEntity = Entity(sourceHandle, this); + Entity sourceParent = Entity(sourceTransform.Parent, this); + + Entity targetEntity = target.GetEntityByID(sourceEntity.UUID); + *targetEntity.Transform = *sourceTransform; + + if (sourceParent.IsValid) + { + Entity targetParent = target.GetEntityByID(sourceParent.UUID); + targetEntity.Parent = targetParent; + } + } + + target.OnViewportResize(_viewportWidth, _viewportHeight); + } + + private static void CopyComponents(Scene source, Scene target) where TComponent : struct, new + { + for (let (sourceHandle, sourceComponent) in source._ecsWorld.Enumerate()) + { + Entity sourceEntity = .(sourceHandle, source); + + Entity targetEntity = target.GetEntityByID(sourceEntity.UUID); + targetEntity.AddComponent(*sourceComponent); + } + } b2Vec2 _gravity2D = .(0.0f, -9.8f); @@ -256,7 +311,7 @@ namespace GlitchyEngine.World // Sprite renderer Renderer2D.BeginScene(*primaryCamera, primaryCameraTransform, .BackToFront); - for (var (entity, transform, sprite) in _ecsWorld.Enumerate()) + for (var (entity, transform, sprite) in _ecsWorld.Enumerate()) { Renderer2D.DrawSprite(transform.WorldTransform, sprite, entity.Index); } @@ -469,7 +524,7 @@ namespace GlitchyEngine.World // Sprite renderer Renderer2D.BeginScene(camera, .BackToFront); - for (var (entity, transform, sprite) in _ecsWorld.Enumerate()) + for (var (entity, transform, sprite) in _ecsWorld.Enumerate()) { Renderer2D.DrawSprite(transform.WorldTransform, sprite, entity.Index); } @@ -502,12 +557,12 @@ namespace GlitchyEngine.World } /// Creates a new Entity with the given name. - public Entity CreateEntity(String name = "", UUID id = default) + public Entity CreateEntity(StringView name = "", UUID id = default) { Entity entity = Entity(_ecsWorld.NewEntity(), this); entity.AddComponent(); - let nameComponent = entity.AddComponent(); + let nameComponent = entity.AddComponent(); nameComponent.SetName(name.IsEmpty ? "Entity" : name); // If no id is given generate a random one. @@ -549,13 +604,11 @@ namespace GlitchyEngine.World return .Err; } - private uint32 ViewportWidth, ViewportHeight; - /// Sets the size of the viewport into which the scene will be rendered. public void OnViewportResize(uint32 width, uint32 height) { - ViewportWidth = width; - ViewportHeight = height; + _viewportWidth = width; + _viewportHeight = height; for (var (entity, cameraComponent) in _ecsWorld.Enumerate()) { @@ -565,8 +618,8 @@ namespace GlitchyEngine.World } } - _compositeTarget.Resize(ViewportWidth, ViewportHeight); - _cameraTarget.Resize(ViewportWidth, ViewportHeight); + _compositeTarget.Resize(_viewportWidth, _viewportHeight); + _cameraTarget.Resize(_viewportWidth, _viewportHeight); } private void OnComponentAdded(Entity entity, Type componentType, void* component) diff --git a/GlitchyEngine/src/World/SceneSerializer.bf b/GlitchyEngine/src/World/SceneSerializer.bf index e23d8be..c23c41a 100644 --- a/GlitchyEngine/src/World/SceneSerializer.bf +++ b/GlitchyEngine/src/World/SceneSerializer.bf @@ -79,12 +79,12 @@ class SceneSerializer SerializeComponent(writer, entity, "EditorComponent", scope (component) => {}); - SerializeComponent(writer, entity, "NameComponent", scope (component) => + SerializeComponent(writer, entity, "NameComponent", scope (component) => { - Serialize.Value(writer, "Name", component.DebugName); + Serialize.Value(writer, "Name", component.Name); }); - SerializeComponent(writer, entity, "SpriterRendererComponent", scope (component) => + SerializeComponent(writer, entity, "SpriterRendererComponent", scope (component) => { Serialize.Value(writer, "Color", component.Color); Serialize.Value(writer, "IsCircle", component.IsCircle); @@ -317,7 +317,7 @@ class SceneSerializer case "EditorComponent": Try!(DeserializeComponent(reader, entity, scope (component) => { return .Ok; })); case "NameComponent": - Try!(DeserializeComponent(reader, entity, scope (component) => + Try!(DeserializeComponent(reader, entity, scope (component) => { String name; @@ -330,7 +330,7 @@ class SceneSerializer return .Ok; })); case "SpriterRendererComponent": - Try!(DeserializeComponent(reader, entity, scope (component) => + Try!(DeserializeComponent(reader, entity, scope (component) => { Try!(Deserialize.Value(reader, "Color", out component.Color)); reader.EntryEnd(); diff --git a/GlitchyEngine/src/World/TransformComponent.bf b/GlitchyEngine/src/World/TransformComponent.bf index 808287d..21e919f 100644 --- a/GlitchyEngine/src/World/TransformComponent.bf +++ b/GlitchyEngine/src/World/TransformComponent.bf @@ -20,6 +20,7 @@ namespace GlitchyEngine.World /// The frame when the transform was recalculated public uint Frame; + // TODO: probably use UUID public EcsEntity Parent { get => _parent;