/* glsl-utils.h --- support functions for GLSL in OpenGL hacks.
 * Copyright (c) 2020-2021 Carsten Steger <carsten@mirsanmir.org>
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation.  No representations are made about the suitability of this
 * software for any purpose.  It is provided "as is" without express or 
 * implied warranty.
 */


#ifndef __GLSL_UTILS_H__
#define __GLSL_UTILS_H__

#ifdef HAVE_GLSL


/* Column-major linearized matrix coordinate */
#define GLSL__LINCOOR(r,c,h) ((c)*(h)+(r))


/* Copy a 4x4 column-major matrix: c = m. */
extern void glsl_CopyMatrix(GLfloat c[16], GLfloat m[16]);

/* Create a 4x4 column-major identity matrix. */
extern void glsl_Identity(GLfloat c[16]);

/* Multiply two 4x4 column-major matrices: c = c*m. */
extern void glsl_MultMatrix(GLfloat c[16], GLfloat m[16]);

/* Multiply a 4x4 column-major matrix by a rotation matrix that rotates
   around the axis (x,y,z) by the angle angle: c = c*r(angle,x,y,z). */
extern void glsl_Rotate(GLfloat c[16], GLfloat angle, GLfloat x, GLfloat y,
                        GLfloat z);

/* Multiply a 4x4 column-major matrix by a matrix that stretches, shrinks,
   or reflects an object along the axes: c = c*s(sx,sy,sz). */
extern void glsl_Scale(GLfloat c[16], GLfloat sx, GLfloat sy, GLfloat sz);

/* Multiply a 4x4 column-major matrix by a matrix that translates an object
   by a translation vector: c = c*t(tx,ty,tz). */
extern void glsl_Translate(GLfloat c[16], GLfloat tx, GLfloat ty, GLfloat tz);

/* Add a perspective projection to a 4x4 column-major matrix. */
extern void glsl_Perspective(GLfloat c[16], GLfloat fovy, GLfloat aspect,
                             GLfloat z_near, GLfloat z_far);

/* Add an orthographic projection to a 4x4 column-major matrix. */
extern void glsl_Orthographic(GLfloat c[16], GLfloat left, GLfloat right,
                              GLfloat bottom, GLfloat top,
                              GLfloat nearval, GLfloat farval);

/* Get the OpenGL and GLSL versions. */
extern GLboolean glsl_GetGlAndGlslVersions(GLint *gl_major,
                                           GLint *gl_minor,
                                           GLint *glsl_major,
                                           GLint *glsl_minor,
                                           GLboolean *gl_gles3);

/* Compile and link a vertex and a Fragment shader into a GLSL program. */
extern GLboolean glsl_CompileAndLinkShaders(GLsizei vertex_shader_count,
                                        const GLchar **vertex_shader_source,
                                        GLsizei fragment_shader_count,
                                        const GLchar **fragment_shader_source,
                                        GLuint *shader_program);


#endif /* HAVE_GLSL */


#endif /* __GLSL_UTILS_H__ */
