Skip to content

Commit 2d357d7

Browse files
committed
Moved the Curves objects into their own folder and namespace and optimized the vector creation within them
1 parent aab4896 commit 2d357d7

10 files changed

Lines changed: 271 additions & 115 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
function P0 (t, p)
2+
{
3+
var k = 1 - t;
4+
5+
return k * k * k * p;
6+
}
7+
8+
function P1 (t, p)
9+
{
10+
var k = 1 - t;
11+
12+
return 3 * k * k * t * p;
13+
}
14+
15+
function P2 (t, p)
16+
{
17+
return 3 * ( 1 - t ) * t * t * p;
18+
}
19+
20+
function P3 (t, p)
21+
{
22+
return t * t * t * p;
23+
}
24+
25+
// p0 = start point
26+
// p1 = control point 1
27+
// p2 = control point 2
28+
// p3 = end point
29+
30+
// https://medium.com/@adrian_cooney/bezier-interpolation-13b68563313a
31+
32+
var CubicBezierInterpolation = function (t, p0, p1, p2, p3)
33+
{
34+
return P0(t, p0) + P1(t, p1) + P2(t, p2) + P3(t, p3);
35+
};
36+
37+
module.exports = CubicBezierInterpolation;

v3/src/math/interpolation/index.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
// Phaser.Math.Interpolation
2+
13
module.exports = {
24

35
Bezier: require('./BezierInterpolation'),
46
CatmullRom: require('./CatmullRomInterpolation'),
7+
CubicBezier: require('./CubicBezierInterpolation'),
58
Linear: require('./LinearInterpolation')
69

710
};

v3/src/paths/curves/Curve.js

Lines changed: 31 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,42 @@
1+
// Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
2+
13
var Clamp = require('../../math/Clamp');
4+
var Vector2 = require('../../math/Vector2');
25
var Vector3 = require('../../math/Vector3');
36
var Matrix4 = require('../../math/Matrix4');
47
var Class = require('../../utils/Class');
58

6-
/**
7-
* @author zz85 / http://www.lab4games.net/zz85/blog
8-
* Extensible curve object
9-
*
10-
* Some common of Curve methods
11-
* .getPoint(t), getTangent(t)
12-
* .getPointAt(u), getTangentAt(u)
13-
* .getPoints(), .getSpacedPoints()
14-
* .getLength()
15-
* .updateArcLengths()
16-
*
17-
* This following classes subclasses THREE.Curve:
18-
*
19-
* -- 2d classes --
20-
* THREE.LineCurve
21-
* THREE.QuadraticBezierCurve
22-
* THREE.CubicBezierCurve
23-
* THREE.SplineCurve
24-
* THREE.ArcCurve
25-
* THREE.EllipseCurve
26-
*
27-
* -- 3d classes --
28-
* THREE.LineCurve3
29-
* THREE.QuadraticBezierCurve3
30-
* THREE.CubicBezierCurve3
31-
* THREE.SplineCurve3
32-
*
33-
* A series of curves can be represented as a THREE.CurvePath
34-
*
35-
**/
36-
37-
/**************************************************************
38-
* Abstract Curve base class
39-
**************************************************************/
9+
// Local cache vars
10+
11+
var tmpVec2A = new Vector2();
12+
var tmpVec2B = new Vector2();
13+
14+
// Our Base Curve which all other curves extend
4015

4116
var Curve = new Class({
4217

4318
initialize:
4419

4520
function Curve ()
4621
{
22+
this.arcLengthDivisions = 200;
4723
},
4824

4925
// Get point at relative position in curve according to arc length
5026
// - u [0 .. 1]
5127

52-
getPointAt: function (u)
28+
getPointAt: function (u, out)
5329
{
5430
var t = this.getUtoTmapping(u);
5531

56-
return this.getPoint(t);
32+
return this.getPoint(t, out);
5733
},
5834

5935
// Get sequence of points using getPoint( t )
6036

6137
getPoints: function (divisions)
6238
{
63-
if (!divisions)
64-
{
65-
divisions = 5;
66-
}
39+
if (divisions === undefined) { divisions = 5; }
6740

6841
var points = [];
6942

@@ -79,10 +52,7 @@ var Curve = new Class({
7952

8053
getSpacedPoints: function (divisions)
8154
{
82-
if (!divisions)
83-
{
84-
divisions = 5;
85-
}
55+
if (divisions === undefined) { divisions = 5; }
8656

8757
var points = [];
8858

@@ -107,10 +77,7 @@ var Curve = new Class({
10777

10878
getLengths: function (divisions)
10979
{
110-
if (!divisions)
111-
{
112-
divisions = (this.__arcLengthDivisions) ? (this.__arcLengthDivisions) : 200;
113-
}
80+
if (divisions === undefined) { divisions = this.arcLengthDivisions; }
11481

11582
if (this.cacheArcLengths &&
11683
(this.cacheArcLengths.length === divisions + 1) &&
@@ -123,15 +90,15 @@ var Curve = new Class({
12390

12491
var cache = [];
12592
var current;
126-
var last = this.getPoint(0);
93+
var last = this.getPoint(0, tmpVec2A);
12794
var sum = 0;
12895

12996
cache.push(0);
13097

13198
for (var p = 1; p <= divisions; p++)
13299
{
133-
current = this.getPoint(p / divisions);
134-
sum += current.distanceTo(last);
100+
current = this.getPoint(p / divisions, tmpVec2B);
101+
sum += current.distance(last);
135102
cache.push(sum);
136103
last = current;
137104
}
@@ -199,9 +166,7 @@ var Curve = new Class({
199166

200167
if (arcLengths[i] === targetArcLength)
201168
{
202-
var t = i / (il - 1);
203-
204-
return t;
169+
return i / (il - 1);
205170
}
206171

207172
// we could get finer grain at lengths, or use simple interpolation between two points
@@ -225,8 +190,10 @@ var Curve = new Class({
225190
// 2 points a small delta apart will be used to find its gradient
226191
// which seems to give a reasonable approximation
227192

228-
getTangent: function (t)
193+
getTangent: function (t, out)
229194
{
195+
if (out === undefined) { out = new Vector2(); }
196+
230197
var delta = 0.0001;
231198
var t1 = t - delta;
232199
var t2 = t + delta;
@@ -243,19 +210,22 @@ var Curve = new Class({
243210
t2 = 1;
244211
}
245212

246-
var pt1 = this.getPoint(t1);
247-
var pt2 = this.getPoint(t2);
213+
// var pt1 = this.getPoint(t1);
214+
// var pt2 = this.getPoint(t2);
215+
// var vec = pt2.clone().sub(pt1);
216+
// return vec.normalize();
248217

249-
var vec = pt2.clone().sub(pt1);
218+
this.getPoint(t1, tmpVec2A);
219+
this.getPoint(t2, out);
250220

251-
return vec.normalize();
221+
return out.sub(tmpVec2A).normalize();
252222
},
253223

254-
getTangentAt: function (u)
224+
getTangentAt: function (u, out)
255225
{
256226
var t = this.getUtoTmapping(u);
257227

258-
return this.getTangent(t);
228+
return this.getTangent(t, out);
259229
},
260230

261231
computeFrenetFrames: function (segments, closed)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
2+
3+
var Class = require('../../../utils/Class');
4+
var Curve = require('../Curve');
5+
var Vector2 = require('../../../math/Vector2');
6+
var CubicBezier = require('../../../math/interpolation/CubicBezierInterpolation');
7+
8+
// Phaser.Paths.Curves.CubicBezier
9+
10+
var CubicBezierCurve = new Class({
11+
12+
Extends: Curve,
13+
14+
initialize:
15+
16+
function CubicBezierCurve (v0, v1, v2, v3)
17+
{
18+
this.v0 = v0;
19+
this.v1 = v1;
20+
this.v2 = v2;
21+
this.v3 = v3;
22+
},
23+
24+
getPoint: function (t, out)
25+
{
26+
if (out === undefined) { out = new Vector2(); }
27+
28+
var v0 = this.v0;
29+
var v1 = this.v1;
30+
var v2 = this.v2;
31+
var v3 = this.v3;
32+
33+
return out.set(
34+
CubicBezier(t, v0.x, v1.x, v2.x, v3.x),
35+
CubicBezier(t, v0.y, v1.y, v2.y, v3.y)
36+
);
37+
}
38+
39+
});
40+
41+
module.exports = CubicBezierCurve;
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// Based on the three.js Curve classes created by [zz85](http://www.lab4games.net/zz85/blog)
2+
3+
var Curve = require('../Curve');
4+
var Class = require('../../../utils/Class');
5+
6+
// Phaser.Paths.Curves.Ellipse
7+
8+
var EllipseCurve = new Class({
9+
10+
Extends: Curve,
11+
12+
initialize:
13+
14+
function EllipseCurve (aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation)
15+
{
16+
this.aX = aX;
17+
this.aY = aY;
18+
19+
this.xRadius = xRadius;
20+
this.yRadius = yRadius;
21+
22+
this.aStartAngle = aStartAngle;
23+
this.aEndAngle = aEndAngle;
24+
25+
this.aClockwise = aClockwise;
26+
27+
this.aRotation = aRotation || 0;
28+
},
29+
30+
getPoint: function (t)
31+
{
32+
var twoPi = Math.PI * 2;
33+
var deltaAngle = this.aEndAngle - this.aStartAngle;
34+
var samePoints = Math.abs( deltaAngle ) < Number.EPSILON;
35+
36+
// ensures that deltaAngle is 0 .. 2 PI
37+
while (deltaAngle < 0)
38+
{
39+
deltaAngle += twoPi;
40+
}
41+
42+
while (deltaAngle > twoPi)
43+
{
44+
deltaAngle -= twoPi;
45+
}
46+
47+
if (deltaAngle < Number.EPSILON)
48+
{
49+
if (samePoints)
50+
{
51+
deltaAngle = 0;
52+
}
53+
else
54+
{
55+
deltaAngle = twoPi;
56+
}
57+
}
58+
59+
if (this.aClockwise === true && ! samePoints)
60+
{
61+
if (deltaAngle === twoPi)
62+
{
63+
deltaAngle = - twoPi;
64+
}
65+
else
66+
{
67+
deltaAngle = deltaAngle - twoPi;
68+
}
69+
}
70+
71+
var angle = this.aStartAngle + t * deltaAngle;
72+
var x = this.aX + this.xRadius * Math.cos(angle);
73+
var y = this.aY + this.yRadius * Math.sin(angle);
74+
75+
if (this.aRotation !== 0)
76+
{
77+
var cos = Math.cos(this.aRotation);
78+
var sin = Math.sin(this.aRotation);
79+
80+
var tx = x - this.aX;
81+
var ty = y - this.aY;
82+
83+
// Rotate the point about the center of the ellipse.
84+
x = tx * cos - ty * sin + this.aX;
85+
y = tx * sin + ty * cos + this.aY;
86+
}
87+
88+
return new Vector2(x, y);
89+
}
90+
91+
});
92+
93+
module.exports = EllipseCurve;

v3/src/paths/curves/index.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Phaser.Curves
2+
3+
module.exports = {
4+
5+
CubicBezier: require('./cubicbezier/CubicBezierCurve'),
6+
Ellipse: require('./ellipse/EllipseCurve'),
7+
Line: require('./line/LineCurve')
8+
9+
};
10+
11+
// Hermite: require('./curves/hermite')

0 commit comments

Comments
 (0)