@ file : Use Serial izers ( Point 3 D Serializer :: class ) Ċ Ċ package Ġhe p . data forge . vision . solid Ċ Ċ import Ġhe p . data forge . meta .* Ċ import Ġhe p . data forge . meta . descriptors . Node Descriptor Ċ import Ġhe p . data forge . names . as Name Ċ import Ġhe p . data forge . names . plus Ċ import Ġhe p . data forge . output . Renderer Ċ import Ġhe p . data forge . values . ValueType Ċ import Ġhe p . data forge . values . as Value Ċ import Ġhe p . data forge . vision . Vision Ċ import Ġhe p . data forge . vision . enum Ċ import Ġhe p . data forge . vision . solid . Solid . Companion . DETAIL _ KEY Ċ import Ġhe p . data forge . vision . solid . Solid . Companion . IGNORE _ KEY Ċ import Ġhe p . data forge . vision . solid . Solid . Companion . LAYER _ KEY Ċ import Ġhe p . data forge . vision . solid . Solid . Companion . VISIBLE _ KEY Ċ import Ġkotlinx . serialization . Use Serial izers Ċ Ċ /** Ċ Ġ* ĠInterface Ġfor Ġ 3 - dimensional Ġ[ Vision ] Ċ Ġ*/ Ċ interface ĠSolid Ġ: ĠVision Ġ{ ĊĠĠĠ Ġvar Ġposition : ĠPoint 3 D ? ĊĠĠĠ Ġvar Ġrotation : ĠPoint 3 D ? ĊĠĠĠ Ġvar Ġscale : ĠPoint 3 D ? ĊĊĠĠĠ Ġoverride Ġval Ġdescriptor : ĠNode Descriptor ? Ġget () Ġ= ĠComp anion . descriptor ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠVIS IBLE _ KEY Ġ= Ġ" visible ". as Name () ĊĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġval ĠSELECT ED _ KEY Ġ= Ġ" selected ". as Name () ĊĠĠĠĠĠĠĠ Ġval ĠDET AIL _ KEY Ġ= Ġ" detail ". as Name () ĊĠĠĠĠĠĠĠ Ġval ĠLAY ER _ KEY Ġ= Ġ" layer ". as Name () ĊĠĠĠĠĠĠĠ Ġval ĠIG NORE _ KEY Ġ= Ġ" ignore ". as Name () ĊĊĠĠĠĠĠĠĠ Ġval ĠGEO METRY _ KEY Ġ= Ġ" geometry ". as Name () ĊĊĠĠĠĠĠĠĠ Ġval ĠX _ KEY Ġ= Ġ" x ". as Name () ĊĠĠĠĠĠĠĠ Ġval ĠY _ KEY Ġ= Ġ" y ". as Name () ĊĠĠĠĠĠĠĠ Ġval ĠZ _ KEY Ġ= Ġ" z ". as Name () ĊĊĠĠĠĠĠĠĠ Ġval ĠPOSITION _ KEY Ġ= Ġ" pos ". as Name () ĊĊĠĠĠĠĠĠĠ Ġval ĠX _ POSITION _ KEY Ġ= ĠPOSITION _ KEY Ġ+ ĠX _ KEY ĊĠĠĠĠĠĠĠ Ġval ĠY _ POSITION _ KEY Ġ= ĠPOSITION _ KEY Ġ+ ĠY _ KEY ĊĠĠĠĠĠĠĠ Ġval ĠZ _ POSITION _ KEY Ġ= ĠPOSITION _ KEY Ġ+ ĠZ _ KEY ĊĊĠĠĠĠĠĠĠ Ġval ĠROT ATION Ġ= Ġ" rotation ". as Name () ĊĊĠĠĠĠĠĠĠ Ġval ĠX _ ROT ATION _ KEY Ġ= ĠROT ATION Ġ+ ĠX _ KEY ĊĠĠĠĠĠĠĠ Ġval ĠY _ ROT ATION _ KEY Ġ= ĠROT ATION Ġ+ ĠY _ KEY ĊĠĠĠĠĠĠĠ Ġval ĠZ _ ROT ATION _ KEY Ġ= ĠROT ATION Ġ+ ĠZ _ KEY ĊĊĠĠĠĠĠĠĠ Ġval ĠROT ATION _ ORDER _ KEY Ġ= ĠROT ATION Ġ+ Ġ" order " ĊĊĠĠĠĠĠĠĠ Ġval ĠSC ALE _ KEY Ġ= Ġ" scale ". as Name () ĊĊĠĠĠĠĠĠĠ Ġval ĠX _ SCALE _ KEY Ġ= ĠSC ALE _ KEY Ġ+ ĠX _ KEY ĊĠĠĠĠĠĠĠ Ġval ĠY _ SCALE _ KEY Ġ= ĠSC ALE _ KEY Ġ+ ĠY _ KEY ĊĠĠĠĠĠĠĠ Ġval ĠZ _ SCALE _ KEY Ġ= ĠSC ALE _ KEY Ġ+ ĠZ _ KEY ĊĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode Descriptor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ( VISIBLE _ KEY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ( ValueType . BOOLEAN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġreplace Ġby Ġdescriptor Ġmerge ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ( Vision . STYLE _ KEY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ( ValueType . STRING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmultiple Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ( Solid Material . MAT ERIAL _ KEY . toString (), ĠSolid Material . descriptor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum < Rotation Order >( ROT ATION _ ORDER _ KEY , default Ġ= ĠRotation Order . XYZ ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġsolid Equals ( first : ĠSolid , Ġsecond : ĠSolid ): ĠBoolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first . position Ġ!= Ġsecond . position ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first . rotation Ġ!= Ġsecond . rotation ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first . scale Ġ!= Ġsecond . scale ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first . properties Ġ!= Ġsecond . properties ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġsolid HashCode ( solid : ĠSolid ): ĠInt { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ+ Ġ( solid . position ?. hashCode () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ( solid . rotation ?. hashCode () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ( solid . scale ?. hashCode () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġ( solid . properties ?. hashCode () Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCount Ġnumber Ġof Ġlayers Ġto Ġthe Ġtop Ġobject . ĠReturn Ġ 1 Ġif Ġthis Ġis Ġtop Ġlayer Ċ Ġ*/ Ċ var ĠSolid . layer : ĠInt ĊĠĠĠ Ġget () Ġ= ĠgetItem ( LAYER _ KEY ). int Ġ?: Ġ 0 ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Item ( LAYER _ KEY , Ġvalue . as Value ()) ĊĠĠĠ Ġ} Ċ Ċ fun ĠRenderer < Solid >. render ( meta : ĠMeta Ġ= ĠMeta . EMPTY , Ġaction : ĠSolid Group . () Ġ-> ĠUnit ) Ġ= ĊĠĠĠ Ġrender ( Solid Group (). apply ( action ), Ġmeta ) Ċ Ċ // ĠCommon Ġproperties Ċ Ċ enum Ġclass ĠRotation Order Ġ{ ĊĠĠĠ ĠX YZ , ĊĠĠĠ ĠY ZX , ĊĠĠĠ ĠZ XY , ĊĠĠĠ ĠX ZY , ĊĠĠĠ ĠY XZ , ĊĠĠĠ ĠZ YX Ċ } Ċ Ċ /** Ċ Ġ* ĠRotation Ġorder Ċ Ġ*/ Ċ var ĠSolid . rotation Order : ĠRotation Order ĊĠĠĠ Ġget () Ġ= ĠgetItem ( Solid . ROT ATION _ ORDER _ KEY ). enum < Rotation Order >() Ġ?: ĠRotation Order . XYZ ĊĠĠĠ Ġset ( value ) Ġ= Ġset Item ( Solid . ROT ATION _ ORDER _ KEY , Ġvalue . name . as Value ()) ĊĊ Ċ /** Ċ Ġ* ĠP referred Ġnumber Ġof Ġpoly gons Ġfor Ġdisplaying Ġthe Ġobject . ĠIf Ġnot Ġdefined , Ġuses Ġshape Ġor Ġrenderer Ġdefault . ĠNot Ġinherited Ċ Ġ*/ Ċ var ĠSolid . detail : ĠInt ? ĊĠĠĠ Ġget () Ġ= ĠgetProperty ( DETAIL _ KEY , Ġfalse ). int ĊĠĠĠ Ġset ( value ) Ġ= Ġset Item ( DETAIL _ KEY , Ġvalue ?. as Value ()) Ċ Ċ var ĠVision . visible : ĠBoolean ? ĊĠĠĠ Ġget () Ġ= ĠgetItem ( VISIBLE _ KEY ). boolean ĊĠĠĠ Ġset ( value ) Ġ= Ġset Item ( VISIBLE _ KEY , Ġvalue ?. as Value ()) Ċ Ċ /** Ċ Ġ* ĠIf Ġthis Ġproperty Ġis Ġtrue , Ġthe Ġobject Ġwill Ġbe Ġignored Ġon Ġrender . Ċ Ġ* ĠProperty Ġis Ġnot Ġinherited . Ċ Ġ*/ Ċ var ĠVision . ignore : ĠBoolean ? ĊĠĠĠ Ġget () Ġ= ĠgetProperty ( IGNORE _ KEY , Ġfalse ). boolean ĊĠĠĠ Ġset ( value ) Ġ= Ġset Item ( IGNORE _ KEY , Ġvalue ?. as Value ()) Ċ Ċ // var ĠVisual Object . selected : ĠBoolean ? Ċ // ĠĠĠ Ġget () Ġ= ĠgetProperty ( SELECTED _ KEY ). boolean Ċ // ĠĠĠ Ġset ( value ) Ġ= Ġset Property ( SELECTED _ KEY , Ġvalue ) Ċ Ċ private Ġfun ĠSolid . position (): ĠPoint 3 D Ġ= ĊĠĠĠ Ġposition Ġ?: ĠPoint 3 D ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 ). also Ġ{ Ġposition Ġ= Ġit Ġ} Ċ Ċ var ĠSolid . x : ĠNumber ĊĠĠĠ Ġget () Ġ= Ġposition ?. x Ġ?: Ġ 0 f ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġposition (). x Ġ= Ġvalue . toDouble () ĊĠĠĠĠĠĠĠ Ġproperty Changed ( Solid . X _ POSITION _ KEY ) ĊĠĠĠ Ġ} Ċ Ċ var ĠSolid . y : ĠNumber ĊĠĠĠ Ġget () Ġ= Ġposition ?. y Ġ?: Ġ 0 f ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġposition (). y Ġ= Ġvalue . toDouble () ĊĠĠĠĠĠĠĠ Ġproperty Changed ( Solid . Y _ POSITION _ KEY ) ĊĠĠĠ Ġ} Ċ Ċ var ĠSolid . z : ĠNumber ĊĠĠĠ Ġget () Ġ= Ġposition ?. z Ġ?: Ġ 0 f ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġposition (). z Ġ= Ġvalue . toDouble () ĊĠĠĠĠĠĠĠ Ġproperty Changed ( Solid . Z _ POSITION _ KEY ) ĊĠĠĠ Ġ} Ċ Ċ private Ġfun ĠSolid . rotation (): ĠPoint 3 D Ġ= ĊĠĠĠ Ġrotation Ġ?: ĠPoint 3 D ( 0 . 0 , Ġ 0 . 0 , Ġ 0 . 0 ). also Ġ{ Ġrotation Ġ= Ġit Ġ} Ċ Ċ var ĠSolid . rotation X : ĠNumber ĊĠĠĠ Ġget () Ġ= Ġrotation ?. x Ġ?: Ġ 0 f ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrotation (). x Ġ= Ġvalue . toDouble () ĊĠĠĠĠĠĠĠ Ġproperty Changed ( Solid . X _ ROT ATION _ KEY ) ĊĠĠĠ Ġ} Ċ Ċ var ĠSolid . rotation Y : ĠNumber ĊĠĠĠ Ġget () Ġ= Ġrotation ?. y Ġ?: Ġ 0 f ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrotation (). y Ġ= Ġvalue . toDouble () ĊĠĠĠĠĠĠĠ Ġproperty Changed ( Solid . Y _ ROT ATION _ KEY ) ĊĠĠĠ Ġ} Ċ Ċ var ĠSolid . rotation Z : ĠNumber ĊĠĠĠ Ġget () Ġ= Ġrotation ?. z Ġ?: Ġ 0 f ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrotation (). z Ġ= Ġvalue . toDouble () ĊĠĠĠĠĠĠĠ Ġproperty Changed ( Solid . Z _ ROT ATION _ KEY ) ĊĠĠĠ Ġ} Ċ Ċ private Ġfun ĠSolid . scale (): ĠPoint 3 D Ġ= ĊĠĠĠ Ġscale Ġ?: ĠPoint 3 D ( 1 . 0 , Ġ 1 . 0 , Ġ 1 . 0 ). also Ġ{ Ġscale Ġ= Ġit Ġ} Ċ Ċ var ĠSolid . scale X : ĠNumber ĊĠĠĠ Ġget () Ġ= Ġscale ?. x Ġ?: Ġ 1 f ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscale (). x Ġ= Ġvalue . toDouble () ĊĠĠĠĠĠĠĠ Ġproperty Changed ( Solid . X _ SCALE _ KEY ) ĊĠĠĠ Ġ} Ċ Ċ var ĠSolid . scale Y : ĠNumber ĊĠĠĠ Ġget () Ġ= Ġscale ?. y Ġ?: Ġ 1 f ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscale (). y Ġ= Ġvalue . toDouble () ĊĠĠĠĠĠĠĠ Ġproperty Changed ( Solid . Y _ SCALE _ KEY ) ĊĠĠĠ Ġ} Ċ Ċ var ĠSolid . scale Z : ĠNumber ĊĠĠĠ Ġget () Ġ= Ġscale ?. z Ġ?: Ġ 1 f ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscale (). z Ġ= Ġvalue . toDouble () ĊĠĠĠĠĠĠĠ Ġproperty Changed ( Solid . Z _ SCALE _ KEY ) ĊĠĠĠ Ġ}