mirror of https://github.com/bjornbytes/lovr.git
Simplify Lua object management;
This commit is contained in:
parent
bc2d638b00
commit
83ddb82162
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
92
src/luax.c
92
src/luax.c
|
@ -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) {
|
||||
|
|
13
src/luax.h
13
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);
|
||||
|
|
Loading…
Reference in New Issue