diff --git a/GlitchyEditor/content/Scenes/physics2D.scene b/GlitchyEditor/content/Scenes/physics2D.scene index ccb3ee2..8744796 100644 --- a/GlitchyEditor/content/Scenes/physics2D.scene +++ b/GlitchyEditor/content/Scenes/physics2D.scene @@ -9,11 +9,10 @@ SpriteRendererComponent = { Color = { R = 0, - G = 0.5511778, - B = 0.32878691, + G = 0.55117774, + B = 0.32878688, A = 1 }, - IsCircle = false, Sprite = "Textures/TestMat/rustediron2_albedo.png", UvTransform = { X = 0, @@ -72,11 +71,10 @@ SpriteRendererComponent = { Color = { R = 1, - G = 0.941886246, - B = 0.401484907, + G = 0.941886365, + B = 0.401484847, A = 1 }, - IsCircle = false, Sprite = "", UvTransform = { X = 0, @@ -164,7 +162,7 @@ OrthographicHeight = 10, OrthographicNearPlane = 0, OrthographicFarPlane = 10, - AspectRatio = 2.19888878, + AspectRatio = 3.22169805, FixedAspectRatio = false } }, @@ -173,14 +171,14 @@ NameComponent = { Name = "Circle" }, - SpriteRendererComponent = { + CircleRendererComponent = { Color = { - R = 0.299884498, - G = 0.972924948, - B = 1, + R = 1, + G = 0, + B = 0, A = 1 }, - IsCircle = true, + InnerRadius = 0.300000012, Sprite = "", UvTransform = { X = 0, @@ -191,8 +189,8 @@ }, TransformComponent = { Position = { - X = -0.12120305, - Y = 0.660160244, + X = -0.12120308, + Y = 0.660160363, Z = 0 }, Rotation = { @@ -251,9 +249,9 @@ Z = 1 }, EditorEulerRotation = { - X = 1.09089446, + X = 1.0908947, Y = -0.340793997, - Z = 0.160857946 + Z = 0.160857916 } }, LightComponent = { @@ -262,7 +260,7 @@ Color = { R = 0.985467017, G = 1, - B = 0.569978774 + B = 0.569978654 } } }, diff --git a/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf b/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf index 961af47..54c48f7 100644 --- a/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf +++ b/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf @@ -61,6 +61,7 @@ namespace GlitchyEditor.EditWindows ShowComponentEditor("Transform", entity, => ShowTransformComponentEditor); ShowComponentEditor("Camera", entity, => ShowCameraComponentEditor, => ShowComponentContextMenu); ShowComponentEditor("Sprite Renderer", entity, => ShowSpriteRendererComponentEditor, => ShowComponentContextMenu); + ShowComponentEditor("Circle Renderer", entity, => ShowCircleRendererComponentEditor, => ShowComponentContextMenu); ShowComponentEditor("Mesh Renderer", entity, => ShowMeshRendererComponentEditor, => ShowComponentContextMenu); ShowComponentEditor("Light", entity, => ShowLightComponentEditor, => ShowComponentContextMenu); ShowComponentEditor("Mesh", entity, => ShowMeshComponentEditor, => ShowComponentContextMenu); @@ -275,8 +276,36 @@ namespace GlitchyEditor.EditWindows ImGui.EditVector<4>("UV Transform", ref *(float[4]*)&spriteRendererComponent.UvTransform); + } - ImGui.Checkbox("Is Circle", &spriteRendererComponent.IsCircle); + private static void ShowCircleRendererComponentEditor(Entity entity, CircleRendererComponent* circleRendererComponent) + { + ColorRGBA spriteColor = ColorRGBA.LinearToSRGB(circleRendererComponent.Color); + if (ImGui.ColorEdit4("Color", ref spriteColor)) + circleRendererComponent.Color = ColorRGBA.SRgbToLinear(spriteColor); + + ImGui.Button("Texture"); + + if (ImGui.BeginDragDropTarget()) + { + ImGui.Payload* payload = ImGui.AcceptDragDropPayload("CONTENT_BROWSER_ITEM"); + + if (payload != null) + { + Log.EngineLogger.Warning(""); + + StringView path = .((char8*)payload.Data, (int)payload.DataSize); + + circleRendererComponent.Sprite = Content.LoadAsset(path); + } + + ImGui.EndDragDropTarget(); + } + + + ImGui.EditVector<4>("UV Transform", ref *(float[4]*)&circleRendererComponent.UvTransform); + + ImGui.DragFloat("Inner Radius", &circleRendererComponent.InnerRadius, 0.1f, 0.0f, 1.0f); } private static void ShowMeshRendererComponentEditor(Entity entity, MeshRendererComponent* meshRendererComponent) @@ -548,6 +577,7 @@ namespace GlitchyEditor.EditWindows ShowComponentButton("Camera"); ShowComponentButton("Sprite Renderer"); + ShowComponentButton("Circle Renderer"); ShowComponentButton("Light"); ShowComponentButton("Rigidbody 2D"); ShowComponentButton("Box collider 2D"); diff --git a/GlitchyEngine/src/Renderer/Renderer2D.bf b/GlitchyEngine/src/Renderer/Renderer2D.bf index ff461b1..7c053c7 100644 --- a/GlitchyEngine/src/Renderer/Renderer2D.bf +++ b/GlitchyEngine/src/Renderer/Renderer2D.bf @@ -875,10 +875,12 @@ namespace GlitchyEngine.Renderer 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); - else - DrawQuad(transform, spriteRenderer.Sprite.Get() ?? s_whiteTexture, spriteRenderer.Color, spriteRenderer.UvTransform, entityId); + DrawQuad(transform, spriteRenderer.Sprite.Get() ?? s_whiteTexture, spriteRenderer.Color, spriteRenderer.UvTransform, entityId); + } + + public static void DrawCircle(Matrix transform, CircleRendererComponent* spriteRenderer, uint32 entityId) + { + DrawCircle(transform, spriteRenderer.Sprite.Get() ?? s_whiteTexture, spriteRenderer.Color, spriteRenderer.InnerRadius, spriteRenderer.UvTransform, entityId); } // Textured quad pivot diff --git a/GlitchyEngine/src/World/AnimationComponent.bf b/GlitchyEngine/src/World/Components/AnimationComponent.bf similarity index 100% rename from GlitchyEngine/src/World/AnimationComponent.bf rename to GlitchyEngine/src/World/Components/AnimationComponent.bf diff --git a/GlitchyEngine/src/World/Components.bf b/GlitchyEngine/src/World/Components/Components.bf similarity index 95% rename from GlitchyEngine/src/World/Components.bf rename to GlitchyEngine/src/World/Components/Components.bf index bbfb816..90108d8 100644 --- a/GlitchyEngine/src/World/Components.bf +++ b/GlitchyEngine/src/World/Components/Components.bf @@ -22,7 +22,7 @@ namespace GlitchyEngine.World { public readonly UUID ID; - /// Create aa new IDComponent with a random UUID. + /// Create a new IDComponent with a random UUID. public this() { ID = UUID(); @@ -52,7 +52,25 @@ namespace GlitchyEngine.World public ColorRGBA Color = .White; public Vector4 UvTransform = .(0, 0, 1, 1); - public bool IsCircle = false; + public this() + { + } + + public this(ColorRGBA color) + { + Color = color; + } + } + + [Component("Circle Renderer")] + struct CircleRendererComponent + { + public AssetHandle Sprite = .Invalid; + + public ColorRGBA Color = .White; + public Vector4 UvTransform = .(0, 0, 1, 1); + + public float InnerRadius = 0.0f; public this() { @@ -62,11 +80,6 @@ namespace GlitchyEngine.World { Color = color; } - - /*public void Dispose() - { - _sprite?.ReleaseRef(); - }*/ } struct SceneCamera : Camera diff --git a/GlitchyEngine/src/World/IDisposableComponent.bf b/GlitchyEngine/src/World/Components/IDisposableComponent.bf similarity index 100% rename from GlitchyEngine/src/World/IDisposableComponent.bf rename to GlitchyEngine/src/World/Components/IDisposableComponent.bf diff --git a/GlitchyEngine/src/World/MeshRendererComponent.bf b/GlitchyEngine/src/World/Components/MeshRendererComponent.bf similarity index 100% rename from GlitchyEngine/src/World/MeshRendererComponent.bf rename to GlitchyEngine/src/World/Components/MeshRendererComponent.bf diff --git a/GlitchyEngine/src/World/NameComponent.bf b/GlitchyEngine/src/World/Components/NameComponent.bf similarity index 59% rename from GlitchyEngine/src/World/NameComponent.bf rename to GlitchyEngine/src/World/Components/NameComponent.bf index b1aecb0..1b7a7d3 100644 --- a/GlitchyEngine/src/World/NameComponent.bf +++ b/GlitchyEngine/src/World/Components/NameComponent.bf @@ -8,15 +8,13 @@ namespace GlitchyEngine.World 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); + set mut + { + if (_name == null) + _name = new String(value); + else + _name.Set(value); + } } public void Dispose() mut diff --git a/GlitchyEngine/src/World/SkinnedMeshRendererComponent.bf b/GlitchyEngine/src/World/Components/SkinnedMeshRendererComponent.bf similarity index 100% rename from GlitchyEngine/src/World/SkinnedMeshRendererComponent.bf rename to GlitchyEngine/src/World/Components/SkinnedMeshRendererComponent.bf diff --git a/GlitchyEngine/src/World/TransformComponent.bf b/GlitchyEngine/src/World/Components/TransformComponent.bf similarity index 100% rename from GlitchyEngine/src/World/TransformComponent.bf rename to GlitchyEngine/src/World/Components/TransformComponent.bf diff --git a/GlitchyEngine/src/World/Scene.bf b/GlitchyEngine/src/World/Scene.bf index b92249a..df80b3b 100644 --- a/GlitchyEngine/src/World/Scene.bf +++ b/GlitchyEngine/src/World/Scene.bf @@ -94,6 +94,7 @@ namespace GlitchyEngine.World CopyComponents(this, target); CopyComponents(this, target); CopyComponents(this, target); + CopyComponents(this, target); CopyComponents(this, target); CopyComponents(this, target); CopyComponents(this, target); @@ -309,6 +310,11 @@ namespace GlitchyEngine.World Renderer2D.DrawSprite(transform.WorldTransform, sprite, entity.Index); } + for (var (entity, transform, circle) in _ecsWorld.Enumerate()) + { + Renderer2D.DrawCircle(transform.WorldTransform, circle, entity.Index); + } + Renderer2D.EndScene(); // Gamma correct composit target and draw it into viewport @@ -372,6 +378,11 @@ namespace GlitchyEngine.World Renderer2D.DrawSprite(transform.WorldTransform, sprite, entity.Index); } + for (var (entity, transform, circle) in _ecsWorld.Enumerate()) + { + Renderer2D.DrawCircle(transform.WorldTransform, circle, entity.Index); + } + Renderer2D.EndScene(); Renderer2D.BeginScene(camera, .BackToFront); @@ -406,7 +417,7 @@ namespace GlitchyEngine.World entity.AddComponent(); let nameComponent = entity.AddComponent(); - nameComponent.SetName(name.IsEmpty ? "Entity" : name); + nameComponent.Name = (name.IsEmpty ? "Entity" : name); // If no id is given generate a random one. IDComponent idComponent = (id == default) ? IDComponent() : IDComponent(id); diff --git a/GlitchyEngine/src/World/SceneSerializer.bf b/GlitchyEngine/src/World/SceneSerializer.bf index 8663dd4..6c40bed 100644 --- a/GlitchyEngine/src/World/SceneSerializer.bf +++ b/GlitchyEngine/src/World/SceneSerializer.bf @@ -87,10 +87,14 @@ class SceneSerializer SerializeComponent(writer, entity, "SpriteRendererComponent", scope (component) => { Serialize.Value(writer, "Color", component.Color); - Serialize.Value(writer, "IsCircle", component.IsCircle); - Serialize.Value(writer, "Sprite", component.Sprite); - + Serialize.Value(writer, "UvTransform", component.UvTransform); + }); + SerializeComponent(writer, entity, "CircleRendererComponent", scope (component) => + { + Serialize.Value(writer, "Color", component.Color); + Serialize.Value(writer, "InnerRadius", component.InnerRadius); + Serialize.Value(writer, "Sprite", component.Sprite); Serialize.Value(writer, "UvTransform", component.UvTransform); }); @@ -325,7 +329,7 @@ class SceneSerializer Deserialize.Value(reader, "Name", out name); - component.SetName(name); + component.Name = name; delete name; @@ -336,12 +340,21 @@ class SceneSerializer { Try!(Deserialize.Value(reader, "Color", out component.Color)); reader.EntryEnd(); - Try!(Deserialize.Value(reader, "IsCircle", out component.IsCircle)); - reader.EntryEnd(); - Try!(Deserialize.Value(reader, "Sprite", out component.Sprite)); reader.EntryEnd(); + Try!(Deserialize.Value(reader, "UvTransform", out component.UvTransform)); + return .Ok; + })); + case "CircleRendererComponent": + Try!(DeserializeComponent(reader, entity, scope (component) => + { + Try!(Deserialize.Value(reader, "Color", out component.Color)); + reader.EntryEnd(); + Try!(Deserialize.Value(reader, "InnerRadius", out component.InnerRadius)); + reader.EntryEnd(); + Try!(Deserialize.Value(reader, "Sprite", out component.Sprite)); + reader.EntryEnd(); Try!(Deserialize.Value(reader, "UvTransform", out component.UvTransform)); return .Ok;