浏览代码

[scene] EditorRemoveObjects properly handle refs now

Clément Espeute 11 月之前
父节点
当前提交
ef3820fcde
共有 2 个文件被更改,包括 17 次插入6 次删除
  1. 9 6
      hide/comp/SceneEditor.hx
  2. 8 0
      hrt/prefab/Reference.hx

+ 9 - 6
hide/comp/SceneEditor.hx

@@ -2899,13 +2899,15 @@ class SceneEditor {
 				if( i3d != null ) i3d.remove() else cast(int,h2d.Interactive).remove();
 				interactives.remove(e);
 			}
-			e.editorRemoveInstanceObjects();
-			e.dispose();
 		}
+
 		var parent = elt.parent;
+
 		recRemove(elt);
+		elt.editorRemoveObjects();
+
 		if (checkRebuild)
-		checkWantRebuild(parent, elt);
+			checkWantRebuild(parent, elt);
 	}
 
 	function makePrefab(elt: PrefabElement) {
@@ -4319,7 +4321,7 @@ class SceneEditor {
 	function rebuild(prefab: PrefabElement) {
 		scene.setCurrent();
 
-		prefab.editorRemoveObjects();
+		removeInstance(prefab, false);
 
 		var enabled = prefab.enabled && !prefab.inGameOnly;
 		var actuallyInWorld = prefab == sceneData || (prefab.parent != null && prefab.parent.has(prefab));
@@ -4353,12 +4355,13 @@ class SceneEditor {
 				newRenderProps = renderProps[0];
 
 			if (newRenderProps != previousRenderProps) {
-				previousRenderProps?.editorRemoveObjects();
+				if (previousRenderProps != null)
+					removeInstance(previousRenderProps);
 				scene.s3d.renderer.props = scene.s3d.renderer.getDefaultProps();
 				lastRenderProps = newRenderProps;
 				if (lastRenderProps != null) {
 					if (renderPropsRoot != null) {
-						renderPropsRoot.editorRemoveObjects();
+						removeInstance(renderPropsRoot);
 						renderPropsRoot = null;
 					}
 

+ 8 - 0
hrt/prefab/Reference.hx

@@ -111,6 +111,7 @@ class Reference extends Object3D {
 		}
 	}
 
+
 	override public function find<T:Prefab>(?cl: Class<T>, ?filter : T -> Bool, followRefs : Bool = false ) : Null<T> {
 		var res = super.find(cl, filter, followRefs);
 		if (res == null && followRefs ) {
@@ -145,6 +146,13 @@ class Reference extends Object3D {
 
 	#if editor
 
+	override public function editorRemoveObjects() : Void {
+		if (refInstance != null) {
+			refInstance.editorRemoveObjects();
+		}
+		super.editorRemoveObjects();
+	}
+
 	public function hasCycle(?seenPaths: Map<String, Bool>) : Bool {
 		if (editorOnly)
 			return false;