mirror of https://github.com/bjornbytes/lovr.git
Add Collider:get/setType;
Deprecates Collider:is/setKinematic.
This commit is contained in:
parent
9b3ace7094
commit
1865cf8591
|
@ -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[];
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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 }
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue