From 7122b79f53f4501751d884c0bf2e838ab501c4a3 Mon Sep 17 00:00:00 2001 From: hgn Date: Thu, 2 Nov 2023 23:07:05 +0000 Subject: [PATCH] sitting down --- input.h | 7 +++- models_src/ch_none.mdl | Bin 778688 -> 829752 bytes player_render.c | 1 + player_render.h | 1 + player_walk.c | 79 +++++++++++++++++++++++++++++++++++++++-- player_walk.h | 13 ++++--- 6 files changed, 93 insertions(+), 8 deletions(-) diff --git a/input.h b/input.h index 1fc945f..7e1e6aa 100644 --- a/input.h +++ b/input.h @@ -15,6 +15,7 @@ enum sr_bind{ k_srbind_trick0, k_srbind_trick1, k_srbind_trick2, + k_srbind_sit, k_srbind_use, k_srbind_reset, k_srbind_camera, @@ -123,7 +124,8 @@ static const char *button_display_string( enum sr_bind button ) [k_srbind_mopen] = controller_glyph( SDL_CONTROLLER_BUTTON_GUIDE ), [k_srbind_replay_play]= controller_glyph( SDL_CONTROLLER_BUTTON_X ), [k_srbind_replay_freecam]=controller_glyph(SDL_CONTROLLER_BUTTON_Y ), -[k_srbind_replay_resume]=controller_glyph( SDL_CONTROLLER_BUTTON_A ) +[k_srbind_replay_resume]=controller_glyph( SDL_CONTROLLER_BUTTON_A ), + [k_srbind_sit] = controller_glyph( SDL_CONTROLLER_BUTTON_B ) }; const char *keyboard_table[ k_srbind_max ] = { @@ -148,6 +150,7 @@ static const char *button_display_string( enum sr_bind button ) [k_srbind_replay_play]= KEYBOARD_GLYPH( "G" ), [k_srbind_replay_freecam] = KEYBOARD_GLYPH( "F" ), [k_srbind_replay_resume]= "\xa1", + [k_srbind_sit] = KEYBOARD_GLYPH( "Z" ) }; if( vg_input.display_input_method == k_input_method_controller ) @@ -311,6 +314,7 @@ static void skaterift_preupdate_inputs(void) setbtn( k_srbind_replay_play, vg_getkey(SDLK_g) ); setbtn( k_srbind_replay_freecam, vg_getkey(SDLK_f) ); setbtn( k_srbind_replay_resume, vg_getkey(SDLK_SPACE) ); + setbtn( k_srbind_sit, vg_getkey(SDLK_z) ); /* axis * --------------------------------------------*/ @@ -371,6 +375,7 @@ static void skaterift_preupdate_inputs(void) setbtn( k_srbind_replay_resume, buttons[ SDL_CONTROLLER_BUTTON_A ] ); setbtn( k_srbind_replay_play, buttons[ SDL_CONTROLLER_BUTTON_X ] ); setbtn( k_srbind_replay_freecam, buttons[ SDL_CONTROLLER_BUTTON_Y ] ); + setbtn( k_srbind_sit, buttons[ SDL_CONTROLLER_BUTTON_B ] ); float *axis = controller->axises; float *steer = srinput.joystick_states[ k_srjoystick_steer ][0], diff --git a/models_src/ch_none.mdl b/models_src/ch_none.mdl index ff975bc7dbe06e64c8e912ed397254daf6f8283a..f399b772a4ec6515c53b779ac12985f829194e68 100644 GIT binary patch delta 45881 zcmafb2UrtZ^ZtT}sHmu@s3@SQSb+o!kll@_h}f`q#om=`ML`p>0ivQPcEOHZ3)!F- zCA%AYy^8hP#je;pR{rm74C?p$zWeui4r?}V=A4-`@64RDCov!L&N{EM8NS4(X63LV z3}eGE%*06(Mvfak5&yINGcRGQ+GH&0Rkd2Uy#=Ac8)Juz88CL>q@fc=4je?t<0U7m2Cgj6Fja8d=?8S+xRF4Q96t`Pn^j<#j9`ZG`tjcAq0@#<7&vw)UNTwk zC6nB2Di=u`>X;OW>y<5z#vV3LY#b`2$CjKpauQ?I7Fk=wri$^V{a=o{2J{i;Rdf1# z1!FHm|H138b`10Em)E;7@UM7X;>Y`g92myY)-nRZ&neC@E_m(y<9)}{4C9H{qyfDj z1~q)}8cHdzgYX}XEu$;!a3oX;0ie_mfNLd&>512#KVC0)VVDuW2-xn*FcEld?I5Q* z!$jjXnTt9+=)o|tcugjv*Gp?M%-UbxuYxx+ZFN6CkXM&s4*&9j{q-3p=a<((J`8jJ zm)9r#Aodr5o&C`d9Kbq&8iDx#FR$NV&fW3aYQcjX!!&UF1#q8-N$}b_C7I0`<}dfX z#kDrN)nA56hE+rOkW$6iPX#*OmeKP?(5f|YlIIr-V$1+TKCe$`Ej9!ff zftFU3(Hnp_;59YekHGs&2}9WbiQD;gem3*Z#U!`W-Rjr?XNN}pCP!D}`z=Y;R0_Ms z+B|8E&!-9uGYNg$t>}|g+^u-3ieVzr>{rarD&9~>pSAQeVK=O_^V_kR8OrNe30AG= z&FqaeeurLkuK?Fhk5f%0^ZwTOpNwF&W9dGV!RT9HykmSxcNzz^GvPJl7;l4k;O!^& zMg1V)w9s!bW@cUHo1gNU@cl39g}b-oxo&}51@GZg0L(Qosbr)r#?JtfQAx4P$!plE zUG|9^mX?#&uNbAHakjOxlh!s!w6?fC^!GEtB7=6*qSm1fI8few_Xf)SWZq2^2 zs*ad5|kr$zCMIY!O6FBae`!c}0( z1M?2o<@!q5y`p>q_th;Y#f8t{-G^>AH1N|2dRyo06$|zkuU6YLZn2np_Fe#Up&?7= zwVK$w+THB7<6Pw2O=C3r4N0ZX)^ohDbScM7_!!WT{U9wZ>bfHAvCTBy=p|C`(pBVP zhdRjCkCOFES9Ij>271b~?yTctCf(s~`YzhWEg z@~8}d`Q%8cZuud+aEM{8Gx-gQT#qOt*YynL({l!Mo{o9&&1J^#I+ zAj6hvhI{58E=uo*ss4Ysd#erxXruB?Y3q^$tcuX}-2Um=dp-Q*H*8PSfLo0*BaU#n zeHl#Na&k2tPotxe1`eqeSl4Kq-RS;`{p;~s8NihqnT)=>K!T_#KEJ*S@A@TJBlh~j zK3duaxLgcy1$@4dA6euJKAVsBx$GQO#h_^ES=l+hVXl$Dks?HhT*Y_40`q|ekaJr! z4gVe@CS5Edu`_1Cm8$x}fp;@=0{yI-5E){tt_p}cTsiyg(BT^P69%aFgN1fvFv)g) zqy%B;dLv=8>BL>5CVJW&c6%>Ugz;f=1L5OGR8}QOkpmB^%YW*IuNU+B>|hTr4Tiwg zDn|PUSi|@|hal2|wDD^BMwrSca37)<3j-SyY4p(IC0dr6v>+U5-nMi$+vdvOqPOa? z$bW!SlM+lYNHWduBHpiv=7@H@*BQ;j)D4%s-jn$9!dqt#5$7NC3!;W}{TAnPrz3+*QPAIR&x zzrfa2dT2X?&mS_!&}6kNM0aSpS#buM7jnWyMN4IDwO`^JTp*K{e5Q@7Xm-66__^DD zmP|~I?%yo_J$uzh7kRtWM@_5h3cK}N;y5PiQQ+Vr7ItfI+eGSy`X@_s23M5t&+1x8 zZ?Z(C3`aiNr?#xQoy-Zgx4Chl>$p0jT;&B`emn(K8V~jLdCD@WU#kl8mWJ=7?rxQM zozo<#{p>+}TG`-buZpN{9u1HXXYX3UhW4!&f@G*||0nSxw{EvWsy zK>jfW3^2!mVGs}gH*S5KCxNMDN{c<;Y6Gk|y6$pqY-)H@El=;DG97ViLdI#xxW^f; z_?A^G^rlXU6|RjAW<|xE@z=R}YW933U&zg1D(*q&i&U0@Svr@FSKv!k^9$9#Yp#bhQGKbee z3sw##TO2jxy}w5eL<|(Ylmpo zkRn;Wz&2vESJju$VI{O;XkD_L**$N%vGzR%>H_afrxAL=G@E^y=+8z1R6wJV3gIh# zF7gq+HhzAb#)bqgL8mzg&syISc;6Fk6*_;?(M97Ep21$OR!z$IPV^23Il|Bw48Sra zmMg;)=u(A(0kD&N^`k7^63rd0siBQ#ZlkRI*;&iP7wu_)pe&OCfr-9E zZ?X){q5Ft$hJ~T$GHRX~!j+jn4PgM4g0=>*qHq%!%F=}0J4_u|L0Fs}Td|gOZVMFY zd}8;|PSL`x;2bXm8;iCycL~KxWh8^%(Ke`KaQ{|rUiOHl12oP3N^w>k`NN1u1x9`k;aC6r12jEg1KA( zX7vAt8~h>T&`fm`kFXgnX%oPxJzGx64!A{q%Jjo<%KhVNgjy{VdGNp6#8C*Tlx^mCBr zC15SqqonsRx1DfP{*Ip6jRUt!mc}+BR)PpQjBX$bo7HFprd<;-(_^@ zj7GFvCpTr+U&~~hhMdxACT^z@YH5xIM*H?Rey4V-sG9IiuhKM9a}OzfhuNc3J7_&g zMRfoLjC6F~YyL1zn`2(At+}T3=Va=56L{SnxJUyjL6)&xkx~#Fpx_VR(uJa9gi>aN z-+X{tpn0GbThvjrq*m#G8V!x&r~(?`L*O_xSK~``NLo`YZ)e*;@N=GMDA9Q`H+KO_ zG%YQKsO~JMx(Q5KU?}?S-jW^|cCv`cX?{bga+_%WRb79>GVnVuILGfdeqXaMm9Yu@ zmJo|+)I~b)(Io!$m&S2_04Vb_QW>)wn&Qn>ju~5;AN{$$?E7FASJmk<_qwBrYqZx@zT4eH!B{&}zndyu z{Nyb2Uv5dY=6mvn%kk3qc76GWw&nMemlKXM)v!^;GPeKbEXSz)pDo9r?UfB z6TdN?=FJ8s#9%4UX>>Hw))%Up>^qd#{Bx*1yKx(h+#Tt$G`xM1Qq|Jn$U2{^Iq=g5 z6cbOF8Ezuiois%J*Jm>3<(XtTtGtwY$5oA&osbINls6W19u1rp3WTGj8Yx~B=I=p# zhN;+AUQ={>e`(AaBmrg_9LWb3a8p|~q0ZM|;x%2in@z_*IB{;>P{xPXLb3?;Wg>Pc zfrYSyTV#L4v}E`7>~l7+*)pDRPA!j4XZSJtd5~-MbUnX&X*pT9U{D>g(uJmCOh<}T zs9I}}^<$j1neQQpyqE-Djp{1Y4_wSO?Oa{xe{3>vR7!P#&?{CUpT!$s*pLOp)fre)Ft&z}6t*CrErFqx4u)x4f| z@``6|c#qLZ96O*M220sY(BY3BbM`C0&4{_L3Yc+fg@IsOtV1zCiW=#d%J70sq|lmGzaVIqzY%?Buu{INDPxs*1>Cw&~E|b zHQ$0>nKmBt^*ytc!g6-869MF0s+KE&%30;9NvBlaUsU#9jKp?Ut>Le>X|yhP)mq6fs#> z8a}}4Rn(z1f6t7l#+5vFQk>=7+w>}p28fDQKUZLK%llo099n+cqXlOUVxJH8~M`0`RG1K}c6mMt6N_)n*X`C-`*eBO+{$g(;L1VsfVtg7E!+-QyFj#j6BZ_WB8 zD+BwLeJM<@DZI{f<%UKIOpM~)<3}1At&I{Qf~S}NEr0g~zjuM(hZ(byzw^E&v&Yvq zWVc7m<*d}Ck@ssj!n7*KRUT5d0Vig(QusZgNC_@ANyBQxe&P4jIR@q3LJB6T@cUbek*LYhL z)B8Q?|M#@b*L_39@R_@BM3Tz^F8F!qyb_wrK!xSlVi@fZrKL z%1-3*#EkOS9sJrBJd*TLMxj)bA*2WtaECIf3Qoy^Wvi5BMy;4x>tBAxh+h(AZze-(*6f(K)YFA-Veo zu9^KagZljh;Al$5py>rAO8vk|PwR85%bpc`baW5A>Ocd0Y+&@Fiebk2-i93Vb{YVG zdMsPwP%EyIzocVZt)+@379eM|{VK}erO{}FsXK}q%rSn#@FgBxl~csq&FHirGIsY_x&{$SKbaRHqcHQeqJdsycvedA4afl*OMmBeO(1{Wt`z!Tq4&$8B?d9 zhXFoA2Vn}oDNs=*wD)~mOJ>p({K5^8Th>s{7(3; z!~E;{knsoE7pJ?iPx6-k#_!1kVoWXfRg?SZ`*6>`HdpxVIq)c}4;aC=y!!TM{+{qD zQ__a!OO4}Ve&e^hQ(3;lbG6)3=*VSw9^^bnKH%Q@RF^$I6jSDi%ugPlaYQ9~ek>=u zpOmG?Z~geSE}Ny+*TeXgIjJHIkT7Igb{!+%|GPCmu;m7BOHQaIf9pea@VcM;CZP;- z15S|uQ|hVVwbqE|S&C^buPt-`pST8#omi&caIty7u0nnjzD00zv1LD%Y#-Gu;G>54 zO@0&$>&065O}Uo5wBxkTrf;<#X}B3>xQbeu)73^MwPs_?mC?#=8ldyq2V9--%i@U_ zE!oG91_8Gc16%_|+AI5O#BZuxmR-53s{Y`$^r_&fusU@haK!IK%)eemzCrwcrNf`s zfrqot_Ish}vv`e^aBL!g6a`L0o<-;%-IkcqvUV0 z3Te~kk9NMV@9pN2o*fbZ2`=7TsLRVX6H`wlD5Xm;(<%lF+&*8EEiX+zbH`>1ESom zRqi8yC&0`JDyB;0Z|m>aI!DKbbO*J3oe1_`P!I43-h* zvvbG&!tdHIGNr>c-b?AP=gKrk)Dd;~@oriEVW-COy2jJ83Eh`9`ukk&riDPn|*tJ={+@^z+eUO*+A)rN?ngm(3 zd3pCH7dzsUxHl+WGbvWd%V5MI;A&(NhUSyx6--#6USj)2TBg?>Q#gz ze!n4pf1AJs4k~g;6MAQp)O8Z2N3w_$G>&;Yi0ewK9C-fuBIt;9?9YW4>3G=MEJ!W<*j z+|((J@0IlZzq3xa)-MeZn_$icT2#?VrS%wDb`MR0V z_&^)Oq1NlTpcI5=^9l^GHe`k={HBOT`8#r1g63)GTvOETFsV`0bUx!)h@si$e8b$} z^7DVI&rRU>Ht@UokH=#tVi+zVW&!J%w)40AeKUNO$;Q!5J~k_b>%}xv_?;M6gw2gz z!8UMF_?;Af*2^)g`F+W~bFApKyaDBON54~-Mg1Qe#N;k4kJq{t*%?xV{-bp6*8Jb- zzrt9KA9Sd(?CjiwtMreNi`RVNzG>X$OE2DXW%gP7;+$q`Eu>9we zo2355JMaeo_ey%FStLS;tBc5T^_IM5+6L|)-C)q4a@e)HMk}q!qLwM4scVA!h1+ki z=3L{7oUV4xx?kUEv$hT!QU6adWtRNgg8bWwdg9-WRdS<@wwja)M0k4EZs*Hr&l`!C zL?`O0U2|6a@Vy~Bb$=Ib-&^w5Y5ZwY89}c*&Q)_=Ae3E1 zJBJJgcwCJ`OpJ1Rg}@~6OpidWSK064;D{xfmZ@Yy+HljT80{k=7w^-CIt?IM_eFCp zFP=Mf?=n05Z%Tu?5U2;Xu~ItK2ZlPHS!|fzmi`OA& z9%uot`(!Wv)=XmxYbs@2q1ZnLou&eNP}xtXsRQ4!2YPnAuyp@ML*S*oTsb#9G||q+ z2qOf54L1OyB?`@PT>r(IqDSAD&h8s6+2%*``VMb0T92P5?8s?XSYwgTlt#V27kqE_ zgYPk)9k@!Zma`L_GZns*m1*GFEmBRrCl_~+96a{2tQ1BQOr71MH;x2R|xMkZo9Nr{4VheV`Zyw#WK3`{K9^X<>b^+ zT#$BQuZb6ZTmDA>qQ)1dCOuX1=zN2w$7rHItrary6zU@NVWBF;fU-CGh6ti9ABWrb$-2cl~t7=yC<)dTe{yibq6z5qL`RJp){;APy}nY(ms-_q6% zK1RjpODHDf0i=;;-z)07E5s!1R3&p;l#M_qbQ*@v!;GmAGzpkdxaNr|Y~$Ojr8m1~ ziSM^i#pDhPGBiMC>a3P2ir9e=fU_8d&&wa9@LPqBkE&uIjPiYTw0?#(Q?{|LrpvhY zQtm!lAmqatub^W`I%L7WKqE6QJ-$G=qSkr|=D)fAqhT5IEOa^!Q(`v!0}KT`THlvG zwL~*9+EyI+b(WMiekz|jzpg=FR}w;kr+fdF@3r9n8t^~jM?F9DSxK(T#g**Hu)V+K z`r{ddnyl|t{?$w&Lg%4Bg^ObM3lHO~C{P(OLvj2JHF`DSkZ+@gG|aW&;KLAN+- zHAYkJr@t;9YF$PS>761iH3abv@ynz*oUAJH{+Y5}M@FJYvqd9uTxL7Rf7zDAt^YI; z^v}QyInm>EO8l1TrU4Wbc&iEuHi4RjkJEv11z4F*#V!6D?&Yo8Y{GbZ>HFE90W>g@ zN!O^w@un#eD!J9yFPgJGi2hWA7T}Rv@Xzgdn$iW;BE|8UgV~l%;<#}pB@2Vrb>WXx zEnBQY0yo+h<%1f3Gkrc|5@)sV1%V)fc2FjxU!goJBG({!vmXvpH_h{r|E^?68|2^* z9MS(GDWalHX{r)F=@!R)4$`Oe{d#^j)E8oeA?x??``*s99#W^Z{qh6xR;6nDh$(8&LS)cU0`(MJPtTY zPg?EOZ0bRzanE3wy9VZS9lz^%-xZC5Ud-XsrsfA%aapZq>ey$?Xaj?^&|+T7EAb>0 zKvjo97ww|g2_1@7U#jG+?=InaW#Fr(TCLDPZhiEB62YPNQ#os!q19%6YD;V397 z{sOFJ>gbAl%645r0gwLZway)YqXs5zxOx_Dv_o@88*|h}++tT+bNTfk=}iO$GCgoU z@Pl&70*4-@kqJL;*eqw7*qG;~`i zmA^ijH@6is`b10@z*&}k6u)?LE<$ges=TgYfZBls6CnA;m?jO#I5y{EYC&!iw z{ga2Ska7=|lvR7?%S2UTmNJzOocTyeB`@u{ge$&nEoZ9Xz_W3+WZ!_xg~xVi9F6>r zh~wf)%Pk95N$+;HtS)o74BNs_ZDlhl&3*>Kj#B;IkQJ_D$&^21^ zr-JU50*zSny@1DRtS?O;tf(l9|AP#e(tpEEKUa%==HMZ%4W5A0=Rc=>@u~FeVtSQ4 zaG(c!s2R~e2=Yo{TiU@7{r$}TY;3Ifdg^qx!pvkYcLn(*&XzF4Fr8)tS;X3Ux|QPZ zorpIrdviuC@u>@NAcE^sgo#LjXid+tNRhbfJ=E_92Fg|PoQ;ddGy={HS+*dT-bj|F z+^W#O&DXo^ji;g9wlgK9viI;vhj|Ch-37*cN~wiO7-`Of{DDfFlL#lHyUG))@-$=o>;9ev78 zbjeV@>40gD>yAUqS$!)}dRg34{P<`LaH$v|G1jsxPgWu8 z;3N%ltyZ8b-U3cXkA;S+n1%6vGjO9Vng`mRyS+r?&C`KhzC=pRUr|I(gFuR+qm(Bt z=OK)e;QO8Tg*vaB7#y1Cb64&U;Asm9gM`*$!ZBb-W3psO;4;lbvAozuy;6#4Jc)O& z-OKQxOSIq=9Hdq%G8zrdVQ0`k9rVxtT7bs`sL;F|xURF3*o$)nDwq{5NRu}o>X=@} zyURW2e&zDQswnhllA4$@=Be0qdz90#O7ZW(ypkp@J1@D|9Z~3i(Db*M7`b11-a1&J z|E=|lrK~CC<(_Zm$z*YhRZvsuEAa1%_{z0Dr*O`@lQ<8#IRCz=m+aR*=eOejswq

*>+ckS1dH*eQ-zWrwr{bA5pqQBW- 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 IT*{dFUo!I{`Tzg` delta 630 zcmYk4PbfrD6vn?hZw%)7mp?HcV~V6GlE}YeGg(>)vocc#FJ{!3jnya%mR_V$lBI=N zjhb0VN==k3WI4%#8XL_*vh>~Ny}Vmr@BZ%j?m6e4UiNwL_O4%q4bkbDQ2+s8D<0FM zt6SWaR@Ru*#Dx*i+813V#{>hB<&C9CC?1aKp$+Lv8isVGH1TFUXyXSBfQQF*rZp7R z>DD)+WM30-H4XHbvGwrwN-Pu!6EPKVA9e_jGH|9Ij`JIQRnrUNQ>15xBe$A7r_xJi?_9-ce+@81 zw(>{#nkfeos5TA0dSI4@E|X7qGiXbYY6jNGR)H6eBuW{@`WXRQ$kqgNqkNn# rUKry9CG&!EPzvRw$|x6APE}Bqlsl8mtLKk@1(}3C diff --git a/player_render.c b/player_render.c index 13aa551..92aecbe 100644 --- a/player_render.c +++ b/player_render.c @@ -25,6 +25,7 @@ static void player_avatar_load( struct player_avatar *av, const char *path ){ skeleton_setup( sk, vg_mem.rtmemory, &av->meta ); av->id_hip = skeleton_bone_id( sk, "hips" ); + av->id_chest = skeleton_bone_id( sk, "chest" ); av->id_ik_hand_l = skeleton_bone_id( sk, "hand.IK.L" ); av->id_ik_hand_r = skeleton_bone_id( sk, "hand.IK.R" ); av->id_ik_elbow_l = skeleton_bone_id( sk, "elbow.L" ); diff --git a/player_render.h b/player_render.h index bbb9630..4ea095c 100644 --- a/player_render.h +++ b/player_render.h @@ -12,6 +12,7 @@ struct player_avatar struct skeleton sk; u32 id_hip, + id_chest, id_ik_hand_l, id_ik_hand_r, id_ik_elbow_l, diff --git a/player_walk.c b/player_walk.c index 40b836c..99dee8e 100644 --- a/player_walk.c +++ b/player_walk.c @@ -384,6 +384,32 @@ static void player_walk_custom_filter( world_instance *world, static void player__walk_update(void){ struct player_walk *w = &player_walk; + + v2f steer; + joystick_state( k_srjoystick_steer, steer ); + + if( w->state.activity == k_walk_activity_sit ){ + if( w->state.sit_t < 1.0f ) + w->state.sit_t += vg.time_delta; + else { + w->state.sit_t = 1.0f; + + if( button_down(k_srbind_sit) || (v2_length2(steer)>0.2f) || + button_down(k_srbind_jump) ){ + w->state.activity = k_walk_activity_sit_up; + } + } + return; + } + else if( w->state.activity == k_walk_activity_sit_up ){ + if( w->state.sit_t > 0.0f ){ + w->state.sit_t -= vg.time_delta; + return; + } + } + else + w->state.sit_t = 0.0f; + v3_copy( localplayer.rb.co, w->state.prev_pos ); v3_zero( localplayer.rb.w ); @@ -419,8 +445,6 @@ static void player__walk_update(void){ m3x3_mulv( localplayer.basis, forward_dir, forward_dir ); m3x3_mulv( localplayer.basis, right_dir, right_dir ); - v2f steer; - joystick_state( k_srjoystick_steer, steer ); w->move_speed = localplayer.immobile? 0.0f: v2_length( steer ); @@ -470,6 +494,11 @@ static void player__walk_update(void){ if( w->state.activity == k_walk_activity_ground ){ v3_normalize( surface_avg ); + if( button_down(k_srbind_sit) ){ + w->state.activity = k_walk_activity_sit; + return; + } + v3f tx, ty; v3_tangent_basis( surface_avg, tx, ty ); @@ -746,6 +775,7 @@ static void player__walk_animate(void){ w->state.walk_timer = 0.0f; animator->walk_timer = w->state.walk_timer; + if( !localplayer.immobile ) rb_extrapolate( &localplayer.rb, animator->root_co, animator->root_q ); else{ @@ -754,6 +784,24 @@ static void player__walk_animate(void){ } f32 walk_yaw = player_get_heading_yaw(); + + /* sitting */ + animator->sit_t = w->state.sit_t; + + { + f32 head_yaw = localplayer.angles[0] + VG_PIf, + y = vg_angle_diff( head_yaw, -walk_yaw ), + mp = VG_PIf / 4.0f, + p = vg_clampf( localplayer.angles[1], -mp, mp ); + + if( fabsf(y) > VG_PIf/1.7f ){ + y = 0.0f; + p = 0.0f; + } + animator->yaw = vg_lerpf( animator->yaw, y, vg.time_delta*2.0f ); + animator->pitch = vg_lerpf( animator->pitch, p, vg.time_delta*2.8f ); + } + if( w->state.outro_type ){ struct player_avatar *av = localplayer.playeravatar; struct skeleton_anim *anim = @@ -839,6 +887,28 @@ static void player__walk_pose( void *_animator, player_pose *pose ){ skeleton_sample_anim( sk, w->anim_jump, vg.time*0.6f, bpose ); skeleton_lerp_pose( sk, apose, bpose, animator->fly, apose ); + /* sit */ + if( animator->sit_t > 0.0f ){ + f32 sit_norm = (f32)(w->anim_sit->length-1)/30.0f, + st = vg_minf( 1.0f, animator->sit_t ); + skeleton_sample_anim( sk, w->anim_sit, st*sit_norm, bpose ); + + v4f qy,qp; + f32 *qh = bpose[av->id_head-1].q; + q_axis_angle( qy, (v3f){0.0f,1.0f,0.0f}, animator->yaw*0.5f*st ); + q_axis_angle( qp, (v3f){0.0f,0.0f,1.0f}, animator->pitch*st ); + q_mul( qy, qh, qh ); + q_mul( qh, qp, qh ); + q_normalize( qh ); + + qh = bpose[av->id_chest-1].q; + q_axis_angle( qy, (v3f){0.0f,1.0f,0.0f}, animator->yaw*0.5f*st ); + q_mul( qy, qh, qh ); + q_normalize( qh ); + + skeleton_lerp_pose( sk, apose, bpose, vg_minf(1.0f,st*10.0f), apose ); + } + if( animator->outro_type ){ struct skeleton_anim *anim = player_walk_outro_anim(animator->outro_type); @@ -899,7 +969,9 @@ static void player__walk_im_gui(void){ (const char *[]){ "k_walk_activity_air", "k_walk_activity_ground", "k_walk_activity_sleep", - "k_walk_activity_lockedmove" } + "k_walk_activity_lockedmove", + "k_walk_activity_sit", + "k_walk_activity_sit_up" } [w->state.activity] ); player__debugtext( 1, "surface: %s\n", (const char *[]){ "concrete", @@ -931,6 +1003,7 @@ static void player__walk_bind(void){ w->anim_jump_to_air = skeleton_get_anim( sk, "jump_to_air" ); w->anim_drop_in = skeleton_get_anim( sk, "drop_in" ); w->anim_intro = skeleton_get_anim( sk, "into_skate" ); + w->anim_sit = skeleton_get_anim( sk, "sit" ); } static void player__walk_transition(void){ diff --git a/player_walk.h b/player_walk.h index a03e9a7..80cf5a9 100644 --- a/player_walk.h +++ b/player_walk.h @@ -24,7 +24,9 @@ struct player_walk{ k_walk_activity_air, k_walk_activity_ground, k_walk_activity_sleep, - k_walk_activity_lockedmove + k_walk_activity_lockedmove, + k_walk_activity_sit, + k_walk_activity_sit_up } activity; @@ -41,6 +43,7 @@ struct player_walk{ f64 jump_input_time; f32 walk_timer; + f32 sit_t; int step_phase; } state; @@ -49,7 +52,8 @@ struct player_walk{ enum mdl_surface_prop surface; struct skeleton_anim *anim_walk, *anim_run, *anim_idle, *anim_jump, - *anim_jump_to_air, *anim_drop_in, *anim_intro; + *anim_jump_to_air, *anim_drop_in, *anim_intro, + *anim_sit; struct player_walk_animator { v3f root_co; @@ -58,12 +62,13 @@ struct player_walk{ run, walk; - f32 walk_timer; + f32 walk_timer, yaw, pitch; v3f foot_anchor; enum walk_outro outro_type; f32 outro_t, - commit_t; + commit_t, + sit_t; } animator; } -- 2.25.1