aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/glfw/window.cc10
-rw-r--r--src/glfw/window.h10
-rw-r--r--src/main.cc21
3 files changed, 25 insertions, 16 deletions
diff --git a/src/glfw/window.cc b/src/glfw/window.cc
index 0e57a65..9e76b57 100644
--- a/src/glfw/window.cc
+++ b/src/glfw/window.cc
@@ -1,5 +1,15 @@
#include "window.h"
+bool Window::updateSize() {
+ const int old_width = _width;
+ const int old_height = _height;
+
+ glfwGetWindowSize(_handle, &_width, &_height);
+
+ return old_width != _width
+ || old_height != _height;
+}
+
Window::Window(const std::string& title):
_handle(glfwCreateWindow(_width, _height, title.c_str(), NULL, NULL)) {
if ( _handle != nullptr ) {
diff --git a/src/glfw/window.h b/src/glfw/window.h
index 92a1b56..ea6075b 100644
--- a/src/glfw/window.h
+++ b/src/glfw/window.h
@@ -15,6 +15,8 @@ private:
GLFWwindow* const _handle;
+ bool updateSize();
+
public:
Window(const std::string& title);
~Window();
@@ -46,9 +48,13 @@ void Window::render(F loop) {
while ( glfwGetKey(_handle, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
glfwWindowShouldClose(_handle) == 0 ) {
- glfwGetWindowSize(_handle, &_width, &_height);
+ const bool window_size_changed = updateSize();
+
+ if ( window_size_changed ) {
+ glViewport(0, 0, getWidth(), getHeight());
+ }
- loop();
+ loop(window_size_changed);
glfwSwapBuffers(_handle);
glfwPollEvents();
diff --git a/src/main.cc b/src/main.cc
index 20d7666..a3a1701 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -26,6 +26,8 @@
constexpr GLuint nX = 128;
constexpr GLuint nY = 128;
+constexpr int lups = 25; // max lattice updates per second
+
float getWorldHeight(int window_width, int window_height, float world_width) {
return world_width / window_width * window_height;
}
@@ -54,11 +56,8 @@ int renderWindow() {
return -1;
}
- int window_width = window.getWidth();
- int window_height = window.getHeight();
-
float world_width = 2*nX;
- float world_height = getWorldHeight(window_width, window_height, world_width);
+ float world_height = getWorldHeight(window.getWidth(), window.getHeight(), world_width);
glm::mat4 MVP = getMVP(world_width, world_height);
@@ -98,24 +97,18 @@ int renderWindow() {
auto tick_buffers = { lattice_a->getBuffer(), lattice_b->getBuffer(), fluid->getBuffer() };
auto tock_buffers = { lattice_b->getBuffer(), lattice_a->getBuffer(), fluid->getBuffer() };
- window.render([&]() {
+ window.render([&](bool window_size_changed) {
if ( pause_key.wasClicked() ) {
update_lattice = !update_lattice;
}
- if ( window.getWidth() != window_width
- || window.getHeight() != window_height ) {
- window_width = window.getWidth();
- window_height = window.getHeight();
-
- glViewport(0, 0, window_width, window_height);
-
- world_height = getWorldHeight(window_width, window_height, world_width);
+ if ( window_size_changed ) {
+ world_height = getWorldHeight(window.getWidth(), window.getHeight(), world_width);
MVP = getMVP(world_width, world_height);
}
if ( update_lattice ) {
- if ( timer::millisecondsSince(last_frame) >= 1000/25 ) {
+ if ( timer::millisecondsSince(last_frame) >= 1000/lups ) {
if ( tick ) {
collide_shader->workOn(tick_buffers);
stream_shader->workOn(tick_buffers);