mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-08-12 02:23:34 +00:00
f582d0230c
set_icon_gizmo_position computed ``mw @ (Translation @ billboard_rot @ Scale)`` — the object's world matrix was applied AFTER the billboard rotation, so any non-trivial object rotation (e.g. a wall rotated in plan, a stair rotated to match a corridor) carried over into the icon's transform and tilted it edge-on to the camera instead of facing it. Switch to ``billboarded_at(world_pos, billboard_rot, scale)`` where ``world_pos = mw @ local_pos``: translate to world space first, then apply the billboard rotation independently of the object's rotation. This matches the manual pattern the base class's ``update_editing_gizmos`` already uses for validate/cancel/cycle for exactly this reason. Drops the now-stale workaround docstring on ``GizmoWallEdition._update_icon_row_extras`` that documented why it bypassed ``set_icon_gizmo_position`` — the helper does the right thing now. Adds ``test/bim/module/model/test_stair_gizmos.py`` as the regression guard: parametrised over six rotation angles, asserts that the rotation part of the resulting matrix equals ``billboard_rot`` (no contribution from ``mw``'s rotation) and that the translation lands at ``world_pos``. Also exercises ``set_icon_gizmo_position`` end-to-end via a stub gizmo to catch the exact shape of the previously-broken call site. Generated with the assistance of an AI coding tool.