From 8b8ada4682ac5967b2fde4b7989c4b61c49c80e4 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 7 Aug 2019 00:41:25 +0200 Subject: Add OpenGL 3 test program --- test/test_utils.h | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'test/test_utils.h') diff --git a/test/test_utils.h b/test/test_utils.h index f4f6c31..8e9c7ff 100644 --- a/test/test_utils.h +++ b/test/test_utils.h @@ -34,6 +34,9 @@ typedef struct { bool resizable; } PuglTestOptions; +typedef float vec4[4]; +typedef vec4 mat4[4]; + static const float cubeStripVertices[] = { -1.0f, 1.0f, 1.0f, // Front top left 1.0f, 1.0f, 1.0f, // Front top right @@ -79,6 +82,61 @@ static const float cubeSideLines[] = { 1.0f, -1.0f, -1.0f, // Back bottom right }; +static inline void +mat4Identity(mat4 m) +{ + for (int c = 0; c < 4; ++c) { + for (int r = 0; r < 4; ++r) { + m[c][r] = c == r ? 1.0f : 0.0f; + } + } +} + +static inline void +mat4Translate(mat4 m, const float x, const float y, const float z) +{ + m[3][0] = x; + m[3][1] = y; + m[3][2] = z; +} + +static inline void +mat4Mul(mat4 m, mat4 a, mat4 b) +{ + for (int c = 0; c < 4; ++c) { + for (int r = 0; r < 4; ++r) { + m[c][r] = 0.0f; + for (int k = 0; k < 4; ++k) { + m[c][r] += a[k][r] * b[c][k]; + } + } + } +} + +static inline void +mat4Ortho(mat4 m, + const float l, + const float r, + const float b, + const float t, + const float n, + const float f) +{ + m[0][0] = 2.0f / (r - l); + m[0][1] = m[0][2] = m[0][3] = 0.0f; + + m[1][1] = 2.0f / (t - b); + m[1][0] = m[1][2] = m[1][3] = 0.0f; + + m[2][2] = -2.0f / (f - n); + m[2][0] = m[2][1] = m[2][3] = 0.0f; + + m[3][0] = -(r + l) / (r - l); + m[3][1] = -(t + b) / (t - b); + m[3][2] = -(f + n) / (f - n); + m[3][3] = 1.0f; +} + /** Calculate a projection matrix for a given perspective. */ static inline void perspective(float* m, float fov, float aspect, float zNear, float zFar) -- cgit v1.2.1