Draw OffscreenTextures to ViewportWidget
This commit is contained in:
parent
0359c92ae9
commit
e7ff524e7b
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue