summaryrefslogtreecommitdiff
path: root/src/ode/geom.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ode/geom.c')
-rw-r--r--src/ode/geom.c74
1 files changed, 63 insertions, 11 deletions
diff --git a/src/ode/geom.c b/src/ode/geom.c
index 085b06c..9700079 100644
--- a/src/ode/geom.c
+++ b/src/ode/geom.c
@@ -4,15 +4,43 @@
#include "ode_bindings.h"
-void ode_push_geom(lua_State *L, dGeomID g)
+struct geom_data_t {
+ lua_Integer self;
+ lua_Integer ref;
+};
+struct geom_wrap_t {
+ dGeomID id;
+ struct geom_data_t data;
+};
+
+
+void ode_create_geom(lua_State *L, dGeomID g)
{
- dGeomID *gu = lua_newuserdata(L, sizeof(dGeomID));
- *gu = g;
+ struct geom_wrap_t *wrap = lua_newuserdata(L, sizeof(struct geom_wrap_t));
+ wrap->id = g;
+ if (g != NULL) {
+ lua_pushvalue(L, -1);
+ wrap->data.self = luaL_ref(L, LUA_REGISTRYINDEX);
+ wrap->data.ref = LUA_NOREF;
+ dGeomSetData(g, &(wrap->data));
+ }
luaL_getmetatable(L, ode_geom_tname);
lua_setmetatable(L, -2);
}
+void ode_push_geom(lua_State *L, dGeomID g)
+{
+ if (g == NULL) {
+ lua_pushnil(L);
+ }
+ else {
+ struct geom_data_t *data = dGeomGetData(g);
+ lua_rawgeti(L, LUA_REGISTRYINDEX, data->self);
+ }
+}
+
+
void ode_push_space(lua_State *L, dSpaceID s)
{
dSpaceID *su = lua_newuserdata(L, sizeof(dSpaceID));
@@ -55,6 +83,30 @@ int dGeomDestroy_bind(lua_State *L)
}
+int dGeomSetData_bind(lua_State *L)
+{
+ dGeomID *g = luaL_checkudata(L, 1, ode_geom_tname);
+ luaL_checkany(L, 2);
+ const int val = 2;
+
+ struct geom_data_t *data = dGeomGetData(*g);
+ luaL_unref(L, LUA_REGISTRYINDEX, data->ref);
+ lua_pushvalue(L, val);
+ data->ref = luaL_ref(L, LUA_REGISTRYINDEX);
+
+ return 0;
+}
+
+
+int dGeomGetData_bind(lua_State *L)
+{
+ dGeomID *g = luaL_checkudata(L, 1, ode_geom_tname);
+ struct geom_data_t *data = dGeomGetData(*g);
+ lua_rawgeti(L, LUA_REGISTRYINDEX, data->ref);
+ return 1;
+}
+
+
int dGeomSetBody_bind(lua_State *L)
{
dGeomID *g = luaL_checkudata(L, 1, ode_geom_tname);
@@ -612,7 +664,7 @@ int dCreateSphere_bind(lua_State *L)
dSpaceID *space = luaL_checkudata(L, 1, ode_space_tname);
dReal radius = luaL_checknumber(L, 2);
dGeomID bind_result = dCreateSphere(*space, radius);
- ode_push_geom(L, bind_result);
+ ode_create_geom(L, bind_result);
return 1;
}
@@ -654,7 +706,7 @@ int dCreateBox_bind(lua_State *L)
dReal ly = luaL_checknumber(L, 3);
dReal lz = luaL_checknumber(L, 4);
dGeomID bind_result = dCreateBox(*space, lx, ly, lz);
- ode_push_geom(L, bind_result);
+ ode_create_geom(L, bind_result);
return 1;
}
@@ -702,7 +754,7 @@ int dCreatePlane_bind(lua_State *L)
dReal c = luaL_checknumber(L, 4);
dReal d = luaL_checknumber(L, 5);
dGeomID bind_result = dCreatePlane(*space, a, b, c, d);
- ode_push_geom(L, bind_result);
+ ode_create_geom(L, bind_result);
return 1;
}
@@ -750,7 +802,7 @@ int dCreateCapsule_bind(lua_State *L)
dReal radius = luaL_checknumber(L, 2);
dReal length = luaL_checknumber(L, 3);
dGeomID bind_result = dCreateCapsule(*space, radius, length);
- ode_push_geom(L, bind_result);
+ ode_create_geom(L, bind_result);
return 1;
}
@@ -794,7 +846,7 @@ int dCreateCylinder_bind(lua_State *L)
dReal radius = luaL_checknumber(L, 2);
dReal length = luaL_checknumber(L, 3);
dGeomID bind_result = dCreateCylinder(*space, radius, length);
- ode_push_geom(L, bind_result);
+ ode_create_geom(L, bind_result);
return 1;
}
@@ -825,7 +877,7 @@ int dCreateRay_bind(lua_State *L)
dSpaceID *space = luaL_checkudata(L, 1, ode_space_tname);
dReal length = luaL_checknumber(L, 2);
dGeomID bind_result = dCreateRay(*space, length);
- ode_push_geom(L, bind_result);
+ ode_create_geom(L, bind_result);
return 1;
}
@@ -987,7 +1039,7 @@ int dCreateTriMesh_bind(lua_State *L)
dTriArrayCallback * ArrayCallback = NULL;
dTriRayCallback * RayCallback = NULL;
dGeomID bind_result = dCreateTriMesh(*space, *Data, Callback, ArrayCallback, RayCallback);
- ode_push_geom(L, bind_result);
+ ode_create_geom(L, bind_result);
return 1;
}
@@ -1137,7 +1189,7 @@ int dCreateHeightfield_bind(lua_State *L)
dHeightfieldDataID *data = luaL_checkudata(L, 2, ode_heightfielddata_tname);
int bPlaceable = luaL_checkinteger(L, 3);
dGeomID bind_result = dCreateHeightfield(*space, *data, bPlaceable);
- ode_push_geom(L, bind_result);
+ ode_create_geom(L, bind_result);
return 1;
}