UNPKG

@box2d/debug-draw

Version:

Debug drawing helper for @box2d

120 lines (119 loc) 5.48 kB
"use strict"; // MIT License Object.defineProperty(exports, "__esModule", { value: true }); exports.b2ContactListener = exports.b2ContactImpulse = exports.b2ContactFilter = exports.b2DestructionListener = void 0; // Copyright (c) 2019 Erin Catto // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. const b2_common_1 = require("../common/b2_common"); /** * Joints and fixtures are destroyed when their associated * body is destroyed. Implement this listener so that you * may nullify references to these joints and shapes. */ class b2DestructionListener { /** * Called when any joint is about to be destroyed due * to the destruction of one of its attached bodies. */ SayGoodbyeJoint(_joint) { } /** * Called when any fixture is about to be destroyed due * to the destruction of its parent body. */ SayGoodbyeFixture(_fixture) { } } exports.b2DestructionListener = b2DestructionListener; /** * Implement this class to provide collision filtering. In other words, you can implement * this class if you want finer control over contact creation. */ class b2ContactFilter { /** * Return true if contact calculations should be performed between these two shapes. * * @warning for performance reasons this is only called when the AABBs begin to overlap. */ ShouldCollide(fixtureA, fixtureB) { const filterA = fixtureA.GetFilterData(); const filterB = fixtureB.GetFilterData(); if (filterA.groupIndex === filterB.groupIndex && filterA.groupIndex !== 0) { return filterA.groupIndex > 0; } return (filterA.maskBits & filterB.categoryBits) !== 0 && (filterA.categoryBits & filterB.maskBits) !== 0; } } exports.b2ContactFilter = b2ContactFilter; b2ContactFilter.b2_defaultFilter = new b2ContactFilter(); /** * Contact impulses for reporting. Impulses are used instead of forces because * sub-step forces may approach infinity for rigid body collisions. These * match up one-to-one with the contact points in b2Manifold. */ class b2ContactImpulse { constructor() { this.normalImpulses = (0, b2_common_1.b2MakeNumberArray)(b2_common_1.b2_maxManifoldPoints); this.tangentImpulses = (0, b2_common_1.b2MakeNumberArray)(b2_common_1.b2_maxManifoldPoints); this.count = 0; } } exports.b2ContactImpulse = b2ContactImpulse; /** * Implement this class to get contact information. You can use these results for * things like sounds and game logic. You can also get contact results by * traversing the contact lists after the time step. However, you might miss * some contacts because continuous physics leads to sub-stepping. * Additionally you may receive multiple callbacks for the same contact in a * single time step. * You should strive to make your callbacks efficient because there may be * many callbacks per time step. * * @warning You cannot create/destroy Box2D entities inside these callbacks. */ class b2ContactListener { /** * Called when two fixtures begin to touch. */ BeginContact(_contact) { } /** * Called when two fixtures cease to touch. */ EndContact(_contact) { } /** * This is called after a contact is updated. This allows you to inspect a * contact before it goes to the solver. If you are careful, you can modify the * contact manifold (e.g. disable contact). * A copy of the old manifold is provided so that you can detect changes. * Note: this is called only for awake bodies. * Note: this is called even when the number of contact points is zero. * Note: this is not called for sensors. * Note: if you set the number of contact points to zero, you will not * get an EndContact callback. However, you may get a BeginContact callback * the next step. */ PreSolve(_contact, _oldManifold) { } /** * This lets you inspect a contact after the solver is finished. This is useful * for inspecting impulses. * Note: the contact manifold does not include time of impact impulses, which can be * arbitrarily large if the sub-step is small. Hence the impulse is provided explicitly * in a separate data structure. * Note: this is only called for contacts that are touching, solid, and awake. */ PostSolve(_contact, _impulse) { } } exports.b2ContactListener = b2ContactListener; b2ContactListener.b2_defaultListener = new b2ContactListener();