Skip to content

Commit

Permalink
avoided a few more Vec3 allocations in nearphase
Browse files Browse the repository at this point in the history
  • Loading branch information
schteppe committed Apr 16, 2012
1 parent cf40a3c commit 9ed9e08
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 15 deletions.
30 changes: 23 additions & 7 deletions build/cannon.js
Expand Up @@ -2176,24 +2176,33 @@ CANNON.World.prototype.step = function(dt){
} }


// Check edges // Check edges
var edgeTangent = new CANNON.Vec3();
var edgeCenter = new CANNON.Vec3();
var r = new CANNON.Vec3(); // r = edge center to sphere center
var orthogonal = new CANNON.Vec3();
var dist = new CANNON.Vec3();
for(var j=0; j<sides.length && !found; j++){ for(var j=0; j<sides.length && !found; j++){
for(var k=0; k<sides.length && !found; k++){ for(var k=0; k<sides.length && !found; k++){
if(j%3!=k%3){ if(j%3!=k%3){
// Get edge tangent // Get edge tangent
var edgeTangent = sides[k].cross(sides[j]); sides[k].cross(sides[j],edgeTangent);
edgeTangent.normalize(); edgeTangent.normalize();
var edgeCenter = sides[j].vadd(sides[k]); sides[j].vadd(sides[k], edgeCenter);

xi.copy(r);
var r = xi.vsub(edgeCenter.vadd(xj)); // r = edge center to sphere center r.vsub(edgeCenter,r);
r.vsub(xj,r);
var orthonorm = r.dot(edgeTangent); // distance from edge center to sphere center in the tangent direction var orthonorm = r.dot(edgeTangent); // distance from edge center to sphere center in the tangent direction
var orthogonal = edgeTangent.mult(orthonorm); // Vector from edge center to sphere center in the tangent direction edgeTangent.mult(orthonorm,orthogonal); // Vector from edge center to sphere center in the tangent direction


// Find the third side orthogonal to this one // Find the third side orthogonal to this one
var l = 0; var l = 0;
while(l==j%3 || l==k%3) l++; while(l==j%3 || l==k%3) l++;


// vec from edge center to sphere projected to the plane orthogonal to the edge tangent // vec from edge center to sphere projected to the plane orthogonal to the edge tangent
var dist = xi.vsub(orthogonal).vsub(edgeCenter.vadd(xj)); xi.copy(dist);
dist.vsub(orthogonal,dist);
dist.vsub(edgeCenter,dist);
dist.vsub(xj,dist);


// Distances in tangent direction and distance in the plane orthogonal to it // Distances in tangent direction and distance in the plane orthogonal to it
var tdist = Math.abs(orthonorm); var tdist = Math.abs(orthonorm);
Expand All @@ -2206,7 +2215,14 @@ CANNON.World.prototype.step = function(dt){
res.rj.copy(res.rj); res.rj.copy(res.rj);
dist.negate(res.ni); dist.negate(res.ni);
res.ni.normalize(); res.ni.normalize();
res.rj.vadd(xj).vsub(xi).unit().mult(R,res.ri);
res.rj.copy(res.ri);
res.ri.vadd(xj,res.ri);
res.ri.vsub(xi,res.ri);
res.ri.normalize();
res.ri.mult(R,res.ri);
console.log("ll");
//res.rj.vadd(xj).vsub(xi).unit().mult(R,res.ri);
result.push(res); result.push(res);
} }
} }
Expand Down
2 changes: 1 addition & 1 deletion build/cannon.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 22 additions & 7 deletions src/world/World.js
Expand Up @@ -562,24 +562,33 @@ CANNON.World.prototype.step = function(dt){
} }


// Check edges // Check edges
var edgeTangent = new CANNON.Vec3();
var edgeCenter = new CANNON.Vec3();
var r = new CANNON.Vec3(); // r = edge center to sphere center
var orthogonal = new CANNON.Vec3();
var dist = new CANNON.Vec3();
for(var j=0; j<sides.length && !found; j++){ for(var j=0; j<sides.length && !found; j++){
for(var k=0; k<sides.length && !found; k++){ for(var k=0; k<sides.length && !found; k++){
if(j%3!=k%3){ if(j%3!=k%3){
// Get edge tangent // Get edge tangent
var edgeTangent = sides[k].cross(sides[j]); sides[k].cross(sides[j],edgeTangent);
edgeTangent.normalize(); edgeTangent.normalize();
var edgeCenter = sides[j].vadd(sides[k]); sides[j].vadd(sides[k], edgeCenter);

xi.copy(r);
var r = xi.vsub(edgeCenter.vadd(xj)); // r = edge center to sphere center r.vsub(edgeCenter,r);
r.vsub(xj,r);
var orthonorm = r.dot(edgeTangent); // distance from edge center to sphere center in the tangent direction var orthonorm = r.dot(edgeTangent); // distance from edge center to sphere center in the tangent direction
var orthogonal = edgeTangent.mult(orthonorm); // Vector from edge center to sphere center in the tangent direction edgeTangent.mult(orthonorm,orthogonal); // Vector from edge center to sphere center in the tangent direction


// Find the third side orthogonal to this one // Find the third side orthogonal to this one
var l = 0; var l = 0;
while(l==j%3 || l==k%3) l++; while(l==j%3 || l==k%3) l++;


// vec from edge center to sphere projected to the plane orthogonal to the edge tangent // vec from edge center to sphere projected to the plane orthogonal to the edge tangent
var dist = xi.vsub(orthogonal).vsub(edgeCenter.vadd(xj)); xi.copy(dist);
dist.vsub(orthogonal,dist);
dist.vsub(edgeCenter,dist);
dist.vsub(xj,dist);


// Distances in tangent direction and distance in the plane orthogonal to it // Distances in tangent direction and distance in the plane orthogonal to it
var tdist = Math.abs(orthonorm); var tdist = Math.abs(orthonorm);
Expand All @@ -592,7 +601,13 @@ CANNON.World.prototype.step = function(dt){
res.rj.copy(res.rj); res.rj.copy(res.rj);
dist.negate(res.ni); dist.negate(res.ni);
res.ni.normalize(); res.ni.normalize();
res.rj.vadd(xj).vsub(xi).unit().mult(R,res.ri);
res.rj.copy(res.ri);
res.ri.vadd(xj,res.ri);
res.ri.vsub(xi,res.ri);
res.ri.normalize();
res.ri.mult(R,res.ri);

result.push(res); result.push(res);
} }
} }
Expand Down

0 comments on commit 9ed9e08

Please sign in to comment.