| Per-entity collider shape (Ball / Capsule / Cuboid) |
ColliderBuilder::ball/capsule_y/cuboid |
β
via RapierClusterSimulation::collider_for |
Lives in #118. |
| Compound colliders (multiple shapes per body) |
Multiple insert_with_parent calls |
π |
One collider per body in current shape. Add when a real game needs it. |
| Body kind (Dynamic / Kinematic / Fixed) |
RigidBodyBuilder::dynamic/fixed/kinematic_* |
π§ #120 |
Currently every body is Dynamic. |
| Material (friction / restitution / density) |
ColliderBuilder::friction/restitution/density |
π§ #120 |
Currently defaults only. |
| Collision filtering (groups / masks) |
ColliderBuilder::collision_groups |
π§ #120 |
Currently every entity collides with every other. |
| Sensor colliders (events without physical response) |
ColliderBuilder::sensor(true) |
π§ #120 |
Currently every collider has physical response. |
| Apply impulse |
body.apply_impulse(impulse, wake) |
π§ #121 |
The flagship missing capability. |
| Apply force |
body.add_force(force, wake) |
π§ #121 |
|
| Apply torque impulse |
body.apply_torque_impulse(torque, wake) |
π§ #121 |
|
| Set translation (teleport) |
body.set_translation(pos, wake) |
π§ #121 |
|
| Set linvel / angvel |
body.set_linvel/set_angvel |
π§ #121 |
Currently linvel is auto-set from entity.velocity only. |
| Wake / sleep control |
body.wake_up() / activation API |
π§ #121 |
|
| Joints (fixed / revolute / prismatic / spherical) |
ImpulseJointSet::insert |
π§ #121 (single-cluster only) |
Joints across cluster boundaries are not in scope until cross-cluster physics lands. |
| Multibody joints (articulated chains) |
MultibodyJointSet::insert |
π |
Defer; not needed for typical games. |
| Raycasts |
query_pipeline.cast_ray(...) |
π§ #121 |
|
| Shape casts |
query_pipeline.cast_shape(...) |
π§ #121 |
|
| Intersection tests |
query_pipeline.intersections_with_shape(...) |
π§ #121 |
|
| Contact events (Started / Stopped) |
ChannelEventCollector |
β
via RapierClusterTickContext::contact_events |
Lives in #118. One-tick delay by design. |
| Contact force events |
ContactForceEventThreshold + collector |
π |
Add when impulse-magnitude reactive gameplay needs it. |
| Per-cluster gravity |
step(gravity, ...) |
β
via RapierConfig::gravity |
Honored on any axis; tested. |
| Custom physics hooks (filtering / pair modification) |
PhysicsHooks trait |
π |
Advanced; needed only by games with very custom contact rules. |
| Cross-cluster physics interaction |
(N/A β Rapier is single-process) |
π« Blocked on cross-cluster physics epic (not yet filed) |
Kinematic neighbor proxies for entities owned by adjacent clusters. |
| Terrain / world geometry collision |
User inserts mesh / heightfield as fixed bodies |
π« Blocked on #119 (Terrain epic) |
Game devs do not insert terrain by hand; the Arcane runtime owns this. |
| Spatial-binding migration for Fixed entities |
(N/A β local Rapier doesn't have clusters) |
π« Blocked on clustering-binding epic (not yet filed) |
Fixed entities (walls, structures) shouldn't migrate by PGP affinity; need spatial binding. |
| Cross-machine determinism / reconciliation |
Best-effort; Rapier is deterministic per-process per-build |
π |
Open question for production. May never be exactly deterministic across hardware; partial reconciliation is the goal. |
| Empty-cluster step skip (no entities β no step) |
(N/A) |
π |
Trivial optimization; relies on Rapier sleeping for stationary bodies. |
Quick Summary
Inventory
Status legend:
#117/#118)ColliderBuilder::ball/capsule_y/cuboidRapierClusterSimulation::collider_for#118.insert_with_parentcallsRigidBodyBuilder::dynamic/fixed/kinematic_*#120ColliderBuilder::friction/restitution/density#120ColliderBuilder::collision_groups#120ColliderBuilder::sensor(true)#120body.apply_impulse(impulse, wake)#121body.add_force(force, wake)#121body.apply_torque_impulse(torque, wake)#121body.set_translation(pos, wake)#121body.set_linvel/set_angvel#121entity.velocityonly.body.wake_up()/ activation API#121ImpulseJointSet::insert#121(single-cluster only)MultibodyJointSet::insertquery_pipeline.cast_ray(...)#121query_pipeline.cast_shape(...)#121query_pipeline.intersections_with_shape(...)#121ChannelEventCollectorRapierClusterTickContext::contact_events#118. One-tick delay by design.ContactForceEventThreshold+ collectorstep(gravity, ...)RapierConfig::gravityPhysicsHookstrait#119(Terrain epic)What's reachable right now without any architectural epic
The flagged-blocked rows above (3 of them) require architectural decisions / docs / epics. Everything else can land via
#120and#121without waiting. Those two issues, together, close the per-entity-physics gap inside the existing entity-driven model.After
#120and#121, a developer can:After
#119(terrain) lands, the same code starts hitting world geometry β without any change to user code (terrain is loaded by the runtime).After the cross-cluster physics epic lands, entities in neighbor clusters become visible to physics queries.
How this issue is maintained
Update the inventory rows when:
Keep the inventory rather than closing it β it's the canonical view of "what's possible on the cluster vs locally" for anyone evaluating Arcane.
Reference
#8β Cluster physics backends#117(minimum integration, RapierClusterSim wrapper),#118(contact events + per-entity colliders)#120(spawn-time hooks),#121(in-tick ops)#119(Terrain), clustering-binding (not filed), cross-cluster physics (not filed)docs/architecture/entity-model.md,docs/architecture/physics-backends-and-unreal.md