浏览代码

Multiselection, snapping

trethaller 7 年之前
父节点
当前提交
3c3e835f66
共有 2 个文件被更改,包括 53 次插入34 次删除
  1. 4 0
      hide/ui/Ide.hx
  2. 49 34
      hide/view/Level3D.hx

+ 4 - 0
hide/ui/Ide.hx

@@ -107,6 +107,10 @@ class Ide {
 				}
 			}
 		});
+
+		var stage = new hxd.Stage(js.Browser.document.createCanvasElement(), true);
+		stage.setCurrent();
+		hxd.Key.initialize();
 	}
 
 	function get_isWindows() {

+ 49 - 34
hide/view/Level3D.hx

@@ -1,7 +1,8 @@
 package hide.view;
 import hxd.Math;
+import hxd.Key as K;
 
-import hide.prefab.Prefab in PrefabElement;
+import hide.prefab.Prefab as PrefabElement;
 import h3d.scene.Object;
 
 class LevelEditContext extends hide.prefab.EditContext {
@@ -57,6 +58,8 @@ class Gizmo3D extends h3d.scene.Object {
 
 	var gizmo: h3d.scene.Object;
 	var scene : hide.comp.Scene;
+	var moveStep = 0.5;
+	var rotateStep = 10.0 * Math.PI / 180.0;
 
 	var updateFunc: Float -> Void;
 
@@ -78,7 +81,7 @@ class Gizmo3D extends h3d.scene.Object {
 			var o = gizmo.getObjectByName(objname);
 			var mat = o.getMaterials()[0];
 			mat.mainPass.setPassName("ui");
-			mat.mainPass.depth(false, Always);
+			mat.mainPass.depth(true, Always);
 			var m = o.getMeshes()[0];
 			var int = new h3d.scene.Interactive(m.getCollider(), scene.s3d);
 			var highlight = hxd.Math.colorLerp(color, 0xffffff, 0.5);
@@ -117,26 +120,28 @@ class Gizmo3D extends h3d.scene.Object {
 					var delta = curPt.sub(startDragPt);
 					var translate = new h3d.Vector(0,0,0);
 					var quat = new h3d.Quat();
-					if(mode == MoveX || mode == MoveXY || mode == MoveZX) translate.x = delta.x;
-					if(mode == MoveY || mode == MoveYZ || mode == MoveXY) translate.y = delta.y;
-					if(mode == MoveZ || mode == MoveZX || mode == MoveYZ) translate.z = delta.z;
+
+					inline function snap(m: Float) {
+						return moveStep > 0.0 ? hxd.Math.round(m / moveStep) * moveStep : m;
+					}
+
+					if(mode == MoveX || mode == MoveXY || mode == MoveZX) translate.x = snap(delta.x);
+					if(mode == MoveY || mode == MoveYZ || mode == MoveXY) translate.y = snap(delta.y);
+					if(mode == MoveZ || mode == MoveZX || mode == MoveYZ) translate.z = snap(delta.z);
 					
-					x = startPos.x + translate.x;
-					y = startPos.y + translate.y;
-					z = startPos.z + translate.z;
+					x = (startPos.x + translate.x);
+					y = (startPos.y + translate.y);
+					z = (startPos.z + translate.z);
 
 					if(mode == RotateX || mode == RotateY || mode == RotateZ) {
-						// debug.clear();
-						// debug.lineStyle(2, 0x00ff00, 1.0);
-						// debug.moveTo(startDragPt.x, startDragPt.y, startDragPt.z);
-						// debug.lineTo(startPos.x, startPos.y, startPos.z);
-						// debug.lineTo(curPt.x, curPt.y, curPt.z);
 						var v1 = startDragPt.sub(startPos);
 						v1.normalize();
 						var v2 = curPt.sub(startPos);
 						v2.normalize();
 
 						var angle = Math.atan2(v1.cross(v2).dot(norm), v1.dot(v2));
+						if(rotateStep > 0)
+							angle = hxd.Math.round(angle / rotateStep) * rotateStep;
 						quat.initRotateAxis(norm.x, norm.y, norm.z, angle);
 						setRotationQuat(quat);
 					}
@@ -258,19 +263,36 @@ class Level3D extends FileView {
 
 	function refresh( ?callb ) {
 		var sh = context.shared;
-		sh.root2d.remove();
 		sh.root3d.remove();
 		for( f in sh.cleanups )
 			f();
-		sh.root2d = new h2d.Sprite();
 		sh.root3d = new h3d.scene.Object();
 		sh.cleanups = [];
 		context.init();
 		data.makeInstance(context);
-		scene.s2d.addChild(sh.root2d);
 		scene.s3d.addChild(sh.root3d);
 		scene.init(props);
 		tree.refresh(callb);
+
+		var all = sh.contexts.keys();
+		for(elt in all) {
+			var ctx = sh.contexts[elt];
+			if(ctx.local3d != null) {
+				var o = ctx.local3d;
+				var m = o.getMeshes()[0];
+				var int = new h3d.scene.Interactive(m.getCollider(), scene.s3d);
+				int.onClick = function(e) {
+					if(K.isDown(K.CTRL) && curEdit != null) {
+						var list = curEdit.elements.copy();
+						list.push(elt);
+						selectObjects(list);
+					}
+					else {
+						selectObjects([elt]);
+					}
+				}
+			}
+		}
 	}
 
 	function allocName( prefix : String ) {
@@ -336,14 +358,6 @@ class Level3D extends FileView {
 					var newMat = localMats[i].clone();
 					newMat.multiply(newMat, transf);
 					newMat.multiply(newMat, pivot);
-					// var obj = objects[i];
-					// obj.x = newMat.tx;
-					// obj.y = newMat.ty;
-					// obj.z = newMat.tz;
-					// var q = new h3d.Quat();
-					// q.initRotateMatrix(newMat);
-					// q.normalize();
-
 					var rot = newMat.getEulerAngles();
 					var obj3d = objects3d[i];
 					obj3d.x = newMat.tx;
@@ -600,16 +614,17 @@ class Level3D extends FileView {
 			return true;
 		};
 
-
-		if( curEdit != null ) {
-			curEdit.cleanup();
-			// var e = curEdit.elt.name;
-			// var elt = data.getPrefabByName(e);
-			// if( elt != null ) selectObject(elt);
-			if(curEdit != null) {
-				selectObjects(curEdit.elements);
-			}
-		}
+		refresh();
+
+		// if( curEdit != null ) {
+		// 	curEdit.cleanup();
+		// 	// var e = curEdit.elt.name;
+		// 	// var elt = data.getPrefabByName(e);
+		// 	// if( elt != null ) selectObject(elt);
+		// 	if(curEdit != null) {
+		// 		selectObjects(curEdit.elements);
+		// 	}
+		// }
 	}
 
 	function update(dt:Float) {