Olympe Engine 2.0
2D Game Engine with ECS Architecture
Loading...
Searching...
No Matches
NodeStyleRegistry.cpp
Go to the documentation of this file.
1/**
2 * @file NodeStyleRegistry.cpp
3 * @brief Implementation of NodeStyleRegistry.
4 * @author Olympe Engine
5 *
6 * @details
7 * C++14 compliant - no C++17/20 features.
8 */
9
10#include "NodeStyleRegistry.h"
11#include "ColorScheme.h"
12
13namespace Olympe
14{
15
16// ============================================================================
17// Singleton
18// ============================================================================
19
21{
22 static NodeStyleRegistry s_instance;
23 return s_instance;
24}
25
26// ============================================================================
27// Constructor - populate style table
28// ============================================================================
29
31{
32 // ---- BT_Sequence: composite (dark blue) -------------------------------------------------------
33 {
36 s.headerHoveredColor = ColorScheme::Composite_Hovered;
37 s.headerSelectedColor = ColorScheme::Composite_Selected;
38 s.icon = "->";
39 m_styles[static_cast<int>(NodeType::BT_Sequence)] = s;
40 }
41
42 // ---- BT_Selector: composite (dark blue) -----------------------------------------------
43 {
46 s.headerHoveredColor = ColorScheme::Composite_Hovered;
47 s.headerSelectedColor = ColorScheme::Composite_Selected;
48 s.icon = "?";
49 m_styles[static_cast<int>(NodeType::BT_Selector)] = s;
50 }
51
52 // ---- BT_Action: action (orange) ------------------------------------------------
53 {
56 s.headerHoveredColor = ColorScheme::Action_Hovered;
57 s.headerSelectedColor = ColorScheme::Action_Selected;
58 s.icon = "A";
59 m_styles[static_cast<int>(NodeType::BT_Action)] = s;
60 }
61
62 // ---- BT_Condition: flow control (purple) ---------------------------
63 {
66 s.headerHoveredColor = ColorScheme::FlowControl_Hovered;
67 s.headerSelectedColor = ColorScheme::FlowControl_Selected;
68 s.icon = "C";
69 m_styles[static_cast<int>(NodeType::BT_Condition)] = s;
70 }
71
72 // ---- BT_Decorator: inverter (purple-plum) ----------------------------
73 {
76 s.headerHoveredColor = ColorScheme::Inverter_Hovered;
77 s.headerSelectedColor = ColorScheme::Inverter_Selected;
78 s.icon = "D";
79 m_styles[static_cast<int>(NodeType::BT_Decorator)] = s;
80 }
81
82 // ---- BT_Root: entry point (green) ----------------------------------------
83 {
86 s.headerHoveredColor = ColorScheme::EntryPoint_Hovered;
87 s.headerSelectedColor = ColorScheme::EntryPoint_Selected;
88 s.icon = "R";
89 m_styles[static_cast<int>(NodeType::BT_Root)] = s;
90 }
91
92 // ---- BT_OnEvent: entry point (green) ------------------------------------
93 {
96 s.headerHoveredColor = ColorScheme::EntryPoint_Hovered;
97 s.headerSelectedColor = ColorScheme::EntryPoint_Selected;
98 s.icon = "E";
99 m_styles[static_cast<int>(NodeType::BT_OnEvent)] = s;
100 }
101
102 // ---- BT_Parallel: composite (dark blue) --------------------------------
103 {
104 NodeStyle s;
106 s.headerHoveredColor = ColorScheme::Composite_Hovered;
107 s.headerSelectedColor = ColorScheme::Composite_Selected;
108 s.icon = "||";
109 m_styles[static_cast<int>(NodeType::BT_Parallel)] = s;
110 }
111
112 // ---- BT_RandomSelector: composite (dark blue) --------------------------
113 {
114 NodeStyle s;
116 s.headerHoveredColor = ColorScheme::Composite_Hovered;
117 s.headerSelectedColor = ColorScheme::Composite_Selected;
118 s.icon = "R?";
119 m_styles[static_cast<int>(NodeType::BT_RandomSelector)] = s;
120 }
121
122 // ---- BT_ParallelThreshold: composite (dark blue) -----------------------
123 {
124 NodeStyle s;
126 s.headerHoveredColor = ColorScheme::Composite_Hovered;
127 s.headerSelectedColor = ColorScheme::Composite_Selected;
128 s.icon = "≈";
129 m_styles[static_cast<int>(NodeType::BT_ParallelThreshold)] = s;
130 }
131
132 // ---- BT_Inverter: inverter (purple-plum) --------------------------------
133 {
134 NodeStyle s;
136 s.headerHoveredColor = ColorScheme::Inverter_Hovered;
137 s.headerSelectedColor = ColorScheme::Inverter_Selected;
138 s.icon = "!";
139 m_styles[static_cast<int>(NodeType::BT_Inverter)] = s;
140 }
141
142 // ---- BT_Monitor: inverter (purple-plum) --------------------------------
143 {
144 NodeStyle s;
146 s.headerHoveredColor = ColorScheme::Inverter_Hovered;
147 s.headerSelectedColor = ColorScheme::Inverter_Selected;
148 s.icon = "◉";
149 m_styles[static_cast<int>(NodeType::BT_Monitor)] = s;
150 }
151
152 // ---- BT_Repeater: repeater (yellow) ------------------------------------
153 {
154 NodeStyle s;
156 s.headerHoveredColor = ColorScheme::Repeater_Hovered;
157 s.headerSelectedColor = ColorScheme::Repeater_Selected;
158 s.icon = "∞";
159 m_styles[static_cast<int>(NodeType::BT_Repeater)] = s;
160 }
161
162 // ---- BT_UntilSuccess: repeater (yellow) --------------------------------
163 {
164 NodeStyle s;
166 s.headerHoveredColor = ColorScheme::Repeater_Hovered;
167 s.headerSelectedColor = ColorScheme::Repeater_Selected;
168 s.icon = "▲";
169 m_styles[static_cast<int>(NodeType::BT_UntilSuccess)] = s;
170 }
171
172 // ---- BT_UntilFailure: repeater (yellow) --------------------------------
173 {
174 NodeStyle s;
176 s.headerHoveredColor = ColorScheme::Repeater_Hovered;
177 s.headerSelectedColor = ColorScheme::Repeater_Selected;
178 s.icon = "▼";
179 m_styles[static_cast<int>(NodeType::BT_UntilFailure)] = s;
180 }
181
182 // ---- BT_Cooldown: inverter (purple-plum) --------------------------------
183 {
184 NodeStyle s;
186 s.headerHoveredColor = ColorScheme::Inverter_Hovered;
187 s.headerSelectedColor = ColorScheme::Inverter_Selected;
188 s.icon = "⏱";
189 m_styles[static_cast<int>(NodeType::BT_Cooldown)] = s;
190 }
191
192 // ---- BT_SendMessage: action (orange) -----------------------------------
193 {
194 NodeStyle s;
196 s.headerHoveredColor = ColorScheme::Action_Hovered;
197 s.headerSelectedColor = ColorScheme::Action_Selected;
198 s.icon = "→";
199 m_styles[static_cast<int>(NodeType::BT_SendMessage)] = s;
200 }
201
202 // ---- BT_SubGraph: subgraph (teal) --------------------------------------
203 {
204 NodeStyle s;
206 s.headerHoveredColor = ColorScheme::SubGraph_Hovered;
207 s.headerSelectedColor = ColorScheme::SubGraph_Selected;
208 s.icon = "⊕";
209 m_styles[static_cast<int>(NodeType::BT_SubGraph)] = s;
210 }
211
212 // ---- HFSM_State: subgraph (teal) -----------------------------------------------
213 {
214 NodeStyle s;
216 s.headerHoveredColor = ColorScheme::SubGraph_Hovered;
217 s.headerSelectedColor = ColorScheme::SubGraph_Selected;
218 s.icon = "S";
219 m_styles[static_cast<int>(NodeType::HFSM_State)] = s;
220 }
221
222 // ---- HFSM_Transition: action (orange) ------------------------------------
223 {
224 NodeStyle s;
226 s.headerHoveredColor = ColorScheme::Action_Hovered;
227 s.headerSelectedColor = ColorScheme::Action_Selected;
228 s.icon = "T";
229 m_styles[static_cast<int>(NodeType::HFSM_Transition)] = s;
230 }
231
232 // ---- Comment: comment (gray) ------------------------------------------
233 {
234 NodeStyle s;
236 s.headerHoveredColor = ColorScheme::Comment_Hovered;
237 s.headerSelectedColor = ColorScheme::Comment_Selected;
238 s.icon = "//";
239 m_styles[static_cast<int>(NodeType::Comment)] = s;
240 }
241
242 // =========================================================================
243 // VS node type styles (keyed by string name)
244 // =========================================================================
245
246 // ---- EntryPoint: dark violet -------------------------------------------
247 {
248 NodeStyle s;
249 s.headerColor = IM_COL32(90, 30, 140, 255);
250 s.headerHoveredColor = IM_COL32(115, 55, 165, 255);
251 s.headerSelectedColor = IM_COL32(140, 80, 190, 255);
252 s.icon = ">";
253 m_vsStyles["EntryPoint"] = s;
254 }
255
256 // ---- Branch: orange ----------------------------------------------------
257 {
258 NodeStyle s;
259 s.headerColor = IM_COL32(160, 90, 10, 255);
260 s.headerHoveredColor = IM_COL32(185, 115, 35, 255);
261 s.headerSelectedColor = IM_COL32(210, 140, 60, 255);
262 s.icon = "?";
263 m_vsStyles["Branch"] = s;
264 }
265
266 // ---- Switch: dark orange -----------------------------------------------
267 {
268 NodeStyle s;
269 s.headerColor = IM_COL32(140, 70, 10, 255);
270 s.headerHoveredColor = IM_COL32(165, 95, 35, 255);
271 s.headerSelectedColor = IM_COL32(190, 120, 60, 255);
272 s.icon = "/";
273 m_vsStyles["Switch"] = s;
274 }
275
276 // ---- VSSequence: light blue --------------------------------------------
277 {
278 NodeStyle s;
279 s.headerColor = IM_COL32(30, 100, 170, 255);
280 s.headerHoveredColor = IM_COL32(55, 125, 195, 255);
281 s.headerSelectedColor = IM_COL32(80, 150, 220, 255);
282 s.icon = "->";
283 m_vsStyles["VSSequence"] = s;
284 }
285
286 // ---- While: dark green -------------------------------------------------
287 {
288 NodeStyle s;
289 s.headerColor = IM_COL32(20, 110, 60, 255);
290 s.headerHoveredColor = IM_COL32(45, 135, 85, 255);
291 s.headerSelectedColor = IM_COL32(70, 160, 110, 255);
292 s.icon = "@";
293 m_vsStyles["While"] = s;
294 }
295
296 // ---- ForEach: medium green ---------------------------------------------
297 {
298 NodeStyle s;
299 s.headerColor = IM_COL32(30, 130, 70, 255);
300 s.headerHoveredColor = IM_COL32(55, 155, 95, 255);
301 s.headerSelectedColor = IM_COL32(80, 180, 120, 255);
302 s.icon = "#";
303 m_vsStyles["ForEach"] = s;
304 }
305
306 // ---- DoOnce: dark grey -------------------------------------------------
307 {
308 NodeStyle s;
309 s.headerColor = IM_COL32(80, 80, 80, 255);
310 s.headerHoveredColor = IM_COL32(105, 105, 105, 255);
311 s.headerSelectedColor = IM_COL32(130, 130, 130, 255);
312 s.icon = "1";
313 m_vsStyles["DoOnce"] = s;
314 }
315
316 // ---- Delay: blue-violet ------------------------------------------------
317 {
318 NodeStyle s;
319 s.headerColor = IM_COL32(60, 60, 160, 255);
320 s.headerHoveredColor = IM_COL32(85, 85, 185, 255);
321 s.headerSelectedColor = IM_COL32(110, 110, 210, 255);
322 s.icon = "T";
323 m_vsStyles["Delay"] = s;
324 }
325
326 // ---- GetBBValue: turquoise ---------------------------------------------
327 {
328 NodeStyle s;
329 s.headerColor = IM_COL32(20, 130, 130, 255);
330 s.headerHoveredColor = IM_COL32(45, 155, 155, 255);
331 s.headerSelectedColor = IM_COL32(70, 180, 180, 255);
332 s.icon = "R";
333 m_vsStyles["GetBBValue"] = s;
334 }
335
336 // ---- SetBBValue: dark teal ---------------------------------------------
337 {
338 NodeStyle s;
339 s.headerColor = IM_COL32(20, 110, 110, 255);
340 s.headerHoveredColor = IM_COL32(45, 135, 135, 255);
341 s.headerSelectedColor = IM_COL32(70, 160, 160, 255);
342 s.icon = "W";
343 m_vsStyles["SetBBValue"] = s;
344 }
345
346 // ---- MathOp: pink ------------------------------------------------------
347 {
348 NodeStyle s;
349 s.headerColor = IM_COL32(160, 40, 100, 255);
350 s.headerHoveredColor = IM_COL32(185, 65, 125, 255);
351 s.headerSelectedColor = IM_COL32(210, 90, 150, 255);
352 s.icon = "=";
353 m_vsStyles["MathOp"] = s;
354 }
355
356 // ---- SubGraph: golden --------------------------------------------------
357 {
358 NodeStyle s;
359 s.headerColor = IM_COL32(160, 130, 20, 255);
360 s.headerHoveredColor = IM_COL32(185, 155, 45, 255);
361 s.headerSelectedColor = IM_COL32(210, 180, 70, 255);
362 s.icon = "G";
363 m_vsStyles["SubGraph"] = s;
364 }
365
366 // ---- AtomicTask (VS): reuse BT_Action style (orange) -------------------
367 m_vsStyles["AtomicTask"] = m_styles[static_cast<int>(NodeType::BT_Action)];
368}
369
370// ============================================================================
371// GetStyleByVSTypeName
372// ============================================================================
373
375{
376 auto it = m_vsStyles.find(vsTypeName);
377 if (it != m_vsStyles.end())
378 return it->second;
379 return m_defaultStyle;
380}
381
382// ============================================================================
383// GetStyle
384// ============================================================================
385
387{
388 auto it = m_styles.find(static_cast<int>(type));
389 if (it != m_styles.end())
390 return it->second;
391 return m_defaultStyle;
392}
393
394// ============================================================================
395// GetStyleByTaskID
396// ============================================================================
397
398const NodeStyle& NodeStyleRegistry::GetStyleByTaskID(const std::string& /*taskId*/) const
399{
400 // All atomic tasks use the Action style.
401 auto it = m_styles.find(static_cast<int>(NodeType::BT_Action));
402 if (it != m_styles.end())
403 return it->second;
404 return m_defaultStyle;
405}
406
407// ============================================================================
408// Pin colours
409// ============================================================================
410
412{
413 return IM_COL32(255, 255, 255, 255);
414}
415
417{
418 return IM_COL32(180, 100, 200, 255);
419}
420
421} // namespace Olympe
ComponentTypeID GetComponentTypeID_Static()
Definition ECS_Entity.h:56
Per-NodeType visual style registry (header colour, icon, pin colours).
Singleton providing NodeStyle descriptors per NodeType.
const NodeStyle & GetStyleByTaskID(const std::string &taskId) const
Returns the style to use for an atomic-task node identified by ID.
std::unordered_map< int, NodeStyle > m_styles
Key is the underlying int value of NodeType.
static ImU32 GetExecPinColor()
Colour for execution-flow (exec) pins — white.
const NodeStyle & GetStyle(NodeType type) const
Returns the style for the given node type.
static NodeStyleRegistry & Get()
Returns the singleton instance.
std::unordered_map< std::string, NodeStyle > m_vsStyles
Key is the VS type name string (TaskNodeType as string).
static ImU32 GetDataPinColor()
Colour for data pins — green.
const NodeStyle & GetStyleByVSTypeName(const std::string &vsTypeName) const
Returns the style for a VS node type identified by string.
constexpr ImU32 Composite_Primary
Definition ColorScheme.h:19
constexpr ImU32 SubGraph_Selected
Definition ColorScheme.h:51
constexpr ImU32 EntryPoint_Primary
Definition ColorScheme.h:13
constexpr ImU32 Inverter_Selected
Definition ColorScheme.h:39
constexpr ImU32 Composite_Selected
Definition ColorScheme.h:21
constexpr ImU32 Inverter_Hovered
Definition ColorScheme.h:38
constexpr ImU32 FlowControl_Selected
Definition ColorScheme.h:27
constexpr ImU32 SubGraph_Primary
Definition ColorScheme.h:49
constexpr ImU32 Action_Selected
Definition ColorScheme.h:33
constexpr ImU32 Inverter_Primary
Definition ColorScheme.h:37
constexpr ImU32 EntryPoint_Hovered
Definition ColorScheme.h:14
constexpr ImU32 Comment_Selected
Definition ColorScheme.h:56
constexpr ImU32 Comment_Hovered
Definition ColorScheme.h:55
constexpr ImU32 Repeater_Selected
Definition ColorScheme.h:45
constexpr ImU32 FlowControl_Primary
Definition ColorScheme.h:25
constexpr ImU32 SubGraph_Hovered
Definition ColorScheme.h:50
constexpr ImU32 Repeater_Primary
Definition ColorScheme.h:43
constexpr ImU32 Repeater_Hovered
Definition ColorScheme.h:44
constexpr ImU32 Action_Hovered
Definition ColorScheme.h:32
constexpr ImU32 FlowControl_Hovered
Definition ColorScheme.h:26
constexpr ImU32 EntryPoint_Selected
Definition ColorScheme.h:15
constexpr ImU32 Composite_Hovered
Definition ColorScheme.h:20
constexpr ImU32 Action_Primary
Definition ColorScheme.h:31
constexpr ImU32 Comment_Primary
Definition ColorScheme.h:54
< Provides AssetID and INVALID_ASSET_ID
@ BT_OnEvent
Phase 38b: Event-driven root (green, event-triggered)
@ BT_SubGraph
Phase 8: references a subgraph by UUID (BehaviorTree)
@ BT_Root
Phase 38b: Root entry point (green, fixed position)
Visual descriptor for a single node type.
ImU32 headerColor
Title-bar background colour (ImNodes TitleBar colour slot).