mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 21:01:52 +00:00
59 lines
1.6 KiB
Beef
59 lines
1.6 KiB
Beef
using System;
|
|
|
|
namespace GlitchyEngine.World
|
|
{
|
|
public static class TransformSystem
|
|
{
|
|
static uint _frame;
|
|
|
|
public static void Update(EcsWorld world)
|
|
{
|
|
_frame++;
|
|
|
|
for(var (entity, transform) in world.Enumerate<TransformComponent>())
|
|
{
|
|
UpdateEntity(entity, transform, world);
|
|
}
|
|
}
|
|
|
|
private static void UpdateEntity(EcsEntity entity, TransformComponent* transform, EcsWorld world)
|
|
{
|
|
// Todo: test scaling with deep hierarchies!
|
|
|
|
// transform was updated this frame -> skip
|
|
if(transform.Frame == _frame)
|
|
return;
|
|
|
|
transform.Frame = _frame;
|
|
|
|
//var parent = world.GetComponent<ParentComponent>(entity);
|
|
|
|
if(transform.IsDirty)
|
|
{
|
|
//transform.LocalTransform = .Translation(transform.Position) * .RotationQuaternion(transform.Rotation) * .Scaling(transform.Scale);
|
|
transform.[Friend]_localTransform = .Translation(transform.Position) * .RotationQuaternion(transform.Rotation) * .Scaling(transform.Scale);
|
|
|
|
transform.IsDirty = false;
|
|
|
|
if(transform.Parent == EcsEntity.InvalidEntity)
|
|
{
|
|
transform.WorldTransform = transform.LocalTransform;
|
|
}
|
|
}
|
|
|
|
if(transform.Parent != EcsEntity.InvalidEntity)
|
|
{
|
|
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
|
|
if(parentTransform.Frame >= transform.Frame)
|
|
{
|
|
transform.WorldTransform = parentTransform.WorldTransform * transform.LocalTransform;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|