1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
use crate::nodes::{ FramePacket, PrepareJob, PrepareJobSet, RenderFeatureIndex, RenderJobExtractContext, RenderView, }; pub trait ExtractJob { fn extract( self: Box<Self>, extract_context: &RenderJobExtractContext, frame_packet: &FramePacket, views: &[RenderView], ) -> Box<dyn PrepareJob>; fn feature_debug_name(&self) -> &'static str; fn feature_index(&self) -> RenderFeatureIndex; } pub struct ExtractJobSet { extract_jobs: Vec<Box<dyn ExtractJob>>, } impl Default for ExtractJobSet { fn default() -> Self { ExtractJobSet { extract_jobs: Default::default(), } } } impl ExtractJobSet { pub fn new(extract_jobs: Vec<Box<dyn ExtractJob>>) -> Self { ExtractJobSet { extract_jobs } } pub fn add_job( &mut self, extract_job: Box<dyn ExtractJob>, ) { self.extract_jobs.push(extract_job) } pub fn extract( self, extract_context: &RenderJobExtractContext, frame_packet: &FramePacket, views: &[RenderView], ) -> PrepareJobSet { log::trace!("Start extract job set"); let mut prepare_jobs = vec![]; for extract_job in self.extract_jobs { log::trace!("Start job {}", extract_job.feature_debug_name()); let prepare_job = extract_job.extract(extract_context, frame_packet, views); prepare_jobs.push(prepare_job); } PrepareJobSet::new(prepare_jobs) } }