1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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();
}
|