/** * @author zz85 / http://www.lab4games.net/zz85/blog * **/ /************************************************************** * Curved Path - a curve path is simply a array of connected * curves, but retains the api of a curve **************************************************************/ THREE.CurvePath = function () { this.curves = []; this.bends = []; }; THREE.CurvePath.prototype = new THREE.Curve(); THREE.CurvePath.prototype.constructor = THREE.CurvePath; THREE.CurvePath.prototype.add = function ( curve ) { this.curves.push( curve ); }; THREE.CurvePath.prototype.checkConnection = function() { }; // Add a line curve if start and end of lines are not connected THREE.CurvePath.prototype.closePath = function() { }; // To get accurate point with reference to // entire path distance at time t, // following has to be done: // 1. Length of each sub path have to be known // 2. Locate and identify type of curve // 3. Get t for the curve // 4. Return curve.getPointAt(t') THREE.CurvePath.prototype.getPoint = function( t ) { var d = t * this.getLength(); var curveLengths = this.getCurveLengths(); var i = 0, diff, curve; // To think about boundaries points. while ( i < curveLengths.length ) { if ( curveLengths[ i ] >= d ) { diff = curveLengths[ i ] - d; curve = this.curves[ i ]; var u = 1 - diff / curve.getLength(); return curve.getPointAt( u ); break; } i ++; } return null; // loop where sum != 0, sum > d , sum+1 maxX ) maxX = p.x; else if ( p.x < minX ) minX = p.x; if ( p.y > maxY ) maxY = p.y; else if ( p.y < maxY ) minY = p.y; sum.addSelf( p.x, p.y ); } return { minX: minX, minY: minY, maxX: maxX, maxY: maxY, centroid: sum.divideScalar( il ) }; }; /************************************************************** * Create Geometries Helpers **************************************************************/ /// Generate geometry from path points (for Line or ParticleSystem objects) THREE.CurvePath.prototype.createPointsGeometry = function( divisions ) { var pts = this.getPoints( divisions, true ); return this.createGeometry( pts ); }; // Generate geometry from equidistance sampling along the path THREE.CurvePath.prototype.createSpacedPointsGeometry = function( divisions ) { var pts = this.getSpacedPoints( divisions, true ); return this.createGeometry( pts ); }; THREE.CurvePath.prototype.createGeometry = function( points ) { var geometry = new THREE.Geometry(); for( var i = 0; i < points.length; i ++ ) { geometry.vertices.push( new THREE.Vertex( new THREE.Vector3( points[ i ].x, points[ i ].y, 0 ) ) ); } return geometry; }; /************************************************************** * Bend / Wrap Helper Methods **************************************************************/ // Wrap path / Bend modifiers? THREE.CurvePath.prototype.addWrapPath = function ( bendpath ) { this.bends.push( bendpath ); }; THREE.CurvePath.prototype.getTransformedPoints = function( segments, bends ) { var oldPts = this.getPoints( segments ); // getPoints getSpacedPoints var i, il; if ( !bends ) { bends = this.bends; } for ( i = 0, il = bends.length; i < il; i ++ ) { oldPts = this.getWrapPoints( oldPts, bends[ i ] ); } return oldPts; }; THREE.CurvePath.prototype.getTransformedSpacedPoints = function( segments, bends ) { var oldPts = this.getSpacedPoints( segments ); var i, il; if ( !bends ) { bends = this.bends; } for ( i = 0, il = bends.length; i < il; i ++ ) { oldPts = this.getWrapPoints( oldPts, bends[ i ] ); } return oldPts; }; // This returns getPoints() bend/wrapped around the contour of a path. // Read http://www.planetclegg.com/projects/WarpingTextToSplines.html THREE.CurvePath.prototype.getWrapPoints = function ( oldPts, path ) { var bounds = this.getBoundingBox(); var i, il, p, oldX, oldY, xNorm; for ( i = 0, il = oldPts.length; i < il; i ++ ) { p = oldPts[ i ]; oldX = p.x; oldY = p.y; var xNorm = oldX/ bounds.maxX; // If using actual distance, for length > path, requires line extrusions //xNorm = path.getUtoTmapping(xNorm, oldX); // 3 styles. 1) wrap stretched. 2) wrap stretch by arc length 3) warp by actual distance xNorm = path.getUtoTmapping( xNorm, oldX ); // check for out of bounds? var pathPt = path.getPoint( xNorm ); var normal = path.getNormalVector( xNorm ).multiplyScalar( oldY ); p.x = pathPt.x + normal.x; p.y = pathPt.y + normal.y; } return oldPts; };