Olympe Engine 2.0
2D Game Engine with ECS Architecture
Loading...
Searching...
No Matches
CanvasGridRenderer.cpp
Go to the documentation of this file.
2#include <cmath>
3
4namespace Olympe
5{
7 {
9
10 switch (preset)
11 {
13 // Professional dark blue background with subtle gray grid (imnodes StyleColorsDark defaults)
14 // Verified against native imnodes grid appearance (Phase 5)
15 config.majorSpacing = 24.0f;
16 config.minorDivisor = 1.0f; // No minor lines
17 config.backgroundColor = ImVec4(38.0f/255.0f, 38.0f/255.0f, 47.0f/255.0f, 1.0f); // #26262FFF (imnodes native)
18 config.majorLineColor = ImVec4(63.0f/255.0f, 63.0f/255.0f, 71.0f/255.0f, 1.0f); // #3F3F47FF (imnodes native grid line)
19 config.minorLineColor = ImVec4(63.0f/255.0f, 63.0f/255.0f, 71.0f/255.0f, 0.5f); // Same as major with reduced alpha
20 config.majorLineThickness = 1.0f;
21 config.minorLineThickness = 0.5f;
22 break;
23
24 case Style_Compact:
25 // Tight grid for dense layouts
26 config.majorSpacing = 16.0f;
27 config.minorDivisor = 2.0f;
28 config.backgroundColor = ImVec4(16.0f/255.0f, 16.0f/255.0f, 16.0f/255.0f, 224.0f/255.0f); // Darker
29 config.majorLineColor = ImVec4(160.0f/255.0f, 160.0f/255.0f, 160.0f/255.0f, 80.0f/255.0f);
30 config.minorLineColor = ImVec4(80.0f/255.0f, 80.0f/255.0f, 80.0f/255.0f, 30.0f/255.0f);
31 config.majorLineThickness = 1.5f;
32 config.minorLineThickness = 0.5f;
33 break;
34
35 case Style_Spacious:
36 // Wide grid for spacious layouts
37 config.majorSpacing = 50.0f;
38 config.minorDivisor = 5.0f;
39 config.backgroundColor = ImVec4(32.0f/255.0f, 32.0f/255.0f, 48.0f/255.0f, 176.0f/255.0f); // Softer
40 config.majorLineColor = ImVec4(96.0f/255.0f, 96.0f/255.0f, 96.0f/255.0f, 48.0f/255.0f);
41 config.minorLineColor = ImVec4(64.0f/255.0f, 64.0f/255.0f, 64.0f/255.0f, 24.0f/255.0f);
42 config.majorLineThickness = 1.0f;
43 config.minorLineThickness = 0.5f;
44 break;
45 }
46
47 return config;
48 }
49
51 {
52 if (drawList == nullptr)
53 return;
54
55 ImVec2 canvasEnd(config.canvasPos.x + config.canvasSize.x,
56 config.canvasPos.y + config.canvasSize.y);
57
58 // Draw canvas background
59 ImU32 backgroundColor = ImGui::GetColorU32(config.backgroundColor);
60 drawList->AddRectFilled(config.canvasPos, canvasEnd, backgroundColor);
61
62 // Convert colors to ImU32
63 ImU32 majorGridColor = ImGui::GetColorU32(config.majorLineColor);
64 ImU32 minorGridColor = ImGui::GetColorU32(config.minorLineColor);
65
66 // ========== Grid Calculation ==========
67 // Scale grid spacing by zoom level to maintain consistent grid density
68 float scaledGridSpacing = config.majorSpacing * config.zoom;
69 float scaledMinorSpacing = config.minorDivisor > 0.0f ? scaledGridSpacing / config.minorDivisor : scaledGridSpacing;
70
71 // Calculate grid offset in screen space
72 // FIX #3: Pan offset is already in screen space, don't multiply by zoom
73 // Grid origin = canvasPos + offset (NOT offset * zoom)
74 // The zoom scaling is applied to the grid spacing, not the offset
75 float gridStartX = config.canvasPos.x + config.offsetX;
76 float gridStartY = config.canvasPos.y + config.offsetY;
77
78 // Calculate which grid lines should be visible and their screen positions
81
82 // Handle negative modulos (important for negative offsets)
85
86 // ========== Draw Minor Grid Lines (subtle background pattern) ==========
87 if (config.minorDivisor > 1.0f)
88 {
89 // Vertical minor lines
90 for (float x = config.canvasPos.x + gridOffsetX - scaledGridSpacing;
93 {
94 drawList->AddLine(
95 ImVec2(x, config.canvasPos.y),
96 ImVec2(x, canvasEnd.y),
98 config.minorLineThickness
99 );
100 }
101
102 // Horizontal minor lines
103 for (float y = config.canvasPos.y + gridOffsetY - scaledGridSpacing;
106 {
107 drawList->AddLine(
108 ImVec2(config.canvasPos.x, y),
109 ImVec2(canvasEnd.x, y),
111 config.minorLineThickness
112 );
113 }
114 }
115
116 // ========== Draw Major Grid Lines (prominent pattern) ==========
117 // Vertical major lines
118 for (float x = config.canvasPos.x + gridOffsetX - scaledGridSpacing;
121 {
122 drawList->AddLine(
123 ImVec2(x, config.canvasPos.y),
124 ImVec2(x, canvasEnd.y),
126 config.majorLineThickness
127 );
128 }
129
130 // Horizontal major lines
131 for (float y = config.canvasPos.y + gridOffsetY - scaledGridSpacing;
134 {
135 drawList->AddLine(
136 ImVec2(config.canvasPos.x, y),
137 ImVec2(canvasEnd.x, y),
139 config.majorLineThickness
140 );
141 }
142 }
143
145 {
146 ImDrawList* drawList = ImGui::GetWindowDrawList();
148 }
149}
ComponentTypeID GetComponentTypeID_Static()
Definition ECS_Entity.h:56
static GridConfig GetStylePreset(GridStylePreset preset)
Get pre-configured grid style (VisualScript/Compact/Spacious)
static void RenderGrid(ImDrawList *drawList, const GridConfig &config)
Render a grid on the given ImDrawList.
GridStylePreset
Pre-configured grid styles matching professional editors.
< Provides AssetID and INVALID_ASSET_ID
Configuration parameters for grid rendering.