#include <GL/glew.h>
#include <GL/glut.h>

GLfloat vert_data[] = {
    -1.0, -1.0, 0.0,
    1.0, -1.0, 0.0,
    0.0, 1.0, 0.0,
};

GLfloat col_data[] = {
    1.0, 0.0, 0.0,
    0.0, 1.0, 0.0,
    0.0, 0.0, 1.0
};

#define POSITION_ATTRIB 0
#define COLOR_ATTRIB 1

const char* vert_shader =
"\
#version 150\n\
\n\
in vec3 position;\n\
in vec3 color;\n\
out vec3 vcol;\n\
\n\
void main(void) { \n\
    vcol = color;\n\
    gl_Position = vec4(position, 1.0);\n\
}\n\
";

const char* frag_shader =
"\
#version 150\n\
\n\
in vec3 vcol;\n\
out vec4 fcol;\n\
\n\
void main(void) { \n\
    fcol = vec4(vcol,1.0);\n\
}\n\
";

void init(void) {
    glewInit();

    GLuint vao;
    GLuint bufs[2];
    glGenVertexArrays(1, &vao);
    glGenBuffers(2, bufs);

    glBindVertexArray(vao);
    glEnableVertexAttribArray(POSITION_ATTRIB);
    glEnableVertexAttribArray(COLOR_ATTRIB);

    glBindBuffer(GL_ARRAY_BUFFER, bufs[0]);
    glBufferData(GL_ARRAY_BUFFER, 3*3*sizeof(GLfloat), vert_data, GL_STATIC_DRAW);
    glVertexAttribPointer(POSITION_ATTRIB, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, bufs[1]);
    glBufferData(GL_ARRAY_BUFFER, 3*3*sizeof(GLfloat), col_data, GL_STATIC_DRAW);
    glVertexAttribPointer(COLOR_ATTRIB, 3, GL_FLOAT, GL_FALSE, 0, 0);

    GLuint prog;
    GLuint vert;
    GLuint frag;

    prog = glCreateProgram();
    vert = glCreateShader(GL_VERTEX_SHADER);
    frag = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(vert, 1, &vert_shader, 0);
    glShaderSource(frag, 1, &frag_shader, 0);
    glCompileShader(vert);
    glCompileShader(frag);

    glAttachShader(prog, vert);
    glAttachShader(prog, frag);

    glBindAttribLocation(prog, POSITION_ATTRIB, "position");
    glBindAttribLocation(prog, COLOR_ATTRIB, "color");

    glLinkProgram(prog);
    glUseProgram(prog);
}

void render(void) {
    glClear(GL_COLOR_BUFFER_BIT);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glutSwapBuffers();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(300, 300);
    glutCreateWindow("gltext demo");
    glutDisplayFunc(render);


    init();
    glutMainLoop();
}