diff --git a/apps/playground/src/pages/rapier/HeightfieldDemo.vue b/apps/playground/src/pages/rapier/HeightfieldDemo.vue new file mode 100644 index 000000000..40a24a80e --- /dev/null +++ b/apps/playground/src/pages/rapier/HeightfieldDemo.vue @@ -0,0 +1,58 @@ + + + diff --git a/apps/playground/src/pages/rapier/InstancedRigidBody.vue b/apps/playground/src/pages/rapier/InstancedRigidBody.vue index 11224e9b8..8f120cd7d 100644 --- a/apps/playground/src/pages/rapier/InstancedRigidBody.vue +++ b/apps/playground/src/pages/rapier/InstancedRigidBody.vue @@ -44,7 +44,7 @@ watch(torusInstancedMesh, (mesh) => { - + diff --git a/apps/playground/src/router/routes/rapier/index.ts b/apps/playground/src/router/routes/rapier/index.ts index 2c6359748..28f9ee74b 100644 --- a/apps/playground/src/router/routes/rapier/index.ts +++ b/apps/playground/src/router/routes/rapier/index.ts @@ -65,6 +65,11 @@ export const rapierRoutes = [ name: 'Solver Groups', component: () => import('@/pages/rapier/SolverGroupsDemo.vue'), }, + { + path: '/rapier/heightfield', + name: 'Heightfield', + component: () => import('@/pages/rapier/HeightfieldDemo.vue'), + }, { path: '/rapier/ragdoll', name: 'Basic Ragdoll', diff --git a/packages/rapier/src/components/InstancedRigidBody.vue b/packages/rapier/src/components/InstancedRigidBody.vue index 80e2bb27f..eadac1d8d 100644 --- a/packages/rapier/src/components/InstancedRigidBody.vue +++ b/packages/rapier/src/components/InstancedRigidBody.vue @@ -5,8 +5,12 @@ import { onUnmounted, onUpdated, shallowRef, watch } from 'vue' import { useRapierContext } from '../composables' import { MATRIX_ZERO, QUATERNION_ZERO, VECTOR_ZERO } from '../constants/' -import { createCollider, createRigidBody } from '../core' -import type { InstancedRigidBodyProps, RigidBodyContext, TresInstancedMesh } from '../types' +import { createCollider, createRigidBody, createRigidBodyAutoColliderPropsFromObject } from '../core' +import type { + InstancedRigidBodyProps, + RigidBodyContext, + TresInstancedMesh, +} from '../types' const props = withDefaults(defineProps>(), { type: 'dynamic', @@ -59,10 +63,14 @@ watch(bodyGroup, (group) => { rigidBodyInfo.rigidBody.setTranslation(position, true) rigidBodyInfo.rigidBody.setRotation(quaternion, true) + const colliderProps = createRigidBodyAutoColliderPropsFromObject( + object, + props.collider, + rigidBodyInfo.rigidBody, + ) const colliderInfo = { ...createCollider({ - object, - shape: props.collider, + ...colliderProps, rigidBody: rigidBodyInfo.rigidBody, world, }), diff --git a/packages/rapier/src/components/Physics.vue b/packages/rapier/src/components/Physics.vue index 2dd330d5c..adbe890f8 100644 --- a/packages/rapier/src/components/Physics.vue +++ b/packages/rapier/src/components/Physics.vue @@ -10,11 +10,11 @@ import { GRAVITY } from '../constants' import { collisionTrigger, emitIntersection, - getCollisionObjectFromSource, getCollisionSourceFromColliderHandle, + getNodeObjectsFromCollisionSource, } from '../utils' import Debug from './Debug.vue' -import type { PhysicsProps } from '../types' +import type { PhysicsProps, SourceTarget } from '../types' const props = withDefaults( defineProps>(), @@ -63,20 +63,24 @@ onBeforeRender(() => { eventQueue.drainCollisionEvents((handle1, handle2, started) => { const source1 = getCollisionSourceFromColliderHandle(world.value, handle1) const source2 = getCollisionSourceFromColliderHandle(world.value, handle2) - const object1 = getCollisionObjectFromSource(source1, scene) - const object2 = getCollisionObjectFromSource(source2, scene) + const [groupObject1, currentObject1] = getNodeObjectsFromCollisionSource(source1, scene) + const [groupObject2, currentObject2] = getNodeObjectsFromCollisionSource(source2, scene) - if (!object1 || !object2) { return } + if (!groupObject1 || !currentObject1 || !groupObject2 || !currentObject2) { return } - collisionTrigger( - { objects: object1, context: source1 }, - { objects: object2, context: source2 }, - started, - ) + const sourceTarget1: SourceTarget = { + objects: [groupObject1, currentObject1], + context: source1, + } + const sourceTarget2: SourceTarget = { + objects: [groupObject2, currentObject2], + context: source2, + } + collisionTrigger(sourceTarget1, sourceTarget2, started) emitIntersection( - { objects: object2, context: source2 }, - { objects: object1, context: source1 }, + sourceTarget2, + sourceTarget1, started && world.value.intersectionPair(source1.collider, source2.collider), ) }) diff --git a/packages/rapier/src/components/RigidBody.vue b/packages/rapier/src/components/RigidBody.vue index 4e736d5a6..892d16fcc 100644 --- a/packages/rapier/src/components/RigidBody.vue +++ b/packages/rapier/src/components/RigidBody.vue @@ -1,6 +1,6 @@