Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
TrueDoctor committed Feb 3, 2024
1 parent 413e322 commit 4108f06
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,7 @@ impl<'a> Selected<'a> {
fn transform_layer(document_metadata: &DocumentMetadata, layer: LayerNodeIdentifier, original_transform: Option<&DAffine2>, transformation: DAffine2, responses: &mut VecDeque<Message>) {
let Some(&original_transform) = original_transform else { return };
let to = document_metadata.downstream_transform_to_viewport(layer);
log::debug!("to: {to:?} transformation: {transformation:?}, original_transform: {original_transform:?}");
let new = to.inverse() * transformation * to * original_transform;
responses.add(GraphOperationMessage::TransformSet {
layer,
Expand Down Expand Up @@ -410,11 +411,14 @@ impl<'a> Selected<'a> {
}

pub fn apply_transformation(&mut self, transformation: DAffine2) {
log::debug!("applying tranform: {transformation:?}");
if !self.selected.is_empty() {
// TODO: Cache the result of `shallowest_unique_layers` to avoid this heavy computation every frame of movement, see https://github.com/GraphiteEditor/Graphite/pull/481
for layer_ancestors in self.document_metadata.shallowest_unique_layers(self.selected.iter().copied()) {
let layer = *layer_ancestors.last().unwrap();

log::debug!("layer_arcestors: {layer_ancestors:?}");

match &self.original_transforms {
OriginalTransforms::Layer(layer_transforms) => Self::transform_layer(self.document_metadata, layer, layer_transforms.get(&layer), transformation, self.responses),
OriginalTransforms::Path(path_transforms) => Self::transform_path(&self.document_metadata, layer, path_transforms.get(&layer), transformation, self.responses),
Expand All @@ -424,6 +428,7 @@ impl<'a> Selected<'a> {
}

pub fn update_transforms(&mut self, delta: DAffine2) {
log::debug!("update_transforms: pivot: {:?}", self.pivot);
let pivot = DAffine2::from_translation(*self.pivot);
let transformation = pivot * delta * pivot.inverse();
self.apply_transformation(transformation);
Expand Down
7 changes: 4 additions & 3 deletions editor/src/messages/tool/common_functionality/pivot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ impl Pivot {
}

pub fn update_pivot(&mut self, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) {
log::debug!("adding_overlay for pivot at ");
//log::debug!("adding_overlay for pivot at ");
if let Some(pivot) = self.pivot {
let viewport_transform = document.metadata().document_to_viewport;
let pivot = viewport_transform.transform_point2(pivot);
self.viewport_pos = pivot;
log::debug!("adding_overlay for pivot at {:?}", pivot);
//log::debug!("adding_overlay for pivot at {:?}", pivot);
overlay_context.pivot(pivot);
}
}
Expand All @@ -52,6 +52,7 @@ impl Pivot {
pub fn set_viewport_position(&mut self, position: DVec2, document: &DocumentMessageHandler, responses: &mut VecDeque<Message>) {
let viewport_transform = document.metadata().document_to_viewport.inverse();
self.pivot = Some(viewport_transform.transform_point2(position));
log::debug!("setting pivot to {:?}", self.pivot);
for layer in document.selected_nodes.selected_visible_layers(document.network(), document.metadata()) {
let transform = Self::get_layer_pivot_transform(layer, document);
let pivot = transform.inverse().transform_point2(position);
Expand All @@ -64,6 +65,6 @@ impl Pivot {

/// Answers if the pointer is currently positioned over the pivot.
pub fn is_over(&self, mouse: DVec2) -> bool {
self.pivot.filter(|&pivot| mouse.distance_squared(self.viewport_pos) < (PIVOT_DIAMETER / 2.).powi(2)).is_some()
mouse.distance_squared(self.viewport_pos) < (PIVOT_DIAMETER / 2.).powi(2)
}
}
9 changes: 6 additions & 3 deletions editor/src/messages/tool/tool_messages/select_tool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,6 @@ impl Fsm for SelectToolFsmState {
let selected_layers_count = document.selected_nodes.selected_layers(document.metadata()).count();
tool_data.selected_layers_changed = selected_layers_count != tool_data.selected_layers_count;
tool_data.selected_layers_count = selected_layers_count;
log::debug!("selected_layers: {}", selected_layers_count);

// Outline selected layers
for layer in document.selected_nodes.selected_visible_layers(document.network(), document.metadata()) {
Expand All @@ -407,7 +406,6 @@ impl Fsm for SelectToolFsmState {
.selected_visible_layers(document.network(), document.metadata())
.next()
.map(|layer| document.metadata().transform_to_viewport(layer));
log::debug!("transform: {:?}", transform);
let transform = transform.unwrap_or(DAffine2::IDENTITY);
let bounds = document
.selected_nodes
Expand All @@ -418,7 +416,6 @@ impl Fsm for SelectToolFsmState {
.bounding_box_with_transform(layer, transform.inverse() * document.metadata().transform_to_viewport(layer))
})
.reduce(graphene_core::renderer::Quad::combine_bounds);
log::debug!("bounds: {:?}", bounds);
if let Some(bounds) = bounds {
let bounding_box_manager = tool_data.bounding_box_manager.get_or_insert(BoundingBoxManager::default());

Expand Down Expand Up @@ -508,6 +505,7 @@ impl Fsm for SelectToolFsmState {
&ToolType::Select,
);
bounds.center_of_transformation = selected.mean_average_of_pivots();
log::debug!("setting pivot");
tool_data.pivot.set_viewport_position(bounds.center_of_transformation, document, responses);
}
tool_data.get_snap_candidates(document, input);
Expand All @@ -530,9 +528,11 @@ impl Fsm for SelectToolFsmState {
);

bounds.center_of_transformation = selected.mean_average_of_pivots();
log::debug!("setting pivot");
tool_data.pivot.set_viewport_position(bounds.center_of_transformation, document, responses);
}

log::debug!("start rotating");
tool_data.layers_dragging = selected;

SelectToolFsmState::RotatingBounds
Expand All @@ -545,12 +545,14 @@ impl Fsm for SelectToolFsmState {
tool_data.select_single_layer = intersection.and_then(|intersection| intersection.ancestors(&document.metadata).find(|ancestor| selected.contains(ancestor)));
}

log::debug!("start dragging");
tool_data.layers_dragging = selected;

tool_data.get_snap_candidates(document, input);

SelectToolFsmState::Dragging
} else {
log::debug!("make selection");
tool_data.layers_dragging = selected;

if !input.keyboard.key(add_to_selection) {
Expand Down Expand Up @@ -677,6 +679,7 @@ impl Fsm for SelectToolFsmState {
(SelectToolFsmState::RotatingBounds, SelectToolMessage::PointerMove { snap_angle, .. }) => {
if let Some(bounds) = &mut tool_data.bounding_box_manager {
let angle = {
log::debug!("center: {:?}", bounds.center_of_transformation);
let start_offset = tool_data.drag_start - bounds.center_of_transformation;
let end_offset = input.mouse.position - bounds.center_of_transformation;

Expand Down
1 change: 0 additions & 1 deletion node-graph/graphene-cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ fn init_logging() {
let colors = ColoredLevelConfig::new().debug(Color::Magenta).info(Color::Green).error(Color::Red);
fern::Dispatch::new()
.chain(std::io::stdout())
.level_for("iced", log::LevelFilter::Trace)
.level_for("wgpu", log::LevelFilter::Debug)
.level(log::LevelFilter::Trace)
.format(move |out, message, record| {
Expand Down
58 changes: 31 additions & 27 deletions node-graph/gstd/src/wasm_application_io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,7 @@ fn render_svg(data: impl GraphicElementRendered, mut render: SvgRender, render_p
RenderOutput::Svg(render.svg.to_svg_string())
}

#[cfg(any(feature = "resvg", feature = "vello"))]
fn render_canvas(
async fn render_canvas(
data: impl GraphicElementRendered,
mut render: SvgRender,
render_params: RenderParams,
Expand All @@ -330,32 +329,37 @@ fn render_canvas(
let canvas = &surface_handle.surface;
canvas.set_width(resolution.x);
canvas.set_height(resolution.y);
let usvg_tree = data.to_usvg_tree(resolution, [min, max]);

if let Some(exec) = editor.application_io.gpu_executor() {
todo!()
} else {
let rtree = resvg::Tree::from_usvg(&usvg_tree);
let context = canvas.get_context("2d").unwrap().unwrap().dyn_into::<CanvasRenderingContext2d>().unwrap();
#[cfg(any(feature = "resvg", feature = "vello"))]
{
let usvg_tree = data.to_usvg_tree(resolution, [min, max]);

let pixmap_size = rtree.size.to_int_size();
let mut pixmap = resvg::tiny_skia::Pixmap::new(pixmap_size.width(), pixmap_size.height()).unwrap();
rtree.render(resvg::tiny_skia::Transform::default(), &mut pixmap.as_mut());
let array: Clamped<&[u8]> = Clamped(pixmap.data());
let context = canvas.get_context("2d").unwrap().unwrap().dyn_into::<CanvasRenderingContext2d>().unwrap();
let image_data = web_sys::ImageData::new_with_u8_clamped_array_and_sh(array, pixmap_size.width(), pixmap_size.height()).expect("Failed to construct ImageData");
context.put_image_data(&image_data, 0.0, 0.0).unwrap();
if let Some(exec) = editor.application_io.gpu_executor() {
todo!()
} else {
let rtree = resvg::Tree::from_usvg(&usvg_tree);

let pixmap_size = rtree.size.to_int_size();
let mut pixmap = resvg::tiny_skia::Pixmap::new(pixmap_size.width(), pixmap_size.height()).unwrap();
rtree.render(resvg::tiny_skia::Transform::default(), &mut pixmap.as_mut());
let array: Clamped<&[u8]> = Clamped(pixmap.data());
let image_data = web_sys::ImageData::new_with_u8_clamped_array_and_sh(array, pixmap_size.width(), pixmap_size.height()).expect("Failed to construct ImageData");
context.put_image_data(&image_data, 0.0, 0.0).unwrap();
}
}
#[cfg(not(any(feature = "resvg", feature = "vello")))]
{
use base64::Engine;
let preamble = "data:image/svg+xml;base64,";
let mut base64_string = String::with_capacity(preamble.len() + array.len() * 4);
base64_string.push_str(preamble);
base64::engine::general_purpose::STANDARD.encode_string(array, &mut base64_string);

let image_data = web_sys::HtmlImageElement::new().unwrap();
image_data.set_src(base64_string.as_str());
wasm_bindgen_futures::JsFuture::from(image_data.decode()).await.unwrap();
context.draw_image_with_html_image_element(&image_data, 0.0, 0.0).unwrap();
}
/*
let preamble = "data:image/svg+xml;base64,";
let mut base64_string = String::with_capacity(preamble.len() + array.len() * 4);
base64_string.push_str(preamble);
base64::engine::general_purpose::STANDARD.encode_string(array, &mut base64_string);
let image_data = web_sys::HtmlImageElement::new().unwrap();
image_data.set_src(base64_string.as_str());
wasm_bindgen_futures::JsFuture::from(image_data.decode()).await.unwrap();
context.draw_image_with_html_image_element(&image_data, 0.0, 0.0).unwrap();
*/
let frame = SurfaceHandleFrame {
surface_handle,
transform: glam::DAffine2::IDENTITY,
Expand Down Expand Up @@ -385,7 +389,7 @@ where
match output_format {
ExportFormat::Svg => render_svg(self.data.eval(footprint).await, SvgRender::new(), render_params, footprint),
#[cfg(any(feature = "resvg", feature = "vello"))]
ExportFormat::Canvas => render_canvas(self.data.eval(footprint).await, SvgRender::new(), render_params, footprint, editor, self.surface_handle.eval(()).await),
ExportFormat::Canvas => render_canvas(self.data.eval(footprint).await, SvgRender::new(), render_params, footprint, editor, self.surface_handle.eval(()).await).await,
_ => todo!("Non-SVG render output for {output_format:?}"),
}
})
Expand Down
27 changes: 14 additions & 13 deletions shell.nix
Original file line number Diff line number Diff line change
Expand Up @@ -36,23 +36,24 @@ let
in
# Make a shell with the dependencies we need
pkgs.mkShell {
packages = [
packages = with pkgs; [
rustc-wasm
pkgs.nodejs
pkgs.cargo
pkgs.cargo-watch
pkgs.wasm-pack
nodejs
cargo
cargo-watch
wasm-pack

pkgs.openssl
pkgs.glib
pkgs.gtk3
pkgs.libsoup
pkgs.webkitgtk

pkgs.pkg-config
openssl
glib
gtk3
libsoup
webkitgtk
binaryen

pkg-config

# Use Mold as a Linke
pkgs.mold
mold
];

# Hacky way to run cago through Mold
Expand Down

0 comments on commit 4108f06

Please sign in to comment.