diff --git a/v3/src/paths/curves/index.js b/v3/src/paths/curves/index.js index 09c7a28ea..86881cb76 100644 --- a/v3/src/paths/curves/index.js +++ b/v3/src/paths/curves/index.js @@ -4,7 +4,8 @@ module.exports = { CubicBezier: require('./cubicbezier/CubicBezierCurve'), Ellipse: require('./ellipse/EllipseCurve'), - Line: require('./line/LineCurve') + Line: require('./line/LineCurve'), + Spline: require('./spline/SplineCurve') }; diff --git a/v3/src/paths/curves/spline/SplineCurve.js b/v3/src/paths/curves/spline/SplineCurve.js new file mode 100644 index 000000000..64df6dbf6 --- /dev/null +++ b/v3/src/paths/curves/spline/SplineCurve.js @@ -0,0 +1,48 @@ +// Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog) + +var CatmullRom = require('../../../math/CatmullRom'); +var Class = require('../../../utils/Class'); +var Curve = require('../Curve'); +var Vector2 = require('../../../math/Vector2'); + +// Phaser.Curves.Spline + +var SplineCurve = new Class({ + + Extends: Curve, + + initialize: + + // Array of vec2s + function SplineCurve (points) + { + if (points === undefined) { points = []; } + + Curve.call(this); + + this.points = points; + }, + + getPoint: function (t, out) + { + if (out === undefined) { out = new Vector2(); } + + var points = this.points; + + var point = (points.length - 1) * t; + + var intPoint = Math.floor(point); + + var weight = point - intPoint; + + var p0 = points[ (intPoint === 0) ? intPoint : intPoint - 1 ]; + var p1 = points[ intPoint ]; + var p2 = points[ (intPoint > points.length - 2) ? points.length - 1 : intPoint + 1 ]; + var p3 = points[ (intPoint > points.length - 3) ? points.length - 1 : intPoint + 2 ]; + + return out.set(CatmullRom(weight, p0.x, p1.x, p2.x, p3.x), CatmullRom(weight, p0.y, p1.y, p2.y, p3.y)); + } + +}); + +module.exports = SplineCurve;