@threlte/rapier
Version:
Components and hooks to use the Rapier physics engine in Threlte
38 lines (37 loc) • 1.1 kB
JavaScript
import { MultibodyJoint } from '@dimforge/rapier3d-compat';
import { onDestroy } from 'svelte';
import { derived, get, writable } from 'svelte/store';
import { useRapier } from './useRapier';
export const useJoint = (initializeJoint) => {
const rigidBodyA = writable(undefined);
const rigidBodyB = writable(undefined);
const ctx = useRapier();
const bodies = derived([rigidBodyA, rigidBodyB], ([rbA, rbB]) => {
if (!!rbA && !!rbB) {
return [rbA, rbB];
}
return undefined;
});
const joint = writable(undefined);
const unsubscribeBodies = bodies.subscribe((bodies) => {
if (bodies)
joint.set(initializeJoint(...bodies, ctx));
});
onDestroy(() => {
unsubscribeBodies();
const j = get(joint);
if (!j)
return;
if (j instanceof MultibodyJoint) {
ctx.world.removeMultibodyJoint(j, true);
}
else {
ctx.world.removeImpulseJoint(j, true);
}
});
return {
joint,
rigidBodyA,
rigidBodyB
};
};