diff --git a/Userland/Libraries/LibGL/GL/gl.h b/Userland/Libraries/LibGL/GL/gl.h index 9e7694d2b1..8c5674bd96 100644 --- a/Userland/Libraries/LibGL/GL/gl.h +++ b/Userland/Libraries/LibGL/GL/gl.h @@ -366,6 +366,7 @@ GLAPI void glGenTextures(GLsizei n, GLuint* textures); GLAPI GLenum glGetError(); GLAPI GLubyte* glGetString(GLenum name); GLAPI void glLoadIdentity(); +GLAPI void glLoadMatrixd(const GLdouble* matrix); GLAPI void glLoadMatrixf(const GLfloat* matrix); GLAPI void glMatrixMode(GLenum mode); GLAPI void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal); diff --git a/Userland/Libraries/LibGL/GLMat.cpp b/Userland/Libraries/LibGL/GLMat.cpp index 41c60f4022..b056f18705 100644 --- a/Userland/Libraries/LibGL/GLMat.cpp +++ b/Userland/Libraries/LibGL/GLMat.cpp @@ -1,10 +1,12 @@ /* * Copyright (c) 2021, Jesse Buhagiar * Copyright (c) 2021, Stephan Unverwerth + * Copyright (c) 2021, Jelle Raaijmakers * * SPDX-License-Identifier: BSD-2-Clause */ +#include "AK/Array.h" #include "GL/gl.h" #include "GLContext.h" @@ -38,25 +40,46 @@ void glPopMatrix() /* * Transposes input matrices (column-major) to our Matrix (row-major). */ -template -static constexpr Matrix4x4 transpose_input_matrix(T const* matrix) +template +static constexpr Matrix4x4 transpose_input_matrix(I const* matrix) { + if constexpr (IsSame) { + // clang-format off + return { + matrix[0], matrix[4], matrix[8], matrix[12], + matrix[1], matrix[5], matrix[9], matrix[13], + matrix[2], matrix[6], matrix[10], matrix[14], + matrix[3], matrix[7], matrix[11], matrix[15], + }; + // clang-format on + } + + Array elements; + for (size_t i = 0; i < 16; ++i) + elements[i] = static_cast(matrix[i]); + // clang-format off return { - matrix[0], matrix[4], matrix[8], matrix[12], - matrix[1], matrix[5], matrix[9], matrix[13], - matrix[2], matrix[6], matrix[10], matrix[14], - matrix[3], matrix[7], matrix[11], matrix[15], + elements[0], elements[4], elements[8], elements[12], + elements[1], elements[5], elements[9], elements[13], + elements[2], elements[6], elements[10], elements[14], + elements[3], elements[7], elements[11], elements[15], }; + // clang-format on } void glMultMatrixf(GLfloat const* matrix) { - g_gl_context->gl_mult_matrix(transpose_input_matrix(matrix)); + g_gl_context->gl_mult_matrix(transpose_input_matrix(matrix)); } -void glLoadMatrixf(const GLfloat* matrix) +void glLoadMatrixd(GLdouble const* matrix) { - g_gl_context->gl_load_matrix(transpose_input_matrix(matrix)); + g_gl_context->gl_load_matrix(transpose_input_matrix(matrix)); +} + +void glLoadMatrixf(GLfloat const* matrix) +{ + g_gl_context->gl_load_matrix(transpose_input_matrix(matrix)); } void glLoadIdentity()