/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠAnt on ĠTr ush kov Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġapp . the le ma Ċ import Ġc names . structs . GLFW window Ċ import Ġglfw .* Ċ import Ġkotlinx . c interop . CP o inter Ċ import Ġkotlinx . c interop . static C Function Ċ import Ġapp . the le ma . input . IM ouse Ċ import Ġapp . the le ma . input . IM ouse Listener Ċ import Ġapp . the le ma . input . MOUSE Ċ import Ġapp . the le ma . input . BUTTON Ċ import Ġkotlin . math . abs Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . sign Ċ import Ġkotlin . system . getTime Nan os Ċ Ċ class ĠGLFW Mouse ( private Ġval Ġwindow : ĠGLFW Window ): ĠI Mouse Ġ{ ĊĠĠĠ Ġoverride Ġval Ġx : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmouse X ĊĊĠĠĠ Ġoverride Ġval Ġy : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠmouseY ĊĊĠĠĠ Ġoverride Ġvar Ġis Cursor Enabled : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġglfw Get Input Mode ( window . handle , ĠGLFW _ CURSOR ) Ġ== ĠGLFW _ CURSOR _ NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoldValue Ġ= Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglfw SetInput Mode ( window . handle , ĠGLFW _ CURSOR , Ġif Ġ( value ) ĠGLFW _ CURSOR _ NORMAL Ġelse ĠGLFW _ CURSOR _ DISABLED ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( oldValue Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlisteners . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners [ i ]. cursor Enabled Changed ( oldValue , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġlisteners Ġ= ĠArrayList < IM ouse Listener >() ĊĠĠĠ Ġprivate Ġvar Ġmouse X Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar ĠmouseY Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmouse Pressed Ġ= Ġ 0 ĊĠĠĠ Ġoverride Ġvar Ġdelta X Ġ= Ġ 0 ĊĠĠĠ Ġoverride Ġvar Ġdelta Y Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġscroll Y Remain der Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġlast Scroll Event Time : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġscroll Callback Ġ= Ġstatic C Function Ġ{ ĊĠĠĠĠĠĠĠ Ġ_: ĠC Pointer < GLFW window > ?, Ġ_: ĠDouble , Ġscroll Y : ĠDouble Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġmouse Ġ= ĠMO USE Ġas ĠGLFW Mouse ĊĠĠĠĠĠĠĠ Ġif Ġ( mouse . scroll Y Remain der Ġ> Ġ 0 Ġ&& Ġscroll Y Ġ< Ġ 0 Ġ|| Ġmouse . scroll Y Remain der Ġ< Ġ 0 Ġ&& Ġscroll Y Ġ> Ġ 0 Ġ|| ĠgetTime Nan os () Ġ- Ġmouse . last Scroll Event Time Ġ> Ġ 2 5 0 0 0 0 0 0 0 L ) Ġ{ Ġ// Ġfire Ġa Ġscroll Ġevent Ġimmediately : Ċ // Ġ Ġ- Ġif Ġthe Ġscroll Ġdirection Ġchanges ; Ċ // Ġ Ġ- Ġif Ġthe Ġuser Ġdid Ġnot Ġmove Ġthe Ġwheel Ġfor Ġmore Ġthan Ġ 2 5 0 ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . scroll Y Remain der Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscroll Amount Ġ= Ġ(- sign ( scroll Y )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . listeners . forEach Ġ{ Ġit . sc rolled ( scroll Amount ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . last Scroll Event Time Ġ= ĠgetTime Nan os () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . scroll Y Remain der Ġ+= Ġscroll Y . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( abs ( mouse . scroll Y Remain der ) Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscroll Amount Ġ= Ġ(- sign ( scroll Y )). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . listeners . forEach Ġ{ Ġit . sc rolled ( scroll Amount ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . last Scroll Event Time Ġ= ĠgetTime Nan os () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . scroll Y Remain der Ġ+= Ġscroll Amount . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġlogical Mouse Y Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlogical Mouse X Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġcursor Pos Callback Ġ= Ġstatic C Function Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow Handle : ĠC Pointer < GLFW window > ?, Ġx : ĠDouble , Ġy : ĠDouble Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġmouse Ġ= ĠMO USE Ġas ĠGLFW Mouse ĊĠĠĠĠĠĠĠ Ġmouse . delta X Ġ= Ġx . toInt () Ġ- Ġmouse . logical Mouse X ĊĠĠĠĠĠĠĠ Ġmouse . delta Y Ġ= Ġy . toInt () Ġ- Ġmouse . logical Mouse Y ĊĠĠĠĠĠĠĠ Ġmouse . logical Mouse X Ġ= Ġx . toInt () ĊĠĠĠĠĠĠĠ Ġmouse . mouse X Ġ= Ġmouse . logical Mouse X ĊĠĠĠĠĠĠĠ Ġmouse . logical Mouse Y Ġ= Ġy . toInt () ĊĠĠĠĠĠĠĠ Ġmouse . mouse Y Ġ= Ġmouse . logical Mouse Y ĊĊĠĠĠĠĠĠĠ Ġval Ġwindow Ġ= ĠGLFW Window . window ( window Handle ) ĊĠĠĠĠĠĠĠ Ġif Ġ( window Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! window . use Logical Coordinates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Scale Ġ= Ġwindow . graphics . back Buffer Width Ġ/ Ġwindow . graphics . logical Width . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Scale Ġ= Ġwindow . graphics . back Buffer Height Ġ/ Ġwindow . graphics . logical Height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . delta X Ġ= Ġ( mouse . delta X Ġ* Ġx Scale ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . delta Y Ġ= Ġ( mouse . delta Y Ġ* Ġy Scale ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . mouse X Ġ= Ġ( mouse . mouse X Ġ* Ġx Scale ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . mouse Y Ġ= Ġ( mouse . mouse Y Ġ* Ġy Scale ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( mouse . mouse Pressed Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . listeners . forEach Ġ{ Ġit . drag ged ( mouse . mouse X , Ġmouse . mouse Y , Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . listeners . forEach Ġ{ Ġit . moved ( mouse . mouse X , Ġmouse . mouse Y ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġmouse Button Callback Ġ= Ġstatic C Function Ġ{ ĊĠĠĠĠĠĠĠ Ġ_: ĠC Pointer < GLFW window > ?, Ġbutton : ĠInt , Ġaction : ĠInt , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġmouse Ġ= ĠMO USE Ġas ĠGLFW Mouse ĊĠĠĠĠĠĠĠ Ġval Ġconv Button Ġ= Ġwhen Ġ( button ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> ĠBUTTON . LEFT ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> ĠBUTTON . RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> ĠBUTTON . MIDDLE ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> ĠBUTTON . BACK ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> ĠBUTTON . FORWARD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( button Ġ!= Ġ- 1 Ġ&& Ġconv Button Ġ== Ġ- 1 ) Ġreturn @ static C Function ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠGLFW _ PRESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . mouse Pressed ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . listeners . forEach Ġ{ Ġit . button Down ( conv Button , Ġmouse . mouse X , Ġmouse . mouse Y , Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . mouse Pressed Ġ= Ġmax ( 0 , Ġmouse . mouse Pressed Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse . listeners . forEach Ġ{ Ġit . button Up ( conv Button , Ġmouse . mouse X , Ġmouse . mouse Y , Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġglfw SetInput Mode ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . handle , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLFW _ CURSOR , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Cursor Enabled ) ĠGLFW _ CURSOR _ NORMAL Ġelse ĠGLFW _ CURSOR _ DISABLED ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget X ( pointer : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( pointer Ġ== Ġ 0 ) Ġmouse X Ġelse Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Delta X ( pointer : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( pointer Ġ== Ġ 0 ) Ġdelta X Ġelse Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Y ( pointer : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( pointer Ġ== Ġ 0 ) ĠmouseY Ġelse Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Delta Y ( pointer : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( pointer Ġ== Ġ 0 ) Ġdelta Y Ġelse Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Button Pressed ( button : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġglfw Get MouseButton ( window . handle , Ġbutton ) Ġ== ĠGLFW _ PRESS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Cursor Position ( x : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! window . use Logical Coordinates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglfw Set Cursor Pos ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Ġ= Ġwindow . handle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx pos Ġ= Ġx Ġ* Ġwindow . graphics . logical Width Ġ/ Ġwindow . graphics . back Buffer Width . toDouble (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy pos Ġ= Ġy Ġ* Ġwindow . graphics . logical Height Ġ/ Ġwindow . graphics . back Buffer Height . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglfw Set Cursor Pos ( window . handle , Ġx . toDouble (), Ġy . toDouble ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdispose () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Listener ( listener : ĠI Mouse Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Listener ( listener : ĠI Mouse Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . remove ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġglfw Set Scroll Callback ( window . handle , Ġscroll Callback ) ĊĠĠĠĠĠĠĠ Ġglfw Set Cursor Pos Callback ( window . handle , Ġcursor Pos Callback ) ĊĠĠĠĠĠĠĠ Ġglfw Set MouseButton Callback ( window . handle , Ġmouse Button Callback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . clear () ĊĠĠĠ Ġ} Ċ }