use crate::{
graphics::{error::FrameworkError, gpu_texture::GpuTexture, server::GraphicsServer},
renderer::hdr::LumBuffer,
};
use std::cell::Cell;
pub struct AdaptationChain {
lum_framebuffers: [LumBuffer; 2],
swap: Cell<bool>,
}
pub struct AdaptationContext<'a> {
pub prev_lum: GpuTexture,
pub lum_buffer: &'a LumBuffer,
}
impl AdaptationChain {
pub fn new(server: &dyn GraphicsServer) -> Result<Self, FrameworkError> {
Ok(Self {
lum_framebuffers: [LumBuffer::new(server, 1)?, LumBuffer::new(server, 1)?],
swap: Cell::new(false),
})
}
pub fn begin(&self) -> AdaptationContext<'_> {
let out = if self.swap.get() {
AdaptationContext {
prev_lum: self.lum_framebuffers[0].framebuffer.color_attachments()[0]
.texture
.clone(),
lum_buffer: &self.lum_framebuffers[1],
}
} else {
AdaptationContext {
prev_lum: self.lum_framebuffers[1].framebuffer.color_attachments()[0]
.texture
.clone(),
lum_buffer: &self.lum_framebuffers[0],
}
};
self.swap.set(!self.swap.get());
out
}
pub fn avg_lum_texture(&self) -> &GpuTexture {
if self.swap.get() {
&self.lum_framebuffers[0].framebuffer.color_attachments()[0].texture
} else {
&self.lum_framebuffers[1].framebuffer.color_attachments()[0].texture
}
}
}