From 4aed7f66e171aaa8ea966855d6ca0ab6dc2dad6d Mon Sep 17 00:00:00 2001 From: Fredrick Johansson Date: Wed, 19 Aug 2020 16:48:19 +0200 Subject: [PATCH] JAMSPOOK-13 - Car and driver implemented! - Implemented car and driver - Tweaked the friction of the kart physics component to slide more easily. --- assets/meshes/kart-driver.bcosm | Bin 52124 -> 52124 bytes assets/meshes/kart-hulls.bcosp | Bin 11724 -> 11724 bytes assets/meshes/kart-vehicle.bcosm | Bin 61724 -> 61724 bytes src/JamSpookGame.cpp | 36 ++++--- src/JamSpookGame.h | 34 +++++-- src/entities/Jump180Factory.h | 4 + src/entities/KartFactory.cpp | 105 +++++++++++++++++++ src/entities/KartFactory.h | 141 ++++++++++++++++++++++++++ src/entities/KartPhysicsComponent.cpp | 57 +++++++++++ src/entities/KartPhysicsComponent.h | 82 +++++++++++++++ 10 files changed, 439 insertions(+), 20 deletions(-) create mode 100644 src/entities/KartFactory.cpp create mode 100644 src/entities/KartFactory.h create mode 100644 src/entities/KartPhysicsComponent.cpp create mode 100644 src/entities/KartPhysicsComponent.h diff --git a/assets/meshes/kart-driver.bcosm b/assets/meshes/kart-driver.bcosm index 5b96ac02e319d9347b0ed34b82d809d5d6dc178f..01225db63b4d0ae6f96743222a577b43650ab554 100644 GIT binary patch literal 52124 zcmd^Id2~(J_ZI|-gra6K$5)qFV(_0^1{`^_1bgjKUpSSlp`<#33xo4k`Tc%8z+_e9U zKbf`v85ABhyh`t=0nvS;{33_+Gfe+){%xP_b*P_R-y()3&Z8UCGuw+?>?iunTrKj= zn=1ZHj8ZPV7(%6UoD(U_KcnwcpVR7oqr|c-Ux``^i&CpE%Bx38{VB@m_Vq4%O8cGS zrz_!Piz}XR`L}xl@gw{+%|Ac?%`X2U7bzkve3OvgCx07h@^8+Oi6Yx?GcEj+{+}ml zS0;}VUCw<#qfP~>lH=;>J6e3w|MOI*$6Ve1YWsL#Gp#3z-gRq=K??$?Uq}r#q|Hi){QW-9chXkPUhJ2}x_!sG zuGBjH8!s_9i}#<*|BU%vR&W19wB0#AI$o|H=H%nBTAMH?{VE z{d`#cC|zu(PV{QUcyX}g;Yr0FzDUdqIYV9D%2AE#2gKYw&1lMsdXCXMZEEPy%Ie&p&&AK5-l5wkiqWf> zUq!>dO{r7x#)PpegzeS3@haj+_#+RW38nH)y4xv$hE_T$rpL9R?Mu4Q=EP8&$E2+4 z+vV54=Vw5^1!DQGOm><7XDf6Sy^pxlS+`rFrB8XPnOv9<|J&dfp8Ly{|G#v&FFvo> zSbTmWMBMU-cIN-T=NIa~0%=>F{-3AsynoX3zxy>miYilwmbx9Y@$qeyzX;Fcll(IO zdHW#$P=40e#_tNf{S$QmW&Q`(FG;hOg-{{4>AMg=!lU?5exdwyJGNXjzwBl&=~;_b zZoDXpjcZ1?64MhB$M&R@+35=6NB9>@ZwmLPneF*fY?OBDl33KOHI=QCmuBV;A@8Z5 zC^A3alwZ96tnxddawQSn+TH%iq;%@}XP}5J>q!@m-Vyo2JgC2WO+EkL#E`m9*9t0wOgy->XT6$m1n4i$o z|5@eto!cdCGXLkSc}P7=_~`i`7Vc-GEhWU0Wn&2OBYe(Yw}OoP@4BFfp8u=dP6l3o z^07!=GLlxt)DtuJG_n_KahjS1b|A5}H~kr`*+!3~>cNF=!KX)y96@$_{R?jPrNgXUa4|-~YLy`7ifZ zI}ks@ zqxevM@&2>QZ@xchwLgmZ5gzTIa{sLI3-ur0AKb9jQ^@hb_eT*w!t?kfzs!HWe~kP? z{m1tQCBMvnzCVii5gx^d{6qQ4_eZ7wGXMGhDB?$W6yLHtGemmaC-lww6w$b4Ir=!g zAj#pE=;*25teCEh2|Q|(_BEP)${j!5UNpvAja?a}&I;eJTxl0)3vZH0nJ29gsR`BS ztB!tDGo`RPHck-(-2+s_kMNydd?6%%7L9+!E?=Er`ltCOq>p8`Cb;~M|Gkvq9~u6k z-+xzrgs&EVO!xoQ#5E$=tEACBWVBDRHvh@}Z@E8y@9ARkD&~Rs+3kug>RN5;zSmF9 zt<9f?{p73lx;^{ONlNBx6U2qzhNyWp`z>vMSmLEUde1ZG^G&wW1Z@uW(4KFv?P1SX z|HJ4q1r2?j`*Vxw{g_o^7UmDaqxjMOVC1x9TXaAY)tDowb-Tl2{h|i+se1!8 z=$wxl(}j@WKfwf(()TkGiid$lgrr{o=x>d?3y3Ej@c!~I8uNBcJ@KGZ&Z{VvDv z6d!7zd6&~{k2_?tyPvH_5uO*sg)0rH)%fyi+x-=2 z^a_W9_z@oMZ=v@KwEl|G-Y=>-zc0)83;BIn&wu@|3556&zOMFuW$?@QtBm}}KeYZs z-xm=-!oO>L2tQJ5fBAfp=MQB2%kN9P{ZacNJZbH3@XPkk$dCL(?SsB=A%28^*Z2^= ziMGFLd|#9MtMdCAZ-3N&2%lZszcTpc{#8bPe-_d-u|fwj;KV1n|O&QA!F39+8lKt zeuPix!z(0AH7FOv+vk0 zB@R{Y8L(L?KcubL zb|9Di`iHw|=g?TPSB<2y!Fg?8XK$mHkISbbeuU@!b0Ty&EnYL!)W5mzy|m@t?rqNz zyqyX(_Yx(V)~3FR--+>Gky@(VduqJjK3lzdIqkiD_fW1+Dv1V44T?_MC7Pe|RXbL# ztd5G$W!rPk)BbQ-B31t1ha&uGbt+piuV}KctQxmM+rI_;2>)FBzHrmmOZV@7bWJg` zM}VFm>%BXu`BhJKZ0dgTvT+W3$0rYIR_lCpz}}Ib#61`BO**RA21JRx*-z>AzmA`# zJVlG?_NzW=BC%OdbzCXc5i`q!YUV3u_ilfZd^-5huDs#&;7lxqwyCTXPtBzueuVcr zo=N9F(C!Ic*pOG}KT*FwO;2v9j0;f3%fl;#{QV(|C289PG zx9*Qn5kJDC{<*xSxoG;Ok9|=8mGpk>Nt^$UP&ycYRTQ_)Qnt?M4D%P|C*nu=^4j~U z^zTKx#Wbi-b#Z8AC>0&xE%N$LRj%hBuJZn|$}beZw3q8w)xP)QDSCFj7`<3Ih#nk` zrE%wk_%-#0<8Am6UfPZPm;6WT_obU2BSdt?-C~*hY9Z~*zVNc|z1xNMRv~)7j3*UI zpDq@}HzSn4+&`=QMEnRZ?S}u-KbimBf7HGxKhw4Rm;5!8zM&iUD(LNBB#$=*B`$HS z+uB}5{BMJo{QuU!(;v4GJ!|{fr;l7oYNM03DLta8Yizt|@kKecTY4203n{jpMPKG->2u7=}lM91)IK4zfJxc@mu95;^*;M;kp0PzmInXnZA#s z_C@*0zc0J*_0`*le_uxY2#@-Qe}7Mm3ZnE0O-$e4uQu;i_3?FZu5Q2dM+5Q>|HKwHY?E>+f24}|5q_A)-z}=4U4DPxln_Lc zzfW9s+s;|tC`+uH%Ga;kU-qRH_lKC)*J%C6pRYbwhtb@DF~rwLh#%qk`eJe60kn2) zv}t|9*Ecs8^rjYSq-lM_*WcbV`q9M~ADPzoh#%ome25>lFIu1T_0jM9N74GmBZ#k$ z5I@4B{^9=l9x6h8Kdo{J>Uf>0O9s1~sN$C#oqM4|Y&)4~jOe-;#3{ zqz-#Rh_BxeKYu=2;dy)$P8FocF~O$xLH;Fa{>$gb#v_~PQr<$^_-;W7{udlR&2p)0 zp0!o^{4_LgL3)tfg81_n@gqEnkIygvYg2(%zAlTXUT2}Wnmvlp^9wzn5I@3) zYyK^Yt!Mu_A&b3ASRa!9{d6MPwkohKm1vWjT55Lr{#8=*U#=ge{mGW+Huqr@m6RzX z;QABAhxid5#otu(f8x_@_FwK~weR??f$o1m_#)fAGcoFo0mB8KU#;FB(fS(kBRq<~ z#EnBia(^f?=?Tf_SDW(#XxWxywyU-%wQj%?f#z=>pVjjN@gqEsf6Uzoiv4^b@%BaM z7t#I}_b+K-VSWFJ$B*#5eXRDs5I>*4mRhfLHr2M*LS6_)S->- zTbs@w^7;M7nbLHrNh{O*j^G_J@ zzj%CB?{A17;d%U7z9?!dH!RxJzWn*V!FI&fp?{ER{ebrWP<)6V;Zgj2f3`%zL)#zz z0jB*~wEv0XL;MJj;^*VX>ijT&e~{;Q$NfCO^!_kVKEKa~*r!cQq9gU%>Gm4K7TR9a zA4h{`Z?_?Sgh%I>5uQK4-#Zkd`^TT({P}Nnz8mo)Jn|o%Z$sxlqsJ5wy;gos2OF26 z3Qf+~_C?OKH9A~ct-LzFn)z8KLi`B7r|Bmy{)gpLb$a-5~1ov;zHXFV4 z9%VY8%Fka-oLPx{>W&rs{8fzRf4!7%X}{+G>a!K8`};|@PPINzYZfd*JDZ$`{0PtE zo3_3deNpV5seO=t{Ct$(?1H-g{CwG7t$hstpMO?Z_g}V8^2$gGTfIpjeuPKyq4SHV z|55)UeuTfN)vp-&*)Z-;=gnvDEJ?aR-X#VEP;_UGr%I2c8nO04{0PtEyWMDk&aaIxSNov;=d=#P-FNnYQi~tEvTu=2TM~J{E`{;g@RXYYqN26CUXNa(r!=(m^d! z%bU1=R^uCupJeU)t@p*B>EVbp(fxioI@^1Ot>LWF>hQq2BF|Gwt`w&EnS%ot{$;eOCzI^;x%`g7i`DCO0i~jzekw0YQ58_97)IZ!mtMSd-&uV_* z?bCJ9BysrkE}5UM_Cfpz&*NL0yi(jcKUa<~SNov;_P*kfB&EO5&l`b2crG^DHOjxk^&=p(U!tLi05_2(NDpbZ4JXq+vM}b zsBbUSwI>x?=taD~o!74~Y|@QxRDPfM{S*%do)kZ3e?fz4M$_qyU8z&YG~peQjW+)k zO238Qg!~Afu=8utc1*Ecop++5UXb%8$f8Av^L1nK$Hs$Y3^ zYzLthuajFKeuPKkgZq~#3|9$%fb=Cu7)s^IN|{Nwc}%Ujv0X!D%J>rYDhG!Vs?KB45r zQB*(;rkkVFMUO#M)gk*oq;hWg1mZ_{6d(7mq*s4B{XB=sKQzA4_(J>$&*O8i-jD1_ z_e|}>=dZEfJr!$GTM?gMdH($w|5W_^q#5z~o!4LaZp}ueLYtcIXF~i4&+l(Kl|L)d zkXEMqq4@Y;fA@h%{i-AJ`IY~E#NBiezP^nqKF;50n;Z4_X#1b|5uV?_)3;e>TGYLx z>Ha9*f8`(lBF6XcNPK?f^Vhw6$3)5c?TF9s{C=K*J4t$c{C*z9kMO*H>JR0jxcF&D z)BQr+zxlEE#mr7!P5z<&LG6S15uV3)zM>m7-5O@PzX;_wpTGKi^i0HFYeanh;`N2S zM`R&cKgjC~5kJDC@xlEoJR(Vi-tKGikI!G8zn>SIXGRd8-+6srr@)({(2)pJ{UhQ> zcpl%FwCiGRt$wEVLH_aiD^smM#MeLcAU?nI`o9yiZ;9gP!%X#qh#%omeB8g8*^Y|^ z8@rhNL*oyPFT{`VJiZ>`$)Z>pbNitB9`t=as%UwKaevWI-+Acw7qv_-=crrQM?6u- z5aLJpUF%9ajQfkqJoM1-FZ$Z;#O~|nP;z#%aTKgFH=ZJ3E^!sxL`+x5!{z|()r)WEs-w$JTKMtxNt*rTP z+;7ujd5$;UZ)3%e@X~JF&m;Ne{mpWJ<8AN9;qh7Bf5Z7>{5JmQ`)v?j_K$IYkL1sI ze-FAJ2Hk)2uKW=1^nbf{Kacc3 zE%x>4rH=04Q26&jtNSTq~V0vQ(*i3C8)? zBcr|a^Ph>cFFCHn4^xHzGJ*IJ9<5JN{ViWV-e^)sJcuku{Qg9~KD^-GMYQN&j`;cz z@gsb>Y^5DWeR1j4okhOX>g2s5o6`7V8FljBU=`Jmq58_++WOY0FK*eeix}1+fWAvT z>sY_9y;^X0PRNh&g|+!X)^EPl>Nls{>L#Xq8A>^Vvnu(TOjT|~3|IO2d#n036yLk@ zBYZy1f202Hmmy)|8+$bEI&t119u-$-sEt%~J`bJ0J6)rWgP%W)yFHjf;>tK)dW@$! zTNc|8Kf+(s_>J@b^8BFWuM$4rv2sNlDzh^WA^*_%$zvM7QJ*ExS4w{Q{il{Et$&UB0cr0$pdXdlGTV_FF;e|Kaj-!A2+!vy>EESC z{fN(R+&`=O1ynzfrnNt>-+1WJoDKzFb7b3;AUui>`NzkfRs9SfU(zo9=i>|UBRq<)syx3e>zlRu zORM@MKEGPkNAdYh+8-wdo8~vfkMMc4@x}d<{7-|&I=cIQt6a(+sq*>7s=kx|zO28< zSYOKdr9Elef8$4ZK0itSBtM_u*2L^kjQyJ>yP|AP{Vc`M&swe7jrF~>JN2s+xd$Wl ztNJXspxoB=r=C;fmlbSIeIeD*&qDkN-&g0C_Zz?Fcj|YkhJF{fXKt2_uKlX(XSwX0 zzgw1PLfSR`Dwltm`aW>_f1adW>T7BGS*oF*h4>Nv_3yvFpIQ3n)bCOa{VrsGJO1@r z`y}Z8JN2_vLq7}gzqbE7{_pq`Ncu1NwfkvRL%$2z5x=ze)$R|K`!lg~(+vGA)zHs+ z8-9eJq3!>Cukl~}G#fefyHrEJ3+4AJE&q-C*JS?7_d`v;N-^}SdTahmyVTE;`7iC7 zK9p+cXCZ!s|GWLH#}~I-1W;5^s_?UFB|$< zilLu{e*bOoZyFyczXy+6su=qV`8;RaocdLYpsYP!0X8`+G8}KRWfR>;qGT{64Me zSE+`6)waX)6sezeSJTfrzT>tS|4i4<3NrMw5I@3CxVKD^`dwj~eplA0WKp%Xem=xz z=y##~mUiQQKbikd{VK)KuWI)7V#UzUYIbmr&8eTI82VX=AK`iaT8%Gmx5{tMf2I9l zJ^wZRDwltLaXX##5~S;A%}ZAh zKfX?emX^|O+i+)?s< zr0Hk*)+EG_@H~I5#uvA5A6kH%`dP00=KKYh5rOfHi8TAF^A zYUpPneuU@w>-I-sou7{{WJmnsYhT^}+M0gWfi2!7^|K1cd#Qt#1kg`6k`=^{@O*q6 zN-Uf7@cA)X?;^=4$#`AAgWrKmQQlrlU|tYx-GJk`?s(2w%S4 zdS#ZT-_=ml?>e5V5IOa`0uB8xl;7z40@|NP{0PtU*J^w@=Cx3yewL3@KkH8SC^|Z| zuW~;kR=cNZOi&rGGm6yDGW4r%c#fjsRqCqUs`}Be@E;tLhW?`44gD+{9!ouQS5qSz z`jb+)hd}%YUv1PRMeg4=bn16G+7GA6dG;vU-ZN$XD-*@MvTOI;Hn1;p>Syh}H;gW> z7^~lIPemp3g!2Z-Y1Zt&Tt#EAX&P=2HR%fI)htoJ7oKf)XB_iy8i z+pY4O^MAUeqMrYnepQD3Q8|9kle9bavt0X=i2wEe#J}TF{vtc#|2w_}-G8TkmTP|! z@guwu|G$kdWJmncZtPFW_Lupo>1Vn2C*Ou2;omgA632d_NPVnznm*Q^sfGTbpEZ2? zLPhFVxoP@UoqP)aL%*uU=L;N$epcb4x&EOKh4>Nv{gGE3F8!_>x&NV$)v(?k<)PF6 zuouM)yK3lXwGR5t<^RFM#SQ;l`d%nL#EtoIOX8S+R*C9JP|Ax-@A^*|uBYrvljs43U*Y+9u zS+4H`eE+lB{eSj@9ftlE8Twnuj?M?7{zv=> zkNO|&&!PPbb=hHup`Ru97pKRyk@X{F=w~5*guk@^k;BmMD)q%xQFwoASwBLCeiv#V zzW%QHV26JGlE2^b^}E&iOvI1ysQ*#>qWz_Pv$85uKP$VYpH;KzBXMnPYgzw7hJF^} zM|jjf=>0;rkMaH5>U?Uf_I_j7<@-&>^Q(v-;nDgJ*%3ebzKHk{9<6^-`=axsBenK7 zzOTym&v^b8@gqEHKV(Pz==&DpM|jjfsD07-*BEVo*Z96C_jfa%A4dELkJ=B}5kLCA zg7^_0^$%)aw10^92N6HQqxM5~#EiD29I4n)=H`!lqhMUr90a zvk*VRM@_1(Nd2zHntoTB#}*O%Lv^Vyr5gHOox_(qr2kSstLwr{x<1y471te?OAS+` z&R31@KDz%>A8Yl>^ERoE6`5R1B!@(*en;mE?qB=qr)*Mxi^q@fynULtKc@5Z_CfqS zKB=E|@@g+re7t?6epSKra8vtsm>#BZ{jBi8;Z$+O`;M<)v{uVc%cmlKg#V~URfX$! z{q7b)Va@#1W~+VG9_zkUYR>mm4E-$s*hykW#oE;ETD&r$id`+8JCBOahokfDh#%o| z`X@OI{VwHcf3Z2f21Op+p)_0OtIB&icT6~{ymIPi4cb+S7XLAv9u0e@Y)bE_{?Xy43I4mA?{g@EAxZkM>t5``1%Ok97#QP%qt{OViJKqSVywntqmQ=w~5* zgs(LJtRnTju50>Tw7SvW_2_B`^2(D<-MuqRS(DP1xc~Bg z_b-NZGx^W`llP-XOz32aAMqpnZ<&Ya{uffS>iS*T7qq2f=VmBJY<<-(rQ!vO54Dfy z?xTu4|2$mN&$`*!uD8FYzn~cUS%@Fu_x9TP+J8;IYnOJnv&;`opTc42cX{p$Rb+j` zU`;=(%qR22u}PtnIPa2D+<%s`eOVV3)fb@gf%p*~jUS#LR{1UM<+bz0M*jC7*@KS7 z_EXQE8zdrqe$ew@+NHkI>9#dV+BN+w)zHsE{IY-Fgh%}!KX<(%@rHg@AD@nt*WE+S zJ@tR$tI!sD{u};FeIJ?s+<)$$)%bWDeq(;H!lUtn;zRA@q2<3kUmc+7XZ_U0uD8FY z-=P}%S%@Fu(fHV0ptEA=XO+o6U#OL%slD%drDe|YYFGz9m7fo{s-HpQ1Mwp~8b2t% z`S;nOjjGVR1|3b`clr0vc@;m@?fm;N;zxMY|NQ%~tUstftexrmF!x{TS8e;elgWSX zpVjz4{0NW64~h@95C6V>=>wbI{`~tk;zxKiKKS=>sh_oIOOWaNJE|W*^#_O_;d2c7 zNS_}J{jMh;1XA{flaz@kepC)5N2q-LD(jOnt?gx6-}C3Y)UWcq-^H{(;Llg7pH;%Y zi`36@txpg?!lU&sUti4j=uLgk_cX09kpFyrFZH#4T@qn>KR|dCAL2*xq4weH6RDr| zxNSGn`ULSKJbFLi_S%DrQR}NV)B6YKj}0q9xlaa~{NvA;zST>Ty+A#wpXFM=A%28U z>%C21pS95RyWFdnpp|p#NqrGv=yxGI;^*_jmD(lgVnAc5Z{m9XB7THV)%=&w*LY38 zYeB6NW|nA{VqPfrG88Py5{lC=LcCIma+bdKcB7YzYssd^XIqJ?@CJvG_4O% zeH*HeL(eC~kMQXEh3X5@@4qWQ!lU&ks_#Vcy(>S$^Z8xApJsf2MD?{iKCAj(&TsYn zK>P@g=6`g4k^jEc{Rn9P3*otcR{LX!pU+>i{&HB|0Mq=(*H==%>Pk|8>HHyD-ynX3 z=ku5JFXQ@$&#zKH>vZN?rumiszSOUp5n_&y^IOfoh#%q6{K=m$L+^htyrXpeEZ6gm z|9(`>9m21Ou3zPPesF%P_cz3k@aX-EKi};uwEfr`L8kQs`u%t1M|iYx>`C)W^7v0Z*_z|AJKUv)`f$+$G{`{BvSsBk)BYuSE z>lds0H{|)WH=Qs0^V~E=>JJ^(^rb?IMg2p+YS*Gtx?SpLrQMoi=x0%t9R<`^BVGx_ zkMQXHC$~?$8ce@7o@BZoj`O#?6GHywlB9l>%fFqP|Azk2#b;e9Yv?&!r-~oYhdxDV z>x^>(@gqDxAC>uDC=LH^y6OHmWJmnhwEmI)%l6;XY%q0CeW2?{82VX=AL04=s0t4T z(#G}w6PkXP>wFtJ|Cmdw-!SrL-GER-zsjYrhVl#XBRtAK6d!6I4=p~U{Z-FMiroCj zq`!vv5uTrKOV9f;%`QJxX!>2Q^K;y8Re#U<*A{(j=vTS);duWnUzL@d`dP02LHr2M z`_HO=ANAiJ?R=}DUv+)ppnvFBxohW34g3E7OAP%im;MgoM|eJeSj}(TZZ*Gf{^7sW zr*-Ehne>5LY3FYZ{j5dXdurd97n<~a5I@4B`2*Pz|Hs<-V(EXnrk@phdkA?&uhi!s zLq7}gBRm>^JpZibmqyz8;uV^H)e%j<>Oo{ZBR^C_zY66S;zxLte<(iGKCQI#(MJ2P zuOCfa&a5@*uOWVf=ktfv{KoB8^9$$C9hYM0SGn}zc>nlZbtk8OmaBgdKf?3=vzp&f z|MBzRa{kGvU&YV2%lRjxJ`v(acs_qv&2QXpHNSBFQR^Deq?K2LxIPd+zrXDBa2h=C zQV`eoLHr1h<_}~?{QUfWw*y1zW@&emeiq_Kcr^Za{#ng0y#7Gio%!LaZ$SBl_z@oE zABqpP53kQyoqsfK>!Rn6t3CtqBRro!tmZdvx0+u#zu%lYhJKaHKi)s_gR_%UKg-oW zh#%p3|5?p%{C*C%l`j1(*ZntBE29XYl(Kem^jbe(02+(yGL|?k_2P<%!bKsb4j9;V@b^Fiq-L zsfKBk6#%WtNW+vce&b^*O%{I+L78;@|OBpuKMz`jn^to zocdL@2Xv%dtL{tvDx0BS_1@DnN}^Lg%e_TcIy&;c)Q3_H{Vc?f@VtJ$-R3S-#-ZzX zS=R5n4eqbU$Lsq!|L;Kq>Cv|jO#Y$%;lFRikMOAfP=2BO92pa;Nd2s7nts-#0+ zwElys-jU@gqDRf5kt` zOat?_m-=0<=L;YISK40@I}%WkInKE#jkeEv?lk(t(%>uj38x&1)*yCSY!caxp-S3dt#*O%h;hrB*6 zyYF+MhJ>5y9}z#o^Z9${-aDeelyKAY1=$flum6i1{ZiNGYQ^dY5kJE7`FnH8+rqbN zAJg-N+Y{^uwfbpY-^=y<;rxTX`dy?p)Ag%d^^ItJBYuQO;~(9RkM8eB^#_O_;nDeS zq>qqLxsovM7wh?Fpsw$A;piQaFHE~%%)KUsMfwV({-^!^x_bRg_dHc;-oiuLy+XwZ z@gsbBulY8kKIdFFU!6Z`_8r@$#G%Ta{4vD+8{>IhEH6UD{cGV~TK8YxFDC7!Kl3N; zelarc7i-z4ypZ)lAzFP1=YCrUSo8SM` zbJkSxewT8@?{`Dr@A>_4o_%(T>wdm6|6KRm@%k#O`m}fDM|cz;zyGX8p~E6~y|SkJ z`*?ktRsA1|5Ah>BY+s;Hh|VYR_^j&t(D^Hb=kZ(JFNg9MDm literal 52124 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 diff --git a/assets/meshes/kart-hulls.bcosp b/assets/meshes/kart-hulls.bcosp index a3ead4d2ff1dfc21b6a74bd14273157edacabb13..a23875bd1c70ef1d7098415bb64630abbe5af0b7 100644 GIT binary patch literal 11724 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 AKmY&$ diff --git a/assets/meshes/kart-vehicle.bcosm b/assets/meshes/kart-vehicle.bcosm index 6dfabfa4a4b347d7afcc80a9df89410fd50f2ede..62e972f1428039084b73c24eb002c1cc84bbe8cd 100644 GIT binary patch literal 61724 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 N|A-&qdHj*||39iK6o>!- literal 61724 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 BDu4h0 diff --git a/src/JamSpookGame.cpp b/src/JamSpookGame.cpp index 02020c0..ceead3c 100644 --- a/src/JamSpookGame.cpp +++ b/src/JamSpookGame.cpp @@ -265,20 +265,32 @@ void JamSpookGame::set() goalFactory.reset(); - // Create the ball - unique_ptr ballFactory = make_unique(dynamic_pointer_cast(findSystem(IDCache::get("AssetSystem"))), - graphicsSystem, - dynamic_pointer_cast(findSystem(IDCache::get("PhysicsSystem"))), - renderLayerGame); +// // Create the ball +// unique_ptr ballFactory = make_unique(dynamic_pointer_cast(findSystem(IDCache::get("AssetSystem"))), +// graphicsSystem, +// dynamic_pointer_cast(findSystem(IDCache::get("PhysicsSystem"))), +// renderLayerGame); +// +// ballFactory->createBall(vec3(0, 3, 0), // position +// 1.0f, // size +// 10.0f, // size*2 +// 0.1f, // restitution +// "base", // ballName +// vec3(1,1,1)); // lightColor +// +// ballFactory.reset(); - ballFactory->createBall(vec3(0, 3, 0), // position - 1.0f, // size - 10.0f, // size*2 - 0.1f, // restitution - "base", // ballName - vec3(1,1,1)); // lightColor + // Create the player kart + unique_ptr kartFactory = make_unique( + dynamic_pointer_cast(findSystem(IDCache::get("AssetSystem"))), + graphicsSystem, + dynamic_pointer_cast(findSystem(IDCache::get("PhysicsSystem"))), + renderLayerGame); - ballFactory.reset(); + kartFactory->createKart(vec3(0, 3, 0), // position + vec3(0, 0, 0)); // euler degrees rotation, XYZ + + kartFactory.reset(); // Set game state setGameState(ecos::core::GameState::InGame); diff --git a/src/JamSpookGame.h b/src/JamSpookGame.h index 8c76359..a018ac9 100644 --- a/src/JamSpookGame.h +++ b/src/JamSpookGame.h @@ -12,10 +12,15 @@ #include #include #include + #include #include + #include +#include +#include + #include #include #include @@ -25,14 +30,17 @@ #include #include #include -#include -#include + #include #include + #include #include + #include + #include + #include #include #include @@ -48,6 +56,7 @@ #include #include #include + #include #include @@ -56,6 +65,7 @@ #include "entities/GoalFactory.h" #include "entities/BallFactory.h" #include "entities/BoxFactory.h" +#include "entities/KartFactory.h" namespace JamSpook { @@ -69,6 +79,7 @@ using std::bind; using std::vector; using std::string; using std::to_string; + using glm::ivec2; using glm::vec2; using glm::vec3; @@ -77,6 +88,11 @@ using glm::mat4; using glm::translate; using glm::normalize; +using ecos::utility::getWorkingPath; +using ecos::utility::getRealPath; +using ecos::utility::getFloatInRange; +using ecos::utility::getIntInRange; + using ecos::core::logging::Log; using ecos::core::logging::LogLevel; using ecos::core::Game; @@ -87,19 +103,20 @@ using ecos::core::SysCall; using ecos::core::BroadcastObservable; using ecos::core::Window; using ecos::core::CycleRegulationSystem; -using ecos::utility::getWorkingPath; -using ecos::utility::getRealPath; -using ecos::utility::getFloatInRange; -using ecos::utility::getIntInRange; + using ecos::asset::AssetSystem; using ecos::asset::AssetFileSystem; +using ecos::asset::DataManagementMode; + using ecos::physics::PhysicsSystem; using ecos::physics::CollisionShapeLoader; -using ecos::graphics::TextureBlankLoader; + using ecos::animation::AnimationSystem; + using ecos::interaction::InteractionSystem; using ecos::interaction::InputDeviceState; using ecos::interaction::ButtonState; + using ecos::graphics::GraphicsSystem; using ecos::graphics::RenderLayer; using ecos::graphics::RenderLayerFactory; @@ -119,10 +136,11 @@ using ecos::graphics::TextureBlankLoader; using ecos::graphics::ShaderType; using ecos::graphics::ShaderAsset; using ecos::graphics::ShaderProgram; -using ecos::asset::DataManagementMode; + using ecos::sound::SoundSystem; using ecos::sound::SoundEffectLoader; +/// class JamSpookGame: public Game { diff --git a/src/entities/Jump180Factory.h b/src/entities/Jump180Factory.h index bfe7ed6..74265fc 100644 --- a/src/entities/Jump180Factory.h +++ b/src/entities/Jump180Factory.h @@ -72,6 +72,7 @@ using glm::eulerAngleXYZ; using glm::radians; using ecos::utility::getShared; + using ecos::core::IDCache; using ecos::core::logging::Log; using ecos::core::logging::LogLevel; @@ -80,8 +81,10 @@ using ecos::core::Message; using ecos::core::Entity; using ecos::core::SceneGraph; using ecos::core::ICCResponseComponent; + using ecos::asset::AssetSystem; using ecos::asset::DataManagementMode; + using ecos::graphics::GraphicsSystem; using ecos::graphics::GraphicsComponent; using ecos::graphics::RenderLayer; @@ -97,6 +100,7 @@ using ecos::graphics::Mesh; using ecos::graphics::MeshFactory; using ecos::graphics::ModelRenderableFactory; using ecos::graphics::ModelRenderable; + using ecos::physics::PhysicsSystem; using ecos::physics::PhysicsComponent; using ecos::physics::ColliderFactory; diff --git a/src/entities/KartFactory.cpp b/src/entities/KartFactory.cpp new file mode 100644 index 0000000..78a419d --- /dev/null +++ b/src/entities/KartFactory.cpp @@ -0,0 +1,105 @@ +/* + * KartFactory.cpp + * + * Created on: Aug 19, 2020 + * Author: fredrick + */ + +#include "KartFactory.h" + +namespace JamSpook { + +KartFactory::KartFactory(weak_ptr assetSystem, + weak_ptr graphicsSystem, + weak_ptr physicsSystem, + weak_ptr renderLayer): + mAssetSystem(assetSystem), + mGraphicsSystem(graphicsSystem), + mPhysicsSystem(physicsSystem), + mRenderLayer(renderLayer) +{} + +KartFactory::~KartFactory() +{} + +shared_ptr KartFactory::createKart(const vec3 position, + const vec3 eulerRotationXYZDegrees) +{ + // Create instance + shared_ptr entity = make_shared(); + entity->setEntityTag("playerkart"); + SceneGraph::addEntity(entity); + + // Create transform + mat4 rotation = eulerAngleXYZ( + radians(static_cast(eulerRotationXYZDegrees.x)), + radians(static_cast(eulerRotationXYZDegrees.y)), + radians(static_cast(eulerRotationXYZDegrees.z))); + + mat4 translation = translate(mat4(1.0f), position); + + mat4 transform = rotation * translation;// * rotateToCenter; + + // Add physics component + ColliderFactory* colliderFactory = new ColliderFactory(mPhysicsSystem, mAssetSystem); + shared_ptr physicsComponent = + make_shared( + transform, + entity, + getShared(mPhysicsSystem), + getShared(mPhysicsSystem), + getShared(mPhysicsSystem), + colliderFactory->createConvexHullCollider(position, + quat_cast(rotation), + "kart-hulls.bcosp", // filePath + "kart-hulls-shape", // name + 100.0f, // mass + entity, + entity->getEntityTag())); + delete colliderFactory; + // Note: Editing of rigid body params, maybe only has effect is it has been added to the world. + physicsComponent->getCollider()->getRigidBody()->setLinearFactor(btVector3(1,1,1)); // allow all positional movement movement + physicsComponent->getCollider()->getRigidBody()->setAngularFactor(btVector3(1,1,1)); // allow all rotational movement movement + physicsComponent->getCollider()->getRigidBody()->setRestitution(0.1f); + physicsComponent->getCollider()->getRigidBody()->setFriction(0.01f); +// physicsComponent->getCollider()->getRigidBody()->setGravity(btVector3(0, 0, 0)); // no gravity, length of zero + physicsComponent->getCollider()->getRigidBody()->setActivationState(DISABLE_DEACTIVATION); // RigidBody may never sleep. (Note: Or else it will not respond to setLinearVelocity when standing still for too long(a couple of seconds).) + + entity->addComponent(physicsComponent); + + // Add graphics component + shared_ptr graphicsComponent = make_shared(transform, + entity, + getShared(mGraphicsSystem), + mRenderLayer); + entity->addComponent(graphicsComponent); + + // Add the ModelRenderable of a ball + ModelRenderableFactory* modelFactory = new ModelRenderableFactory(mAssetSystem); + + shared_ptr modelRenderableKart = modelFactory->createModel("kart-vehicle.bcosm", + "kart-vehicle-diffuse.png", + "kart-vehicle-model"); + graphicsComponent->addRenderable(modelRenderableKart); + + shared_ptr modelRenderableDriver = modelFactory->createModel("kart-driver.bcosm", + "kart-driver-diffuse.png", + "kart-driver-model"); + graphicsComponent->addRenderable(modelRenderableDriver); + + delete modelFactory; + + // Add internal pointlight + LightSourceFactory* lightSourceFactory = new LightSourceFactory(mAssetSystem, mGraphicsSystem); + shared_ptr lightSource = lightSourceFactory->createPointLight(vec3(1,1,1), + 0.02f, + 0.03f, + transform); + graphicsComponent->setLightSource(lightSource); + delete lightSourceFactory; + + // Return instance + return entity; +} + +} // namespace JamSpook diff --git a/src/entities/KartFactory.h b/src/entities/KartFactory.h new file mode 100644 index 0000000..7888ead --- /dev/null +++ b/src/entities/KartFactory.h @@ -0,0 +1,141 @@ +/* + * KartFactory.h + * + * Created on: Aug 19, 2020 + * Author: fredrick + */ + +#ifndef KARTFACTORY_H_ +#define KARTFACTORY_H_ + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "KartPhysicsComponent.h" + +namespace JamSpook { + +using std::string; +using std::shared_ptr; +using std::make_shared; +using std::weak_ptr; +using std::dynamic_pointer_cast; +using std::function; +using std::bind; +using std::vector; + +using glm::vec3; +using glm::mat4; +using glm::quat; +using glm::quat_cast; +using glm::translate; +using glm::scale; +using glm::rotate; +using glm::eulerAngleXYZ; +using glm::radians; + +using ecos::utility::getShared; + +using ecos::core::IDCache; +using ecos::core::logging::Log; +using ecos::core::logging::LogLevel; +using ecos::core::BroadcastObservable; +using ecos::core::Message; +using ecos::core::Entity; +using ecos::core::SceneGraph; +using ecos::core::ICCResponseComponent; + +using ecos::asset::AssetSystem; +using ecos::asset::DataManagementMode; + +using ecos::graphics::GraphicsSystem; +using ecos::graphics::GraphicsComponent; +using ecos::graphics::RenderLayer; +using ecos::graphics::TextureFactory; +using ecos::graphics::Texture; +using ecos::graphics::ShaderType; +using ecos::graphics::ShaderAsset; +using ecos::graphics::ShaderProgram; +using ecos::graphics::ShaderProgramFactory; +using ecos::graphics::Material; +using ecos::graphics::MaterialFactory; +using ecos::graphics::Mesh; +using ecos::graphics::MeshFactory; +using ecos::graphics::ModelRenderableFactory; +using ecos::graphics::ModelRenderable; +using ecos::graphics::lighting::LightSource; +using ecos::graphics::lighting::LightSourceFactory; + +using ecos::physics::PhysicsSystem; +using ecos::physics::PhysicsComponent; +using ecos::physics::ColliderFactory; +using ecos::physics::Collider; + +/// Factory to simplify player kart entity creation +class KartFactory +{ +private: + weak_ptr mAssetSystem; + weak_ptr mGraphicsSystem; + weak_ptr mPhysicsSystem; + weak_ptr mRenderLayer; + +public: + KartFactory(weak_ptr assetSystem, + weak_ptr graphicsSystem, + weak_ptr physicsSystem, + weak_ptr renderLayer); + virtual ~KartFactory(); + + /// Compose a kart entity + shared_ptr createKart(const vec3 position, + const vec3 eulerRotationXYZDegrees); +}; + +} // namespace JamSpook + +#endif // KARTFACTORY_H_ diff --git a/src/entities/KartPhysicsComponent.cpp b/src/entities/KartPhysicsComponent.cpp new file mode 100644 index 0000000..aef2ca9 --- /dev/null +++ b/src/entities/KartPhysicsComponent.cpp @@ -0,0 +1,57 @@ +/* + * KartPhysicsComponent.cpp + * + * Created on: Aug 19, 2020 + * Author: fredrick + */ + +#include "KartPhysicsComponent.h" + +namespace JamSpook { + +KartPhysicsComponent::KartPhysicsComponent(mat4 transform, + shared_ptr > > entity, + weak_ptr > physicsSystem, + weak_ptr > > physicsCollisionSubSystem, + weak_ptr > > physicsColliderQuerySubSystem, + shared_ptr collider): + PhysicsComponent(transform, + entity, + physicsSystem, + physicsCollisionSubSystem, + physicsColliderQuerySubSystem, + collider) +{} + +KartPhysicsComponent::~KartPhysicsComponent() +{} + +void KartPhysicsComponent::update(const milliseconds dtms) +{ +// Log::write(LogLevel::trace, "CollectablePhysicsComponent - update"); + PhysicsComponent::update(dtms); + + if (getPosition().y < -100.0f) + { + setPosition(vec3(getFloatInRange(-10.0f, 10.0f), + 10, /// above the ball + getFloatInRange(-10.0f, 10.0f))); + } +} + +void KartPhysicsComponent::onICCMessage(shared_ptr message) +{ + PhysicsComponent::onICCMessage(message); +} + +void KartPhysicsComponent::onCollision(const string& tag) +{ + if (tag == "ground-plane") + { + vec3 position = getPosition(); + setPosition(vec3(position.x, 10.0f, position.z)); + ICCBroadcast(make_shared(IDCache::get("GroundContactMessage"))); + } +} + +} // namespace JamSpook diff --git a/src/entities/KartPhysicsComponent.h b/src/entities/KartPhysicsComponent.h new file mode 100644 index 0000000..e45469c --- /dev/null +++ b/src/entities/KartPhysicsComponent.h @@ -0,0 +1,82 @@ +/* + * KartPhysicsComponent.h + * + * Created on: Aug 19, 2020 + * Author: fredrick + */ + +#ifndef KARTPHYSICSCOMPONENT_H_ +#define KARTPHYSICSCOMPONENT_H_ + +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace JamSpook { + +using std::chrono::milliseconds; +using std::weak_ptr; +using std::shared_ptr; +using std::make_shared; +using std::dynamic_pointer_cast; +using std::string; + +using glm::vec3; +using glm::mat4; +using glm::translate; +using glm::scale; + +using ecos::utility::getFloatInRange; + +using ecos::core::IDCache; +using ecos::core::logging::Log; +using ecos::core::logging::LogLevel; +using ecos::core::Message; +using ecos::core::BroadcastObservable; + +using ecos::physics::PhysicsSystem; +using ecos::physics::PhysicsComponent; +using ecos::physics::Collider; +using ecos::physics::TransformChangeMessage; +using ecos::physics::CollisionStateChangeMessage; +using ecos::physics::ColliderQueryMessage; + +/// +class KartPhysicsComponent: + public ecos::physics::PhysicsComponent +{ +public: + KartPhysicsComponent(mat4 transform, + shared_ptr > > entity, + weak_ptr > physicsSystem, + weak_ptr > > physicsCollisionSubSystem, + weak_ptr > > physicsColliderQuerySubSystem, + shared_ptr collider); + virtual ~KartPhysicsComponent(); + + virtual void update(const milliseconds dtms); + virtual void onICCMessage(shared_ptr message); + virtual void onCollision(const string& tag); +}; + +} // namespace JamSpook + +#endif // KARTPHYSICSCOMPONENT_H_