|
@@ -23,6 +23,7 @@
|
|
|
* THREE.QuadraticBezierCurve3
|
|
|
* THREE.CubicBezierCurve3
|
|
|
* THREE.SplineCurve3
|
|
|
+ * THREE.ClosedSplineCurve3
|
|
|
*
|
|
|
**/
|
|
|
|
|
@@ -103,15 +104,19 @@ THREE.Curve.prototype.getLength = function () {
|
|
|
|
|
|
THREE.Curve.prototype.getLengths = function ( divisions ) {
|
|
|
|
|
|
- if ( !divisions ) divisions = 200;
|
|
|
+ if ( !divisions ) divisions = (this.__arcLengthDivisions) ? (this.__arcLengthDivisions): 200;
|
|
|
|
|
|
- if ( this.cacheArcLengths && ( this.cacheArcLengths.length == divisions + 1 ) ) {
|
|
|
+ if ( this.cacheArcLengths
|
|
|
+ && ( this.cacheArcLengths.length == divisions + 1 )
|
|
|
+ && !this.needsUpdate) {
|
|
|
|
|
|
//console.log( "cached", this.cacheArcLengths );
|
|
|
return this.cacheArcLengths;
|
|
|
|
|
|
}
|
|
|
|
|
|
+ this.needsUpdate = false;
|
|
|
+
|
|
|
var cache = [];
|
|
|
var current, last = this.getPoint( 0 );
|
|
|
var p, sum = 0;
|
|
@@ -457,8 +462,8 @@ THREE.SplineCurve.prototype.getPoint = function ( t ) {
|
|
|
|
|
|
c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1;
|
|
|
c[ 1 ] = intPoint;
|
|
|
- c[ 2 ] = intPoint > points.length - 2 ? intPoint : intPoint + 1;
|
|
|
- c[ 3 ] = intPoint > points.length - 3 ? intPoint : intPoint + 2;
|
|
|
+ c[ 2 ] = intPoint > points.length - 2 ? points.length -1 : intPoint + 1;
|
|
|
+ c[ 3 ] = intPoint > points.length - 3 ? points.length -1 : intPoint + 2;
|
|
|
|
|
|
v.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight );
|
|
|
v.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight );
|
|
@@ -706,8 +711,8 @@ THREE.SplineCurve3 = THREE.Curve.create(
|
|
|
|
|
|
c[ 0 ] = intPoint == 0 ? intPoint : intPoint - 1;
|
|
|
c[ 1 ] = intPoint;
|
|
|
- c[ 2 ] = intPoint > points.length - 2 ? intPoint : intPoint + 1;
|
|
|
- c[ 3 ] = intPoint > points.length - 3 ? intPoint : intPoint + 2;
|
|
|
+ c[ 2 ] = intPoint > points.length - 2 ? points.length -1 : intPoint + 1;
|
|
|
+ c[ 3 ] = intPoint > points.length - 3 ? points.length -1 : intPoint + 2;
|
|
|
|
|
|
v.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight );
|
|
|
v.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight );
|
|
@@ -718,3 +723,43 @@ THREE.SplineCurve3 = THREE.Curve.create(
|
|
|
}
|
|
|
|
|
|
);
|
|
|
+
|
|
|
+/**************************************************************
|
|
|
+ * Closed Spline 3D curve
|
|
|
+ **************************************************************/
|
|
|
+
|
|
|
+
|
|
|
+THREE.ClosedSplineCurve3 = THREE.Curve.create(
|
|
|
+
|
|
|
+ function ( points /* array of Vector3 */) {
|
|
|
+
|
|
|
+ this.points = (points == undefined) ? [] : points;
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ function ( t ) {
|
|
|
+
|
|
|
+ var v = new THREE.Vector3();
|
|
|
+ var c = [];
|
|
|
+ var points = this.points, point, intPoint, weight;
|
|
|
+ point = ( points.length - 0 ) * t;
|
|
|
+ // This needs to be from 0-length +1
|
|
|
+
|
|
|
+ intPoint = Math.floor( point );
|
|
|
+ weight = point - intPoint;
|
|
|
+
|
|
|
+ intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;
|
|
|
+ c[ 0 ] = ( intPoint - 1 ) % points.length;
|
|
|
+ c[ 1 ] = ( intPoint ) % points.length;
|
|
|
+ c[ 2 ] = ( intPoint + 1 ) % points.length;
|
|
|
+ c[ 3 ] = ( intPoint + 2 ) % points.length;
|
|
|
+
|
|
|
+ v.x = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].x, points[ c[ 1 ] ].x, points[ c[ 2 ] ].x, points[ c[ 3 ] ].x, weight );
|
|
|
+ v.y = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].y, points[ c[ 1 ] ].y, points[ c[ 2 ] ].y, points[ c[ 3 ] ].y, weight );
|
|
|
+ v.z = THREE.Curve.Utils.interpolate( points[ c[ 0 ] ].z, points[ c[ 1 ] ].z, points[ c[ 2 ] ].z, points[ c[ 3 ] ].z, weight );
|
|
|
+
|
|
|
+ return v;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+);
|