Kaynağa Gözat

Spline: add recenter spline button

lviguier 9 ay önce
ebeveyn
işleme
7d06451f64
3 değiştirilmiş dosya ile 76 ekleme ve 13 silme
  1. 3 0
      bin/style.css
  2. 4 0
      bin/style.less
  3. 69 13
      hrt/prefab/l3d/Spline.hx

+ 3 - 0
bin/style.css

@@ -3926,3 +3926,6 @@ hide-popover hide-content {
 .spline-editor .points-inspector .content .points-container .point.selected .body {
   background-color: #4f657f;
 }
+.spline-editor .btn {
+  margin-top: 5px;
+}

+ 4 - 0
bin/style.less

@@ -4612,4 +4612,8 @@ hide-popover {
 			}
 		}
 	}
+
+	.btn {
+		margin-top: 5px;
+	}
 }

+ 69 - 13
hrt/prefab/l3d/Spline.hx

@@ -314,6 +314,24 @@ class Spline extends hrt.prefab.Object3D {
 		}
 	}
 
+	public function recenterSpline() {
+		var centroid = new h3d.col.Point();
+		for (p in points) {
+			centroid += p.pos;
+		}
+		centroid *= 1./points.length;
+
+		x += centroid.x;
+		y += centroid.y;
+		z += centroid.z;
+
+		for (p in points) {
+			p.pos.x -= centroid.x;
+			p.pos.y -= centroid.y;
+			p.pos.z -= centroid.z;
+		}
+	}
+
 
 	public function addPoint(?idx : Int, ?point : SplinePoint) {
 		var newPoint = point;
@@ -680,13 +698,25 @@ class Spline extends hrt.prefab.Object3D {
 					</div>
 				</div>
 				<div align="center">
-					<input type="button" value="Recompute Tangents" class="recompute" />
+					<input type="button" value="Recompute tangents" class="btn recompute" />
+					<input type="button" value="Recenter spline" class="btn recenter" />
 				</div>
 			</div>
 		');
 
-		var recomputeTangent = props.find(".recompute");
-		recomputeTangent.click(function(_) {
+		var editModeButton = props.find(".editModeButton");
+		props.find(".editModeButton").click(function(_) {
+			if (!enabled) return;
+			editMode = !editMode;
+			editModeButton.val(editMode ? "Edit Mode : Enabled" : "Edit Mode : Disabled");
+			editModeButton.toggleClass("editModeEnabled", editMode);
+			setSelected(true);
+			clearInteractive();
+			if(editMode)
+				createInteractive(ctx);
+		});
+
+		props.find(".recompute").click(function(_) {
 			var prevPoints = [ for (p in points) p.save() ];
 			recomputeTangents();
 			this.updateInstance();
@@ -714,16 +744,42 @@ class Spline extends hrt.prefab.Object3D {
 			}));
 		});
 
-		var editModeButton = props.find(".editModeButton");
-		editModeButton.click(function(_) {
-			if (!enabled) return;
-			editMode = !editMode;
-			editModeButton.val(editMode ? "Edit Mode : Enabled" : "Edit Mode : Disabled");
-			editModeButton.toggleClass("editModeEnabled", editMode);
-			setSelected(true);
-			clearInteractive();
-			if(editMode)
-				createInteractive(ctx);
+		props.find(".recenter").click(function(_) {
+			var prevPos = new h3d.col.Point(x, y, z);
+			var prevPoints = [ for (p in points) p.save() ];
+			recenterSpline();
+			this.updateInstance();
+			refreshHandles();
+			refreshPointList(ctx);
+			var newPos = new h3d.col.Point(x, y, z);
+			var newPoints = [ for (p in points) p.save() ];
+			ctx.properties.undo.change(Custom(function(undo) {
+				if (undo) {
+					points = [];
+					for (obj in prevPoints) {
+						var p = new SplinePoint();
+						p.load(obj);
+						points.push(p);
+					}
+					x = prevPos.x;
+					y = prevPos.y;
+					z = prevPos.z;
+				}
+				else {
+					points = [];
+					for (obj in newPoints) {
+						var p = new SplinePoint();
+						p.load(obj);
+						points.push(p);
+					}
+					x = newPos.x;
+					y = newPos.y;
+					z = newPos.z;
+				}
+				this.updateInstance();
+				refreshHandles();
+				refreshPointList(ctx);
+			}));
 		});
 
 		var selShape = props.find("#shape");