BREAKING CHANGE: replaced universe objects with root universe object
This commit is contained in:
		@@ -78,9 +78,9 @@ public interface IUniverse : IEntity, IEnumerable<IUniverseObject>
 | 
				
			|||||||
    UniverseTime UnscaledTime { get; }
 | 
					    UniverseTime UnscaledTime { get; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// <summary>
 | 
					    /// <summary>
 | 
				
			||||||
    /// Gets a read-only list of <see cref="IUniverseObject"/>s managed by the <see cref="IUniverse"/>.
 | 
					    /// Gets the root <see cref="IUniverseObject"/> of the <see cref="IUniverse"/>.
 | 
				
			||||||
    /// </summary>
 | 
					    /// </summary>
 | 
				
			||||||
    IReadOnlyList<IUniverseObject> UniverseObjects { get; }
 | 
					    IUniverseObject Root { get; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// <summary>
 | 
					    /// <summary>
 | 
				
			||||||
    /// Registers an <see cref="IUniverseObject"/> to the <see cref="IUniverse"/>.
 | 
					    /// Registers an <see cref="IUniverseObject"/> to the <see cref="IUniverse"/>.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ public abstract class ActiveBehaviourCollectorBase<T> : IBehaviourCollector<T> w
 | 
				
			|||||||
        if (Universe is not null)
 | 
					        if (Universe is not null)
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        foreach (IUniverseObject universeObject in universe.UniverseObjects)
 | 
					        foreach (IUniverseObject universeObject in universe)
 | 
				
			||||||
            OnUniverseObjectRegistered(universe, new(universeObject));
 | 
					            OnUniverseObjectRegistered(universe, new(universeObject));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        universe.OnUniverseObjectRegistered.AddListener(delegateOnUniverseObjectRegistered);
 | 
					        universe.OnUniverseObjectRegistered.AddListener(delegateOnUniverseObjectRegistered);
 | 
				
			||||||
@@ -46,7 +46,7 @@ public abstract class ActiveBehaviourCollectorBase<T> : IBehaviourCollector<T> w
 | 
				
			|||||||
        if (Universe is null)
 | 
					        if (Universe is null)
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        foreach (IUniverseObject universeObject in Universe.UniverseObjects)
 | 
					        foreach (IUniverseObject universeObject in Universe)
 | 
				
			||||||
            OnUniverseObjectUnregistered(Universe, new(universeObject));
 | 
					            OnUniverseObjectUnregistered(Universe, new(universeObject));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Universe.OnUniverseObjectRegistered.RemoveListener(delegateOnUniverseObjectRegistered);
 | 
					        Universe.OnUniverseObjectRegistered.RemoveListener(delegateOnUniverseObjectRegistered);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,7 +25,7 @@ public abstract class BehaviourCollectorBase<T> : IBehaviourCollector<T> where T
 | 
				
			|||||||
        if (Universe is not null)
 | 
					        if (Universe is not null)
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        foreach (IUniverseObject universeObject in universe.UniverseObjects)
 | 
					        foreach (IUniverseObject universeObject in universe)
 | 
				
			||||||
            OnUniverseObjectRegistered(universe, new(universeObject));
 | 
					            OnUniverseObjectRegistered(universe, new(universeObject));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        universe.OnUniverseObjectRegistered.AddListener(delegateOnUniverseObjectRegistered);
 | 
					        universe.OnUniverseObjectRegistered.AddListener(delegateOnUniverseObjectRegistered);
 | 
				
			||||||
@@ -43,7 +43,7 @@ public abstract class BehaviourCollectorBase<T> : IBehaviourCollector<T> where T
 | 
				
			|||||||
        if (Universe is null)
 | 
					        if (Universe is null)
 | 
				
			||||||
            return false;
 | 
					            return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        foreach (IUniverseObject universeObject in Universe.UniverseObjects)
 | 
					        foreach (IUniverseObject universeObject in Universe)
 | 
				
			||||||
            OnUniverseObjectUnregistered(Universe, new(universeObject));
 | 
					            OnUniverseObjectUnregistered(Universe, new(universeObject));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        Universe.OnUniverseObjectRegistered.RemoveListener(delegateOnUniverseObjectRegistered);
 | 
					        Universe.OnUniverseObjectRegistered.RemoveListener(delegateOnUniverseObjectRegistered);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,5 +32,5 @@ public static class UniverseExtensions
 | 
				
			|||||||
    /// <typeparam name="T">Type to be searched through the <see cref="IUniverse"/>.</typeparam>
 | 
					    /// <typeparam name="T">Type to be searched through the <see cref="IUniverse"/>.</typeparam>
 | 
				
			||||||
    /// <returns>The specified type if found; otherwise, throws <see cref="NotFoundException"/>.</returns>
 | 
					    /// <returns>The specified type if found; otherwise, throws <see cref="NotFoundException"/>.</returns>
 | 
				
			||||||
    public static T FindRequired<T>(this IUniverse universe) where T : class
 | 
					    public static T FindRequired<T>(this IUniverse universe) where T : class
 | 
				
			||||||
        => universe.Find<T>() ?? throw new NotFoundException($"{universe.GetType().FullName}({universe.Id}) does not contain any {nameof(IUniverseObject)} or {nameof(IBehaviour)} of type {typeof(T).FullName}");
 | 
					        => universe.Root.BehaviourController.GetBehaviourInChildren<T>() ?? throw new NotFoundException($"{universe.GetType().FullName}({universe.Id}) does not contain any {nameof(IUniverseObject)} or {nameof(IBehaviour)} of type {typeof(T).FullName}");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,6 +16,21 @@ public static class UniverseObjectExtensions
 | 
				
			|||||||
        return universeObject;
 | 
					        return universeObject;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static IEnumerator<IUniverseObject> TraverseChildren(this IUniverseObject universeObject)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        static IEnumerable<IUniverseObject> Traverse(IUniverseObject obj)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            foreach (IUniverseObject child in obj.Children)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                yield return child;
 | 
				
			||||||
 | 
					                foreach (IUniverseObject descendant in Traverse(child))
 | 
				
			||||||
 | 
					                    yield return descendant;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return Traverse(universeObject).GetEnumerator();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    #region Universe Object Search
 | 
					    #region Universe Object Search
 | 
				
			||||||
    /// <summary>
 | 
					    /// <summary>
 | 
				
			||||||
    /// Gets a <see cref="IUniverseObject"/> of the specified type.
 | 
					    /// Gets a <see cref="IUniverseObject"/> of the specified type.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,7 +23,7 @@ public class UniverseEntranceManager : Internal.BehaviourIndependent
 | 
				
			|||||||
        enterUniverses.Assign(universe);
 | 
					        enterUniverses.Assign(universe);
 | 
				
			||||||
        exitUniverses.Assign(universe);
 | 
					        exitUniverses.Assign(universe);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        foreach (IUniverseObject universeObject in universe.UniverseObjects)
 | 
					        foreach (IUniverseObject universeObject in universe)
 | 
				
			||||||
            OnUniverseObjectRegistered(universe, new(universeObject));
 | 
					            OnUniverseObjectRegistered(universe, new(universeObject));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        universe.OnUniverseObjectRegistered.AddListener(OnUniverseObjectRegistered);
 | 
					        universe.OnUniverseObjectRegistered.AddListener(OnUniverseObjectRegistered);
 | 
				
			||||||
@@ -35,7 +35,7 @@ public class UniverseEntranceManager : Internal.BehaviourIndependent
 | 
				
			|||||||
        enterUniverses.Unassign();
 | 
					        enterUniverses.Unassign();
 | 
				
			||||||
        exitUniverses.Unassign();
 | 
					        exitUniverses.Unassign();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        foreach (IUniverseObject universeObject in universe.UniverseObjects)
 | 
					        foreach (IUniverseObject universeObject in universe)
 | 
				
			||||||
            OnUniverseObjectUnRegistered(universe, new(universeObject));
 | 
					            OnUniverseObjectUnRegistered(universe, new(universeObject));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        universe.OnUniverseObjectRegistered.RemoveListener(OnUniverseObjectRegistered);
 | 
					        universe.OnUniverseObjectRegistered.RemoveListener(OnUniverseObjectRegistered);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,7 @@ public class Universe : BaseEntity, IUniverse
 | 
				
			|||||||
        delegateOnUniverseObjectExitedUniverse = OnUniverseObjectExitedUniverse;
 | 
					        delegateOnUniverseObjectExitedUniverse = OnUniverseObjectExitedUniverse;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public IReadOnlyList<IUniverseObject> UniverseObjects => _universeObjects;
 | 
					    public IUniverseObject Root { get; private set; } = Factory.UniverseObjectFactory.Instantiate().SetUniverseObject("Root");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public UniverseTime Time { get; private set; } = new();
 | 
					    public UniverseTime Time { get; private set; } = new();
 | 
				
			||||||
    public UniverseTime UnscaledTime { get; private set; } = new();
 | 
					    public UniverseTime UnscaledTime { get; private set; } = new();
 | 
				
			||||||
@@ -68,6 +68,9 @@ public class Universe : BaseEntity, IUniverse
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        _universeObjects.Add(universeObject);
 | 
					        _universeObjects.Add(universeObject);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (universeObject.Parent == null)
 | 
				
			||||||
 | 
					            universeObject.Parent = Root;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (!universeObject.EnterUniverse(this))
 | 
					        if (!universeObject.EnterUniverse(this))
 | 
				
			||||||
            throw new Exception($"{universeObject.Name} can't enter the universe");
 | 
					            throw new Exception($"{universeObject.Name} can't enter the universe");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -113,15 +116,15 @@ public class Universe : BaseEntity, IUniverse
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    protected override void InitializeInternal()
 | 
					    protected override void InitializeInternal()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        foreach (IUniverseObject universeObject in UniverseObjects)
 | 
					        foreach (IUniverseObject universeObject in _universeObjects)
 | 
				
			||||||
            universeObject.Initialize();
 | 
					            universeObject.Initialize();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected override void FinalizeInternal()
 | 
					    protected override void FinalizeInternal()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        base.FinalizeInternal();
 | 
					        base.FinalizeInternal();
 | 
				
			||||||
        for (int i = UniverseObjects.Count - 1; i >= 0; i--)
 | 
					        for (int i = _universeObjects.Count - 1; i >= 0; i--)
 | 
				
			||||||
            Remove(UniverseObjects[i]);
 | 
					            Remove(_universeObjects[i]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void Update(UniverseTime engineTime)
 | 
					    public void Update(UniverseTime engineTime)
 | 
				
			||||||
@@ -158,6 +161,6 @@ public class Universe : BaseEntity, IUniverse
 | 
				
			|||||||
            Remove(universeObject);
 | 
					            Remove(universeObject);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public IEnumerator<IUniverseObject> GetEnumerator() => _universeObjects.GetEnumerator();
 | 
					    public IEnumerator<IUniverseObject> GetEnumerator() => Root.TraverseChildren();
 | 
				
			||||||
    IEnumerator IEnumerable.GetEnumerator() => _universeObjects.GetEnumerator();
 | 
					    IEnumerator IEnumerable.GetEnumerator() => Root.TraverseChildren();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,7 +22,7 @@ public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        IUniverse universe;
 | 
					        IUniverse universe;
 | 
				
			||||||
        IStateEnable stateEnable;
 | 
					        IStateEnable stateEnable;
 | 
				
			||||||
        List<IUniverseObject> universeObjects;
 | 
					        IUniverseObject rootUniverseObject;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        parser.Consume<MappingStart>();
 | 
					        parser.Consume<MappingStart>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -34,16 +34,16 @@ public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
 | 
				
			|||||||
            throw new();
 | 
					            throw new();
 | 
				
			||||||
        SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
 | 
					        SerializedClass instanceSerializedClass = (SerializedClass)rootDeserializer(typeof(SerializedClass))!;
 | 
				
			||||||
        ProgressionTracker.Set(isTrackingController ? .2f : ProgressionTracker.Progression, $"Creating {instanceSerializedClass.Type}");
 | 
					        ProgressionTracker.Set(isTrackingController ? .2f : ProgressionTracker.Progression, $"Creating {instanceSerializedClass.Type}");
 | 
				
			||||||
        universe = (IUniverse)instanceSerializedClass.CreateInstance(EntityRegistry);
 | 
					        universe = (IUniverse)instanceSerializedClass.CreateInstance(IdentifiableRegistry);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverse.StateEnable)) != 0)
 | 
					        if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverse.StateEnable)) != 0)
 | 
				
			||||||
            throw new();
 | 
					            throw new();
 | 
				
			||||||
        stateEnable = (IStateEnable)rootDeserializer(typeof(IStateEnable))!;
 | 
					        stateEnable = (IStateEnable)rootDeserializer(typeof(IStateEnable))!;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ProgressionTracker.Set(isTrackingController ? .5f : ProgressionTracker.Progression, $"Reading universe objects");
 | 
					        ProgressionTracker.Set(isTrackingController ? .5f : ProgressionTracker.Progression, $"Reading universe objects");
 | 
				
			||||||
        if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverse.UniverseObjects)) != 0)
 | 
					        if (parser.Consume<Scalar>().Value.CompareTo(nameof(IUniverse.Root)) != 0)
 | 
				
			||||||
            throw new();
 | 
					            throw new();
 | 
				
			||||||
        universeObjects = (List<IUniverseObject>)rootDeserializer(typeof(List<IUniverseObject>))!;
 | 
					        rootUniverseObject = (IUniverseObject)rootDeserializer(typeof(IUniverseObject))!;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        parser.Consume<MappingEnd>();
 | 
					        parser.Consume<MappingEnd>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -52,13 +52,12 @@ public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
 | 
				
			|||||||
        stateEnable.Assign(universe);
 | 
					        stateEnable.Assign(universe);
 | 
				
			||||||
        universe.Assign(stateEnable);
 | 
					        universe.Assign(stateEnable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ProgressionTracker.Set(isTrackingController ? .9f : ProgressionTracker.Progression, "Registering universe objects");
 | 
					        ProgressionTracker.Set(isTrackingController ? .9f : ProgressionTracker.Progression, "Registering root universe object");
 | 
				
			||||||
        for (int i = 0; i < universeObjects.Count; i++)
 | 
					        for (int i = 0; i < rootUniverseObject.Children.Count; i++)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            IUniverseObject uo = universeObjects[i];
 | 
					            IUniverseObject uo = rootUniverseObject.Children[i];
 | 
				
			||||||
            ProgressionTracker.Set(isTrackingController ? .9f + .1f * ((float)i / universeObjects.Count) : ProgressionTracker.Progression, $"Registering {uo.Name}");
 | 
					            ProgressionTracker.Set(isTrackingController ? .9f + .1f * ((float)i / rootUniverseObject.Children.Count) : ProgressionTracker.Progression, $"Registering {uo.Name}");
 | 
				
			||||||
 | 
					            universe.Root.AddChild(uo);
 | 
				
			||||||
            universe.Register(uo);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Created {instanceSerializedClass.Type}");
 | 
					        ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Created {instanceSerializedClass.Type}");
 | 
				
			||||||
@@ -72,7 +71,7 @@ public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
 | 
				
			|||||||
        bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
 | 
					        bool isTrackingController = ProgressionTracker.Progression.ApproximatelyEquals(0f);
 | 
				
			||||||
        ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Serializing universe");
 | 
					        ProgressionTracker.Set(isTrackingController ? .25f : ProgressionTracker.Progression, $"Serializing universe");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        IEnumerable<IUniverseObject> rootUniverseObjects = universe.UniverseObjects.Where(uo => uo.Parent is null);
 | 
					        IUniverseObject rootUniverseObject = universe.Root;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        emitter.Emit(new MappingStart());
 | 
					        emitter.Emit(new MappingStart());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,8 +84,8 @@ public class UniverseConverter : EngineTypeYamlSerializerBase<IUniverse>
 | 
				
			|||||||
        emitter.Emit(new Scalar(nameof(IUniverse.StateEnable)));
 | 
					        emitter.Emit(new Scalar(nameof(IUniverse.StateEnable)));
 | 
				
			||||||
        serializer(universe.StateEnable);
 | 
					        serializer(universe.StateEnable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        emitter.Emit(new Scalar(nameof(IUniverse.UniverseObjects)));
 | 
					        emitter.Emit(new Scalar(nameof(IUniverse.Root)));
 | 
				
			||||||
        serializer(rootUniverseObjects);
 | 
					        serializer(rootUniverseObject);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serialized universe");
 | 
					        ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serialized universe");
 | 
				
			||||||
        emitter.Emit(new MappingEnd());
 | 
					        emitter.Emit(new MappingEnd());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -97,7 +97,7 @@ public class UniverseObjectSerializer : EngineTypeYamlSerializerBase<IUniverseOb
 | 
				
			|||||||
        serializer(universeObject.BehaviourController);
 | 
					        serializer(universeObject.BehaviourController);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        emitter.Emit(new Scalar(nameof(IUniverseObject.Children)));
 | 
					        emitter.Emit(new Scalar(nameof(IUniverseObject.Children)));
 | 
				
			||||||
        serializer(universeObject.Children.Where(c => !c.GetType().HasAttribute<IgnoreSerializationAttribute>()));
 | 
					        serializer(universeObject.Children.Where(c => !c.GetType().HasAttribute<IgnoreSerializationAttribute>()).Reverse());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serializing universe object");
 | 
					        ProgressionTracker.Set(isTrackingController ? 1f : ProgressionTracker.Progression, $"Serializing universe object");
 | 
				
			||||||
        emitter.Emit(new MappingEnd());
 | 
					        emitter.Emit(new MappingEnd());
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user