aboutsummaryrefslogtreecommitdiff
path: root/src/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cc')
-rw-r--r--src/main.cc64
1 files changed, 54 insertions, 10 deletions
diff --git a/src/main.cc b/src/main.cc
index 394248c..a98ca44 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -20,6 +20,7 @@
#include "shader/code/interact.glsl"
#include "shader/code/collide.glsl"
+#include "shader/code/extra.glsl"
#include "timer.h"
@@ -27,6 +28,12 @@ GLuint maxLUPS = 100;
GLuint nX = 512;
GLuint nY = 256;
+enum DisplayMode {
+ VELOCITY,
+ QUALITY,
+ CURL
+};
+
float getWorldHeight(int window_width, int window_height, float world_width) {
return world_width / window_width * window_height;
}
@@ -84,9 +91,11 @@ int render() {
std::unique_ptr<LatticeCellBuffer> lattice_a;
std::unique_ptr<LatticeCellBuffer> lattice_b;
std::unique_ptr<FluidCellBuffer> fluid;
+ std::unique_ptr<FluidCellBuffer> extra;
std::unique_ptr<ComputeShader> interact_shader;
std::unique_ptr<ComputeShader> collide_shader;
+ std::unique_ptr<ComputeShader> extra_shader;
window.init([&]() {
scene_shader = std::make_unique<GraphicShader>(
@@ -94,9 +103,11 @@ int render() {
lattice_a = std::make_unique<LatticeCellBuffer>(nX, nY);
lattice_b = std::make_unique<LatticeCellBuffer>(nX, nY);
+ extra = std::make_unique< FluidCellBuffer>(nX, nY, setupOpenGeometry);
fluid = std::make_unique< FluidCellBuffer>(nX, nY, setupOpenGeometry);
interact_shader = std::make_unique<ComputeShader>(INTERACT_SHADER_CODE);
+ extra_shader = std::make_unique<ComputeShader>(EXTRA_SHADER_CODE);
collide_shader = std::make_unique<ComputeShader>(COLLIDE_SHADER_CODE);
});
@@ -110,8 +121,10 @@ int render() {
auto pause_key = window.getKeyWatcher(GLFW_KEY_SPACE);
bool update_lattice = true;
- auto toggle_key = window.getKeyWatcher(GLFW_KEY_T);
- bool show_fluid_quality = false;
+ auto velocity_mode_key = window.getKeyWatcher(GLFW_KEY_V);
+ auto quality_mode_key = window.getKeyWatcher(GLFW_KEY_Q);
+ auto curl_mode_key = window.getKeyWatcher(GLFW_KEY_C);
+ DisplayMode display_mode = DisplayMode::VELOCITY;
auto palette_factor_incr = window.getKeyWatcher(GLFW_KEY_UP);
auto palette_factor_decr = window.getKeyWatcher(GLFW_KEY_DOWN);
@@ -125,8 +138,8 @@ int render() {
float currLatticeMouseX;
float currLatticeMouseY;
- auto tick_buffers = { lattice_a->getBuffer(), lattice_b->getBuffer(), fluid->getBuffer() };
- auto tock_buffers = { lattice_b->getBuffer(), lattice_a->getBuffer(), fluid->getBuffer() };
+ auto tick_buffers = { lattice_a->getBuffer(), lattice_b->getBuffer(), fluid->getBuffer(), extra->getBuffer() };
+ auto tock_buffers = { lattice_b->getBuffer(), lattice_a->getBuffer(), fluid->getBuffer(), extra->getBuffer() };
GLuint iT = 0;
int statLUPS = 0;
@@ -146,14 +159,22 @@ int render() {
update_lattice = !update_lattice;
}
- if ( toggle_key.wasClicked() ) {
- show_fluid_quality = !show_fluid_quality;
+ if ( velocity_mode_key.wasClicked() ) {
+ display_mode = DisplayMode::VELOCITY;
+ fluid->enable();
+ }
+ if ( quality_mode_key.wasClicked() ) {
+ display_mode = DisplayMode::QUALITY;
+ fluid->enable();
+ }
+ if ( curl_mode_key.wasClicked() ) {
+ display_mode = DisplayMode::CURL;
+ extra->enable();
}
if ( palette_factor_incr.wasClicked() ) {
palette_factor += 1;
}
-
if ( palette_factor_decr.wasClicked() ) {
palette_factor -= 1;
}
@@ -175,10 +196,12 @@ int render() {
if ( tick ) {
interact_shader->workOn(tick_buffers);
collide_shader->workOn(tick_buffers);
+ extra_shader->workOn(tick_buffers);
tick = false;
} else {
interact_shader->workOn(tock_buffers);
collide_shader->workOn(tock_buffers);
+ extra_shader->workOn(tock_buffers);
tick = true;
}
@@ -186,13 +209,18 @@ int render() {
{
auto guard = collide_shader->use();
- collide_shader->setUniform("show_fluid_quality", show_fluid_quality);
+ collide_shader->setUniform("show_fluid_quality", display_mode == DisplayMode::QUALITY);
collide_shader->setUniform("iT", iT);
iT += 1;
collide_shader->dispatch(nX, nY);
}
+ if ( display_mode == DisplayMode::CURL ) {
+ auto guard = extra_shader->use();
+ extra_shader->dispatch(nX, nY);
+ }
+
last_lattice_update = timer::now();
}
@@ -228,11 +256,27 @@ int render() {
scene_shader->setUniform("MVP", MVP);
scene_shader->setUniform("nX", nX);
scene_shader->setUniform("nY", nY);
- scene_shader->setUniform("show_fluid_quality", show_fluid_quality);
scene_shader->setUniform("palette_factor", palette_factor);
glClear(GL_COLOR_BUFFER_BIT);
- fluid->draw();
+
+ switch ( display_mode ) {
+ case DisplayMode::VELOCITY:
+ scene_shader->setUniform("show_fluid_quality", false);
+ scene_shader->setUniform("show_curl", false);
+ fluid->draw();
+ break;
+ case DisplayMode::QUALITY:
+ scene_shader->setUniform("show_fluid_quality", true);
+ scene_shader->setUniform("show_curl", false);
+ fluid->draw();
+ break;
+ case DisplayMode::CURL:
+ scene_shader->setUniform("show_fluid_quality", false);
+ scene_shader->setUniform("show_curl", true);
+ extra->draw();
+ break;
+ }
}
});