OverviewFilesCommitsIssuesDocsReleasesPeers

godot-keet commits / b603e07

Add graph rendering diagnostics + safety re-layout for out-of-bounds positions
- Log position bounds after layout (canvas size, min/max, NaN count) - Auto re-layout if positions end up out of canvas bounds or contain NaN - Show "N nodes, no positions" diagnostic text when positions dict is empty Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
b603e07a53385903cd45be42679bfaa181f6891e
by plankatron <fleeky@gmail.com> · 2026-02-23T04:06:32.000Z

Changed files (1) +27 -0

scripts/graph_canvas.gd +27 -0
……@@ -95,6 +95,28 @@ func set_graph_data(nodes: Array, edges: Array, clusters: Array, cluster_labels:
9595 _layout_step()
9696 _spread_overlapping()
9797 _rescale_to_fit()
98
99 # Debug: log position bounds so we can diagnose invisible graphs
100 if not _positions.is_empty():
101 var min_p := Vector2(INF, INF)
102 var max_p := Vector2(-INF, -INF)
103 var nan_count: int = 0
104 for p: Vector2 in _positions.values():
105 if is_nan(p.x) or is_nan(p.y) or is_inf(p.x) or is_inf(p.y):
106 nan_count += 1
107 continue
108 min_p.x = minf(min_p.x, p.x)
109 min_p.y = minf(min_p.y, p.y)
110 max_p.x = maxf(max_p.x, p.x)
111 max_p.y = maxf(max_p.y, p.y)
112 print("[graph_canvas] layout done: %d positions, canvas=%s, bounds=(%s → %s), nan=%d" % [_positions.size(), str(size), str(min_p), str(max_p), nan_count])
113 # Safety: if positions are out of canvas bounds or contain NaN, redo with current size
114 if nan_count > 0 or max_p.x < 0 or max_p.y < 0 or min_p.x > size.x or min_p.y > size.y:
115 print("[graph_canvas] positions out of bounds — forcing re-layout with canvas size %s" % str(size))
116 _positions.clear()
117 _grid_layout()
118 _spread_overlapping()
119 _rescale_to_fit()
98120 queue_redraw()
99121
100122
……@@ -319,6 +341,11 @@ func _draw() -> void:
319341 draw_string(_font, center - Vector2(60, 0), "No graph data", HORIZONTAL_ALIGNMENT_LEFT, -1, 14, Color(0.5, 0.5, 0.5))
320342 return
321343
344 if _positions.is_empty():
345 var center: Vector2 = size / 2.0
346 draw_string(_font, center - Vector2(80, 0), "%d nodes, no positions" % _nodes.size(), HORIZONTAL_ALIGNMENT_LEFT, -1, 14, Color(0.8, 0.3, 0.3))
347 return
348
322349 # Draw edges — daemon uses {from, to, mi}
323350 # Adaptive rendering: reduce alpha and filter low-MI edges when dense
324351 var edge_count: int = _edges.size()