3 #define IMGUI_DEFINE_MATH_OPERATORS
4 #include "imgui/imgui_internal.h"
15 const auto size = ImGui::GetWindowSize();
16 ImDrawList* draw_list = ImGui::GetWindowDrawList();
18 const float scaled_grid_size = cc.
grid_size * view.scale;
20 for(
float x = fmodf(view.scroll.x, scaled_grid_size);
x < size.x;
x += scaled_grid_size)
24 ImVec2(
x, 0.0f) + position,
25 ImVec2(
x, size.y) + position,
30 for(
float y = fmodf(view.scroll.y, scaled_grid_size);
y < size.y;
y += scaled_grid_size)
34 ImVec2(0.0f,
y) + position,
35 ImVec2(size.x,
y) + position,
42 Canvas::draw_vertical_line(
float rx, ImU32 grid_color)
const
44 const auto x = view.scroll.x + rx * view.scale;
45 const auto size = ImGui::GetWindowSize();
46 ImDrawList* draw_list = ImGui::GetWindowDrawList();
49 ImVec2(
x, 0.0f) + position,
50 ImVec2(
x, size.y) + position,
56 Canvas::draw_horizontal_line(
float ry, ImU32 grid_color)
const
58 const auto y = view.scroll.y + ry * view.scale;
59 const auto size = ImGui::GetWindowSize();
60 ImDrawList* draw_list = ImGui::GetWindowDrawList();
63 ImVec2(0.0f,
y) + position,
64 ImVec2(size.x,
y) + position,
70 Canvas::show_ruler(
float ruler_interval, ImU32 ruler_color,
float length)
const
72 const auto size = ImGui::GetWindowSize();
73 ImDrawList* draw_list = ImGui::GetWindowDrawList();
75 const float scaled_grid_size = ruler_interval * view.scale;
77 for(
float x = fmodf(view.scroll.x, scaled_grid_size);
x < size.x;
78 x += scaled_grid_size)
82 ImVec2(
x, 0.0f) + position,
83 ImVec2(
x, length) + position,
88 for(
float y = fmodf(view.scroll.y, scaled_grid_size);
y < size.y;
89 y += scaled_grid_size)
93 ImVec2(0.0f,
y) + position,
94 ImVec2(length,
y) + position,
109 ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(1, 1));
110 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0));
118 ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoMove
121 position = ImGui::GetCursorScreenPos();
127 if(ImGui::IsWindowHovered() && !ImGui::IsAnyItemActive() && ImGui::IsMouseDragging(2, 0.0f))
129 canvas->
view.
pan(
con(ImGui::GetIO().MouseDelta));
136 if(ImGui::IsWindowHovered() && !ImGui::IsAnyItemActive())
138 const auto mouse = ImGui::GetIO().MousePos - canvas->
position;
139 const auto zoom = ImGui::GetIO().MouseWheel;
152 ImGui::PopStyleColor();
153 ImGui::PopStyleVar(2);
157 Canvas::from_world_to_screen(
const ImVec2& v)
const
159 return con(view.from_world_to_screen(
con(
v))) + position;
163 Canvas::from_world_to_screen_size(
const ImVec2& v)
const
165 return v * view.scale;
169 Canvas::from_screen_to_world(
const ImVec2& v)
const
171 return con(view.from_screen_to_world(
con(
v - position)));
175 Canvas::get_mouse()
const
177 return ImGui::GetMousePos() - position;
constexpr Rgbi con(unsigned char r, unsigned char g, unsigned char b)
void react_to_canvas_zoom_events(Canvas *canvas, const CanvasConfig &cc)
void react_to_canvas_scroll_events(Canvas *canvas)
void zoom(const vec2f &mouse, float zoom)