File: //var/www/aspa/three/extras/core/Path.js
import { Vector2 } from '../../math/Vector2.js';
import { CurvePath } from './CurvePath.js';
import { EllipseCurve } from '../curves/EllipseCurve.js';
import { SplineCurve } from '../curves/SplineCurve.js';
import { CubicBezierCurve } from '../curves/CubicBezierCurve.js';
import { QuadraticBezierCurve } from '../curves/QuadraticBezierCurve.js';
import { LineCurve } from '../curves/LineCurve.js';
class Path extends CurvePath {
	constructor( points ) {
		super();
		this.type = 'Path';
		this.currentPoint = new Vector2();
		if ( points ) {
			this.setFromPoints( points );
		}
	}
	setFromPoints( points ) {
		this.moveTo( points[ 0 ].x, points[ 0 ].y );
		for ( let i = 1, l = points.length; i < l; i ++ ) {
			this.lineTo( points[ i ].x, points[ i ].y );
		}
		return this;
	}
	moveTo( x, y ) {
		this.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?
		return this;
	}
	lineTo( x, y ) {
		const curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );
		this.curves.push( curve );
		this.currentPoint.set( x, y );
		return this;
	}
	quadraticCurveTo( aCPx, aCPy, aX, aY ) {
		const curve = new QuadraticBezierCurve(
			this.currentPoint.clone(),
			new Vector2( aCPx, aCPy ),
			new Vector2( aX, aY )
		);
		this.curves.push( curve );
		this.currentPoint.set( aX, aY );
		return this;
	}
	bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {
		const curve = new CubicBezierCurve(
			this.currentPoint.clone(),
			new Vector2( aCP1x, aCP1y ),
			new Vector2( aCP2x, aCP2y ),
			new Vector2( aX, aY )
		);
		this.curves.push( curve );
		this.currentPoint.set( aX, aY );
		return this;
	}
	splineThru( pts /*Array of Vector*/ ) {
		const npts = [ this.currentPoint.clone() ].concat( pts );
		const curve = new SplineCurve( npts );
		this.curves.push( curve );
		this.currentPoint.copy( pts[ pts.length - 1 ] );
		return this;
	}
	arc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
		const x0 = this.currentPoint.x;
		const y0 = this.currentPoint.y;
		this.absarc( aX + x0, aY + y0, aRadius,
			aStartAngle, aEndAngle, aClockwise );
		return this;
	}
	absarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {
		this.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );
		return this;
	}
	ellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
		const x0 = this.currentPoint.x;
		const y0 = this.currentPoint.y;
		this.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );
		return this;
	}
	absellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {
		const curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );
		if ( this.curves.length > 0 ) {
			// if a previous curve is present, attempt to join
			const firstPoint = curve.getPoint( 0 );
			if ( ! firstPoint.equals( this.currentPoint ) ) {
				this.lineTo( firstPoint.x, firstPoint.y );
			}
		}
		this.curves.push( curve );
		const lastPoint = curve.getPoint( 1 );
		this.currentPoint.copy( lastPoint );
		return this;
	}
	copy( source ) {
		super.copy( source );
		this.currentPoint.copy( source.currentPoint );
		return this;
	}
	toJSON() {
		const data = super.toJSON();
		data.currentPoint = this.currentPoint.toArray();
		return data;
	}
	fromJSON( json ) {
		super.fromJSON( json );
		this.currentPoint.fromArray( json.currentPoint );
		return this;
	}
}
export { Path };