planck-js
Version:
2D physics engine for JavaScript/HTML5 game development
61 lines (52 loc) • 2.33 kB
JavaScript
/*
* Copyright (c) 2016 Ali Shakiba http://shakiba.me/planck.js
* Copyright (c) 2006-2011 Erin Catto http://www.box2d.org
*
* This software is provided 'as-is', without any express or implied
* warranty. In no event will the authors be held liable for any damages
* arising from the use of this software.
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*/
var create = require('../util/create');
var Settings = require('../Settings');
var Shape = require('../Shape');
var Contact = require('../Contact');
var Manifold = require('../Manifold');
var Math = require('../common/Math');
var Transform = require('../common/Transform');
var Vec2 = require('../common/Vec2');
var CircleShape = require('./CircleShape');
Contact.AddType(CircleShape.TYPE, CircleShape.TYPE, CircleCircleContact);
function CircleCircleContact(manifold, xfA, fixtureA, indexA, xfB, fixtureB,
indexB) {
Assert(fixtureA.GetType() == CircleShape.TYPE);
Assert(fixtureB.GetType() == CircleShape.TYPE);
CollideCircles(manifold, fixtureA.GetShape(), xfA, fixtureB.GetShape(), xfB);
}
function CollideCircles(manifold, circleA, xfA, circleB, xfB) {
manifold.pointCount = 0;
var pA = Transform.Mul(xfA, circleA.m_p);
var pB = Transform.Mul(xfB, circleB.m_p);
var distSqr = Vec2.DistanceSquared(pB, pA);
var rA = circleA.m_radius;
var rB = circleB.m_radius;
var radius = rA + rB;
if (distSqr > radius * radius) {
return;
}
manifold.type = Manifold.e_circles;
manifold.localPoint.Set(circleA.m_p);
manifold.localNormal.SetZero();
manifold.pointCount = 1;
manifold.points[0].localPoint.Set(circleB.m_p);
manifold.points[0].id.key = 0;
}