package Ġapp . the le ma . studio . g 3 d Ċ Ċ import Ġapp . the le ma . data . DATA Ċ import Ġapp . the le ma . data . I Byte Data Ċ import Ġapp . the le ma . ecs . component OrNull Ċ import Ġapp . the le ma . ecs . forEach Component Ċ import Ġapp . the le ma . ecs . sibling Ċ import Ġapp . the le ma . g 3 d . IS c ene Instance Ċ import Ġapp . the le ma . g 3 d . I Uniform Args Ċ import Ġapp . the le ma . gl .* Ċ import Ġapp . the le ma . img .* Ċ import Ġapp . the le ma . math . Vec 4 Ċ import Ġapp . the le ma . shader . Shader Ċ import Ġapp . the le ma . shader . node .* Ċ import Ġapp . the le ma . shader . post . Post Shader Ċ import Ġapp . the le ma . shader . post . S ob el Filter Ċ import Ġapp . the le ma . studio . Studio Ċ import Ġapp . the le ma . studio . ecs . Entity TreeNode Ċ import Ġapp . the le ma . ui . IT ree Node Ċ import Ġapp . the le ma . ui . Selection Ċ import Ġapp . the le ma . utils . Color Ċ import Ġapp . the le ma . utils . iterate Ċ Ċ object ĠSelection 3 D Ġ{ ĊĠĠĠ Ġvar Ġselection : ĠSelection < IT ree Node >? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġselection Transparency Shader : ĠPost Shader Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠPost Shader ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrag Code Ġ= Ġ""" Ċ varying Ġvec 2 Ġuv ; Ċ uniform Ġsampler 2 D Ġtex ; Ċ Ċ void Ġmain () Ġ{ ĊĠĠĠ Ġvec 4 Ġcolor Ġ= Ġtexture 2 D ( tex , Ġuv ); ĊĠĠĠ Ġgl _ Frag Color Ġ= Ġvec 4 ( color . rgb , Ġcolor . r ); Ċ } Ċ """ ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġframe Buffer : ĠI Frame Buffer Ġby Ġlazy Ġ{ ĠSimple Frame Buffer ( pixel Format Ġ= ĠGL _ RGB , Ġinternal Format Ġ= ĠGL _ RGB 8 ) Ġ} ĊĠĠĠ Ġval Ġframe Buffer 2 : ĠI Frame Buffer Ġby Ġlazy Ġ{ ĠSimple Frame Buffer () Ġ} ĊĊĠĠĠ Ġval Ġsob el : ĠS ob el Filter Ġby Ġlazy Ġ{ ĠS ob el Filter (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġwidth Ġ= Ġ 1 . 2 5 f ĊĠĠĠĠĠĠĠ Ġedge Color . set ( 1 f , Ġ 0 . 7 f , Ġ 0 . 2 f ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġpixels : ĠI Byte Data Ġ= ĠDATA . bytes ( GL . main Frame Buffer Width Ġ* ĠGL . main Frame Buffer Height Ġ* Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcolor Map Ġ= ĠHashMap < Int , ĠEntity TreeNode >() ĊĊĠĠĠ Ġval Ġcolor Uniform Ġ= ĠStudio Color Uniform Node () ĊĠĠĠ Ġval Ġselection Render Shader Ġ= ĠShader Ġ{ ĊĠĠĠĠĠĠĠ Ġget OrCreate Entity () ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġsibling < Output Node >() ĊĠĠĠĠĠĠĠ Ġoutput . frag Color Ġ= Ġcolor Uniform . uniform ĊĠĠĠĠĠĠĠ Ġoutput . fade Start Ġ= Ġ- 1 f ĊĠĠĠĠĠĠĠ Ġroot Node Ġ= Ġoutput . sibling () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnodes Ġ= ĠArrayList < Entity TreeNode >() ĊĊĠĠĠ Ġvar Ġselect Request Ġ= Ġfalse ĊĠĠĠ Ġvar Ġpixel Start Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġresize Screen ( width : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġframe Buffer . set Resolution ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġframe Buffer 2 . set Resolution ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġpixels Ġ= ĠDATA . bytes ( frame Buffer . width Ġ* Ġframe Buffer . height Ġ* Ġ 3 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġselect ( x : ĠInt , Ġy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpixel Start Ġ= Ġ( y Ġ* Ġframe Buffer . width Ġ+ Ġx ) Ġ* Ġ 3 ĊĠĠĠĠĠĠĠ Ġselect Request Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtraverse Selection ( entity : ĠEntity TreeNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscene Ġ= Ġentity . entity . component OrNull < IS c ene Instance >() ?. also Ġ{ Ġnodes . add ( entity ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( scene Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity . entity . forEach Component Ġ{ Ġif Ġ( it Ġis ĠI Render able ) Ġnodes . add ( entity ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity . children . iterate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠEntity TreeNode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtraverse Selection ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprepare Selection () Ġ{ ĊĠĠĠĠĠĠĠ Ġnodes . clear () ĊĊĠĠĠĠĠĠĠ Ġval Ġselection Ġ= Ġselection ĊĠĠĠĠĠĠĠ Ġif Ġ( selection ?. is Disabled Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStudio . active Entity Tab ?. scene ?. entity Tree ?. root Node ?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtraverse Selection ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( select Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Request Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Buffer . render No Clear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Render Shader . bind () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL . gl Clear Color ( Color . BLACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL . gl Clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Map . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrender Ġto Ġmain Ġframe Ġbuffer Ġand Ġread Ġpixels Ġfrom Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcolor Ġ= Ġ 0 x 0 0 0 0 0 1 FF L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcolor Id Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes . iterate Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . entity . forEach Component Ġ{ Ġobj Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( obj Ġis ĠI Scene Instance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Map [ color Id ] Ġ= Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . rgba 8 8 8 8 To Color ( color Uniform . color , Ġcolor . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . scene Instance ?. forEach Component In Branch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠI Render able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . render ( selection Render Shader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ+= Ġ 2 5 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Id ++ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( obj Ġis ĠI Render able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Map [ color Id ] Ġ= Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor . rgba 8 8 8 8 To Color ( color Uniform . color , Ġcolor . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj . render ( selection Render Shader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ+= Ġ 2 5 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Id ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL . gl Read Pixels ( 0 , Ġ 0 , Ġframe Buffer . width , Ġframe Buffer . height , ĠGL _ RGB , ĠGL _ UNSIGNED _ BYTE , Ġpixels ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL . gl Clear Color ( Color . BLACK ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL . gl Clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Color Ġ= Ġpixels [ pixel Start ]. toInt () Ġ* Ġ 6 5 0 2 5 Ġ+ Ġpixels [ pixel Start Ġ+ Ġ 1 ]. toInt () Ġ* Ġ 2 5 5 Ġ+ Ġpixels [ pixel Start Ġ+ Ġ 2 ]. toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġcolor Map [ selected Color ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection . choose ( entity ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Map . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnodes . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġselection ĊĠĠĠĠĠĠĠ Ġif Ġ( selected ?. is Disabled Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġselection Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Buffer . render Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Uniform . color . set ( 1 f , Ġ 1 f , Ġ 1 f , Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected . iterate Ġ{ Ġselected Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġas ĠEntity TreeNode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected . entity . forEach Component Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠI Scene Instance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . scene Instance ?. forEach Component In Branch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠI Render able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . render ( selection Render Shader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it Ġis ĠI Render able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . render ( selection Render Shader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Buffer 2 . render No Clear Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL . gl Clear Color ( 0 f , Ġ 0 f , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL . gl Clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsob el . render ( frame Buffer . get Texture ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL . is Bl ending Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGL . setup Simple Alpha Bl ending () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmask Ġ= ĠScreen Quad . default Clear Mask ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScreen Quad . default Clear Mask Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Transparency Shader . render ( frame Buffer 2 . get Texture ( 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScreen Quad . default Clear Mask Ġ= Ġmask ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠStudio Color Uniform Node : ĠShader Node () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġcomponent Name : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ" Studio Color Uniform Node " ĊĊĠĠĠ Ġval Ġuniform : ĠI Shader Data Ġ= ĠGL SL Value (" color ", ĠGL SL Type . Vec 4 ). also Ġ{ Ġoutput ( it ) Ġ} ĊĊĠĠĠ Ġval Ġcolor Ġ= ĠVec 4 ( 1 f ) ĊĊĠĠĠ Ġoverride Ġfun Ġdeclaration Frag ( out : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġout . append (" uniform Ġ${ uniform . typed Ref }; \ n ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbind ( uniform s : ĠI Uniform Args ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshader [ uniform . ref ] Ġ= Ġcolor ĊĠĠĠ Ġ} Ċ }