Mirror of Svelto.ECS because we're a fan of it
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

EntityDescriptor.cs 2.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using System;
  2. using System.Reflection;
  3. using Svelto.DataStructures;
  4. namespace Svelto.ES
  5. {
  6. public class EntityDescriptor
  7. {
  8. EntityDescriptor()
  9. {}
  10. protected EntityDescriptor(INodeBuilder[] nodesToBuild, params object[] componentsImplementor)
  11. {
  12. _implementors = componentsImplementor; _nodesToBuild = nodesToBuild;
  13. }
  14. virtual public FasterList<INode> BuildNodes(int ID, Action<INode> removeAction)
  15. {
  16. var nodes = new FasterList<INode>();
  17. for (int index = 0; index < _nodesToBuild.Length; index++)
  18. {
  19. var nodeBuilder = _nodesToBuild[index];
  20. var node = FillNode(nodeBuilder.Build(ID), () =>
  21. {
  22. for (int i = 0; i < nodes.Count; i++)
  23. removeAction(nodes[i]);
  24. }
  25. );
  26. nodes.Add (node);
  27. }
  28. return nodes;
  29. }
  30. TNode FillNode<TNode>(TNode node, Action removeAction) where TNode: INode
  31. {
  32. var fields = node.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
  33. for (int i = fields.Length - 1; i >=0 ; --i)
  34. {
  35. var field = fields[i];
  36. Type fieldType = field.FieldType;
  37. object component = null;
  38. for (int j = 0; j < _implementors.Length; j++)
  39. {
  40. var implementor = _implementors[j];
  41. if (fieldType.IsAssignableFrom(implementor.GetType()))
  42. {
  43. component = implementor;
  44. if (fieldType.IsAssignableFrom(typeof(IRemoveEntityComponent)))
  45. (component as IRemoveEntityComponent).removeEntity = removeAction;
  46. break;
  47. }
  48. }
  49. if (component == null)
  50. {
  51. Exception e = new Exception("Svelto.ES: An Entity must hold all the components needed for a Node. " +
  52. "Type: " + field.FieldType.Name + " Node: " + node.GetType().Name);
  53. Utility.Console.LogException(e);
  54. throw e;
  55. }
  56. field.SetValue(node, component);
  57. }
  58. return node;
  59. }
  60. readonly object[] _implementors;
  61. INodeBuilder[] _nodesToBuild;
  62. }
  63. public interface INodeBuilder
  64. {
  65. NodeWithID Build(int ID);
  66. }
  67. public class NodeBuilder<NodeType> : INodeBuilder where NodeType:NodeWithID, new()
  68. {
  69. public NodeWithID Build(int ID)
  70. {
  71. NodeWithID node = NodeWithID.BuildNode<NodeType>(ID);
  72. return (NodeType)node;
  73. }
  74. }
  75. }