Pārlūkot izejas kodu

Fix refresh bug, support gizmo transform for nested objects

trethaller 7 gadi atpakaļ
vecāks
revīzija
3adc897f04
3 mainītis faili ar 75 papildinājumiem un 33 dzēšanām
  1. 27 18
      hide/comp/IconTree.hx
  2. 1 0
      hide/view/FileTree.hx
  3. 47 15
      hide/view/Level3D.hx

+ 27 - 18
hide/comp/IconTree.hx

@@ -9,6 +9,7 @@ typedef IconTreeItem<T> = {
 		@:optional var opened : Bool;
 		@:optional var selected : Bool;
 		@:optional var disabled : Bool;
+		@:optional var loaded : Bool;
 	};
 	@:optional private var id : String; // internal usage
 	@:optional private var absKey : String; // internal usage
@@ -23,6 +24,7 @@ class IconTree<T:{}> extends Component {
 	var revMapString : haxe.ds.StringMap<IconTreeItem<T>> = new haxe.ds.StringMap();
 	var revMap : haxe.ds.ObjectMap<T, IconTreeItem<T>> = new haxe.ds.ObjectMap();
 	public var allowRename : Bool;
+	public var async : Bool = false;
 
 	public dynamic function get( parent : Null<T> ) : Array<IconTreeItem<T>> {
 		return [{ data : null, text : "get()", children : true }];
@@ -48,6 +50,29 @@ class IconTree<T:{}> extends Component {
 	public dynamic function onMove( e : T, to : T, index : Int ) {
 	}
 
+	function makeContent(parent:IconTreeItem<T>) {
+		var content : Array<IconTreeItem<T>> = get(parent == null ? null : parent.data);
+		for( c in content ) {
+			var key = (parent == null ? "" : parent.absKey + "/") + c.text;
+			if( c.absKey == null ) c.absKey = key;
+			c.id = "titem$" + (UID++);
+			map.set(c.id, c);
+			if( Std.is(c.data, String) )
+				revMapString.set(cast c.data, c);
+			else
+				revMap.set(c.data, c);
+			if( c.state == null ) {
+				var s = getDisplayState(key);
+				if( s != null ) c.state = { opened : s } else c.state = {};
+			}
+			if( !async ) {
+				c.state.loaded = true;
+				c.children = cast makeContent(c);
+			}
+		}
+		return content;		
+	}
+
 	public function init() {
 		(untyped root.jstree)({
 			core : {
@@ -70,23 +95,7 @@ class IconTree<T:{}> extends Component {
 					return false;
 				},
 				data : function(obj, callb) {
-					var parent = obj.parent == null ? null : map.get(obj.id);
-					var content : Array<IconTreeItem<T>> = get(parent == null ? null : parent.data);
-					for( c in content ) {
-						var key = (parent == null ? "" : parent.absKey + "/") + c.text;
-						if( c.absKey == null ) c.absKey = key;
-						c.id = "titem$" + (UID++);
-						map.set(c.id, c);
-						if( Std.is(c.data, String) )
-							revMapString.set(cast c.data, c);
-						else
-							revMap.set(c.data, c);
-						if( c.state == null ) {
-							var s = getDisplayState(key);
-							if( s != null ) c.state = { opened : s };
-						}
-					}
-					callb.call(this,content);
+					callb.call(this, makeContent(obj.parent == null ? null : map.get(obj.id)));
 				}
 			},
 			plugins : [ "wholerow", "dnd" ],
@@ -150,7 +159,7 @@ class IconTree<T:{}> extends Component {
 		(untyped root.jstree)('select_node',ids);
 	}
 
-	public function refresh( ?onReady : Void -> Void ) {
+	public function refresh( ?onReady : Void -> Void ) {		
 		if( onReady != null ) waitRefresh.push(onReady);
 		(untyped root.jstree)('refresh',true);
 	}

+ 1 - 0
hide/view/FileTree.hx

@@ -62,6 +62,7 @@ class FileTree extends FileView {
 
 		var panel = new Element("<div class='hide-scroll'>").appendTo(root);
 		tree = new hide.comp.IconTree(panel);
+		tree.async = true;
 		tree.saveDisplayKey = "FileTree:" + getPath().split("\\").join("/").substr(0,-1);
 		tree.get = function(path) {
 			if( path == null ) path = "";

+ 47 - 15
hide/view/Level3D.hx

@@ -8,18 +8,38 @@ import h3d.scene.Object;
 class LevelEditContext extends hide.prefab.EditContext {
 
 	public var elements : Array<PrefabElement>;
+	var rootObjects: Array<Object>;
 
 	public function new(ctx, elts) {
 		super(ctx);
 		this.elements = elts;
+		rootObjects = [];
+		for(elt in elements) {
+			if(!hasParent(elt, elements)) {
+				rootObjects.push(getContext(elt).local3d);
+			}
+		}
+	}
+
+	static function hasParent(elt: PrefabElement, list: Array<PrefabElement>) {
+		for(p in list) {
+			if(isParent(elt, p))
+				return true;
+		}
+		return false;
 	}
 
-	public function getContexts() {
-		return [for(e in elements) getContext(e)];
+	static function isParent(elt: PrefabElement, parent: PrefabElement) {
+		var p = elt.parent;
+		while(p != null) {
+			if(p == parent) return true;
+			p = p.parent;
+		}
+		return false;
 	}
 
 	public function objects() {
-		return [for(e in elements) getContext(e).local3d];
+		return rootObjects; // [for(e in elements) getContext(e).local3d];
 	}
 
 	override function rebuild() {
@@ -89,14 +109,16 @@ class Gizmo3D extends h3d.scene.Object {
 			var mat = o.getMaterials()[0];
 			mat.mainPass.setPassName("ui");
 			mat.mainPass.depth(true, Always);
+			mat.blendMode = Alpha;
 			var mesh = hit.getMeshes()[0];
 			var int = new h3d.scene.Interactive(mesh.getCollider(), scene.s3d);
 			int.priority = 100;
-			var highlight = hxd.Math.colorLerp(color, 0xffffff, 0.5);
-			color = hxd.Math.colorLerp(color, 0, 0.2);
+			var highlight = hxd.Math.colorLerp(color, 0xffffffff, 0.1);
+			color = hxd.Math.colorLerp(color, 0xff000000, 0.2);
 			mat.color.setColor(color);
 			int.onOver = function(e : hxd.Event) {
 				mat.color.setColor(highlight);
+				mat.color.w = 1.0;
 			}
 			int.onOut = function(e : hxd.Event) {
 				mat.color.setColor(color);
@@ -168,15 +190,15 @@ class Gizmo3D extends h3d.scene.Object {
 			}
 		}
 
-		setup("xAxis", 0xff0000, MoveX);
-		setup("yAxis", 0x00ff00, MoveY);
-		setup("zAxis", 0x0000ff, MoveZ);
-		setup("xy", 0xffff00, MoveXY);
-		setup("xz", 0xffff00, MoveZX);
-		setup("yz", 0xffff00, MoveYZ);
-		setup("xRotate", 0xff0000, RotateX);
-		setup("yRotate", 0x00ff00, RotateY);
-		setup("zRotate", 0x0000ff, RotateZ);
+		setup("xAxis", 0x90ff0000, MoveX);
+		setup("yAxis", 0x9000ff00, MoveY);
+		setup("zAxis", 0x900000ff, MoveZ);
+		setup("xy", 0x90ffff00, MoveXY);
+		setup("xz", 0x90ffff00, MoveZX);
+		setup("yz", 0x90ffff00, MoveYZ);
+		setup("xRotate", 0x90ff0000, RotateX);
+		setup("yRotate", 0x9000ff00, RotateY);
+		setup("zRotate", 0x900000ff, RotateZ);
 	}
 
 
@@ -268,6 +290,7 @@ class Level3D extends FileView {
 		scene = new hide.comp.Scene(root.find(".scene"));
 		scene.onReady = init;
 		tree = new hide.comp.IconTree(root.find(".tree"));
+		tree.async = false;
 		currentVersion = undo.currentID;
 	}
 
@@ -352,6 +375,11 @@ class Level3D extends FileView {
 			pivot.initTranslate(pivotPt.x, pivotPt.y, pivotPt.z);
 			var invPivot = pivot.clone();
 			invPivot.invert();
+
+			// inline function worldMat(o: Object) {
+
+			// }
+
 			var localMats = [for(o in objects) {
 				var m = o.defaultTransform.clone();
 				m.invert();
@@ -371,8 +399,11 @@ class Level3D extends FileView {
 					var newMat = localMats[i].clone();
 					newMat.multiply(newMat, transf);
 					newMat.multiply(newMat, pivot);
-					var rot = newMat.getEulerAngles();
+					var invParent = objects[i].parent.getAbsPos().clone();
+					invParent.invert();
+					newMat.multiply(newMat, invParent);
 					var obj3d = objects3d[i];
+					var rot = newMat.getEulerAngles();
 					obj3d.x = newMat.tx;
 					obj3d.y = newMat.ty;
 					obj3d.z = newMat.tz;
@@ -627,6 +658,7 @@ class Level3D extends FileView {
 			return true;
 		};
 
+		refresh();
 		refresh();
 
 		// if( curEdit != null ) {