@threlte/rapier
Version:
Components and hooks to use the Rapier physics engine in Threlte
51 lines (50 loc) • 1.6 kB
JavaScript
import { getContext, onDestroy } from 'svelte';
import { get } from 'svelte/store';
const applyBitMask = (collidersMap, bitMask) => {
collidersMap.forEach((c) => {
if (c && c.collider && c.collider.isValid()) {
c.collider.setCollisionGroups(bitMask);
}
});
};
export const useCollisionGroups = () => {
const collidersMap = new Map();
const bitMaskStore = getContext('threlte-rapier-collision-group');
if (!bitMaskStore)
return {
registerColliders: () => { },
removeColliders: () => { }
};
let bitMask = get(bitMaskStore);
const unsubscribe = bitMaskStore.subscribe((newBitMask) => {
bitMask = newBitMask;
applyBitMask(collidersMap, newBitMask);
});
onDestroy(unsubscribe);
const registerColliders = (colliders) => {
colliders.forEach((c) => {
if (!collidersMap.has(c.handle)) {
collidersMap.set(c.handle, {
collider: c,
initialCollisionGroup: c.collisionGroups()
});
}
});
applyBitMask(collidersMap, bitMask);
};
const removeColliders = (colliders) => {
colliders.forEach((c) => {
const mapItem = collidersMap.get(c.handle);
if (mapItem) {
if (c && c.isValid()) {
c.setCollisionGroups(mapItem.initialCollisionGroup);
}
}
collidersMap.delete(c.handle);
});
};
return {
registerColliders,
removeColliders
};
};