use astrodyn_frames::{FrameId, FrameTree};
use glam::{DMat3, DVec3};
use crate::source_frames::SourceFrameIds;
pub fn source_frame_id(source_frame_ids: &[SourceFrameIds], source_idx: usize) -> FrameId {
source_frame_ids
.get(source_idx)
.unwrap_or_else(|| {
panic!(
"source_frame_id: source index {source_idx} is out of range; \
{} source frame(s) configured",
source_frame_ids.len()
)
})
.inertial
}
pub fn source_position(
frame_tree: &FrameTree,
source_frame_ids: &[SourceFrameIds],
root_frame_id: FrameId,
source_idx: usize,
) -> DVec3 {
let fid = source_frame_id(source_frame_ids, source_idx);
if fid == root_frame_id {
DVec3::ZERO
} else {
frame_tree.get(fid).state.trans.position
}
}
pub fn source_pfix_rotation(
frame_tree: &FrameTree,
source_frame_ids: &[SourceFrameIds],
source_idx: usize,
) -> Option<DMat3> {
source_frame_ids
.get(source_idx)
.unwrap_or_else(|| {
panic!(
"source_pfix_rotation: source index {source_idx} out of range; \
{} source(s) configured",
source_frame_ids.len()
)
})
.pfix
.map(|pfix_id| frame_tree.get(pfix_id).state.rot.t_parent_this)
}
pub fn set_source_position(
frame_tree: &mut FrameTree,
source_frame_ids: &[SourceFrameIds],
root_frame_id: FrameId,
source_idx: usize,
position: DVec3,
) {
assert!(
source_idx < source_frame_ids.len(),
"set_source_position: source index {source_idx} out of range; \
{} source(s) configured",
source_frame_ids.len()
);
let fid = source_frame_ids[source_idx].inertial;
assert_ne!(
fid, root_frame_id,
"set_source_position: cannot set position of the root (central body) source"
);
frame_tree.get_mut(fid).state.trans.position = position;
}
pub fn set_source_state(
frame_tree: &mut FrameTree,
source_frame_ids: &[SourceFrameIds],
root_frame_id: FrameId,
source_idx: usize,
position: DVec3,
velocity: DVec3,
) {
assert!(
source_idx < source_frame_ids.len(),
"set_source_state: source index {source_idx} out of range; \
{} source(s) configured",
source_frame_ids.len()
);
let fid = source_frame_ids[source_idx].inertial;
assert_ne!(
fid, root_frame_id,
"set_source_state: cannot set state of the root (central body) source"
);
let node = frame_tree.get_mut(fid);
node.state.trans.position = position;
node.state.trans.velocity = velocity;
}