mirror of https://github.com/bjornbytes/lovr.git
Simplify luax_checktype and inheritance;
This commit is contained in:
parent
83ddb82162
commit
d6daa885c8
|
@ -109,18 +109,16 @@ int l_lovrAudioNewMicrophone(lua_State* L) {
|
||||||
|
|
||||||
int l_lovrAudioNewSource(lua_State* L) {
|
int l_lovrAudioNewSource(lua_State* L) {
|
||||||
Source* source = NULL;
|
Source* source = NULL;
|
||||||
SoundData** soundDataRef = luax_totype(L, 1, SoundData);
|
SoundData* soundData = luax_totype(L, 1, SoundData);
|
||||||
AudioStream** streamRef = luax_totype(L, 1, AudioStream);
|
AudioStream* stream = luax_totype(L, 1, AudioStream);
|
||||||
bool isStatic = soundDataRef || luaL_checkoption(L, 2, NULL, SourceTypes) == SOURCE_STATIC;
|
bool isStatic = soundData || luaL_checkoption(L, 2, NULL, SourceTypes) == SOURCE_STATIC;
|
||||||
|
|
||||||
if (isStatic) {
|
if (isStatic) {
|
||||||
if (soundDataRef) {
|
if (soundData) {
|
||||||
source = lovrSourceCreateStatic(*soundDataRef);
|
source = lovrSourceCreateStatic(soundData);
|
||||||
} else {
|
} else {
|
||||||
SoundData* soundData;
|
if (stream) {
|
||||||
|
soundData = lovrSoundDataCreateFromAudioStream(stream);
|
||||||
if (streamRef) {
|
|
||||||
soundData = lovrSoundDataCreateFromAudioStream(*streamRef);
|
|
||||||
} else {
|
} else {
|
||||||
Blob* blob = luax_readblob(L, 1, "Source");
|
Blob* blob = luax_readblob(L, 1, "Source");
|
||||||
soundData = lovrSoundDataCreateFromBlob(blob);
|
soundData = lovrSoundDataCreateFromBlob(blob);
|
||||||
|
@ -132,11 +130,11 @@ int l_lovrAudioNewSource(lua_State* L) {
|
||||||
lovrRelease(soundData);
|
lovrRelease(soundData);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (streamRef) {
|
if (stream) {
|
||||||
source = lovrSourceCreateStream(*streamRef);
|
source = lovrSourceCreateStream(stream);
|
||||||
} else {
|
} else {
|
||||||
Blob* blob = luax_readblob(L, 1, "Source");
|
Blob* blob = luax_readblob(L, 1, "Source");
|
||||||
AudioStream* stream = lovrAudioStreamCreate(blob, 4096);
|
stream = lovrAudioStreamCreate(blob, 4096);
|
||||||
lovrAssert(stream, "Could not create stream Source");
|
lovrAssert(stream, "Could not create stream Source");
|
||||||
source = lovrSourceCreateStream(stream);
|
source = lovrSourceCreateStream(stream);
|
||||||
lovrRelease(blob);
|
lovrRelease(blob);
|
||||||
|
|
|
@ -32,7 +32,7 @@ int l_lovrDataNewBlob(lua_State* L) {
|
||||||
memcpy(data, str, size);
|
memcpy(data, str, size);
|
||||||
data[size] = '\0';
|
data[size] = '\0';
|
||||||
} else {
|
} else {
|
||||||
Blob* blob = luax_checktypeof(L, 1, Blob);
|
Blob* blob = luax_checktype(L, 1, Blob);
|
||||||
size = blob->size;
|
size = blob->size;
|
||||||
data = malloc(size);
|
data = malloc(size);
|
||||||
}
|
}
|
||||||
|
@ -91,9 +91,9 @@ int l_lovrDataNewSoundData(lua_State* L) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
AudioStream** audioStream;
|
AudioStream* audioStream = luax_totype(L, 1, AudioStream);
|
||||||
if ((audioStream = luax_totype(L, 1, AudioStream)) != NULL) {
|
if (audioStream) {
|
||||||
SoundData* soundData = lovrSoundDataCreateFromAudioStream(*audioStream);
|
SoundData* soundData = lovrSoundDataCreateFromAudioStream(audioStream);
|
||||||
luax_pushobject(L, soundData);
|
luax_pushobject(L, soundData);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,15 +219,15 @@ static void stencilCallback(void* userdata) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static TextureData* luax_checktexturedata(lua_State* L, int index) {
|
static TextureData* luax_checktexturedata(lua_State* L, int index) {
|
||||||
void** type;
|
TextureData* textureData = luax_totype(L, index, TextureData);
|
||||||
if ((type = luax_totype(L, index, TextureData)) != NULL) {
|
|
||||||
return *type;
|
if (!textureData) {
|
||||||
} else {
|
|
||||||
Blob* blob = luax_readblob(L, index, "Texture");
|
Blob* blob = luax_readblob(L, index, "Texture");
|
||||||
TextureData* textureData = lovrTextureDataFromBlob(blob);
|
textureData = lovrTextureDataFromBlob(blob);
|
||||||
lovrRelease(blob);
|
lovrRelease(blob);
|
||||||
return textureData;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return textureData;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Base
|
// Base
|
||||||
|
@ -802,7 +802,7 @@ int l_lovrGraphicsSphere(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrGraphicsSkybox(lua_State* L) {
|
int l_lovrGraphicsSkybox(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
float angle = luaL_optnumber(L, 2, 0);
|
float angle = luaL_optnumber(L, 2, 0);
|
||||||
float ax = luaL_optnumber(L, 3, 0);
|
float ax = luaL_optnumber(L, 3, 0);
|
||||||
float ay = luaL_optnumber(L, 4, 1);
|
float ay = luaL_optnumber(L, 4, 1);
|
||||||
|
@ -837,7 +837,7 @@ int l_lovrGraphicsStencil(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrGraphicsFill(lua_State* L) {
|
int l_lovrGraphicsFill(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
lovrGraphicsFill(texture);
|
lovrGraphicsFill(texture);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -890,11 +890,9 @@ int l_lovrGraphicsNewCanvas(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrGraphicsNewFont(lua_State* L) {
|
int l_lovrGraphicsNewFont(lua_State* L) {
|
||||||
Rasterizer* rasterizer;
|
Rasterizer* rasterizer = luax_totype(L, 1, Rasterizer);
|
||||||
void** type;
|
|
||||||
if ((type = luax_totype(L, 1, Rasterizer)) != NULL) {
|
if (!rasterizer) {
|
||||||
rasterizer = *type;
|
|
||||||
} else {
|
|
||||||
Blob* blob = NULL;
|
Blob* blob = NULL;
|
||||||
float size;
|
float size;
|
||||||
|
|
||||||
|
@ -930,7 +928,7 @@ int l_lovrGraphicsNewMaterial(lua_State* L) {
|
||||||
lovrRelease(textureData);
|
lovrRelease(textureData);
|
||||||
lovrRelease(texture);
|
lovrRelease(texture);
|
||||||
} else if (lua_isuserdata(L, index)) {
|
} else if (lua_isuserdata(L, index)) {
|
||||||
Texture* texture = luax_checktypeof(L, index, Texture);
|
Texture* texture = luax_checktype(L, index, Texture);
|
||||||
lovrMaterialSetTexture(material, TEXTURE_DIFFUSE, texture);
|
lovrMaterialSetTexture(material, TEXTURE_DIFFUSE, texture);
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
@ -1005,11 +1003,9 @@ int l_lovrGraphicsNewMesh(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrGraphicsNewModel(lua_State* L) {
|
int l_lovrGraphicsNewModel(lua_State* L) {
|
||||||
ModelData* modelData;
|
ModelData* modelData = luax_totype(L, 1, ModelData);
|
||||||
void** type;
|
|
||||||
if ((type = luax_totype(L, 1, ModelData)) != NULL) {
|
if (!modelData) {
|
||||||
modelData = *type;
|
|
||||||
} else {
|
|
||||||
Blob* blob = luax_readblob(L, 1, "Model");
|
Blob* blob = luax_readblob(L, 1, "Model");
|
||||||
modelData = lovrModelDataCreate(blob);
|
modelData = lovrModelDataCreate(blob);
|
||||||
lovrRelease(blob);
|
lovrRelease(blob);
|
||||||
|
@ -1042,9 +1038,9 @@ int l_lovrGraphicsNewModel(lua_State* L) {
|
||||||
int l_lovrGraphicsNewShader(lua_State* L) {
|
int l_lovrGraphicsNewShader(lua_State* L) {
|
||||||
for (int i = 1; i <= 2; i++) {
|
for (int i = 1; i <= 2; i++) {
|
||||||
if (lua_isnoneornil(L, i)) continue;
|
if (lua_isnoneornil(L, i)) continue;
|
||||||
Blob** blob = luax_totype(L, i, Blob);
|
Blob* blob = luax_totype(L, i, Blob);
|
||||||
if (blob) {
|
if (blob) {
|
||||||
lua_pushlstring(L, (*blob)->data, (*blob)->size);
|
lua_pushlstring(L, blob->data, blob->size);
|
||||||
lua_replace(L, i);
|
lua_replace(L, i);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,25 +2,25 @@
|
||||||
#include "data/blob.h"
|
#include "data/blob.h"
|
||||||
|
|
||||||
int l_lovrBlobGetName(lua_State* L) {
|
int l_lovrBlobGetName(lua_State* L) {
|
||||||
Blob* blob = luax_checktypeof(L, 1, Blob);
|
Blob* blob = luax_checktype(L, 1, Blob);
|
||||||
lua_pushstring(L, blob->name);
|
lua_pushstring(L, blob->name);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrBlobGetPointer(lua_State* L) {
|
int l_lovrBlobGetPointer(lua_State* L) {
|
||||||
Blob* blob = luax_checktypeof(L, 1, Blob);
|
Blob* blob = luax_checktype(L, 1, Blob);
|
||||||
lua_pushlightuserdata(L, blob->data);
|
lua_pushlightuserdata(L, blob->data);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrBlobGetSize(lua_State* L) {
|
int l_lovrBlobGetSize(lua_State* L) {
|
||||||
Blob* blob = luax_checktypeof(L, 1, Blob);
|
Blob* blob = luax_checktype(L, 1, Blob);
|
||||||
lua_pushinteger(L, blob->size);
|
lua_pushinteger(L, blob->size);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrBlobGetString(lua_State* L) {
|
int l_lovrBlobGetString(lua_State* L) {
|
||||||
Blob* blob = luax_checktypeof(L, 1, Blob);
|
Blob* blob = luax_checktype(L, 1, Blob);
|
||||||
lua_pushlstring(L, blob->data, blob->size);
|
lua_pushlstring(L, blob->data, blob->size);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,14 +17,14 @@ int l_lovrColliderGetWorld(lua_State* L) {
|
||||||
|
|
||||||
int l_lovrColliderAddShape(lua_State* L) {
|
int l_lovrColliderAddShape(lua_State* L) {
|
||||||
Collider* collider = luax_checktype(L, 1, Collider);
|
Collider* collider = luax_checktype(L, 1, Collider);
|
||||||
Shape* shape = luax_checktypeof(L, 2, Shape);
|
Shape* shape = luax_checktype(L, 2, Shape);
|
||||||
lovrColliderAddShape(collider, shape);
|
lovrColliderAddShape(collider, shape);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrColliderRemoveShape(lua_State* L) {
|
int l_lovrColliderRemoveShape(lua_State* L) {
|
||||||
Collider* collider = luax_checktype(L, 1, Collider);
|
Collider* collider = luax_checktype(L, 1, Collider);
|
||||||
Shape* shape = luax_checktypeof(L, 2, Shape);
|
Shape* shape = luax_checktype(L, 2, Shape);
|
||||||
lovrColliderRemoveShape(collider, shape);
|
lovrColliderRemoveShape(collider, shape);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
#include "physics/physics.h"
|
#include "physics/physics.h"
|
||||||
|
|
||||||
int l_lovrJointDestroy(lua_State* L) {
|
int l_lovrJointDestroy(lua_State* L) {
|
||||||
Joint* joint = luax_checktypeof(L, 1, Joint);
|
Joint* joint = luax_checktype(L, 1, Joint);
|
||||||
lovrJointDestroyData(joint);
|
lovrJointDestroyData(joint);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrJointGetType(lua_State* L) {
|
int l_lovrJointGetType(lua_State* L) {
|
||||||
Joint* joint = luax_checktypeof(L, 1, Joint);
|
Joint* joint = luax_checktype(L, 1, Joint);
|
||||||
lua_pushstring(L, JointTypes[lovrJointGetType(joint)]);
|
lua_pushstring(L, JointTypes[lovrJointGetType(joint)]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -24,14 +24,14 @@ int l_lovrJointGetColliders(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrJointGetUserData(lua_State* L) {
|
int l_lovrJointGetUserData(lua_State* L) {
|
||||||
Joint* joint = luax_checktypeof(L, 1, Joint);
|
Joint* joint = luax_checktype(L, 1, Joint);
|
||||||
int ref = (int) lovrJointGetUserData(joint);
|
int ref = (int) lovrJointGetUserData(joint);
|
||||||
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
|
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrJointSetUserData(lua_State* L) {
|
int l_lovrJointSetUserData(lua_State* L) {
|
||||||
Joint* joint = luax_checktypeof(L, 1, Joint);
|
Joint* joint = luax_checktype(L, 1, Joint);
|
||||||
uint64_t ref = (int) lovrJointGetUserData(joint);
|
uint64_t ref = (int) lovrJointGetUserData(joint);
|
||||||
if (ref) {
|
if (ref) {
|
||||||
luaL_unref(L, LUA_REGISTRYINDEX, ref);
|
luaL_unref(L, LUA_REGISTRYINDEX, ref);
|
||||||
|
|
|
@ -57,7 +57,7 @@ int l_lovrMaterialSetTexture(lua_State* L) {
|
||||||
textureType = luaL_checkoption(L, index, NULL, MaterialTextures);
|
textureType = luaL_checkoption(L, index, NULL, MaterialTextures);
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
Texture* texture = lua_isnoneornil(L, index) ? NULL : luax_checktypeof(L, index, Texture);
|
Texture* texture = lua_isnoneornil(L, index) ? NULL : luax_checktype(L, index, Texture);
|
||||||
lovrMaterialSetTexture(material, textureType, texture);
|
lovrMaterialSetTexture(material, textureType, texture);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -193,7 +193,7 @@ int l_lovrMeshGetVertexMap(lua_State* L) {
|
||||||
if (lua_istable(L, 2)) {
|
if (lua_istable(L, 2)) {
|
||||||
lua_settop(L, 2);
|
lua_settop(L, 2);
|
||||||
} else if (lua_isuserdata(L, 2)) {
|
} else if (lua_isuserdata(L, 2)) {
|
||||||
Blob* blob = luax_checktypeof(L, 2, Blob);
|
Blob* blob = luax_checktype(L, 2, Blob);
|
||||||
lovrAssert(size * count <= blob->size, "Mesh vertex map is %zu bytes, but Blob can only hold %zu", size * count, blob->size);
|
lovrAssert(size * count <= blob->size, "Mesh vertex map is %zu bytes, but Blob can only hold %zu", size * count, blob->size);
|
||||||
memcpy(blob->data, indices.raw, size * count);
|
memcpy(blob->data, indices.raw, size * count);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -220,7 +220,7 @@ int l_lovrMeshSetVertexMap(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lua_type(L, 2) == LUA_TUSERDATA) {
|
if (lua_type(L, 2) == LUA_TUSERDATA) {
|
||||||
Blob* blob = luax_checktypeof(L, 2, Blob);
|
Blob* blob = luax_checktype(L, 2, Blob);
|
||||||
size_t size = luaL_optinteger(L, 3, 4);
|
size_t size = luaL_optinteger(L, 3, 4);
|
||||||
lovrAssert(size == 2 || size == 4, "Size of Mesh indices should be 2 bytes or 4 bytes");
|
lovrAssert(size == 2 || size == 4, "Size of Mesh indices should be 2 bytes or 4 bytes");
|
||||||
uint32_t count = blob->size / size;
|
uint32_t count = blob->size / size;
|
||||||
|
|
|
@ -46,8 +46,8 @@ int l_lovrModelDataGetNodeName(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int luax_writenodetransform(lua_State* L, mat4 m, int transformIndex) {
|
static int luax_writenodetransform(lua_State* L, mat4 m, int transformIndex) {
|
||||||
Transform* transform;
|
Transform* transform = luax_totype(L, transformIndex, Transform);
|
||||||
if ((transform = luax_totype(L, transformIndex, Transform)) != NULL) {
|
if (transform) {
|
||||||
lovrTransformSetMatrix(transform, m);
|
lovrTransformSetMatrix(transform, m);
|
||||||
lua_settop(L, transformIndex);
|
lua_settop(L, transformIndex);
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -57,15 +57,15 @@ int l_lovrShaderSend(lua_State* L) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Blob** blob = luax_totype(L, 3, Blob);
|
Blob* blob = luax_totype(L, 3, Blob);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case UNIFORM_FLOAT:
|
case UNIFORM_FLOAT:
|
||||||
if (blob) {
|
if (blob) {
|
||||||
n = count;
|
n = count;
|
||||||
floats = (float*) (*blob)->data;
|
floats = (float*) blob->data;
|
||||||
size_t count = n * components;
|
size_t count = n * components;
|
||||||
size_t capacity = (*blob)->size / sizeof(float);
|
size_t capacity = blob->size / sizeof(float);
|
||||||
const char* s = capacity == 1 ? "" : "s";
|
const char* s = capacity == 1 ? "" : "s";
|
||||||
lovrAssert(capacity >= count, "Blob can only hold %d float%s, at least %d needed", capacity, s, count);
|
lovrAssert(capacity >= count, "Blob can only hold %d float%s, at least %d needed", capacity, s, count);
|
||||||
} else if (components == 1) {
|
} else if (components == 1) {
|
||||||
|
@ -91,9 +91,9 @@ int l_lovrShaderSend(lua_State* L) {
|
||||||
case UNIFORM_INT:
|
case UNIFORM_INT:
|
||||||
if (blob) {
|
if (blob) {
|
||||||
n = count;
|
n = count;
|
||||||
ints = (int*) (*blob)->data;
|
ints = (int*) blob->data;
|
||||||
size_t count = n * components;
|
size_t count = n * components;
|
||||||
size_t capacity = (*blob)->size / sizeof(int);
|
size_t capacity = blob->size / sizeof(int);
|
||||||
const char* s = capacity == 1 ? "" : "s";
|
const char* s = capacity == 1 ? "" : "s";
|
||||||
lovrAssert(capacity >= count, "Blob can only hold %d int%s, at least %d needed", capacity, s, count);
|
lovrAssert(capacity >= count, "Blob can only hold %d int%s, at least %d needed", capacity, s, count);
|
||||||
} else if (components == 1) {
|
} else if (components == 1) {
|
||||||
|
@ -119,9 +119,9 @@ int l_lovrShaderSend(lua_State* L) {
|
||||||
case UNIFORM_MATRIX:
|
case UNIFORM_MATRIX:
|
||||||
if (blob) {
|
if (blob) {
|
||||||
n = count;
|
n = count;
|
||||||
floats = (float*) (*blob)->data;
|
floats = (float*) blob->data;
|
||||||
size_t count = n * components * components;
|
size_t count = n * components * components;
|
||||||
size_t capacity = (*blob)->size / sizeof(float);
|
size_t capacity = blob->size / sizeof(float);
|
||||||
const char* s = capacity == 1 ? "x" : "ces";
|
const char* s = capacity == 1 ? "x" : "ces";
|
||||||
lovrAssert(capacity >= count, "Blob can only hold %d matri%s, at least %d needed", capacity, s, count);
|
lovrAssert(capacity >= count, "Blob can only hold %d matri%s, at least %d needed", capacity, s, count);
|
||||||
} else if (components == 4 && lua_isuserdata(L, 3)) {
|
} else if (components == 4 && lua_isuserdata(L, 3)) {
|
||||||
|
@ -144,12 +144,12 @@ int l_lovrShaderSend(lua_State* L) {
|
||||||
|
|
||||||
case UNIFORM_SAMPLER:
|
case UNIFORM_SAMPLER:
|
||||||
if (components == 1) {
|
if (components == 1) {
|
||||||
textures[0] = luax_checktypeof(L, 3, Texture);
|
textures[0] = luax_checktype(L, 3, Texture);
|
||||||
} else {
|
} else {
|
||||||
luaL_checktype(L, 3, LUA_TTABLE);
|
luaL_checktype(L, 3, LUA_TTABLE);
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
lua_rawgeti(L, -1, i + 1);
|
lua_rawgeti(L, -1, i + 1);
|
||||||
textures[i] = luax_checktypeof(L, -1, Texture);
|
textures[i] = luax_checktype(L, -1, Texture);
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,45 +2,45 @@
|
||||||
#include "physics/physics.h"
|
#include "physics/physics.h"
|
||||||
|
|
||||||
int l_lovrShapeDestroy(lua_State* L) {
|
int l_lovrShapeDestroy(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
lovrShapeDestroyData(shape);
|
lovrShapeDestroyData(shape);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeGetType(lua_State* L) {
|
int l_lovrShapeGetType(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
lua_pushstring(L, ShapeTypes[lovrShapeGetType(shape)]);
|
lua_pushstring(L, ShapeTypes[lovrShapeGetType(shape)]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeGetCollider(lua_State* L) {
|
int l_lovrShapeGetCollider(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
luax_pushobject(L, lovrShapeGetCollider(shape));
|
luax_pushobject(L, lovrShapeGetCollider(shape));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeIsEnabled(lua_State* L) {
|
int l_lovrShapeIsEnabled(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
lua_pushboolean(L, lovrShapeIsEnabled(shape));
|
lua_pushboolean(L, lovrShapeIsEnabled(shape));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeSetEnabled(lua_State* L) {
|
int l_lovrShapeSetEnabled(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
bool enabled = lua_toboolean(L, 2);
|
bool enabled = lua_toboolean(L, 2);
|
||||||
lovrShapeSetEnabled(shape, enabled);
|
lovrShapeSetEnabled(shape, enabled);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeGetUserData(lua_State* L) {
|
int l_lovrShapeGetUserData(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
int ref = (int) lovrShapeGetUserData(shape);
|
int ref = (int) lovrShapeGetUserData(shape);
|
||||||
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
|
lua_rawgeti(L, LUA_REGISTRYINDEX, ref);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeSetUserData(lua_State* L) {
|
int l_lovrShapeSetUserData(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
uint64_t ref = (int) lovrShapeGetUserData(shape);
|
uint64_t ref = (int) lovrShapeGetUserData(shape);
|
||||||
if (ref) {
|
if (ref) {
|
||||||
luaL_unref(L, LUA_REGISTRYINDEX, ref);
|
luaL_unref(L, LUA_REGISTRYINDEX, ref);
|
||||||
|
@ -57,7 +57,7 @@ int l_lovrShapeSetUserData(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeGetPosition(lua_State* L) {
|
int l_lovrShapeGetPosition(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
lovrShapeGetPosition(shape, &x, &y, &z);
|
lovrShapeGetPosition(shape, &x, &y, &z);
|
||||||
lua_pushnumber(L, x);
|
lua_pushnumber(L, x);
|
||||||
|
@ -67,7 +67,7 @@ int l_lovrShapeGetPosition(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeSetPosition(lua_State* L) {
|
int l_lovrShapeSetPosition(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
float x = luaL_checknumber(L, 2);
|
float x = luaL_checknumber(L, 2);
|
||||||
float y = luaL_checknumber(L, 3);
|
float y = luaL_checknumber(L, 3);
|
||||||
float z = luaL_checknumber(L, 4);
|
float z = luaL_checknumber(L, 4);
|
||||||
|
@ -76,7 +76,7 @@ int l_lovrShapeSetPosition(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeGetOrientation(lua_State* L) {
|
int l_lovrShapeGetOrientation(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
float angle, x, y, z;
|
float angle, x, y, z;
|
||||||
lovrShapeGetOrientation(shape, &angle, &x, &y, &z);
|
lovrShapeGetOrientation(shape, &angle, &x, &y, &z);
|
||||||
lua_pushnumber(L, angle);
|
lua_pushnumber(L, angle);
|
||||||
|
@ -87,7 +87,7 @@ int l_lovrShapeGetOrientation(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeSetOrientation(lua_State* L) {
|
int l_lovrShapeSetOrientation(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
float angle = luaL_checknumber(L, 2);
|
float angle = luaL_checknumber(L, 2);
|
||||||
float x = luaL_checknumber(L, 3);
|
float x = luaL_checknumber(L, 3);
|
||||||
float y = luaL_checknumber(L, 4);
|
float y = luaL_checknumber(L, 4);
|
||||||
|
@ -97,7 +97,7 @@ int l_lovrShapeSetOrientation(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrShapeGetMass(lua_State* L) {
|
int l_lovrShapeGetMass(lua_State* L) {
|
||||||
Shape* shape = luax_checktypeof(L, 1, Shape);
|
Shape* shape = luax_checktype(L, 1, Shape);
|
||||||
float density = luaL_checknumber(L, 2);
|
float density = luaL_checknumber(L, 2);
|
||||||
float cx, cy, cz, mass;
|
float cx, cy, cz, mass;
|
||||||
float inertia[6];
|
float inertia[6];
|
||||||
|
|
|
@ -7,13 +7,13 @@ int luax_optmipmap(lua_State* L, int index, Texture* texture) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrTextureGetDepth(lua_State* L) {
|
int l_lovrTextureGetDepth(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
lua_pushnumber(L, lovrTextureGetDepth(texture, luax_optmipmap(L, 2, texture)));
|
lua_pushnumber(L, lovrTextureGetDepth(texture, luax_optmipmap(L, 2, texture)));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrTextureGetDimensions(lua_State* L) {
|
int l_lovrTextureGetDimensions(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
int mipmap = luax_optmipmap(L, 2, texture);
|
int mipmap = luax_optmipmap(L, 2, texture);
|
||||||
lua_pushinteger(L, lovrTextureGetWidth(texture, mipmap));
|
lua_pushinteger(L, lovrTextureGetWidth(texture, mipmap));
|
||||||
lua_pushinteger(L, lovrTextureGetHeight(texture, mipmap));
|
lua_pushinteger(L, lovrTextureGetHeight(texture, mipmap));
|
||||||
|
@ -25,7 +25,7 @@ int l_lovrTextureGetDimensions(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrTextureGetFilter(lua_State* L) {
|
int l_lovrTextureGetFilter(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
TextureFilter filter = lovrTextureGetFilter(texture);
|
TextureFilter filter = lovrTextureGetFilter(texture);
|
||||||
lua_pushstring(L, FilterModes[filter.mode]);
|
lua_pushstring(L, FilterModes[filter.mode]);
|
||||||
lua_pushnumber(L, filter.sharpness);
|
lua_pushnumber(L, filter.sharpness);
|
||||||
|
@ -37,7 +37,7 @@ int l_lovrTextureGetFilter(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrTextureGetHeight(lua_State* L) {
|
int l_lovrTextureGetHeight(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
lua_pushnumber(L, lovrTextureGetHeight(texture, luax_optmipmap(L, 2, texture)));
|
lua_pushnumber(L, lovrTextureGetHeight(texture, luax_optmipmap(L, 2, texture)));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -49,19 +49,19 @@ int l_lovrTextureGetMipmapCount(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrTextureGetType(lua_State* L) {
|
int l_lovrTextureGetType(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
lua_pushstring(L, TextureTypes[lovrTextureGetType(texture)]);
|
lua_pushstring(L, TextureTypes[lovrTextureGetType(texture)]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrTextureGetWidth(lua_State* L) {
|
int l_lovrTextureGetWidth(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
lua_pushnumber(L, lovrTextureGetWidth(texture, luax_optmipmap(L, 2, texture)));
|
lua_pushnumber(L, lovrTextureGetWidth(texture, luax_optmipmap(L, 2, texture)));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrTextureGetWrap(lua_State* L) {
|
int l_lovrTextureGetWrap(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
TextureWrap wrap = lovrTextureGetWrap(texture);
|
TextureWrap wrap = lovrTextureGetWrap(texture);
|
||||||
lua_pushstring(L, WrapModes[wrap.s]);
|
lua_pushstring(L, WrapModes[wrap.s]);
|
||||||
lua_pushstring(L, WrapModes[wrap.t]);
|
lua_pushstring(L, WrapModes[wrap.t]);
|
||||||
|
@ -84,7 +84,7 @@ int l_lovrTextureReplacePixels(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrTextureSetFilter(lua_State* L) {
|
int l_lovrTextureSetFilter(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
FilterMode mode = luaL_checkoption(L, 2, NULL, FilterModes);
|
FilterMode mode = luaL_checkoption(L, 2, NULL, FilterModes);
|
||||||
float sharpness = luaL_optnumber(L, 3, 0.);
|
float sharpness = luaL_optnumber(L, 3, 0.);
|
||||||
float anisotropy = luaL_optnumber(L, 4, 1.);
|
float anisotropy = luaL_optnumber(L, 4, 1.);
|
||||||
|
@ -94,7 +94,7 @@ int l_lovrTextureSetFilter(lua_State* L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int l_lovrTextureSetWrap(lua_State* L) {
|
int l_lovrTextureSetWrap(lua_State* L) {
|
||||||
Texture* texture = luax_checktypeof(L, 1, Texture);
|
Texture* texture = luax_checktype(L, 1, Texture);
|
||||||
TextureWrap wrap;
|
TextureWrap wrap;
|
||||||
wrap.s = luaL_checkoption(L, 2, NULL, WrapModes);
|
wrap.s = luaL_checkoption(L, 2, NULL, WrapModes);
|
||||||
wrap.t = luaL_checkoption(L, 3, luaL_checkstring(L, 2), WrapModes);
|
wrap.t = luaL_checkoption(L, 3, luaL_checkstring(L, 2), WrapModes);
|
||||||
|
|
|
@ -129,8 +129,8 @@ int l_lovrWorldOverlaps(lua_State* L) {
|
||||||
|
|
||||||
int l_lovrWorldCollide(lua_State* L) {
|
int l_lovrWorldCollide(lua_State* L) {
|
||||||
World* world = luax_checktype(L, 1, World);
|
World* world = luax_checktype(L, 1, World);
|
||||||
Shape* a = luax_checktypeof(L, 2, Shape);
|
Shape* a = luax_checktype(L, 2, Shape);
|
||||||
Shape* b = luax_checktypeof(L, 3, Shape);
|
Shape* b = luax_checktype(L, 3, Shape);
|
||||||
float friction = luaL_optnumber(L, 4, -1);
|
float friction = luaL_optnumber(L, 4, -1);
|
||||||
float restitution = luaL_optnumber(L, 5, -1);
|
float restitution = luaL_optnumber(L, 5, -1);
|
||||||
lua_pushboolean(L, lovrWorldCollide(world, a, b, friction, restitution));
|
lua_pushboolean(L, lovrWorldCollide(world, a, b, friction, restitution));
|
||||||
|
|
|
@ -1053,7 +1053,9 @@ Canvas* lovrCanvasCreate(int width, int height, TextureFormat format, CanvasFlag
|
||||||
if (!texture) return NULL;
|
if (!texture) return NULL;
|
||||||
|
|
||||||
Canvas* canvas = lovrAlloc(Canvas, lovrCanvasDestroy);
|
Canvas* canvas = lovrAlloc(Canvas, lovrCanvasDestroy);
|
||||||
|
Ref ref = canvas->texture.ref;
|
||||||
canvas->texture = *texture;
|
canvas->texture = *texture;
|
||||||
|
canvas->texture.ref = ref;
|
||||||
canvas->flags = flags;
|
canvas->flags = flags;
|
||||||
|
|
||||||
// Framebuffer
|
// Framebuffer
|
||||||
|
|
33
src/luax.c
33
src/luax.c
|
@ -85,17 +85,34 @@ void luax_extendtype(lua_State* L, const char* base, const char* name, const lua
|
||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* luax_testudata(lua_State* L, int index, const char* type) {
|
void* _luax_totype(lua_State* L, int index, const char* type) {
|
||||||
void* p = lua_touserdata(L, index);
|
void** p = lua_touserdata(L, index);
|
||||||
|
|
||||||
if (!p || !lua_getmetatable(L, index)) {
|
if (p) {
|
||||||
return NULL;
|
Ref* object = *(Ref**) p;
|
||||||
|
if (!strcmp(object->type, type)) {
|
||||||
|
return object;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lua_getmetatable(L, index)) {
|
||||||
|
lua_getfield(L, -1, "super");
|
||||||
|
const char* super = lua_tostring(L, -1);
|
||||||
|
lua_pop(L, 2);
|
||||||
|
return (!super || strcmp(super, type)) ? NULL : object;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
luaL_getmetatable(L, type);
|
return NULL;
|
||||||
int equal = lua_rawequal(L, -1, -2);
|
}
|
||||||
lua_pop(L, 2);
|
|
||||||
return equal ? p : NULL;
|
void* _luax_checktype(lua_State* L, int index, const char* type) {
|
||||||
|
void* object = _luax_totype(L, index, type);
|
||||||
|
|
||||||
|
if (!object) {
|
||||||
|
luaL_typerror(L, index, type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Registers the userdata on the top of the stack in the registry.
|
// Registers the userdata on the top of the stack in the registry.
|
||||||
|
|
18
src/luax.h
18
src/luax.h
|
@ -6,26 +6,16 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#define STRINGIFY(x) #x
|
#define luax_totype(L, i, T) ((T*) _luax_totype(L, i, #T))
|
||||||
|
#define luax_checktype(L, i, T) ((T*) _luax_checktype(L, i, #T))
|
||||||
#define luax_totype(L, i, T) (luax_testudata(L, i, #T))
|
|
||||||
#define luax_checktype(L, i, T) *(T**) luaL_checkudata(L, i, #T)
|
|
||||||
#define luax_checktypeof(L, i, T) \
|
|
||||||
*(T**) (luaL_argcheck(L, lua_touserdata(L, i), i, "Expected " STRINGIFY(T)), \
|
|
||||||
lua_getmetatable(L, i), \
|
|
||||||
lua_getfield(L, -1, "name"), \
|
|
||||||
lua_getfield(L, -2, "super"), \
|
|
||||||
lua_pushstring(L, #T), \
|
|
||||||
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))
|
|
||||||
|
|
||||||
int luax_preloadmodule(lua_State* L, const char* key, lua_CFunction f);
|
int luax_preloadmodule(lua_State* L, const char* key, lua_CFunction f);
|
||||||
int luax_emptymodule(lua_State* L);
|
int luax_emptymodule(lua_State* L);
|
||||||
void luax_registerloader(lua_State* L, lua_CFunction loader, int index);
|
void luax_registerloader(lua_State* L, lua_CFunction loader, int index);
|
||||||
void luax_registertype(lua_State* L, const char* name, const luaL_Reg* functions);
|
void luax_registertype(lua_State* L, const char* name, const luaL_Reg* functions);
|
||||||
void luax_extendtype(lua_State* L, const char* base, const char* name, const luaL_Reg* baseFunctions, const luaL_Reg* functions);
|
void luax_extendtype(lua_State* L, const char* base, const char* name, const luaL_Reg* baseFunctions, const luaL_Reg* functions);
|
||||||
void* luax_testudata(lua_State* L, int index, const char* type);
|
void* _luax_totype(lua_State* L, int index, const char* type);
|
||||||
|
void* _luax_checktype(lua_State* L, int index, const char* type);
|
||||||
void luax_pushobject(lua_State* L, void* object);
|
void luax_pushobject(lua_State* L, void* object);
|
||||||
int luax_getstack(lua_State* L);
|
int luax_getstack(lua_State* L);
|
||||||
void luax_pushconf(lua_State* L);
|
void luax_pushconf(lua_State* L);
|
||||||
|
|
Loading…
Reference in New Issue