summaryrefslogtreecommitdiff
path: root/tangle/util/render_window.h
diff options
context:
space:
mode:
authorAdrian Kummerlaender2021-05-17 00:15:33 +0200
committerAdrian Kummerlaender2021-05-17 00:15:33 +0200
commit4ec94c97879aafef15f7663135745e4ba61e62cf (patch)
tree322ae3f003892513f529842ff0b3fd100573b680 /tangle/util/render_window.h
downloadLiterateLB-4ec94c97879aafef15f7663135745e4ba61e62cf.tar
LiterateLB-4ec94c97879aafef15f7663135745e4ba61e62cf.tar.gz
LiterateLB-4ec94c97879aafef15f7663135745e4ba61e62cf.tar.bz2
LiterateLB-4ec94c97879aafef15f7663135745e4ba61e62cf.tar.lz
LiterateLB-4ec94c97879aafef15f7663135745e4ba61e62cf.tar.xz
LiterateLB-4ec94c97879aafef15f7663135745e4ba61e62cf.tar.zst
LiterateLB-4ec94c97879aafef15f7663135745e4ba61e62cf.zip
Extract first public LiterateLB version
Diffstat (limited to 'tangle/util/render_window.h')
-rw-r--r--tangle/util/render_window.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/tangle/util/render_window.h b/tangle/util/render_window.h
new file mode 100644
index 0000000..4392150
--- /dev/null
+++ b/tangle/util/render_window.h
@@ -0,0 +1,95 @@
+#pragma once
+
+#include <SFML/Graphics.hpp>
+#include <SFML/Graphics/Image.hpp>
+
+#include <imgui.h>
+#include <imgui-SFML.h>
+
+#include "texture.h"
+#include "assets.h"
+
+class RenderWindow {
+private:
+sf::RenderWindow _window;
+
+sf::Sprite _render_sprite;
+sf::Texture _render_texture;
+cudaSurfaceObject_t _render_surface;
+sf::Rect<int> _render_texture_view;
+
+sf::Shader _blur_shader;
+bool _blur = false;
+
+sf::Clock _ui_delta_clock;
+
+public:
+RenderWindow(std::string name):
+ _window(sf::VideoMode(800, 600), name) {
+ _render_texture.create(sf::VideoMode::getDesktopMode().width, sf::VideoMode::getDesktopMode().height);
+ _render_surface = bindTextureToCuda(_render_texture);
+ _render_sprite.setTexture(_render_texture);
+ _render_texture_view = sf::Rect<int>(0,0,_window.getSize().x,_window.getSize().y);
+ _render_sprite.setTextureRect(_render_texture_view);
+ _window.setView(sf::View(sf::Vector2f(_render_texture_view.width/2, _render_texture_view.height/2),
+ sf::Vector2f(_window.getSize().x, _window.getSize().y)));
+ _window.setVerticalSyncEnabled(true);
+ _blur_shader.loadFromMemory(std::string(reinterpret_cast<const char*>(assets::shader::file_blur_frag)), sf::Shader::Fragment);
+ _blur_shader.setUniform("texture", sf::Shader::CurrentTexture);
+ ImGui::SFML::Init(_window);
+ ImGuiIO& io = ImGui::GetIO();
+ io.MouseDrawCursor = true;
+};
+
+bool isOpen() const {
+ return _window.isOpen();
+}
+
+void setBlur(bool state) {
+ _blur = state;
+}
+
+template <typename UI, typename MOUSE>
+void draw(UI ui, MOUSE mouse);
+
+cudaSurfaceObject_t getRenderSurface() {
+ return _render_surface;
+}
+
+sf::Rect<int> getRenderView() {
+ return _render_texture_view;
+}
+
+};
+
+template <typename UI, typename MOUSE>
+void RenderWindow::draw(UI ui, MOUSE mouse) {
+ sf::Event event;
+ while (_window.pollEvent(event)) {
+ ImGui::SFML::ProcessEvent(event);
+ if (event.type == sf::Event::Closed) {
+ _window.close();
+ }
+ if (event.type == sf::Event::Resized) {
+ _render_texture_view = sf::Rect<int>(0,0,event.size.width,event.size.height);
+ _render_sprite.setTextureRect(_render_texture_view);
+ sf::View view(sf::Vector2f(_render_texture_view.width/2, _render_texture_view.height/2),
+ sf::Vector2f(event.size.width, event.size.height));
+ _window.setView(view);
+ }
+ if (!ImGui::GetIO().WantCaptureMouse) {
+ mouse(event);
+ }
+ }
+
+ ImGui::SFML::Update(_window, _ui_delta_clock.restart());
+ ui();
+ _window.clear();
+ if (_blur) {
+ _window.draw(_render_sprite, &_blur_shader);
+ } else {
+ _window.draw(_render_sprite);
+ }
+ ImGui::SFML::Render(_window);
+ _window.display();
+}