@@ -9,11 +9,13 @@ use crate::messages::prelude::FrontendMessage;
99use crate :: messages:: prelude:: Responses ;
1010use crate :: messages:: prelude:: { DocumentMessageHandler , InputPreprocessorMessageHandler , NodeGraphMessage } ;
1111use crate :: messages:: tool:: common_functionality:: graph_modification_utils:: { self , NodeGraphLayer } ;
12- use crate :: messages:: tool:: common_functionality:: shapes:: shape_utility:: { draw_snapping_ticks, extract_polygon_parameters, polygon_outline, polygon_vertex_position, star_outline} ;
13- use crate :: messages:: tool:: common_functionality:: shapes:: shape_utility:: { extract_star_parameters, star_vertex_position} ;
12+ use crate :: messages:: tool:: common_functionality:: shapes:: shape_utility:: {
13+ draw_snapping_ticks, extract_polygon_parameters, extract_star_parameters, polygon_edge_midpoint, polygon_outline, polygon_vertex_position, star_outline, star_vertex_position,
14+ } ;
1415use glam:: DVec2 ;
1516use graph_craft:: document:: NodeInput ;
1617use graph_craft:: document:: value:: TaggedValue ;
18+ use graphene_std:: vector:: calculate_effective_radius;
1719use std:: collections:: VecDeque ;
1820use std:: f64:: consts:: { FRAC_1_SQRT_2 , FRAC_PI_4 , PI , SQRT_2 } ;
1921
@@ -87,11 +89,16 @@ impl PointRadiusHandle {
8789 }
8890
8991 // Draw the point handle gizmo for the polygon shape
90- if let Some ( ( sides, radius) ) = extract_polygon_parameters ( Some ( layer) , document) {
92+ if let Some ( ( sides, radius, is_inner_radius ) ) = extract_polygon_parameters ( Some ( layer) , document) {
9193 let viewport = document. metadata ( ) . transform_to_viewport ( layer) ;
94+ let effective_radius = calculate_effective_radius ( radius, sides, is_inner_radius) ;
9295
9396 for i in 0 ..sides {
94- let point = polygon_vertex_position ( viewport, i as i32 , sides, radius) ;
97+ let point = if is_inner_radius {
98+ polygon_edge_midpoint ( viewport, i as i32 , sides, radius)
99+ } else {
100+ polygon_vertex_position ( viewport, i as i32 , sides, effective_radius)
101+ } ;
95102 let center = viewport. transform_point2 ( DVec2 :: ZERO ) ;
96103
97104 // If the user zooms out such that shape is very small hide the gizmo
@@ -130,8 +137,13 @@ impl PointRadiusHandle {
130137 }
131138
132139 // Polygon
133- if let Some ( ( sides, radius) ) = extract_polygon_parameters ( Some ( layer) , document) {
134- let point = polygon_vertex_position ( viewport, self . point as i32 , sides, radius) ;
140+ if let Some ( ( sides, radius, is_inner_radius) ) = extract_polygon_parameters ( Some ( layer) , document) {
141+ let effective_radius = calculate_effective_radius ( radius, sides, is_inner_radius) ;
142+ let point = if is_inner_radius {
143+ polygon_edge_midpoint ( viewport, self . point as i32 , sides, radius)
144+ } else {
145+ polygon_vertex_position ( viewport, self . point as i32 , sides, effective_radius)
146+ } ;
135147
136148 if matches ! ( & self . handle_state, PointRadiusHandleState :: Hover ) && ( mouse_position - point) . length ( ) > 5. {
137149 self . update_state ( PointRadiusHandleState :: Inactive ) ;
@@ -166,11 +178,16 @@ impl PointRadiusHandle {
166178 }
167179
168180 // Draw the point handle gizmo for the Polygon shape
169- if let Some ( ( sides, radius) ) = extract_polygon_parameters ( Some ( layer) , document) {
181+ if let Some ( ( sides, radius, is_inner_radius ) ) = extract_polygon_parameters ( Some ( layer) , document) {
170182 let viewport = document. metadata ( ) . transform_to_viewport ( layer) ;
183+ let effective_radius = calculate_effective_radius ( radius, sides, is_inner_radius) ;
171184
172185 for i in 0 ..sides {
173- let point = polygon_vertex_position ( viewport, i as i32 , sides, radius) ;
186+ let point = if is_inner_radius {
187+ polygon_edge_midpoint ( viewport, i as i32 , sides, radius)
188+ } else {
189+ polygon_vertex_position ( viewport, i as i32 , sides, effective_radius)
190+ } ;
174191 let center = viewport. transform_point2 ( DVec2 :: ZERO ) ;
175192
176193 // If the user zooms out such that shape is very small hide the gizmo
@@ -211,8 +228,13 @@ impl PointRadiusHandle {
211228 }
212229
213230 // Polygon
214- if let Some ( ( sides, radius) ) = extract_polygon_parameters ( Some ( layer) , document) {
215- let point = polygon_vertex_position ( viewport, self . point as i32 , sides, radius) ;
231+ if let Some ( ( sides, radius, is_inner_radius) ) = extract_polygon_parameters ( Some ( layer) , document) {
232+ let effective_radius = calculate_effective_radius ( radius, sides, is_inner_radius) ;
233+ let point = if is_inner_radius {
234+ polygon_edge_midpoint ( viewport, self . point as i32 , sides, radius)
235+ } else {
236+ polygon_vertex_position ( viewport, self . point as i32 , sides, effective_radius)
237+ } ;
216238
217239 let Some ( direction) = ( point - center) . try_normalize ( ) else { return } ;
218240
@@ -421,13 +443,14 @@ impl PointRadiusHandle {
421443 } ;
422444
423445 let viewport_transform = document. network_interface . document_metadata ( ) . transform_to_viewport ( layer) ;
424- let center = viewport_transform . transform_point2 ( DVec2 :: ZERO ) ;
446+
425447 let radius_index = self . radius_index ;
426448
427449 let original_radius = self . initial_radius ;
428450
429- let delta = viewport_transform. inverse ( ) . transform_point2 ( input. mouse . position ) - viewport_transform. inverse ( ) . transform_point2 ( drag_start) ;
430- let radius = drag_start - center;
451+ let drag_start = viewport_transform. inverse ( ) . transform_point2 ( drag_start) ;
452+ let delta = viewport_transform. inverse ( ) . transform_point2 ( input. mouse . position ) - drag_start;
453+ let radius = drag_start;
431454 let projection = delta. project_onto ( radius) ;
432455 let sign = radius. dot ( delta) . signum ( ) ;
433456
0 commit comments