Add area and flag on physics

This commit is contained in:
2026-07-20 12:31:14 -05:00
parent 373f1c1010
commit b9f06fef7a
27 changed files with 1956 additions and 114 deletions
+44
View File
@@ -191,6 +191,49 @@ static void test_physicsWorldDynamicVsDynamicSeparates(void **state) {
assert_int_equal(memoryGetAllocatedCount(), 0);
}
static void test_physicsWorldCollideMaskPreventsCollision(void **state) {
entitymanager_t mgr;
entityManagerInit(&mgr);
physicsworld_t world;
physicsWorldInit(&world);
entityid_t entityA = entityManagerAdd(&mgr);
componentid_t posA = entityAddComponent(
&mgr, entityA, COMPONENT_TYPE_POSITION
);
componentid_t physA = entityAddComponent(
&mgr, entityA, COMPONENT_TYPE_PHYSICS
);
vec3 posAStart = { 0.0f, 0.0f, 0.3f };
entityPositionSetLocalPosition(&mgr, entityA, posA, posAStart);
entityPhysicsGet(&mgr, entityA, physA)->gravityScale = 0.0f;
entityPhysicsSetCollideMask(&mgr, entityA, physA, 0x1);
entityid_t entityB = entityManagerAdd(&mgr);
componentid_t posB = entityAddComponent(
&mgr, entityB, COMPONENT_TYPE_POSITION
);
componentid_t physB = entityAddComponent(
&mgr, entityB, COMPONENT_TYPE_PHYSICS
);
vec3 posBStart = { 0.0f, 0.0f, -0.3f };
entityPositionSetLocalPosition(&mgr, entityB, posB, posBStart);
entityPhysicsGet(&mgr, entityB, physB)->gravityScale = 0.0f;
entityPhysicsSetCollideMask(&mgr, entityB, physB, 0x2);
// Overlapping by 0.4 on Z, but masks share no bits -- no separation.
physicsWorldStep(&world, &mgr, 1.0f / 60.0f);
vec3 finalA, finalB;
entityPositionGetWorldPosition(&mgr, entityA, posA, finalA);
entityPositionGetWorldPosition(&mgr, entityB, posB, finalB);
assert_float_equal(finalA[2], posAStart[2], 0.0001f);
assert_float_equal(finalB[2], posBStart[2], 0.0001f);
entityManagerDispose(&mgr);
assert_int_equal(memoryGetAllocatedCount(), 0);
}
static void test_physicsWorldStepNoPhysicsEntitiesIsNoop(void **state) {
entitymanager_t mgr;
entityManagerInit(&mgr);
@@ -210,6 +253,7 @@ int main(int argc, char **argv) {
cmocka_unit_test(test_physicsWorldGravityIntegratesDynamicBody),
cmocka_unit_test(test_physicsWorldRestsOnStaticFloor),
cmocka_unit_test(test_physicsWorldDynamicVsDynamicSeparates),
cmocka_unit_test(test_physicsWorldCollideMaskPreventsCollision),
cmocka_unit_test(test_physicsWorldStepNoPhysicsEntitiesIsNoop),
};