package Ġcom . m ili . gl canvas . demo Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . opengl . GLES 2 0 Ċ import Ġandroid . opengl . GL Surface View Ċ import Ġandroid . opengl . Matrix Ċ import Ġcom . m ili . gl canvas . demo . extensions . dp 2 px Ċ import Ġcom . m ili . gl canvas . demo . extensions . read Resource Text Ċ import Ġcom . m ili . gl canvas . demo . utils . compile Fragment Shader Ċ import Ġcom . m ili . gl canvas . demo . utils . compile Vertex Shader Ċ import Ġcom . m ili . gl canvas . demo . utils . link Program Ċ import Ġcom . m ili . gl canvas . demo . utils . validate Program Ċ 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 Ċ Ċ class ĠCanvas Render ( private Ġval Ġcontext : ĠContext ) Ġ: ĠGL Surface View . Renderer Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠBY TES _ PER _ FLOAT Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPOSITION _ COMPONENT _ COUNT Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCOLOR _ COMPONENT _ COUNT Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTR IDE Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( POSITION _ COMPONENT _ COUNT Ġ+ ĠCOLOR _ COMPONENT _ COUNT ) Ġ* ĠBY TES _ PER _ FLOAT ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠA _ POSITION Ġ= Ġ" a _ Position " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠA _ COLOR Ġ= Ġ" a _ Color " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠU _ MATRIX Ġ= Ġ" u _ Matrix " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġvertices Ġ= Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠ Ġ// ĠX , ĠY , ĠR , ĠG , ĠB ĊĠĠĠĠĠĠĠ Ġ- 2 . 5 f , Ġ- 1 f , Ġ 1 f , Ġ 0 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠ 2 . 5 f , Ġ- 1 f , Ġ 0 f , Ġ 1 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠ 2 . 5 f , Ġ 1 f , Ġ 0 f , Ġ 0 f , Ġ 1 f , ĊĠĠĠĠĠĠĠ Ġ- 2 . 5 f , Ġ 1 f , Ġ 1 f , Ġ 1 f , Ġ 0 f ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġvertex Data Ġ= ĠByteBuffer ĊĠĠĠĠĠĠĠ Ġ. allocate Direct ( vertices . size Ġ* ĠBY TES _ PER _ FLOAT ) ĊĠĠĠĠĠĠĠ Ġ. order ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠ Ġ. as Float Buffer () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġvertex Data . put ( vertices ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġprogram : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġa Position Location : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġa Color Location : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġu Matrix Location : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġprojection Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĠĠĠ Ġprivate Ġvar Ġmodel Matrix Ġ= ĠFloat Array ( 1 6 ) ĊĠĠĠ Ġprivate Ġvar Ġwidth : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġheight : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Created ( gl : ĠGL 1 0 ?, Ġconfig : ĠE GL Config ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Clear Color ( 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġ// Ġ è¯»åıĸ é¡¶ çĤ¹ çĿĢ èī² åĻ¨ ãĢģ çīĩ æ®µ çĿĢ èī² åĻ¨ ç¨ĭåºı ĊĠĠĠĠĠĠĠ Ġval Ġvertex Shader Source Ġ= Ġcontext . read Resource Text ( R . raw . simple _ vertex _ shader ) ĊĠĠĠĠĠĠĠ Ġval Ġfragment Shader Source Ġ= Ġcontext . read Resource Text ( R . raw . simple _ fragment _ shader ) ĊĠĠĠĠĠĠĠ Ġ// Ġ ç¼ĸè¯ĳ çĿĢ èī² åĻ¨ ĊĠĠĠĠĠĠĠ Ġval Ġvertex Shader Ġ= Ġcompile Vertex Shader ( vertex Shader Source ) ĊĠĠĠĠĠĠĠ Ġval Ġfragment Shader Ġ= Ġcompile Fragment Shader ( fragment Shader Source ) ĊĠĠĠĠĠĠĠ Ġ// Ġ éĵ¾æİ¥ çĿĢ èī² åĻ¨ ä¸º ç¨ĭåºı ĊĠĠĠĠĠĠĠ Ġprogram Ġ= Ġlink Program ( vertex Shader , Ġfragment Shader ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Program ( program ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġä½¿çĶ¨ ç¨ĭåºı ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Use Program ( program ) ĊĠĠĠĠĠĠĠ Ġ// Ġ å®ļä½į a _ Color ãĢģ a _ Position ĊĠĠĠĠĠĠĠ Ġa Color Location Ġ= ĠGLES 2 0 . glGet Attrib Location ( program , ĠA _ COLOR ) ĊĠĠĠĠĠĠĠ Ġa Position Location Ġ= ĠGLES 2 0 . glGet Attrib Location ( program , ĠA _ POSITION ) ĊĠĠĠĠĠĠĠ Ġu Matrix Location Ġ= ĠGLES 2 0 . glGet UniformLocation ( program , ĠU _ MATRIX ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( a Color Location ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Enable VertexAttrib Array ( a Position Location ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Changed ( gl : ĠGL 1 0 ?, Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Viewport ( 0 , Ġ 0 , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠ Ġthis . width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġthis . height Ġ= Ġheight ĊĠĠĠĠĠĠĠ ĠMatrix . set Identity M ( model Matrix , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠMatrix . scale M ( model Matrix , Ġ 0 , Ġ 2 f Ġ/ Ġwidth . toFloat (), Ġ- 2 f Ġ/ Ġheight . toFloat (), Ġ 1 f ) ĊĠĠĠĠĠĠĠ ĠMatrix . translate M ( model Matrix , Ġ 0 , Ġ- width . toFloat () Ġ/ Ġ 2 , Ġ- height . toFloat () Ġ/ Ġ 2 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( model Matrix , Ġ 0 , Ġprojection Matrix , Ġ 0 , Ġmodel Matrix . size ) ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ġ> Ġheight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġaspect Ratio Ġ= Ġwidth . toFloat () Ġ/ Ġheight . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatrix . orth o M ( projection Matrix , Ġ 0 , Ġ- aspect Ratio , Ġaspect Ratio , Ġ- 1 f , Ġ 1 f , Ġ- 1 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatrix . scale M ( model Matrix , Ġ 0 , Ġ 1 f Ġ/ Ġheight , Ġ 1 f Ġ/ Ġheight . toFloat (), Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġaspect Ratio Ġ= Ġheight . toFloat () Ġ/ Ġwidth . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatrix . orth o M ( projection Matrix , Ġ 0 , Ġ- 1 f , Ġ 1 f , Ġ- aspect Ratio , Ġaspect Ratio , Ġ- 1 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMatrix . scale M ( model Matrix , Ġ 0 , Ġ 1 f Ġ/ Ġwidth . toFloat (), Ġ 1 f Ġ/ Ġwidth . toFloat (), Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġval Ġtemp Ġ= ĠFloat Array ( 1 6 ) ĊĠĠĠĠĠĠĠ Ġ// ĠMatrix . multiply MM ( temp , Ġ 0 , Ġprojection Matrix , Ġ 0 , Ġmodel Matrix , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// ĠSystem . arraycopy ( temp , Ġ 0 , Ġprojection Matrix , Ġ 0 , Ġtemp . size ) ĊĠĠĠĠĠĠĠ Ġ// Ġdraw Something () ĊĠĠĠĠĠĠĠ Ġ// Ġ å¡« åħħ é¡¶ çĤ¹ æķ°æį® ĊĠĠĠĠĠĠĠ Ġ// Ġvertex Data . position ( 0 ) ĊĠĠĠĠĠĠĠ Ġ// ĠGLES 2 0 . glVertex Attrib Pointer ( ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġa Position Location , ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠPOSITION _ COMPONENT _ COUNT , ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠGLES 2 0 . GL _ FLOAT , ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠSTR IDE , ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġvertex Data ĊĠĠĠĠĠĠĠ Ġ// Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġ// Ġ å¡« åħħ é¢ľèī² æķ°æį® ĊĠĠĠĠĠĠĠ Ġ// Ġvertex Data . position ( POSITION _ COMPONENT _ COUNT ) ĊĠĠĠĠĠĠĠ Ġ// ĠGLES 2 0 . glVertex Attrib Pointer ( ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġa Color Location , ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠCOLOR _ COMPONENT _ COUNT , ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠGLES 2 0 . GL _ FLOAT , ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ ĠSTR IDE , ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġvertex Data ĊĠĠĠĠĠĠĠ Ġ// Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġ æŃ£ äº¤ æĬķ å½± ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Uniform Matrix 4 fv ( u Matrix Location , Ġ 1 , Ġfalse , Ġprojection Matrix , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw Frame ( gl : ĠGL 1 0 ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Clear ( GLES 2 0 . GL _ COLOR _ BUFFER _ BIT ) ĊĠĠĠĠĠĠĠ Ġdraw Something () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġstep Ġ= Ġ 2 f ĊĠĠĠ Ġprivate Ġval Ġsize Ġ= Ġ 1 0 0 . dp 2 px ( context ) ĊĠĠĠ Ġvar Ġleft Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġtop Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġright Ġ= Ġsize ĊĠĠĠ Ġvar Ġbottom Ġ= Ġsize ĊĊĠĠĠ Ġfun Ġdraw Something () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvertices Ġ= Ġfloat ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠX , ĠY , ĠR , ĠG , ĠB ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft , Ġtop , Ġ 1 f , Ġ 0 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft , Ġbottom , Ġ 0 f , Ġ 1 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright , Ġbottom , Ġ 0 f , Ġ 0 f , Ġ 1 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright , Ġtop , Ġ 1 f , Ġ 1 f , Ġ 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft , Ġtop , Ġ 1 f , Ġ 0 f , Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġvertex Data Ġ= ĠByteBuffer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. allocate Direct ( vertices . size Ġ* ĠBY TES _ PER _ FLOAT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. order ( Byte Order . native Order ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Float Buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( vertices ) ĊĠĠĠĠĠĠĠ Ġvertex Data . position ( 0 ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Position Location , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPOSITION _ COMPONENT _ COUNT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ FLOAT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTR IDE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Data ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// Ġ å¡« åħħ é¢ľèī² æķ°æį® ĊĠĠĠĠĠĠĠ Ġvertex Data . position ( POSITION _ COMPONENT _ COUNT ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . glVertex Attrib Pointer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Color Location , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCOLOR _ COMPONENT _ COUNT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGLES 2 0 . GL _ FLOAT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTR IDE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvertex Data ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠGLES 2 0 . gl Draw Arrays ( GLES 2 0 . GL _ TRI ANGLE _ F AN , Ġ 0 , Ġ 5 ) ĊĊĠĠĠĠĠĠĠ Ġleft Ġ+= Ġstep ĊĠĠĠĠĠĠĠ Ġtop Ġ+= Ġstep ĊĠĠĠĠĠĠĠ Ġright Ġ+= Ġstep ĊĠĠĠĠĠĠĠ Ġbottom Ġ+= Ġstep ĊĠĠĠĠĠĠĠ Ġif Ġ( right Ġ> Ġ 3 Ġ* Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġ- 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġ 2 Ġ* Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġ 2 Ġ* Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġ 3 Ġ* Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġ 3 Ġ* Ġsize ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( left Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep Ġ= Ġ 2 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Ġ= Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġsize ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }