using System; using System.Reflection; using System.Collections.Generic; namespace Encompass { public abstract class EntityRenderer : Renderer, IEntityTracker { private readonly List componentTypes = new List(); private readonly EntityTracker entityTracker = new EntityTracker(); public IEnumerable ComponentTypes { get { return componentTypes; } } public Type DrawComponentType { get; } public abstract void Render(Entity entity); protected EntityRenderer() { var rendersAttribute = GetType().GetCustomAttribute(false); if (rendersAttribute != null) { componentTypes = rendersAttribute.componentTypes; DrawComponentType = rendersAttribute.drawComponentType; } } bool IEntityTracker.CheckAndTrackEntity(Guid entityID) { var entity = GetEntity(entityID); var shouldTrack = CheckEntity(entity); if (shouldTrack) { entityTracker.TrackEntity(entityID); } return shouldTrack; } bool IEntityTracker.CheckAndUntrackEntity(Guid entityID) { var entity = GetEntity(entityID); var shouldUntrack = !CheckEntity(entity); if (shouldUntrack) { entityTracker.UntrackEntity(entityID); } return shouldUntrack; } public bool IsTracking(Guid entityID) { return entityTracker.IsTracking(entityID); } private bool CheckEntity(Entity entity) { return EntityChecker.CheckEntity(componentManager, entity, componentTypes) && componentManager.EntityHasComponentOfType(entity.ID, DrawComponentType); } } }