package Ġimg ui . impl Ċ Ċ import Ġglm _. * Ċ import Ġglm _. mat 4 x 4 . Mat 4 Ċ import Ġglm _. vec 2 . Vec 2 Ċ import Ġglm _. vec 2 . Vec 2 d Ċ import Ġg ln . buffer . gl BufferData Ċ import Ġg ln . buffer . gl Buffer Sub Data Ċ import Ġg ln . check Error Ċ import Ġg ln . glGet Vec 4 i Ċ import Ġg ln . gl Sc issor Ċ import Ġg ln . gl Viewport Ċ import Ġg ln . g lf . semantic Ċ import Ġg ln . program . Program Ċ import Ġg ln . program . gl Delete Program Ċ import Ġg ln . program . gl Use Program Ċ import Ġg ln . program . using Program Ċ import Ġg ln . texture . init Texture 2 d Ċ import Ġg ln . uniform . gl Uniform Ċ import Ġg ln . vertex Array . glBind VertexArray Ċ import Ġg ln . vertex Array . glVertex Attrib Pointer Ċ import Ġg ln . vertex Array . with VertexArray Ċ import Ġimg ui .* Ċ import Ġimg ui . ImGui . io Ċ import Ġimg ui . ImGui . mouse Cursor Ċ import Ġorg . lwjgl . glfw . GLFW .* Ċ import Ġorg . lwjgl . opengl . GL 1 1 .* Ċ import Ġorg . lwjgl . opengl . GL 1 3 .* Ċ import Ġorg . lwjgl . opengl . GL 1 4 .* Ċ import Ġorg . lwjgl . opengl . GL 1 5 .* Ċ import Ġorg . lwjgl . opengl . GL 2 0 .* Ċ import Ġorg . lwjgl . opengl . GL 3 0 .* Ċ import Ġorg . lwjgl . opengl . GL 3 3 . GL _ SAMPLER _ BINDING Ċ import Ġorg . lwjgl . opengl . GL 3 3 . glBind Sampler Ċ import Ġuno . buffer . buffer Big Ċ import Ġuno . buffer . destroy Ċ import Ġuno . buffer . int Buffer Big Ċ import Ġuno . buffer . int Buffer Of Ċ import Ġuno . glfw . G lfw Window Ċ import Ġuno . glfw . glfw ĊĊ Ċ object ĠL wjgl GL 3 Ġ{ ĊĊĠĠĠ Ġlateinit Ġvar Ġwindow : ĠG lfw Window ĊĠĠĠ Ġvar Ġtime Ġ= Ġ 0 f ĊĠĠĠ Ġval Ġmouse Just Pressed Ġ= ĠBoolean Array ( 3 ) ĊĠĠĠ Ġval Ġmouse Cur s ors Ġ= ĠLong Array ( Mouse Cursor . COUNT ) ĊĊĠĠĠ Ġobject ĠBuffer Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠVertex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval ĠElement Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval ĠMAX Ġ= Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġbuffer Name Ġ= Ġint Buffer Big ( Buffer . MAX ) ĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ ĠJVM . ĠWe Ġare Ġnot Ġyet Ġdoing Ġthis Ġbecause Ġno Ġuser Ġcase . ĠIf Ġever Ġneeded : ĊĠĠĠĠĠĠĠ Ġhttps :// github . com / oc orn ut / img ui / compare / a 1 a 3 6 e 7 6 2 eac 7 0 7 cc 3 f 9 c 8 1 ec 5 af 7 1 5 0 f 6 6 2 0 c 4 c ... d 7 f 9 7 9 2 2 b 8 8 3 aec 0 c 8 7 3 e 0 e 4 0 5 c 4 6 b 1 5 4 d 3 8 2 1 2 0 ĊĊĊĠĠĠĠĠĠĠ ĠRe create Ġthe ĠV AO Ġevery Ġtime ĊĠĠĠĠĠĠĠ Ġ( This Ġis Ġto Ġeasily Ġallow Ġmultiple ĠGL Ġcontexts . ĠV AO Ġare Ġnot Ġshared Ġamong ĠGL Ġcontexts , Ġand Ġwe Ġdon 't Ġtrack ĊĠĠĠĠĠĠĠ Ġcreation / deletion Ġof Ġwindows Ġso Ġwe Ġdon 't Ġhave Ġan Ġobvious Ġkey Ġto Ġuse Ġto Ġcache Ġthem .) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġv ao Name Ġ= Ġint Buffer Big ( 1 ) ĊĠĠĠ Ġlateinit Ġvar Ġprogram : ĠProgram A ĊĠĠĠ Ġval Ġfont Texture Ġ= Ġint Buffer Of (- 1 ) ĊĊĠĠĠ Ġval Ġmat Ġ= ĠMat 4 () ĊĊĠĠĠ Ġfun Ġinit ( window : ĠG lfw Window , Ġinstall Callbacks : ĠBoolean ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . window Ġ= Ġwindow ĊĊĠĠĠĠĠĠĠ Ġwith ( io ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠKeyboard Ġmapping . ĠImGui Ġwill Ġuse Ġthose Ġindices Ġto Ġpeek Ġinto Ġthe Ġio . KeyDown [] Ġarray . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Tab ] Ġ= ĠGLFW _ KEY _ TAB ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Left Arrow ] Ġ= ĠGLFW _ KEY _ LEFT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Right Arrow ] Ġ= ĠGLFW _ KEY _ RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Up Arrow ] Ġ= ĠGLFW _ KEY _ UP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Down Arrow ] Ġ= ĠGLFW _ KEY _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Page Up ] Ġ= ĠGLFW _ KEY _ PAGE _ UP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Page Down ] Ġ= ĠGLFW _ KEY _ PAGE _ DOWN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Home ] Ġ= ĠGLFW _ KEY _ HOME ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . End ] Ġ= ĠGLFW _ KEY _ END ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Insert ] Ġ= ĠGLFW _ KEY _ INSERT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Delete ] Ġ= ĠGLFW _ KEY _ DELETE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Back space ] Ġ= ĠGLFW _ KEY _ BACK SPACE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Space ] Ġ= ĠGLFW _ KEY _ SPACE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Enter ] Ġ= ĠGLFW _ KEY _ ENTER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Escape ] Ġ= ĠGLFW _ KEY _ ESCAPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . A ] Ġ= ĠGLFW _ KEY _ A ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . C ] Ġ= ĠGLFW _ KEY _ C ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . V ] Ġ= ĠGLFW _ KEY _ V ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . X ] Ġ= ĠGLFW _ KEY _ X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Y ] Ġ= ĠGLFW _ KEY _ Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Map [ Key . Z ] Ġ= ĠGLFW _ KEY _ Z ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠLoad Ġcurs ors ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFIXME : ĠGLFW Ġdoesn 't Ġexpose Ġsuitable Ġcurs ors Ġfor ĠResize All , ĠResize N ES W , ĠResize NW SE . ĠĊĠĠĠĠĠĠĠĠĠĠĠ ĠWe Ġrevert Ġto Ġarrow Ġcursor Ġfor Ġthose . ĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġmouse Cur s ors [ Mouse Cursor . Arrow . i ] Ġ= Ġglfw Create Standard Cursor ( GLFW _ ARROW _ CURSOR ) ĊĠĠĠĠĠĠĠ Ġmouse Cur s ors [ Mouse Cursor . TextInput . i ] Ġ= Ġglfw Create Standard Cursor ( GLFW _ IBE AM _ CURSOR ) ĊĠĠĠĠĠĠĠ Ġmouse Cur s ors [ Mouse Cursor . Resize All . i ] Ġ= Ġglfw Create Standard Cursor ( GLFW _ ARROW _ CURSOR ) ĊĠĠĠĠĠĠĠ Ġmouse Cur s ors [ Mouse Cursor . Resize NS . i ] Ġ= Ġglfw Create Standard Cursor ( GLFW _ V RE SIZE _ CURSOR ) ĊĠĠĠĠĠĠĠ Ġmouse Cur s ors [ Mouse Cursor . Resize EW . i ] Ġ= Ġglfw Create Standard Cursor ( GLFW _ H RE SIZE _ CURSOR ) ĊĠĠĠĠĠĠĠ Ġmouse Cur s ors [ Mouse Cursor . Resize N ES W . i ] Ġ= Ġglfw Create Standard Cursor ( GLFW _ ARROW _ CURSOR ) ĊĠĠĠĠĠĠĠ Ġmouse Cur s ors [ Mouse Cursor . Resize NW SE . i ] Ġ= Ġglfw Create Standard Cursor ( GLFW _ ARROW _ CURSOR ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( install Callbacks ) Ġinstall Callbacks () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinstall Callbacks () Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . mouse Button Callback Ġ= Ġmouse Button Callback ĊĠĠĠĠĠĠĠ Ġwindow . scroll Callback Ġ= Ġscroll Callback ĊĠĠĠĠĠĠĠ Ġwindow . key Callback Ġ= Ġkey Callback ĊĠĠĠĠĠĠĠ Ġwindow . char Callback Ġ= Ġchar Callback Ġ// ĠTODO Ġcheck Ġif Ġused Ġ( j og l Ġdoesnt Ġhave ) ĊĠĠĠĠĠĠĠ Ġ ime List ner . install ( window . handle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġv tx Size Ġ= Ġ 1 Ġshl Ġ 5 Ġ// Ġ 3 2 7 6 8 ĊĠĠĠ Ġvar Ġidx Size Ġ= Ġ 1 Ġshl Ġ 6 Ġ// Ġ 6 5 5 3 6 ĊĠĠĠ Ġvar Ġv tx Buffer Ġ= Ġbuffer Big ( v tx Size ) ĊĠĠĠ Ġvar Ġidx Buffer Ġ= Ġint Buffer Big ( idx Size Ġ/ ĠInt . BYTES ) ĊĊĊĠĠĠ Ġfun Ġnew Frame () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( font Texture [ 0 ] Ġ< Ġ 0 ) Ġcreate Device Objects () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġdisplay Ġsize Ġ( every Ġframe Ġto Ġac commod ate Ġfor Ġwindow Ġres izing ) ĊĠĠĠĠĠĠĠ Ġio . display Size Ġput Ġwindow . size ĊĠĠĠĠĠĠĠ Ġio . display Framebuffer Scale . x Ġ= Ġif Ġ( window . size . x Ġ> Ġ 0 ) Ġwindow . framebuffer Size . x Ġ/ Ġwindow . size . x . f Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠ Ġio . display Framebuffer Scale . y Ġ= Ġif Ġ( window . size . y Ġ> Ġ 0 ) Ġwindow . framebuffer Size . y Ġ/ Ġwindow . size . y . f Ġelse Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġtime Ġstep ĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Ġ= Ġglfw . time ĊĠĠĠĠĠĠĠ Ġio . deltaTime Ġ= Ġif Ġ( time Ġ> Ġ 0 ) Ġ( currentTime Ġ- Ġtime ). f Ġelse Ġ 1 f Ġ/ Ġ 6 0 f ĊĠĠĠĠĠĠĠ Ġtime Ġ= ĠcurrentTime ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠSetup Ġinputs ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( we Ġalready Ġgot Ġmouse Ġwheel , Ġkeyboard Ġkeys Ġ& Ġcharacters Ġfrom Ġglfw Ġcallbacks Ġpol led Ġin Ġglfw Poll Events ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMouse Ġposition Ġin Ġscreen Ġcoordinates Ġ( set Ġto Ġ- 1 ,- 1 Ġif Ġno Ġmouse Ġ/ Ġon Ġanother Ġscreen , Ġetc .) ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġif Ġ( window . focused ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( io . want Move Mouse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠSet Ġmouse Ġposition Ġif Ġrequested Ġby Ġio . Want Move Mouse Ġflag Ġ( used Ġwhen Ġio . Nav Moves True Ġis Ġenabled Ġby Ġuser ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġand Ġusing Ġdirection al Ġnavigation ) ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . cursor Pos Ġ= ĠVec 2 d ( io . mouse Pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġio . mouse Pos Ġput Ġwindow . cursor Pos ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio . mouse Pos Ġput Ġ- Float . MAX _ VALUE ĊĊĠĠĠĠĠĠĠ Ġrepeat ( 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġ ĠIf Ġa Ġmouse Ġpress Ġevent Ġcame , Ġalways Ġpass Ġit Ġas Ġ" mouse Ġheld Ġthis Ġframe ", Ġso Ġwe Ġdon 't Ġmiss Ġclick - release ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents Ġthat Ġare Ġshorter Ġthan Ġ 1 Ġframe . ĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio . mouse Down [ it ] Ġ= Ġmouse Just Pressed [ it ] Ġ|| Ġwindow . mouse Button ( it ) Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse Just Pressed [ it ] Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate ĠOS / hardware Ġmouse Ġcursor Ġif Ġimg ui Ġisn 't Ġdrawing Ġa Ġsoftware Ġcursor ĊĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġmouse Cursor ĊĠĠĠĠĠĠĠ Ġif Ġ( io . mouse Draw Cursor Ġ|| Ġcursor Ġ== ĠMouse Cursor . None ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . cursor Ġ= ĠG lfw Window . Cursor . Hidden ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglfw Set Cursor ( window . handle , Ġif ( mouse Cur s ors [ cursor . i ] Ġ!= Ġ 0 L ) Ġmouse Cur s ors Ġ[ cursor . i ] Ġelse Ġmouse Cur s ors [ Mouse Cursor . Arrow . i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . cursor Ġ= ĠG lfw Window . Cursor . Normal ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠStart Ġthe Ġframe . ĠThis Ġcall Ġwill Ġupdate Ġthe Ġio . want Capture Mouse , Ġio . want Capture Keyboard Ġflag Ġthat Ġyou Ġcan Ġuse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġdispatch Ġinputs Ġ( or Ġnot ) Ġto Ġyour Ġapplication . ĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠImGui . new Frame () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Device Objects (): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠBackup ĠGL Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġlast Program Ġ= ĠglGet Integer ( GL _ CURRENT _ PROGRAM ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Texture Ġ= ĠglGet Integer ( GL _ TEXTURE _ BINDING _ 2 D ) ĊĠĠĠĠĠĠĠ Ġval Ġlast ArrayBuffer Ġ= ĠglGet Integer ( GL _ ARRAY _ BUFFER _ BINDING ) ĊĠĠĠĠĠĠĠ Ġval Ġlast VertexArray Ġ= ĠglGet Integer ( GL _ VERTEX _ ARRAY _ BINDING ) ĊĊĠĠĠĠĠĠĠ Ġprogram Ġ= ĠProgram A (" shader ") ĊĊĠĠĠĠĠĠĠ Ġgl Gen Buffers ( buffer Name ) ĊĊĠĠĠĠĠĠĠ Ġgl Gen Vertex Arrays ( v ao Name ) ĊĠĠĠĠĠĠĠ Ġwith VertexArray ( v ao Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ARRAY _ BUFFER , Ġbuffer Name [ Buffer . Vertex ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl BufferData ( GL _ ARRAY _ BUFFER , Ġv tx Size , ĠGL _ STREAM _ DRAW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Enable VertexAttrib Array ( semantic . attr . POSITION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Enable VertexAttrib Array ( semantic . attr . TEX _ COORD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Enable VertexAttrib Array ( semantic . attr . COLOR ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠglVertex Attrib Pointer ( semantic . attr . POSITION , Ġ 2 , ĠGL _ FLOAT , Ġfalse , ĠDraw Vert . size , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠglVertex Attrib Pointer ( semantic . attr . TEX _ COORD , Ġ 2 , ĠGL _ FLOAT , Ġfalse , ĠDraw Vert . size , ĠVec 2 . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠglVertex Attrib Pointer ( semantic . attr . COLOR , Ġ 4 , ĠGL _ UNSIGNED _ BYTE , Ġtrue , ĠDraw Vert . size , Ġ 2 Ġ* ĠVec 2 . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ELEMENT _ ARRAY _ BUFFER , Ġbuffer Name [ Buffer . Element ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl BufferData ( GL _ ELEMENT _ ARRAY _ BUFFER , Ġidx Size , ĠGL _ STREAM _ DRAW ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcreate Fonts Texture () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRestore Ġmodified ĠGL Ġstate ĊĠĠĠĠĠĠĠ Ġgl Use Program ( last Program ) ĊĠĠĠĠĠĠĠ ĠglBind Texture ( GL _ TEXTURE _ 2 D , Ġlast Texture ) ĊĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ARRAY _ BUFFER , Ġlast ArrayBuffer ) ĊĠĠĠĠĠĠĠ ĠglBind VertexArray ( last VertexArray ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcheck Error (" create Device Object ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Size ( draw s : ĠArrayList < Draw List >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmin V tx Size Ġ= Ġdraw s . map Ġ{ Ġit . v tx Buffer . size Ġ}. sum () Ġ* ĠDraw Vert . size ĊĠĠĠĠĠĠĠ Ġval Ġmin Idx Size Ġ= Ġdraw s . map Ġ{ Ġit . idx Buffer . size Ġ}. sum () Ġ* ĠInt . BYTES ĊĊĠĠĠĠĠĠĠ Ġvar Ġnew V tx Size Ġ= Ġv tx Size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( new V tx Size Ġ< Ġmin V tx Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew V tx Size Ġ= Ġnew V tx Size Ġshl Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġnew Idx Size Ġ= Ġidx Size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( new Idx Size Ġ< Ġmin Idx Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Idx Size Ġ= Ġnew Idx Size Ġshl Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( new V tx Size Ġ!= Ġv tx Size Ġ|| Ġnew Idx Size Ġ!= Ġidx Size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Size Ġ= Ġnew V tx Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidx Size Ġ= Ġnew Idx Size ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer Ġ= Ġbuffer Big ( v tx Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidx Buffer . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġidx Buffer Ġ= Ġint Buffer Big ( idx Size Ġ/ ĠInt . BYTES ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith VertexArray ( v ao Name ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ARRAY _ BUFFER , Ġbuffer Name [ Buffer . Vertex ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl BufferData ( GL _ ARRAY _ BUFFER , Ġv tx Size , ĠGL _ STREAM _ DRAW ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Enable VertexAttrib Array ( semantic . attr . POSITION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Enable VertexAttrib Array ( semantic . attr . TEX _ COORD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Enable VertexAttrib Array ( semantic . attr . COLOR ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠglVertex Attrib Pointer ( semantic . attr . POSITION , Ġ 2 , ĠGL _ FLOAT , Ġfalse , ĠDraw Vert . size , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠglVertex Attrib Pointer ( semantic . attr . TEX _ COORD , Ġ 2 , ĠGL _ FLOAT , Ġfalse , ĠDraw Vert . size , ĠVec 2 . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠglVertex Attrib Pointer ( semantic . attr . COLOR , Ġ 4 , ĠGL _ UNSIGNED _ BYTE , Ġtrue , ĠDraw Vert . size , Ġ 2 Ġ* ĠVec 2 . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ELEMENT _ ARRAY _ BUFFER , Ġbuffer Name [ Buffer . Element ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl BufferData ( GL _ ELEMENT _ ARRAY _ BUFFER , Ġidx Size , ĠGL _ STREAM _ DRAW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Error (" check Size ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) Ġprintln (" new Ġbuffers Ġsizes , Ġv tx : Ġ$ v tx Size , Ġidx : Ġ$ idx Size ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠProgram A ( shader : ĠString ) Ġ: ĠProgram ("$ shader . vert ", Ġ"$ shader . frag ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmat Ġ= ĠglGet UniformLocation ( name , Ġ" mat ") ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusing Program ( name ) Ġ{ Ġ" Texture ". unit Ġ= Ġsemantic . sampler . DIFF USE Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠBuild Ġtexture Ġatlas Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcreate Fonts Texture (): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/* Ġ ĠLoad Ġas ĠRGBA Ġ 3 2 - bits Ġ( 7 5 % Ġof Ġthe Ġmemory Ġis Ġwast ed , Ġbut Ġdefault Ġfont Ġis Ġso Ġsmall ) Ġbecause Ġit Ġis Ġmore Ġlikely ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġbe Ġcompatible Ġwith Ġuser 's Ġexisting Ġshaders . ĠIf Ġyour ĠIm Texture Id Ġrepresent Ġa Ġhigher - level Ġconcept Ġthan ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjust Ġa ĠGL Ġtexture Ġid , Ġconsider Ġcalling ĠGet Tex Data As Alpha 8 () Ġinstead Ġto Ġsave Ġon ĠGPU Ġmemory . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġ( pixels , Ġsize ) Ġ= Ġio . fonts . get Tex Data As RGBA 3 2 () ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpload Ġtexture Ġto Ġgraphics Ġsystem ĊĠĠĠĠĠĠĠ Ġval Ġlast Texture Ġ= ĠglGet Integer ( GL _ TEXTURE _ BINDING _ 2 D ) ĊĊĠĠĠĠĠĠĠ Ġinit Texture 2 d ( font Texture ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Filter Ġ= Ġlinear ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmag Filter Ġ= Ġlinear ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Pixel Store i ( GL _ UN PACK _ ROW _ LENGTH , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage ( GL _ RGBA , Ġsize , ĠGL _ RGBA , ĠGL _ UNSIGNED _ BYTE , Ġpixels ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġour Ġidentifier ĊĠĠĠĠĠĠĠ Ġio . fonts . tex Id Ġ= Ġfont Texture [ 0 ] ĊĊĠĠĠĠĠĠĠ Ġ// ĠRestore Ġstate ĊĠĠĠĠĠĠĠ ĠglBind Texture ( GL _ TEXTURE _ 2 D , Ġlast Texture ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcheck Error (" create Fonts Texture ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠOpenGL 3 ĠRender Ġfunction . ĊĠĠĠĠ Ġ* Ġ Ġ( this Ġused Ġto Ġbe Ġset Ġin Ġio . render Draw Lists Fn Ġand Ġcalled Ġby ĠImGui :: render (), Ġbut Ġyou Ġcan Ġnow Ġcall Ġthis Ġdirectly ĊĠĠĠĠ Ġ* Ġ Ġfrom Ġyour Ġmain Ġloop ) ĊĠĠĠĠ Ġ* Ġ ĠNote Ġthat Ġthis Ġimplementation Ġis Ġlittle Ġover comp licated Ġbecause Ġwe Ġare Ġsaving / setting Ġup / rest oring Ġevery ĠOpenGL ĊĠĠĠĠ Ġ* Ġ Ġstate Ġexplicitly , Ġin Ġorder Ġto Ġbe Ġable Ġto Ġrun Ġwithin Ġany ĠOpenGL Ġengine Ġthat Ġdoesn 't Ġdo Ġso . ĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrender Draw Data ( draw Data : ĠDraw Data ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠAvoid Ġrendering Ġwhen Ġminim ized , Ġscale Ġcoordinates Ġfor Ġret ina Ġdisplays ĊĠĠĠĠĠĠĠĠ Ġ* Ġ Ġ( screen Ġcoordinates Ġ!= Ġframebuffer Ġcoordinates ) Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġfb Size Ġ= Ġio . display Size Ġ* Ġio . display Framebuffer Scale ĊĠĠĠĠĠĠĠ Ġif Ġ( fb Size Ġequal Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġdraw Data . scale Clip Rects ( io . display Framebuffer Scale ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠBackup ĠGL Ġstate ĊĠĠĠĠĠĠĠ Ġval Ġlast Active Texture Ġ= ĠglGet Integer ( GL _ ACTIVE _ TEXTURE ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Program Ġ= ĠglGet Integer ( GL _ CURRENT _ PROGRAM ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Texture Ġ= ĠglGet Integer ( GL _ TEXTURE _ BINDING _ 2 D ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Sampler Ġ= ĠglGet Integer ( GL _ SAMPLER _ BINDING ) ĊĠĠĠĠĠĠĠ Ġval Ġlast ArrayBuffer Ġ= ĠglGet Integer ( GL _ ARRAY _ BUFFER _ BINDING ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Element ArrayBuffer Ġ= ĠglGet Integer ( GL _ ELEMENT _ ARRAY _ BUFFER _ BINDING ) ĊĠĠĠĠĠĠĠ Ġval Ġlast VertexArray Ġ= ĠglGet Integer ( GL _ VERTEX _ ARRAY _ BINDING ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Polygon Mode Ġ= ĠglGet Integer ( GL _ POLYGON _ MODE ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Viewport Ġ= ĠglGet Vec 4 i ( GL _ VIEW PORT ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Sc issor Box Ġ= ĠglGet Vec 4 i ( GL _ SC IS SOR _ BOX ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Blend Src Rgb Ġ= ĠglGet Integer ( GL _ BLEND _ SRC _ RGB ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Blend Dst Rgb Ġ= ĠglGet Integer ( GL _ BLEND _ DST _ RGB ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Blend Src Alpha Ġ= ĠglGet Integer ( GL _ BLEND _ SRC _ ALPHA ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Blend Dst Alpha Ġ= ĠglGet Integer ( GL _ BLEND _ DST _ ALPHA ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Blend Equation Rgb Ġ= ĠglGet Integer ( GL _ BLEND _ EQ UATION _ RGB ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Blend Equation Alpha Ġ= ĠglGet Integer ( GL _ BLEND _ EQ UATION _ ALPHA ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Enable Blend Ġ= Ġgl IsEnabled ( GL _ BLEND ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Enable Cull Face Ġ= Ġgl IsEnabled ( GL _ C ULL _ FACE ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Enable Depth Test Ġ= Ġgl IsEnabled ( GL _ DEPTH _ TEST ) ĊĠĠĠĠĠĠĠ Ġval Ġlast Enable Sc issor Test Ġ= Ġgl IsEnabled ( GL _ SC IS SOR _ TEST ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġrender Ġstate : Ġalpha - bl ending Ġenabled , Ġno Ġface Ġc ull ing , Ġno Ġdepth Ġtesting , Ġsc issor Ġenabled ĊĠĠĠĠĠĠĠ Ġgl Enable ( GL _ BLEND ) ĊĠĠĠĠĠĠĠ Ġgl Blend Equation ( GL _ FUNC _ ADD ) ĊĠĠĠĠĠĠĠ Ġgl Blend Func ( GL _ SRC _ ALPHA , ĠGL _ ONE _ MINUS _ SRC _ ALPHA ) ĊĠĠĠĠĠĠĠ Ġgl Disable ( GL _ C ULL _ FACE ) ĊĠĠĠĠĠĠĠ Ġgl Disable ( GL _ DEPTH _ TEST ) ĊĠĠĠĠĠĠĠ Ġgl Enable ( GL _ SC IS SOR _ TEST ) ĊĠĠĠĠĠĠĠ Ġgl Polygon Mode ( GL _ FRONT _ AND _ BACK , ĠGL _ FILL ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġviewport , Ġor tho graphic Ġprojection Ġmatrix ĊĠĠĠĠĠĠĠ Ġgl Viewport ( fb Size ) ĊĠĠĠĠĠĠĠ Ġval Ġor tho Ġ= Ġglm . orth o ( mat , Ġ 0 f , Ġio . display Size . x . f , Ġio . display Size . y . f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġgl Use Program ( program ) ĊĠĠĠĠĠĠĠ Ġgl Uniform ( program . mat , Ġor tho ) ĊĊĠĠĠĠĠĠĠ Ġcheck Size ( draw Data . cmd Lists ) ĊĊĠĠĠĠĠĠĠ ĠglBind VertexArray ( v ao Name ) ĊĠĠĠĠĠĠĠ ĠglBind Sampler ( semantic . sampler . DIFF USE , Ġ 0 ) Ġ// ĠR ely Ġon Ġcombined Ġtexture / sampler Ġstate . ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( cmd List Ġin Ġdraw Data . cmd Lists ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd List . v tx Buffer . forEach Indexed Ġ{ Ġi , Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġi Ġ* ĠDraw Vert . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . pos . to ( v tx Buffer , Ġoffset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . uv . to ( v tx Buffer , Ġoffset Ġ+ ĠVec 2 . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv tx Buffer . put Int ( offset Ġ+ ĠVec 2 . size Ġ* Ġ 2 , Ġv . col ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ARRAY _ BUFFER , Ġbuffer Name [ Buffer . Vertex ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Buffer Sub Data ( GL _ ARRAY _ BUFFER , Ġ 0 , Ġcmd List ._ v tx Write Ptr Ġ* ĠDraw Vert . size , Ġv tx Buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcmd List . idx Buffer . forEach Indexed Ġ{ Ġi , Ġidx Ġ-> Ġidx Buffer [ i ] Ġ= Ġidx Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ELEMENT _ ARRAY _ BUFFER , Ġbuffer Name [ Buffer . Element ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Buffer Sub Data ( GL _ ELEMENT _ ARRAY _ BUFFER , Ġ 0 , Ġcmd List ._ idx Write Ptr Ġ* ĠInt . BYTES , Ġidx Buffer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġidx Buffer Offset Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cmd Ġin Ġcmd List . cmd Buffer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cmd . user Callback Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcmd . user Callback !! ( cmd List , Ġcmd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Active Texture ( GL _ TEXTURE 0 Ġ+ Ġsemantic . sampler . DIFF USE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠglBind Texture ( GL _ TEXTURE _ 2 D , Ġcmd . texture Id !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Sc issor ( cmd . clip Rect . x . i , Ġfb Size . y Ġ- Ġcmd . clip Rect . w . i , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( cmd . clip Rect . z Ġ- Ġcmd . clip Rect . x ). i , Ġ( cmd . clip Rect . w Ġ- Ġcmd . clip Rect . y ). i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgl Draw Elements ( GL _ TRI ANG LES , Ġcmd . elem Count , ĠGL _ UNSIGNED _ INT , Ġidx Buffer Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidx Buffer Offset Ġ+= Ġcmd . elem Count Ġ* ĠInt . BYTES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcheck Error (" render ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠRestore Ġmodified ĠGL Ġstate ĊĠĠĠĠĠĠĠ Ġgl Use Program ( last Program ) ĊĠĠĠĠĠĠĠ ĠglBind Texture ( GL _ TEXTURE _ 2 D , Ġlast Texture ) ĊĠĠĠĠĠĠĠ ĠglBind Sampler ( 0 , Ġlast Sampler ) ĊĠĠĠĠĠĠĠ Ġgl Active Texture ( last Active Texture ) ĊĠĠĠĠĠĠĠ ĠglBind VertexArray ( last VertexArray ) ĊĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ARRAY _ BUFFER , Ġlast ArrayBuffer ) ĊĠĠĠĠĠĠĠ ĠglBind Buffer ( GL _ ELEMENT _ ARRAY _ BUFFER , Ġlast Element ArrayBuffer ) ĊĠĠĠĠĠĠĠ Ġgl Blend Equation Separ ate ( last Blend Equation Rgb , Ġlast Blend Equation Alpha ) ĊĠĠĠĠĠĠĠ Ġgl Blend Func Separ ate ( last Blend Src Rgb , Ġlast Blend Dst Rgb , Ġlast Blend Src Alpha , Ġlast Blend Dst Alpha ) ĊĠĠĠĠĠĠĠ Ġif Ġ( last Enable Blend ) Ġgl Enable ( GL _ BLEND ) Ġelse Ġgl Disable ( GL _ BLEND ) ĊĠĠĠĠĠĠĠ Ġif Ġ( last Enable Cull Face ) Ġgl Enable ( GL _ C ULL _ FACE ) Ġelse Ġgl Disable ( GL _ C ULL _ FACE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( last Enable Depth Test ) Ġgl Enable ( GL _ DEPTH _ TEST ) Ġelse Ġgl Disable ( GL _ DEPTH _ TEST ) ĊĠĠĠĠĠĠĠ Ġif Ġ( last Enable Sc issor Test ) Ġgl Enable ( GL _ SC IS SOR _ TEST ) Ġelse Ġgl Disable ( GL _ SC IS SOR _ TEST ) ĊĠĠĠĠĠĠĠ Ġgl Polygon Mode ( GL _ FRONT _ AND _ BACK , Ġlast Polygon Mode ) ĊĠĠĠĠĠĠĠ Ġgl Viewport ( last Viewport ) ĊĠĠĠĠĠĠĠ Ġgl Sc issor ( last Sc issor Box ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġmouse Button Callback Ġ= Ġ{ Ġbutton : ĠInt , Ġaction : ĠInt , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠGLFW _ PRESS Ġ&& Ġbutton Ġin Ġ 0 .. 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmouse Just Pressed [ button ] Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġscroll Callback Ġ= Ġ{ Ġoffset : ĠVec 2 d Ġ-> ĊĠĠĠĠĠĠĠ Ġio . mouse Wheel H Ġ+= Ġoffset . x . f ĊĠĠĠĠĠĠĠ Ġio . mouse Wheel Ġ+= Ġoffset . y . f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġkey Callback Ġ= Ġ{ Ġkey : ĠInt , Ġ_: ĠInt , Ġaction : ĠInt , Ġ_: ĠInt Ġ-> ĊĠĠĠĠĠĠĠ Ġwith ( io ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġin Ġkeys Down . indices ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠGLFW _ PRESS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Down [ key ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( action Ġ== ĠGLFW _ RELEASE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeys Down [ key ] Ġ= Ġfalse Ċ Ċ // ĠĠĠĠĠĠĠ Ġ( void ) Ġmods Ġ// ĠMod ifiers Ġare Ġnot Ġreliable Ġacross Ġsystems ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ctrl Ġ= Ġkeys Down [ GLFW _ KEY _ LEFT _ CONTROL ] Ġ|| Ġkeys Down [ GLFW _ KEY _ RIGHT _ CONTROL ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Shift Ġ= Ġkeys Down [ GLFW _ KEY _ LEFT _ SHIFT ] Ġ|| Ġkeys Down [ GLFW _ KEY _ RIGHT _ SHIFT ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Alt Ġ= Ġkeys Down [ GLFW _ KEY _ LEFT _ ALT ] Ġ|| Ġkeys Down [ GLFW _ KEY _ RIGHT _ ALT ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Super Ġ= Ġkeys Down [ GLFW _ KEY _ LEFT _ SUPER ] Ġ|| Ġkeys Down [ GLFW _ KEY _ RIGHT _ SUPER ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġchar Callback Ġ= Ġ{ Ġc : ĠInt Ġ-> Ġif Ġ( c Ġin Ġ 1 .. 6 5 5 3 5 ) Ġio . add Input Character ( c . c ) Ġ} ĊĊĠĠĠ Ġfun Ġshutdown () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠDestroy ĠGLFW Ġmouse Ġcurs ors ĊĠĠĠĠĠĠĠ Ġmouse Cur s ors . filter Ġ{ Ġit Ġ!= Ġ 0 L Ġ}. forEach (:: glfw Destroy Cursor ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDestroy ĠOpenGL Ġobjects ĊĠĠĠĠĠĠĠ Ġinvalidate Device Objects () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinvalidate Device Objects () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġgl Delete Vertex Arrays ( v ao Name ) ĊĠĠĠĠĠĠĠ Ġgl Delete Buffers ( buffer Name ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(:: program . isInitialized ) Ġgl Delete Program ( program ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( font Texture [ 0 ] Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgl Delete Textures ( font Texture ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġio . fonts . tex Id Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfont Texture [ 0 ] Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }