/*================================================================ =============== Ċ Copyright Ġ( c ) Ġ 2 0 2 0 ĠP TC ĠInc . ĠAll ĠRights ĠReserved . Ċ Ċ Vu for ia Ġis Ġa Ġtrade mark Ġof ĠP TC ĠInc ., Ġregistered Ġin Ġthe ĠUnited ĠStates Ġand Ġother Ċ countries . Ċ ================================================================ =============== */ Ċ Ċ package Ġcom . vu for ia . engine . Native Sample Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . res . Asset Manager Ċ import Ġandroid . opengl . GL Surface View Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . app . Nav Utils Ċ import Ġandroid . support . v 4 . view . Gesture Detector Compat Ċ import Ġandroid . support . v 7 . app . AlertDialog Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . util . Log Ċ import Ġandroid . view .* Ċ import Ġandroid . view . Gesture Detector . Simple On Gesture Listener Ċ import Ġandroid . widget . Relative Layout Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . util .* Ċ import Ġjavax . micro edition . kh ronos . e gl . EGL Config Ċ import Ġjavax . micro edition . kh ronos . openg les . GL 1 0 Ċ import Ġkotlin . concurrent . schedule Ċ Ċ /** Ċ Ġ* ĠActivity Ġto Ġdemonstrate Ġhow Ġto Ġuse ĠV u for ia ĠImage ĠTarget Ġand ĠModel ĠTarget Ġfeatures , Ċ Ġ* ĠVideo ĠBackground Ġrendering Ġand ĠV u for ia Ġlifecycle . Ċ Ġ*/ Ċ class ĠV u for ia Activity Ġ: ĠAppCompatActivity (), ĠGL Surface View . Renderer , ĠSurface Holder . Callback Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm GL View Ġ: ĠGL Surface View ĊĊĠĠĠ Ġprivate Ġvar Ġm Target Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Progress Indicator Layout : ĠRelative Layout ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġm Width Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġm Height Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġm Vu for ia Started Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Surface Changed Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġm Gesture Detector Ġ: ĠGest ure Detector Compat ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠNative Ġmethods ĊĠĠĠ Ġexternal Ġfun Ġinit AR ( activity Ġ: ĠActivity , Ġasset Manager Ġ: ĠAsset Manager , Ġtarget Ġ: ĠInt ) ĊĠĠĠ Ġexternal Ġfun Ġde init AR () ĊĊĠĠĠ Ġexternal Ġfun Ġstart AR () Ġ: ĠBoolean ĊĠĠĠ Ġexternal Ġfun Ġstop AR () ĊĊĠĠĠ Ġexternal Ġfun Ġpause AR () ĊĠĠĠ Ġexternal Ġfun Ġresume AR () ĊĊĠĠĠ Ġexternal Ġfun Ġcamera Perform Auto Focus () ĊĠĠĠ Ġexternal Ġfun Ġcamera Restore Auto Focus () ĊĊĠĠĠ Ġexternal Ġfun Ġinit Rendering () ĊĠĠĠ Ġexternal Ġfun Ġset Textures ( astr on aut Width : ĠInt , Ġa str on aut Height : ĠInt , Ġa str on aut Bytes : ĠByteBuffer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġland er Width : ĠInt , Ġland er Height : ĠInt , Ġland er Bytes : ĠByteBuffer ) ĊĠĠĠ Ġexternal Ġfun Ġde init Rendering () ĊĠĠĠ Ġexternal Ġfun Ġconfigure Rendering ( width Ġ: ĠInt , Ġheight Ġ: ĠInt , Ġorientation Ġ: ĠInt ) Ġ: ĠBoolean ĊĠĠĠ Ġexternal Ġfun Ġrender Frame () Ġ: ĠBoolean ĊĊĊĠĠĠ Ġ// ĠActivity Ġmethods ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġm Target Ġ= Ġintent . getInt Extra (" Target ", Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġm Vu for ia Started Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġm Surface Changed Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan ĠOpenGL ĠES Ġ 3 . 0 Ġcontext Ġ( also Ġworks Ġfor Ġ 3 . 1 , Ġ 3 . 2 ) ĊĠĠĠĠĠĠĠ Ġm GL View Ġ= ĠGL Surface View ( this ) ĊĠĠĠĠĠĠĠ Ġm GL View . holder . add Callback ( this ) ĊĠĠĠĠĠĠĠ Ġm GL View . set EGL Context Client Version ( 3 ) ĊĠĠĠĠĠĠĠ Ġm GL View . set Renderer ( this ) ĊĠĠĠĠĠĠĠ Ġadd ContentView ( m GL View , ĠViewGroup . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠHide Ġthe ĠGL View Ġuntil Ġwe Ġare Ġready ĊĠĠĠĠĠĠĠ Ġm GL View . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrevent Ġscreen Ġfrom Ġdim ming ĊĠĠĠĠĠĠĠ Ġwindow . add Flags ( WindowManager . LayoutParams . FLAG _ KEEP _ SCREEN _ ON ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġthe ĠActivity Ġcompletely Ġfull Ġscreen ĊĠĠĠĠĠĠĠ Ġm GL View . system Ui Visibility Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠView . SYSTEM _ UI _ FLAG _ LOW _ PROFILE Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . SYSTEM _ UI _ FLAG _ FULL SCREEN Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . SYSTEM _ UI _ FLAG _ LAYOUT _ ST ABLE Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . SYSTEM _ UI _ FLAG _ IM MER SIVE _ STICK Y Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . SYSTEM _ UI _ FLAG _ LAYOUT _ HIDE _ NAV IG ATION Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . SYSTEM _ UI _ FLAG _ HIDE _ NAV IG ATION ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġand Ġshow Ġa Ġprogress Ġindicator ĊĠĠĠĠĠĠĠ Ġm Progress Indicator Layout Ġ= ĠView . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . progress _ indicator , Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠRelative Layout ĊĊĠĠĠĠĠĠĠ Ġadd ContentView ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress Indicator Layout , ĠViewGroup . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart ĠV u for ia Ġinitialization Ġin Ġa Ġcoroutine ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Un conf ined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Vu for ia () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġm Gesture Detector Ġ= ĠGest ure Detector Compat ( this , ĠGest ure Listener ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġpause AR () ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( mV u for ia Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Un conf ined ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresume AR () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop AR () ĊĠĠĠĠĠĠĠ Ġm Vu for ia Started Ġ= Ġfalse ; ĊĠĠĠĠĠĠĠ Ġde init AR () ĊĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġitem . itemId ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== Ġandroid . R . id . home ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis ĠID Ġrepresents Ġthe ĠHome Ġor ĠUp Ġbutton . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNav Utils . navigate Up From Same Task ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠOver r ider Ġon Touch Event Ġto Ġconnect Ġit Ġto Ġour ĠGest ure Listener ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm Gesture Detector ?. on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( event ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/// ĠCustom ĠGest ure Listener Ġto Ġcapture Ġsingle Ġand Ġdouble Ġtap ĊĠĠĠ Ġinner Ġclass ĠGest ure Listener Ġ: ĠSimple On Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Single Tap Up ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalls Ġthe ĠAut of ocus ĠNative ĠMethod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Perform Auto Focus () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAfter Ġtriggering Ġa Ġfocus Ġevent Ġwait Ġ 2 Ġseconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbefore Ġrest oring Ġcontinuous Ġautofocus ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimer (" Restore Auto Focus ", Ġfalse ). schedule ( 2 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Restore Auto Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Double Tap ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinitialize Vu for ia () Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGlobal Scope . async ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit AR ( this @ Vu for ia Activity , Ġthis @ Vu for ia Activity . assets , Ġm Target ) ĊĠĠĠĠĠĠĠ Ġ}. await () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġpresent Error ( message Ġ: ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder : ĠAlertDialog . Builder ? Ġ= Ġthis . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder ?. setMessage ( message ) ĊĠĠĠĠĠĠĠ Ġbuilder ?. setTitle ( R . string . error _ dialog _ title ) ĊĠĠĠĠĠĠĠ Ġbuilder ?. set Positive Button ( R . string . ok , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop AR () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde init AR () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Vu for ia Activity . finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġcalled Ġfrom Ġanother Ġcoroutine Ġnot Ġon Ġthe ĠMain Ġthread ĊĠĠĠĠĠĠĠ Ġ// ĠShow ing Ġthe ĠUI Ġneeds Ġto Ġbe Ġon Ġthe Ġmain Ġthread ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog : ĠAlertDialog ? Ġ= Ġbuilder ?. create () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog ?. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġinit Done () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Vu for ia Started Ġ= Ġstart AR () ĊĠĠĠĠĠĠĠ Ġif Ġ(! mV u for ia Started ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Vu for ia Sample ", Ġ" Failed Ġto Ġstart ĠAR ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠShow Ġthe ĠGL View ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm GL View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠGL Surface View . Renderer Ġmethods ĊĠĠĠ Ġoverride Ġfun Ġon Surface Created ( unused : ĠGL 1 0 , Ġconfig : ĠE GL Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Rendering () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Draw Frame ( unused : ĠGL 1 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mV u for ia Started ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Surface Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Surface Changed Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġsample Ġdoesn 't Ġsupport Ġauto - rotation , Ġlandscape Ġorientation Ġis Ġhard Ġcoded Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Rendering ( m Width , Ġm Height , Ġ/* ĠLand scape ĠLeft Ġ*/ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOpenGL Ġrendering Ġof ĠVideo ĠBackground Ġand Ġaugment ations Ġis Ġimplemented Ġin Ġnative Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdid Render Ġ= Ġrender Frame () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( did Render Ġ&& Ġm Progress Indicator Layout ?. visibility Ġ!= ĠView . GONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress Indicator Layout ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Changed ( unused : ĠGL 1 0 , Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġvalues Ġfor Ġlater Ġuse ĊĠĠĠĠĠĠĠ Ġm Width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġm Height Ġ= Ġheight ĊĊĠĠĠĠĠĠĠ Ġ// ĠRe - load Ġtextures Ġin Ġcase Ġthey Ġgot Ġdestroyed ĊĠĠĠĠĠĠĠ Ġvar Ġcup cake Texture Ġ= ĠTexture . load Texture From A pk (" cup cake . png ", Ġassets ) ĊĠĠĠĠĠĠĠ Ġvar Ġland er Texture Ġ= ĠTexture . load Texture From A pk (" V ik ing Land er . jpg ", Ġassets ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cup cake Texture Ġ!= Ġnull Ġ&& Ġland er Texture Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Textures ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcup cake Texture . width , Ġcup cake Texture . height , Ġcup cake Texture . data !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġland er Texture . width , Ġland er Texture . height , Ġland er Texture . data !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Vu for ia Sample ", Ġ" Failed Ġto Ġload Ġa str on aut Ġor Ġland er Ġtexture "); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġflag Ġto Ġtell Ġus Ġwe Ġneed Ġto Ġupdate ĠV u for ia Ġconfiguration ĊĠĠĠĠĠĠĠ Ġm Surface Changed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠSurface Holder . Callback ĊĠĠĠ Ġoverride Ġfun Ġsurface Created ( var 1 : ĠSurface Holder ?) Ġ{} ĊĊĊĠĠĠ Ġoverride Ġfun Ġsurface Changed ( var 1 : ĠSurface Holder ?, Ġvar 2 : ĠInt , Ġvar 3 : ĠInt , Ġvar 4 : ĠInt ) Ġ{} ĊĊĊĠĠĠ Ġoverride Ġfun Ġsurface Destroyed ( var 1 : ĠSurface Holder ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġde init Rendering () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġexternal Ġfun ĠgetImage Target Id () Ġ: ĠInt ĊĠĠĠĠĠĠĠ Ġexternal Ġfun ĠgetModel Target Id () Ġ: ĠInt ĊĠĠĠ Ġ} Ċ } Ċ