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**)