/*
 * azgl: the slice of OpenGL 1.x that Azimuth draws with (glBegin/glEnd with 2D vertices and colors,
 * the matrix stack, display lists, GL_QUADS/GL_QUAD_STRIP/GL_POLYGON and wide lines), implemented on
 * top of WebGL 1 / OpenGL ES 2 for the fredygames.com build. The build force-includes this header in
 * every Azimuth file (-include azgl.h), so the game's own calls land here unchanged.
 *
 * Copyright 2026 FredyGames. Part of the Azimuth build for fredygames.com; distributed with Azimuth
 * under the GNU General Public License, version 3 or (at your option) any later version.
 */
#ifndef AZGL_H_
#define AZGL_H_

#include <SDL_opengl.h>

void azgl_Begin(GLenum mode);
void azgl_End(void);
void azgl_Vertex2f(GLfloat x, GLfloat y);
void azgl_Color4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a);
void azgl_PushMatrix(void);
void azgl_PopMatrix(void);
void azgl_LoadIdentity(void);
void azgl_MatrixMode(GLenum mode);
void azgl_Translate(double x, double y, double z);
void azgl_Scale(double x, double y, double z);
void azgl_Rotate(double angle, double x, double y, double z);
void azgl_MultMatrixf(const GLfloat *m);
void azgl_Ortho(double l, double r, double b, double t, double n, double f);
GLuint azgl_GenLists(GLsizei range);
GLboolean azgl_IsList(GLuint list);
void azgl_NewList(GLuint list, GLenum mode);
void azgl_EndList(void);
void azgl_CallList(GLuint list);
void azgl_Enable(GLenum cap);
void azgl_Disable(GLenum cap);
void azgl_LineWidth(GLfloat width);
void azgl_Viewport(GLint x, GLint y, GLsizei w, GLsizei h);

#ifndef AZGL_IMPLEMENTATION
#define glBegin azgl_Begin
#define glEnd azgl_End
#define glVertex2f(x, y) azgl_Vertex2f((GLfloat)(x), (GLfloat)(y))
#define glVertex2d(x, y) azgl_Vertex2f((GLfloat)(x), (GLfloat)(y))
#define glVertex2i(x, y) azgl_Vertex2f((GLfloat)(x), (GLfloat)(y))
#define glColor3f(r, g, b) azgl_Color4f((r), (g), (b), 1.0f)
#define glColor4f(r, g, b, a) azgl_Color4f((r), (g), (b), (a))
#define glColor3ub(r, g, b) \
  azgl_Color4f((GLubyte)(r) / 255.0f, (GLubyte)(g) / 255.0f, (GLubyte)(b) / 255.0f, 1.0f)
#define glColor4ub(r, g, b, a) \
  azgl_Color4f((GLubyte)(r) / 255.0f, (GLubyte)(g) / 255.0f, (GLubyte)(b) / 255.0f, \
               (GLubyte)(a) / 255.0f)
#define glPushMatrix azgl_PushMatrix
#define glPopMatrix azgl_PopMatrix
#define glLoadIdentity azgl_LoadIdentity
#define glMatrixMode azgl_MatrixMode
#define glTranslatef azgl_Translate
#define glTranslated azgl_Translate
#define glScalef azgl_Scale
#define glScaled azgl_Scale
#define glRotatef azgl_Rotate
#define glRotated azgl_Rotate
#define glMultMatrixf azgl_MultMatrixf
#define glOrtho azgl_Ortho
#define glGenLists azgl_GenLists
#define glIsList azgl_IsList
#define glNewList azgl_NewList
#define glEndList azgl_EndList
#define glCallList azgl_CallList
#define glEnable azgl_Enable
#define glDisable azgl_Disable
#define glLineWidth azgl_LineWidth
#define glViewport azgl_Viewport
#define glHint(target, mode) ((void)0)
#define glClearDepth(d) ((void)0)
#endif

#endif
