Resize viewport framebuffer
This commit is contained in:
parent
c816b6629e
commit
a2fc6590b4
|
@ -113,7 +113,7 @@ impl Application {
|
||||||
|
|
||||||
{
|
{
|
||||||
puffin::profile_scope!("Main render");
|
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();
|
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();
|
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) {
|
pub fn render(&mut self) {
|
||||||
|
|
|
@ -130,6 +130,8 @@ impl UserInterface {
|
||||||
pub struct ViewportWidget {
|
pub struct ViewportWidget {
|
||||||
pub texture: egui::TextureId,
|
pub texture: egui::TextureId,
|
||||||
pub flycam: Flycam,
|
pub flycam: Flycam,
|
||||||
|
pub width: u32,
|
||||||
|
pub height: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ViewportWidget {
|
impl ViewportWidget {
|
||||||
|
@ -137,6 +139,8 @@ impl ViewportWidget {
|
||||||
Self {
|
Self {
|
||||||
texture,
|
texture,
|
||||||
flycam: Flycam::new(0.002, 10.0, 0.25),
|
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 sense = egui::Sense::click_and_drag();
|
||||||
let response = ui.interact(rect, id, sense);
|
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};
|
use egui::{pos2, Color32, Mesh, Rect, Shape};
|
||||||
let mut mesh = Mesh::with_texture(self.texture);
|
let mut mesh = Mesh::with_texture(self.texture);
|
||||||
let uv = Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0));
|
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();
|
self.flycam.defocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("{:#?}", self.flycam);
|
self.flycam.resize(self.width, self.height);
|
||||||
|
|
||||||
self.flycam.update();
|
self.flycam.update();
|
||||||
|
|
||||||
response
|
response
|
||||||
|
|
Loading…
Reference in New Issue