feat(ucs): orient the ViewCube to the active UCS

The ViewCube showed world Front/Top/Right. It now composes the camera
rotation with the active UCS (scene.viewcube_ucs, synced from the tab's
active_ucs), so its faces follow the user's coordinate system in model
space. Render uniform, hover/click hit-test, and the click→snap direction
all go through scene.viewcube_ucs_mat() so they stay in lock-step;
identity outside model space leaves paper-viewport navigation unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Hakan Seven 2026-06-22 10:10:47 +03:00
commit d78ed60582
5 changed files with 43 additions and 9 deletions

View file

@ -794,7 +794,7 @@ impl Scene {
images,
meshes: self.meshes_arc(),
uniforms,
cam_rotation: inst.camera.view_rotation_mat(),
cam_rotation: inst.camera.view_rotation_mat() * self.viewcube_ucs_mat(),
// Only the active viewport gets the hovered-region highlight.
hover_region: if inst.active { hover_region } else { None },
show_viewcube: inst.active,
@ -826,7 +826,7 @@ impl Scene {
cursor: mouse::Cursor,
) {
let pos = cursor.position_in(bounds);
let cam_rotation = self.camera.borrow().view_rotation_mat();
let cam_rotation = self.camera.borrow().view_rotation_mat() * self.viewcube_ucs_mat();
if let Some(p) = pos {
let tile = self.active_model_tile_bounds(bounds.width, bounds.height);
state.hover_region = hover_id(