浏览代码

[scene] Improvement to scene reloading

Clément Espeute 11 月之前
父节点
当前提交
352d59996c

+ 17 - 11
hide/comp/SceneEditor.hx

@@ -2887,7 +2887,7 @@ class SceneEditor {
 		return null;*/
 	}
 
-	function removeInstance(elt : PrefabElement) : Void {
+	function removeInstance(elt : PrefabElement, checkRebuild: Bool = true) : Void {
 		function recRemove(e:PrefabElement) {
 			for (c in e.children) {
 				recRemove(c);
@@ -2899,11 +2899,12 @@ class SceneEditor {
 				if( i3d != null ) i3d.remove() else cast(int,h2d.Interactive).remove();
 				interactives.remove(e);
 			}
-			e.editorRemoveInstance();
+			e.editorRemoveInstanceObjects();
 			e.dispose();
 		}
 		var parent = elt.parent;
 		recRemove(elt);
+		if (checkRebuild)
 		checkWantRebuild(parent, elt);
 	}
 
@@ -4290,7 +4291,15 @@ class SceneEditor {
 							skip = true;
 							break;
 						}
-						parent = parent.parent;
+
+						var next = parent.parent ?? parent.shared.parentPrefab;
+						if (next == null)
+							break;
+
+						if (!next.children.contains(parent) && Std.downcast(next, Reference)?.refInstance != parent) {
+							skip = true;
+						}
+						parent = next;
 					}
 
 					if (skip == true)
@@ -4310,18 +4319,15 @@ class SceneEditor {
 	function rebuild(prefab: PrefabElement) {
 		scene.setCurrent();
 
-		prefab.editorRemoveInstance();
-		if (prefab == sceneData) {
-			for (c in prefab) {
-				c.editorRemoveInstance();
-			}
-		}
+		prefab.editorRemoveObjects();
 
 		var enabled = prefab.enabled && !prefab.inGameOnly;
 		var actuallyInWorld = prefab == sceneData || (prefab.parent != null && prefab.parent.has(prefab));
 		if (enabled && actuallyInWorld) {
 			prefab.shared.current3d = prefab.parent?.findFirstLocal3d() ?? root3d;
 			prefab.shared.current2d = prefab.parent?.findFirstLocal2d() ?? root2d;
+			if (prefab.shared.current3d.getScene() == null)
+				throw "current3d is not in scene";
 			prefab.setEditor(this, this.scene);
 			prefab.make();
 		}
@@ -4347,12 +4353,12 @@ class SceneEditor {
 				newRenderProps = renderProps[0];
 
 			if (newRenderProps != previousRenderProps) {
-				previousRenderProps?.editorRemoveInstance();
+				previousRenderProps?.editorRemoveObjects();
 				scene.s3d.renderer.props = scene.s3d.renderer.getDefaultProps();
 				lastRenderProps = newRenderProps;
 				if (lastRenderProps != null) {
 					if (renderPropsRoot != null) {
-						renderPropsRoot.editorRemoveInstance();
+						renderPropsRoot.editorRemoveObjects();
 						renderPropsRoot = null;
 					}
 

+ 2 - 2
hrt/prefab/Light.hx

@@ -466,11 +466,11 @@ class Light extends Object3D {
 		return true;
 	}
 
-	override function editorRemoveInstance() : Void {
+	override function editorRemoveInstanceObjects() : Void {
 		if (icon != null) {
 			icon.remove();
 		}
-		super.editorRemoveInstance();
+		super.editorRemoveInstanceObjects();
 	}
 
 	override function edit( ctx : hide.prefab.EditContext ) {

+ 2 - 2
hrt/prefab/Material.hx

@@ -241,7 +241,7 @@ class Material extends Prefab {
 	}
 
 	#if editor
-	override function editorRemoveInstance() : Void {
+	override function editorRemoveInstanceObjects() : Void {
 		if (previewSphere != null) {
 			previewSphere.remove();
 		}
@@ -249,7 +249,7 @@ class Material extends Prefab {
 			// temporary untill we find a proper way to remove a material
 			shared.editor.queueRebuild(parent);
 		}
-		super.editorRemoveInstance();
+		super.editorRemoveInstanceObjects();
 	}
 
 	override function onEditorTreeChanged(prefab: hrt.prefab.Prefab) : hrt.prefab.Prefab.TreeChangedResult {

+ 2 - 2
hrt/prefab/Object2D.hx

@@ -119,11 +119,11 @@ class Object2D extends Prefab {
 		};
 	}
 
-	override function editorRemoveInstance() : Void {
+	override function editorRemoveInstanceObjects() : Void {
 		if (local2d != null) {
 			local2d.remove();
 		}
-		super.editorRemoveInstance();
+		super.editorRemoveInstanceObjects();
 	}
 
 	override function edit( ctx : hide.prefab.EditContext ) {

+ 2 - 2
hrt/prefab/Object3D.hx

@@ -450,12 +450,12 @@ class Object3D extends Prefab {
 		return int;
 	}
 
-	override function editorRemoveInstance() : Void {
+	override function editorRemoveInstanceObjects() : Void {
 		if (local3d != null)
 			local3d.remove();
 		if (editorIcon != null)
 			editorIcon.remove();
-		super.editorRemoveInstance();
+		super.editorRemoveInstanceObjects();
 	}
 
 	override function edit( ctx : hide.prefab.EditContext ) {

+ 13 - 1
hrt/prefab/Prefab.hx

@@ -577,10 +577,22 @@ class Prefab {
 		return true;
 	}
 
+	/**
+		Called by the editor to remove the object created by this prefab tree
+	**/
+	function editorRemoveObjects() : Void {
+		for (child in children) {
+			child.editorRemoveObjects();
+		}
+		editorRemoveInstanceObjects();
+		dispose();
+	}
+
+
 	/**
 		Called by the editor to remove the objects created by this prefab but not it's children.
 	**/
-	public function editorRemoveInstance() : Void {
+	function editorRemoveInstanceObjects() : Void {
 	}
 
 	/**

+ 2 - 2
hrt/prefab/Shader.hx

@@ -158,9 +158,9 @@ class Shader extends Prefab {
 
 	#if editor
 
-	override function editorRemoveInstance() : Void {
+	override function editorRemoveInstanceObjects() : Void {
 		shared.editor.queueRebuild(parent);
-		super.editorRemoveInstance();
+		super.editorRemoveInstanceObjects();
 	}
 
 	function getEditProps(shaderDef: hxsl.SharedShader) : Array<hrt.prefab.Props.PropDef> {

+ 2 - 2
hrt/prefab/l3d/Instance.hx

@@ -148,11 +148,11 @@ class Instance extends Object3D {
 		return path;
 	}
 
-	override function editorRemoveInstance() : Void {
+	override function editorRemoveInstanceObjects() : Void {
 		if (icon != null) {
 			icon.remove();
 		}
-		super.editorRemoveInstance();
+		super.editorRemoveInstanceObjects();
 	}
 
 	override function getHideProps() : hide.prefab.HideProps {

+ 2 - 2
hrt/prefab/l3d/Spline.hx

@@ -151,9 +151,9 @@ class SplinePoint extends Object3D {
 
 	#if editor
 
-	override function editorRemoveInstance() : Void {
+	override function editorRemoveInstanceObjects() : Void {
 		shared.editor.queueRebuildCallback(() -> @:privateAccess spline.computeSpline());
-		super.editorRemoveInstance();
+		super.editorRemoveInstanceObjects();
 	}
 
 	public function computeName() {

+ 2 - 1
hrt/prefab/l3d/Spray.hx

@@ -127,8 +127,9 @@ class Spray extends Object3D {
 	}
 
 
-	override function editorRemoveInstance() : Void {
+	override function editorRemoveInstanceObjects() : Void {
 		removeInteractiveBrush();
+		super.editorRemoveInstanceObjects();
 	}
 
 	function clearPreview() {