Implement side-by-side view

This commit is contained in:
2024-12-01 15:52:11 -05:00
parent 2e5d5e140f
commit 761b434108
3 changed files with 59 additions and 6 deletions
+20 -3
View File
@@ -1,6 +1,6 @@
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 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 =
device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor {
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::LeftEye, create_render_pipeline("fs_lefteye"));
render_pipelines.insert(DisplayMode::RightEye, create_render_pipeline("fs_righteye"));
render_pipelines.insert(
DisplayMode::SideBySide,
create_render_pipeline("fs_sidebyside"),
);
render_state
.renderer
@@ -217,7 +221,10 @@ impl egui_wgpu::CallbackTrait for GameScreenCallback {
let top = viewport.top_px as f32;
let width = viewport.width_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 h = height.min(width / aspect_ratio);
let x = left + (width - w) / 2.0;
@@ -258,4 +265,14 @@ pub enum DisplayMode {
Anaglyph,
LeftEye,
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),
}
}
}