/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 2 1 ĠB am mell ab Ġ/ ĠJames ĠAnd reas Ċ Ġ* Ġ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* ĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ġ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* Ġ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġ Ġlimitations Ġunder Ġthe ĠLicense Ċ Ġ*/ Ċ Ċ @ file : Suppress ( ĊĠĠĠĠĠĠĠ Ġ" unused ", ĊĠĠĠĠĠĠĠ Ġ" unused _ variable ", ĊĠĠĠĠĠĠĠ Ġ" unused _ parameter ", ĊĠĠĠĠĠĠĠ Ġ" unused _ property ", ĊĠĠĠĠĠĠĠ Ġ" deprecation ", ĊĠĠĠĠĠĠĠ Ġ" Constant Condition If ", ĊĠĠĠĠĠĠĠ Ġ" Local Variable Name ", ĊĠĠĠĠĠĠĠ Ġ" PropertyName ") Ċ Ċ package Ġcom . bam mell ab . mol lib . objects Ċ Ċ import Ġandroid . opengl . GLES 2 0 Ċ import Ġcom . bam mell ab . mol lib . common . math . Fast Sin Cos Ċ import Ġcom . bam mell ab . mol lib . common . math . Mot m Vector 3 Ċ import Ġcom . bam mell ab . mol lib . objects . Global Object . BR IGHT NESS _ FACTOR Ċ import Ġcom . kot mol . pdb Parser . K ot mol Vector 3 Ċ import Ġcom . kot mol . pdb Parser . M olecule Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . Byte Order Ċ Ċ /* Ċ Ġ* ĠBackbone Ġsegment Ġ- Ġjust Ġa Ġcy linder Ġwith Ġnormalized Ġ( orth ogonal ) Ġends Ġ( no Ġend Ġcaps Ġyet ) Ċ Ġ*/ Ċ class ĠSegment Back bone Direct ( private Ġval Ġm Mol : ĠM olecule ) Ġ{ ĊĠĠĠ Ġ// Ġprivate Ġstatic Ġfinal Ġfloat ĠEL LI PSE _ X _ FACTOR Ġ= Ġ 2 f Ġ/ Ġ 9 f ; ĊĊĠĠĠ Ġprivate Ġvar Ġnum Indices Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġcy linder Index Count : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfloat Data : ĠFloat Array ĊĠĠĠ Ġprivate Ġvar Ġm Offset : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġv bo Ġ= ĠInt Array ( 1 ) ĊĠĠĠ Ġinternal Ġval Ġi bo Ġ= ĠInt Array ( 1 ) ĊĊĠĠĠ Ġ// ĠTODO : Ġ Ġwork Ġon Ġcolor Ġfor Ġatom Ġends Ġand Ġhalf - way Ġin Ġthe Ġconnection ĊĊĠĠĠ Ġfun Ġgen Back bone Segment ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum S lices : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradius : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Start In : ĠK ot mol Vector 3 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition End In : ĠK ot mol Vector 3 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor : ĠFloat Array ) Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġval Ġposition Start Ġ= ĠMot m Vector 3 ( position Start In ) ĊĠĠĠĠĠĠĠ Ġval Ġposition End Ġ= ĠMot m Vector 3 ( position End In ) ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* ĠTODO : Ġscaling Ġof Ġbrightness Ġrelative Ġto Ġsize Ġ( normals Ġare Ġscaled Ġdown Ġwith Ġthe Ġmolecule !! ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġnormal _ brightness _ factor Ġ= Ġ( m Mol . max Post Center ing Vector Magnitude Ġ/ ĠB RIGHT NESS _ FACTOR ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 Ċ // ĠĠĠĠĠĠĠ Ġval Ġj : ĠInt Ċ // ĠĠĠĠĠĠĠ Ġval Ġend _ color Ġ= Ġcolor ĊĊĠĠĠĠĠĠĠ Ġ// Ġdebugging ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġposition _ start . x Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġposition _ start . y Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġposition _ start . z Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġposition _ end . x Ġ= Ġ 0 ; ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġposition _ end . y Ġ= Ġ 1 ; ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġposition _ end . z Ġ= Ġ 0 ; ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* Ġcalculate Ġtwo Ġvectors Ġthat Ġare Ġnormal Ġto Ġour Ġback bone Ġsegment Ġ- ĠR Ġand ĠS . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġp 1 p 2 Ġ= ĠMot m Vector 3 () ĊĠĠĠĠĠĠĠ Ġp 1 p 2 . set All ( position End ) ĊĠĠĠĠĠĠĠ Ġp 1 p 2 . subtract ( position Start ) ĊĠĠĠĠĠĠĠ Ġval ĠP Ġ= ĠMot m Vector 3 ( Math . random (). toFloat (), ĠMath . random (). toFloat (), ĠMath . random (). toFloat ()) ĊĠĠĠĠĠĠĠ Ġval ĠR Ġ= ĠMot m Vector 3 ( p 1 p 2 ) ĊĠĠĠĠĠĠĠ ĠR . cross ( P ) ĊĠĠĠĠĠĠĠ Ġval ĠS Ġ= ĠMot m Vector 3 ( R ) ĊĠĠĠĠĠĠĠ ĠS . cross ( p 1 p 2 ) ĊĠĠĠĠĠĠĠ ĠR . normalize () ĊĠĠĠĠĠĠĠ ĠS . normalize () ĊĊĠĠĠĠĠĠĠ Ġvar Ġx 1 : ĠFloat ĊĠĠĠĠĠĠĠ Ġvar Ġy 1 : ĠFloat ĊĠĠĠĠĠĠĠ Ġvar Ġz 1 : ĠFloat ĊĠĠĠĠĠĠĠ Ġvar Ġx 2 : ĠFloat ĊĠĠĠĠĠĠĠ Ġvar Ġy 2 : ĠFloat ĊĠĠĠĠĠĠĠ Ġvar Ġz 2 : ĠFloat ĊĊĠĠĠĠĠĠĠ Ġ// Ġval Ġangle Step Ġ= Ġ 2 . 0 f Ġ* ĠMath . PI . toFloat () Ġ/ Ġnum S lices ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* Ġmath : Ġtwo Ġtr is Ġper Ġslice , Ġwrapping Ġfor Ġnum S lices + 1 Ġ( hit Ġoriginal Ġagain Ġto Ġclose ) ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠ Ġdouble d Ġfor Ġtwo Ġcolors Ġon Ġeach Ġhalf ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfloat Data Ġ= ĠFloat Array ( 6 Ġ* Ġ( num S lices Ġ+ Ġ 1 ) Ġ* ĠSTR IDE _ IN _ FLOAT S ) ĊĠĠĠĠĠĠĠ Ġm Offset Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠ Ġ* Ġfirst Ġgenerate Ġthe Ġpoints , Ġthen Ġmap Ġthem Ġto Ġthe Ġposition ĊĠĠĠĠĠĠĠĠ Ġ* Ġ( 1 ) Ġversion Ġ 1 ĊĠĠĠĠĠĠĠĠ Ġ* Ġ( 2 ) Ġversion Ġ 2 Ġ- Ġshould Ġtransform Ġthe Ġplane ĊĠĠĠĠĠĠĠĠ Ġ* Ġ( 3 ) Ġversion Ġ 3 Ġ- Ġbased Ġon Ġa Ġspline Ġcalculation ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= ĠFloat Array ( 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= ĠFloat Array ( 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġp 3 Ġ= ĠFloat Array ( 3 ) ĊĠĠĠĠĠĠĠ Ġvar Ġn : ĠFloat Array ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ<= Ġnum S lices ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġfix Ġnumber Ġof Ġslices Ġand Ġgenerate Ġsin / cos Ġlookup Ġtable ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle In Radians 1 Ġ= Ġi . toFloat () Ġ/ Ġnum S lices . toFloat () Ġ* Ġ( Math . PI . toFloat () Ġ* Ġ 2 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle In Radians 2 Ġ= Ġ( i Ġ+ Ġ 1 ). toFloat () Ġ/ Ġnum S lices . toFloat () Ġ* Ġ( Math . PI . toFloat () Ġ* Ġ 2 f ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 1 Ġ= Ġradius Ġ* ĠFast Sin Cos . sin ( angle In Radians 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs 2 Ġ= Ġradius Ġ* ĠFast Sin Cos . sin ( angle In Radians 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 1 Ġ= Ġradius Ġ* ĠFast Sin Cos . cos ( angle In Radians 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 2 Ġ= Ġradius Ġ* ĠFast Sin Cos . cos ( angle In Radians 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġno Ġmid Ġpoint ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfirst Ġtop Ġpoint ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġx 1 Ġ= ĠR . x Ġ* Ġc 1 Ġ+ ĠS . x Ġ* Ġs 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy 1 Ġ= ĠR . y Ġ* Ġc 1 Ġ+ ĠS . y Ġ* Ġs 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz 1 Ġ= ĠR . z Ġ* Ġc 1 Ġ+ ĠS . z Ġ* Ġs 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 1 [ 0 ] Ġ= Ġ( x 1 Ġ+ Ġposition End . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 1 [ 1 ] Ġ= Ġ( y 1 Ġ+ Ġposition End . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 1 [ 2 ] Ġ= Ġ( z 1 Ġ+ Ġposition End . z ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfirst Ġbottom Ġpoint ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 2 [ 0 ] Ġ= Ġ( x 1 Ġ+ Ġposition Start . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 2 [ 1 ] Ġ= Ġ( y 1 Ġ+ Ġposition Start . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 2 [ 2 ] Ġ= Ġ( z 1 Ġ+ Ġposition Start . z ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSE COND ĠBOTTOM Ġpoint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx 2 Ġ= ĠR . x Ġ* Ġc 2 Ġ+ ĠS . x Ġ* Ġs 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy 2 Ġ= ĠR . y Ġ* Ġc 2 Ġ+ ĠS . y Ġ* Ġs 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz 2 Ġ= ĠR . z Ġ* Ġc 2 Ġ+ ĠS . z Ġ* Ġs 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 3 [ 0 ] Ġ= Ġ( x 2 Ġ+ Ġposition Start . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 3 [ 1 ] Ġ= Ġ( y 2 Ġ+ Ġposition Start . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 3 [ 2 ] Ġ= Ġ( z 2 Ġ+ Ġposition Start . z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOK Ġthat Ġis Ġone Ġtriangle . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= ĠX YZ . get Normal ( p 1 , Ġp 2 , Ġp 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Tri ( p 1 , Ġp 2 , Ġp 3 , Ġn , Ġcolor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSE COND Ġtriangle ĠNOW ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfirst Ġtop Ġpoint ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 1 [ 0 ] Ġ= Ġ( x 1 Ġ+ Ġposition End . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 1 [ 1 ] Ġ= Ġ( y 1 Ġ+ Ġposition End . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 1 [ 2 ] Ġ= Ġ( z 1 Ġ+ Ġposition End . z ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSE COND ĠBOTTOM Ġpoint ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 2 [ 0 ] Ġ= Ġ( x 2 Ġ+ Ġposition Start . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 2 [ 1 ] Ġ= Ġ( y 2 Ġ+ Ġposition Start . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 2 [ 2 ] Ġ= Ġ( z 2 Ġ+ Ġposition Start . z ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSE COND Ġtop Ġpoint ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġx 2 Ġ= ĠR . x Ġ* Ġc 2 Ġ+ ĠS . x Ġ* Ġs 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġy 2 Ġ= ĠR . y Ġ* Ġc 2 Ġ+ ĠS . y Ġ* Ġs 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġz 2 Ġ= ĠR . z Ġ* Ġc 2 Ġ+ ĠS . z Ġ* Ġs 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 3 [ 0 ] Ġ= Ġ( x 2 Ġ+ Ġposition End . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 3 [ 1 ] Ġ= Ġ( y 2 Ġ+ Ġposition End . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp 3 [ 2 ] Ġ= Ġ( z 2 Ġ+ Ġposition End . z ) ĊĊ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġn Ġ= ĠX YZ . get Normal ( p 1 , Ġp 2 , Ġp 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Tri ( p 1 , Ġp 2 , Ġp 3 , Ġn , Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĊĊĠĠĠĠĠĠĠ Ġ} Ġ Ġ// Ġend Ġfor Ġloop Ġfor Ġbody ĊĊĠĠĠĠĠĠĠ Ġnum Indices Ġ= Ġm Offset ĊĊĠĠĠĠĠĠĠ Ġval Ġvertex Data Buffer Ġ= ĠByteBuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. allocate Direct ( float Data . size Ġ* ĠBY TES _ PER _ FLOAT ). order ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Float Buffer () ĊĠĠĠĠĠĠĠ Ġvertex Data Buffer . put ( float Data ). position ( 0 ) ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Gen Buffers ( 1 , Ġv bo , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( v 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 , Ġvertex Data Buffer . capacity () Ġ* ĠBY TES _ PER _ FLOAT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Data Buffer , ĠGLES 2 0 . GL _ STATIC _ DRAW ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠerrorHandler . handleError ( ErrorHandler . ErrorType . BUFFER _ CRE ATION _ ERROR , Ġ" gl Gen Buffers "); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" error Ġon Ġbuffer Ġgen ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Attribute : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Attribute : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Attribute : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Wire frame Rendering : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Disable ( GLES 2 0 . GL _ C ULL _ FACE ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( v bo [ 0 ] Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġv bo [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġassociate Ġthe Ġattributes Ġwith Ġthe Ġbound Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( position Attribute , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ DATA _ SIZE _ IN _ ELEMENT S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ FLOAT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTR IDE _ IN _ BYTES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ) Ġ Ġ// Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 _ IN _ BYTES , Ġ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 _ IN _ BYTES , Ġ( 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 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtodo Ġ= Ġif Ġ( do Wire frame Rendering ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ LINES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ TRI ANG LES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Draw Arrays ( todo , Ġ 0 , Ġnum Indices ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . glBind Buffer ( GLES 2 0 . GL _ ARRAY _ BUFFER , Ġ 0 ) Ġ Ġ// Ġrelease ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠerrorHandler ( // Ġdo Ġsomething Ġ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" buffer Ġmanager Ġrender : Ġnull Ġbuffer ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable ( GLES 2 0 . GL _ C ULL _ FACE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( v bo [ 0 ] Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Delete Buffers ( v bo . size , Ġv bo , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv bo [ 0 ] Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġput Tri ( p 1 : ĠFloat Array , Ġp 2 : ĠFloat Array , Ġp 3 : ĠFloat Array , Ġn : ĠFloat Array , Ġcolor : ĠFloat Array ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġn [ 0 ] Ġ*= Ġ- normal _ brightness _ factor ĊĠĠĠĠĠĠĠ Ġn [ 1 ] Ġ*= Ġ- normal _ brightness _ factor ĊĠĠĠĠĠĠĠ Ġn [ 2 ] Ġ*= Ġ- normal _ brightness _ factor ĊĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġp 1 [ 0 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġp 1 [ 1 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġp 1 [ 2 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġn [ 0 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġn [ 1 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġn [ 2 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 0 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 1 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 2 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 3 ] ĊĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġp 2 [ 0 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġp 2 [ 1 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġp 2 [ 2 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġn [ 0 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġn [ 1 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġn [ 2 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 0 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 1 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 2 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 3 ] ĊĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġp 3 [ 0 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġp 3 [ 1 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġp 3 [ 2 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġn [ 0 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġn [ 1 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġn [ 2 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 0 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 1 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 2 ] ĊĠĠĠĠĠĠĠ Ġfloat Data [ m Offset ++] Ġ= Ġcolor [ 3 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ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 _ IN _ FLOAT S Ġ= ĠPOSITION _ DATA _ SIZE _ IN _ ELEMENT S Ġ+ ĠNORMAL _ DATA _ SIZE _ IN _ ELEMENT S Ġ+ ĠCOLOR _ DATA _ SIZE _ IN _ ELEMENT S ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTR IDE _ IN _ BYTES Ġ= ĠSTR IDE _ IN _ FLOAT S Ġ* ĠBY TES _ PER _ FLOAT ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġnormal _ brightness _ factor Ġ= Ġ 1 0 f ĊĠĠĠ Ġ} ĊĊ Ċ }