b2Filter
b2FilterData.b2FilterData = function () {
this.categoryBits = 0x0001;
this.maskBits = 0xFFFF;
this.groupIndex = 0;
};
b2FilterData.prototype.Copy = function () {
var copy = new b2FilterData();
copy.categoryBits = this.categoryBits;
copy.maskBits = this.maskBits;
copy.groupIndex = this.groupIndex;
return copy;
b2ContactFilter
.b2ContactFilter = function () {};
b2ContactFilter.prototype.ShouldCollide = function (fixtureA, fixtureB) {
var filter1 = fixtureA.GetFilterData();
var filter2 = fixtureB.GetFilterData();
if (filter1.groupIndex == filter2.groupIndex && filter1.groupIndex != 0) {
return filter1.groupIndex > 0;
}
var collide = (filter1.maskBits & filter2.categoryBits) != 0 && (filter1.categoryBits & filter2.maskBits) != 0;
return collide;
ShouldCollide
b2ContactFilter.prototype.ShouldCollide = function (fixtureA, fixtureB) {
var filter1 = fixtureA.GetFilterData();
var filter2 = fixtureB.GetFilterData();
if (filter1.groupIndex == filter2.groupIndex && filter1.groupIndex != 0) {
return filter1.groupIndex > 0;
}
var collide = (filter1.maskBits & filter2.categoryBits) != 0 && (filter1.categoryBits & filter2.maskBits) != 0;
return collide;
}
Body
b2Body.prototype.ShouldCollide = function (other) {
if (this.m_type != b2Body.b2_dynamicBody && other.m_type != b2Body.b2_dynamicBody) {
return false;
}
for (var jn = this.m_jointList; jn; jn = jn.next) {
if (jn.other == other) if (jn.joint.m_collideConnected == false) {
return false;
}
}
return true;
}
World
b2World.prototype.CreateJoint = function (def) {
var j = b2Joint.Create(def, null);
j.m_prev = null;
j.m_next = this.m_jointList;
if (this.m_jointList) {
this.m_jointList.m_prev = j;
}
this.m_jointList = j;
++this.m_jointCount;
j.m_edgeA.joint = j;
j.m_edgeA.other = j.m_bodyB;
j.m_edgeA.prev = null;
j.m_edgeA.next = j.m_bodyA.m_jointList;
if (j.m_bodyA.m_jointList) j.m_bodyA.m_jointList.prev = j.m_edgeA;
j.m_bodyA.m_jointList = j.m_edgeA;
j.m_edgeB.joint = j;
j.m_edgeB.other = j.m_bodyA;
j.m_edgeB.prev = null;
j.m_edgeB.next = j.m_bodyB.m_jointList;
if (j.m_bodyB.m_jointList) j.m_bodyB.m_jointList.prev = j.m_edgeB;
j.m_bodyB.m_jointList = j.m_edgeB;
var bodyA = def.bodyA;
var bodyB = def.bodyB;
if (def.collideConnected == false) {
var edge = bodyB.GetContactList();
while (edge) {
if (edge.other == bodyA) {
edge.contact.FlagForFiltering();
}
edge = edge.next;
}
}
return j;
}
joint base class
b2Joint.prototype.b2Joint = function (def) {
b2Settings.b2Assert(def.bodyA != def.bodyB);
this.m_type = def.type;
this.m_prev = null;
this.m_next = null;
this.m_bodyA = def.bodyA;
this.m_bodyB = def.bodyB;
this.m_collideConnected = def.collideConnected;
this.m_islandFlag = false;
this.m_userData = def.userData;
}
Contact Factory
b2ContactManager.prototype.AddPair = function (proxyUserDataA, proxyUserDataB) {
var fixtureA = (proxyUserDataA instanceof b2Fixture ? proxyUserDataA : null);
var fixtureB = (proxyUserDataB instanceof b2Fixture ? proxyUserDataB : null);
var bodyA = fixtureA.GetBody();
var bodyB = fixtureB.GetBody();
if (bodyA == bodyB) return;
var edge = bodyB.GetContactList();
while (edge) {
if (edge.other == bodyA) {
var fA = edge.contact.GetFixtureA();
var fB = edge.contact.GetFixtureB();
if (fA == fixtureA && fB == fixtureB) return;
if (fA == fixtureB && fB == fixtureA) return;
}
edge = edge.next;
}
if (bodyB.ShouldCollide(bodyA) == false) {
return;
}
if (this.m_contactFilter.ShouldCollide(fixtureA, fixtureB) == false) {
return;
}
var c = this.m_contactFactory.Create(fixtureA, fixtureB);
fixtureA = c.GetFixtureA();
fixtureB = c.GetFixtureB();
bodyA = fixtureA.m_body;
bodyB = fixtureB.m_body;
c.m_prev = null;
c.m_next = this.m_world.m_contactList;
if (this.m_world.m_contactList != null) {
this.m_world.m_contactList.m_prev = c;
}
this.m_world.m_contactList = c;
c.m_nodeA.contact = c;
c.m_nodeA.other = bodyB;
c.m_nodeA.prev = null;
c.m_nodeA.next = bodyA.m_contactList;
if (bodyA.m_contactList != null) {
bodyA.m_contactList.prev = c.m_nodeA;
}
bodyA.m_contactList = c.m_nodeA;
c.m_nodeB.contact = c;
c.m_nodeB.other = bodyA;
c.m_nodeB.prev = null;
c.m_nodeB.next = bodyB.m_contactList;
if (bodyB.m_contactList != null) {
bodyB.m_contactList.prev = c.m_nodeB;
}
bodyB.m_contactList = c.m_nodeB;
++this.m_world.m_contactCount;
return;
}
Collide Function
this is called from world step
b2ContactManager.prototype.Collide = function () {
var c = this.m_world.m_contactList;
while (c) {
var fixtureA = c.GetFixtureA();
var fixtureB = c.GetFixtureB();
var bodyA = fixtureA.GetBody();
var bodyB = fixtureB.GetBody();
if (bodyA.IsAwake() == false && bodyB.IsAwake() == false) {
c = c.GetNext();
continue;
}
if (c.m_flags & b2Contact.e_filterFlag) {
if (bodyB.ShouldCollide(bodyA) == false) {
var cNuke = c;
c = cNuke.GetNext();
this.Destroy(cNuke);
continue;
}
if (this.m_contactFilter.ShouldCollide(fixtureA, fixtureB) == false) {
cNuke = c;
c = cNuke.GetNext();
this.Destroy(cNuke);
continue;
}
c.m_flags &= ~b2Contact.e_filterFlag;
}
var proxyA = fixtureA.m_proxy;
var proxyB = fixtureB.m_proxy;
var overlap = this.m_broadPhase.TestOverlap(proxyA, proxyB);
if (overlap == false) {
cNuke = c;
c = cNuke.GetNext();
this.Destroy(cNuke);
continue;
}
c.Update(this.m_contactListener);
c = c.GetNext();
}
}
Comments