Resize viewport framebuffer
This commit is contained in:
parent
c816b6629e
commit
a2fc6590b4
|
@ -113,7 +113,7 @@ impl Application {
|
|||
|
||||
{
|
||||
puffin::profile_scope!("Main render");
|
||||
self.render_state.update_viewport(&mut self.viewport);
|
||||
self.render_state.update_viewport(&mut self.egui_rp, &mut self.viewport);
|
||||
self.render_state.render();
|
||||
}
|
||||
|
||||
|
|
|
@ -226,9 +226,32 @@ impl RenderState {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn update_viewport(&mut self, viewport: &mut ViewportWidget) {
|
||||
pub fn update_viewport(
|
||||
&mut self,
|
||||
egui_rp: &mut egui_wgpu_backend::RenderPass,
|
||||
widget: &mut ViewportWidget,
|
||||
) {
|
||||
let mut store = self.resources.get_mut::<ViewportStore>().unwrap();
|
||||
store.viewport.camera = viewport.flycam.get_camera();
|
||||
let mut viewport = &mut store.viewport;
|
||||
viewport.camera = widget.flycam.get_camera();
|
||||
|
||||
if viewport.textures.width != widget.width || viewport.textures.height != widget.height {
|
||||
viewport.textures = OffscreenTextures::new(
|
||||
&viewport.device,
|
||||
widget.width,
|
||||
widget.height,
|
||||
viewport.output_format,
|
||||
);
|
||||
|
||||
egui_rp
|
||||
.update_egui_texture_from_wgpu_texture(
|
||||
&viewport.device,
|
||||
&viewport.textures.output_view,
|
||||
wgpu::FilterMode::Nearest,
|
||||
viewport.egui_texture,
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
pub fn render(&mut self) {
|
||||
|
|
|
@ -130,6 +130,8 @@ impl UserInterface {
|
|||
pub struct ViewportWidget {
|
||||
pub texture: egui::TextureId,
|
||||
pub flycam: Flycam,
|
||||
pub width: u32,
|
||||
pub height: u32,
|
||||
}
|
||||
|
||||
impl ViewportWidget {
|
||||
|
@ -137,6 +139,8 @@ impl ViewportWidget {
|
|||
Self {
|
||||
texture,
|
||||
flycam: Flycam::new(0.002, 10.0, 0.25),
|
||||
width: 640,
|
||||
height: 480,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -149,6 +153,9 @@ impl egui::Widget for &mut ViewportWidget {
|
|||
let sense = egui::Sense::click_and_drag();
|
||||
let response = ui.interact(rect, id, sense);
|
||||
|
||||
self.width = rect.width().round() as u32;
|
||||
self.height = rect.height().round() as u32;
|
||||
|
||||
use egui::{pos2, Color32, Mesh, Rect, Shape};
|
||||
let mut mesh = Mesh::with_texture(self.texture);
|
||||
let uv = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
|
||||
|
@ -193,8 +200,7 @@ impl egui::Widget for &mut ViewportWidget {
|
|||
self.flycam.defocus();
|
||||
}
|
||||
|
||||
println!("{:#?}", self.flycam);
|
||||
|
||||
self.flycam.resize(self.width, self.height);
|
||||
self.flycam.update();
|
||||
|
||||
response
|
||||
|
|
Loading…
Reference in New Issue