This commit is contained in:
tsuki 2024-07-22 23:37:14 +08:00
parent 57bbbfe97f
commit 2638243856
5 changed files with 109 additions and 10 deletions

View File

@ -61,8 +61,8 @@ pub enum Config {
config_for_everyitem!({PPIConfig => PPI},); config_for_everyitem!({PPIConfig => PPI},);
pub trait AttachWithMouse { pub trait AttachWithMouse: AttaWithProgram {
fn attach_with_mouse(&mut self, state: MouseState); fn attach_with_mouse(&mut self, state: &MouseState);
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone)]

View File

@ -7,7 +7,7 @@ use crate::errors::*;
use super::colormap::ColorMap; use super::colormap::ColorMap;
use super::threed::ThreeD; use super::threed::ThreeD;
use super::transforms::viewport::Viewport; use super::transforms::viewport::Viewport;
use super::{transforms, AttaWithBuffer, Config, Graphics}; use super::{transforms, AttaWithBuffer, AttaWithProgram, AttachWithMouse, Config, Graphics};
pub struct PPI { pub struct PPI {
program: Program, program: Program,
@ -250,7 +250,6 @@ pub struct PPIConfig {
pub layer: usize, pub layer: usize,
pub rdpi: f32, pub rdpi: f32,
pub adpi: f32, pub adpi: f32,
pub trackball: ThreeD,
} }
mod test { mod test {

View File

@ -73,7 +73,7 @@ impl Transform for ThreeD {
} }
impl AttachWithMouse for ThreeD { impl AttachWithMouse for ThreeD {
fn attach_with_mouse(&mut self, state: super::MouseState) { fn attach_with_mouse(&mut self, state: &super::MouseState) {
if let super::MouseState::Drag { from, delta } = state { if let super::MouseState::Drag { from, delta } = state {
self.trackball self.trackball
.on_mouse_drag(from[0], from[1], delta[0], delta[1]); .on_mouse_drag(from[0], from[1], delta[0], delta[1]);

105
src/pg.rs
View File

@ -1,11 +1,13 @@
use crate::components::Program;
use crate::data_loader::Data; use crate::data_loader::Data;
use crate::graphics::colormap::linear::LinearColormap; use crate::graphics::colormap::linear::LinearColormap;
use crate::graphics::ppi::PPIConfig; use crate::graphics::ppi::PPIConfig;
use crate::graphics::threed::ThreeD;
use crate::graphics::transforms::position::Position; use crate::graphics::transforms::position::Position;
use crate::graphics::transforms::viewport::Viewport; use crate::graphics::transforms::viewport::Viewport;
use crate::graphics::transforms::ChainedTransform; use crate::graphics::transforms::ChainedTransform;
use crate::graphics::{ppi::PPI, Graphics}; use crate::graphics::{ppi::PPI, Graphics};
use crate::graphics::{AttaWithBuffer, AttaWithProgram, Config, MouseState}; use crate::graphics::{AttaWithBuffer, AttaWithProgram, AttachWithMouse, Config, MouseState};
use crate::{errors::*, ui::base}; use crate::{errors::*, ui::base};
use glow::{HasContext, NativeBuffer, NativeFramebuffer, NativeTexture, NativeVertexArray}; use glow::{HasContext, NativeBuffer, NativeFramebuffer, NativeTexture, NativeVertexArray};
use imgui::{ImStr, ImString, Textures, Ui}; use imgui::{ImStr, ImString, Textures, Ui};
@ -106,6 +108,10 @@ impl<'a> App<'a> {
window_info.re_init = false; window_info.re_init = false;
} }
if let Some(motion) = window_info.modifer.as_ref() {
motion.attach_with_program(&self.gl, p.program_ref()).unwrap();
}
unsafe { unsafe {
self.gl self.gl
.bind_framebuffer(glow::FRAMEBUFFER, window_info.framebuffer); .bind_framebuffer(glow::FRAMEBUFFER, window_info.framebuffer);
@ -421,6 +427,10 @@ impl<'a> App<'a> {
from: window.last_mouse_position, from: window.last_mouse_position,
delta: delta, delta: delta,
}); });
window.modifer.as_mut().map(|v| {
v.exec(window.motion.as_ref().unwrap());
});
window.need_redraw = true;
} }
if ui.is_mouse_released(imgui::MouseButton::Left) { if ui.is_mouse_released(imgui::MouseButton::Left) {
if window.size != ui.window_size() { if window.size != ui.window_size() {
@ -528,7 +538,7 @@ impl<'a> App<'a> {
pub fn create_render_window(&mut self, title: &str, size: [f32; 2]) -> Result<()> { pub fn create_render_window(&mut self, title: &str, size: [f32; 2]) -> Result<()> {
// Insert the window data into the windows hashmap // Insert the window data into the windows hashmap
let id = ImString::new(title); let id = ImString::new(title);
let mut data = WindowData::new(id.clone(), size); let mut data = WindowData::new(id.clone(), size, None);
let (fb, tex) = let (fb, tex) =
self.create_framebuffer(title, (size[0].floor() as i32, size[1].floor() as i32))?; self.create_framebuffer(title, (size[0].floor() as i32, size[1].floor() as i32))?;
@ -701,10 +711,11 @@ pub struct WindowData {
mouse_position: [f32; 2], mouse_position: [f32; 2],
motion: Option<MouseState>, motion: Option<MouseState>,
config: Option<Config>, config: Option<Config>,
modifer: Option<ModiferType>,
} }
impl WindowData { impl WindowData {
pub fn new(title: ImString, size: [f32; 2]) -> Self { pub fn new(title: ImString, size: [f32; 2], modifer: Option<ModiferType>) -> Self {
Self { Self {
title, title,
open: true, open: true,
@ -723,6 +734,7 @@ impl WindowData {
attach: None, attach: None,
re_init: false, re_init: false,
config: None, config: None,
modifer,
} }
} }
@ -737,4 +749,91 @@ impl WindowData {
fn set_mouse_postion(&mut self, pos: [f32; 2]) { fn set_mouse_postion(&mut self, pos: [f32; 2]) {
self.mouse_position = pos; self.mouse_position = pos;
} }
fn set_motion(&mut self, motion: MouseState) {
self.motion = Some(motion);
}
fn set_need_redraw(&mut self) {
self.need_redraw = true;
}
fn set_config(&mut self, config: Config) {
self.config = Some(config);
}
fn set_re_init(&mut self) {
self.re_init = true;
}
fn on_mouse_drag(&mut self) {
let state = MouseState::Drag {
from: self.last_mouse_position,
delta: self.last_mouse_delta,
};
self.set_motion(state.clone());
self.modifer.as_mut().map(|m| {});
self.set_need_redraw();
}
} }
macro_rules! modifer_exec {
($(($t:ty => $b:tt),)+) => {
impl ModiferType {
pub fn exec(&mut self, motion: &MouseState) {
match self {
$(
ModiferType::$b(b) => {
b.attach_with_mouse(motion);
}
)+
_ => {}
}
}
}
impl AttaWithProgram for ModiferType {
fn attach_with_program(&self, gl: &glow::Context, program: &Program) -> Result<()> {
match self {
$(
ModiferType::$b(b) => {
b.attach_with_program(gl, program)?;
}
)+
_ => {
}
}
Ok(())
}
}
$(
impl From<$t> for ModiferType {
fn from(t: $t) -> Self {
ModiferType::$b(t)
}
}
)+
}
}
pub enum ModiferType {
ThreeD(ThreeD),
TwoD,
}
modifer_exec!((ThreeD => ThreeD),);

View File

@ -1,4 +1,5 @@
use crate::errors::*; use crate::errors::*;
use crate::graphics::threed::ThreeD;
use crate::graphics::Config; use crate::graphics::Config;
use crate::pg::App; use crate::pg::App;
use crate::{data_loader::Data, pg::WindowData}; use crate::{data_loader::Data, pg::WindowData};
@ -11,7 +12,7 @@ pub fn base(ui: &Ui, window: &winit::window::Window, run: &mut bool, app: &mut A
.build(|| { .build(|| {
if ui.button("PPI") { if ui.button("PPI") {
let data = let data =
load_data(r#"/Users/tsuki/Desktop/ZJSXAA_20230113070200_R.dat.gz"#).unwrap(); load_data(r#"C:\Users\qwin7\Downloads\ZJSXAA_20230113070200_R.dat.gz"#).unwrap();
app.create_render_window("ppi", [300.0, 300.0]).unwrap(); app.create_render_window("ppi", [300.0, 300.0]).unwrap();
app.create_ppi_render("ppi", None); app.create_ppi_render("ppi", None);
app.bind_data("ppi", &data).unwrap(); app.bind_data("ppi", &data).unwrap();
@ -35,7 +36,7 @@ pub fn base(ui: &Ui, window: &winit::window::Window, run: &mut bool, app: &mut A
} }
fn create_display_window(title: &str, size: [f32; 2], copy_from: Option<ImString>) -> WindowData { fn create_display_window(title: &str, size: [f32; 2], copy_from: Option<ImString>) -> WindowData {
WindowData::new(ImString::new(title), size) WindowData::new(ImString::new(title), size, Some(ThreeD::default().into()))
} }
fn load_data(path: impl AsRef<std::path::Path>) -> Result<Data> { fn load_data(path: impl AsRef<std::path::Path>) -> Result<Data> {