alpha2_engine/
snapshot.rs1use alpha2_eval::{
2 ActiveIndex, AudioSpan, AudioSpanDesc, AudioSpanScratch, EvalError, FrameDesc, FrameNeed,
3 evaluate, evaluate_audio, evaluate_audio_in, frame_needs,
4};
5use alpha2_model::Project;
6use alpha2_time::{MediaTime, TimeRange};
7
8static NEXT_GENERATION: std::sync::atomic::AtomicU64 = std::sync::atomic::AtomicU64::new(0);
10
11#[derive(Clone, Debug)]
13pub struct EngineProject {
14 project: Project,
15 index: ActiveIndex,
16 generation: u64,
17 draws_text: bool,
19}
20
21impl EngineProject {
22 pub fn new(project: Project) -> Result<Self, EvalError> {
27 let index = ActiveIndex::build(&project)?;
28 Ok(Self {
29 draws_text: project.draws_text(),
30 project,
31 index,
32 generation: NEXT_GENERATION.fetch_add(1, std::sync::atomic::Ordering::Relaxed),
33 })
34 }
35
36 #[must_use]
39 pub const fn generation(&self) -> u64 {
40 self.generation
41 }
42
43 #[must_use]
46 pub const fn draws_text(&self) -> bool {
47 self.draws_text
48 }
49
50 pub fn evaluate(&self, time: MediaTime) -> Result<FrameDesc<'_>, EvalError> {
55 evaluate(&self.project, &self.index, time)
56 }
57
58 pub fn frame_needs(&self, time: MediaTime) -> Result<Vec<FrameNeed>, EvalError> {
63 frame_needs(&self.project, &self.index, time)
64 }
65
66 pub fn evaluate_audio(&self, range: TimeRange) -> Result<AudioSpanDesc<'_>, EvalError> {
71 evaluate_audio(&self.project, &self.index, range)
72 }
73
74 pub fn evaluate_audio_in<'s>(
79 &self,
80 range: TimeRange,
81 scratch: &'s mut AudioSpanScratch,
82 ) -> Result<AudioSpan<'_, 's>, EvalError> {
83 evaluate_audio_in(&self.project, &self.index, range, scratch)
84 }
85
86 #[must_use]
89 pub fn timeline_range(&self) -> Option<TimeRange> {
90 self.project.timeline.extent()
91 }
92
93 #[must_use]
96 pub fn effects(&self) -> Vec<(&str, u32)> {
97 let mut effects = self
98 .index
99 .effects()
100 .map(|effect| (effect.id.as_str(), effect.version))
101 .collect::<Vec<_>>();
102 effects.sort_unstable();
103 effects.dedup();
104 effects
105 }
106
107 pub fn check_effects(
113 &self,
114 renderer: &alpha2_render::Renderer,
115 ) -> Result<(), crate::EngineError> {
116 crate::frame::require_effects(renderer, self.effects())
117 }
118
119 #[must_use]
121 pub fn project(&self) -> &Project {
122 &self.project
123 }
124}