From dd1db4c86f659c1622487f64ce24d021daf28213 Mon Sep 17 00:00:00 2001 From: bjorn Date: Wed, 21 Jun 2017 19:42:34 -0700 Subject: [PATCH] lovr.graphics.box; Better non-uniform scale; --- src/api/graphics.c | 19 ++++++++++++++----- src/api/lovr.h | 2 +- src/api/math.c | 2 +- src/api/types/mesh.c | 2 +- src/api/types/model.c | 2 +- src/api/types/transform.c | 15 +++++++++++---- src/graphics/graphics.c | 4 ++-- src/graphics/graphics.h | 2 +- src/math/mat4.c | 4 ++-- src/math/mat4.h | 2 +- 10 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/api/graphics.c b/src/api/graphics.c index 25db704a..f75e25ab 100644 --- a/src/api/graphics.c +++ b/src/api/graphics.c @@ -463,7 +463,7 @@ int l_lovrGraphicsScale(lua_State* L) { int l_lovrGraphicsTransform(lua_State* L) { float transform[16]; - luax_readtransform(L, 1, transform); + luax_readtransform(L, 1, transform, 0); lovrGraphicsMatrixTransform(transform); return 0; } @@ -526,7 +526,7 @@ int l_lovrGraphicsPlane(lua_State* L) { return 0; } -int l_lovrGraphicsCube(lua_State* L) { +static int luax_rectangularprism(lua_State* L, int uniformScale) { Texture* texture = NULL; DrawMode drawMode; if (lua_isstring(L, 1)) { @@ -536,15 +536,23 @@ int l_lovrGraphicsCube(lua_State* L) { texture = luax_checktype(L, 1, Texture); } float transform[16]; - luax_readtransform(L, 2, transform); - lovrGraphicsCube(drawMode, texture, transform); + luax_readtransform(L, 2, transform, uniformScale); + lovrGraphicsBox(drawMode, texture, transform); return 0; } +int l_lovrGraphicsCube(lua_State* L) { + return luax_rectangularprism(L, 1); +} + +int l_lovrGraphicsBox(lua_State* L) { + return luax_rectangularprism(L, 0); +} + int l_lovrGraphicsPrint(lua_State* L) { const char* str = luaL_checkstring(L, 1); float transform[16]; - int index = luax_readtransform(L, 2, transform); + int index = luax_readtransform(L, 2, transform, 1); float wrap = luaL_optnumber(L, index++, 0); HorizontalAlign halign = *(HorizontalAlign*) luax_optenum(L, index++, "center", &HorizontalAligns, "alignment"); VerticalAlign valign = *(VerticalAlign*) luax_optenum(L, index++, "middle", &VerticalAligns, "alignment"); @@ -809,6 +817,7 @@ const luaL_Reg lovrGraphics[] = { { "triangle", l_lovrGraphicsTriangle }, { "plane", l_lovrGraphicsPlane }, { "cube", l_lovrGraphicsCube }, + { "box", l_lovrGraphicsBox }, { "print", l_lovrGraphicsPrint }, { "cylinder", l_lovrGraphicsCylinder }, { "getWidth", l_lovrGraphicsGetWidth }, diff --git a/src/api/lovr.h b/src/api/lovr.h index 135caa13..d3ae67cd 100644 --- a/src/api/lovr.h +++ b/src/api/lovr.h @@ -67,7 +67,7 @@ extern map_int_t VerticalAligns; extern map_int_t WrapModes; void luax_checkmeshformat(lua_State* L, int index, MeshFormat* format); -int luax_readtransform(lua_State* L, int index, mat4 transform); +int luax_readtransform(lua_State* L, int index, mat4 transform, int uniformScale); 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); diff --git a/src/api/math.c b/src/api/math.c index 1651d2d5..e37fbc20 100644 --- a/src/api/math.c +++ b/src/api/math.c @@ -11,7 +11,7 @@ int l_lovrMathInit(lua_State* L) { int l_lovrMathNewTransform(lua_State* L) { float matrix[16]; - luax_readtransform(L, 1, matrix); + luax_readtransform(L, 1, matrix, 0); Transform* transform = lovrTransformCreate(matrix); luax_pushtype(L, Transform, transform); lovrRelease(&transform->ref); diff --git a/src/api/types/mesh.c b/src/api/types/mesh.c index e7ceabd2..e160c556 100644 --- a/src/api/types/mesh.c +++ b/src/api/types/mesh.c @@ -30,7 +30,7 @@ void luax_checkmeshformat(lua_State* L, int index, MeshFormat* format) { int l_lovrMeshDraw(lua_State* L) { Mesh* mesh = luax_checktype(L, 1, Mesh); float transform[16]; - luax_readtransform(L, 2, transform); + luax_readtransform(L, 2, transform, 1); lovrMeshDraw(mesh, transform); return 0; } diff --git a/src/api/types/model.c b/src/api/types/model.c index a515bf4b..57e9d38d 100644 --- a/src/api/types/model.c +++ b/src/api/types/model.c @@ -4,7 +4,7 @@ int l_lovrModelDraw(lua_State* L) { Model* model = luax_checktype(L, 1, Model); float transform[16]; - luax_readtransform(L, 2, transform); + luax_readtransform(L, 2, transform, 1); lovrModelDraw(model, transform); return 0; } diff --git a/src/api/types/transform.c b/src/api/types/transform.c index a543e721..7b38ea93 100644 --- a/src/api/types/transform.c +++ b/src/api/types/transform.c @@ -2,17 +2,24 @@ #include "math/mat4.h" #include "math/transform.h" -int luax_readtransform(lua_State* L, int index, mat4 m) { +int luax_readtransform(lua_State* L, int index, mat4 m, int uniformScale) { if (lua_isnumber(L, index)) { float x = luaL_optnumber(L, index++, 0); float y = luaL_optnumber(L, index++, 0); float z = luaL_optnumber(L, index++, 0); - float s = luaL_optnumber(L, index++, 1); + float sx, sy, sz; + if (uniformScale) { + sx = sy = sz = luaL_optnumber(L, index++, 1); + } else { + sx = luaL_optnumber(L, index++, 1); + sy = luaL_optnumber(L, index++, 1); + sz = luaL_optnumber(L, index++, 1); + } float angle = luaL_optnumber(L, index++, 0); float ax = luaL_optnumber(L, index++, 0); float ay = luaL_optnumber(L, index++, 1); float az = luaL_optnumber(L, index++, 0); - mat4_setTransform(m, x, y, z, s, angle, ax, ay, az); + mat4_setTransform(m, x, y, z, sx, sy, sz, angle, ax, ay, az); return index; } else if (lua_isnoneornil(L, index)) { mat4_identity(m); @@ -88,7 +95,7 @@ int l_lovrTransformScale(lua_State* L) { int l_lovrTransformSetTransformation(lua_State* L) { Transform* transform = luax_checktype(L, 1, Transform); lovrTransformOrigin(transform); // Dirty the Transform - luax_readtransform(L, 2, transform->matrix); + luax_readtransform(L, 2, transform->matrix, 0); lua_pushvalue(L, 1); return 1; } diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index c096a69a..0a755206 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -620,7 +620,7 @@ void lovrGraphicsPlane(DrawMode mode, Texture* texture, float x, float y, float float theta = acos(nz); float transform[16]; - mat4_setTransform(transform, x, y, z, size, theta, cx, cy, cz); + mat4_setTransform(transform, x, y, z, size, size, size, theta, cx, cy, cz); lovrGraphicsPush(); lovrGraphicsMatrixTransform(transform); @@ -677,7 +677,7 @@ void lovrGraphicsPlaneFullscreen(Texture* texture) { } } -void lovrGraphicsCube(DrawMode mode, Texture* texture, mat4 transform) { +void lovrGraphicsBox(DrawMode mode, Texture* texture, mat4 transform) { lovrGraphicsPush(); lovrGraphicsMatrixTransform(transform); diff --git a/src/graphics/graphics.h b/src/graphics/graphics.h index e57ba078..2fe53ab3 100644 --- a/src/graphics/graphics.h +++ b/src/graphics/graphics.h @@ -173,7 +173,7 @@ void lovrGraphicsLine(float* points, int count); void lovrGraphicsTriangle(DrawMode mode, float* points); void lovrGraphicsPlane(DrawMode mode, Texture* texture, float x, float y, float z, float size, float nx, float ny, float nz); void lovrGraphicsPlaneFullscreen(Texture* texture); -void lovrGraphicsCube(DrawMode mode, Texture* texture, mat4 transform); +void lovrGraphicsBox(DrawMode mode, Texture* texture, mat4 transform); void lovrGraphicsCylinder(float x1, float y1, float z1, float x2, float y2, float z2, float r1, float r2, int capped, int segments); void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float az); void lovrGraphicsPrint(const char* str, mat4 transform, float wrap, HorizontalAlign halign, VerticalAlign valign); diff --git a/src/math/mat4.c b/src/math/mat4.c index e1072841..c5ec4633 100644 --- a/src/math/mat4.c +++ b/src/math/mat4.c @@ -208,10 +208,10 @@ mat4 mat4_scale(mat4 m, float x, float y, float z) { return m; } -mat4 mat4_setTransform(mat4 m, float x, float y, float z, float s, float angle, float ax, float ay, float az) { +mat4 mat4_setTransform(mat4 m, float x, float y, float z, float sx, float sy, float sz, float angle, float ax, float ay, float az) { mat4_identity(m); mat4_translate(m, x, y, z); - mat4_scale(m, s, s, s); + mat4_scale(m, sx, sy, sz); return mat4_rotate(m, angle, ax, ay, az); } diff --git a/src/math/mat4.h b/src/math/mat4.h index f9936e5a..22f1d579 100644 --- a/src/math/mat4.h +++ b/src/math/mat4.h @@ -14,7 +14,7 @@ mat4 mat4_translate(mat4 m, float x, float y, float z); mat4 mat4_rotate(mat4 m, float angle, float x, float y, float z); mat4 mat4_rotateQuat(mat4 m, quat q); mat4 mat4_scale(mat4 m, float x, float y, float z); -mat4 mat4_setTransform(mat4 m, float x, float y, float z, float s, float angle, float ax, float ay, float az); +mat4 mat4_setTransform(mat4 m, float x, float y, float z, float sx, float sy, float sz, float angle, float ax, float ay, float az); mat4 mat4_orthographic(mat4 m, float left, float right, float top, float bottom, float near, float far); mat4 mat4_perspective(mat4 m, float near, float far, float fov, float aspect); void mat4_transform(mat4 m, vec3 v);