/* a rendering.c mixin */
#ifndef QUAD_ELEMENT_BUFFER_H
#define QUAD_ELEMENT_BUFFER_H

#include "townengine/util.h"

#include <glad/glad.h>

#include <stddef.h>

#define QUAD_ELEMENT_BUFFER_LENGTH (65536 / 6)

static void bind_quad_element_buffer(void) {
    static GLuint buffer = 0;

    /* it's only generated once at runtime */
    if (buffer == 0) {
        glGenBuffers(1, &buffer);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER,
                     QUAD_ELEMENT_BUFFER_LENGTH * 6 * sizeof(uint16_t),
                     NULL,
                     GL_STATIC_DRAW);

        uint16_t *const indices = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER,
                                              GL_WRITE_ONLY);
        if (!indices)
            CRY("Quad indices generation", "glMapBuffer() failed");

        for (uint16_t i = 0; i < QUAD_ELEMENT_BUFFER_LENGTH; ++i) {
            indices[i * 6 + 0] = (uint16_t)(i * 4 + 0);
            indices[i * 6 + 1] = (uint16_t)(i * 4 + 1);
            indices[i * 6 + 2] = (uint16_t)(i * 4 + 2);
            indices[i * 6 + 3] = (uint16_t)(i * 4 + 2);
            indices[i * 6 + 4] = (uint16_t)(i * 4 + 3);
            indices[i * 6 + 5] = (uint16_t)(i * 4 + 0);
        }

        glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);

    } else
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer);
}

#endif
