@@ -292,8 +292,7 @@ export function centerElements(axis, update) {
292292}
293293
294294//Move
295- export function moveElementsInSpace ( difference , axis ) {
296- let space = getEditTransformSpace ( ) ;
295+ export function moveElementsInSpace ( difference , axis , space = getEditTransformSpace ( ) ) {
297296 let groups ;
298297 if ( Format . bone_rig && Group . first_selected && ( Group . multi_selected . length > 1 || Group . first_selected . matchesSelection ( ) ) ) {
299298 groups = Group . multi_selected ;
@@ -833,7 +832,36 @@ BARS.defineActions(function() {
833832 category : 'edit'
834833 } )
835834
835+ function getParentTransformSpace ( ) {
836+ if ( Format . bone_rig && Group . first_selected && Group . first_selected . matchesSelection ( ) ) {
837+ if ( Group . first_selected . parent instanceof Group ) {
838+ return Group . first_selected . parent ;
839+ } else {
840+ return 0 ;
841+ }
842+ }
843+ let bone = 0 ;
844+ if ( Outliner . selected . length ) {
845+ bone = Outliner . selected [ 0 ] . parent ;
846+ } else if ( Group . first_selected && Group . first_selected . parent instanceof Group ) {
847+ bone = Group . first_selected . parent ;
848+ }
849+ for ( var el of Outliner . selected ) {
850+ if ( el . parent !== bone ) {
851+ bone = 0 ;
852+ break ;
853+ }
854+ }
855+ return bone instanceof OutlinerNode ? bone : 0 ;
856+ }
836857 function moveOnAxis ( modify , axis ) {
858+ if ( toggle_pos_per_element . value == false ) {
859+ let old_value = getPos ( axis ) ;
860+ let new_value = modify ( old_value ) ;
861+ moveElementsInSpace ( new_value - old_value , axis , getParentTransformSpace ( ) ) ;
862+ updateSelection ( ) ;
863+ return ;
864+ }
837865 Outliner . selected . forEach ( function ( obj , i ) {
838866 let space_offset = 0 ;
839867 if ( settings . local_position_values . value &&
@@ -887,6 +915,9 @@ BARS.defineActions(function() {
887915 TickUpdates . selection = true ;
888916 }
889917 function getPos ( axis ) {
918+ if ( toggle_pos_per_element . value == false && Group . first_selected ) {
919+ return Group . first_selected . origin [ axis ] ;
920+ }
890921 let element = Outliner . selected [ 0 ] ;
891922 let value = 0 ;
892923 if ( ( element instanceof Mesh || element instanceof SplineMesh ) && element . getSelectedVertices ( ) . length ) {
@@ -910,72 +941,74 @@ BARS.defineActions(function() {
910941 }
911942 return value ;
912943 }
913- new NumSlider ( 'slider_pos_x' , {
914- name : tl ( 'action.slider_pos' , [ 'X' ] ) ,
915- description : tl ( 'action.slider_pos.desc' , [ 'X' ] ) ,
916- color : 'x' ,
944+ const slider_pos_common_options = {
917945 category : 'transform' ,
918- condition : ( ) => ( selected . length && Modes . edit ) ,
946+ condition : ( ) => ( Outliner . selected . length && Modes . edit ) ,
919947 getInterval : getSpatialInterval ,
920- get : function ( ) {
921- return getPos ( 0 ) ;
922- } ,
923- change : function ( modify ) {
924- moveOnAxis ( modify , 0 )
925- } ,
926948 onBefore : function ( ) {
927- Undo . initEdit ( { elements : selected } )
949+ Undo . initEdit ( {
950+ elements : Outliner . selected ,
951+ groups : toggle_pos_per_element . value ? [ ] : Group . all . filter ( g => g . selected )
952+ } )
928953 } ,
929954 onAfter : function ( ) {
930955 Undo . finishEdit ( 'Change element position' )
931956 autoFixMeshEdit ( )
932957 }
958+ }
959+ new NumSlider ( 'slider_pos_x' , {
960+ name : tl ( 'action.slider_pos' , [ 'X' ] ) ,
961+ description : tl ( 'action.slider_pos.desc' , [ 'X' ] ) ,
962+ color : 'x' ,
963+ get ( ) {
964+ return getPos ( 0 ) ;
965+ } ,
966+ change ( modify ) {
967+ moveOnAxis ( modify , 0 )
968+ } ,
969+ ...slider_pos_common_options
933970 } )
934971 new NumSlider ( 'slider_pos_y' , {
935972 name : tl ( 'action.slider_pos' , [ 'Y' ] ) ,
936973 description : tl ( 'action.slider_pos.desc' , [ 'Y' ] ) ,
937974 color : 'y' ,
938- category : 'transform' ,
939- condition : ( ) => ( selected . length && Modes . edit ) ,
940- getInterval : getSpatialInterval ,
941- get : function ( ) {
975+ get ( ) {
942976 return getPos ( 1 ) ;
943977 } ,
944- change : function ( modify ) {
978+ change ( modify ) {
945979 moveOnAxis ( modify , 1 )
946980 } ,
947- onBefore : function ( ) {
948- Undo . initEdit ( { elements : selected } )
949- } ,
950- onAfter : function ( ) {
951- Undo . finishEdit ( 'Change element position' )
952- autoFixMeshEdit ( )
953- }
981+ ...slider_pos_common_options
954982 } )
955983 new NumSlider ( 'slider_pos_z' , {
956984 name : tl ( 'action.slider_pos' , [ 'Z' ] ) ,
957985 description : tl ( 'action.slider_pos.desc' , [ 'Z' ] ) ,
958986 color : 'z' ,
959- category : 'transform' ,
960- condition : ( ) => ( selected . length && Modes . edit ) ,
961- getInterval : getSpatialInterval ,
962- get : function ( ) {
987+ get ( ) {
963988 return getPos ( 2 ) ;
964989 } ,
965- change : function ( modify ) {
990+ change ( modify ) {
966991 moveOnAxis ( modify , 2 )
967992 } ,
968- onBefore : function ( ) {
969- Undo . initEdit ( { elements : selected } )
970- } ,
971- onAfter : function ( ) {
972- Undo . finishEdit ( 'Change element position' )
973- autoFixMeshEdit ( )
974- }
993+ ...slider_pos_common_options
975994 } )
976995 let slider_vector_pos = [ BarItems . slider_pos_x , BarItems . slider_pos_y , BarItems . slider_pos_z ] ;
977996 slider_vector_pos . forEach ( slider => slider . slider_vector = slider_vector_pos ) ;
978997
998+ let toggle_pos_per_element = new Toggle ( 'position_slider_per_element' , {
999+ icon : 'shuffle' ,
1000+ default : false ,
1001+ category : 'transform' ,
1002+ condition : slider_pos_common_options . condition ,
1003+ onChange ( ) {
1004+ if ( Condition ( BarItems . slider_pos_x . condition ) ) {
1005+ BarItems . slider_pos_x . update ( ) ;
1006+ BarItems . slider_pos_y . update ( ) ;
1007+ BarItems . slider_pos_z . update ( ) ;
1008+ }
1009+ }
1010+ } )
1011+
9791012
9801013 function resizeOnAxis ( modify , axis ) {
9811014 Outliner . selected . forEach ( function ( obj , i ) {
0 commit comments