Split up sprite and circle renderer component

This commit is contained in:
Simon Lübeß
2023-03-19 12:19:22 +01:00
parent edcec02e94
commit 2ba4b68e09
12 changed files with 111 additions and 46 deletions
+15 -17
View File
@@ -9,11 +9,10 @@
SpriteRendererComponent = { SpriteRendererComponent = {
Color = { Color = {
R = 0, R = 0,
G = 0.5511778, G = 0.55117774,
B = 0.32878691, B = 0.32878688,
A = 1 A = 1
}, },
IsCircle = false,
Sprite = "Textures/TestMat/rustediron2_albedo.png", Sprite = "Textures/TestMat/rustediron2_albedo.png",
UvTransform = { UvTransform = {
X = 0, X = 0,
@@ -72,11 +71,10 @@
SpriteRendererComponent = { SpriteRendererComponent = {
Color = { Color = {
R = 1, R = 1,
G = 0.941886246, G = 0.941886365,
B = 0.401484907, B = 0.401484847,
A = 1 A = 1
}, },
IsCircle = false,
Sprite = "", Sprite = "",
UvTransform = { UvTransform = {
X = 0, X = 0,
@@ -164,7 +162,7 @@
OrthographicHeight = 10, OrthographicHeight = 10,
OrthographicNearPlane = 0, OrthographicNearPlane = 0,
OrthographicFarPlane = 10, OrthographicFarPlane = 10,
AspectRatio = 2.19888878, AspectRatio = 3.22169805,
FixedAspectRatio = false FixedAspectRatio = false
} }
}, },
@@ -173,14 +171,14 @@
NameComponent = { NameComponent = {
Name = "Circle" Name = "Circle"
}, },
SpriteRendererComponent = { CircleRendererComponent = {
Color = { Color = {
R = 0.299884498, R = 1,
G = 0.972924948, G = 0,
B = 1, B = 0,
A = 1 A = 1
}, },
IsCircle = true, InnerRadius = 0.300000012,
Sprite = "", Sprite = "",
UvTransform = { UvTransform = {
X = 0, X = 0,
@@ -191,8 +189,8 @@
}, },
TransformComponent = { TransformComponent = {
Position = { Position = {
X = -0.12120305, X = -0.12120308,
Y = 0.660160244, Y = 0.660160363,
Z = 0 Z = 0
}, },
Rotation = { Rotation = {
@@ -251,9 +249,9 @@
Z = 1 Z = 1
}, },
EditorEulerRotation = { EditorEulerRotation = {
X = 1.09089446, X = 1.0908947,
Y = -0.340793997, Y = -0.340793997,
Z = 0.160857946 Z = 0.160857916
} }
}, },
LightComponent = { LightComponent = {
@@ -262,7 +260,7 @@
Color = { Color = {
R = 0.985467017, R = 0.985467017,
G = 1, G = 1,
B = 0.569978774 B = 0.569978654
} }
} }
}, },
@@ -61,6 +61,7 @@ namespace GlitchyEditor.EditWindows
ShowComponentEditor<TransformComponent>("Transform", entity, => ShowTransformComponentEditor); ShowComponentEditor<TransformComponent>("Transform", entity, => ShowTransformComponentEditor);
ShowComponentEditor<CameraComponent>("Camera", entity, => ShowCameraComponentEditor, => ShowComponentContextMenu<CameraComponent>); ShowComponentEditor<CameraComponent>("Camera", entity, => ShowCameraComponentEditor, => ShowComponentContextMenu<CameraComponent>);
ShowComponentEditor<SpriteRendererComponent>("Sprite Renderer", entity, => ShowSpriteRendererComponentEditor, => ShowComponentContextMenu<SpriteRendererComponent>); ShowComponentEditor<SpriteRendererComponent>("Sprite Renderer", entity, => ShowSpriteRendererComponentEditor, => ShowComponentContextMenu<SpriteRendererComponent>);
ShowComponentEditor<CircleRendererComponent>("Circle Renderer", entity, => ShowCircleRendererComponentEditor, => ShowComponentContextMenu<CircleRendererComponent>);
ShowComponentEditor<MeshRendererComponent>("Mesh Renderer", entity, => ShowMeshRendererComponentEditor, => ShowComponentContextMenu<MeshRendererComponent>); ShowComponentEditor<MeshRendererComponent>("Mesh Renderer", entity, => ShowMeshRendererComponentEditor, => ShowComponentContextMenu<MeshRendererComponent>);
ShowComponentEditor<LightComponent>("Light", entity, => ShowLightComponentEditor, => ShowComponentContextMenu<LightComponent>); ShowComponentEditor<LightComponent>("Light", entity, => ShowLightComponentEditor, => ShowComponentContextMenu<LightComponent>);
ShowComponentEditor<MeshComponent>("Mesh", entity, => ShowMeshComponentEditor, => ShowComponentContextMenu<MeshComponent>); ShowComponentEditor<MeshComponent>("Mesh", entity, => ShowMeshComponentEditor, => ShowComponentContextMenu<MeshComponent>);
@@ -275,8 +276,36 @@ namespace GlitchyEditor.EditWindows
ImGui.EditVector<4>("UV Transform", ref *(float[4]*)&spriteRendererComponent.UvTransform); 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) private static void ShowMeshRendererComponentEditor(Entity entity, MeshRendererComponent* meshRendererComponent)
@@ -548,6 +577,7 @@ namespace GlitchyEditor.EditWindows
ShowComponentButton<CameraComponent>("Camera"); ShowComponentButton<CameraComponent>("Camera");
ShowComponentButton<SpriteRendererComponent>("Sprite Renderer"); ShowComponentButton<SpriteRendererComponent>("Sprite Renderer");
ShowComponentButton<CircleRendererComponent>("Circle Renderer");
ShowComponentButton<LightComponent>("Light"); ShowComponentButton<LightComponent>("Light");
ShowComponentButton<Rigidbody2DComponent>("Rigidbody 2D"); ShowComponentButton<Rigidbody2DComponent>("Rigidbody 2D");
ShowComponentButton<BoxCollider2DComponent>("Box collider 2D"); ShowComponentButton<BoxCollider2DComponent>("Box collider 2D");
+6 -4
View File
@@ -875,10 +875,12 @@ namespace GlitchyEngine.Renderer
public static void DrawSprite(Matrix transform, SpriteRendererComponent* spriteRenderer, uint32 entityId) public static void DrawSprite(Matrix transform, SpriteRendererComponent* spriteRenderer, uint32 entityId)
{ {
if (spriteRenderer.IsCircle) DrawQuad(transform, spriteRenderer.Sprite.Get() ?? s_whiteTexture, spriteRenderer.Color, spriteRenderer.UvTransform, entityId);
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); 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 // Textured quad pivot
@@ -22,7 +22,7 @@ namespace GlitchyEngine.World
{ {
public readonly UUID ID; public readonly UUID ID;
/// Create aa new IDComponent with a random UUID. /// Create a new IDComponent with a random UUID.
public this() public this()
{ {
ID = UUID(); ID = UUID();
@@ -52,7 +52,25 @@ namespace GlitchyEngine.World
public ColorRGBA Color = .White; public ColorRGBA Color = .White;
public Vector4 UvTransform = .(0, 0, 1, 1); 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<Texture2D> Sprite = .Invalid;
public ColorRGBA Color = .White;
public Vector4 UvTransform = .(0, 0, 1, 1);
public float InnerRadius = 0.0f;
public this() public this()
{ {
@@ -62,11 +80,6 @@ namespace GlitchyEngine.World
{ {
Color = color; Color = color;
} }
/*public void Dispose()
{
_sprite?.ReleaseRef();
}*/
} }
struct SceneCamera : Camera struct SceneCamera : Camera
@@ -8,15 +8,13 @@ namespace GlitchyEngine.World
public StringView Name public StringView Name
{ {
get => _name; get => _name;
set mut => SetName(value); set mut
} {
if (_name == null)
public void SetName(StringView name) mut _name = new String(value);
{ else
if (_name == null) _name.Set(value);
_name = new String(name); }
else
_name.Set(name);
} }
public void Dispose() mut public void Dispose() mut
+12 -1
View File
@@ -94,6 +94,7 @@ namespace GlitchyEngine.World
CopyComponents<MeshComponent>(this, target); CopyComponents<MeshComponent>(this, target);
CopyComponents<EditorComponent>(this, target); CopyComponents<EditorComponent>(this, target);
CopyComponents<SpriteRendererComponent>(this, target); CopyComponents<SpriteRendererComponent>(this, target);
CopyComponents<CircleRendererComponent>(this, target);
CopyComponents<CameraComponent>(this, target); CopyComponents<CameraComponent>(this, target);
CopyComponents<NativeScriptComponent>(this, target); CopyComponents<NativeScriptComponent>(this, target);
CopyComponents<LightComponent>(this, target); CopyComponents<LightComponent>(this, target);
@@ -309,6 +310,11 @@ namespace GlitchyEngine.World
Renderer2D.DrawSprite(transform.WorldTransform, sprite, entity.Index); Renderer2D.DrawSprite(transform.WorldTransform, sprite, entity.Index);
} }
for (var (entity, transform, circle) in _ecsWorld.Enumerate<TransformComponent, CircleRendererComponent>())
{
Renderer2D.DrawCircle(transform.WorldTransform, circle, entity.Index);
}
Renderer2D.EndScene(); Renderer2D.EndScene();
// Gamma correct composit target and draw it into viewport // Gamma correct composit target and draw it into viewport
@@ -372,6 +378,11 @@ namespace GlitchyEngine.World
Renderer2D.DrawSprite(transform.WorldTransform, sprite, entity.Index); Renderer2D.DrawSprite(transform.WorldTransform, sprite, entity.Index);
} }
for (var (entity, transform, circle) in _ecsWorld.Enumerate<TransformComponent, CircleRendererComponent>())
{
Renderer2D.DrawCircle(transform.WorldTransform, circle, entity.Index);
}
Renderer2D.EndScene(); Renderer2D.EndScene();
Renderer2D.BeginScene(camera, .BackToFront); Renderer2D.BeginScene(camera, .BackToFront);
@@ -406,7 +417,7 @@ namespace GlitchyEngine.World
entity.AddComponent<TransformComponent>(); entity.AddComponent<TransformComponent>();
let nameComponent = entity.AddComponent<NameComponent>(); let nameComponent = entity.AddComponent<NameComponent>();
nameComponent.SetName(name.IsEmpty ? "Entity" : name); nameComponent.Name = (name.IsEmpty ? "Entity" : name);
// If no id is given generate a random one. // If no id is given generate a random one.
IDComponent idComponent = (id == default) ? IDComponent() : IDComponent(id); IDComponent idComponent = (id == default) ? IDComponent() : IDComponent(id);
+20 -7
View File
@@ -87,10 +87,14 @@ class SceneSerializer
SerializeComponent<SpriteRendererComponent>(writer, entity, "SpriteRendererComponent", scope (component) => SerializeComponent<SpriteRendererComponent>(writer, entity, "SpriteRendererComponent", scope (component) =>
{ {
Serialize.Value(writer, "Color", component.Color); Serialize.Value(writer, "Color", component.Color);
Serialize.Value(writer, "IsCircle", component.IsCircle);
Serialize.Value(writer, "Sprite", component.Sprite); Serialize.Value(writer, "Sprite", component.Sprite);
Serialize.Value(writer, "UvTransform", component.UvTransform);
});
SerializeComponent<CircleRendererComponent>(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); Serialize.Value(writer, "UvTransform", component.UvTransform);
}); });
@@ -325,7 +329,7 @@ class SceneSerializer
Deserialize.Value(reader, "Name", out name); Deserialize.Value(reader, "Name", out name);
component.SetName(name); component.Name = name;
delete name; delete name;
@@ -336,12 +340,21 @@ class SceneSerializer
{ {
Try!(Deserialize.Value(reader, "Color", out component.Color)); Try!(Deserialize.Value(reader, "Color", out component.Color));
reader.EntryEnd(); reader.EntryEnd();
Try!(Deserialize.Value(reader, "IsCircle", out component.IsCircle));
reader.EntryEnd();
Try!(Deserialize.Value(reader, "Sprite", out component.Sprite)); Try!(Deserialize.Value(reader, "Sprite", out component.Sprite));
reader.EntryEnd(); reader.EntryEnd();
Try!(Deserialize.Value(reader, "UvTransform", out component.UvTransform));
return .Ok;
}));
case "CircleRendererComponent":
Try!(DeserializeComponent<CircleRendererComponent>(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)); Try!(Deserialize.Value(reader, "UvTransform", out component.UvTransform));
return .Ok; return .Ok;