1use cumulus3d_core::io::ply::PointCloud;
5use cumulus3d_core::{ImageId, Reconstruction, Rigid3, Sim3};
6use std::sync::Arc;
7use std::time::{Duration, SystemTime};
8
9#[derive(Clone, Debug)]
11pub struct Meta {
12 pub version: u64,
14 pub at: SystemTime,
16}
17
18#[derive(Clone, Copy, Debug, PartialEq, Eq)]
20pub struct ZoneRange {
21 pub zone: usize,
23 pub lo: usize,
25 pub hi: usize,
27}
28
29#[derive(Clone, Debug)]
31pub enum Event {
32 FrameIngested {
34 meta: Meta,
36 position: usize,
38 images: Vec<String>,
40 },
41 Started {
43 meta: Meta,
45 positions: Option<usize>,
47 },
48 Log {
50 meta: Meta,
52 line: String,
54 stamped: bool,
56 },
57 FeaturesExtracted {
59 meta: Meta,
61 image: String,
63 count: usize,
65 position: usize,
67 image_id: ImageId,
69 },
70 PairsMatched {
73 meta: Meta,
75 pairs: usize,
77 verified: usize,
79 position: usize,
81 matched: usize,
83 },
84 ModelInitialized {
86 meta: Meta,
88 registered: usize,
90 position: usize,
92 model: Arc<Reconstruction>,
94 },
95 FrameRegistered {
97 meta: Meta,
99 position: usize,
101 image: String,
103 image_id: ImageId,
105 cam_from_world: Rigid3,
107 },
108 PositionDone {
110 meta: Meta,
112 position: usize,
114 registered: usize,
116 expected: usize,
118 },
119 ZoneArrived {
122 meta: Meta,
124 range: ZoneRange,
126 model: Arc<Reconstruction>,
128 },
129 ZonePreview {
133 meta: Meta,
135 range: ZoneRange,
137 cloud: Arc<PointCloud>,
139 model: Arc<Reconstruction>,
141 dense: bool,
143 frame: String,
145 },
146 RefineStarted {
148 meta: Meta,
150 zone: usize,
152 },
153 ZoneAdjusted {
155 meta: Meta,
157 zone: usize,
159 model: Arc<Reconstruction>,
161 },
162 ZoneRefinedPose {
165 meta: Meta,
167 range: ZoneRange,
169 registered: usize,
171 mean_reproj_px: f64,
173 model: Arc<Reconstruction>,
175 },
176 ZoneRefined {
179 meta: Meta,
181 range: ZoneRange,
183 cloud: Arc<PointCloud>,
185 model: Arc<Reconstruction>,
187 dense: bool,
189 },
190 BaseAdopted {
192 meta: Meta,
194 zone: usize,
196 },
197 Reanchored {
199 meta: Meta,
201 zone: usize,
203 transform: Sim3,
205 },
206 Snapshot {
208 meta: Meta,
210 index: usize,
212 cloud: Arc<PointCloud>,
214 },
215 AllPositionsDone {
217 meta: Meta,
219 },
220 AllRefinedDone {
223 meta: Meta,
225 chain: Option<Arc<Reconstruction>>,
227 },
228 Finished {
231 meta: Meta,
233 pipeline_secs: f64,
235 stage_times: Vec<(String, Duration, usize)>,
237 chain_stats: Vec<String>,
239 },
240 Reset {
242 meta: Meta,
244 position: usize,
246 },
247 ZoneInvalidated {
249 meta: Meta,
251 zone: usize,
253 },
254 Warning {
256 meta: Meta,
258 message: String,
260 },
261 Error {
263 meta: Meta,
265 message: String,
267 },
268}
269
270#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
272pub enum EventKind {
273 FrameIngested,
275 Started,
277 Log,
279 RefineStarted,
281 ZoneAdjusted,
283 Finished,
285 Reset,
287 ZoneInvalidated,
289 FeaturesExtracted,
291 PairsMatched,
293 ModelInitialized,
295 FrameRegistered,
297 PositionDone,
299 ZoneArrived,
301 ZonePreview,
303 ZoneRefinedPose,
305 ZoneRefined,
307 BaseAdopted,
309 Reanchored,
311 Snapshot,
313 AllPositionsDone,
315 AllRefinedDone,
317 Warning,
319 Error,
321}
322
323impl Event {
324 pub fn kind(&self) -> EventKind {
326 use Event::*;
327 match self {
328 FrameIngested { .. } => EventKind::FrameIngested,
329 Started { .. } => EventKind::Started,
330 Log { .. } => EventKind::Log,
331 RefineStarted { .. } => EventKind::RefineStarted,
332 ZoneAdjusted { .. } => EventKind::ZoneAdjusted,
333 Finished { .. } => EventKind::Finished,
334 Reset { .. } => EventKind::Reset,
335 ZoneInvalidated { .. } => EventKind::ZoneInvalidated,
336 FeaturesExtracted { .. } => EventKind::FeaturesExtracted,
337 PairsMatched { .. } => EventKind::PairsMatched,
338 ModelInitialized { .. } => EventKind::ModelInitialized,
339 FrameRegistered { .. } => EventKind::FrameRegistered,
340 PositionDone { .. } => EventKind::PositionDone,
341 ZoneArrived { .. } => EventKind::ZoneArrived,
342 ZonePreview { .. } => EventKind::ZonePreview,
343 ZoneRefinedPose { .. } => EventKind::ZoneRefinedPose,
344 ZoneRefined { .. } => EventKind::ZoneRefined,
345 BaseAdopted { .. } => EventKind::BaseAdopted,
346 Reanchored { .. } => EventKind::Reanchored,
347 Snapshot { .. } => EventKind::Snapshot,
348 AllPositionsDone { .. } => EventKind::AllPositionsDone,
349 AllRefinedDone { .. } => EventKind::AllRefinedDone,
350 Warning { .. } => EventKind::Warning,
351 Error { .. } => EventKind::Error,
352 }
353 }
354 pub fn meta(&self) -> &Meta {
356 use Event::*;
357 match self {
358 FrameIngested { meta, .. } | FeaturesExtracted { meta, .. } | PairsMatched { meta, .. } | ModelInitialized { meta, .. }
359 | FrameRegistered { meta, .. } | PositionDone { meta, .. } | ZoneArrived { meta, .. } | ZonePreview { meta, .. }
360 | ZoneRefinedPose { meta, .. } | ZoneRefined { meta, .. } | BaseAdopted { meta, .. } | Reanchored { meta, .. }
361 | Snapshot { meta, .. } | AllPositionsDone { meta } | AllRefinedDone { meta, .. }
362 | Started { meta, .. } | Log { meta, .. } | RefineStarted { meta, .. } | ZoneAdjusted { meta, .. } | Finished { meta, .. }
363 | Reset { meta, .. } | ZoneInvalidated { meta, .. } | Warning { meta, .. } | Error { meta, .. } => meta,
364 }
365 }
366}
367
368impl Event {
369 pub fn timeline_text(&self) -> Option<String> {
371 use Event::*;
372 Some(match self {
373 Started { positions, .. } => match positions {
374 Some(n) => format!("start NPOS={n}"),
375 None => "start".to_string(),
376 },
377 ModelInitialized { registered, .. } => format!("init_model Registered images: {registered}"),
378 BaseAdopted { zone, .. } => format!("adopt refined {zone} as base"),
379 PositionDone { position, registered, expected, .. } => format!("pos {position} registered {registered}/{expected}"),
380 ZoneArrived { range, .. } => format!("region {} arrived pos[{},{})", range.zone, range.lo, range.hi),
381 ZonePreview { range, .. } => format!("preview {} ready", range.zone),
382 RefineStarted { zone, .. } => format!("refined {zone} ba_start"),
383 ZoneRefinedPose { range, registered, mean_reproj_px, .. } => format!(
384 "refined {} pose_ready Registered images: {registered} Mean reprojection error: {mean_reproj_px:.6}px ",
385 range.zone
386 ),
387 ZoneRefined { range, .. } => format!("refined {} ready", range.zone),
388 AllPositionsDone { .. } => "all positions done".to_string(),
389 AllRefinedDone { .. } => "all refined done".to_string(),
390 _ => return None,
391 })
392 }
393}
394
395#[derive(Clone, Debug)]
397pub enum Command {
398 ResetFrom(usize),
400 InvalidateZone(usize),
402}