Merge pull request #193 from devZoGok/ft-191-demo-unit-implementations

Ft 191 demo unit implementations
This commit is contained in:
devZoGok
2025-06-19 15:12:38 +00:00
committed by GitHub
60 changed files with 5567 additions and 4332 deletions
File diff suppressed because it is too large Load Diff
@@ -1,120 +0,0 @@
<model>
<node name="Cube" px="0.0" py="0.0" pz="-0.0" rw="1.0" rx="0.0" ry="0.0" rz="0.0" sx="1.0" sy="1.0" sz="1.0">
<mesh name="CubeCube" num_vertex_pos="16" num_faces="32" num_vertex_groups="0" num_shape_keys="0">
<vertdata px="1.9262968301773071" py="3.097959041595459" pz="-5.632621765136719" nx="0.3689036965370178" ny="-0.8531237244606018" nz="0.3689036965370178" />
<vertdata px="3.7058804035186768" py="-0.0005134940147399902" pz="-7.412205219268799" nx="0.5773501992225647" ny="0.5773501396179199" nz="0.5773504376411438" />
<vertdata px="1.9262968301773071" py="3.097959041595459" pz="0.5843225717544556" nx="0.07951007783412933" ny="-0.8262193202972412" nz="-0.557709276676178" />
<vertdata px="3.7058804035186768" py="-0.0005134940147399902" pz="2.363906145095825" nx="0.4004383385181427" ny="0.5532214045524597" nz="-0.7304760217666626" />
<vertdata px="-1.9262968301773071" py="3.097959041595459" pz="-5.632621765136719" nx="-0.36890366673469543" ny="-0.8531237244606018" nz="0.3689036965370178" />
<vertdata px="-3.7058804035186768" py="-0.0005134940147399902" pz="-7.412205219268799" nx="-0.5773500204086304" ny="0.577350378036499" nz="0.5773504376411438" />
<vertdata px="-1.9262968301773071" py="3.097959041595459" pz="0.5843225717544556" nx="-0.07951010018587112" ny="-0.8262193202972412" nz="-0.557709276676178" />
<vertdata px="-3.7058804035186768" py="-0.0005134940147399902" pz="2.363906145095825" nx="-0.40043869614601135" ny="0.5532211661338806" nz="-0.7304758429527283" />
<vertdata px="3.7058804035186768" py="0.5489315986633301" pz="2.363906145095825" nx="0.47624310851097107" ny="-0.3169591724872589" nz="-0.8202008008956909" />
<vertdata px="-3.7058804035186768" py="0.5489315986633301" pz="2.363906145095825" nx="-0.47624287009239197" ny="-0.31695929169654846" nz="-0.8202009201049805" />
<vertdata px="3.7058804035186768" py="0.5489315986633301" pz="-7.412205219268799" nx="0.6674611568450928" ny="-0.3301376700401306" nz="0.6674613952636719" />
<vertdata px="-3.7058804035186768" py="0.5489315986633301" pz="-7.412205219268799" nx="-0.6674611568450928" ny="-0.33013758063316345" nz="0.6674613952636719" />
<vertdata px="0.0" py="-0.0005134940147399902" pz="-7.412205219268799" nx="0.0" ny="0.7071066498756409" nz="0.7071068286895752" />
<vertdata px="0.0" py="0.5489315986633301" pz="-0.0004444122314453125" nx="1.0892627244629693e-08" ny="-0.21838007867336273" nz="-0.9758637547492981" />
<vertdata px="0.0" py="-0.0005134940147399902" pz="-0.0004444122314453125" nx="-2.369521645562145e-08" ny="0.8502139449119568" nz="-0.5264374017715454" />
<vertdata px="0.0" py="0.5489315986633301" pz="-7.412205219268799" nx="0.0" ny="-0.3000441789627075" nz="0.9539253115653992" />
<vertdata px="0.0" py="3.097959041595459" pz="-1.780027985572815" nx="0.0" ny="-0.9764533638954163" nz="-0.21572870016098022" />
<vertdata px="0.0" py="3.097959041595459" pz="-5.632621765136719" nx="0.0" ny="-0.8866903185844421" nz="0.4623638093471527" />
<vert id="4" uvx="0.3589325249195099" uvy="0.5394231677055359" tx="3.531605159423634e-07" ty="0.0" tz="1.0" bx="0.9999999403953552" by="-0.0" bz="-3.53160487520654e-07" />
<vert id="16" uvx="0.5341650247573853" uvy="0.62703937292099" tx="3.5316062962920114e-07" ty="0.0" tz="1.0" bx="0.9999999403953552" by="-0.0" bz="-3.531606012074917e-07" />
<vert id="17" uvx="0.3589325547218323" uvy="0.6270394325256348" tx="3.5316062962920114e-07" ty="0.0" tz="1.0" bx="0.9999999403953552" by="-0.0" bz="-3.531606012074917e-07" />
<vert id="13" uvx="0.561755359172821" uvy="0.39117196202278137" tx="0.8353264331817627" ty="-0.13493308424949646" tz="-0.5329378843307495" bx="0.11375348269939423" by="0.9908547401428223" bz="-0.072574682533741" />
<vert id="7" uvx="0.3622313439846039" uvy="0.33756721019744873" tx="0.8313257098197937" ty="-0.16609829664230347" tz="-0.5303855538368225" bx="0.14002688229084015" by="0.9861091375350952" bz="-0.08933710306882858" />
<vert id="14" uvx="0.5616758465766907" uvy="0.36521783471107483" tx="0.8356598019599915" ty="-0.1319960504770279" tz="-0.5331506133079529" bx="0.11127745360136032" by="0.9912501573562622" bz="-0.07099497318267822" />
<vert id="9" uvx="0.05321301892399788" uvy="0.9850500822067261" tx="0.0" ty="-0.7621659636497498" tz="-0.6473817229270935" bx="-0.0" by="-0.6473817229270935" bz="0.7621659636497498" />
<vert id="5" uvx="0.33374321460723877" uvy="0.6939942836761475" tx="0.0" ty="-0.8632479310035706" tz="-0.5047802329063416" bx="-0.0" by="-0.5047802329063416" bz="0.8632479310035706" />
<vert id="7" uvx="0.0704030767083168" uvy="0.9998505115509033" tx="0.0" ty="-0.7578136324882507" tz="-0.6524709463119507" bx="-0.0" by="-0.6524709463119507" bz="0.7578136324882507" />
<vert id="1" uvx="0.8035919666290283" uvy="0.3372681438922882" tx="-4.770962647171473e-08" ty="0.0" tz="-1.0" bx="0.9999999403953552" by="0.0" bz="-4.770962291900105e-08" />
<vert id="14" uvx="0.46647340059280396" uvy="0.16870884597301483" tx="-4.770962647171473e-08" ty="0.0" tz="-1.0" bx="0.9999999403953552" by="0.0" bz="-4.770962291900105e-08" />
<vert id="12" uvx="0.8035919666290283" uvy="0.16870886087417603" tx="-4.770962647171473e-08" ty="0.0" tz="-1.0" bx="0.9999999403953552" by="0.0" bz="-4.770962291900105e-08" />
<vert id="10" uvx="0.33420810103416443" uvy="0.38810980319976807" tx="0.0" ty="-0.9446566700935364" tz="-0.32806074619293213" bx="-0.0" by="0.32806074619293213" bz="-0.9446566700935364" />
<vert id="3" uvx="0.11095648258924484" uvy="0.0001494785537943244" tx="0.0" ty="-0.7895708084106445" tz="-0.6136593818664551" bx="-0.0" by="0.6136593818664551" bz="-0.7895708084106445" />
<vert id="1" uvx="0.3586335778236389" uvy="0.3809709846973419" tx="0.0" ty="-0.9486247301101685" tz="-0.31640344858169556" bx="-0.0" by="0.31640344858169556" bz="-0.9486247301101685" />
<vert id="15" uvx="0.33246752619743347" uvy="0.542590320110321" tx="0.07605789601802826" ty="-0.9971033930778503" tz="-0.0" bx="-0.9971033930778503" by="-0.07605789601802826" bz="-0.0" />
<vert id="1" uvx="0.3586335778236389" uvy="0.3809709846973419" tx="-0.2632100284099579" ty="-0.9647385478019714" tz="-0.0" bx="-0.9647385478019714" by="0.2632100284099579" bz="-0.0" />
<vert id="12" uvx="0.35745128989219666" uvy="0.5447126626968384" tx="0.10820784419775009" ty="-0.9941282868385315" tz="-0.0" bx="-0.9941282868385315" by="-0.10820784419775009" bz="-0.0" />
<vert id="6" uvx="0.44127848744392395" uvy="0.487147718667984" tx="0.7016444802284241" ty="-0.3261772096157074" tz="-0.6334852576255798" bx="-0.06708993017673492" by="0.8548752665519714" bz="-0.5144778490066528" />
<vert id="13" uvx="0.561755359172821" uvy="0.39117196202278137" tx="0.7016444802284241" ty="-0.3261772096157074" tz="-0.6334851980209351" bx="-0.06708990037441254" by="0.8548752069473267" bz="-0.5144778490066528" />
<vert id="16" uvx="0.5607007145881653" uvy="0.5391241908073425" tx="0.7016444206237793" ty="-0.326177179813385" tz="-0.6334851980209351" bx="-0.06708991527557373" by="0.8548752069473267" bz="-0.5144777894020081" />
<vert id="2" uvx="0.0001495767937740311" uvy="0.19534249603748322" tx="0.41084161400794983" ty="-0.5884784460067749" tz="-0.6963492035865784" bx="-0.39861783385276794" by="0.5709694027900696" bz="-0.717703104019165" />
<vert id="10" uvx="0.33420810103416443" uvy="0.38810980319976807" tx="0.41084161400794983" ty="-0.5884784460067749" tz="-0.6963492631912231" bx="-0.39861786365509033" by="0.5709694623947144" bz="-0.717703104019165" />
<vert id="0" uvx="0.1928858608007431" uvy="0.43597763776779175" tx="0.41084161400794983" ty="-0.5884784460067749" tz="-0.6963492631912231" bx="-0.39861786365509033" by="0.5709694623947144" bz="-0.717703104019165" />
<vert id="4" uvx="0.1822509914636612" uvy="0.6234169602394104" tx="-0.4327998459339142" ty="-0.6199308037757874" tz="-0.654499888420105" bx="-0.3746616244316101" by="-0.5366551876068115" bz="0.7560621500015259" />
<vert id="9" uvx="0.05321301892399788" uvy="0.9850500822067261" tx="-0.4327998459339142" ty="-0.6199308037757874" tz="-0.654499888420105" bx="-0.3746616244316101" by="-0.5366551876068115" bz="0.7560621500015259" />
<vert id="6" uvx="0.00014950423792470247" uvy="0.8337759375572205" tx="-0.4327998459339142" ty="-0.6199308037757874" tz="-0.654499888420105" bx="-0.3746616244316101" by="-0.5366551876068115" bz="0.7560621500015259" />
<vert id="0" uvx="0.1928858608007431" uvy="0.43597763776779175" tx="0.07300851494073868" ty="-0.8177588582038879" tz="-0.5709118247032166" bx="-0.9973313808441162" by="-0.05986311286687851" bz="-0.04179295152425766" />
<vert id="15" uvx="0.33246752619743347" uvy="0.542590320110321" tx="0.07429242134094238" ty="-0.8176811337471008" tz="-0.5708575248718262" bx="-0.9972366094589233" by="-0.06091585010290146" bz="-0.04252791032195091" />
<vert id="17" uvx="0.1862851232290268" uvy="0.5313258171081543" tx="0.07429240643978119" ty="-0.817681074142456" tz="-0.5708574652671814" bx="-0.9972364902496338" by="-0.060915835201740265" bz="-0.042527902871370316" />
<vert id="4" uvx="0.1822509914636612" uvy="0.6234169602394104" tx="-0.06036679074168205" ty="-0.818451464176178" tz="-0.5713955760002136" bx="-0.9981762170791626" by="0.0494975671172142" bz="0.03455634042620659" />
<vert id="15" uvx="0.33246752619743347" uvy="0.542590320110321" tx="-0.06036679074168205" ty="-0.8184515237808228" tz="-0.5713955760002136" bx="-0.9981762766838074" by="0.0494975671172142" bz="0.03455634042620659" />
<vert id="11" uvx="0.3132839500904083" uvy="0.684260368347168" tx="-0.06036679074168205" ty="-0.8184515237808228" tz="-0.5713955760002136" bx="-0.9981762766838074" by="0.0494975671172142" bz="0.03455634042620659" />
<vert id="2" uvx="0.681327760219574" uvy="0.48923569917678833" tx="0.8502992987632751" ty="0.14735522866249084" tz="0.5052499175071716" bx="-0.016214080154895782" by="0.9668834805488586" bz="-0.25470271706581116" />
<vert id="13" uvx="0.561755359172821" uvy="0.39117196202278137" tx="0.8502994179725647" ty="0.14735524356365204" tz="0.5052499771118164" bx="-0.016214072704315186" by="0.966883659362793" bz="-0.25470274686813354" />
<vert id="8" uvx="0.7665426731109619" uvy="0.36274176836013794" tx="0.8502992391586304" ty="0.14735522866249084" tz="0.5052499175071716" bx="-0.016214080154895782" by="0.9668834805488586" bz="-0.25470268726348877" />
<vert id="11" uvx="0.3132839500904083" uvy="0.684260368347168" tx="0.37584277987480164" ty="-0.9266834259033203" tz="-0.0" bx="-0.9266834259033203" by="-0.37584277987480164" bz="-0.0" />
<vert id="12" uvx="0.35745128989219666" uvy="0.5447126626968384" tx="0.10820784419775009" ty="-0.9941282868385315" tz="-0.0" bx="-0.9941282868385315" by="-0.10820784419775009" bz="-0.0" />
<vert id="5" uvx="0.33374321460723877" uvy="0.6939942836761475" tx="0.4025798738002777" ty="-0.9153848886489868" tz="-0.0" bx="-0.9153848886489868" by="-0.4025798738002777" bz="-0.0" />
<vert id="5" uvx="0.8035919666290283" uvy="0.00014956301311030984" tx="-1.0043602571840893e-07" ty="-6.454641797200949e-19" tz="-1.0" bx="1.0" by="6.426619653110421e-12" bz="-1.0043602571840893e-07" />
<vert id="14" uvx="0.46647340059280396" uvy="0.16870884597301483" tx="-1.0043601861298157e-07" ty="-6.454641280213066e-19" tz="-1.0" bx="1.0" by="6.426619653110421e-12" bz="-1.0043601861298157e-07" />
<vert id="7" uvx="0.35893261432647705" uvy="0.00014951835328247398" tx="-1.0043602571840893e-07" ty="-6.454641280213066e-19" tz="-1.0" bx="1.0" by="6.426619653110421e-12" bz="-1.0043602571840893e-07" />
<vert id="8" uvx="0.7665426731109619" uvy="0.36274176836013794" tx="0.8352057337760925" ty="0.13598060607910156" tz="0.5328608751296997" bx="-0.11463657766580582" by="0.9907115697860718" bz="-0.07313809543848038" />
<vert id="14" uvx="0.5616758465766907" uvy="0.36521783471107483" tx="0.8352406024932861" ty="0.13567835092544556" tz="0.5328832268714905" bx="-0.11438176780939102" by="0.9907529354095459" bz="-0.0729755237698555" />
<vert id="3" uvx="0.7630866169929504" uvy="0.33756721019744873" tx="0.8352023959159851" ty="0.13600900769233704" tz="0.5328587889671326" bx="-0.11466052383184433" by="0.9907075762748718" bz="-0.07315336912870407" />
<vert id="0" uvx="0.35893258452415466" uvy="0.7146556377410889" tx="2.1078601264434838e-07" ty="-3.357157149388827e-14" tz="1.0" bx="1.0" by="-1.5926850949199434e-07" bz="-2.1078601264434838e-07" />
<vert id="16" uvx="0.5341650247573853" uvy="0.62703937292099" tx="2.1078601264434838e-07" ty="-3.357157488202006e-14" tz="1.0" bx="1.0" by="-1.5926850949199434e-07" bz="-2.1078601264434838e-07" />
<vert id="2" uvx="0.6417058110237122" uvy="0.7146555781364441" tx="2.1078599843349366e-07" ty="-3.357157488202006e-14" tz="1.0" bx="1.0" by="-1.5926850949199434e-07" bz="-2.1078599843349366e-07" />
<vert id="4" uvx="0.3589325249195099" uvy="0.5394231677055359" tx="2.1078599843349366e-07" ty="3.357157149388827e-14" tz="1.0" bx="1.0" by="1.5926850949199434e-07" bz="-2.1078599843349366e-07" />
<vert id="6" uvx="0.6417057514190674" uvy="0.5394231081008911" tx="2.1078599843349366e-07" ty="3.357157149388827e-14" tz="1.0" bx="1.0" by="1.5926850949199434e-07" bz="-2.1078599843349366e-07" />
<vert id="16" uvx="0.5341650247573853" uvy="0.62703937292099" tx="2.1078599843349366e-07" ty="3.357157149388827e-14" tz="1.0" bx="1.0" by="1.5926850949199434e-07" bz="-2.1078599843349366e-07" />
<vert id="13" uvx="0.561755359172821" uvy="0.39117196202278137" tx="0.8353264331817627" ty="-0.13493308424949646" tz="-0.5329378843307495" bx="0.11375348269939423" by="0.9908547401428223" bz="-0.072574682533741" />
<vert id="9" uvx="0.35893261432647705" uvy="0.3601662218570709" tx="0.8309071063995361" ty="-0.16901995241641998" tz="-0.530118465423584" bx="0.1424899399280548" by="0.9856126308441162" bz="-0.09090853482484818" />
<vert id="7" uvx="0.3622313439846039" uvy="0.33756721019744873" tx="0.8313257098197937" ty="-0.16609829664230347" tz="-0.5303855538368225" bx="0.14002688229084015" by="0.9861091375350952" bz="-0.08933710306882858" />
<vert id="9" uvx="0.05321301892399788" uvy="0.9850500822067261" tx="0.0" ty="-0.7621659636497498" tz="-0.6473817229270935" bx="-0.0" by="-0.6473817229270935" bz="0.7621659636497498" />
<vert id="11" uvx="0.3132839500904083" uvy="0.684260368347168" tx="0.0" ty="-0.8666088581085205" tz="-0.49898821115493774" bx="-0.0" by="-0.49898821115493774" bz="0.8666088581085205" />
<vert id="5" uvx="0.33374321460723877" uvy="0.6939942836761475" tx="0.0" ty="-0.8632479310035706" tz="-0.5047802329063416" bx="-0.0" by="-0.5047802329063416" bz="0.8632479310035706" />
<vert id="1" uvx="0.8035919666290283" uvy="0.3372681438922882" tx="0.0" ty="0.0" tz="-1.0" bx="1.0" by="-6.426619653110421e-12" bz="-0.0" />
<vert id="3" uvx="0.35893258452415466" uvy="0.3372681438922882" tx="0.0" ty="0.0" tz="-1.0" bx="1.0" by="-6.426619653110421e-12" bz="-0.0" />
<vert id="14" uvx="0.46647340059280396" uvy="0.16870884597301483" tx="0.0" ty="0.0" tz="-1.0" bx="1.0" by="-6.426619653110421e-12" bz="-0.0" />
<vert id="10" uvx="0.33420810103416443" uvy="0.38810980319976807" tx="0.0" ty="-0.9446566700935364" tz="-0.32806074619293213" bx="-0.0" by="0.32806074619293213" bz="-0.9446566700935364" />
<vert id="8" uvx="0.08567869663238525" uvy="0.016785599291324615" tx="0.0" ty="-0.7819544076919556" tz="-0.623335599899292" bx="-0.0" by="0.623335599899292" bz="-0.7819544076919556" />
<vert id="3" uvx="0.11095648258924484" uvy="0.0001494785537943244" tx="0.0" ty="-0.7895708084106445" tz="-0.6136593818664551" bx="-0.0" by="0.6136593818664551" bz="-0.7895708084106445" />
<vert id="15" uvx="0.33246752619743347" uvy="0.542590320110321" tx="0.07605789601802826" ty="-0.9971033930778503" tz="-0.0" bx="-0.9971033930778503" by="-0.07605789601802826" bz="-0.0" />
<vert id="10" uvx="0.33420810103416443" uvy="0.38810980319976807" tx="-0.297568142414093" ty="-0.9547004699707031" tz="-0.0" bx="-0.9547004699707031" by="0.297568142414093" bz="-0.0" />
<vert id="1" uvx="0.3586335778236389" uvy="0.3809709846973419" tx="-0.2632100284099579" ty="-0.9647385478019714" tz="-0.0" bx="-0.9647385478019714" by="0.2632100284099579" bz="-0.0" />
<vert id="6" uvx="0.44127848744392395" uvy="0.487147718667984" tx="0.8499642610549927" ty="-0.1617148220539093" tz="-0.5014070868492126" bx="0.02885475754737854" by="0.9645857810974121" bz="-0.26218676567077637" />
<vert id="9" uvx="0.35893261432647705" uvy="0.3601662218570709" tx="0.8499642014503479" ty="-0.1617148071527481" tz="-0.5014070868492126" bx="0.02885475754737854" by="0.9645856618881226" bz="-0.262186735868454" />
<vert id="13" uvx="0.561755359172821" uvy="0.39117196202278137" tx="0.8499642610549927" ty="-0.1617148220539093" tz="-0.5014070868492126" bx="0.02885475754737854" by="0.9645857810974121" bz="-0.26218676567077637" />
<vert id="2" uvx="0.0001495767937740311" uvy="0.19534249603748322" tx="0.4171513319015503" ty="-0.5975162386894226" tz="-0.6848058104515076" bx="-0.3920099437236786" by="0.5615043640136719" bz="-0.7287254929542542" />
<vert id="8" uvx="0.08567869663238525" uvy="0.016785599291324615" tx="0.4171513617038727" ty="-0.5975162982940674" tz="-0.6848058700561523" bx="-0.392009973526001" by="0.5615044236183167" bz="-0.7287255525588989" />
<vert id="10" uvx="0.33420810103416443" uvy="0.38810980319976807" tx="0.4171513319015503" ty="-0.5975162982940674" tz="-0.6848058700561523" bx="-0.392009973526001" by="0.5615044236183167" bz="-0.7287255525588989" />
<vert id="4" uvx="0.1822509914636612" uvy="0.6234169602394104" tx="-0.3649314045906067" ty="-0.5227177739143372" tz="-0.7704486846923828" bx="-0.44103530049324036" by="-0.6317269802093506" bz="0.6375019550323486" />
<vert id="11" uvx="0.3132839500904083" uvy="0.684260368347168" tx="-0.3649314343929291" ty="-0.5227178335189819" tz="-0.7704487442970276" bx="-0.44103533029556274" by="-0.6317270398139954" bz="0.6375020146369934" />
<vert id="9" uvx="0.05321301892399788" uvy="0.9850500822067261" tx="-0.3649314045906067" ty="-0.5227177739143372" tz="-0.770448625087738" bx="-0.44103527069091797" by="-0.6317269206047058" bz="0.6375019550323486" />
<vert id="0" uvx="0.1928858608007431" uvy="0.43597763776779175" tx="0.19899886846542358" ty="-0.8035477995872498" tz="-0.560990571975708" bx="-0.9799997806549072" by="-0.1631685197353363" bz="-0.11391482502222061" />
<vert id="10" uvx="0.33420810103416443" uvy="0.38810980319976807" tx="0.1989988535642624" ty="-0.803547739982605" tz="-0.5609905123710632" bx="-0.9799996614456177" by="-0.1631685048341751" bz="-0.11391481757164001" />
<vert id="15" uvx="0.33246752619743347" uvy="0.542590320110321" tx="0.19899886846542358" ty="-0.803547739982605" tz="-0.560990571975708" bx="-0.9799997210502625" by="-0.1631685197353363" bz="-0.11391482502222061" />
<vert id="4" uvx="0.1822509914636612" uvy="0.6234169602394104" tx="0.07557619363069534" ty="-0.8176019787788391" tz="-0.5708022713661194" bx="-0.9971400499343872" by="-0.061968471854925156" bz="-0.043262794613838196" />
<vert id="17" uvx="0.1862851232290268" uvy="0.5313258171081543" tx="0.07429240643978119" ty="-0.817681074142456" tz="-0.5708574652671814" bx="-0.9972364902496338" by="-0.060915835201740265" bz="-0.042527902871370316" />
<vert id="15" uvx="0.33246752619743347" uvy="0.542590320110321" tx="0.07429242134094238" ty="-0.8176811337471008" tz="-0.5708575248718262" bx="-0.9972366094589233" by="-0.06091585010290146" bz="-0.04252791032195091" />
<vert id="2" uvx="0.681327760219574" uvy="0.48923569917678833" tx="0.7004905343055725" ty="0.31255924701690674" tz="0.6415761709213257" bx="0.07822474837303162" by="0.8599477410316467" bz="-0.5043521523475647" />
<vert id="16" uvx="0.5607007145881653" uvy="0.5391241908073425" tx="0.7004904747009277" ty="0.31255921721458435" tz="0.6415761113166809" bx="0.07822476327419281" by="0.859947681427002" bz="-0.5043520927429199" />
<vert id="13" uvx="0.561755359172821" uvy="0.39117196202278137" tx="0.7004904747009277" ty="0.31255921721458435" tz="0.6415761113166809" bx="0.07822476327419281" by="0.859947681427002" bz="-0.5043520927429199" />
<vert id="11" uvx="0.3132839500904083" uvy="0.684260368347168" tx="0.37584277987480164" ty="-0.9266834259033203" tz="-0.0" bx="-0.9266834259033203" by="-0.37584277987480164" bz="-0.0" />
<vert id="15" uvx="0.33246752619743347" uvy="0.542590320110321" tx="0.07605789601802826" ty="-0.9971033930778503" tz="-0.0" bx="-0.9971033930778503" by="-0.07605789601802826" bz="-0.0" />
<vert id="12" uvx="0.35745128989219666" uvy="0.5447126626968384" tx="0.10820784419775009" ty="-0.9941282868385315" tz="-0.0" bx="-0.9941282868385315" by="-0.10820784419775009" bz="-0.0" />
<vert id="5" uvx="0.8035919666290283" uvy="0.00014956301311030984" tx="-4.770962291900105e-08" ty="0.0" tz="-1.0" bx="0.9999999403953552" by="0.0" bz="-4.770961936628737e-08" />
<vert id="12" uvx="0.8035919666290283" uvy="0.16870886087417603" tx="-4.770962647171473e-08" ty="0.0" tz="-1.0" bx="0.9999999403953552" by="0.0" bz="-4.770962291900105e-08" />
<vert id="14" uvx="0.46647340059280396" uvy="0.16870884597301483" tx="-4.770962647171473e-08" ty="0.0" tz="-1.0" bx="0.9999999403953552" by="0.0" bz="-4.770962291900105e-08" />
<vert id="8" uvx="0.7665426731109619" uvy="0.36274176836013794" tx="0.8352057337760925" ty="0.13598060607910156" tz="0.5328608751296997" bx="-0.11463657766580582" by="0.9907115697860718" bz="-0.07313809543848038" />
<vert id="13" uvx="0.561755359172821" uvy="0.39117196202278137" tx="0.835243821144104" ty="0.1356499344110489" tz="0.5328853130340576" bx="-0.11435780674219131" by="0.9907567501068115" bz="-0.07296024262905121" />
<vert id="14" uvx="0.5616758465766907" uvy="0.36521783471107483" tx="0.8352406024932861" ty="0.13567835092544556" tz="0.5328832268714905" bx="-0.11438176780939102" by="0.9907529354095459" bz="-0.0729755237698555" />
<vert id="0" uvx="0.35893258452415466" uvy="0.7146556377410889" tx="3.5316074331603886e-07" ty="0.0" tz="1.0" bx="0.9999999403953552" by="-0.0" bz="-3.5316071489432943e-07" />
<vert id="17" uvx="0.3589325547218323" uvy="0.6270394325256348" tx="3.5316062962920114e-07" ty="0.0" tz="1.0" bx="0.9999999403953552" by="-0.0" bz="-3.531606012074917e-07" />
<vert id="16" uvx="0.5341650247573853" uvy="0.62703937292099" tx="3.5316062962920114e-07" ty="0.0" tz="1.0" bx="0.9999999403953552" by="-0.0" bz="-3.531606012074917e-07" />
</mesh>
</node>
</model>
Binary file not shown.

After

Width:  |  Height:  |  Size: 536 KiB

@@ -0,0 +1,550 @@
<model>
<node name="Circle" px="0.0" py="0.0" pz="-0.0" rw="1.0" rx="0.0" ry="0.0" rz="0.0" sx="1.0" sy="1.0" sz="1.0">
<mesh name="CircleCircle" num_vertex_pos="88" num_faces="152" num_vertex_groups="0" num_shape_keys="0">
<vertdata px="2.3333334922790527" py="0.0" pz="3.5" nx="0.09849293529987335" ny="-0.9480081796646118" nz="-0.302621066570282" />
<vertdata px="2.8614654541015625" py="0.0" pz="-3.2481021881103516" nx="0.1821654587984085" ny="-0.9538293480873108" nz="0.23879964649677277" />
<vertdata px="3.205582618713379" py="0.0" pz="-2.8624494075775146" nx="0.2576839029788971" ny="-0.9522520899772644" nz="0.1637527346611023" />
<vertdata px="2.3333332538604736" py="0.0" pz="-3.5" nx="0.09849293529987335" ny="-0.9480081796646118" nz="0.30262112617492676" />
<vertdata px="1.1666666269302368" py="0.0" pz="-3.6587908267974854" nx="0.029718050733208656" ny="-0.940009593963623" nz="0.3398509621620178" />
<vertdata px="1.1666667461395264" py="0.0" pz="3.6587908267974854" nx="0.029718047007918358" ny="-0.940009593963623" nz="-0.33985117077827454" />
<vertdata px="3.205582618713379" py="0.0" pz="2.8624494075775146" nx="0.25768381357192993" ny="-0.9522520899772644" nz="-0.16375266015529633" />
<vertdata px="2.8614654541015625" py="0.0" pz="3.2481021881103516" nx="0.18216542899608612" ny="-0.9538293480873108" nz="-0.23879961669445038" />
<vertdata px="0.0" py="0.0" pz="3.6876285076141357" nx="7.522156231232202e-10" ny="-0.9382537007331848" nz="-0.34594786167144775" />
<vertdata px="0.0" py="0.0" pz="-3.6876285076141357" nx="3.008862325959427e-10" ny="-0.9382537007331848" nz="0.345947802066803" />
<vertdata px="3.5" py="0.0" pz="-2.1035704612731934" nx="0.3232862949371338" ny="-0.9435587525367737" nz="0.07199108600616455" />
<vertdata px="3.5" py="0.0" pz="2.1035704612731934" nx="0.3232860565185547" ny="-0.9435588717460632" nz="-0.07199160754680634" />
<vertdata px="-2.3333334922790527" py="0.0" pz="3.5" nx="-0.09849289804697037" ny="-0.9480081796646118" nz="-0.302621066570282" />
<vertdata px="-2.8614654541015625" py="0.0" pz="-3.2481021881103516" nx="-0.1821654587984085" ny="-0.9538293480873108" nz="0.23879964649677277" />
<vertdata px="-3.205582618713379" py="0.0" pz="-2.8624494075775146" nx="-0.25768381357192993" ny="-0.9522520899772644" nz="0.16375266015529633" />
<vertdata px="-2.3333332538604736" py="0.0" pz="-3.5" nx="-0.09849292039871216" ny="-0.9480082988739014" nz="0.30262115597724915" />
<vertdata px="-1.1666666269302368" py="0.0" pz="-3.6587908267974854" nx="-0.0297180637717247" ny="-0.9400097131729126" nz="0.33985093235969543" />
<vertdata px="-1.1666667461395264" py="0.0" pz="3.6587908267974854" nx="-0.02971806190907955" ny="-0.940009593963623" nz="-0.33985111117362976" />
<vertdata px="-3.205582618713379" py="0.0" pz="2.8624494075775146" nx="-0.2576839029788971" ny="-0.9522520899772644" nz="-0.1637527346611023" />
<vertdata px="-2.8614654541015625" py="0.0" pz="3.2481021881103516" nx="-0.18216542899608612" ny="-0.9538293480873108" nz="-0.23879961669445038" />
<vertdata px="-3.5" py="0.0" pz="-2.1035704612731934" nx="-0.3232860565185547" ny="-0.9435588717460632" nz="0.07199160754680634" />
<vertdata px="-3.5" py="0.0" pz="2.1035704612731934" nx="-0.3232862949371338" ny="-0.9435587525367737" nz="-0.07199108600616455" />
<vertdata px="0.6579598188400269" py="0.5886510610580444" pz="0.9869399070739746" nx="0.014037798158824444" ny="-0.9984645843505859" nz="-0.05358616262674332" />
<vertdata px="0.8068840503692627" py="0.5886510610580444" pz="0.9159090518951416" nx="0.030952900648117065" ny="-0.9986249208450317" nz="-0.04231061413884163" />
<vertdata px="-2.1338816935667637e-08" py="0.5886510610580444" pz="1.0398478507995605" nx="1.8630769815786152e-08" ny="-0.9984745979309082" nz="-0.055212415754795074" />
<vertdata px="0.3289799690246582" py="0.5886510610580444" pz="1.0317161083221436" nx="0.003974931314587593" ny="-0.9984536170959473" nz="-0.055449407547712326" />
<vertdata px="0.6579599380493164" py="0.5886510610580444" pz="-0.9869399070739746" nx="0.01403802540153265" ny="-0.9984645247459412" nz="0.05358634516596794" />
<vertdata px="0.3289799094200134" py="0.5886510610580444" pz="-1.0317161083221436" nx="0.003975017927587032" ny="-0.9984534978866577" nz="0.05545012652873993" />
<vertdata px="0.9039192199707031" py="0.5886510610580444" pz="-0.8071615695953369" nx="0.04595489799976349" ny="-0.9985888600349426" nz="0.0266169011592865" />
<vertdata px="0.8068840503692627" py="0.5886510610580444" pz="-0.9159090518951416" nx="0.03095313534140587" ny="-0.9986249208450317" nz="0.04231065511703491" />
<vertdata px="-2.1338816935667637e-08" py="0.5886510610580444" pz="-1.0398478507995605" nx="-1.8853452132816528e-08" ny="-0.998474657535553" nz="0.05521243065595627" />
<vertdata px="0.9869399070739746" py="0.5886510610580444" pz="0.5931706428527832" nx="0.05917312949895859" ny="-0.9982153177261353" nz="-0.008043614216148853" />
<vertdata px="0.9869399070739746" py="0.5886510610580444" pz="-0.5931706428527832" nx="0.05917162075638771" ny="-0.99821537733078" nz="0.008043656125664711" />
<vertdata px="0.9039192199707031" py="0.5886510610580444" pz="0.8071615695953369" nx="0.04595489054918289" ny="-0.9985888600349426" nz="-0.026616867631673813" />
<vertdata px="-0.657960057258606" py="0.5886510610580444" pz="0.9869399070739746" nx="-0.014037922956049442" ny="-0.9984645247459412" nz="-0.05358635634183884" />
<vertdata px="-0.8068840503692627" py="0.5886510610580444" pz="0.9159090518951416" nx="-0.03095286525785923" ny="-0.9986249208450317" nz="-0.04231061041355133" />
<vertdata px="-0.3289799690246582" py="0.5886510610580444" pz="1.0317161083221436" nx="-0.003975032828748226" ny="-0.9984534978866577" nz="-0.05545012280344963" />
<vertdata px="-0.6579599380493164" py="0.5886510610580444" pz="-0.9869399070739746" nx="-0.01403792668133974" ny="-0.9984645843505859" nz="0.05358613282442093" />
<vertdata px="-0.3289799690246582" py="0.5886510610580444" pz="-1.0317161083221436" nx="-0.0039749108254909515" ny="-0.9984536170959473" nz="0.05544940009713173" />
<vertdata px="-0.9039192199707031" py="0.5886510610580444" pz="-0.8071615695953369" nx="-0.04595489427447319" ny="-0.9985888600349426" nz="0.026616862043738365" />
<vertdata px="-0.8068840503692627" py="0.5886510610580444" pz="-0.9159090518951416" nx="-0.030953191220760345" ny="-0.9986249208450317" nz="0.04231058806180954" />
<vertdata px="-0.9869399070739746" py="0.5886510610580444" pz="0.5931706428527832" nx="-0.05917242169380188" ny="-0.99821537733078" nz="-0.008043691515922546" />
<vertdata px="-0.9869399070739746" py="0.5886510610580444" pz="-0.5931706428527832" nx="-0.05917242169380188" ny="-0.99821537733078" nz="0.008043578825891018" />
<vertdata px="-0.9039192199707031" py="0.5886510610580444" pz="0.8071615695953369" nx="-0.04595489799976349" ny="-0.9985888600349426" nz="-0.026616869494318962" />
<vertdata px="2.27839994430542" py="0.27705520391464233" pz="2.586254119873047" nx="0.14964617788791656" ny="-0.9679763317108154" nz="-0.20156364142894745" />
<vertdata px="1.5615100860595703" py="0.48244887590408325" pz="1.7724989652633667" nx="0.08680514991283417" ny="-0.9893050789833069" nz="-0.1172189861536026" />
<vertdata px="1.273306965827942" py="0.48244887590408325" pz="1.9099605083465576" nx="0.042043279856443405" ny="-0.9878289699554443" nz="-0.1497543603181839" />
<vertdata px="1.8578827381134033" py="0.27705520391464233" pz="2.7868239879608154" nx="0.07315535843372345" ny="-0.9636355638504028" nz="-0.2570112645626068" />
<vertdata px="0.9289413690567017" py="0.27705520391464233" pz="2.9132585525512695" nx="0.0218022670596838" ny="-0.959774911403656" nz="-0.2799229621887207" />
<vertdata px="0.636653482913971" py="0.48244887590408325" pz="1.9966129064559937" nx="0.012482929043471813" ny="-0.9866608381271362" nz="-0.16230976581573486" />
<vertdata px="6.3005387573866756e-09" py="0.48244887590408325" pz="2.012349843978882" nx="-1.4847646723215036e-10" ny="-0.9864804744720459" nz="-0.16387902200222015" />
<vertdata px="1.3746145555160183e-08" py="0.27705520391464233" pz="2.936220407485962" nx="7.058891804412326e-10" ny="-0.9590924978256226" nz="-0.2830928862094879" />
<vertdata px="0.9289413094520569" py="0.27705520391464233" pz="-2.9132585525512695" nx="0.021802248433232307" ny="-0.959774911403656" nz="0.2799229025840759" />
<vertdata px="0.6366533637046814" py="0.48244887590408325" pz="-1.9966129064559937" nx="0.01248290203511715" ny="-0.9866608381271362" nz="0.16230976581573486" />
<vertdata px="1.273306965827942" py="0.48244887590408325" pz="-1.9099605083465576" nx="0.0420432947576046" ny="-0.9878289699554443" nz="0.14975440502166748" />
<vertdata px="1.8578824996948242" py="0.27705520391464233" pz="-2.7868239879608154" nx="0.07315532863140106" ny="-0.9636355638504028" nz="0.25701138377189636" />
<vertdata px="2.27839994430542" py="0.27705520391464233" pz="-2.586254119873047" nx="0.14964614808559418" ny="-0.9679762125015259" nz="0.20156393945217133" />
<vertdata px="1.5615100860595703" py="0.48244887590408325" pz="-1.7724989652633667" nx="0.08680517226457596" ny="-0.9893050789833069" nz="0.11721903085708618" />
<vertdata px="1.749295949935913" py="0.48244887590408325" pz="-1.5620471239089966" nx="0.1275525987148285" ny="-0.9889193773269653" nz="0.07595252245664597" />
<vertdata px="2.552398443222046" py="0.27705520391464233" pz="-2.2791833877563477" nx="0.21917058527469635" ny="-0.9668182730674744" nz="0.13125039637088776" />
<vertdata px="1.3746145555160183e-08" py="0.27705520391464233" pz="-2.936220169067383" nx="7.430411841369278e-11" ny="-0.9590924978256226" nz="0.2830929756164551" />
<vertdata px="6.3005387573866756e-09" py="0.48244887590408325" pz="-2.0123496055603027" nx="4.825485566684051e-10" ny="-0.9864804744720459" nz="0.16387903690338135" />
<vertdata px="2.7868237495422363" py="0.27705520391464233" pz="-1.6749372482299805" nx="0.2778566777706146" ny="-0.959510087966919" nz="0.046218086034059525" />
<vertdata px="1.909960389137268" py="0.48244887590408325" pz="-1.1479246616363525" nx="0.16281218826770782" ny="-0.9863094687461853" nz="0.026187235489487648" />
<vertdata px="1.909960389137268" py="0.48244887590408325" pz="1.1479246616363525" nx="0.16281263530254364" ny="-0.9863094091415405" nz="-0.026186935603618622" />
<vertdata px="2.7868239879608154" py="0.27705520391464233" pz="1.6749372482299805" nx="0.27785617113113403" ny="-0.9595102667808533" nz="-0.04621828347444534" />
<vertdata px="2.552398204803467" py="0.27705520391464233" pz="2.2791833877563477" nx="0.21917055547237396" ny="-0.9668183326721191" nz="-0.13125035166740417" />
<vertdata px="1.749295949935913" py="0.48244887590408325" pz="1.562047004699707" nx="0.1275525689125061" ny="-0.9889193773269653" nz="-0.07595252245664597" />
<vertdata px="-1.8578827381134033" py="0.27705520391464233" pz="2.7868237495422363" nx="-0.07315532118082047" ny="-0.9636356234550476" nz="-0.2570112645626068" />
<vertdata px="-1.273306965827942" py="0.48244887590408325" pz="1.9099602699279785" nx="-0.042043235152959824" ny="-0.9878289699554443" nz="-0.14975440502166748" />
<vertdata px="-1.5615100860595703" py="0.48244887590408325" pz="1.7724989652633667" nx="-0.08680509030818939" ny="-0.9893050789833069" nz="-0.11721903085708618" />
<vertdata px="-2.27839994430542" py="0.27705520391464233" pz="2.586254119873047" nx="-0.14964613318443298" ny="-0.9679762721061707" nz="-0.20156383514404297" />
<vertdata px="-0.636653482913971" py="0.48244887590408325" pz="1.9966129064559937" nx="-0.012482953257858753" ny="-0.9866608381271362" nz="-0.16230979561805725" />
<vertdata px="-0.9289413690567017" py="0.27705520391464233" pz="2.9132585525512695" nx="-0.021802296862006187" ny="-0.9597748517990112" nz="-0.2799229323863983" />
<vertdata px="-1.8578822612762451" py="0.27705520391464233" pz="-2.7868237495422363" nx="-0.07315527647733688" ny="-0.9636355638504028" nz="0.25701144337654114" />
<vertdata px="-1.2733068466186523" py="0.48244887590408325" pz="-1.9099602699279785" nx="-0.04204324260354042" ny="-0.9878289699554443" nz="0.14975441992282867" />
<vertdata px="-0.636653482913971" py="0.48244887590408325" pz="-1.9966129064559937" nx="-0.012482929974794388" ny="-0.9866608381271362" nz="0.16230978071689606" />
<vertdata px="-0.9289412498474121" py="0.27705520391464233" pz="-2.9132585525512695" nx="-0.021802283823490143" ny="-0.959774911403656" nz="0.2799229621887207" />
<vertdata px="-2.552398204803467" py="0.27705520391464233" pz="-2.2791833877563477" nx="-0.21917055547237396" ny="-0.9668182730674744" nz="0.13125035166740417" />
<vertdata px="-1.7492958307266235" py="0.48244887590408325" pz="-1.562047004699707" nx="-0.12755253911018372" ny="-0.9889193773269653" nz="0.07595250755548477" />
<vertdata px="-1.5615100860595703" py="0.48244887590408325" pz="-1.7724989652633667" nx="-0.0868050828576088" ny="-0.9893050789833069" nz="0.11721903830766678" />
<vertdata px="-2.27839994430542" py="0.27705520391464233" pz="-2.586254119873047" nx="-0.14964613318443298" ny="-0.9679762125015259" nz="0.20156386494636536" />
<vertdata px="-2.7868237495422363" py="0.27705520391464233" pz="1.6749372482299805" nx="-0.2778565287590027" ny="-0.959510087966919" nz="-0.04621795192360878" />
<vertdata px="-1.909960150718689" py="0.48244887590408325" pz="1.1479246616363525" nx="-0.1628127545118332" ny="-0.9863094091415405" nz="-0.02618701010942459" />
<vertdata px="-1.909960389137268" py="0.48244887590408325" pz="-1.1479246616363525" nx="-0.16281209886074066" ny="-0.9863095283508301" nz="0.026187164708971977" />
<vertdata px="-2.7868239879608154" py="0.27705520391464233" pz="-1.6749372482299805" nx="-0.27785632014274597" ny="-0.9595101475715637" nz="0.0462183952331543" />
<vertdata px="-1.749295949935913" py="0.48244887590408325" pz="1.5620471239089966" nx="-0.12755262851715088" ny="-0.9889193773269653" nz="-0.07595252990722656" />
<vertdata px="-2.552398443222046" py="0.27705520391464233" pz="2.2791833877563477" nx="-0.21917058527469635" ny="-0.9668182730674744" nz="-0.13125039637088776" />
<vert id="28" uvx="0.5945953130722046" uvy="0.6094418168067932" tx="1.0" ty="1.210358732350869e-06" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="31" uvx="0.6058473587036133" uvy="0.4195728898048401" tx="1.0" ty="1.210358732350869e-06" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="32" uvx="0.6058473587036133" uvy="0.5804271101951599" tx="1.0" ty="1.210358732350869e-06" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="26" uvx="0.5612596869468689" uvy="0.633817732334137" tx="1.0" ty="0.0" tz="-5.539270659937756e-07" bx="-5.539270659937756e-07" by="0.0" bz="-1.0" />
<vert id="23" uvx="0.5814438462257385" uvy="0.3758132755756378" tx="1.0" ty="0.0" tz="-5.539270659937756e-07" bx="-5.539270659937756e-07" by="0.0" bz="-1.0" />
<vert id="29" uvx="0.5814438462257385" uvy="0.6241867542266846" tx="1.0" ty="0.0" tz="-5.539270659937756e-07" bx="-5.539270659937756e-07" by="0.0" bz="-1.0" />
<vert id="29" uvx="0.5814438462257385" uvy="0.6241867542266846" tx="1.0" ty="0.0" tz="-2.3678351226408267e-06" bx="-2.3678351226408267e-06" by="0.0" bz="-1.0" />
<vert id="33" uvx="0.5945953130722046" uvy="0.3905581831932068" tx="1.0" ty="0.0" tz="-2.3678351226408267e-06" bx="-2.3678351226408267e-06" by="0.0" bz="-1.0" />
<vert id="28" uvx="0.5945953130722046" uvy="0.6094418168067932" tx="1.0" ty="0.0" tz="-2.3678351226408267e-06" bx="-2.3678351226408267e-06" by="0.0" bz="-1.0" />
<vert id="24" uvx="0.4720843434333801" uvy="0.3590086102485657" tx="1.0" ty="8.439614163080478e-08" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="27" uvx="0.5166720151901245" uvy="0.6398888230323792" tx="1.0" ty="8.439614163080478e-08" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="30" uvx="0.4720843434333801" uvy="0.6409913897514343" tx="1.0" ty="8.439614163080478e-08" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="22" uvx="0.5612596869468689" uvy="0.3661823272705078" tx="1.0" ty="0.0" tz="2.934376368557423e-07" bx="2.934376368557423e-07" by="-0.0" bz="-1.0" />
<vert id="27" uvx="0.5166720151901245" uvy="0.6398888230323792" tx="1.0" ty="0.0" tz="1.0487909918310834e-07" bx="1.0487909918310834e-07" by="-0.0" bz="-1.0" />
<vert id="25" uvx="0.5166720151901245" uvy="0.36011117696762085" tx="1.0" ty="0.0" tz="9.237298570496932e-08" bx="9.237298570496932e-08" by="-0.0" bz="-1.0" />
<vert id="41" uvx="0.338321328163147" uvy="0.4195728898048401" tx="1.0" ty="-6.051793661754346e-07" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="39" uvx="0.34957337379455566" uvy="0.6094418168067932" tx="1.0" ty="-6.051793661754346e-07" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="42" uvx="0.338321328163147" uvy="0.5804271101951599" tx="1.0" ty="-6.051793661754346e-07" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="35" uvx="0.36272484064102173" uvy="0.3758132755756378" tx="1.0" ty="2.1849061226930644e-07" tz="-2.4171363293135073e-06" bx="-2.4171363293135073e-06" by="-5.2812154606105e-13" bz="-1.0" />
<vert id="37" uvx="0.38290899991989136" uvy="0.6338176727294922" tx="1.0" ty="2.1849059805845172e-07" tz="-2.4171363293135073e-06" bx="-2.4171363293135073e-06" by="-5.2812154606105e-13" bz="-1.0" />
<vert id="40" uvx="0.36272484064102173" uvy="0.6241867542266846" tx="1.0" ty="2.18490583847597e-07" tz="-2.4171363293135073e-06" bx="-2.4171363293135073e-06" by="-5.2812154606105e-13" bz="-1.0" />
<vert id="43" uvx="0.34957337379455566" uvy="0.3905581831932068" tx="1.0" ty="-9.512628906804821e-08" tz="1.4031614909981727e-06" bx="1.4031614909981727e-06" by="-1.3347752536498753e-13" bz="-1.0" />
<vert id="40" uvx="0.36272484064102173" uvy="0.6241867542266846" tx="1.0" ty="-9.512628196262085e-08" tz="1.4031614909981727e-06" bx="1.4031614909981727e-06" by="-1.3347752536498753e-13" bz="-1.0" />
<vert id="39" uvx="0.34957337379455566" uvy="0.6094418168067932" tx="1.0" ty="-9.512628196262085e-08" tz="1.4031616046850104e-06" bx="1.4031616046850104e-06" by="-1.3347753891751468e-13" bz="-1.0" />
<vert id="30" uvx="0.4720843434333801" uvy="0.6409913897514343" tx="1.0" ty="-8.439614163080478e-08" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="36" uvx="0.42749667167663574" uvy="0.36011117696762085" tx="1.0" ty="-8.439614163080478e-08" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="24" uvx="0.4720843434333801" uvy="0.3590086102485657" tx="1.0" ty="-8.439614163080478e-08" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="36" uvx="0.42749667167663574" uvy="0.36011117696762085" tx="1.0" ty="3.671553088224755e-07" tz="3.8079346609265485e-07" bx="3.8079346609265485e-07" by="1.398103367019482e-13" bz="-1.0" />
<vert id="37" uvx="0.38290899991989136" uvy="0.6338176727294922" tx="1.0" ty="3.6715528040076606e-07" tz="3.8079346609265485e-07" bx="3.8079346609265485e-07" by="1.398103367019482e-13" bz="-1.0" />
<vert id="34" uvx="0.38290897011756897" uvy="0.3661822974681854" tx="1.0" ty="3.6715528040076606e-07" tz="3.8079346609265485e-07" bx="3.8079346609265485e-07" by="1.398103367019482e-13" bz="-1.0" />
<vert id="44" uvx="0.7820906639099121" uvy="0.14933373034000397" tx="0.9902617931365967" ty="-0.13921783864498138" tz="1.3884188376778184e-07" bx="0.039008110761642456" by="0.27746522426605225" bz="-0.9599434733390808" />
<vert id="0" uvx="0.7906097769737244" uvy="0.025440294295549393" tx="0.9902618527412415" ty="-0.13921783864498138" tz="1.3884188376778184e-07" bx="0.039008110761642456" by="0.27746522426605225" bz="-0.9599435329437256" />
<vert id="7" uvx="0.8621891140937805" uvy="0.05959474667906761" tx="0.9902617931365967" ty="-0.1392178237438202" tz="1.3884186955692712e-07" bx="0.03900810703635216" by="0.27746522426605225" bz="-0.9599434733390808" />
<vert id="48" uvx="0.599194347858429" uvy="0.10499566793441772" tx="0.9999585151672363" ty="-0.00911356508731842" tz="1.1569392910359966e-07" bx="0.003152814693748951" by="0.34592118859291077" bz="-0.9382582306861877" />
<vert id="8" uvx="0.47436589002609253" uvy="3.486812616415591e-09" tx="0.9999584555625916" ty="-0.009113564155995846" tz="1.156939219981723e-07" bx="0.0031528144609183073" by="0.34592118859291077" bz="-0.938258171081543" />
<vert id="5" uvx="0.6324878334999084" uvy="0.0039100730791687965" tx="0.9999584555625916" ty="-0.00911356508731842" tz="1.1569391489274494e-07" bx="0.003152814693748951" by="0.34592118859291077" bz="-0.938258171081543" />
<vert id="55" uvx="0.725096583366394" uvy="0.8778613209724426" tx="0.9988271594047546" ty="-0.048419151455163956" tz="2.523156972245033e-08" bx="-0.016228551045060158" by="-0.3347754180431366" bz="-0.9421582221984863" />
<vert id="4" uvx="0.6324877738952637" uvy="0.9960899949073792" tx="0.9988270998001099" ty="-0.04841914772987366" tz="2.5231566169736652e-08" bx="-0.01622854918241501" by="-0.3347753882408142" bz="-0.9421581625938416" />
<vert id="52" uvx="0.599194347858429" uvy="0.895004391670227" tx="0.9988270998001099" ty="-0.048419151455163956" tz="2.523156794609349e-08" bx="-0.016228551045060158" by="-0.3347753882408142" bz="-0.9421581625938416" />
<vert id="47" uvx="0.7250966429710388" uvy="0.12213875353336334" tx="0.9988270998001099" ty="-0.0484192930161953" tz="5.423447646535351e-08" bx="0.01622869446873665" by="0.33477583527565" bz="-0.9421581625938416" />
<vert id="5" uvx="0.6324878334999084" uvy="0.0039100730791687965" tx="0.9988270998001099" ty="-0.0484192930161953" tz="5.423447646535351e-08" bx="0.01622869446873665" by="0.33477583527565" bz="-0.9421581625938416" />
<vert id="0" uvx="0.7906097769737244" uvy="0.025440294295549393" tx="0.9988270998001099" ty="-0.0484192930161953" tz="5.423448001806719e-08" bx="0.01622869446873665" by="0.33477583527565" bz="-0.9421581625938416" />
<vert id="56" uvx="0.7820906043052673" uvy="0.850666344165802" tx="0.9732493162155151" ty="-0.22975189983844757" tz="-1.2375674884879118e-07" bx="-0.04614124447107315" by="-0.1954578459262848" bz="-0.9796261191368103" />
<vert id="2" uvx="0.9088283777236938" uvy="0.8881152272224426" tx="0.9732492566108704" ty="-0.229751855134964" tz="-1.2375672042708175e-07" bx="-0.046141233295202255" by="-0.1954578310251236" bz="-0.9796259999275208" />
<vert id="1" uvx="0.8621891140937805" uvy="0.9404053092002869" tx="0.9732493162155151" ty="-0.22975188493728638" tz="-1.2375673463793646e-07" bx="-0.04614124074578285" by="-0.1954578459262848" bz="-0.9796261191368103" />
<vert id="52" uvx="0.599194347858429" uvy="0.895004391670227" tx="0.9999584555625916" ty="-0.009113344363868237" tz="4.892175979875901e-07" bx="-0.0031521678902208805" by="-0.3459208607673645" bz="-0.9382583498954773" />
<vert id="9" uvx="0.47436586022377014" uvy="1.0" tx="0.9999585151672363" ty="-0.009113344363868237" tz="4.892175979875901e-07" bx="-0.0031521678902208805" by="-0.3459208607673645" bz="-0.9382584095001221" />
<vert id="60" uvx="0.4732920229434967" uvy="0.8981176614761353" tx="0.9999585151672363" ty="-0.009113345295190811" tz="4.89217654831009e-07" bx="-0.003152168355882168" by="-0.3459208607673645" bz="-0.9382584095001221" />
<vert id="56" uvx="0.7820906043052673" uvy="0.850666344165802" tx="0.9902618527412415" ty="-0.13921770453453064" tz="-1.7524398288060183e-07" bx="-0.03900812938809395" by="-0.2774653732776642" bz="-0.9599433541297913" />
<vert id="3" uvx="0.7906097173690796" uvy="0.9745597839355469" tx="0.9902618527412415" ty="-0.13921771943569183" tz="-1.7524398288060183e-07" bx="-0.039008136838674545" by="-0.2774653732776642" bz="-0.959943413734436" />
<vert id="55" uvx="0.725096583366394" uvy="0.8778613209724426" tx="0.9902617931365967" ty="-0.13921770453453064" tz="-1.7524396866974712e-07" bx="-0.03900812938809395" by="-0.2774653732776642" bz="-0.9599432945251465" />
<vert id="65" uvx="0.8509989380836487" uvy="0.2728978097438812" tx="0.932133138179779" ty="-0.3621157109737396" tz="3.4303607776564604e-07" bx="3.029126673936844e-07" by="-1.6757388721089228e-07" bz="-0.9999999403953552" />
<vert id="10" uvx="0.9487317204475403" uvy="0.7852199673652649" tx="0.932133138179779" ty="-0.36211568117141724" tz="3.430360493439366e-07" bx="3.0291263897197496e-07" by="-1.6757388721089228e-07" bz="-0.9999999403953552" />
<vert id="62" uvx="0.8509988784790039" uvy="0.7271022200584412" tx="0.932133138179779" ty="-0.3621157109737396" tz="3.4303607776564604e-07" bx="3.029126673936844e-07" by="-1.6757388721089228e-07" bz="-0.9999999403953552" />
<vert id="44" uvx="0.7820906639099121" uvy="0.14933373034000397" tx="0.9732491970062256" ty="-0.22975167632102966" tz="-1.705316208244767e-07" bx="0.046140823513269424" by="0.19545750319957733" bz="-0.9796260595321655" />
<vert id="6" uvx="0.9088284373283386" uvy="0.11188479512929916" tx="0.9732493162155151" ty="-0.22975167632102966" tz="-1.7053163503533142e-07" bx="0.046140823513269424" by="0.19545753300189972" bz="-0.9796261787414551" />
<vert id="66" uvx="0.8192265033721924" uvy="0.19096899032592773" tx="0.9732492566108704" ty="-0.22975167632102966" tz="-1.705316208244767e-07" bx="0.046140823513269424" by="0.19545751810073853" bz="-0.9796261191368103" />
<vert id="59" uvx="0.8192265033721924" uvy="0.809031069278717" tx="0.9537917971611023" ty="-0.3004683554172516" tz="-6.579779210369452e-08" bx="-0.0347902812063694" by="-0.11043631285429001" bz="-0.9932741522789001" />
<vert id="10" uvx="0.9487317204475403" uvy="0.7852199673652649" tx="0.9537917971611023" ty="-0.3004683256149292" tz="-6.579778499826716e-08" bx="-0.0347902774810791" by="-0.11043631285429001" bz="-0.9932741522789001" />
<vert id="2" uvx="0.9088283777236938" uvy="0.8881152272224426" tx="0.9537917375564575" ty="-0.3004683256149292" tz="-6.579778499826716e-08" bx="-0.0347902774810791" by="-0.11043630540370941" bz="-0.9932740926742554" />
<vert id="66" uvx="0.8192265033721924" uvy="0.19096899032592773" tx="0.9537917375564575" ty="-0.3004683554172516" tz="-1.5138779474455077e-07" bx="0.034790173172950745" by="0.11043667793273926" bz="-0.9932739734649658" />
<vert id="11" uvx="0.9487317204475403" uvy="0.2147800624370575" tx="0.9537917971611023" ty="-0.300468385219574" tz="-1.513878089554055e-07" bx="0.03479017689824104" by="0.11043668538331985" bz="-0.9932740926742554" />
<vert id="65" uvx="0.8509989380836487" uvy="0.2728978097438812" tx="0.9537917971611023" ty="-0.3004683554172516" tz="-1.5138779474455077e-07" bx="0.034790173172950745" by="0.11043668538331985" bz="-0.9932740330696106" />
<vert id="71" uvx="0.16449347138404846" uvy="0.1493336707353592" tx="0.9902618527412415" ty="0.1392175704240799" tz="1.1679107103645947e-07" bx="-0.039007749408483505" by="0.27746498584747314" bz="-0.9599435329437256" />
<vert id="12" uvx="0.1581219732761383" uvy="0.025440247729420662" tx="0.9902617931365967" ty="0.1392175853252411" tz="1.1679107103645947e-07" bx="-0.039007753133773804" by="0.27746495604515076" bz="-0.9599434733390808" />
<vert id="68" uvx="0.22148744761943817" uvy="0.12213874608278275" tx="0.9902617335319519" ty="0.1392175555229187" tz="1.1679106393103211e-07" bx="-0.03900774195790291" by="0.27746492624282837" bz="-0.959943413734436" />
<vert id="73" uvx="0.34738975763320923" uvy="0.10499565303325653" tx="0.9999584555625916" ty="0.009113588370382786" tz="9.315781568375314e-08" bx="-0.0031526212114840746" by="0.3459205627441406" bz="-0.9382584691047668" />
<vert id="8" uvx="0.47436589002609253" uvy="3.486812616415591e-09" tx="0.9999584555625916" ty="0.009113587439060211" tz="9.315781568375314e-08" bx="-0.003152620978653431" by="0.3459205627441406" bz="-0.9382584691047668" />
<vert id="51" uvx="0.4732920527458191" uvy="0.10188230127096176" tx="0.9999585151672363" ty="0.009113588370382786" tz="9.315782989460786e-08" bx="-0.0031526212114840746" by="0.3459205627441406" bz="-0.9382585287094116" />
<vert id="74" uvx="0.22148749232292175" uvy="0.8778612613677979" tx="0.9988271594047546" ty="0.04841931164264679" tz="5.0488694114392274e-08" bx="0.016228685155510902" by="-0.3347755968570709" bz="-0.9421582221984863" />
<vert id="16" uvx="0.3162439167499542" uvy="0.9960899353027344" tx="0.9988270401954651" ty="0.04841930791735649" tz="5.0488687008964916e-08" bx="0.016228685155510902" by="-0.33477553725242615" bz="-0.9421581029891968" />
<vert id="15" uvx="0.1581219881772995" uvy="0.9745597243309021" tx="0.9988270998001099" ty="0.04841930791735649" tz="5.0488687008964916e-08" bx="0.016228685155510902" by="-0.33477556705474854" bz="-0.9421581625938416" />
<vert id="68" uvx="0.22148744761943817" uvy="0.12213874608278275" tx="0.9988270998001099" ty="0.04841914400458336" tz="7.871103235856935e-08" bx="-0.016228483989834785" by="0.3347751200199127" bz="-0.9421583414077759" />
<vert id="17" uvx="0.3162439465522766" uvy="0.003910049330443144" tx="0.9988270998001099" ty="0.04841914027929306" tz="7.871103235856935e-08" bx="-0.016228483989834785" by="0.3347751200199127" bz="-0.9421583414077759" />
<vert id="73" uvx="0.34738975763320923" uvy="0.10499565303325653" tx="0.9988270998001099" ty="0.04841914027929306" tz="7.871103235856935e-08" bx="-0.016228483989834785" by="0.3347751200199127" bz="-0.9421583414077759" />
<vert id="81" uvx="0.16449342668056488" uvy="0.8506662845611572" tx="0.9732491970062256" ty="0.22975167632102966" tz="-1.3642524265833345e-07" bx="0.04614085704088211" by="-0.19545748829841614" bz="-0.9796260595321655" />
<vert id="14" uvx="0.039903316646814346" uvy="0.8881152272224426" tx="0.9732493162155151" ty="0.22975167632102966" tz="-1.3642525686918816e-07" bx="0.04614085704088211" by="-0.19545751810073853" bz="-0.9796261787414551" />
<vert id="78" uvx="0.1273575723171234" uvy="0.8090310096740723" tx="0.9732492566108704" ty="0.22975167632102966" tz="-1.3642525686918816e-07" bx="0.04614085704088211" by="-0.19545750319957733" bz="-0.9796261191368103" />
<vert id="77" uvx="0.34738975763320923" uvy="0.8950043320655823" tx="0.9999585151672363" ty="0.009113534353673458" tz="5.913568656978896e-08" bx="0.003152746707201004" by="-0.34592071175575256" bz="-0.9382584095001221" />
<vert id="9" uvx="0.47436586022377014" uvy="1.0" tx="0.9999584555625916" ty="0.009113533422350883" tz="5.91356794643616e-08" bx="0.0031527462415397167" by="-0.34592071175575256" bz="-0.9382583498954773" />
<vert id="16" uvx="0.3162439167499542" uvy="0.9960899353027344" tx="0.9999584555625916" ty="0.009113533422350883" tz="5.913568301707528e-08" bx="0.0031527462415397167" by="-0.34592071175575256" bz="-0.9382583498954773" />
<vert id="81" uvx="0.16449342668056488" uvy="0.8506662845611572" tx="0.9902617335319519" ty="0.13921795785427094" tz="3.2467079336129245e-07" bx="0.03900833800435066" by="-0.2774653136730194" bz="-0.9599434733390808" />
<vert id="15" uvx="0.1581219881772995" uvy="0.9745597243309021" tx="0.9902617931365967" ty="0.13921795785427094" tz="3.2467079336129245e-07" bx="0.03900833800435066" by="-0.2774653434753418" bz="-0.9599435329437256" />
<vert id="13" uvx="0.08654259890317917" uvy="0.9404052495956421" tx="0.9902617931365967" ty="0.13921795785427094" tz="3.2467079336129245e-07" bx="0.03900833800435066" by="-0.2774653434753418" bz="-0.9599435329437256" />
<vert id="85" uvx="0.09558513760566711" uvy="0.7271022200584412" tx="0.932133138179779" ty="0.3621157109737396" tz="-1.386158089115993e-15" bx="-1.6842635730540678e-08" by="4.335513636988253e-08" bz="-0.9999999403953552" />
<vert id="21" uvx="4.843819212396738e-08" uvy="0.2147800475358963" tx="0.932133138179779" ty="0.36211568117141724" tz="-1.3861579832368746e-15" bx="-1.684263395418384e-08" by="4.335513636988253e-08" bz="-0.9999999403953552" />
<vert id="82" uvx="0.09558520466089249" uvy="0.27289777994155884" tx="0.932133138179779" ty="0.3621157109737396" tz="-1.3861579832368746e-15" bx="-1.6842635730540678e-08" by="4.335513636988253e-08" bz="-0.9999999403953552" />
<vert id="71" uvx="0.16449347138404846" uvy="0.1493336707353592" tx="0.9732493162155151" ty="0.22975192964076996" tz="-2.3892212652754097e-07" bx="-0.046141356229782104" by="0.1954578161239624" bz="-0.9796261191368103" />
<vert id="18" uvx="0.03990337252616882" uvy="0.11188479512929916" tx="0.9732492566108704" ty="0.22975191473960876" tz="-2.3892209810583154e-07" bx="-0.046141356229782104" by="0.1954578012228012" bz="-0.9796260595321655" />
<vert id="19" uvx="0.08654259890317917" uvy="0.059594687074422836" tx="0.9732491970062256" ty="0.22975191473960876" tz="-2.3892212652754097e-07" bx="-0.046141356229782104" by="0.19545778632164001" bz="-0.9796259999275208" />
<vert id="78" uvx="0.1273575723171234" uvy="0.8090310096740723" tx="0.9537917375564575" ty="0.3004683554172516" tz="-3.3088255690927326e-07" bx="0.034790001809597015" by="-0.11043673008680344" bz="-0.9932739734649658" />
<vert id="20" uvx="5.371173728008216e-09" uvy="0.7852199673652649" tx="0.9537917971611023" ty="0.300468385219574" tz="-3.308826137526921e-07" bx="0.034790005534887314" by="-0.11043673753738403" bz="-0.9932740926742554" />
<vert id="85" uvx="0.09558513760566711" uvy="0.7271022200584412" tx="0.9537917971611023" ty="0.3004683554172516" tz="-3.308825853309827e-07" bx="0.034790001809597015" by="-0.11043673753738403" bz="-0.9932740330696106" />
<vert id="87" uvx="0.1273575872182846" uvy="0.19096893072128296" tx="0.9537917971611023" ty="0.3004683554172516" tz="-2.130387315446569e-07" bx="-0.03479041904211044" by="0.11043626815080643" bz="-0.9932741522789001" />
<vert id="21" uvx="4.843819212396738e-08" uvy="0.2147800475358963" tx="0.9537918567657471" ty="0.3004683554172516" tz="-2.130387315446569e-07" bx="-0.03479041904211044" by="0.11043627560138702" bz="-0.9932742118835449" />
<vert id="18" uvx="0.03990337252616882" uvy="0.11188479512929916" tx="0.9537917375564575" ty="0.3004683256149292" tz="-2.130387173338022e-07" bx="-0.034790415316820145" by="0.11043626070022583" bz="-0.9932740926742554" />
<vert id="43" uvx="0.34957337379455566" uvy="0.3905581831932068" tx="0.9956754446029663" ty="0.09290008246898651" tz="-1.1365496277448983e-07" bx="-0.003346225945279002" by="0.03586263209581375" bz="-0.9993512034416199" />
<vert id="83" uvx="0.21363316476345062" uvy="0.34435462951660156" tx="0.9956755042076111" ty="0.09290008991956711" tz="-1.1365496277448983e-07" bx="-0.003346226178109646" by="0.03586263209581375" bz="-0.9993512630462646" />
<vert id="86" uvx="0.2354084998369217" uvy="0.2882043719291687" tx="0.9956753849983215" ty="0.09290006756782532" tz="-1.1365494145820776e-07" bx="-0.003346225479617715" by="0.03586262837052345" bz="-0.9993511438369751" />
<vert id="86" uvx="0.2354084998369217" uvy="0.2882043719291687" tx="0.9824341535568237" ty="0.1866096407175064" tz="-9.725474825472702e-08" bx="-0.01347491703927517" by="0.07094018906354904" bz="-0.997389554977417" />
<vert id="82" uvx="0.09558520466089249" uvy="0.27289777994155884" tx="0.982434093952179" ty="0.1866096556186676" tz="-9.725474114929966e-08" bx="-0.013474917970597744" by="0.07094018161296844" bz="-0.9973894953727722" />
<vert id="87" uvx="0.1273575872182846" uvy="0.19096893072128296" tx="0.9824342131614685" ty="0.1866096705198288" tz="-9.725475536015438e-08" bx="-0.013474918901920319" by="0.07094018906354904" bz="-0.9973896145820618" />
<vert id="39" uvx="0.34957337379455566" uvy="0.6094418168067932" tx="0.9956754446029663" ty="0.09289997071027756" tz="5.367150612833882e-10" bx="0.003346103010699153" by="-0.035862576216459274" bz="-0.9993511438369751" />
<vert id="84" uvx="0.21363310515880585" uvy="0.6556453704833984" tx="0.9956754446029663" ty="0.09289996325969696" tz="5.367150612833882e-10" bx="0.0033461027778685093" by="-0.035862576216459274" bz="-0.9993511438369751" />
<vert id="42" uvx="0.338321328163147" uvy="0.5804271101951599" tx="0.9956755042076111" ty="0.09289996325969696" tz="5.367150612833882e-10" bx="0.0033461027778685093" by="-0.035862576216459274" bz="-0.9993512034416199" />
<vert id="79" uvx="0.2354084849357605" uvy="0.7117956280708313" tx="0.9824341535568237" ty="0.1866096556186676" tz="2.3249940284131299e-07" bx="0.013475079089403152" by="-0.070940300822258" bz="-0.9973896145820618" />
<vert id="85" uvx="0.09558513760566711" uvy="0.7271022200584412" tx="0.9824342131614685" ty="0.1866096705198288" tz="2.3249943126302242e-07" bx="0.013475080020725727" by="-0.07094030827283859" bz="-0.9973896741867065" />
<vert id="84" uvx="0.21363310515880585" uvy="0.6556453704833984" tx="0.9824341535568237" ty="0.1866096556186676" tz="2.324994170521677e-07" bx="0.013475079089403152" by="-0.070940300822258" bz="-0.9973896145820618" />
<vert id="35" uvx="0.36272484064102173" uvy="0.3758132755756378" tx="0.9975647330284119" ty="0.06974761188030243" tz="-1.5990841006896517e-07" bx="-0.004332558251917362" by="0.06196409463882446" bz="-0.9980690479278564" />
<vert id="86" uvx="0.2354084998369217" uvy="0.2882043719291687" tx="0.9975646138191223" ty="0.06974760442972183" tz="-1.5990838164725574e-07" bx="-0.004332557786256075" by="0.061964087188243866" bz="-0.9980689287185669" />
<vert id="70" uvx="0.2608596682548523" uvy="0.2596695125102997" tx="0.9975646138191223" ty="0.06974761188030243" tz="-1.5990839585811045e-07" bx="-0.004332558251917362" by="0.061964087188243866" bz="-0.9980689287185669" />
<vert id="70" uvx="0.2608596682548523" uvy="0.2596695125102997" tx="0.9900213479995728" ty="0.14091728627681732" tz="-2.2308446645524782e-08" bx="-0.017580563202500343" by="0.12351296097040176" bz="-0.9921872019767761" />
<vert id="87" uvx="0.1273575872182846" uvy="0.19096893072128296" tx="0.9900213479995728" ty="0.14091728627681732" tz="-2.2308446645524782e-08" bx="-0.017580563202500343" by="0.12351296097040176" bz="-0.9921872019767761" />
<vert id="71" uvx="0.16449347138404846" uvy="0.1493336707353592" tx="0.9900213479995728" ty="0.14091728627681732" tz="-2.2308444869167943e-08" bx="-0.017580563202500343" by="0.12351296097040176" bz="-0.9921872019767761" />
<vert id="41" uvx="0.338321328163147" uvy="0.4195728898048401" tx="0.9934456944465637" ty="0.11430531740188599" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0000001192092896" />
<vert id="84" uvx="0.21363310515880585" uvy="0.6556453704833984" tx="0.993445634841919" ty="0.11430530995130539" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="83" uvx="0.21363316476345062" uvy="0.34435462951660156" tx="0.9934456944465637" ty="0.11430532485246658" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0000001192092896" />
<vert id="84" uvx="0.21363310515880585" uvy="0.6556453704833984" tx="0.9736462235450745" ty="0.22806376218795776" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="82" uvx="0.09558520466089249" uvy="0.27289777994155884" tx="0.9736462235450745" ty="0.22806371748447418" tz="-0.0" bx="0.0" by="-0.0" bz="-0.9999999403953552" />
<vert id="83" uvx="0.21363316476345062" uvy="0.34435462951660156" tx="0.9736461639404297" ty="0.22806371748447418" tz="-0.0" bx="0.0" by="-0.0" bz="-0.9999998807907104" />
<vert id="40" uvx="0.36272484064102173" uvy="0.6241867542266846" tx="0.9991341829299927" ty="0.041602686047554016" tz="4.7075221232262265e-07" bx="0.0036155213601887226" by="-0.08681944012641907" bz="-0.9962174892425537" />
<vert id="75" uvx="0.2999207377433777" uvy="0.7589686512947083" tx="0.9991341233253479" ty="0.041602686047554016" tz="4.7075221232262265e-07" bx="0.0036155213601887226" by="-0.08681943267583847" bz="-0.9962174296379089" />
<vert id="80" uvx="0.2608596682548523" uvy="0.7403304576873779" tx="0.9991342425346375" ty="0.041602689772844315" tz="4.707522691660415e-07" bx="0.0036155215930193663" by="-0.08681944757699966" bz="-0.9962175488471985" />
<vert id="80" uvx="0.2608596682548523" uvy="0.7403304576873779" tx="0.996426522731781" ty="0.08446484804153442" tz="5.38640790637146e-07" bx="0.01472924929112196" by="-0.1737537533044815" bz="-0.984679102897644" />
<vert id="74" uvx="0.22148749232292175" uvy="0.8778612613677979" tx="0.996426522731781" ty="0.08446484804153442" tz="5.38640790637146e-07" bx="0.01472924929112196" by="-0.1737537533044815" bz="-0.984679102897644" />
<vert id="81" uvx="0.16449342668056488" uvy="0.8506662845611572" tx="0.9964264035224915" ty="0.08446484804153442" tz="5.38640790637146e-07" bx="0.01472924929112196" by="-0.1737537384033203" bz="-0.9846789836883545" />
<vert id="38" uvx="0.42749667167663574" uvy="0.6398888230323792" tx="0.9999963045120239" ty="0.0026993555948138237" tz="1.737101200660618e-07" bx="0.00029321282636374235" by="-0.10855889320373535" bz="-0.9940899014472961" />
<vert id="61" uvx="0.472495973110199" uvy="0.7728514671325684" tx="0.9999962449073792" ty="0.00269935536198318" tz="1.737101200660618e-07" bx="0.0002932127972599119" by="-0.10855888575315475" bz="-0.9940898418426514" />
<vert id="76" uvx="0.38620835542678833" uvy="0.7707177400588989" tx="0.9999963641166687" ty="0.0026993558276444674" tz="1.737101342769165e-07" bx="0.00029321282636374235" by="-0.10855890065431595" bz="-0.9940899610519409" />
<vert id="76" uvx="0.38620835542678833" uvy="0.7707177400588989" tx="0.9999849796295166" ty="0.005495251156389713" tz="-1.3137341881019893e-08" bx="0.0011925508733838797" by="-0.2170138657093048" bz="-0.9761678576469421" />
<vert id="60" uvx="0.4732920229434967" uvy="0.8981176614761353" tx="0.999984860420227" ty="0.005495250690728426" tz="-1.3137340992841473e-08" bx="0.0011925507569685578" by="-0.21701385080814362" bz="-0.9761677384376526" />
<vert id="77" uvx="0.34738975763320923" uvy="0.8950043320655823" tx="0.9999849200248718" ty="0.005495251156389713" tz="-1.3137341881019893e-08" bx="0.0011925508733838797" by="-0.21701385080814362" bz="-0.9761677980422974" />
<vert id="40" uvx="0.36272484064102173" uvy="0.6241867542266846" tx="0.9975646734237671" ty="0.0697472020983696" tz="8.481379154545721e-07" bx="0.004333213437348604" by="-0.06196397915482521" bz="-0.9980689883232117" />
<vert id="79" uvx="0.2354084849357605" uvy="0.7117956280708313" tx="0.9975646138191223" ty="0.069747194647789" tz="8.481378586111532e-07" bx="0.004333212971687317" by="-0.06196397542953491" bz="-0.9980689287185669" />
<vert id="39" uvx="0.34957337379455566" uvy="0.6094418168067932" tx="0.9975647330284119" ty="0.0697472095489502" tz="8.481380291414098e-07" bx="0.0043332139030098915" by="-0.06196398288011551" bz="-0.9980690479278564" />
<vert id="80" uvx="0.2608596682548523" uvy="0.7403304576873779" tx="0.9900213479995728" ty="0.14091740548610687" tz="-2.8366636684040714e-07" bx="0.01758028380572796" by="-0.12351305037736893" bz="-0.9921871423721313" />
<vert id="78" uvx="0.1273575723171234" uvy="0.8090310096740723" tx="0.9900213479995728" ty="0.14091740548610687" tz="-2.8366636684040714e-07" bx="0.01758028380572796" by="-0.12351305037736893" bz="-0.9921871423721313" />
<vert id="79" uvx="0.2354084849357605" uvy="0.7117956280708313" tx="0.9900214076042175" ty="0.14091740548610687" tz="-2.8366636684040714e-07" bx="0.01758028380572796" by="-0.12351305782794952" bz="-0.9921872019767761" />
<vert id="34" uvx="0.38290897011756897" uvy="0.3661822974681854" tx="0.9998970031738281" ty="0.014355788938701153" tz="3.6095732980356843e-07" bx="-0.0015054912073537707" by="0.10488417744636536" bz="-0.9944834113121033" />
<vert id="72" uvx="0.38620835542678833" uvy="0.22928225994110107" tx="0.9998968839645386" ty="0.014355786144733429" tz="3.60957301381859e-07" bx="-0.0015054908581078053" by="0.10488416254520416" bz="-0.9944832921028137" />
<vert id="36" uvx="0.42749667167663574" uvy="0.36011117696762085" tx="0.9998968839645386" ty="0.014355787076056004" tz="3.60957301381859e-07" bx="-0.001505490974523127" by="0.10488416254520416" bz="-0.9944832921028137" />
<vert id="69" uvx="0.2999207377433777" uvy="0.24103134870529175" tx="0.9995731711387634" ty="0.02921643666923046" tz="1.2866044585280179e-07" bx="-0.006131766363978386" by="0.20978857576847076" bz="-0.9777275919914246" />
<vert id="73" uvx="0.34738975763320923" uvy="0.10499565303325653" tx="0.9995731115341187" ty="0.029216432943940163" tz="1.2866043164194707e-07" bx="-0.006131765432655811" by="0.20978856086730957" bz="-0.9777275919914246" />
<vert id="72" uvx="0.38620835542678833" uvy="0.22928225994110107" tx="0.9995731115341187" ty="0.029216432943940163" tz="1.2866044585280179e-07" bx="-0.006131765432655811" by="0.20978856086730957" bz="-0.9777275919914246" />
<vert id="37" uvx="0.38290899991989136" uvy="0.6338176727294922" tx="0.9998969435691833" ty="0.014356021769344807" tz="-1.6772995081737463e-07" bx="0.001505707623437047" by="-0.10488415509462357" bz="-0.9944832921028137" />
<vert id="76" uvx="0.38620835542678833" uvy="0.7707177400588989" tx="0.9998969435691833" ty="0.014356023631989956" tz="-1.6772996502822934e-07" bx="0.0015057077398523688" by="-0.10488415509462357" bz="-0.9944832921028137" />
<vert id="75" uvx="0.2999207377433777" uvy="0.7589686512947083" tx="0.9998970031738281" ty="0.014356023631989956" tz="-1.6772997923908406e-07" bx="0.0015057077398523688" by="-0.10488416254520416" bz="-0.9944833517074585" />
<vert id="75" uvx="0.2999207377433777" uvy="0.7589686512947083" tx="0.9995731711387634" ty="0.029216419905424118" tz="-2.472871472036786e-07" bx="0.00613164808601141" by="-0.20978862047195435" bz="-0.9777275919914246" />
<vert id="77" uvx="0.34738975763320923" uvy="0.8950043320655823" tx="0.9995731711387634" ty="0.02921641618013382" tz="-2.472871187819692e-07" bx="0.006131647154688835" by="-0.20978862047195435" bz="-0.9777275919914246" />
<vert id="74" uvx="0.22148749232292175" uvy="0.8778612613677979" tx="0.9995731115341187" ty="0.02921641431748867" tz="-2.472871187819692e-07" bx="0.006131647154688835" by="-0.20978860557079315" bz="-0.9777275919914246" />
<vert id="36" uvx="0.42749667167663574" uvy="0.36011117696762085" tx="0.9999963045120239" ty="0.002699141623452306" tz="7.208491581423004e-08" bx="-0.0002929453330580145" by="0.10855892300605774" bz="-0.9940899610519409" />
<vert id="50" uvx="0.472495973110199" uvy="0.22714851796627045" tx="0.9999963641166687" ty="0.002699142089113593" tz="7.20849229196574e-08" bx="-0.0002929453912656754" by="0.10855893045663834" bz="-0.9940900206565857" />
<vert id="24" uvx="0.4720843434333801" uvy="0.3590086102485657" tx="0.9999963641166687" ty="0.002699142089113593" tz="7.20849229196574e-08" bx="-0.0002929453912656754" by="0.10855893045663834" bz="-0.9940900206565857" />
<vert id="72" uvx="0.38620835542678833" uvy="0.22928225994110107" tx="0.999984860420227" ty="0.005495178513228893" tz="5.4323702869396584e-08" bx="-0.0011924942955374718" by="0.21701376140117645" bz="-0.9761677980422974" />
<vert id="51" uvx="0.4732920527458191" uvy="0.10188230127096176" tx="0.999984860420227" ty="0.005495178978890181" tz="5.432370642211026e-08" bx="-0.0011924944119527936" by="0.21701376140117645" bz="-0.9761677980422974" />
<vert id="50" uvx="0.472495973110199" uvy="0.22714851796627045" tx="0.9999849200248718" ty="0.005495178978890181" tz="5.432370642211026e-08" bx="-0.0011924944119527936" by="0.21701376140117645" bz="-0.9761678576469421" />
<vert id="35" uvx="0.36272484064102173" uvy="0.3758132755756378" tx="0.9991342425346375" ty="0.041602712124586105" tz="-4.196014060653397e-07" bx="-0.0036154775880277157" by="0.08681956678628922" bz="-0.9962174892425537" />
<vert id="69" uvx="0.2999207377433777" uvy="0.24103134870529175" tx="0.9991341829299927" ty="0.041602715849876404" tz="-4.196014060653397e-07" bx="-0.0036154778208583593" by="0.08681955933570862" bz="-0.9962174296379089" />
<vert id="34" uvx="0.38290897011756897" uvy="0.3661822974681854" tx="0.9991341829299927" ty="0.041602715849876404" tz="-4.1960137764363026e-07" bx="-0.0036154778208583593" by="0.08681955933570862" bz="-0.9962174296379089" />
<vert id="70" uvx="0.2608596682548523" uvy="0.2596695125102997" tx="0.996426522731781" ty="0.08446459472179413" tz="1.4230343481358432e-07" bx="-0.014728512614965439" by="0.1737535148859024" bz="-0.9846790432929993" />
<vert id="68" uvx="0.22148744761943817" uvy="0.12213874608278275" tx="0.996426522731781" ty="0.08446459472179413" tz="1.4230343481358432e-07" bx="-0.014728512614965439" by="0.1737535148859024" bz="-0.9846790432929993" />
<vert id="69" uvx="0.2999207377433777" uvy="0.24103134870529175" tx="0.9964264035224915" ty="0.08446458727121353" tz="1.423034206027296e-07" bx="-0.01472851075232029" by="0.1737534999847412" bz="-0.9846789836883545" />
<vert id="33" uvx="0.5945953130722046" uvy="0.3905581831932068" tx="0.9956754446029663" ty="-0.09289997071027756" tz="5.367150612833882e-10" bx="0.003346103010699153" by="0.035862576216459274" bz="-0.9993511438369751" />
<vert id="64" uvx="0.7313588261604309" uvy="0.34435462951660156" tx="0.9956754446029663" ty="-0.09289996325969696" tz="5.367150612833882e-10" bx="0.0033461027778685093" by="0.035862576216459274" bz="-0.9993511438369751" />
<vert id="31" uvx="0.6058473587036133" uvy="0.4195728898048401" tx="0.9956755042076111" ty="-0.09289996325969696" tz="5.367150612833882e-10" bx="0.0033461027778685093" by="0.035862576216459274" bz="-0.9993512034416199" />
<vert id="67" uvx="0.7095834612846375" uvy="0.2882044017314911" tx="0.9824341535568237" ty="-0.18660974502563477" tz="1.7760471848760062e-07" bx="0.01347503811120987" by="0.07094035297632217" bz="-0.9973896145820618" />
<vert id="65" uvx="0.8509989380836487" uvy="0.2728978097438812" tx="0.9824342131614685" ty="-0.18660974502563477" tz="1.7760473269845534e-07" bx="0.01347503811120987" by="0.07094036042690277" bz="-0.9973896741867065" />
<vert id="64" uvx="0.7313588261604309" uvy="0.34435462951660156" tx="0.9824341535568237" ty="-0.18660973012447357" tz="1.7760471848760062e-07" bx="0.013475037179887295" by="0.07094035297632217" bz="-0.9973896145820618" />
<vert id="28" uvx="0.5945953130722046" uvy="0.6094418168067932" tx="0.9956754446029663" ty="-0.09290005266666412" tz="-1.1284982548431799e-07" bx="-0.0033462229184806347" by="-0.035862620919942856" bz="-0.9993511438369751" />
<vert id="63" uvx="0.7313588261604309" uvy="0.6556453704833984" tx="0.9956754446029663" ty="-0.09290005266666412" tz="-1.1284983258974535e-07" bx="-0.0033462229184806347" by="-0.035862620919942856" bz="-0.9993511438369751" />
<vert id="58" uvx="0.7095834612846375" uvy="0.7117956280708313" tx="0.9956753849983215" ty="-0.09290004521608353" tz="-1.1284982548431799e-07" bx="-0.003346222685649991" by="-0.03586261719465256" bz="-0.9993510842323303" />
<vert id="58" uvx="0.7095834612846375" uvy="0.7117956280708313" tx="0.9824341535568237" ty="-0.1866096407175064" tz="-9.725474825472702e-08" bx="-0.01347491703927517" by="-0.07094018906354904" bz="-0.997389554977417" />
<vert id="62" uvx="0.8509988784790039" uvy="0.7271022200584412" tx="0.982434093952179" ty="-0.1866096556186676" tz="-9.725474114929966e-08" bx="-0.013474917970597744" by="-0.07094018161296844" bz="-0.9973894953727722" />
<vert id="59" uvx="0.8192265033721924" uvy="0.809031069278717" tx="0.9824342131614685" ty="-0.1866096705198288" tz="-9.725475536015438e-08" bx="-0.013474918901920319" by="-0.07094018906354904" bz="-0.9973896145820618" />
<vert id="23" uvx="0.5814438462257385" uvy="0.3758132755756378" tx="0.9975646734237671" ty="-0.06974715739488602" tz="1.7586264888791447e-08" bx="0.004332396201789379" by="0.061964213848114014" bz="-0.9980689287185669" />
<vert id="67" uvx="0.7095834612846375" uvy="0.2882044017314911" tx="0.9975646734237671" ty="-0.06974715739488602" tz="1.7586264888791447e-08" bx="0.004332396201789379" by="0.061964213848114014" bz="-0.9980689287185669" />
<vert id="33" uvx="0.5945953130722046" uvy="0.3905581831932068" tx="0.9975647330284119" ty="-0.06974715739488602" tz="1.7586264888791447e-08" bx="0.004332396201789379" by="0.06196421757340431" bz="-0.9980689883232117" />
<vert id="45" uvx="0.6841322779655457" uvy="0.25966954231262207" tx="0.9900213479995728" ty="-0.14091745018959045" tz="8.956990882325044e-08" bx="0.017580656334757805" by="0.12351299822330475" bz="-0.9921871423721313" />
<vert id="66" uvx="0.8192265033721924" uvy="0.19096899032592773" tx="0.9900213479995728" ty="-0.14091746509075165" tz="8.956990882325044e-08" bx="0.017580658197402954" by="0.12351299822330475" bz="-0.9921871423721313" />
<vert id="67" uvx="0.7095834612846375" uvy="0.2882044017314911" tx="0.9900213479995728" ty="-0.14091746509075165" tz="8.95699159286778e-08" bx="0.017580658197402954" by="0.12351299822330475" bz="-0.9921871423721313" />
<vert id="32" uvx="0.6058473587036133" uvy="0.5804271101951599" tx="0.9934456944465637" ty="-0.1143052875995636" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="64" uvx="0.7313588261604309" uvy="0.34435462951660156" tx="0.993445634841919" ty="-0.114305280148983" tz="-0.0" bx="-0.0" by="0.0" bz="-0.9999999403953552" />
<vert id="63" uvx="0.7313588261604309" uvy="0.6556453704833984" tx="0.9934456944465637" ty="-0.1143052950501442" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="63" uvx="0.7313588261604309" uvy="0.6556453704833984" tx="0.9736462235450745" ty="-0.22806377708911896" tz="7.285645153842779e-08" bx="6.643055172617096e-08" by="-3.5852238511324686e-08" bz="-1.0" />
<vert id="65" uvx="0.8509989380836487" uvy="0.2728978097438812" tx="0.9736461043357849" ty="-0.22806376218795776" tz="7.285645153842779e-08" bx="6.643055172617096e-08" by="-3.5852238511324686e-08" bz="-0.9999999403953552" />
<vert id="62" uvx="0.8509988784790039" uvy="0.7271022200584412" tx="0.9736462235450745" ty="-0.22806379199028015" tz="7.285645864385515e-08" bx="6.643055883159832e-08" by="-3.5852238511324686e-08" bz="-1.0" />
<vert id="29" uvx="0.5814438462257385" uvy="0.6241867542266846" tx="0.9991341829299927" ty="-0.04160265997052193" tz="-4.212195392483409e-07" bx="-0.00361547339707613" by="-0.08681952953338623" bz="-0.9962174296379089" />
<vert id="54" uvx="0.6450712084770203" uvy="0.758968710899353" tx="0.9991342425346375" ty="-0.041602663695812225" tz="-4.212195676700503e-07" bx="-0.0036154736299067736" by="-0.08681953698396683" bz="-0.9962174892425537" />
<vert id="26" uvx="0.5612596869468689" uvy="0.633817732334137" tx="0.9991341829299927" ty="-0.04160265997052193" tz="-4.212195392483409e-07" bx="-0.00361547339707613" by="-0.08681952953338623" bz="-0.9962174296379089" />
<vert id="57" uvx="0.6841322779655457" uvy="0.7403305172920227" tx="0.996426522731781" ty="-0.08446492999792099" tz="2.2237708208194817e-07" bx="-0.014728491194546223" by="-0.1737534999847412" bz="-0.984679102897644" />
<vert id="55" uvx="0.725096583366394" uvy="0.8778613209724426" tx="0.9964264035224915" ty="-0.0844649225473404" tz="2.2237705366023874e-07" bx="-0.014728490263223648" by="-0.17375348508358002" bz="-0.9846789836883545" />
<vert id="54" uvx="0.6450712084770203" uvy="0.758968710899353" tx="0.9964264035224915" ty="-0.0844649225473404" tz="2.2237708208194817e-07" bx="-0.014728490263223648" by="-0.17375348508358002" bz="-0.9846789836883545" />
<vert id="27" uvx="0.5166720151901245" uvy="0.6398888230323792" tx="0.9999963045120239" ty="-0.0026991423219442368" tz="7.745223484789676e-08" bx="-0.0002929400361608714" by="-0.10855891555547714" bz="-0.9940899014472961" />
<vert id="61" uvx="0.472495973110199" uvy="0.7728514671325684" tx="0.9999964237213135" ty="-0.0026991425547748804" tz="7.745224195332412e-08" bx="-0.00029294006526470184" by="-0.10855893045663834" bz="-0.9940900206565857" />
<vert id="30" uvx="0.4720843434333801" uvy="0.6409913897514343" tx="0.9999963045120239" ty="-0.0026991423219442368" tz="7.745223484789676e-08" bx="-0.0002929400361608714" by="-0.10855891555547714" bz="-0.9940899014472961" />
<vert id="53" uvx="0.5587835907936096" uvy="0.7707177400588989" tx="0.999984860420227" ty="-0.00549512542784214" tz="-1.5639103878584137e-07" bx="-0.0011926883598789573" by="-0.21701374650001526" bz="-0.9761677980422974" />
<vert id="60" uvx="0.4732920229434967" uvy="0.8981176614761353" tx="0.999984860420227" ty="-0.00549512542784214" tz="-1.5639103878584137e-07" bx="-0.0011926883598789573" by="-0.21701374650001526" bz="-0.9761677980422974" />
<vert id="61" uvx="0.472495973110199" uvy="0.7728514671325684" tx="0.999984860420227" ty="-0.0054951258935034275" tz="-1.5639102457498666e-07" bx="-0.001192688476294279" by="-0.21701374650001526" bz="-0.9761677980422974" />
<vert id="29" uvx="0.5814438462257385" uvy="0.6241867542266846" tx="0.9975647330284119" ty="-0.06974765658378601" tz="-6.752686090294446e-07" bx="-0.004333074204623699" by="-0.06196405738592148" bz="-0.9980690479278564" />
<vert id="58" uvx="0.7095834612846375" uvy="0.7117956280708313" tx="0.9975646138191223" ty="-0.06974764168262482" tz="-6.752684953426069e-07" bx="-0.004333073273301125" by="-0.06196404993534088" bz="-0.9980689287185669" />
<vert id="57" uvx="0.6841322779655457" uvy="0.7403305172920227" tx="0.9975646138191223" ty="-0.06974764913320541" tz="-6.752686090294446e-07" bx="-0.004333073738962412" by="-0.06196404993534088" bz="-0.9980689287185669" />
<vert id="57" uvx="0.6841322779655457" uvy="0.7403305172920227" tx="0.9900213479995728" ty="-0.1409173309803009" tz="-3.2738452659941686e-07" bx="-0.017580868676304817" by="-0.12351291626691818" bz="-0.9921872019767761" />
<vert id="59" uvx="0.8192265033721924" uvy="0.809031069278717" tx="0.9900213479995728" ty="-0.1409173309803009" tz="-3.2738452659941686e-07" bx="-0.017580868676304817" by="-0.12351291626691818" bz="-0.9921872019767761" />
<vert id="56" uvx="0.7820906043052673" uvy="0.850666344165802" tx="0.9900213479995728" ty="-0.1409173309803009" tz="-3.2738452659941686e-07" bx="-0.017580868676304817" by="-0.12351291626691818" bz="-0.9921872019767761" />
<vert id="22" uvx="0.5612596869468689" uvy="0.3661823272705078" tx="0.9998969435691833" ty="-0.014356028288602829" tz="6.83837264592313e-10" bx="0.001505875843577087" by="0.10488415509462357" bz="-0.9944832921028137" />
<vert id="49" uvx="0.5587835907936096" uvy="0.22928227484226227" tx="0.9998969435691833" ty="-0.014356029219925404" tz="6.838373201034642e-10" bx="0.001505875843577087" by="0.10488415509462357" bz="-0.9944832921028137" />
<vert id="46" uvx="0.6450712084770203" uvy="0.24103134870529175" tx="0.9998969435691833" ty="-0.014356028288602829" tz="6.838373201034642e-10" bx="0.001505875843577087" by="0.10488415509462357" bz="-0.9944832921028137" />
<vert id="46" uvx="0.6450712084770203" uvy="0.24103134870529175" tx="0.9995731711387634" ty="-0.02921641245484352" tz="6.768569704718175e-08" bx="0.006131953094154596" by="0.20978857576847076" bz="-0.9777275919914246" />
<vert id="48" uvx="0.599194347858429" uvy="0.10499566793441772" tx="0.9995731711387634" ty="-0.029216410592198372" tz="6.768568994175439e-08" bx="0.006131952628493309" by="0.20978857576847076" bz="-0.9777275919914246" />
<vert id="47" uvx="0.7250966429710388" uvy="0.12213875353336334" tx="0.9995730519294739" ty="-0.029216408729553223" tz="6.768568994175439e-08" bx="0.006131952162832022" by="0.20978856086730957" bz="-0.9777275323867798" />
<vert id="26" uvx="0.5612596869468689" uvy="0.633817732334137" tx="0.9998970031738281" ty="-0.014355722814798355" tz="1.0037832680609426e-06" bx="-0.0015048448694869876" by="-0.10488417744636536" bz="-0.9944833517074585" />
<vert id="53" uvx="0.5587835907936096" uvy="0.7707177400588989" tx="0.9998968839645386" ty="-0.014355720952153206" tz="1.0037830406872672e-06" bx="-0.0015048447530716658" by="-0.10488416254520416" bz="-0.994483232498169" />
<vert id="27" uvx="0.5166720151901245" uvy="0.6398888230323792" tx="0.9998968839645386" ty="-0.01435572188347578" tz="1.003783154374105e-06" bx="-0.0015048448694869876" by="-0.10488416254520416" bz="-0.994483232498169" />
<vert id="54" uvx="0.6450712084770203" uvy="0.758968710899353" tx="0.9995731711387634" ty="-0.029216255992650986" tz="4.735101981623302e-07" bx="-0.006131390575319529" by="-0.20978856086730957" bz="-0.9777275919914246" />
<vert id="52" uvx="0.599194347858429" uvy="0.895004391670227" tx="0.9995731115341187" ty="-0.029216252267360687" tz="4.7351016974062077e-07" bx="-0.006131389643996954" by="-0.20978854596614838" bz="-0.9777275919914246" />
<vert id="53" uvx="0.5587835907936096" uvy="0.7707177400588989" tx="0.9995731115341187" ty="-0.029216254130005836" tz="4.7351016974062077e-07" bx="-0.006131390109658241" by="-0.20978854596614838" bz="-0.9777275919914246" />
<vert id="25" uvx="0.5166720151901245" uvy="0.36011117696762085" tx="0.9999963045120239" ty="-0.0026993697974830866" tz="1.7699598231502023e-07" bx="0.0002932176867034286" by="0.10855890810489655" bz="-0.9940899014472961" />
<vert id="50" uvx="0.472495973110199" uvy="0.22714851796627045" tx="0.9999964237213135" ty="-0.002699370263144374" tz="1.7699599652587494e-07" bx="0.00029321774491108954" by="0.10855892300605774" bz="-0.9940900206565857" />
<vert id="49" uvx="0.5587835907936096" uvy="0.22928227484226227" tx="0.9999963641166687" ty="-0.0026993700303137302" tz="1.7699599652587494e-07" bx="0.0002932177158072591" by="0.10855891555547714" bz="-0.9940899610519409" />
<vert id="49" uvx="0.5587835907936096" uvy="0.22928227484226227" tx="0.999984860420227" ty="-0.005495320074260235" tz="5.634642974428061e-08" bx="0.0011926336446776986" by="0.217013880610466" bz="-0.9761677384376526" />
<vert id="51" uvx="0.4732920527458191" uvy="0.10188230127096176" tx="0.999984860420227" ty="-0.005495320074260235" tz="5.634643684970797e-08" bx="0.0011926336446776986" by="0.217013880610466" bz="-0.9761677384376526" />
<vert id="48" uvx="0.599194347858429" uvy="0.10499566793441772" tx="0.999984860420227" ty="-0.005495320539921522" tz="5.634643329699429e-08" bx="0.0011926337610930204" by="0.217013880610466" bz="-0.9761677384376526" />
<vert id="23" uvx="0.5814438462257385" uvy="0.3758132755756378" tx="0.9991343021392822" ty="-0.04160265251994133" tz="-1.5173812073498993e-07" bx="0.0036148964427411556" by="0.08681942522525787" bz="-0.9962176084518433" />
<vert id="46" uvx="0.6450712084770203" uvy="0.24103134870529175" tx="0.9991341829299927" ty="-0.04160264879465103" tz="-1.517380923132805e-07" bx="0.0036148959770798683" by="0.08681941032409668" bz="-0.9962174892425537" />
<vert id="45" uvx="0.6841322779655457" uvy="0.25966954231262207" tx="0.9991341829299927" ty="-0.04160264879465103" tz="-1.5173810652413522e-07" bx="0.0036148959770798683" by="0.08681941032409668" bz="-0.9962174892425537" />
<vert id="45" uvx="0.6841322779655457" uvy="0.25966954231262207" tx="0.9964264631271362" ty="-0.08446488529443741" tz="9.577556880913107e-08" bx="0.014728804118931293" by="0.17375357449054718" bz="-0.9846790432929993" />
<vert id="47" uvx="0.7250966429710388" uvy="0.12213875353336334" tx="0.996426522731781" ty="-0.08446488529443741" tz="9.577558301998579e-08" bx="0.014728804118931293" by="0.17375357449054718" bz="-0.984679102897644" />
<vert id="44" uvx="0.7820906639099121" uvy="0.14933373034000397" tx="0.9964264631271362" ty="-0.08446488529443741" tz="9.577557591455843e-08" bx="0.014728804118931293" by="0.17375357449054718" bz="-0.9846790432929993" />
<vert id="28" uvx="0.5945953130722046" uvy="0.6094418168067932" tx="1.0" ty="-4.447370258731098e-07" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="33" uvx="0.5945953130722046" uvy="0.3905581831932068" tx="1.0" ty="-4.447370258731098e-07" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="31" uvx="0.6058473587036133" uvy="0.4195728898048401" tx="1.0" ty="-4.447370258731098e-07" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="26" uvx="0.5612596869468689" uvy="0.633817732334137" tx="1.0" ty="6.082964318920858e-07" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="22" uvx="0.5612596869468689" uvy="0.3661823272705078" tx="0.9999999403953552" ty="6.082964318920858e-07" tz="-0.0" bx="0.0" by="-0.0" bz="-0.9999999403953552" />
<vert id="23" uvx="0.5814438462257385" uvy="0.3758132755756378" tx="1.0" ty="6.082964318920858e-07" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="29" uvx="0.5814438462257385" uvy="0.6241867542266846" tx="1.0" ty="8.383176464121789e-08" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="23" uvx="0.5814438462257385" uvy="0.3758132755756378" tx="0.9999999403953552" ty="8.383176464121789e-08" tz="-0.0" bx="0.0" by="-0.0" bz="-0.9999999403953552" />
<vert id="33" uvx="0.5945953130722046" uvy="0.3905581831932068" tx="1.0" ty="8.383176464121789e-08" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="24" uvx="0.4720843434333801" uvy="0.3590086102485657" tx="1.0" ty="0.0" tz="-8.853718469481464e-08" bx="-8.853718469481464e-08" by="0.0" bz="-1.0" />
<vert id="25" uvx="0.5166720151901245" uvy="0.36011117696762085" tx="1.0" ty="0.0" tz="9.237298570496932e-08" bx="9.237298570496932e-08" by="-0.0" bz="-1.0" />
<vert id="27" uvx="0.5166720151901245" uvy="0.6398888230323792" tx="1.0" ty="0.0" tz="1.0487909918310834e-07" bx="1.0487909918310834e-07" by="-0.0" bz="-1.0" />
<vert id="22" uvx="0.5612596869468689" uvy="0.3661823272705078" tx="1.0" ty="-2.868400770239532e-07" tz="1.3539324754674453e-06" bx="1.3539324754674453e-06" by="-3.883621397561543e-13" bz="-1.0" />
<vert id="26" uvx="0.5612596869468689" uvy="0.633817732334137" tx="1.0" ty="-2.8684010544566263e-07" tz="1.353932589154283e-06" bx="1.353932589154283e-06" by="-3.883621668612086e-13" bz="-1.0" />
<vert id="27" uvx="0.5166720151901245" uvy="0.6398888230323792" tx="1.0" ty="-2.8684010544566263e-07" tz="1.3539324754674453e-06" bx="1.3539324754674453e-06" by="-3.883621397561543e-13" bz="-1.0" />
<vert id="41" uvx="0.338321328163147" uvy="0.4195728898048401" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="43" uvx="0.34957337379455566" uvy="0.3905581831932068" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="39" uvx="0.34957337379455566" uvy="0.6094418168067932" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="35" uvx="0.36272484064102173" uvy="0.3758132755756378" tx="1.0" ty="-8.110632165880816e-07" tz="-6.07526544627035e-07" bx="-6.07526544627035e-07" by="4.927424570796979e-13" bz="-1.0" />
<vert id="34" uvx="0.38290897011756897" uvy="0.3661822974681854" tx="1.0" ty="-8.110632165880816e-07" tz="-6.07526544627035e-07" bx="-6.07526544627035e-07" by="4.927424570796979e-13" bz="-1.0" />
<vert id="37" uvx="0.38290899991989136" uvy="0.6338176727294922" tx="1.0" ty="-8.110632734315004e-07" tz="-6.07526544627035e-07" bx="-6.07526544627035e-07" by="4.927424570796979e-13" bz="-1.0" />
<vert id="43" uvx="0.34957337379455566" uvy="0.3905581831932068" tx="1.0" ty="0.0" tz="7.728509388016391e-08" bx="7.728509388016391e-08" by="-0.0" bz="-1.0" />
<vert id="35" uvx="0.36272484064102173" uvy="0.3758132755756378" tx="0.9999999403953552" ty="0.0" tz="7.728508677473656e-08" bx="7.728508677473656e-08" by="-0.0" bz="-0.9999999403953552" />
<vert id="40" uvx="0.36272484064102173" uvy="0.6241867542266846" tx="1.0" ty="0.0" tz="7.728509388016391e-08" bx="7.728509388016391e-08" by="-0.0" bz="-1.0" />
<vert id="30" uvx="0.4720843434333801" uvy="0.6409913897514343" tx="1.0" ty="0.0" tz="-8.853719890566936e-08" bx="-8.853719890566936e-08" by="0.0" bz="-1.0" />
<vert id="38" uvx="0.42749667167663574" uvy="0.6398888230323792" tx="0.9999999403953552" ty="0.0" tz="-8.8537191800242e-08" bx="-8.8537191800242e-08" by="0.0" bz="-0.9999999403953552" />
<vert id="36" uvx="0.42749667167663574" uvy="0.36011117696762085" tx="1.0" ty="0.0" tz="-8.853719890566936e-08" bx="-8.853719890566936e-08" by="0.0" bz="-1.0" />
<vert id="36" uvx="0.42749667167663574" uvy="0.36011117696762085" tx="1.0" ty="-7.682959335397754e-08" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="38" uvx="0.42749667167663574" uvy="0.6398888230323792" tx="1.0" ty="-7.682959335397754e-08" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="37" uvx="0.38290899991989136" uvy="0.6338176727294922" tx="1.0" ty="-7.682959335397754e-08" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="44" uvx="0.7820906639099121" uvy="0.14933373034000397" tx="0.9902617335319519" ty="-0.13921785354614258" tz="1.4601749853682122e-07" bx="0.03900807723402977" by="0.2774648666381836" bz="-0.9599434733390808" />
<vert id="47" uvx="0.7250966429710388" uvy="0.12213875353336334" tx="0.9902617931365967" ty="-0.13921786844730377" tz="1.4601749853682122e-07" bx="0.03900808095932007" by="0.277464896440506" bz="-0.9599435329437256" />
<vert id="0" uvx="0.7906097769737244" uvy="0.025440294295549393" tx="0.9902617931365967" ty="-0.13921786844730377" tz="1.4601751274767594e-07" bx="0.03900808095932007" by="0.277464896440506" bz="-0.9599435329437256" />
<vert id="48" uvx="0.599194347858429" uvy="0.10499566793441772" tx="0.9999584555625916" ty="-0.009113634936511517" tz="2.3633466739170217e-08" bx="0.0031527478713542223" by="0.3459206819534302" bz="-0.9382585287094116" />
<vert id="51" uvx="0.4732920527458191" uvy="0.10188230127096176" tx="0.9999585151672363" ty="-0.009113634936511517" tz="2.3633468515527056e-08" bx="0.0031527478713542223" by="0.3459206819534302" bz="-0.9382585883140564" />
<vert id="8" uvx="0.47436589002609253" uvy="3.486812616415591e-09" tx="0.9999584555625916" ty="-0.009113634936511517" tz="2.3633466739170217e-08" bx="0.0031527478713542223" by="0.3459206819534302" bz="-0.9382585287094116" />
<vert id="55" uvx="0.725096583366394" uvy="0.8778613209724426" tx="0.9988271594047546" ty="-0.0484192781150341" tz="-1.2486008893475287e-09" bx="-0.016228627413511276" by="-0.3347755968570709" bz="-0.9421582221984863" />
<vert id="3" uvx="0.7906097173690796" uvy="0.9745597839355469" tx="0.9988270998001099" ty="-0.048419274389743805" tz="-1.2486006673029237e-09" bx="-0.016228627413511276" by="-0.33477556705474854" bz="-0.9421581625938416" />
<vert id="4" uvx="0.6324877738952637" uvy="0.9960899949073792" tx="0.9988270401954651" ty="-0.048419274389743805" tz="-1.2486006673029237e-09" bx="-0.016228627413511276" by="-0.33477553725242615" bz="-0.9421581029891968" />
<vert id="47" uvx="0.7250966429710388" uvy="0.12213875353336334" tx="0.9988270998001099" ty="-0.048419173806905746" tz="1.0318850485191433e-07" bx="0.016228673979640007" by="0.33477529883384705" bz="-0.9421582221984863" />
<vert id="48" uvx="0.599194347858429" uvy="0.10499566793441772" tx="0.9988270998001099" ty="-0.048419173806905746" tz="1.0318851195734169e-07" bx="0.016228673979640007" by="0.33477529883384705" bz="-0.9421582221984863" />
<vert id="5" uvx="0.6324878334999084" uvy="0.0039100730791687965" tx="0.9988271594047546" ty="-0.048419177532196045" tz="1.0318851195734169e-07" bx="0.016228675842285156" by="0.33477532863616943" bz="-0.9421582818031311" />
<vert id="56" uvx="0.7820906043052673" uvy="0.850666344165802" tx="0.9732492566108704" ty="-0.22975172102451324" tz="-2.070366349471442e-07" bx="-0.046141330152750015" by="-0.19545800983905792" bz="-0.979625940322876" />
<vert id="59" uvx="0.8192265033721924" uvy="0.809031069278717" tx="0.9732492566108704" ty="-0.22975175082683563" tz="-2.070366491579989e-07" bx="-0.04614133760333061" by="-0.19545800983905792" bz="-0.979625940322876" />
<vert id="2" uvx="0.9088283777236938" uvy="0.8881152272224426" tx="0.9732492566108704" ty="-0.22975172102451324" tz="-2.070366349471442e-07" bx="-0.046141330152750015" by="-0.19545800983905792" bz="-0.979625940322876" />
<vert id="52" uvx="0.599194347858429" uvy="0.895004391670227" tx="0.9999585151672363" ty="-0.00911339558660984" tz="3.1790864341019187e-07" bx="-0.003152345772832632" by="-0.3459208011627197" bz="-0.9382584095001221" />
<vert id="4" uvx="0.6324877738952637" uvy="0.9960899949073792" tx="0.9999585151672363" ty="-0.00911339558660984" tz="3.1790864341019187e-07" bx="-0.003152345772832632" by="-0.3459208011627197" bz="-0.9382584095001221" />
<vert id="9" uvx="0.47436586022377014" uvy="1.0" tx="0.9999584555625916" ty="-0.00911339558660984" tz="3.179086718319013e-07" bx="-0.003152345772832632" by="-0.3459208011627197" bz="-0.9382583498954773" />
<vert id="56" uvx="0.7820906043052673" uvy="0.850666344165802" tx="0.9902617335319519" ty="-0.13921795785427094" tz="-3.2467079336129245e-07" bx="-0.03900833800435066" by="-0.2774653136730194" bz="-0.9599434733390808" />
<vert id="1" uvx="0.8621891140937805" uvy="0.9404053092002869" tx="0.9902617931365967" ty="-0.13921795785427094" tz="-3.2467079336129245e-07" bx="-0.03900833800435066" by="-0.2774653434753418" bz="-0.9599435329437256" />
<vert id="3" uvx="0.7906097173690796" uvy="0.9745597839355469" tx="0.9902617931365967" ty="-0.13921795785427094" tz="-3.2467079336129245e-07" bx="-0.03900833800435066" by="-0.2774653434753418" bz="-0.9599435329437256" />
<vert id="65" uvx="0.8509989380836487" uvy="0.2728978097438812" tx="0.932133138179779" ty="-0.3621158301830292" tz="-1.0242658987635878e-07" bx="-9.547522239472528e-08" by="3.709029172682676e-08" bz="-1.0000001192092896" />
<vert id="11" uvx="0.9487317204475403" uvy="0.2147800624370575" tx="0.932133138179779" ty="-0.3621158301830292" tz="-1.0242658277093142e-07" bx="-9.547521528929792e-08" by="3.709029172682676e-08" bz="-1.0000001192092896" />
<vert id="10" uvx="0.9487317204475403" uvy="0.7852199673652649" tx="0.9321330785751343" ty="-0.3621158301830292" tz="-1.0242658277093142e-07" bx="-9.547521528929792e-08" by="3.709029172682676e-08" bz="-1.0" />
<vert id="44" uvx="0.7820906639099121" uvy="0.14933373034000397" tx="0.9732493162155151" ty="-0.22975176572799683" tz="-3.784150806040998e-07" bx="0.04614073783159256" by="0.19545796513557434" bz="-0.9796260595321655" />
<vert id="7" uvx="0.8621891140937805" uvy="0.05959474667906761" tx="0.9732493162155151" ty="-0.22975176572799683" tz="-3.784150806040998e-07" bx="0.04614073783159256" by="0.19545796513557434" bz="-0.9796260595321655" />
<vert id="6" uvx="0.9088284373283386" uvy="0.11188479512929916" tx="0.9732492566108704" ty="-0.22975175082683563" tz="-3.7841505218239035e-07" bx="0.04614073410630226" by="0.19545795023441315" bz="-0.9796259999275208" />
<vert id="59" uvx="0.8192265033721924" uvy="0.809031069278717" tx="0.9537917375564575" ty="-0.30046841502189636" tz="-1.775475944043592e-08" bx="-0.03479021415114403" by="-0.11043623089790344" bz="-0.9932740926742554" />
<vert id="62" uvx="0.8509988784790039" uvy="0.7271022200584412" tx="0.9537917971611023" ty="-0.30046841502189636" tz="-1.7754761216792758e-08" bx="-0.03479021415114403" by="-0.11043623834848404" bz="-0.9932741522789001" />
<vert id="10" uvx="0.9487317204475403" uvy="0.7852199673652649" tx="0.9537916779518127" ty="-0.30046841502189636" tz="-1.775475944043592e-08" bx="-0.03479021415114403" by="-0.11043622344732285" bz="-0.9932740330696106" />
<vert id="66" uvx="0.8192265033721924" uvy="0.19096899032592773" tx="0.9537919163703918" ty="-0.30046817660331726" tz="-1.6925153545344074e-07" bx="0.03479006513953209" by="0.11043648421764374" bz="-0.9932741522789001" />
<vert id="6" uvx="0.9088284373283386" uvy="0.11188479512929916" tx="0.9537918567657471" ty="-0.3004681468009949" tz="-1.6925152124258602e-07" bx="0.03479006141424179" by="0.11043647676706314" bz="-0.9932740926742554" />
<vert id="11" uvx="0.9487317204475403" uvy="0.2147800624370575" tx="0.9537919163703918" ty="-0.3004681468009949" tz="-1.6925153545344074e-07" bx="0.03479006141424179" by="0.11043648421764374" bz="-0.9932741522789001" />
<vert id="71" uvx="0.16449347138404846" uvy="0.1493336707353592" tx="0.9902617931365967" ty="0.139217808842659" tz="-8.350427904701974e-09" bx="-0.03900798037648201" by="0.27746525406837463" bz="-0.9599434733390808" />
<vert id="19" uvx="0.08654259890317917" uvy="0.059594687074422836" tx="0.9902617931365967" ty="0.1392177939414978" tz="-8.350427016523554e-09" bx="-0.03900797665119171" by="0.27746525406837463" bz="-0.9599434733390808" />
<vert id="12" uvx="0.1581219732761383" uvy="0.025440247729420662" tx="0.9902618527412415" ty="0.139217808842659" tz="-8.350427904701974e-09" bx="-0.03900798037648201" by="0.27746525406837463" bz="-0.9599435329437256" />
<vert id="73" uvx="0.34738975763320923" uvy="0.10499565303325653" tx="0.9999584555625916" ty="0.009113498963415623" tz="6.493486637282331e-08" bx="-0.003152622375637293" by="0.34592118859291077" bz="-0.938258171081543" />
<vert id="17" uvx="0.3162439465522766" uvy="0.003910049330443144" tx="0.9999585151672363" ty="0.009113498963415623" tz="6.493486637282331e-08" bx="-0.003152622375637293" by="0.34592118859291077" bz="-0.9382582306861877" />
<vert id="8" uvx="0.47436589002609253" uvy="3.486812616415591e-09" tx="0.9999584555625916" ty="0.009113498963415623" tz="6.493486637282331e-08" bx="-0.003152622375637293" by="0.34592118859291077" bz="-0.938258171081543" />
<vert id="74" uvx="0.22148749232292175" uvy="0.8778612613677979" tx="0.9988270998001099" ty="0.04841911047697067" tz="-2.5460258257226087e-07" bx="0.016228320077061653" by="-0.3347753882408142" bz="-0.9421582221984863" />
<vert id="77" uvx="0.34738975763320923" uvy="0.8950043320655823" tx="0.9988270998001099" ty="0.04841911047697067" tz="-2.5460258257226087e-07" bx="0.016228320077061653" by="-0.3347753882408142" bz="-0.9421582221984863" />
<vert id="16" uvx="0.3162439167499542" uvy="0.9960899353027344" tx="0.9988271594047546" ty="0.04841911420226097" tz="-2.546026109939703e-07" bx="0.016228321939706802" by="-0.3347754180431366" bz="-0.9421582818031311" />
<vert id="68" uvx="0.22148744761943817" uvy="0.12213874608278275" tx="0.9988271594047546" ty="0.04841926693916321" tz="7.920648670278752e-08" bx="-0.016228558495640755" by="0.33477580547332764" bz="-0.9421581029891968" />
<vert id="12" uvx="0.1581219732761383" uvy="0.025440247729420662" tx="0.9988270998001099" ty="0.048419270664453506" tz="7.920648670278752e-08" bx="-0.016228558495640755" by="0.33477577567100525" bz="-0.942158043384552" />
<vert id="17" uvx="0.3162439465522766" uvy="0.003910049330443144" tx="0.9988270998001099" ty="0.04841926321387291" tz="7.920648670278752e-08" bx="-0.016228556632995605" by="0.33477577567100525" bz="-0.942158043384552" />
<vert id="81" uvx="0.16449342668056488" uvy="0.8506662845611572" tx="0.9732493162155151" ty="0.22975172102451324" tz="-5.231202067079721e-07" bx="0.04614058881998062" by="-0.19545799493789673" bz="-0.9796260595321655" />
<vert id="13" uvx="0.08654259890317917" uvy="0.9404052495956421" tx="0.9732493162155151" ty="0.22975172102451324" tz="-5.231202067079721e-07" bx="0.04614058881998062" by="-0.19545799493789673" bz="-0.9796260595321655" />
<vert id="14" uvx="0.039903316646814346" uvy="0.8881152272224426" tx="0.9732491970062256" ty="0.22975172102451324" tz="-5.231202067079721e-07" bx="0.04614058881998062" by="-0.19545796513557434" bz="-0.979625940322876" />
<vert id="77" uvx="0.34738975763320923" uvy="0.8950043320655823" tx="0.9999585151672363" ty="0.00911351665854454" tz="-1.5609110448622232e-08" bx="0.003152670571580529" by="-0.34592074155807495" bz="-0.9382584691047668" />
<vert id="60" uvx="0.4732920229434967" uvy="0.8981176614761353" tx="0.9999585151672363" ty="0.009113517589867115" tz="-1.5609110448622232e-08" bx="0.0031526710372418165" by="-0.34592074155807495" bz="-0.9382584691047668" />
<vert id="9" uvx="0.47436586022377014" uvy="1.0" tx="0.9999585151672363" ty="0.00911351665854454" tz="-1.5609108672265393e-08" bx="0.003152670571580529" by="-0.34592074155807495" bz="-0.9382584691047668" />
<vert id="81" uvx="0.16449342668056488" uvy="0.8506662845611572" tx="0.9902617335319519" ty="0.13921773433685303" tz="6.580931994903949e-07" bx="0.039008624851703644" by="-0.27746549248695374" bz="-0.9599432945251465" />
<vert id="74" uvx="0.22148749232292175" uvy="0.8778612613677979" tx="0.9902617335319519" ty="0.13921773433685303" tz="6.580932563338138e-07" bx="0.039008624851703644" by="-0.27746549248695374" bz="-0.9599432945251465" />
<vert id="15" uvx="0.1581219881772995" uvy="0.9745597243309021" tx="0.9902617931365967" ty="0.13921773433685303" tz="6.580932563338138e-07" bx="0.039008624851703644" by="-0.2774655222892761" bz="-0.9599433541297913" />
<vert id="85" uvx="0.09558513760566711" uvy="0.7271022200584412" tx="0.932133138179779" ty="0.3621158301830292" tz="-1.0242658987635878e-07" bx="-9.547522239472528e-08" by="-3.709029172682676e-08" bz="-1.0000001192092896" />
<vert id="20" uvx="5.371173728008216e-09" uvy="0.7852199673652649" tx="0.932133138179779" ty="0.3621158301830292" tz="-1.0242658277093142e-07" bx="-9.547521528929792e-08" by="-3.709029172682676e-08" bz="-1.0000001192092896" />
<vert id="21" uvx="4.843819212396738e-08" uvy="0.2147800475358963" tx="0.9321330785751343" ty="0.3621158301830292" tz="-1.0242658277093142e-07" bx="-9.547521528929792e-08" by="-3.709029172682676e-08" bz="-1.0" />
<vert id="71" uvx="0.16449347138404846" uvy="0.1493336707353592" tx="0.9732492566108704" ty="0.22975172102451324" tz="-1.914798559710107e-07" bx="-0.04614131525158882" by="0.19545800983905792" bz="-0.979625940322876" />
<vert id="87" uvx="0.1273575872182846" uvy="0.19096893072128296" tx="0.9732492566108704" ty="0.22975175082683563" tz="-1.914798559710107e-07" bx="-0.04614132270216942" by="0.19545800983905792" bz="-0.979625940322876" />
<vert id="18" uvx="0.03990337252616882" uvy="0.11188479512929916" tx="0.9732492566108704" ty="0.22975172102451324" tz="-1.914798559710107e-07" bx="-0.04614131525158882" by="0.19545800983905792" bz="-0.979625940322876" />
<vert id="78" uvx="0.1273575723171234" uvy="0.8090310096740723" tx="0.9537919163703918" ty="0.3004681169986725" tz="-3.9847151356298127e-07" bx="0.03478984162211418" by="-0.11043655127286911" bz="-0.9932741522789001" />
<vert id="14" uvx="0.039903316646814346" uvy="0.8881152272224426" tx="0.9537918567657471" ty="0.3004681169986725" tz="-3.984715419846907e-07" bx="0.03478984162211418" by="-0.11043654382228851" bz="-0.9932740926742554" />
<vert id="20" uvx="5.371173728008216e-09" uvy="0.7852199673652649" tx="0.9537919163703918" ty="0.3004681169986725" tz="-3.9847151356298127e-07" bx="0.03478984162211418" by="-0.11043655127286911" bz="-0.9932741522789001" />
<vert id="87" uvx="0.1273575872182846" uvy="0.19096893072128296" tx="0.9537917971611023" ty="0.30046844482421875" tz="-1.2870755483618268e-07" bx="-0.03479032218456268" by="0.11043620854616165" bz="-0.9932741522789001" />
<vert id="82" uvx="0.09558520466089249" uvy="0.27289777994155884" tx="0.9537917971611023" ty="0.30046841502189636" tz="-1.2870754062532797e-07" bx="-0.034790318459272385" by="0.11043620854616165" bz="-0.9932741522789001" />
<vert id="21" uvx="4.843819212396738e-08" uvy="0.2147800475358963" tx="0.9537916779518127" ty="0.30046841502189636" tz="-1.2870754062532797e-07" bx="-0.034790318459272385" by="0.11043619364500046" bz="-0.9932740330696106" />
<vert id="43" uvx="0.34957337379455566" uvy="0.3905581831932068" tx="0.9956754446029663" ty="0.09289997071027756" tz="-1.0734301225667764e-09" bx="-0.003346103709191084" by="0.035862576216459274" bz="-0.9993511438369751" />
<vert id="41" uvx="0.338321328163147" uvy="0.4195728898048401" tx="0.9956755042076111" ty="0.09289996325969696" tz="-1.0734301225667764e-09" bx="-0.0033461034763604403" by="0.035862576216459274" bz="-0.9993512034416199" />
<vert id="83" uvx="0.21363316476345062" uvy="0.34435462951660156" tx="0.9956754446029663" ty="0.09289996325969696" tz="-1.0734301225667764e-09" bx="-0.0033461034763604403" by="0.035862576216459274" bz="-0.9993511438369751" />
<vert id="86" uvx="0.2354084998369217" uvy="0.2882043719291687" tx="0.982434093952179" ty="0.18660980463027954" tz="-9.257103528170774e-08" bx="-0.013474984094500542" by="0.07094049453735352" bz="-0.9973896145820618" />
<vert id="83" uvx="0.21363316476345062" uvy="0.34435462951660156" tx="0.982434093952179" ty="0.18660978972911835" tz="-9.257102817628038e-08" bx="-0.013474983163177967" by="0.07094049453735352" bz="-0.997389554977417" />
<vert id="82" uvx="0.09558520466089249" uvy="0.27289777994155884" tx="0.982434093952179" ty="0.18660980463027954" tz="-9.257102817628038e-08" bx="-0.013474984094500542" by="0.07094049453735352" bz="-0.9973896145820618" />
<vert id="39" uvx="0.34957337379455566" uvy="0.6094418168067932" tx="0.9956755042076111" ty="0.0929000973701477" tz="2.273097692295778e-07" bx="0.0033463456202298403" by="-0.03586268797516823" bz="-0.9993513226509094" />
<vert id="79" uvx="0.2354084849357605" uvy="0.7117956280708313" tx="0.9956753849983215" ty="0.09290008991956711" tz="2.2730975501872308e-07" bx="0.0033463453873991966" by="-0.03586268424987793" bz="-0.9993512034416199" />
<vert id="84" uvx="0.21363310515880585" uvy="0.6556453704833984" tx="0.9956754446029663" ty="0.09290008991956711" tz="2.273097692295778e-07" bx="0.0033463453873991966" by="-0.03586268424987793" bz="-0.9993512630462646" />
<vert id="79" uvx="0.2354084849357605" uvy="0.7117956280708313" tx="0.982434093952179" ty="0.18660962581634521" tz="1.239343845327312e-07" bx="0.013475004583597183" by="-0.07094050198793411" bz="-0.9973894953727722" />
<vert id="78" uvx="0.1273575723171234" uvy="0.8090310096740723" tx="0.9824341535568237" ty="0.1866096556186676" tz="1.2393439874358592e-07" bx="0.013475006446242332" by="-0.07094050943851471" bz="-0.997389554977417" />
<vert id="85" uvx="0.09558513760566711" uvy="0.7271022200584412" tx="0.9824341535568237" ty="0.1866096407175064" tz="1.239343845327312e-07" bx="0.013475005514919758" by="-0.07094050943851471" bz="-0.997389554977417" />
<vert id="35" uvx="0.36272484064102173" uvy="0.3758132755756378" tx="0.9975646734237671" ty="0.06974716484546661" tz="2.482067706921498e-08" bx="-0.004332354292273521" by="0.061964213848114014" bz="-0.9980689287185669" />
<vert id="43" uvx="0.34957337379455566" uvy="0.3905581831932068" tx="0.9975647330284119" ty="0.06974716484546661" tz="2.482068062192866e-08" bx="-0.004332354292273521" by="0.06196421757340431" bz="-0.9980689883232117" />
<vert id="86" uvx="0.2354084998369217" uvy="0.2882043719291687" tx="0.9975647330284119" ty="0.06974716484546661" tz="2.482067884557182e-08" bx="-0.004332354292273521" by="0.06196421757340431" bz="-0.9980689883232117" />
<vert id="70" uvx="0.2608596682548523" uvy="0.2596695125102997" tx="0.9900213479995728" ty="0.14091745018959045" tz="-1.3063676362889964e-07" bx="-0.017580697312951088" by="0.12351299822330475" bz="-0.9921871423721313" />
<vert id="86" uvx="0.2354084998369217" uvy="0.2882043719291687" tx="0.9900214076042175" ty="0.14091746509075165" tz="-1.3063677783975436e-07" bx="-0.017580699175596237" by="0.12351300567388535" bz="-0.9921872615814209" />
<vert id="87" uvx="0.1273575872182846" uvy="0.19096893072128296" tx="0.9900213479995728" ty="0.14091745018959045" tz="-1.3063677783975436e-07" bx="-0.017580697312951088" by="0.12351299822330475" bz="-0.9921871423721313" />
<vert id="41" uvx="0.338321328163147" uvy="0.4195728898048401" tx="0.9934456944465637" ty="0.1143052875995636" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0000001192092896" />
<vert id="42" uvx="0.338321328163147" uvy="0.5804271101951599" tx="0.993445634841919" ty="0.1143052726984024" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0" />
<vert id="84" uvx="0.21363310515880585" uvy="0.6556453704833984" tx="0.9934457540512085" ty="0.1143052950501442" tz="-0.0" bx="0.0" by="-0.0" bz="-1.0000001192092896" />
<vert id="84" uvx="0.21363310515880585" uvy="0.6556453704833984" tx="0.9736462235450745" ty="0.22806371748447418" tz="-3.642821511107286e-08" bx="-3.9974047183477524e-08" by="1.0928363103346328e-08" bz="-1.0" />
<vert id="85" uvx="0.09558513760566711" uvy="0.7271022200584412" tx="0.9736462235450745" ty="0.22806374728679657" tz="-3.642821866378654e-08" bx="-3.99740507361912e-08" by="1.0928362215167908e-08" bz="-1.0" />
<vert id="82" uvx="0.09558520466089249" uvy="0.27289777994155884" tx="0.9736462235450745" ty="0.22806376218795776" tz="-3.642821866378654e-08" bx="-3.99740507361912e-08" by="1.0928362215167908e-08" bz="-1.0" />
<vert id="40" uvx="0.36272484064102173" uvy="0.6241867542266846" tx="0.9991342425346375" ty="0.04160245507955551" tz="-1.926091727000312e-06" bx="0.003613115753978491" by="-0.08681955188512802" bz="-0.9962174892425537" />
<vert id="37" uvx="0.38290899991989136" uvy="0.6338176727294922" tx="0.9991341829299927" ty="0.04160245507955551" tz="-1.9260919543739874e-06" bx="0.003613115753978491" by="-0.08681954443454742" bz="-0.9962174296379089" />
<vert id="75" uvx="0.2999207377433777" uvy="0.7589686512947083" tx="0.9991342425346375" ty="0.04160245507955551" tz="-1.9260919543739874e-06" bx="0.003613115753978491" by="-0.08681955188512802" bz="-0.9962174892425537" />
<vert id="80" uvx="0.2608596682548523" uvy="0.7403304576873779" tx="0.996426522731781" ty="0.08446469902992249" tz="4.291636059861048e-07" bx="0.014729090966284275" by="-0.17375347018241882" bz="-0.984679102897644" />
<vert id="75" uvx="0.2999207377433777" uvy="0.7589686512947083" tx="0.9964264035224915" ty="0.08446469902992249" tz="4.2916354914268595e-07" bx="0.014729090966284275" by="-0.17375345528125763" bz="-0.9846790432929993" />
<vert id="74" uvx="0.22148749232292175" uvy="0.8778612613677979" tx="0.996426522731781" ty="0.08446469902992249" tz="4.2916354914268595e-07" bx="0.014729090966284275" by="-0.17375347018241882" bz="-0.984679102897644" />
<vert id="38" uvx="0.42749667167663574" uvy="0.6398888230323792" tx="0.9999964237213135" ty="0.0026991432532668114" tz="-7.752806396865708e-08" bx="0.00029294018168002367" by="-0.10855896770954132" bz="-0.9940899610519409" />
<vert id="30" uvx="0.4720843434333801" uvy="0.6409913897514343" tx="0.9999963045120239" ty="0.0026991430204361677" tz="-7.752804975780236e-08" bx="0.0002929401525761932" by="-0.10855895280838013" bz="-0.9940898418426514" />
<vert id="61" uvx="0.472495973110199" uvy="0.7728514671325684" tx="0.9999964237213135" ty="0.0026991432532668114" tz="-7.752806396865708e-08" bx="0.00029294018168002367" by="-0.10855896770954132" bz="-0.9940899610519409" />
<vert id="76" uvx="0.38620835542678833" uvy="0.7707177400588989" tx="0.999984860420227" ty="0.005495124496519566" tz="1.5639099615327723e-07" bx="0.0011926882434636354" by="-0.21701376140117645" bz="-0.9761677980422974" />
<vert id="61" uvx="0.472495973110199" uvy="0.7728514671325684" tx="0.999984860420227" ty="0.005495124962180853" tz="1.5639101036413194e-07" bx="0.0011926883598789573" by="-0.21701376140117645" bz="-0.9761677980422974" />
<vert id="60" uvx="0.4732920229434967" uvy="0.8981176614761353" tx="0.999984860420227" ty="0.005495124962180853" tz="1.5639101036413194e-07" bx="0.0011926883598789573" by="-0.21701376140117645" bz="-0.9761677980422974" />
<vert id="40" uvx="0.36272484064102173" uvy="0.6241867542266846" tx="0.9975646734237671" ty="0.06974753737449646" tz="-5.213773874856997e-07" bx="0.00433187372982502" by="-0.061964116990566254" bz="-0.9980689883232117" />
<vert id="80" uvx="0.2608596682548523" uvy="0.7403304576873779" tx="0.9975646734237671" ty="0.06974754482507706" tz="-5.213773306422809e-07" bx="0.004331874195486307" by="-0.061964116990566254" bz="-0.9980689883232117" />
<vert id="79" uvx="0.2354084849357605" uvy="0.7117956280708313" tx="0.9975646138191223" ty="0.06974753737449646" tz="-5.213773306422809e-07" bx="0.00433187372982502" by="-0.061964113265275955" bz="-0.9980689287185669" />
<vert id="80" uvx="0.2608596682548523" uvy="0.7403304576873779" tx="0.9900213479995728" ty="0.14091740548610687" tz="3.236664838368597e-07" bx="0.017580848187208176" by="-0.12351273000240326" bz="-0.9921872019767761" />
<vert id="81" uvx="0.16449342668056488" uvy="0.8506662845611572" tx="0.9900213479995728" ty="0.14091740548610687" tz="3.2366651225856913e-07" bx="0.017580848187208176" by="-0.12351273000240326" bz="-0.9921872019767761" />
<vert id="78" uvx="0.1273575723171234" uvy="0.8090310096740723" tx="0.9900214076042175" ty="0.14091742038726807" tz="3.2366651225856913e-07" bx="0.017580850049853325" by="-0.12351273745298386" bz="-0.9921872615814209" />
<vert id="34" uvx="0.38290897011756897" uvy="0.3661822974681854" tx="0.9998969435691833" ty="0.014356018044054508" tz="1.6626459853341657e-07" bx="-0.0015057085547596216" by="0.10488414019346237" bz="-0.9944833517074585" />
<vert id="69" uvx="0.2999207377433777" uvy="0.24103134870529175" tx="0.9998970031738281" ty="0.014356018975377083" tz="1.662646127442713e-07" bx="-0.0015057085547596216" by="0.10488414764404297" bz="-0.9944834113121033" />
<vert id="72" uvx="0.38620835542678833" uvy="0.22928225994110107" tx="0.9998969435691833" ty="0.014356018975377083" tz="1.662646127442713e-07" bx="-0.0015057085547596216" by="0.10488414019346237" bz="-0.9944833517074585" />
<vert id="69" uvx="0.2999207377433777" uvy="0.24103134870529175" tx="0.9995730519294739" ty="0.029216455295681953" tz="6.338545688322483e-08" bx="-0.006131837144494057" by="0.20978866517543793" bz="-0.9777275323867798" />
<vert id="68" uvx="0.22148744761943817" uvy="0.12213874608278275" tx="0.9995730519294739" ty="0.029216453433036804" tz="6.338545688322483e-08" bx="-0.006131836678832769" by="0.20978866517543793" bz="-0.9777275323867798" />
<vert id="73" uvx="0.34738975763320923" uvy="0.10499565303325653" tx="0.9995731115341187" ty="0.029216455295681953" tz="6.338546398865219e-08" bx="-0.006131837144494057" by="0.20978866517543793" bz="-0.9777275919914246" />
<vert id="37" uvx="0.38290899991989136" uvy="0.6338176727294922" tx="0.9998970031738281" ty="0.014355862513184547" tz="2.815750690388086e-07" bx="0.0015061369631439447" by="-0.10488410294055939" bz="-0.9944833517074585" />
<vert id="38" uvx="0.42749667167663574" uvy="0.6398888230323792" tx="0.9998968839645386" ty="0.014355860650539398" tz="2.815750121953897e-07" bx="0.001506136730313301" by="-0.1048840880393982" bz="-0.994483232498169" />
<vert id="76" uvx="0.38620835542678833" uvy="0.7707177400588989" tx="0.9998968839645386" ty="0.014355860650539398" tz="2.815750121953897e-07" bx="0.001506136730313301" by="-0.1048840880393982" bz="-0.994483232498169" />
<vert id="75" uvx="0.2999207377433777" uvy="0.7589686512947083" tx="0.9995731115341187" ty="0.029216444119811058" tz="-1.181668025651561e-07" bx="0.006131777539849281" by="-0.20978854596614838" bz="-0.9777275323867798" />
<vert id="76" uvx="0.38620835542678833" uvy="0.7707177400588989" tx="0.9995731115341187" ty="0.029216444119811058" tz="-1.181668025651561e-07" bx="0.006131777539849281" by="-0.20978854596614838" bz="-0.9777275323867798" />
<vert id="77" uvx="0.34738975763320923" uvy="0.8950043320655823" tx="0.9995731115341187" ty="0.02921644225716591" tz="-1.1816679545972875e-07" bx="0.006131777074187994" by="-0.20978854596614838" bz="-0.9777275323867798" />
<vert id="36" uvx="0.42749667167663574" uvy="0.36011117696762085" tx="0.9999963045120239" ty="0.0026993504725396633" tz="8.088298364405944e-10" bx="-0.00029303881456144154" by="0.10855890810489655" bz="-0.9940899014472961" />
<vert id="72" uvx="0.38620835542678833" uvy="0.22928225994110107" tx="0.9999963641166687" ty="0.002699350705370307" tz="8.088298364405944e-10" bx="-0.000293038843665272" by="0.10855891555547714" bz="-0.9940899610519409" />
<vert id="50" uvx="0.472495973110199" uvy="0.22714851796627045" tx="0.9999964237213135" ty="0.002699350705370307" tz="8.088298919517456e-10" bx="-0.000293038843665272" by="0.10855892300605774" bz="-0.9940900206565857" />
<vert id="72" uvx="0.38620835542678833" uvy="0.22928225994110107" tx="0.999984860420227" ty="0.005495262797921896" tz="2.0107421505599632e-07" bx="-0.0011923700803890824" by="0.217013880610466" bz="-0.9761677384376526" />
<vert id="73" uvx="0.34738975763320923" uvy="0.10499565303325653" tx="0.999984860420227" ty="0.005495263263583183" tz="2.0107421505599632e-07" bx="-0.0011923701968044043" by="0.217013880610466" bz="-0.9761677384376526" />
<vert id="51" uvx="0.4732920527458191" uvy="0.10188230127096176" tx="0.999984860420227" ty="0.005495263263583183" tz="2.0107422926685103e-07" bx="-0.0011923701968044043" by="0.217013880610466" bz="-0.9761677384376526" />
<vert id="35" uvx="0.36272484064102173" uvy="0.3758132755756378" tx="0.9991341829299927" ty="0.04160264879465103" tz="1.5562262944968097e-07" bx="-0.00361489225178957" by="0.08681941032409668" bz="-0.9962174892425537" />
<vert id="70" uvx="0.2608596682548523" uvy="0.2596695125102997" tx="0.9991342425346375" ty="0.04160264879465103" tz="1.5562264366053569e-07" bx="-0.00361489225178957" by="0.08681941777467728" bz="-0.9962175488471985" />
<vert id="69" uvx="0.2999207377433777" uvy="0.24103134870529175" tx="0.9991341233253479" ty="0.041602641344070435" tz="1.5562262944968097e-07" bx="-0.003614891553297639" by="0.08681940287351608" bz="-0.9962174296379089" />
<vert id="70" uvx="0.2608596682548523" uvy="0.2596695125102997" tx="0.9964264631271362" ty="0.08446479588747025" tz="2.2086542372790063e-08" bx="-0.01472868025302887" by="0.17375367879867554" bz="-0.9846790432929993" />
<vert id="71" uvx="0.16449347138404846" uvy="0.1493336707353592" tx="0.9964264035224915" ty="0.08446480333805084" tz="2.2086540596433224e-08" bx="-0.014728682115674019" by="0.17375366389751434" bz="-0.9846789836883545" />
<vert id="68" uvx="0.22148744761943817" uvy="0.12213874608278275" tx="0.996426522731781" ty="0.08446481078863144" tz="2.2086544149146903e-08" bx="-0.014728683046996593" by="0.17375367879867554" bz="-0.984679102897644" />
<vert id="33" uvx="0.5945953130722046" uvy="0.3905581831932068" tx="0.9956754446029663" ty="-0.09290005266666412" tz="5.427807892033343e-08" bx="0.003346164943650365" by="0.03586263209581375" bz="-0.9993511438369751" />
<vert id="67" uvx="0.7095834612846375" uvy="0.2882044017314911" tx="0.9956753849983215" ty="-0.09290004521608353" tz="5.427807536761975e-08" bx="0.0033461647108197212" by="0.03586262837052345" bz="-0.9993510842323303" />
<vert id="64" uvx="0.7313588261604309" uvy="0.34435462951660156" tx="0.9956754446029663" ty="-0.09290006011724472" tz="5.427807892033343e-08" bx="0.003346165409311652" by="0.03586263209581375" bz="-0.9993511438369751" />
<vert id="67" uvx="0.7095834612846375" uvy="0.2882044017314911" tx="0.982434093952179" ty="-0.18660962581634521" tz="1.6632179722364526e-07" bx="0.013475046493113041" by="0.07094049453735352" bz="-0.9973894953727722" />
<vert id="66" uvx="0.8192265033721924" uvy="0.19096899032592773" tx="0.9824341535568237" ty="-0.1866096556186676" tz="1.663218256453547e-07" bx="0.01347504835575819" by="0.07094050198793411" bz="-0.997389554977417" />
<vert id="65" uvx="0.8509989380836487" uvy="0.2728978097438812" tx="0.982434093952179" ty="-0.1866096407175064" tz="1.6632181143449998e-07" bx="0.013475047424435616" by="0.07094049453735352" bz="-0.997389554977417" />
<vert id="28" uvx="0.5945953130722046" uvy="0.6094418168067932" tx="0.9956754446029663" ty="-0.09289997071027756" tz="-5.367150612833882e-10" bx="-0.003346103010699153" by="-0.035862576216459274" bz="-0.9993511438369751" />
<vert id="32" uvx="0.6058473587036133" uvy="0.5804271101951599" tx="0.9956755042076111" ty="-0.09289996325969696" tz="-5.367150612833882e-10" bx="-0.0033461027778685093" by="-0.035862576216459274" bz="-0.9993512034416199" />
<vert id="63" uvx="0.7313588261604309" uvy="0.6556453704833984" tx="0.9956754446029663" ty="-0.09289996325969696" tz="-5.367150612833882e-10" bx="-0.0033461027778685093" by="-0.035862576216459274" bz="-0.9993511438369751" />
<vert id="58" uvx="0.7095834612846375" uvy="0.7117956280708313" tx="0.9824341535568237" ty="-0.18660978972911835" tz="-9.149502488980943e-08" bx="-0.013474982231855392" by="-0.07094050198793411" bz="-0.9973896741867065" />
<vert id="63" uvx="0.7313588261604309" uvy="0.6556453704833984" tx="0.9824340343475342" ty="-0.18660978972911835" tz="-9.149501778438207e-08" bx="-0.013474982231855392" by="-0.07094049453735352" bz="-0.997389554977417" />
<vert id="62" uvx="0.8509988784790039" uvy="0.7271022200584412" tx="0.9824340343475342" ty="-0.18660977482795715" tz="-9.149501778438207e-08" bx="-0.013474981300532818" by="-0.07094049453735352" bz="-0.9973894953727722" />
<vert id="23" uvx="0.5814438462257385" uvy="0.3758132755756378" tx="0.9975647330284119" ty="-0.06974759697914124" tz="-1.8027145642918185e-07" bx="0.004332218784838915" by="0.061964116990566254" bz="-0.9980690479278564" />
<vert id="45" uvx="0.6841322779655457" uvy="0.25966954231262207" tx="0.9975646138191223" ty="-0.06974759697914124" tz="-1.8027145642918185e-07" bx="0.004332218784838915" by="0.06196410953998566" bz="-0.9980689287185669" />
<vert id="67" uvx="0.7095834612846375" uvy="0.2882044017314911" tx="0.9975646138191223" ty="-0.06974758952856064" tz="-1.802714137966177e-07" bx="0.0043322183191776276" by="0.06196410953998566" bz="-0.9980689287185669" />
<vert id="45" uvx="0.6841322779655457" uvy="0.25966954231262207" tx="0.9900213479995728" ty="-0.14091739058494568" tz="2.027515080271769e-07" bx="0.017580727115273476" by="0.12351274490356445" bz="-0.9921872019767761" />
<vert id="44" uvx="0.7820906639099121" uvy="0.14933373034000397" tx="0.9900213479995728" ty="-0.14091739058494568" tz="2.027515080271769e-07" bx="0.017580727115273476" by="0.12351274490356445" bz="-0.9921872019767761" />
<vert id="66" uvx="0.8192265033721924" uvy="0.19096899032592773" tx="0.9900214076042175" ty="-0.14091739058494568" tz="2.027515222380316e-07" bx="0.017580727115273476" by="0.12351275235414505" bz="-0.9921872615814209" />
<vert id="32" uvx="0.6058473587036133" uvy="0.5804271101951599" tx="0.9934456944465637" ty="-0.1143052875995636" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0000001192092896" />
<vert id="31" uvx="0.6058473587036133" uvy="0.4195728898048401" tx="0.993445634841919" ty="-0.1143052726984024" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="64" uvx="0.7313588261604309" uvy="0.34435462951660156" tx="0.9934457540512085" ty="-0.1143052950501442" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0000001192092896" />
<vert id="63" uvx="0.7313588261604309" uvy="0.6556453704833984" tx="0.9736461043357849" ty="-0.22806374728679657" tz="2.1260967741909553e-07" bx="2.0700659320027626e-07" by="-4.848855539307806e-08" bz="-0.9999998807907104" />
<vert id="64" uvx="0.7313588261604309" uvy="0.34435462951660156" tx="0.9736461639404297" ty="-0.22806373238563538" tz="2.1260966320824082e-07" bx="2.0700657898942154e-07" by="-4.848855184036438e-08" bz="-0.9999998807907104" />
<vert id="65" uvx="0.8509989380836487" uvy="0.2728978097438812" tx="0.9736462235450745" ty="-0.22806374728679657" tz="2.1260967741909553e-07" bx="2.0700659320027626e-07" by="-4.848855539307806e-08" bz="-1.0" />
<vert id="29" uvx="0.5814438462257385" uvy="0.6241867542266846" tx="0.9991343021392822" ty="-0.041602641344070435" tz="3.080081114603672e-07" bx="-0.0036147397477179766" by="-0.08681943267583847" bz="-0.9962176084518433" />
<vert id="57" uvx="0.6841322779655457" uvy="0.7403305172920227" tx="0.9991341829299927" ty="-0.041602637618780136" tz="3.080080830386578e-07" bx="-0.003614739514887333" by="-0.08681941777467728" bz="-0.9962174892425537" />
<vert id="54" uvx="0.6450712084770203" uvy="0.758968710899353" tx="0.9991341829299927" ty="-0.04160263389348984" tz="3.0800805461694836e-07" bx="-0.0036147392820566893" by="-0.08681941777467728" bz="-0.9962174892425537" />
<vert id="57" uvx="0.6841322779655457" uvy="0.7403305172920227" tx="0.9964264631271362" ty="-0.08446486294269562" tz="-9.187787242126433e-08" bx="-0.014728804118931293" by="-0.17375366389751434" bz="-0.9846790432929993" />
<vert id="56" uvx="0.7820906043052673" uvy="0.850666344165802" tx="0.9964264035224915" ty="-0.08446486294269562" tz="-9.187788663211904e-08" bx="-0.014728804118931293" by="-0.17375364899635315" bz="-0.9846789836883545" />
<vert id="55" uvx="0.725096583366394" uvy="0.8778613209724426" tx="0.996426522731781" ty="-0.08446486294269562" tz="-9.187787952669169e-08" bx="-0.014728804118931293" by="-0.17375366389751434" bz="-0.984679102897644" />
<vert id="27" uvx="0.5166720151901245" uvy="0.6398888230323792" tx="0.9999963045120239" ty="-0.0026993565261363983" tz="-1.736848815880876e-07" bx="-0.0002932129136752337" by="-0.10855890810489655" bz="-0.9940899014472961" />
<vert id="53" uvx="0.5587835907936096" uvy="0.7707177400588989" tx="0.9999964237213135" ty="-0.002699356758967042" tz="-1.7368491000979702e-07" bx="-0.0002932129427790642" by="-0.10855892300605774" bz="-0.9940900206565857" />
<vert id="61" uvx="0.472495973110199" uvy="0.7728514671325684" tx="0.9999963045120239" ty="-0.0026993562933057547" tz="-1.736848815880876e-07" bx="-0.0002932129136752337" by="-0.10855890810489655" bz="-0.9940899014472961" />
<vert id="53" uvx="0.5587835907936096" uvy="0.7707177400588989" tx="0.9999849796295166" ty="-0.005495148710906506" tz="4.602128171882214e-07" bx="-0.0011920917313545942" by="-0.21701379120349884" bz="-0.9761679172515869" />
<vert id="52" uvx="0.599194347858429" uvy="0.895004391670227" tx="0.999984860420227" ty="-0.005495148245245218" tz="4.6021278876651195e-07" bx="-0.0011920916149392724" by="-0.21701377630233765" bz="-0.9761677980422974" />
<vert id="60" uvx="0.4732920229434967" uvy="0.8981176614761353" tx="0.999984860420227" ty="-0.005495147779583931" tz="4.6021278876651195e-07" bx="-0.0011920914985239506" by="-0.21701377630233765" bz="-0.9761677980422974" />
<vert id="29" uvx="0.5814438462257385" uvy="0.6241867542266846" tx="0.9975646734237671" ty="-0.06974722445011139" tz="-9.29712143715733e-07" bx="-0.004333308432251215" by="-0.06196415051817894" bz="-0.9980689287185669" />
<vert id="28" uvx="0.5945953130722046" uvy="0.6094418168067932" tx="0.9975647330284119" ty="-0.06974722445011139" tz="-9.297122005591518e-07" bx="-0.004333308432251215" by="-0.06196415424346924" bz="-0.9980689883232117" />
<vert id="58" uvx="0.7095834612846375" uvy="0.7117956280708313" tx="0.9975647330284119" ty="-0.06974722445011139" tz="-9.29712143715733e-07" bx="-0.004333308432251215" by="-0.06196415424346924" bz="-0.9980689883232117" />
<vert id="57" uvx="0.6841322779655457" uvy="0.7403305172920227" tx="0.9900214076042175" ty="-0.14091750979423523" tz="-6.232707505660073e-07" bx="-0.017581189051270485" by="-0.12351293116807938" bz="-0.9921872615814209" />
<vert id="58" uvx="0.7095834612846375" uvy="0.7117956280708313" tx="0.9900213479995728" ty="-0.14091752469539642" tz="-6.232708074094262e-07" bx="-0.017581190913915634" by="-0.12351292371749878" bz="-0.9921872019767761" />
<vert id="59" uvx="0.8192265033721924" uvy="0.809031069278717" tx="0.9900214076042175" ty="-0.14091752469539642" tz="-6.232708074094262e-07" bx="-0.017581190913915634" by="-0.12351293116807938" bz="-0.9921872615814209" />
<vert id="22" uvx="0.5612596869468689" uvy="0.3661823272705078" tx="0.9998969435691833" ty="-0.014355868101119995" tz="3.023114913958125e-07" bx="0.0015061588492244482" by="0.10488414764404297" bz="-0.9944834113121033" />
<vert id="25" uvx="0.5166720151901245" uvy="0.36011117696762085" tx="0.9998968839645386" ty="-0.01435586716979742" tz="3.023114913958125e-07" bx="0.0015061587328091264" by="0.10488414019346237" bz="-0.9944833517074585" />
<vert id="49" uvx="0.5587835907936096" uvy="0.22928227484226227" tx="0.9998968839645386" ty="-0.014355868101119995" tz="3.023114913958125e-07" bx="0.0015061588492244482" by="0.10488414019346237" bz="-0.9944833517074585" />
<vert id="46" uvx="0.6450712084770203" uvy="0.24103134870529175" tx="0.9995731711387634" ty="-0.029216377064585686" tz="6.732359736361104e-08" bx="0.00613194378092885" by="0.20978853106498718" bz="-0.9777275323867798" />
<vert id="49" uvx="0.5587835907936096" uvy="0.22928227484226227" tx="0.9995731115341187" ty="-0.029216375201940536" tz="6.732359025818369e-08" bx="0.006131943315267563" by="0.209788516163826" bz="-0.9777275323867798" />
<vert id="48" uvx="0.599194347858429" uvy="0.10499566793441772" tx="0.9995731115341187" ty="-0.029216373339295387" tz="6.732359025818369e-08" bx="0.0061319428496062756" by="0.209788516163826" bz="-0.9777275323867798" />
<vert id="26" uvx="0.5612596869468689" uvy="0.633817732334137" tx="0.9998969435691833" ty="-0.01435598824173212" tz="3.433729318658152e-07" bx="-0.0015055295079946518" by="-0.10488416999578476" bz="-0.9944833517074585" />
<vert id="54" uvx="0.6450712084770203" uvy="0.758968710899353" tx="0.9998969435691833" ty="-0.01435598824173212" tz="3.433729602875246e-07" bx="-0.0015055295079946518" by="-0.10488416999578476" bz="-0.9944833517074585" />
<vert id="53" uvx="0.5587835907936096" uvy="0.7707177400588989" tx="0.9998969435691833" ty="-0.01435598824173212" tz="3.433729318658152e-07" bx="-0.0015055295079946518" by="-0.10488416999578476" bz="-0.9944833517074585" />
<vert id="54" uvx="0.6450712084770203" uvy="0.758968710899353" tx="0.9995731115341187" ty="-0.029216382652521133" tz="5.595784458023445e-08" bx="-0.006131824105978012" by="-0.2097884863615036" bz="-0.9777275919914246" />
<vert id="55" uvx="0.725096583366394" uvy="0.8778613209724426" tx="0.9995730519294739" ty="-0.029216384515166283" tz="5.595783747480709e-08" bx="-0.006131824571639299" by="-0.2097884863615036" bz="-0.9777275323867798" />
<vert id="52" uvx="0.599194347858429" uvy="0.895004391670227" tx="0.9995731115341187" ty="-0.029216382652521133" tz="5.595784458023445e-08" bx="-0.006131824105978012" by="-0.2097884863615036" bz="-0.9777275919914246" />
<vert id="25" uvx="0.5166720151901245" uvy="0.36011117696762085" tx="0.9999963045120239" ty="-0.002699141390621662" tz="-7.211017560848632e-08" bx="0.00029294524574652314" by="0.10855890810489655" bz="-0.9940899610519409" />
<vert id="24" uvx="0.4720843434333801" uvy="0.3590086102485657" tx="0.9999963641166687" ty="-0.002699141623452306" tz="-7.211018271391367e-08" bx="0.0002929452748503536" by="0.10855891555547714" bz="-0.9940900206565857" />
<vert id="50" uvx="0.472495973110199" uvy="0.22714851796627045" tx="0.9999963641166687" ty="-0.002699141623452306" tz="-7.211018271391367e-08" bx="0.0002929452748503536" by="0.10855891555547714" bz="-0.9940900206565857" />
<vert id="49" uvx="0.5587835907936096" uvy="0.22928227484226227" tx="0.999984860420227" ty="-0.005495215300470591" tz="1.1510368125300374e-07" bx="0.0011926674051210284" by="0.21701370179653168" bz="-0.9761677980422974" />
<vert id="50" uvx="0.472495973110199" uvy="0.22714851796627045" tx="0.9999849200248718" ty="-0.005495215766131878" tz="1.1510368125300374e-07" bx="0.0011926675215363503" by="0.21701370179653168" bz="-0.9761678576469421" />
<vert id="51" uvx="0.4732920527458191" uvy="0.10188230127096176" tx="0.9999849200248718" ty="-0.005495215766131878" tz="1.1510367414757638e-07" bx="0.0011926675215363503" by="0.21701370179653168" bz="-0.9761678576469421" />
<vert id="23" uvx="0.5814438462257385" uvy="0.3758132755756378" tx="0.9991341233253479" ty="-0.04160253331065178" tz="-7.148775580390065e-07" bx="0.0036143327597528696" by="0.0868195965886116" bz="-0.9962174296379089" />
<vert id="22" uvx="0.5612596869468689" uvy="0.3661823272705078" tx="0.9991341829299927" ty="-0.04160253703594208" tz="-7.148776717258443e-07" bx="0.0036143329925835133" by="0.0868196040391922" bz="-0.9962174892425537" />
<vert id="46" uvx="0.6450712084770203" uvy="0.24103134870529175" tx="0.9991343021392822" ty="-0.04160253703594208" tz="-7.148777285692631e-07" bx="0.0036143329925835133" by="0.0868196189403534" bz="-0.9962176084518433" />
<vert id="45" uvx="0.6841322779655457" uvy="0.25966954231262207" tx="0.9964264035224915" ty="-0.08446487784385681" tz="-1.7348435221720138e-07" bx="0.014728519134223461" by="0.17375336587429047" bz="-0.9846790432929993" />
<vert id="46" uvx="0.6450712084770203" uvy="0.24103134870529175" tx="0.9964264035224915" ty="-0.08446487784385681" tz="-1.7348435221720138e-07" bx="0.014728519134223461" by="0.17375336587429047" bz="-0.9846790432929993" />
<vert id="47" uvx="0.7250966429710388" uvy="0.12213875353336334" tx="0.996426522731781" ty="-0.08446488529443741" tz="-1.734843806389108e-07" bx="0.01472852099686861" by="0.17375338077545166" bz="-0.984679102897644" />
</mesh>
</node>
</model>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

@@ -0,0 +1,162 @@
<model>
<node name="Cube" px="0.0" py="0.0" pz="-0.0" rw="1.0" rx="0.0" ry="0.0" rz="0.0" sx="1.0" sy="1.0" sz="1.0">
<mesh name="CubeCube" num_vertex_pos="24" num_faces="44" num_vertex_groups="0" num_shape_keys="0">
<vertdata px="4.68746280670166" py="6.313983917236328" pz="-12.84763240814209" nx="0.4789515733718872" ny="-0.7991589307785034" nz="0.3632499873638153" />
<vertdata px="6.157801628112793" py="-2.210783004760742" pz="-15.642046928405762" nx="0.5773528814315796" ny="0.5773285627365112" nz="0.5773693919181824" />
<vertdata px="6.157801628112793" py="2.5722033977508545" pz="14.073357582092285" nx="0.7357242703437805" ny="-0.5811285972595215" nz="-0.3478497862815857" />
<vertdata px="6.157801628112793" py="-0.6326644420623779" pz="14.073357582092285" nx="0.6583318114280701" ny="0.561680018901825" nz="-0.5011135339736938" />
<vertdata px="-4.68746280670166" py="6.313983917236328" pz="-12.84763240814209" nx="-0.4789579510688782" ny="-0.7991530299186707" nz="0.3632543981075287" />
<vertdata px="-6.157801628112793" py="-2.210783004760742" pz="-15.642046928405762" nx="-0.5773425102233887" ny="0.5773541331291199" nz="0.5773541331291199" />
<vertdata px="-6.157801628112793" py="2.5722033977508545" pz="14.073357582092285" nx="-0.7357242703437805" ny="-0.5811285972595215" nz="-0.3478497862815857" />
<vertdata px="-6.157801628112793" py="-0.6326644420623779" pz="14.073357582092285" nx="-0.6583318114280701" ny="0.561680018901825" nz="-0.5011135339736938" />
<vertdata px="0.0" py="-2.210783004760742" pz="-15.642046928405762" nx="0.0" ny="0.7070942521095276" nz="0.7071192860603333" />
<vertdata px="0.0" py="4.764591217041016" pz="17.375267028808594" nx="0.0" ny="-0.7656209468841553" nz="-0.6432918906211853" />
<vertdata px="0.0" py="0.9454541206359863" pz="17.375267028808594" nx="0.0" ny="0.45948535203933716" nz="-0.8881853818893433" />
<vertdata px="0.0" py="6.313983917236328" pz="-12.84763240814209" nx="0.0" ny="-0.8858751058578491" nz="0.46392372250556946" />
<vertdata px="-6.157801628112793" py="-2.210783004760742" pz="7.764064788818359" nx="-0.6806055903434753" ny="0.7271550893783569" nz="-0.08956265449523926" />
<vertdata px="4.68746280670166" py="6.313983917236328" pz="4.969648838043213" nx="0.4721997380256653" ny="-0.7960413694381714" nz="-0.37860986590385437" />
<vertdata px="-4.68746280670166" py="6.313983917236328" pz="4.969648838043213" nx="-0.4721934497356415" ny="-0.7960474491119385" nz="-0.3786052465438843" />
<vertdata px="6.157801628112793" py="-2.210783004760742" pz="7.764064788818359" nx="0.6805939078330994" ny="0.7271661162376404" nz="-0.08956210315227509" />
<vertdata px="0.0" py="-2.210783004760742" pz="7.764064788818359" nx="0.0" ny="0.9902214407920837" nz="-0.13950476050376892" />
<vertdata px="0.0" py="6.313983917236328" pz="4.969648838043213" nx="0.0" ny="-0.8698450922966003" nz="-0.49332502484321594" />
<vertdata px="-6.157801628112793" py="2.281262159347534" pz="7.764064788818359" nx="-0.8043156862258911" ny="-0.5519700646400452" nz="-0.22001208364963531" />
<vertdata px="-6.157801628112793" py="2.281262159347534" pz="-15.642046928405762" nx="-0.66242516040802" ny="-0.2828081548213959" nz="0.6936947107315063" />
<vertdata px="0.0" py="2.281262159347534" pz="-15.642046928405762" nx="0.0" ny="-0.298376202583313" nz="0.9544483423233032" />
<vertdata px="6.157801628112793" py="2.281262159347534" pz="-15.642046928405762" nx="0.662426233291626" ny="-0.2828121781349182" nz="0.6936920881271362" />
<vertdata px="6.157801628112793" py="2.281262159347534" pz="7.764064788818359" nx="0.8043178915977478" ny="-0.551967203617096" nz="-0.22001104056835175" />
<vertdata px="0.0" py="1.641518235206604" pz="7.764064788818359" nx="1.4830084937855759e-09" ny="-0.9212736487388611" nz="-0.38891491293907166" />
<vert id="23" uvx="0.43768277764320374" uvy="0.2342401146888733" tx="0.9847397208213806" ty="0.17306628823280334" tz="-0.018327003344893456" bx="0.0355265773832798" by="-0.3029925525188446" bz="-0.9523305296897888" />
<vert id="6" uvx="0.2917885184288025" uvy="0.0832657739520073" tx="0.9847396016120911" ty="0.17306628823280334" tz="-0.018327001482248306" bx="0.0355265773832798" by="-0.3029925227165222" bz="-0.9523304104804993" />
<vert id="9" uvx="0.43768277764320374" uvy="0.0" tx="0.9847397208213806" ty="0.17306630313396454" tz="-0.018327005207538605" bx="0.0355265811085701" by="-0.3029925525188446" bz="-0.9523305296897888" />
<vert id="10" uvx="0.6970616579055786" uvy="0.7822656035423279" tx="0.0" ty="-1.0" tz="-0.0" bx="0.8812959790229797" by="0.0" bz="0.4725646674633026" />
<vert id="6" uvx="0.6756657958030701" uvy="0.7040348052978516" tx="0.0" ty="-1.0" tz="-0.0" bx="0.8812959790229797" by="0.0" bz="0.4725646674633026" />
<vert id="7" uvx="0.7510870099067688" uvy="0.7040348052978516" tx="0.0" ty="-1.0" tz="-0.0" bx="0.8812959790229797" by="0.0" bz="0.4725646674633026" />
<vert id="18" uvx="0.682512640953064" uvy="0.554551362991333" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="-0.0" bz="1.0" />
<vert id="5" uvx="0.7882254719734192" uvy="-1.005843586199262e-08" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="-0.0" bz="1.0" />
<vert id="12" uvx="0.7882254719734192" uvy="0.554551362991333" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="-0.0" bz="1.0" />
<vert id="16" uvx="0.14589425921440125" uvy="0.23610679805278778" tx="-0.9970225691795349" ty="0.07630708068609238" tz="-0.011099583469331264" bx="-0.013223884627223015" by="-0.3110142946243286" bz="-0.9503132104873657" />
<vert id="3" uvx="0.0" uvy="0.082798071205616" tx="-0.9970225691795349" ty="0.07630708813667297" tz="-0.011099583469331264" bx="-0.013223888352513313" by="-0.3110142946243286" bz="-0.9503132104873657" />
<vert id="10" uvx="0.14589425921440125" uvy="0.0" tx="-0.9970225691795349" ty="0.07630708813667297" tz="-0.011099583469331264" bx="-0.013223888352513313" by="-0.3110142946243286" bz="-0.9503132104873657" />
<vert id="22" uvx="0.8871611952781677" uvy="0.22771424055099487" tx="0.0" ty="-1.0" tz="-0.0" bx="1.3459697356665856e-07" by="0.0" bz="-1.0" />
<vert id="3" uvx="0.9557356834411621" uvy="0.07823076844215393" tx="0.0" ty="-1.0" tz="-0.0" bx="1.3459697356665856e-07" by="0.0" bz="-1.0" />
<vert id="15" uvx="0.992874026298523" uvy="0.22771424055099487" tx="0.0" ty="-1.0" tz="-0.0" bx="1.3459697356665856e-07" by="0.0" bz="-1.0" />
<vert id="20" uvx="0.3873341679573059" uvy="0.8541058301925659" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="1" uvx="0.49376237392425537" uvy="0.7082115411758423" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="8" uvx="0.493762344121933" uvy="0.8541058301925659" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="19" uvx="0.3873341679573059" uvy="1.0000001192092896" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="8" uvx="0.493762344121933" uvy="0.8541058301925659" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="5" uvx="0.493762344121933" uvy="1.0000001192092896" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="16" uvx="0.14589425921440125" uvy="0.23610679805278778" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="-0.24265079200267792" bz="-0.9701137542724609" />
<vert id="7" uvx="0.2917885184288025" uvy="0.082798071205616" tx="-0.9999999403953552" ty="0.0" tz="-0.0" bx="0.0" by="-0.24265077710151672" bz="-0.9701136946678162" />
<vert id="12" uvx="0.2917885184288025" uvy="0.23610679805278778" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="-0.24265079200267792" bz="-0.9701137542724609" />
<vert id="2" uvx="0.8803144097328186" uvy="0.07823076844215393" tx="-3.3821759615193514e-08" ty="-0.9999999403953552" tz="1.8135756008064163e-08" bx="0.881295919418335" by="-3.837729778410903e-08" bz="-0.4725646674633026" />
<vert id="10" uvx="0.9017102718353271" uvy="-1.4905723322300446e-09" tx="-8.90868534497713e-08" ty="-0.9999999403953552" tz="4.7769763256155784e-08" bx="0.881295919418335" by="-1.0108619363791149e-07" bz="-0.4725646674633026" />
<vert id="3" uvx="0.9557356834411621" uvy="0.07823076844215393" tx="0.0" ty="-1.0" tz="-0.0" bx="0.8812959790229797" by="0.0" bz="-0.472564697265625" />
<vert id="23" uvx="0.43768277764320374" uvy="0.2342401146888733" tx="0.9946390390396118" ty="0.10283250361680984" tz="-0.010889392346143723" bx="-0.006108131259679794" by="-0.04669655114412308" bz="-0.9988904595375061" />
<vert id="2" uvx="0.583577036857605" uvy="0.0832657739520073" tx="0.9946390390396118" ty="0.10283250361680984" tz="-0.010889393277466297" bx="-0.006108132191002369" by="-0.046696554869413376" bz="-0.9988904595375061" />
<vert id="22" uvx="0.583577036857605" uvy="0.2326439768075943" tx="0.9946390390396118" ty="0.10283251106739044" tz="-0.010889392346143723" bx="-0.006108131259679794" by="-0.04669655114412308" bz="-0.9988904595375061" />
<vert id="11" uvx="0.43768277764320374" uvy="0.7082115411758423" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="13" uvx="0.5487409234046936" uvy="0.2884212136268616" tx="0.9999999403953552" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-0.9999999403953552" />
<vert id="0" uvx="0.5487409234046936" uvy="0.7082115411758423" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="8" uvx="0.14589425921440125" uvy="0.7848830223083496" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="12" uvx="0.2917885184288025" uvy="0.23610679805278778" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="5" uvx="0.2917885184288025" uvy="0.7848830223083496" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="21" uvx="0.8871611952781677" uvy="0.7822656035423279" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="15" uvx="0.992874026298523" uvy="0.22771424055099487" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="1" uvx="0.992874026298523" uvy="0.7822656035423279" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="1" uvx="0.0" uvy="0.7848830223083496" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="16" uvx="0.14589425921440125" uvy="0.23610679805278778" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="8" uvx="0.14589425921440125" uvy="0.7848830223083496" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="7" uvx="0.7510870099067688" uvy="0.7040348052978516" tx="0.0" ty="-1.0" tz="-0.0" bx="1.3459697356665856e-07" by="0.0" bz="1.0" />
<vert id="18" uvx="0.682512640953064" uvy="0.554551362991333" tx="0.0" ty="-1.0" tz="-0.0" bx="1.3459697356665856e-07" by="0.0" bz="1.0" />
<vert id="12" uvx="0.7882254719734192" uvy="0.554551362991333" tx="0.0" ty="-1.0" tz="-0.0" bx="1.3459697356665856e-07" by="0.0" bz="1.0" />
<vert id="4" uvx="0.32662466168403625" uvy="0.7082115411758423" tx="0.9999999403953552" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-0.9999999403953552" />
<vert id="17" uvx="0.43768277764320374" uvy="0.2884212136268616" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="11" uvx="0.43768277764320374" uvy="0.7082115411758423" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="4" uvx="0.583577036857605" uvy="0.06620688736438751" tx="-0.3425443470478058" ty="-0.9395017027854919" tz="-5.263146931611118e-07" bx="-1.8028610782039323e-07" by="-4.94473511025717e-07" bz="0.9999999403953552" />
<vert id="18" uvx="0.682512640953064" uvy="0.554551362991333" tx="-0.3425443768501282" ty="-0.9395017027854919" tz="-5.263147500045307e-07" bx="-1.8028612203124794e-07" by="-4.944735678691359e-07" bz="0.9999999403953552" />
<vert id="14" uvx="0.5835769772529602" uvy="0.4883444011211395" tx="-0.3425443768501282" ty="-0.9395017027854919" tz="-5.263146931611118e-07" bx="-1.8028610782039323e-07" by="-4.94473511025717e-07" bz="0.9999999403953552" />
<vert id="0" uvx="0.29178857803344727" uvy="0.7430476546287537" tx="5.46949706858868e-07" ty="-0.8219507336616516" tz="-0.5695586204528809" bx="-1.0" by="-4.4956567535336944e-07" bz="-3.1151992629929737e-07" />
<vert id="20" uvx="0.3873341679573059" uvy="0.8541058301925659" tx="5.469494794851926e-07" ty="-0.8219507336616516" tz="-0.5695585608482361" bx="-1.0" by="-4.4956550482311286e-07" bz="-3.115197841907502e-07" />
<vert id="11" uvx="0.2917885482311249" uvy="0.8541057705879211" tx="5.469495363286114e-07" ty="-0.8219506740570068" tz="-0.5695586204528809" bx="-0.9999999403953552" by="-4.495655332448223e-07" bz="-3.1151981261245965e-07" />
<vert id="4" uvx="0.2917885482311249" uvy="0.9651639461517334" tx="2.914455592417653e-07" ty="-0.8219506144523621" tz="-0.5695587396621704" bx="-0.9999999403953552" by="-2.3955385586305056e-07" bz="-1.6599535967998236e-07" />
<vert id="20" uvx="0.3873341679573059" uvy="0.8541058301925659" tx="2.914455592417653e-07" ty="-0.8219506144523621" tz="-0.5695587396621704" bx="-0.9999999403953552" by="-2.3955385586305056e-07" bz="-1.6599535967998236e-07" />
<vert id="19" uvx="0.3873341679573059" uvy="1.0000001192092896" tx="2.914455592417653e-07" ty="-0.8219506144523621" tz="-0.5695587396621704" bx="-0.9999999403953552" by="-2.3955385586305056e-07" bz="-1.6599535967998236e-07" />
<vert id="13" uvx="0.7882255911827087" uvy="0.29392117261886597" tx="0.3425443470478058" ty="-0.9395017027854919" tz="5.263146931611118e-07" bx="1.8028610782039323e-07" by="-4.94473511025717e-07" bz="-0.9999999403953552" />
<vert id="21" uvx="0.8871611952781677" uvy="0.7822656035423279" tx="0.3425443768501282" ty="-0.9395016431808472" tz="5.263146363176929e-07" bx="1.802860936095385e-07" by="-4.944734541822982e-07" bz="-0.9999999403953552" />
<vert id="0" uvx="0.788225531578064" uvy="0.7160586714744568" tx="0.3425443768501282" ty="-0.9395017027854919" tz="5.263146931611118e-07" bx="1.8028610782039323e-07" by="-4.94473511025717e-07" bz="-0.9999999403953552" />
<vert id="13" uvx="0.5487409234046936" uvy="0.2884212136268616" tx="0.9923793077468872" ty="0.12253512442111969" tz="-0.01297579426318407" bx="-0.10893320292234421" by="0.8232192397117615" bz="-0.5571746826171875" />
<vert id="23" uvx="0.43768277764320374" uvy="0.2342401146888733" tx="0.992379367351532" ty="0.12253513932228088" tz="-0.01297579612582922" bx="-0.1089332178235054" by="0.8232192397117615" bz="-0.5571747422218323" />
<vert id="22" uvx="0.583577036857605" uvy="0.2326439768075943" tx="0.9923794269561768" ty="0.12253513187170029" tz="-0.012975795194506645" bx="-0.1089332103729248" by="0.8232192993164062" bz="-0.5571747422218323" />
<vert id="14" uvx="0.32662466168403625" uvy="0.2884212136268616" tx="1.0" ty="0.0" tz="-0.0" bx="-0.0" by="0.8582265377044678" bz="-0.513271152973175" />
<vert id="23" uvx="0.43768277764320374" uvy="0.2342401146888733" tx="1.0" ty="0.0" tz="-0.0" bx="-0.0" by="0.8582265377044678" bz="-0.513271152973175" />
<vert id="17" uvx="0.43768277764320374" uvy="0.2884212136268616" tx="1.0" ty="0.0" tz="-0.0" bx="-0.0" by="0.8582265377044678" bz="-0.513271152973175" />
<vert id="23" uvx="0.43768277764320374" uvy="0.2342401146888733" tx="0.9946390390396118" ty="-0.10283250361680984" tz="0.010889392346143723" bx="0.006108131259679794" by="-0.04669655114412308" bz="-0.9988904595375061" />
<vert id="18" uvx="0.2917885184288025" uvy="0.2326439768075943" tx="0.9946390390396118" ty="-0.10283251106739044" tz="0.010889392346143723" bx="0.006108131259679794" by="-0.04669655114412308" bz="-0.9988904595375061" />
<vert id="6" uvx="0.2917885184288025" uvy="0.0832657739520073" tx="0.9946390390396118" ty="-0.10283250361680984" tz="0.010889393277466297" bx="0.006108132191002369" by="-0.046696554869413376" bz="-0.9988904595375061" />
<vert id="10" uvx="0.6970616579055786" uvy="0.7822656035423279" tx="0.0" ty="-1.0" tz="-0.0" bx="0.8812959790229797" by="0.0" bz="0.472564697265625" />
<vert id="9" uvx="0.6071845889091492" uvy="0.7822656035423279" tx="0.0" ty="-1.0" tz="-0.0" bx="0.8812959790229797" by="0.0" bz="0.472564697265625" />
<vert id="6" uvx="0.6756657958030701" uvy="0.7040348052978516" tx="0.0" ty="-1.0" tz="-0.0" bx="0.8812959790229797" by="0.0" bz="0.472564697265625" />
<vert id="18" uvx="0.682512640953064" uvy="0.554551362991333" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="-0.0" bz="1.0" />
<vert id="19" uvx="0.682512640953064" uvy="-1.803953253443069e-08" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="-0.0" bz="1.0" />
<vert id="5" uvx="0.7882254719734192" uvy="-1.005843586199262e-08" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="-0.0" bz="1.0" />
<vert id="16" uvx="0.14589425921440125" uvy="0.23610679805278778" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="-0.24265079200267792" bz="-0.9701137542724609" />
<vert id="15" uvx="0.0" uvy="0.23610679805278778" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="-0.24265079200267792" bz="-0.9701137542724609" />
<vert id="3" uvx="0.0" uvy="0.082798071205616" tx="-0.9999999403953552" ty="0.0" tz="-0.0" bx="0.0" by="-0.24265077710151672" bz="-0.9701136946678162" />
<vert id="22" uvx="0.8871611952781677" uvy="0.22771424055099487" tx="0.0" ty="-1.0" tz="-0.0" bx="1.8865542017465486e-07" by="0.0" bz="-1.0" />
<vert id="2" uvx="0.8803144097328186" uvy="0.07823076844215393" tx="0.0" ty="-1.0" tz="-0.0" bx="1.8865542017465486e-07" by="0.0" bz="-1.0" />
<vert id="3" uvx="0.9557356834411621" uvy="0.07823076844215393" tx="0.0" ty="-1.0" tz="-0.0" bx="1.8865542017465486e-07" by="0.0" bz="-1.0" />
<vert id="20" uvx="0.3873341679573059" uvy="0.8541058301925659" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="21" uvx="0.3873341977596283" uvy="0.7082115411758423" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="1" uvx="0.49376237392425537" uvy="0.7082115411758423" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="19" uvx="0.3873341679573059" uvy="1.0000001192092896" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="20" uvx="0.3873341679573059" uvy="0.8541058301925659" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="8" uvx="0.493762344121933" uvy="0.8541058301925659" tx="0.0" ty="-1.0" tz="-0.0" bx="-1.0" by="0.0" bz="-0.0" />
<vert id="16" uvx="0.14589425921440125" uvy="0.23610679805278778" tx="-0.9970225691795349" ty="-0.07630708068609238" tz="0.011099583469331264" bx="0.013223884627223015" by="-0.3110142946243286" bz="-0.9503132104873657" />
<vert id="10" uvx="0.14589425921440125" uvy="0.0" tx="-0.9970225691795349" ty="-0.07630708813667297" tz="0.011099583469331264" bx="0.013223888352513313" by="-0.3110142946243286" bz="-0.9503132104873657" />
<vert id="7" uvx="0.2917885184288025" uvy="0.082798071205616" tx="-0.9970225691795349" ty="-0.07630708813667297" tz="0.011099583469331264" bx="0.013223888352513313" by="-0.3110142946243286" bz="-0.9503132104873657" />
<vert id="2" uvx="0.8803144097328186" uvy="0.07823076844215393" tx="-3.3821759615193514e-08" ty="-0.9999999403953552" tz="1.8135756008064163e-08" bx="0.881295919418335" by="-3.837729778410903e-08" bz="-0.4725646674633026" />
<vert id="9" uvx="0.8118332028388977" uvy="-8.276101581827788e-09" tx="-1.1901535401648289e-07" ty="-1.0" tz="6.381789319220843e-08" bx="0.8812959790229797" by="-1.3504583762369293e-07" bz="-0.472564697265625" />
<vert id="10" uvx="0.9017102718353271" uvy="-1.4905723322300446e-09" tx="-8.90868534497713e-08" ty="-0.9999999403953552" tz="4.7769763256155784e-08" bx="0.881295919418335" by="-1.0108619363791149e-07" bz="-0.4725646674633026" />
<vert id="23" uvx="0.43768277764320374" uvy="0.2342401146888733" tx="0.9847397208213806" ty="-0.17306628823280334" tz="0.018327003344893456" bx="-0.0355265773832798" by="-0.3029925525188446" bz="-0.9523305296897888" />
<vert id="9" uvx="0.43768277764320374" uvy="0.0" tx="0.9847397208213806" ty="-0.17306630313396454" tz="0.018327005207538605" bx="-0.0355265811085701" by="-0.3029925525188446" bz="-0.9523305296897888" />
<vert id="2" uvx="0.583577036857605" uvy="0.0832657739520073" tx="0.9847396016120911" ty="-0.17306628823280334" tz="0.018327001482248306" bx="-0.0355265773832798" by="-0.3029925227165222" bz="-0.9523304104804993" />
<vert id="11" uvx="0.43768277764320374" uvy="0.7082115411758423" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="17" uvx="0.43768277764320374" uvy="0.2884212136268616" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="13" uvx="0.5487409234046936" uvy="0.2884212136268616" tx="0.9999999403953552" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-0.9999999403953552" />
<vert id="8" uvx="0.14589425921440125" uvy="0.7848830223083496" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="16" uvx="0.14589425921440125" uvy="0.23610679805278778" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="12" uvx="0.2917885184288025" uvy="0.23610679805278778" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="21" uvx="0.8871611952781677" uvy="0.7822656035423279" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="22" uvx="0.8871611952781677" uvy="0.22771424055099487" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="15" uvx="0.992874026298523" uvy="0.22771424055099487" tx="0.0" ty="-1.0" tz="-0.0" bx="-0.0" by="0.0" bz="-1.0" />
<vert id="1" uvx="0.0" uvy="0.7848830223083496" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="15" uvx="0.0" uvy="0.23610679805278778" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="16" uvx="0.14589425921440125" uvy="0.23610679805278778" tx="-1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="7" uvx="0.7510870099067688" uvy="0.7040348052978516" tx="0.0" ty="-1.0" tz="-0.0" bx="1.0611867651277862e-07" by="0.0" bz="1.0" />
<vert id="6" uvx="0.6756657958030701" uvy="0.7040348052978516" tx="0.0" ty="-1.0" tz="-0.0" bx="1.0611867651277862e-07" by="0.0" bz="1.0" />
<vert id="18" uvx="0.682512640953064" uvy="0.554551362991333" tx="0.0" ty="-1.0" tz="-0.0" bx="1.0611867651277862e-07" by="0.0" bz="1.0" />
<vert id="4" uvx="0.32662466168403625" uvy="0.7082115411758423" tx="0.9999999403953552" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-0.9999999403953552" />
<vert id="14" uvx="0.32662466168403625" uvy="0.2884212136268616" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="17" uvx="0.43768277764320374" uvy="0.2884212136268616" tx="1.0" ty="0.0" tz="-0.0" bx="0.0" by="0.0" bz="-1.0" />
<vert id="4" uvx="0.583577036857605" uvy="0.06620688736438751" tx="-0.34254419803619385" ty="-0.9395017027854919" tz="-1.0016075435714811e-07" bx="-3.430949035987396e-08" by="-9.410120327402183e-08" bz="1.0" />
<vert id="19" uvx="0.682512640953064" uvy="-1.803953253443069e-08" tx="-0.34254419803619385" ty="-0.9395017027854919" tz="-1.0016075435714811e-07" bx="-3.430949035987396e-08" by="-9.410120327402183e-08" bz="1.0" />
<vert id="18" uvx="0.682512640953064" uvy="0.554551362991333" tx="-0.3425442576408386" ty="-0.9395017623901367" tz="-1.0016076856800282e-07" bx="-3.430949746530132e-08" by="-9.410121748487654e-08" bz="1.0000001192092896" />
<vert id="0" uvx="0.29178857803344727" uvy="0.7430476546287537" tx="2.2899290286204632e-07" ty="-0.8219506144523621" tz="-0.5695587396621704" bx="-0.9999999403953552" by="-1.88220852237464e-07" bz="-1.304249082068054e-07" />
<vert id="21" uvx="0.3873341977596283" uvy="0.7082115411758423" tx="2.2899291707290104e-07" ty="-0.8219506144523621" tz="-0.5695587396621704" bx="-0.9999999403953552" by="-1.882208664483187e-07" bz="-1.3042492241766013e-07" />
<vert id="20" uvx="0.3873341679573059" uvy="0.8541058301925659" tx="2.2899293128375575e-07" ty="-0.8219506144523621" tz="-0.5695587396621704" bx="-0.9999999403953552" by="-1.8822088065917342e-07" bz="-1.3042492241766013e-07" />
<vert id="4" uvx="0.2917885482311249" uvy="0.9651639461517334" tx="5.469493657983548e-07" ty="-0.8219507336616516" tz="-0.5695586204528809" bx="-1.0" by="-4.4956539113627514e-07" bz="-3.1151972734733135e-07" />
<vert id="11" uvx="0.2917885482311249" uvy="0.8541057705879211" tx="5.469495363286114e-07" ty="-0.8219506740570068" tz="-0.5695586204528809" bx="-0.9999999403953552" by="-4.495655332448223e-07" bz="-3.1151981261245965e-07" />
<vert id="20" uvx="0.3873341679573059" uvy="0.8541058301925659" tx="5.469494794851926e-07" ty="-0.8219507336616516" tz="-0.5695585608482361" bx="-1.0" by="-4.4956550482311286e-07" bz="-3.115197841907502e-07" />
<vert id="13" uvx="0.7882255911827087" uvy="0.29392117261886597" tx="0.34254422783851624" ty="-0.9395017027854919" tz="1.5024114929929056e-07" bx="5.146424442159514e-08" by="-1.411518297800285e-07" bz="-1.0" />
<vert id="22" uvx="0.8871611952781677" uvy="0.22771424055099487" tx="0.3425442576408386" ty="-0.9395017623901367" tz="1.5024116351014527e-07" bx="5.146424797430882e-08" by="-1.411518439908832e-07" bz="-1.0000001192092896" />
<vert id="21" uvx="0.8871611952781677" uvy="0.7822656035423279" tx="0.3425442576408386" ty="-0.9395017623901367" tz="1.5024116351014527e-07" bx="5.146424797430882e-08" by="-1.411518439908832e-07" bz="-1.0000001192092896" />
<vert id="13" uvx="0.5487409234046936" uvy="0.2884212136268616" tx="1.0" ty="0.0" tz="-0.0" bx="-0.0" by="0.8582265377044678" bz="-0.513271152973175" />
<vert id="17" uvx="0.43768277764320374" uvy="0.2884212136268616" tx="1.0" ty="0.0" tz="-0.0" bx="-0.0" by="0.8582265377044678" bz="-0.513271152973175" />
<vert id="23" uvx="0.43768277764320374" uvy="0.2342401146888733" tx="1.0" ty="0.0" tz="-0.0" bx="-0.0" by="0.8582265377044678" bz="-0.513271152973175" />
<vert id="14" uvx="0.32662466168403625" uvy="0.2884212136268616" tx="0.9923793077468872" ty="-0.12253512442111969" tz="0.01297579426318407" bx="0.10893320292234421" by="0.8232192397117615" bz="-0.5571746826171875" />
<vert id="18" uvx="0.2917885184288025" uvy="0.2326439768075943" tx="0.9923794269561768" ty="-0.12253513187170029" tz="0.012975795194506645" bx="0.1089332103729248" by="0.8232192993164062" bz="-0.5571747422218323" />
<vert id="23" uvx="0.43768277764320374" uvy="0.2342401146888733" tx="0.992379367351532" ty="-0.12253513932228088" tz="0.01297579612582922" bx="0.1089332178235054" by="0.8232192397117615" bz="-0.5571747422218323" />
</mesh>
</node>
</model>
+15 -11
View File
@@ -1,6 +1,7 @@
map = {
lights = {
{type = 3, color = {x = 0.900000, y = 0.900000, z = 0.900000}},},
{type = 3, color = {x = 0.900000, y = 0.900000, z = 0.900000}},
},
numWaterBodies = 1,
size = {x = 1000.000000, y = 169.766891, z = 1000.000000},
impassibleNodeValue = 65535,
@@ -12,24 +13,27 @@ spawnPoints = {
},
players = {
{
resourceDeposits = {
{id = 0, pos = {x = 100.000000, y = 0.000000, z = 100.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, initAmmount = 1000},
{id = 0, pos = {x = -200.000000, y = 0.000000, z = 50.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, initAmmount = 1000},
},
resourceDeposits = {},
units = {
{id = 1, pos = {x = 300.000000, y = 0.000000, z = 0.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}},
{id = 18, pos = {x = 300.000000, y = 0.000000, z = 100.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}},
{id = 0, pos = {x = 290.000000, y = 0.000000, z = 0.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}},
{id = UnitId.POINT_DEFENSE, pos = {x = 280.000000, y = 0.000000, z = 50.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, buildStatus = 100},
}
,},
{
resourceDeposits = {},
spawnPoint = 0,
units = {
{id = 0, pos = {x = 300.000000, y = 0.000000, z = 450.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}},
{id = 1, pos = {x = -300.000000, y = 0.000000, z = -450.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}},
{id = 13, pos = {x = 0.000000, y = 0.000000, z = 0.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}},
{id = UnitId.ENGINEER, pos = {x = 300.000000, y = 0.000000, z = 450.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}},
{id = UnitId.ENGINEER, pos = {x = -300.000000, y = 0.000000, z = -450.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}},
}
,},
{
resourceDeposits = {
{id = 0, pos = {x = 100.000000, y = 0.000000, z = 100.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, initAmmount = 1000},
{id = 0, pos = {x = -200.000000, y = 0.000000, z = 50.000000}, rot = {w = 1.000000, x = 0.000000, y = 0.000000, z = 0.000000}, initAmmount = 1000},
},
units = {}
}
,}
},
numCells = 37306,
cells = {
@@ -1,13 +1,60 @@
ProjectileId = {CRUISE_MISSILE = 0, TORPEDO = 1}
ProjectileClass = {CRUISE_MISSILE = 0, TORPEDO = 1}
ProjectileId = {HE_SHELL = 0, EMP_SHELL = 1, CRUISE_MISSILE = 2, MISSILE = 3, TORPEDO = 4}
ProjectileClass = {SHELL = 0, CRUISE_MISSILE = 1, MISSILE = 2, TORPEDO = 3}
G = 9.8
explosionVfx = {
vfx = true,
duration = 50,
offset = 0,
mesh = {
numParticles = 1,
texture = PATH .. 'Textures/Explosion/explosion07.png',
lowLife = 3,
highLife = 3,
size = {x = 10, y = 10},
}
}
explosionSfx = {
vfx = false,
offset = 100,
path = PATH .. 'Sounds/SFX/Explosions/explosion02.ogg',
duration = 2500
}
Detonation = {EXPLOSION = 0, EMP = 1, CRYO = 2}
projectiles = {
{
projectileClass = ProjectileClass.SHELL,
size = {x = 1, y = 1, z = 1},
speed = 5,
rotAngle = .1,
explosion = {detonation = Detonation.EXPLOSION, damage = 100, radius = 20, fx = {explosionVfx, explosionSfx}},
directHitDamage = 200,
rayLength = 1,
name = "Shell",
basePath = PATH .. "Models/GameObjects/Projectiles/Shells/",
meshPath = "shell.xml",
albedoPath = 'shell.jpg'
},
{
projectileClass = ProjectileClass.SHELL,
size = {x = 1, y = 1, z = 1},
speed = 5,
rotAngle = .1,
explosion = {detonation = Detonation.EMP, damage = 0, radius = 20, fx = {explosionVfx, explosionSfx}},
directHitDamage = 0,
rayLength = 1,
name = "Shell",
basePath = PATH .. "Models/GameObjects/Projectiles/Shells/",
meshPath = "shell.xml",
albedoPath = 'shell.jpg'
},
{
projectileClass = ProjectileClass.CRUISE_MISSILE,
size = {x = 6, y = 13.5, z = 2.54},
speed = .5,
rotAngle = .1,
explosion = {damage = 100, radius = 20, sfx = PATH .. 'Sounds/SFX/Explosions/explosion02.ogg'},
explosion = {detonation = Detonation.EXPLOSION, damage = 100, radius = 20, fx = {explosionVfx, explosionSfx}},
directHitDamage = 450,
rayLength = 6,
name = "Cruise missile",
@@ -15,11 +62,24 @@ projectiles = {
meshPath = "cruiseMissile.xml",
albedoPath = 'cruiseMissile.jpg'
},
{
projectileClass = ProjectileClass.MISSILE,
size = {x = 3, y = 7., z = 1.27},
speed = .5,
rotAngle = .1,
explosion = {detonation = Detonation.EXPLOSION, damage = 70, radius = 12, fx = {explosionVfx, explosionSfx}},
directHitDamage = 250,
rayLength = 3,
name = "Missile",
basePath = PATH .. "Models/GameObjects/Projectiles/Missiles/",
meshPath = "missile.xml",
albedoPath = 'cruiseMissile.jpg'
},
{
projectileClass = ProjectileClass.TORPEDO,
size = {x = 1, y = 6, z = 1},
speed = .06,
explosion = {damage = 20, radius = 3, sfx = PATH .. 'Sounds/Units/Submarines/torpedo.ogg'},
explosion = {detonation = Detonation.EXPLOSION, damage = 20, radius = 3, fx = {explosionVfx, explosionSfx}},
directHitDamage = 450,
rayLength = 3.5,
name = "Torpedo",
+227 -95
View File
@@ -10,7 +10,8 @@ OrderType = {
SUPPLY = 7,
LOAD = 8,
UNLOAD = 9,
HACK = 10
HACK = 10,
FREEZE = 11
}
UnitId = {
WAR_MECH = 0,
@@ -28,16 +29,20 @@ UnitId = {
CHAMPION_CARRIER = 12,
MISSILE_SUBMARINE = 13,
STEALTH_SUBMARINE = 14,
LAND_FACTORY = 15,
NAVAL_FACTORY = 16,
TRADE_CENTER = 17,
LAB = 18,
POINT_DEFENSE = 19,
EXTRACTOR = 20,
REFINERY = 21,
FORT = 22
ICEBREAKER = 15,
FREEZER = 16,
EMP_BOAT = 17,
LAND_FACTORY = 18,
NAVAL_FACTORY = 19,
TRADE_CENTER = 20,
LAB = 21,
POINT_DEFENSE = 22,
EXTRACTOR = 23,
REFINERY = 24,
FORT = 25,
ICE_SHEET = 26
}
WeaponClass = {HITSCAN = 0, SHELL = 1, TORPEDO = 2, CRUISE_MISSILE = 3, HACK = 4}
WeaponClass = {FREEZE = 1}
UnitClass = {
WAR_MECH = 0,
TANK = 1,
@@ -48,14 +53,18 @@ UnitClass = {
CRUISER = 6,
CARRIER = 7,
SUBMARINE = 8,
LAND_FACTORY = 9,
NAVAL_FACTORY = 10,
TRADE_CENTER = 11,
LAB = 12,
POINT_DEFENSE = 13,
EXTRACTOR = 14,
REFINERY = 15,
FORT = 16
ICEBREAKER = 9,
FREEZER = 10,
EMP_BOAT = 11,
LAND_FACTORY = 12,
NAVAL_FACTORY = 13,
TRADE_CENTER = 14,
LAB = 15,
POINT_DEFENSE = 16,
EXTRACTOR = 17,
REFINERY = 18,
FORT = 19,
ICE_SHEET = 20
}
UnitType = {UNDERWATER = 0, SEA_LEVEL = 1, HOVER = 2, LAND = 3, AIR = 4}
@@ -84,14 +93,13 @@ explosionSfx = {
duration = 2500
}
units = {
{
weapons = {
{
type = WeaponClass.HITSCAN,
orderType = OrderType.ATTACK,
rateOfFire = 100,
maxRange = 10,
maxRange = 14,
damage = 50,
fireFx = {
{
@@ -143,28 +151,35 @@ units = {
cost = 500,
size = {x = 6, y = 9.22, z = 2.42},
hitboxOffset = {x = 0, y = 4.5, z = 0},
lineOfSight = 250,
lineOfSight = 25,
name = 'War mech',
basePath = PATH .. vehiclePrefix .. 'WarMechs/',
meshPath = 'warMech.xml',
albedoPath = 'mech.jpg',
colorNodes = {'WarRobotTemplate.001'},
selectionSfx = PATH .. 'Sounds/Units/WarMechs/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .3,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 1
garrisonCategory = 1,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.HITSCAN,
orderType = OrderType.ATTACK,
rateOfFire = 1000,
damage = 200,
maxRange = 25,
horizontalNode = {name = 'Turret', rotationSpeed = .05, maxFireAngle = .1},
projectile = {id = ProjectileId.HE_SHELL, parent = 'Turret', pos = {x = 0.06, y = 5.82, z = 11.4}, rot = {w = 1, x = 0, y = 0, z = 0}},
fireFx = {
{
vfx = false,
duration = 300,
path = PATH .. 'Sounds/Units/Tanks/attack.ogg',
},
{
vfx = true,
duration = 50,
@@ -172,19 +187,14 @@ units = {
path = PATH .. vfxPrefix .. 'muzzleFlash.xml',
color = {x = 1, y = 1, z = 0, a = 1},
},
parent = 'Turret',
parent = 'CannonBarrel',
pos = {x = 0.06, y = 5.82, z = 11.4},
rot = {w = 1, x = 0, y = 0, z = 0},
--scale = .5
},
{
vfx = false,
duration = 300,
path = PATH .. 'Sounds/Units/Tanks/attack.ogg',
}
},
landHitFx = {explosionVfx, explosionSfx},
unitHitFx = {explosionVfx, explosionSfx}
--landHitFx = {explosionVfx, explosionSfx},
--unitHitFx = {explosionVfx, explosionSfx}
}
},
unitClass = UnitClass.TANK,
@@ -203,40 +213,42 @@ units = {
albedoPath = 'tank.jpg',
colorNodes = {'Antenna_S', 'Antenna_L', 'Hatch'},
selectionSfx = PATH .. 'Sounds/Units/Tanks/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 2
garrisonCategory = 2,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.HITSCAN,
orderType = OrderType.ATTACK,
rateOfFire = 2000,
damage = 5000,
maxRange = 30,
maxRange = 70,
horizontalNode = {name = 'turret', rotationSpeed = .05, maxFireAngle = .1},
verticalNode = {name = 'tubes', rotationSpeed = .05, maxFireAngle = .1},
projectile = {id = ProjectileId.MISSILE, parent = 'tubes', pos = {x = 0.95, y = 2.16, z = 4.11}, rot = {w = 1, x = 0, y = 0, z = 0}},
fireFx = {
{
vfx = true,
duration = 50,
parent = 'tubes',
pos = {x = 0.95, y = 2.16, z = 4.11},
rot = {w = 1, x = 0, y = 0, z = 0},
mesh = {
path = PATH .. vfxPrefix .. 'muzzleFlash.xml',
color = {x = 1, y = 1, z = 0, a = 1},
},
pos = {x = 1, y = 5.8, z = 3.9},
rot = {w = 1, x = 0, y = 0, z = 0},
--scale = .5
},
{
vfx = false,
duration = 300,
path = PATH .. 'Sounds/Units/Tanks/attack.ogg',
duration = 2500,
path = PATH .. 'Sounds/Units/Submarines/missile.ogg',
}
},
landHitFx = {explosionVfx, explosionSfx},
unitHitFx = {explosionVfx, explosionSfx}
}
},
unitClass = UnitClass.ARTILLERY,
@@ -255,17 +267,14 @@ units = {
albedoPath = 'artillery.jpg',
colorNodes = {'turret'},
selectionSfx = PATH .. 'Sounds/Units/Tanks/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 2
garrisonCategory = 2,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{type = WeaponClass.HITSCAN, rateOfFire = 2000, fireSfx = PATH .. 'Sounds/Units/WarMechs/fire.ogg', damage = 20, maxRange = 8},
},
buildableUnits = {
{id = UnitId.LAND_FACTORY, buildable = true, trigger = 76},
{id = UnitId.NAVAL_FACTORY, buildable = true, trigger = 78},
@@ -295,15 +304,15 @@ units = {
colorNodes = {'Cube.008'},
meshPath = 'engineer2.xml',
selectionSfx = PATH .. 'Sounds/Units/Engineers/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {{type = WeaponClass.HITSCAN, rateOfFire = 2000, fireSfx = PATH .. 'Sounds/Units/WarMechs/fire.ogg', damage = 50, maxRange = 20}},
weapons = {{orderType = OrderType.ATTACK, rateOfFire = 2000, fireSfx = PATH .. 'Sounds/Units/WarMechs/fire.ogg', damage = 50, maxRange = 20}},
unitClass = UnitClass.TRANSPORT,
unitType = UnitType.HOVER,
isVehicle = true,
@@ -320,15 +329,15 @@ units = {
basePath = PATH .. vehiclePrefix .. 'Transports/',
meshPath = 'scoutTransport.xml',
selectionSfx = PATH .. 'Sounds/Units/Transports/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {{type = WeaponClass.HITSCAN, rateOfFire = 2000, fireSfx = PATH .. 'Sounds/Units/Tanks/attack.ogg', damage = 100, maxRange = 25}},
weapons = {{orderType = OrderType.ATTACK, rateOfFire = 2000, fireSfx = PATH .. 'Sounds/Units/Tanks/attack.ogg', damage = 100, maxRange = 25}},
unitClass = UnitClass.TRANSPORT,
unitType = UnitType.HOVER,
armor = {ArmorType.MECHANIC},
@@ -346,12 +355,12 @@ units = {
meshPath = 'hoverTransport.xml',
albedoPath = 'transport.jpg',
selectionSfx = PATH .. 'Sounds/Units/Transports/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {},
@@ -379,20 +388,20 @@ units = {
meshPath = 'cargoship.xml',
albedoPath = 'cargoship.jpg',
selectionSfx = PATH .. 'Sounds/Units/Cargoships/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.HITSCAN,
orderType = OrderType.ATTACK,
rateOfFire = 200,
damage = 300,
maxRange = 15,
damage = 10,
maxRange = 50,
fireFx = {
{
vfx = true,
@@ -430,17 +439,17 @@ units = {
meshPath = 'tacticalCruiser.xml',
albedoPath = 'cruiser.jpg',
selectionSfx = PATH .. 'Sounds/Units/Cruisers/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.HITSCAN,
orderType = OrderType.ATTACK,
rateOfFire = 200,
fireFx = {
{
@@ -481,17 +490,17 @@ units = {
meshPath = 'defensiveCruiser.xml',
albedoPath = 'cruiser.jpg',
selectionSfx = PATH .. 'Sounds/Units/Cruisers/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.HITSCAN,
orderType = OrderType.ATTACK,
rateOfFire = 200,
damage = 300,
maxRange = 15,
@@ -531,17 +540,17 @@ units = {
meshPath = 'cheapCruiser.xml',
albedoPath = 'cruiser.jpg',
selectionSfx = PATH .. 'Sounds/Units/Cruisers/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.HITSCAN,
orderType = OrderType.ATTACK,
rateOfFire = 200,
fireSfx = PATH .. 'Sounds/Units/Cruisers/fire.ogg',
damage = 300,
@@ -582,17 +591,17 @@ units = {
meshPath = 'transportCruiser.xml',
albedoPath = 'cruiser.jpg',
selectionSfx = PATH .. 'Sounds/Units/Cruisers/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.HITSCAN,
orderType = OrderType.ATTACK,
rateOfFire = 100,
damage = 80,
maxRange = 100,
@@ -631,17 +640,17 @@ units = {
meshPath = 'heavyCarrier.xml',
albedoPath = 'carrier.jpg',
selectionSfx = PATH .. 'Sounds/Units/Carriers/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.HITSCAN,
orderType = OrderType.ATTACK,
rateOfFire = 450,
damage = 500,
maxRange = 100,
@@ -667,7 +676,7 @@ units = {
waterHitFx = {explosionVfx, explosionSfx}
},
{
type = WeaponClass.CRUISE_MISSILE,
orderType = OrderType.LAUNCH,
projectile = {id = ProjectileId.CRUISE_MISSILE, pos = {x = 0, y = 15, z = 0}, rot = {w = .707, x = -.707, y = 0, z = 0}},
rateOfFire = 500,
maxRange = 30,
@@ -695,17 +704,17 @@ units = {
meshPath = 'championCarrier.xml',
albedoPath = 'carrier.jpg',
selectionSfx = PATH .. 'Sounds/Units/Carriers/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.TORPEDO,
orderType = OrderType.ATTACK,
rateOfFire = 1000,
fireFx = {
{
@@ -719,7 +728,7 @@ units = {
projectile = {id = ProjectileId.TORPEDO, pos = {x = 0, y = -.27, z = 4.6}, rot = {w = 1, x = 0, y = 0, z = 0}}
},
{
type = WeaponClass.CRUISE_MISSILE,
orderType = OrderType.LAUNCH,
rateOfFire = 500,
maxRange = 30,
fireFx = {
@@ -747,17 +756,17 @@ units = {
albedoPath = 'submarine.jpg',
colorNodes = {'missileSubmarine.001'},
selectionSfx = PATH .. 'Sounds/Units/Submarines/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.TORPEDO,
orderType = OrderType.ATTACK,
projectile = {id = ProjectileId.TORPEDO, pos = {x = 0, y = -.27, z = 4.6}, rot = {w = 1, x = 0, y = 0, z = 0}},
damage = 200,
maxRange = 20,
@@ -786,12 +795,118 @@ units = {
meshPath = 'stealthSubmarine.xml',
albedoPath = 'submarine.jpg',
selectionSfx = PATH .. 'Sounds/Units/Submarines/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
unitClass = UnitClass.ICEBREAKER,
unitType = UnitType.SEA_LEVEL,
isVehicle = true,
health = 500,
buildTime = 1000,
cost = 500,
size = {x = 12.6, y = 8.5, z = 32.8},
hitboxOffset = {x = 0, y = 2.07, z = .8},
lineOfSight = 25,
name = 'Icebreaker',
--colorNodes = {'stealthSubmarine.001'},
basePath = PATH .. vehiclePrefix .. 'Icebreakers/',
meshPath = 'icebreaker.xml',
albedoPath = 'icebreaker.jpg',
selectionSfx = PATH .. 'Sounds/Units/Submarines/selection.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.FREEZE,
orderType = OrderType.ATTACK,
rateOfFire = 100,
maxRange = 10,
damage = 0,
fireFx = {
{
vfx = false,
duration = 500,
path = PATH .. 'Sounds/SFX/Freezing/freeze.ogg'
},
},
unitHitFx = {},
landHitFx = {},
waterHitFx = {},
}
},
buildableUnits = {{id = UnitId.ICE_SHEET, buildable = true, trigger = 83}},
unitClass = UnitClass.FREEZER,
unitType = UnitType.SEA_LEVEL,
isVehicle = true,
health = 500,
buildTime = 1000,
cost = 500,
size = {x = 8.5, y = 6.3, z = 17.6},
hitboxOffset = {x = 0, y = 1.6, z = 0},
lineOfSight = 25,
name = 'Freezer',
--colorNodes = {'stealthSubmarine.001'},
basePath = PATH .. vehiclePrefix .. 'Freezers/',
meshPath = 'freezer.xml',
albedoPath = 'freezer.jpg',
selectionSfx = PATH .. 'Sounds/Units/Submarines/selection.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
orderType = OrderType.ATTACK,
rateOfFire = 1000,
damage = 0,
maxRange = 25,
horizontalNode = {name = 'turret', rotationSpeed = .05, maxFireAngle = .1},
projectile = {id = ProjectileId.EMP_SHELL, parent = 'turret', pos = {x = 0.06, y = 5.82, z = 11.4}, rot = {w = .998, x = -.066, y = 0, z = 0}},
fireFx = {
{
vfx = false,
duration = 300,
path = PATH .. 'Sounds/Units/Tanks/attack.ogg',
},
},
}
},
unitClass = UnitClass.EMP_BOAT,
unitType = UnitType.SEA_LEVEL,
isVehicle = true,
health = 500,
buildTime = 1000,
cost = 500,
size = {x = 4.75, y = 5.15, z = 19.55},
hitboxOffset = {x = 0, y = .18, z = .25},
lineOfSight = 25,
name = 'EMP boat',
--colorNodes = {'stealthSubmarine.001'},
basePath = PATH .. vehiclePrefix .. 'EMPShips/',
meshPath = 'empShip.xml',
albedoPath = 'empShip.jpg',
selectionSfx = PATH .. 'Sounds/Units/Submarines/selection.ogg',
speed = .1,
destinationOffset = .1,
anglePrecision = .1,
maxTurnAngle = .1,
garrisonCategory = 3,
deathFx = {explosionVfx, explosionSfx},
},
{
buildableUnits = {
@@ -815,7 +930,7 @@ units = {
basePath = PATH .. structurePrefix .. 'LandFactories/',
meshPath = 'landFactory.xml',
selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
deathFx = {explosionVfx, explosionSfx},
},
{
unitClass = UnitClass.NAVAL_FACTORY,
@@ -832,7 +947,7 @@ units = {
meshPath = 'navalFactory.xml',
albedoPath = 'factory.jpg',
selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
deathFx = {explosionVfx, explosionSfx},
},
{
unitClass = UnitClass.TRADE_CENTER,
@@ -856,7 +971,7 @@ units = {
meshPath = 'tradeCenter.xml',
albedoPath = 'tradeCenter.jpg',
selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
deathFx = {explosionVfx, explosionSfx},
},
{
unitClass = UnitClass.LAB,
@@ -878,15 +993,17 @@ units = {
meshPath = 'lab2.xml',
albedoPath = 'lab.jpg',
selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
deathFx = {explosionVfx, explosionSfx},
},
{
weapons = {
{
type = WeaponClass.HITSCAN,
orderType = OrderType.ATTACK,
rateOfFire = 100,
damage = 50,
maxRange = 50,
horizontalNode = {name = 'TurretBody', rotationSpeed = .05, maxFireAngle = .1},
--verticalNode = {name = 'TurretArms', rotationSpeed = .05, maxFireAngle = .1},
fireFx = {
{
vfx = true,
@@ -937,7 +1054,7 @@ units = {
meshPath = 'pointDefense2.xml',
albedoPath = 'pointDefense.jpg',
selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
deathFx = {explosionVfx, explosionSfx},
},
{
unitClass = UnitClass.EXTRACTOR,
@@ -957,7 +1074,7 @@ units = {
meshPath = 'extractor.xml',
albedoPath = 'extractor.jpg',
selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
deathFx = {explosionVfx, explosionSfx},
},
{
unitClass = UnitClass.REFINERY,
@@ -975,7 +1092,7 @@ units = {
meshPath = 'refinery.xml',
albedoPath = 'refinery.jpg',
selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
deathFx = {explosionVfx, explosionSfx},
},
{
buildableUnits = {{id = UnitId.ENGINEER, buildable = true, trigger = 69}},
@@ -994,6 +1111,21 @@ units = {
colorNodes = {'Cube.004'},
albedoPath = 'fort.jpg',
selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg',
deathSfx = PATH .. 'Sounds/SFX/Explosions/explosion01.ogg',
deathFx = {explosionVfx, explosionSfx},
},
{
unitClass = UnitClass.ICE_SHEET,
unitType = UnitType.SEA_LEVEL,
isVehicle = false,
health = 1000,
size = {x = 7, y = 1.5, z = 7},
hitboxOffset = {x = 0, y = 0, z = 0},
lineOfSight = 5,
name = 'Ice sheet',
basePath = PATH .. structurePrefix .. 'IceSheets/',
meshPath = 'iceSheet.xml',
albedoPath = 'iceSheet.jpg',
selectionSfx = PATH .. 'Sounds/Units/Sample/selection.ogg',
deathFx = {explosionVfx, explosionSfx},
},
}
+6 -1
View File
@@ -82,12 +82,17 @@ function generateGui(unitId)
mainUnit.unitClass == UnitClass.FORT
)
isEng = (
mainUnit.unitClass == UnitClass.ENGINEER or
mainUnit.unitClass == UnitClass.FREEZER
)
buttonData = {
trigger = buildUnit.trigger,
name = units[buildUnit.id + 1].name,
buttonType = (mainUnit.isVehicle and ButtonType.BUILD or ButtonType.TRAIN),
factoryId = (isFactory and unitId or nil),
engineerId = (mainUnit.unitClass == UnitClass.ENGINEER and unitId or nil),
engineerId = (isEng and unitId or nil),
slotId = (ButtonType.BUILD and i - 1 or nil)
}
gui[#gui + 1] = generateButton(#gui, buttonData)
+13 -9
View File
@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 2.9)
cmake_minimum_required(VERSION 3.5)
set(GAME_NAME battleship)
project(${GAME_NAME})
@@ -10,31 +10,35 @@ else()
endif()
set(CMAKE_CXX_STANDART 17)
set(CMAKE_POLICY_VERSION_MINIMUM 3.5)
set(CMAKE_BUILD_TYPE Debug)
set(BUILD_TESTS ON)
set(BUILD_SHARED_LIBS OFF CACHE BOOL FORCED)
cmake_policy(SET CMP0015 NEW)
set(STATES activeGameState.cpp inGameAppState.cpp guiAppState.cpp mapEditorAppState.cpp loadingAppState.cpp)
set(UNIT_BUTTONS unitButton.cpp tradeButton.cpp buildButton.cpp trainButton.cpp researchButton.cpp orderButton.cpp stateToggleButton.cpp)
set(OPTIONS_BUTTONS optionsButton.cpp tabButton.cpp okButton.cpp defaultsButton.cpp)
set(TRADING_BUTTONS activeStateBackButton.cpp playerTradeButton.cpp tradingScreenButton.cpp offerButton.cpp resourceAmmountButton.cpp)
set(MENU_BUTTONS mainMenuButton.cpp singlePlayerButton.cpp exitButton.cpp backButton.cpp playButton.cpp)
set(MAP_EDITOR_BUTTONS mapEditorButton.cpp newMapButton.cpp loadMapButton.cpp exportButton.cpp)
set(BUTTONS statsButton.cpp activeStateButton.cpp minimapButton.cpp ${TRADING_BUTTONS} ${OPTIONS_BUTTONS} ${MENU_BUTTONS} ${MAP_EDITOR_BUTTONS} ${UNIT_BUTTONS})
set(LISTBOXES skyboxTextureListbox.cpp landTextureListbox.cpp gameObjectListbox.cpp mapListbox.cpp)
set(GUI tooltip.cpp concreteGuiManager.cpp ${BUTTONS} ${LISTBOXES})
set(STATES activeGameState.cpp inGameAppState.cpp guiAppState.cpp mapEditorAppState.cpp loadingAppState.cpp)
set(UTIL util.cpp binds.h)
set(CONTROLLERS gameObjectFrameController.cpp cameraController.cpp)
set(CONSOLE console.cpp abstractCommand.cpp addUnitCommand.cpp addResourceCommand.cpp addTechnologyCommand.cpp toggleDebugCommand.cpp)
set(CORE gameManager.cpp game.cpp fxManager.cpp defConfigs.cpp ${CONSOLE} ${CONTROLLERS})
set(PROJECTILES projectile.cpp cruiseMissile.cpp)
set(VEHICLES vehicle.cpp engineer.cpp resourceRover.cpp)
set(STRUCTURES structure.cpp factory.cpp pointDefense.cpp extractor.cpp researchStruct.cpp)
set(UNITS gameObjectFactory.cpp unit.cpp ${STRUCTURES} ${VEHICLES})
set(CORE gameManager.cpp game.cpp environment.cpp fxManager.cpp defConfigs.cpp ${CONSOLE} ${CONTROLLERS})
set(PROJECTILES projectile.cpp missile.cpp cruiseMissile.cpp shell.cpp)
set(VEHICLES vehicle.cpp submarine.cpp engineer.cpp resourceRover.cpp freezer.cpp)
set(STRUCTURES structure.cpp factory.cpp pointDefense.cpp extractor.cpp researchStruct.cpp iceSheet.cpp)
set(UNITS gameObjectFactory.cpp unit.cpp weapon.cpp ${STRUCTURES} ${VEHICLES})
set(CONTENT player.cpp trader.cpp pathfinder.cpp map.cpp gameObject.cpp gameObjectFrame.h resourceDeposit.cpp ${UNITS} ${PROJECTILES})
set(UTIL util.cpp binds.h)
set(GAME_SRC ${STATES} ${GUI} ${CORE} ${CONTENT} ${UTIL})
set(SFML_DIR external/SFML)
+6 -5
View File
@@ -238,7 +238,7 @@ namespace battleship{
}
else if(cursorState == CursorState::HACK)
orderPossible = (!ownGameObj && gameObjUnit && mainPlayer->getSelectedUnit(0)->getUnitClass() == UnitClass::ENGINEER);
else if(gameObjUnit)
else if(controlPressed)
cursorState = CursorState::ATTACK;
else
cursorState = CursorState::NORMAL;
@@ -337,7 +337,7 @@ namespace battleship{
void ActiveGameState::updateGameObjHoveredOn(){
vector<GameObject*> gameObjs;
vector<Player*> players = Game::getSingleton()->getPlayers();
vector<Player*> players = Game::getSingleton()->getPlayers(true);
for(Player *pl : players){
vector<ResourceDeposit*> resDeps = pl->getResourceDeposits();
@@ -482,7 +482,7 @@ namespace battleship{
vector<Unit*> units;
for (Player *p : Game::getSingleton()->getPlayers())
for (Player *p : Game::getSingleton()->getPlayers(true))
for (Unit *u : p->getUnits())
units.push_back(u);
@@ -703,7 +703,7 @@ namespace battleship{
else if(cursorState == CursorState::HACK){
if(orderPossible) issueOrder(Order::TYPE::HACK, vector<Order::Target>{Order::Target((Unit*)gameObjHoveredOn)}, shiftPressed);
}
else if(selectedUnits[0]->getUnitClass() == UnitClass::ENGINEER && ufCtr->isPlacingOnSurface()){
else if((selectedUnits[0]->getUnitClass() == UnitClass::ENGINEER || selectedUnits[0]->getUnitClass() == UnitClass::FREEZER) && ufCtr->isPlacingOnSurface()){
castRayToTerrain();
GameObjectFrame gmObjFr = ufCtr->getGameObjectFrame(0);
@@ -717,7 +717,7 @@ namespace battleship{
buildableStructSelected = false;
}
else if(!canSelectHoveredOnGameObj()){
else{
if(targets.empty()) castRayToTerrain();
issueOrder(Order::TYPE::MOVE, targets, shiftPressed);
@@ -788,6 +788,7 @@ namespace battleship{
forceCursorState = isPressed;
controlPressed = isPressed;
orderPossible = isPressed;
break;
case Bind::LEFT_SHIFT:
{
+9 -19
View File
@@ -12,7 +12,7 @@ namespace battleship{
using namespace std;
using namespace vb01;
CruiseMissile::CruiseMissile(Unit *unit, Vector3 tp, Vector3 pos, Quaternion rot) : Projectile(unit, 0, pos, rot), targetPoint(tp), flightStage(FlightStage::ASCENT){
CruiseMissile::CruiseMissile(Unit *unit, int id, Vector3 tp, Vector3 pos, Quaternion rot) : Projectile(unit, id, pos, rot), targetPoint(tp), flightStage(FlightStage::ASCENT){
Vector3 unitDir = unit->getDirVec();
Vector3 leftDir = unit->getLeftVec();
Vector3 targDir = (Vector3(targetPoint.x, pos.y, targetPoint.z) - pos).norm();
@@ -29,7 +29,7 @@ namespace battleship{
if(flightStage == FlightStage::ASCENT && pos.y - initPos.y > minHeight){
orientAt(Quaternion(angle, leftVec) * rot);
if(dirVec.y <= 0) flightStage = FlightStage::CRUISE;
if(dirVec.y <= .001) flightStage = FlightStage::CRUISE;
}
else if(flightStage == FlightStage::DESCENT){
Vector3 targDir = (Vector3(targetPoint.x, initPos.y, targetPoint.z) - initPos).norm();
@@ -47,19 +47,8 @@ namespace battleship{
flightStage = FlightStage::DESCENT;
}
void CruiseMissile::checkSurfaceCollision(){
Map *map = Map::getSingleton();
int cellId = map->getCellId(pos, false);
if((pos + dirVec * rayLength).y <= map->getCells()[cellId].pos.y){
Game::getSingleton()->explode(pos, explosionDamage, explosionRadius, explosionSfx);
remove = true;
}
}
void CruiseMissile::update(){
GameObject::update();
placeAt(pos + dirVec * speed);
Projectile::update();
switch(flightStage){
case FlightStage::ASCENT:
@@ -73,10 +62,11 @@ namespace battleship{
break;
}
if(!remove && flightStage == FlightStage::DESCENT){
checkSurfaceCollision();
if(remove) return;
checkUnitCollision();
}
checkCollision();
}
void CruiseMissile::checkCollision(){
if(flightStage == FlightStage::DESCENT)
Projectile::checkCollision();
}
}
+2 -2
View File
@@ -6,7 +6,7 @@
namespace battleship{
class CruiseMissile : public Projectile{
public:
CruiseMissile(Unit*, vb01::Vector3, vb01::Vector3, vb01::Quaternion);
CruiseMissile(Unit*, int, vb01::Vector3, vb01::Vector3, vb01::Quaternion);
void update();
private:
enum class FlightStage{ASCENT, CRUISE, DESCENT};
@@ -15,7 +15,7 @@ namespace battleship{
void pitch(float, vb01::Vector3);
void cruise();
void checkSurfaceCollision();
void checkCollision();
};
}
+1 -29
View File
@@ -50,40 +50,12 @@ namespace battleship{
hackStatus = 0;
}
void Engineer::build(Order order){
if(pathPoints.empty()){
if(!order.targets[0].unit)
player->addUnit(order.targets[0].unit);
else {
Structure *structure = (Structure*)order.targets[0].unit;
sol::table targTable = generateView()["units"][order.targets[0].unit->getId()];
int costRate = (int)targTable["cost"] / 100, buildRate = (int)targTable["buildTime"] / 100;
if(structure->getBuildStatus() < 100 && player->getResource(ResourceType::REFINEDS) >= costRate && getTime() - lastIncrementTime > buildRate){
structure->incrementBuildStatus();
player->updateResource(ResourceType::REFINEDS, -costRate, true);
lastIncrementTime = getTime();
}
else if(structure->getBuildStatus() >= 100){
removeOrder(0);
player->incStructuresBuilt();
}
}
}
else{
navigate(0.5 * Map::getSingleton()->getCellSize().x);
if(type == UnitType::LAND)
alignToSurface();
}
}
//TODO change unit colors after faction change
void Engineer::hack(Order order){
Unit *targUnit = order.targets[0].unit;
bool withinRange = (targUnit->getPos().getDistanceFrom(pos) < hackRange);
int hackRate = int(generateView()["units"][id + 1]["hackTime"]) / 100;
bool canHack = (getTime() - lastIncrementTime > hackRate);
bool canHack = (getTime() - lastHackTime > hackRate);
if(withinRange && canHack){
hackStatus++;
+1 -2
View File
@@ -20,10 +20,9 @@ namespace battleship{
private:
int hackStatus = 0;
float hackRange;
vb01::s64 lastIncrementTime = 0;
vb01::s64 lastHackTime = 0;
vb01::Node *hackStatusBackground = nullptr, *hackStatusForeground = nullptr;
void build(Order);
void hack(Order);
};
}
+49
View File
@@ -0,0 +1,49 @@
#include "environment.h"
#include "fxManager.h"
#include "player.h"
#include "unit.h"
#include "game.h"
#include <root.h>
#include <node.h>
#include <material.h>
#include <texture.h>
#include <particleEmitter.h>
namespace battleship{
using namespace std;
using namespace vb01;
static Environment *environment = nullptr;
Environment* Environment::getSingleton(){
if(!environment)
environment = new Environment();
return environment;
}
//TODO use the pos argument from the fx
void Environment::explode(FxManager::Fx *fx, Detonation det, Vector3 pos, int damage, float radius){
FxManager::getSingleton()->addFx(fx);
if(radius == 0) return;
for(Player *pl : Game::getSingleton()->getPlayers()){
for(Unit *un : pl->getUnits()){
float distance = un->getPos().getDistanceFrom(pos);
if(distance < radius){
switch(det){
case Detonation::EXPLOSION:
un->takeDamage(int(damage * (1.f - distance / radius)));
break;
case Detonation::EMP:
un->setCondition(Unit::Condition::EM_JAMMED);
break;
}
}
}
}
}
}
+20
View File
@@ -0,0 +1,20 @@
#ifndef ENVIRONMENT_H
#define ENVIRONMENT_H
#include <vector.h>
#include "fxManager.h"
namespace battleship{
class Environment{
public:
enum class Detonation{EXPLOSION, EMP, CRYO};
static Environment* getSingleton();
static void explode(FxManager::Fx*, Detonation, vb01::Vector3, int = 0, float = 0);
private:
Environment(){}
};
}
#endif
+2 -10
View File
@@ -12,21 +12,13 @@ namespace battleship{
using namespace gameBase;
Extractor::Extractor(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus, ResourceDeposit *rd, Unit::State state) : Structure(player, id, pos, rot, buildStatus, state){
if(!rd){
vector<ResourceDeposit*> deposits;
for(Player *pl : Game::getSingleton()->getPlayers()){
vector<ResourceDeposit*> dep = pl->getResourceDeposits();
deposits.insert(deposits.end(), dep.begin(), dep.end());
}
for(ResourceDeposit *dep : deposits)
if(!rd)
for(ResourceDeposit *dep : Game::getSingleton()->getCivilianPlayer()->getResourceDeposits())
if(dep->getPos().getDistanceFrom(pos) < .001){
deposit = dep;
deposit->setExtractor(this);
break;
}
}
Vector2 size = Vector2(lenHpBar, 10);
ammountBackground = Unit::createBar(Vector2::VEC_ZERO, size, Vector4(0, 0, 0, 1));
+17
View File
@@ -0,0 +1,17 @@
#include "freezer.h"
namespace battleship{
using namespace vb01;
//TODO rename the class to a more generic name
Freezer::Freezer(Player *player, int id, Vector3 pos, Quaternion rot, Unit::State state) : Vehicle(player, id, pos, rot, state){}
void Freezer::attack(Order order){
Vehicle::attack(order);
Unit *target = order.targets[0].unit;
if(target && target->getFreezeStatus() == 100)
removeOrder(0);
}
}
+15
View File
@@ -0,0 +1,15 @@
#ifndef FREEZER_H
#define FREEZER_H
#include "vehicle.h"
namespace battleship{
class Freezer : public Vehicle{
public:
Freezer(Player*, int, vb01::Vector3, vb01::Quaternion, Unit::State);
private:
void attack(Order);
};
}
#endif
+118 -2
View File
@@ -1,14 +1,18 @@
#include "fxManager.h"
#include "gameObject.h"
#include <root.h>
#include <node.h>
#include <model.h>
#include <box.h>
#include <material.h>
#include <vector.h>
#include <particleEmitter.h>
#include <SFML/Audio.hpp>
namespace battleship{
using namespace std;
using namespace vb01;
using namespace sf;
FxManager::Fx::Component::Component(void *c, bool v, s64 dur, vb01::Vector3 p, s64 ot) : comp(c), vfx(v), duration(dur), pos(p), offsetTime(ot) {
if(v) ((vb01::Node*)c)->setVisible(false);
@@ -18,6 +22,118 @@ namespace battleship{
toggleComponents(!re);
}
FxManager::Fx* FxManager::initFx(sol::table fxTbl, Node *baseNode, bool attached, Vector3 cp){
int numComponents = fxTbl.size();
if(numComponents == 0) return nullptr;
vector<FxManager::Fx::Component> fxComponents;
for(int i = 0; i < numComponents; i++){
sol::table compTbl = fxTbl[i + 1];
bool vfx = compTbl["vfx"];
s64 duration = compTbl["duration"], offset = compTbl["offset"].get_or(0);
if(vfx){
sol::table meshTbl = compTbl["mesh"];
string meshPath = "";
Material *mat = nullptr;
Node *flashNode = nullptr;
sol::optional<sol::table> posOpt = compTbl["pos"], rotOpt = compTbl["rot"];
Vector3 compPos = cp;
Quaternion compRot = Quaternion::QUAT_W;
float sc = compTbl["scale"].get_or(1);
if(posOpt != sol::nullopt){
sol::table posTable = compTbl["pos"];
compPos = Vector3(posTable["x"], posTable["y"], posTable["z"]);
}
if(rotOpt != sol::nullopt){
sol::table rotTable = compTbl["rot"];
compRot = Quaternion(rotTable["w"], rotTable["x"], rotTable["y"], rotTable["z"]);
}
sol::optional<string> pathOpt = meshTbl["path"];
sol::optional<int> numPartOpt = meshTbl["numParticles"];
if(pathOpt != sol::nullopt){
mat = new Material(Root::getSingleton()->getLibPath() + "texture");
meshPath = meshTbl["path"];
flashNode = new Model(meshPath);
((Model*)flashNode)->setMaterial(mat);
flashNode->setPosition(compPos);
flashNode->setOrientation(compRot);
flashNode->setScale(Vector3(sc, sc, sc));
}
else if(numPartOpt != sol::nullopt){
mat = new Material(Root::getSingleton()->getLibPath() + "particle");
int numParticles = meshTbl["numParticles"];
ParticleEmitter *pe = new ParticleEmitter(numParticles);
pe->setMaterial(mat);
pe->setLowLife(meshTbl["lowLife"]);
pe->setHighLife(meshTbl["highLife"]);
pe->setSpeed(0);
sol::table sizeTbl = meshTbl["size"];
pe->setSize(Vector2(sizeTbl["x"], sizeTbl["y"]));
flashNode = new Node(compPos + Vector3(0, 2, 0), compRot, Vector3(sc, sc, sc));
flashNode->attachParticleEmitter(pe);
flashNode->lookAt(Vector3::VEC_J, Vector3::VEC_K);
}
else{
mat = new Material(Root::getSingleton()->getLibPath() + "texture");
sol::table sizeTbl = meshTbl["size"];
Box *box = new Box(Vector3(sizeTbl["x"], sizeTbl["y"], 0));
box->setMaterial(mat);
flashNode = new Node(compPos, compRot, Vector3(sc, sc, sc), "laser");
flashNode->attachMesh(box);
}
sol::optional<string> texOpt = meshTbl["texture"];
if(texOpt != sol::nullopt){
string p[]{meshTbl["texture"]};
Texture *tex = new Texture(p, 1, false);
mat->addBoolUniform("texturingEnabled", true);
mat->addTexUniform("diffuseMap[0]", tex, false);
}
else{
sol::table colorTable = meshTbl["color"];
mat->addVec4Uniform("diffuseColor", Vector4(colorTable["x"], colorTable["y"], colorTable["z"], colorTable["a"]));
mat->addBoolUniform("texturingEnabled", false);
}
flashNode->setVisible(false);
Node *parNode = (attached ? baseNode : Root::getSingleton()->getRootNode());
sol::optional<string> parNameOpt = compTbl["parent"];
if(parNameOpt != sol::nullopt){
string parName = compTbl["parent"];
parNode = baseNode->findDescendant(parName, true);
}
parNode->attachChild(flashNode);
fxComponents.push_back(FxManager::Fx::Component((void*)flashNode, vfx, duration, compPos, offset));
}
else{
sf::SoundBuffer *sfxBuffer = new sf::SoundBuffer();
sf::Sound *sfx = GameObject::prepareSfx(sfxBuffer, compTbl["path"]);
fxComponents.push_back(FxManager::Fx::Component((void*)sfx, vfx, duration, Vector3::VEC_ZERO, offset));
}
}
return new FxManager::Fx(fxComponents, attached);
}
void FxManager::Fx::toggleComponents(bool active){
for(Component &component : components){
component.active = active;
+7
View File
@@ -3,6 +3,12 @@
#include <util.h>
#include <solUtil.h>
namespace vb01{
class Node;
}
namespace battleship{
class FxManager{
public:
@@ -24,6 +30,7 @@ namespace battleship{
};
static FxManager* getSingleton();
FxManager::Fx* initFx(sol::table, vb01::Node*, bool, vb01::Vector3 = vb01::Vector3::VEC_ZERO);
void update();
void removeFx(Fx*);
inline void addFx(Fx *fx){fxs.push_back(fx);}
+11 -44
View File
@@ -122,11 +122,11 @@ namespace battleship{
for(Projectile *proj : pl->getProjectiles())
gameObjs.push_back((GameObject*)proj);
for(ResourceDeposit *dep : pl->getResourceDeposits())
gameObjs.push_back((GameObject*)dep);
}
for(ResourceDeposit *dep : civilianPlayer->getResourceDeposits())
gameObjs.push_back((GameObject*)dep);
for(GameObject *obj : gameObjs)
obj->reinit();
}
@@ -137,47 +137,6 @@ namespace battleship{
paused = !paused;
}
void Game::explode(Vector3 pos, int damage, float radius, sf::Sound *explosionSfx){
if(!(damage == 0 || radius == 0))
for(Player *pl : players){
for(Unit *un : pl->getUnits()){
float distance = un->getPos().getDistanceFrom(pos);
if(distance < radius)
un->takeDamage(int(damage * (1.f - distance / radius)));
}
}
Root *root = Root::getSingleton();
const int numFrames = 1;
string p[numFrames];
for(int i = 0; i < numFrames; i++)
p[i] = GameManager::getSingleton()->getPath() + "Textures/Explosion/explosion07.png";
Texture *tex = new Texture(p, numFrames, false);
Material *mat = new Material(root->getLibPath() + "particle");
mat->addTexUniform("tex", tex, true);
ParticleEmitter *pe = new ParticleEmitter(1);
pe->setMaterial(mat);
pe->setLowLife(3);
pe->setHighLife(3);
pe->setSize(10 * Vector2::VEC_IJ);
pe->setSpeed(0);
Node *node = new Node(pos + Vector3(0, 2, 0));
node->attachParticleEmitter(pe);
node->lookAt(Vector3::VEC_J, Vector3::VEC_K);
root->getRootNode()->attachChild(node);
typedef FxManager::Fx Fx;
typedef FxManager::Fx::Component Component;
FxManager::getSingleton()->addFx(new Fx(vector<Component>{Component((void*)node, true, 50), Component((void*)explosionSfx, false, 2500)}));
}
void Game::changeUnitPlayer(Unit *unit, Player *newPlayer){
Player *oldPlayer = unit->getPlayer();
vector<Unit*> &oldPlayerUnits = oldPlayer->getUnits();
@@ -276,4 +235,12 @@ namespace battleship{
return false;
}
vector<Player*> Game::getPlayers(bool civPl){
vector<Player*> playersVec = players;
if(civPl) playersVec.push_back(civilianPlayer);
return playersVec;
}
}
+4 -2
View File
@@ -22,16 +22,17 @@ namespace battleship{
void update();
void togglePause();
void removeAllElements();
void explode(vb01::Vector3, int, float, sf::Sound*);
void changeUnitPlayer(Unit*, Player*);
void initTechnologies();
float calcAbilFromTech(Ability::Type, std::vector<int>, int, int);
bool isUnitUnlocked(std::vector<int>, int);
std::vector<Player*> getPlayers(bool = false);
inline void setDebug(bool d){this->debug = d;}
inline void addPlayer(Player *pl){players.push_back(pl);}
inline bool isDebug(){return debug;}
inline std::vector<Player*>& getPlayers(){return players;}
inline Player* getPlayer(int id){return players[id];}
inline void setCivilianPlayer(Player *pl){this->civilianPlayer = pl;}
inline Player* getCivilianPlayer(){return civilianPlayer;}
inline int getNumPlayers(){return players.size();}
inline Technology getTechnology(int id){return technologies[id];}
inline Ability getAbility(int id){return abilities[id];}
@@ -44,6 +45,7 @@ namespace battleship{
std::vector<Technology> technologies;
std::vector<Ability> abilities;
std::vector<Player*> players;
Player *civilianPlayer = nullptr;
};
}
+23 -5
View File
@@ -45,8 +45,11 @@ namespace battleship{
}
void GameObject::orientAt(Quaternion rotQuat){
model->setOrientation(rotQuat);
rot = rotQuat;
model->setOrientation(rotQuat);
leftVec = model->getGlobalAxis(0);
upVec = model->getGlobalAxis(1);
dirVec = model->getGlobalAxis(2);
}
//TODO remove neccessity to create a material for an invisible mesh
@@ -153,10 +156,25 @@ namespace battleship{
return sfx;
}
void GameObject::initSound(){
deathSfxBuffer = new sf::SoundBuffer();
string sfxPath = generateView()[getGameObjTableName()][id + 1]["deathSfx"];
deathSfx = prepareSfx(deathSfxBuffer, sfxPath);
bool GameObject::pointWithinObj(Vector3 point, float deltaLength, float deltaWidth, bool useHeight, float deltaHeight){
Vector3 pointDir = point - pos;
bool within = true;
float forwAngle = std::min(dirVec.getAngleBetween(pointDir.norm()), (-dirVec).getAngleBetween(pointDir.norm()));
float forwDist = pointDir.getLength() * cos(forwAngle);
within &= (forwDist < .5 * (length + deltaLength));
float leftAngle = std::min(leftVec.getAngleBetween(pointDir.norm()), (-leftVec).getAngleBetween(pointDir.norm()));
float leftDist = pointDir.getLength() * cos(leftAngle);
within &= (leftDist < .5 * (width + deltaWidth));
if(useHeight){
float upAngle = std::min(upVec.getAngleBetween(pointDir.norm()), (-upVec).getAngleBetween(pointDir.norm()));
float upDist = pointDir.getLength() * cos(upAngle);
within &= (upDist < .5 * (height + deltaHeight));
}
return within;
}
string GameObject::getGameObjTableName(){
+3 -4
View File
@@ -23,11 +23,12 @@ namespace battleship{
virtual void reinit();
virtual void update();
virtual void select(){}
void placeAt(vb01::Vector3);
virtual void placeAt(vb01::Vector3);
void orientAt(vb01::Quaternion);
std::string getGameObjTableName();
void updateGameStats(Unit*);
static sf::Sound* prepareSfx(sf::SoundBuffer*, std::string);
bool pointWithinObj(vb01::Vector3, float = 0, float = 0, bool = false, float = 0);
inline vb01::Vector2 getScreenPos(){return screenPos;}
inline vb01::Vector3 getCorner(int i){return corners[i];}
inline bool isSelectable(){return selectable;}
@@ -55,13 +56,11 @@ namespace battleship{
virtual void initHitbox();
virtual void destroyHitbox();
virtual void destroySound();
virtual void initSound();
virtual void initSound(){}
Type type;
int id;
Player *player;
sf::SoundBuffer *deathSfxBuffer;
sf::Sound *deathSfx;
vb01::Model *model = nullptr;
vb01::Node *hitbox = nullptr;
vb01::Vector3 pos = vb01::Vector3(0, 0, 0), upVec = vb01::Vector3(0, 1, 0), dirVec = vb01::Vector3(0, 0, 1), leftVec = vb01::Vector3(1, 0, 0), corners[8];
+45 -27
View File
@@ -2,13 +2,18 @@
#include "player.h"
#include "factory.h"
#include "engineer.h"
#include "submarine.h"
#include "resourceRover.h"
#include "projectile.h"
#include "resourceDeposit.h"
#include "pointDefense.h"
#include "extractor.h"
#include "cruiseMissile.h"
#include "freezer.h"
#include "researchStruct.h"
#include "missile.h"
#include "cruiseMissile.h"
#include "iceSheet.h"
#include "shell.h"
#include "defConfigs.h"
#include <solUtil.h>
@@ -23,41 +28,54 @@ namespace battleship{
Unit* GameObjectFactory::createUnit(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus){
sol::state_view SOL_LUA_VIEW = generateView();
int unitClass = SOL_LUA_VIEW["units"][id + 1]["unitClass"];
bool vehicle = SOL_LUA_VIEW["units"][id + 1]["isVehicle"];
switch((UnitClass)unitClass){
case UnitClass::FORT:
case UnitClass::LAND_FACTORY:
case UnitClass::NAVAL_FACTORY:
return new Factory(player, id, pos, rot, buildStatus, Unit::State::STAND_GROUND);
case UnitClass::POINT_DEFENSE:
return new PointDefense(player, id, pos, rot, buildStatus, Unit::State::STAND_GROUND);
case UnitClass::EXTRACTOR:
return new Extractor(player, id, pos, rot, buildStatus);
case UnitClass::LAB:
return new ResearchStruct(player, id, pos, rot, buildStatus);
case UnitClass::TRADE_CENTER:
case UnitClass::REFINERY:
return new Structure(player, id, pos, rot, buildStatus, Unit::State::STAND_GROUND);
case UnitClass::ENGINEER:
return new Engineer(player, id, pos, rot, Unit::State::STAND_GROUND);
case UnitClass::RESOURCE_ROVER:
return new ResourceRover(player, id, pos, rot, Unit::State::STAND_GROUND);
default:
return new Vehicle(player, id, pos, rot, Unit::State::STAND_GROUND);
}
if(vehicle)
switch((UnitClass)unitClass){
case UnitClass::ENGINEER:
return new Engineer(player, id, pos, rot, Unit::State::STAND_GROUND);
case UnitClass::RESOURCE_ROVER:
return new ResourceRover(player, id, pos, rot, Unit::State::STAND_GROUND);
case UnitClass::SUBMARINE:
return new Submarine(player, id, pos, rot, Unit::State::STAND_GROUND);
case UnitClass::FREEZER:
return new Freezer(player, id, pos, rot, Unit::State::STAND_GROUND);
default:
return new Vehicle(player, id, pos, rot, Unit::State::STAND_GROUND);
}
else
switch((UnitClass)unitClass){
case UnitClass::FORT:
case UnitClass::LAND_FACTORY:
case UnitClass::NAVAL_FACTORY:
return new Factory(player, id, pos, rot, buildStatus, Unit::State::STAND_GROUND);
case UnitClass::POINT_DEFENSE:
return new PointDefense(player, id, pos, rot, buildStatus, Unit::State::STAND_GROUND);
case UnitClass::EXTRACTOR:
return new Extractor(player, id, pos, rot, buildStatus);
case UnitClass::LAB:
return new ResearchStruct(player, id, pos, rot, buildStatus);
case UnitClass::ICE_SHEET:
return new IceSheet(player, id, pos, rot, buildStatus);
default:
return new Structure(player, id, pos, rot, buildStatus, Unit::State::STAND_GROUND);
}
}
Projectile* GameObjectFactory::createProjectile(Unit *unit, int id, Vector3 pos, Quaternion rot){
sol::state_view SOL_LUA_VIEW = generateView();
int projectileClass = SOL_LUA_VIEW["projectiles"][id + 1]["projectileClass"];
Order::Target target = unit->getOrder(0).targets[0];
Vector3 targetPos = (target.unit ? target.unit->getPos() : target.pos);
switch((ProjectileClass)projectileClass){
case ProjectileClass::SHELL:
return new Shell(unit, id, pos, rot);
case ProjectileClass::CRUISE_MISSILE:
{
Order::Target target = unit->getOrder(0).targets[0];
Vector3 targetPos = (target.unit ? target.unit->getPos() : target.pos);
return new CruiseMissile(unit, targetPos, pos, rot);
}
return new CruiseMissile(unit, id, targetPos, pos, rot);
case ProjectileClass::MISSILE:
return new Missile(unit, id, targetPos, pos, rot);
default:
return new Projectile(unit, id, pos, rot);
}
+2 -10
View File
@@ -59,17 +59,9 @@ namespace battleship{
void GameObjectFrameController::snapToObj(GameObjectFrame &s, GameObject::Type type, int unitId, float maxDist){
if(s.getType() == GameObject::Type::UNIT && s.getId() == unitId){
s.status = GameObjectFrame::NOT_PLACEABLE;
vector<Player*> players = Game::getSingleton()->getPlayers();
vector<ResourceDeposit*> deposits;
for(Player *pl : players){
vector<ResourceDeposit*> deps = pl->getResourceDeposits();
for(ResourceDeposit *dep : deps)
deposits.push_back(dep);
}
Player *civPl = Game::getSingleton()->getCivilianPlayer();
for(ResourceDeposit *dep : deposits){
for(ResourceDeposit *dep : civPl->getResourceDeposits()){
Vector3 depPos = dep->getPos();
if(!dep->getExtractor() && s.getPos().getDistanceFrom(depPos) < maxDist){
+27
View File
@@ -0,0 +1,27 @@
#include "iceSheet.h"
#include "player.h"
#include "game.h"
namespace battleship{
using namespace vb01;
using namespace std;
IceSheet::IceSheet(Player *player, int id, Vector3 pos, Quaternion rot, int bldSt) : Structure(player, id, pos, rot, bldSt, Unit::State::STAND_GROUND){}
void IceSheet::update(){
Structure::update();
if(buildStatus < 100)
model->getChild(0)->setScale(.01 * buildStatus * Vector3::VEC_IJK);
for(Player *pl : Game::getSingleton()->getPlayers(true)){
vector<Unit*> icebreakers = pl->getUnitsByClass(UnitClass::ICEBREAKER);
for(Unit *icebreaker : icebreakers)
if(icebreaker->pointWithinObj(pos)){
player->removeUnit(this);
return;
}
}
}
}
+15
View File
@@ -0,0 +1,15 @@
#ifndef ICE_SHEET_H
#define ICE_SHEET_H
#include "structure.h"
namespace battleship{
class IceSheet : public Structure{
public:
IceSheet(Player*, int, vb01::Vector3, vb01::Quaternion, int);
void update();
private:
};
}
#endif
+43 -8
View File
@@ -48,9 +48,8 @@ namespace battleship{
string refIconFile = SOL_STATE_VIEW["refIcon"];
string basePath = GameManager::getSingleton()->getPath() + "Textures/Icons/Minimap/";
for(Player *pl : Game::getSingleton()->getPlayers())
for(ResourceDeposit *rd : pl->getResourceDeposits())
depositIcons.push_back(initIcon(rd->getPos(), basePath + refIconFile));
for(ResourceDeposit *rd : Game::getSingleton()->getCivilianPlayer()->getResourceDeposits())
depositIcons.push_back(initIcon(rd->getPos(), basePath + refIconFile));
string camIconFile = SOL_STATE_VIEW["eyeIcon"];
camIcon = initIcon(Root::getSingleton()->getCamera()->getPosition(), basePath + camIconFile);
@@ -107,7 +106,7 @@ namespace battleship{
Vector3 mapSize = Map::getSingleton()->getMapSize();
vector<pair<Unit*, Vector2>> unitMinimapPos;
for(Player *pl : Game::getSingleton()->getPlayers())
for(Player *pl : Game::getSingleton()->getPlayers(true))
for(Unit *un : pl->getUnits()){
Vector2 coords = Vector2(
int(un->getPos().x / mapSize.x * width),
@@ -383,6 +382,41 @@ namespace battleship{
return spawnPointsTbl.size();
}
//TODO improve for underwater cells
vector<int> Map::getSurroundingCells(Vector3 p, int numRings){
int numHorCells = int(mapSize.x / CELL_SIZE.x);
int numVertCells = int(mapSize.z / CELL_SIZE.z);
int horId = int((.5 * mapSize.x + p.x) / CELL_SIZE.x);
int vertId = int((.5 * mapSize.z + p.z) / CELL_SIZE.z);
vector<int> cellIds;
for(int i = vertId - numRings; i <= vertId + numRings; i++)
for(int j = horId - numRings; j <= horId + numRings; j++)
cellIds.push_back(numHorCells * i + j);
return cellIds;
}
void Map::blockCells(Unit *unit){
vector<int> surroundingCellIds = getSurroundingCells(unit->getPos(), 0);
for(int scid : surroundingCellIds){
if(cells[scid].blockedBy && cells[scid].blockedBy != unit) continue;
bool within = unit->pointWithinObj(cells[scid].pos);
cells[scid].blockedBy = (within ? unit : nullptr);
}
}
void Map::unblockCells(Unit *unit){
vector<int> surroundingCellIds = getSurroundingCells(unit->getPos(), 0);
for(int scid : surroundingCellIds)
if(cells[scid].blockedBy == unit)
cells[scid].blockedBy = nullptr;
}
void Map::loadSpawnPoints(){
sol::state_view SOL_LUA_VIEW = generateView();
int numSpawnPoints = getNumMapSpawnPoints();
@@ -395,15 +429,15 @@ namespace battleship{
//TODO move minimap loading elsewhere
void Map::loadPlayerGameObjects(){
int numPlayers = Game::getSingleton()->getNumPlayers();
vector<Player*> players = Game::getSingleton()->getPlayers(true);
sol::state_view SOL_LUA_VIEW = generateView();
string playerInd = "players";
for(int i = 0; i < numPlayers; i++){
for(int i = 0; i < players.size(); i++){
string resDepInd = "resourceDeposits";
SOL_LUA_VIEW.script("numResourceDeposits = #" + mapTable + "." + playerInd + "[" + to_string(i + 1) + "]." + resDepInd);
int numNpcObjs = SOL_LUA_VIEW["numResourceDeposits"];
Player *player = Game::getSingleton()->getPlayer(i);
Player *player = players[i];
for(int j = 0; j < numNpcObjs; j++){
sol::table npcObjTable = SOL_LUA_VIEW[mapTable][playerInd][i + 1][resDepInd][j + 1];
@@ -587,7 +621,7 @@ namespace battleship{
}
void Map::unloadPlayerObjects(){
for(Player *pl : Game::getSingleton()->getPlayers()){
for(Player *pl : Game::getSingleton()->getPlayers(true)){
while(pl->getNumUnits() > 0){
pl->removeUnit(0);
}
@@ -668,6 +702,7 @@ namespace battleship{
}
//TODO replace search with binary search
//TODO optimize horizontal and vertical id calculcation
int Map::getCellId(Vector3 pos, bool checkUnderwaterCells){
int numHorCells = int(mapSize.x / CELL_SIZE.x), horId = -1;
+4
View File
@@ -39,6 +39,7 @@ namespace battleship{
Type type;
vb01::Vector3 pos;
std::vector<Edge> edges;
Unit *blockedBy = nullptr;
std::vector<int> underWaterCellIds;
Cell(){}
@@ -77,6 +78,9 @@ namespace battleship{
bool isPointWithinTerrainObject(vb01::Vector3, int);
void loadPlayerGameObjects();
int getNumMapSpawnPoints(std::string = "");
std::vector<int> getSurroundingCells(vb01::Vector3, int);
void blockCells(Unit*);
void unblockCells(Unit*);
inline std::string getMapName(){return mapName;}
inline vb01::Node* getNodeParent(){return terrainNode;}
inline vb01::Vector3 getCellSize(){return CELL_SIZE;}
+19
View File
@@ -0,0 +1,19 @@
#include "missile.h"
namespace battleship{
using namespace vb01;
Missile::Missile(Unit *un, int id, Vector3 tp, Vector3 pos, Quaternion rot) :
Projectile(un, id, pos, rot),
targetPos(tp){}
void Missile::update(){
Vector3 targDir = (targetPos - pos).norm();
float angle = targDir.getAngleBetween(dirVec);
float ra = (rotAngle < angle ? rotAngle : angle);
orientAt(Quaternion(ra, dirVec.cross(targDir)) * rot);
Projectile::update();
checkCollision();
}
}
+17
View File
@@ -0,0 +1,17 @@
#ifndef MISSILE_H
#define MISSILE_H
#include "projectile.h"
namespace battleship{
class Missile : public Projectile{
public:
Missile(Unit*, int, vb01::Vector3, vb01::Vector3, vb01::Quaternion);
~Missile(){}
void update();
private:
vb01::Vector3 targetPos;
};
}
#endif
+26 -5
View File
@@ -1,7 +1,7 @@
#include <algorithm>
#include "pathfinder.h"
#include "unit.h"
#include "vehicle.h"
namespace battleship{
using namespace std;
@@ -16,7 +16,7 @@ namespace battleship{
return pathfinder;
}
vector<int> Pathfinder::findPath(vector<Map::Cell> &cells, vector<float> &heuristics, int source, int dest, int unitType){
vector<int> Pathfinder::findPath(vector<Map::Cell> &cells, vector<float> &heuristics, int source, int dest, Vehicle *vehicle){
const int size = cells.size();
u32 *distances = new u32[size];
vector<int> *paths = new vector<int>[size];
@@ -67,10 +67,31 @@ namespace battleship{
}
bool canMoveToStrichCell = true;
bool ship = ((UnitType)unitType == UnitType::UNDERWATER || (UnitType)unitType == UnitType::SEA_LEVEL);
if((ship && cells[vertStrich].type != Map::Cell::WATER) || ((UnitType)unitType == UnitType::LAND && cells[vertStrich].type != Map::Cell::LAND))
continue;
if(vehicle){
UnitType unitType = vehicle->getType();
bool ship = (unitType == UnitType::UNDERWATER || unitType == UnitType::SEA_LEVEL);
Unit *blockingUnit = cells[vertStrich].blockedBy;
bool diffBlockingUnit = (blockingUnit && blockingUnit != vehicle);
if(
(unitType == UnitType::LAND && (diffBlockingUnit || cells[vertStrich].type != Map::Cell::LAND)) ||
(
ship &&
(
cells[vertStrich].type != Map::Cell::WATER ||
(
diffBlockingUnit &&
blockingUnit->getUnitClass() == UnitClass::ICE_SHEET &&
vehicle->getUnitClass() != UnitClass::ICEBREAKER
)
)
)
)
{
continue;
}
}
if(distances[vertStrich] + cells[vertStrich].edges[i].weight < distances[edgeNode]){
distances[edgeNode] = distances[vertStrich] + cells[vertStrich].edges[i].weight;
+3 -1
View File
@@ -8,10 +8,12 @@
#include <util.h>
namespace battleship{
class Vehicle;
class Pathfinder{
public:
static Pathfinder* getSingleton();
std::vector<int> findPath(std::vector<Map::Cell>&, std::vector<float>&, int, int, int = -1);
std::vector<int> findPath(std::vector<Map::Cell>&, std::vector<float>&, int, int, Vehicle* = nullptr);
inline vb01::u32 getImpassibleNodeVal(){return impassibleNodeVal;}
inline void setImpassibleNodeVal(vb01::u32 val){this->impassibleNodeVal = val;}
private:
+2 -2
View File
@@ -66,7 +66,7 @@ namespace battleship{
int src = 0, dest = cells.size() - 1;
vector<float> heur;
vector<int> path = pathfinder->findPath(cells, heur, src, dest, 3);
vector<int> path = pathfinder->findPath(cells, heur, src, dest);
CPPUNIT_ASSERT(path == vector<int>({0, 1, 2, 4, 3, 6}));
int sumPathWeights = calcPathLength(path);
@@ -82,7 +82,7 @@ namespace battleship{
for(int i = 0; i < numIterations; i++){
s64 t0 = getTime();
pathfinder->findPath(cells, heur, src, dest, 3);
pathfinder->findPath(cells, heur, src, dest);
s64 t1 = getTime();
sumTime += t1 - t0;
}
+2
View File
@@ -66,6 +66,8 @@ namespace battleship{
string name = (cpuPlayer ? "CPU player #" + to_string(i) : "Player");
game->addPlayer(new Player(difficulty, faction, team, color, cpuPlayer, i, name));
}
game->setCivilianPlayer(new Player(0, 0, 0, .5 * Vector3::VEC_IJK));
handleLoadingGui(new LoadingAppState(new InGameAppState(mapName), "inGame.lua"));
}
+1 -26
View File
@@ -7,36 +7,11 @@ namespace battleship{
using namespace std;
using namespace gameBase;
PointDefense::PointDefense(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus, Unit::State state) : Structure(player, id, pos, rot, buildStatus, state){
turretDir = dirVec;
}
PointDefense::PointDefense(Player *player, int id, Vector3 pos, Quaternion rot, int buildStatus, Unit::State state) : Structure(player, id, pos, rot, buildStatus, state){}
void PointDefense::attack(Order order){
if(!isComplete()) return;
Unit *targUnit = order.targets[0].unit;
Vector3 targDir = (targUnit ? targUnit->getPos() : order.targets[0].pos) - pos;
if(targDir.getLength() > weapons[0]->getMaxRange()){
removeOrder(0);
return;
}
float angleToTarg = targDir.norm().getAngleBetween(turretDir);
if(angleToTarg > .05)
rotateTurret(calculateRotation(targDir.norm(), angleToTarg, .1));
else
weapons[0]->fire(order);
Unit::attack(order);
}
void PointDefense::rotateTurret(float angle){
string nodeName = generateView()[GameObject::getGameObjTableName()][id + 1]["turretNode"];
Node *turretNode = model->findDescendant(nodeName, true);
Quaternion rotQuat = Quaternion(angle, Vector3::VEC_J);
turretNode->setOrientation(rotQuat * turretNode->getOrientation());
turretDir = rotQuat * turretDir;
}
}
-3
View File
@@ -8,10 +8,7 @@ namespace battleship{
public:
PointDefense(Player*, int, vb01::Vector3, vb01::Quaternion, int, Unit::State);
private:
vb01::Vector3 turretDir;
void attack(Order);
void rotateTurret(float);
};
}
+25 -23
View File
@@ -10,6 +10,7 @@
#include "unit.h"
#include "util.h"
#include "player.h"
#include "environment.h"
#include "projectile.h"
#include "defConfigs.h"
#include "resourceDeposit.h"
@@ -43,7 +44,6 @@ namespace battleship{
initProperties();
initModel();
initSound();
GameObject::reinit();
}
@@ -64,25 +64,23 @@ namespace battleship{
rotAngle = projTable["rotAngle"].get_or(0.0);
}
void Projectile::initSound(){
explosionSfxBuffer = new sf::SoundBuffer();
string sfxPath = generateView()[GameObject::getGameObjTableName()][id + 1]["explosion"]["sfx"];
explosionSfx = GameObject::prepareSfx(explosionSfxBuffer, sfxPath);
}
void Projectile::update() {
GameObject::update();
placeAt(pos + speed * dirVec);
if(!remove){
checkSurfaceCollision();
if(remove) return;
checkUnitCollision();
}
}
void Projectile::detonate(Unit *target){
if(target) target->takeDamage(directHitDamage);
sol::table tbl = generateView()[getGameObjTableName()][id + 1]["explosion"];
FxManager::Fx *fx = FxManager::getSingleton()->initFx(tbl["fx"], model, false, pos);
Environment::explode(fx, (Environment::Detonation)tbl["detonation"], pos, tbl["damage"], tbl["radius"]);
remove = true;
}
void Projectile::checkUnitCollision(){
vector<Player*> players = Game::getSingleton()->getPlayers();
vector<Player*> players = Game::getSingleton()->getPlayers(true);
vector<Unit*> targetUnits;
vector<Node*> targetNodes;
@@ -98,22 +96,26 @@ namespace battleship{
vector<RayCaster::CollisionResult> results = RayCaster::cast(pos, dirVec, targetNodes, rayLength);
if(!results.empty()){
if(!results.empty())
for(int i = 0; i < targetNodes.size(); i++)
if(targetNodes[i]->getMesh(0) == results[0].mesh){
targetUnits[i]->takeDamage(directHitDamage);
Game::getSingleton()->explode(pos, explosionDamage, explosionRadius, explosionSfx);
remove = true;
}
}
if(targetNodes[i]->getMesh(0) == results[0].mesh)
detonate(targetUnits[i]);
}
void Projectile::checkSurfaceCollision(){
Map *map = Map::getSingleton();
int cellId = map->getCellId(pos, false);
if(map->getCells()[cellId].type == Map::Cell::LAND)
remove = true;
if((pos + dirVec * rayLength).y <= map->getCells()[cellId].pos.y)
detonate();
}
void Projectile::checkCollision(){
if(!remove){
checkSurfaceCollision();
if(remove) return;
checkUnitCollision();
}
}
void Projectile::debug(){
+9 -8
View File
@@ -1,20 +1,20 @@
#ifndef PROJECTILE_H
#define PROJECTILE_H
#include <SFML/Audio.hpp>
#include "gameObject.h"
#include "fxManager.h"
#include <algorithm>
#include <SFML/Audio.hpp>
namespace vb01{
class Node;
}
namespace battleship {
enum class ProjectileClass{CRUISE_MISSILE, TORPEDO};
class Unit;
enum class ProjectileClass{SHELL, CRUISE_MISSILE, MISSILE, TORPEDO};
class Projectile : public GameObject{
public:
Projectile(Unit*, int, vb01::Vector3, vb01::Quaternion);
@@ -23,17 +23,18 @@ namespace battleship {
virtual void debug();
private:
void initProperties();
void initSound();
void checkCollision();
void detonate(Unit *u = nullptr);
protected:
virtual void reinit();
virtual void checkUnitCollision();
virtual void checkSurfaceCollision();
void checkCollision();
float speed, rayLength, explosionRadius, rotAngle;
int directHitDamage, explosionDamage;
vb01::Vector3 initPos;
Unit *unit = nullptr;
FxManager::Fx *explosionFx = nullptr;
float speed, rayLength, explosionRadius, rotAngle;
int directHitDamage, explosionDamage;
sf::SoundBuffer *shotSfxBuffer, *explosionSfxBuffer;
sf::Sound *shotSfx = nullptr, *explosionSfx = nullptr;
};
+37
View File
@@ -0,0 +1,37 @@
#include "shell.h"
#include <solUtil.h>
#include <cmath>
namespace battleship{
using namespace std;
using namespace vb01;
using namespace gameBase;
Shell::Shell(Unit *un, int id, Vector3 pos, Quaternion rot) :
Projectile(un, id, pos, rot),
initTime(getTime()),
initDir(dirVec) {}
void Shell::update(){
float currTime = float(getTime() - initTime) / 1000;
if(currTime == 0) return;
const float G = generateView()["G"];
float angle = initDir.getAngleBetween(Vector3(initDir.x, 0, initDir.z).norm());
dirVec = (
pos +
speed * currTime * cos(angle) * Vector3(initDir.x, 0, initDir.z).norm() +
(currTime * speed * sin(angle) - G * currTime * currTime) * Vector3::VEC_J -
pos
).norm();
upVec = Quaternion(-PI / 2, leftVec) * dirVec;
model->lookAt(dirVec, upVec);
Projectile::update();
checkCollision();
}
}
+19
View File
@@ -0,0 +1,19 @@
#ifndef SHELL_H
#define SHELL_H
#include "projectile.h"
#include <util.h>
namespace battleship{
class Shell : public Projectile{
public:
Shell(Unit*, int, vb01::Vector3, vb01::Quaternion);
void update();
private:
vb01::s64 initTime;
vb01::Vector3 initDir;
};
}
#endif
+1 -1
View File
@@ -17,9 +17,9 @@ namespace battleship{
inline int getBuildStatus(){return buildStatus;}
inline void incrementBuildStatus(){buildStatus++;}
private:
int buildStatus = 0;
protected:
vb01::Node *buildStatusBackground = nullptr, *buildStatusForeground = nullptr;
int buildStatus = 0;
};
}
+27
View File
@@ -0,0 +1,27 @@
#include "submarine.h"
#include "map.h"
#include <quad.h>
namespace battleship{
using namespace vb01;
using namespace std;
Submarine::Submarine(Player *player, int id, Vector3 pos, Quaternion rot, Unit::State state) : Vehicle(player, id, pos, rot, state){}
bool Submarine::validateLaunchOrder(){
if(!Unit::validateLaunchOrder()) return false;
vector<Node*> terrainNodes = Map::getSingleton()->getNodeParent()->getChildren();
for(int i = 1; i < terrainNodes.size(); i++){
Vector3 wbPos = terrainNodes[i]->getPosition();
Vector3 size = ((Quad*)terrainNodes[i]->getMesh(0))->getSize();
if(fabs(wbPos.x - pos.x) < .5 * size.x && fabs(wbPos.z - pos.z) < .5 * size.y && pos.y - wbPos.y > -.1)
return true;
}
return false;
}
}
+15
View File
@@ -0,0 +1,15 @@
#ifndef SUBMARINE_H
#define SUBMARINE_H
#include "vehicle.h"
namespace battleship{
class Submarine : public Vehicle{
public:
Submarine(Player*, int, vb01::Vector3, vb01::Quaternion, Unit::State);
private:
bool validateLaunchOrder();
};
}
#endif
+55 -286
View File
@@ -13,9 +13,12 @@
#include <ext.hpp>
#include "unit.h"
#include "weapon.h"
#include "util.h"
#include "game.h"
#include "map.h"
#include "vehicle.h"
#include "environment.h"
#include "gameObjectFactory.h"
#include "activeGameState.h"
#include "gameManager.h"
@@ -30,264 +33,9 @@ using namespace gameBase;
using namespace std;
namespace battleship{
string Unit::Weapon::LASER_FLAG = "laser";
Unit::Weapon::Weapon(Unit *u, sol::table unitTable, int wid) :
unit(u),
id(wid),
type((Weapon::Type)unitTable["weapons"][wid + 1]["type"]),
rateOfFire(unitTable["weapons"][wid + 1]["rateOfFire"]),
damage(unitTable["weapons"][wid + 1]["damage"].get_or(0))
{
sol::table weaponTable = unitTable["weapons"][wid + 1];
maxRange = weaponTable["maxRange"];
initProjectileData(weaponTable);
fireFx = initFx(weaponTable, "fireFx", true);
if(fireFx) FxManager::getSingleton()->addFx(fireFx);
}
void Unit::Weapon::initProjectileData(sol::table weaponTable){
string projTableKey = "projectile";
sol::optional<sol::table> proj = weaponTable[projTableKey];
if(proj != sol::nullopt){
projId = weaponTable[projTableKey]["id"];
sol::table projTable = generateView()["projectiles"];
ProjectileClass pc = (ProjectileClass)projTable[projId + 1]["projectileClass"];
if(pc == ProjectileClass::CRUISE_MISSILE){
minRange = 0;
float rotAngle = projTable[projId + 1]["rotAngle"];
float speed = projTable[projId + 1]["speed"];
float base = PI / 2, alpha = 0;
while(base - alpha > .001){
minRange += speed * sin(alpha);
alpha += (base - alpha > rotAngle ? rotAngle : base - alpha);
}
minRange *= 2;
}
sol::table posTable = weaponTable[projTableKey]["pos"];
projPos = Vector3(posTable["x"], posTable["y"], posTable["z"]);
sol::table rotTable = weaponTable[projTableKey]["rot"];
projRot = Quaternion(rotTable["w"], rotTable["x"], rotTable["y"], rotTable["z"]);
}
}
//TODO implement node child search by name
FxManager::Fx* Unit::Weapon::initFx(sol::table weaponTable, string fxKey, bool attached){
sol::optional<sol::table> fxOpt = weaponTable[fxKey];
if(fxOpt == sol::nullopt)
return nullptr;
sol::table fxTbl = weaponTable[fxKey];
int numComponents = fxTbl.size();
if(numComponents == 0)
return nullptr;
vector<FxManager::Fx::Component> fxComponents;
for(int i = 0; i < numComponents; i++){
sol::table compTbl = fxTbl[i + 1];
bool vfx = compTbl["vfx"];
s64 duration = compTbl["duration"], offset = compTbl["offset"].get_or(0);
if(vfx){
sol::table meshTbl = compTbl["mesh"];
string meshPath = "";
Material *mat = nullptr;
Node *flashNode = nullptr;
sol::optional<sol::table> posOpt = compTbl["pos"], rotOpt = compTbl["rot"];
Vector3 compPos = Vector3::VEC_ZERO;
Quaternion compRot = Quaternion::QUAT_W;
float sc = compTbl["scale"].get_or(1);
if(posOpt != sol::nullopt){
sol::table posTable = compTbl["pos"];
compPos = Vector3(posTable["x"], posTable["y"], posTable["z"]);
}
if(rotOpt != sol::nullopt){
sol::table rotTable = compTbl["rot"];
compRot = Quaternion(rotTable["w"], rotTable["x"], rotTable["y"], rotTable["z"]);
}
sol::optional<string> pathOpt = meshTbl["path"];
sol::optional<int> numPartOpt = meshTbl["numParticles"];
if(pathOpt != sol::nullopt){
mat = new Material(Root::getSingleton()->getLibPath() + "texture");
meshPath = meshTbl["path"];
flashNode = new Model(meshPath);
((Model*)flashNode)->setMaterial(mat);
flashNode->setPosition(compPos);
flashNode->setOrientation(compRot);
flashNode->setScale(Vector3(sc, sc, sc));
}
else if(numPartOpt != sol::nullopt){
mat = new Material(Root::getSingleton()->getLibPath() + "particle");
int numParticles = meshTbl["numParticles"];
ParticleEmitter *pe = new ParticleEmitter(numParticles);
pe->setMaterial(mat);
pe->setLowLife(meshTbl["lowLife"]);
pe->setHighLife(meshTbl["highLife"]);
pe->setSpeed(0);
sol::table sizeTbl = meshTbl["size"];
pe->setSize(Vector2(sizeTbl["x"], sizeTbl["y"]));
flashNode = new Node(compPos, compRot, Vector3(sc, sc, sc));
flashNode->attachParticleEmitter(pe);
flashNode->lookAt(Vector3::VEC_J, Vector3::VEC_K);
}
else{
mat = new Material(Root::getSingleton()->getLibPath() + "texture");
sol::table sizeTbl = meshTbl["size"];
Box *box = new Box(Vector3(sizeTbl["x"], sizeTbl["y"], 0));
box->setMaterial(mat);
flashNode = new Node(compPos, compRot, Vector3(sc, sc, sc), LASER_FLAG);
flashNode->attachMesh(box);
}
sol::optional<string> texOpt = meshTbl["texture"];
if(texOpt != sol::nullopt){
string p[]{meshTbl["texture"]};
Texture *tex = new Texture(p, 1, false);
mat->addBoolUniform("texturingEnabled", true);
mat->addTexUniform("diffuseMap[0]", tex, false);
}
else{
sol::table colorTable = meshTbl["color"];
mat->addVec4Uniform("diffuseColor", Vector4(colorTable["x"], colorTable["y"], colorTable["z"], colorTable["a"]));
mat->addBoolUniform("texturingEnabled", false);
}
flashNode->setVisible(false);
Node *parNode = (attached ? unit->getModel() : Root::getSingleton()->getRootNode());
sol::optional<string> parOpt = compTbl["parent"];
if(parOpt != sol::nullopt){
vector<Node*> descendants;
unit->getModel()->getDescendants(descendants);
string parName = compTbl["parent"];
parNode = nullptr;
for(Node *desc : descendants)
if(desc->getName() == parName){
parNode = desc;
break;
}
}
parNode->attachChild(flashNode);
fxComponents.push_back(FxManager::Fx::Component((void*)flashNode, vfx, duration, compPos, offset));
}
else{
sf::SoundBuffer *sfxBuffer = new sf::SoundBuffer();
sf::Sound *sfx = GameObject::prepareSfx(sfxBuffer, compTbl["path"]);
fxComponents.push_back(FxManager::Fx::Component((void*)sfx, vfx, duration, Vector3::VEC_ZERO, offset));
}
}
return new FxManager::Fx(fxComponents, attached);
}
Unit::Weapon::~Weapon(){
FxManager *fm = FxManager::getSingleton();
if(fireFx) fm->removeFx(fireFx);
}
void Unit::Weapon::update(){}
void Unit::Weapon::useFx(FxManager::Fx *fx, Vector3 targPos, bool fire){
if(fx && !fire)
FxManager::getSingleton()->addFx(fx);
else if(!fx)
return;
fx->toggleComponents(true);
Vector3 plCol = unit->getPlayer()->getColor();
for(int i = 0; i < fx->components.size(); i++){
FxManager::Fx::Component &comp = fx->components[i];
if(comp.vfx){
if(fire && ((Node*)comp.comp)->getName() == LASER_FLAG){
Vector3 initPos = unit->getPos(), laserDir = targPos - initPos;
float targDist = laserDir.getLength();
float angle = unit->getDirVec().getAngleBetween(laserDir);
Vector3 crossProd = unit->getDirVec().cross(laserDir);
Node *compNode = (Node*)comp.comp;
compNode->setOrientation(Quaternion(angle, crossProd) * compNode->getOrientation());
Box *box = (Box*)compNode->getMesh(0);
Vector3 size = box->getSize();
box->setSize(Vector3(size.x, size.y, targDist));
box->updateVerts(box->getMeshBase());
box->getMaterial()->setVec4Uniform("diffuseColor", Vector4(plCol.x, plCol.y, plCol.z, 1));
compNode->setPosition(comp.pos + .5 * targDist * Vector3::VEC_K);
}
else if(!fire)
((Node*)comp.comp)->setPosition(targPos);
}
}
}
void Unit::Weapon::fire(Order order){
if(!canFire()) return;
Unit *targetUnit = order.targets[0].unit;
Vector3 targPos = (targetUnit ? targetUnit->getPos() : order.targets[0].pos);
if(fireFx) useFx(fireFx, targPos, true);
if(projId == -1){
sol::table weaponTbl = generateView()["units"][unit->getId() + 1]["weapons"][id + 1];
if(targetUnit){
targetUnit->takeDamage(damage);
unit->updateGameStats(targetUnit);
useFx(initFx(weaponTbl, "unitHitFx", false), targPos, false);
}
else{
Map *map = Map::getSingleton();
Map::Cell::Type cellType = map->getCells()[map->getCellId(targPos)].type;
string fxKey = (cellType == Map::Cell::Type::LAND ? "landHitFx" : "waterHitFx");
useFx(initFx(weaponTbl, fxKey, false), targPos, false);
}
}
else{
Vector3 leftVec = unit->getLeftVec();
Vector3 upVec = unit->getUpVec();
Vector3 dirVec = unit->getDirVec();
Vector3 p = unit->getPos() + leftVec * projPos.x + upVec * projPos.y + dirVec * projPos.z;
Quaternion r = unit->getRot() * projRot;
unit->getPlayer()->addProjectile(GameObjectFactory::createProjectile(unit, projId, p, r));
}
lastFireTime = getTime();
}
Unit::Unit(Player *player, int id, Vector3 pos, Quaternion rot, State st) : GameObject(GameObject::Type::UNIT, id, player, pos, rot), state(st){
selectable = true;
restartTime = 2000;
Unit::initProperties();
initModel();
@@ -303,6 +51,7 @@ namespace battleship{
}
Unit::~Unit() {
Map::getSingleton()->unblockCells(this);
removeBar(hpBackgroundNode);
removeBar(hpForegroundNode);
destroyWeapons();
@@ -390,15 +139,22 @@ namespace battleship{
sol::table unitTable = SOL_STATE_VIEW[objType][id + 1];
string tblName = "weapons";
sol::optional<sol::table> wt = unitTable[tblName];
sol::optional<sol::table> weaponsTblOpt = unitTable[tblName];
if(wt != sol::nullopt){
if(weaponsTblOpt != sol::nullopt){
string varName = "numWeapons";
SOL_STATE_VIEW.script(varName + " = #" + objType + "[" + to_string(id + 1) + "]." + tblName);
int numWeapons = SOL_STATE_VIEW[varName];
for(int i = 0; i < numWeapons; i++)
weapons.push_back(new Weapon(this, unitTable, i));
for(int i = 0; i < numWeapons; i++){
int wt = 0;
sol::optional<int> wtOpt = unitTable[tblName][i + 1]["type"];
if(wtOpt != sol::nullopt) wt = unitTable[tblName][i + 1]["type"];
Weapon *weapon = ((Weapon::Type)wt == Weapon::Type::FREEZER ? new CryoGun(this, unitTable, i) : new Weapon(this, unitTable, i));
weapons.push_back(weapon);
}
}
}
@@ -492,15 +248,7 @@ namespace battleship{
}
void Unit::launch(Order order){
for(Weapon *weapon : weapons){
Vector3 targPos = Vector3(order.targets[0].pos.x, pos.y, order.targets[0].pos.z);
if(weapon->getProjectileId() == 0 && weapon->getMinRange() < targPos.getDistanceFrom(pos)){
weapon->fire(order);
break;
}
}
getWeaponsByOrder(Order::TYPE::LAUNCH)[0]->fire(order);
removeOrder(0);
}
@@ -552,6 +300,11 @@ namespace battleship{
void Unit::update() {
GameObject::update();
if(condition == Condition::EM_JAMMED && getTime() - lastJamTime > restartTime)
condition = Condition::ABLE;
if(freezeStatus >= 100) condition = Condition::FROZEN;
ActiveGameState *activeState = (ActiveGameState*)GameManager::getSingleton()->getStateManager()->getAppStateByType(AppStateType::ACTIVE_STATE);
Player *mainPlayer = (activeState ? activeState->getPlayer() : nullptr);
@@ -572,7 +325,9 @@ namespace battleship{
displayUnitStats(slot.foreground, slot.background, (int)((bool)slot.vehicle), (int)true, renderSelectables, slot.offset);
if (health <= DEATH_HP){
Game::getSingleton()->explode(pos, 0, 0, deathSfx);
sol::table tbl = generateView()[getGameObjTableName()][id + 1]["deathFx"];
FxManager::Fx *fx = FxManager::getSingleton()->initFx(tbl, model, false, pos);
Environment::explode(fx, Environment::Detonation::EXPLOSION, pos);
remove = true;
}
@@ -601,6 +356,8 @@ namespace battleship{
//TODO remove order argument from action methods
void Unit::executeOrders() {
if(condition != Condition::ABLE) return;
if (orders.size() > 0) {
Order order = orders[0];
@@ -681,14 +438,20 @@ namespace battleship{
removeOrder(0);
}
vector<Weapon*> attackWeapons = getWeaponsByOrder(Order::TYPE::ATTACK);
Vector3 targPos = (order.targets[0].unit ? order.targets[0].unit->getPos() : order.targets[0].pos);
for(Weapon *weapon : attackWeapons)
weapon->trackTarget(targPos);
}
bool Unit::validateOrder(Order order){
switch (order.type) {
case Order::TYPE::ATTACK:
return !weapons.empty();
return !getWeaponsByOrder(Order::TYPE::ATTACK).empty();
case Order::TYPE::BUILD:
return unitClass == UnitClass::ENGINEER;
return (unitClass == UnitClass::ENGINEER || unitClass == UnitClass::FREEZER);
case Order::TYPE::PATROL:
case Order::TYPE::MOVE:
return vehicle;
@@ -697,30 +460,28 @@ namespace battleship{
case Order::TYPE::EJECT:
return !garrisonSlots.empty();
case Order::TYPE::LAUNCH:
{
for(Weapon *weapon : weapons)
if(weapon->getType() == Weapon::Type::CRUISE_MISSILE)
return true;
return false;
}
return validateLaunchOrder();
case Order::TYPE::SUPPLY:
case Order::TYPE::LOAD:
case Order::TYPE::UNLOAD:
return unitClass == UnitClass::RESOURCE_ROVER;
case Order::TYPE::HACK:
{
for(Weapon *weapon : weapons)
if(weapon->getType() == Weapon::Type::CRUISE_MISSILE)
return true;
return false;
}
return !getWeaponsByOrder(Order::TYPE::HACK).empty();
default:
return false;
}
}
vector<Weapon*> Unit::getWeaponsByOrder(Order::TYPE type){
vector<Weapon*> weaps;
for(Weapon *w : weapons)
if(w->getOrderType() == type)
weaps.push_back(w);
return weaps;
}
void Unit::receiveOrder(Order order, bool add) {
if(!validateOrder(order)) return;
@@ -752,6 +513,14 @@ namespace battleship{
}
}
//TODO select only the closest cells based on unit size
void Unit::placeAt(Vector3 p){
//check twice in case the unit is warped over a long distance
Map::getSingleton()->blockCells(this);
GameObject::placeAt(p);
Map::getSingleton()->blockCells(this);
}
vector<Player*> Unit::getSelectingPlayers(){
vector<Player*> players = Game::getSingleton()->getPlayers(), selectingPlayers;
+23 -36
View File
@@ -27,6 +27,7 @@ namespace vb01{
namespace battleship{
class Player;
class Weapon;
class Unit;
class Vehicle;
class Structure;
@@ -74,6 +75,9 @@ namespace battleship{
CRUISER,
CARRIER,
SUBMARINE,
ICEBREAKER,
FREEZER,
EMP_BOAT,
LAND_FACTORY,
NAVAL_FACTORY,
TRADE_CENTER,
@@ -81,43 +85,12 @@ namespace battleship{
POINT_DEFENSE,
EXTRACTOR,
REFINERY,
FORT
FORT,
ICE_SHEET
};
class Unit : public GameObject{
public:
class Weapon{
public:
enum class Type{HITSCAN, SHELL, TORPEDO, CRUISE_MISSILE, HACK};
Weapon(Unit*, sol::table, int);
~Weapon();
virtual void update();
virtual void fire(Order);
inline Type getType(){return type;}
inline int getProjectileId(){return projId;}
inline int getRateOfFire(){return rateOfFire;}
inline int getDamage(){return damage;}
inline int getMinRange(){return minRange;}
inline int getMaxRange(){return maxRange;}
inline Unit* getUnit(){return unit;}
private:
Type type;
int id, projId = -1, rateOfFire, damage = 0;
float minRange = 0, maxRange;
vb01::Vector3 projPos;
vb01::Quaternion projRot;
vb01::s64 lastFireTime = 0;
Unit *unit = nullptr;
FxManager::Fx *fireFx = nullptr;
static std::string LASER_FLAG;
void initProjectileData(sol::table);
FxManager::Fx* initFx(sol::table, std::string, bool);
void useFx(FxManager::Fx*, vb01::Vector3, bool);
inline bool canFire(){return vb01::getTime() - lastFireTime > rateOfFire;}
};
struct GarrisonSlot{
Vehicle *vehicle = nullptr;
int category;
@@ -129,6 +102,7 @@ namespace battleship{
enum class Armor {CAST, COMBINED, MECHANIC, SHELL, STEEL};
enum class State {CHASE, STAND_GROUND, HOLD_FIRE};
enum class Condition{ABLE, FROZEN, EM_JAMMED};
Unit(Player*, int, vb01::Vector3, vb01::Quaternion, State = State::STAND_GROUND);
virtual ~Unit();
@@ -154,7 +128,7 @@ namespace battleship{
inline float getLineOfSight() {return lineOfSight;}
inline UnitType getType() {return type;}
inline UnitClass getUnitClass() {return unitClass;}
inline void takeDamage(int damage) {health -= damage;}
inline void takeDamage(int damage) {health -= damage * (1 + (freezeDmgFactor - 1) * freezeStatus * .01f);}
inline int getPlayerId() {return playerId;}
inline int getHealth(){return health;}
inline int getDeathHp(){return DEATH_HP;}
@@ -165,6 +139,14 @@ namespace battleship{
inline std::string getGuiScreen(){return guiScreen;}
inline BuildableUnit getBuildableUnit(int i){return buildableUnits[i];}
inline vb01::Node* getLosLightNode(){return losLightNode;}
inline void setFreezeStatus(int fs){this->freezeStatus = std::clamp(fs, 0, 100);}
inline int getFreezeStatus(){return freezeStatus;}
inline Condition getCondition(){return condition;}
inline void setCondition(Condition cond){
this->condition = cond;
if(cond == Condition::EM_JAMMED) lastJamTime = vb01::getTime();
}
private:
void renderOrderLine(bool);
void updateScreenCoordinates();
@@ -178,13 +160,14 @@ namespace battleship{
sf::Sound *selectionSfx = nullptr;
vb01::Node *hpBackgroundNode = nullptr, *hpForegroundNode = nullptr, *losLightNode = nullptr;
bool vehicle;
Condition condition = Condition::ABLE;
protected:
UnitClass unitClass;
UnitType type;
std::vector<Order> orders;
std::string guiScreen = "";
int health = 0, maxHealth, playerId, lenHpBar = 200;
vb01::s64 orderLineDispTime = 0, lastFireTime = 0;
int health = 0, maxHealth, playerId, lenHpBar = 200, freezeStatus = 0, freezeDmgFactor = 10, restartTime;
vb01::s64 orderLineDispTime = 0, lastFireTime = 0, lastJamTime = 0;
float lineOfSight;
std::vector<Armor> armorTypes;
std::vector<Weapon*> weapons;
@@ -192,8 +175,10 @@ namespace battleship{
std::vector<BuildableUnit> buildableUnits;
State state = State::STAND_GROUND;
void placeAt(vb01::Vector3);
std::vector<Player*> getSelectingPlayers();
void removeOrder(int);
virtual bool validateLaunchOrder(){return !getWeaponsByOrder(Order::TYPE::LAUNCH).empty();}
virtual bool validateGarrisonOrder(Order){return false;}
virtual void targetUnitsAutomatically();
virtual void reinit();
@@ -211,10 +196,12 @@ namespace battleship{
virtual void launch(Order);
virtual void handleResources(Order){}
virtual void hack(Order){}
virtual void freeze(Order){}
float calculateRotation(vb01::Vector3, float, float);
void removeBar(vb01::Node*);
vb01::Node* createBar(vb01::Vector2, vb01::Vector2, vb01::Vector4);
void displayUnitStats(vb01::Node*, vb01::Node*, int, int, bool, vb01::Vector2 offset = vb01::Vector2::VEC_ZERO);
std::vector<Weapon*> getWeaponsByOrder(Order::TYPE);
inline std::vector<Armor> getArmorTypes(){return armorTypes;}
};
}
+51 -13
View File
@@ -7,8 +7,10 @@
#include <model.h>
#include <quaternion.h>
#include "vehicle.h"
#include "pathfinder.h"
#include "structure.h"
#include "vehicle.h"
#include "weapon.h"
#include "player.h"
#include "game.h"
#include "map.h"
@@ -246,6 +248,7 @@ namespace battleship{
}
//TODO allow ships to attack land targets and vice versa
//TODO recursively search for vacant dest cell neibourghss
void Vehicle::preparePathpoints(Order &order, Vector3 destPos, bool appendDestPos){
removeAllPathpoints();
@@ -263,12 +266,22 @@ namespace battleship{
if(type != UnitType::UNDERWATER && fabs(destPos.y - cells[dest].pos.y) > .1) return;
if(cells[dest].blockedBy){
vector<int> surrCellIds = map->getSurroundingCells(cells[dest].pos, 1);
for(int scid : surrCellIds)
if(!cells[scid].blockedBy){
dest = scid;
break;
}
}
vector<float> heuristics;
for(Map::Cell &cell : cells)
heuristics.push_back(145 * (cells[dest].pos.getDistanceFrom(cell.pos)));
vector<int> path = Pathfinder::getSingleton()->findPath(cells, heuristics, source, dest, (int)type);
vector<int> path = Pathfinder::getSingleton()->findPath(cells, heuristics, source, dest, this);
bool pathTruncated = false;
for(int i = 0; i < path.size(); i++){
@@ -316,12 +329,19 @@ namespace battleship{
Unit::attack(order);
int currNumOrders = orders.size();
if(weapons.empty() || prevNumOrders != currNumOrders) return;
if(prevNumOrders != currNumOrders) return;
Order::Target target = order.targets[0];
Vector3 targVec = (target.unit ? target.unit->getPos() : target.pos) - pos;
float distToTarg = targVec.getLength();
Weapon *weapon = weapons[0];
vector<Weapon*> attackWeapons = getWeaponsByOrder(Order::TYPE::ATTACK);
Weapon *weapon = attackWeapons[0];
for(Weapon *w : attackWeapons)
if(w->getMaxRange() > weapon->getMaxRange())
weapon = w;
float minDist = weapon->getMaxRange();
if(order.playerAssigned || (!order.playerAssigned && state == Unit::State::CHASE)){
@@ -334,17 +354,35 @@ namespace battleship{
removeOrder(0);
return;
}
float angleToTarg = targVec.norm().getAngleBetween(dirVec);
if(distToTarg <= weapon->getMaxRange()){
if(angleToTarg <= anglePrecision)
weapon->fire(order);
else if(angleToTarg > anglePrecision)
turn(calculateRotation(targVec.norm(), angleToTarg, maxTurnAngle));
}
}
void Vehicle::build(Order order){
if(pathPoints.empty()){
if(!order.targets[0].unit)
player->addUnit(order.targets[0].unit);
else {
Structure *structure = (Structure*)order.targets[0].unit;
sol::table targTable = generateView()["units"][structure->getId()];
int costRate = (int)targTable["cost"] / 100, buildRate = (int)targTable["buildTime"] / 100;
if(structure->getBuildStatus() < 100 && player->getResource(ResourceType::REFINEDS) >= costRate && getTime() - lastBuildTime > buildRate){
structure->incrementBuildStatus();
player->updateResource(ResourceType::REFINEDS, -costRate, true);
lastBuildTime = getTime();
}
else if(structure->getBuildStatus() >= 100){
removeOrder(0);
player->incStructuresBuilt();
}
}
}
else{
navigate(0.5 * Map::getSingleton()->getCellSize().x);
if(type == UnitType::LAND)
alignToSurface();
}
}
void Vehicle::select(){
if(!garrisonable)
+3 -1
View File
@@ -23,6 +23,7 @@ namespace battleship{
float speed, maxTurnAngle, anglePrecision;
vb01::Material *debugMat = nullptr;
std::vector<vb01::Node*> debugPathPoints;
vb01::s64 lastBuildTime = 0;
inline int getNextPatrolPointId(int numPoints) {return patrolPointId == numPoints - 1 ? 0 : patrolPointId + 1;}
bool validateGarrisonOrder(Order);
@@ -34,6 +35,7 @@ namespace battleship{
void addPathpoint(vb01::Vector3);
void removePathpoint(int = 0);
void removeAllPathpoints();
void build(Order);
void select();
void reinit();
protected:
@@ -44,7 +46,7 @@ namespace battleship{
void navigateToTarget(float);
void preparePathpoints(Order&, vb01::Vector3, bool = false);
void alignToSurface();
void attack(Order);
virtual void attack(Order);
void garrison(Order);
void patrol(Order);
virtual void initProperties();
+248
View File
@@ -0,0 +1,248 @@
#include <node.h>
#include <box.h>
#include <particleEmitter.h>
#include "map.h"
#include "weapon.h"
#include "player.h"
#include "fxManager.h"
#include "gameObjectFactory.h"
#include "projectile.h"
namespace battleship{
using namespace std;
using namespace vb01;
using namespace gameBase;
Weapon::Weapon(Unit *u, sol::table unitTable, int wid) :
unit(u),
id(wid),
rateOfFire(unitTable["weapons"][wid + 1]["rateOfFire"]),
damage(unitTable["weapons"][wid + 1]["damage"].get_or(0))
{
sol::table weaponTable = unitTable["weapons"][wid + 1];
maxRange = weaponTable["maxRange"];
orderType = (Order::TYPE)weaponTable["orderType"];
initProjectileData(weaponTable);
sol::optional<sol::table> horNodeTblOpt = unitTable["weapons"][wid + 1]["horizontalNode"];
sol::optional<sol::table> vertNodeTblOpt = unitTable["weapons"][wid + 1]["verticalNode"];
if(horNodeTblOpt != sol::nullopt) horNode = initNode(weaponTable, true);
if(vertNodeTblOpt != sol::nullopt) vertNode = initNode(weaponTable, false);
FxManager *fxManager = FxManager::getSingleton();
fireFx = fxManager->initFx(weaponTable["fireFx"], unit->getModel(), true);
if(fireFx) fxManager->addFx(fireFx);
}
Node* Weapon::initNode(sol::table weaponTable, bool horizontal){
sol::table nodeTbl = weaponTable[horizontal ? "horizontalNode" : "verticalNode"];
maxFireAngle = nodeTbl["maxFireAngle"];
rotSpeed = nodeTbl["rotationSpeed"];
string name = nodeTbl["name"];
return unit->getModel()->findDescendant(name, true);
}
void Weapon::initProjectileData(sol::table weaponTable){
string projTableKey = "projectile";
sol::optional<sol::table> proj = weaponTable[projTableKey];
if(proj != sol::nullopt){
projId = weaponTable[projTableKey]["id"];
sol::table projTable = generateView()["projectiles"];
ProjectileClass pc = (ProjectileClass)projTable[projId + 1]["projectileClass"];
if(pc == ProjectileClass::CRUISE_MISSILE){
minRange = 0;
float rotAngle = projTable[projId + 1]["rotAngle"];
float speed = projTable[projId + 1]["speed"];
float base = PI / 2, alpha = 0;
while(base - alpha > .001){
minRange += speed * sin(alpha);
alpha += (base - alpha > rotAngle ? rotAngle : base - alpha);
}
minRange *= 2;
}
projPar = unit->getModel();
sol::optional<string> parNameOpt = weaponTable[projTableKey]["parent"];
if(parNameOpt != sol::nullopt){
string parName = weaponTable[projTableKey]["parent"];
projPar = unit->getModel()->findDescendant(parName, true);
}
sol::table posTable = weaponTable[projTableKey]["pos"];
projPos = Vector3(posTable["x"], posTable["y"], posTable["z"]);
sol::table rotTable = weaponTable[projTableKey]["rot"];
projRot = Quaternion(rotTable["w"], rotTable["x"], rotTable["y"], rotTable["z"]);
}
}
Weapon::~Weapon(){
FxManager *fm = FxManager::getSingleton();
if(fireFx) fm->removeFx(fireFx);
}
Vector3 Weapon::calcOrientVec(int id){
Vector3 orientVec;
switch(id){
case 0:
orientVec = unit->getDirVec();
break;
case 1:
orientVec = unit->getLeftVec();
break;
case 2:
orientVec = unit->getUpVec();
break;
}
if(horNode) orientVec = horNode->getOrientation() * orientVec;
if(vertNode) orientVec = vertNode->getOrientation() * orientVec;
return orientVec;
}
//TODO replace unit pos with absolute weapon pos for withinAngle
void Weapon::update(){
if(unit->getCondition() != Unit::Condition::ABLE) return;
int numOrders = unit->getNumOrders();
int ordTp = (numOrders > 0 ? (int)unit->getOrder(0).type : -1);
Unit *targUnit = (ordTp != -1 ? unit->getOrder(0).targets[0].unit : nullptr);
if(ordTp == (int)orderType){
Vector3 targPos = (targUnit ? targUnit->getPos() : unit->getOrder(0).targets[0].pos);
float targDist = unit->getPos().getDistanceFrom(targPos);
bool withinRange = (minRange <= targDist && targDist <= maxRange);
Vector3 dirVec = calcOrientVec(0);
bool withinAngle = (horNode ? Vector3(dirVec.x, 0, dirVec.z).norm().getAngleBetween((targPos - unit->getPos()).norm()) <= maxFireAngle : true);
if((Order::TYPE)ordTp == Order::TYPE::ATTACK && withinRange && withinAngle)
fire(unit->getOrder(0));
}
else
trackTarget(unit->getPos() + unit->getDirVec());
}
void Weapon::useFx(FxManager::Fx *fx, Vector3 targPos, bool fire){
if(fx && !fire)
FxManager::getSingleton()->addFx(fx);
else if(!fx)
return;
fx->toggleComponents(true);
Vector3 plCol = unit->getPlayer()->getColor();
for(int i = 0; i < fx->components.size(); i++){
FxManager::Fx::Component &comp = fx->components[i];
if(!comp.vfx) continue;
if(fire && ((Node*)comp.comp)->getName() == "laser"){
Vector3 initPos = unit->getPos(), laserDir = targPos - initPos;
float targDist = laserDir.getLength();
float angle = unit->getDirVec().getAngleBetween(laserDir);
Vector3 crossProd = unit->getDirVec().cross(laserDir);
Node *compNode = (Node*)comp.comp;
compNode->setOrientation(Quaternion(angle, crossProd) * compNode->getOrientation());
Box *box = (Box*)compNode->getMesh(0);
Vector3 size = box->getSize();
box->setSize(Vector3(size.x, size.y, targDist));
box->updateVerts(box->getMeshBase());
box->getMaterial()->setVec4Uniform("diffuseColor", Vector4(plCol.x, plCol.y, plCol.z, 1));
compNode->setPosition(comp.pos + .5 * targDist * Vector3::VEC_K);
}
else if(!fire)
((Node*)comp.comp)->setPosition(targPos);
}
}
void Weapon::updateTargetUnit(Unit *targetUnit){
targetUnit->takeDamage(damage);
unit->updateGameStats(targetUnit);
}
//TODO replace the 'laser' flag literal
void Weapon::fire(Order order){
if(!canFire()) return;
Unit *targetUnit = order.targets[0].unit;
Vector3 targPos = (targetUnit ? targetUnit->getPos() : order.targets[0].pos);
if(fireFx) useFx(fireFx, targPos, true);
if(projId == -1){
sol::table weaponTbl = generateView()["units"][unit->getId() + 1]["weapons"][id + 1];
FxManager *fxManager = FxManager::getSingleton();
string fxKey = "unitHitFx";
if(targetUnit)
updateTargetUnit(targetUnit);
else{
Map *map = Map::getSingleton();
Map::Cell::Type cellType = map->getCells()[map->getCellId(targPos)].type;
fxKey = (cellType == Map::Cell::Type::LAND ? "landHitFx" : "waterHitFx");
}
sol::optional<sol::table> hitFxOpt = weaponTbl[fxKey];
if(hitFxOpt != sol::nullopt && ((sol::table)weaponTbl[fxKey]).size() > 0)
useFx(fxManager->initFx(weaponTbl[fxKey], unit->getModel(), false), targPos, false);
}
else{
Quaternion r = projPar->localToGlobalOrientation(projRot);
Vector3 p = projPar->localToGlobalPosition(projPos);
unit->getPlayer()->addProjectile(GameObjectFactory::createProjectile(unit, projId, p, r));
}
lastFireTime = getTime();
}
//TODO improve to allow for vertical alignment
void Weapon::alignNode(Vector3 targPos, Node *node, bool horizontal){
Vector3 targDir = targPos - unit->getPos();
Vector3 targDirHor = Vector3(targDir.x, 0, targDir.z).norm(), targDirVert;
Vector3 dirVec = calcOrientVec(0);
Vector3 dirVecHor = Vector3(dirVec.x, 0, dirVec.z).norm(), dirVecVert;
Vector3 leftVec = calcOrientVec(1);
bool negate = (Vector3(leftVec.x, 0, leftVec.z).norm().getAngleBetween(targDirHor) < PI / 2);
float angle = dirVecHor.getAngleBetween(targDirHor);
float rotAngle = (rotSpeed < angle ? rotSpeed : angle);
Quaternion rot = Quaternion((negate ? 1 : -1) * rotAngle, unit->getUpVec()) * node->getOrientation();
node->setOrientation(rot);
}
void Weapon::trackTarget(Vector3 targPos){
if(horNode) alignNode(targPos, horNode, true);
//if(vertNode) alignNode(targPos, vertNode, false);
}
CryoGun::CryoGun(Unit *u, sol::table unitTable, int wid) : Weapon(u, unitTable, wid){}
void CryoGun::updateTargetUnit(Unit *targetUnit){
if(canFreeze()){
targetUnit->setFreezeStatus(targetUnit->getFreezeStatus() + 1);
lastFreezeTime = getTime();
}
}
}
+71
View File
@@ -0,0 +1,71 @@
#ifndef WEAPON_H
#define WEAPON_H
#include <vector>
#include <util.h>
#include <quaternion.h>
#include <solUtil.h>
#include "unit.h"
namespace vb01{
class Node;
}
namespace battleship{
class FxManager;
class Weapon{
public:
enum class Type{FREEZER = 1};
Weapon(Unit*, sol::table, int);
~Weapon();
virtual void update();
virtual void fire(Order);
void trackTarget(vb01::Vector3);
inline int getProjectileId(){return projId;}
inline int getRateOfFire(){return rateOfFire;}
inline int getDamage(){return damage;}
inline int getMinRange(){return minRange;}
inline int getMaxRange(){return maxRange;}
inline Unit* getUnit(){return unit;}
inline Order::TYPE getOrderType(){return orderType;}
private:
Unit *unit = nullptr;
Order::TYPE orderType;
int id, projId = -1, damage = 0;
float minRange = 0, maxRange, rotSpeed, maxFireAngle;
vb01::s64 lastFireTime = 0;
FxManager::Fx *fireFx = nullptr;
vb01::Quaternion projRot;
vb01::Vector3 projPos;
float horConstraint = 1.57, vertConstraint = 1.57;
vb01::Node *horNode = nullptr, *vertNode = nullptr, *projPar = nullptr;
static std::string LASER_FLAG;
vb01::Vector3 calcOrientVec(int);
void alignNode(vb01::Vector3, vb01::Node*, bool);
void initProjectileData(sol::table);
vb01::Node* initNode(sol::table, bool);
void useFx(FxManager::Fx*, vb01::Vector3, bool);
inline bool canFire(){return vb01::getTime() - lastFireTime > rateOfFire;}
protected:
int rateOfFire;
virtual void updateTargetUnit(Unit*);
};
class CryoGun : public Weapon{
public:
CryoGun(Unit*, sol::table, int);
private:
vb01::s64 lastFreezeTime = 0;
void updateTargetUnit(Unit*);
inline bool canFreeze(){return vb01::getTime() - lastFreezeTime > rateOfFire;}
};
}
#endif