using DaggerFramework.Rendering; using DaggerFramework.Utils; namespace DaggerFramework.SceneGraph { public class EntityLayer : Layer { public List Entities { get => _entities; } public Camera2d? CurrentCamera { get; set; } public EntityLayer(List entities) { _entities = entities; } public EntityLayer() { _entities = new List(); } public void UpdateCurrentCamera() { if (_cameraEntities.Count == 1) { CurrentCamera = _cameraEntities[0]; return; } else { foreach (var camera in _cameraEntities) { if (camera.Current) CurrentCamera = camera; } } } public bool AddEntity(Entity entity) { entity.Id = Entities.Count; entity.Layer = this; if (entity is Camera2d camera2d) { _cameraEntities.Add(camera2d); UpdateCurrentCamera(); } Entities.Add(entity); return true; } public void DestroyEntity(int at) { _entities.RemoveAt(at); } protected override void OnStart() { for (int i = 0; i < _entities.Count; i++) { var entity = _entities[i]; entity.Layer = this; entity.Start(); } } protected override void OnUpdate(double dt) { foreach (var entity in _entities) { entity.Update(dt); } } protected override void OnBeginDraw(Renderer renderer) { if (CurrentCamera is not null) { renderer.BeginCamera2d(CurrentCamera.Offset, CurrentCamera.Position, 0f, CurrentCamera.Zoom); } } protected override void OnEndDraw(Renderer renderer) { if (CurrentCamera is not null) { renderer.EndCamera2d(); } } protected override void OnDraw(Renderer renderer) { // TODO: can be done more efficiently, needs rendering redesign. foreach (var entity in _entities) { if (entity is IDrawable drawable) { drawable.Draw(renderer); } } } private List _entities; private List _cameraEntities = new(); } }