From f5b103de5b2b48433ce2895a1a73df40c4e86bf8 Mon Sep 17 00:00:00 2001
From: sanine <sanine.not@pm.me>
Date: Wed, 10 May 2023 22:00:11 -0500
Subject: add ability to convert dContactGeom to table

---
 src/ode/geom.c         | 39 +++++++++++++++++++++++++++++++++++++++
 src/ode/ode_bindings.h |  1 +
 src/ode/setup.c        |  4 ++++
 src/opengl/texture.c   | 10 ++++++++++
 4 files changed, 54 insertions(+)

diff --git a/src/ode/geom.c b/src/ode/geom.c
index 9700079..31fbdca 100644
--- a/src/ode/geom.c
+++ b/src/ode/geom.c
@@ -75,6 +75,45 @@ void ode_push_heightfielddata(lua_State *L, dHeightfieldDataID d)
 }
 
 
+int ContactGeomTable(lua_State *L)
+{
+	luaL_checktype(L, 1, LUA_TUSERDATA);
+	dContactGeom *cgu = lua_touserdata(L, 1);
+	lua_createtable(L, 0, 5);
+	int tbl = lua_gettop(L);
+
+	lua_createtable(L, 3, 0);
+	int pos = lua_gettop(L);
+	lua_pushnumber(L, cgu->pos[0]);
+	lua_rawseti(L, pos, 1);
+	lua_pushnumber(L, cgu->pos[1]);
+	lua_rawseti(L, pos, 2);
+	lua_pushnumber(L, cgu->pos[2]);
+	lua_rawseti(L, pos, 3);
+	lua_setfield(L, tbl, "pos");
+
+	lua_createtable(L, 3, 0);
+	int normal = lua_gettop(L);
+	lua_pushnumber(L, cgu->normal[0]);
+	lua_rawseti(L, normal, 1);
+	lua_pushnumber(L, cgu->normal[1]);
+	lua_rawseti(L, normal, 2);
+	lua_pushnumber(L, cgu->normal[2]);
+	lua_rawseti(L, normal, 3);
+	lua_setfield(L, tbl, "normal");
+
+	lua_pushnumber(L, cgu->depth);
+	lua_setfield(L, tbl, "depth");
+
+	ode_push_geom(L, cgu->g1);
+	lua_setfield(L, tbl, "g1");
+	ode_push_geom(L, cgu->g2);
+	lua_setfield(L, tbl, "g2");
+
+	return 1;
+}
+
+
 int dGeomDestroy_bind(lua_State *L)
 {
 	dGeomID *g = luaL_checkudata(L, 1, ode_geom_tname);
diff --git a/src/ode/ode_bindings.h b/src/ode/ode_bindings.h
index 7d3f518..f58820c 100644
--- a/src/ode/ode_bindings.h
+++ b/src/ode/ode_bindings.h
@@ -350,6 +350,7 @@ void ode_push_space(lua_State *L, dSpaceID s);
 	X("GeomEnable", dGeomEnable_bind) \
 	X("GeomDisable", dGeomDisable_bind) \
 	X("GeomIsEnabled", dGeomIsEnabled_bind) \
+	X("ContactGeomTable", ContactGeomTable) \
 	X("Collide", dCollide_bind) \
 	X("SpaceCollide", dSpaceCollide_bind) \
 	X("SpaceCollide2", dSpaceCollide2_bind) \
diff --git a/src/ode/setup.c b/src/ode/setup.c
index 3655b1e..4785de2 100644
--- a/src/ode/setup.c
+++ b/src/ode/setup.c
@@ -58,6 +58,10 @@ void setup_ode(lua_State *L, int honey_tbl)
 	ode_push_space(L, 0);
 	lua_setfield(L, ode_tbl, "Space0");
 
+	/* add null body */
+	ode_push_body(L, 0);
+	lua_setfield(L, ode_tbl, "Body0");
+
 	lua_setfield(L, honey_tbl, "ode");
 }
 
diff --git a/src/opengl/texture.c b/src/opengl/texture.c
index 13b23c0..a1fda90 100644
--- a/src/opengl/texture.c
+++ b/src/opengl/texture.c
@@ -6,6 +6,7 @@
 
 
 int gl_texture_create(lua_State *L);
+int glDeleteTextures_bind(lua_State *L);
 int gl_texture_bind(lua_State *L);
 int gl_texture_image_2d(lua_State *L);
 int gl_texture_generate_mipmaps(lua_State *L);
@@ -18,6 +19,7 @@ void setup_texture(lua_State *L, int gl_index)
 	struct honey_tbl_t tbl[] = {
 		/* functions */
 		H_FUNC("GenTextures", gl_texture_create),
+		H_FUNC("DeleteTextures", glDeleteTextures_bind),
 		H_FUNC("BindTexture", gl_texture_bind),
 		H_FUNC("TexImage2D", gl_texture_image_2d),
 		H_FUNC("GenerateMipmap", gl_texture_generate_mipmaps),
@@ -74,6 +76,14 @@ int gl_texture_create(lua_State *L)
 }
 
 
+int glDeleteTextures_bind(lua_State *L)
+{
+	GLuint texture = luaL_checkinteger(L, 1);
+	glDeleteTextures(1, &texture);
+	return 0;
+}
+
+
 int gl_texture_bind(lua_State *L)
 {
 	lua_Integer target, texture;
-- 
cgit v1.2.1