115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot/*
215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot  This software is provided 'as-is', without any express or implied
515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot  warranty.  In no event will the authors be held liable for any damages
615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot  arising from the use of this software.
715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot  Permission is granted to anyone to use this software for any purpose,
915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot  including commercial applications, and to alter it and redistribute it
1015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot  freely.
1115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot*/
1215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot/* This is a simple example of using GLSL shaders with SDL */
1315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
1415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot#include "SDL.h"
1515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
1615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot#ifdef HAVE_OPENGL
1715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
1815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot#include "SDL_opengl.h"
1915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
2015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
2115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic SDL_bool shaders_supported;
2215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic int      current_shader = 0;
2315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
2415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotenum {
2515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SHADER_COLOR,
2615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SHADER_TEXTURE,
2715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SHADER_TEXCOORDS,
2815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    NUM_SHADERS
2915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot};
3015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
3115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robottypedef struct {
3215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    GLhandleARB program;
3315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    GLhandleARB vert_shader;
3415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    GLhandleARB frag_shader;
3515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    const char *vert_source;
3615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    const char *frag_source;
3715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot} ShaderData;
3815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
3915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic ShaderData shaders[NUM_SHADERS] = {
4015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
4115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* SHADER_COLOR */
4215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    { 0, 0, 0,
4315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        /* vertex shader */
4415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"varying vec4 v_color;\n"
4515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"\n"
4615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"void main()\n"
4715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"{\n"
4815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
4915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    v_color = gl_Color;\n"
5015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"}",
5115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        /* fragment shader */
5215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"varying vec4 v_color;\n"
5315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"\n"
5415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"void main()\n"
5515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"{\n"
5615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    gl_FragColor = v_color;\n"
5715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"}"
5815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    },
5915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
6015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* SHADER_TEXTURE */
6115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    { 0, 0, 0,
6215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        /* vertex shader */
6315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"varying vec4 v_color;\n"
6415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"varying vec2 v_texCoord;\n"
6515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"\n"
6615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"void main()\n"
6715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"{\n"
6815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
6915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    v_color = gl_Color;\n"
7015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    v_texCoord = vec2(gl_MultiTexCoord0);\n"
7115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"}",
7215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        /* fragment shader */
7315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"varying vec4 v_color;\n"
7415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"varying vec2 v_texCoord;\n"
7515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"uniform sampler2D tex0;\n"
7615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"\n"
7715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"void main()\n"
7815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"{\n"
7915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    gl_FragColor = texture2D(tex0, v_texCoord) * v_color;\n"
8015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"}"
8115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    },
8215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
8315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* SHADER_TEXCOORDS */
8415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    { 0, 0, 0,
8515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        /* vertex shader */
8615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"varying vec2 v_texCoord;\n"
8715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"\n"
8815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"void main()\n"
8915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"{\n"
9015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
9115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    v_texCoord = vec2(gl_MultiTexCoord0);\n"
9215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"}",
9315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        /* fragment shader */
9415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"varying vec2 v_texCoord;\n"
9515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"\n"
9615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"void main()\n"
9715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"{\n"
9815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    vec4 color;\n"
9915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    vec2 delta;\n"
10015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    float dist;\n"
10115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"\n"
10215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    delta = vec2(0.5, 0.5) - v_texCoord;\n"
10315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    dist = dot(delta, delta);\n"
10415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"\n"
10515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    color.r = v_texCoord.x;\n"
10615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    color.g = v_texCoord.x * v_texCoord.y;\n"
10715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    color.b = v_texCoord.y;\n"
10815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    color.a = 1.0 - (dist * 4.0);\n"
10915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"    gl_FragColor = color;\n"
11015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot"}"
11115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    },
11215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot};
11315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
11415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
11515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
11615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
11715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
11815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
11915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
12015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
12115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
12215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
12315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
12415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLUNIFORM1IARBPROC glUniform1iARB;
12515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
12615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
12715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic SDL_bool CompileShader(GLhandleARB shader, const char *source)
12815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
12915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    GLint status;
13015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
13115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glShaderSourceARB(shader, 1, &source, NULL);
13215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glCompileShaderARB(shader);
13315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &status);
13415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if (status == 0) {
13515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        GLint length;
13615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        char *info;
13715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
13815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glGetObjectParameterivARB(shader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &length);
13915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        info = SDL_stack_alloc(char, length+1);
14015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glGetInfoLogARB(shader, length, NULL, info);
14115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to compile shader:\n%s\n%s", source, info);
14215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_stack_free(info);
14315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
14415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        return SDL_FALSE;
14515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    } else {
14615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        return SDL_TRUE;
14715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
14815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
14915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
15015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic SDL_bool CompileShaderProgram(ShaderData *data)
15115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
15215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    const int num_tmus_bound = 4;
15315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    int i;
15415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    GLint location;
15515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
15615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glGetError();
15715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
15815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Create one program object to rule them all */
15915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    data->program = glCreateProgramObjectARB();
16015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
16115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Create the vertex shader */
16215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    data->vert_shader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
16315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if (!CompileShader(data->vert_shader, data->vert_source)) {
16415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        return SDL_FALSE;
16515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
16615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
16715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Create the fragment shader */
16815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    data->frag_shader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
16915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if (!CompileShader(data->frag_shader, data->frag_source)) {
17015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        return SDL_FALSE;
17115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
17215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
17315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* ... and in the darkness bind them */
17415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glAttachObjectARB(data->program, data->vert_shader);
17515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glAttachObjectARB(data->program, data->frag_shader);
17615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glLinkProgramARB(data->program);
17715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
17815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Set up some uniform variables */
17915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glUseProgramObjectARB(data->program);
18015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    for (i = 0; i < num_tmus_bound; ++i) {
18115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        char tex_name[5];
18215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_snprintf(tex_name, SDL_arraysize(tex_name), "tex%d", i);
18315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        location = glGetUniformLocationARB(data->program, tex_name);
18415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        if (location >= 0) {
18515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glUniform1iARB(location, i);
18615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        }
18715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
18815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glUseProgramObjectARB(0);
18915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
19015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    return (glGetError() == GL_NO_ERROR) ? SDL_TRUE : SDL_FALSE;
19115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
19215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
19315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic void DestroyShaderProgram(ShaderData *data)
19415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
19515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if (shaders_supported) {
19615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glDeleteObjectARB(data->vert_shader);
19715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glDeleteObjectARB(data->frag_shader);
19815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glDeleteObjectARB(data->program);
19915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
20015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
20115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
20215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic SDL_bool InitShaders()
20315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
20415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    int i;
20515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
20615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Check for shader support */
20715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    shaders_supported = SDL_FALSE;
20815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if (SDL_GL_ExtensionSupported("GL_ARB_shader_objects") &&
20915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_GL_ExtensionSupported("GL_ARB_shading_language_100") &&
21015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_GL_ExtensionSupported("GL_ARB_vertex_shader") &&
21115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_GL_ExtensionSupported("GL_ARB_fragment_shader")) {
21215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) SDL_GL_GetProcAddress("glAttachObjectARB");
21315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) SDL_GL_GetProcAddress("glCompileShaderARB");
21415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glCreateProgramObjectARB");
21515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) SDL_GL_GetProcAddress("glCreateShaderObjectARB");
21615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC) SDL_GL_GetProcAddress("glDeleteObjectARB");
21715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC) SDL_GL_GetProcAddress("glGetInfoLogARB");
21815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC) SDL_GL_GetProcAddress("glGetObjectParameterivARB");
21915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) SDL_GL_GetProcAddress("glGetUniformLocationARB");
22015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) SDL_GL_GetProcAddress("glLinkProgramARB");
22115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) SDL_GL_GetProcAddress("glShaderSourceARB");
22215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glUniform1iARB = (PFNGLUNIFORM1IARBPROC) SDL_GL_GetProcAddress("glUniform1iARB");
22315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) SDL_GL_GetProcAddress("glUseProgramObjectARB");
22415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        if (glAttachObjectARB &&
22515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glCompileShaderARB &&
22615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glCreateProgramObjectARB &&
22715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glCreateShaderObjectARB &&
22815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glDeleteObjectARB &&
22915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glGetInfoLogARB &&
23015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glGetObjectParameterivARB &&
23115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glGetUniformLocationARB &&
23215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glLinkProgramARB &&
23315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glShaderSourceARB &&
23415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glUniform1iARB &&
23515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            glUseProgramObjectARB) {
23615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            shaders_supported = SDL_TRUE;
23715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        }
23815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
23915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
24015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if (!shaders_supported) {
24115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        return SDL_FALSE;
24215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
24315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
24415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Compile all the shaders */
24515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    for (i = 0; i < NUM_SHADERS; ++i) {
24615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        if (!CompileShaderProgram(&shaders[i])) {
24715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to compile shader!\n");
24815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            return SDL_FALSE;
24915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        }
25015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
25115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
25215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* We're done! */
25315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    return SDL_TRUE;
25415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
25515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
25615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic void QuitShaders()
25715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
25815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    int i;
25915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
26015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    for (i = 0; i < NUM_SHADERS; ++i) {
26115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        DestroyShaderProgram(&shaders[i]);
26215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
26315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
26415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
26515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot/* Quick utility function for texture creation */
26615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotstatic int
26715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotpower_of_two(int input)
26815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
26915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    int value = 1;
27015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
27115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    while (value < input) {
27215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        value <<= 1;
27315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
27415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    return value;
27515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
27615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
27715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team RobotGLuint
27815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team RobotSDL_GL_LoadTexture(SDL_Surface * surface, GLfloat * texcoord)
27915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
28015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    GLuint texture;
28115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    int w, h;
28215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_Surface *image;
28315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_Rect area;
28415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_BlendMode saved_mode;
28515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
28615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Use the surface width and height expanded to powers of 2 */
28715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    w = power_of_two(surface->w);
28815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    h = power_of_two(surface->h);
28915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    texcoord[0] = 0.0f;         /* Min X */
29015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    texcoord[1] = 0.0f;         /* Min Y */
29115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    texcoord[2] = (GLfloat) surface->w / w;     /* Max X */
29215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    texcoord[3] = (GLfloat) surface->h / h;     /* Max Y */
29315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
29415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    image = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 32,
29515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot#if SDL_BYTEORDER == SDL_LIL_ENDIAN     /* OpenGL RGBA masks */
29615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                                 0x000000FF,
29715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                                 0x0000FF00, 0x00FF0000, 0xFF000000
29815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot#else
29915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                                 0xFF000000,
30015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                                 0x00FF0000, 0x0000FF00, 0x000000FF
30115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot#endif
30215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        );
30315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if (image == NULL) {
30415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        return 0;
30515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
30615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
30715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Save the alpha blending attributes */
30815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_GetSurfaceBlendMode(surface, &saved_mode);
30915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_NONE);
31015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
31115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Copy the surface into the GL texture image */
31215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    area.x = 0;
31315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    area.y = 0;
31415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    area.w = surface->w;
31515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    area.h = surface->h;
31615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_BlitSurface(surface, &area, image, &area);
31715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
31815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Restore the alpha blending attributes */
31915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_SetSurfaceBlendMode(surface, saved_mode);
32015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
32115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Create an OpenGL texture for the image */
32215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glGenTextures(1, &texture);
32315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glBindTexture(GL_TEXTURE_2D, texture);
32415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
32515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
32615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glTexImage2D(GL_TEXTURE_2D,
32715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                 0,
32815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                 GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
32915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_FreeSurface(image);     /* No longer needed */
33015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
33115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    return texture;
33215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
33315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
33415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot/* A general OpenGL initialization function.    Sets all of the initial parameters. */
33515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotvoid InitGL(int Width, int Height)                    /* We call this right after our OpenGL window is created. */
33615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
33715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    GLdouble aspect;
33815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
33915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glViewport(0, 0, Width, Height);
34015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);        /* This Will Clear The Background Color To Black */
34115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glClearDepth(1.0);                /* Enables Clearing Of The Depth Buffer */
34215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glDepthFunc(GL_LESS);                /* The Type Of Depth Test To Do */
34315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glEnable(GL_DEPTH_TEST);            /* Enables Depth Testing */
34415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glShadeModel(GL_SMOOTH);            /* Enables Smooth Color Shading */
34515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
34615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glMatrixMode(GL_PROJECTION);
34715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glLoadIdentity();                /* Reset The Projection Matrix */
34815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
34915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    aspect = (GLdouble)Width / Height;
35015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glOrtho(-3.0, 3.0, -3.0 / aspect, 3.0 / aspect, 0.0, 1.0);
35115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
35215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glMatrixMode(GL_MODELVIEW);
35315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
35415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
35515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot/* The main drawing function. */
35615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotvoid DrawGLScene(SDL_Window *window, GLuint texture, GLfloat * texcoord)
35715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
35815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Texture coordinate lookup, to make it simple */
35915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    enum {
36015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        MINX,
36115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        MINY,
36215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        MAXX,
36315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        MAXY
36415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    };
36515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
36615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        /* Clear The Screen And The Depth Buffer */
36715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glLoadIdentity();                /* Reset The View */
36815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
36915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glTranslatef(-1.5f,0.0f,0.0f);        /* Move Left 1.5 Units */
37015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
37115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* draw a triangle (in smooth coloring mode) */
37215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glBegin(GL_POLYGON);                /* start drawing a polygon */
37315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glColor3f(1.0f,0.0f,0.0f);            /* Set The Color To Red */
37415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glVertex3f( 0.0f, 1.0f, 0.0f);        /* Top */
37515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glColor3f(0.0f,1.0f,0.0f);            /* Set The Color To Green */
37615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glVertex3f( 1.0f,-1.0f, 0.0f);        /* Bottom Right */
37715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glColor3f(0.0f,0.0f,1.0f);            /* Set The Color To Blue */
37815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glVertex3f(-1.0f,-1.0f, 0.0f);        /* Bottom Left */
37915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glEnd();                    /* we're done with the polygon (smooth color interpolation) */
38015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
38115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glTranslatef(3.0f,0.0f,0.0f);         /* Move Right 3 Units */
38215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
38315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Enable blending */
38415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
38515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glEnable(GL_BLEND);
38615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
38715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
38815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* draw a textured square (quadrilateral) */
38915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glEnable(GL_TEXTURE_2D);
39015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glBindTexture(GL_TEXTURE_2D, texture);
39115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glColor3f(1.0f,1.0f,1.0f);
39215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if (shaders_supported) {
39315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glUseProgramObjectARB(shaders[current_shader].program);
39415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
39515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
39615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glBegin(GL_QUADS);                /* start drawing a polygon (4 sided) */
39715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glTexCoord2f(texcoord[MINX], texcoord[MINY]);
39815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glVertex3f(-1.0f, 1.0f, 0.0f);        /* Top Left */
39915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glTexCoord2f(texcoord[MAXX], texcoord[MINY]);
40015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glVertex3f( 1.0f, 1.0f, 0.0f);        /* Top Right */
40115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glTexCoord2f(texcoord[MAXX], texcoord[MAXY]);
40215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glVertex3f( 1.0f,-1.0f, 0.0f);        /* Bottom Right */
40315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glTexCoord2f(texcoord[MINX], texcoord[MAXY]);
40415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glVertex3f(-1.0f,-1.0f, 0.0f);        /* Bottom Left */
40515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glEnd();                    /* done with the polygon */
40615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
40715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if (shaders_supported) {
40815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        glUseProgramObjectARB(0);
40915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
41015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    glDisable(GL_TEXTURE_2D);
41115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
41215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* swap buffers to display, since we're double buffered. */
41315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_GL_SwapWindow(window);
41415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
41515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
41615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotint main(int argc, char **argv)
41715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
41815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    int done;
41915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_Window *window;
42015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_Surface *surface;
42115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    GLuint texture;
42215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    GLfloat texcoords[4];
42315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
42415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot	/* Enable standard application logging */
42515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
42615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
42715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Initialize SDL for video output */
42815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
42915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to initialize SDL: %s\n", SDL_GetError());
43015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        exit(1);
43115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
43215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
43315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Create a 640x480 OpenGL screen */
43415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    window = SDL_CreateWindow( "Shader Demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_OPENGL );
43515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if ( !window ) {
43615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to create OpenGL window: %s\n", SDL_GetError());
43715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_Quit();
43815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        exit(2);
43915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
44015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
44115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if ( !SDL_GL_CreateContext(window)) {
44215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to create OpenGL context: %s\n", SDL_GetError());
44315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_Quit();
44415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        exit(2);
44515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
44615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
44715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    surface = SDL_LoadBMP("icon.bmp");
44815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if ( ! surface ) {
44915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Unable to load icon.bmp: %s\n", SDL_GetError());
45015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_Quit();
45115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        exit(3);
45215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
45315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    texture = SDL_GL_LoadTexture(surface, texcoords);
45415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_FreeSurface(surface);
45515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
45615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    /* Loop, drawing and checking events */
45715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    InitGL(640, 480);
45815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    if (InitShaders()) {
45915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_Log("Shaders supported, press SPACE to cycle them.\n");
46015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    } else {
46115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Shaders not supported!\n");
46215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
46315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    done = 0;
46415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    while ( ! done ) {
46515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        DrawGLScene(window, texture, texcoords);
46615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
46715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        /* This could go in a separate function */
46815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        { SDL_Event event;
46915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            while ( SDL_PollEvent(&event) ) {
47015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                if ( event.type == SDL_QUIT ) {
47115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                    done = 1;
47215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                }
47315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                if ( event.type == SDL_KEYDOWN ) {
47415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                    if ( event.key.keysym.sym == SDLK_SPACE ) {
47515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                        current_shader = (current_shader + 1) % NUM_SHADERS;
47615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                    }
47715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                    if ( event.key.keysym.sym == SDLK_ESCAPE ) {
47815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                        done = 1;
47915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                    }
48015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot                }
48115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot            }
48215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot        }
48315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    }
48415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    QuitShaders();
48515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_Quit();
48615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    return 1;
48715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
48815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
48915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot#else /* HAVE_OPENGL */
49015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
49115560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotint
49215560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robotmain(int argc, char *argv[])
49315560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot{
49415560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "No OpenGL support on this system\n");
49515560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot    return 1;
49615560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot}
49715560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
49815560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot#endif /* HAVE_OPENGL */
49915560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot
50015560bb32cdb9b47db48eb4865b736df9708a8fandroid-build-team Robot/* vi: set ts=4 sw=4 expandtab: */
501