package Ġgli mp se . shaders Ċ Ċ import Ġgli mp se . gles . GLES Ċ import Ġgli mp se . gles . deleg ates . GLES Delegate Ċ Ċ /** Ċ Ġ* ĠGL SL Ġshader Ġprogram Ġbuilder . Ċ Ġ*/ Ċ class ĠProgram Builder Ġ{ ĊĊ ĉ private Ġval Ġg les : ĠGLES Ġby ĠGLES Delegate ĊĊ ĉ private Ġval Ġshaders Ġ= Ġmutable ListOf < Shader >() ĊĊ ĉ private Ġoperator Ġfun ĠShader Type . invoke ( source : Ġ() Ġ-> ĠString ) Ġ{ Ċĉ ĉ val Ġhandle Ġ= Ġg les . create Shader ( this ) Ċĉ ĉ gles . compile Shader ( handle , Ġsource ()) Ċĉ ĉ if Ġ(! gles . get Shader Compile Status ( handle )) Ġ{ Ċĉĉ ĉ throw ĠShader Compile Exception ( gles . get Shader Log ( handle )) Ċĉ ĉ } Ċĉ ĉ shaders . add ( Shader ( this , Ġhandle )) Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠComp iles Ġa Ġvertex Ġshader . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġsource ĠShader Ġsource Ġcode Ġlambda . Ċĉ Ġ*/ Ċ ĉ fun Ġvertex Shader ( source : Ġ() Ġ-> ĠString ): ĠUnit Ġ{ Ċĉ ĉ Shader Type . VERTEX ( source ) Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠComp iles Ġa Ġfragment Ġshader . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġsource ĠShader Ġsource Ġcode Ġlambda . Ċĉ Ġ*/ Ċ ĉ fun Ġfragment Shader ( source : Ġ() Ġ-> ĠString ): ĠUnit Ġ{ Ċĉ ĉ Shader Type . FRAGMENT ( source ) Ċ ĉ } ĊĊ ĉ internal Ġfun Ġbuild (): ĠProgram Ġ{ Ċĉ ĉ val Ġhandle Ġ= Ġg les . create Program () Ċĉ ĉ shaders . forEach Ġ{ Ġshader Ġ-> Ċĉĉ ĉ gles . attach Shader ( handle , Ġshader . handle ) Ċĉ ĉ } Ċĉ ĉ gles . link Program ( handle ) Ċĉ ĉ if Ġ(! gles . get Program Link Status ( handle )) Ġ{ Ċĉĉ ĉ throw ĠProgram Link Exception ( gles . get Program Log ( handle )) Ċĉ ĉ } Ċĉ ĉ return ĠProgram ( handle , Ġshaders . toList ()) Ċ ĉ } Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġ[ Program ], Ġinitialized Ġwith Ġan Ġ[ init ] Ġfunction . Ċ Ġ*/ Ċ fun Ġshader Program ( init : ĠProgram Builder . () Ġ-> ĠUnit ): ĠProgram Ġ{ Ċ ĉ val Ġbuilder Ġ= ĠProgram Builder () Ċ ĉ builder . init () Ċ ĉ return Ġbuilder . build () Ċ } Ċ