@@ -186,10 +186,10 @@ fn draw_gizmo(
186
186
}
187
187
188
188
for selected in selected_entities. iter ( ) {
189
- let Some ( transform ) = world. get :: < GlobalTransform > ( selected) else {
189
+ let Some ( global_transform ) = world. get :: < GlobalTransform > ( selected) else {
190
190
continue ;
191
191
} ;
192
- let model_matrix = transform . compute_matrix ( ) ;
192
+ let model_matrix = global_transform . compute_matrix ( ) ;
193
193
194
194
let Some ( result) = egui_gizmo:: Gizmo :: new ( selected)
195
195
. model_matrix ( model_matrix. into ( ) )
@@ -202,11 +202,19 @@ fn draw_gizmo(
202
202
continue ;
203
203
} ;
204
204
205
+ let global_affine = global_transform. affine ( ) ;
206
+
205
207
let mut transform = world. get_mut :: < Transform > ( selected) . unwrap ( ) ;
206
- * transform = Transform {
207
- translation : Vec3 :: from ( <[ f32 ; 3 ] >:: from ( result. translation ) ) ,
208
- rotation : Quat :: from_array ( <[ f32 ; 4 ] >:: from ( result. rotation ) ) ,
209
- scale : Vec3 :: from ( <[ f32 ; 3 ] >:: from ( result. scale ) ) ,
208
+
209
+ let parent_affine = global_affine * transform. compute_affine ( ) . inverse ( ) ;
210
+ let inverse_parent_transform = GlobalTransform :: from ( parent_affine. inverse ( ) ) ;
211
+
212
+ let global_transform = Transform {
213
+ translation : result. translation . into ( ) ,
214
+ rotation : result. rotation . into ( ) ,
215
+ scale : result. scale . into ( ) ,
210
216
} ;
217
+
218
+ * transform = ( inverse_parent_transform * global_transform) . into ( ) ;
211
219
}
212
220
}
0 commit comments