aboutsummaryrefslogtreecommitdiff
path: root/src/glfw
diff options
context:
space:
mode:
authorAdrian Kummerlaender2018-12-15 23:09:32 +0100
committerAdrian Kummerlaender2018-12-15 23:09:32 +0100
commit44f5ac32a68a617f93704d44c4339f7db13b323e (patch)
tree6c191524aca1c7dbf3329026a59cfa3bc0109d2f /src/glfw
downloadcompustream-44f5ac32a68a617f93704d44c4339f7db13b323e.tar
compustream-44f5ac32a68a617f93704d44c4339f7db13b323e.tar.gz
compustream-44f5ac32a68a617f93704d44c4339f7db13b323e.tar.bz2
compustream-44f5ac32a68a617f93704d44c4339f7db13b323e.tar.lz
compustream-44f5ac32a68a617f93704d44c4339f7db13b323e.tar.xz
compustream-44f5ac32a68a617f93704d44c4339f7db13b323e.tar.zst
compustream-44f5ac32a68a617f93704d44c4339f7db13b323e.zip
Hacky D2Q9 BGK LBM on GPU using GLSL compute shaders
Improvised on top of computicles's scaffolding. Works in a world where _works_ is defined as "displays stuff on screen that invokes thoughts of fluid movement".
Diffstat (limited to 'src/glfw')
-rw-r--r--src/glfw/guard.cc16
-rw-r--r--src/glfw/guard.h11
-rw-r--r--src/glfw/key_watcher.cc24
-rw-r--r--src/glfw/key_watcher.h17
-rw-r--r--src/glfw/window.cc32
-rw-r--r--src/glfw/window.h58
6 files changed, 158 insertions, 0 deletions
diff --git a/src/glfw/guard.cc b/src/glfw/guard.cc
new file mode 100644
index 0000000..5ba853f
--- /dev/null
+++ b/src/glfw/guard.cc
@@ -0,0 +1,16 @@
+#include "guard.h"
+
+#include <GL/glew.h>
+#include <GLFW/glfw3.h>
+
+GlfwGuard::GlfwGuard() {
+ _good = glfwInit();
+}
+
+GlfwGuard::~GlfwGuard() {
+ glfwTerminate();
+}
+
+bool GlfwGuard::isGood() const {
+ return _good;
+}
diff --git a/src/glfw/guard.h b/src/glfw/guard.h
new file mode 100644
index 0000000..f68954d
--- /dev/null
+++ b/src/glfw/guard.h
@@ -0,0 +1,11 @@
+#pragma once
+
+class GlfwGuard {
+private:
+ bool _good = false;
+public:
+ GlfwGuard();
+ ~GlfwGuard();
+
+ bool isGood() const;
+};
diff --git a/src/glfw/key_watcher.cc b/src/glfw/key_watcher.cc
new file mode 100644
index 0000000..21a570a
--- /dev/null
+++ b/src/glfw/key_watcher.cc
@@ -0,0 +1,24 @@
+#include "key_watcher.h"
+
+KeyWatcher::KeyWatcher(GLFWwindow* handle, int key):
+ _handle(handle),
+ _key(key),
+ _last_state(glfwGetKey(_handle, _key))
+{ }
+
+bool KeyWatcher::wasClicked() {
+ switch ( glfwGetKey(_handle, _key) ) {
+ case GLFW_RELEASE:
+ _last_state = GLFW_RELEASE;
+ return false;
+ case GLFW_PRESS:
+ if ( _last_state == GLFW_RELEASE ) {
+ _last_state = GLFW_PRESS;
+ return true;
+ } else {
+ return false;
+ }
+ default:
+ return false;
+ }
+}
diff --git a/src/glfw/key_watcher.h b/src/glfw/key_watcher.h
new file mode 100644
index 0000000..538829f
--- /dev/null
+++ b/src/glfw/key_watcher.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include <GLFW/glfw3.h>
+
+class KeyWatcher {
+private:
+ GLFWwindow* const _handle;
+
+ int _key;
+ int _last_state;
+
+public:
+ KeyWatcher(GLFWwindow* handle, int key);
+
+ bool wasClicked();
+
+};
diff --git a/src/glfw/window.cc b/src/glfw/window.cc
new file mode 100644
index 0000000..0e57a65
--- /dev/null
+++ b/src/glfw/window.cc
@@ -0,0 +1,32 @@
+#include "window.h"
+
+Window::Window(const std::string& title):
+ _handle(glfwCreateWindow(_width, _height, title.c_str(), NULL, NULL)) {
+ if ( _handle != nullptr ) {
+ glfwMakeContextCurrent(_handle);
+ if ( glewInit() == GLEW_OK ) {
+ _good = true;
+ }
+ glfwMakeContextCurrent(nullptr);
+ }
+}
+
+Window::~Window() {
+ glfwDestroyWindow(_handle);
+}
+
+bool Window::isGood() const {
+ return _good;
+}
+
+int Window::getWidth() const {
+ return _width;
+}
+
+int Window::getHeight() const {
+ return _height;
+}
+
+KeyWatcher Window::getKeyWatcher(int key) {
+ return KeyWatcher(_handle, key);
+}
diff --git a/src/glfw/window.h b/src/glfw/window.h
new file mode 100644
index 0000000..92a1b56
--- /dev/null
+++ b/src/glfw/window.h
@@ -0,0 +1,58 @@
+#pragma once
+
+#include <string>
+
+#include <GL/glew.h>
+#include <GLFW/glfw3.h>
+
+#include "key_watcher.h"
+
+class Window {
+private:
+ bool _good = false;
+ int _width = 800;
+ int _height = 600;
+
+ GLFWwindow* const _handle;
+
+public:
+ Window(const std::string& title);
+ ~Window();
+
+ bool isGood() const;
+
+ int getWidth() const;
+ int getHeight() const;
+
+ KeyWatcher getKeyWatcher(int key);
+
+ template <class F>
+ void init(F f);
+
+ template <class F>
+ void render(F loop);
+};
+
+template <class F>
+void Window::init(F f) {
+ glfwMakeContextCurrent(_handle);
+ f();
+ glfwMakeContextCurrent(nullptr);
+}
+
+template <class F>
+void Window::render(F loop) {
+ glfwMakeContextCurrent(_handle);
+
+ while ( glfwGetKey(_handle, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
+ glfwWindowShouldClose(_handle) == 0 ) {
+ glfwGetWindowSize(_handle, &_width, &_height);
+
+ loop();
+
+ glfwSwapBuffers(_handle);
+ glfwPollEvents();
+ }
+
+ glfwMakeContextCurrent(nullptr);
+}