Răsfoiți Sursa

[scene] Improvement to scene reloading

Clément Espeute 11 luni în urmă
părinte
comite
352d59996c

+ 17 - 11
hide/comp/SceneEditor.hx

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

+ 2 - 2
hrt/prefab/Light.hx

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

+ 2 - 2
hrt/prefab/Material.hx

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

+ 2 - 2
hrt/prefab/Object3D.hx

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

+ 13 - 1
hrt/prefab/Prefab.hx

@@ -577,10 +577,22 @@ class Prefab {
 		return true;
 		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.
 		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
 	#if editor
 
 
-	override function editorRemoveInstance() : Void {
+	override function editorRemoveInstanceObjects() : Void {
 		shared.editor.queueRebuild(parent);
 		shared.editor.queueRebuild(parent);
-		super.editorRemoveInstance();
+		super.editorRemoveInstanceObjects();
 	}
 	}
 
 
 	function getEditProps(shaderDef: hxsl.SharedShader) : Array<hrt.prefab.Props.PropDef> {
 	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;
 		return path;
 	}
 	}
 
 
-	override function editorRemoveInstance() : Void {
+	override function editorRemoveInstanceObjects() : Void {
 		if (icon != null) {
 		if (icon != null) {
 			icon.remove();
 			icon.remove();
 		}
 		}
-		super.editorRemoveInstance();
+		super.editorRemoveInstanceObjects();
 	}
 	}
 
 
 	override function getHideProps() : hide.prefab.HideProps {
 	override function getHideProps() : hide.prefab.HideProps {

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

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