Skip to content

Commit 704dad4

Browse files
authored
Fix angle logic in the Grid node to allow slanted isometric grids (#2602)
* Fix angles * Fix hardcoded index * More information on monitor nodes
1 parent dd1feee commit 704dad4

File tree

3 files changed

+29
-10
lines changed

3 files changed

+29
-10
lines changed

editor/src/messages/portfolio/document/node_graph/node_properties.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use graphene_core::raster::{
1717
SelectiveColorChoice,
1818
};
1919
use graphene_core::text::Font;
20+
use graphene_core::vector::generator_nodes::grid;
2021
use graphene_core::vector::misc::CentroidType;
2122
use graphene_core::vector::style::{GradientType, LineCap, LineJoin};
2223
use graphene_std::animation::RealTimeMode;
@@ -27,7 +28,7 @@ use graphene_std::vector::VectorDataTable;
2728
use graphene_std::vector::misc::ArcType;
2829
use graphene_std::vector::misc::{BooleanOperation, GridType};
2930
use graphene_std::vector::style::{Fill, FillChoice, FillType, GradientStops};
30-
use graphene_std::{GraphicGroupTable, RasterFrame};
31+
use graphene_std::{GraphicGroupTable, NodeInputDecleration, RasterFrame};
3132

3233
pub(crate) fn string_properties(text: &str) -> Vec<LayoutGroup> {
3334
let widget = TextLabel::new(text).widget_holder();
@@ -1621,11 +1622,11 @@ pub(crate) fn _gpu_map_properties(parameter_widgets_info: ParameterWidgetsInfo)
16211622
}
16221623

16231624
pub(crate) fn grid_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec<LayoutGroup> {
1624-
let grid_type_index = 1;
1625-
let spacing_index = 2;
1626-
let angles_index = 3;
1627-
let rows_index = 4;
1628-
let columns_index = 5;
1625+
let grid_type_index = grid::GridTypeInput::INDEX;
1626+
let spacing_index = grid::SpacingInput::<f64>::INDEX;
1627+
let angles_index = grid::AnglesInput::INDEX;
1628+
let rows_index = grid::RowsInput::INDEX;
1629+
let columns_index = grid::ColumnsInput::INDEX;
16291630

16301631
let document_node = match get_document_node(node_id, context) {
16311632
Ok(document_node) => document_node,

editor/src/node_graph_executor/runtime.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ impl NodeRuntime {
295295
} else if let Some(record) = introspected_data.downcast_ref::<IORecord<Context, VectorDataTable>>() {
296296
self.vector_modify.insert(parent_network_node_id, record.output.one_instance().instance.clone());
297297
} else {
298-
log::warn!("failed to downcast monitor node output");
298+
log::warn!("failed to downcast monitor node output {parent_network_node_id:?}");
299299
}
300300
}
301301
}

node-graph/gcore/src/vector/generator_nodes.rs

+21-3
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,14 @@ fn grid<T: GridSpacing>(
205205
for x in 0..columns {
206206
// Add current point to the grid with offset for odd columns
207207
let current_index = vector_data.point_domain.ids().len();
208-
vector_data
209-
.point_domain
210-
.push(point_id.next_id(), DVec2::new(spacing.x * x as f64, spacing.y * (y as f64 - (x % 2) as f64 * 0.5)));
208+
209+
let a_angles_eaten = ((x + 1) / 2) as f64;
210+
let b_angles_eaten = (x / 2) as f64;
211+
212+
let offset_y_fraction = b_angles_eaten * tan_b - a_angles_eaten * tan_a;
213+
214+
let position = DVec2::new(spacing.x * x as f64, spacing.y * y as f64 + offset_y_fraction * spacing.x);
215+
vector_data.point_domain.push(point_id.next_id(), position);
211216

212217
// Helper function to connect points with line segments
213218
let mut push_segment = |to_index: Option<usize>| {
@@ -259,3 +264,16 @@ fn isometric_grid_test() {
259264
);
260265
}
261266
}
267+
268+
#[test]
269+
fn skew_isometric_grid_test() {
270+
let grid = grid((), (), GridType::Isometric, 10., (40., 30.).into(), 5, 5);
271+
assert_eq!(grid.one_instance().instance.point_domain.ids().len(), 5 * 5);
272+
assert_eq!(grid.one_instance().instance.segment_bezier_iter().count(), 4 * 5 + 4 * 9);
273+
for (_, bezier, _, _) in grid.one_instance().instance.segment_bezier_iter() {
274+
assert_eq!(bezier.handles, bezier_rs::BezierHandles::Linear);
275+
let vector = bezier.start - bezier.end;
276+
let angle = (vector.angle_to(DVec2::X).to_degrees() + 180.) % 180.;
277+
assert!([90., 150., 40.].into_iter().any(|target| (target - angle).abs() < 1e-10), "unexpected angle of {}", angle)
278+
}
279+
}

0 commit comments

Comments
 (0)