UNPKG

planck-js

Version:

2D physics engine for JavaScript/HTML5 game development

61 lines (52 loc) 2.33 kB
/* * 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; }