@dimforge/rapier3d
Version:
3-dimensional physics engine in Rust - official JS bindings.
144 lines • 4.95 kB
JavaScript
import { RawColliderSet } from "../raw";
import { Coarena } from "../coarena";
import { RotationOps, VectorOps } from "../math";
import { Collider } from "./collider";
/**
* A set of rigid bodies that can be handled by a physics pipeline.
*
* To avoid leaking WASM resources, this MUST be freed manually with `colliderSet.free()`
* once you are done using it (and all the rigid-bodies it created).
*/
export class ColliderSet {
/**
* Release the WASM memory occupied by this collider set.
*/
free() {
if (!!this.raw) {
this.raw.free();
}
this.raw = undefined;
if (!!this.map) {
this.map.clear();
}
this.map = undefined;
}
constructor(raw) {
this.raw = raw || new RawColliderSet();
this.map = new Coarena();
// Initialize the map with the existing elements, if any.
if (raw) {
raw.forEachColliderHandle((handle) => {
this.map.set(handle, new Collider(this, handle, null));
});
}
}
/** @internal */
castClosure(f) {
return (handle) => {
if (!!f) {
return f(this.get(handle));
}
else {
return undefined;
}
};
}
/** @internal */
finalizeDeserialization(bodies) {
this.map.forEach((collider) => collider.finalizeDeserialization(bodies));
}
/**
* Creates a new collider and return its integer handle.
*
* @param bodies - The set of bodies where the collider's parent can be found.
* @param desc - The collider's description.
* @param parentHandle - The integer handle of the rigid-body this collider is attached to.
*/
createCollider(bodies, desc, parentHandle) {
let hasParent = parentHandle != undefined && parentHandle != null;
if (hasParent && isNaN(parentHandle))
throw Error("Cannot create a collider with a parent rigid-body handle that is not a number.");
let rawShape = desc.shape.intoRaw();
let rawTra = VectorOps.intoRaw(desc.translation);
let rawRot = RotationOps.intoRaw(desc.rotation);
let rawCom = VectorOps.intoRaw(desc.centerOfMass);
// #if DIM3
let rawPrincipalInertia = VectorOps.intoRaw(desc.principalAngularInertia);
let rawInertiaFrame = RotationOps.intoRaw(desc.angularInertiaLocalFrame);
// #endif
let handle = this.raw.createCollider(desc.enabled, rawShape, rawTra, rawRot, desc.massPropsMode, desc.mass, rawCom,
// #if DIM3
rawPrincipalInertia, rawInertiaFrame,
// #endif
desc.density, desc.friction, desc.restitution, desc.frictionCombineRule, desc.restitutionCombineRule, desc.isSensor, desc.collisionGroups, desc.solverGroups, desc.activeCollisionTypes, desc.activeHooks, desc.activeEvents, desc.contactForceEventThreshold, desc.contactSkin, hasParent, hasParent ? parentHandle : 0, bodies.raw);
rawShape.free();
rawTra.free();
rawRot.free();
rawCom.free();
// #if DIM3
rawPrincipalInertia.free();
rawInertiaFrame.free();
// #endif
let parent = hasParent ? bodies.get(parentHandle) : null;
let collider = new Collider(this, handle, parent, desc.shape);
this.map.set(handle, collider);
return collider;
}
/**
* Remove a collider from this set.
*
* @param handle - The integer handle of the collider to remove.
* @param bodies - The set of rigid-body containing the rigid-body the collider is attached to.
* @param wakeUp - If `true`, the rigid-body the removed collider is attached to will be woken-up automatically.
*/
remove(handle, islands, bodies, wakeUp) {
this.raw.remove(handle, islands.raw, bodies.raw, wakeUp);
this.unmap(handle);
}
/**
* Internal function, do not call directly.
* @param handle
*/
unmap(handle) {
this.map.delete(handle);
}
/**
* Gets the rigid-body with the given handle.
*
* @param handle - The handle of the rigid-body to retrieve.
*/
get(handle) {
return this.map.get(handle);
}
/**
* The number of colliders on this set.
*/
len() {
return this.map.len();
}
/**
* Does this set contain a collider with the given handle?
*
* @param handle - The collider handle to check.
*/
contains(handle) {
return this.get(handle) != null;
}
/**
* Applies the given closure to each collider contained by this set.
*
* @param f - The closure to apply.
*/
forEach(f) {
this.map.forEach(f);
}
/**
* Gets all colliders in the list.
*
* @returns collider list.
*/
getAll() {
return this.map.getAll();
}
}
//# sourceMappingURL=collider_set.js.map