impl Timeline {
pub fn bind_points(
&mut self,
scene: &mut Scene,
batch: crate::PointBatchHandle,
start: Arc<[[f32; 3]]>,
end: Arc<[[f32; 3]]>,
warp: TimeWarp,
) -> Result<TimelineTrackHandle, CoreError> {
if self
.tracks
.iter()
.any(|(_, track)| track.targets_points(batch))
{
return Err(invalid("a point batch may have only one timeline track"));
}
scene.bind_point_frames(batch, start, end)?;
Ok(TimelineTrackHandle(
self.tracks.insert(TimelineTrack::Points { batch, warp }),
))
}
pub fn bind_instances(
&mut self,
scene: &mut Scene,
batch: InstanceBatchHandle,
start: Arc<[crate::RigidInstance]>,
end: Arc<[crate::RigidInstance]>,
warp: TimeWarp,
) -> Result<TimelineTrackHandle, CoreError> {
if self
.tracks
.iter()
.any(|(_, track)| track.targets_instances(batch))
{
return Err(invalid(
"an instance batch may have only one timeline track",
));
}
scene.bind_instance_frames(batch, start, end)?;
Ok(TimelineTrackHandle(
self.tracks.insert(TimelineTrack::Instances { batch, warp }),
))
}
pub fn bind_attribute(
&mut self,
scene: &mut Scene,
attribute: AttributeHandle,
start: AttributeValues,
end: AttributeValues,
warp: TimeWarp,
) -> Result<TimelineTrackHandle, CoreError> {
if self
.tracks
.iter()
.any(|(_, track)| track.targets_attribute(attribute))
{
return Err(invalid("an attribute may have only one timeline track"));
}
scene.bind_attribute_frames(attribute, start, end)?;
Ok(TimelineTrackHandle(
self.tracks
.insert(TimelineTrack::Attribute { attribute, warp }),
))
}
pub fn unbind(&mut self, scene: &mut Scene, handle: TimelineTrackHandle) -> bool {
let Some(track) = self.tracks.remove(handle.0) else {
return false;
};
match track {
TimelineTrack::Points { batch, .. } => scene.unbind_point_frames(batch),
TimelineTrack::Instances { batch, .. } => scene.unbind_instance_frames(batch),
TimelineTrack::Attribute { attribute, .. } => {
scene.unbind_attribute_frames(attribute);
}
TimelineTrack::Trajectory { .. }
| TimelineTrack::BondTopology { .. }
| TimelineTrack::AtomProperty { .. } => {}
}
self.revision = self.revision.wrapping_add(1);
true
}
}