Better Transform component and edit gui

This commit is contained in:
Simon Lübeß
2022-04-09 12:35:36 +02:00
parent c7fde476e8
commit af37154071
18 changed files with 341 additions and 208 deletions
+10 -21
View File
@@ -13,36 +13,25 @@ namespace GlitchyEngine.World
}
}
struct SimpleTransformComponent
{
public EcsEntity Parent = .InvalidEntity;
public Matrix Transform = Matrix.Identity;
public this()
{
}
public this(Matrix transform)
{
Transform = transform;
}
}
struct SpriterRendererComponent
struct SpriterRendererComponent : IDisposableComponent
{
public Texture2D Sprite = null;
public ColorRGBA Color = .White;
public this()
{
}
public this(ColorRGBA color)
{
Color = color;
}
public void Dispose()
{
Sprite?.ReleaseRef();
}
}
struct SceneCamera : Camera
@@ -229,7 +218,7 @@ namespace GlitchyEngine.World
private void CalculateProjection() mut
{
if (_projectionType case .Orthographic)//(let nearPlane, let farPlane, let projectionHeight))
if (_projectionType case .Orthographic)
{
float halfHeight = _orthographicHeight / 2.0f;
float halfWidth = halfHeight * _aspectRatio;
@@ -237,11 +226,11 @@ namespace GlitchyEngine.World
_projection = Matrix.OrthographicProjectionOffCenter(-halfWidth, halfWidth, halfHeight, -halfHeight,
_orthographicNearPlane, _orthographicFarPlane);
}
else if (_projectionType case .Perspective)//(let nearPlane, let farPlane, let fovY))
else if (_projectionType case .Perspective)
{
_projection = Matrix.PerspectiveProjection(_perspectiveFovY, _aspectRatio, _perspectiveNearPlane, _perspectiveFarPlane);
}
else if (_projectionType case .InfinitePerspective)//(let nearPlane, let fovY))
else if (_projectionType case .InfinitePerspective)
{
_projection = Matrix.InfinitePerspectiveProjection(_perspectiveFovY, _aspectRatio, _perspectiveNearPlane);
}
+12 -9
View File
@@ -16,7 +16,10 @@ namespace GlitchyEngine.World
entity.AddComponent<SpriterRendererComponent>(.(ColorRGBA(0.2f, 0.9f, 0.15f)));
Entity entity2 = CreateEntity("Red Square");
entity2.AddComponent<SpriterRendererComponent>(.(ColorRGBA(0.95f, 0.1f, 0.3f)));
var v = entity2.AddComponent<SpriterRendererComponent>(.(ColorRGBA(0.95f, 0.1f, 0.3f)));
v.Sprite = new Texture2D("Textures/rocket.png");
v.Sprite.SamplerState = SamplerStateManager.PointClamp;
}
public ~this()
@@ -25,7 +28,7 @@ namespace GlitchyEngine.World
public void Update(GameTime gameTime)
{
//TransformSystem.Update(_ecsWorld);
TransformSystem.Update(_ecsWorld);
for (var (entity, script) in _ecsWorld.Enumerate<NativeScriptComponent>())
{
@@ -40,25 +43,25 @@ namespace GlitchyEngine.World
}
Camera* primaryCamera = null;
Matrix* primaryCameraTransform = null;
Matrix primaryCameraTransform = default;
for (var (entity, transform, camera) in _ecsWorld.Enumerate<SimpleTransformComponent, CameraComponent>())
for (var (entity, transform, camera) in _ecsWorld.Enumerate<TransformComponent, CameraComponent>())
{
if (camera.Primary)
{
primaryCamera = &camera.Camera;
primaryCameraTransform = &transform.Transform;
primaryCameraTransform = transform.WorldTransform;
}
}
// Sprite renderer
if (primaryCamera != null)
{
Renderer2D.BeginScene(*primaryCamera, *primaryCameraTransform);
Renderer2D.BeginScene(*primaryCamera, primaryCameraTransform);
for (var (entity, transform, sprite) in _ecsWorld.Enumerate<SimpleTransformComponent, SpriterRendererComponent>())
for (var (entity, transform, sprite) in _ecsWorld.Enumerate<TransformComponent, SpriterRendererComponent>())
{
Renderer2D.DrawQuad(transform.Transform, sprite.Color);
Renderer2D.DrawQuad(transform.WorldTransform, sprite.Sprite, sprite.Color);
}
Renderer2D.EndScene();
@@ -68,7 +71,7 @@ namespace GlitchyEngine.World
public Entity CreateEntity(String name = "")
{
Entity entity = Entity(_ecsWorld.NewEntity(), this);
entity.AddComponent<SimpleTransformComponent>(.(.Identity));
entity.AddComponent<TransformComponent>();
let nameComponent = entity.AddComponent<DebugNameComponent>();
nameComponent.SetName(name.IsEmpty ? "Entity" : name);
@@ -4,6 +4,8 @@ namespace GlitchyEngine.World
{
internal Entity _entity;
protected TransformComponent* transform => GetComponent<TransformComponent>();
public T* AddComponent<T>(T value = T()) where T: struct, new
{
return _entity.AddComponent<T>(value);
+39 -13
View File
@@ -4,9 +4,13 @@ namespace GlitchyEngine.World
{
public struct TransformComponent
{
Vector3 _position = .Zero;
Quaternion _rotation = .Identity;
Vector3 _scale = .One;
EcsEntity _parent = .InvalidEntity;
Vector3 _position = .(0, 0, 0);
Quaternion _rotation = .(0, 0, 0, 1);
Vector3 _scale = .(1, 1, 1);
Vector3 _editorRotationEuler = .Zero;
Matrix _localTransform = .Identity;
public bool IsDirty = false;
@@ -16,6 +20,19 @@ namespace GlitchyEngine.World
/// The frame when the transform was recalculated
public uint Frame;
public EcsEntity Parent
{
get => _parent;
set mut
{
if (_parent == value)
return;
_parent = value;
IsDirty = true;
}
}
public Matrix LocalTransform
{
get => _localTransform;
@@ -55,6 +72,24 @@ namespace GlitchyEngine.World
_rotation = value;
IsDirty = true;
_editorRotationEuler = Quaternion.ToEulerAngles(_rotation);
}
}
/// Allows the user to edit the euler angles in the editor without rotations getting funky because of singularities or ambiguity of angles.
internal Vector3 EditorRotationEuler
{
get => _editorRotationEuler;
set mut
{
if (_editorRotationEuler == value)
return;
_editorRotationEuler = value;
_rotation = Quaternion.FromEulerAngles(_editorRotationEuler.Y, _editorRotationEuler.X, _editorRotationEuler.Z);
IsDirty = true;
}
}
@@ -65,16 +100,7 @@ namespace GlitchyEngine.World
public Vector3 RotationEuler
{
get => Quaternion.ToEulerAngles(_rotation);
set mut
{
Quaternion quat = Quaternion.FromEulerAngles(value.Y, value.X, value.Z);
if(_rotation == quat)
return;
_rotation = quat;
IsDirty = true;
}
set mut => Rotation = Quaternion.FromEulerAngles(value.Y, value.X, value.Z);
}
/**
+5 -7
View File
@@ -26,7 +26,7 @@ namespace GlitchyEngine.World
transform.Frame = _frame;
var parent = world.GetComponent<ParentComponent>(entity);
//var parent = world.GetComponent<ParentComponent>(entity);
if(transform.IsDirty)
{
@@ -35,18 +35,16 @@ namespace GlitchyEngine.World
transform.IsDirty = false;
if(parent == null)
if(transform.Parent == EcsEntity.InvalidEntity)
{
transform.WorldTransform = transform.LocalTransform;
}
}
if(parent != null)
if(transform.Parent != EcsEntity.InvalidEntity)
{
var parentEntity = parent.Entity;
var parentTransform = world.GetComponent<TransformComponent>(parentEntity);
UpdateEntity(parentEntity, parentTransform, world);
var parentTransform = world.GetComponent<TransformComponent>(transform.Parent);
UpdateEntity(transform.Parent, parentTransform, world);
// TODO: I think we unnecessarily recalculate world transform every frame
// Parent transform is newer than our transform or was updated this frame