Implement side-by-side view
This commit is contained in:
		
							parent
							
								
									2e5d5e140f
								
							
						
					
					
						commit
						761b434108
					
				| 
						 | 
					@ -57,7 +57,7 @@ fn fs_lefteye(in: VertexOutput) -> @location(0) vec4<f32> {
 | 
				
			||||||
@fragment
 | 
					@fragment
 | 
				
			||||||
fn fs_righteye(in: VertexOutput) -> @location(0) vec4<f32> {
 | 
					fn fs_righteye(in: VertexOutput) -> @location(0) vec4<f32> {
 | 
				
			||||||
    let brt = textureSample(u_texture, u_sampler, in.tex_coords);
 | 
					    let brt = textureSample(u_texture, u_sampler, in.tex_coords);
 | 
				
			||||||
    return colors.right * brt[1];
 | 
					    return colors.left * brt[1];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@fragment
 | 
					@fragment
 | 
				
			||||||
| 
						 | 
					@ -65,3 +65,15 @@ fn fs_anaglyph(in: VertexOutput) -> @location(0) vec4<f32> {
 | 
				
			||||||
    let brt = textureSample(u_texture, u_sampler, in.tex_coords);
 | 
					    let brt = textureSample(u_texture, u_sampler, in.tex_coords);
 | 
				
			||||||
    return colors.left * brt[0] + colors.right * brt[1];
 | 
					    return colors.left * brt[0] + colors.right * brt[1];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@fragment
 | 
				
			||||||
 | 
					fn fs_sidebyside(in: VertexOutput) -> @location(0) vec4<f32> {
 | 
				
			||||||
 | 
					    var point = in.tex_coords;
 | 
				
			||||||
 | 
					    point.x = (point.x * 2.0) % 1.0;
 | 
				
			||||||
 | 
					    let brt = textureSample(u_texture, u_sampler, point);
 | 
				
			||||||
 | 
					    if in.tex_coords.x < 0.5 {
 | 
				
			||||||
 | 
					        return colors.left * brt[0];
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        return colors.left * brt[1];
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -90,7 +90,10 @@ impl GameWindow {
 | 
				
			||||||
                for scale in 1..=4 {
 | 
					                for scale in 1..=4 {
 | 
				
			||||||
                    let label = format!("x{scale}");
 | 
					                    let label = format!("x{scale}");
 | 
				
			||||||
                    let scale = scale as f32;
 | 
					                    let scale = scale as f32;
 | 
				
			||||||
                    let dims = (384.0 * scale, 224.0 * scale + 22.0).into();
 | 
					                    let dims = {
 | 
				
			||||||
 | 
					                        let Vec2 { x, y } = self.display_mode.proportions();
 | 
				
			||||||
 | 
					                        Vec2::new(x * scale, y * scale + 22.0)
 | 
				
			||||||
 | 
					                    };
 | 
				
			||||||
                    if ui
 | 
					                    if ui
 | 
				
			||||||
                        .selectable_button((current_dims - dims).length() < 1.0, label)
 | 
					                        .selectable_button((current_dims - dims).length() < 1.0, label)
 | 
				
			||||||
                        .clicked()
 | 
					                        .clicked()
 | 
				
			||||||
| 
						 | 
					@ -102,6 +105,7 @@ impl GameWindow {
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            ui.menu_button("Display Mode", |ui| {
 | 
					            ui.menu_button("Display Mode", |ui| {
 | 
				
			||||||
 | 
					                let old_proportions = self.display_mode.proportions();
 | 
				
			||||||
                if ui
 | 
					                if ui
 | 
				
			||||||
                    .selectable_option(&mut self.display_mode, DisplayMode::Anaglyph, "Anaglyph")
 | 
					                    .selectable_option(&mut self.display_mode, DisplayMode::Anaglyph, "Anaglyph")
 | 
				
			||||||
                    .clicked()
 | 
					                    .clicked()
 | 
				
			||||||
| 
						 | 
					@ -120,6 +124,25 @@ impl GameWindow {
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    ui.close_menu();
 | 
					                    ui.close_menu();
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                if ui
 | 
				
			||||||
 | 
					                    .selectable_option(
 | 
				
			||||||
 | 
					                        &mut self.display_mode,
 | 
				
			||||||
 | 
					                        DisplayMode::SideBySide,
 | 
				
			||||||
 | 
					                        "Side by Side",
 | 
				
			||||||
 | 
					                    )
 | 
				
			||||||
 | 
					                    .clicked()
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    ui.close_menu();
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                let new_proportions = self.display_mode.proportions();
 | 
				
			||||||
 | 
					                let scale = new_proportions / old_proportions;
 | 
				
			||||||
 | 
					                if scale != Vec2::new(1.0, 1.0) {
 | 
				
			||||||
 | 
					                    let current_dims = ctx.input(|i| i.viewport().inner_rect.unwrap());
 | 
				
			||||||
 | 
					                    let current_dims = current_dims.max - current_dims.min;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    ctx.send_viewport_cmd(ViewportCommand::InnerSize(current_dims * scale));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            ui.menu_button("Colors", |ui| {
 | 
					            ui.menu_button("Colors", |ui| {
 | 
				
			||||||
                for preset in COLOR_PRESETS {
 | 
					                for preset in COLOR_PRESETS {
 | 
				
			||||||
| 
						 | 
					@ -183,9 +206,10 @@ impl AppWindow for GameWindow {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn initial_viewport(&self) -> ViewportBuilder {
 | 
					    fn initial_viewport(&self) -> ViewportBuilder {
 | 
				
			||||||
 | 
					        let dimensions = self.display_mode.proportions() + Vec2::new(0.0, 22.0);
 | 
				
			||||||
        ViewportBuilder::default()
 | 
					        ViewportBuilder::default()
 | 
				
			||||||
            .with_title("Shrooms VB")
 | 
					            .with_title("Shrooms VB")
 | 
				
			||||||
            .with_inner_size((384.0, 246.0))
 | 
					            .with_inner_size(dimensions)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    fn show(&mut self, ctx: &Context) {
 | 
					    fn show(&mut self, ctx: &Context) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
use std::{collections::HashMap, sync::Arc};
 | 
					use std::{collections::HashMap, sync::Arc};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use egui::{Color32, Rgba, Widget};
 | 
					use egui::{Color32, Rgba, Vec2, Widget};
 | 
				
			||||||
use wgpu::{util::DeviceExt as _, BindGroup, BindGroupLayout, Buffer, RenderPipeline};
 | 
					use wgpu::{util::DeviceExt as _, BindGroup, BindGroupLayout, Buffer, RenderPipeline};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use crate::graphics::TextureSink;
 | 
					use crate::graphics::TextureSink;
 | 
				
			||||||
| 
						 | 
					@ -48,7 +48,7 @@ impl GameScreen {
 | 
				
			||||||
            ],
 | 
					            ],
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let shader = device.create_shader_module(wgpu::include_wgsl!("../anaglyph.wgsl"));
 | 
					        let shader = device.create_shader_module(wgpu::include_wgsl!("../game.wgsl"));
 | 
				
			||||||
        let render_pipeline_layout =
 | 
					        let render_pipeline_layout =
 | 
				
			||||||
            device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
 | 
					            device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
 | 
				
			||||||
                label: Some("render pipeline layout"),
 | 
					                label: Some("render pipeline layout"),
 | 
				
			||||||
| 
						 | 
					@ -100,6 +100,10 @@ impl GameScreen {
 | 
				
			||||||
        render_pipelines.insert(DisplayMode::Anaglyph, create_render_pipeline("fs_anaglyph"));
 | 
					        render_pipelines.insert(DisplayMode::Anaglyph, create_render_pipeline("fs_anaglyph"));
 | 
				
			||||||
        render_pipelines.insert(DisplayMode::LeftEye, create_render_pipeline("fs_lefteye"));
 | 
					        render_pipelines.insert(DisplayMode::LeftEye, create_render_pipeline("fs_lefteye"));
 | 
				
			||||||
        render_pipelines.insert(DisplayMode::RightEye, create_render_pipeline("fs_righteye"));
 | 
					        render_pipelines.insert(DisplayMode::RightEye, create_render_pipeline("fs_righteye"));
 | 
				
			||||||
 | 
					        render_pipelines.insert(
 | 
				
			||||||
 | 
					            DisplayMode::SideBySide,
 | 
				
			||||||
 | 
					            create_render_pipeline("fs_sidebyside"),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        render_state
 | 
					        render_state
 | 
				
			||||||
            .renderer
 | 
					            .renderer
 | 
				
			||||||
| 
						 | 
					@ -217,7 +221,10 @@ impl egui_wgpu::CallbackTrait for GameScreenCallback {
 | 
				
			||||||
        let top = viewport.top_px as f32;
 | 
					        let top = viewport.top_px as f32;
 | 
				
			||||||
        let width = viewport.width_px as f32;
 | 
					        let width = viewport.width_px as f32;
 | 
				
			||||||
        let height = viewport.height_px as f32;
 | 
					        let height = viewport.height_px as f32;
 | 
				
			||||||
        let aspect_ratio = 384.0 / 224.0;
 | 
					        let aspect_ratio = {
 | 
				
			||||||
 | 
					            let proportions = self.display_mode.proportions();
 | 
				
			||||||
 | 
					            proportions.x / proportions.y
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
        let w = width.min(height * aspect_ratio);
 | 
					        let w = width.min(height * aspect_ratio);
 | 
				
			||||||
        let h = height.min(width / aspect_ratio);
 | 
					        let h = height.min(width / aspect_ratio);
 | 
				
			||||||
        let x = left + (width - w) / 2.0;
 | 
					        let x = left + (width - w) / 2.0;
 | 
				
			||||||
| 
						 | 
					@ -258,4 +265,14 @@ pub enum DisplayMode {
 | 
				
			||||||
    Anaglyph,
 | 
					    Anaglyph,
 | 
				
			||||||
    LeftEye,
 | 
					    LeftEye,
 | 
				
			||||||
    RightEye,
 | 
					    RightEye,
 | 
				
			||||||
 | 
					    SideBySide,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl DisplayMode {
 | 
				
			||||||
 | 
					    pub fn proportions(self) -> Vec2 {
 | 
				
			||||||
 | 
					        match self {
 | 
				
			||||||
 | 
					            Self::SideBySide => Vec2::new(768.0, 224.0),
 | 
				
			||||||
 | 
					            _ => Vec2::new(384.0, 224.0),
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue