@@ -1091,7 +1091,7 @@ async fn morph<F: 'n + Send + Copy>(
1091
1091
VectorDataTable :: new ( result)
1092
1092
}
1093
1093
1094
- fn bevel_algorithm ( mut vector_data : VectorData , distance : f64 ) -> VectorData {
1094
+ fn bevel_algorithm ( mut vector_data : VectorData , distance : f64 , roundness : f64 ) -> VectorData {
1095
1095
// Splits a bézier curve based on a distance measurement
1096
1096
fn split_distance ( bezier : bezier_rs:: Bezier , distance : f64 , length : f64 ) -> bezier_rs:: Bezier {
1097
1097
const EUCLIDEAN_ERROR : f64 = 0.001 ;
@@ -1365,16 +1365,31 @@ fn bevel_algorithm(mut vector_data: VectorData, distance: f64) -> VectorData {
1365
1365
new_segments
1366
1366
}
1367
1367
1368
- fn insert_new_segments ( vector_data : & mut VectorData , new_segments : & [ [ usize ; 2 ] ] ) {
1368
+ fn insert_new_segments ( vector_data : & mut VectorData , new_segments : & [ [ usize ; 2 ] ] , roundness : f64 ) {
1369
1369
let mut next_id = vector_data. segment_domain . next_id ( ) ;
1370
+
1370
1371
for & [ start, end] in new_segments {
1371
- vector_data. segment_domain . push ( next_id. next_id ( ) , start, end, bezier_rs:: BezierHandles :: Linear , StrokeId :: ZERO ) ;
1372
+ let start_pos = vector_data. point_domain . positions ( ) [ start] ;
1373
+ let end_pos = vector_data. point_domain . positions ( ) [ end] ;
1374
+
1375
+ let direction = start_pos - end_pos;
1376
+ let perpendicular = DVec2 :: new ( -direction. y , direction. x ) . normalize ( ) ;
1377
+
1378
+ let curve_amount = direction. length ( ) * roundness; // 50% of line length
1379
+ let midpoint = ( start_pos + end_pos) / 2.0 ;
1380
+ let control_point = midpoint + perpendicular * curve_amount;
1381
+
1382
+ let handles = bezier_rs:: BezierHandles :: Quadratic { handle : control_point } ;
1383
+
1384
+ vector_data. segment_domain . push ( next_id. next_id ( ) , start, end, handles, StrokeId :: ZERO ) ;
1372
1385
}
1373
1386
}
1374
1387
1375
- let mut segments_connected = segments_connected_count ( & vector_data) ;
1376
- let new_segments = update_existing_segments ( & mut vector_data, distance, & mut segments_connected) ;
1377
- insert_new_segments ( & mut vector_data, & new_segments) ;
1388
+ if distance > 1.0 {
1389
+ let mut segments_connected = segments_connected_count ( & vector_data) ;
1390
+ let new_segments = update_existing_segments ( & mut vector_data, distance, & mut segments_connected) ;
1391
+ insert_new_segments ( & mut vector_data, & new_segments, roundness) ;
1392
+ }
1378
1393
1379
1394
vector_data
1380
1395
}
@@ -1392,11 +1407,14 @@ async fn bevel<F: 'n + Send + Copy>(
1392
1407
) ]
1393
1408
source : impl Node < F , Output = VectorDataTable > ,
1394
1409
#[ default( 10. ) ] distance : Length ,
1410
+ #[ default( 0. ) ]
1411
+ #[ range( ( -1.0 , 1.0 ) ) ]
1412
+ roundness : f64 ,
1395
1413
) -> VectorDataTable {
1396
1414
let source = source. eval ( footprint) . await ;
1397
1415
let source = source. one_item ( ) ;
1398
1416
1399
- let result = bevel_algorithm ( source. clone ( ) , distance) ;
1417
+ let result = bevel_algorithm ( source. clone ( ) , distance, roundness ) ;
1400
1418
1401
1419
VectorDataTable :: new ( result)
1402
1420
}
@@ -1639,7 +1657,7 @@ mod test {
1639
1657
#[ tokio:: test]
1640
1658
async fn bevel_rect ( ) {
1641
1659
let source = Subpath :: new_rect ( DVec2 :: ZERO , DVec2 :: ONE * 100. ) ;
1642
- let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. ) . await ;
1660
+ let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. , 0. ) . await ;
1643
1661
let beveled = beveled. one_item ( ) ;
1644
1662
1645
1663
assert_eq ! ( beveled. point_domain. positions( ) . len( ) , 8 ) ;
@@ -1662,7 +1680,7 @@ mod test {
1662
1680
async fn bevel_open_curve ( ) {
1663
1681
let curve = Bezier :: from_cubic_dvec2 ( DVec2 :: ZERO , DVec2 :: new ( 10. , 0. ) , DVec2 :: new ( 10. , 100. ) , DVec2 :: X * 100. ) ;
1664
1682
let source = Subpath :: from_beziers ( & [ Bezier :: from_linear_dvec2 ( DVec2 :: X * -100. , DVec2 :: ZERO ) , curve] , false ) ;
1665
- let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. ) . await ;
1683
+ let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. , 0. ) . await ;
1666
1684
let beveled = beveled. one_item ( ) ;
1667
1685
1668
1686
assert_eq ! ( beveled. point_domain. positions( ) . len( ) , 4 ) ;
@@ -1684,7 +1702,7 @@ mod test {
1684
1702
let mut vector_data = VectorData :: from_subpath ( source) ;
1685
1703
let transform = DAffine2 :: from_scale_angle_translation ( DVec2 :: splat ( 10. ) , 1. , DVec2 :: new ( 99. , 77. ) ) ;
1686
1704
vector_data. transform = transform;
1687
- let beveled = super :: bevel ( Footprint :: default ( ) , & FutureWrapperNode ( VectorDataTable :: new ( vector_data) ) , 5. ) . await ;
1705
+ let beveled = super :: bevel ( Footprint :: default ( ) , & FutureWrapperNode ( VectorDataTable :: new ( vector_data) ) , 5. , 0. ) . await ;
1688
1706
let beveled = beveled. one_item ( ) ;
1689
1707
1690
1708
assert_eq ! ( beveled. point_domain. positions( ) . len( ) , 4 ) ;
@@ -1703,7 +1721,7 @@ mod test {
1703
1721
#[ tokio:: test]
1704
1722
async fn bevel_too_high ( ) {
1705
1723
let source = Subpath :: from_anchors ( [ DVec2 :: ZERO , DVec2 :: new ( 100. , 0. ) , DVec2 :: new ( 100. , 100. ) , DVec2 :: new ( 0. , 100. ) ] , false ) ;
1706
- let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 999. ) . await ;
1724
+ let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 999. , 0. ) . await ;
1707
1725
let beveled = beveled. one_item ( ) ;
1708
1726
1709
1727
assert_eq ! ( beveled. point_domain. positions( ) . len( ) , 6 ) ;
@@ -1724,7 +1742,7 @@ mod test {
1724
1742
let curve = Bezier :: from_cubic_dvec2 ( DVec2 :: ZERO , DVec2 :: new ( 10. , 0. ) , DVec2 :: new ( 10. , 100. ) , DVec2 :: X * 100. ) ;
1725
1743
let point = Bezier :: from_cubic_dvec2 ( DVec2 :: ZERO , DVec2 :: ZERO , DVec2 :: ZERO , DVec2 :: ZERO ) ;
1726
1744
let source = Subpath :: from_beziers ( & [ Bezier :: from_linear_dvec2 ( DVec2 :: X * -100. , DVec2 :: ZERO ) , point, curve] , false ) ;
1727
- let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. ) . await ;
1745
+ let beveled = super :: bevel ( Footprint :: default ( ) , & vector_node ( source) , 5. , 0. ) . await ;
1728
1746
let beveled = beveled. one_item ( ) ;
1729
1747
1730
1748
assert_eq ! ( beveled. point_domain. positions( ) . len( ) , 6 ) ;
0 commit comments