Ver Fonte

[camera] Configurable Snap To Ground for editor camera

Clement Espeute há 1 ano atrás
pai
commit
ba7c07dacf
3 ficheiros alterados com 49 adições e 33 exclusões
  1. 8 0
      hide/comp/CameraControllerEditor.hx
  2. 24 21
      hide/comp/SceneEditor.hx
  3. 17 12
      hide/view/CameraController.hx

+ 8 - 0
hide/comp/CameraControllerEditor.hx

@@ -102,6 +102,14 @@ class CameraControllerEditor extends Popup {
             });
         }
 
+		{
+            var dd = new Element("<label for='snapToGround'>").text("Snap To Ground").appendTo(form_div);
+            var cb = new Element("<input id='snapToGround' type='checkbox'>").prop("checked", editor.cameraController.snapToGround).appendTo(form_div);
+			cb.on("change", function(_) {
+				editor.cameraController.snapToGround = cb.prop("checked");
+			});
+		}
+
         {
             var dd = new Element("<label for='cam-speed'>").text("Fly Speed").appendTo(form_div);
             var range = new Range(form_div, new Element("<input id='cam-speed' type='range' min='1' max='8' step='1'>"));

+ 24 - 21
hide/comp/SceneEditor.hx

@@ -3894,27 +3894,30 @@ class SceneEditor {
 		return groundPrefabsCache.copy();
 	}
 
-	public function projectToGround(ray: h3d.col.Ray, ?paintOn : hrt.prefab.Prefab ) {
+	public function projectToGround(ray: h3d.col.Ray, ?paintOn : hrt.prefab.Prefab, ignoreTerrain: Bool = false) {
 		var minDist = -1.;
 
-		for( elt in (paintOn == null ? getGroundPrefabs() : [paintOn]) ) {
-			var obj = Std.downcast(elt, Object3D);
-			if( obj == null ) continue;
-
-			var local3d = obj.findFirstLocal3d();
-			var lray = ray.clone();
-			lray.transform(local3d.getInvPos());
-			var dist = obj.localRayIntersection(lray);
-			if( dist > 0 ) {
-				var pt = lray.getPoint(dist);
-				pt.transform(local3d.getAbsPos());
-				var dist = pt.sub(ray.getPos()).length();
-				if( minDist < 0 || dist < minDist )
-					minDist = dist;
+		if (!ignoreTerrain) {
+			for( elt in (paintOn == null ? getGroundPrefabs() : [paintOn]) ) {
+				var obj = Std.downcast(elt, Object3D);
+				if( obj == null ) continue;
+
+				var local3d = obj.findFirstLocal3d();
+				var lray = ray.clone();
+				lray.transform(local3d.getInvPos());
+				var dist = obj.localRayIntersection(lray);
+				if( dist > 0 ) {
+					var pt = lray.getPoint(dist);
+					pt.transform(local3d.getAbsPos());
+					var dist = pt.sub(ray.getPos()).length();
+					if( minDist < 0 || dist < minDist )
+						minDist = dist;
+				}
 			}
+			if( minDist >= 0 )
+				return minDist;
 		}
-		if( minDist >= 0 )
-			return minDist;
+
 
 		var zPlane = h3d.col.Plane.Z(0);
 		var pt = ray.intersect(zPlane);
@@ -3928,19 +3931,19 @@ class SceneEditor {
 		return minDist;
 	}
 
-	public function screenDistToGround(sx : Float, sy : Float, ?paintOn : hrt.prefab.Prefab) : Null<Float> {
+	public function screenDistToGround(sx : Float, sy : Float, ?paintOn : hrt.prefab.Prefab, ignoreTerrain: Bool = false) : Null<Float> {
 		var camera = scene.s3d.camera;
 		var ray = camera.rayFromScreen(sx, sy);
-		var dist = projectToGround(ray, paintOn);
+		var dist = projectToGround(ray, paintOn, ignoreTerrain);
 		if( dist >= 0 )
 			return dist + camera.zNear;
 		return null;
 	}
 
-	public function screenToGround(sx: Float, sy: Float, ?paintOn : hrt.prefab.Prefab ) {
+	public function screenToGround(sx: Float, sy: Float, ?paintOn : hrt.prefab.Prefab, ignoreTerrain: Bool = false) {
 		var camera = scene.s3d.camera;
 		var ray = camera.rayFromScreen(sx, sy);
-		var dist = projectToGround(ray, paintOn);
+		var dist = projectToGround(ray, paintOn, ignoreTerrain);
 		if(dist >= 0) {
 			return ray.getPoint(dist);
 		}

+ 17 - 12
hide/view/CameraController.hx

@@ -17,10 +17,13 @@ class CameraControllerBase extends h3d.scene.CameraController {
 	public var zNear = 0.1;
 	public var zFar = 10000.0;
 
+	public var snapToGround = true;
+
 	public function loadFOVFromCamera() {
 		var scene = if( scene == null ) getScene() else scene;
 		var cam = scene.camera;
 		zNear = cam.zNear;
+
 		zFar = cam.zFar;
 		wantedFOV = cam.fovY;
 	}
@@ -39,6 +42,7 @@ class CameraControllerBase extends h3d.scene.CameraController {
 
 		zNear = data.zNear != null ? data.zNear : zNear;
 		zFar = data.zFar != null ? data.zFar : zFar;
+		snapToGround = data.snapToGround ?? snapToGround;
 	}
 
 	public function saveSettings(data : Dynamic) : Void {
@@ -46,6 +50,7 @@ class CameraControllerBase extends h3d.scene.CameraController {
 		data.camSpeed = camSpeed;
 		data.zNear = zNear;
 		data.zFar = zFar;
+		data.snapToGround = snapToGround;
 	}
 
 	function offset(pt:h3d.Vector) {
@@ -101,8 +106,8 @@ class OrthoController extends CameraControllerBase {
 				var selection = se.getSelection();
 				var angle = hxd.Math.abs(Math.PI/2 - phi);
 				if( selection.length == 0 && angle > groundSnapAngle ) {
-					var visGround = se.screenToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2);
-					var dist = se.screenDistToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2);
+					var visGround = se.screenToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2, !snapToGround);
+					var dist = se.screenDistToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2, !snapToGround);
 					if( dist != null ) {
 						set(dist, null, null, visGround);
 					}
@@ -141,8 +146,8 @@ class OrthoController extends CameraControllerBase {
 						}
 						else {
 							var se = sceneEditor;
-							var fromPt = se.screenToGround(startPush.x, startPush.y);
-							var toPt = se.screenToGround(startPush.x+e.relX-pushX, startPush.y+e.relY-pushY);
+							var fromPt = se.screenToGround(startPush.x, startPush.y, !snapToGround);
+							var toPt = se.screenToGround(startPush.x+e.relX-pushX, startPush.y+e.relY-pushY, !snapToGround);
 							if(fromPt == null || toPt == null)
 								return;
 							var delta = toPt.sub(fromPt).toVector();
@@ -270,8 +275,8 @@ class FPSController extends CameraControllerBase {
 						var angle = hxd.Math.abs(Math.PI/2 - phi);
 
 						var se = sceneEditor;
-						var fromPt = se.screenToGround(startPush.x, startPush.y);
-						var toPt = se.screenToGround(startPush.x+e.relX-pushX, startPush.y+e.relY-pushY);
+						var fromPt = se.screenToGround(startPush.x, startPush.y, !snapToGround);
+						var toPt = se.screenToGround(startPush.x+e.relX-pushX, startPush.y+e.relY-pushY, !snapToGround);
 						if(fromPt == null || toPt == null)
 							return;
 						var delta = toPt.sub(fromPt).toVector();
@@ -382,8 +387,8 @@ class CamController extends CameraControllerBase {
 				var selection = se.getSelection();
 				var angle = hxd.Math.abs(Math.PI/2 - phi);
 				if( selection.length == 0 && angle > groundSnapAngle ) {
-					var visGround = se.screenToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2);
-					var dist = se.screenDistToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2);
+					var visGround = se.screenToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2, !snapToGround);
+					var dist = se.screenDistToGround(se.scene.s2d.width / 2, se.scene.s2d.height / 2, !snapToGround);
 					if( dist != null ) {
 						set(dist, null, null, visGround);
 					}
@@ -419,8 +424,8 @@ class CamController extends CameraControllerBase {
 						}
 						else {
 							var se = sceneEditor;
-							var fromPt = se.screenToGround(startPush.x, startPush.y);
-							var toPt = se.screenToGround(startPush.x+e.relX-pushX, startPush.y+e.relY-pushY);
+							var fromPt = se.screenToGround(startPush.x, startPush.y, !snapToGround);
+							var toPt = se.screenToGround(startPush.x+e.relX-pushX, startPush.y+e.relY-pushY, !snapToGround);
 							if(fromPt == null || toPt == null)
 								return;
 							var delta = toPt.sub(fromPt).toVector();
@@ -664,8 +669,8 @@ class FlightController extends CameraControllerBase {
 						var angle = hxd.Math.abs(Math.PI/2 - phi);
 
 						var se = sceneEditor;
-						var fromPt = se.screenToGround(startPush.x, startPush.y);
-						var toPt = se.screenToGround(startPush.x+e.relX-pushX, startPush.y+e.relY-pushY);
+						var fromPt = se.screenToGround(startPush.x, startPush.y, !snapToGround);
+						var toPt = se.screenToGround(startPush.x+e.relX-pushX, startPush.y+e.relY-pushY, !snapToGround);
 						if(fromPt == null || toPt == null)
 							return;
 						var delta = toPt.sub(fromPt).toVector();