ui.camera: read, set and replay the viewport camera (#1302)
A control-channel method that reads the orbit camera, sets any of target/yaw/pitch/roll/distance, and fits listed occurrences (or everything) keeping the direction. Its reply passed back sets the same view again; a refused field changes nothing.
This commit is contained in:
1 parent
7195e323bf
commit
50c5c13f72
4 files changed
+199
-11
No files matched your search
@@ -223,17 +223,7 @@ pub fn animate_joint(app: &SolveApp, id: u64) -> Option<Dialog> {
|
||||
pub fn find_joint(app: &mut SolveApp, id: u64) {
|
||||
let s = &app.session;
|
||||
let Some(j) = s.doc.assembly.joints.iter().find(|j| j.id == id) else { return };
|
||||
let occs = [j.a.occurrence, j.b.occurrence];
|
||||
let model = s.model.state();
|
||||
let world = s.world_state();
|
||||
let mut bb = Aabb3::default();
|
||||
for (name, _, path, _) in s.doc.body_frames(&model) {
|
||||
// The root (occurrence 0) holds the bodies outside every occurrence.
|
||||
let on = occs.iter().any(|o| if *o == 0 { path.is_empty() } else { path.contains(o) });
|
||||
if on && let Some(b) = world.body(&name) {
|
||||
bb = bb.union(&b.mesh().bounds());
|
||||
}
|
||||
}
|
||||
let bb = occurrence_bounds(s, &[j.a.occurrence, j.b.occurrence]);
|
||||
if bb.is_empty() {
|
||||
return;
|
||||
}
|
||||
@@ -242,6 +232,21 @@ pub fn find_joint(app: &mut SolveApp, id: u64) {
|
||||
app.animate_to(cam);
|
||||
}
|
||||
|
||||
/// The box around the bodies of occurrences (and of the occurrences inside them), where they
|
||||
/// are placed; occurrence 0 is the root, holding the bodies outside every occurrence.
|
||||
pub fn occurrence_bounds(s: &Session, occs: &[u64]) -> Aabb3 {
|
||||
let model = s.model.state();
|
||||
let world = s.world_state();
|
||||
let mut bb = Aabb3::default();
|
||||
for (name, _, path, _) in s.doc.body_frames(&model) {
|
||||
let on = occs.iter().any(|o| if *o == 0 { path.is_empty() } else { path.contains(o) });
|
||||
if on && let Some(b) = world.body(&name) {
|
||||
bb = bb.union(&b.mesh().bounds());
|
||||
}
|
||||
}
|
||||
bb
|
||||
}
|
||||
|
||||
pub fn drive_joint(app: &SolveApp, id: u64) -> Option<Dialog> {
|
||||
let joint = app.session.doc.assembly.joints.iter().position(|j| j.id == id)?;
|
||||
Some(Dialog::new(Kind::Assembly(Asm::Drive { joint, values: current_values(&app.session, joint), focus: true }), vec![]))
|
||||
|
||||
Reference in new issue
Block a user