Pārlūkot izejas kodu

[hide] Adding/removing render props now properly refresh the scene

Clément Espeute 11 mēneši atpakaļ
vecāks
revīzija
82938f5832
2 mainītis faili ar 65 papildinājumiem un 23 dzēšanām
  1. 2 0
      bin/defaultProps.json
  2. 63 23
      hide/comp/SceneEditor.hx

+ 2 - 0
bin/defaultProps.json

@@ -33,6 +33,8 @@
 	"key.cut" : "Ctrl-X",
 	"key.paste" : "Ctrl-V",
 	"key.duplicateInPlace" : "Ctrl-D",
+	"key.debugSceneRefresh" : "Ctrl-Shift-R",
+
 	"key.duplicate" : "Ctrl-Shift-D",
 	"key.delete" : "Delete",
 	"key.group" : "Ctrl-G",

+ 63 - 23
hide/comp/SceneEditor.hx

@@ -1011,6 +1011,8 @@ class SceneEditor {
 
 		view.keys.register("duplicate", {name: "Duplicate", category: "Scene"}, duplicate.bind(true));
 		view.keys.register("duplicateInPlace", {name: "Duplicate in place", category: "Scene"}, duplicate.bind(false));
+		view.keys.register("debugSceneRefresh", {name: "Refresh debug scene", category: "Scene"}, () -> {ide.quickMessage("Debug : rebuild(sceneData)"); queueRebuild(sceneData);});
+
 		view.keys.register("group", {name: "Group Selection", category: "Scene"}, groupSelection);
 		view.keys.register("delete", {name: "Delete", category: "Scene"}, () -> deleteElements(selectedPrefabs));
 		view.keys.register("search", {name: "Search", category: "Scene"}, function() tree.openFilter());
@@ -2054,8 +2056,9 @@ class SceneEditor {
 
 		if( @:privateAccess renderPropsRoot.refInstance != null ) {
 			var renderProps = @:privateAccess renderPropsRoot.refInstance.getOpt(hrt.prefab.RenderProps, true);
-			if( renderProps != null )
+			if( renderProps != null ) {
 				renderProps.applyProps(scene.s3d.renderer);
+			}
 		}
 	}
 
@@ -2107,47 +2110,36 @@ class SceneEditor {
 		sceneData.shared.currentPath = view.state.path;
 		sceneData.setEditor(this, this.scene);
 
-		sceneData.make();
 		var bgcol = scene.engine.backgroundColor;
 		scene.init();
 		scene.engine.backgroundColor = bgcol;
-		refreshInteractives();
+
+		rebuild(sceneData);
 
 		var all = sceneData.all();
 		for(elt in all)
 			applySceneStyle(elt);
 
-		// Find latest existing render props in scene
-		var renderProps : Array<hrt.prefab.RenderProps> = cast getAllWithRefs(sceneData, hrt.prefab.RenderProps);
-		for( r in renderProps ) {
-			if( @:privateAccess r.isDefault ) {
-				lastRenderProps = r;
-				break;
-			}
-		}
-
-		if( lastRenderProps == null )
-			lastRenderProps = renderProps[0];
-
-		if (lastRenderProps != null)
-			lastRenderProps.applyProps(scene.s3d.renderer);
-		else {
-			createRenderProps();
-		}
-
 		refreshTree();
 
 		onRefresh();
 	}
 
-	function getAllWithRefs<T:PrefabElement>( p : PrefabElement, cl : Class<T>, ?arr : Array<T> ) : Array<T> {
+	function getAllWithRefs<T:PrefabElement>( p : PrefabElement, cl : Class<T>, ?arr : Array<T>, forceLoad: Bool = false ) : Array<T> {
 		if( arr == null ) arr = [];
 		var v = p.to(cl);
 		if( v != null ) arr.push(v);
 		for( c in p.children )
 			getAllWithRefs(c, cl, arr);
 		var ref = p.to(Reference);
-		@:privateAccess if( ref != null && ref.refInstance != null ) getAllWithRefs(ref.refInstance, cl, arr);
+
+		@:privateAccess
+		if (ref != null && ref.enabled) {
+			if (forceLoad) {
+				ref.resolveRef();
+			}
+			if (ref.refInstance != null) getAllWithRefs(ref.refInstance, cl, arr, forceLoad);
+		}
 		return arr;
 	}
 
@@ -4223,6 +4215,12 @@ class SceneEditor {
 				rebuildQueue.set(target, wantRebuild);
 				checkWantRebuild(target.parent, original);
 		}
+
+		if (target == sceneData) {
+			var renderProps = original.find(hrt.prefab.RenderProps, null, true);
+			if (renderProps != null)
+				queueRebuild(target);
+		}
 	}
 
 	var rebuildQueue : Map<PrefabElement, hrt.prefab.Prefab.TreeChangedResult> = null;
@@ -4300,6 +4298,11 @@ class SceneEditor {
 		scene.setCurrent();
 
 		prefab.editorRemoveInstance();
+		if (prefab == sceneData) {
+			for (c in prefab) {
+				c.editorRemoveInstance();
+			}
+		}
 
 		var enabled = prefab.enabled && !prefab.inGameOnly;
 		var actuallyInWorld = prefab == sceneData || (prefab.parent != null && prefab.parent.has(prefab));
@@ -4314,6 +4317,43 @@ class SceneEditor {
 			makeInteractive(p);
 			applySceneStyle(p);
 		}
+
+		if (prefab == sceneData) {
+			var previousRenderProps = lastRenderProps;
+
+			var newRenderProps = null;
+			var renderProps : Array<hrt.prefab.RenderProps> = cast getAllWithRefs(sceneData, hrt.prefab.RenderProps);
+			for( r in renderProps ) {
+				if( @:privateAccess r.isDefault ) {
+					newRenderProps = r;
+					break;
+				}
+			}
+
+			if( newRenderProps == null )
+				newRenderProps = renderProps[0];
+
+			if (newRenderProps != previousRenderProps) {
+				previousRenderProps?.editorRemoveInstance();
+				scene.s3d.renderer.props = scene.s3d.renderer.getDefaultProps();
+				lastRenderProps = newRenderProps;
+				if (lastRenderProps != null) {
+					if (renderPropsRoot != null) {
+						renderPropsRoot.editorRemoveInstance();
+						renderPropsRoot = null;
+					}
+
+					lastRenderProps.applyProps(scene.s3d.renderer);
+				} else {
+					createRenderProps();
+				}
+			}
+			else {
+				if (renderPropsRoot == null) {
+					createRenderProps();
+				}
+			}
+		}
 	}
 
 	function autoName(p : PrefabElement) {