package Ġcom . ig al ata . bubble picker . rendering Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . opengl . GLES 2 0 .* Ċ import Ġandroid . opengl . Matrix Ċ import Ġandroid . support . v 4 . widget . TextView Compat Ċ import Ġandroid . support . v 7 . widget . AppCompat ImageView Ċ import Ġandroid . support . v 7 . widget . AppCompat TextView Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . Gravity Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . LinearLayout Ċ import Ġcom . ig al ata . bubble picker . model . Picker Item Ċ import Ġcom . ig al ata . bubble picker . physics . Circle Body Ċ import Ġcom . ig al ata . bubble picker . rendering . Bubble Shader . U _ MATRIX Ċ import Ġcom . ig al ata . bubble picker . to Texture Ċ import Ġorg . j box 2 d . common . Vec 2 Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġir in agal ata Ġon Ġ 1 / 1 9 / 1 7 . Ċ Ġ*/ Ċ data Ġclass ĠItem ( val Ġcontext : ĠContext , Ġval Ġpicker Item : ĠP icker Item , Ġval Ġcircle Body : ĠCircle Body ) Ġ{ ĊĊĠĠĠ Ġval Ġx : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcircle Body . physical Body . position . x ĊĊĠĠĠ Ġval Ġy : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcircle Body . physical Body . position . y ĊĊĠĠĠ Ġval Ġradius : ĠFloat ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcircle Body . radius ĊĊĠĠĠ Ġval Ġinitial Position : ĠVec 2 ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcircle Body . position ĊĊĠĠĠ Ġval Ġcurrent Position : ĠVec 2 ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcircle Body . physical Body . position ĊĊĠĠĠ Ġprivate Ġvar Ġis Visible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcircle Body . isVisible ĊĠĠĠ Ġprivate Ġvar Ġtexture : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġimage Texture : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġcurrent Texture : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( circle Body . increase d Ġ|| Ġcircle Body . isIn creasing ) Ġimage Texture Ġelse Ġtexture ĊĠĠĠ Ġprivate Ġval Ġbitmap Size Ġ= ĠTyped Value . apply Dimension ( Typed Value . COMPLEX _ UNIT _ DIP , Ġ 9 6 f , Ġcontext . resources . display Metrics ) ĊĠĠĠ Ġprivate Ġval Ġbitmap Rect Ġ= ĠRect (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( 0 , Ġ 0 , Ġbitmap Size . toInt (), Ġbitmap Size . toInt ()) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġsquare Rect Ġ= ĠRect (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhalf XY Ġ= ĠMath . round (( bitmap Size Ġ* ĠMath . sqrt ( 2 . 0 )) Ġ/ Ġ 4 . 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= Ġbitmap Rect . center X () Ġ- Ġhalf XY ĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġbitmap Rect . center Y () Ġ- Ġhalf XY ĊĠĠĠĠĠĠĠ Ġval Ġr Ġ= Ġbitmap Rect . center X () Ġ+ Ġhalf XY ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġbitmap Rect . center Y () Ġ+ Ġhalf XY ĊĠĠĠĠĠĠĠ Ġset ( l . toInt (), Ġt . toInt (), Ġr . toInt (), Ġb . toInt ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġview Icon : ĠAppCompat ImageView Ġ= ĠAppCompat ImageView ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġset LayoutParams ( LinearLayout . LayoutParams ( ViewGroup . LayoutParams . MATCH _ PARENT , ĠViewGroup . LayoutParams . MATCH _ PARENT ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweight Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġset Image Drawable ( picker Item . icon ) ĊĠĠĠĠĠĠĠ Ġset Scale Type ( ImageView . Scale Type . FIT _ CENTER ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġview Text : ĠAppCompat TextView Ġ= ĠAppCompat TextView ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġset LayoutParams ( LinearLayout . LayoutParams ( ViewGroup . LayoutParams . MATCH _ PARENT , ĠViewGroup . LayoutParams . MATCH _ PARENT ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweight Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġset Text ( picker Item . title ) ĊĠĠĠĠĠĠĠ Ġset Gravity ( Gravity . CENTER ) ĊĠĠĠĠĠĠĠ Ġauto Text Size ( this , Ġmin Ġ= Ġ 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġview Layout : ĠLinearLayout Ġ= ĠLinearLayout ( context ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġset LayoutParams ( ViewGroup . LayoutParams ( square Rect . width (), Ġsquare Rect . height ())) ĊĠĠĠĠĠĠĠ Ġset Orientation ( LinearLayout . VERTICAL ) ĊĊĠĠĠĠĠĠĠ Ġadd View ( view Icon ) ĊĠĠĠĠĠĠĠ Ġadd View ( view Text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw It self ( program Id : ĠInt , Ġindex : ĠInt , Ġscale X : ĠFloat , Ġscale Y : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġgl Active Texture ( GL _ TEXTURE ) ĊĠĠĠĠĠĠĠ ĠglBind Texture ( GL _ TEXTURE _ 2 D , Ġcurrent Texture ) ĊĠĠĠĠĠĠĠ Ġgl Uniform 1 i ( glGet UniformLocation ( program Id , ĠB ubble Shader . U _ TEXT ), Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġgl Uniform 1 i ( glGet UniformLocation ( program Id , ĠB ubble Shader . U _ VIS IBILITY ), Ġif Ġ( isVisible ) Ġ 1 Ġelse Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġgl Uniform Matrix 4 fv ( glGet UniformLocation ( program Id , ĠU _ MATRIX ), Ġ 1 , Ġfalse , Ġcalculate Matrix ( scale X , Ġscale Y ), Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġgl Draw Arrays ( GL _ TRI ANGLE _ STRIP , Ġindex Ġ* Ġ 4 , Ġ 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbind Textures ( texture Ids : ĠInt Array , Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtexture Ġ= Ġbind Texture ( texture Ids , Ġindex Ġ* Ġ 2 , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġimage Texture Ġ= Ġbind Texture ( texture Ids , Ġindex Ġ* Ġ 2 Ġ+ Ġ 1 , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Bitmap ( isSelected : ĠBoolean ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġbitmap Ġ= ĠBitmap . create Bitmap ( bitmap Size . toInt (), Ġbitmap Size . toInt (), ĠBitmap . Config . ARGB _ 4 4 4 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġbitmap Config : ĠBitmap . Config Ġ= Ġbitmap . config Ġ?: ĠBitmap . Config . ARGB _ 8 8 8 8 ĊĠĠĠĠĠĠĠ Ġbitmap Ġ= Ġbitmap . copy ( bitmap Config , Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( bitmap ) ĊĊĠĠĠĠĠĠĠ Ġdraw Background ( canvas , Ġis Selected ) ĊĊĠĠĠĠĠĠĠ Ġview Text . setMax Lines ( 1 ) ĊĠĠĠĠĠĠĠ Ġview Text . setTextColor ( if Ġ( isSelected ) Ġpicker Item . selected TextColor !! Ġelse Ġpicker Item . textColor !! ) ĊĠĠĠĠĠĠĠ Ġview Icon . setVisibility ( if Ġ( isSelected Ġ&& Ġpicker Item . icon Ġ!= Ġnull ) ĠView . VISIBLE Ġelse ĠView . GONE ) ĊĊĠĠĠĠĠĠĠ Ġmeasure () ĊĠĠĠĠĠĠĠ Ġlayout () ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġset Ġthe Ġmax Ġlines Ġas Ġ 2 , Ġthen ĠAuto Resize TextView Ġwill Ġpush Ġfor Ġfilling Ġup Ġboth Ġlines . ĊĠĠĠĠĠĠĠ Ġ// ĠSo Ġwe Ġask Ġfor Ġa Ġmax Ġlines Ġof Ġ 1 Ġinitially Ġbut Ġif Ġthe Ġthreshold Ġis Ġcros sed Ġfor Ġminimum Ġtext Ġsize ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġset Ġmax Lines Ġto Ġtwo Ġand Ġthen Ġgo Ġthrough Ġthe Ġmeasure , Ġlayout Ġpass Ġagain . ĊĠĠĠĠĠĠĠ Ġval Ġcurr Text Size Ġ= Ġview Text . text Size Ġ/ Ġcontext . resources . display Metrics . density ĊĠĠĠĠĠĠĠ Ġif Ġ( curr Text Size Ġ<= Ġpicker Item . min Text Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpicker Item . title Broken ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Text . text Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Text . max Lines Ġ= Ġpicker Item . max Text Lines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauto Text Size ( view Text , Ġmin Ġ= Ġpicker Item . min Text Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcanvas . matrix Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcanvas . translate (( square Rect . left Ġ- Ġbitmap Rect . left ). toFloat (), Ġ( square Rect . top Ġ- Ġbitmap Rect . top ). toFloat ()) ĊĠĠĠĠĠĠĠ Ġview Layout . draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbitmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmeasure () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Layout . measure ( View . Measure Spec . make Measure Spec ( square Rect . width (), ĠView . Measure Spec . EX ACT LY ), ĠView . Measure Spec . make Measure Spec ( square Rect . height (), ĠView . Measure Spec . EX ACT LY )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlayout () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Layout . layout ( square Rect . left , Ġsquare Rect . top , Ġsquare Rect . right , Ġsquare Rect . bottom ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġauto Text Size ( view : ĠAppCompat TextView , Ġmin : ĠInt Ġ= Ġpicker Item . min Text Size , Ġmax : ĠInt Ġ= Ġpicker Item . max Text Size ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTextView Compat . set AutoSize Text Type With Defaults ( view , ĠTextView Compat . AUTO _ SIZE _ TEXT _ TYPE _ UNIFORM ) ĊĠĠĠĠĠĠĠ ĠTextView Compat . set AutoSize Text Type Uniform With Configuration ( view , Ġmin , Ġmax , Ġ 1 , Ġpicker Item . text Size Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Background ( canvas : ĠCanvas , Ġis Selected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbg Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġbg Paint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġpicker Item . color ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isSelected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbg Paint . color Ġ= Ġpicker Item . selected Color !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbg Paint . color Ġ= Ġpicker Item . color !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( 0 f , Ġ 0 f , Ġbitmap Size , Ġbitmap Size , Ġbg Paint ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Texture ( texture Ids : ĠInt Array , Ġindex : ĠInt , Ġwith Image : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġgl Gen Textures ( 1 , Ġtexture Ids , Ġindex ) ĊĠĠĠĠĠĠĠ Ġcreate Bitmap ( with Image ). to Texture ( texture Ids [ index ]) ĊĠĠĠĠĠĠĠ Ġreturn Ġtexture Ids [ index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Matrix ( scale X : ĠFloat , Ġscale Y : ĠFloat ) Ġ= ĠFloat Array ( 1 6 ). apply Ġ{ ĊĠĠĠĠĠĠĠ ĠMatrix . set Identity M ( this , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠMatrix . translate M ( this , Ġ 0 , Ġcurrent Position . x Ġ* Ġscale X Ġ- Ġinitial Position . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Position . y Ġ* Ġscale Y Ġ- Ġinitial Position . y , Ġ 0 f ) ĊĠĠĠ Ġ} Ċ Ċ }