diff --git a/encompass-cs/WorldBuilder.cs b/encompass-cs/WorldBuilder.cs index 059d03f..3145626 100644 --- a/encompass-cs/WorldBuilder.cs +++ b/encompass-cs/WorldBuilder.cs @@ -36,7 +36,7 @@ namespace Encompass private readonly HashSet senders = new HashSet(); - private readonly HashSet componentTypesToRegister = new HashSet(); + private readonly HashSet componentTypesToPreload = new HashSet(); private readonly HashSet messageTypes = new HashSet(); @@ -87,8 +87,6 @@ namespace Encompass public void SetComponent(Entity entity, TComponent component) where TComponent : struct, IComponent { RegisterComponentType(); - componentTypesToRegister.Add(typeof(TComponent)); - startingExistingComponentStore.Set(entity.ID, component); startingUpToDateComponentStore.Set(entity.ID, component); @@ -104,6 +102,7 @@ namespace Encompass if (!typeToIndex.ContainsKey(typeof(TComponent))) { typeToIndex.Add(typeof(TComponent), typeToIndex.Count); + componentTypesToPreload.Add(typeof(TComponent)); componentManager.RegisterComponentType(); startingExistingComponentStore.RegisterComponentType(); startingUpToDateComponentStore.RegisterComponentType(); @@ -115,11 +114,6 @@ namespace Encompass messageTypes.UnionWith(types); } - internal void AddComponentTypeToRegister(Type componentType) - { - componentTypesToRegister.Add(componentType); - } - /// /// Adds the specified Engine to the World. /// @@ -164,11 +158,6 @@ namespace Encompass } } - foreach (var componentType in engine.readTypes.Union(engine.writeTypes).Union(engine.readImmediateTypes)) - { - AddComponentTypeToRegister(componentType); - } - foreach (var receiveType in engine.receiveTypes.Union(engine.readImmediateTypes)) { if (!typeToReaders.ContainsKey(receiveType)) @@ -197,7 +186,6 @@ namespace Encompass public OrderedRenderer AddOrderedRenderer(OrderedRenderer renderer) where TComponent : struct, IComponent, IDrawableComponent { RegisterComponentType(); - componentTypesToRegister.Add(typeof(TComponent)); renderer.AssignEntityManager(entityManager); renderer.AssignComponentManager(componentManager); renderManager.RegisterOrderedRenderer(renderer.InternalRender); @@ -366,16 +354,23 @@ namespace Encompass throw new EngineWriteConflictException(errorString); } - var engineOrder = new List(); - - foreach (var registeredComponentType in componentTypesToRegister) + // doing reflection to grab all component types, because not all writes need to be declared + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { - var method = typeof(WorldBuilder).GetMethod("RegisterComponentType", BindingFlags.NonPublic | BindingFlags.Instance); - var generic = method.MakeGenericMethod(registeredComponentType); - generic.Invoke(this, null); + foreach (var componentType in assembly.GetTypes()) + { + if (typeof(IComponent).IsAssignableFrom(componentType) && componentType.IsValueType && !componentType.IsEnum && !componentType.IsPrimitive) + { + var method = typeof(WorldBuilder).GetMethod("RegisterComponentType", BindingFlags.NonPublic | BindingFlags.Instance); + var generic = method.MakeGenericMethod(componentType); + generic.Invoke(this, null); + } + } } - PreloadJIT(componentTypesToRegister, messageTypes); + PreloadJIT(componentTypesToPreload, messageTypes); + + var engineOrder = new List(); foreach (var engine in engineGraph.TopologicalSort()) {