Move Shape:is/setSensor and Shape:is/setEnabled to Collider;

This commit is contained in:
bjorn 2024-04-06 00:36:42 -07:00
parent 1a8d05b8b4
commit d876de66cb
5 changed files with 73 additions and 74 deletions

View File

@ -17,6 +17,20 @@ static int l_lovrColliderIsDestroyed(lua_State* L) {
return 1;
}
static int l_lovrColliderIsEnabled(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
bool enabled = lovrColliderIsEnabled(collider);
lua_pushboolean(L, enabled);
return 1;
}
static int l_lovrColliderSetEnabled(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
bool enable = lua_toboolean(L, 2);
lovrColliderSetEnabled(collider, enable);
return 1;
}
static int l_lovrColliderGetWorld(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
World* world = lovrColliderGetWorld(collider);
@ -123,6 +137,19 @@ static int l_lovrColliderSetKinematic(lua_State* L) {
return 0;
}
static int l_lovrColliderIsSensor(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
lua_pushboolean(L, lovrColliderIsSensor(collider));
return 1;
}
static int l_lovrColliderSetSensor(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
bool sensor = lua_toboolean(L, 2);
lovrColliderSetSensor(collider, sensor);
return 0;
}
static int l_lovrColliderIsContinuous(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider);
bool continuous = lovrColliderIsContinuous(collider);
@ -585,6 +612,8 @@ static int l_lovrColliderSetGravityIgnored(lua_State* L) {
const luaL_Reg lovrCollider[] = {
{ "destroy", l_lovrColliderDestroy },
{ "isDestroyed", l_lovrColliderIsDestroyed },
{ "isEnabled", l_lovrColliderIsEnabled },
{ "setEnabled", l_lovrColliderSetEnabled },
{ "getWorld", l_lovrColliderGetWorld },
{ "getShape", l_lovrColliderGetShape },
{ "setShape", l_lovrColliderSetShape },
@ -595,6 +624,8 @@ const luaL_Reg lovrCollider[] = {
{ "setUserData", l_lovrColliderSetUserData },
{ "isKinematic", l_lovrColliderIsKinematic },
{ "setKinematic", l_lovrColliderSetKinematic },
{ "isSensor", l_lovrColliderIsSensor },
{ "setSensor", l_lovrColliderSetSensor },
{ "isContinuous", l_lovrColliderIsContinuous },
{ "setContinuous", l_lovrColliderSetContinuous },
{ "getGravityScale", l_lovrColliderGetGravityScale },

View File

@ -229,32 +229,6 @@ static int l_lovrShapeGetType(lua_State* L) {
return 1;
}
static int l_lovrShapeIsEnabled(lua_State* L) {
Shape* shape = luax_checkshape(L, 1);
lua_pushboolean(L, lovrShapeIsEnabled(shape));
return 1;
}
static int l_lovrShapeSetEnabled(lua_State* L) {
Shape* shape = luax_checkshape(L, 1);
bool enabled = lua_toboolean(L, 2);
lovrShapeSetEnabled(shape, enabled);
return 0;
}
static int l_lovrShapeIsSensor(lua_State* L) {
Shape* shape = luax_checkshape(L, 1);
lua_pushboolean(L, lovrShapeIsSensor(shape));
return 1;
}
static int l_lovrShapeSetSensor(lua_State* L) {
Shape* shape = luax_checkshape(L, 1);
bool sensor = lua_toboolean(L, 2);
lovrShapeSetSensor(shape, sensor);
return 0;
}
static void luax_pushshapestash(lua_State* L) {
lua_getfield(L, LUA_REGISTRYINDEX, "_lovrshapestash");
@ -321,10 +295,6 @@ static int l_lovrShapeGetAABB(lua_State* L) {
#define lovrShape \
{ "destroy", l_lovrShapeDestroy }, \
{ "getType", l_lovrShapeGetType }, \
{ "isEnabled", l_lovrShapeIsEnabled }, \
{ "setEnabled", l_lovrShapeSetEnabled }, \
{ "isSensor", l_lovrShapeIsSensor }, \
{ "setSensor", l_lovrShapeSetSensor }, \
{ "getUserData", l_lovrShapeGetUserData }, \
{ "setUserData", l_lovrShapeSetUserData }, \
{ "getMass", l_lovrShapeGetMass }, \

View File

@ -90,6 +90,8 @@ Collider* lovrColliderCreate(World* world, Shape* shape, float x, float y, float
void lovrColliderDestroy(void* ref);
void lovrColliderDestroyData(Collider* collider);
bool lovrColliderIsDestroyed(Collider* collider);
bool lovrColliderIsEnabled(Collider* collider);
void lovrColliderSetEnabled(Collider* collider, bool enable);
void lovrColliderInitInertia(Collider* collider, Shape* shape);
World* lovrColliderGetWorld(Collider* collider);
Collider* lovrColliderGetNext(Collider* collider);
@ -106,6 +108,8 @@ float lovrColliderGetRestitution(Collider* collider);
void lovrColliderSetRestitution(Collider* collider, float restitution);
bool lovrColliderIsKinematic(Collider* collider);
void lovrColliderSetKinematic(Collider* collider, bool kinematic);
bool lovrColliderIsSensor(Collider* collider);
void lovrColliderSetSensor(Collider* collider, bool sensor);
bool lovrColliderIsContinuous(Collider* collider);
void lovrColliderSetContinuous(Collider* collider, bool continuous);
float lovrColliderGetGravityScale(Collider* collider);
@ -160,10 +164,6 @@ typedef enum {
void lovrShapeDestroy(void* ref);
void lovrShapeDestroyData(Shape* shape);
ShapeType lovrShapeGetType(Shape* shape);
bool lovrShapeIsEnabled(Shape* shape);
void lovrShapeSetEnabled(Shape* shape, bool enabled);
bool lovrShapeIsSensor(Shape* shape);
void lovrShapeSetSensor(Shape* shape, bool sensor);
void lovrShapeGetMass(Shape* shape, float density, float* cx, float* cy, float* cz, float* mass, float inertia[6]);
void lovrShapeGetAABB(Shape* shape, float aabb[6]);

View File

@ -399,6 +399,18 @@ bool lovrColliderIsDestroyed(Collider* collider) {
return !collider->body;
}
bool lovrColliderIsEnabled(Collider* collider) {
return JPH_BodyInterface_IsAdded(collider->world->bodies, collider->id);
}
void lovrColliderSetEnabled(Collider* collider, bool enable) {
if (enable && !lovrColliderIsEnabled(collider)) {
JPH_BodyInterface_AddBody(collider->world->bodies, collider->id, JPH_Activation_DontActivate);
} else if (!enable && lovrColliderIsEnabled(collider)) {
JPH_BodyInterface_RemoveBody(collider->world->bodies, collider->id);
}
}
void lovrColliderInitInertia(Collider* collider, Shape* shape) {
//
}
@ -538,6 +550,14 @@ void lovrColliderSetKinematic(Collider* collider, bool kinematic) {
}
}
bool lovrColliderIsSensor(Collider* collider) {
return JPH_Body_IsSensor(collider->body);
}
void lovrColliderSetSensor(Collider* collider, bool sensor) {
JPH_Body_SetIsSensor(collider->body, sensor);
}
bool lovrColliderIsContinuous(Collider* collider) {
return JPH_BodyInterface_GetMotionQuality(collider->world->bodies, collider->id) == JPH_MotionQuality_LinearCast;
}
@ -825,24 +845,6 @@ ShapeType lovrShapeGetType(Shape* shape) {
return shape->type;
}
bool lovrShapeIsEnabled(Shape* shape) {
return true;
}
void lovrShapeSetEnabled(Shape* shape, bool enabled) {
if (!enabled) {
lovrLog(LOG_WARN, "PHY", "Jolt doesn't support disabling shapes");
}
}
bool lovrShapeIsSensor(Shape* shape) {
lovrThrow("NYI");
}
void lovrShapeSetSensor(Shape* shape, bool sensor) {
lovrThrow("NYI");
}
void lovrShapeGetMass(Shape* shape, float density, float* cx, float* cy, float* cz, float* mass, float inertia[6]) {
//
}

View File

@ -26,6 +26,7 @@ struct Collider {
arr_t(Joint*) joints;
float friction;
float restitution;
bool sensor;
};
struct Shape {
@ -35,7 +36,6 @@ struct Shape {
Collider* collider;
void* vertices;
void* indices;
bool sensor;
};
struct Joint {
@ -279,7 +279,7 @@ int lovrWorldCollide(World* world, Shape* a, Shape* b, float friction, float res
int contactCount = dCollide(a->id, b->id, MAX_CONTACTS, &contacts[0].geom, sizeof(dContact));
if (!a->sensor && !b->sensor) {
if (!colliderA->sensor && !colliderB->sensor) {
for (int c = 0; c < contactCount; c++) {
dJointID joint = dJointCreateContact(world->id, world->contactGroup, &contacts[c]);
dJointAttach(joint, colliderA->body, colliderB->body);
@ -500,6 +500,14 @@ bool lovrColliderIsDestroyed(Collider* collider) {
return !collider->body;
}
bool lovrColliderIsEnabled(Collider* collider) {
return true;
}
void lovrColliderSetEnabled(Collider* collider, bool enable) {
//
}
void lovrColliderInitInertia(Collider* collider, Shape* shape) {
// compute inertia matrix for default density
const float density = 1.0f;
@ -617,6 +625,14 @@ void lovrColliderSetKinematic(Collider* collider, bool kinematic) {
}
}
bool lovrColliderIsSensor(Collider* collider) {
return collider->sensor;
}
void lovrColliderSetSensor(Collider* collider, bool sensor) {
collider->sensor = sensor;
}
bool lovrColliderIsContinuous(Collider* collider) {
return false;
}
@ -895,26 +911,6 @@ Collider* lovrShapeGetCollider(Shape* shape) {
return shape->collider;
}
bool lovrShapeIsEnabled(Shape* shape) {
return dGeomIsEnabled(shape->id);
}
void lovrShapeSetEnabled(Shape* shape, bool enabled) {
if (enabled) {
dGeomEnable(shape->id);
} else {
dGeomDisable(shape->id);
}
}
bool lovrShapeIsSensor(Shape* shape) {
return shape->sensor;
}
void lovrShapeSetSensor(Shape* shape, bool sensor) {
shape->sensor = sensor;
}
void lovrShapeGetMass(Shape* shape, float density, float* cx, float* cy, float* cz, float* mass, float inertia[6]) {
dMass m;
dMassSetZero(&m);