]> git.localhorst.tv Git - blank.git/blobdiff - src/app.cpp
random walk test controller
[blank.git] / src / app.cpp
index de7a39ea48add859bcebda28a3f9fcfbe6efe00a..cfb16822897a01027da39d62c3624da6fe7fd52b 100644 (file)
@@ -4,75 +4,67 @@
 #include <stdexcept>
 
 
-namespace {
-
-constexpr GLfloat vtx_coords[] = {
-       -1.0f, -1.0f, -5.0f,
-        1.0f, -1.0f, -5.0f,
-        0.0f,  1.0f, -5.0f,
-};
-
-}
-
 namespace blank {
 
 Application::Application()
 : init_sdl()
+, init_img()
 , init_gl()
 , window()
 , ctx(window.CreateContext())
 , init_glew()
 , program()
 , cam()
-, vtx_buf(0)
-, mvp_handle(0)
+, world()
+, interface(world)
+, test_controller(MakeTestEntity(world))
 , running(false) {
        GLContext::EnableVSync();
-       program.LoadShader(
-               GL_VERTEX_SHADER,
-               "#version 330 core\n"
-               "layout(location = 0) in vec3 vertexPosition_modelspace;\n"
-               "uniform mat4 MVP;\n"
-               "void main() {\n"
-                       "vec4 v = vec4(vertexPosition_modelspace, 1);\n"
-                       "gl_Position = MVP * v;\n"
-               "}\n"
-       );
-       program.LoadShader(
-               GL_FRAGMENT_SHADER,
-               "#version 330 core\n"
-               "out vec3 color;\n"
-               "void main() {\n"
-                       "color = vec3(1, 1, 1);\n"
-               "}\n"
-       );
-       program.Link();
-       if (!program.Linked()) {
-               program.Log(std::cerr);
-               throw std::runtime_error("link program");
-       }
 
-       GLuint VertexArrayID;
-       glGenVertexArrays(1, &VertexArrayID);
-       glBindVertexArray(VertexArrayID);
+       glClearColor(0.0, 0.0, 0.0, 1.0);
+}
 
-       glGenBuffers(1, &vtx_buf);
-       glBindBuffer(GL_ARRAY_BUFFER, vtx_buf);
-       glBufferData(GL_ARRAY_BUFFER, sizeof(vtx_coords), vtx_coords, GL_STATIC_DRAW);
+Entity &Application::MakeTestEntity(World &world) {
+       Entity &e = world.AddEntity();
+       e.Position({ 0.0f, 0.0f, 0.0f });
+       e.SetShape(world.BlockTypes()[1]->shape, { 1.0f, 1.0f, 0.0f });
+       e.AngularVelocity(glm::quat(glm::vec3{ 0.00001f, 0.000006f, 0.000013f }));
+       return e;
+}
 
-       mvp_handle = program.UniformLocation("MVP");
 
-       glClearColor(0.0, 0.0, 0.0, 1.0);
+void Application::RunN(size_t n) {
+       Uint32 last = SDL_GetTicks();
+       for (size_t i = 0; i < n; ++i) {
+               Uint32 now = SDL_GetTicks();
+               int delta = now - last;
+               Loop(delta);
+               last = now;
+       }
 }
 
-Application::~Application() {
+void Application::RunT(size_t t) {
+       Uint32 last = SDL_GetTicks();
+       Uint32 finish = last + t;
+       while (last < finish) {
+               Uint32 now = SDL_GetTicks();
+               int delta = now - last;
+               Loop(delta);
+               last = now;
+       }
+}
 
+void Application::RunS(size_t n, size_t t) {
+       for (size_t i = 0; i < n; ++i) {
+               Loop(t);
+       }
 }
 
 
 void Application::Run() {
        running = true;
        Uint32 last = SDL_GetTicks();
+       window.GrabMouse();
        while (running) {
                Uint32 now = SDL_GetTicks();
                int delta = now - last;
@@ -83,6 +75,7 @@ void Application::Run() {
 
 void Application::Loop(int dt) {
        HandleEvents();
+       Update(dt);
        Render();
 }
 
@@ -91,15 +84,36 @@ void Application::HandleEvents() {
        SDL_Event event;
        while (SDL_PollEvent(&event)) {
                switch (event.type) {
+                       case SDL_KEYDOWN:
+                       case SDL_KEYUP:
+                               interface.Handle(event.key);
+                               break;
+                       case SDL_MOUSEBUTTONDOWN:
+                               interface.Handle(event.button);
+                               break;
+                       case SDL_MOUSEMOTION:
+                               interface.Handle(event.motion);
+                               break;
+                       case SDL_MOUSEWHEEL:
+                               interface.Handle(event.wheel);
+                               break;
                        case SDL_QUIT:
                                running = false;
                                break;
                        case SDL_WINDOWEVENT:
                                switch (event.window.event) {
+                                       case SDL_WINDOWEVENT_FOCUS_GAINED:
+                                               window.GrabMouse();
+                                               break;
+                                       case SDL_WINDOWEVENT_FOCUS_LOST:
+                                               window.ReleaseMouse();
+                                               break;
                                        case SDL_WINDOWEVENT_RESIZED:
                                                cam.Viewport(event.window.data1, event.window.data2);
+                                               interface.Handle(event.window);
                                                break;
                                        default:
+                                               interface.Handle(event.window);
                                                break;
                                }
                                break;
@@ -109,31 +123,21 @@ void Application::HandleEvents() {
        }
 }
 
+void Application::Update(int dt) {
+       interface.Update(dt);
+       test_controller.Update(dt);
+       world.Update(dt);
+}
+
 void Application::Render() {
-       glClear(GL_COLOR_BUFFER_BIT);
-
-       program.Use();
-
-       glm::mat4 model(1.0f); // identity: no transformation
-       glm::mat4 mvp(cam.MakeMVP(model));
-       glUniformMatrix4fv(mvp_handle, 1, GL_FALSE, &mvp[0][0]);
-
-       glEnableVertexAttribArray(0);
-       glBindBuffer(GL_ARRAY_BUFFER, vtx_buf);
-       glVertexAttribPointer(
-               0,        // attribute 0 (for shader)
-               3,        // size
-               GL_FLOAT, // type
-               GL_FALSE, // normalized
-               0,        // stride
-               nullptr   // offset
-       );
-       glDrawArrays(
-               GL_TRIANGLES, // how
-               0,            // start
-               3             // len
-       );
-       glDisableVertexAttribArray(0);
+       GLContext::Clear();
+
+       program.Activate();
+
+       program.SetProjection(cam.Projection());
+       world.Render(program);
+
+       interface.Render(program);
 
        window.Flip();
 }