package Ġpw . bin om . scene Editor . editor s Ċ Ċ import Ġm og ot . Camera 2 D Ċ import Ġm og ot . Node Ċ import Ġm og ot . Spatial 2 D Ċ import Ġm og ot . math .* Ċ import Ġpw . bin om . scene Editor . Line 2 D Ċ import Ġpw . bin om . scene Editor . Scene Editor View Ċ import Ġjava . awt . event . KeyEvent Ċ import Ġjava . awt . event . MouseEvent Ċ import Ġkotlin . math . atan 2 Ċ Ċ object ĠEdit Rotate 2 D Factory Ġ: ĠEdit Action Factory Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġkey Down ( view : ĠScene Editor View , Ġe : ĠKeyEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e . keyCode Ġ== ĠKeys . R Ġ&& Ġview . mode Ġ== ĠScene Editor View . Mode . D 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnodes Ġ= Ġview . selected . map NotNull Ġ{ Ġit Ġas ? ĠSpatial 2 D Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nodes . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . start Editor ( Edit Rotate All Axes 2 D ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= Ġview , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Ġ= Ġview . editor Root , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Ġ= Ġview . editor Camera 2 D , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġ= Ġnodes )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠEdit Rotate Editor 2 D ( view : ĠScene Editor View , Ġval Ġroot : ĠNode , Ġselected : ĠList < Spatial 2 D >) Ġ: ĠSpatial 2 DE d itor ( view , Ġselected ) Ġ{ ĊĠĠĠ Ġval Ġscreen Pos Ġ= Ġview . editor Camera 2 D . world To Screen ( avg Position ) ĊĊĠĠĠ Ġprotected Ġvar Ġtotal Rotation Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġval Ġold Virtual Mouse Ġ= ĠVector 2 i ( virtual Mouse ) ĊĠĠĠ Ġprivate Ġvar Ġstart Angle Ġ= Ġangle 1 () ĊĠĠĠ Ġprivate Ġvar Ġstart Angle 2 Ġ= Ġangle 2 () ĊĊĠĠĠ Ġprivate Ġfun Ġangle 1 (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġatan 2 ( virtual Mouse . y . toFloat () Ġ- Ġscreen Pos . y , Ġvirtual Mouse . x . toFloat () Ġ- Ġscreen Pos . x ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġangle 2 (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġatan 2 ( virtual Mouse . x . toFloat () Ġ- Ġscreen Pos . x , Ġ- virtual Mouse . y . toFloat () Ġ- Ġscreen Pos . y ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprotected Ġval Ġcenter Ġ= ĠLine 2 D ( engine ). also Ġ{ ĊĠĠĠĠĠĠĠ Ġit . parent Ġ= Ġroot ĊĠĠĠĠĠĠĠ Ġit . material Ġ= Ġview . default 3 D Material . instance ( Vector 4 f ( 1 f )) ĊĠĠĠĠĠĠĠ Ġit . position . set ( avg Position ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġrender ( dt : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġold Virtual Mouse . set ( virtual Mouse ) ĊĠĠĠĠĠĠĠ Ġsuper . render ( dt ) ĊĠĠĠĠĠĠĠ Ġ// center . position . set ( avg Position ) ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġview . engine . math Pool . vec 2 f . poll () ĊĠĠĠĠĠĠĠ Ġview . editor Camera 2 D . screen To World ( virtual Mouse , Ġtmp ) ĊĠĠĠĠĠĠĠ Ġcenter . lineTo . set ( tmp . sub ( avg Position )) ĊĠĠĠĠĠĠĠ Ġview . engine . math Pool . vec 2 f . push ( tmp ) ĊĊĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġangle 1 () // atan 2 ( virtual Mouse . y . toFloat () Ġ- Ġscreen Pos . y , Ġvirtual Mouse . x . toFloat () Ġ- Ġscreen Pos . x ) ĊĠĠĠĠĠĠĠ Ġval Ġangle 2 Ġ= Ġangle 2 () // atan 2 ( virtual Mouse . x . toFloat () Ġ- Ġscreen Pos . x , Ġ- virtual Mouse . y . toFloat () Ġ- Ġscreen Pos . y ) ĊĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġif Ġ( angle . is Positive Ġ!= Ġstart Angle . is Positive Ġ&& Ġangle 2 . is Positive Ġ== Ġstart Angle 2 . is Positive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Angle 2 Ġ- Ġangle 2 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Angle Ġ- Ġangle ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstart Angle Ġ= Ġangle ĊĠĠĠĠĠĠĠ Ġstart Angle 2 Ġ= Ġangle 2 ĊĊĠĠĠĠĠĠĠ Ġtotal Rotation Ġ-= Ġif Ġ( slow ) Ġr Ġ* Ġ 0 . 1 f Ġelse Ġr ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġcenter . parent Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġview . render Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Strict fp Ċ class ĠEdit Rotate All Axes 2 D ( view : ĠScene Editor View , Ġroot : ĠNode , Ġcamera : ĠCamera 2 D , Ġselected : ĠList < Spatial 2 D >) Ġ: ĠEdit Rotate Editor 2 D ( view , Ġroot , Ġselected ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtemp Matrix Ġ= ĠMatrix 4 f () ĊĠĠĠ Ġprivate Ġval Ġglobal Rotation Ġ= ĠQuaternion f () ĊĠĠĠ Ġprivate Ġval Ġnew Rotation Ġ= ĠQuaternion f () ĊĠĠĠ Ġprivate Ġval Ġold Scale Ġ= ĠVector 3 f () ĊĠĠĠ Ġoverride Ġfun Ġrender ( dt : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . render ( dt ) ĊĠĠĠĠĠĠĠ Ġif Ġ( init Positions . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTODO () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( init Positions . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Positions . forEach Ġ{ Ġ( node , Ġmatrix ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= Ġtemp Matrix . identity (). rotate Z ( total Rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. mul ( matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Translation ( matrix . get Translation ( Vector 3 f ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . set Global Transform ( m ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglobal Rotation . identity () Ċ // ĠĠĠĠĠĠĠ Ġval Ġaxis Ġ= Ġcamera . qu aternion . mul ( Vector 3 fc . Z , ĠVector 3 f ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglobal Rotation . rotate Z YX ( total Rotation , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Positions . forEach Ġ{ Ġ( node , Ġmatrix ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġav r 3 Ġ= ĠVector 3 f ( avg Position . x , Ġavg Position . y , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Position Ġ= Ġglobal Rotation . mul ( matrix . get Translation ( Vector 3 f ()). sub ( avr 3 )). add ( avr 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . get Scale ( old Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Rotation . identity (). set From Un normalized ( matrix ). let Ġ{ Ġglobal Rotation . mul ( it , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Matrix Ġ= Ġtemp Matrix . identity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. translation Rotate Scale ( new Position , Ġnew Rotation , Ġold Scale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . set Global Transform ( new Matrix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupdate Property Position () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġkey Up ( code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeys . X Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Init Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . start Editor ( Edit Rotate One Axis 3 D ( view , Ġroot , Ġcamera , Ġselected , ĠAxis . X )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeys . Y Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Init Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . start Editor ( Edit Rotate One Axis 3 D ( view , Ġroot , Ġcamera , Ġselected , ĠAxis . Y )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeys . Z Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Init Position () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . start Editor ( Edit Rotate One Axis 3 D ( view , Ġroot , Ġcamera , Ġselected , ĠAxis . Z )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . key Up ( code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġmouse Up ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e . button Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . stop Editing () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( e . button Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Init Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . stop Editing () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }