EditorSceneData.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2019 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. using System.Collections.Generic;
  4. namespace bs.Editor
  5. {
  6. /** @addtogroup Editor-General
  7. * @{
  8. */
  9. /// <summary>
  10. /// Contains per-scene data relevant to the editor.
  11. /// </summary>
  12. [SerializeObject]
  13. internal class EditorSceneData
  14. {
  15. /// <summary>
  16. /// Creates new editor scene data.
  17. /// </summary>
  18. /// <param name="root">Root object of the scene to create editor scene data for.</param>
  19. /// <returns>New editor scene data object, initialized with the hierarchy of the provided scene.</returns>
  20. public static EditorSceneData FromScene(SceneObject root)
  21. {
  22. EditorSceneData output = new EditorSceneData();
  23. output.Root = EditorSceneObject.FromSceneObject(root);
  24. return output;
  25. }
  26. /// <summary>
  27. /// Updates the editor scene object hierarchy from the current scene hierarchy.
  28. /// </summary>
  29. /// <param name="root">Root of the hierarchy to update from.</param>
  30. public void UpdateFromScene(SceneObject root)
  31. {
  32. Dictionary<UUID, EditorSceneObject> lookup = GetLookup();
  33. Root = EditorSceneObject.FromSceneObject(root);
  34. void UpdateFromOldData(EditorSceneObject so)
  35. {
  36. if (lookup.TryGetValue(so.UUID, out EditorSceneObject data))
  37. so.CopyData(data);
  38. foreach(var entry in so.Children)
  39. UpdateFromOldData(entry);
  40. }
  41. UpdateFromOldData(Root);
  42. }
  43. /// <summary>
  44. /// Builds a lookup table of scene object UUID -> editor scene object data, for all scene objects.
  45. /// </summary>
  46. /// <returns>Lookup table.</returns>
  47. public Dictionary<UUID, EditorSceneObject> GetLookup()
  48. {
  49. Dictionary<UUID, EditorSceneObject> lookup = new Dictionary<UUID, EditorSceneObject>();
  50. void AddToLookup(EditorSceneObject so)
  51. {
  52. lookup[so.UUID] = so;
  53. foreach(var entry in so.Children)
  54. AddToLookup(entry);
  55. }
  56. if(Root != null)
  57. AddToLookup(Root);
  58. return lookup;
  59. }
  60. /// <summary>
  61. /// Root object of the scene hierarchy.
  62. /// </summary>
  63. public EditorSceneObject Root;
  64. }
  65. /// <summary>
  66. /// Contains editor-relevant data about a scene object.
  67. /// </summary>
  68. [SerializeObject]
  69. internal class EditorSceneObject
  70. {
  71. /// <summary>
  72. /// Unique identifier of the scene object.
  73. /// </summary>
  74. public UUID UUID;
  75. /// <summary>
  76. /// True if the object is expanded in the hierarchy view.
  77. /// </summary>
  78. public bool IsExpanded;
  79. /// <summary>
  80. /// Child scene objects, if any.
  81. /// </summary>
  82. public EditorSceneObject[] Children;
  83. /// <summary>
  84. /// Initializes the object from a corresponding scene object.
  85. /// </summary>
  86. /// <param name="so">Scene object that this object contains additional data for.</param>
  87. /// <returns>New editor scene object.</returns>
  88. public static EditorSceneObject FromSceneObject(SceneObject so)
  89. {
  90. EditorSceneObject output = new EditorSceneObject();
  91. output.UUID = so.UUID;
  92. int numChildren = so.GetNumChildren();
  93. output.Children = new EditorSceneObject[numChildren];
  94. for (int i = 0; i < numChildren; i++)
  95. output.Children[i] = FromSceneObject(so.GetChild(i));
  96. return output;
  97. }
  98. /// <summary>
  99. /// Copies the stored data from one object instance to another. Does not copy object UUID or child list.
  100. /// </summary>
  101. /// <param name="other">Object from which to copy the data.</param>
  102. public void CopyData(EditorSceneObject other)
  103. {
  104. IsExpanded = other.IsExpanded;
  105. }
  106. }
  107. /** @} */
  108. }