1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-06 06:13:36 +00:00

Simplify Lua object management;

This commit is contained in:
bjorn 2018-07-24 20:10:30 -07:00
parent bc2d638b00
commit 83ddb82162
26 changed files with 129 additions and 171 deletions

View file

@ -110,6 +110,4 @@ void luax_setvertexattribute(lua_State* L, int index, VertexPointer* vertex, Att
void luax_setvertex(lua_State* L, int index, VertexPointer* vertex, VertexFormat* format); void luax_setvertex(lua_State* L, int index, VertexPointer* vertex, VertexFormat* format);
int luax_readtransform(lua_State* L, int index, mat4 transform, int scaleComponents); int luax_readtransform(lua_State* L, int index, mat4 transform, int scaleComponents);
Blob* luax_readblob(lua_State* L, int index, const char* debug); Blob* luax_readblob(lua_State* L, int index, const char* debug);
int luax_pushshape(lua_State* L, Shape* shape);
int luax_pushjoint(lua_State* L, Joint* joint);
Seed luax_checkrandomseed(lua_State* L, int index); Seed luax_checkrandomseed(lua_State* L, int index);

View file

@ -102,7 +102,7 @@ int l_lovrAudioNewMicrophone(lua_State* L) {
int bitDepth = luaL_optinteger(L, 4, 16); int bitDepth = luaL_optinteger(L, 4, 16);
int channelCount = luaL_optinteger(L, 5, 1); int channelCount = luaL_optinteger(L, 5, 1);
Microphone* microphone = lovrMicrophoneCreate(name, samples, sampleRate, bitDepth, channelCount); Microphone* microphone = lovrMicrophoneCreate(name, samples, sampleRate, bitDepth, channelCount);
luax_pushtype(L, Microphone, microphone); luax_pushobject(L, microphone);
lovrRelease(microphone); lovrRelease(microphone);
return 1; return 1;
} }
@ -144,7 +144,7 @@ int l_lovrAudioNewSource(lua_State* L) {
} }
} }
luax_pushtype(L, Source, source); luax_pushobject(L, source);
lovrRelease(source); lovrRelease(source);
return 1; return 1;
} }

View file

@ -38,7 +38,7 @@ int l_lovrDataNewBlob(lua_State* L) {
} }
const char* name = luaL_optstring(L, 2, ""); const char* name = luaL_optstring(L, 2, "");
Blob* blob = lovrBlobCreate(data, size, name); Blob* blob = lovrBlobCreate(data, size, name);
luax_pushtype(L, Blob, blob); luax_pushobject(L, blob);
lovrRelease(blob); lovrRelease(blob);
return 1; return 1;
} }
@ -47,7 +47,7 @@ int l_lovrDataNewAudioStream(lua_State* L) {
Blob* blob = luax_readblob(L, 1, "AudioStream"); Blob* blob = luax_readblob(L, 1, "AudioStream");
size_t bufferSize = luaL_optinteger(L, 2, 4096); size_t bufferSize = luaL_optinteger(L, 2, 4096);
AudioStream* stream = lovrAudioStreamCreate(blob, bufferSize); AudioStream* stream = lovrAudioStreamCreate(blob, bufferSize);
luax_pushtype(L, AudioStream, stream); luax_pushobject(L, stream);
lovrRelease(blob); lovrRelease(blob);
lovrRelease(stream); lovrRelease(stream);
return 1; return 1;
@ -56,7 +56,7 @@ int l_lovrDataNewAudioStream(lua_State* L) {
int l_lovrDataNewModelData(lua_State* L) { int l_lovrDataNewModelData(lua_State* L) {
Blob* blob = luax_readblob(L, 1, "Model"); Blob* blob = luax_readblob(L, 1, "Model");
ModelData* modelData = lovrModelDataCreate(blob); ModelData* modelData = lovrModelDataCreate(blob);
luax_pushtype(L, ModelData, modelData); luax_pushobject(L, modelData);
lovrRelease(blob); lovrRelease(blob);
lovrRelease(modelData); lovrRelease(modelData);
return 1; return 1;
@ -74,7 +74,7 @@ int l_lovrDataNewRasterizer(lua_State* L) {
} }
Rasterizer* rasterizer = lovrRasterizerCreate(blob, size); Rasterizer* rasterizer = lovrRasterizerCreate(blob, size);
luax_pushtype(L, Rasterizer, rasterizer); luax_pushobject(L, rasterizer);
lovrRelease(blob); lovrRelease(blob);
lovrRelease(rasterizer); lovrRelease(rasterizer);
return 1; return 1;
@ -87,20 +87,20 @@ int l_lovrDataNewSoundData(lua_State* L) {
int bitDepth = luaL_optinteger(L, 3, 16); int bitDepth = luaL_optinteger(L, 3, 16);
int channelCount = luaL_optinteger(L, 4, 2); int channelCount = luaL_optinteger(L, 4, 2);
SoundData* soundData = lovrSoundDataCreate(samples, sampleRate, bitDepth, channelCount); SoundData* soundData = lovrSoundDataCreate(samples, sampleRate, bitDepth, channelCount);
luax_pushtype(L, SoundData, soundData); luax_pushobject(L, soundData);
return 1; return 1;
} }
AudioStream** audioStream; AudioStream** audioStream;
if ((audioStream = luax_totype(L, 1, AudioStream)) != NULL) { if ((audioStream = luax_totype(L, 1, AudioStream)) != NULL) {
SoundData* soundData = lovrSoundDataCreateFromAudioStream(*audioStream); SoundData* soundData = lovrSoundDataCreateFromAudioStream(*audioStream);
luax_pushtype(L, SoundData, soundData); luax_pushobject(L, soundData);
return 1; return 1;
} }
Blob* blob = luax_readblob(L, 1, "SoundData"); Blob* blob = luax_readblob(L, 1, "SoundData");
SoundData* soundData = lovrSoundDataCreateFromBlob(blob); SoundData* soundData = lovrSoundDataCreateFromBlob(blob);
luax_pushtype(L, SoundData, soundData); luax_pushobject(L, soundData);
lovrRelease(blob); lovrRelease(blob);
lovrRelease(soundData); lovrRelease(soundData);
return 1; return 1;
@ -118,7 +118,7 @@ int l_lovrDataNewTextureData(lua_State* L) {
lovrRelease(blob); lovrRelease(blob);
} }
luax_pushtype(L, TextureData, textureData); luax_pushobject(L, textureData);
lovrRelease(textureData); lovrRelease(textureData);
return 1; return 1;
} }
@ -154,7 +154,7 @@ int l_lovrDataNewVertexData(lua_State* L) {
if (dataIndex) { if (dataIndex) {
luax_loadvertices(L, dataIndex, &vertexData->format, (VertexPointer) { .raw = vertexData->blob.data }); luax_loadvertices(L, dataIndex, &vertexData->format, (VertexPointer) { .raw = vertexData->blob.data });
} }
luax_pushtype(L, VertexData, vertexData); luax_pushobject(L, vertexData);
lovrRelease(vertexData); lovrRelease(vertexData);
return 1; return 1;
} }

View file

@ -42,29 +42,29 @@ static int nextEvent(lua_State* L) {
#ifndef EMSCRIPTEN #ifndef EMSCRIPTEN
case EVENT_THREAD_ERROR: case EVENT_THREAD_ERROR:
luax_pushtype(L, Thread, event.data.threaderror.thread); luax_pushobject(L, event.data.threaderror.thread);
lua_pushstring(L, event.data.threaderror.error); lua_pushstring(L, event.data.threaderror.error);
free((void*) event.data.threaderror.error); free((void*) event.data.threaderror.error);
return 3; return 3;
#endif #endif
case EVENT_CONTROLLER_ADDED: case EVENT_CONTROLLER_ADDED:
luax_pushtype(L, Controller, event.data.controlleradded.controller); luax_pushobject(L, event.data.controlleradded.controller);
lovrRelease(event.data.controlleradded.controller); lovrRelease(event.data.controlleradded.controller);
return 2; return 2;
case EVENT_CONTROLLER_REMOVED: case EVENT_CONTROLLER_REMOVED:
luax_pushtype(L, Controller, event.data.controllerremoved.controller); luax_pushobject(L, event.data.controllerremoved.controller);
lovrRelease(event.data.controlleradded.controller); lovrRelease(event.data.controlleradded.controller);
return 2; return 2;
case EVENT_CONTROLLER_PRESSED: case EVENT_CONTROLLER_PRESSED:
luax_pushtype(L, Controller, event.data.controllerpressed.controller); luax_pushobject(L, event.data.controllerpressed.controller);
lua_pushstring(L, ControllerButtons[event.data.controllerpressed.button]); lua_pushstring(L, ControllerButtons[event.data.controllerpressed.button]);
return 3; return 3;
case EVENT_CONTROLLER_RELEASED: case EVENT_CONTROLLER_RELEASED:
luax_pushtype(L, Controller, event.data.controllerreleased.controller); luax_pushobject(L, event.data.controllerreleased.controller);
lua_pushstring(L, ControllerButtons[event.data.controllerpressed.button]); lua_pushstring(L, ControllerButtons[event.data.controllerpressed.button]);
return 3; return 3;

View file

@ -308,7 +308,7 @@ int l_lovrFilesystemNewBlob(lua_State* L) {
uint8_t* data = lovrFilesystemRead(path, &size); uint8_t* data = lovrFilesystemRead(path, &size);
lovrAssert(data, "Could not load file '%s'", path); lovrAssert(data, "Could not load file '%s'", path);
Blob* blob = lovrBlobCreate((void*) data, size, path); Blob* blob = lovrBlobCreate((void*) data, size, path);
luax_pushtype(L, Blob, blob); luax_pushobject(L, blob);
lovrRelease(blob); lovrRelease(blob);
return 1; return 1;
} }

View file

@ -406,7 +406,7 @@ int l_lovrGraphicsGetCanvas(lua_State* L) {
int count; int count;
lovrGraphicsGetCanvas(canvas, &count); lovrGraphicsGetCanvas(canvas, &count);
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
luax_pushtype(L, Canvas, canvas[i]); luax_pushobject(L, canvas[i]);
} }
return count; return count;
} }
@ -481,7 +481,7 @@ int l_lovrGraphicsSetDepthTest(lua_State* L) {
int l_lovrGraphicsGetFont(lua_State* L) { int l_lovrGraphicsGetFont(lua_State* L) {
Font* font = lovrGraphicsGetFont(); Font* font = lovrGraphicsGetFont();
luax_pushtype(L, Font, font); luax_pushobject(L, font);
return 1; return 1;
} }
@ -521,7 +521,7 @@ int l_lovrGraphicsSetPointSize(lua_State* L) {
int l_lovrGraphicsGetShader(lua_State* L) { int l_lovrGraphicsGetShader(lua_State* L) {
Shader* shader = lovrGraphicsGetShader(); Shader* shader = lovrGraphicsGetShader();
luax_pushtype(L, Shader, shader); luax_pushobject(L, shader);
return 1; return 1;
} }
@ -847,7 +847,7 @@ int l_lovrGraphicsFill(lua_State* L) {
int l_lovrGraphicsNewAnimator(lua_State* L) { int l_lovrGraphicsNewAnimator(lua_State* L) {
Model* model = luax_checktype(L, 1, Model); Model* model = luax_checktype(L, 1, Model);
Animator* animator = lovrAnimatorCreate(model->modelData); Animator* animator = lovrAnimatorCreate(model->modelData);
luax_pushtype(L, Animator, animator); luax_pushobject(L, animator);
lovrRelease(animator); lovrRelease(animator);
return 1; return 1;
} }
@ -884,7 +884,7 @@ int l_lovrGraphicsNewCanvas(lua_State* L) {
} }
Canvas* canvas = lovrCanvasCreate(width, height, format, flags); Canvas* canvas = lovrCanvasCreate(width, height, format, flags);
luax_pushtype(L, Canvas, canvas); luax_pushobject(L, canvas);
lovrRelease(canvas); lovrRelease(canvas);
return 1; return 1;
} }
@ -910,7 +910,7 @@ int l_lovrGraphicsNewFont(lua_State* L) {
} }
Font* font = lovrFontCreate(rasterizer); Font* font = lovrFontCreate(rasterizer);
luax_pushtype(L, Font, font); luax_pushobject(L, font);
lovrRelease(rasterizer); lovrRelease(rasterizer);
lovrRelease(font); lovrRelease(font);
return 1; return 1;
@ -940,7 +940,7 @@ int l_lovrGraphicsNewMaterial(lua_State* L) {
lovrMaterialSetColor(material, COLOR_DIFFUSE, color); lovrMaterialSetColor(material, COLOR_DIFFUSE, color);
} }
luax_pushtype(L, Material, material); luax_pushobject(L, material);
lovrRelease(material); lovrRelease(material);
return 1; return 1;
} }
@ -999,7 +999,7 @@ int l_lovrGraphicsNewMesh(lua_State* L) {
memcpy(vertices.raw, vertexData->blob.data, vertexData->count * vertexData->format.stride); memcpy(vertices.raw, vertexData->blob.data, vertexData->count * vertexData->format.stride);
} }
luax_pushtype(L, Mesh, mesh); luax_pushobject(L, mesh);
lovrRelease(mesh); lovrRelease(mesh);
return 1; return 1;
} }
@ -1033,7 +1033,7 @@ int l_lovrGraphicsNewModel(lua_State* L) {
} }
} }
luax_pushtype(L, Model, model); luax_pushobject(L, model);
lovrRelease(modelData); lovrRelease(modelData);
lovrRelease(model); lovrRelease(model);
return 1; return 1;
@ -1061,7 +1061,7 @@ int l_lovrGraphicsNewShader(lua_State* L) {
const char* vertexSource = lua_tostring(L, 1); const char* vertexSource = lua_tostring(L, 1);
const char* fragmentSource = lua_tostring(L, 2); const char* fragmentSource = lua_tostring(L, 2);
Shader* shader = lovrShaderCreate(vertexSource, fragmentSource); Shader* shader = lovrShaderCreate(vertexSource, fragmentSource);
luax_pushtype(L, Shader, shader); luax_pushobject(L, shader);
lovrRelease(shader); lovrRelease(shader);
return 1; return 1;
} }
@ -1117,7 +1117,7 @@ int l_lovrGraphicsNewTexture(lua_State* L) {
lua_pop(L, 1); lua_pop(L, 1);
} }
luax_pushtype(L, Texture, texture); luax_pushobject(L, texture);
lovrRelease(texture); lovrRelease(texture);
return 1; return 1;
} }

View file

@ -275,7 +275,7 @@ int l_lovrHeadsetGetControllers(lua_State* L) {
Controller** controllers = lovrHeadsetDriver->getControllers(&count); Controller** controllers = lovrHeadsetDriver->getControllers(&count);
lua_newtable(L); lua_newtable(L);
for (uint8_t i = 0; i < count; i++) { for (uint8_t i = 0; i < count; i++) {
luax_pushtype(L, Controller, controllers[i]); luax_pushobject(L, controllers[i]);
lua_rawseti(L, -2, i + 1); lua_rawseti(L, -2, i + 1);
} }
return 1; return 1;

View file

@ -25,7 +25,7 @@ int l_lovrMathNewRandomGenerator(lua_State* L) {
Seed seed = luax_checkrandomseed(L, 1); Seed seed = luax_checkrandomseed(L, 1);
lovrRandomGeneratorSetSeed(generator, seed); lovrRandomGeneratorSetSeed(generator, seed);
} }
luax_pushtype(L, RandomGenerator, generator); luax_pushobject(L, generator);
lovrRelease(generator); lovrRelease(generator);
return 1; return 1;
} }
@ -34,7 +34,7 @@ int l_lovrMathNewTransform(lua_State* L) {
float matrix[16]; float matrix[16];
luax_readtransform(L, 1, matrix, 3); luax_readtransform(L, 1, matrix, 3);
Transform* transform = lovrTransformCreate(matrix); Transform* transform = lovrTransformCreate(matrix);
luax_pushtype(L, Transform, transform); luax_pushobject(L, transform);
lovrRelease(transform); lovrRelease(transform);
return 1; return 1;
} }
@ -81,25 +81,25 @@ int l_lovrMathNoise(lua_State* L) {
} }
int l_lovrMathRandom(lua_State* L) { int l_lovrMathRandom(lua_State* L) {
luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator()); luax_pushobject(L, lovrMathGetRandomGenerator());
lua_insert(L, 1); lua_insert(L, 1);
return l_lovrRandomGeneratorRandom(L); return l_lovrRandomGeneratorRandom(L);
} }
int l_lovrMathRandomNormal(lua_State* L) { int l_lovrMathRandomNormal(lua_State* L) {
luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator()); luax_pushobject(L, lovrMathGetRandomGenerator());
lua_insert(L, 1); lua_insert(L, 1);
return l_lovrRandomGeneratorRandomNormal(L); return l_lovrRandomGeneratorRandomNormal(L);
} }
int l_lovrMathGetRandomSeed(lua_State* L) { int l_lovrMathGetRandomSeed(lua_State* L) {
luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator()); luax_pushobject(L, lovrMathGetRandomGenerator());
lua_insert(L, 1); lua_insert(L, 1);
return l_lovrRandomGeneratorGetSeed(L); return l_lovrRandomGeneratorGetSeed(L);
} }
int l_lovrMathSetRandomSeed(lua_State* L) { int l_lovrMathSetRandomSeed(lua_State* L) {
luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator()); luax_pushobject(L, lovrMathGetRandomGenerator());
lua_insert(L, 1); lua_insert(L, 1);
return l_lovrRandomGeneratorSetSeed(L); return l_lovrRandomGeneratorSetSeed(L);
} }

View file

@ -56,7 +56,7 @@ int l_lovrPhysicsNewWorld(lua_State* L) {
tagCount = 0; tagCount = 0;
} }
World* world = lovrWorldCreate(xg, yg, zg, allowSleep, tags, tagCount); World* world = lovrWorldCreate(xg, yg, zg, allowSleep, tags, tagCount);
luax_pushtype(L, World, world); luax_pushobject(L, world);
return 1; return 1;
} }
@ -67,7 +67,7 @@ int l_lovrPhysicsNewBallJoint(lua_State* L) {
float y = luaL_checknumber(L, 4); float y = luaL_checknumber(L, 4);
float z = luaL_checknumber(L, 5); float z = luaL_checknumber(L, 5);
BallJoint* joint = lovrBallJointCreate(a, b, x, y, z); BallJoint* joint = lovrBallJointCreate(a, b, x, y, z);
luax_pushtype(L, BallJoint, joint); luax_pushobject(L, joint);
return 1; return 1;
} }
@ -76,7 +76,7 @@ int l_lovrPhysicsNewBoxShape(lua_State* L) {
float y = luaL_optnumber(L, 2, x); float y = luaL_optnumber(L, 2, x);
float z = luaL_optnumber(L, 3, x); float z = luaL_optnumber(L, 3, x);
BoxShape* box = lovrBoxShapeCreate(x, y, z); BoxShape* box = lovrBoxShapeCreate(x, y, z);
luax_pushtype(L, BoxShape, box); luax_pushobject(L, box);
return 1; return 1;
} }
@ -84,7 +84,7 @@ int l_lovrPhysicsNewCapsuleShape(lua_State* L) {
float radius = luaL_optnumber(L, 1, 1.f); float radius = luaL_optnumber(L, 1, 1.f);
float length = luaL_optnumber(L, 2, 1.f); float length = luaL_optnumber(L, 2, 1.f);
CapsuleShape* capsule = lovrCapsuleShapeCreate(radius, length); CapsuleShape* capsule = lovrCapsuleShapeCreate(radius, length);
luax_pushtype(L, CapsuleShape, capsule); luax_pushobject(L, capsule);
return 1; return 1;
} }
@ -92,7 +92,7 @@ int l_lovrPhysicsNewCylinderShape(lua_State* L) {
float radius = luaL_optnumber(L, 1, 1.f); float radius = luaL_optnumber(L, 1, 1.f);
float length = luaL_optnumber(L, 2, 1.f); float length = luaL_optnumber(L, 2, 1.f);
CylinderShape* cylinder = lovrCylinderShapeCreate(radius, length); CylinderShape* cylinder = lovrCylinderShapeCreate(radius, length);
luax_pushtype(L, CylinderShape, cylinder); luax_pushobject(L, cylinder);
return 1; return 1;
} }
@ -106,7 +106,7 @@ int l_lovrPhysicsNewDistanceJoint(lua_State* L) {
float y2 = luaL_checknumber(L, 7); float y2 = luaL_checknumber(L, 7);
float z2 = luaL_checknumber(L, 8); float z2 = luaL_checknumber(L, 8);
DistanceJoint* joint = lovrDistanceJointCreate(a, b, x1, y1, z1, x2, y2, z2); DistanceJoint* joint = lovrDistanceJointCreate(a, b, x1, y1, z1, x2, y2, z2);
luax_pushtype(L, DistanceJoint, joint); luax_pushobject(L, joint);
return 1; return 1;
} }
@ -120,7 +120,7 @@ int l_lovrPhysicsNewHingeJoint(lua_State* L) {
float ay = luaL_checknumber(L, 7); float ay = luaL_checknumber(L, 7);
float az = luaL_checknumber(L, 8); float az = luaL_checknumber(L, 8);
HingeJoint* joint = lovrHingeJointCreate(a, b, x, y, z, ax, ay, az); HingeJoint* joint = lovrHingeJointCreate(a, b, x, y, z, ax, ay, az);
luax_pushtype(L, HingeJoint, joint); luax_pushobject(L, joint);
return 1; return 1;
} }
@ -131,14 +131,14 @@ int l_lovrPhysicsNewSliderJoint(lua_State* L) {
float ay = luaL_checknumber(L, 4); float ay = luaL_checknumber(L, 4);
float az = luaL_checknumber(L, 5); float az = luaL_checknumber(L, 5);
SliderJoint* joint = lovrSliderJointCreate(a, b, ax, ay, az); SliderJoint* joint = lovrSliderJointCreate(a, b, ax, ay, az);
luax_pushtype(L, SliderJoint, joint); luax_pushobject(L, joint);
return 1; return 1;
} }
int l_lovrPhysicsNewSphereShape(lua_State* L) { int l_lovrPhysicsNewSphereShape(lua_State* L) {
float radius = luaL_optnumber(L, 1, 1.f); float radius = luaL_optnumber(L, 1, 1.f);
SphereShape* sphere = lovrSphereShapeCreate(radius); SphereShape* sphere = lovrSphereShapeCreate(radius);
luax_pushtype(L, SphereShape, sphere); luax_pushobject(L, sphere);
return 1; return 1;
} }

View file

@ -52,7 +52,7 @@ int l_lovrThreadInit(lua_State* L) {
int l_lovrThreadNewThread(lua_State* L) { int l_lovrThreadNewThread(lua_State* L) {
const char* body = luaL_checkstring(L, 1); const char* body = luaL_checkstring(L, 1);
Thread* thread = lovrThreadCreate(threadRunner, body); Thread* thread = lovrThreadCreate(threadRunner, body);
luax_pushtype(L, Thread, thread); luax_pushobject(L, thread);
lovrRelease(thread); lovrRelease(thread);
return 1; return 1;
} }
@ -60,7 +60,7 @@ int l_lovrThreadNewThread(lua_State* L) {
int l_lovrThreadGetChannel(lua_State* L) { int l_lovrThreadGetChannel(lua_State* L) {
const char* name = luaL_checkstring(L, 1); const char* name = luaL_checkstring(L, 1);
Channel* channel = lovrThreadGetChannel(name); Channel* channel = lovrThreadGetChannel(name);
luax_pushtype(L, Channel, channel); luax_pushobject(L, channel);
return 1; return 1;
} }

View file

@ -8,7 +8,7 @@ int l_lovrAudioStreamDecode(lua_State* L) {
if (samples > 0) { if (samples > 0) {
SoundData* soundData = lovrSoundDataCreate(samples / stream->channelCount, stream->sampleRate, stream->bitDepth, stream->channelCount); SoundData* soundData = lovrSoundDataCreate(samples / stream->channelCount, stream->sampleRate, stream->bitDepth, stream->channelCount);
memcpy(soundData->blob.data, stream->buffer, samples * (stream->bitDepth / 8)); memcpy(soundData->blob.data, stream->buffer, samples * (stream->bitDepth / 8));
luax_pushtype(L, SoundData, soundData); luax_pushobject(L, soundData);
lovrRelease(soundData); lovrRelease(soundData);
} else { } else {
lua_pushnil(L); lua_pushnil(L);

View file

@ -32,7 +32,7 @@ int l_lovrCanvasGetMSAA(lua_State* L) {
int l_lovrCanvasNewTextureData(lua_State* L) { int l_lovrCanvasNewTextureData(lua_State* L) {
Canvas* canvas = luax_checktype(L, 1, Canvas); Canvas* canvas = luax_checktype(L, 1, Canvas);
TextureData* textureData = lovrCanvasNewTextureData(canvas); TextureData* textureData = lovrCanvasNewTextureData(canvas);
luax_pushtype(L, TextureData, textureData); luax_pushobject(L, textureData);
lovrRelease(textureData); lovrRelease(textureData);
return 1; return 1;
} }

View file

@ -48,16 +48,7 @@ static int luax_pushvariant(lua_State* L, Variant* variant) {
case TYPE_BOOLEAN: lua_pushboolean(L, variant->value.boolean); break; case TYPE_BOOLEAN: lua_pushboolean(L, variant->value.boolean); break;
case TYPE_NUMBER: lua_pushnumber(L, variant->value.number); break; case TYPE_NUMBER: lua_pushnumber(L, variant->value.number); break;
case TYPE_STRING: lua_pushstring(L, variant->value.string); break; case TYPE_STRING: lua_pushstring(L, variant->value.string); break;
case TYPE_OBJECT: case TYPE_OBJECT: luax_pushobject(L, variant->value.ref); lovrRelease(variant->value.ref); break;
if (!luax_getobject(L, variant->value.ref)) {
Ref** u = (Ref**) lua_newuserdata(L, sizeof(Ref**));
luax_registerobject(L, variant->value.ref);
luaL_getmetatable(L, variant->meta);
lua_setmetatable(L, -2);
*u = variant->value.ref;
lovrRelease(variant->value.ref);
}
break;
} }
if (variant->type == TYPE_STRING) { if (variant->type == TYPE_STRING) {

View file

@ -11,7 +11,7 @@ int l_lovrColliderDestroy(lua_State* L) {
int l_lovrColliderGetWorld(lua_State* L) { int l_lovrColliderGetWorld(lua_State* L) {
Collider* collider = luax_checktype(L, 1, Collider); Collider* collider = luax_checktype(L, 1, Collider);
World* world = lovrColliderGetWorld(collider); World* world = lovrColliderGetWorld(collider);
luax_pushtype(L, World, world); luax_pushobject(L, world);
return 1; return 1;
} }
@ -34,7 +34,7 @@ int l_lovrColliderGetShapes(lua_State* L) {
lua_newtable(L); lua_newtable(L);
vec_void_t* shapes = lovrColliderGetShapes(collider); vec_void_t* shapes = lovrColliderGetShapes(collider);
for (int i = 0; i < shapes->length; i++) { for (int i = 0; i < shapes->length; i++) {
luax_pushshape(L, shapes->data[i]); luax_pushobject(L, shapes->data[i]);
lua_rawseti(L, -2, i + 1); lua_rawseti(L, -2, i + 1);
} }
return 1; return 1;
@ -45,7 +45,7 @@ int l_lovrColliderGetJoints(lua_State* L) {
lua_newtable(L); lua_newtable(L);
vec_void_t* joints = lovrColliderGetJoints(collider); vec_void_t* joints = lovrColliderGetJoints(collider);
for (int i = 0; i < joints->length; i++) { for (int i = 0; i < joints->length; i++) {
luax_pushjoint(L, joints->data[i]); luax_pushobject(L, joints->data[i]);
lua_rawseti(L, -2, i + 1); lua_rawseti(L, -2, i + 1);
} }
return 1; return 1;

View file

@ -85,7 +85,7 @@ int l_lovrControllerNewModel(lua_State* L) {
ModelData* modelData = lovrHeadsetDriver->controllerNewModelData(controller); ModelData* modelData = lovrHeadsetDriver->controllerNewModelData(controller);
if (modelData) { if (modelData) {
Model* model = lovrModelCreate(modelData); Model* model = lovrModelCreate(modelData);
luax_pushtype(L, Model, model); luax_pushobject(L, model);
lovrRelease(modelData); lovrRelease(modelData);
lovrRelease(model); lovrRelease(model);
} else { } else {

View file

@ -1,16 +1,6 @@
#include "api.h" #include "api.h"
#include "physics/physics.h" #include "physics/physics.h"
int luax_pushjoint(lua_State* L, Joint* joint) {
switch (lovrJointGetType(joint)) {
case JOINT_BALL: luax_pushtype(L, BallJoint, joint); return 1;
case JOINT_DISTANCE: luax_pushtype(L, DistanceJoint, joint); return 1;
case JOINT_HINGE: luax_pushtype(L, HingeJoint, joint); return 1;
case JOINT_SLIDER: luax_pushtype(L, SliderJoint, joint); return 1;
default: return 0;
}
}
int l_lovrJointDestroy(lua_State* L) { int l_lovrJointDestroy(lua_State* L) {
Joint* joint = luax_checktypeof(L, 1, Joint); Joint* joint = luax_checktypeof(L, 1, Joint);
lovrJointDestroyData(joint); lovrJointDestroyData(joint);
@ -28,8 +18,8 @@ int l_lovrJointGetColliders(lua_State* L) {
Collider* a; Collider* a;
Collider* b; Collider* b;
lovrJointGetColliders(joint, &a, &b); lovrJointGetColliders(joint, &a, &b);
luax_pushtype(L, Collider, a); luax_pushobject(L, a);
luax_pushtype(L, Collider, b); luax_pushobject(L, b);
return 2; return 2;
} }

View file

@ -45,7 +45,7 @@ int l_lovrMaterialGetTexture(lua_State* L) {
Material* material = luax_checktype(L, 1, Material); Material* material = luax_checktype(L, 1, Material);
MaterialTexture textureType = luaL_checkoption(L, 2, "diffuse", MaterialTextures); MaterialTexture textureType = luaL_checkoption(L, 2, "diffuse", MaterialTextures);
Texture* texture = lovrMaterialGetTexture(material, textureType); Texture* texture = lovrMaterialGetTexture(material, textureType);
luax_pushtype(L, Texture, texture); luax_pushobject(L, texture);
return 1; return 1;
} }

View file

@ -303,11 +303,7 @@ int l_lovrMeshSetDrawRange(lua_State* L) {
int l_lovrMeshGetMaterial(lua_State* L) { int l_lovrMeshGetMaterial(lua_State* L) {
Mesh* mesh = luax_checktype(L, 1, Mesh); Mesh* mesh = luax_checktype(L, 1, Mesh);
Material* material = lovrMeshGetMaterial(mesh); Material* material = lovrMeshGetMaterial(mesh);
if (material) { luax_pushobject(L, material);
luax_pushtype(L, Material, material);
} else {
lua_pushnil(L);
}
return 1; return 1;
} }

View file

@ -16,7 +16,7 @@ int l_lovrMicrophoneGetChannelCount(lua_State* L) {
int l_lovrMicrophoneGetData(lua_State* L) { int l_lovrMicrophoneGetData(lua_State* L) {
Microphone* microphone = luax_checktype(L, 1, Microphone); Microphone* microphone = luax_checktype(L, 1, Microphone);
SoundData* soundData = lovrMicrophoneGetData(microphone); SoundData* soundData = lovrMicrophoneGetData(microphone);
luax_pushtype(L, SoundData, soundData); luax_pushobject(L, soundData);
return 1; return 1;
} }

View file

@ -28,7 +28,7 @@ int l_lovrModelGetAABB(lua_State* L) {
int l_lovrModelGetAnimator(lua_State* L) { int l_lovrModelGetAnimator(lua_State* L) {
Model* model = luax_checktype(L, 1, Model); Model* model = luax_checktype(L, 1, Model);
Animator* animator = lovrModelGetAnimator(model); Animator* animator = lovrModelGetAnimator(model);
luax_pushtype(L, Animator, animator); luax_pushobject(L, animator);
return 1; return 1;
} }
@ -53,7 +53,7 @@ int l_lovrModelGetMaterial(lua_State* L) {
Model* model = luax_checktype(L, 1, Model); Model* model = luax_checktype(L, 1, Model);
Material* material = lovrModelGetMaterial(model); Material* material = lovrModelGetMaterial(model);
if (material) { if (material) {
luax_pushtype(L, Material, material); luax_pushobject(L, material);
} else { } else {
lua_pushnil(L); lua_pushnil(L);
} }
@ -74,7 +74,7 @@ int l_lovrModelSetMaterial(lua_State* L) {
int l_lovrModelGetMesh(lua_State* L) { int l_lovrModelGetMesh(lua_State* L) {
Model* model = luax_checktype(L, 1, Model); Model* model = luax_checktype(L, 1, Model);
Mesh* mesh = lovrModelGetMesh(model); Mesh* mesh = lovrModelGetMesh(model);
luax_pushtype(L, Mesh, mesh); luax_pushobject(L, mesh);
return 1; return 1;
} }

View file

@ -5,7 +5,7 @@
int l_lovrModelDataGetVertexData(lua_State* L) { int l_lovrModelDataGetVertexData(lua_State* L) {
ModelData* modelData = luax_checktype(L, 1, ModelData); ModelData* modelData = luax_checktype(L, 1, ModelData);
luax_pushtype(L, VertexData, modelData->vertexData); luax_pushobject(L, modelData->vertexData);
return 1; return 1;
} }
@ -196,7 +196,7 @@ int l_lovrModelDataGetDiffuseTexture(lua_State* L) {
ModelData* modelData = luax_checktype(L, 1, ModelData); ModelData* modelData = luax_checktype(L, 1, ModelData);
ModelMaterial* material = luax_checkmodelmaterial(L, 1); ModelMaterial* material = luax_checkmodelmaterial(L, 1);
TextureData* textureData = modelData->textures.data[material->diffuseTexture]; TextureData* textureData = modelData->textures.data[material->diffuseTexture];
luax_pushtype(L, TextureData, textureData); luax_pushobject(L, textureData);
return 1; return 1;
} }
@ -204,7 +204,7 @@ int l_lovrModelDataGetEmissiveTexture(lua_State* L) {
ModelData* modelData = luax_checktype(L, 1, ModelData); ModelData* modelData = luax_checktype(L, 1, ModelData);
ModelMaterial* material = luax_checkmodelmaterial(L, 1); ModelMaterial* material = luax_checkmodelmaterial(L, 1);
TextureData* textureData = modelData->textures.data[material->emissiveTexture]; TextureData* textureData = modelData->textures.data[material->emissiveTexture];
luax_pushtype(L, TextureData, textureData); luax_pushobject(L, textureData);
return 1; return 1;
} }
@ -212,7 +212,7 @@ int l_lovrModelDataGetMetalnessTexture(lua_State* L) {
ModelData* modelData = luax_checktype(L, 1, ModelData); ModelData* modelData = luax_checktype(L, 1, ModelData);
ModelMaterial* material = luax_checkmodelmaterial(L, 1); ModelMaterial* material = luax_checkmodelmaterial(L, 1);
TextureData* textureData = modelData->textures.data[material->metalnessTexture]; TextureData* textureData = modelData->textures.data[material->metalnessTexture];
luax_pushtype(L, TextureData, textureData); luax_pushobject(L, textureData);
return 1; return 1;
} }
@ -220,7 +220,7 @@ int l_lovrModelDataGetRoughnessTexture(lua_State* L) {
ModelData* modelData = luax_checktype(L, 1, ModelData); ModelData* modelData = luax_checktype(L, 1, ModelData);
ModelMaterial* material = luax_checkmodelmaterial(L, 1); ModelMaterial* material = luax_checkmodelmaterial(L, 1);
TextureData* textureData = modelData->textures.data[material->roughnessTexture]; TextureData* textureData = modelData->textures.data[material->roughnessTexture];
luax_pushtype(L, TextureData, textureData); luax_pushobject(L, textureData);
return 1; return 1;
} }
@ -228,7 +228,7 @@ int l_lovrModelDataGetOcclusionTexture(lua_State* L) {
ModelData* modelData = luax_checktype(L, 1, ModelData); ModelData* modelData = luax_checktype(L, 1, ModelData);
ModelMaterial* material = luax_checkmodelmaterial(L, 1); ModelMaterial* material = luax_checkmodelmaterial(L, 1);
TextureData* textureData = modelData->textures.data[material->occlusionTexture]; TextureData* textureData = modelData->textures.data[material->occlusionTexture];
luax_pushtype(L, TextureData, textureData); luax_pushobject(L, textureData);
return 1; return 1;
} }
@ -236,7 +236,7 @@ int l_lovrModelDataGetNormalTexture(lua_State* L) {
ModelData* modelData = luax_checktype(L, 1, ModelData); ModelData* modelData = luax_checktype(L, 1, ModelData);
ModelMaterial* material = luax_checkmodelmaterial(L, 1); ModelMaterial* material = luax_checkmodelmaterial(L, 1);
TextureData* textureData = modelData->textures.data[material->normalTexture]; TextureData* textureData = modelData->textures.data[material->normalTexture];
luax_pushtype(L, TextureData, textureData); luax_pushobject(L, textureData);
return 1; return 1;
} }

View file

@ -1,16 +1,6 @@
#include "api.h" #include "api.h"
#include "physics/physics.h" #include "physics/physics.h"
int luax_pushshape(lua_State* L, Shape* shape) {
switch (lovrShapeGetType(shape)) {
case SHAPE_SPHERE: luax_pushtype(L, SphereShape, shape); return 1;
case SHAPE_BOX: luax_pushtype(L, BoxShape, shape); return 1;
case SHAPE_CAPSULE: luax_pushtype(L, CapsuleShape, shape); return 1;
case SHAPE_CYLINDER: luax_pushtype(L, CylinderShape, shape); return 1;
default: return 0;
}
}
int l_lovrShapeDestroy(lua_State* L) { int l_lovrShapeDestroy(lua_State* L) {
Shape* shape = luax_checktypeof(L, 1, Shape); Shape* shape = luax_checktypeof(L, 1, Shape);
lovrShapeDestroyData(shape); lovrShapeDestroyData(shape);
@ -25,7 +15,7 @@ int l_lovrShapeGetType(lua_State* L) {
int l_lovrShapeGetCollider(lua_State* L) { int l_lovrShapeGetCollider(lua_State* L) {
Shape* shape = luax_checktypeof(L, 1, Shape); Shape* shape = luax_checktypeof(L, 1, Shape);
luax_pushtype(L, Collider, lovrShapeGetCollider(shape)); luax_pushobject(L, lovrShapeGetCollider(shape));
return 1; return 1;
} }

View file

@ -67,7 +67,7 @@ int l_lovrTransformSetMatrix(lua_State* L) {
int l_lovrTransformClone(lua_State* L) { int l_lovrTransformClone(lua_State* L) {
Transform* transform = luax_checktype(L, 1, Transform); Transform* transform = luax_checktype(L, 1, Transform);
Transform* clone = lovrTransformCreate(transform->matrix); Transform* clone = lovrTransformCreate(transform->matrix);
luax_pushtype(L, Transform, clone); luax_pushobject(L, clone);
lovrRelease(clone); lovrRelease(clone);
return 1; return 1;
} }
@ -75,7 +75,7 @@ int l_lovrTransformClone(lua_State* L) {
int l_lovrTransformInverse(lua_State* L) { int l_lovrTransformInverse(lua_State* L) {
Transform* transform = luax_checktype(L, 1, Transform); Transform* transform = luax_checktype(L, 1, Transform);
Transform* inverse = lovrTransformCreate(lovrTransformInverse(transform)); Transform* inverse = lovrTransformCreate(lovrTransformInverse(transform));
luax_pushtype(L, Transform, inverse); luax_pushobject(L, inverse);
lovrRelease(inverse); lovrRelease(inverse);
return 1; return 1;
} }

View file

@ -5,7 +5,7 @@
static void collisionResolver(World* world, void* userdata) { static void collisionResolver(World* world, void* userdata) {
lua_State* L = userdata; lua_State* L = userdata;
luaL_checktype(L, -1, LUA_TFUNCTION); luaL_checktype(L, -1, LUA_TFUNCTION);
luax_pushtype(L, World, world); luax_pushobject(L, world);
lua_call(L, 1, 0); lua_call(L, 1, 0);
} }
@ -14,8 +14,8 @@ static int nextOverlap(lua_State* L) {
Shape* a; Shape* a;
Shape* b; Shape* b;
if (lovrWorldGetNextOverlap(world, &a, &b)) { if (lovrWorldGetNextOverlap(world, &a, &b)) {
luax_pushshape(L, a); luax_pushobject(L, a);
luax_pushshape(L, b); luax_pushobject(L, b);
return 2; return 2;
} else { } else {
lua_pushnil(L); lua_pushnil(L);
@ -27,7 +27,7 @@ static void raycastCallback(Shape* shape, float x, float y, float z, float nx, f
lua_State* L = userdata; lua_State* L = userdata;
luaL_checktype(L, -1, LUA_TFUNCTION); luaL_checktype(L, -1, LUA_TFUNCTION);
lua_pushvalue(L, -1); lua_pushvalue(L, -1);
luax_pushshape(L, shape); luax_pushobject(L, shape);
lua_pushnumber(L, x); lua_pushnumber(L, x);
lua_pushnumber(L, y); lua_pushnumber(L, y);
lua_pushnumber(L, z); lua_pushnumber(L, z);
@ -43,7 +43,7 @@ int l_lovrWorldNewCollider(lua_State* L) {
float y = luaL_optnumber(L, 3, 0); float y = luaL_optnumber(L, 3, 0);
float z = luaL_optnumber(L, 4, 0); float z = luaL_optnumber(L, 4, 0);
Collider* collider = lovrColliderCreate(world, x, y, z); Collider* collider = lovrColliderCreate(world, x, y, z);
luax_pushtype(L, Collider, collider); luax_pushobject(L, collider);
return 1; return 1;
} }
@ -57,7 +57,7 @@ int l_lovrWorldNewBoxCollider(lua_State* L) {
float sz = luaL_optnumber(L, 7, sx); float sz = luaL_optnumber(L, 7, sx);
Collider* collider = lovrColliderCreate(world, x, y, z); Collider* collider = lovrColliderCreate(world, x, y, z);
lovrColliderAddShape(collider, lovrBoxShapeCreate(sx, sy, sz)); lovrColliderAddShape(collider, lovrBoxShapeCreate(sx, sy, sz));
luax_pushtype(L, Collider, collider); luax_pushobject(L, collider);
return 1; return 1;
} }
@ -70,7 +70,7 @@ int l_lovrWorldNewCapsuleCollider(lua_State* L) {
float length = luaL_optnumber(L, 6, 1.f); float length = luaL_optnumber(L, 6, 1.f);
Collider* collider = lovrColliderCreate(world, x, y, z); Collider* collider = lovrColliderCreate(world, x, y, z);
lovrColliderAddShape(collider, lovrCapsuleShapeCreate(radius, length)); lovrColliderAddShape(collider, lovrCapsuleShapeCreate(radius, length));
luax_pushtype(L, Collider, collider); luax_pushobject(L, collider);
return 1; return 1;
} }
@ -83,7 +83,7 @@ int l_lovrWorldNewCylinderCollider(lua_State* L) {
float length = luaL_optnumber(L, 6, 1.f); float length = luaL_optnumber(L, 6, 1.f);
Collider* collider = lovrColliderCreate(world, x, y, z); Collider* collider = lovrColliderCreate(world, x, y, z);
lovrColliderAddShape(collider, lovrCylinderShapeCreate(radius, length)); lovrColliderAddShape(collider, lovrCylinderShapeCreate(radius, length));
luax_pushtype(L, Collider, collider); luax_pushobject(L, collider);
return 1; return 1;
} }
@ -95,7 +95,7 @@ int l_lovrWorldNewSphereCollider(lua_State* L) {
float radius = luaL_optnumber(L, 5, 1.f); float radius = luaL_optnumber(L, 5, 1.f);
Collider* collider = lovrColliderCreate(world, x, y, z); Collider* collider = lovrColliderCreate(world, x, y, z);
lovrColliderAddShape(collider, lovrSphereShapeCreate(radius)); lovrColliderAddShape(collider, lovrSphereShapeCreate(radius));
luax_pushtype(L, Collider, collider); luax_pushobject(L, collider);
return 1; return 1;
} }

View file

@ -2,33 +2,14 @@
#include "util.h" #include "util.h"
#include <stdlib.h> #include <stdlib.h>
static int luax_pushobjectname(lua_State* L) { static int luax_meta__tostring(lua_State* L) {
lua_getfield(L, -1, "name"); lua_getfield(L, -1, "name");
return 1; return 1;
} }
static void luax_pushobjectregistry(lua_State* L) { static int luax_meta__gc(lua_State* L) {
lua_getfield(L, LUA_REGISTRYINDEX, "_lovrobjects"); lovrRelease(*(Ref**) lua_touserdata(L, 1));
return 0;
// Create the registry if it doesn't exist yet
if (lua_isnil(L, -1)) {
lua_newtable(L);
lua_replace(L, -2);
// Create the metatable
lua_newtable(L);
// __mode = v
lua_pushstring(L, "v");
lua_setfield(L, -2, "__mode");
// Set the metatable
lua_setmetatable(L, -2);
// Write the table to the registry
lua_pushvalue(L, -1);
lua_setfield(L, LUA_REGISTRYINDEX, "_lovrobjects");
}
} }
int luax_preloadmodule(lua_State* L, const char* key, lua_CFunction f) { int luax_preloadmodule(lua_State* L, const char* key, lua_CFunction f) {
@ -70,7 +51,7 @@ void luax_registertype(lua_State* L, const char* name, const luaL_Reg* functions
lua_setfield(L, -1, "__index"); lua_setfield(L, -1, "__index");
// m.__gc = gc // m.__gc = gc
lua_pushcfunction(L, luax_releasetype); lua_pushcfunction(L, luax_meta__gc);
lua_setfield(L, -2, "__gc"); lua_setfield(L, -2, "__gc");
// m.name = name // m.name = name
@ -78,7 +59,7 @@ void luax_registertype(lua_State* L, const char* name, const luaL_Reg* functions
lua_setfield(L, -2, "name"); lua_setfield(L, -2, "name");
// m.__tostring // m.__tostring
lua_pushcfunction(L, luax_pushobjectname); lua_pushcfunction(L, luax_meta__tostring);
lua_setfield(L, -2, "__tostring"); lua_setfield(L, -2, "__tostring");
// Register class functions // Register class functions
@ -104,11 +85,6 @@ void luax_extendtype(lua_State* L, const char* base, const char* name, const lua
lua_pop(L, 1); lua_pop(L, 1);
} }
int luax_releasetype(lua_State* L) {
lovrRelease(*(Ref**) lua_touserdata(L, 1));
return 0;
}
void* luax_testudata(lua_State* L, int index, const char* type) { void* luax_testudata(lua_State* L, int index, const char* type) {
void* p = lua_touserdata(L, index); void* p = lua_touserdata(L, index);
@ -122,29 +98,57 @@ void* luax_testudata(lua_State* L, int index, const char* type) {
return equal ? p : NULL; return equal ? p : NULL;
} }
// Find an object, pushing it onto the stack if it's found or leaving the stack unchanged otherwise. // Registers the userdata on the top of the stack in the registry.
int luax_getobject(lua_State* L, void* object) { void luax_pushobject(lua_State* L, void* object) {
luax_pushobjectregistry(L); if (!object) {
lua_pushnil(L);
return;
}
lua_getfield(L, LUA_REGISTRYINDEX, "_lovrobjects");
// Create the registry if it doesn't exist yet
if (lua_isnil(L, -1)) {
lua_newtable(L);
lua_replace(L, -2);
// Create the metatable
lua_newtable(L);
// __mode = v
lua_pushstring(L, "v");
lua_setfield(L, -2, "__mode");
// Set the metatable
lua_setmetatable(L, -2);
// Write the table to the registry
lua_pushvalue(L, -1);
lua_setfield(L, LUA_REGISTRYINDEX, "_lovrobjects");
}
lua_pushlightuserdata(L, object); lua_pushlightuserdata(L, object);
lua_gettable(L, -2); lua_gettable(L, -2);
if (lua_isnil(L, -1)) { if (lua_isnil(L, -1)) {
lua_pop(L, 2); lua_pop(L, 1);
return 0;
} else { } else {
lua_remove(L, -2); lua_remove(L, -2);
return 1; return;
} }
}
// Registers the userdata on the top of the stack in the object registry. // Allocate userdata
void luax_registerobject(lua_State* L, void* object) { void** u = (void**) lua_newuserdata(L, sizeof(void**));
luax_pushobjectregistry(L); luaL_getmetatable(L, ((Ref*) object)->type);
lua_pushlightuserdata(L, object); lua_setmetatable(L, -2);
lua_pushvalue(L, -3);
lua_settable(L, -3);
lua_pop(L, 1);
lovrRetain(object); lovrRetain(object);
*u = object;
// Write to registry and remove registry, leaving userdata on stack
lua_pushlightuserdata(L, object);
lua_pushvalue(L, -2);
lua_settable(L, -4);
lua_remove(L, -2);
} }
int luax_getstack(lua_State* L) { int luax_getstack(lua_State* L) {

View file

@ -19,25 +19,14 @@
luaL_argcheck(L, lua_equal(L, -1, -2) || lua_equal(L, -1, -3), i, "Expected " STRINGIFY(T)), \ luaL_argcheck(L, lua_equal(L, -1, -2) || lua_equal(L, -1, -3), i, "Expected " STRINGIFY(T)), \
lua_pop(L, 4), \ lua_pop(L, 4), \
lua_touserdata(L, i)) lua_touserdata(L, i))
#define luax_newobject(L, T, x) \
T** u = (T**) lua_newuserdata(L, sizeof(T**)); \
luax_registerobject(L, x); \
luaL_getmetatable(L, #T); \
lua_setmetatable(L, -2); \
*u = x;
#define luax_pushtype(L, T, x) \
if (!x) { lua_pushnil(L); } \
else if (!luax_getobject(L, x)) { luax_newobject(L, T, x); }
int luax_preloadmodule(lua_State* L, const char* key, lua_CFunction f); int luax_preloadmodule(lua_State* L, const char* key, lua_CFunction f);
int luax_emptymodule(lua_State* L); int luax_emptymodule(lua_State* L);
void luax_registerloader(lua_State* L, lua_CFunction loader, int index); void luax_registerloader(lua_State* L, lua_CFunction loader, int index);
void luax_registertype(lua_State* L, const char* name, const luaL_Reg* functions); void luax_registertype(lua_State* L, const char* name, const luaL_Reg* functions);
void luax_extendtype(lua_State* L, const char* base, const char* name, const luaL_Reg* baseFunctions, const luaL_Reg* functions); void luax_extendtype(lua_State* L, const char* base, const char* name, const luaL_Reg* baseFunctions, const luaL_Reg* functions);
int luax_releasetype(lua_State* L);
void* luax_testudata(lua_State* L, int index, const char* type); void* luax_testudata(lua_State* L, int index, const char* type);
int luax_getobject(lua_State* L, void* object); void luax_pushobject(lua_State* L, void* object);
void luax_registerobject(lua_State* L, void* object);
int luax_getstack(lua_State* L); int luax_getstack(lua_State* L);
void luax_pushconf(lua_State* L); void luax_pushconf(lua_State* L);
int luax_setconf(lua_State* L); int luax_setconf(lua_State* L);