Skip to content

Commit 3f230c0

Browse files
KeavonTrueDoctor
andcommitted
Refactor ViewportPosition from u32 (UVec2) to f64 (DVec2) (#345)
* Refactor ViewportPosition from u32 (UVec2) to f64 (DVec2) * Fix pseudo_hash call * Replace hash function with proper function for uuid generation * Cargo fmt Co-authored-by: Dennis Kobert <[email protected]>
1 parent 42c3b1f commit 3f230c0

File tree

20 files changed

+128
-75
lines changed

20 files changed

+128
-75
lines changed

Cargo.lock

Lines changed: 48 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

editor/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ thiserror = "1.0.24"
1515
serde = { version = "1.0", features = ["derive"] }
1616
graphite-proc-macros = { path = "../proc-macros" }
1717
glam = { version="0.17", features = ["serde"] }
18+
rand_chacha = "0.3.1"
19+
spin = "0.9.2"
1820

1921
[dependencies.graphene]
2022
path = "../graphene"

editor/src/communication/dispatcher.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,11 @@ mod test {
100100
}));
101101

102102
editor.select_primary_color(Color::RED);
103-
editor.draw_rect(100, 200, 300, 400);
103+
editor.draw_rect(100., 200., 300., 400.);
104104
editor.select_primary_color(Color::BLUE);
105-
editor.draw_shape(10, 1200, 1300, 400);
105+
editor.draw_shape(10., 1200., 1300., 400.);
106106
editor.select_primary_color(Color::GREEN);
107-
editor.draw_ellipse(104, 1200, 1300, 400);
107+
editor.draw_ellipse(104., 1200., 1300., 400.);
108108

109109
editor
110110
}
@@ -278,7 +278,7 @@ mod test {
278278
editor.handle_message(DocumentMessage::SelectLayers(vec![vec![rect_id], vec![ellipse_id]])).unwrap();
279279
editor.handle_message(DocumentsMessage::CopySelectedLayers).unwrap();
280280
editor.handle_message(DocumentMessage::DeleteSelectedLayers).unwrap();
281-
editor.draw_rect(0, 800, 12, 200);
281+
editor.draw_rect(0., 800., 12., 200.);
282282
editor.handle_message(DocumentsMessage::PasteLayers { path: vec![], insert_index: -1 }).unwrap();
283283
editor.handle_message(DocumentsMessage::PasteLayers { path: vec![], insert_index: -1 }).unwrap();
284284

@@ -303,7 +303,7 @@ mod test {
303303
/// - create rect, shape and ellipse
304304
/// - select ellipse and rect
305305
/// - move them down and back up again
306-
fn move_seletion() {
306+
fn move_selection() {
307307
init_logger();
308308
let mut editor = create_editor_with_three_layers();
309309

editor/src/communication/mod.rs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
use std::collections::hash_map::DefaultHasher;
2-
use std::hash::{Hash, Hasher};
3-
41
pub mod dispatcher;
52
pub mod message;
63
use crate::message_prelude::*;
74
pub use dispatcher::*;
5+
use rand_chacha::{
6+
rand_core::{RngCore, SeedableRng},
7+
ChaCha20Rng,
8+
};
9+
use spin::Mutex;
810

911
pub use crate::input::InputPreprocessor;
1012
use std::collections::VecDeque;
1113

1214
pub type ActionList = Vec<Vec<MessageDiscriminant>>;
1315

16+
static RNG: Mutex<Option<ChaCha20Rng>> = Mutex::new(None);
17+
1418
// TODO: Add Send + Sync requirement
1519
// Use something like rw locks for synchronization
1620
pub trait MessageHandlerData {}
@@ -25,12 +29,10 @@ where
2529
fn actions(&self) -> ActionList;
2630
}
2731

28-
pub fn generate_hash<'a>(messages: impl IntoIterator<Item = &'a Message>, ipp: &InputPreprocessor, document_hash: u64) -> u64 {
29-
let mut s = DefaultHasher::new();
30-
document_hash.hash(&mut s);
31-
ipp.hash(&mut s);
32-
for message in messages {
33-
message.pseudo_hash().hash(&mut s);
32+
pub fn generate_uuid() -> u64 {
33+
let mut lock = RNG.lock();
34+
if lock.is_none() {
35+
*lock = Some(ChaCha20Rng::seed_from_u64(0));
3436
}
35-
s.finish()
37+
lock.as_mut().map(ChaCha20Rng::next_u64).unwrap()
3638
}

editor/src/document/document_file.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ impl DocumentMessageHandler {
242242
}
243243

244244
/// Returns a list of `LayerPanelEntry`s intended for display purposes. These don't contain
245-
/// any actual data, but ratfolderch as visibility and names of the layers.
245+
/// any actual data, but rather attributes such as visibility and names of the layers.
246246
pub fn layer_panel(&mut self, path: &[LayerId]) -> Result<Vec<LayerPanelEntry>, EditorError> {
247247
let folder = self.document.folder(path)?;
248248
let paths: Vec<Vec<LayerId>> = folder.layer_ids.iter().map(|id| [path, &[*id]].concat()).collect();
@@ -284,7 +284,7 @@ impl MessageHandler<DocumentMessage, &InputPreprocessor> for DocumentMessageHand
284284
}
285285
CommitTransaction => self.document_backup = None,
286286
ExportDocument => {
287-
let bbox = self.document.visible_layers_bounding_box().unwrap_or([DVec2::ZERO, ipp.viewport_size.as_f64()]);
287+
let bbox = self.document.visible_layers_bounding_box().unwrap_or([DVec2::ZERO, ipp.viewport_size]);
288288
let size = bbox[1] - bbox[0];
289289
let name = match self.name.ends_with(FILE_SAVE_SUFFIX) {
290290
true => self.name.clone().replace(FILE_SAVE_SUFFIX, FILE_EXPORT_SUFFIX),

editor/src/document/movement_handler.rs

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub enum MovementMessage {
3232
ZoomCanvasToFitAll,
3333
}
3434

35-
#[derive(Debug, Clone, Hash, Default, PartialEq)]
35+
#[derive(Debug, Clone, Default, PartialEq)]
3636
pub struct MovementMessageHandler {
3737
translating: bool,
3838
rotating: bool,
@@ -43,7 +43,7 @@ pub struct MovementMessageHandler {
4343

4444
impl MovementMessageHandler {
4545
fn create_document_transform_from_layerdata(&self, layerdata: &LayerData, viewport_size: &ViewportPosition, responses: &mut VecDeque<Message>) {
46-
let half_viewport = viewport_size.as_f64() / 2.;
46+
let half_viewport = *viewport_size / 2.;
4747
let scaled_half_viewport = half_viewport / layerdata.scale;
4848
responses.push_back(
4949
DocumentOperation::SetLayerTransform {
@@ -64,7 +64,6 @@ impl MessageHandler<MovementMessage, (&mut LayerData, &Document, &InputPreproces
6464
self.translating = true;
6565
self.mouse_pos = ipp.mouse.position;
6666
}
67-
6867
RotateCanvasBegin { snap } => {
6968
self.rotating = true;
7069
self.snapping = snap;
@@ -86,17 +85,17 @@ impl MessageHandler<MovementMessage, (&mut LayerData, &Document, &InputPreproces
8685
}
8786
MouseMove => {
8887
if self.translating {
89-
let delta = ipp.mouse.position.as_f64() - self.mouse_pos.as_f64();
88+
let delta = ipp.mouse.position - self.mouse_pos;
9089
let transformed_delta = document.root.transform.inverse().transform_vector2(delta);
9190

9291
layerdata.translation += transformed_delta;
9392
self.create_document_transform_from_layerdata(layerdata, &ipp.viewport_size, responses);
9493
}
9594
if self.rotating {
96-
let half_viewport = ipp.viewport_size.as_f64() / 2.;
95+
let half_viewport = ipp.viewport_size / 2.;
9796
let rotation = {
98-
let start_vec = self.mouse_pos.as_f64() - half_viewport;
99-
let end_vec = ipp.mouse.position.as_f64() - half_viewport;
97+
let start_vec = self.mouse_pos - half_viewport;
98+
let end_vec = ipp.mouse.position - half_viewport;
10099
start_vec.angle_between(end_vec)
101100
};
102101

@@ -140,8 +139,8 @@ impl MessageHandler<MovementMessage, (&mut LayerData, &Document, &InputPreproces
140139
}
141140
WheelCanvasZoom => {
142141
let scroll = ipp.mouse.scroll_delta.scroll_delta();
143-
let mouse = ipp.mouse.position.as_f64();
144-
let viewport_size = ipp.viewport_size.as_f64();
142+
let mouse = ipp.mouse.position;
143+
let viewport_size = ipp.viewport_size;
145144
let mut zoom_factor = 1. + scroll.abs() * VIEWPORT_ZOOM_WHEEL_RATE;
146145
if ipp.mouse.scroll_delta.y > 0 {
147146
zoom_factor = 1. / zoom_factor
@@ -177,7 +176,7 @@ impl MessageHandler<MovementMessage, (&mut LayerData, &Document, &InputPreproces
177176
let pos1 = document.root.transform.inverse().transform_point2(pos1);
178177
let pos2 = document.root.transform.inverse().transform_point2(pos2);
179178
let v1 = document.root.transform.inverse().transform_point2(DVec2::ZERO);
180-
let v2 = document.root.transform.inverse().transform_point2(ipp.viewport_size.as_f64());
179+
let v2 = document.root.transform.inverse().transform_point2(ipp.viewport_size);
181180

182181
let center = v1.lerp(v2, 0.5) - pos1.lerp(pos2, 0.5);
183182
let size = (pos2 - pos1) / (v2 - v1);

editor/src/input/input_preprocessor.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ bitflags! {
3030
}
3131
}
3232

33-
#[derive(Debug, Default, Hash)]
33+
#[derive(Debug, Default)]
3434
pub struct InputPreprocessor {
3535
pub keyboard: KeyStates,
3636
pub mouse: MouseState,
@@ -81,7 +81,7 @@ impl MessageHandler<InputPreprocessorMessage, ()> for InputPreprocessor {
8181
responses.push_back(
8282
graphene::Operation::TransformLayer {
8383
path: vec![],
84-
transform: glam::DAffine2::from_translation((size.as_f64() - self.viewport_size.as_f64()) / 2.).to_cols_array(),
84+
transform: glam::DAffine2::from_translation((size - self.viewport_size) / 2.).to_cols_array(),
8585
}
8686
.into(),
8787
);
@@ -141,7 +141,7 @@ mod test {
141141
#[test]
142142
fn process_action_mouse_move_handle_modifier_keys() {
143143
let mut input_preprocessor = InputPreprocessor::default();
144-
let message = InputPreprocessorMessage::MouseMove((4, 809).into(), ModifierKeys::ALT);
144+
let message = InputPreprocessorMessage::MouseMove((4., 809.).into(), ModifierKeys::ALT);
145145
let mut responses = VecDeque::new();
146146

147147
input_preprocessor.process_action(message, (), &mut responses);

editor/src/input/mouse.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use bitflags::bitflags;
22
use glam::DVec2;
33

4-
// origin is top left
5-
pub type ViewportPosition = glam::UVec2;
4+
// Origin is top left
5+
pub type ViewportPosition = DVec2;
66

77
#[derive(Debug, Copy, Clone, Default, Eq, PartialEq, Hash)]
88
pub struct ScrollDelta {
@@ -23,25 +23,26 @@ impl ScrollDelta {
2323
}
2424
}
2525

26-
#[derive(Debug, Copy, Clone, Default, Eq, PartialEq, Hash)]
26+
#[derive(Debug, Copy, Clone, Default, PartialEq)]
2727
pub struct MouseState {
2828
pub position: ViewportPosition,
2929
pub mouse_keys: MouseKeys,
3030
pub scroll_delta: ScrollDelta,
3131
}
3232

3333
impl MouseState {
34-
pub fn new() -> MouseState {
34+
pub fn new() -> Self {
3535
Self::default()
3636
}
3737

38-
pub fn from_pos(x: u32, y: u32) -> MouseState {
39-
MouseState {
38+
pub fn from_pos(x: f64, y: f64) -> Self {
39+
Self {
4040
position: (x, y).into(),
4141
mouse_keys: MouseKeys::default(),
4242
scroll_delta: ScrollDelta::default(),
4343
}
4444
}
45+
4546
pub fn from_u8_pos(keys: u8, position: ViewportPosition) -> Self {
4647
let mouse_keys = MouseKeys::from_bits(keys).expect("invalid modifier keys");
4748
Self {

editor/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ impl Editor {
5050
}
5151

5252
pub mod message_prelude {
53-
pub use crate::communication::generate_hash;
53+
pub use crate::communication::generate_uuid;
5454
pub use crate::communication::message::{AsMessage, Message, MessageDiscriminant};
5555
pub use crate::communication::{ActionList, MessageHandler};
5656
pub use crate::document::{DocumentMessage, DocumentMessageDiscriminant};

0 commit comments

Comments
 (0)