Procházet zdrojové kódy

Spline editor: better point placement

lviguier před 1 rokem
rodič
revize
c91e153f86
2 změnil soubory, kde provedl 81 přidání a 1 odebrání
  1. 36 0
      hide/comp/SceneEditor.hx
  2. 45 1
      hide/prefab/SplineEditor.hx

+ 36 - 0
hide/comp/SceneEditor.hx

@@ -1141,6 +1141,42 @@ class SceneEditor {
 		grid.setPosition(-1 * gridSize / 2, -1 * gridSize / 2, 0);
 	}
 
+	public function createGrid(origin : Vector, normal : h3d.Vector, gridSize : Float, gridStep : Float, color : Vector) : h3d.scene.Object {
+		var grid = new h3d.scene.Graphics(scene.s3d);
+		grid.scale(1);
+		grid.material.mainPass.setPassName("overlay");
+
+		var hsl = color.toColorHSL();
+
+        var mov = 0.1;
+
+        if (snapToggle) {
+            mov = 0.2;
+            hsl.y += (1.0-hsl.y) * 0.2;
+        }
+		if(hsl.z > 0.5) hsl.z -= mov;
+		else hsl.z += mov;
+
+		color.makeColor(hsl.x, hsl.y, hsl.z);
+
+		grid.lineStyle(1.0, color.toColor(), 1.0);
+		var start = -1 * gridSize / 2;
+		for(i in 0...(hxd.Math.floor(gridSize / gridStep) + 1)) {
+			grid.moveTo(0, start + (i * gridStep), start);
+			grid.lineTo(0, start + (i * gridStep), start + gridSize);
+
+			grid.moveTo(0, start, start + (i * gridStep));
+			grid.lineTo(0, start + gridSize, start + (i * gridStep));
+		}
+
+		grid.lineStyle(0);
+
+		grid.setPosition(origin.x, origin.y, origin.z);
+		grid.setDirection(normal * -1.0, new h3d.Vector(0, 0, 1));
+
+		return grid;
+	}
+
 	function updateStats() {
 		if( statusText.visible ) {
 			var memStats = scene.engine.mem.stats();

+ 45 - 1
hide/prefab/SplineEditor.hx

@@ -86,6 +86,8 @@ class SplineEditor {
 	var gizmos : Array<hrt.tools.Gizmo> = [];
 	var newSplinePointViewer : NewSplinePointViewer;
 
+	var grid : h3d.scene.Object;
+
 	public function new( prefab : Spline, undo : hide.ui.UndoHistory ){
 		this.prefab = prefab;
 		this.undo = undo;
@@ -143,7 +145,7 @@ class SplineEditor {
 		if( !prefab.loop && (closestPt.next == null || closestPt.prev == null) ) {
 			var camera = @:privateAccess prefab.local3d.getScene().camera;
 			var ray = camera.rayFromScreen(mouseX, mouseY);
-			var normal = closestPt.next == null ? closestPt.prev.getAbsPos().up().toPoint() : closestPt.next.getAbsPos().up().toPoint();
+			var normal = getClosestPlanNormal();
 			var point = closestPt.next == null ? closestPt.prev.getAbsPos().getPosition().toPoint() : closestPt.next.getAbsPos().getPosition().toPoint();
 			var plane = h3d.col.Plane.fromNormalPoint(normal, point);
 			var pt = ray.intersect(plane);
@@ -153,6 +155,33 @@ class SplineEditor {
 			return closestPt;
 	}
 
+	/**
+		Used to get the normal of the plan that is the more parallel to the viewport
+	**/
+	function getClosestPlanNormal() {
+		var camera = @:privateAccess prefab.local3d.getScene().camera;
+		var x = new h3d.Vector(1,0,0);
+		var y = new h3d.Vector(0,1,0);
+		var z = new h3d.Vector(0,0,1);
+
+		var normal = x;
+		var dot = Math.abs(camera.getForward().dot(x));
+
+		var tmpDot = Math.abs(camera.getForward().dot(y));
+		if (tmpDot > dot) {
+			normal = y;
+			dot = tmpDot;
+		}
+
+		tmpDot = Math.abs(camera.getForward().dot(z));
+		if (tmpDot > dot) {
+			normal = z;
+			dot = tmpDot;
+		}
+
+		return normal;
+	}
+
 	function getClosestPointFromMouse( mouseX : Float, mouseY : Float) : SplinePointData {
 
 		if(prefab == null || prefab.local3d == null || prefab.local3d.getScene() == null )
@@ -519,11 +548,26 @@ class SplineEditor {
 						newSplinePointViewer.visible = true;
 
 						var npt = getNewPointPosition(s2d.mouseX, s2d.mouseY);
+
+						if (grid != null) {
+							grid.remove();
+							grid = null;
+						}
+
+						var normal = getClosestPlanNormal();
+						var closest = getClosestPointFromMouse(s2d.mouseX, s2d.mouseY);
+						grid = editContext.scene.editor.createGrid(closest.pos , normal, 200, 1, normal * 0.2);
+
 						newSplinePointViewer.update(npt);
 					}
 					else {
 						if( newSplinePointViewer != null )
 							newSplinePointViewer.visible = false;
+
+						if (grid != null) {
+							grid.remove();
+							grid = null;
+						}
 					}
 
 					if( K.isDown( K.SHIFT ) ) {