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);
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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

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_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) {

View File

@ -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;

View File

@ -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 {

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -2,33 +2,14 @@
#include "util.h"
#include <stdlib.h>
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) {

View File

@ -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);