#ifndef HARNESS_GL_RENDERER
#define HARNESS_GL_RENDERER
#include "harness.h"
#include "harness/hooks.h"
#define CHECK_GL_ERROR(msg) \
{ \
GLenum e = glGetError(); \
if (e != GL_NO_ERROR) { \
const char* err; \
switch (e) { \
case GL_NO_ERROR: \
err = "GL_NO_ERROR"; \
break; \
case GL_INVALID_ENUM: \
err = "GL_INVALID_ENUM"; \
break; \
case GL_INVALID_VALUE: \
err = "GL_INVALID_VALUE"; \
break; \
case GL_INVALID_OPERATION: \
err = "GL_INVALID_OPERATION"; \
break; \
case GL_INVALID_FRAMEBUFFER_OPERATION: \
err = "GL_INVALID_FRAMEBUFFER_OPERATION"; \
break; \
case GL_OUT_OF_MEMORY: \
err = "GL_OUT_OF_MEMORY"; \
break; \
case GL_STACK_UNDERFLOW: \
err = "GL_STACK_UNDERFLOW"; \
break; \
case GL_STACK_OVERFLOW: \
err = "GL_STACK_OVERFLOW"; \
break; \
default: \
err = "unknown"; \
break; \
} \
LOG_PANIC("glError %d (%s): %s", e, err, msg); \
} \
}
void GLRenderer_Init(int render_width, int render_height);
void GLRenderer_SetPalette(uint8_t* rgba_colors);
void GLRenderer_BeginScene(br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer);
void GLRenderer_EndScene(void);
void GLRenderer_FullScreenQuad(uint8_t* screen_buffer);
void GLRenderer_Model(br_actor* actor, br_model* model, br_material* material, br_token render_type, br_matrix34 model_matrix);
void GLRenderer_BufferTexture(br_pixelmap* pm);
void GLRenderer_BufferMaterial(br_material* mat);
void GLRenderer_BufferModel(br_model* model);
void GLRenderer_ClearBuffers(void);
void GLRenderer_FlushBuffer(tRenderer_flush_type flush_type);
void GLRenderer_FlushBuffers(void);
void GLRenderer_SetViewport(int x, int y, int width, int height);
#endif