From 91031c094a66b9f05114b8da18b474254a2f047f Mon Sep 17 00:00:00 2001 From: sebas77 Date: Sun, 30 Aug 2015 15:59:36 +0100 Subject: [PATCH] First commit --- .gitignore | 2 + Context.meta | 9 ++ Context/ContextNotifier.cs | 61 ++++++++++++++ Context/ContextNotifier.cs.meta | 12 +++ Context/Factories.meta | 9 ++ Context/Factories/GameObjectFactory.cs | 84 +++++++++++++++++++ Context/Factories/GameObjectFactory.cs.meta | 12 +++ Context/Factories/MonoBehaviourFactory.cs | 34 ++++++++ .../Factories/MonoBehaviourFactory.cs.meta | 12 +++ Context/ICompositionRoot.cs | 12 +++ Context/ICompositionRoot.cs.meta | 7 ++ Context/IContextNotifer.cs | 11 +++ Context/IContextNotifer.cs.meta | 8 ++ .../IUnityContextHierarchyChangedListener.cs | 13 +++ ...ityContextHierarchyChangedListener.cs.meta | 8 ++ Context/IWaitForFrameworkDestruction.cs | 10 +++ Context/IWaitForFrameworkDestruction.cs.meta | 8 ++ Context/IWaitForFrameworkInitialization.cs | 10 +++ .../IWaitForFrameworkInitialization.cs.meta | 8 ++ Context/Legacy.meta | 9 ++ Context/Unity.meta | 9 ++ Context/Unity/NotifyComponentsRemoved.cs | 28 +++++++ Context/Unity/NotifyComponentsRemoved.cs.meta | 8 ++ Context/UnityContext.cs | 64 ++++++++++++++ Context/UnityContext.cs.meta | 7 ++ EntitySystem.meta | 9 ++ EntitySystem/Engine.meta | 2 + EntitySystem/Engine/IEngine.cs | 14 ++++ EntitySystem/Engine/IEngine.cs.meta | 7 ++ EntitySystem/EnginesRoot.cs | 69 +++++++++++++++ EntitySystem/EnginesRoot.cs.meta | 7 ++ EntitySystem/IEnginesRoot.cs | 13 +++ EntitySystem/IEnginesRoot.cs.meta | 8 ++ EntitySystem/Node.meta | 9 ++ EntitySystem/Node/INode.cs | 16 ++++ EntitySystem/Node/INode.cs.meta | 12 +++ EntitySystem/Node/INodeHolder.cs | 8 ++ EntitySystem/Node/INodeHolder.cs.meta | 12 +++ EntitySystem/Unity.meta | 9 ++ EntitySystem/Unity/UnityNodeHolder.cs | 64 ++++++++++++++ EntitySystem/Unity/UnityNodeHolder.cs.meta | 12 +++ EntitySystem/UnityEnginesRoot.cs | 40 +++++++++ EntitySystem/UnityEnginesRoot.cs.meta | 12 +++ 43 files changed, 778 insertions(+) create mode 100644 .gitignore create mode 100644 Context.meta create mode 100644 Context/ContextNotifier.cs create mode 100644 Context/ContextNotifier.cs.meta create mode 100644 Context/Factories.meta create mode 100644 Context/Factories/GameObjectFactory.cs create mode 100644 Context/Factories/GameObjectFactory.cs.meta create mode 100644 Context/Factories/MonoBehaviourFactory.cs create mode 100644 Context/Factories/MonoBehaviourFactory.cs.meta create mode 100644 Context/ICompositionRoot.cs create mode 100644 Context/ICompositionRoot.cs.meta create mode 100644 Context/IContextNotifer.cs create mode 100644 Context/IContextNotifer.cs.meta create mode 100644 Context/IUnityContextHierarchyChangedListener.cs create mode 100644 Context/IUnityContextHierarchyChangedListener.cs.meta create mode 100644 Context/IWaitForFrameworkDestruction.cs create mode 100644 Context/IWaitForFrameworkDestruction.cs.meta create mode 100644 Context/IWaitForFrameworkInitialization.cs create mode 100644 Context/IWaitForFrameworkInitialization.cs.meta create mode 100644 Context/Legacy.meta create mode 100644 Context/Unity.meta create mode 100644 Context/Unity/NotifyComponentsRemoved.cs create mode 100644 Context/Unity/NotifyComponentsRemoved.cs.meta create mode 100644 Context/UnityContext.cs create mode 100644 Context/UnityContext.cs.meta create mode 100644 EntitySystem.meta create mode 100644 EntitySystem/Engine.meta create mode 100644 EntitySystem/Engine/IEngine.cs create mode 100644 EntitySystem/Engine/IEngine.cs.meta create mode 100644 EntitySystem/EnginesRoot.cs create mode 100644 EntitySystem/EnginesRoot.cs.meta create mode 100644 EntitySystem/IEnginesRoot.cs create mode 100644 EntitySystem/IEnginesRoot.cs.meta create mode 100644 EntitySystem/Node.meta create mode 100644 EntitySystem/Node/INode.cs create mode 100644 EntitySystem/Node/INode.cs.meta create mode 100644 EntitySystem/Node/INodeHolder.cs create mode 100644 EntitySystem/Node/INodeHolder.cs.meta create mode 100644 EntitySystem/Unity.meta create mode 100644 EntitySystem/Unity/UnityNodeHolder.cs create mode 100644 EntitySystem/Unity/UnityNodeHolder.cs.meta create mode 100644 EntitySystem/UnityEnginesRoot.cs create mode 100644 EntitySystem/UnityEnginesRoot.cs.meta diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f1249a2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/EntitySystem/note.txt +/EntitySystem/note.txt.meta diff --git a/Context.meta b/Context.meta new file mode 100644 index 0000000..fe9df04 --- /dev/null +++ b/Context.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 9e37272d8aa8b6e4cb7b1fc15f1e57a8 +folderAsset: yes +timeCreated: 1431201025 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Context/ContextNotifier.cs b/Context/ContextNotifier.cs new file mode 100644 index 0000000..74df7ef --- /dev/null +++ b/Context/ContextNotifier.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; + +namespace Svelto.Context +{ + class ContextNotifier: IContextNotifer + { + public ContextNotifier() + { + _toInitialize = new List>(); + _toDeinitialize = new List> (); + } + + /// + /// A Context is meant to be initialized only once in its timelife + /// + public void NotifyFrameworkInitialized() + { + foreach (WeakReference obj in _toInitialize) + { + if (obj.IsAlive == true) + obj.Target.OnFrameworkInitialized(); + } + + _toInitialize = null; + } + + /// + /// A Context is meant to be deinitialized only once in its timelife + /// + public void NotifyFrameworkDeinitialized() + { + foreach (WeakReference obj in _toDeinitialize) + { + if (obj.IsAlive == true) + obj.Target.OnFrameworkDestroyed(); + } + + _toDeinitialize = null; + } + + public void AddFrameworkInitializationListener(IWaitForFrameworkInitialization obj) + { + if (_toInitialize != null) + _toInitialize.Add(new WeakReference(obj)); + else + throw new Exception("An object is expected to be initialized after the framework has been initialized. Type: " + obj.GetType()); + } + + public void AddFrameworkDestructionListener(IWaitForFrameworkDestruction obj) + { + if (_toDeinitialize != null) + _toDeinitialize.Add(new WeakReference(obj)); + else + throw new Exception("An object is expected to be initialized after the framework has been deinitialized. Type: " + obj.GetType()); + } + + List> _toInitialize; + List> _toDeinitialize; + } +} diff --git a/Context/ContextNotifier.cs.meta b/Context/ContextNotifier.cs.meta new file mode 100644 index 0000000..5bd27d3 --- /dev/null +++ b/Context/ContextNotifier.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d74bed1689bb4114aa8a1f95cd95c788 +timeCreated: 1431300049 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Context/Factories.meta b/Context/Factories.meta new file mode 100644 index 0000000..cdfbf81 --- /dev/null +++ b/Context/Factories.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 88190f2317429cb49bfdf63e448efa52 +folderAsset: yes +timeCreated: 1431630831 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Context/Factories/GameObjectFactory.cs b/Context/Factories/GameObjectFactory.cs new file mode 100644 index 0000000..c51069f --- /dev/null +++ b/Context/Factories/GameObjectFactory.cs @@ -0,0 +1,84 @@ +#region + +using System.Collections.Generic; +using UnityEngine; + +#endregion + +namespace Svelto.Context +{ + public class GameObjectFactory: Factories.IGameObjectFactory + { + public GameObjectFactory(IUnityContextHierarchyChangedListener root) + { + _unityContext = root; + + _prefabs = new Dictionary(); + } + + /// + /// Register a prefab to be built later using a string ID. + /// + /// original prefab + /// prefab name + /// optional gameobject to specify as parent later + + public void RegisterPrefab(GameObject prefab, string prefabName, GameObject parent = null) + { + var objects = new GameObject[2]; + + objects[0] = prefab; objects[1] = parent; + + _prefabs.Add(prefabName, objects); + } + + public GameObject Build(string prefabName) + { + DesignByContract.Check.Require(_prefabs.ContainsKey(prefabName), "Svelto.Factories.IGameObjectFactory - Invalid Prefab Type"); + + var go = Build(_prefabs[prefabName][0]); + + GameObject parent = _prefabs[prefabName][1]; + + if (parent != null) + { + Transform transform = go.transform; + + var scale = transform.localScale; + var rotation = transform.localRotation; + var position = transform.localPosition; + + parent.SetActive(true); + + transform.parent = parent.transform; + + transform.localPosition = position; + transform.localRotation = rotation; + transform.localScale = scale; + } + + return go; + } + + public GameObject Build(GameObject go) + { + var copy = Object.Instantiate(go) as GameObject; + var components = copy.GetComponentsInChildren(true); + + for (var i = 0; i < components.Length; ++i) + if (components[i] != null) + _unityContext.OnMonobehaviourAdded(components[i]); + + _unityContext.OnGameObjectAdded(copy); + + copy.AddComponent().unityContext = _unityContext; + copy.AddComponent().unityContext = _unityContext; + + return copy; + } + + IUnityContextHierarchyChangedListener _unityContext; + Dictionary _prefabs; + } +} + diff --git a/Context/Factories/GameObjectFactory.cs.meta b/Context/Factories/GameObjectFactory.cs.meta new file mode 100644 index 0000000..ef025ff --- /dev/null +++ b/Context/Factories/GameObjectFactory.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 613a705e128b35e4f9361e29f4661191 +timeCreated: 1431630831 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Context/Factories/MonoBehaviourFactory.cs b/Context/Factories/MonoBehaviourFactory.cs new file mode 100644 index 0000000..19e1dc0 --- /dev/null +++ b/Context/Factories/MonoBehaviourFactory.cs @@ -0,0 +1,34 @@ +#region + +using System; +using UnityEngine; + +#endregion + +namespace Svelto.Context +{ + public class MonoBehaviourFactory: Factories.IMonoBehaviourFactory + { + IUnityContextHierarchyChangedListener _unityContext; + + public MonoBehaviourFactory(IUnityContextHierarchyChangedListener unityContext) + { + _unityContext = unityContext; + } + + public M Build(Func constructor) where M:MonoBehaviour + { + var mb = constructor(); + + _unityContext.OnMonobehaviourAdded(mb); + + GameObject go = mb.gameObject; + + if (go.GetComponent() == null) + go.AddComponent().unityContext = _unityContext; + + return mb; + } + } +} + diff --git a/Context/Factories/MonoBehaviourFactory.cs.meta b/Context/Factories/MonoBehaviourFactory.cs.meta new file mode 100644 index 0000000..f19e685 --- /dev/null +++ b/Context/Factories/MonoBehaviourFactory.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 369e3378b91069c4aadba2af5aa8882b +timeCreated: 1431630831 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Context/ICompositionRoot.cs b/Context/ICompositionRoot.cs new file mode 100644 index 0000000..92521f3 --- /dev/null +++ b/Context/ICompositionRoot.cs @@ -0,0 +1,12 @@ +using UnityEngine; + +namespace Svelto.Context +{ + public interface ICompositionRoot + { + void OnContextInitialized(); + void OnContextDestroyed(); + } +} + + diff --git a/Context/ICompositionRoot.cs.meta b/Context/ICompositionRoot.cs.meta new file mode 100644 index 0000000..0ce1f88 --- /dev/null +++ b/Context/ICompositionRoot.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 48c80cc65bea8254ba8082043f53405e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Context/IContextNotifer.cs b/Context/IContextNotifer.cs new file mode 100644 index 0000000..6ac2c14 --- /dev/null +++ b/Context/IContextNotifer.cs @@ -0,0 +1,11 @@ +namespace Svelto.Context +{ + public interface IContextNotifer + { + void NotifyFrameworkInitialized(); + void NotifyFrameworkDeinitialized(); + + void AddFrameworkInitializationListener(IWaitForFrameworkInitialization obj); + void AddFrameworkDestructionListener(IWaitForFrameworkDestruction obj); + } +} diff --git a/Context/IContextNotifer.cs.meta b/Context/IContextNotifer.cs.meta new file mode 100644 index 0000000..97fff82 --- /dev/null +++ b/Context/IContextNotifer.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a28c8df5741efe54ea588a1bcea92f0f +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Context/IUnityContextHierarchyChangedListener.cs b/Context/IUnityContextHierarchyChangedListener.cs new file mode 100644 index 0000000..3f07295 --- /dev/null +++ b/Context/IUnityContextHierarchyChangedListener.cs @@ -0,0 +1,13 @@ +using UnityEngine; + +namespace Svelto.Context +{ + public interface IUnityContextHierarchyChangedListener + { + void OnMonobehaviourAdded(MonoBehaviour component); + void OnMonobehaviourRemoved(MonoBehaviour component); + + void OnGameObjectAdded(GameObject entity); + void OnGameObjectRemoved(GameObject entity); + } +} diff --git a/Context/IUnityContextHierarchyChangedListener.cs.meta b/Context/IUnityContextHierarchyChangedListener.cs.meta new file mode 100644 index 0000000..f26268b --- /dev/null +++ b/Context/IUnityContextHierarchyChangedListener.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 905bfd795bede6d448694b23dd88e0be +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Context/IWaitForFrameworkDestruction.cs b/Context/IWaitForFrameworkDestruction.cs new file mode 100644 index 0000000..622fa3e --- /dev/null +++ b/Context/IWaitForFrameworkDestruction.cs @@ -0,0 +1,10 @@ +using System; + +namespace Svelto.Context +{ + public interface IWaitForFrameworkDestruction + { + void OnFrameworkDestroyed(); + } +} + diff --git a/Context/IWaitForFrameworkDestruction.cs.meta b/Context/IWaitForFrameworkDestruction.cs.meta new file mode 100644 index 0000000..aa5adc5 --- /dev/null +++ b/Context/IWaitForFrameworkDestruction.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 36b1da25aaa515e4bad98fa0f61bc662 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Context/IWaitForFrameworkInitialization.cs b/Context/IWaitForFrameworkInitialization.cs new file mode 100644 index 0000000..937cbbc --- /dev/null +++ b/Context/IWaitForFrameworkInitialization.cs @@ -0,0 +1,10 @@ +using System; + +namespace Svelto.Context +{ + public interface IWaitForFrameworkInitialization + { + void OnFrameworkInitialized(); + } +} + diff --git a/Context/IWaitForFrameworkInitialization.cs.meta b/Context/IWaitForFrameworkInitialization.cs.meta new file mode 100644 index 0000000..3ba1f65 --- /dev/null +++ b/Context/IWaitForFrameworkInitialization.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 93cf465dd97f6144390620250c362485 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Context/Legacy.meta b/Context/Legacy.meta new file mode 100644 index 0000000..97c070b --- /dev/null +++ b/Context/Legacy.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 026077faae4dc884ebe1eb4b427ed1e4 +folderAsset: yes +timeCreated: 1434754873 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Context/Unity.meta b/Context/Unity.meta new file mode 100644 index 0000000..2f9be3d --- /dev/null +++ b/Context/Unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 403de662aab64bb4e917559caa6b7946 +folderAsset: yes +timeCreated: 1434752394 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Context/Unity/NotifyComponentsRemoved.cs b/Context/Unity/NotifyComponentsRemoved.cs new file mode 100644 index 0000000..bf433b0 --- /dev/null +++ b/Context/Unity/NotifyComponentsRemoved.cs @@ -0,0 +1,28 @@ +using UnityEngine; + +namespace Svelto.Context +{ + public class NotifyComponentsRemoved : MonoBehaviour + { + public IUnityContextHierarchyChangedListener unityContext { private get; set; } + + void OnDestroy() + { + MonoBehaviour[] components = gameObject.GetComponentsInChildren(true); + + for (int i = 0; i < components.Length; ++i) + if (components[i] != null) + unityContext.OnMonobehaviourRemoved(components[i]); + } + } + + public class NotifyEntityRemoved : MonoBehaviour + { + public IUnityContextHierarchyChangedListener unityContext { private get; set; } + + void OnDestroy() + { + unityContext.OnGameObjectRemoved(gameObject); + } + } +} diff --git a/Context/Unity/NotifyComponentsRemoved.cs.meta b/Context/Unity/NotifyComponentsRemoved.cs.meta new file mode 100644 index 0000000..4418602 --- /dev/null +++ b/Context/Unity/NotifyComponentsRemoved.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 13278f0cd187d8d43acc6a02479e459b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Context/UnityContext.cs b/Context/UnityContext.cs new file mode 100644 index 0000000..40193b0 --- /dev/null +++ b/Context/UnityContext.cs @@ -0,0 +1,64 @@ +using UnityEngine; +using Svelto.Context; +using System.Collections; + +public class UnityContext:MonoBehaviour +{} + +public class UnityContext: UnityContext where T:class, ICompositionRoot, IUnityContextHierarchyChangedListener, new() +{ + virtual protected void Awake() + { + Init(); + } + + void Init() + { + _applicationRoot = new T(); + + MonoBehaviour[] behaviours = transform.GetComponentsInChildren(true); + + for (int i = 0; i < behaviours.Length; i++) + { + var component = behaviours[i]; + + if (component != null) + _applicationRoot.OnMonobehaviourAdded(component); + } + + Transform[] children = transform.GetComponentsInChildren(true); + + for (int i = 0; i < children.Length; i++) + { + var child = children[i]; + + if (child != null) + _applicationRoot.OnGameObjectAdded(child.gameObject); + } + } + + void OnDestroy() + { + FrameworkDestroyed(); + } + + void Start() + { + if (Application.isPlaying == true) + StartCoroutine(WaitForFrameworkInitialization()); + } + + IEnumerator WaitForFrameworkInitialization() + { + yield return new WaitForEndOfFrame(); //let's wait until next frame, so we are sure that all the awake and starts are called + + _applicationRoot.OnContextInitialized(); + } + + void FrameworkDestroyed() + { + _applicationRoot.OnContextDestroyed(); + } + + private T _applicationRoot = null; +} diff --git a/Context/UnityContext.cs.meta b/Context/UnityContext.cs.meta new file mode 100644 index 0000000..b3c44ab --- /dev/null +++ b/Context/UnityContext.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 54e46daa2d2d723499a114d6d8de9dc2 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/EntitySystem.meta b/EntitySystem.meta new file mode 100644 index 0000000..762a089 --- /dev/null +++ b/EntitySystem.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8c3236edfa0d4cb43afb277ef6aea664 +folderAsset: yes +timeCreated: 1431201025 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/EntitySystem/Engine.meta b/EntitySystem/Engine.meta new file mode 100644 index 0000000..0a7f017 --- /dev/null +++ b/EntitySystem/Engine.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 89495a852d57f3d4893d89a74065ee39 diff --git a/EntitySystem/Engine/IEngine.cs b/EntitySystem/Engine/IEngine.cs new file mode 100644 index 0000000..6698ac1 --- /dev/null +++ b/EntitySystem/Engine/IEngine.cs @@ -0,0 +1,14 @@ +namespace Svelto.ES +{ + public interface IEngine + {} + + public interface INodeEngine : IEngine + { + System.Type[] AcceptedNodes(); + + void Add(INode obj); + void Remove(INode obj); + } + +} diff --git a/EntitySystem/Engine/IEngine.cs.meta b/EntitySystem/Engine/IEngine.cs.meta new file mode 100644 index 0000000..63fca9f --- /dev/null +++ b/EntitySystem/Engine/IEngine.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0b5d886dff6d02148ab73bdb3f0ca4f7 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/EntitySystem/EnginesRoot.cs b/EntitySystem/EnginesRoot.cs new file mode 100644 index 0000000..efec7a5 --- /dev/null +++ b/EntitySystem/EnginesRoot.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; + + +namespace Svelto.ES +{ + public sealed class EnginesRoot: INodeEnginesRoot + { + public EnginesRoot() + { + _nodeEngines = new Dictionary>(); + } + + public void AddEngine(IEngine engine) + { + if (engine is INodeEngine) + AddNodeEngine(engine as INodeEngine); + } + + public void Add(INode node) + { + Type nodeType = node.GetType(); + + List value; + if (_nodeEngines.TryGetValue(nodeType, out value)) + for (int j = 0; j < value.Count; j++) + value[j].Add(node); + } + + public void Remove(INode node) + { + Type nodeType = node.GetType(); + + List value; + if (_nodeEngines.TryGetValue(nodeType, out value)) + for (int j = 0; j < value.Count; j++) + value[j].Remove(node); + } + + void AddNodeEngine(INodeEngine engine) + { + AddEngine(engine, engine.AcceptedNodes(), _nodeEngines); + } + + void AddEngine(T engine, Type[] types, Dictionary> engines) + { + for (int i = 0; i < types.Length; i++) + { + List value; + + var type = types[i]; + + if (engines.TryGetValue(type, out value) == false) + { + List list = new List(); + + list.Add(engine); + + engines.Add(type, list); + } + else + value.Add(engine); + } + } + + Dictionary> _nodeEngines; + } +} + diff --git a/EntitySystem/EnginesRoot.cs.meta b/EntitySystem/EnginesRoot.cs.meta new file mode 100644 index 0000000..cc67e45 --- /dev/null +++ b/EntitySystem/EnginesRoot.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 93350fd2ba4f60f4f88599169e8d31cb +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/EntitySystem/IEnginesRoot.cs b/EntitySystem/IEnginesRoot.cs new file mode 100644 index 0000000..ca3567a --- /dev/null +++ b/EntitySystem/IEnginesRoot.cs @@ -0,0 +1,13 @@ +namespace Svelto.ES +{ + public interface IEnginesRoot + { + void AddEngine(IEngine engine); + } + + public interface INodeEnginesRoot: IEnginesRoot + { + void Add(INode node); + void Remove(INode node); + } +} diff --git a/EntitySystem/IEnginesRoot.cs.meta b/EntitySystem/IEnginesRoot.cs.meta new file mode 100644 index 0000000..7fad7e5 --- /dev/null +++ b/EntitySystem/IEnginesRoot.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2253f20f6b4d9b14eb0e79fbd135eff1 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/EntitySystem/Node.meta b/EntitySystem/Node.meta new file mode 100644 index 0000000..eec644a --- /dev/null +++ b/EntitySystem/Node.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8e3c19ee9185a664aa837e567c4db122 +folderAsset: yes +timeCreated: 1434900315 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/EntitySystem/Node/INode.cs b/EntitySystem/Node/INode.cs new file mode 100644 index 0000000..513fd86 --- /dev/null +++ b/EntitySystem/Node/INode.cs @@ -0,0 +1,16 @@ +namespace Svelto.ES +{ + public interface INode + { + } + + public interface INodeWithReferenceID : INode where T : class + { + T ID { get; } + } + + public interface INodeWithValueID : INode where T : struct + { + T ID { get; } + } +} diff --git a/EntitySystem/Node/INode.cs.meta b/EntitySystem/Node/INode.cs.meta new file mode 100644 index 0000000..b2c29d6 --- /dev/null +++ b/EntitySystem/Node/INode.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: fc6bea8c56bd7284693db26502c6b65b +timeCreated: 1434900316 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/EntitySystem/Node/INodeHolder.cs b/EntitySystem/Node/INodeHolder.cs new file mode 100644 index 0000000..a21c1a9 --- /dev/null +++ b/EntitySystem/Node/INodeHolder.cs @@ -0,0 +1,8 @@ +namespace Svelto.ES +{ + interface INodeHolder + { + INode node { get; } + INodeEnginesRoot engineRoot { set; } + } +} diff --git a/EntitySystem/Node/INodeHolder.cs.meta b/EntitySystem/Node/INodeHolder.cs.meta new file mode 100644 index 0000000..1a65ca3 --- /dev/null +++ b/EntitySystem/Node/INodeHolder.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a4c0061442f32644cb1e434b6544d56c +timeCreated: 1434900315 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/EntitySystem/Unity.meta b/EntitySystem/Unity.meta new file mode 100644 index 0000000..4439d15 --- /dev/null +++ b/EntitySystem/Unity.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e369cc976007e884d92f906e4d1054d7 +folderAsset: yes +timeCreated: 1438460466 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/EntitySystem/Unity/UnityNodeHolder.cs b/EntitySystem/Unity/UnityNodeHolder.cs new file mode 100644 index 0000000..faf55cb --- /dev/null +++ b/EntitySystem/Unity/UnityNodeHolder.cs @@ -0,0 +1,64 @@ +using System; +using System.Reflection; +using UnityEngine; + +namespace Svelto.ES +{ + public abstract class BaseNodeHolder:MonoBehaviour, INodeHolder where NodeType : INode + { + public INode node { get { if (_node != null) return _node; else return _node = ReturnNode(); } } + + public INodeEnginesRoot engineRoot { set { _engineRoot = value; } } + + protected abstract NodeType ReturnNode(); + + void Start() + { + if (_engineRoot != null) + _engineRoot.Add(node); + } + + NodeType _node; + INodeEnginesRoot _engineRoot; + } + + public abstract class UnityNodeHolder:BaseNodeHolder where NodeType : INode + { + protected abstract NodeType GenerateNode(); + + override protected NodeType ReturnNode() + { + NodeType node = GenerateNode(); + + FieldInfo[] fields = typeof(NodeType).GetFields(BindingFlags.Public | BindingFlags.Instance); + + for (int i = fields.Length - 1; i >=0 ; --i) + { + var field = fields[i]; + + var component = transform.GetComponentsInChildren(field.FieldType, true); //can't use inactive components + + if (component.Length == 0) + { + Exception e = new Exception("Svelto.ES: An Entity must hold all the components needed for a Node. Type: " + field.FieldType.Name + "Entity name: " + name); + + Debug.LogException(e, gameObject); + + throw e; + } + if (component.Length > 1) + { + Exception e = new Exception("Svelto.ES: An Entity can hold only one component of the same type. Type: " + field.FieldType.Name + "Entity name: " + name); + + Debug.LogException(e, gameObject); + + throw e; + } + + field.SetValue(node, component[0]); + } + + return node; + } + } +} diff --git a/EntitySystem/Unity/UnityNodeHolder.cs.meta b/EntitySystem/Unity/UnityNodeHolder.cs.meta new file mode 100644 index 0000000..bdb4dd4 --- /dev/null +++ b/EntitySystem/Unity/UnityNodeHolder.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 50ed7d1adb836dd4786fef832cb4e808 +timeCreated: 1438011258 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/EntitySystem/UnityEnginesRoot.cs b/EntitySystem/UnityEnginesRoot.cs new file mode 100644 index 0000000..b18d317 --- /dev/null +++ b/EntitySystem/UnityEnginesRoot.cs @@ -0,0 +1,40 @@ +using UnityEngine; + +namespace Svelto.ES +{ + public class UnityEnginesRoot : INodeEnginesRoot + { + public void AddEngine(IEngine engine) + { + _engineRoot.AddEngine(engine); + } + + public void Add(INode node) + { + _engineRoot.Add(node); + } + + public void Remove(INode node) + { + _engineRoot.Remove(node); + } + + public void AddGameObjectEntity(GameObject entity) + { + INodeHolder[] nodeHolders = entity.GetComponents(); + + for (int i = 0; i < nodeHolders.Length; i++) + nodeHolders[i].engineRoot = this; + } + + public void RemoveGameObjectEntity(GameObject entity) + { + INodeHolder[] nodeHolders = entity.GetComponents(); + + for (int i = 0; i < nodeHolders.Length; i++) + Remove(nodeHolders[i].node); + } + + EnginesRoot _engineRoot = new EnginesRoot(); + } +} diff --git a/EntitySystem/UnityEnginesRoot.cs.meta b/EntitySystem/UnityEnginesRoot.cs.meta new file mode 100644 index 0000000..6c5d463 --- /dev/null +++ b/EntitySystem/UnityEnginesRoot.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6e4e1cde52e768148a0aaf8effbb9ba3 +timeCreated: 1439726868 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: