You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
2.3 KiB
C
123 lines
2.3 KiB
C
#define LUA_LIB
|
|
|
|
#include <lua.h>
|
|
#include <lauxlib.h>
|
|
|
|
static int
|
|
lvector(lua_State *L) {
|
|
int top = lua_gettop(L);
|
|
int i,j;
|
|
luaL_checkstack(L, top * 4+1, NULL);
|
|
lua_pushstring(L, "VEC");
|
|
for (i=1;i<=top;i++) {
|
|
const float * vec4 = lua_touserdata(L, i);
|
|
for (j=0;j<4;j++) {
|
|
lua_pushnumber(L, vec4[j]);
|
|
}
|
|
}
|
|
return 4 * top + 1;
|
|
}
|
|
|
|
static int
|
|
lmatrix1(lua_State *L) {
|
|
int i;
|
|
const float * mat = lua_touserdata(L, 1);
|
|
lua_pushstring(L, "MAT");
|
|
for (i=0;i<16;i++) {
|
|
lua_pushnumber(L, mat[i]);
|
|
}
|
|
return 17;
|
|
}
|
|
|
|
static int
|
|
lmatrix2(lua_State *L) {
|
|
int i;
|
|
const float * mat1 = lua_touserdata(L, 1);
|
|
const float * mat2 = lua_touserdata(L, 2);
|
|
for (i=0;i<16;i++) {
|
|
lua_pushnumber(L, mat1[i] - mat2[i]);
|
|
}
|
|
return 16;
|
|
}
|
|
|
|
static int
|
|
lformat(lua_State *L) {
|
|
const char * format = lua_tostring(L, 1);
|
|
lua_pushlightuserdata(L, (void *)format);
|
|
return 1;
|
|
}
|
|
|
|
static int
|
|
lvariant(lua_State *L) {
|
|
size_t sz;
|
|
const char * format = lua_tolstring(L, 1, &sz);
|
|
int top = lua_gettop(L);
|
|
if (sz+1 != top) {
|
|
return luaL_error(L, "%s need %d arguments", format, (int)sz);
|
|
}
|
|
luaL_checkstack(L, sz, NULL);
|
|
int i;
|
|
for (i=2;i<=top;i++) {
|
|
const float * v = (const float *)lua_touserdata(L, i);
|
|
switch(format[i-2]) {
|
|
case 'm':
|
|
lua_pushnumber(L, v[15]);
|
|
break;
|
|
case 'v':
|
|
lua_pushnumber(L, v[0]);
|
|
break;
|
|
case 'q':
|
|
lua_pushnumber(L, v[3]);
|
|
break;
|
|
default:
|
|
return luaL_error(L, "Invalid format %s", format);
|
|
}
|
|
}
|
|
|
|
return sz;
|
|
}
|
|
|
|
static int
|
|
lgetmvq(lua_State *L) {
|
|
float * mat = lua_touserdata(L, 1);
|
|
float * vec = lua_touserdata(L, 2);
|
|
float * quat = lua_touserdata(L, 3);
|
|
int i;
|
|
for (i=0;i<16;i++) {
|
|
mat[i] = (float)i;
|
|
}
|
|
for (i=0;i<4;i++) {
|
|
vec[i] = (float)i;
|
|
}
|
|
for (i=0;i<4;i++) {
|
|
quat[i] = 1.0f;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
lretvector(lua_State *L) {
|
|
static const float v1[4] = { 1.0f, 2.0f, 3.0f, 4.0f };
|
|
static const float v2[4] = { 5.0f, 6.0f, 7.0f, 8.0f };
|
|
lua_pushlightuserdata(L, (void *)v1);
|
|
lua_pushlightuserdata(L, (void *)v2);
|
|
return 2;
|
|
}
|
|
|
|
LUAMOD_API int
|
|
luaopen_math3d_adapter_test(lua_State *L) {
|
|
luaL_checkversion(L);
|
|
luaL_Reg l[] = {
|
|
{ "vector", lvector },
|
|
{ "matrix1", lmatrix1 },
|
|
{ "matrix2", lmatrix2 },
|
|
{ "format", lformat },
|
|
{ "variant", lvariant },
|
|
{ "getmvq", lgetmvq },
|
|
{ "retvec", lretvector },
|
|
{ NULL, NULL },
|
|
};
|
|
luaL_newlib(L, l);
|
|
return 1;
|
|
}
|