@ file : Suppress (" unused ") Ċ package Ġcom . learn openg les . android . lesson 8 Ċ Ċ import Ġandroid . opengl . GLES 2 0 Ċ import Ġandroid . opengl . GL Surface View Ċ import Ġandroid . opengl . Matrix Ċ import Ġcom . learn openg les . android . R Ċ import Ġcom . learn openg les . android . common . Raw Resource Reader Ċ import Ġcom . learn openg les . android . common . Shader Helper Ċ import Ġcom . learn openg les . android . lesson 8 . ErrorHandler . ErrorType Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ import Ġjavax . micro edition . kh ronos . e gl . EGL Config Ċ import Ġjavax . micro edition . kh ronos . openg les . GL 1 0 Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġimplements Ġour Ġcustom Ġrenderer . ĠNote Ġthat Ġthe ĠGL 1 0 Ġparameter Ċ Ġ* Ġpassed Ġin Ġis Ġunused Ġfor ĠOpenGL ĠES Ġ 2 . 0 Ġrender ers Ġ-- Ġthe Ġstatic Ġclass ĠGLES 2 0 Ġis Ċ Ġ* Ġused Ġinstead . Ċ Ġ*/ Ċ class ĠLess on E ight Renderer Ċ /** Ċ Ġ* ĠInitialize Ġthe Ġmodel Ġdata . Ċ Ġ*/ Ċ ( ĊĠĠĠĠĠĠĠ Ġ/** ĠReferences Ġto Ġother Ġmain Ġobjects . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlesson E ight Activity : ĠLess on E ight Activity , Ġprivate Ġval ĠerrorHandler : ĠError Handler )// ĠGLES 2 0 Ġ= Ġnew ĠAndroid GL 2 0 (); ĊĠĠĠ Ġ: ĠGL Surface View . Renderer Ġ{ ĊĊĠĠĠ Ġ/* Ċĉ Ġ* ĠAndroid 's ĠOpenGL Ġbindings Ġare Ġbroken Ġuntil ĠG inger bread , Ġso Ġwe Ġuse ĠLib G DX Ċĉ Ġ* Ġbindings Ġhere . Ċĉ Ġ*/ ĊĠĠĠ Ġ// Ġprivate Ġfinal ĠAndroid GL 2 0 ĠGLES 2 0 ; ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStore Ġthe Ġmodel Ġmatrix . ĠThis Ġmatrix Ġis Ġused Ġto Ġmove Ġmodels Ġfrom Ġobject ĊĠĠĠĠ Ġ* Ġspace Ġ( where Ġeach Ġmodel Ġcan Ġbe Ġthought Ġof Ġbeing Ġlocated Ġat Ġthe Ġcenter Ġof ĊĠĠĠĠ Ġ* Ġthe Ġuniverse ) Ġto Ġworld Ġspace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġmodel Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStore Ġthe Ġview Ġmatrix . ĠThis Ġcan Ġbe Ġthought Ġof Ġas Ġour Ġcamera . ĠThis Ġmatrix ĊĠĠĠĠ Ġ* Ġtransforms Ġworld Ġspace Ġto Ġeye Ġspace ; Ġit Ġpositions Ġthings Ġrelative Ġto Ġour ĊĠĠĠĠ Ġ* Ġeye . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġview Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStore Ġthe Ġprojection Ġmatrix . ĠThis Ġis Ġused Ġto Ġproject Ġthe Ġscene Ġonto Ġa Ġ 2 D ĊĠĠĠĠ Ġ* Ġviewport . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġprojection Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllocate Ġstorage Ġfor Ġthe Ġfinal Ġcombined Ġmatrix . ĠThis Ġwill Ġbe Ġpassed Ġinto ĊĠĠĠĠ Ġ* Ġthe Ġshader Ġprogram . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm vp Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĊĠĠĠ Ġ/** ĠAdditional Ġmatrices . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġaccumulated Rotation Ġ= ĠFloat Array ( 1 6 ) ĊĠĠĠ Ġprivate Ġval Ġcurrent Rotation Ġ= ĠFloat Array ( 1 6 ) ĊĠĠĠ Ġprivate Ġval Ġlight Model Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĠĠĠ Ġprivate Ġval Ġtemporary Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĊĠĠĠ Ġ/** ĠOpenGL Ġhandles Ġto Ġour Ġprogram Ġuniform s . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm vp Matrix Uniform : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmv Matrix Uniform : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlight Pos Uniform : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĠOpenGL Ġhandles Ġto Ġour Ġprogram Ġattributes . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġposition Attribute : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġnormal Attribute : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcolor Attribute : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsed Ġto Ġhold Ġa Ġlight Ġcentered Ġon Ġthe Ġorigin Ġin Ġmodel Ġspace . ĠWe Ġneed Ġa Ġ 4 th ĊĠĠĠĠ Ġ* Ġcoordinate Ġso Ġwe Ġcan Ġget Ġtranslations Ġto Ġwork Ġwhen Ġwe Ġmultiply Ġthis Ġby ĊĠĠĠĠ Ġ* Ġour Ġtransformation Ġmatrices . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlight Pos In Model Space Ġ= Ġfloat ArrayOf ( 0 . 0 f , Ġ 0 . 0 f , Ġ 0 . 0 f , Ġ 1 . 0 f ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsed Ġto Ġhold Ġthe Ġcurrent Ġposition Ġof Ġthe Ġlight Ġin Ġworld Ġspace Ġ( after ĊĠĠĠĠ Ġ* Ġtransformation Ġvia Ġmodel Ġmatrix ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlight Pos In World Space Ġ= ĠFloat Array ( 4 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsed Ġto Ġhold Ġthe Ġtransformed Ġposition Ġof Ġthe Ġlight Ġin Ġeye Ġspace Ġ( after ĊĠĠĠĠ Ġ* Ġtransformation Ġvia Ġmodel view Ġmatrix ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlight Pos In Eye Space Ġ= ĠFloat Array ( 4 ) ĊĊĠĠĠ Ġ/** ĠThis Ġis Ġa Ġhandle Ġto Ġour Ġcube Ġsh ading Ġprogram . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġprogram : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĠRet ain Ġthe Ġmost Ġrecent Ġdelta Ġfor Ġtouch Ġevents . Ġ Ġ*/ ĊĠĠĠ Ġ// ĠThese Ġstill Ġwork Ġwithout Ġvolatile , Ġbut Ġref res hes Ġare Ġnot Ġguaranteed Ġto ĊĠĠĠ Ġ// Ġhappen . ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġdelta X : ĠFloat Ġ= Ġ 0 . toFloat () ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġdelta Y : ĠFloat Ġ= Ġ 0 . toFloat () ĊĊĠĠĠ Ġ/** ĠThe Ġcurrent Ġheight map Ġobject . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġheight Map : ĠHeight Map ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Created ( gl Unused : ĠGL 1 0 , Ġconfig : ĠE GL Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġheight Map Ġ= ĠHeight Map () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġbackground Ġclear Ġcolor Ġto Ġblack . ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Clear Color ( 0 . 0 f , Ġ 0 . 0 f , Ġ 0 . 0 f , Ġ 0 . 0 f ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnable Ġdepth Ġtesting ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable ( GLES 2 0 . GL _ DEPTH _ TEST ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPosition Ġthe Ġeye Ġin Ġfront Ġof Ġthe Ġorigin . ĊĠĠĠĠĠĠĠ Ġval Ġeye X Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġeye Y Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġeye Z Ġ= Ġ- 0 . 5 f ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġare Ġlooking Ġtoward Ġthe Ġdistance ĊĠĠĠĠĠĠĠ Ġval Ġlook X Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġlook Y Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġlook Z Ġ= Ġ- 5 . 0 f ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġour Ġup Ġvector . ĠThis Ġis Ġwhere Ġour Ġhead Ġwould Ġbe Ġpointing Ġwere Ġwe ĊĠĠĠĠĠĠĠ Ġ// Ġholding Ġthe Ġcamera . ĊĠĠĠĠĠĠĠ Ġval Ġup X Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġup Y Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġup Z Ġ= Ġ 0 . 0 f ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġview Ġmatrix . ĠThis Ġmatrix Ġcan Ġbe Ġsaid Ġto Ġrepresent Ġthe Ġcamera ĊĠĠĠĠĠĠĠ Ġ// Ġposition . ĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠIn ĠOpenGL Ġ 1 , Ġa ĠModel View Ġmatrix Ġis Ġused , Ġwhich Ġis Ġa Ġcombination ĊĠĠĠĠĠĠĠ Ġ// Ġof Ġa Ġmodel Ġand Ġview Ġmatrix . ĠIn ĠOpenGL Ġ 2 , Ġwe Ġcan Ġkeep Ġtrack Ġof Ġthese ĊĠĠĠĠĠĠĠ Ġ// Ġmatrices Ġseparately Ġif Ġwe Ġchoose . ĊĠĠĠĠĠĠĠ ĠMatrix . set Look At M ( view Matrix , Ġ 0 , Ġeye X , Ġeye Y , Ġeye Z , Ġlook X , Ġlook Y , Ġlook Z , Ġup X , Ġup Y , Ġup Z ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvertex Shader Ġ= ĠRaw Resource Reader . read Text File From Raw Resource ( lesson E ight Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . raw . per _ pixel _ vertex _ shader _ no _ tex ) ĊĠĠĠĠĠĠĠ Ġval Ġfragment Shader Ġ= ĠRaw Resource Reader . read Text File From Raw Resource ( lesson E ight Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . raw . per _ pixel _ fragment _ shader _ no _ tex ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvertex Shader Handle Ġ= ĠShader Helper . compile Shader ( GLES 2 0 . GL _ VERTEX _ SHADER , Ġvertex Shader !! ) ĊĠĠĠĠĠĠĠ Ġval Ġfragment Shader Handle Ġ= ĠShader Helper . compile Shader ( GLES 2 0 . GL _ FRAGMENT _ SHADER , Ġfragment Shader !! ) ĊĊĠĠĠĠĠĠĠ Ġprogram Ġ= ĠShader Helper . create And Link Program ( vertex Shader Handle , Ġfragment Shader Handle , ĠarrayOf ( POSITION _ ATTRIBUTE , ĠNORMAL _ ATTRIBUTE , ĠCOLOR _ ATTRIBUTE )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġthe Ġaccumulated Ġrotation Ġmatrix ĊĠĠĠĠĠĠĠ ĠMatrix . set Identity M ( acc umulated Rotation , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Changed ( gl Unused : ĠGL 1 0 , Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe ĠOpenGL Ġviewport Ġto Ġthe Ġsame Ġsize Ġas Ġthe Ġsurface . ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Viewport ( 0 , Ġ 0 , Ġwidth , Ġheight ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġnew Ġperspective Ġprojection Ġmatrix . ĠThe Ġheight Ġwill Ġstay Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġsame Ġwhile Ġthe Ġwidth Ġwill Ġvary Ġas Ġper Ġaspect Ġratio . ĊĠĠĠĠĠĠĠ Ġval Ġratio Ġ= Ġwidth . toFloat () Ġ/ Ġheight ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġ- ratio ĊĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġ- 1 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġnear Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠ Ġval Ġfar Ġ= Ġ 1 0 0 0 . 0 f ĊĊĠĠĠĠĠĠĠ ĠMatrix . fr ustum M ( projection Matrix , Ġ 0 , Ġleft , Ġratio , Ġbottom , Ġtop , Ġnear , Ġfar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw Frame ( gl Unused : ĠGL 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Clear ( GLES 2 0 . GL _ COLOR _ BUFFER _ BIT Ġor ĠGLES 2 0 . GL _ DEPTH _ BUFFER _ BIT ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġour Ġper - vertex Ġlight ing Ġprogram . ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Use Program ( program ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġprogram Ġhandles Ġfor Ġcube Ġdrawing . ĊĠĠĠĠĠĠĠ Ġm vp Matrix Uniform Ġ= ĠGLES 2 0 . glGet UniformLocation ( program , ĠM VP _ MATRIX _ UNIFORM ) ĊĠĠĠĠĠĠĠ Ġmv Matrix Uniform Ġ= ĠGLES 2 0 . glGet UniformLocation ( program , ĠMV _ MATRIX _ UNIFORM ) ĊĠĠĠĠĠĠĠ Ġlight Pos Uniform Ġ= ĠGLES 2 0 . glGet UniformLocation ( program , ĠLIGHT _ POSITION _ UNIFORM ) ĊĠĠĠĠĠĠĠ Ġposition Attribute Ġ= ĠGLES 2 0 . glGet Attrib Location ( program , ĠPOSITION _ ATTRIBUTE ) ĊĠĠĠĠĠĠĠ Ġnormal Attribute Ġ= ĠGLES 2 0 . glGet Attrib Location ( program , ĠNORMAL _ ATTRIBUTE ) ĊĠĠĠĠĠĠĠ Ġcolor Attribute Ġ= ĠGLES 2 0 . glGet Attrib Location ( program , ĠCOLOR _ ATTRIBUTE ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġposition Ġof Ġthe Ġlight . ĠPush Ġinto Ġthe Ġdistance . ĊĠĠĠĠĠĠĠ ĠMatrix . set Identity M ( light Model Matrix , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠMatrix . translate M ( light Model Matrix , Ġ 0 , Ġ 0 . 0 f , Ġ 7 . 5 f , Ġ- 8 . 0 f ) ĊĊĠĠĠĠĠĠĠ ĠMatrix . multiply MV ( light Pos In World Space , Ġ 0 , Ġlight Model Matrix , Ġ 0 , Ġlight Pos In Model Space , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠMatrix . multiply MV ( light Pos In Eye Space , Ġ 0 , Ġview Matrix , Ġ 0 , Ġlight Pos In World Space , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDraw Ġthe Ġheight map . ĊĠĠĠĠĠĠĠ Ġ// ĠTranslate Ġthe Ġheight map Ġinto Ġthe Ġscreen . ĊĠĠĠĠĠĠĠ ĠMatrix . set Identity M ( model Matrix , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠMatrix . translate M ( model Matrix , Ġ 0 , Ġ 0 . 0 f , Ġ 0 . 0 f , Ġ- 1 2 f ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġa Ġmatrix Ġthat Ġcontains Ġthe Ġcurrent Ġrotation . ĊĠĠĠĠĠĠĠ ĠMatrix . set Identity M ( current Rotation , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠMatrix . rotate M ( current Rotation , Ġ 0 , Ġdelta X , Ġ 0 . 0 f , Ġ 1 . 0 f , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠ ĠMatrix . rotate M ( current Rotation , Ġ 0 , Ġdelta Y , Ġ 1 . 0 f , Ġ 0 . 0 f , Ġ 0 . 0 f ) ĊĠĠĠĠĠĠĠ Ġdelta X Ġ= Ġ 0 . 0 f ĊĠĠĠĠĠĠĠ Ġdelta Y Ġ= Ġ 0 . 0 f ĊĊĠĠĠĠĠĠĠ Ġ// ĠMultiply Ġthe Ġcurrent Ġrotation Ġby Ġthe Ġaccumulated Ġrotation , Ġand Ġthen ĊĠĠĠĠĠĠĠ Ġ// Ġset Ġthe Ġaccumulated Ġrotation Ġto Ġthe Ġresult . ĊĠĠĠĠĠĠĠ ĠMatrix . multiply MM ( temporary Matrix , Ġ 0 , Ġcurrent Rotation , Ġ 0 , Ġaccumulated Rotation , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( temporary Matrix , Ġ 0 , Ġaccumulated Rotation , Ġ 0 , Ġ 1 6 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRotate Ġthe Ġcube Ġtaking Ġthe Ġoverall Ġrotation Ġinto Ġaccount . ĊĠĠĠĠĠĠĠ ĠMatrix . multiply MM ( temporary Matrix , Ġ 0 , Ġmodel Matrix , Ġ 0 , Ġaccumulated Rotation , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( temporary Matrix , Ġ 0 , Ġmodel Matrix , Ġ 0 , Ġ 1 6 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġmultip lies Ġthe Ġview Ġmatrix Ġby Ġthe Ġmodel Ġmatrix , Ġand Ġstores ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġresult Ġin Ġthe ĠM VP Ġmatrix ĊĠĠĠĠĠĠĠ Ġ// Ġ( which Ġcurrently Ġcontains Ġmodel Ġ* Ġview ). ĊĠĠĠĠĠĠĠ ĠMatrix . multiply MM ( mvp Matrix , Ġ 0 , Ġview Matrix , Ġ 0 , Ġmodel Matrix , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPass Ġin Ġthe Ġmodel view Ġmatrix . ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform Matrix 4 fv ( mv Matrix Uniform , Ġ 1 , Ġfalse , Ġm vp Matrix , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġmultip lies Ġthe Ġmodel view Ġmatrix Ġby Ġthe Ġprojection Ġmatrix , ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġstores Ġthe Ġresult Ġin Ġthe ĠM VP Ġmatrix ĊĠĠĠĠĠĠĠ Ġ// Ġ( which Ġnow Ġcontains Ġmodel Ġ* Ġview Ġ* Ġprojection ). ĊĠĠĠĠĠĠĠ ĠMatrix . multiply MM ( temporary Matrix , Ġ 0 , Ġprojection Matrix , Ġ 0 , Ġm vp Matrix , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( temporary Matrix , Ġ 0 , Ġm vp Matrix , Ġ 0 , Ġ 1 6 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPass Ġin Ġthe Ġcombined Ġmatrix . ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform Matrix 4 fv ( mvp Matrix Uniform , Ġ 1 , Ġfalse , Ġm vp Matrix , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPass Ġin Ġthe Ġlight Ġposition Ġin Ġeye Ġspace . ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform 3 f ( light Pos Uniform , Ġlight Pos In Eye Space [ 0 ], Ġlight Pos In Eye Space [ 1 ], Ġlight Pos In Eye Space [ 2 ]) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRender Ġthe Ġheight map . ĊĠĠĠĠĠĠĠ Ġheight Map !!. render () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġinner Ġclass ĠHeight Map Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġv bo Ġ= ĠInt Array ( 1 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġi bo Ġ= ĠInt Array ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġindex Count : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfloats Per Vertex Ġ= Ġ( POSITION _ DATA _ SIZE _ IN _ ELEMENT S Ġ+ ĠNORMAL _ DATA _ SIZE _ IN _ ELEMENT S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠCOLOR _ DATA _ SIZE _ IN _ ELEMENT S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Length Ġ= ĠSIZE _ PER _ SIDE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Length Ġ= ĠSIZE _ PER _ SIDE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Map Vertex Data Ġ= ĠFloat Array ( x Length Ġ* Ġy Length Ġ* Ġfloats Per Vertex ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġoffset Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst , Ġbuild Ġthe Ġdata Ġfor Ġthe Ġvertex Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġy Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġx Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ratio Ġ= Ġx Ġ/ Ġ( x Length Ġ- Ġ 1 ). toFloat () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBuild Ġour Ġheight map Ġfrom Ġthe Ġtop Ġdown , Ġso Ġthat Ġour Ġtriangles Ġare Ġcounter - clock wise . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ratio Ġ= Ġ 1 f Ġ- Ġy Ġ/ Ġ( y Length Ġ- Ġ 1 ). toFloat () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Position Ġ= ĠMIN _ POSITION Ġ+ Ġx Ratio Ġ* ĠPOSITION _ RANGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Position Ġ= ĠMIN _ POSITION Ġ+ Ġy Ratio Ġ* ĠPOSITION _ RANGE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPosition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data [ offset ++] Ġ= Ġx Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data [ offset ++] Ġ= Ġy Position ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data [ offset ++] Ġ= Ġ( x Position Ġ* Ġx Position Ġ+ Ġy Position Ġ* Ġy Position ) Ġ/ Ġ 1 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChe ap Ġnormal Ġusing Ġa Ġderivative Ġof Ġthe Ġfunction . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġslope Ġfor ĠX Ġwill Ġbe Ġ 2 X , Ġfor ĠY Ġwill Ġbe Ġ 2 Y . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDiv ide Ġby Ġ 1 0 Ġsince Ġthe Ġposition 's ĠZ Ġis Ġalso Ġdivided Ġby Ġ 1 0 . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx S lope Ġ= Ġ 2 Ġ* Ġx Position Ġ/ Ġ 1 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy S lope Ġ= Ġ 2 Ġ* Ġy Position Ġ/ Ġ 1 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġnormal Ġusing Ġthe Ġcross Ġproduct Ġof Ġthe Ġslo pes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplane Vector X Ġ= Ġfloat ArrayOf ( 1 f , Ġ 0 f , Ġx S lope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplane Vector Y Ġ= Ġfloat ArrayOf ( 0 f , Ġ 1 f , Ġy S lope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal Vector Ġ= Ġfloat ArrayOf ( plane Vector X [ 1 ] Ġ* Ġplane Vector Y [ 2 ] Ġ- Ġplane Vector X [ 2 ] Ġ* Ġplane Vector Y [ 1 ], Ġplane Vector X [ 2 ] Ġ* Ġplane Vector Y [ 0 ] Ġ- Ġplane Vector X [ 0 ] Ġ* Ġplane Vector Y [ 2 ], Ġplane Vector X [ 0 ] Ġ* Ġplane Vector Y [ 1 ] Ġ- Ġplane Vector X [ 1 ] Ġ* Ġplane Vector Y [ 0 ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNormalize Ġthe Ġnormal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= ĠMatrix . length ( normal Vector [ 0 ], Ġnormal Vector [ 1 ], Ġnormal Vector [ 2 ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data [ offset ++] Ġ= Ġnormal Vector [ 0 ] Ġ/ Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data [ offset ++] Ġ= Ġnormal Vector [ 1 ] Ġ/ Ġlength ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data [ offset ++] Ġ= Ġnormal Vector [ 2 ] Ġ/ Ġlength ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġsome Ġfancy Ġcolors . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data [ offset ++] Ġ= Ġx Ratio ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data [ offset ++] Ġ= Ġy Ratio ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data [ offset ++] Ġ= Ġ 0 . 5 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data [ offset ++] Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNow Ġbuild Ġthe Ġindex Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum Stri ps Required Ġ= Ġy Length Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnum De gens Required Ġ= Ġ 2 Ġ* Ġ( num Stri ps Required Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertices Per Strip Ġ= Ġ 2 Ġ* Ġx Length ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Map Index Data Ġ= ĠShort Array ( vertices Per Strip Ġ* Ġnum Stri ps Required Ġ+ Ġnum De gens Required ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( y Ġin Ġ 0 Ġuntil Ġy Length Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDe generate Ġbegin : Ġrepeat Ġfirst Ġvertex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Index Data [ offset ++] Ġ= Ġ( y Ġ* Ġy Length ). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġx Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOne Ġpart Ġof Ġthe Ġstrip ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Index Data [ offset ++] Ġ= Ġ( y Ġ* Ġy Length Ġ+ Ġx ). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Index Data [ offset ++] Ġ= Ġ(( y Ġ+ Ġ 1 ) Ġ* Ġy Length Ġ+ Ġx ). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( y Ġ< Ġy Length Ġ- Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDe generate Ġend : Ġrepeat Ġlast Ġvertex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Index Data [ offset ++] Ġ= Ġ(( y Ġ+ Ġ 1 ) Ġ* Ġy Length Ġ+ Ġ( x Length Ġ- Ġ 1 )). to Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Count Ġ= Ġheight Map Index Data . size ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Map Vertex Data Buffer Ġ= ĠByteBuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. allocate Direct ( height Map Vertex Data . size Ġ* ĠBY TES _ PER _ FLOAT ). order ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Float Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data Buffer . put ( height Map Vertex Data ). position ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Map Index Data Buffer Ġ= ĠByteBuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. allocate Direct ( height Map Index Data . size Ġ* ĠBY TES _ PER _ SHORT ). order ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Short Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Index Data Buffer . put ( height Map Index Data ). position ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Gen Buffers ( 1 , Ġv bo , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Gen Buffers ( 1 , Ġi bo , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v bo [ 0 ] Ġ> Ġ 0 Ġ&& Ġi bo [ 0 ] Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġv bo [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl BufferData ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġheight Map Vertex Data Buffer . capacity () Ġ* ĠBY TES _ PER _ FLOAT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Map Vertex Data Buffer , ĠGLES 2 0 . GL _ STATIC _ DRAW ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ELEMENT _ ARRAY _ BUFFER , Ġi bo [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl BufferData ( GLES 2 0 . GL _ ELEMENT _ ARRAY _ BUFFER , Ġheight Map Index Data Buffer . capacity () Ġ* ĠBY TES _ PER _ SHORT , Ġheight Map Index Data Buffer , ĠGLES 2 0 . GL _ STATIC _ DRAW ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ELEMENT _ ARRAY _ BUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorHandler . handleError ( ErrorType . BUFFER _ CRE ATION _ ERROR , Ġ" gl Gen Buffers ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( t , Ġ" Error Ġwhile Ġbuilding ĠHeight Map ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorHandler . handleError ( ErrorType . BUFFER _ CRE ATION _ ERROR , Ġt . localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrender () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v bo [ 0 ] Ġ> Ġ 0 Ġ&& Ġi bo [ 0 ] Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġv bo [ 0 ]) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBind ĠAttributes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( position Attribute , ĠPOSITION _ DATA _ SIZE _ IN _ ELEMENT S , ĠGLES 2 0 . GL _ FLOAT , Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTR IDE , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( position Attribute ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( normal Attribute , ĠNORMAL _ DATA _ SIZE _ IN _ ELEMENT S , ĠGLES 2 0 . GL _ FLOAT , Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTR IDE , ĠPOSITION _ DATA _ SIZE _ IN _ ELEMENT S Ġ* ĠBY TES _ PER _ FLOAT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( normal Attribute ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( color Attribute , ĠCOLOR _ DATA _ SIZE _ IN _ ELEMENT S , ĠGLES 2 0 . GL _ FLOAT , Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTR IDE , Ġ( POSITION _ DATA _ SIZE _ IN _ ELEMENT S Ġ+ ĠNORMAL _ DATA _ SIZE _ IN _ ELEMENT S ) Ġ* ĠBY TES _ PER _ FLOAT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( color Attribute ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDraw ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ELEMENT _ ARRAY _ BUFFER , Ġi bo [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Draw Elements ( GLES 2 0 . GL _ TRI ANGLE _ STRIP , Ġindex Count , ĠGLES 2 0 . GL _ UNSIGNED _ SHORT , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ELEMENT _ ARRAY _ BUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v bo [ 0 ] Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Delete Buffers ( v bo . size , Ġv bo , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv bo [ 0 ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i bo [ 0 ] Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Delete Buffers ( i bo . size , Ġi bo , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi bo [ 0 ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSIZE _ PER _ SIDE Ġ= Ġ 3 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMIN _ POSITION Ġ= Ġ- 5 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ RANGE Ġ= Ġ 1 0 f ĊĊĠĠĠĠĠĠĠ Ġ/** ĠIdent ifiers Ġfor Ġour Ġuniform s Ġand Ġattributes Ġinside Ġthe Ġshaders . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠM VP _ MATRIX _ UNIFORM Ġ= Ġ" u _ M VP Matrix " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMV _ MATRIX _ UNIFORM Ġ= Ġ" u _ MV Matrix " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLIGHT _ POSITION _ UNIFORM Ġ= Ġ" u _ Light Pos " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ ATTRIBUTE Ġ= Ġ" a _ Position " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNORMAL _ ATTRIBUTE Ġ= Ġ" a _ Normal " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOLOR _ ATTRIBUTE Ġ= Ġ" a _ Color " ĊĊĠĠĠĠĠĠĠ Ġ/** ĠAdditional Ġconstants . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ DATA _ SIZE _ IN _ ELEMENT S Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠNORMAL _ DATA _ SIZE _ IN _ ELEMENT S Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOLOR _ DATA _ SIZE _ IN _ ELEMENT S Ġ= Ġ 4 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBY TES _ PER _ FLOAT Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBY TES _ PER _ SHORT Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTR IDE Ġ= Ġ( POSITION _ DATA _ SIZE _ IN _ ELEMENT S Ġ+ ĠNORMAL _ DATA _ SIZE _ IN _ ELEMENT S Ġ+ ĠCOLOR _ DATA _ SIZE _ IN _ ELEMENT S ) Ġ* ĠBY TES _ PER _ FLOAT ĊĠĠĠ Ġ} Ċ } Ċ