diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a81d80..40130d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.25) -project(graphs VERSION 0.0.41) +project(graphs VERSION 0.0.42) option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF) option(ENABLE_UBSAN "Enable the ub sanitizer" OFF) diff --git a/include/color_constants.h b/include/color_constants.h new file mode 100644 index 0000000..1d00ab0 --- /dev/null +++ b/include/color_constants.h @@ -0,0 +1,34 @@ +#pragma once +/* + * Copyright (C) 2024 Brett Terpstra + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef GRAPHS_COLOR_CONSTANTS_H +#define GRAPHS_COLOR_CONSTANTS_H + +#include + +namespace color +{ + static inline constexpr blt::color4 POINT_OUTLINE_COLOR = blt::make_color(0, 0.6, 0.6); + static inline constexpr blt::color4 POINT_HIGHLIGHT_COLOR = blt::make_color(0, 1.0, 1.0); + static inline constexpr blt::color4 POINT_SELECT_COLOR = blt::make_color(0, 0.9, 0.7); + + static inline constexpr blt::color4 EDGE_COLOR = blt::make_color(0, 0.8, 0); + static inline constexpr blt::color4 EDGE_OUTLINE_COLOR = blt::make_color(0, 1, 0); +} + +#endif //GRAPHS_COLOR_CONSTANTS_H diff --git a/include/graph.h b/include/graph.h index 31647c4..bdac93f 100644 --- a/include/graph.h +++ b/include/graph.h @@ -22,6 +22,7 @@ #include #include #include +#include namespace im = ImGui; @@ -55,7 +56,8 @@ class graph_t std::unique_ptr equation; static constexpr float POINT_SIZE = 35; - blt::i32 current_node = -1; + blt::i32 selected_node = -1; + blt::quint_easing easing; void create_random_graph(bounding_box bb, blt::size_t min_nodes, blt::size_t max_nodes, blt::f64 connectivity, blt::f64 scaling_connectivity, blt::f64 distance_factor); @@ -93,15 +95,19 @@ class graph_t return edges.contains({e1, e2}); } - void render(double frame_time); + void render(); void reset_mouse_drag() { - current_node = -1; + easing.reset(); + nodes[selected_node].setOutlineColor(color::POINT_OUTLINE_COLOR); + selected_node = -1; } void process_mouse_drag(blt::i32 width, blt::i32 height); + void handle_mouse(); + void use_Eades() { equation = std::make_unique(); @@ -173,7 +179,7 @@ class engine_t private: graph_t graph; - void draw_gui(const blt::gfx::window_data& data, double ft); + void draw_gui(const blt::gfx::window_data& data); public: void init(const blt::gfx::window_data& data) @@ -181,19 +187,21 @@ class engine_t graph.make_new({0, 0, data.width, data.height}, 5, 25, 0.2); } - void render(const blt::gfx::window_data& data, const double ft) + void render(const blt::gfx::window_data& data) { - draw_gui(data, ft); + draw_gui(data); auto& io = ImGui::GetIO(); - if (!io.WantCaptureMouse && blt::gfx::isMousePressed(0)) - graph.process_mouse_drag(data.width, data.height); - else - graph.reset_mouse_drag(); + if (!io.WantCaptureMouse){ + if (blt::gfx::isMousePressed(0)) + graph.process_mouse_drag(data.width, data.height); + else + graph.reset_mouse_drag(); + } - graph.render(ft); + graph.render(); } }; diff --git a/include/graph_base.h b/include/graph_base.h index c54d346..91f4e21 100644 --- a/include/graph_base.h +++ b/include/graph_base.h @@ -22,6 +22,8 @@ #include #include #include +#include + class node { @@ -29,7 +31,7 @@ class node blt::gfx::point2d_t point; float outline_scale = 1.25f; blt::vec2 velocity; - blt::color4 outline_color = blt::make_color(0.0, 1.0, 1.0); + blt::color4 outline_color = color::POINT_OUTLINE_COLOR; public: explicit node(const blt::gfx::point2d_t& point): point(point) {} @@ -82,8 +84,8 @@ class edge blt::u64 i1, i2; float outline_scale = 2.0f; float thickness = 2.0f; - blt::color4 color = blt::make_color(0, 1, 0); - blt::color4 outline_color = blt::make_color(1, 0, 0); + blt::color4 color = color::EDGE_COLOR; + blt::color4 outline_color = color::EDGE_OUTLINE_COLOR; public: edge(blt::u64 i1, blt::u64 i2): i1(i1), i2(i2) { diff --git a/src/graph.cpp b/src/graph.cpp index f187c2f..a628a83 100644 --- a/src/graph.cpp +++ b/src/graph.cpp @@ -19,14 +19,17 @@ #include #include #include +#include +#include extern blt::gfx::batch_renderer_2d renderer_2d; extern blt::gfx::matrix_state_manager global_matrices; int sub_ticks = 1; -void graph_t::render(const double frame_time) +void graph_t::render() { + const double frame_time = blt::gfx::getFrameDeltaSeconds(); if (sim && (current_iterations < max_iterations || run_infinitely) && max_force_last > threshold) { for (int _ = 0; _ < sub_ticks; _++) @@ -81,7 +84,7 @@ void graph_t::process_mouse_drag(const blt::i32 width, const blt::i32 height) const auto mouse_pos = blt::make_vec2(blt::gfx::calculateRay2D(width, height, global_matrices.getScale2D(), global_matrices.getView2D(), global_matrices.getOrtho())); - if (current_node < 0) + if (selected_node < 0) { for (const auto& [index, node] : blt::enumerate(nodes)) { @@ -90,12 +93,25 @@ void graph_t::process_mouse_drag(const blt::i32 width, const blt::i32 height) if (const auto mag = dist.magnitude(); mag < POINT_SIZE) { - current_node = static_cast(index); + selected_node = static_cast(index); break; } } } else - nodes[current_node].getPositionRef() = mouse_pos; + { + auto& node = nodes[selected_node]; + easing.progress(5 * static_cast(blt::gfx::getFrameDeltaSeconds())); + node.setOutlineColor(easing.apply(color::POINT_OUTLINE_COLOR, color::POINT_SELECT_COLOR)); + node.getPositionRef() = mouse_pos; + } +} + +void graph_t::handle_mouse() +{ + for (const auto& node : nodes) + { + + } } void graph_t::create_random_graph(bounding_box bb, const blt::size_t min_nodes, const blt::size_t max_nodes, const blt::f64 connectivity, @@ -182,8 +198,9 @@ void graph_t::create_random_graph(bounding_box bb, const blt::size_t min_nodes, } } -void engine_t::draw_gui(const blt::gfx::window_data& data, const double ft) +void engine_t::draw_gui(const blt::gfx::window_data& data) { + double ft = blt::gfx::getFrameDeltaSeconds(); if (im::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize)) { static int min_nodes = 5; diff --git a/src/main.cpp b/src/main.cpp index e14e9fe..68445bd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,25 +19,15 @@ #include "blt/gfx/renderer/resource_manager.h" #include "blt/gfx/renderer/batch_2d_renderer.h" #include "blt/gfx/renderer/camera.h" -#include #include -#include -#include -#include -#include #include #include -#include -#include #include -#include blt::gfx::matrix_state_manager global_matrices; blt::gfx::resource_manager resources; blt::gfx::batch_renderer_2d renderer_2d(resources, global_matrices); blt::gfx::first_person_camera_2d camera; -blt::u64 lastTime; -double ft = 0; namespace im = ImGui; @@ -58,8 +48,6 @@ void init(const blt::gfx::window_data& data) renderer_2d.create(); engine.init(data); - - lastTime = blt::system::nanoTime(); } void update(const blt::gfx::window_data& data) @@ -68,18 +56,13 @@ void update(const blt::gfx::window_data& data) //im::ShowDemoWindow(); - engine.render(data, ft); + engine.render(data); camera.update(); camera.update_view(global_matrices); global_matrices.update(); renderer_2d.render(data.width, data.height); - - const auto currentTime = blt::system::nanoTime(); - const auto diff = currentTime - lastTime; - lastTime = currentTime; - ft = static_cast(diff) / 1000000000.0; } int main(int, const char**)