render: symbols for boundary conditions, loads and interactions, and scene labels

glyphs::Glyphs picks where a model's setup symbols go (resolving its sets
once, thinning them on a grid, capping each definition and sampling large
ones with a note) and draws them into a Scene at the nodes' current
positions: cones for constrained translations (and rotations where nodes
rotate), arrows for forces, double-headed arrows for moments, arrows normal
to pressure faces, one arrow for gravity and body forces, a curved arrow for
centrifugal loads, crosses with names for reference points, lines for
couplings, hatched squares for rigid walls. Colours come from the caller by
role, muted over results.

Scene gains labels, drawn by the CPU rasterizer with a small bitmap font of
its own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NmAttHhUZTokgPeEJia8sm
This commit is contained in:
jyvikoandClaude Opus 5.5 authored and Irakli Kourtis committed 2026-10-14 00:34:33 -04:00
1 parent 95c02bc728
commit 93f1a03137
6 files changed
+1137 -5

No files matched your search

+7
View File
@@ -108,6 +108,13 @@ impl Aabb3 {
self.min = Vec3::new(self.min.x.min(p.x), self.min.y.min(p.y), self.min.z.min(p.z));
self.max = Vec3::new(self.max.x.max(p.x), self.max.y.max(p.y), self.max.z.max(p.z));
}
/// Grow to hold `o` too (an empty box adds nothing).
pub fn union(&mut self, o: Aabb3) {
if !o.is_empty() {
self.add(o.min);
self.add(o.max);
}
}
pub fn center(&self) -> Vec3 {
(self.min + self.max) * 0.5
}