From 94a9c0e8cb196766c872ecca7020b844021fffc0 Mon Sep 17 00:00:00 2001 From: bjorn Date: Tue, 1 Nov 2016 20:48:04 -0700 Subject: [PATCH] lovrGraphicsTransform; --- src/graphics/graphics.c | 36 ++++++++++++++++++------------------ src/graphics/graphics.h | 3 ++- src/headset/vive.c | 2 +- 3 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index 81b6951c..40218fce 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -277,7 +277,22 @@ void lovrGraphicsScale(float x, float y, float z) { mat4_scale(vec_last(&state.transforms), x, y, z); } -void lovrGraphicsTransform(mat4 transform) { +void lovrGraphicsTransform(float tx, float ty, float tz, float sx, float sy, float sz, float angle, float ax, float ay, float az) { + float cos2 = cos(angle / 2.f); + float sin2 = sin(angle / 2.f); + float qw = cos2; + float qx = sin2 * ax; + float qy = sin2 * ay; + float qz = sin2 * az; + + float transform[16]; + mat4_setTranslation(transform, tx, ty, tz); + mat4_scale(transform, sx, sy, sz); + mat4_rotate(transform, qw, qx, qy, qz); + lovrGraphicsMatrixTransform(transform); +} + +void lovrGraphicsMatrixTransform(mat4 transform) { mat4_multiply(vec_last(&state.transforms), transform); } @@ -359,12 +374,8 @@ void lovrGraphicsPlane(DrawMode mode, float x, float y, float z, float size, flo // Angle between normal vector and the normal vector of the default geometry (dot product) float theta = acos(nz); - float transform[16]; - mat4_setTranslation(transform, x, y, z); - mat4_scale(transform, size, size, size); - mat4_rotate(transform, theta, cx, cy, cz); lovrGraphicsPush(); - lovrGraphicsTransform(transform); + lovrGraphicsTransform(x, y, z, size, size, size, theta, cx, cy, cz); if (mode == DRAW_MODE_LINE) { float points[] = { @@ -392,19 +403,8 @@ void lovrGraphicsPlane(DrawMode mode, float x, float y, float z, float size, flo } void lovrGraphicsCube(DrawMode mode, float x, float y, float z, float size, float angle, float axisX, float axisY, float axisZ) { - float cos2 = cos(angle / 2); - float sin2 = sin(angle / 2); - float rw = cos2; - float rx = sin2 * axisX; - float ry = sin2 * axisY; - float rz = sin2 * axisZ; - - float transform[16]; - mat4_setTranslation(transform, x, y, z); - mat4_scale(transform, size, size, size); - mat4_rotate(transform, rw, rx, ry, rz); lovrGraphicsPush(); - lovrGraphicsTransform(transform); + lovrGraphicsTransform(x, y, z, size, size, size, angle, axisX, axisY, axisZ); if (mode == DRAW_MODE_LINE) { float points[] = { diff --git a/src/graphics/graphics.h b/src/graphics/graphics.h index e1b8033c..7d2c657f 100644 --- a/src/graphics/graphics.h +++ b/src/graphics/graphics.h @@ -87,7 +87,8 @@ 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); -void lovrGraphicsTransform(mat4 transform); +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 lovrGraphicsGetDimensions(int* width, int* height); void lovrGraphicsSetShapeData(float* data, int dataCount, unsigned int* indices, int indicesCount); void lovrGraphicsDrawLinedShape(GLenum mode); diff --git a/src/headset/vive.c b/src/headset/vive.c index 93c01852..4a6c6ed0 100644 --- a/src/headset/vive.c +++ b/src/headset/vive.c @@ -340,7 +340,7 @@ void viveRenderTo(void* headset, headsetRenderCallback callback, void* userdata) lovrGraphicsClear(1, 1); lovrGraphicsPush(); lovrGraphicsOrigin(); - lovrGraphicsTransform(transformMatrix); + lovrGraphicsMatrixTransform(transformMatrix); lovrGraphicsSetProjectionRaw(projectionMatrix); callback(i, userdata); lovrGraphicsPop();