Jelajahi Sumber

Add world snap for polygon editor

ShiroSmith 6 tahun lalu
induk
melakukan
4cba554bff
1 mengubah file dengan 18 tambahan dan 4 penghapusan
  1. 18 4
      hide/prefab/PolygonEditor.hx

+ 18 - 4
hide/prefab/PolygonEditor.hx

@@ -117,6 +117,7 @@ class PolygonEditor {
 	public var showDebug : Bool;
 	public var gridSize = 1;
 	public var showTriangles : Bool = false;
+	public var worldSnap = false;
 
 	var polygonPrefab : hide.prefab.l3d.Polygon;
 	var undo : hide.ui.UndoHistory;
@@ -310,13 +311,25 @@ class PolygonEditor {
 		return edge;
 	}
 
-	function getFinalPos(mouseX, mouseY){
+	function getFinalPos( mouseX, mouseY ){
 		var worldPos = screenToWorld(mouseX, mouseY).toVector();
 		var localPos = getContext().local3d.globalToLocal(worldPos);
 		if( K.isDown( K.CTRL ) ){ // Snap To Grid with Ctrl
-			localPos.x = hxd.Math.round(worldPos.x / gridSize) * gridSize;
-			localPos.y = hxd.Math.round(worldPos.y / gridSize) * gridSize;
-			localPos.z = hxd.Math.round(worldPos.z / gridSize) * gridSize;
+			var gridPos = new h3d.Vector();
+			if( worldSnap ){
+				var absPos = getContext().local3d.getAbsPos();
+				worldPos = getContext().local3d.localToGlobal(worldPos);
+				gridPos.x = hxd.Math.round(localPos.x / gridSize) * gridSize;
+				gridPos.y = hxd.Math.round(localPos.y / gridSize) * gridSize;
+				gridPos.z = hxd.Math.round(localPos.z / gridSize) * gridSize;
+				gridPos = getContext().local3d.globalToLocal(gridPos);
+			}
+			else{
+				gridPos.x = hxd.Math.round(worldPos.x / gridSize) * gridSize;
+				gridPos.y = hxd.Math.round(worldPos.y / gridSize) * gridSize;
+				gridPos.z = hxd.Math.round(worldPos.z / gridSize) * gridSize;
+			}
+			localPos = gridPos;
 		}
 		return localPos;
 	}
@@ -546,6 +559,7 @@ class PolygonEditor {
 				<dt>Show Debug</dt><dd><input type="checkbox" field="showDebug"/></dd>
 				<dt>Show Triangles</dt><dd><input type="checkbox" field="showTriangles"/></dd>
 				<dt>Grid Size</dt><dd><input type="range" min="0" max="10" field="gridSize"/></dd>
+				<dt>World Snap</dt><dd><input type="checkbox" field="worldSnap"/></dd>
 			</div>
 			<div align="center">
 				<div class="group" name="Points">