package Ġcom . pump kin . platform Ċ Ċ // import Ġcom . pump kin . core . Application Ċ // import Ġcom . pump kin . core . Debug Ċ // import Ġcom . pump kin . core . event .* Ċ // import Ġcom . pump kin . core . renderer . Graphics Context Ċ // import Ġcom . pump kin . core . stack Ċ import Ġcom . pump kin . core . window . Event Callback Function Ċ import Ġcom . pump kin . core . window . Window Ċ // import Ġcom . pump kin . core . window . Window Props Ċ // import Ġglm . Vec 2 Ċ // import Ġglm . Vec 2 d Ċ // import Ġglm . Vec 2 i Ċ /* import Ġorg . lwjgl . glfw . GLFW .* Ċ import Ġorg . lwjgl . glfw . GLFW Image Ċ import Ġorg . lwjgl . opengl . GL Ċ import Ġorg . lwjgl . opengl . GL 1 1 C . gl Viewport Ċ import Ġorg . lwjgl . st b . ST B Image . st bi _ load Ċ import Ġorg . lwjgl . system . Memory Util Ċ import Ġjava . nio . file . Path */ Ċ Ċ expect Ġclass ĠPlatform Window () Ġ: ĠWindow Ġ{ ĊĠĠĠ Ġ// private Ġlateinit Ġvar Ġdata : ĠWindow Data ĊĊĠĠĠ Ġ/// * late init */ Ġvar Ġwindow : ĠLong Ġ= Ġ 0 L // G lfw Window ĊĠĠĠ Ġfun Ġget Window (): ĠLong ĊĠĠĠ Ġ// private Ġlateinit Ġvar Ġcontext : ĠGraphics Context ĊĊĠĠĠ Ġ// val Ġwidth Buffer Ġ= ĠMemory Util . mem Alloc Int ( 1 ) ĊĠĠĠ Ġ// val Ġheight Buffer Ġ= ĠMemory Util . mem Alloc Int ( 1 ) ĊĊĠĠĠ Ġ// override Ġval Ġwidth : ĠInt ĊĠĠĠ Ġ// ĠĠĠ Ġget () Ġ= Ġwidth Buffer . get ( 0 ) Ġ// window . size [ 0 ] ĊĊĠĠĠ Ġ// override Ġval Ġheight : ĠInt ĊĠĠĠ Ġ// ĠĠĠ Ġget () Ġ= Ġheight Buffer . get ( 0 ) Ġ// window . size [ 1 ] ĊĊĠĠĠ Ġ// override Ġvar Ġv Sync : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ// get () Ġ= Ġglfw . swap Interval Ġ== ĠV Sync . ON ĊĠĠĠ Ġ// ĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġglfw Swap Interval ( if Ġ( value ) Ġ 1 Ġelse Ġ 0 ) Ġ// glfw . swap Interval Ġ= Ġif Ġ( value ) ĠV Sync . ON Ġelse ĠV Sync . OFF ĊĠĠĠ Ġ// ĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* override Ġfun Ġinit ( window Props : ĠWindow Props ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġ= ĠWindow Data ( window Props . title , Ġwindow Props . width , Ġwindow Props . height , Ġtrue , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġglfw Init () Ġ// glfw . init () ĊĠĠĠĠĠĠĠ Ġglfw Set Error Callback (:: error Callback ) Ġ// glfw . error Callback Ġ= Ġthis :: error Callback ĊĊĠĠĠĠĠĠĠ Ġwindow Ġ= Ġglfw Create Window ( data . width , Ġdata . height , Ġdata . title , Ġ 0 L , Ġ 0 L ) Ġ// G lfw Window ( data . width , Ġdata . height , Ġdata . title ) ĊĠĠĠĠĠĠĠ Ġglfw Max imize Window ( window ) Ġ// window . max imize () ĊĠĠĠĠĠĠĠ Ġ/* context Ġ= ĠOpenGL Context ( window ) ĊĠĠĠĠĠĠĠ Ġcontext . init () */ ĊĠĠĠĠĠĠĠ Ġglfw Make Context Current ( window ) ĊĊĠĠĠĠĠĠĠ Ġstack Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Buffer Ġ= Ġstack . malloc Int ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Buffer Ġ= Ġstack . malloc Int ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannels Buffer Ġ= Ġstack . malloc Int ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Ġ= Ġst bi _ load ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPath . of ( ClassLoader . getSystem Resource (" textures / Pump kin Logo . png "). to URI ()). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Buffer , Ġy Buffer , Ġchannels Buffer , Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( icon Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Image Ġ= ĠGLFW Image . malloc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġicon Image Buffer Ġ= ĠGLFW Image . malloc ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Image . set ( x Buffer . get ( 0 ), Ġy Buffer . get ( 0 ), Ġicon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Image Buffer . put ( 0 , Ġicon Image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġglfw SetWindow Icon ( window , Ġicon Image Buffer ) Ġ// window . setIcon ( icon Image Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Image . free () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Image Buffer . free () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠDebug . log Error Core (" Could Ġnot Ġload Ġicon Ġimage ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* val Ġicon Ġ= Ġgli . load ("./ src / test / resources / textures / Pump kin Logo . png ") ĊĠĠĠĠĠĠĠ Ġval Ġicon Image Ġ= ĠGLFW Image . malloc () ĊĠĠĠĠĠĠĠ Ġval Ġicon Image Buffer Ġ= ĠGLFW Image . malloc ( 1 ) ĊĠĠĠĠĠĠĠ Ġicon Image . set ( icon . extent ()[ 0 ], Ġicon . extent ()[ 1 ], Ġicon . data ()) ĊĠĠĠĠĠĠĠ Ġicon Image Buffer . put ( 0 , Ġicon Image ) ĊĠĠĠĠĠĠĠ Ġglfw SetWindow Icon ( window , Ġicon Image Buffer ) Ġ// window . setIcon ( icon Image Buffer ) ĊĠĠĠĠĠĠĠ Ġicon Image . free () ĊĠĠĠĠĠĠĠ Ġicon Image Buffer . free () */ ĊĊĠĠĠĠĠĠĠ ĠDebug . log Info Core (" Created ĠWindow Ġ\" ${ data . title }\" Ġ(${ data . width } Ġx Ġ${ data . height }) ") ĊĊĠĠĠĠĠĠĠ Ġv Sync Ġ= Ġdata . v Sync ĊĊĠĠĠĠĠĠĠ ĠGL . create Capabilities () ĊĊĠĠĠĠĠĠĠ Ġglfw SetWindow Size Callback ( window ) Ġ{ Ġ_, Ġwidth , Ġheight Ġ-> Ġwindow Size Callback ( Vec 2 i ( width , Ġheight )) Ġ} Ġ// window . window Size CB Ġ= Ġthis :: window Size Callback ĊĠĠĠĠĠĠĠ Ġglfw SetWindow Close Callback ( window ) Ġ{ Ġwindow Close Callback () Ġ} Ġ// window . window Close CB Ġ= Ġthis :: window Close Callback ĊĊĠĠĠĠĠĠĠ Ġglfw Set Key Callback ( window ) Ġ/* window . key CB Ġ= */ Ġ{ Ġ_, Ġkey , Ġ_, Ġaction , Ġ_ Ġ-> Ġkey Callback ( key , Ġaction ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġglfw Set MouseButton Callback ( window ) Ġ/* window . mouse Button CB Ġ= */ Ġ{ Ġ_, Ġbutton , Ġaction , Ġ_ Ġ-> Ġmouse Button Callback ( button , Ġaction ) Ġ} ĊĠĠĠĠĠĠĠ Ġglfw Set Scroll Callback ( window ) Ġ{ Ġ_, Ġoffset X , Ġoffset Y Ġ-> Ġscroll Callback ( Vec 2 d ( offset X , Ġoffset Y )) Ġ} Ġ// window . scroll CB Ġ= Ġthis :: scroll Callback ĊĠĠĠĠĠĠĠ Ġglfw Set Cursor Pos Callback ( window ) Ġ{ _, Ġx , Ġy Ġ-> Ġcursor Pos Callback ( Vec 2 ( x . toFloat (), Ġy . toFloat ())) Ġ} Ġ// window . cursor Pos CB Ġ= Ġthis :: cursor Pos Callback ĊĊĠĠĠĠĠĠĠ ĠDebug . log Info Core (" Installed ĠCallback s Ġfor ĠWindow Ġ\" ${ data . title }\" ") ĊĊĠĠĠĠĠĠĠ Ġimg ui . DEBUG Ġ= Ġfalse ĊĠĠĠ Ġ}*/ ĊĊĠĠĠ Ġ// override Ġfun Ġrun () Ġ= ĠApplication . get (). run I (). also Ġ{ ĠApplication . get (). shutdown I () Ġ} ĊĊĠĠĠ Ġ/* override Ġfun ĠonUpdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġglfw Poll Events () Ġ// glfw . poll Events () ĊĠĠĠĠĠĠĠ Ġglfw Swap Buffers ( window ) Ġ// context . swap Buffers () ĊĠĠĠĠĠĠĠ Ġ// gl Viewport ( window . framebuffer Size ) ĊĠĠĠĠĠĠĠ Ġglfw Get Framebuffer Size ( window , Ġwidth Buffer , Ġheight Buffer ) ĊĠĠĠĠĠĠĠ Ġgl Viewport ( 0 , Ġ 0 , Ġwidth , Ġheight ) ĊĠĠĠ Ġ}*/ ĊĊĠĠĠ Ġ/* override Ġfun Ġshutdown () Ġ{ ĊĠĠĠĠĠĠĠ Ġglfw Terminate () ĊĠĠĠĠĠĠĠ ĠMemory Util . mem Free ( width Buffer ) ĊĠĠĠĠĠĠĠ ĠMemory Util . mem Free ( height Buffer ) ĊĠĠĠĠĠĠĠ Ġ// glfw . terminate () ĊĠĠĠ Ġ}*/ ĊĊĠĠĠ Ġ/* override Ġfun Ġset Event Callback ( callback : ĠEvent Callback Function ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . event Callback Ġ= Ġcallback ĊĠĠĠ Ġ}*/ ĊĊĠĠĠ Ġ/* private Ġfun Ġerror Callback ( error : Ġ/* glfw . Error */ ĠInt , Ġmessage : Ġ/* String */ ĠLong ) Ġ= ĠDebug . log Error Core (" GLFW Ġerror Ġ($ error ): Ġ${ Memory Util . mem UTF 8 ( message )}" Ġ/* " GLFW Ġerror Ġ(${ error . name }): Ġ$ message " */) ĊĊĠĠĠ Ġprivate Ġfun Ġwindow Size Callback ( size : ĠVec 2 i ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . width Ġ= Ġsize [ 0 ] ĊĠĠĠĠĠĠĠ Ġdata . height Ġ= Ġsize [ 1 ] ĊĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠWindow Resize Event ( data . width , Ġdata . height ) ĊĠĠĠĠĠĠĠ Ġdata . event Callback ?. let Ġ{ Ġit ( event ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwindow Close Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠWindow Close Event () ĊĠĠĠĠĠĠĠ Ġdata . event Callback ?. let Ġ{ Ġit ( event ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġkey Callback ( key : ĠInt , Ġaction : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLFW _ PRESS Ġ-> ĠKey Pressed Event ( key , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLFW _ RELEASE Ġ-> ĠKey Released Event ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLFW _ REPEAT Ġ-> ĠKey Pressed Event ( key , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata . event Callback ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmouse Button Callback ( button : ĠInt , Ġaction : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLFW _ PRESS Ġ-> ĠMouse Button Pressed Event ( button ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLFW _ RELEASE Ġ-> ĠMouse Button Released Event ( button ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata . event Callback ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscroll Callback ( offset : ĠVec 2 d ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠMouse Sc rolled Event ( offset [ 0 ]. toFloat (), Ġoffset [ 1 ]. toFloat ()) ĊĠĠĠĠĠĠĠ Ġdata . event Callback ?. let Ġ{ Ġit ( event ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcursor Pos Callback ( pos : ĠVec 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠMouse Move Event ( pos [ 0 ], Ġpos [ 1 ]) ĊĠĠĠĠĠĠĠ Ġdata . event Callback ?. let Ġ{ Ġit ( event ) Ġ} ĊĠĠĠ Ġ}*/ Ċ } ĊĊ Ċ data Ġclass ĠWindow Data ( ĊĠĠĠ Ġvar Ġtitle : ĠString , ĊĠĠĠ Ġvar Ġwidth : ĠInt , ĊĠĠĠ Ġvar Ġheight : ĠInt , ĊĠĠĠ Ġvar Ġv Sync : ĠBoolean , ĊĠĠĠ Ġvar Ġevent Callback : ĠEvent Callback Function ? Ċ )