From 9f097e64e216c4e6d61ceddf4518cb475936094b Mon Sep 17 00:00:00 2001 From: bjornbytes Date: Tue, 13 Jun 2017 20:04:51 -0700 Subject: [PATCH] Add lovrNormalMatrix; --- src/graphics/shader.c | 14 ++++++++++++++ src/math/mat4.c | 20 ++++++++++++++++++++ src/math/mat4.h | 1 + 3 files changed, 35 insertions(+) diff --git a/src/graphics/shader.c b/src/graphics/shader.c index 7663ef1a..982e6824 100644 --- a/src/graphics/shader.c +++ b/src/graphics/shader.c @@ -19,6 +19,7 @@ const char* lovrShaderVertexPrefix = "" "out vec2 texCoord; \n" #endif "uniform mat4 lovrTransform; \n" +"uniform mat3 lovrNormalMatrix; \n" "uniform mat4 lovrProjection; \n" ""; @@ -229,6 +230,19 @@ void lovrShaderBind(Shader* shader, mat4 transform, mat4 projection, unsigned in int uniformId = lovrShaderGetUniformId(shader, "lovrTransform"); lovrShaderSendFloatMat4(shader, uniformId, transform); memcpy(shader->transform, transform, 16 * sizeof(float)); + + float normalMatrix[16]; + mat4_set(normalMatrix, transform); + normalMatrix[12] = normalMatrix[13] = normalMatrix[14] = 0; + normalMatrix[15] = 1; + mat4_transpose(mat4_invert(normalMatrix)); + float normalMatrix3x3[9] = { + normalMatrix[0], normalMatrix[1], normalMatrix[2], + normalMatrix[4], normalMatrix[5], normalMatrix[6], + normalMatrix[8], normalMatrix[9], normalMatrix[10] + }; + uniformId = lovrShaderGetUniformId(shader, "lovrNormalMatrix"); + lovrShaderSendFloatMat3(shader, uniformId, normalMatrix3x3); } // Update projection if necessary diff --git a/src/math/mat4.c b/src/math/mat4.c index 9b63efbd..e1072841 100644 --- a/src/math/mat4.c +++ b/src/math/mat4.c @@ -106,6 +106,26 @@ mat4 mat4_invert(mat4 m) { return m; } +mat4 mat4_transpose(mat4 m) { + float a01 = m[1], a02 = m[2], a03 = m[3], + a12 = m[6], a13 = m[7], + a23 = m[11]; + + m[1] = m[4]; + m[2] = m[8]; + m[3] = m[12]; + m[4] = a01; + m[6] = m[9]; + m[7] = m[13]; + m[8] = a02; + m[9] = a12; + m[11] = m[14]; + m[12] = a03; + m[13] = a13; + m[14] = a23; + return m; +} + // Modified from gl-matrix.c mat4 mat4_multiply(mat4 m, mat4 n) { float m00 = m[0], m01 = m[1], m02 = m[2], m03 = m[3], diff --git a/src/math/mat4.h b/src/math/mat4.h index 42a99318..f9936e5a 100644 --- a/src/math/mat4.h +++ b/src/math/mat4.h @@ -8,6 +8,7 @@ mat4 mat4_fromMat34(mat4 m, float (*n)[4]); mat4 mat4_fromMat44(mat4 m, float (*n)[4]); mat4 mat4_identity(mat4 m); mat4 mat4_invert(mat4 m); +mat4 mat4_transpose(mat4 m); mat4 mat4_multiply(mat4 m, mat4 n); mat4 mat4_translate(mat4 m, float x, float y, float z); mat4 mat4_rotate(mat4 m, float angle, float x, float y, float z);