graphics.cube and Model:draw accept Transform;

This commit is contained in:
bjorn 2017-01-19 19:11:42 -08:00
parent a118a6bff5
commit 5e2cfcc9bd
9 changed files with 36 additions and 37 deletions

View File

@ -499,9 +499,9 @@ void lovrGraphicsPlaneFullscreen(Texture* texture) {
lovrRelease(&lastShader->ref);
}
void lovrGraphicsCube(DrawMode mode, Texture* texture, float x, float y, float z, float size, float angle, float axisX, float axisY, float axisZ) {
void lovrGraphicsCube(DrawMode mode, Texture* texture, mat4 transform) {
lovrGraphicsPush();
lovrGraphicsTransform(x, y, z, size, size, size, angle, axisX, axisY, axisZ);
lovrGraphicsMatrixTransform(transform);
if (mode == DRAW_MODE_LINE) {
float points[] = {

View File

@ -134,5 +134,5 @@ 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, float x, float y, float z, float size, float angle, float axisX, float axisY, float axisZ);
void lovrGraphicsCube(DrawMode mode, Texture* texture, mat4 transform);
void lovrGraphicsSkybox(Skybox* skybox, float angle, float ax, float ay, float az);

View File

@ -140,9 +140,9 @@ void lovrModelDataDestroy(ModelData* modelData) {
free(modelData);
}
void lovrModelDraw(Model* model, float x, float y, float z, float scale, float angle, float ax, float ay, float az) {
void lovrModelDraw(Model* model, mat4 transform) {
lovrGraphicsPush();
lovrGraphicsTransform(x, y, z, scale, scale, scale, angle, ax, ay, az);
lovrGraphicsMatrixTransform(transform);
lovrBufferDraw(model->buffer);
lovrGraphicsPop();
}

View File

@ -58,6 +58,6 @@ typedef struct {
Model* lovrModelCreate(ModelData* modelData);
void lovrModelDestroy(const Ref* ref);
void lovrModelDataDestroy(ModelData* modelData);
void lovrModelDraw(Model* model, float x, float y, float z, float scale, float angle, float ax, float ay, float az);
void lovrModelDraw(Model* model, mat4 transform);
Texture* lovrModelGetTexture(Model* model);
void lovrModelSetTexture(Model* model, Texture* texture);

View File

@ -4,10 +4,12 @@
#include "lovr/types/shader.h"
#include "lovr/types/skybox.h"
#include "lovr/types/texture.h"
#include "lovr/types/transform.h"
#include "graphics/graphics.h"
#include "loaders/model.h"
#include "loaders/texture.h"
#include "filesystem/filesystem.h"
#include "math/mat4.h"
#include "util.h"
#include <math.h>
@ -509,15 +511,9 @@ int l_lovrGraphicsCube(lua_State* L) {
drawMode = DRAW_MODE_FILL;
texture = luax_checktype(L, 1, Texture);
}
float x = luaL_optnumber(L, 2, 0.f);
float y = luaL_optnumber(L, 3, 0.f);
float z = luaL_optnumber(L, 4, 0.f);
float s = luaL_optnumber(L, 5, 1.f);
float angle = luaL_optnumber(L, 6, 0.f);
float axisX = luaL_optnumber(L, 7, 0.f);
float axisY = luaL_optnumber(L, 8, 1.f);
float axisZ = luaL_optnumber(L, 9, 0.f);
lovrGraphicsCube(drawMode, texture, x, y, z, s, angle, axisX, axisY, axisZ);
float transform[16];
luax_readtransform(L, 2, transform);
lovrGraphicsCube(drawMode, texture, transform);
return 0;
}

View File

@ -59,20 +59,8 @@ int l_lovrMathNewTransform(lua_State* L) {
int hasArgs = lua_gettop(L) > 0;
mat4 m = luax_newtransform(L);
mat4_identity(m);
if (hasArgs) {
float x = luaL_checknumber(L, 1);
float y = luaL_checknumber(L, 2);
float z = luaL_checknumber(L, 3);
float s = luaL_optnumber(L, 4, 1);
float angle = luaL_optnumber(L, 5, 0);
float ax = luaL_optnumber(L, 6, 0);
float ay = luaL_optnumber(L, 7, 0);
float az = luaL_optnumber(L, 8, 0);
mat4_translate(m, x, y, z);
mat4_scale(m, s, s, s);
mat4_rotate(m, angle, ax, ay, az);
luax_readtransform(L, 1, m);
}
return 1;
}

View File

@ -1,5 +1,6 @@
#include "lovr/types/model.h"
#include "lovr/types/texture.h"
#include "lovr/types/transform.h"
const luaL_Reg lovrModel[] = {
{ "draw", l_lovrModelDraw },
@ -10,15 +11,9 @@ const luaL_Reg lovrModel[] = {
int l_lovrModelDraw(lua_State* L) {
Model* model = luax_checktype(L, 1, Model);
float x = luaL_optnumber(L, 2, 0.f);
float y = luaL_optnumber(L, 3, 0.f);
float z = luaL_optnumber(L, 4, 0.f);
float scale = luaL_optnumber(L, 5, 1.f);
float angle = luaL_optnumber(L, 6, 0.f);
float ax = luaL_optnumber(L, 7, 0.f);
float ay = luaL_optnumber(L, 8, 1.f);
float az = luaL_optnumber(L, 9, 0.f);
lovrModelDraw(model, x, y, z, scale, angle, ax, ay, az);
float transform[16];
luax_readtransform(L, 2, transform);
lovrModelDraw(model, transform);
return 0;
}

View File

@ -15,6 +15,25 @@ mat4 luax_checktransform(lua_State* L, int i) {
return luaL_checkudata(L, i, "Transform");
}
void luax_readtransform(lua_State* L, int i, mat4 m) {
if (lua_isnumber(L, i)) {
float x = luaL_optnumber(L, i++, 0);
float y = luaL_optnumber(L, i++, 0);
float z = luaL_optnumber(L, i++, 0);
float s = luaL_optnumber(L, i++, 1);
float angle = luaL_optnumber(L, i++, 0);
float ax = luaL_optnumber(L, i++, 0);
float ay = luaL_optnumber(L, i++, 1);
float az = luaL_optnumber(L, i++, 0);
mat4_identity(m);
mat4_translate(m, x, y, z);
mat4_scale(m, s, s, s);
mat4_rotate(m, angle, ax, ay, az);
} else {
mat4_init(m, luax_checktransform(L, i));
}
}
const luaL_Reg lovrTransform[] = {
{ "clone", l_lovrTransformClone },
{ "unpack", l_lovrTransformUnpack },

View File

@ -5,6 +5,7 @@
mat4 luax_newtransform(lua_State* L);
mat4 luax_checktransform(lua_State* L, int i);
void luax_readtransform(lua_State* L, int i, mat4 transform);
extern const luaL_Reg lovrTransform[];
int l_lovrTransformClone(lua_State* L);