1#ifndef TATOOINE_RENDERING_INTERACTIVE_H
2#define TATOOINE_RENDERING_INTERACTIVE_H
19template <
typename... Renderers>
22 if constexpr (
requires { Renderers::set_view_matrix(V); }) {
23 Renderers::set_view_matrix(V);
28template <
typename... Renderers>
32 if constexpr (
requires { Renderers::set_projection_matrix(P); }) {
33 Renderers::set_projection_matrix(P);
38template <
typename... Renderers>
42 if constexpr (
requires { Renderers::set_view_projection_matrix(VP); }) {
43 Renderers::set_view_projection_matrix(VP);
48 [[nodiscard]]
static auto get() ->
auto& {
59template <std::size_t... Is, interactively_renderable... Renderables>
60auto show(std::index_sequence<Is...> , Renderables&&... renderables) {
66 using renderable_t = std::decay_t<
decltype(renderables)>;
68 return renderable_t::value_type::num_dimensions();
70 return renderables.num_dimensions();
73 if (max_num_dimensions == 2) {
74 window.camera_controller().use_orthographic_camera();
75 window.camera_controller().use_orthographic_controller();
76 }
else if (max_num_dimensions == 3) {
77 window.camera_controller().use_perspective_camera();
78 window.camera_controller().use_fps_controller();
80 window.add_resize_event([&](
int ,
int ) {
82 window.camera_controller().active_camera().projection_matrix();
83 set_projection_matrices(P, renderer_type_set{});
85 window.add_wheel_up_event([&]() {
87 window.camera_controller().active_camera().projection_matrix();
88 set_projection_matrices(P, renderer_type_set{});
90 window.add_wheel_down_event([&]() {
92 window.camera_controller().active_camera().projection_matrix();
93 set_projection_matrices(P, renderer_type_set{});
101 auto enable_renderer = std::array{((void)renderables,
true)...};
102 auto renderers = std::tuple{[&](
auto&& renderable) {
103 using type =
decltype(renderable);
104 using decayed_type = std::decay_t<type>;
106 requires(type t) { t.render(); } ||
107 requires(type t) { t.late_render(); } ||
109 t.render(renderable, window.camera_controller().active_camera());
112 }
else if constexpr (
118 t.render(renderable, window.camera_controller().active_camera());
124 auto foreach_renderer = [&](
auto&& f) {
125 (f(std::get<Is>(renderers), renderables, Is), ...);
128 window.add_button_released_event([&](
gl::button b) {
129 foreach_renderer([&](
auto&
renderer,
auto& ,
auto i) {
130 if (enable_renderer[i]) {
131 if constexpr (
requires {
renderer.on_button_released(b); }) {
134 if constexpr (
requires {
136 b, window.camera_controller().active_camera());
139 b, window.camera_controller().active_camera());
144 window.add_button_pressed_event([&](
gl::button b) {
145 foreach_renderer([&](
auto&
renderer,
auto& ,
auto i) {
146 if (enable_renderer[i]) {
147 if constexpr (
requires {
renderer.on_button_pressed(b); }) {
150 if constexpr (
requires {
152 b, window.camera_controller().active_camera());
155 b, window.camera_controller().active_camera());
160 window.add_cursor_moved_event([&](
double const x,
double const y) {
161 foreach_renderer([&](
auto&
renderer,
auto& ,
auto i) {
162 if (enable_renderer[i]) {
163 if constexpr (
requires {
renderer.on_cursor_moved(x, y); }) {
166 if constexpr (
requires {
168 x, y, window.camera_controller().active_camera());
171 window.camera_controller().active_camera());
177 window.render_loop([&](
auto const dt) {
178 auto const V = window.camera_controller().view_matrix();
179 set_view_matrices(V, renderer_type_set{});
182 ImGui::Begin(
"Properties");
184 foreach_renderer([&](
auto&
renderer,
auto& renderable,
auto i) {
185 if (enable_renderer[i]) {
186 if constexpr (
requires {
renderer.update(dt); }) {
189 if constexpr (
requires {
renderer.update(dt, renderable); }) {
192 if constexpr (
requires {
195 window.camera_controller().active_camera());
198 window.camera_controller().active_camera());
200 if constexpr (
requires {
renderer.render(); }) {
203 if constexpr (
requires {
renderer.render(renderable); }) {
206 if constexpr (
requires {
209 window.camera_controller().active_camera());
212 window.camera_controller().active_camera());
216 ImGui::PushID(
static_cast<int>(i));
218 if constexpr (
requires {
renderer.properties(renderable); }) {
223 if constexpr (
requires {
renderer.properties(); }) {
234 foreach_renderer([&](
auto&
renderer,
auto& renderable,
auto i) {
235 if (enable_renderer[i]) {
236 if constexpr (
requires {
renderer.late_render(); }) {
239 if constexpr (
requires {
renderer.late_render(renderable); }) {
248 show(std::make_index_sequence<
sizeof...(renderables)>{},
249 std::forward<decltype(renderables)>(renderables)...);
Definition: concepts.h:84
Definition: interactively_renderable.h:12
typename type_set_constructor< type_list<>, Ts... >::type type_set
Definition: type_set.h:132
auto ToggleButton(const char *str_id, bool *v) -> bool
Definition: vtp_writer.h:3
DLL_API auto clear_color(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) -> void
button
Definition: mouse.h:8
DLL_API auto clear_depth_buffer() -> void
DLL_API auto clear_color_depth_buffer() -> void
auto set_view_projection_matrices(Mat4< GLfloat > const &VP, type_set_impl< Renderers... >)
Definition: interactive.h:39
auto set_projection_matrices(Mat4< GLfloat > const &P, type_set_impl< Renderers... >)
Definition: interactive.h:29
auto set_view_matrices(Mat4< GLfloat > const &V, type_set_impl< Renderers... >)
Definition: interactive.h:20
Definition: interactive.h:15
auto pre_setup()
Call this function if you need to create gpu data before calling render.
Definition: interactive.h:57
auto show(std::index_sequence< Is... >, Renderables &&... renderables)
Definition: interactive.h:60
constexpr auto invoke(invocable auto &&...funcs)
Definition: functional.h:8
constexpr auto max(A &&a, B &&b)
Definition: math.h:20
Definition: first_person_window.h:15
Definition: interactive.h:47
static auto get() -> auto &
Definition: interactive.h:48
Inherits from a type_list with only unique types.
Definition: type_set.h:138