package Ġcom . mapbox . vision . ar . view . gl Ċ Ċ import Ġandroid . opengl . GLES 2 0 Ċ import Ġandroid . opengl . Matrix Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Float Buffer Ċ Ċ internal Ġclass ĠBackground ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtex Width : ĠInt , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtex Height : ĠInt Ċ ) Ġ: ĠGl Render . On Surface Changed Listener Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠV ERT EX _ SHADER Ġ= Ġ""" Ċ uniform Ġmat 4 Ġu M VP Matrix ; Ċ Ċ attribute Ġvec 3 Ġa Position ; Ċ attribute Ġvec 2 Ġa Tex ; Ċ Ċ varying Ġvec 2 Ġv Tex Coords ; Ċ Ċ void Ġmain () Ċ { ĊĠĠĠ Ġv Tex Coords Ġ= Ġa Tex ; ĊĠĠĠ Ġgl _ Position Ġ= Ġu M VP Matrix Ġ* Ġvec 4 ( a Position . xyz , Ġ 1 . 0 ); Ċ } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠFR AG MENT _ SHADER Ġ= Ġ""" Ċ precision Ġmedi ump Ġfloat ; Ċ Ċ uniform Ġsampler 2 D Ġu Texture ; Ċ Ċ varying Ġvec 2 Ġv Tex Coords ; Ċ Ċ void Ġmain () Ċ { ĊĠĠĠ Ġvec 4 Ġcolor Ġ= Ġtexture 2 D ( u Texture , Ġv Tex Coords ); ĊĠĠĠ Ġgl _ Frag Color Ġ= Ġvec 4 ( color . xyz , Ġ 1 . 0 ); Ġ// vec 4 ( texture 2 D ( u Texture , Ġv Tex Coords ). x , Ġv Tex Coords . x , Ġv Tex Coords . y , Ġ 1 . 0 ); Ċ } ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Program : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġvertex Buffer : ĠFloat Buffer Ġ= Ġdirect ByteBuffer Of ( capacity Ġ= Ġ 1 8 Ġ* Ġ 4 ). as Float Buffer () ĊĠĠĠ Ġprivate Ġval Ġtex Buffer : ĠFloat Buffer Ġ= Ġdirect ByteBuffer Of ( capacity Ġ= Ġ 1 2 Ġ* Ġ 4 ). as Float Buffer () ĊĠĠĠ Ġprivate Ġvar Ġtexture Handler : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġtexture Bytes : ĠByteBuffer Ġ= Ġdirect ByteBuffer Of ( capacity Ġ= Ġtex Width Ġ* Ġtex Height Ġ* Ġ 4 ) ĊĠĠĠ Ġprivate Ġvar Ġneed Texture Update : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvertex Buffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , Ġ 0 f , Ġ 0 f , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġ 1 f , Ġ 1 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , Ġ 0 f , Ġ 0 f , Ġ 1 f , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġ 1 f , Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. position ( 0 ) ĊĊĠĠĠĠĠĠĠ Ġtex Buffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , Ġ 1 f , Ġ 1 f , Ġ 1 f , Ġ 1 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 f , Ġ 1 f , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. position ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġprepare Ġshaders Ġand ĠOpenGL Ġprogram ĊĠĠĠĠĠĠĠ Ġval Ġvertex Shader Ġ= ĠGl Render . load Shader ( GLES 2 0 . GL _ VERTEX _ SHADER , ĠV ERT EX _ SHADER ) ĊĠĠĠĠĠĠĠ Ġval Ġfragment Shader Ġ= ĠGl Render . load Shader ( GLES 2 0 . GL _ FRAGMENT _ SHADER , ĠFR AG MENT _ SHADER ) ĊĊĠĠĠĠĠĠĠ Ġm Program Ġ= ĠGLES 2 0 . gl Create Program () ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġempty ĠOpenGL ĠProgram ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Attach Shader ( m Program , Ġvertex Shader ) ĠĠ Ġ// Ġadd Ġthe Ġvertex Ġshader Ġto Ġprogram ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Attach Shader ( m Program , Ġfragment Shader ) Ġ// Ġadd Ġthe Ġfragment Ġshader Ġto Ġprogram ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Link Program ( m Program ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate ĠOpenGL Ġprogram Ġexecut ables ĊĠĠĠĠĠĠĠ ĠGl Render . check Gl Error (" Ar Background Ġ-> Ġm Program ") ĊĊĠĠĠĠĠĠĠ Ġtexture Handler Ġ= Ġcreate Texture () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Texture (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtex s Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Gen Textures ( 1 , Ġtex s , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtex s [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Texture () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! need Texture Update ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġtexture Handler ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexImage 2 D ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġ 0 , ĠGLES 2 0 . GL _ RGBA , Ġtex Width , Ġtex Height , Ġ 0 , ĠGLES 2 0 . GL _ RGBA , ĠGLES 2 0 . GL _ UNSIGNED _ BYTE , Ġtexture Bytes ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( GLES 2 0 . GL _ TEXTURE _ 2 D , ĠGLES 2 0 . GL _ TEXTURE _ MIN _ FILTER , ĠGLES 2 0 . GL _ LINEAR ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( GLES 2 0 . GL _ TEXTURE _ 2 D , ĠGLES 2 0 . GL _ TEXTURE _ MAG _ FILTER , ĠGLES 2 0 . GL _ LINEAR ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( GLES 2 0 . GL _ TEXTURE _ 2 D , ĠGLES 2 0 . GL _ TEXTURE _ WRAP _ S , ĠGLES 2 0 . GL _ CLAMP _ TO _ EDGE ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl TexParameter i ( GLES 2 0 . GL _ TEXTURE _ 2 D , ĠGLES 2 0 . GL _ TEXTURE _ WRAP _ T , ĠGLES 2 0 . GL _ CLAMP _ TO _ EDGE ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġneed Texture Update Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw () Ġ{ ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Use Program ( m Program ) ĊĠĠĠĠĠĠĠ ĠGl Render . check Gl Error (" Ar Background . gl Use Program ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġget Ġhandle Ġto Ġvertex Ġshader 's Ġv Position Ġmember ĊĠĠĠĠĠĠĠ Ġval Ġa Position Handle Ġ= ĠGLES 2 0 . glGet Attrib Location ( m Program , Ġ" a Position ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( a Position Handle ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( a Position Handle , Ġ 3 , ĠGLES 2 0 . GL _ FLOAT , Ġfalse , Ġ 1 2 , Ġvertex Buffer ) ĊĠĠĠĠĠĠĠ ĠGl Render . check Gl Error (" Ar Lane Ġ-> Ġa Position Handle ") ĊĊĠĠĠĠĠĠĠ Ġval Ġa Tex Handle Ġ= ĠGLES 2 0 . glGet Attrib Location ( m Program , Ġ" a Tex ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( a Tex Handle ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( a Tex Handle , Ġ 2 , ĠGLES 2 0 . GL _ FLOAT , Ġfalse , Ġ 8 , Ġtex Buffer ) ĊĠĠĠĠĠĠĠ ĠGl Render . check Gl Error (" Ar Lane Ġ-> Ġa Tex ") ĊĊĠĠĠĠĠĠĠ Ġval Ġproj Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĠĠĠĠĠĠĠ ĠMatrix . orth o M ( proj Matrix , Ġ 0 , Ġ 0 f , Ġ 1 f , Ġ 0 f , Ġ 1 f , Ġ- 1 f , Ġ 1 f ) ĊĊĠĠĠĠĠĠĠ Ġval Ġu M VP Matrix Handle Ġ= ĠGLES 2 0 . glGet UniformLocation ( m Program , Ġ" u M VP Matrix ") ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform Matrix 4 fv ( u M VP Matrix Handle , Ġ 1 , Ġfalse , Ġproj Matrix , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠGl Render . check Gl Error (" Ar Lane Ġ-> Ġu M VP Matrix Handle ") ĊĊĠĠĠĠĠĠĠ Ġupdate Texture () ĊĊĠĠĠĠĠĠĠ Ġval Ġu Texture Handle Ġ= ĠGLES 2 0 . glGet UniformLocation ( m Program , Ġ" u Texture "); ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Active Texture ( GLES 2 0 . GL _ TEXTURE 0 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġtexture Handler ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform 1 i ( u Texture Handle , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠGl Render . check Gl Error (" Ar Lane Ġ-> ĠTexture Uniform ") ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Draw Arrays ( GLES 2 0 . GL _ TRI ANG LES , Ġ 0 , Ġ 6 ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Disable VertexAttrib Array ( a Position Handle ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Disable VertexAttrib Array ( a Tex Handle ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Texture ( GLES 2 0 . GL _ TEXTURE _ 2 D , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Texture ( byteArray : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġneed Texture Update Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtexture Bytes . put ( byteArray ). position ( 0 ) ĊĠĠĠ Ġ} Ċ } Ċ