2
0
Эх сурвалжийг харах

[scene] Added partial support for dragging shadergraphs into the scene

Clément Espeute 11 сар өмнө
parent
commit
92327ca20d

+ 41 - 15
hide/comp/SceneEditor.hx

@@ -3443,12 +3443,34 @@ class SceneEditor {
 		return true;
 	}
 
-	function createDroppedElement(path: String, parent: PrefabElement) : hrt.prefab.Object3D {
-		var prefab : hrt.prefab.Object3D = null;
+	function createDroppedElement(path: String, parent: PrefabElement) : Array<hrt.prefab.Prefab> {
+		var prefab : hrt.prefab.Prefab = null;
 		var relative = ide.makeRelative(path);
 
+		var ptype = hrt.prefab.Prefab.getPrefabType(path);
+		if (ptype == "shgraph") {
+			var parents : Map<hrt.prefab.Prefab, Bool> = [];
+			for (parent in selectedPrefabs) {
+				var p = parent;
+				while (p != null && Std.downcast(p, Object3D) == null && Std.downcast(p, Object2D) == null) {
+					p = p.parent;
+				}
+				parents.set(p, true);
+			}
 
-		if(hrt.prefab.Prefab.getPrefabType(path) != null) {
+			var prefabs : Array<hrt.prefab.Prefab> = [];
+			if (parents.iterator().hasNext() == false) {
+				ide.quickMessage("Please select (valid) prefabs that should recieve the shadergraph before dragging the shadergraph into the scene");
+			}
+			for (parent => _ in parents) {
+				var shgraph = new hrt.prefab.DynamicShader(parent, null);
+				shgraph.source = relative;
+				shgraph.name = new haxe.io.Path(relative).file;
+				prefabs.push(shgraph);
+			}
+			return prefabs;
+		}
+		else if(ptype != null) {
 			var ref = new hrt.prefab.Reference(parent, null);
 			ref.source = relative;
 			if (ref.hasCycle()) {
@@ -3470,11 +3492,12 @@ class SceneEditor {
 			model.source = relative;
 			prefab = model;
 		}
-		return prefab;
+		return [prefab];
 	}
 
 	function dropElements(paths: Array<String>, parent: PrefabElement) {
 		scene.setCurrent();
+
 		var localMat = h3d.Matrix.I();
 		if(scene.hasFocus()) {
 			localMat = getPickTransform(parent);
@@ -3487,14 +3510,18 @@ class SceneEditor {
 
 		var elts: Array<PrefabElement> = [];
 		for(path in paths) {
-			var obj3d = createDroppedElement(path, parent);
-			if (obj3d == null)
-				continue;
-
-			obj3d.setTransform(localMat);
-			autoName(obj3d);
-			elts.push(obj3d);
-
+			var prefabs = createDroppedElement(path, parent);
+			for (prefab in prefabs) {
+				if (prefab == null) {
+					continue;
+				}
+				var obj3d= Std.downcast(prefab, Object3D);
+				if (obj3d != null) {
+					obj3d.setTransform(localMat);
+				}
+				autoName(prefab);
+				elts.push(prefab);
+			}
 		}
 
 		beginRebuild();
@@ -3506,11 +3533,10 @@ class SceneEditor {
 
 		undo.change(Custom(function(undo) {
 			if( undo ) {
-				var fullRefresh = false;
 				beginRebuild();
 				for(e in elts) {
 					removeInstance(e);
-					parent.children.remove(e);
+					e.parent.children.remove(e);
 				}
 				endRebuild();
 				refreshTree(() -> selectElements([], NoHistory));
@@ -3518,7 +3544,7 @@ class SceneEditor {
 			else {
 				beginRebuild();
 				for(e in elts) {
-					parent.children.push(e);
+					e.parent.children.push(e);
 					makePrefab(e);
 				}
 				endRebuild();

+ 2 - 2
hide/view/FXEditor.hx

@@ -103,14 +103,14 @@ private class FXSceneEditor extends hide.comp.SceneEditor {
 		}
 	}
 
-	override function createDroppedElement(path:String, parent:PrefabElement):hrt.prefab.Object3D {
+	override function createDroppedElement(path:String, parent:PrefabElement): Array<hrt.prefab.Prefab> {
 		var type = hrt.prefab.Prefab.getPrefabType(path);
 		if(type == "fx") {
 			var relative = ide.makeRelative(path);
 			var ref = new hrt.prefab.fx.SubFX(parent, null);
 			ref.source = relative;
 			ref.name = new haxe.io.Path(relative).file;
-			return ref;
+			return [ref];
 		}
 		return super.createDroppedElement(path, parent);
 	}