§ Основной файл main.cc

Главная логика по рисованию выполняется здесь, вызывается 60 раз в секунду. В модуле реализовано управление камерой с помощью мышки, а также управление на WASD.
Скачать шаблон
#include "app.cc"

int main() {

    App* app = new App(1024, 960);

    // --------------

    int w = 256, h = 256;
    GLuint bgra[w*h];

    // Создать тестовую текстуру
    for (int i = 0; i < h; i++)
    for (int j = 0; j < w; j++) {
        bgra[i*h + j] = (i^j)*256 | 0xFF000000;
    }

    GLuint texture_id = app->loadTexture(bgra, w, h);

    while (app->poll()) {

        app->clear(0);

        vec3 move = {0, 0, 0};
        vec3 look = app->lookCamera();

        // Обработка движений
        if (app->pressed(SDL_SCANCODE_W)) { move.x += look.x; move.z += look.z; }
        if (app->pressed(SDL_SCANCODE_S)) { move.x -= look.x; move.z -= look.z; }
        if (app->pressed(SDL_SCANCODE_A)) { move.x -= look.z; move.z += look.x; }
        if (app->pressed(SDL_SCANCODE_D)) { move.x += look.z; move.z -= look.x; }

        // Равномерное движение через нормализацию общего вектора
        app->moveCamera(app->normalize(move, 0.1));
        app->updateCamera();

        // Рисование объектов
        glLoadIdentity();
        glBegin(GL_POLYGON);
        glTexCoord2f(0.0f, 0.0f);  glVertex3f(-1.0,  1.0, -1.0);
        glTexCoord2f(1.0f, 0.0f);  glVertex3f( 1.0,  1.0, -1.0);
        glTexCoord2f(1.0f, 1.0f);  glVertex3f( 1.0, -1.0, -1.0);
        glTexCoord2f(0.0f, 1.0f);  glVertex3f(-1.0, -1.0, -1.0);
        glEnd();
    }

    app->destroy();
}
makefile:
all:
	g++ -o main main.cc -lSDL2 -lGL -lm
	./main