diff --git a/src/api.h b/src/api.h index ace84db2..1ee2d87d 100644 --- a/src/api.h +++ b/src/api.h @@ -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); int luax_readtransform(lua_State* L, int index, mat4 transform, int scaleComponents); 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); diff --git a/src/api/audio.c b/src/api/audio.c index 8ce50bdb..bf810972 100644 --- a/src/api/audio.c +++ b/src/api/audio.c @@ -102,7 +102,7 @@ int l_lovrAudioNewMicrophone(lua_State* L) { int bitDepth = luaL_optinteger(L, 4, 16); int channelCount = luaL_optinteger(L, 5, 1); Microphone* microphone = lovrMicrophoneCreate(name, samples, sampleRate, bitDepth, channelCount); - luax_pushtype(L, Microphone, microphone); + luax_pushobject(L, microphone); lovrRelease(microphone); return 1; } @@ -144,7 +144,7 @@ int l_lovrAudioNewSource(lua_State* L) { } } - luax_pushtype(L, Source, source); + luax_pushobject(L, source); lovrRelease(source); return 1; } diff --git a/src/api/data.c b/src/api/data.c index 3a3f565f..f13f14a5 100644 --- a/src/api/data.c +++ b/src/api/data.c @@ -38,7 +38,7 @@ int l_lovrDataNewBlob(lua_State* L) { } const char* name = luaL_optstring(L, 2, ""); Blob* blob = lovrBlobCreate(data, size, name); - luax_pushtype(L, Blob, blob); + luax_pushobject(L, blob); lovrRelease(blob); return 1; } @@ -47,7 +47,7 @@ int l_lovrDataNewAudioStream(lua_State* L) { Blob* blob = luax_readblob(L, 1, "AudioStream"); size_t bufferSize = luaL_optinteger(L, 2, 4096); AudioStream* stream = lovrAudioStreamCreate(blob, bufferSize); - luax_pushtype(L, AudioStream, stream); + luax_pushobject(L, stream); lovrRelease(blob); lovrRelease(stream); return 1; @@ -56,7 +56,7 @@ int l_lovrDataNewAudioStream(lua_State* L) { int l_lovrDataNewModelData(lua_State* L) { Blob* blob = luax_readblob(L, 1, "Model"); ModelData* modelData = lovrModelDataCreate(blob); - luax_pushtype(L, ModelData, modelData); + luax_pushobject(L, modelData); lovrRelease(blob); lovrRelease(modelData); return 1; @@ -74,7 +74,7 @@ int l_lovrDataNewRasterizer(lua_State* L) { } Rasterizer* rasterizer = lovrRasterizerCreate(blob, size); - luax_pushtype(L, Rasterizer, rasterizer); + luax_pushobject(L, rasterizer); lovrRelease(blob); lovrRelease(rasterizer); return 1; @@ -87,20 +87,20 @@ int l_lovrDataNewSoundData(lua_State* L) { int bitDepth = luaL_optinteger(L, 3, 16); int channelCount = luaL_optinteger(L, 4, 2); SoundData* soundData = lovrSoundDataCreate(samples, sampleRate, bitDepth, channelCount); - luax_pushtype(L, SoundData, soundData); + luax_pushobject(L, soundData); return 1; } AudioStream** audioStream; if ((audioStream = luax_totype(L, 1, AudioStream)) != NULL) { SoundData* soundData = lovrSoundDataCreateFromAudioStream(*audioStream); - luax_pushtype(L, SoundData, soundData); + luax_pushobject(L, soundData); return 1; } Blob* blob = luax_readblob(L, 1, "SoundData"); SoundData* soundData = lovrSoundDataCreateFromBlob(blob); - luax_pushtype(L, SoundData, soundData); + luax_pushobject(L, soundData); lovrRelease(blob); lovrRelease(soundData); return 1; @@ -118,7 +118,7 @@ int l_lovrDataNewTextureData(lua_State* L) { lovrRelease(blob); } - luax_pushtype(L, TextureData, textureData); + luax_pushobject(L, textureData); lovrRelease(textureData); return 1; } @@ -154,7 +154,7 @@ int l_lovrDataNewVertexData(lua_State* L) { if (dataIndex) { luax_loadvertices(L, dataIndex, &vertexData->format, (VertexPointer) { .raw = vertexData->blob.data }); } - luax_pushtype(L, VertexData, vertexData); + luax_pushobject(L, vertexData); lovrRelease(vertexData); return 1; } diff --git a/src/api/event.c b/src/api/event.c index 5b0bcae5..834a6c42 100644 --- a/src/api/event.c +++ b/src/api/event.c @@ -42,29 +42,29 @@ static int nextEvent(lua_State* L) { #ifndef EMSCRIPTEN 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); free((void*) event.data.threaderror.error); return 3; #endif case EVENT_CONTROLLER_ADDED: - luax_pushtype(L, Controller, event.data.controlleradded.controller); + luax_pushobject(L, event.data.controlleradded.controller); lovrRelease(event.data.controlleradded.controller); return 2; case EVENT_CONTROLLER_REMOVED: - luax_pushtype(L, Controller, event.data.controllerremoved.controller); + luax_pushobject(L, event.data.controllerremoved.controller); lovrRelease(event.data.controlleradded.controller); return 2; 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]); return 3; 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]); return 3; diff --git a/src/api/filesystem.c b/src/api/filesystem.c index a3114d25..0271d56f 100644 --- a/src/api/filesystem.c +++ b/src/api/filesystem.c @@ -308,7 +308,7 @@ int l_lovrFilesystemNewBlob(lua_State* L) { uint8_t* data = lovrFilesystemRead(path, &size); lovrAssert(data, "Could not load file '%s'", path); Blob* blob = lovrBlobCreate((void*) data, size, path); - luax_pushtype(L, Blob, blob); + luax_pushobject(L, blob); lovrRelease(blob); return 1; } diff --git a/src/api/graphics.c b/src/api/graphics.c index e9613413..146eeb99 100644 --- a/src/api/graphics.c +++ b/src/api/graphics.c @@ -406,7 +406,7 @@ int l_lovrGraphicsGetCanvas(lua_State* L) { int count; lovrGraphicsGetCanvas(canvas, &count); for (int i = 0; i < count; i++) { - luax_pushtype(L, Canvas, canvas[i]); + luax_pushobject(L, canvas[i]); } return count; } @@ -481,7 +481,7 @@ int l_lovrGraphicsSetDepthTest(lua_State* L) { int l_lovrGraphicsGetFont(lua_State* L) { Font* font = lovrGraphicsGetFont(); - luax_pushtype(L, Font, font); + luax_pushobject(L, font); return 1; } @@ -521,7 +521,7 @@ int l_lovrGraphicsSetPointSize(lua_State* L) { int l_lovrGraphicsGetShader(lua_State* L) { Shader* shader = lovrGraphicsGetShader(); - luax_pushtype(L, Shader, shader); + luax_pushobject(L, shader); return 1; } @@ -847,7 +847,7 @@ int l_lovrGraphicsFill(lua_State* L) { int l_lovrGraphicsNewAnimator(lua_State* L) { Model* model = luax_checktype(L, 1, Model); Animator* animator = lovrAnimatorCreate(model->modelData); - luax_pushtype(L, Animator, animator); + luax_pushobject(L, animator); lovrRelease(animator); return 1; } @@ -884,7 +884,7 @@ int l_lovrGraphicsNewCanvas(lua_State* L) { } Canvas* canvas = lovrCanvasCreate(width, height, format, flags); - luax_pushtype(L, Canvas, canvas); + luax_pushobject(L, canvas); lovrRelease(canvas); return 1; } @@ -910,7 +910,7 @@ int l_lovrGraphicsNewFont(lua_State* L) { } Font* font = lovrFontCreate(rasterizer); - luax_pushtype(L, Font, font); + luax_pushobject(L, font); lovrRelease(rasterizer); lovrRelease(font); return 1; @@ -940,7 +940,7 @@ int l_lovrGraphicsNewMaterial(lua_State* L) { lovrMaterialSetColor(material, COLOR_DIFFUSE, color); } - luax_pushtype(L, Material, material); + luax_pushobject(L, material); lovrRelease(material); return 1; } @@ -999,7 +999,7 @@ int l_lovrGraphicsNewMesh(lua_State* L) { memcpy(vertices.raw, vertexData->blob.data, vertexData->count * vertexData->format.stride); } - luax_pushtype(L, Mesh, mesh); + luax_pushobject(L, mesh); lovrRelease(mesh); return 1; } @@ -1033,7 +1033,7 @@ int l_lovrGraphicsNewModel(lua_State* L) { } } - luax_pushtype(L, Model, model); + luax_pushobject(L, model); lovrRelease(modelData); lovrRelease(model); return 1; @@ -1061,7 +1061,7 @@ int l_lovrGraphicsNewShader(lua_State* L) { const char* vertexSource = lua_tostring(L, 1); const char* fragmentSource = lua_tostring(L, 2); Shader* shader = lovrShaderCreate(vertexSource, fragmentSource); - luax_pushtype(L, Shader, shader); + luax_pushobject(L, shader); lovrRelease(shader); return 1; } @@ -1117,7 +1117,7 @@ int l_lovrGraphicsNewTexture(lua_State* L) { lua_pop(L, 1); } - luax_pushtype(L, Texture, texture); + luax_pushobject(L, texture); lovrRelease(texture); return 1; } diff --git a/src/api/headset.c b/src/api/headset.c index 4886e277..8fd4aa46 100644 --- a/src/api/headset.c +++ b/src/api/headset.c @@ -275,7 +275,7 @@ int l_lovrHeadsetGetControllers(lua_State* L) { Controller** controllers = lovrHeadsetDriver->getControllers(&count); lua_newtable(L); 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); } return 1; diff --git a/src/api/math.c b/src/api/math.c index 88e91879..c4746f1d 100644 --- a/src/api/math.c +++ b/src/api/math.c @@ -25,7 +25,7 @@ int l_lovrMathNewRandomGenerator(lua_State* L) { Seed seed = luax_checkrandomseed(L, 1); lovrRandomGeneratorSetSeed(generator, seed); } - luax_pushtype(L, RandomGenerator, generator); + luax_pushobject(L, generator); lovrRelease(generator); return 1; } @@ -34,7 +34,7 @@ int l_lovrMathNewTransform(lua_State* L) { float matrix[16]; luax_readtransform(L, 1, matrix, 3); Transform* transform = lovrTransformCreate(matrix); - luax_pushtype(L, Transform, transform); + luax_pushobject(L, transform); lovrRelease(transform); return 1; } @@ -81,25 +81,25 @@ int l_lovrMathNoise(lua_State* L) { } int l_lovrMathRandom(lua_State* L) { - luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator()); + luax_pushobject(L, lovrMathGetRandomGenerator()); lua_insert(L, 1); return l_lovrRandomGeneratorRandom(L); } int l_lovrMathRandomNormal(lua_State* L) { - luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator()); + luax_pushobject(L, lovrMathGetRandomGenerator()); lua_insert(L, 1); return l_lovrRandomGeneratorRandomNormal(L); } int l_lovrMathGetRandomSeed(lua_State* L) { - luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator()); + luax_pushobject(L, lovrMathGetRandomGenerator()); lua_insert(L, 1); return l_lovrRandomGeneratorGetSeed(L); } int l_lovrMathSetRandomSeed(lua_State* L) { - luax_pushtype(L, RandomGenerator, lovrMathGetRandomGenerator()); + luax_pushobject(L, lovrMathGetRandomGenerator()); lua_insert(L, 1); return l_lovrRandomGeneratorSetSeed(L); } diff --git a/src/api/physics.c b/src/api/physics.c index 9b95421c..e8effa49 100644 --- a/src/api/physics.c +++ b/src/api/physics.c @@ -56,7 +56,7 @@ int l_lovrPhysicsNewWorld(lua_State* L) { tagCount = 0; } World* world = lovrWorldCreate(xg, yg, zg, allowSleep, tags, tagCount); - luax_pushtype(L, World, world); + luax_pushobject(L, world); return 1; } @@ -67,7 +67,7 @@ int l_lovrPhysicsNewBallJoint(lua_State* L) { float y = luaL_checknumber(L, 4); float z = luaL_checknumber(L, 5); BallJoint* joint = lovrBallJointCreate(a, b, x, y, z); - luax_pushtype(L, BallJoint, joint); + luax_pushobject(L, joint); return 1; } @@ -76,7 +76,7 @@ int l_lovrPhysicsNewBoxShape(lua_State* L) { float y = luaL_optnumber(L, 2, x); float z = luaL_optnumber(L, 3, x); BoxShape* box = lovrBoxShapeCreate(x, y, z); - luax_pushtype(L, BoxShape, box); + luax_pushobject(L, box); return 1; } @@ -84,7 +84,7 @@ int l_lovrPhysicsNewCapsuleShape(lua_State* L) { float radius = luaL_optnumber(L, 1, 1.f); float length = luaL_optnumber(L, 2, 1.f); CapsuleShape* capsule = lovrCapsuleShapeCreate(radius, length); - luax_pushtype(L, CapsuleShape, capsule); + luax_pushobject(L, capsule); return 1; } @@ -92,7 +92,7 @@ int l_lovrPhysicsNewCylinderShape(lua_State* L) { float radius = luaL_optnumber(L, 1, 1.f); float length = luaL_optnumber(L, 2, 1.f); CylinderShape* cylinder = lovrCylinderShapeCreate(radius, length); - luax_pushtype(L, CylinderShape, cylinder); + luax_pushobject(L, cylinder); return 1; } @@ -106,7 +106,7 @@ int l_lovrPhysicsNewDistanceJoint(lua_State* L) { float y2 = luaL_checknumber(L, 7); float z2 = luaL_checknumber(L, 8); DistanceJoint* joint = lovrDistanceJointCreate(a, b, x1, y1, z1, x2, y2, z2); - luax_pushtype(L, DistanceJoint, joint); + luax_pushobject(L, joint); return 1; } @@ -120,7 +120,7 @@ int l_lovrPhysicsNewHingeJoint(lua_State* L) { float ay = luaL_checknumber(L, 7); float az = luaL_checknumber(L, 8); HingeJoint* joint = lovrHingeJointCreate(a, b, x, y, z, ax, ay, az); - luax_pushtype(L, HingeJoint, joint); + luax_pushobject(L, joint); return 1; } @@ -131,14 +131,14 @@ int l_lovrPhysicsNewSliderJoint(lua_State* L) { float ay = luaL_checknumber(L, 4); float az = luaL_checknumber(L, 5); SliderJoint* joint = lovrSliderJointCreate(a, b, ax, ay, az); - luax_pushtype(L, SliderJoint, joint); + luax_pushobject(L, joint); return 1; } int l_lovrPhysicsNewSphereShape(lua_State* L) { float radius = luaL_optnumber(L, 1, 1.f); SphereShape* sphere = lovrSphereShapeCreate(radius); - luax_pushtype(L, SphereShape, sphere); + luax_pushobject(L, sphere); return 1; } diff --git a/src/api/thread.c b/src/api/thread.c index c943d50c..70124ed1 100644 --- a/src/api/thread.c +++ b/src/api/thread.c @@ -52,7 +52,7 @@ int l_lovrThreadInit(lua_State* L) { int l_lovrThreadNewThread(lua_State* L) { const char* body = luaL_checkstring(L, 1); Thread* thread = lovrThreadCreate(threadRunner, body); - luax_pushtype(L, Thread, thread); + luax_pushobject(L, thread); lovrRelease(thread); return 1; } @@ -60,7 +60,7 @@ int l_lovrThreadNewThread(lua_State* L) { int l_lovrThreadGetChannel(lua_State* L) { const char* name = luaL_checkstring(L, 1); Channel* channel = lovrThreadGetChannel(name); - luax_pushtype(L, Channel, channel); + luax_pushobject(L, channel); return 1; } diff --git a/src/api/types/audioStream.c b/src/api/types/audioStream.c index 8b5c2b79..9d9490c3 100644 --- a/src/api/types/audioStream.c +++ b/src/api/types/audioStream.c @@ -8,7 +8,7 @@ int l_lovrAudioStreamDecode(lua_State* L) { if (samples > 0) { SoundData* soundData = lovrSoundDataCreate(samples / stream->channelCount, stream->sampleRate, stream->bitDepth, stream->channelCount); memcpy(soundData->blob.data, stream->buffer, samples * (stream->bitDepth / 8)); - luax_pushtype(L, SoundData, soundData); + luax_pushobject(L, soundData); lovrRelease(soundData); } else { lua_pushnil(L); diff --git a/src/api/types/canvas.c b/src/api/types/canvas.c index 6421e8f6..253aa9e5 100644 --- a/src/api/types/canvas.c +++ b/src/api/types/canvas.c @@ -32,7 +32,7 @@ int l_lovrCanvasGetMSAA(lua_State* L) { int l_lovrCanvasNewTextureData(lua_State* L) { Canvas* canvas = luax_checktype(L, 1, Canvas); TextureData* textureData = lovrCanvasNewTextureData(canvas); - luax_pushtype(L, TextureData, textureData); + luax_pushobject(L, textureData); lovrRelease(textureData); return 1; } diff --git a/src/api/types/channel.c b/src/api/types/channel.c index 33b23924..88e46780 100644 --- a/src/api/types/channel.c +++ b/src/api/types/channel.c @@ -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_NUMBER: lua_pushnumber(L, variant->value.number); break; case TYPE_STRING: lua_pushstring(L, variant->value.string); break; - case TYPE_OBJECT: - 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; + case TYPE_OBJECT: luax_pushobject(L, variant->value.ref); lovrRelease(variant->value.ref); break; } if (variant->type == TYPE_STRING) { diff --git a/src/api/types/collider.c b/src/api/types/collider.c index a8f06088..03e118bc 100644 --- a/src/api/types/collider.c +++ b/src/api/types/collider.c @@ -11,7 +11,7 @@ int l_lovrColliderDestroy(lua_State* L) { int l_lovrColliderGetWorld(lua_State* L) { Collider* collider = luax_checktype(L, 1, Collider); World* world = lovrColliderGetWorld(collider); - luax_pushtype(L, World, world); + luax_pushobject(L, world); return 1; } @@ -34,7 +34,7 @@ int l_lovrColliderGetShapes(lua_State* L) { lua_newtable(L); vec_void_t* shapes = lovrColliderGetShapes(collider); 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); } return 1; @@ -45,7 +45,7 @@ int l_lovrColliderGetJoints(lua_State* L) { lua_newtable(L); vec_void_t* joints = lovrColliderGetJoints(collider); 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); } return 1; diff --git a/src/api/types/controller.c b/src/api/types/controller.c index 8cef676a..fe3514c1 100644 --- a/src/api/types/controller.c +++ b/src/api/types/controller.c @@ -85,7 +85,7 @@ int l_lovrControllerNewModel(lua_State* L) { ModelData* modelData = lovrHeadsetDriver->controllerNewModelData(controller); if (modelData) { Model* model = lovrModelCreate(modelData); - luax_pushtype(L, Model, model); + luax_pushobject(L, model); lovrRelease(modelData); lovrRelease(model); } else { diff --git a/src/api/types/joints.c b/src/api/types/joints.c index 3aca07c6..b39200ca 100644 --- a/src/api/types/joints.c +++ b/src/api/types/joints.c @@ -1,16 +1,6 @@ #include "api.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) { Joint* joint = luax_checktypeof(L, 1, Joint); lovrJointDestroyData(joint); @@ -28,8 +18,8 @@ int l_lovrJointGetColliders(lua_State* L) { Collider* a; Collider* b; lovrJointGetColliders(joint, &a, &b); - luax_pushtype(L, Collider, a); - luax_pushtype(L, Collider, b); + luax_pushobject(L, a); + luax_pushobject(L, b); return 2; } diff --git a/src/api/types/material.c b/src/api/types/material.c index f940dc02..cc681067 100644 --- a/src/api/types/material.c +++ b/src/api/types/material.c @@ -45,7 +45,7 @@ int l_lovrMaterialGetTexture(lua_State* L) { Material* material = luax_checktype(L, 1, Material); MaterialTexture textureType = luaL_checkoption(L, 2, "diffuse", MaterialTextures); Texture* texture = lovrMaterialGetTexture(material, textureType); - luax_pushtype(L, Texture, texture); + luax_pushobject(L, texture); return 1; } diff --git a/src/api/types/mesh.c b/src/api/types/mesh.c index 3d1c16cd..7cd8e543 100644 --- a/src/api/types/mesh.c +++ b/src/api/types/mesh.c @@ -303,11 +303,7 @@ int l_lovrMeshSetDrawRange(lua_State* L) { int l_lovrMeshGetMaterial(lua_State* L) { Mesh* mesh = luax_checktype(L, 1, Mesh); Material* material = lovrMeshGetMaterial(mesh); - if (material) { - luax_pushtype(L, Material, material); - } else { - lua_pushnil(L); - } + luax_pushobject(L, material); return 1; } diff --git a/src/api/types/microphone.c b/src/api/types/microphone.c index bb54fc4b..53b02a61 100644 --- a/src/api/types/microphone.c +++ b/src/api/types/microphone.c @@ -16,7 +16,7 @@ int l_lovrMicrophoneGetChannelCount(lua_State* L) { int l_lovrMicrophoneGetData(lua_State* L) { Microphone* microphone = luax_checktype(L, 1, Microphone); SoundData* soundData = lovrMicrophoneGetData(microphone); - luax_pushtype(L, SoundData, soundData); + luax_pushobject(L, soundData); return 1; } diff --git a/src/api/types/model.c b/src/api/types/model.c index 5f4c37fa..111dc687 100644 --- a/src/api/types/model.c +++ b/src/api/types/model.c @@ -28,7 +28,7 @@ int l_lovrModelGetAABB(lua_State* L) { int l_lovrModelGetAnimator(lua_State* L) { Model* model = luax_checktype(L, 1, Model); Animator* animator = lovrModelGetAnimator(model); - luax_pushtype(L, Animator, animator); + luax_pushobject(L, animator); return 1; } @@ -53,7 +53,7 @@ int l_lovrModelGetMaterial(lua_State* L) { Model* model = luax_checktype(L, 1, Model); Material* material = lovrModelGetMaterial(model); if (material) { - luax_pushtype(L, Material, material); + luax_pushobject(L, material); } else { lua_pushnil(L); } @@ -74,7 +74,7 @@ int l_lovrModelSetMaterial(lua_State* L) { int l_lovrModelGetMesh(lua_State* L) { Model* model = luax_checktype(L, 1, Model); Mesh* mesh = lovrModelGetMesh(model); - luax_pushtype(L, Mesh, mesh); + luax_pushobject(L, mesh); return 1; } diff --git a/src/api/types/modelData.c b/src/api/types/modelData.c index b16e50df..c5ce258c 100644 --- a/src/api/types/modelData.c +++ b/src/api/types/modelData.c @@ -5,7 +5,7 @@ int l_lovrModelDataGetVertexData(lua_State* L) { ModelData* modelData = luax_checktype(L, 1, ModelData); - luax_pushtype(L, VertexData, modelData->vertexData); + luax_pushobject(L, modelData->vertexData); return 1; } @@ -196,7 +196,7 @@ int l_lovrModelDataGetDiffuseTexture(lua_State* L) { ModelData* modelData = luax_checktype(L, 1, ModelData); ModelMaterial* material = luax_checkmodelmaterial(L, 1); TextureData* textureData = modelData->textures.data[material->diffuseTexture]; - luax_pushtype(L, TextureData, textureData); + luax_pushobject(L, textureData); return 1; } @@ -204,7 +204,7 @@ int l_lovrModelDataGetEmissiveTexture(lua_State* L) { ModelData* modelData = luax_checktype(L, 1, ModelData); ModelMaterial* material = luax_checkmodelmaterial(L, 1); TextureData* textureData = modelData->textures.data[material->emissiveTexture]; - luax_pushtype(L, TextureData, textureData); + luax_pushobject(L, textureData); return 1; } @@ -212,7 +212,7 @@ int l_lovrModelDataGetMetalnessTexture(lua_State* L) { ModelData* modelData = luax_checktype(L, 1, ModelData); ModelMaterial* material = luax_checkmodelmaterial(L, 1); TextureData* textureData = modelData->textures.data[material->metalnessTexture]; - luax_pushtype(L, TextureData, textureData); + luax_pushobject(L, textureData); return 1; } @@ -220,7 +220,7 @@ int l_lovrModelDataGetRoughnessTexture(lua_State* L) { ModelData* modelData = luax_checktype(L, 1, ModelData); ModelMaterial* material = luax_checkmodelmaterial(L, 1); TextureData* textureData = modelData->textures.data[material->roughnessTexture]; - luax_pushtype(L, TextureData, textureData); + luax_pushobject(L, textureData); return 1; } @@ -228,7 +228,7 @@ int l_lovrModelDataGetOcclusionTexture(lua_State* L) { ModelData* modelData = luax_checktype(L, 1, ModelData); ModelMaterial* material = luax_checkmodelmaterial(L, 1); TextureData* textureData = modelData->textures.data[material->occlusionTexture]; - luax_pushtype(L, TextureData, textureData); + luax_pushobject(L, textureData); return 1; } @@ -236,7 +236,7 @@ int l_lovrModelDataGetNormalTexture(lua_State* L) { ModelData* modelData = luax_checktype(L, 1, ModelData); ModelMaterial* material = luax_checkmodelmaterial(L, 1); TextureData* textureData = modelData->textures.data[material->normalTexture]; - luax_pushtype(L, TextureData, textureData); + luax_pushobject(L, textureData); return 1; } diff --git a/src/api/types/shapes.c b/src/api/types/shapes.c index 7570c11f..12b68d9b 100644 --- a/src/api/types/shapes.c +++ b/src/api/types/shapes.c @@ -1,16 +1,6 @@ #include "api.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) { Shape* shape = luax_checktypeof(L, 1, Shape); lovrShapeDestroyData(shape); @@ -25,7 +15,7 @@ int l_lovrShapeGetType(lua_State* L) { int l_lovrShapeGetCollider(lua_State* L) { Shape* shape = luax_checktypeof(L, 1, Shape); - luax_pushtype(L, Collider, lovrShapeGetCollider(shape)); + luax_pushobject(L, lovrShapeGetCollider(shape)); return 1; } diff --git a/src/api/types/transform.c b/src/api/types/transform.c index cae51df2..4edf7474 100644 --- a/src/api/types/transform.c +++ b/src/api/types/transform.c @@ -67,7 +67,7 @@ int l_lovrTransformSetMatrix(lua_State* L) { int l_lovrTransformClone(lua_State* L) { Transform* transform = luax_checktype(L, 1, Transform); Transform* clone = lovrTransformCreate(transform->matrix); - luax_pushtype(L, Transform, clone); + luax_pushobject(L, clone); lovrRelease(clone); return 1; } @@ -75,7 +75,7 @@ int l_lovrTransformClone(lua_State* L) { int l_lovrTransformInverse(lua_State* L) { Transform* transform = luax_checktype(L, 1, Transform); Transform* inverse = lovrTransformCreate(lovrTransformInverse(transform)); - luax_pushtype(L, Transform, inverse); + luax_pushobject(L, inverse); lovrRelease(inverse); return 1; } diff --git a/src/api/types/world.c b/src/api/types/world.c index 953ffc87..93935da6 100644 --- a/src/api/types/world.c +++ b/src/api/types/world.c @@ -5,7 +5,7 @@ static void collisionResolver(World* world, void* userdata) { lua_State* L = userdata; luaL_checktype(L, -1, LUA_TFUNCTION); - luax_pushtype(L, World, world); + luax_pushobject(L, world); lua_call(L, 1, 0); } @@ -14,8 +14,8 @@ static int nextOverlap(lua_State* L) { Shape* a; Shape* b; if (lovrWorldGetNextOverlap(world, &a, &b)) { - luax_pushshape(L, a); - luax_pushshape(L, b); + luax_pushobject(L, a); + luax_pushobject(L, b); return 2; } else { 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; luaL_checktype(L, -1, LUA_TFUNCTION); lua_pushvalue(L, -1); - luax_pushshape(L, shape); + luax_pushobject(L, shape); lua_pushnumber(L, x); lua_pushnumber(L, y); lua_pushnumber(L, z); @@ -43,7 +43,7 @@ int l_lovrWorldNewCollider(lua_State* L) { float y = luaL_optnumber(L, 3, 0); float z = luaL_optnumber(L, 4, 0); Collider* collider = lovrColliderCreate(world, x, y, z); - luax_pushtype(L, Collider, collider); + luax_pushobject(L, collider); return 1; } @@ -57,7 +57,7 @@ int l_lovrWorldNewBoxCollider(lua_State* L) { float sz = luaL_optnumber(L, 7, sx); Collider* collider = lovrColliderCreate(world, x, y, z); lovrColliderAddShape(collider, lovrBoxShapeCreate(sx, sy, sz)); - luax_pushtype(L, Collider, collider); + luax_pushobject(L, collider); return 1; } @@ -70,7 +70,7 @@ int l_lovrWorldNewCapsuleCollider(lua_State* L) { float length = luaL_optnumber(L, 6, 1.f); Collider* collider = lovrColliderCreate(world, x, y, z); lovrColliderAddShape(collider, lovrCapsuleShapeCreate(radius, length)); - luax_pushtype(L, Collider, collider); + luax_pushobject(L, collider); return 1; } @@ -83,7 +83,7 @@ int l_lovrWorldNewCylinderCollider(lua_State* L) { float length = luaL_optnumber(L, 6, 1.f); Collider* collider = lovrColliderCreate(world, x, y, z); lovrColliderAddShape(collider, lovrCylinderShapeCreate(radius, length)); - luax_pushtype(L, Collider, collider); + luax_pushobject(L, collider); return 1; } @@ -95,7 +95,7 @@ int l_lovrWorldNewSphereCollider(lua_State* L) { float radius = luaL_optnumber(L, 5, 1.f); Collider* collider = lovrColliderCreate(world, x, y, z); lovrColliderAddShape(collider, lovrSphereShapeCreate(radius)); - luax_pushtype(L, Collider, collider); + luax_pushobject(L, collider); return 1; } diff --git a/src/luax.c b/src/luax.c index 70d17039..ff46c31d 100644 --- a/src/luax.c +++ b/src/luax.c @@ -2,33 +2,14 @@ #include "util.h" #include -static int luax_pushobjectname(lua_State* L) { +static int luax_meta__tostring(lua_State* L) { lua_getfield(L, -1, "name"); return 1; } -static void luax_pushobjectregistry(lua_State* L) { - 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"); - } +static int luax_meta__gc(lua_State* L) { + lovrRelease(*(Ref**) lua_touserdata(L, 1)); + return 0; } 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"); // m.__gc = gc - lua_pushcfunction(L, luax_releasetype); + lua_pushcfunction(L, luax_meta__gc); lua_setfield(L, -2, "__gc"); // 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"); // m.__tostring - lua_pushcfunction(L, luax_pushobjectname); + lua_pushcfunction(L, luax_meta__tostring); lua_setfield(L, -2, "__tostring"); // 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); } -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* p = lua_touserdata(L, index); @@ -122,29 +98,57 @@ void* luax_testudata(lua_State* L, int index, const char* type) { return equal ? p : NULL; } -// Find an object, pushing it onto the stack if it's found or leaving the stack unchanged otherwise. -int luax_getobject(lua_State* L, void* object) { - luax_pushobjectregistry(L); +// Registers the userdata on the top of the stack in the registry. +void luax_pushobject(lua_State* L, void* object) { + 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_gettable(L, -2); if (lua_isnil(L, -1)) { - lua_pop(L, 2); - return 0; + lua_pop(L, 1); } else { lua_remove(L, -2); - return 1; + return; } -} -// Registers the userdata on the top of the stack in the object registry. -void luax_registerobject(lua_State* L, void* object) { - luax_pushobjectregistry(L); - lua_pushlightuserdata(L, object); - lua_pushvalue(L, -3); - lua_settable(L, -3); - lua_pop(L, 1); + // Allocate userdata + void** u = (void**) lua_newuserdata(L, sizeof(void**)); + luaL_getmetatable(L, ((Ref*) object)->type); + lua_setmetatable(L, -2); 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) { diff --git a/src/luax.h b/src/luax.h index b72ba55a..50ffc095 100644 --- a/src/luax.h +++ b/src/luax.h @@ -19,25 +19,14 @@ luaL_argcheck(L, lua_equal(L, -1, -2) || lua_equal(L, -1, -3), i, "Expected " STRINGIFY(T)), \ lua_pop(L, 4), \ 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_emptymodule(lua_State* L); 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_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); -int luax_getobject(lua_State* L, void* object); -void luax_registerobject(lua_State* L, void* object); +void luax_pushobject(lua_State* L, void* object); int luax_getstack(lua_State* L); void luax_pushconf(lua_State* L); int luax_setconf(lua_State* L);