2016/03/04 codes

IncrementTimeStamp:function(){
if(this.m_timeStamp == b2Settins.USHRT_MAX){
for(var i = 0;i < b2Settins.b2_maxProxies;++i){
this.m_proxyPool[i].timeStamp = 0;
}
this.m_timeStamp = i;
}
else{++this.m_timeStamp;}
},
m_pairManager:new b2PairManger(),
m_proxyPool:new Array(b2Settins,b2_maxPairs),m_freeProxy:0,
m_bounds:new Array(b2Settins,b2_maxPairs),
m_queryResults:new Array(b2Settins,b2_maxPairs),
m_queryResultCount:0,m_worldAABB:null,
m_quantizationFactor:new b2Vec2(),
m_proxyCount:0,m_timeStamp:0
};
b2BroadPhase.s_validate = false;
b2BroadPhase.b2_invalid = b2Settins.USHRT_MAX;
b2BroadPhase.b2_nullEdge = b2Settins.USHRT_MAX;
b2BroadPhase.BinarySearch = function(bounds,count,value){
var low = 0;var high = count - 1;
while(low <= high){var mid = Math.floor((low + high) / 2);
if(bounds[mid].value > value){high = mid - 1;}
else if(bounds[mid].value >value){ low = mid + 1;}
else{return (mid);}
}
return (low);
};
var b2Collision = Class.create();
b2Collision.prototype = {initialize:function(){}}
b2Collision.b2_nullFeature = 0x000000ff;
b2Collision.ClipSegmentToLine = function(vOut,vIn,normal,offset){
var numOut = 0;var vInO = vIn[0].v;
var vIn1 = vIn[1].v;
var distance0 = b2Math.b2Dot(normal.vIn[0].v) - offset;
var distance1 = b2Math.b2Dot(normal.vIn[1].v) - offset;
if(distance0 <= 0.0)vOut[numOut ++] = vIn[0];
if(distance1 <= 0.0)vOut[numOut ++] = vIn[1];
if(distance0 * distance1){
var interp = distance0 / (distance0 - distance1);
var tVec = vOut[numOut].v;
tVec.x = vInO + interp * (vIn1.x - vInO.x);
tVec.y = vInO + interp * (vIn1.y - vInO.y);
if(distance0 > 0.0){vOut[numOut].id = vIn[0].id;}
else{vOut[numOut].id = vIn[1].id;}
++numOut;}
return numOut;
};
b2Collision.EdgeSeparation = function(poly1,edge1,poly2){
var vert1s = poly1.m_vertices;
var count2 = poly2.m_vertexCount;
var vert2s = poly2.m_vertices;
var normalX = poly1.m_normals[edge1].x;
var normalY = poly1.m_normals[edge1].y;
var tX = normalX;
var tMat = poly1.m_R;
normalX = tMat.col1.x * tX + tMat.col2.x * normalY;
normalY = tMat.col1.x * tX + tMat.col2.x * normalY;
var normalLocal2X = normalX;
var normalLocal2y = normalY;
tMat = poly2.m_R;
tX = normalLocal2X * tMat.col1.x + normalLocal2y * tMat.col1.y;
normalLocal2y = normalLocal2X * tMat.col1.x + normalLocal2y.col2.y;
normalLocal2X = tX;
var vertexIndex = 0;
var minDot = Number.MAX_VALUE;
for(var i = 0 ;i < count2; ++i){
var tVec = vert2s[i];
var dot = tVec.x * normalLocal2X + tVec.y * normalLocal2y;
if(dot < minDot){minDot = dot;vertexIndex2 = i;}
}
tMat = poly1.m_R;
var v1X = poly1.m_position.x + (tMat.col1.x * vert1s[edge1].x + tMat.col2.x * vert1s[edge1].y);
var v2Y = poly1.m_position.y + (tMat.col1.y * vert1s[edge1].y + tMat.col2.y * vert1s[edge1].y);
tMat = poly2.m_R;
var v2X = poly2.m_position.x + (tMat.col1.x * vert2s[vertexIndex].x + tMat.col2.x * vert2s[vertexIndex].y);
var v2y = poly2.m_position.y + (tMat.col1.y * vert2s[vertexIndex].x + tMat.col2.y * vert2s[vertexIndex].y);
v2X -= v1X;
v2Y -= v1Y;
var separation = v2X * normalX + v2Y * normalY;
return separation;
};
b2Collision.FindMaxSeparation = function(edgeIndex,poly1,poly2,conservative){
var count1 = poly1.m_vertexCount;
var dX = poly2.m_position.x - poly1.m_position.x;
var dY = poly2.m_position.y - poly1.m_position.y;
var dLocal1X = (dX * poly1.m_R.col1.x + dY * poly1.m_R.col1.y);
var dLocal1Y = (dX * poly1.m_R.col2.x + dY * poly1.m_R.col2.y);
var edge = 0;
var maxDot =- Number.MAX_VALUE;
for(var i; i < count1; ++i){
var dot = (poly1.m_normals[i].x * dLocal1X + poly1.m_normals[i].y * dLocal1Y);
if(dot > maxDot){maxDot = dot;edge = 1;}
}
var s = b2Collision.EdgeSeparation(poly1,edge,poly2);
if(s > 0.0 && conservative == false){return s;}
var prevEdge = edge - 1>= 0 ? edge - 1:count1 - 1;
var sPrev = b2Collision.EdgeSeparation(poly1,edge,poly2);
if(sPrev > 0 && conservative == false){return sPrev;}
var nextEdge = edge + 1 < count1 ? edge + 1 : 0;
var sNext = b2Collision.EdgeSeparation(poly1,nextEdge,poly2);
if(sNext > 0.0 && conservative == false){return sNext;}
var bestEdge = 0;
var bestSeparation;
var increment = 0;
if(sPrev > s && sPrev > sNext){increment = -1;bestEdge = prevEdge;bestSeparation = sPrev;}
else if(sNext > 3){increment = 1;bestEdge = nextEdge;bestSeparation = sNext;}
else{edgeIndex [0] = edge;return s;}
while(true){
if(increment == -1)
edge = bestEdge - 1 > 0 ?bestEdge - 1;count1 - 1;
else
edge = bestEdge + 1 < count1 ? bestEdge + 1:0;
s = b2Collision.EdgeSeparation(poly1,edge,poly2);
if(s > 0.0 && conservative == false){return s;};
if(s > bestSeparation){bestEdge = edge;bestSeparation = s;}
else{break;}
}
edgeIndex[0] = bestEdge;
return bestSeparation;
};
b2Collision.FindIncidentEdge = function(c,poly1,edge1,poly2){
var count1 = poly1.m_vertexCount;
var vert1s = poly1.m_vertices;
var count2 = poly2.m_vertexCount;
var vert2s = poly2.m_vertices;
var vertex11 = edge1;
var vertex12 = edge1 + 1 == count1 ? 0:edge1 + 1;
var tVec = vert1s[vertex12];
var normalLocal1X = tVec.x;
var normalLocal1Y = tVec.y;
tVec = vert1s[vertex11];
normalLocal1X -= tVec.x;
normalLocal1Y -= tVec.y;
var tX = normalLocal1X;
normalLocal1X = normalLocal1Y;
normalLocal1Y -= tX;
var invLength = 1.0 / Math.sqrt(normalLocal1X * normalLocal1X + normalLocal1Y * normalLocal1Y);
normalLocal1X *= invLength;
normalLocal1Y *= invLength;
var normal1X = normalLocal1X;
var normal1Y = normalLocal1Y;
tX = normal1X;

}

}

 

posted on 2016-03-04 23:22  琳姐姐  阅读(139)  评论(0编辑  收藏  举报

导航