From 59c8ee3c70717313a6890ba9408bb9f42a0a8378 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Wed, 1 Sep 2021 23:48:50 +0100 Subject: [PATCH] Added sail boat --- assets/server/manifests/ship_manifest.ron | 22 +++++++++++++ assets/server/voxel/sail_boat/structure.vox | Bin 0 -> 5524 bytes assets/world/manifests/shrubs.ron | 12 +++---- assets/world/shrub/jungle-bush-0.vox | Bin 2360 -> 2444 bytes assets/world/shrub/jungle-bush-1.vox | Bin 1788 -> 2192 bytes assets/world/shrub/jungle-bush-2.vox | Bin 2456 -> 2012 bytes assets/world/shrub/jungle-bush-3.vox | Bin 1672 -> 1968 bytes assets/world/shrub/jungle-bush-4.vox | Bin 1640 -> 2020 bytes assets/world/shrub/jungle-bush-5.vox | Bin 2664 -> 3784 bytes common/src/comp/body.rs | 1 + common/src/comp/body/ship.rs | 34 +++++++++++++++----- common/src/states/utils.rs | 2 ++ voxygen/anim/src/ship/mod.rs | 18 ++++++++--- 13 files changed, 70 insertions(+), 19 deletions(-) create mode 100644 assets/server/voxel/sail_boat/structure.vox diff --git a/assets/server/manifests/ship_manifest.ron b/assets/server/manifests/ship_manifest.ron index d964d990b4..36184ce50f 100644 --- a/assets/server/manifests/ship_manifest.ron +++ b/assets/server/manifests/ship_manifest.ron @@ -47,4 +47,26 @@ central: ("air_balloon.rudder"), ), ), + SailBoat: ( + bone0: ( + offset: (-6.5, -15.5, 0.0), + phys_offset: (0.0, 0.0, 0.0), + central: ("sail_boat.structure"), + ), + bone1: ( + offset: (0.0, 0.0, 0.0), + phys_offset: (0.0, 0.0, 0.0), + central: ("empty"), + ), + bone2: ( + offset: (0.0, 0.0, 0.0), + phys_offset: (0.0, 0.0, 0.0), + central: ("empty"), + ), + bone3: ( + offset: (-1.5, -6.0, -5.0), + phys_offset: (0.0, 0.0, 0.0), + central: ("empty"), + ), + ), }) diff --git a/assets/server/voxel/sail_boat/structure.vox b/assets/server/voxel/sail_boat/structure.vox new file mode 100644 index 0000000000000000000000000000000000000000..dc7451ec138bc854782fb1552b54fe1fd70addc4 GIT binary patch literal 5524 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 literal 0 HcmV?d00001 diff --git a/assets/world/manifests/shrubs.ron b/assets/world/manifests/shrubs.ron index 61cc9d34b6..b8cf355e61 100644 --- a/assets/world/manifests/shrubs.ron +++ b/assets/world/manifests/shrubs.ron @@ -7,26 +7,26 @@ ), ( specifier: "world.shrub.jungle-bush-0", - center: (5, 5, 1), + center: (5, 5, 3), ), ( specifier: "world.shrub.jungle-bush-1", - center: (5, 5, 1), + center: (5, 5, 2), ), ( specifier: "world.shrub.jungle-bush-2", - center: (5, 5, 1), + center: (5, 5, 3), ), ( specifier: "world.shrub.jungle-bush-3", - center: (5, 5, 1), + center: (5, 5, 3), ), ( specifier: "world.shrub.jungle-bush-4", - center: (5, 5, 1), + center: (5, 5, 4), ), ( specifier: "world.shrub.jungle-bush-5", - center: (5, 5, 1), + center: (5, 5, 5), ), ] diff --git a/assets/world/shrub/jungle-bush-0.vox b/assets/world/shrub/jungle-bush-0.vox index cd4980287e85b8cab1421043ca3115cc36f4ff5d..1131e571740ebc933dbf6b526009453618e8bb29 100644 GIT binary patch literal 2444 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 delta 777 zcmXZaJB}1F5CBkjee6bpfE#d?MM7u-KmrLZdzsERKpSxjA`*_oAqaS0F`j34l|6R3 zHBYbqzPi4Cx_|RyjPc>__R%o@%rU;)9^Sp&fzONoq{scYhuiPi*)e_+F&-zGuWW$1IxTIA)L(jpQ|#ha*gq6pht$G15FiQZ#m&i<42-5F|z8q`5d5Z4E(EbYB*E zSe)z@Bt@glxj2?NlA=-lT;wT7?{S3M!r5W#a4|7OBjG~wscqOpV9 zgxi>J^CU%McNdY@lA>{KA%1poj5 diff --git a/assets/world/shrub/jungle-bush-2.vox b/assets/world/shrub/jungle-bush-2.vox index 06abd3b5d2deb92f20f549bab270c9704c05ee5b..d277e6a74d77dfaf0ac8c9c85a2afd12c7aad48f 100644 GIT binary patch literal 2012 zcmYk*L2e~A5XN!8w!8ZUjfAp8VgtE?#Q_Edp)3Fi6g13^jjxa;OP;c1f$$Z=5pn?* zzCxC4bA{$to>}lZU%RVZuKK&|{QSeaFaAs^efRe6dqetXPwA(-_usq;!|#*->D@2y z@BYfuo&GhHa(Y~;tVY_)wykAhFYM)Un|5YrHf=GM$8CNaxA-oPdyM-^;ak}hw%`8o zwSWBB!^7CaabCBb&KvEkrEHoHdp`?_u!sYlagk3AI;(fa9;tSPRx#_`+??SwlGe#b`kAAr zIr^#BCA0N3lc=1No+iCddP&A*qa{6Nc6Kf~TSwXYMa`n;YbkP3j&U^?-^LJoiE-H| zd>fm>&il4dUW}CUnSEv(DWA4&p;M-1+p>);RM>^RoOXVSxMgLpY`u$|He5oHugK^7 z6n<+;)QZ?FHrDC$De}sblU$V4NKrG6#oWqXqb55iymXQ)$(d$8HBM(a3HwRCMcp#% zVaQkZc4coyTCH1SUG$J$V*X^FPV7_Ig-vDVkyHLObE}nn$NsUNu%zgdJq2ub4h!Xl zob76V#l6aL?_xvqe@9)PuA@ESqgCz|e~G(<|Hp5?ew)gN|IuUqhIgk%^*E9tT*GVd z5B|YFOhj1c?>;(z=kNTnwDC9o#%TPF-*8m^%3t{_N9Ff-B>u#o_!EChAIf?Ug@&X< zf+2XKcnv%Q&%iVAOguaT&%iVA3_KGV&%iVA3_JtR+y3C)f@N@uOu`Y3!WVXd*_tEimJRQ$$6`qc#3BMxj%T)cb|z@zsl*?x$J6jMJPl97GmisL!_z=C1)Jpah%9OX8l&N9c;>O; zX?Pl*hUcr#-pr$Hcp9FDr{QUM=JC!`ip~U0Jp6Iwcq*QXr{bx2<~6`m@l-q&PsKB@ z2A+zi;;BF?o_Sp)s}@#4m80rUT%n4m;;DElo{DE)t9fJMl%g|14vV4*VotM<>lpgettfl fo}P}&<#IecJRJA;_s8w+?QwH+b6j6vi%sc2c=49+ literal 2456 zcmXBUL2l+W6u@yOwqxg;kx+L?Y@k<&IKZGHGz&n2DH>+SCRgZ^4H8wCERcMKa)hpD zR=z^7&?|(WGhg~o?Dt;czh9#M_VfF%{|zDh_~z|TF5#~=gkRr&`2O{n_>JqJ;Qj9( z-oDEQe($CbVhj%%3o23y4+SxsBQCB;MI5oJ$AUV>)3hvz^Ry&nEGVd$qg%+tq|r-zIM1yyX7yI>qM;-YR*2VxHeRcw{J zjGCebsaUV5K|vK;F<1G@*ELtZD8^N69l6!L$XHNN$NXZB9Oh*~oMu~@shXppVxHxY zkRhN~a#%4%HHb*aaKlnivEqU$sY66UhKDW%6)P?XSuJKnBxG28DX3U+!7GHbi|QQ_ z2^mC}f{GOvyuwseA|fHfhL(bg6&FlZ9U>AkYL_&rK>7^R1xL|yV zY|kS(XIM-R)nUa2b5VnY3^IDB1}o+&kAw`OdM1w*ag{@c4d|8Jm|x5hW1^QVo!px2 z%Nz#w#Vm^6h_p46kOqhOzyz-LbW?m7zJb z#`0r{@u+d@C>hbA(I-ky`^Es9IbUvL==hOL|+u+mrbUvL==QFm}`E)*=Pv_J5 zuscnfbK}$aG(Kkw_%s5|V$Fk_hn#JZYzB=_V-8G(L?_<8!u;Pvg`0G(L^b zXldiq_%uF^Pvdj8`RvTF8OH|k(Rw~RpPkRnXXkUi4n8}doy2az-NVmU) z`JAtf&(3G(v-A1(%h%_t-1+Q$c0N0wozMAt&$l!>Gi=5oK3+MWjnBqs?}T zIL4>OC-4b;0-x}o`1t(z1U`XJ_~V-+{Q1=p{{G?!|H$(Rd;*`q$1+gQC-4b;0vSs~ z+yeujpzuZT8Bch`J??Oe8(iZG;RVll!Xxf+hg;m>8dnG}c*YYRagRIP;s)2aI$mC0 pj_2p+=V-ZTp^(u_H!(WE5;khJ=iQ9b1+oA){aiC2Kf^W#*J~_`J0K;&$2# zws^AE$yz6C$*?0P88QlD)<;IcR%A%XDA*Bq=h(}Y_R8E>=DsqwK6b<;Lq@?i$8Pd0 zM@B)M_q&#m=NLreHglxyTCJ|lt;LqE&8v@$f*o6yBO#+;pZ%hbv}=*fn~~Cu`)`cb zA|jO=1)O`Nke+Ho@{AcuWB+!0jal6PgIV`k>A8P%Ke5ey6l$#H-brwd&3&7Rf_Z{@ zl4sA@)nT7CnmA997vl8fRkVd;@hn9h;>39{U+_Yt({!9-=C@upc?z?gYhUp`L2K=k z@nz1b9{a3~Zz9fb!uOGUC)<44d>i`~oMR6cwigd~Dcg35*qm?1#9fB(zy9)V$m_EU z$NC$N9S!w3W;&zcFyuo%Ws%y=#|dWv0#i$>)~yseCG* z%BS*KuK}ORr}C+MDxdXg@Tq(%pGu_iS+9%9svE08RZ!JuzCx8xL6KAxVQj>pHxPu15C%}Ye%v!r5Le(TNU)d%WDzL}IS2dRqO7vw1RMZ~3-XMZ)|=}3+HHG0 zzu*6OcRoElfA~4Z`10}gRT~D?&-c6Wx%_vhK7V_;eTtoq@kYdWZ8FDek);wX zCv(cDTqQH~p;yU~=c9ro@5*5rBJ7i* zacCx&;UG-DoRr+Y{LuZI_Wms*XYa@Q*7!HQ6LZg*^Ke{;$yKH&K~gk(^fWq1ie}G{ jt;ZkYJdBBp4PLx|@xEFr(Q-1c@~d2}>s)_+<$e7Hb0{8I diff --git a/assets/world/shrub/jungle-bush-4.vox b/assets/world/shrub/jungle-bush-4.vox index d702d6772300e9888f7da5b561647bf3933850e8..d968f989bffcf36a0d4dc2e908461d9e1881264b 100644 GIT binary patch literal 2020 zcmXxjJ8mvD9ENd^FZ1PwP&yr!|7;d3n?jyQc@tfqYg{R7F@7_ z)O6Xx@cR#tFVBqqj>mp{nIFG<|Jm;;rElKdee0I~I;Hf(-G{HPqT=uDKR$AQ|I>%N zKT4!2{f(T{Q$uOXQ!dL>&C63kZgP~!P^vphUe}6T*0rFbAy;)&v?w=alyq7vaz3pE z6%DD#P*BluLaK5UR5YBBn+z2#$|q&y8gf%dMT_!s!TmxX?pVr&KGadsuwtol z6jU^Jxme|B%KulIHmfyTW6c(Gz@omy z`k7xri_E$udzb7}ingaSXC&syKjw{Wt|hBS7Vp@bMYfnzOv8lyMIrX}d_4(I_P3Pg zyf^3F9iHU4yMM3ip%6P`Aj~O&!NX>@|k=l zpULM?<}>+BK9kSnb4-KJ#ZYkHKAlhJ)A=07>Nqj6OR+Lx;}=JbPvVpKBtGd+c^p4JiBIB_e*Sz< zzkIrd=j6;$1u>IPvVpKBr=AET!)EI((q0AiWfZN5f8Y>EpBj)^oCcw z;2Dp2z&&npgKMNWyy6AVc*Fzlaf=&V?{9B!`|IoL{_^s&KR-Y3kB^W0!^6XVe}BK< R-rnvvH#htB^|iJs{R6q|h?4*S delta 602 zcmXZYJ#JG$5CGua`Pt`4meOzl3a*iYg2Dx%0HKh}xJBt`xJWKTi$uXO_}0SK=bf2n z&CI?(_kYjVub-aY{v2a`e1Ca#j4x}9&zI*9=biYR{=0KNeS5yVi(MV#I}zih$s8|5 zmXm08GN<}fcajmSh>Vp~#&xwIN`azx++uR%Dk5?vMKe;3q-YLCsgo4VL9`l0@AwcC z^I9ust)iJxhN)3BIJ&nx#%sG=eo-oup_yT&}f@zJ1$oT%!#W(nQKBnkYF% z6D_Cc9Z&P{67^UXwJ%qMQ``mJMaDWE`qfl%+T!ipPjq?q1mC?VWC4aIYkpC Ur|2KQ-`wZPvy+;W*I#+Af3gT1(f|Me diff --git a/assets/world/shrub/jungle-bush-5.vox b/assets/world/shrub/jungle-bush-5.vox index 0a5dfcc67f50baf6c9824809d7230e6fa03b8d99..9e2aaca683c2139ab54c1964dd7b8ed790913f5f 100644 GIT binary patch literal 3784 zcmXZeKaM3k6~}Q`**F%L3BogQ?lvuz+jnE4oNT5cKmyy&KIwV1&bwdKA%7}-Q zthZ2G=q=0^E+5x0cfRf8<9|ONpK{fo|M254|CLhu;k)mDuSoxWNa;`C|Mc6tQStB7 z|M{8n$G`ma{ogOco6^7MlxlCWRcbrcdVKK-N%3 zBN`@}GD>OJia=9eFqywpeh_61zR({f_(9p#O!V_NegxXE7kUuL6D?Dxp^JxoBTz;R z5SU6AqfQS$Dg-ndIu=Y-A7m6%1R6RPOrZ}l3MvGhLVf%el*W%h>1+hb!bXg8TAZIV zMMa<^k8?&vpka2N83h$4qFaAV4q-+{LB%+jhK>a@RT%{p1e{SFYIEa9MWA8se5eTY zVJ}D*nlJKAywT7xXFe2E1R6TBJSihr5NJqYOx1>hiaL+p64;cj&frgF+7o^Y+ z83h%AhK>tz(}s#b8}+V^80DgVQ6ff}?xIY0_H!ra*)tn~oYhegXqd{KJ!wNhMWCT$ zL8|&;Mn*wJprK>I1yksUjDm_lL&t*Lw4oxRBCux!l_WA1VS39aGhgjDm_lL&t(Sw4As0SW1lp+AardetyNAoTixFs;8$SvH4IR0&k@II~O^K4>@vD~KhJ#F;_11X<>BlMGrD>|b92~yay-k4EY6MH*o~dXGdglwE;M#yw~-g_ zhiTju<4!<#r_AX3bbV&!tnB9M=9-oB$T`n{j61;d6sY69vA84L6@lU|3uO0QLv|mx zfqT4TMn>~K>6np+J?>2OaaWH!+g+d0yo2(17rE=hT3K0?;VzA_uCgenagWo#C>Q1A z37YIn&2QA*Cz#wl3z~Oj9`9%G*gD>c@}rrz*;^ZTLb7JEhWomlj5~b1Tm2iaP%n0$ z0md6j@8q7IoXK?F6`m!}!(=~`dv$V_le0_|B=5*XW1=yQJ7YZO^k=cmp5yEpDTuR_ zcZ>YPB!?zBG&$=@d?)8Ko#!NmzAKXFH+eo29ckRbbd-zOxWD6KFYI79@oLs<)@#;l z*7=qNBTC|B{9^oK{9?||?Qy#Xh>6?c-VK@*nf4k9YHVHlq|E-$x#_s|Vv+ zeD4(BKxKRzMONnF@T zj48&Ju}+(P2cb>ui4EggR?o^Z%IR9zd92UQe0h{(J>#=6#n^n3v?b%w(zRy0@m*hd&4Z!GG`{8b-IBe`oCcJO9o< zhHm^D|E99>Z~The%D?ij{42-G@Bc0FC;r5r_*43}tiOka4wD`xICMUx_;b*6&~wmp z&~wV8=b-1H=b-1H=afv(LC-R?DU)=pl2swx7cpt-6UsNH13R@o}HeZo--FcK7JsUk6JsUk6J?HVBr!*on)QlhhIC6ScdRBT?dRBVQ zG@xgtXQgMQXQk&%4SH63R(e)KR(j5KG1+S1s?*A`iqA-)m7bNJm7bNJm7X)L&WstS zG$J$9_>EMfC()DWN%W-u@Q?JPC()DWNq_y-E&c5mxAc$CxAaf#^dx!`J&7L6K!17? zJ&B$~jHSVE!bDHf@hj&C-th%*c*P5z@q|aDulT?_zTge7c)>HC@QCykA9%+Xyx|ou zc*YYRZ(qNDy?uOq+}_{cZ(qKAxxKx;-Ckc`Z!a$|x98{Q+tbt2?eXzZ-<19bl)TX7 literal 2664 zcmXZdOK#;v6oBEf>tXw*C6pNw6NuP>#R3`yp$q^C2x@x9#9PRaAyI}5ki3PkglwU< zkS$~j<~we#^V?OY%BTK%+?(Hi`tapHDWxCY-~H&3e!Zmh%iYKC-bKad>VKmC;rEYs zU$=;+^f;uHb9$OkN_whjC{-B^r75E!Px_*iLEk~&L0@Gwl%|Xp&tYsik8MIJqyD4* zI;S{Ud7R{s1Hql zS83vq=xI`4B07mfVq+^W#zjLJ3Wvg>&{sx7$;u$1$qbNDP@&K!%vdl~eUMR5p<|mc zW5EzB5r&AXLZUWd#)2}5L-JN;Wf+9BG7QGoYL4DUg@N0QoW)Q<#B}v5;wY#fC$;_< zs&-@)RJd{0jsPk!X$pXR%LP&RZM? zi*0H%V)-p?EMqKFEJ;h!#*|}pYB0SYQ4F$euHRPD$ps4xI`?N~6Lza-i{eKR;~M;Mn$ z3=QL~j*5mk%8T5i-NKkJ*7?HC0mFnDxrm{{hH+DO2x}ZfWV>BZVI$AoA184XG)$P0 zXJzDkCI6MYS8`s-rQDQ}CvEuo`)}W;^6CG@aelh{jt%Q^B##Jnw=UkryLi_S-FER^ zVHe-Ucky_26W_!)l}&sT_c&JZReTj+1y*r?M-orsNj!sux=hOLgKIb&}bUvL==hOMb)Hc?0j}Uv7|en zozKo^=d<%Um-$?ou!(Dhcq~1ijnBqsPUZnaiqUKJJR3U`6NDxPvT=3=+7tdNqiC+LqlA`#3$+a zCisdMJmV1$xW_GSaE+A9I j@^U;sKOc{ekH^Eq!*PFqf85^Q9yd2P$MyBKzA60&goc{U diff --git a/common/src/comp/body.rs b/common/src/comp/body.rs index d09d78b460..45982c3557 100644 --- a/common/src/comp/body.rs +++ b/common/src/comp/body.rs @@ -854,6 +854,7 @@ impl Body { Body::Ship(ship) => match ship { ship::Body::DefaultAirship => [0.0, 0.0, 10.0], ship::Body::AirBalloon => [0.0, 0.0, 5.0], + ship::Body::SailBoat => [-2.0, -5.0, 4.0], }, _ => [0.0, 0.0, 0.0], } diff --git a/common/src/comp/body/ship.rs b/common/src/comp/body/ship.rs index 09bae038e0..375645db08 100644 --- a/common/src/comp/body/ship.rs +++ b/common/src/comp/body/ship.rs @@ -1,13 +1,13 @@ use crate::{ comp::{Density, Mass}, - consts::AIR_DENSITY, + consts::{AIR_DENSITY, WATER_DENSITY}, make_case_elim, }; use rand::prelude::SliceRandom; use serde::{Deserialize, Serialize}; use vek::Vec3; -pub const ALL_BODIES: [Body; 2] = [Body::DefaultAirship, Body::AirBalloon]; +pub const ALL_BODIES: [Body; 3] = [Body::DefaultAirship, Body::AirBalloon, Body::SailBoat]; make_case_elim!( body, @@ -16,6 +16,7 @@ make_case_elim!( pub enum Body { DefaultAirship = 0, AirBalloon = 1, + SailBoat = 2, } ); @@ -35,6 +36,7 @@ impl Body { match self { Body::DefaultAirship => "airship_human.structure", Body::AirBalloon => "air_balloon.structure", + Body::SailBoat => "sail_boat.structure", } } @@ -42,15 +44,21 @@ impl Body { match self { Body::DefaultAirship => Vec3::new(25.0, 50.0, 40.0), Body::AirBalloon => Vec3::new(25.0, 50.0, 40.0), + Body::SailBoat => Vec3::new(13.0, 31.0, 6.0), } } fn balloon_vol(&self) -> f32 { - let spheroid_vol = |equat_d: f32, polar_d: f32| -> f32 { - (std::f32::consts::PI / 6.0) * equat_d.powi(2) * polar_d - }; - let dim = self.dimensions(); - spheroid_vol(dim.z, dim.y) + match self { + Body::DefaultAirship | Body::AirBalloon => { + let spheroid_vol = |equat_d: f32, polar_d: f32| -> f32 { + (std::f32::consts::PI / 6.0) * equat_d.powi(2) * polar_d + }; + let dim = self.dimensions(); + spheroid_vol(dim.z, dim.y) + }, + _ => 0.0, + } } fn hull_vol(&self) -> f32 { @@ -66,15 +74,25 @@ impl Body { Density(ratio * oak_density + (1.0 - ratio) * AIR_DENSITY) } - pub fn density(&self) -> Density { Density(AIR_DENSITY) } + pub fn density(&self) -> Density { + match self { + Body::DefaultAirship | Body::AirBalloon => Density(AIR_DENSITY), + _ => Density(AIR_DENSITY * 0.75 + WATER_DENSITY * 0.25), // Most boats should be buoyant + } + } pub fn mass(&self) -> Mass { Mass((self.hull_vol() + self.balloon_vol()) * self.density().0) } pub fn can_fly(&self) -> bool { match self { Body::DefaultAirship | Body::AirBalloon => true, + _ => false, } } + + pub fn has_water_thrust(&self) -> bool { + !self.can_fly() // TODO: Differentiate this more carefully + } } /// Terrain is 11.0 scale relative to small-scale voxels, diff --git a/common/src/states/utils.rs b/common/src/states/utils.rs index 9d1d4ffb69..5f7b20790f 100644 --- a/common/src/states/utils.rs +++ b/common/src/states/utils.rs @@ -200,6 +200,8 @@ impl Body { Body::QuadrupedLow(_) => Some(300.0 * self.mass().0), Body::QuadrupedMedium(_) => Some(300.0 * self.mass().0), Body::QuadrupedSmall(_) => Some(300.0 * self.mass().0), + Body::Ship(ship) if ship.has_water_thrust() => Some(500.0 * self.mass().0), + _ => None, } } diff --git a/voxygen/anim/src/ship/mod.rs b/voxygen/anim/src/ship/mod.rs index afecb5e600..a1afe338fa 100644 --- a/voxygen/anim/src/ship/mod.rs +++ b/voxygen/anim/src/ship/mod.rs @@ -31,7 +31,9 @@ impl Skeleton for ShipSkeleton { buf: &mut [FigureBoneData; super::MAX_BONE_COUNT], body: Self::Body, ) -> Offsets { - let bone0_mat = base_mat * Mat4::scaling_3d(1.0 / 11.0) * Mat4::::from(self.bone0); + let scale_mat = Mat4::scaling_3d(1.0 / 11.0); + + let bone0_mat = base_mat * scale_mat * Mat4::::from(self.bone0); *(<&mut [_; Self::BONE_COUNT]>::try_from(&mut buf[0..Self::BONE_COUNT]).unwrap()) = [ make_bone(bone0_mat), @@ -43,10 +45,12 @@ impl Skeleton for ShipSkeleton { lantern: None, // TODO: see quadruped_medium for how to animate this mount_bone: Transform { - position: common::comp::Body::Ship(body) - .mountee_offset() - .into_tuple() - .into(), + position: (base_mat * scale_mat).mul_point( + common::comp::Body::Ship(body) + .mountee_offset() + .into_tuple() + .into(), + ), ..Default::default() }, } @@ -89,18 +93,22 @@ impl<'a> From<&'a Body> for SkeletonAttr { bone0: match body { DefaultAirship => (0.0, 0.0, 0.0), AirBalloon => (0.0, 0.0, 0.0), + SailBoat => (0.0, 0.0, 0.0), }, bone1: match body { DefaultAirship => (-13.0, -25.0, 10.0), AirBalloon => (0.0, 0.0, 0.0), + SailBoat => (0.0, 0.0, 0.0), }, bone2: match body { DefaultAirship => (13.0, -25.0, 10.0), AirBalloon => (0.0, 0.0, 0.0), + SailBoat => (0.0, 0.0, 0.0), }, bone3: match body { DefaultAirship => (0.0, -27.5, 8.5), AirBalloon => (0.0, -9.0, 8.0), + SailBoat => (0.0, 0.0, 0.0), }, } }