Add Collider:get/setType;

Deprecates Collider:is/setKinematic.
This commit is contained in:
bjorn 2024-04-27 01:32:04 -07:00
parent 9b3ace7094
commit 1865cf8591
7 changed files with 70 additions and 30 deletions

View File

@ -26,6 +26,7 @@ extern StringEntry lovrBlendMode[];
extern StringEntry lovrBlockType[];
extern StringEntry lovrBufferLayout[];
extern StringEntry lovrChannelLayout[];
extern StringEntry lovrColliderType[];
extern StringEntry lovrCompareMode[];
extern StringEntry lovrCullMode[];
extern StringEntry lovrDataType[];

View File

@ -2,6 +2,13 @@
#include "physics/physics.h"
#include "util.h"
StringEntry lovrColliderType[] = {
[COLLIDER_STATIC] = ENTRY("static"),
[COLLIDER_DYNAMIC] = ENTRY("dynamic"),
[COLLIDER_KINEMATIC] = ENTRY("kinematic"),
{ 0 }
};
StringEntry lovrShapeType[] = {
[SHAPE_SPHERE] = ENTRY("sphere"),
[SHAPE_BOX] = ENTRY("box"),

View File

@ -85,16 +85,17 @@ static int l_lovrColliderSetUserData(lua_State* L) {
return 0;
}
static int l_lovrColliderIsKinematic(lua_State* L) {
static int l_lovrColliderGetType(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
lua_pushboolean(L, lovrColliderIsKinematic(collider));
ColliderType type = lovrColliderGetType(collider);
luax_pushenum(L, ColliderType, type);
return 1;
}
static int l_lovrColliderSetKinematic(lua_State* L) {
static int l_lovrColliderSetType(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
bool kinematic = lua_toboolean(L, 2);
lovrColliderSetKinematic(collider, kinematic);
ColliderType type = luax_checkenum(L, 2, ColliderType, NULL);
lovrColliderSetType(collider, type);
return 0;
}
@ -624,6 +625,21 @@ static int l_lovrColliderSetGravityIgnored(lua_State* L) {
return 0;
}
// Deprecated
static int l_lovrColliderIsKinematic(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
lua_pushboolean(L, lovrColliderGetType(collider) != COLLIDER_DYNAMIC);
return 1;
}
// Deprecated
static int l_lovrColliderSetKinematic(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
bool kinematic = lua_toboolean(L, 2);
lovrColliderSetType(collider, kinematic ? COLLIDER_KINEMATIC : COLLIDER_DYNAMIC);
return 0;
}
const luaL_Reg lovrCollider[] = {
{ "destroy", l_lovrColliderDestroy },
{ "isDestroyed", l_lovrColliderIsDestroyed },
@ -635,8 +651,8 @@ const luaL_Reg lovrCollider[] = {
{ "getJoints", l_lovrColliderGetJoints },
{ "getUserData", l_lovrColliderGetUserData },
{ "setUserData", l_lovrColliderSetUserData },
{ "isKinematic", l_lovrColliderIsKinematic },
{ "setKinematic", l_lovrColliderSetKinematic },
{ "getType", l_lovrColliderGetType },
{ "setType", l_lovrColliderSetType },
{ "isSensor", l_lovrColliderIsSensor },
{ "setSensor", l_lovrColliderSetSensor },
{ "isContinuous", l_lovrColliderIsContinuous },
@ -691,6 +707,8 @@ const luaL_Reg lovrCollider[] = {
{ "getShapes", l_lovrColliderGetShapes },
{ "isGravityIgnored", l_lovrColliderIsGravityIgnored },
{ "setGravityIgnored", l_lovrColliderSetGravityIgnored },
{ "isKinematic", l_lovrColliderIsKinematic },
{ "setKinematic", l_lovrColliderSetKinematic },
{ NULL, NULL }
};

View File

@ -131,7 +131,6 @@ static int l_lovrWorldNewTerrainCollider(lua_State* L) {
TerrainShape* shape = luax_newterrainshape(L, 2);
float position[3] = { 0.f, 0.f, 0.f };
Collider* collider = lovrColliderCreate(world, shape, position);
lovrColliderSetKinematic(collider, true);
luax_pushtype(L, Collider, collider);
lovrRelease(collider, lovrColliderDestroy);
lovrRelease(shape, lovrShapeDestroy);

View File

@ -101,6 +101,12 @@ void lovrWorldSetSleepingAllowed(World* world, bool allowed);
// Collider
typedef enum {
COLLIDER_STATIC,
COLLIDER_DYNAMIC,
COLLIDER_KINEMATIC
} ColliderType;
Collider* lovrColliderCreate(World* world, Shape* shape, float position[3]);
void lovrColliderDestroy(void* ref);
void lovrColliderDestroyData(Collider* collider);
@ -117,8 +123,8 @@ float lovrColliderGetFriction(Collider* collider);
void lovrColliderSetFriction(Collider* collider, float friction);
float lovrColliderGetRestitution(Collider* collider);
void lovrColliderSetRestitution(Collider* collider, float restitution);
bool lovrColliderIsKinematic(Collider* collider);
void lovrColliderSetKinematic(Collider* collider, bool kinematic);
ColliderType lovrColliderGetType(Collider* collider);
void lovrColliderSetType(Collider* collider, ColliderType type);
bool lovrColliderIsSensor(Collider* collider);
void lovrColliderSetSensor(Collider* collider, bool sensor);
bool lovrColliderIsContinuous(Collider* collider);

View File

@ -516,7 +516,7 @@ void lovrColliderSetShape(Collider* collider, Shape* shape) {
bool updateMass = true;
if (shape->type == SHAPE_MESH || shape->type == SHAPE_TERRAIN) {
lovrColliderSetKinematic(collider, true);
lovrColliderSetType(collider, COLLIDER_STATIC);
updateMass = false;
}
@ -536,8 +536,8 @@ bool lovrColliderSetTag(Collider* collider, const char* tag) {
return false;
}
}
bool kinematic = lovrColliderIsKinematic(collider);
JPH_ObjectLayer objectLayer = collider->tag * 2 + (kinematic ? 0 : 1);
bool isStatic = lovrColliderGetType(collider) == COLLIDER_STATIC;
JPH_ObjectLayer objectLayer = collider->tag * 2 + (isStatic ? 0 : 1);
JPH_BodyInterface_SetObjectLayer(collider->world->bodies, collider->id, objectLayer);
return true;
}
@ -558,20 +558,29 @@ void lovrColliderSetRestitution(Collider* collider, float restitution) {
JPH_BodyInterface_SetRestitution(collider->world->bodies, collider->id, restitution);
}
bool lovrColliderIsKinematic(Collider* collider) {
JPH_ObjectLayer objectLayer = JPH_BodyInterface_GetObjectLayer(collider->world->bodies, collider->id);
return objectLayer % 2 == 0;
ColliderType lovrColliderGetType(Collider* collider) {
switch (JPH_BodyInterface_GetMotionType(collider->world->bodies, collider->id)) {
case JPH_MotionType_Static: return COLLIDER_STATIC;
case JPH_MotionType_Dynamic: return COLLIDER_DYNAMIC;
case JPH_MotionType_Kinematic: return COLLIDER_KINEMATIC;
default: lovrUnreachable();
}
}
void lovrColliderSetKinematic(Collider* collider, bool kinematic) {
JPH_ObjectLayer objectLayer = collider->tag * 2 + (kinematic ? 0 : 1);
JPH_BodyInterface_SetObjectLayer(collider->world->bodies, collider->id, objectLayer);
if (kinematic) {
JPH_BodyInterface_DeactivateBody(collider->world->bodies, collider->id);
JPH_BodyInterface_SetMotionType(collider->world->bodies, collider->id, JPH_MotionType_Kinematic, JPH_Activation_DontActivate);
} else {
JPH_BodyInterface_SetMotionType(collider->world->bodies, collider->id, JPH_MotionType_Dynamic, JPH_Activation_Activate);
void lovrColliderSetType(Collider* collider, ColliderType type) {
JPH_MotionType motionType;
switch (type) {
case COLLIDER_STATIC: motionType = JPH_MotionType_Static; break;
case COLLIDER_DYNAMIC: motionType = JPH_MotionType_Dynamic; break;
case COLLIDER_KINEMATIC: motionType = JPH_MotionType_Kinematic; break;
default: lovrUnreachable();
}
JPH_BodyInterface_SetMotionType(collider->world->bodies, collider->id, motionType, JPH_Activation_Activate);
JPH_ObjectLayer objectLayer = collider->tag * 2 + (type == COLLIDER_STATIC ? 0 : 1);
JPH_BodyInterface_SetObjectLayer(collider->world->bodies, collider->id, objectLayer);
}
bool lovrColliderIsSensor(Collider* collider) {

View File

@ -565,15 +565,15 @@ void lovrColliderSetRestitution(Collider* collider, float restitution) {
collider->restitution = restitution;
}
bool lovrColliderIsKinematic(Collider* collider) {
return dBodyIsKinematic(collider->body);
ColliderType lovrColliderGetType(Collider* collider) {
return dBodyIsKinematic(collider->body) ? COLLIDER_KINEMATIC : COLLIDER_DYNAMIC;
}
void lovrColliderSetKinematic(Collider* collider, bool kinematic) {
if (kinematic) {
dBodySetKinematic(collider->body);
} else {
void lovrColliderSetType(Collider* collider, ColliderType type) {
if (type == COLLIDER_DYNAMIC) {
dBodySetDynamic(collider->body);
} else {
dBodySetKinematic(collider->body);
}
}