Draw OffscreenTextures to ViewportWidget

This commit is contained in:
mars 2022-05-15 14:49:50 -06:00
parent 0359c92ae9
commit e7ff524e7b
3 changed files with 34 additions and 25 deletions

View File

@ -64,12 +64,9 @@ impl Application {
let egui_state = egui_winit::State::new(4096, &window); let egui_state = egui_winit::State::new(4096, &window);
let egui_ctx = egui::Context::default(); let egui_ctx = egui::Context::default();
let egui_rp = egui_wgpu_backend::RenderPass::new(&device, config.format, 1); let mut egui_rp = egui_wgpu_backend::RenderPass::new(&device, config.format, 1);
let render_state = render::RenderState::new(device.clone(), queue.clone(), config.format, &mut egui_rp);
let render_state = render::RenderState::new(device.clone(), queue.clone(), config.format); let viewport_texture = render_state.resources.get::<render::ViewportStore>().unwrap().viewport.egui_texture;
let image = egui::ColorImage::example();
let viewport_texture = egui_ctx.load_texture("example_viewport", image);
Self { Self {
window, window,

View File

@ -4,12 +4,12 @@ use cyborg::viewport::{Viewport, ViewportInfo, ViewportViews};
use std::sync::Arc; use std::sync::Arc;
pub struct OffscreenTextures { pub struct OffscreenTextures {
width: u32, pub width: u32,
height: u32, pub height: u32,
output_texture: wgpu::Texture, pub output_texture: wgpu::Texture,
output_view: wgpu::TextureView, pub output_view: wgpu::TextureView,
depth_texture: wgpu::Texture, pub depth_texture: wgpu::Texture,
depth_view: wgpu::TextureView, pub depth_view: wgpu::TextureView,
} }
impl OffscreenTextures { impl OffscreenTextures {
@ -60,10 +60,11 @@ impl OffscreenTextures {
} }
pub struct OffscreenViewport { pub struct OffscreenViewport {
device: Arc<wgpu::Device>, pub device: Arc<wgpu::Device>,
queue: Arc<wgpu::Queue>, pub queue: Arc<wgpu::Queue>,
output_format: wgpu::TextureFormat, pub output_format: wgpu::TextureFormat,
textures: OffscreenTextures, pub textures: OffscreenTextures,
pub egui_texture: egui::TextureId,
} }
impl OffscreenViewport { impl OffscreenViewport {
@ -71,14 +72,22 @@ impl OffscreenViewport {
device: Arc<wgpu::Device>, device: Arc<wgpu::Device>,
queue: Arc<wgpu::Queue>, queue: Arc<wgpu::Queue>,
output_format: wgpu::TextureFormat, output_format: wgpu::TextureFormat,
render_pass: &mut egui_wgpu_backend::RenderPass,
) -> Self { ) -> Self {
let textures = OffscreenTextures::new(&device, 640, 480, output_format); let textures = OffscreenTextures::new(&device, 640, 480, output_format);
let egui_texture = render_pass.egui_texture_from_wgpu_texture(
&device,
&textures.output_view,
wgpu::FilterMode::Nearest,
);
Self { Self {
device, device,
queue, queue,
output_format, output_format,
textures, textures,
egui_texture,
} }
} }
@ -111,9 +120,9 @@ impl Viewport for OffscreenViewport {
} }
pub struct ViewportStore { pub struct ViewportStore {
device: Arc<wgpu::Device>, pub device: Arc<wgpu::Device>,
output_format: wgpu::TextureFormat, pub output_format: wgpu::TextureFormat,
viewport: OffscreenViewport, pub viewport: OffscreenViewport,
} }
impl ViewportStore { impl ViewportStore {
@ -121,11 +130,12 @@ impl ViewportStore {
device: Arc<wgpu::Device>, device: Arc<wgpu::Device>,
queue: Arc<wgpu::Queue>, queue: Arc<wgpu::Queue>,
output_format: wgpu::TextureFormat, output_format: wgpu::TextureFormat,
render_pass: &mut egui_wgpu_backend::RenderPass,
) -> Self { ) -> Self {
Self { Self {
device: device.clone(), device: device.clone(),
output_format, output_format,
viewport: OffscreenViewport::new(device, queue, output_format), viewport: OffscreenViewport::new(device, queue, output_format, render_pass),
} }
} }
} }
@ -149,12 +159,14 @@ impl RenderState {
device: Arc<wgpu::Device>, device: Arc<wgpu::Device>,
queue: Arc<wgpu::Queue>, queue: Arc<wgpu::Queue>,
output_format: wgpu::TextureFormat, output_format: wgpu::TextureFormat,
render_pass: &mut egui_wgpu_backend::RenderPass,
) -> Self { ) -> Self {
use cyborg::shader::{ShaderStore, ShaderWatcher}; use cyborg::shader::{ShaderStore, ShaderWatcher};
let mut world = legion::World::default(); let mut world = legion::World::default();
let mut resources = legion::Resources::default(); let mut resources = legion::Resources::default();
let viewport_store = ViewportStore::new(device.clone(), queue.clone(), output_format); let viewport_store =
ViewportStore::new(device.clone(), queue.clone(), output_format, render_pass);
let renderer = cyborg::Renderer::new(device.clone(), queue.clone()); let renderer = cyborg::Renderer::new(device.clone(), queue.clone());
resources.insert(renderer); resources.insert(renderer);

View File

@ -8,7 +8,7 @@ pub struct UserInterface {
} }
impl UserInterface { impl UserInterface {
pub fn new(viewport_texture: egui::TextureHandle) -> Self { pub fn new(viewport_texture: egui::TextureId) -> Self {
Self { Self {
developer_mode: true, developer_mode: true,
show_profiler: false, show_profiler: false,
@ -127,11 +127,11 @@ impl UserInterface {
} }
pub struct ViewportWidget { pub struct ViewportWidget {
texture: egui::TextureHandle, texture: egui::TextureId,
} }
impl ViewportWidget { impl ViewportWidget {
pub fn new(texture: egui::TextureHandle) -> Self { pub fn new(texture: egui::TextureId) -> Self {
Self { texture } Self { texture }
} }
} }
@ -145,7 +145,7 @@ impl egui::Widget for &mut ViewportWidget {
let response = ui.interact(rect, id, sense); let response = ui.interact(rect, id, sense);
use egui::{pos2, Mesh, Rect, Color32, Shape}; use egui::{pos2, Mesh, Rect, Color32, Shape};
let mut mesh = Mesh::with_texture(self.texture.id()); 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));
let tint = Color32::WHITE; let tint = Color32::WHITE;
mesh.add_rect_with_uv(rect, uv, tint); mesh.add_rect_with_uv(rect, uv, tint);