diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index a87052bb..ef241470 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -82,6 +82,18 @@ void lovrGraphicsOrigin() { mat4_setIdentity(vec_last(transforms)); } +void lovrGraphicsTranslate(float x, float y, float z) { + mat4_translate(vec_last(&graphicsState.transforms), x, y, z); +} + +void lovrGraphicsRotate(float w, float x, float y, float z) { + mat4_rotate(vec_last(&graphicsState.transforms), w, x, y, z); +} + +void lovrGraphicsScale(float x, float y, float z) { + mat4_scale(vec_last(&graphicsState.transforms), x, y, z); +} + Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage) { Buffer* buffer = malloc(sizeof(Buffer)); diff --git a/src/graphics/graphics.h b/src/graphics/graphics.h index b57248f2..8fb0e0d7 100644 --- a/src/graphics/graphics.h +++ b/src/graphics/graphics.h @@ -18,6 +18,9 @@ void lovrGraphicsSetShader(Shader* shader); int lovrGraphicsPush(); int lovrGraphicsPop(); void lovrGraphicsOrigin(); +void lovrGraphicsTranslate(float x, float y, float z); +void lovrGraphicsRotate(float w, float x, float y, float z); +void lovrGraphicsScale(float x, float y, float z); Buffer* lovrGraphicsNewBuffer(int size, BufferDrawMode drawMode, BufferUsage usage); Model* lovrGraphicsNewModel(const char* path); Shader* lovrGraphicsNewShader(const char* vertexSource, const char* fragmentSource); diff --git a/src/lovr/graphics.c b/src/lovr/graphics.c index 38f9e590..7eba42db 100644 --- a/src/lovr/graphics.c +++ b/src/lovr/graphics.c @@ -14,6 +14,9 @@ const luaL_Reg lovrGraphics[] = { { "push", l_lovrGraphicsPush }, { "pop", l_lovrGraphicsPop }, { "origin", l_lovrGraphicsOrigin }, + { "translate", l_lovrGraphicsTranslate }, + { "rotate", l_lovrGraphicsRotate }, + { "scale", l_lovrGraphicsScale }, { "newModel", l_lovrGraphicsNewModel }, { "newBuffer", l_lovrGraphicsNewBuffer }, { "newShader", l_lovrGraphicsNewShader }, @@ -108,6 +111,31 @@ int l_lovrGraphicsOrigin(lua_State* L) { return 0; } +int l_lovrGraphicsTranslate(lua_State* L) { + float x = luaL_checknumber(L, 1); + float y = luaL_checknumber(L, 2); + float z = luaL_checknumber(L, 3); + lovrGraphicsTranslate(x, y, z); + return 0; +} + +int l_lovrGraphicsRotate(lua_State* L) { + float w = luaL_checknumber(L, 1); + float x = luaL_checknumber(L, 2); + float y = luaL_checknumber(L, 3); + float z = luaL_checknumber(L, 4); + lovrGraphicsRotate(w, x, y, z); + return 0; +} + +int l_lovrGraphicsScale(lua_State* L) { + float x = luaL_checknumber(L, 1); + float y = luaL_checknumber(L, 2); + float z = luaL_checknumber(L, 3); + lovrGraphicsScale(x, y, z); + return 0; +} + int l_lovrGraphicsNewBuffer(lua_State* L) { const char* userDrawMode = luaL_optstring(L, 2, "fan"); BufferDrawMode* drawMode = (BufferDrawMode*) map_get(&BufferDrawModes, userDrawMode); diff --git a/src/lovr/graphics.h b/src/lovr/graphics.h index 3c646af6..a38a2e62 100644 --- a/src/lovr/graphics.h +++ b/src/lovr/graphics.h @@ -17,6 +17,9 @@ int l_lovrGraphicsSetShader(lua_State* L); int l_lovrGraphicsPush(lua_State* L); int l_lovrGraphicsPop(lua_State* L); int l_lovrGraphicsOrigin(lua_State* L); +int l_lovrGraphicsTranslate(lua_State* L); +int l_lovrGraphicsRotate(lua_State* L); +int l_lovrGraphicsScale(lua_State* L); int l_lovrGraphicsNewBuffer(lua_State* L); int l_lovrGraphicsNewModel(lua_State* L); int l_lovrGraphicsNewShader(lua_State* L);