浏览代码

SplineMesh Editor Fix

ShiroSmith 6 年之前
父节点
当前提交
5e7cdebf0f
共有 2 个文件被更改,包括 29 次插入11 次删除
  1. 21 5
      hide/prefab/SplineEditor.hx
  2. 8 6
      hrt/prefab/l3d/Spline.hx

+ 21 - 5
hide/prefab/SplineEditor.hx

@@ -34,6 +34,18 @@ class NewSplinePointViewer extends h3d.scene.Object {
 		tangentViewer.clear();
 	}
 
+	override function sync( ctx : h3d.scene.RenderContext ) {
+		var cam = ctx.camera;
+		var gpos = getAbsPos().getPosition();
+		var distToCam = cam.pos.sub(gpos).length();
+		var engine = h3d.Engine.getCurrent();
+		var ratio = 18 / engine.height;
+		var correctionFromParents =  1.0 / getAbsPos().getScale().x;
+		pointViewer.setScale(correctionFromParents * ratio * distToCam * Math.tan(cam.fovY * 0.5 * Math.PI / 180.0));
+		calcAbsPos();
+		super.sync(ctx);
+	}
+
 	public function update( spd : SplinePointData ) {
 
 		pointViewer.setPosition(spd.pos.x, spd.pos.y, spd.pos.z);
@@ -178,12 +190,12 @@ class SplineEditor {
 		} 
 
 		var closestPt = getClosestPointFromMouse(mouseX, mouseY, ctx);
-		
+
 		// If we are are adding a new point at the beginning/end, just make a raycast 'cursor -> plane' with the transform of the first/last SplinePoint
 		if( !prefab.loop && (closestPt.next == null || closestPt.prev == null) ) {
 			var camera = @:privateAccess ctx.local3d.getScene().camera;
 			var ray = camera.rayFromScreen(mouseX, mouseY);
-			var normal = closestPt.next == null ? prefab.points[prefab.points.length - 1].getAbsPos().up().toPoint() : prefab.points[0].getAbsPos().up().toPoint();
+			var normal = closestPt.next == null ? closestPt.prev.getAbsPos().up().toPoint() : closestPt.next.getAbsPos().up().toPoint();
 			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);
@@ -215,7 +227,7 @@ class SplineEditor {
 		}
 
 		if( result == null ) {
-			result = { pos : null, tangent : null, prev : null, next : null};
+			result = { pos : null, tangent : null, prev : null, next : null };
 
 			var firstSp = prefab.points[0];
 			var firstPt = firstSp.getPoint();
@@ -260,9 +272,13 @@ class SplineEditor {
 	
 		var index = 0;
 		var scale = 1.0;
-		if( spd.prev == null ) {
+		if( spd.prev == null && spd.next == null ) {
+			scale = 1.0;
+			index = 0;
+		}
+		else if( spd.prev == null ) {
 			index = 0;
-			scale = prefab.points[0].getAbsPos().getScale().x; 
+			scale = prefab.points[0].getAbsPos().getScale().x;
 		}
 		else if( spd.next == null ) {
 			index = prefab.points.length;

+ 8 - 6
hrt/prefab/l3d/Spline.hx

@@ -197,13 +197,17 @@ class Spline extends Object3D {
 	// Sample the spline with the step and threshold
 	function computeSplineData() {
 
+		var sd = new SplineData();
+		data = sd;
+
 		if( step <= 0 ) 
 			return;
-		
-		var sd = new SplineData();
+
+		if( points == null || points.length <= 1 )
+			return;
 
 		// Sample the spline
-		var samples : Array<SplinePointData> = [{ pos : points[0].getPoint(), tangent : points[0].getTangent(), prev : null, next : points[1] }];
+		var samples : Array<SplinePointData> = [{ pos : points[0].getPoint(), tangent : points[0].getTangent(), prev : points[0], next : points[1] }];
 		var i = 0;
 		var sumT = 0.0;
 		var maxT = 1.0;
@@ -224,7 +228,7 @@ class Spline extends Object3D {
 				if( points[i+1].getPoint().distance(samples[samples.length - 1].pos) < step ) {
 					// End of the spline
 					if( i == points.length - 2 ) {
-						samples.insert(samples.length, { pos : points[points.length - 1].getPoint(), tangent : points[points.length - 1].getTangent(), prev : points[points.length - 2], next : null, t : 1.0 });
+						samples.insert(samples.length, { pos : points[points.length - 1].getPoint(), tangent : points[points.length - 1].getTangent(), prev : points[points.length - 2], next : points[points.length - 1], t : 1.0 });
 						break;
 					}
 					// End of the current curve
@@ -252,8 +256,6 @@ class Spline extends Object3D {
 			lengthSum += samples[i].pos.distance(samples[i+1].pos);
 		}
 		sd.length = lengthSum;
-
-		data = sd;
 	}
 
 	// Return the closest spline point on the spline from p