remove WorldBuilder

pull/1/head
cosmonaut 2022-03-07 11:46:17 -08:00
parent 229a0651bd
commit 1d7db58d43
4 changed files with 52 additions and 80 deletions

View File

@ -55,16 +55,19 @@ internal class ComponentDepot
entityComponentMap.Add(entityID, new HashSet<Type>());
}
var alreadyExists = entityComponentMap[entityID].Add(typeof(TComponent));
var notFound = entityComponentMap[entityID].Add(typeof(TComponent));
// update filters
if (!alreadyExists)
if (notFound)
{
if (typeToFilterSignatures.TryGetValue(typeof(TComponent), out var filterSignatures))
{
foreach (var filterSignature in filterSignatures)
{
CheckFilter(filterSignature, entityID);
if (CheckFilter(filterSignature, entityID))
{
filterSignatureToEntityIDs[filterSignature].Add(entityID);
}
}
}
}
@ -93,7 +96,10 @@ internal class ComponentDepot
{
foreach (var filterSignature in filterSignatures)
{
CheckFilter(filterSignature, entityID);
if (!CheckFilter(filterSignature, entityID))
{
filterSignatureToEntityIDs[filterSignature].Remove(entityID);
}
}
}
}

View File

@ -10,8 +10,18 @@ public abstract class System : EntityComponentReader
MessageDepot = messageDepot;
}
public System(World world)
{
world.AddSystem(this);
}
public abstract void Update(TimeSpan delta);
public virtual void InitializeFilters()
{
}
protected Entity CreateEntity()
{
return EntityStorage.Create();

View File

@ -2,25 +2,40 @@
public class World
{
private readonly List<System> Systems;
private readonly List<Renderer> Renderers;
private readonly EntityStorage EntityStorage;
private readonly ComponentDepot ComponentDepot;
private MessageDepot MessageDepot;
private readonly List<System> Systems = new List<System>();
private readonly List<Renderer> Renderers = new List<Renderer>();
private readonly EntityStorage EntityStorage = new EntityStorage();
private readonly ComponentDepot ComponentDepot = new ComponentDepot();
private MessageDepot MessageDepot = new MessageDepot();
internal World(
List<System> systems,
List<Renderer> renderers,
ComponentDepot componentDepot,
EntityStorage entityStorage,
MessageDepot messageDepot
)
internal void AddSystem(System system)
{
Systems = systems;
Renderers = renderers;
ComponentDepot = componentDepot;
EntityStorage = entityStorage;
MessageDepot = messageDepot;
system.RegisterEntityStorage(EntityStorage);
system.RegisterComponentDepot(ComponentDepot);
system.RegisterMessageDepot(MessageDepot);
Systems.Add(system);
}
internal void AddRenderer(Renderer renderer)
{
renderer.RegisterEntityStorage(EntityStorage);
renderer.RegisterComponentDepot(ComponentDepot);
Renderers.Add(renderer);
}
public Entity CreateEntity()
{
return EntityStorage.Create();
}
public void Set<TComponent>(Entity entity, in TComponent component) where TComponent : struct
{
ComponentDepot.Set(entity.ID, component);
}
public void Send<TMessage>(in TMessage message) where TMessage : struct
{
MessageDepot.Add(message);
}
public void Update(TimeSpan delta)

View File

@ -1,59 +0,0 @@
namespace MoonTools.ECS;
public class WorldBuilder
{
private ComponentDepot componentDepot;
private EntityStorage entityStorage;
private MessageDepot messageDepot;
private readonly List<System> systems = new List<System>();
private readonly List<Renderer> renderers = new List<Renderer>();
public WorldBuilder()
{
componentDepot = new ComponentDepot();
entityStorage = new EntityStorage();
messageDepot = new MessageDepot();
}
public void AddSystem(System system)
{
system.RegisterEntityStorage(entityStorage);
system.RegisterComponentDepot(componentDepot);
system.RegisterMessageDepot(messageDepot);
systems.Add(system);
}
public void AddRenderer(Renderer renderer)
{
renderer.RegisterEntityStorage(entityStorage);
renderer.RegisterComponentDepot(componentDepot);
renderers.Add(renderer);
}
public Entity CreateEntity()
{
return entityStorage.Create();
}
public void Set<TComponent>(Entity entity, in TComponent component) where TComponent : struct
{
componentDepot.Set(entity.ID, component);
}
public void Send<TMessage>(in TMessage message) where TMessage : struct
{
messageDepot.Add(message);
}
public World Build()
{
return new World(
systems,
renderers,
componentDepot,
entityStorage,
messageDepot
);
}
}