This commit is contained in:
Tsuki 2024-08-22 18:40:13 +08:00
parent f25ed801f5
commit e8f3b2bc47
16 changed files with 384 additions and 133 deletions

183
Cargo.lock generated
View File

@ -282,6 +282,15 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
[[package]]
name = "block-buffer"
version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
dependencies = [
"generic-array",
]
[[package]] [[package]]
name = "block-sys" name = "block-sys"
version = "0.2.1" version = "0.2.1"
@ -452,7 +461,7 @@ dependencies = [
"js-sys", "js-sys",
"num-traits", "num-traits",
"wasm-bindgen", "wasm-bindgen",
"windows-targets 0.52.5", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -550,6 +559,15 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "cpufeatures"
version = "0.2.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "51e852e6dc9a5bed1fae92dd2375037bf2b768725bf3be87811edee3249d09ad"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "crc32fast" name = "crc32fast"
version = "1.4.2" version = "1.4.2"
@ -590,12 +608,32 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
name = "crypto-common"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
"generic-array",
"typenum",
]
[[package]] [[package]]
name = "cursor-icon" name = "cursor-icon"
version = "1.1.0" version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991"
[[package]]
name = "digest"
version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
"block-buffer",
"crypto-common",
]
[[package]] [[package]]
name = "dirs" name = "dirs"
version = "5.0.1" version = "5.0.1"
@ -729,6 +767,12 @@ dependencies = [
"zune-inflate", "zune-inflate",
] ]
[[package]]
name = "fastrand"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
[[package]] [[package]]
name = "fdeflate" name = "fdeflate"
version = "0.3.4" version = "0.3.4"
@ -840,6 +884,16 @@ dependencies = [
"pkg-config", "pkg-config",
] ]
[[package]]
name = "generic-array"
version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
"typenum",
"version_check",
]
[[package]] [[package]]
name = "geo" name = "geo"
version = "0.28.0" version = "0.28.0"
@ -1353,7 +1407,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"windows-targets 0.52.5", "windows-targets 0.48.5",
] ]
[[package]] [[package]]
@ -1821,7 +1875,7 @@ dependencies = [
"libc", "libc",
"redox_syscall 0.5.1", "redox_syscall 0.5.1",
"smallvec", "smallvec",
"windows-targets 0.52.5", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -2015,8 +2069,10 @@ dependencies = [
"pathfinder_geometry", "pathfinder_geometry",
"raw-window-handle 0.5.2", "raw-window-handle 0.5.2",
"regex", "regex",
"rust-embed",
"serde", "serde",
"serde_json", "serde_json",
"tempfile",
"thiserror", "thiserror",
"tinyfiledialogs", "tinyfiledialogs",
"toml", "toml",
@ -2234,6 +2290,40 @@ dependencies = [
"smallvec", "smallvec",
] ]
[[package]]
name = "rust-embed"
version = "8.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa66af4a4fdd5e7ebc276f115e895611a34739a9c1c01028383d612d550953c0"
dependencies = [
"rust-embed-impl",
"rust-embed-utils",
"walkdir",
]
[[package]]
name = "rust-embed-impl"
version = "8.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6125dbc8867951125eec87294137f4e9c2c96566e61bf72c45095a7c77761478"
dependencies = [
"proc-macro2",
"quote",
"rust-embed-utils",
"syn 2.0.66",
"walkdir",
]
[[package]]
name = "rust-embed-utils"
version = "8.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e5347777e9aacb56039b0e1f28785929a8a3b709e87482e7442c72e7c12529d"
dependencies = [
"sha2",
"walkdir",
]
[[package]] [[package]]
name = "rustc_version" name = "rustc_version"
version = "0.4.0" version = "0.4.0"
@ -2373,6 +2463,17 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "sha2"
version = "0.10.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
dependencies = [
"cfg-if",
"cpufeatures",
"digest",
]
[[package]] [[package]]
name = "simba" name = "simba"
version = "0.8.1" version = "0.8.1"
@ -2557,6 +2658,19 @@ version = "0.12.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2" checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2"
[[package]]
name = "tempfile"
version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64"
dependencies = [
"cfg-if",
"fastrand",
"once_cell",
"rustix",
"windows-sys 0.59.0",
]
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "1.0.61" version = "1.0.61"
@ -3051,7 +3165,7 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
dependencies = [ dependencies = [
"windows-targets 0.52.5", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -3078,7 +3192,16 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [ dependencies = [
"windows-targets 0.52.5", "windows-targets 0.52.6",
]
[[package]]
name = "windows-sys"
version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
"windows-targets 0.52.6",
] ]
[[package]] [[package]]
@ -3113,18 +3236,18 @@ dependencies = [
[[package]] [[package]]
name = "windows-targets" name = "windows-targets"
version = "0.52.5" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [ dependencies = [
"windows_aarch64_gnullvm 0.52.5", "windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.5", "windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.5", "windows_i686_gnu 0.52.6",
"windows_i686_gnullvm", "windows_i686_gnullvm",
"windows_i686_msvc 0.52.5", "windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.5", "windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.5", "windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.5", "windows_x86_64_msvc 0.52.6",
] ]
[[package]] [[package]]
@ -3141,9 +3264,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]] [[package]]
name = "windows_aarch64_gnullvm" name = "windows_aarch64_gnullvm"
version = "0.52.5" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
@ -3159,9 +3282,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.52.5" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
@ -3177,15 +3300,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.52.5" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]] [[package]]
name = "windows_i686_gnullvm" name = "windows_i686_gnullvm"
version = "0.52.5" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
@ -3201,9 +3324,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.52.5" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
@ -3219,9 +3342,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.52.5" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
@ -3237,9 +3360,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.52.5" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
@ -3255,9 +3378,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.52.5" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]] [[package]]
name = "winit" name = "winit"

View File

@ -47,6 +47,8 @@ glsl = "7.0.0"
glsl-quasiquote = "7.0.0" glsl-quasiquote = "7.0.0"
toml = "0.8.19" toml = "0.8.19"
femtovg = "0.9.2" femtovg = "0.9.2"
rust-embed = "8.5.0"
tempfile = "3.12.0"
[features] [features]
default = ["sdf_font"] default = ["sdf_font"]

View File

@ -1,4 +1,4 @@
use crate::errors::*; use crate::{errors::*, Asset};
use dirs::font_dir; use dirs::font_dir;
use freetype::face::LoadFlag; use freetype::face::LoadFlag;
use freetype::{Face, GlyphMetrics, Library}; use freetype::{Face, GlyphMetrics, Library};
@ -7,26 +7,46 @@ use image::GrayImage;
use image::ImageBuffer; use image::ImageBuffer;
use log::*; use log::*;
use std::collections::HashMap; use std::collections::HashMap;
use std::io::Write;
use std::path::PathBuf;
use std::{env, fs};
pub struct FontManager { pub struct FontManager {
library: Library, library: Library,
fonts: HashMap<String, Font>, fonts: HashMap<String, Font>,
} }
use tempfile::NamedTempFile;
impl FontManager { impl FontManager {
pub fn new() -> Result<Self> { pub fn new() -> Result<Self> {
// let source = fk::source::SystemSource::new(); // let source = fk::source::SystemSource::new();
let library = Library::init().map_err(|e| Error::InitError(e.into()))?; let library = Library::init().map_err(|e| Error::InitError(e.into()))?;
let root_path = font_dir().map_or_else( let root_path = font_dir().unwrap_or_else(|| {
|| { let default_font = Asset::get("Roboto-Regular.ttf").unwrap();
error!("Font dir not found"); let exe_path = env::current_exe().unwrap();
Err(Error::InitError(anyhow::anyhow!("Font dir not found"))) let mut folder_path = exe_path.parent().unwrap().to_path_buf();
}, folder_path.push("resources");
|font_dir| {
info!("Font dir: {:?}", font_dir); if folder_path.exists() {
Ok(font_dir) info!("Resources Folder exists");
}, } else {
)?; fs::create_dir_all(&folder_path).unwrap();
}
folder_path
});
// let root_path = font_dir().map_or_else(
// || {
// error!("Font dir not found");
// Err(Error::InitError(anyhow::anyhow!("Font dir not found")))
// },
// |font_dir| {
// info!("Font dir: {:?}", font_dir);
// Ok(font_dir)
// },
// )?;
Ok(Self { Ok(Self {
library, library,

View File

@ -145,7 +145,6 @@ impl AttaWithBuffer for AggFastPath {
sum += num; sum += num;
} }
let point_lens = data.iter().map(|d| d.len()).collect::<Vec<_>>();
let mut vbo = Vec::with_capacity(points.len() * 10); let mut vbo = Vec::with_capacity(points.len() * 10);
for p in points { for p in points {
vbo.extend_from_slice(&[ vbo.extend_from_slice(&[
@ -155,16 +154,10 @@ impl AttaWithBuffer for AggFastPath {
} }
let mut ebo = vec![]; let mut ebo = vec![];
for (idx, e) in data.iter().map(|v| &v.ebo).enumerate() { for (idx, e) in data.iter().map(|v| &v.ebo).enumerate() {
if idx > 0 { let len = lens[idx] as u32;
let len = lens[idx - 1] as u32;
for e in e.iter() { for e in e.iter() {
ebo.extend_from_slice(&[e[0] + len, e[1] + len, e[2] + len]); ebo.extend_from_slice(&[e[0] + len, e[1] + len, e[2] + len]);
} }
} else {
for e in e.iter() {
ebo.extend_from_slice(e);
}
}
} }
let len = ebo.len() as i32; let len = ebo.len() as i32;

View File

@ -120,7 +120,7 @@ pub enum Config {
config_for_everyitem!({PPIConfig => PPI},{FontConfig => Font}, ); config_for_everyitem!({PPIConfig => PPI},{FontConfig => Font}, );
pub trait AttachWithMouse { pub trait AttachWithIO {
type State: CameraOP; type State: CameraOP;
fn attach_with_mouse( fn attach_with_mouse(
&mut self, &mut self,
@ -141,3 +141,9 @@ pub enum MouseState {
Wheel(f32), Wheel(f32),
None, None,
} }
#[derive(Debug, Clone)]
pub struct MouseKeyboardState {
pub mouse_state: MouseState,
pub keyboard_state: [bool; 652],
}

View File

@ -1,6 +1,6 @@
use super::colormap::ColorMap; use super::colormap::ColorMap;
use super::transforms::viewport::Viewport; use super::transforms::viewport::Viewport;
use super::{transforms, AttaWithBuffer, AttaWithProgram, AttachWithMouse, Config, Graphics}; use super::{transforms, AttaWithBuffer, AttaWithProgram, AttachWithIO, Config, Graphics};
use crate::components::{CodeType, Program, Shader}; use crate::components::{CodeType, Program, Shader};
use crate::data_loader::{CoordType, Data, DataType}; use crate::data_loader::{CoordType, Data, DataType};
use crate::errors::*; use crate::errors::*;

View File

@ -2,7 +2,7 @@ use std::rc::Rc;
use tracker::track; use tracker::track;
use super::transforms::{position::Position, trackball::TrackballModel}; use super::transforms::{position::Position, trackball::TrackballModel};
use super::{AttaWithProgram, AttachWithMouse}; use super::{AttaWithProgram, AttachWithIO};
use crate::camera::{self, Camera}; use crate::camera::{self, Camera};
use crate::errors::*; use crate::errors::*;
use crate::pg::layout_type::ViewPort; use crate::pg::layout_type::ViewPort;
@ -17,7 +17,7 @@ pub struct Trackball {
impl Trackball { impl Trackball {
pub fn new(aspect: f32, z_near: f32, z_far: f32, fov: f32) -> Result<Self> { pub fn new(aspect: f32, z_near: f32, z_far: f32, fov: f32) -> Result<Self> {
let trackball = TrackballModel::new(0.0, 90.0); let trackball = TrackballModel::new(0.0, 90.0, 20.0);
Ok(Self { trackball }) Ok(Self { trackball })
} }
@ -40,7 +40,7 @@ impl AttaWithProgram for Trackball {
} }
} }
impl AttachWithMouse for Trackball { impl AttachWithIO for Trackball {
type State = super::MouseState; type State = super::MouseState;
fn attach_with_mouse( fn attach_with_mouse(
&mut self, &mut self,

View File

@ -1,40 +1,38 @@
use crate::components::{CodeType, Program, Snippet}; use crate::components::{CodeType, Program, Snippet};
use crate::errors::Result; use crate::errors::Result;
use crate::graphics::{AttaWithProgram, AttachWithMouse, MouseState}; use crate::graphics::{AttaWithProgram, AttachWithIO, MouseKeyboardState, MouseState};
use crate::pg::layout_type::ViewPort; use crate::pg::layout_type::ViewPort;
use crate::ui::operation::Projection;
use glow::HasContext; use glow::HasContext;
use nalgebra::{Matrix4, Quaternion, Translation3, Unit, UnitQuaternion, Vector3}; use nalgebra::{Matrix4, Quaternion, Translation3, Unit, UnitQuaternion, Vector3};
use nalgebra_glm::vec3; use nalgebra_glm::vec3;
use serde::de;
use super::trackball::{self, TrackballModel};
use super::viewport;
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct PlaneTrans {} pub struct PlaneTrans {
trackball: TrackballModel,
}
impl AttachWithMouse for PlaneTrans { impl PlaneTrans {
type State = MouseState; fn translate(
&self,
fn attach_with_mouse( projection: &Projection,
&mut self,
state: &Self::State,
camera: &mut crate::camera::Camera, camera: &mut crate::camera::Camera,
projection: &mut crate::ui::operation::Projection, delta: &[f32; 2],
viewport: &ViewPort, viewport_size: &[f32; 2],
) -> bool { ) {
let watch_vec = camera.front(); let watch_vec = camera.front();
let viewport_size = viewport.size();
let if_vertical = true;
match state {
MouseState::Drag { from, delta } => {
if if_vertical {
// Radian
let fov = projection.fov().to_radians(); let fov = projection.fov().to_radians();
let aspect = projection.aspect(); let aspect = projection.aspect();
// Z_near // Z_near
let z_near = projection.z_near(); let z_distance = camera.front().norm().abs();
let h = 2.0 * z_near * (fov / 2.0).tan(); let h = 2.0 * z_distance * (fov / 2.0).tan();
let w = h * aspect; let w = h * aspect;
let move_width = (delta[0] * w) / viewport_size[0]; let move_width = (delta[0] * w) / viewport_size[0];
@ -43,24 +41,65 @@ impl AttachWithMouse for PlaneTrans {
let up = camera.get_upward(); let up = camera.get_upward();
let right = watch_vec.cross(&up).normalize(); let right = watch_vec.cross(&up).normalize();
let _move = move_width * right + move_height * up; let _move = move_width * right + move_height * up;
camera.set_position(camera.get_position() - _move);
camera.set_position(camera.get_position() + _move); camera.set_center(camera.get_center() - _move);
camera.set_center(camera.get_center() + _move);
} else {
} }
} }
impl AttachWithIO for PlaneTrans {
type State = MouseKeyboardState;
fn attach_with_mouse(
&mut self,
state: &Self::State,
camera: &mut crate::camera::Camera,
projection: &mut crate::ui::operation::Projection,
viewport: &ViewPort,
) -> bool {
let viewport_size = viewport.size();
let shift_key = state.keyboard_state[imgui::Key::LeftShift as usize];
let ctrl_key = state.keyboard_state[imgui::Key::LeftCtrl as usize];
match &state.mouse_state {
MouseState::Drag { from, delta } => {
if shift_key {
self.trackball.drag_to(
from[0] - viewport_size[0] / 2.0,
from[1] - viewport_size[1] / 2.0,
0.0,
-delta[1],
);
} else if ctrl_key {
self.trackball.drag_to(
from[0] - viewport_size[0] / 2.0,
from[1] - viewport_size[1] / 2.0,
-delta[0],
0.0,
);
} else if shift_key && ctrl_key {
self.trackball.drag_to(
from[0] - viewport_size[0] / 2.0,
from[1] - viewport_size[1] / 2.0,
-delta[0],
-delta[1],
)
} else {
self.translate(projection, camera, delta, &viewport_size);
}
true
}
MouseState::Wheel(delta) => { MouseState::Wheel(delta) => {
projection.set_fov((projection.fov() - delta).clamp(15.0, 120.0)); projection.set_fov((projection.fov() - delta).clamp(15.0, 120.0));
}
_ => {}
}
true true
} }
_ => false,
}
}
fn init_camera(&self) -> crate::camera::Camera { fn init_camera(&self) -> crate::camera::Camera {
crate::camera::Camera::new( crate::camera::Camera::new(
vec3(0.0, 20.0, 0.0), vec3(0.0, 0.0, 20.0),
vec3(0.0, 0.0, 1.0), vec3(0.0, 1.0, 0.0),
vec3(0.0, 0.0, 0.0), vec3(0.0, 0.0, 0.0),
) )
} }
@ -72,10 +111,7 @@ impl AttaWithProgram for PlaneTrans {
fn attach_with_program(&self, gl: &glow::Context, program: &Program) -> Result<()> { fn attach_with_program(&self, gl: &glow::Context, program: &Program) -> Result<()> {
unsafe { unsafe {
let loc = program.get_uniform_location(gl, "trackball_model"); let loc = program.get_uniform_location(gl, "trackball_model");
self.trackball.attach_with_program(gl, program)?;
let trackball = nalgebra_glm::rotate_x(&nalgebra_glm::identity(), 90.0f32.to_radians());
gl.uniform_matrix_4_f32_slice(loc.as_ref(), false, trackball.as_slice());
} }
Ok(()) Ok(())
} }
@ -83,6 +119,7 @@ impl AttaWithProgram for PlaneTrans {
impl Default for PlaneTrans { impl Default for PlaneTrans {
fn default() -> Self { fn default() -> Self {
Self {} let trackball = TrackballModel::new(0.0, 0.0, 200.0);
Self { trackball }
} }
} }

View File

@ -19,13 +19,13 @@ pub struct TrackballModel {
} }
impl TrackballModel { impl TrackballModel {
pub fn new(theta: f32, phi: f32) -> Self { pub fn new(phi: f32, theta: f32, range: f32) -> Self {
let mut trackball = Self { let mut trackball = Self {
rotation: UnitQuaternion::identity(), rotation: UnitQuaternion::identity(),
count: 0, count: 0,
model: Matrix4::identity(), model: Matrix4::identity(),
renorm_count: 97, renorm_count: 97,
trackball_size: 20.0, trackball_size: range,
x: 0.0, x: 0.0,
y: 0.0, y: 0.0,
theta, theta,
@ -35,6 +35,17 @@ impl TrackballModel {
trackball trackball
} }
pub fn rotate_z(&mut self, angle: f32) {
let q = UnitQuaternion::from_axis_angle(&Vector3::z_axis(), angle);
self.rotation *= q;
self.count += 1;
if self.count > self.renorm_count {
self.rotation = UnitQuaternion::new_normalize(*self.rotation.clone());
self.count = 0;
}
self.model = self.rotation.to_homogeneous();
}
pub fn drag_to(&mut self, x: f32, y: f32, dx: f32, dy: f32) { pub fn drag_to(&mut self, x: f32, y: f32, dx: f32, dy: f32) {
let q = self.rotate(x, y, dx, dy); let q = self.rotate(x, y, dx, dy);
self.rotation *= q; self.rotation *= q;
@ -159,7 +170,7 @@ mod test {
#[test] #[test]
fn test_trackball() { fn test_trackball() {
let mut trackball = TrackballModel::new(45.0, 45.0); let mut trackball = TrackballModel::new(45.0, 45.0, 20.0);
println!("{:?}", trackball.model()); println!("{:?}", trackball.model());
trackball.drag_to(0.0, 10.0, 15.0, 30.0); trackball.drag_to(0.0, 10.0, 15.0, 30.0);

View File

@ -15,6 +15,12 @@ mod utils;
use pg::App; use pg::App;
use support::supporter::run; use support::supporter::run;
use rust_embed::RustEmbed;
#[derive(RustEmbed)]
#[folder = "resources/"]
pub struct Asset;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
static SETTING: Lazy<setting::Setting> = Lazy::new(|| setting::Setting::new()); static SETTING: Lazy<setting::Setting> = Lazy::new(|| setting::Setting::new());

View File

@ -13,7 +13,7 @@ use crate::graphics::ppi::PPI;
use crate::graphics::threed::Trackball; use crate::graphics::threed::Trackball;
use crate::graphics::transforms::plane::PlaneTrans; use crate::graphics::transforms::plane::PlaneTrans;
use crate::graphics::transforms::viewport; use crate::graphics::transforms::viewport;
use crate::graphics::{AttaWithProgram, AttachWithMouse}; use crate::graphics::{AttaWithProgram, AttachWithIO};
use crate::ui::operation::Operation; use crate::ui::operation::Operation;
use crate::ui::typ::LayoutAttach; use crate::ui::typ::LayoutAttach;
use crate::utils::cache::CachedData; use crate::utils::cache::CachedData;

View File

@ -1,5 +1,5 @@
use crate::{ use crate::{
graphics::AttachWithMouse, graphics::AttachWithIO,
ui::{ ui::{
operation::{self, Operation}, operation::{self, Operation},
typ::CameraOP, typ::CameraOP,
@ -59,22 +59,19 @@ impl<'a> Attach<'a> {
} }
} }
fn bind_data(&mut self, vbo: &Vec<f32>, ebo: Option<&Vec<u32>>, len: i32) { fn bind_data(&mut self, vbo: &Vec<f32>, ebo: Option<&Vec<u32>>, len: i32, usage: u32) {
use bytemuck::cast_slice; use bytemuck::cast_slice;
self.vbo.bind(glow::ARRAY_BUFFER); self.vbo.bind(glow::ARRAY_BUFFER);
unsafe { unsafe {
self.gl self.gl
.buffer_data_u8_slice(glow::ARRAY_BUFFER, cast_slice(&vbo), glow::STATIC_DRAW); .buffer_data_u8_slice(glow::ARRAY_BUFFER, cast_slice(&vbo), usage);
if let Some(ebo) = ebo { if let Some(ebo) = ebo {
self.gl.bind_buffer( self.gl.bind_buffer(
glow::ELEMENT_ARRAY_BUFFER, glow::ELEMENT_ARRAY_BUFFER,
Some(self.ebo.as_ref().unwrap().native()), Some(self.ebo.as_ref().unwrap().native()),
); );
self.gl.buffer_data_u8_slice( self.gl
glow::ELEMENT_ARRAY_BUFFER, .buffer_data_u8_slice(glow::ELEMENT_ARRAY_BUFFER, cast_slice(&ebo), usage);
cast_slice(&ebo),
glow::STATIC_DRAW,
);
self.gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, None); self.gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, None);
} }
@ -91,7 +88,7 @@ impl<'a> Attach<'a> {
pub trait Module: Sized { pub trait Module: Sized {
type Cursor: ModuleCursor; type Cursor: ModuleCursor;
type Data; type Data;
type Operation: AttachWithMouse; type Operation: AttachWithIO;
fn render( fn render(
&mut self, &mut self,

View File

@ -55,7 +55,7 @@ impl<'b, 'a: 'b> PPIModule<'b, 'a> {
config: &PPIModuleConfig, config: &PPIModuleConfig,
) -> Result<()> { ) -> Result<()> {
let (vbo, ebo, len) = self.ppi_program.bake(data, &config.to_ppi_config())?; let (vbo, ebo, len) = self.ppi_program.bake(data, &config.to_ppi_config())?;
attach.bind_data(&vbo, ebo.as_ref(), len); attach.bind_data(&vbo, ebo.as_ref(), len, glow::DYNAMIC_DRAW);
Ok(()) Ok(())
} }
@ -65,19 +65,25 @@ impl<'b, 'a: 'b> PPIModule<'b, 'a> {
data: &Data, data: &Data,
config: &PPIModuleConfig, config: &PPIModuleConfig,
) -> Result<()> { ) -> Result<()> {
let config = config.to_line_config(); let raw_config = config.to_line_config();
// Will be changed in the future // Will be changed in the future
let outskirt = 10.0; let outskirt = 10.0;
let mut paths = vec![]; let mut paths = vec![];
for range in 1..=6 { let range_line_num = config.range_line_num;
let r = outskirt / 5.0 * range as f32; let r = outskirt / range_line_num as f32;
let seg_num = 200;
let angle = 2f32 * f32::consts::PI / seg_num as f32;
for range in 1..=range_line_num {
// Create the path // Create the path
let mut path = Path::new(true); let mut path = Path::new(true);
let r = r * range as f32;
// Draw the circle // Draw the circle
for seg in 0..200 { for seg in 0..seg_num {
let angle = 2f32 * f32::consts::PI / 200.0 * seg as f32; let angle = angle * seg as f32;
let x = (angle.cos() * r) as f32; let x = (angle.cos() * r) as f32;
let y = (angle.sin() * r) as f32; let y = (angle.sin() * r) as f32;
path.push([x, y, 0.01]); path.push([x, y, 0.01]);
@ -86,9 +92,10 @@ impl<'b, 'a: 'b> PPIModule<'b, 'a> {
paths.push(path); paths.push(path);
} }
let a = 2.0 * f32::consts::PI / 6.0; let ath_lin_num = config.ath_line_num;
for _a in 0..7 { let a = 2.0 * f32::consts::PI / ath_lin_num as f32;
for _a in 0..=ath_lin_num {
let mut path = Path::new(false); let mut path = Path::new(false);
let x = (a * _a as f32).cos() * outskirt; let x = (a * _a as f32).cos() * outskirt;
let y = (a * _a as f32).sin() * outskirt; let y = (a * _a as f32).sin() * outskirt;
@ -98,8 +105,16 @@ impl<'b, 'a: 'b> PPIModule<'b, 'a> {
paths.push(path); paths.push(path);
} }
let (vbo, ebo, len) = self.line_program.bake(&paths, &config)?; if config.vertical_axis {
attach.bind_data(&vbo, ebo.as_ref(), len); let mut path = Path::new(false);
path.push([0.0, 0.0, 0.0]);
path.push([0.0, 0.0, outskirt]);
path.finish();
paths.push(path);
}
let (vbo, ebo, len) = self.line_program.bake(&paths, &raw_config)?;
attach.bind_data(&vbo, ebo.as_ref(), len, glow::STATIC_DRAW);
Ok(()) Ok(())
} }
@ -113,7 +128,7 @@ impl<'b, 'a: 'b> PPIModule<'b, 'a> {
PositionText::new(new_text, [0.0, 0.0, 0.0], font::Anchor::BottomCenter); PositionText::new(new_text, [0.0, 0.0, 0.0], font::Anchor::BottomCenter);
let text_pg_config = config.to_font_config(); let text_pg_config = config.to_font_config();
let (vbo, ebo, len) = self.text_program.bake(&position_text, &text_pg_config)?; let (vbo, ebo, len) = self.text_program.bake(&position_text, &text_pg_config)?;
attach.bind_data(&vbo, ebo.as_ref(), len); attach.bind_data(&vbo, ebo.as_ref(), len, glow::STATIC_DRAW);
} }
} }
@ -151,6 +166,13 @@ impl<'b, 'a: 'b> Module for PPIModule<'b, 'a> {
self.bind_ppi_pg(ppi_attach, data, config); self.bind_ppi_pg(ppi_attach, data, config);
} }
if config.changed_range_line_num()
|| config.changed_ath_line_num()
|| config.changed_vertical_axis()
{
self.bind_line_pg(&mut cursor.line_attach, data, config)?;
}
// PPI Draw // PPI Draw
ppi_attach.bind_self(); ppi_attach.bind_self();
self.ppi_program.draw(&self.gl, ppi_attach.len())?; self.ppi_program.draw(&self.gl, ppi_attach.len())?;
@ -304,15 +326,27 @@ impl<'gl> ModuleCursor for PPIPackage<'gl> {
let mut line_width = self.ppi_config.line_width; let mut line_width = self.ppi_config.line_width;
let mut line_antialias = self.ppi_config.line_antialias; let mut line_antialias = self.ppi_config.line_antialias;
let mut range_line_num = self.ppi_config.range_line_num;
let mut ath_line_num = self.ppi_config.ath_line_num;
ui.text("PPI Line Config"); ui.text("PPI Line Config");
ui.slider("line width", 0.1, 10.0, &mut line_width); ui.slider("line width", 0.1, 10.0, &mut line_width);
ui.slider("line ana", 0.1, 10.0, &mut line_antialias); ui.slider("line ana", 0.1, 10.0, &mut line_antialias);
ui.slider("Range Line Num", 0, 10, &mut range_line_num);
ui.slider("Ath Line Num", 0, 10, &mut ath_line_num);
ui.separator();
let mut value = self.ppi_config.vertical_axis;
ui.checkbox("Axis?", &mut value);
self.ppi_config.set_layer(layer); self.ppi_config.set_layer(layer);
self.ppi_config.set_is_three_d(is_three_d); self.ppi_config.set_is_three_d(is_three_d);
self.ppi_config.set_line_width(line_width); self.ppi_config.set_line_width(line_width);
self.ppi_config.set_line_antialias(line_antialias); self.ppi_config.set_line_antialias(line_antialias);
self.ppi_config.set_range_line_num(range_line_num);
self.ppi_config.set_ath_line_num(ath_line_num);
self.ppi_config.set_vertical_axis(value);
self.ppi_config.changed_any() self.ppi_config.changed_any()
} }
@ -329,6 +363,9 @@ pub struct PPIModuleConfig {
pub line_color: [f32; 4], pub line_color: [f32; 4],
pub line_width: f32, pub line_width: f32,
pub line_antialias: f32, pub line_antialias: f32,
pub range_line_num: usize,
pub ath_line_num: usize,
pub vertical_axis: bool,
pub layer: usize, pub layer: usize,
pub colors: Vec<[u8; 4]>, pub colors: Vec<[u8; 4]>,
pub color_range: [f32; 2], pub color_range: [f32; 2],
@ -354,6 +391,9 @@ impl Default for PPIModuleConfig {
line_width: 1.5, line_width: 1.5,
line_antialias: 0.5, line_antialias: 0.5,
layer: 0, layer: 0,
vertical_axis: false,
range_line_num: 5,
ath_line_num: 6,
colors: vec![], colors: vec![],
color_range: [0.0, 0.0], color_range: [0.0, 0.0],
is_three_d: true, is_three_d: true,

View File

@ -10,7 +10,7 @@ pub struct MouseIO {
} }
pub struct KeyboardIO { pub struct KeyboardIO {
pub keys: [bool; 512], // 键盘按键状态 pub keys: [bool; 652], // 键盘按键状态
} }
pub struct IO { pub struct IO {
@ -23,7 +23,8 @@ impl IO {
let io = ui.io(); let io = ui.io();
let delta = if ui.is_mouse_dragging(imgui::MouseButton::Left) { let delta = if ui.is_mouse_dragging(imgui::MouseButton::Left) {
let delta = ui.mouse_drag_delta_with_threshold(imgui::MouseButton::Left, 5.0); // let delta = ui.mouse_drag_delta_with_threshold(imgui::MouseButton::Left, 5.0);
let delta = ui.mouse_drag_delta_with_button(imgui::MouseButton::Left);
ui.reset_mouse_drag_delta(imgui::MouseButton::Left); ui.reset_mouse_drag_delta(imgui::MouseButton::Left);
Some(delta) Some(delta)
} else { } else {
@ -31,20 +32,22 @@ impl IO {
}; };
let windows_position = ui.window_pos(); let windows_position = ui.window_pos();
let inner_pad = ui.window_content_region_min();
let position = [
io.mouse_pos[0] - windows_position[0] - inner_pad[0],
io.mouse_pos[1] - windows_position[1] - inner_pad[1],
];
IO { IO {
mouse: MouseIO { mouse: MouseIO {
position: [ position: position,
io.mouse_pos[0] - windows_position[0],
io.mouse_pos[1] - windows_position[1],
],
drag_delta: delta, drag_delta: delta,
is_dragging: ui.is_mouse_dragging(imgui::MouseButton::Left), is_dragging: ui.is_mouse_dragging(imgui::MouseButton::Left),
left_button_pressed: io.mouse_down[0], left_button_pressed: io.mouse_down[0],
right_button_pressed: io.mouse_down[1], right_button_pressed: io.mouse_down[1],
wheel_delta: io.mouse_wheel, wheel_delta: io.mouse_wheel,
}, },
keyboard: KeyboardIO { keys: [false; 512] }, keyboard: KeyboardIO { keys: io.keys_down },
} }
} }
} }

View File

@ -2,18 +2,18 @@ use super::typ::CameraOP;
use crate::{ use crate::{
camera::Camera, camera::Camera,
components::Program, components::Program,
graphics::{AttaWithProgram, AttachWithMouse}, graphics::{AttaWithProgram, AttachWithIO},
pg::layout_type::ViewPort, pg::layout_type::ViewPort,
}; };
pub struct Operation<T: AttachWithMouse> { pub struct Operation<T: AttachWithIO> {
camera: Camera, camera: Camera,
projection: Projection, projection: Projection,
operation: T, operation: T,
need_update: bool, need_update: bool,
} }
impl<T: AttachWithMouse + AttaWithProgram> Operation<T> { impl<T: AttachWithIO + AttaWithProgram> Operation<T> {
pub fn new(operation: T, aspect: f32, fov: f32, z_near: f32, z_far: f32) -> Self { pub fn new(operation: T, aspect: f32, fov: f32, z_near: f32, z_far: f32) -> Self {
let projection = Projection::new(aspect, fov, z_near, z_far); let projection = Projection::new(aspect, fov, z_near, z_far);
Self { Self {
@ -58,11 +58,6 @@ impl<T: AttachWithMouse + AttaWithProgram> Operation<T> {
self.operation.attach_with_program(gl, program); self.operation.attach_with_program(gl, program);
} }
// pub fn attach_with_mouse(&mut self, camera_op: &T::State) -> bool {
// self.operation
// .attach_with_mouse(camera_op, &mut self.camera, &mut self.projection)
// }
pub fn is_need_update(&self) -> bool { pub fn is_need_update(&self) -> bool {
self.need_update self.need_update
} }
@ -71,6 +66,10 @@ impl<T: AttachWithMouse + AttaWithProgram> Operation<T> {
self.operation.reset(); self.operation.reset();
self.need_update = true; self.need_update = true;
} }
pub fn clean(&mut self) {
self.need_update = false;
}
} }
pub struct Projection { pub struct Projection {

View File

@ -4,7 +4,7 @@ use super::{CameraOP, Layout, LayoutAttach, LayoutMod, Size};
use crate::camera::Camera; use crate::camera::Camera;
use crate::graphics::threed::Trackball; use crate::graphics::threed::Trackball;
use crate::graphics::transforms::plane::PlaneTrans; use crate::graphics::transforms::plane::PlaneTrans;
use crate::graphics::{AttaWithProgram, AttachWithMouse, MouseState}; use crate::graphics::{AttaWithProgram, AttachWithIO, MouseKeyboardState, MouseState};
use crate::pg::ModulePackage; use crate::pg::ModulePackage;
use crate::pg::{_ModulePackage, layout_type::ViewPort}; use crate::pg::{_ModulePackage, layout_type::ViewPort};
use crate::ui::helper::Helper; use crate::ui::helper::Helper;
@ -182,6 +182,15 @@ impl CameraOP for MouseState {
} }
} }
impl CameraOP for MouseKeyboardState {
fn from_context(context: &IO) -> Self {
Self {
mouse_state: MouseState::from_context(context),
keyboard_state: context.keyboard.keys,
}
}
}
impl<'gl> LayoutAttach<'gl> for MainLoadAttach<'gl> { impl<'gl> LayoutAttach<'gl> for MainLoadAttach<'gl> {
fn append(&mut self, package: ModulePackage<'gl>) { fn append(&mut self, package: ModulePackage<'gl>) {
self.packages.push(package); self.packages.push(package);
@ -194,7 +203,10 @@ impl<'gl> LayoutAttach<'gl> for MainLoadAttach<'gl> {
helper: &mut Helper, helper: &mut Helper,
) -> crate::errors::Result<()> { ) -> crate::errors::Result<()> {
// helper.draw_modules(gl, &self.packages); // helper.draw_modules(gl, &self.packages);
if self.packages.iter().any(|v| v.need_update) || self.operation.is_need_update() {
let need_launch =
self.packages.iter().any(|v| v.need_update) || self.operation.is_need_update();
if need_launch {
// Helper task // Helper task
self.main_viewport.bind(gl); self.main_viewport.bind(gl);
@ -205,6 +217,8 @@ impl<'gl> LayoutAttach<'gl> for MainLoadAttach<'gl> {
for package in self.packages.iter_mut() { for package in self.packages.iter_mut() {
programs.draw_modules(package, &self.operation, &self.main_viewport)?; programs.draw_modules(package, &self.operation, &self.main_viewport)?;
} }
self.operation.clean();
} }
if self.packages.is_empty() { if self.packages.is_empty() {