1
0
Fork 0
mirror of https://github.com/bjornbytes/lovr.git synced 2024-07-03 04:53:35 +00:00

mat4_setTransform;

This commit is contained in:
bjorn 2017-01-20 20:43:00 -08:00
parent 1f4ecad44b
commit 9e0d8801b6
7 changed files with 30 additions and 18 deletions

View file

@ -344,17 +344,6 @@ void lovrGraphicsScale(float x, float y, float z) {
mat4_scale(state.transforms[state.transform], x, y, z); mat4_scale(state.transforms[state.transform], x, y, z);
} }
void lovrGraphicsTransform(float tx, float ty, float tz, float sx, float sy, float sz, float angle, float ax, float ay, float az) {
// M *= T * S * R
float transform[16];
mat4_identity(transform);
mat4_translate(transform, tx, ty, tz);
mat4_scale(transform, sx, sy, sz);
mat4_rotate(transform, angle, ax, ay, az);
lovrGraphicsMatrixTransform(transform);
}
void lovrGraphicsMatrixTransform(mat4 transform) { void lovrGraphicsMatrixTransform(mat4 transform) {
mat4_multiply(state.transforms[state.transform], transform); mat4_multiply(state.transforms[state.transform], transform);
} }
@ -451,8 +440,11 @@ void lovrGraphicsPlane(DrawMode mode, Texture* texture, float x, float y, float
// Angle between normal vector and the normal vector of the default geometry (dot product) // Angle between normal vector and the normal vector of the default geometry (dot product)
float theta = acos(nz); float theta = acos(nz);
float transform[16];
mat4_setTransform(transform, x, y, z, size, theta, cx, cy, cz);
lovrGraphicsPush(); lovrGraphicsPush();
lovrGraphicsTransform(x, y, z, size, size, size, theta, cx, cy, cz); lovrGraphicsMatrixTransform(transform);
if (mode == DRAW_MODE_LINE) { if (mode == DRAW_MODE_LINE) {
float points[] = { float points[] = {

View file

@ -124,7 +124,6 @@ void lovrGraphicsOrigin();
void lovrGraphicsTranslate(float x, float y, float z); void lovrGraphicsTranslate(float x, float y, float z);
void lovrGraphicsRotate(float angle, float ax, float ay, float az); void lovrGraphicsRotate(float angle, float ax, float ay, float az);
void lovrGraphicsScale(float x, float y, float z); void lovrGraphicsScale(float x, float y, float z);
void lovrGraphicsTransform(float tx, float ty, float tz, float sx, float sy, float sz, float angle, float ax, float ay, float az);
void lovrGraphicsMatrixTransform(mat4 transform); void lovrGraphicsMatrixTransform(mat4 transform);
// Primitives // Primitives

View file

@ -11,10 +11,7 @@ void luax_readtransform(lua_State* L, int i, mat4 m) {
float ax = luaL_optnumber(L, i++, 0); float ax = luaL_optnumber(L, i++, 0);
float ay = luaL_optnumber(L, i++, 1); float ay = luaL_optnumber(L, i++, 1);
float az = luaL_optnumber(L, i++, 0); float az = luaL_optnumber(L, i++, 0);
mat4_identity(m); mat4_setTransform(m, x, y, z, s, angle, ax, ay, az);
mat4_translate(m, x, y, z);
mat4_scale(m, s, s, s);
mat4_rotate(m, angle, ax, ay, az);
} else if (lua_isnoneornil(L, i)) { } else if (lua_isnoneornil(L, i)) {
mat4_identity(m); mat4_identity(m);
} else { } else {
@ -31,7 +28,9 @@ const luaL_Reg lovrTransform[] = {
{ "translate", l_lovrTransformTranslate }, { "translate", l_lovrTransformTranslate },
{ "rotate", l_lovrTransformRotate }, { "rotate", l_lovrTransformRotate },
{ "scale", l_lovrTransformScale }, { "scale", l_lovrTransformScale },
{ "transform", l_lovrTransformTransformPoint }, { "setTransformation", l_lovrTransformSetTransformation },
{ "transformPoint", l_lovrTransformTransformPoint },
{ "inverseTransformPoint", l_lovrTransformInverseTransformPoint },
{ NULL, NULL } { NULL, NULL }
}; };
@ -93,6 +92,14 @@ int l_lovrTransformScale(lua_State* L) {
return 1; return 1;
} }
int l_lovrTransformSetTransformation(lua_State* L) {
Transform* transform = luax_checktype(L, 1, Transform);
lovrTransformOrigin(transform); // Dirty the Transform
luax_readtransform(L, 2, transform->matrix);
lua_pushvalue(L, 1);
return 1;
}
int l_lovrTransformTransformPoint(lua_State* L) { int l_lovrTransformTransformPoint(lua_State* L) {
Transform* transform = luax_checktype(L, 1, Transform); Transform* transform = luax_checktype(L, 1, Transform);
float point[3] = { float point[3] = {

View file

@ -14,5 +14,6 @@ int l_lovrTransformOrigin(lua_State* L);
int l_lovrTransformTranslate(lua_State* L); int l_lovrTransformTranslate(lua_State* L);
int l_lovrTransformRotate(lua_State* L); int l_lovrTransformRotate(lua_State* L);
int l_lovrTransformScale(lua_State* L); int l_lovrTransformScale(lua_State* L);
int l_lovrTransformSetTransformation(lua_State* L);
int l_lovrTransformTransformPoint(lua_State* L); int l_lovrTransformTransformPoint(lua_State* L);
int l_lovrTransformInverseTransformPoint(lua_State* L); int l_lovrTransformInverseTransformPoint(lua_State* L);

View file

@ -188,6 +188,13 @@ mat4 mat4_scale(mat4 m, float x, float y, float z) {
return m; return m;
} }
mat4 mat4_setTransform(mat4 m, float x, float y, float z, float s, float angle, float ax, float ay, float az) {
mat4_identity(m);
mat4_translate(m, x, y, z);
mat4_scale(m, s, s, s);
return mat4_rotate(m, angle, ax, ay, az);
}
mat4 mat4_orthographic(mat4 m, float left, float right, float top, float bottom, float near, float far) { mat4 mat4_orthographic(mat4 m, float left, float right, float top, float bottom, float near, float far) {
float rl = right - left; float rl = right - left;
float tb = top - bottom; float tb = top - bottom;

View file

@ -11,6 +11,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_rotate(mat4 m, float angle, float x, float y, float z);
mat4 mat4_rotateQuat(mat4 m, quat q); mat4 mat4_rotateQuat(mat4 m, quat q);
mat4 mat4_scale(mat4 m, float x, float y, float z); 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_orthographic(mat4 m, float left, float right, float top, float bottom, float near, float far); 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); mat4 mat4_perspective(mat4 m, float near, float far, float fov, float aspect);
void mat4_transform(mat4 m, vec3 v); void mat4_transform(mat4 m, vec3 v);

View file

@ -31,22 +31,27 @@ mat4 lovrTransformInverse(Transform* transform) {
} }
void lovrTransformApply(Transform* transform, Transform* other) { void lovrTransformApply(Transform* transform, Transform* other) {
transform->isDirty = 1;
mat4_multiply(transform->matrix, other->matrix); mat4_multiply(transform->matrix, other->matrix);
} }
void lovrTransformOrigin(Transform* transform) { void lovrTransformOrigin(Transform* transform) {
transform->isDirty = 1;
mat4_identity(transform->matrix); mat4_identity(transform->matrix);
} }
void lovrTransformTranslate(Transform* transform, float x, float y, float z) { void lovrTransformTranslate(Transform* transform, float x, float y, float z) {
transform->isDirty = 1;
mat4_translate(transform->matrix, x, y, z); mat4_translate(transform->matrix, x, y, z);
} }
void lovrTransformRotate(Transform* transform, float angle, float x, float y, float z) { void lovrTransformRotate(Transform* transform, float angle, float x, float y, float z) {
transform->isDirty = 1;
mat4_rotate(transform->matrix, angle, x, y, z); mat4_rotate(transform->matrix, angle, x, y, z);
} }
void lovrTransformScale(Transform* transform, float x, float y, float z) { void lovrTransformScale(Transform* transform, float x, float y, float z) {
transform->isDirty = 1;
mat4_scale(transform->matrix, x, y, z); mat4_scale(transform->matrix, x, y, z);
} }