package Ġb oids Ċ Ċ import Ġb oids . be haviors . Behavior Ċ import Ġb oids . ext .* Ċ import Ġb oids . scene . Spatial Bin L attice Ċ import Ġthree . js . Group Ċ import Ġthree . js . Vector 3 Ċ import Ġkotlin . math . min Ċ Ċ class ĠF lock ( num B oids : ĠInt , Ġprivate Ġval Ġbehaviors : ĠList < Behavior >) Ġ: ĠObject 3 D Holder () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġscene Object Ġ= ĠGroup () ĊĊĠĠĠ Ġprivate Ġval Ġb oids Ġ= Ġ( 0 Ġuntil Ġnum B oids ). map Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġpos Ġ= ĠVector 3 (- HALF _ SC ENE _ SIZE Ġ+ Ġi Ġ* Ġ( SC ENE _ SIZE Ġ/ ĠNUM _ BO IDS ), ĠBO ID _ FL IGHT _ HEIGHT , ĠHAL F _ SC ENE _ SIZE Ġ- Ġi ) ĊĠĠĠĠĠĠĠ Ġval Ġanchor Ġ= ĠVector 3 ( 0 , ĠBO ID _ FL IGHT _ HEIGHT , Ġ- HALF _ SC ENE _ SIZE ) ĊĠĠĠĠĠĠĠ ĠB oid ( position Ġ= Ġpos , Ġangle Ġ= Ġanchor . sub ( pos ). as Angle ()) ĊĠĠĠ Ġ}. to Typed Array () Ċ Ċ // ĠĠĠ Ġprivate Ġval Ġb oids Ġ= ĠarrayOf ( Ċ // ĠĠĠĠĠĠĠ ĠB oid ( position Ġ= ĠVector 3 (- 1 0 , Ġ 3 , ĠHAL F _ SC ENE _ SIZE Ġ- Ġ 1 ), Ġangle Ġ= Ġ 1 6 0 . to Radians ()), Ċ // ĠĠĠĠĠĠĠ ĠB oid ( position Ġ= ĠVector 3 ( 0 , Ġ 3 , ĠHAL F _ SC ENE _ SIZE ), Ġangle Ġ= Ġ 1 8 0 . to Radians (), Ġcolor Ġ= Ġ 0 x 0 0 ff 0 0 ), Ċ // ĠĠĠĠĠĠĠ ĠB oid ( position Ġ= ĠVector 3 ( 1 0 , Ġ 3 , ĠHAL F _ SC ENE _ SIZE Ġ- Ġ 3 ), Ġangle Ġ= Ġ 2 0 0 . to Radians ()), Ċ // ĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġtotal Force Ġ= ĠVector 3 () Ġ// ĠUtility Ġto Ġprevent Ġobject Ġcreation ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġb oids . forEach Ġ{ Ġscene Object . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ) Ġ= Ġb oids [ index ] ĊĊĠĠĠ Ġprivate Ġval Ġ_ center Of Gravity Ġ= ĠVector 3 () ĊĠĠĠ Ġval Ġcenter Of Gravity Ġget (): ĠVector 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ center Of Gravity . zero () ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġb oids . indices Ġstep Ġ 2 ) Ġ_ center Of Gravity . add ( b oids [ n ]. position ) ĊĠĠĠĠĠĠĠ Ġ_ center Of Gravity . divide Scalar ( b oids . size Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ_ center Of Gravity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( time : ĠDouble ) Ġ= Ġb oids . forEach Ġnext B oid @ Ġ{ Ġb oid Ġ-> ĊĠĠĠĠĠĠĠ Ġtotal Force . zero () ĊĊĠĠĠĠĠĠĠ Ġval Ġneighbors Iterator Ġ= ĠSpatial Bin L attice . get Spatial Neighbors ( b oid ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġtotal Weight Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġbehaviors . forEach Ġnext Behavior @ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Effective ( b oid )) Ġreturn @ next Behavior ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġforce Ġ= Ġit . get Ste ering Force ( b oid , Ġneighbors Iterator . rewind ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( force . is Zero ) Ġreturn @ next Behavior ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . overrides Lower Priority Be haviors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb oid . apply Ste ering Force ( force ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb oid . update ( time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ next B oid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠT aking Ġ 1 Ġas Ġthe Ġminimum Ġbehavior Ġweight , Ġallows Ġeach Ġweight Ġto Ġhave Ġa Ġrelative Ġweight Ġand Ġstill Ġmaintain ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġweight Ġin Ġa Ġnormalized Ġvector Ġeven Ġif Ġits Ġthe Ġonly Ġactive Ġforce ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Weight Ġ+= Ġmin ( 1 . 0 , Ġit . weight ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Force . add ( force . multiply Scalar ( it . weight )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( total Weight Ġ> Ġ 0 . 0 ) Ġtotal Force . divide Scalar ( total Weight ) ĊĊĠĠĠĠĠĠĠ Ġb oid . apply Ste ering Force ( total Force ) ĊĊĠĠĠĠĠĠĠ Ġb oid . update ( time ) ĊĠĠĠĠĠĠĠ Ġ// b oid . conf ine To Scene () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠB oid . conf ine To Scene () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ< Ġ- HALF _ SC ENE _ SIZE ) Ġx Ġ= ĠHAL F _ SC ENE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ> ĠHAL F _ SC ENE _ SIZE ) Ġx Ġ= Ġ- HALF _ SC ENE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( z Ġ< Ġ- HALF _ SC ENE _ SIZE ) Ġz Ġ= ĠHAL F _ SC ENE _ SIZE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( z Ġ> ĠHAL F _ SC ENE _ SIZE ) Ġz Ġ= Ġ- HALF _ SC ENE _ SIZE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }