UNPKG

@threlte/rapier

Version:

Components and hooks to use the Rapier physics engine in Threlte

51 lines (50 loc) 1.6 kB
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 }; };