Skip to content

Commit dfa3cc2

Browse files
committed
Optimization of Resolver.solvePosition method
1 parent 81b3656 commit dfa3cc2

3 files changed

Lines changed: 39 additions & 31 deletions

File tree

v3/src/physics/matter-js/lib/body/Body.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ var Axes = require('../geometry/Axes');
4949
force: { x: 0, y: 0 },
5050
torque: 0,
5151
positionImpulse: { x: 0, y: 0 },
52+
previousPositionImpulse: { x: 0, y: 0 },
5253
constraintImpulse: { x: 0, y: 0, angle: 0 },
5354
totalContacts: 0,
5455
speed: 0,

v3/src/physics/matter-js/lib/collision/Resolver.js

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -50,21 +50,30 @@ var Bounds = require('../geometry/Bounds');
5050
* @param {pair[]} pairs
5151
* @param {number} timeScale
5252
*/
53-
Resolver.solvePosition = function(pairs, timeScale) {
53+
Resolver.solvePosition = function(pairs, bodies, timeScale) {
5454
var i,
55+
normalX,
56+
normalY,
5557
pair,
5658
collision,
5759
bodyA,
5860
bodyB,
5961
normal,
60-
bodyBtoA,
62+
separation,
63+
penetration,
64+
positionImpulseA,
65+
positionImpulseB,
6166
contactShare,
67+
bodyBtoAX,
68+
bodyBtoAY,
6269
positionImpulse,
63-
contactCount = {},
64-
tempA = Vector._temp[0],
65-
tempB = Vector._temp[1],
66-
tempC = Vector._temp[2],
67-
tempD = Vector._temp[3];
70+
impulseCoefficient = timeScale * Resolver._positionDampen;
71+
72+
for (i = 0; i < bodies.length; i++) {
73+
var body = bodies[i];
74+
body.previousPositionImpulse.x = body.positionImpulse.x;
75+
body.previousPositionImpulse.y = body.positionImpulse.y;
76+
}
6877

6978
// find impulses required to resolve penetration
7079
for (i = 0; i < pairs.length; i++) {
@@ -78,39 +87,37 @@ var Bounds = require('../geometry/Bounds');
7887
bodyB = collision.parentB;
7988
normal = collision.normal;
8089

81-
// get current separation between body edges involved in collision
82-
bodyBtoA = Vector.sub(Vector.add(bodyB.positionImpulse, bodyB.position, tempA),
83-
Vector.add(bodyA.positionImpulse,
84-
Vector.sub(bodyB.position, collision.penetration, tempB), tempC), tempD);
90+
positionImpulseA = bodyA.previousPositionImpulse;
91+
positionImpulseB = bodyB.previousPositionImpulse;
8592

86-
pair.separation = Vector.dot(normal, bodyBtoA);
87-
}
88-
89-
for (i = 0; i < pairs.length; i++) {
90-
pair = pairs[i];
93+
penetration = collision.penetration;
9194

92-
if (!pair.isActive || pair.isSensor)
93-
continue;
94-
95-
collision = pair.collision;
96-
bodyA = collision.parentA;
97-
bodyB = collision.parentB;
98-
normal = collision.normal;
99-
positionImpulse = (pair.separation - pair.slop) * timeScale;
95+
// bodyBtoA = positionImpulseB - positionImpulseA + penetration
96+
bodyBtoAX = positionImpulseB.x - positionImpulseA.x + penetration.x;
97+
bodyBtoAY = positionImpulseB.y - positionImpulseA.y + penetration.y;
98+
99+
normalX = normal.x;
100+
normalY = normal.y;
101+
102+
// separation = dot(normal, bodyBtoA)
103+
separation = normalX * bodyBtoAX + normalY * bodyBtoAY;
104+
pair.separation = separation;
105+
106+
positionImpulse = (separation - pair.slop) * impulseCoefficient;
100107

101108
if (bodyA.isStatic || bodyB.isStatic)
102109
positionImpulse *= 2;
103110

104111
if (!(bodyA.isStatic || bodyA.isSleeping)) {
105-
contactShare = Resolver._positionDampen / bodyA.totalContacts;
106-
bodyA.positionImpulse.x += normal.x * positionImpulse * contactShare;
107-
bodyA.positionImpulse.y += normal.y * positionImpulse * contactShare;
112+
contactShare = positionImpulse / bodyA.totalContacts;
113+
bodyA.positionImpulse.x += normalX * contactShare;
114+
bodyA.positionImpulse.y += normalY * contactShare;
108115
}
109116

110117
if (!(bodyB.isStatic || bodyB.isSleeping)) {
111-
contactShare = Resolver._positionDampen / bodyB.totalContacts;
112-
bodyB.positionImpulse.x -= normal.x * positionImpulse * contactShare;
113-
bodyB.positionImpulse.y -= normal.y * positionImpulse * contactShare;
118+
contactShare = positionImpulse / bodyB.totalContacts;
119+
bodyB.positionImpulse.x -= normalX * contactShare;
120+
bodyB.positionImpulse.y -= normalY * contactShare;
114121
}
115122
}
116123
};

v3/src/physics/matter-js/lib/core/Engine.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ var Body = require('../body/Body');
195195
// iteratively resolve position between collisions
196196
Resolver.preSolvePosition(pairs.list);
197197
for (i = 0; i < engine.positionIterations; i++) {
198-
Resolver.solvePosition(pairs.list, timing.timeScale);
198+
Resolver.solvePosition(pairs.list, allBodies, timing.timeScale);
199199
}
200200
Resolver.postSolvePosition(allBodies);
201201

0 commit comments

Comments
 (0)