From f4d4664318d4244487aff33c0d71aabba5060c52 Mon Sep 17 00:00:00 2001 From: bjorn Date: Mon, 15 May 2017 23:09:32 -0600 Subject: [PATCH] Body; --- src/api/lovr.h | 1 + src/api/physics.c | 8 ++++++++ src/api/types/body.c | 6 ++++++ src/physics/physics.c | 20 ++++++++++++++++++++ src/physics/physics.h | 9 +++++++++ 5 files changed, 44 insertions(+) create mode 100644 src/api/types/body.c diff --git a/src/api/lovr.h b/src/api/lovr.h index 544fc49e..963367ca 100644 --- a/src/api/lovr.h +++ b/src/api/lovr.h @@ -16,6 +16,7 @@ int l_lovrTimerInit(lua_State* L); extern const luaL_Reg lovrAudio[]; extern const luaL_Reg lovrController[]; extern const luaL_Reg lovrBlob[]; +extern const luaL_Reg lovrBody[]; extern const luaL_Reg lovrEvent[]; extern const luaL_Reg lovrFilesystem[]; extern const luaL_Reg lovrFont[]; diff --git a/src/api/physics.c b/src/api/physics.c index 9243daa6..8b3006d7 100644 --- a/src/api/physics.c +++ b/src/api/physics.c @@ -5,6 +5,7 @@ int l_lovrPhysicsInit(lua_State* L) { lua_newtable(L); luaL_register(L, NULL, lovrPhysics); luax_registertype(L, "World", lovrWorld); + luax_registertype(L, "Body", lovrBody); lovrPhysicsInit(); return 1; } @@ -14,7 +15,14 @@ int l_lovrPhysicsNewWorld(lua_State* L) { return 1; } +int l_lovrPhysicsNewBody(lua_State* L) { + World* world = luax_checktype(L, 1, World); + luax_pushtype(L, Body, lovrBodyCreate(world)); + return 1; +} + const luaL_Reg lovrPhysics[] = { { "newWorld", l_lovrPhysicsNewWorld }, + { "newBody", l_lovrPhysicsNewBody }, { NULL, NULL } }; diff --git a/src/api/types/body.c b/src/api/types/body.c new file mode 100644 index 00000000..1ef18728 --- /dev/null +++ b/src/api/types/body.c @@ -0,0 +1,6 @@ +#include "api/lovr.h" +#include "physics/physics.h" + +const luaL_Reg lovrBody[] = { + { NULL, NULL } +}; diff --git a/src/physics/physics.c b/src/physics/physics.c index 8cf92c4c..7daa4774 100644 --- a/src/physics/physics.c +++ b/src/physics/physics.c @@ -73,3 +73,23 @@ void lovrWorldSetSleepingAllowed(World* world, int allowed) { void lovrWorldUpdate(World* world, float dt) { dWorldQuickStep(world->id, dt); } + +Body* lovrBodyCreate(World* world) { + if (!world) { + error("No world specified"); + } + + Body* body = lovrAlloc(sizeof(Body), lovrBodyDestroy); + if (!body) return NULL; + + body->id = dBodyCreate(world->id); + body->world = world; + + return body; +} + +void lovrBodyDestroy(const Ref* ref) { + Body* body = containerof(ref, Body); + dBodyDestroy(body->id); + free(body); +} diff --git a/src/physics/physics.h b/src/physics/physics.h index 00b7ac44..d8a523ad 100644 --- a/src/physics/physics.h +++ b/src/physics/physics.h @@ -6,6 +6,12 @@ typedef struct { dWorldID id; } World; +typedef struct { + Ref ref; + dBodyID id; + World* world; +} Body; + void lovrPhysicsInit(); void lovrPhysicsDestroy(); @@ -20,3 +26,6 @@ void lovrWorldSetAngularDamping(World* world, float damping, float threshold); int lovrWorldIsSleepingAllowed(World* world); void lovrWorldSetSleepingAllowed(World* world, int allowed); void lovrWorldUpdate(World* world, float dt); + +Body* lovrBodyCreate(); +void lovrBodyDestroy(const Ref* ref);