package Ġio . github . ken ney code . openg le spro . samples . renderer . lighting Ċ Ċ import Ġandroid . opengl . GLES 3 0 Ċ import Ġio . github . ken ney code . openg le spro . Util Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . nio . Float Buffer Ċ import Ġjavax . micro edition . kh ronos . e gl . EGL Config Ċ import Ġjavax . micro edition . kh ronos . openg les . GL 1 0 Ċ import Ġkotlin . math . sqrt Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ ĠCode d Ġby Ġk enn ey Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . github . com / ken ney code Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġ æ³ķ åĲĳ åĽ¾ ä¾ĭåŃĲ Ċ Ġ* ĠĠĠĠĠ ĠBump ed Ġsample Ċ Ġ* Ċ Ġ**/ Ċ Ċ class ĠBump ed Light Renderer Ġ: ĠLight ing Renderer (" lighting / bump ed lighting . vs ", Ġ" lighting / bump ed lighting . fs ") Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġnormal Texture Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval ĠLOC ATION _ ATTRIBUTE _ T ANG ENT Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġval ĠLOC ATION _ ATTRIBUTE _ BIT ANG ENT Ġ= Ġ 4 ĊĊĠĠĠ Ġprivate Ġval ĠT ANG ENT _ COMPONENT _ COUNT Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtangent Data Buffer Ġ: ĠFloat Buffer ĊĊĠĠĠ Ġprivate Ġval ĠBIT ANG ENT _ COMPONENT _ COUNT Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbit ang ent Data Buffer Ġ: ĠFloat Buffer ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw Frame ( gl : ĠGL 1 0 ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw Frame ( gl ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl Enable VertexAttrib Array ( LOCATION _ ATTRIBUTE _ T ANG ENT ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . glVertex Attrib Pointer ( LOCATION _ ATTRIBUTE _ T ANG ENT , ĠT ANG ENT _ COMPONENT _ COUNT , ĠGLES 3 0 . GL _ FLOAT , Ġfalse , 0 , Ġtangent Data Buffer ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl Enable VertexAttrib Array ( LOCATION _ ATTRIBUTE _ BIT ANG ENT ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . glVertex Attrib Pointer ( LOCATION _ ATTRIBUTE _ BIT ANG ENT , ĠBIT ANG ENT _ COMPONENT _ COUNT , ĠGLES 3 0 . GL _ FLOAT , Ġfalse , 0 , Ġbit ang ent Data Buffer ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl Active Texture ( GLES 3 0 . GL _ TEXTURE 1 ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . glBind Texture ( GLES 3 0 . GL _ TEXTURE _ 2 D , Ġnormal Texture ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl Uniform 3 f ( GLES 3 0 . glGet UniformLocation ( program Id , Ġ" light Pos "), Ġ 2 f , Ġ 0 f , Ġ 2 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Created ( gl : ĠGL 1 0 ?, Ġconfig : ĠE GL Config ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Surface Created ( gl , Ġconfig ) ĊĠĠĠĠĠĠĠ Ġval Ġtextures Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl Gen Textures ( textures . size , Ġtextures , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġnormal Texture Ġ= Ġtextures [ 0 ] ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl Active Texture ( GLES 3 0 . GL _ TEXTURE 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġbitmap 2 Ġ= ĠUtil . decode Bitmap From Assets (" lighting / brick n . png ") ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . glBind Texture ( GLES 3 0 . GL _ TEXTURE _ 2 D , Ġnormal Texture ) ĊĠĠĠĠĠĠĠ Ġval Ġb 2 Ġ= ĠByteBuffer . allocate ( bitmap 2 . width Ġ* Ġbitmap 2 . height Ġ* Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġbitmap 2 . copy Pixels To Buffer ( b 2 ) ĊĠĠĠĠĠĠĠ Ġb 2 . position ( 0 ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl TexParameter i ( GLES 3 0 . GL _ TEXTURE _ 2 D , ĠGLES 3 0 . GL _ TEXTURE _ MIN _ FILTER , ĠGLES 3 0 . GL _ LINEAR ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl TexParameter i ( GLES 3 0 . GL _ TEXTURE _ 2 D , ĠGLES 3 0 . GL _ TEXTURE _ MAG _ FILTER , ĠGLES 3 0 . GL _ LINEAR ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl TexParameter i ( GLES 3 0 . GL _ TEXTURE _ 2 D , ĠGLES 3 0 . GL _ TEXTURE _ WRAP _ S , ĠGLES 3 0 . GL _ CLAMP _ TO _ EDGE ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl TexParameter i ( GLES 3 0 . GL _ TEXTURE _ 2 D , ĠGLES 3 0 . GL _ TEXTURE _ WRAP _ T , ĠGLES 3 0 . GL _ CLAMP _ TO _ EDGE ) ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl TexImage 2 D ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 3 0 . GL _ TEXTURE _ 2 D , Ġ 0 , ĠGLES 3 0 . GL _ RGBA , Ġbitmap 2 . width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap 2 . height , Ġ 0 , ĠGLES 3 0 . GL _ RGBA , ĠGLES 3 0 . GL _ UNSIGNED _ BYTE , Ġb 2 ) ĊĠĠĠĠĠĠĠ Ġbitmap 2 . recycle () ĊĠĠĠĠĠĠĠ ĠGLES 3 0 . gl Uniform 1 i ( GLES 3 0 . glGet UniformLocation ( program Id , Ġ" normal Tex "), Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġcalculate Tang ents () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Tang ents () Ġ{ ĊĠĠĠĠĠĠĠ Ġtangent Data Buffer Ġ= ĠByteBuffer . allocate Direct ( vertex Data . size Ġ* Ġjava . lang . Float . SIZE Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. order ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Float Buffer () ĊĠĠĠĠĠĠĠ Ġbit ang ent Data Buffer Ġ= ĠByteBuffer . allocate Direct ( vertex Data . size Ġ* Ġjava . lang . Float . SIZE Ġ/ Ġ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. order ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Float Buffer () ĊĠĠĠĠĠĠĠ Ġval Ġtang ents Ġ= Ġmutable ListOf < Float >() ĊĠĠĠĠĠĠĠ Ġval Ġbit ang ents Ġ= Ġmutable ListOf < Float >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġvertex Data . size Ġ/ Ġ 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe 1 x Ġ= Ġvertex Data [ i Ġ* Ġ 9 Ġ+ Ġ 3 ] Ġ- Ġvertex Data [ i Ġ* Ġ 9 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe 1 y Ġ= Ġvertex Data [ i Ġ* Ġ 9 Ġ+ Ġ 3 Ġ+ Ġ 1 ] Ġ- Ġvertex Data [ i Ġ* Ġ 9 Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe 1 z Ġ= Ġvertex Data [ i Ġ* Ġ 9 Ġ+ Ġ 3 Ġ+ Ġ 2 ] Ġ- Ġvertex Data [ i Ġ* Ġ 9 Ġ+ Ġ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe 2 x Ġ= Ġvertex Data [ i Ġ* Ġ 9 Ġ+ Ġ 6 ] Ġ- Ġvertex Data [ i Ġ* Ġ 9 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe 2 y Ġ= Ġvertex Data [ i Ġ* Ġ 9 Ġ+ Ġ 6 Ġ+ Ġ 1 ] Ġ- Ġvertex Data [ i Ġ* Ġ 9 Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġe 2 z Ġ= Ġvertex Data [ i Ġ* Ġ 9 Ġ+ Ġ 6 Ġ+ Ġ 2 ] Ġ- Ġvertex Data [ i Ġ* Ġ 9 Ġ+ Ġ 2 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta UV 1 x Ġ= Ġtexture Coordinate Data [ i Ġ* Ġ 6 Ġ+ Ġ 2 ] Ġ- Ġtexture Coordinate Data [ i Ġ* Ġ 6 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta UV 1 y Ġ= Ġtexture Coordinate Data [ i Ġ* Ġ 6 Ġ+ Ġ 2 Ġ+ Ġ 1 ] Ġ- Ġtexture Coordinate Data [ i Ġ* Ġ 6 Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta UV 2 x Ġ= Ġtexture Coordinate Data [ i Ġ* Ġ 6 Ġ+ Ġ 4 ] Ġ- Ġtexture Coordinate Data [ i Ġ* Ġ 6 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta UV 2 y Ġ= Ġtexture Coordinate Data [ i Ġ* Ġ 6 Ġ+ Ġ 4 Ġ+ Ġ 1 ] Ġ- Ġtexture Coordinate Data [ i Ġ* Ġ 6 Ġ+ Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf Ġ= Ġ 1 f Ġ/ Ġ( delta UV 1 x Ġ* Ġdelta UV 2 y Ġ- Ġdelta UV 2 x Ġ* Ġdelta UV 1 y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtangent x Ġ= Ġf Ġ* Ġ( delta UV 2 y Ġ* Ġe 1 x Ġ- Ġdelta UV 1 y Ġ* Ġe 2 x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtang enty Ġ= Ġf Ġ* Ġ( delta UV 2 y Ġ* Ġe 1 y Ġ- Ġdelta UV 1 y Ġ* Ġe 2 y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtangent z Ġ= Ġf Ġ* Ġ( delta UV 2 y Ġ* Ġe 1 z Ġ- Ġdelta UV 1 y Ġ* Ġe 2 z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtangent Length Ġ= Ġsqrt ( tang ent x Ġ* Ġtangent x Ġ+ Ġtang enty Ġ* Ġtang enty Ġ+ Ġtangent z Ġ* Ġtangent z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtangent x Ġ/= Ġtangent Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtang enty Ġ/= Ġtangent Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtangent z Ġ/= Ġtangent Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbit ang ent x Ġ= Ġf Ġ* Ġ(- delta UV 2 x Ġ* Ġe 1 x Ġ+ Ġdelta UV 1 x Ġ* Ġe 2 x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbit ang enty Ġ= Ġf Ġ* Ġ(- delta UV 2 x Ġ* Ġe 1 y Ġ+ Ġdelta UV 1 x Ġ* Ġe 2 y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbit ang ent z Ġ= Ġf Ġ* Ġ(- delta UV 2 x Ġ* Ġe 1 z Ġ+ Ġdelta UV 1 x Ġ* Ġe 2 z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit ang ent Length Ġ= Ġsqrt ( bit ang ent x Ġ* Ġbit ang ent x Ġ+ Ġbit ang enty Ġ* Ġbit ang enty Ġ+ Ġbit ang ent z Ġ* Ġbit ang ent z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit ang ent x Ġ/= Ġbit ang ent Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit ang enty Ġ/= Ġbit ang ent Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbit ang ent z Ġ/= Ġbit ang ent Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġ 9 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( j Ġ% Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtang ents . add ( tang ent x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbit ang ents . add ( bit ang ent x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtang ents . add ( tang enty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbit ang ents . add ( bit ang enty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtang ents . add ( tang ent z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbit ang ents . add ( bit ang ent z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtangent Data Buffer . put ( tang ents . toFloat Array ()) ĊĠĠĠĠĠĠĠ Ġtangent Data Buffer . position ( 0 ) ĊĠĠĠĠĠĠĠ Ġbit ang ent Data Buffer . put ( bit ang ents . toFloat Array ()) ĊĠĠĠĠĠĠĠ Ġbit ang ent Data Buffer . position ( 0 ) ĊĠĠĠ Ġ} Ċ Ċ }