diff options
author | tcmal <me@aria.rip> | 2024-08-25 17:44:23 +0100 |
---|---|---|
committer | tcmal <me@aria.rip> | 2024-08-25 17:44:23 +0100 |
commit | 6ef351de4ba506e7f0f285569aa0e22255bb68c6 (patch) | |
tree | 7aaf25bb93e3d97ba03c408fdef9f7b1933ea7bc /stockton-render/src/draw/draw_passes/util.rs | |
parent | 2e33320e62a3dc26555f17e1a79e129a53672a1b (diff) |
refactor(render): slight leveldrawpass refactors
Diffstat (limited to 'stockton-render/src/draw/draw_passes/util.rs')
-rw-r--r-- | stockton-render/src/draw/draw_passes/util.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/stockton-render/src/draw/draw_passes/util.rs b/stockton-render/src/draw/draw_passes/util.rs new file mode 100644 index 0000000..a42f870 --- /dev/null +++ b/stockton-render/src/draw/draw_passes/util.rs @@ -0,0 +1,41 @@ +//! Utility structs & functions + +use anyhow::Result; + +/// Keeps a given resource for each swapchain image +pub struct TargetSpecificResources<T> { + elements: Vec<T>, + next_idx: usize, +} + +impl<T> TargetSpecificResources<T> { + /// Create a new set of resources, given a function to generate them and the count + /// In most cases, count should be swapchain_properties.image_count + pub fn new<F>(generator: F, count: usize) -> Result<Self> + where + F: FnMut() -> Result<T>, + { + let mut elements = Vec::with_capacity(count); + for _ in 0..count { + elements.push(generator()?); + } + + Ok(TargetSpecificResources { + elements, + next_idx: 0, + }) + } + + /// Get the next resource, wrapping around if necessary. + pub fn get_next<'a>(&'a mut self) -> &'a T { + let el = &self.elements[self.next_idx]; + self.next_idx = (self.next_idx + 1) % self.elements.len(); + el + } + + /// Dissolve the resource set, returning an iterator over each item. + /// In most cases, each item will need deactivated. + pub fn dissolve(self) -> impl Iterator<Item = T> { + self.elements.into_iter() + } +} |