#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;
void Application::Loop(int dt) {
HandleEvents();
+ Update(dt);
Render();
}
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;
}
}
+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();
}