lovr.graphics.box; Better non-uniform scale;

This commit is contained in:
bjorn 2017-06-21 19:42:34 -07:00
parent a13c793769
commit dd1db4c86f
10 changed files with 35 additions and 19 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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