package Ġb aa ah s . mapper Ċ Ċ import Ġb aa ah s . Media Devices Ċ import Ġb aa ah s . client . Scene Editor Client Ċ import Ġb aa ah s . client . document . Scene Manager Ċ import Ġb aa ah s . context 2 d Ċ import Ġb aa ah s . geom . Vector 2 F Ċ import Ġb aa ah s . geom . Vector 3 F Ċ import Ġb aa ah s . getValue Ċ import Ġb aa ah s . im aging .* Ċ import Ġb aa ah s . model . Model Ċ import Ġb aa ah s . sim . Hosted WebApp Ċ import Ġb aa ah s . ui . Observable Ċ import Ġb aa ah s . ui . value Ċ import Ġb aa ah s . util . Logger Ċ import Ġb aa ah s . util . toDouble Array Ċ import Ġb aa ah s . visual izer . Rot ator Ċ import Ġb aa ah s . visual izer . to Vector 3 Ċ import Ġb aa ah s . window Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . js . js o Ċ import Ġorg . w 3 c . dom . Canvas Image Source Ċ import Ġorg . w 3 c . dom . Canvas Rendering Context 2 D Ċ import Ġorg . w 3 c . dom . HTML Canvas Element Ċ import Ġorg . w 3 c . dom . HTMLElement Ċ import Ġorg . w 3 c . dom . events . Event Ċ import Ġorg . w 3 c . dom . events . Keyboard Event Ċ import Ġreact . R Builder Ċ import Ġreact . React Element Ċ import Ġreact . createElement Ċ import Ġreact . dom . br Ċ import Ġreact . dom . i Ċ import Ġthree . js .* Ċ import Ġthree _ ext .* Ċ import Ġthree _ ext . Matrix 4 Ċ import Ġkotlin . collections . component 1 Ċ import Ġkotlin . collections . component 2 Ċ import Ġkotlin . collections . set Ċ import Ġkotlin . math . round ToInt Ċ Ċ class ĠM emo ized Js Mapper Ui ( mapper Ui : ĠJs Mapper Ui ) Ġ{ ĊĠĠĠ Ġval Ġchanged Camera Ġ= Ġmapper Ui :: changed Camera ĊĠĠĠ Ġval Ġclicked Play Ġ= Ġmapper Ui :: clicked Play ĊĠĠĠ Ġval Ġclicked Pause Ġ= Ġmapper Ui :: clicked Pause ĊĠĠĠ Ġval Ġclicked Redo Ġ= Ġmapper Ui :: clicked Redo ĊĠĠĠ Ġval Ġclicked Start Ġ= Ġmapper Ui :: clicked Start ĊĠĠĠ Ġval Ġclicked Stop Ġ= Ġmapper Ui :: clicked Stop ĊĠĠĠ Ġval Ġclicked Go To Surface Ġ= Ġmapper Ui :: clicked Go To Surface ĊĠĠĠ Ġval Ġload Mapping Session Ġ= Ġmapper Ui :: load Mapping Session ĊĠĠĠ Ġval Ġon Key down Ġ= Ġ{ Ġevent : ĠEvent Ġ-> Ġmapper Ui . got Ui Key press ( event Ġas ĠKeyboard Event ) Ġ} Ċ } Ċ Ċ class ĠMapper Status Ġ: ĠObservable () Ġ{ ĊĠĠĠ Ġvar Ġmessage : ĠString ? Ġby Ġnotify OnChange ( null ) ĊĠĠĠ Ġvar Ġmessage 2 : ĠString ? Ġby Ġnotify OnChange ( null ) ĊĠĠĠ Ġvar Ġstats : Ġ( R Builder . () Ġ-> ĠUnit )? Ġby Ġnotify OnChange ( null ) ĊĠĠĠ Ġvar Ġordered Panels : ĠList < Pair < Js Mapper Ui . Visible Surface , ĠFloat >> Ġby Ġnotify OnChange ( emptyList ()) Ċ } Ċ Ċ class ĠJs Mapper Ui ( ĊĠĠĠ Ġprivate Ġval Ġscene Editor Client : ĠScene Editor Client , ĊĠĠĠ Ġprivate Ġval Ġscene Manager : ĠScene Manager , ĊĠĠĠ Ġprivate Ġval Ġstatus Listener : ĠStatus Listener ? Ġ= Ġnull Ċ ) Ġ: ĠObservable (), ĠMapper Ui , ĠHost ed WebApp Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlistener : ĠMapper Ui . Listener ĊĊĠĠĠ Ġoverride Ġvar Ġdevices : ĠList < Media Devices . Device > Ġby Ġnotify OnChange ( emptyList ()) ĊĠĠĠ Ġvar Ġselected Device : ĠMedia Devices . Device ? Ġby Ġnotify OnChange ( null ) ĊĊĠĠĠ Ġoverride Ġfun Ġlisten ( listener : ĠMapper Ui . Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠBounds Ġof Ġmapper Ġcontainer . ĊĠĠĠ Ġprivate Ġvar Ġbrowser Dim en Ġ= ĠDim en ( 5 1 2 , Ġ 3 8 4 ) ĊĊĠĠĠ Ġ// ĠBounds Ġof Ġarea Ġused Ġfor Ġmapping . ĊĠĠĠ Ġprivate Ġvar Ġcontainer Dim en Ġ= Ġbrowser Dim en ĊĊĠĠĠ Ġ// ĠActual Ġdimensions Ġcoming Ġfrom Ġthe Ġcamera . ĊĠĠĠ Ġprivate Ġvar Ġlast Cam Image Dim en Ġ= Ġbrowser Dim en ĊĊĠĠĠ Ġ// ĠBest - fit Ġdimensions Ġof Ġmapping Ġarea Ġand Ġcamera Ġimage . ĊĠĠĠ Ġprivate Ġvar Ġviewport Dim en Ġ= Ġbrowser Dim en ĊĊĠĠĠ Ġprivate Ġval Ġclock Ġ= ĠClock () ĊĊĠĠĠ Ġ// Ġon screen Ġrenderer Ġfor Ġregistration ĠUI : ĊĠĠĠ Ġprivate Ġval Ġui Renderer Ġ= ĠWebGL Renderer ( js o Ġ{ Ġalpha Ġ= Ġtrue Ġ}) ĊĠĠĠ Ġprivate Ġval Ġui Scene Ġ= ĠScene () ĊĠĠĠ Ġprivate Ġval Ġui Camera Ġ= ĠPers pective Camera ( 4 5 , Ġcontainer Dim en . aspect (), Ġ 1 , Ġ 1 0 0 0 0 ). also Ġ{ Ġcamera Ġ-> ĊĠĠĠĠĠĠĠ Ġcamera . position . z Ġ= Ġ 1 0 0 0 . 0 ĊĠĠĠĠĠĠĠ Ġui Scene . add ( camera ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġui Controls : ĠCamera Controls Ġ= ĠCamera Controls ( ui Camera , Ġui Renderer . dom Element ) ĊĠĠĠ Ġval Ġwire frame Ġ= ĠObject 3 D () ĊĊĠĠĠ Ġprivate Ġval Ġselected Sur faces Ġ= Ġmutable ListOf < Panel Info >() ĊĠĠĠ Ġprivate Ġvar Ġui Locked : ĠBoolean Ġby Ġnotify OnChange ( false ) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġui 2 d Canvas : ĠHTML Canvas Element ĊĊĠĠĠ Ġprivate Ġval Ġui 3 d Canvas Ġ= Ġui Renderer . dom Element ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsnapshot Canvas : ĠHTML Canvas Element ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbase Canvas : ĠHTML Canvas Element ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdiff Canvas : ĠHTML Canvas Element ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdiff Ctx : ĠCanvas Rendering Context 2 D ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpanel Mask Canvas : ĠHTML Canvas Element ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġperf Stats Div : ĠHTMLElement ĊĊĠĠĠ Ġval Ġsessions Ġ= Ġarray ListOf < String >() ĊĠĠĠ Ġvar Ġselected Mapping Session : ĠString ? Ġby Ġnotify OnChange ( null ) ĊĊĠĠĠ Ġvar Ġpause Button Enabled Ġby Ġnotify OnChange ( true ) ĊĠĠĠ Ġvar Ġplay Button Enabled Ġby Ġnotify OnChange ( true ) ĊĊĠĠĠ Ġprivate Ġval Ġentity De pi ctions Ġ= Ġmutable Map Of < Model . Entity , ĠPanel Info >() ĊĊĠĠĠ Ġprivate Ġvar Ġcommand Progress Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġcamera Z Rotation Ġ= Ġ 0 f ĊĊĠĠĠ Ġval Ġmapper Status Ġ= ĠMapper Status () ĊĊĠĠĠ Ġvar Ġredo Fn : Ġ(() Ġ-> ĠUnit )? Ġby Ġnotify OnChange ( null ) ĊĊĠĠĠ Ġfun Ġon Mount ( ĊĠĠĠĠĠĠĠ Ġui 2 d Canvas : ĠHTML Canvas Element , ĊĠĠĠĠĠĠĠ Ġui 3 d Div : ĠHTMLElement , ĊĠĠĠĠĠĠĠ Ġsnapshot Canvas : ĠHTML Canvas Element , ĊĠĠĠĠĠĠĠ Ġbase Canvas : ĠHTML Canvas Element , ĊĠĠĠĠĠĠĠ Ġdiff Canvas : ĠHTML Canvas Element , ĊĠĠĠĠĠĠĠ Ġpanel Mask Canvas : ĠHTML Canvas Element , ĊĠĠĠĠĠĠĠ Ġperf Stats Div : ĠHTMLElement , ĊĠĠĠĠĠĠĠ Ġwidth : ĠInt , ĊĠĠĠĠĠĠĠ Ġheight : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . ui 2 d Canvas Ġ= Ġui 2 d Canvas ĊĠĠĠĠĠĠĠ Ġthis . diff Canvas Ġ= Ġdiff Canvas ĊĠĠĠĠĠĠĠ Ġthis . snapshot Canvas Ġ= Ġsnapshot Canvas ĊĠĠĠĠĠĠĠ Ġthis . base Canvas Ġ= Ġbase Canvas ĊĠĠĠĠĠĠĠ Ġthis . diff Ctx Ġ= Ġdiff Canvas . context 2 d () ĊĠĠĠĠĠĠĠ Ġthis . panel Mask Canvas Ġ= Ġpanel Mask Canvas ĊĠĠĠĠĠĠĠ Ġthis . perf Stats Div Ġ= Ġperf Stats Div ĊĊĠĠĠĠĠĠĠ Ġon Resize ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġstatus Listener ?. mapper Status Changed ( true ) ĊĊĠĠĠĠĠĠĠ Ġui 3 d Div . appendChild ( ui 3 d Canvas ) Ċ Ċ // ĠĠĠĠĠĠĠ Ġscreen . focus () Ċ // ĠĠĠĠĠĠĠ Ġscreen . addEventListener (" keydown ", Ġ{ Ġevent Ġ-> Ġgot Ui Key press ( event Ġas ĠKeyboard Event ) Ġ}) ĊĊĠĠĠĠĠĠĠ Ġdraw AnimationFrame () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Unmount () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġgot Ui Key press ( event : ĠKeyboard Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event . code Ġ== Ġ" Enter ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Command ( command Progress . trim ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Progress Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( event . code Ġ== Ġ" Back space ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( command Progress . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Progress Ġ= Ġcommand Progress . substring ( 0 .. ( command Progress . length Ġ- Ġ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Progress () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( command Progress . isEmpty () Ġ&& Ġevent . code Ġ== Ġ" Key Q ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Camera Rotation ( if Ġ( event . shift Key ) Ġ 0 . 0 2 5 f Ġelse Ġ 0 . 1 f ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( command Progress . isEmpty () Ġ&& Ġevent . code Ġ== Ġ" Key W ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Camera Rotation ( if Ġ( event . shift Key ) Ġ- 0 . 0 2 5 f Ġelse Ġ- 0 . 1 f ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( command Progress . isEmpty () Ġ&& Ġevent . code Ġ== Ġ" Digit 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Z Rotation Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( event . key . length Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Progress Ġ+= Ġevent . key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Progress () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshow Message 2 ( command Progress ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( command Progress . startsWith ("/") Ġ&& Ġcommand Progress . length Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect Sur faces Matching ( command Progress . substring ( 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Existing Session ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsessions . add ( name ) ĊĠĠĠĠĠĠĠ Ġnotify Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Camera Rotation () Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera Z Rotation Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġupdate Camera Rotation ( 0 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Camera Rotation ( angle : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera Z Rotation Ġ+= Ġangle ĊĠĠĠĠĠĠĠ Ġui Camera . up . set ( 0 , Ġ 1 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcamera Angle Ġ= ĠMatrix 4 () ĊĠĠĠĠĠĠĠ Ġval Ġrotated Ġ= Ġcamera Angle . make Rotation Z ( camera Z Rotation . toDouble ()) ĊĠĠĠĠĠĠĠ Ġui Camera . up . apply Matrix 4 ( rot ated ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Sur faces Matching ( pattern : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġselected Sur faces . forEach Ġ{ Ġit . de select () Ġ} ĊĠĠĠĠĠĠĠ Ġselected Sur faces . clear () ĊĠĠĠĠĠĠĠ Ġselected Sur faces . addAll ( entity De pi ctions . values . filter Ġ{ Ġit . surface . name . contains ( pattern , Ġtrue ) Ġ}) ĊĠĠĠĠĠĠĠ Ġselected Sur faces . forEach Ġ{ Ġit . select () Ġ} ĊĠĠĠĠĠĠĠ Ġnotify Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Command ( command : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconsole . log ( command ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( command . startsWith (" g ", Ġignore Case Ġ= Ġtrue ) Ġ|| Ġcommand . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsurface Name Ġ= Ġcommand . substring ( 1 ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgo To Surface ( surface Name . uppercase ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw AnimationFrame () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! ui Locked ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Controls . update ( clock . get Delta ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġui Renderer . render ( ui Scene , Ġui Camera ) ĊĊĠĠĠĠĠĠĠ Ġupdate Stats () ĊĊĠĠĠĠĠĠĠ Ġwindow . request AnimationFrame Ġ{ Ġdraw AnimationFrame () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Stats () Ġ{ ĊĠĠĠĠĠĠĠ Ġperf Stats Div . innerText Ġ= ĠMapper . mapper Stats . sum mar ize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender (): ĠReact Element < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠcreateElement ( Scene Editor View , Ġj so Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Editor Client Ġ= Ġthis @ Js Mapper Ui . scene Editor Client . facade ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper Ui Ġ= Ġthis @ Js Mapper Ui ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Manager Ġ= Ġthis @ Js Mapper Ui . scene Manager . facade ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Launch () Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener . on Launch () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClose () Ġ{ ĊĠĠĠĠĠĠĠ Ġstatus Listener ?. mapper Status Changed ( false ) ĊĊĠĠĠĠĠĠĠ Ġlistener . onClose () ĊĠĠĠĠĠĠĠ Ġscene Editor Client . onClose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Resize ( width : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbrowser Dim en Ġ= ĠDim en ( width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġresize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Cam Resize ( dim en : ĠDim en ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlast Cam Image Dim en Ġ= Ġdim en ĊĠĠĠĠĠĠĠ Ġresize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresize () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontainer Dim en Ġ= Ġbrowser Dim en ĊĠĠĠĠĠĠĠ Ġviewport Dim en Ġ= Ġcontainer Dim en . best Fit ( last Cam Image Dim en ) ĊĠĠĠĠĠĠĠ Ġui 2 d Canvas . resize ( viewport Dim en ) ĊĠĠĠĠĠĠĠ Ġui 2 d Canvas . width Ġ= Ġviewport Dim en . width ĊĠĠĠĠĠĠĠ Ġui 2 d Canvas . height Ġ= Ġviewport Dim en . height ĊĊĠĠĠĠĠĠĠ Ġui Camera . aspect Ġ= Ġviewport Dim en . aspect () ĊĠĠĠĠĠĠĠ Ġui Camera . update Projection Matrix () ĊĊĠĠĠĠĠĠĠ Ġui Renderer . setSize ( viewport Dim en . width , Ġviewport Dim en . height , Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġthumbnail Dim en Ġ= Ġ( container Dim en Ġ* Ġ. 2 2 f ). best Fit ( viewport Dim en ) ĊĠĠĠĠĠĠĠ Ġsnapshot Canvas . resize ( thumbnail Dim en ) ĊĠĠĠĠĠĠĠ Ġdiff Canvas . resize ( thumbnail Dim en ) ĊĠĠĠĠĠĠĠ Ġbase Canvas . resize ( thumbnail Dim en ) ĊĠĠĠĠĠĠĠ Ġpanel Mask Canvas . resize ( thumbnail Dim en ) ĊĊĠĠĠĠĠĠĠ Ġnotify Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠHTML Canvas Element . resize ( dim en : ĠDim en ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwidth Ġ= Ġdim en . width ĊĠĠĠĠĠĠĠ Ġheight Ġ= Ġdim en . height ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Wire frame ( model : ĠModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel . all Entities ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġ( it Ġas ? ĠModel . Entity With Geometry )?. geometry Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( geometry , Ġentities ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertices Ġ= Ġgeometry ?. vertices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . map Ġ{ Ġv Ġ-> ĠVector 3 ( v . x , Ġv . y , Ġv . z ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . to Typed Array () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentities . forEach Ġ{ Ġentity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠAdd Ġwire frame Ġde pi ction Ġfor Ġother Ġentity Ġtypes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entity Ġis ĠModel . Surface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity De pi ctions [ entity ] Ġ= Ġcreate Entity De pi ction ( entity , Ġvertices ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġui Scene . add ( wire frame ) ĊĊĠĠĠĠĠĠĠ Ġval Ġorigin Marker Ġ= ĠMesh ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSphere Buffer Geometry ( 1 , Ġ 3 2 , Ġ 3 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMesh Basic Material (). apply Ġ{ Ġcolor Ġ= ĠColor ( 0 xff 0 0 0 0 ) Ġ}) ĊĠĠĠĠĠĠĠ Ġui Scene . add ( origin Marker ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbounding Box Ġ= ĠBox 3 (). set From Object ( wire frame ) ĊĠĠĠĠĠĠĠ Ġui Controls . fit To Box ( bounding Box , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Entity De pi ction ( entity : ĠModel . Surface , Ġvertices : ĠArray < Vector 3 >? ): ĠPanel Info Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsurface Ġ= Ġentity ĊĊĠĠĠĠĠĠĠ Ġif Ġ( vertices Ġ== Ġnull ) Ġerror (" No Ġvertices Ġfor Ġsurface Ġ${ entity . name } !") ĊĠĠĠĠĠĠĠ Ġval Ġgeom Ġ= ĠGeometry () ĊĠĠĠĠĠĠĠ Ġgeom . vertices Ġ= Ġvertices ĊĊĠĠĠĠĠĠĠ Ġval Ġface Normal Acc Ġ= ĠVector 3 () ĊĠĠĠĠĠĠĠ Ġval Ġpanel Faces Ġ= Ġsurface . faces . map Ġ{ Ġface Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġface 3 Ġ= ĠFace 3 ( face . vertex A , Ġface . vertex B , Ġface . vertex C , ĠVector 3 (), ĠColor ( 1 , Ġ 1 , Ġ 1 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjust Ġcompute Ġthis Ġface 's Ġnormal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeom . faces Ġ= ĠarrayOf ( face 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgeom . compute Face Normals () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġface Normal Acc . add ( face 3 . normal ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġface 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsurface Normal Ġ= Ġface Normal Acc . divide Scalar ( surface . faces . size . toDouble ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġpanel Material Ġ= ĠMesh Basic Material (). apply Ġ{ Ġcolor Ġ= ĠColor ( 0 , Ġ 0 , Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmesh Ġ= ĠMesh ( geom , Ġpanel Material ) ĊĠĠĠĠĠĠĠ Ġmesh . as Dynamic (). name Ġ= Ġsurface . name ĊĠĠĠĠĠĠĠ Ġui Scene . add ( mesh ) ĊĊĠĠĠĠĠĠĠ Ġval Ġline Material Ġ= ĠLine Basic Material (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor ( 0 f , Ġ 1 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlinewidth Ġ= Ġ 2 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġoffset Ġthe Ġwire frame Ġby Ġone Ġof Ġthe Ġpanel 's Ġface Ġnormals Ġso Ġit 's Ġnot Ġcli pped Ġby Ġthe Ġpanel Ġmesh ĊĠĠĠĠĠĠĠ Ġsurface . lines . forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Geom Ġ= ĠBuffer Geometry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Geom . set From Points ( line . vertices . map Ġ{ Ġpt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpt . to Vector 3 () Ġ+ Ġsurface Normal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwire frame . add ( Line ( line Geom , Ġline Material )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgeom . faces Ġ= Ġpanel Faces . to Typed Array () ĊĠĠĠĠĠĠĠ Ġgeom . compute Face Normals () ĊĠĠĠĠĠĠĠ Ġgeom . compute Vertex Normals () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPanel Info ( surface , Ġpanel Faces , Ġmesh , Ġgeom , Ġline Material ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠPanel Info ( ĊĠĠĠĠĠĠĠ Ġval Ġsurface : ĠModel . Surface , ĊĠĠĠĠĠĠĠ Ġval Ġfaces : ĠList < Face 3 >, ĊĠĠĠĠĠĠĠ Ġval Ġmesh : ĠMesh < *, Ġ* >, ĊĠĠĠĠĠĠĠ Ġval Ġgeom : ĠGeometry , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġline Material : ĠLine Basic Material ĊĠĠĠ Ġ) Ġ: ĠMapper Ui . Entity De pi ction Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġentity : ĠModel . Entity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġsurface ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpixels Geom Ġ= ĠBuffer Geometry () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpixels Material Ġ= ĠPoints Material (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor ( 0 x 0 0 FF 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġpixels In Scene Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpixels Points Ġ= ĠPoints ( pixels Geom , Ġpixels Material ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixels In Scene ) Ġui Scene . add ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpixel Locations Ġ= Ġmutable Map Of < Int , ĠVector 3 ?> () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġmax Pixel Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġpixels In Model Space : ĠList < Vector 3 F ?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvectors Ġ= Ġmutable ListOf < Vector 3 F ?> () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. ( pixel Locations . keys . max OrNull () !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġpixel Locations [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvectors . add ( position ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVector 3 F ( it . x . toFloat (), Ġit . y . toFloat (), Ġit . z . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvectors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġvertices : ĠSet < Vector 3 > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġmutable Set Of < Vector 3 >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( face Ġin Ġfaces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . add ( geom . vertices [ face . a ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . add ( geom . vertices [ face . b ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . add ( geom . vertices [ face . c ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ bounding Box : ĠBox 3 Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbounding Box Ġ= ĠBox 3 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( vertex Ġin Ġvertices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounding Box . expand By Point ( vertex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounding Box . translate ( mesh . get World Position ( Vector 3 ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbounding Box Ġget () Ġ= Ġ_ bounding Box . clone () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrot ator Ġby Ġlazy Ġ{ ĠRot ator ( surface Normal , Ġvector 3 Facing Forward ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġto Surface Normal ( point : ĠVector 3 ): ĠVector 3 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrot ator . rotate ( point ); Ġreturn Ġpoint ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnormal BoundingBox : ĠBox 3 Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworld Pos Ġ= Ġmesh . get World Position ( Vector 3 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbounding Box Ġ= ĠBox 3 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( vertex Ġin Ġvertices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounding Box . expand By Point ( to Surface Normal ( vertex ). add ( world Pos )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounding Box ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnormal BoundingBox Volume : ĠVector 3 Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormal BoundingBox . max . clone (). sub ( normal BoundingBox . min ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Panel Space ( point : ĠVector 3 ): ĠVector 3 Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpt Ġ= Ġpoint . clone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpt Ġ= Ġto Surface Normal ( pt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpt . sub ( normal BoundingBox . min ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpt . divide ( normal BoundingBox Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpt ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġselect () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Material . color . r Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Material . color . g Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġde select () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Material . color . r Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Material . color . g Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcenter Ġget () Ġ= Ġbounding Box . get Center ( Vector 3 ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġis Multi Fac ed Ġget () Ġ= Ġfaces . size Ġ> Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġ_ surface Normal : ĠVector 3 Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġface Normal Sum Ġ= ĠVector 3 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Area Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( face Ġin Ġfaces ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtriangle Ġ= ĠTriangle ( geom . vertices [ face . a ], Ġgeom . vertices [ face . b ], Ġgeom . vertices [ face . c ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġface Area Ġ= Ġtriangle . get Area () Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface Normal Sum . add Scaled Vector ( face . normal , Ġface Area ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Area Ġ+= Ġface Area ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġface Normal Sum . divide Scalar ( total Area . toDouble ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsurface Normal Ġget () Ġ= Ġ_ surface Normal . clone () ĊĊĠĠĠĠĠĠĠ Ġvar Ġbox On Screen : ĠBox 2 ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset Pixel ( index : ĠInt , Ġmodel Position : ĠVector 3 F ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixel Locations [ index ] Ġ= Ġmodel Position ?. to Vector 3 () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġmax Pixel ) Ġmax Pixel Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Pixels () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshow Pixels () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! pixels In Scene ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui Scene . add ( pixels Points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels In Scene Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġhide Pixels () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixels In Scene ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġui Scene . remove ( pixels Points ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels In Scene Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreset Pixels () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpixel Locations . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Pixel Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Pixels () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġupdate Pixels () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pixels In Scene ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpositions Ġ= ĠArray (( max Pixel Ġ+ Ġ 1 ) Ġ* Ġ 3 ) Ġ{ Ġ 0 f Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġmax Pixel ). forEach Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloc Ġ= Ġpixel Locations [ i ] Ġ?: ĠVector 3 ( 0 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositions [ i Ġ* Ġ 3 ] Ġ= Ġloc . x . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositions [ i Ġ* Ġ 3 Ġ+ Ġ 1 ] Ġ= Ġloc . y . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositions [ i Ġ* Ġ 3 Ġ+ Ġ 2 ] Ġ= Ġloc . z . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpixels Geom . setAttribute (" position ", ĠFloat 3 2 Buffer Attribute ( positions , Ġ 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġlock Ui (): ĠMapper Ui . Camera Orientation Ġ{ ĊĠĠĠĠĠĠĠ Ġui Locked Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn ĠCamera Orientation . from ( ui Camera ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġunlock Ui () Ġ{ ĊĠĠĠĠĠĠĠ Ġui Locked Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetAll Surface Visual izers (): ĠList < Mapper Ui . Entity De pi ction > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġentity De pi ctions . values . toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Visible Sur faces (): ĠList < Mapper Ui . Visible Surface > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvisible Sur faces Ġ= Ġmutable ListOf < Mapper Ui . Visible Surface >() ĊĠĠĠĠĠĠĠ Ġval Ġscreen Box Ġ= Ġget Screen Box () ĊĠĠĠĠĠĠĠ Ġval Ġscreen Center Ġ= Ġscreen Box . center ĊĠĠĠĠĠĠĠ Ġval Ġcamera Orientation Ġ= ĠCamera Orientation . from ( ui Camera ) ĊĊĠĠĠĠĠĠĠ Ġentity De pi ctions . forEach Ġ{ Ġ( entity , Ġpanel Info ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpanel Position Ġ= Ġpanel Info . geom . vertices [ panel Info . faces [ 0 ]. a ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir To Camera Ġ= Ġui Camera . position . clone (). sub ( panel Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir To Camera . normalize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġangle Ġ= Ġpanel Info . faces [ 0 ]. normal . dot ( dir To Camera ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( angle Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Info . mesh . update Matrix World () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpanel BoundingBox Ġ= Ġpanel Info . bounding Box . project ( ui Camera ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpanel Box On Screen Ġ= Ġcalc BoundingBox On Screen ( panel BoundingBox , Ġscreen Center ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Info . box On Screen Ġ= Ġpanel Box On Screen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( panel Box On Screen . intersect s Box ( screen Box )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġregion Ġ= ĠMedia Devices . Region ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Box On Screen . min . x . round ToInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Box On Screen . min . y . round ToInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Box On Screen . max . x . round ToInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Box On Screen . max . y . round ToInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġviewport Dim en ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Sur faces . add ( Visible Surface ( entity , Ġregion , Ġpanel Info , Ġcamera Orientation )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġvisible Sur faces ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠVis ible Surface ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġentity : ĠModel . Entity , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġbox On Screen : ĠMedia Devices . Region , ĊĠĠĠĠĠĠĠ Ġval Ġpanel Info : ĠPanel Info , ĊĠĠĠĠĠĠĠ Ġcamera Orientation : ĠCamera Orientation ĊĠĠĠ Ġ) Ġ: ĠMapper Ui . Visible Surface Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcamera Ġ= Ġcamera Orientation . create Camera () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġpixels In Model Space : ĠList < Vector 3 F ?> Ġget () Ġ= Ġpanel Info . pixels In Model Space ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset Pixel ( pixel Index : ĠInt , Ġuv : ĠU v ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintersect Ġ= Ġfind Intersection ( uv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition In Model Ġ= Ġintersect ?. point ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Info . set Pixel ( pixel Index , Ġposition In Model ?. to Vector 3 F ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset Pixel ( pixel Index : ĠInt , Ġpanel Space Position : ĠVector 3 F ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Info . set Pixel ( pixel Index , Ġpanel Space Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtranslate Pixel To Panel Space ( uv : ĠU v ): ĠVector 2 F ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintersection Ġ= Ġfind Intersection ( uv ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġpanel Info . to Panel Space ( intersection . point . clone ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" ĠĠ Ġ---- >", Ġpoint . x , Ġpoint . y , Ġpoint . z ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠVector 2 F ( point . x . toFloat (), Ġpoint . y . toFloat ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfind Intersection ( uv : ĠU v ): ĠIntersection ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġray caster Ġ= ĠRay caster () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġray caster . set From Camera ( uv . to Vector 2 (), Ġcamera ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinter sections Ġ= Ġray caster . intersect Object ( panel Info . mesh , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intersection s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" Couldn 't Ġfind Ġpoint Ġin Ġ${ entity . name }, Ġsearching Ġin Ġscene ..." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinter sections Ġ= Ġray caster . intersect Object ( ui Scene , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconsole . log (" Found Ġinter sections : Ġ", Ġinter sections ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( intersection s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinter sections . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshow Pixels () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Info . show Pixels () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhide Pixels () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Info . hide Pixels () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreset Pixels () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Info . reset Pixels () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCamera Orientation ( override Ġval Ġcamera Matrix : Ġb aa ah s . geom . Matrix 4 F , Ġoverride Ġval Ġaspect : ĠDouble ) Ġ: ĊĠĠĠĠĠĠĠ ĠMapper Ui . Camera Orientation Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate Camera (): ĠPers pective Camera Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPers pective Camera ( 4 5 , Ġaspect , Ġ 1 , Ġ 1 0 0 0 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . from Array ( camera Matrix . elements . toDouble Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġback Ġposition / rotation / scale Ġattributes . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatrix . as Dynamic (). de compose ( position , Ġquaternion , Ġscale ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Matrix World () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom ( camera : ĠPers pective Camera ): ĠCamera Orientation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCamera Orientation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb aa ah s . geom . Matrix 4 F ( camera . matrix . elements . map Ġ{ Ġit . toFloat () Ġ}. toFloat Array ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera . aspect . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Candidates ( ordered Panels : ĠList < Pair < Mapper Ui . Visible Surface , ĠFloat >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġordered Panels Ġas ĠList < Pair < Visible Surface , ĠFloat >> ĊĊĠĠĠĠĠĠĠ Ġval Ġfirst Guess Ġ= Ġordered Panels . first () ĊĠĠĠĠĠĠĠ Ġ( first Guess . first . panel Info . mesh . material Ġas ĠMesh Basic Material ). color . r Ġ+= Ġ. 2 5 ĊĊĠĠĠĠĠĠĠ Ġmapper Status . ordered Panels Ġ= Ġordered Panels ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġintersect ing Surface ( uv : ĠU v , Ġvisible Sur faces : ĠList < Mapper Ui . Visible Surface >): ĠMapper Ui . Visible Surface ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġray caster Ġ= ĠRay caster () ĊĠĠĠĠĠĠĠ Ġval Ġpixel Vector Ġ= Ġuv . to Vector 2 () ĊĠĠĠĠĠĠĠ Ġray caster . set From Camera ( pixel Vector , Ġui Camera ) ĊĠĠĠĠĠĠĠ Ġval Ġinter sections Ġ= Ġray caster . intersect Object ( ui Scene , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( intersection s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintersect Ġ= Ġinter sections . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisible Sur faces . find Ġ{ Ġit . entity . name Ġ== Ġintersect .` object `. name Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Screen Box (): ĠBox 2 Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWork around Ġfor ĠKotlin / JS Ġbug : ĊĠĠĠĠĠĠĠ Ġreturn ĠBox 2 ( Vector 2 ( 0 , Ġ 0 ), ĠVector 2 ( browser Dim en . width , Ġbrowser Dim en . height )) Ċ // ĠĠĠĠĠĠĠ Ġreturn ĠBox 2 ( Vector 2 ( 0 , Ġ 0 ), Ġbrowser Dim en . to Vector 2 ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalc BoundingBox On Screen ( box : ĠBox 3 , Ġscreen Center : ĠVector 2 ): ĠBox 2 Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmin X Ġ= Ġ(( box . min . x Ġ* Ġscreen Center . x ) Ġ+ Ġscreen Center . x ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġmax X Ġ= Ġ(( box . max . x Ġ* Ġscreen Center . x ) Ġ+ Ġscreen Center . x ). toInt () ĊĊĠĠĠĠĠĠĠ Ġ// ĠIn vert ĠY Ġfor Ġscreen Ġcoordinates . ĊĠĠĠĠĠĠĠ Ġval Ġmin Y Ġ= Ġ(( - box . max . y Ġ* Ġscreen Center . y ) Ġ+ Ġscreen Center . y ). toInt () ĊĠĠĠĠĠĠĠ Ġval Ġmax Y Ġ= Ġ(( - box . min . y Ġ* Ġscreen Center . y ) Ġ+ Ġscreen Center . y ). toInt () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠBox 2 ( Vector 2 ( min X , Ġmin Y ), ĠVector 2 ( max X , Ġmax Y )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Live Cam Image ( image : ĠImage , Ġchange Region : ĠMedia Devices . Region ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( image . dim en Ġ!= Ġlast Cam Image Dim en ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Cam Resize ( image . dim en ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠCanvas Bitmap ( ui 2 d Canvas ). drawImage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 , Ġimage . width , Ġimage . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 , Ġviewport Dim en . width , Ġviewport Dim en . height , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġchange Region ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġui 2 d Ctx Ġ= Ġui 2 d Canvas . getContext (" 2 d ") Ġas ĠCanvas Rendering Context 2 D ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui 2 d Ctx . lineWidth Ġ= Ġ 2 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui 2 d Ctx . stroke Style Ġ= Ġ"# ff 0 0 0 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui 2 d Ctx . stroke Rect ( x 0 . toDouble (), Ġy 0 . toDouble (), Ġwidth . toDouble (), Ġheight . toDouble ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Snapshot ( bitmap : ĠBitmap ) Ġ= ĊĠĠĠĠĠĠĠ Ġsnapshot Canvas . show Image ( bitmap ) ĊĊĠĠĠ Ġoverride Ġfun Ġshow Base Image ( bitmap : ĠBitmap ) Ġ= ĊĠĠĠĠĠĠĠ Ġbase Canvas . show Image ( bitmap ) ĊĊĠĠĠ Ġoverride Ġfun Ġshow Diff Image ( delta Bitmap : ĠBitmap , Ġchange Region : ĠMedia Devices . Region ?) Ġ= ĊĠĠĠĠĠĠĠ Ġdiff Canvas . show Image ( delta Bitmap , Ġchange Region ) ĊĊĠĠĠ Ġoverride Ġfun Ġshow Panel Mask ( bitmap : ĠBitmap , Ġchange Region : ĠMedia Devices . Region ?) Ġ= ĊĠĠĠĠĠĠĠ Ġpanel Mask Canvas . show Image ( bitmap , Ġchange Region ) ĊĊĠĠĠ Ġoverride Ġfun Ġshow Message ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmapper Status . message Ġ= Ġmessage ĊĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" Message : Ġ$ message " Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Message 2 ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmapper Status . message 2 Ġ= Ġmessage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠHTML Canvas Element . show Image ( bitmap : ĠBitmap , Ġchange Region : ĠMedia Devices . Region ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġctx 2 d Ġ= ĠgetContext (" 2 d ") Ġas ĠCanvas Rendering Context 2 D ĊĠĠĠĠĠĠĠ Ġctx 2 d . reset Transform () ĊĠĠĠĠĠĠĠ Ġval Ġrender Bitmap Ġ= Ġwhen Ġ( bitmap ) Ġ{ Ġ// ĠTODO : Ġh uh ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNative Bitmap Ġ-> Ġbitmap . canvas ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCanvas Bitmap Ġ-> Ġbitmap . canvas ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbitmap Ġas ĠCanvas Image Source ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdraw Size Ġ= ĠDim en ( width , Ġheight ). best Fit ( bitmap . dim en ) ĊĠĠĠĠĠĠĠ Ġctx 2 d . drawImage ( render Bitmap , Ġ 0 . 0 , Ġ 0 . 0 , Ġdraw Size . width . toDouble (), Ġdraw Size . height . toDouble ()) ĊĊĠĠĠĠĠĠĠ Ġchange Region ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx 2 d . stroke Style Ġ= Ġ"# ff 0 0 0 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx 2 d . lineWidth Ġ= Ġ 1 . 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdraw Scale X Ġ= Ġdraw Size . width Ġ/ Ġbitmap . width . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdraw Scale Y Ġ= Ġdraw Size . height Ġ/ Ġbitmap . height . toDouble () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx 2 d . stroke Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx 0 . toDouble () Ġ* Ġdraw Scale X Ġ- Ġ 1 , Ġy 0 . toDouble () Ġ* Ġdraw Scale Y Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchange Region . width Ġ* Ġdraw Scale X Ġ+ Ġ 2 , Ġchange Region . height Ġ* Ġdraw Scale Y Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Redo ( fn : Ġ( suspend Ġ() Ġ-> ĠUnit )? ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fn Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredo Fn Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġredo Fn Ġ= Ġ{ ĠGlobal Scope . launch Ġ{ Ġfn () Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Stats ( total : ĠInt , Ġmapped : ĠInt , Ġvisible : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmapper Status . stats Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi (" fas Ġfa - triangle ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+" Mapped : Ġ$ mapped Ġ/ Ġ$ total " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbr Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+" Visible : Ġ$ visible " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpause ForUser Interaction () Ġ{ ĊĠĠĠĠĠĠĠ Ġclicked Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchanged Camera ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected DeviceId Ġ= Ġevent . target ?. value ĊĠĠĠĠĠĠĠ Ġselected Device Ġ= Ġdevices . find Ġ{ Ġit . deviceId Ġ== Ġselected DeviceId Ġ} ĊĊĠĠĠĠĠĠĠ Ġlistener . use Camera ( selected Device ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclicked Play () Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Pause Mode ( false ) ĊĠĠĠĠĠĠĠ Ġlistener . onStart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclicked Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Pause Mode ( true ) ĊĠĠĠĠĠĠĠ Ġlistener . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclicked Redo () Ġ{ ĊĠĠĠĠĠĠĠ Ġredo Fn ?. invoke () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Pause Mode ( is Paused : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpause Button Enabled Ġ= Ġ! is Paused ĊĠĠĠĠĠĠĠ Ġplay Button Enabled Ġ= Ġis Paused ĊĠĠĠĠĠĠĠ Ġnotify Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclicked Start () Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener . onStart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclicked Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclicked Go To Surface () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsurface Name Ġ= Ġwindow . prompt (" Surface :") ĊĠĠĠĠĠĠĠ Ġif Ġ( surface Name Ġ!= Ġnull Ġ&& Ġsurface Name . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgo To Surface ( surface Name . uppercase ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Mapping Session ( event : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmapping Session To Load Ġ= Ġevent . target ?. value ĊĠĠĠĠĠĠĠ Ġselected Mapping Session Ġ= Ġmapping Session To Load ĊĊĠĠĠĠĠĠĠ Ġlistener . load Mapping Session ( mapping Session To Load ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgo To Surface ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsurface Ġ= Ġentity De pi ctions . keys . find Ġ{ Ġit . name Ġ== Ġname Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( surface Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpanel Info Ġ= Ġentity De pi ctions [ surface ] !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpanel Info . geom . compute BoundingBox () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsurface Center Ġ= Ġpanel Info . center ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsurface Normal Ġ= Ġpanel Info . surface Normal ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Cam Position Ġ= Ġsurface Center . clone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Cam Position . add ( surface Normal . clone (). multiply Scalar ( 1 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset Camera Rotation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui Controls . set Look At ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Cam Position . x , Ġnew Cam Position . y , Ġnew Cam Position . z , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Center . x , Ġsurface Center . y , Ġsurface Center . z , Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠStatus Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġmapper Status Changed ( isRunning : ĠBoolean ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġlogger Ġ= ĠLogger < Js Mapper Ui >() ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠBox 2 . center : ĠVector 2 Ġget () Ġ= Ġmax . clone (). sub ( min ). divide Scalar ( 2 ). add ( min ) Ċ Ċ private Ġfun ĠBox 3 . project ( camera : ĠCamera ): ĠBox 3 Ġ{ ĊĠĠĠ Ġmin . project ( camera ) ĊĠĠĠ Ġmax . project ( camera ) ĊĊĠĠĠ Ġ// ĠProjection Ġmay Ġcause Ġmin / max Ġto Ġbe Ġsw apped ; Ġcorrect . ĊĠĠĠ Ġif Ġ( min . x Ġ> Ġmax . x ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġmin . x ; Ġmin . x Ġ= Ġmax . x ; Ġmax . x Ġ= Ġtemp ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( min . y Ġ> Ġmax . y ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġmin . y ; Ġmin . y Ġ= Ġmax . y ; Ġmax . y Ġ= Ġtemp ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( min . z Ġ> Ġmax . z ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Ġ= Ġmin . z ; Ġmin . z Ġ= Ġmax . z ; Ġmax . z Ġ= Ġtemp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ fun ĠU v . to Vector 2 () Ġ= ĠVector 2 ( ĊĠĠĠ Ġu Ġ* Ġ 2 Ġ- Ġ 1 , ĊĠĠĠ Ġ-( v Ġ* Ġ 2 Ġ- Ġ 1 ) Ċ )