mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 21:01:52 +00:00
Better Transform component and edit gui
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user