From 311423b767229401c84283ea6ff169e0a8b677c2 Mon Sep 17 00:00:00 2001 From: songchengjiang Date: Wed, 17 Jun 2015 15:54:04 +0800 Subject: [PATCH 1/2] add 3d samples --- res/chapter9/NavMesh/all_tiles_tilecache.bin | Bin 0 -> 20240 bytes res/chapter9/NavMesh/geomset.txt | 6 + res/chapter9/NavMesh/maps/scenetex.png | Bin 0 -> 196 bytes res/chapter9/NavMesh/scene.mtl | 15 + res/chapter9/NavMesh/scene.obj | 1063 +++++++++++++ .../materials/pu_mediapack_01.material | 1323 +++++++++++++++++ res/chapter9/Particle3D/scripts/blackHole.pu | 76 + .../Particle3D/scripts/lightningBolt.pu | 174 +++ res/chapter9/Particle3D/scripts/lineStreak.pu | 43 + .../Particle3D/textures/pump_flare_04.png | Bin 0 -> 9558 bytes .../Particle3D/textures/pump_lightning_01.png | Bin 0 -> 9362 bytes .../Particle3D/textures/pump_lightning_02.png | Bin 0 -> 10848 bytes .../Particle3D/textures/pump_lightning_03.png | Bin 0 -> 9964 bytes .../Particle3D/textures/pump_lightning_04.png | Bin 0 -> 10016 bytes .../Particle3D/textures/pump_pentagram_02.png | Bin 0 -> 26814 bytes .../Particle3D/textures/pump_smoke_01.png | Bin 0 -> 17778 bytes .../Particle3D/textures/pump_streak_03.png | Bin 0 -> 2098 bytes res/chapter9/box.c3t | 94 ++ src/chapter9/Chapter9.cpp | 45 +- src/chapter9/Chapter9_11.cpp | 86 ++ src/chapter9/Chapter9_11.h | 15 + src/chapter9/Chapter9_12.cpp | 143 ++ src/chapter9/Chapter9_12.h | 15 + src/chapter9/Chapter9_13.cpp | 104 ++ src/chapter9/Chapter9_13.h | 16 + 25 files changed, 3216 insertions(+), 2 deletions(-) create mode 100644 res/chapter9/NavMesh/all_tiles_tilecache.bin create mode 100644 res/chapter9/NavMesh/geomset.txt create mode 100644 res/chapter9/NavMesh/maps/scenetex.png create mode 100644 res/chapter9/NavMesh/scene.mtl create mode 100644 res/chapter9/NavMesh/scene.obj create mode 100644 res/chapter9/Particle3D/materials/pu_mediapack_01.material create mode 100644 res/chapter9/Particle3D/scripts/blackHole.pu create mode 100644 res/chapter9/Particle3D/scripts/lightningBolt.pu create mode 100644 res/chapter9/Particle3D/scripts/lineStreak.pu create mode 100644 res/chapter9/Particle3D/textures/pump_flare_04.png create mode 100644 res/chapter9/Particle3D/textures/pump_lightning_01.png create mode 100644 res/chapter9/Particle3D/textures/pump_lightning_02.png create mode 100644 res/chapter9/Particle3D/textures/pump_lightning_03.png create mode 100644 res/chapter9/Particle3D/textures/pump_lightning_04.png create mode 100644 res/chapter9/Particle3D/textures/pump_pentagram_02.png create mode 100644 res/chapter9/Particle3D/textures/pump_smoke_01.png create mode 100644 res/chapter9/Particle3D/textures/pump_streak_03.png create mode 100644 res/chapter9/box.c3t create mode 100644 src/chapter9/Chapter9_11.cpp create mode 100644 src/chapter9/Chapter9_11.h create mode 100644 src/chapter9/Chapter9_12.cpp create mode 100644 src/chapter9/Chapter9_12.h create mode 100644 src/chapter9/Chapter9_13.cpp create mode 100644 src/chapter9/Chapter9_13.h diff --git a/res/chapter9/NavMesh/all_tiles_tilecache.bin b/res/chapter9/NavMesh/all_tiles_tilecache.bin new file mode 100644 index 0000000000000000000000000000000000000000..5383ff4d0a7fa442effa7a24bb730939a2df2783 GIT binary patch literal 20240 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 literal 0 HcmV?d00001 diff --git a/res/chapter9/NavMesh/geomset.txt b/res/chapter9/NavMesh/geomset.txt new file mode 100644 index 0000000..472cb45 --- /dev/null +++ b/res/chapter9/NavMesh/geomset.txt @@ -0,0 +1,6 @@ +f Meshes/scene.obj +c -1.415108 11.074799 40.988361 19.871681 8.906498 40.807953 0.600000 1 5 8 +c 24.950050 8.906502 39.621304 33.185913 7.342701 22.568581 0.600000 1 5 8 +c 32.954346 7.342701 18.303593 33.168766 8.489700 -2.227217 0.600000 1 5 8 +c 30.448170 8.489697 -10.263871 14.368065 9.219200 -24.601736 0.600000 1 5 8 +c 12.478474 9.219200 -23.165859 -0.123363 0.999996 -23.276600 0.600000 0 5 8 diff --git a/res/chapter9/NavMesh/maps/scenetex.png b/res/chapter9/NavMesh/maps/scenetex.png new file mode 100644 index 0000000000000000000000000000000000000000..ce473f8dac5b741941d24b1259d891e02cf9d357 GIT binary patch literal 196 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 I(AQ!A16JzjKmY&$ literal 0 HcmV?d00001 diff --git a/res/chapter9/Particle3D/textures/pump_lightning_02.png b/res/chapter9/Particle3D/textures/pump_lightning_02.png new file mode 100644 index 0000000000000000000000000000000000000000..a9dd25c2f77a4ba441f7f39e75dae2bfc219eb0f GIT binary patch literal 10848 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 QxPbytQP7mHl(h)@A0MoqXaE2J literal 0 HcmV?d00001 diff --git a/res/chapter9/Particle3D/textures/pump_lightning_03.png b/res/chapter9/Particle3D/textures/pump_lightning_03.png new file mode 100644 index 0000000000000000000000000000000000000000..095c1194a5896d43a813327a33c8f1707cce1796 GIT binary patch literal 9964 zcmX9^2RPO5`~Fxt5>B$p9+g5yD#C zIlupXT{@EE^S;lx@B4Z5LHUUc+4(Ey5dh)rUR zDb%HgH;Q8{-y&@6d8iJwRysNYG4MlEO0@dFKd(+jeKAp1t;OfhdD*1*GpU>vrjmj0 zp9iVw2(2-XWq28ak@MBw~(xTzVI;fBiI;807x0mOUPY7b^;x5I8p&s(cZKnCBtmI!eQ(F~)I&_}%Eq_}?~EJFCmL#9jJ z1S|>!seJwQQ#pFJ{uQ!#NJCdtcZ_`hZK{f>Usv92ZA{Iu&NNvTOBvAKK%0=vu_eYN zuwRnJ5GeFqK#(g3eT}C=;$fJDx#*nNX%}0Df1pTCUeME15 zevrVn9k0l--XcdE8Bs^fCJ%IPkCLQ5KmW`1Ajn1NSb`}zO}Rsak>NZk>FQO(v|7H| zAhEOC(>7BPy;&ql ze4&vluYo+Vk+G(M7T@69BZ&(f4I*f%b93Gd=hNt-B`-f~5FRG{UPN#u^VB|}#9`QI2a7=9abS%M|EISlDg?jr9VIHiFkcC5OSSKF z5Twxcj!w7eyHd&|>Rpze-6#Lg(E;%Y3^DTV<0m)y_}4(^<2z~n51Lo5wbK~QYu-^0 zy<^0vdC!TOz9HFQ9mRnkv^6@bWN+RKl(AXB0@%IaEJ?qI`VESbUx^ zGetluE;U!BJ16-!D)+r`%5yoZR3~NLr|)tu2|C7K?M|S1*!7twxX$O6cG+hq+oFI!x8yPQo|ewjB;A&Y1rCa&Wd-;e-( zoM|jYtc{xH&AprM)Zv|!QNmH`QJztl+-GX`YT|!fa!H?kRipU&Lfs?lKecblvpFQc zX}pKFq55^j>TVAqXD-c~%dasO}P;~v%?vK}`c z0v>Um;=xz>Ci$NE_eNYt>P8G#U$4@vE|07`+9pXPaVPBxTM1(wNviHvsZ{w_jXL%& zi47PnyDXCIcJ7idj`zvzTJ2=)(k`tJuJs;N9?oSr+ zCRKf<0}elbc5sj74d?w>3Az6#(IVNP?r+WLaj<`;bYkn{pu0is(Ie6BT}07}(b&9L zbuo1p^`q|tR|^us6ub_-`IU>J;J|o zymEdee&yWi{XK)dt9w>^y^KE@C>aMII6QEF?cn&+$ykSgSj`!`pR-BX3E55CVHn;QPA{}x9Mv)@eM`KSJjiF&G1{U%RomsJFDxc% zeAu%{Al4>^pW>SGt}d&NZBn$3-E+`0&Xf2!`RKu6*GcGp{j|##&E^v#eY{4zdA!=U zSKfXjupnS2j3dk>zC#pDRDF*3f*7^b1rjnX=GT!n4YXVI2S&HYOu6Ixs5?tgU>dv_63~m9M0?s~9VjgREJMAYlCgYW!EAmxj`qNV>c&lh+*?a3rB5B~9I)Jj zd2?DvrnMoPp*bHbAB?^#d+lVJ_sUY$(r6{2!n-23;;r+$ed)~@N{34vBhT83Lh zKg`)~8q+M9-=}LYhqIE|r%w5PomNKS9eBPHuN|~2VX+GOp zk@3=&UxL4qbX|IIx=L|*#bc3(g(UT;J)!Xj9uE)A0+jx9Y`aaOq{`(IemSC&eOpoe z(cna0?_ayWJoi5(eoD+xB{PpMZFf+*NL5DKd|2(rMC1} z=*uWoEl?(>QQ-Z;<*ZGo?OY*SEBpNS?Mai1@8y@6lz}RT6!oJfo?qw)M(oY%4_7w?8xUA(xMaU{ubhA6?c3 zJI^bPs12fCs;$3@`J=7wb(1zqFV8mbOTm88e-#Te8c+28xbM1Hjf_k@F7I4jmR
`tmCW8_Ti6`uY+QE7iNfOtQkZ^9kNIBMGbVZ@$|;ze(OC zIp27FGRxg(NC z>-@7uj_r3sHIh@4I7K%P=6oV&vtMQ>Cp{4t{T(;vf>k(!sIlE)!y1lWEtk(1EfAIQv^|-YE!4JIHpX_XYKRm#>?kfj=vyD~I(*ge z$9`yk=$3AZOYM5w3VpftwQ+`ut5v)EPJ64gZ_ckNjOn_DIu{<-jhrkIA5tuNm7W$G zH&{*W>o@54HfvF=lastlKK*ny@NT+a=BLab_W#&}Lz9@9>B+9tZoTY@oX#%EzSP_4 zseb0NZ2uKAc`|b(->Z2%yg_;p)LUQRlC%AK{cBF4a65ZDb4`zn=w{Y&e$S}Kdc}Ix zWP2@h9Otpbsq%K;p;3GGFD0xP#{Kk|7wflubhSU_Hn>d|BUx2N1aZ9zF4Px64$k0p z5kVaJ5M)UoL4;!wgw`fPuk}9!VYn>!Nb;HU$cl%B?NdzL*-`RQc!)dqkBIe{@5RAn z!)+1-c;^Q=J|}-3c!`p`mk=N@;7~F!e$r2I5;6Yd$l$@E^zBZ_^MNDvd-hkT`Xn2Gm1;2t-ZaSteH&cfYXun4dDc%dpZAxd28@V!ObyO(Yv#K! zAgG99#YYgh;v(RyM&S!lkHekCH2@j?UCSb?(Y8T?Ze~Y6v=qb~A`j_IQ|4^h7Fic- zBgKyqCl@m-*_46zH#Rm()=#dd#Ky)}IB(9hF6A!e`sjq+j#GeS{D&r#q>?T!DJkhM zvvPBAaQMW6@-fzOGBGh}tE7Lhf~WsuoY0n`-DSJ`-sD*IoAn9PWS51wiHV69P%DyX zzYqWcF*yUDL-YIVGj;=l-P@Sn6tDGK?8H+wwX1RwP+3x_w^20Au88eZqLA6)$m>eU zRD_cIBSUq2-^(mv;e>H)8;;J1Tp+^f-8Tjzj2x`G2eJ$-dmRaKeIWL+)13MX`% z+=13;)K?x5mKhF#dK&8 z2sqT0F-fZ6|1uzD2$BjRw^|;|C$8V{=l%Wr_p{!fo*s{Nx5=Z4xZ9>Z`b)5-AZz}$ zE^YsT*!zeOxquJhf}p{hAt&&;MmV}WLWM)F@4~}-0PG$Bi^Yl`t$gd9dGQcIpt_-} zUpz*fwHg@D`9gET;VN1zwW5tj%ks_RP2iG$%Q86wBc5arw1+T0D6<}~ay;5w9mQae zP6#E@9CE5%Y2P{s8W??$OQJ$wnsx9zKN`@TYv%jN-L*B{{Eh+&du4z)SqyUVUk~Xt zo_^E@VeEe|HblSV=EnbcDX{4*;<+|fX@BSYo$r4DK-gL4@v+=HNKs%bRM(K>2~>wi zd2w;E9d>QJnnwdcP*@&UMAPGSkmyUT=p-PSj+X*)*~zX;Ik~yHHyOCouZA>iv-l8rTV>x~;XimgVkEto$RdA)|Ge`kvjvYVSLEG8y)%6xW^ za@JVFee^Hmh^f^)b@`kKX;HkSHwJxFsJqNeM@J`QJGDr_&~E39=WmKP7*=Dq6P&R; zRH%2>FV9;`MgFe&1-c?Y2Tv|yF6Hp__Yk1m5y}QZiWmg&3a_q+eXtsJa=k110FVG7 z2i}<1^1gFTq}{&HOi)-rK%nH86euo1i4o*@+E&PYZ{_c|u6dg+#FjY|0?*GB+TPyQ z)+U1FUDT>bD9XvnS-h08-*P=Vh+G62D>O?;|AM3ZlwQm-C`ZoMuU|p8?W=>}4S4e2 zwnH0PiV1h6*~4WW9UZ^3pqixQp%AFI5KwH$SbHe5_-O+Hg~&!rq>|WWxDaRyDAO*T zHy;{BC=jQxKwH1x%KIOXQ;OH=0mda6W2_Y&Q*!?|K?B=4FXsSns6#b1YFcl&KlZws zn%W?>A^$l#Z~&`0*_?rpr$&nfs1?u#XwfRCwUJ7$sK=S`m7u{so*!W$#NN`6k2nL_ zHY+M-g~)*%oB0$x0NUExqYZ$cKYw13LQS8BW!e(G;L#8F5qop_>YPimDRc^5z~aiv z%2bhQGRBq@*}4iIT5YS2ntZvzEDjB8xB7rNg{uz2Sa z?45x`$u}uE=RQwNWR^nlbd{LJXWg?}8lKzUtb?*$FcZ8&O(+?gkdP46YRC`I1R)$P zi+M>@3kQEqP%){eLX}xpSFjeOcRWLC_(3xQxU2qjx6tdPUHo)2)R}cx^;RsjRP4pO zl4uAyPW5oW^dvoaGuIK$j=QY$;wSTXb-R@*$c-^RP-!qA3E&IB{TMGWvIpCLE$;@Q zr9cExX;*7KS_m2p>nf?Fzn7Mleu{~Ssoxv1DBK02smf-Y`H_0HTs1kKhKJl6>NjLo z=o?_)!VfK=IPlw1mlzRxA@ghLwwhO{IIz}8Ti#zizlYeC z+oX03FAw(-hg-P0y1M2YFe8c(-yWcKBf*iOeOf4_S+GckFkioMsDmpoegDMMONfCyCMqfl z?!XM*7#`vR;HC*m5_VjA1`#=gOO0NA`5?rX>+Op>wwcl=`<>2X%Y{&tDk>_QWA?qG zqHb&lDF0 z2nq^1fTtZ$65aj%6v$*d4pWt@8^umqMisLPb{a6B^P5NTOJ=JxCK6Mvi^^>^Gq5ArK_E zCzKYLN^s?KvcO@)QYbYrE!QYNwBXursjA>?eblCYyuZJ{iSI%N&=9!m+qZ8&6{MKj zCA{S}O2Nv3!WS;k=L&-x@uQ>3vr}v= zzx&wj z_iQF~odz1ONf6vZjkRj@!pN)9Aazdw@47(LAuOrsZ}b8)k(3L3&bH zP*SDG4iouV*)Hj>u#=%W# zxhFnT%4W%`FdzuVJ^TL$6tI0Sv*2$^i9&WW3*CJQk&%}oAzn}kuV6lWJKu_Qbzw3L zTd6$!m}d)ZbWaIc{hY5jn_Ro^Tkdl?z@TNexB|w$WK`SBe${q_2@%Wl%9H;$cpPqV zQGe4{=ibI!`4k|;_@O(6%Q&mPUO$*3%Rz}V{qSXo&N2wkjR=l2%+I*nKn0|h;#)}3 zPw%NL50w2`Yq7W65}qG=>JA@}8U=~0POas={^{Ood_%Ky}7yHb5UF|yze@j zrrVjkj_nkOcEyjUDZKb}`veuWZwi2Av+{1VW5As}GXXRYy80YG^fd$-5&=?`c#v}2 z6lZXOVO;y6zv(UzRRdnwltW5xxKcNBZ6lcgAOKAfL7%6}w#<*)l8Gv62PnqxpK2E)a9`0 z1_b{&iZdb61c-y~kV{H0gi=FQRkeR`a4=xB?vV=B)0}4lNl&unA3uKl9I}g>8Abp& zQv)F#vtz)#6F;1$fN#6WK>iL~D~{nQKRmh#5QwY1uQ=cc>j2z5;;sFYNHv+XqWe=r znN>T?_CtcfpnV`MMqSZ7+HlB+Y075J0c7+zCWnCsp6;kSL=1qoZxd9!4d=kM+Bg;d zJWxI`FJvtm0EZp49{Jr@3`2LVmDQ>hl%h4>E0u8=Uh9LIC7j1Cpu=(|*SD`ye(-}4 z6gNzZZFR7RGKe^D=*!E?leXLGczK=ea%mLQTmmOYA%48kjO(4{D(jyVB=oobC>Wjp z%Xh&Sf`>l#0ahFp@>!?Rp<)4<-y26HP~%m^8(Z^TF(7JR_1rgGX)OSdtpWIT3`BjV z$)A+=2`EM`PI7_Tew1+Iyc|p_4jvON+R?^#4DItE^Nmr{)6)iENr6!N1r^yBBFXV@ z2S{t-Lnjf^v7qo_KE~;La7gftz;rOYroDX`GNE-Rd!sfmKCQdWg?qSx5q^rBi-Cv+ zfBpJpI}K0AEscO}v*7Hxf$8SCxyw}r=J5gAEzk;&2Lyxvx3cQ|MK(*rv-qEnG{O+pAQBSfhM@t44|CSb* zKd)2f{1_S<+6(?uGul{A^%gOLz{FqCjOwL-*{`VDm%>Qn7fvQQvc{&TRJF}Ja?xp$%YeXC({EySqS4!jLWQ#gkl zEUq?z6&_~~n6K1tSL*cKe16fl`h8#&S%bTcBtISBkt_uFe;b7lXXj$rE4WCfjPbk( z&J~g1Sil|(DLcvs3}CpX2vfU}9?mcVp+i$db(?&1_VR{N2FS^5v%^+82D6p~h5GJnP;apd%8PYGEh_KMA`vINFR$a!Pz+{G4+LFV%S> zX*IPur$cC&%>Q58iT!|Ych*4E9qi;T>#?XDyYTC8EMk2cj(Q34!SjLv6Ql2xN?pmVheL%z?ncI6drVlsWT> z98B2;&qsm{Io>it_3#F_VYwx|sk^G;3?HW@Y;apqSc{w;)w{WEI)qw{-j!DQ-A-iQ zdcF3`Xh&OJZS21rr}g5G`=l8=--sH5m#AktU{CxS$ss3pFc+z`Hc{(_?c%LJ-ojau z6j1bO8XL=8+NH0s)TI?S&D|uYJSbN(U@3(Y zPjV&^=U;Y~nE4nz&$x8XT$oou;-11{43;lJiidh^ku;nK53|mUL@rhYx4R$}8ZP2~ zXmIb*p8(acgR^|w7H(_dpXpXDcI1mTwlq^EuFh3LX zL$d)Jf!%bO`EWgX|8NKfG?(o)p@6hy@NWUu|6p$e>le@*=MGrc)|&Y^OQYs*oc7|~ z?JD^=xsH7&mG*1$?BrXo7Hd zj*OTS=Mh?hh9q{Ki!3aIC0qQB(3Q%dXKdi)XM)c5X9jvjPJVI~f~VaHzBd7jXb1;x zRLyG3%EGOWL8uly#FAmcfPRn0&_5XSB=05SHf?=~A_+{FRp=n}ZJYwNDk}w7y$+kP zA=oOFdts|5Pu7Z!+Cwj)n`}9$o=*-Aw%IXcFK(|shtBw%n;W=JJSeEhRWOs!L5swU zu8p|8ns`rfS?Im|H)q|^G+3T{?0(fdx#@>CfvN4orRz@;McwxD3YM$PWB*gMQp^YD zUz?CbrNMPWfUHgdz&0Hqg!N$yJXK@CeOmVXh!hI^fm-F(uZI+(;BC|#w{T{18K@uZ zk2P%KheIB!a!`l1&w|8OP9-Aso+&gonnKI%={KEXuK49tlaa%X=rt$gO z<<|LyfG=OZ(81R5=ue^N?pNF*=Q_&g*BC2W5=~gMNr2so%QByFt%vf~Cf1A?a=AyN zpO5G5jcx+&X}DAkwSr>BOrGxQopqO39sPnU<2=fE33rgO)*xp404;@@#E*|l=%ULq zpCV^2ug385yTCf-$pZ5|EfAoo^DkhroS}y%6zSI;YcYt+lDmC@9ZGDp%ucKP3y)iC zGMiyO9ulJqD(dOviqbdjE!*v&;)5R8Z>&H65vVsH2?H^7 zy&_CXFmB=^rlz5xF-yiGed2;pS)uH_O6P)-L`ZEh97sd?8?e%yCEU1G6>gr_sexY- zz$=vr{D&%=KW%dQWaq8d#&9c=lOybUA*lR)oD@Tz_DOf0=J53A6TCo8p~zu@<+?G| z=&PGhT{R)>ambT+=<$h2v%BP4kfaaG{za)Tl`gv5`@{SDU(a^+3VT3EVM(V-B~7in z83OAmsXj+t*e6{_MO4_HHu>W`1(;u1kT3U39gn$|oRJE$p-`K{QmfGk+^-^VRnuz3 z5Bp8rUW|b`_0P|cd^MzE-V^L#8Hknr+3Cp=q oq#=|0-`Ld(QN;PR>6RA(LX~oli$pnl72<%%Nk4g1Af@l~e<0s?rT_o{ literal 0 HcmV?d00001 diff --git a/res/chapter9/Particle3D/textures/pump_lightning_04.png b/res/chapter9/Particle3D/textures/pump_lightning_04.png new file mode 100644 index 0000000000000000000000000000000000000000..01f9f07bbbd096d6805a76d72abd3decf1371c3c GIT binary patch literal 10016 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 literal 0 HcmV?d00001 diff --git a/res/chapter9/box.c3t b/res/chapter9/box.c3t new file mode 100644 index 0000000..876194a --- /dev/null +++ b/res/chapter9/box.c3t @@ -0,0 +1,94 @@ +{ + "version": "0.6", + "id": "", + "meshes": [ + { + "attributes": [{ + "size": 3, + "type": "GL_FLOAT", + "attribute": "VERTEX_ATTRIB_POSITION" + }, { + "size": 3, + "type": "GL_FLOAT", + "attribute": "VERTEX_ATTRIB_NORMAL" + }, { + "size": 2, + "type": "GL_FLOAT", + "attribute": "VERTEX_ATTRIB_TEX_COORD" + }], + "vertices": [ + 0.500000, -0.500000, -0.500000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, + -0.500000, -0.500000, -0.500000, 0.000000, 0.000000, -1.000000, 1.000000, 0.000000, + 0.500000, 0.500000, -0.500000, 0.000000, 0.000000, -1.000000, 0.000000, 1.000000, + -0.500000, 0.500000, -0.500000, 0.000000, 0.000000, -1.000000, 1.000000, 1.000000, + 0.500000, 0.500000, 0.500000, 0.000000, 0.000000, 1.000000, 1.000000, 1.000000, + -0.500000, 0.500000, 0.500000, 0.000000, 0.000000, 1.000000, 0.000000, 1.000000, + -0.500000, -0.500000, 0.500000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, + 0.500000, -0.500000, 0.500000, 0.000000, 0.000000, 1.000000, 1.000000, 0.000000, + 0.500000, -0.500000, 0.500000, 0.000000, -1.000000, 0.000000, 1.000000, 1.000000, + -0.500000, -0.500000, 0.500000, 0.000000, -1.000000, 0.000000, 0.000000, 1.000000, + -0.500000, -0.500000, -0.500000, 0.000000, -1.000000, 0.000000, 0.000000, 0.000000, + 0.500000, -0.500000, -0.500000, 0.000000, -1.000000, 0.000000, 1.000000, 0.000000, + 0.500000, 0.500000, 0.500000, 1.000000, 0.000000, 0.000000, 1.000000, 1.000000, + 0.500000, -0.500000, 0.500000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, + 0.500000, -0.500000, -0.500000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, + 0.500000, 0.500000, -0.500000, 1.000000, 0.000000, 0.000000, 1.000000, 0.000000, + -0.500000, 0.500000, 0.500000, 0.000000, 1.000000, 0.000000, 1.000000, 1.000000, + 0.500000, 0.500000, 0.500000, 0.000000, 1.000000, 0.000000, 0.000000, 1.000000, + 0.500000, 0.500000, -0.500000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, + -0.500000, 0.500000, -0.500000, 0.000000, 1.000000, 0.000000, 1.000000, 0.000000, + -0.500000, -0.500000, 0.500000, -1.000000, 0.000000, 0.000000, 1.000000, 1.000000, + -0.500000, 0.500000, 0.500000, -1.000000, 0.000000, 0.000000, 0.000000, 1.000000, + -0.500000, 0.500000, -0.500000, -1.000000, 0.000000, 0.000000, 0.000000, 0.000000, + -0.500000, -0.500000, -0.500000, -1.000000, 0.000000, 0.000000, 1.000000, 0.000000 + ], + "parts": [ + { + "id": "shape1_part1", + "type": "TRIANGLES", + "indices": [ + 0, 1, 2, 1, 3, 2, 4, 5, 6, 4, 6, 7, + 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, + 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23 + ], + "aabb": [-0.500000, -0.500000, -0.500000, 0.500000, 0.500000, 0.500000] + } + ] + } + ], + "materials": [ + { + "id": "01 - Default", + "ambient": [ 0.588235, 0.588235, 0.588235], + "diffuse": [ 0.588235, 0.588235, 0.588235], + "emissive": [ 0.000000, 0.000000, 0.000000], + "opacity": 1.000000, + "specular": [ 0.900000, 0.900000, 0.900000], + "shininess": 2.000000, + "textures": [ + { + "id": "Map #1", + "filename": "", + "type": "DIFFUSE", + "wrapModeU": "REPEAT", + "wrapModeV": "REPEAT" + } + ] + } + ], + "nodes": [ + { + "id": "Box001", + "skeleton": false, + "transform": [ 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, -1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000], + "parts": [ + { + "meshpartid": "shape1_part1", + "materialid": "01 - Default", + "uvMapping": [[ 0]] + } + ] + } + ], + "animations": [] +} \ No newline at end of file diff --git a/src/chapter9/Chapter9.cpp b/src/chapter9/Chapter9.cpp index d861efb..2490b68 100644 --- a/src/chapter9/Chapter9.cpp +++ b/src/chapter9/Chapter9.cpp @@ -9,6 +9,9 @@ #include "Chapter9_8.h" #include "Chapter9_9.h" #include "Chapter9_10.h" +#include "Chapter9_11.h" +#include "Chapter9_12.h" +#include "Chapter9_13.h" USING_NS_CC; @@ -50,7 +53,7 @@ bool Chapter9::init() "CloseSelected.png", CC_CALLBACK_1(Chapter9::onMenuCloseCallback, this)); - closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 , + closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 , origin.y + closeItem->getContentSize().height/2)); // create menu, it's an autorelease object @@ -183,6 +186,44 @@ bool Chapter9::init() mainmenu->addChild(menuItem,2); mainmenu->setPosition(Vec2::ZERO); + + // add "Test Particle3D" + itemlabel = LabelTTF::create("Particle3D", "Arial", 24); + menuItem = MenuItemLabel::create(itemlabel); + menuItem->setCallback([&](cocos2d::Ref *sender) { + Director::getInstance()->replaceScene(Chapter9_11::createScene()); + }); + menuItem->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2).x, + (Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height).y - (++index) * 40)); + + mainmenu->addChild(menuItem, 2); + mainmenu->setPosition(Vec2::ZERO); + + + // add "Test Physics3D" + itemlabel = LabelTTF::create("Physics3D", "Arial", 24); + menuItem = MenuItemLabel::create(itemlabel); + menuItem->setCallback([&](cocos2d::Ref *sender) { + Director::getInstance()->replaceScene(Chapter9_12::createScene()); + }); + menuItem->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2).x, + (Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height).y - (++index) * 40)); + + mainmenu->addChild(menuItem, 2); + mainmenu->setPosition(Vec2::ZERO); + + + // add "Test NavMesh" + itemlabel = LabelTTF::create("NavMesh", "Arial", 24); + menuItem = MenuItemLabel::create(itemlabel); + menuItem->setCallback([&](cocos2d::Ref *sender) { + Director::getInstance()->replaceScene(Chapter9_13::createScene()); + }); + menuItem->setPosition(Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height / 2).x, + (Vec2(origin.x + visibleSize.width / 2, origin.y + visibleSize.height).y - (++index) * 40)); + + mainmenu->addChild(menuItem, 2); + mainmenu->setPosition(Vec2::ZERO); // add main menu this->addChild(mainmenu, 1); @@ -207,7 +248,7 @@ bool Chapter9::init() void Chapter9::onMenuCloseCallback(Ref* sender) { #if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) - MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert"); + MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert"); return; #endif diff --git a/src/chapter9/Chapter9_11.cpp b/src/chapter9/Chapter9_11.cpp new file mode 100644 index 0000000..5de0b39 --- /dev/null +++ b/src/chapter9/Chapter9_11.cpp @@ -0,0 +1,86 @@ +#include "Chapter9_11.h" +#include "Chapter9.h" +#include "extensions/Particle3D/PU/CCPUParticleSystem3D.h" + +USING_NS_CC; + +Scene* Chapter9_11::createScene() +{ + //cocos2d::Rect visibleRect = Director::getInstance()->getOpenGLView()->getVisibleRect(); + FileUtils::getInstance()->addSearchPath("Particle3D/scripts"); + Size visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + auto winSize = Director::getInstance()->getWinSize(); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // create a scene + // 'scene' is an autorelease object + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + auto scene = Scene::create(); + + // add title + auto label = LabelTTF::create("Particle3D Test", "Arial", 24); + label->setPosition(Vec2(origin.x+visibleSize.width/2, origin.y+visibleSize.height/2).x, + Vec2(origin.x+visibleSize.width/2, origin.y+visibleSize.height).y - 30); + + scene->addChild(label, -1); + + //add the menu item for back to main menu + label = LabelTTF::create("MainMenu", "Arial", 24); + + auto menuItem = MenuItemLabel::create(label); + menuItem->setCallback([&](cocos2d::Ref *sender) { + Director::getInstance()->replaceScene(Chapter9::createScene()); + }); + + auto menu = Menu::create(menuItem, nullptr); + + menu->setPosition( Vec2::ZERO ); + menuItem->setPosition( Vec2( Vec2(origin.x+visibleSize.width, origin.y+visibleSize.height/2).x - 80, Vec2(origin.x+visibleSize.width/2, origin.y).y + 25) ); + + scene->addChild(menu, 1); + + + auto camera = Camera::createPerspective(60, (GLfloat)winSize.width / winSize.height, 1.0f, 1000.0f); + camera->setCameraFlag(CameraFlag::USER1); + camera->setPosition3D(Vec3(0.0, 0.0, 60)); + camera->lookAt(Vec3(0.0, 0.0, 0.0), Vec3(0.0, 1.0, 0.0)); + scene->addChild(camera); + + + auto sprite3d = Sprite3D::create("orc.c3b"); + sprite3d->setPosition3D(Vec3(-30.0f, 0.0f, 0.0f)); + sprite3d->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); + scene->addChild(sprite3d); + auto animation = Animation3D::create("orc.c3b"); + if (animation) + { + auto animate = Animate3D::create(animation); + sprite3d->runAction(RepeatForever::create(animate)); + } + auto handlerps = PUParticleSystem3D::create("lightningBolt.pu"); + //handlerps->setScale(10.0f); + handlerps->startParticleSystem(); + sprite3d->getAttachNode("Bip001 L Hand")->addChild(handlerps); + sprite3d->setCameraMask((unsigned short)CameraFlag::USER1); + + + auto ps1 = PUParticleSystem3D::create("lineStreak.pu"); + ps1->setPosition3D(Vec3(30.0f, 0.0f, 0.0f)); + ps1->setScale(2.0f); + ps1->setCameraMask((unsigned short)CameraFlag::USER1); + ps1->startParticleSystem(); + scene->addChild(ps1); + + auto ps2 = PUParticleSystem3D::create("blackHole.pu"); + ps2->setPosition(-20.0f, 0.0f); + auto moveby = MoveBy::create(2.0f, Vec2(40.0f, 0.0f)); + auto moveby1 = MoveBy::create(2.0f, Vec2(-40.0f, 0.0f)); + ps2->runAction(RepeatForever::create(Sequence::create(moveby, moveby1, nullptr))); + ps2->setCameraMask((unsigned short)CameraFlag::USER1); + ps2->startParticleSystem(); + scene->addChild(ps2); + + // return the scene + return scene; +} \ No newline at end of file diff --git a/src/chapter9/Chapter9_11.h b/src/chapter9/Chapter9_11.h new file mode 100644 index 0000000..170b4cc --- /dev/null +++ b/src/chapter9/Chapter9_11.h @@ -0,0 +1,15 @@ +#ifndef __CHAPTER_9_11_H__ +#define __CHAPTER_9_11_H__ + +#include "cocos2d.h" +#include "DrawNode3D.h" + +USING_NS_CC; + +class Chapter9_11 : public Ref +{ +public: + static cocos2d::Scene* createScene(); +}; + +#endif // __CHAPTER_9_11_H__ \ No newline at end of file diff --git a/src/chapter9/Chapter9_12.cpp b/src/chapter9/Chapter9_12.cpp new file mode 100644 index 0000000..98d829b --- /dev/null +++ b/src/chapter9/Chapter9_12.cpp @@ -0,0 +1,143 @@ +#include "Chapter9_12.h" +#include "Chapter9.h" +#include "physics3d/CCPhysics3D.h" +#include "3d/CCBundle3D.h" + +USING_NS_CC; + +#define START_POS_X -15.0 +#define START_POS_Y 10.0 +#define START_POS_Z -0.5 + +#define ARRAY_SIZE_X 4 +#define ARRAY_SIZE_Y 3 +#define ARRAY_SIZE_Z 4 + +Scene* Chapter9_12::createScene() +{ + //cocos2d::Rect visibleRect = Director::getInstance()->getOpenGLView()->getVisibleRect(); + Size visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + auto winSize = Director::getInstance()->getWinSize(); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // create a scene + // 'scene' is an autorelease object + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + auto scene = Scene::create(); + if (!scene->initWithPhysics()) return nullptr; + + // add title + auto label = LabelTTF::create("Physics3D Test", "Arial", 24); + label->setPosition(Vec2(origin.x+visibleSize.width/2, origin.y+visibleSize.height/2).x, + Vec2(origin.x+visibleSize.width/2, origin.y+visibleSize.height).y - 30); + + scene->addChild(label, -1); + + //add the menu item for back to main menu + label = LabelTTF::create("MainMenu", "Arial", 24); + + auto menuItem = MenuItemLabel::create(label); + menuItem->setCallback([&](cocos2d::Ref *sender) { + Director::getInstance()->replaceScene(Chapter9::createScene()); + }); + + auto menu = Menu::create(menuItem, nullptr); + + menu->setPosition( Vec2::ZERO ); + menuItem->setPosition( Vec2( Vec2(origin.x+visibleSize.width, origin.y+visibleSize.height/2).x - 80, Vec2(origin.x+visibleSize.width/2, origin.y).y + 25) ); + + scene->addChild(menu, 1); + + + auto camera = Camera::createPerspective(60, (GLfloat)winSize.width / winSize.height, 1.0f, 1000.0f); + camera->setCameraFlag(CameraFlag::USER1); + camera->setPosition3D(Vec3(0.0, 0.0f, 60.0f)); + camera->lookAt(Vec3(0.0, 0.0, 0.0), Vec3(0.0, 1.0, 0.0)); + scene->addChild(camera); + + //PhysicsSprite3D = Sprite3D + Physics3DComponent + Physics3DRigidBodyDes rbDes; + rbDes.disableSleep = true; + auto sprite = Sprite3D::create("orc.c3b"); + rbDes.mass = 10.f; + rbDes.shape = Physics3DShape::createBox(Vec3(5.0f, 5.0f, 5.0f)); + auto rigidBody = Physics3DRigidBody::create(&rbDes); + Quaternion quat; + Quaternion::createFromAxisAngle(Vec3(0.f, 1.f, 0.f), CC_DEGREES_TO_RADIANS(180), &quat); + auto component = Physics3DComponent::create(rigidBody, Vec3(0.f, -3.f, 0.f), quat); + sprite->addComponent(component); + scene->addChild(sprite); + sprite->setCameraMask((unsigned short)CameraFlag::USER1); + sprite->setScale(0.4f); + sprite->setPosition3D(Vec3(10.f, 0.f, 0.f)); + //sync node position to physics + component->syncNodeToPhysics(); + //physics controlled, we will not set position for it, so we can skip sync node position to physics + component->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::PHYSICS_TO_NODE); + //create point to point constraint + Physics3DConstraint* constraint = Physics3DPointToPointConstraint::create(rigidBody, Vec3(2.5f, 2.5f, 2.5f)); + scene->getPhysics3DWorld()->addPhysics3DConstraint(constraint); + + + //create kinematic + rbDes.mass = 0.f; //kinematic objects. zero mass so that it can not be affected by other dynamic objects + rbDes.shape = Physics3DShape::createBox(Vec3(100.0f, 2.0f, 100.0f)); + auto phySprite = PhysicsSprite3D::create("box.c3t", &rbDes); + phySprite->setTexture("HelloWorld.png"); + phySprite->setCameraMask((unsigned short)CameraFlag::USER1); + rigidBody = static_cast(phySprite->getPhysicsObj()); + rigidBody->setKinematic(true); + scene->addChild(phySprite); + phySprite->setScale(100.0f); + phySprite->setScaleY(2.0f); + phySprite->setPosition3D(Vec3(0.0f, -20.0f, 0.0f)); + phySprite->setRotation3D(Vec3(0.0f, 180.0f, 0.0f)); + //create mesh + std::vector trianglesList = Bundle3D::getTrianglesList("boss.c3b"); + + rbDes.mass = 0.0f; + rbDes.shape = Physics3DShape::createMesh(&trianglesList[0], (int)trianglesList.size() / 3); + rigidBody = Physics3DRigidBody::create(&rbDes); + component = Physics3DComponent::create(rigidBody); + sprite = Sprite3D::create("boss.c3b"); + sprite->addComponent(component); + sprite->setRotation3D(Vec3(-90.0f, 0.0f, 0.0f)); + sprite->setPosition3D(Vec3(-10.0f, 0.0f, 0.0f)); + sprite->setCameraMask((unsigned short)CameraFlag::USER1); + scene->addChild(sprite); + + //create several boxes using PhysicsSprite3D + rbDes.mass = 1.f; + rbDes.shape = Physics3DShape::createBox(Vec3(2.0f, 2.0f, 2.0f)); + float start_x = START_POS_X - ARRAY_SIZE_X / 2; + float start_y = START_POS_Y; + float start_z = START_POS_Z - ARRAY_SIZE_Z / 2; + for (int k = 0; k < ARRAY_SIZE_Y; k++) + { + for (int i = 0; i < ARRAY_SIZE_X; i++) + { + for (int j = 0; j < ARRAY_SIZE_Z; j++) + { + float x = 10.0*i + start_x; + float y = 5.0 + 1.0*k + start_y; + float z = 10.0*j + start_z; + + auto sprite = PhysicsSprite3D::create("box.c3t", &rbDes); + sprite->setTexture("HelloWorld.png"); + sprite->setPosition3D(Vec3(x, y, z)); + sprite->syncNodeToPhysics(); + sprite->setSyncFlag(Physics3DComponent::PhysicsSyncFlag::PHYSICS_TO_NODE); + sprite->setCameraMask((unsigned short)CameraFlag::USER1); + sprite->setScale(2.0f); + scene->addChild(sprite); + } + } + } + + //scene->getPhysics3DWorld()->setDebugDrawEnable(true); + scene->setPhysics3DDebugCamera(camera); + + // return the scene + return scene; +} \ No newline at end of file diff --git a/src/chapter9/Chapter9_12.h b/src/chapter9/Chapter9_12.h new file mode 100644 index 0000000..ba90d64 --- /dev/null +++ b/src/chapter9/Chapter9_12.h @@ -0,0 +1,15 @@ +#ifndef __CHAPTER_9_12_H__ +#define __CHAPTER_9_12_H__ + +#include "cocos2d.h" +#include "DrawNode3D.h" + +USING_NS_CC; + +class Chapter9_12 : public Ref +{ +public: + static cocos2d::Scene* createScene(); +}; + +#endif // __CHAPTER_9_12_H__ \ No newline at end of file diff --git a/src/chapter9/Chapter9_13.cpp b/src/chapter9/Chapter9_13.cpp new file mode 100644 index 0000000..0774ca4 --- /dev/null +++ b/src/chapter9/Chapter9_13.cpp @@ -0,0 +1,104 @@ +#include "Chapter9_13.h" +#include "Chapter9.h" +#include "navmesh/CCNavMesh.h" +#include "physics3d/CCPhysics3D.h" +#include "3d/CCBundle3D.h" + +USING_NS_CC; + +Scene* Chapter9_13::createScene() +{ + //cocos2d::Rect visibleRect = Director::getInstance()->getOpenGLView()->getVisibleRect(); + FileUtils::getInstance()->addSearchPath("Particle3D/scripts"); + Size visibleSize = Director::getInstance()->getVisibleSize(); + Vec2 origin = Director::getInstance()->getVisibleOrigin(); + auto winSize = Director::getInstance()->getWinSize(); + + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + // create a scene + // 'scene' is an autorelease object + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + auto scene = Scene::create(); + if (!scene->initWithPhysics()) return nullptr; + + auto navMesh = NavMesh::create("NavMesh/all_tiles_tilecache.bin", "NavMesh/geomset.txt"); + scene->setNavMesh(navMesh); + + // add title + auto label = LabelTTF::create("NavMesh Test", "Arial", 24); + label->setPosition(Vec2(origin.x+visibleSize.width/2, origin.y+visibleSize.height/2).x, + Vec2(origin.x+visibleSize.width/2, origin.y+visibleSize.height).y - 30); + + scene->addChild(label, -1); + + //add the menu item for back to main menu + label = LabelTTF::create("MainMenu", "Arial", 24); + + auto menuItem = MenuItemLabel::create(label); + menuItem->setCallback([&](cocos2d::Ref *sender) { + Director::getInstance()->replaceScene(Chapter9::createScene()); + }); + + auto menu = Menu::create(menuItem, nullptr); + + menu->setPosition( Vec2::ZERO ); + menuItem->setPosition( Vec2( Vec2(origin.x+visibleSize.width, origin.y+visibleSize.height/2).x - 80, Vec2(origin.x+visibleSize.width/2, origin.y).y + 25) ); + + scene->addChild(menu, 1); + + + auto camera = Camera::createPerspective(60, (GLfloat)winSize.width / winSize.height, 1.0f, 1000.0f); + camera->setCameraFlag(CameraFlag::USER1); + camera->setPosition3D(Vec3(0.0, 50.0f, 80.0f)); + camera->lookAt(Vec3(0.0, 0.0, 0.0), Vec3(0.0, 1.0, 0.0)); + scene->addChild(camera); + + //create mesh + std::vector trianglesList = Bundle3D::getTrianglesList("NavMesh/scene.obj"); + + Physics3DRigidBodyDes rbDes; + rbDes.mass = 0.0f; + rbDes.shape = Physics3DShape::createMesh(&trianglesList[0], (int)trianglesList.size() / 3); + auto rigidBody = Physics3DRigidBody::create(&rbDes); + auto component = Physics3DComponent::create(rigidBody); + auto sprite = Sprite3D::create("NavMesh/scene.obj"); + sprite->addComponent(component); + sprite->setCameraMask((unsigned short)CameraFlag::USER1); + scene->addChild(sprite); + + + std::string filePath = "girl.c3b"; + NavMeshAgentParam param; + param.radius = 2.0f; + param.height = 8.0f; + param.maxSpeed = 8.0f; + auto agent = NavMeshAgent::create(param); + auto agentNode = Sprite3D::create(filePath); + agent->setOrientationRefAxes(Vec3(-1.0f, 0.0f, 1.0f)); + agentNode->setPosition3D(Vec3(0.0f, 2.34667206f, 0.0f)); + agentNode->setScale(0.05f); + agentNode->addComponent(agent); + agentNode->setCameraMask((unsigned short)CameraFlag::USER1); + scene->addChild(agentNode); + + agentNode->runAction(RepeatForever::create(Sequence::create(CallFunc::create([=](){ + float x = cocos2d::random(-50.0f, 50.0f); + float z = cocos2d::random(-50.0f, 50.0f); + Physics3DWorld::HitResult result; + scene->getPhysics3DWorld()->rayCast(Vec3(x, 50.0f, z), Vec3(x, -50.0f, z), &result); + agent->move(result.hitPosition); + }), DelayTime::create(5.0f), nullptr))); + + auto animation = Animation3D::create(filePath); + auto animate = Animate3D::create(animation); + if (animate){ + agentNode->runAction(RepeatForever::create(animate)); + //animate->setSpeed(0); + } + + navMesh->setDebugDrawEnable(true); + scene->setNavMeshDebugCamera(camera); + + // return the scene + return scene; +} \ No newline at end of file diff --git a/src/chapter9/Chapter9_13.h b/src/chapter9/Chapter9_13.h new file mode 100644 index 0000000..7b82c1e --- /dev/null +++ b/src/chapter9/Chapter9_13.h @@ -0,0 +1,16 @@ +#ifndef __CHAPTER_9_13_H__ +#define __CHAPTER_9_13_H__ + +#include "cocos2d.h" +#include "DrawNode3D.h" + +USING_NS_CC; + +class Chapter9_13 : public Ref +{ +public: + static cocos2d::Scene* createScene(); + +}; + +#endif // __CHAPTER_9_13_H__ \ No newline at end of file From d0f41e3ca35e6aecf7a0f7b1b6330a8d5bc4080e Mon Sep 17 00:00:00 2001 From: songchengjiang Date: Thu, 18 Jun 2015 14:29:45 +0800 Subject: [PATCH 2/2] replace scene.obj --- res/chapter9/NavMesh/all_tiles_tilecache.bin | Bin 20240 -> 12702 bytes res/chapter9/NavMesh/geomset.txt | 8 +- res/chapter9/NavMesh/scene.mtl | 1 + res/chapter9/NavMesh/scene.obj | 1030 ++---------------- src/chapter9/Chapter9_13.cpp | 28 +- 5 files changed, 118 insertions(+), 949 deletions(-) diff --git a/res/chapter9/NavMesh/all_tiles_tilecache.bin b/res/chapter9/NavMesh/all_tiles_tilecache.bin index 5383ff4d0a7fa442effa7a24bb730939a2df2783..f61e2e9cdbc2e27ca1293fb46f5f336d990ad506 100644 GIT binary patch literal 12702 zcmeI2Uu+y#8O87J`cI74c4P9-8^;;1Q)ivn9z#NsmQt_dA~kZ$-vD`_sh^xgLQp6V z2ni`wz)qndeQI$OP(T8Npg4+Q*uVxk&>~S1u`;7N{+c#|I{e;JBzWuH-qil2`wbARooiUlF zX4`AbxOYC&-od?zgs;On&ia|bA-maRhlY-1aQSG7mGvF$@CNMv))Ca;2$Bd2+CMTicBi21QsT_uI}r2aGeSzU zZ=a@=Dot9H_(jt&ZVd9in3_X#LEd{o4mIM`Zr(RK_(CTB!HJtO{MzMxQ;fOEVHPKu z_gxs=duNx|j=34kZr(RL%;F^T8waN1%=MY~t03q%5TOg1dhk}T$@FQGGSAuBU%VvK zH!%I&!omU_KQ-x}_r1{WQ(K(!Gt)El_sgY)>Q0Yq=zhoSTLAiVkcyq$VizyjWug(g z@yU+1c0QB*csWzW=dYN|b2Bvg%T-MtxVs&n|3D0vwj*325?B6NW87A-U2}Su7B5^O z5?Ai%;O5o4C~XV2%h>EtYV@D+19LC^#jZD1?A?CPXP*P$SY`d&o{_zK9Xt*_o%jg5 z9|ytaPqV-C*gxlpqRmT`giw?`GZK{zQYOo6uj1d&`#4Kgho23y9rk{C8GDDI`y7XF z1E!noba;`AmgI8Ih`c7r-X6oHxeHf_#Fc5*7`Fp#ZnD$Yg)2nj%GVv-`c3wGpdjw; zya>3-+bKj|`GeWNU#u5zUk!FQ-5CtAiD~#xe*saYh^WF9B5`G$?*@0A zCc42?8h&Uu4A}wtW!ePfA+)+~^Z5TGoA0%a#%>L4bJT)I)YgpBv>LTSf=U-&YQuo_AXx?COI5lQGE!9 z|BDr3CBy&jHY#eV6gup;1M)R^dEHUO(jY}rK}9m#NYTnlL*7RiF;MCsw*AXiiM)S% z%U9X7w9;~MjuG?_!G{sR(oZp-%CxuI-tA?R85}4#+U`KiT8O;ih-4L!NC~4zS#%_F z`OE4f$kVc^6u(v;wtXYspl59FWR+yyWe(3)icccOMYUehunKeM?l#XALhp+}otOQc54F27Sy$j>R^}vnSAmIv;xT--8ZvEDv z4GNV&HM1??lv?)u^pwMZAuY@w@oN0j7})XjgF~LK|LV<8$zOVaVQW}&;Em{XGPuoJj2%icxsc~44CP({gbAU+NcTi zmA;@x7Qq*vyC_Tw4a1~~!8^i)5WRj=Jawi_Ju1%;%e^V;MVWlWeY^b=PtbV zxoPe~A({&qb9Ss=<}UZf@&_-C*u_hBO$;LTn#^7L!S@CbX!>k=Q_WK zA8T}J!}&*@+dx|(^$(6zUM7+%d6cSwqa!unxM)Z>@Ewp~3;#{MW%6s^E(*1Uw^CdE z*tfR~f3bis#9i~Zmoz3C>=R3qty}Bo7@`smd(F{89nvCxYEfZ{w8RI#h}gXsJuC&K z%rsx{(NCkJUISY!*BE!kr;k;NyiL^J8Xj^Wh*|N3cQOc>hmc|6sW&xZpLA}$3_zv3 zGRTrCl~P8P^5sZnLditF;ny*V3%EC!n4UR4X1!tinC~4*ZZ>Z&n&W>`fyCr0D33_J zFZ!m*_CO*6>KSiUP&9kOF>7KxKjEb1Hi(QD9Ep@Lijh>M!&Y~e)Are=n>)_UJx{pBAIS5hF=k+U55<*e(*htjM?zr5&oADotWe=%E zE?SbyI3x0!B>RVBxJ?eO5Q!_}tTFD6Sh906q23iDapmm}Zv7_vPKf#)gecjui{H+M zo4lPuo%QXTru09IAJTq`g%%j;O@}|U>h0#Bp*MB(^QmCL0H5#M zI%i)uG)LUsGrz>M`0;XyU(Do}c}Dz5dGMos@`UssyuE#sL!ZP!(Lc@YTWu@4FNi@l zZt8B~P3$)ph`cL?%=gsg!X&Z`v<{GW1Nn;6%k+663zNvQM+Z5tUUud|iKD)sFcX3) zQ1u^Og>!@FW;i!EwvxHQ;w|-Cg*hZ6J9`g~bjLF^c&U*Bs*zh| YM}d3=m~s_by^w`TWLdp~T!;Doe|6o$+5i9m literal 20240 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 diff --git a/res/chapter9/NavMesh/geomset.txt b/res/chapter9/NavMesh/geomset.txt index 472cb45..b8c9e26 100644 --- a/res/chapter9/NavMesh/geomset.txt +++ b/res/chapter9/NavMesh/geomset.txt @@ -1,6 +1,4 @@ f Meshes/scene.obj -c -1.415108 11.074799 40.988361 19.871681 8.906498 40.807953 0.600000 1 5 8 -c 24.950050 8.906502 39.621304 33.185913 7.342701 22.568581 0.600000 1 5 8 -c 32.954346 7.342701 18.303593 33.168766 8.489700 -2.227217 0.600000 1 5 8 -c 30.448170 8.489697 -10.263871 14.368065 9.219200 -24.601736 0.600000 1 5 8 -c 12.478474 9.219200 -23.165859 -0.123363 0.999996 -23.276600 0.600000 0 5 8 +c -13.588468 8.489700 -3.117989 5.127029 8.489700 -2.654125 0.600000 1 5 8 +c -20.038349 8.489704 3.686111 -33.257217 1.000000 -1.603912 0.600000 1 5 8 +c 11.820250 8.489700 3.516487 23.950550 1.000000 -1.226341 0.600000 1 5 8 diff --git a/res/chapter9/NavMesh/scene.mtl b/res/chapter9/NavMesh/scene.mtl index 39e74fa..025154c 100644 --- a/res/chapter9/NavMesh/scene.mtl +++ b/res/chapter9/NavMesh/scene.mtl @@ -1,4 +1,5 @@ # 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# �������ļ�:18.06.2015 14:07:57 newmtl 01___Default Ns 10.0000 diff --git a/res/chapter9/NavMesh/scene.obj b/res/chapter9/NavMesh/scene.obj index 47b14b7..4b23962 100644 --- a/res/chapter9/NavMesh/scene.obj +++ b/res/chapter9/NavMesh/scene.obj @@ -1,766 +1,24 @@ # 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware -# �������ļ�:19.05.2015 14:43:15 +# �������ļ�:18.06.2015 14:07:57 mtllib scene.mtl -# -# object Capsule001 -# - -v -19.8356 10.0881 -15.2728 -v -19.1025 9.9916 -15.2728 -v -19.2007 9.9916 -15.6394 -v -19.4691 9.9916 -15.9077 -v -19.8356 9.9916 -16.0060 -v -20.2022 9.9916 -15.9077 -v -20.4706 9.9916 -15.6394 -v -20.5688 9.9916 -15.2728 -v -20.4706 9.9916 -14.9062 -v -20.2022 9.9916 -14.6378 -v -19.8356 9.9916 -14.5396 -v -19.4691 9.9916 -14.6378 -v -19.2007 9.9916 -14.9062 -v -18.6090 9.7086 -15.9810 -v -18.4193 9.7086 -15.2728 -v -19.1275 9.7086 -16.4994 -v -19.8356 9.7086 -16.6892 -v -20.5438 9.7086 -16.4994 -v -21.0623 9.7086 -15.9810 -v -21.2520 9.7086 -15.2728 -v -21.0623 9.7086 -14.5646 -v -20.5438 9.7086 -14.0462 -v -19.8356 9.7086 -13.8564 -v -19.1275 9.7086 -14.0462 -v -18.6090 9.7086 -14.5646 -v -18.1009 9.2584 -16.2743 -v -17.8326 9.2584 -15.2728 -v -18.8341 9.2584 -17.0075 -v -19.8356 9.2584 -17.2758 -v -20.8372 9.2584 -17.0075 -v -21.5704 9.2584 -16.2743 -v -21.8387 9.2584 -15.2728 -v -21.5704 9.2584 -14.2712 -v -20.8372 9.2584 -13.5381 -v -19.8356 9.2584 -13.2697 -v -18.8341 9.2584 -13.5381 -v -18.1009 9.2584 -14.2712 -v -17.7111 8.6717 -16.4994 -v -17.3824 8.6717 -15.2728 -v -18.6090 8.6717 -17.3974 -v -19.8356 8.6717 -17.7260 -v -21.0623 8.6717 -17.3974 -v -21.9602 8.6717 -16.4994 -v -22.2889 8.6717 -15.2728 -v -21.9602 8.6717 -14.0462 -v -21.0623 8.6717 -13.1482 -v -19.8356 8.6717 -12.8195 -v -18.6090 8.6717 -13.1482 -v -17.7111 8.6717 -14.0462 -v -17.4660 7.9885 -16.6409 -v -17.0994 7.9885 -15.2728 -v -18.4675 7.9885 -17.6424 -v -19.8356 7.9885 -18.0090 -v -21.2038 7.9885 -17.6424 -v -22.2053 7.9885 -16.6409 -v -22.5719 7.9885 -15.2728 -v -22.2053 7.9885 -13.9047 -v -21.2038 7.9885 -12.9031 -v -19.8356 7.9885 -12.5365 -v -18.4675 7.9885 -12.9031 -v -17.4660 7.9885 -13.9047 -v -17.3824 7.2553 -16.6892 -v -17.0029 7.2553 -15.2728 -v -18.4193 7.2553 -17.7260 -v -19.8356 7.2553 -18.1055 -v -21.2520 7.2553 -17.7260 -v -22.2889 7.2553 -16.6892 -v -22.6684 7.2553 -15.2728 -v -22.2889 7.2553 -13.8564 -v -21.2520 7.2553 -12.8195 -v -19.8356 7.2553 -12.4400 -v -18.4193 7.2553 -12.8195 -v -17.3824 7.2553 -13.8564 -v -17.3824 2.8328 -16.6892 -v -17.0029 2.8328 -15.2728 -v -18.4193 2.8328 -17.7260 -v -19.8356 2.8328 -18.1055 -v -21.2520 2.8328 -17.7260 -v -22.2889 2.8328 -16.6892 -v -22.6684 2.8328 -15.2728 -v -22.2889 2.8328 -13.8564 -v -21.2520 2.8328 -12.8195 -v -19.8356 2.8328 -12.4400 -v -18.4193 2.8328 -12.8195 -v -17.3824 2.8328 -13.8564 -v -17.4660 2.0996 -16.6409 -v -17.0994 2.0996 -15.2728 -v -18.4675 2.0996 -17.6424 -v -19.8356 2.0996 -18.0090 -v -21.2038 2.0996 -17.6424 -v -22.2053 2.0996 -16.6409 -v -22.5719 2.0996 -15.2728 -v -22.2053 2.0996 -13.9047 -v -21.2038 2.0996 -12.9031 -v -19.8356 2.0996 -12.5365 -v -18.4675 2.0996 -12.9031 -v -17.4660 2.0996 -13.9047 -v -17.7111 1.4164 -16.4994 -v -17.3824 1.4164 -15.2728 -v -18.6090 1.4164 -17.3974 -v -19.8356 1.4164 -17.7260 -v -21.0623 1.4164 -17.3974 -v -21.9602 1.4164 -16.4994 -v -22.2889 1.4164 -15.2728 -v -21.9602 1.4164 -14.0462 -v -21.0623 1.4164 -13.1482 -v -19.8356 1.4164 -12.8195 -v -18.6090 1.4164 -13.1482 -v -17.7111 1.4164 -14.0462 -v -18.1009 0.8297 -16.2743 -v -17.8326 0.8297 -15.2728 -v -18.8341 0.8297 -17.0075 -v -19.8356 0.8297 -17.2758 -v -20.8372 0.8297 -17.0075 -v -21.5704 0.8297 -16.2743 -v -21.8387 0.8297 -15.2728 -v -21.5704 0.8297 -14.2712 -v -20.8372 0.8297 -13.5381 -v -19.8356 0.8297 -13.2697 -v -18.8341 0.8297 -13.5381 -v -18.1009 0.8297 -14.2712 -v -18.6090 0.3795 -15.9810 -v -18.4193 0.3795 -15.2728 -v -19.1275 0.3795 -16.4994 -v -19.8356 0.3795 -16.6892 -v -20.5438 0.3795 -16.4994 -v -21.0623 0.3795 -15.9810 -v -21.2520 0.3795 -15.2728 -v -21.0623 0.3795 -14.5646 -v -20.5438 0.3795 -14.0462 -v -19.8356 0.3795 -13.8564 -v -19.1275 0.3795 -14.0462 -v -18.6090 0.3795 -14.5646 -v -19.2007 0.0965 -15.6394 -v -19.1025 0.0965 -15.2728 -v -19.4691 0.0965 -15.9077 -v -19.8356 0.0965 -16.0060 -v -20.2022 0.0965 -15.9077 -v -20.4706 0.0965 -15.6394 -v -20.5688 0.0965 -15.2728 -v -20.4706 0.0965 -14.9062 -v -20.2022 0.0965 -14.6378 -v -19.8356 0.0965 -14.5396 -v -19.4691 0.0965 -14.6378 -v -19.2007 0.0965 -14.9062 -v -19.8356 0.0000 -15.2728 -# 146 vertices - -vn 0.0000 1.0000 0.0000 -vn 0.2789 0.9603 0.0000 -vn 0.2415 0.9603 -0.1394 -vn 0.1394 0.9603 -0.2415 -vn 0.0000 0.9603 -0.2789 -vn -0.1394 0.9603 -0.2415 -vn -0.2415 0.9603 -0.1394 -vn -0.2789 0.9603 -0.0000 -vn -0.2415 0.9603 0.1394 -vn -0.1394 0.9603 0.2415 -vn -0.0000 0.9603 0.2789 -vn 0.1394 0.9603 0.2415 -vn 0.2415 0.9603 0.1394 -vn 0.4468 0.8566 -0.2580 -vn 0.5159 0.8566 0.0000 -vn 0.2580 0.8566 -0.4468 -vn -0.0000 0.8566 -0.5159 -vn -0.2580 0.8566 -0.4468 -vn -0.4468 0.8566 -0.2580 -vn -0.5159 0.8566 -0.0000 -vn -0.4468 0.8566 0.2580 -vn -0.2580 0.8566 0.4468 -vn -0.0000 0.8566 0.5159 -vn 0.2580 0.8566 0.4468 -vn 0.4468 0.8566 0.2580 -vn 0.6215 0.6965 -0.3588 -vn 0.7176 0.6965 0.0000 -vn 0.3588 0.6965 -0.6215 -vn -0.0000 0.6965 -0.7176 -vn -0.3588 0.6965 -0.6215 -vn -0.6215 0.6965 -0.3588 -vn -0.7176 0.6965 -0.0000 -vn -0.6215 0.6965 0.3588 -vn -0.3588 0.6965 0.6215 -vn -0.0000 0.6965 0.7176 -vn 0.3588 0.6965 0.6215 -vn 0.6215 0.6965 0.3588 -vn 0.7545 0.4909 -0.4356 -vn 0.8712 0.4909 0.0000 -vn 0.4356 0.4909 -0.7545 -vn -0.0000 0.4909 -0.8712 -vn -0.4356 0.4909 -0.7545 -vn -0.7545 0.4909 -0.4356 -vn -0.8712 0.4909 -0.0000 -vn -0.7545 0.4909 0.4356 -vn -0.4356 0.4909 0.7545 -vn -0.0000 0.4909 0.8712 -vn 0.4356 0.4909 0.7545 -vn 0.7545 0.4909 0.4356 -vn 0.8377 0.2536 -0.4837 -vn 0.9673 0.2536 0.0000 -vn 0.4837 0.2536 -0.8377 -vn -0.0000 0.2536 -0.9673 -vn -0.4837 0.2536 -0.8377 -vn -0.8377 0.2536 -0.4837 -vn -0.9673 0.2536 -0.0000 -vn -0.8377 0.2536 0.4837 -vn -0.4837 0.2536 0.8377 -vn -0.0000 0.2536 0.9673 -vn 0.4837 0.2536 0.8377 -vn 0.8377 0.2536 0.4837 -vn 0.8642 0.0647 -0.4990 -vn 0.9979 0.0647 0.0000 -vn 0.4990 0.0647 -0.8642 -vn -0.0000 0.0647 -0.9979 -vn -0.4990 0.0647 -0.8642 -vn -0.8642 0.0647 -0.4990 -vn -0.9979 0.0647 -0.0000 -vn -0.8642 0.0647 0.4990 -vn -0.4990 0.0647 0.8642 -vn -0.0000 0.0647 0.9979 -vn 0.4990 0.0647 0.8642 -vn 0.8642 0.0647 0.4990 -vn 0.8642 -0.0647 -0.4990 -vn 0.9979 -0.0647 0.0000 -vn 0.4990 -0.0647 -0.8642 -vn -0.0000 -0.0647 -0.9979 -vn -0.4990 -0.0647 -0.8642 -vn -0.8642 -0.0647 -0.4990 -vn -0.9979 -0.0647 -0.0000 -vn -0.8642 -0.0647 0.4990 -vn -0.4990 -0.0647 0.8642 -vn -0.0000 -0.0647 0.9979 -vn 0.4990 -0.0647 0.8642 -vn 0.8642 -0.0647 0.4990 -vn 0.8377 -0.2536 -0.4837 -vn 0.9673 -0.2536 0.0000 -vn 0.4837 -0.2536 -0.8377 -vn -0.0000 -0.2536 -0.9673 -vn -0.4837 -0.2536 -0.8377 -vn -0.8377 -0.2536 -0.4837 -vn -0.9673 -0.2536 -0.0000 -vn -0.8377 -0.2536 0.4837 -vn -0.4837 -0.2536 0.8377 -vn -0.0000 -0.2536 0.9673 -vn 0.4837 -0.2536 0.8377 -vn 0.8377 -0.2536 0.4837 -vn 0.7545 -0.4909 -0.4356 -vn 0.8712 -0.4909 0.0000 -vn 0.4356 -0.4909 -0.7545 -vn 0.0000 -0.4909 -0.8712 -vn -0.4356 -0.4909 -0.7545 -vn -0.7545 -0.4909 -0.4356 -vn -0.8712 -0.4909 -0.0000 -vn -0.7545 -0.4909 0.4356 -vn -0.4356 -0.4909 0.7545 -vn -0.0000 -0.4909 0.8712 -vn 0.4356 -0.4909 0.7545 -vn 0.7545 -0.4909 0.4356 -vn 0.6215 -0.6965 -0.3588 -vn 0.7176 -0.6965 0.0000 -vn 0.3588 -0.6965 -0.6215 -vn -0.0000 -0.6965 -0.7176 -vn -0.3588 -0.6965 -0.6215 -vn -0.6215 -0.6965 -0.3588 -vn -0.7176 -0.6965 -0.0000 -vn -0.6215 -0.6965 0.3588 -vn -0.3588 -0.6965 0.6215 -vn -0.0000 -0.6965 0.7176 -vn 0.3588 -0.6965 0.6215 -vn 0.6215 -0.6965 0.3588 -vn 0.4468 -0.8566 -0.2580 -vn 0.5159 -0.8566 0.0000 -vn 0.2580 -0.8566 -0.4468 -vn -0.0000 -0.8566 -0.5159 -vn -0.2580 -0.8566 -0.4468 -vn -0.4468 -0.8566 -0.2580 -vn -0.5159 -0.8566 -0.0000 -vn -0.4468 -0.8566 0.2580 -vn -0.2580 -0.8566 0.4468 -vn -0.0000 -0.8566 0.5159 -vn 0.2580 -0.8566 0.4468 -vn 0.4468 -0.8566 0.2580 -vn 0.2415 -0.9603 -0.1394 -vn 0.2789 -0.9603 0.0000 -vn 0.1394 -0.9603 -0.2415 -vn -0.0000 -0.9603 -0.2789 -vn -0.1394 -0.9603 -0.2415 -vn -0.2415 -0.9603 -0.1394 -vn -0.2789 -0.9603 -0.0000 -vn -0.2415 -0.9603 0.1394 -vn -0.1394 -0.9603 0.2415 -vn -0.0000 -0.9603 0.2789 -vn 0.1394 -0.9603 0.2415 -vn 0.2415 -0.9603 0.1394 -vn -0.0000 -1.0000 0.0000 -# 146 vertex normals - -vt 0.5000 0.5000 0.0000 -vt 0.6294 0.5000 0.0000 -vt 0.6121 0.5647 0.0000 -vt 0.5647 0.6121 0.0000 -vt 0.5000 0.6294 0.0000 -vt 0.4353 0.6121 0.0000 -vt 0.3879 0.5647 0.0000 -vt 0.3706 0.5000 0.0000 -vt 0.3879 0.4353 0.0000 -vt 0.4353 0.3879 0.0000 -vt 0.5000 0.3706 0.0000 -vt 0.5647 0.3879 0.0000 -vt 0.6121 0.4353 0.0000 -vt 0.7165 0.6250 0.0000 -vt 0.7500 0.5000 0.0000 -vt 0.6250 0.7165 0.0000 -vt 0.5000 0.7500 0.0000 -vt 0.3750 0.7165 0.0000 -vt 0.2835 0.6250 0.0000 -vt 0.2500 0.5000 0.0000 -vt 0.2835 0.3750 0.0000 -vt 0.3750 0.2835 0.0000 -vt 0.5000 0.2500 0.0000 -vt 0.6250 0.2835 0.0000 -vt 0.7165 0.3750 0.0000 -vt 0.8062 0.6768 0.0000 -vt 0.8536 0.5000 0.0000 -vt 0.6768 0.8062 0.0000 -vt 0.5000 0.8536 0.0000 -vt 0.3232 0.8062 0.0000 -vt 0.1938 0.6768 0.0000 -vt 0.1464 0.5000 0.0000 -vt 0.1938 0.3232 0.0000 -vt 0.3232 0.1938 0.0000 -vt 0.5000 0.1464 0.0000 -vt 0.6768 0.1938 0.0000 -vt 0.8062 0.3232 0.0000 -vt 0.8750 0.7165 0.0000 -vt 0.9330 0.5000 0.0000 -vt 0.7165 0.8750 0.0000 -vt 0.5000 0.9330 0.0000 -vt 0.2835 0.8750 0.0000 -vt 0.1250 0.7165 0.0000 -vt 0.0670 0.5000 0.0000 -vt 0.1250 0.2835 0.0000 -vt 0.2835 0.1250 0.0000 -vt 0.5000 0.0670 0.0000 -vt 0.7165 0.1250 0.0000 -vt 0.8750 0.2835 0.0000 -vt 0.9183 0.7415 0.0000 -vt 0.9830 0.5000 0.0000 -vt 0.7415 0.9183 0.0000 -vt 0.5000 0.9830 0.0000 -vt 0.2585 0.9183 0.0000 -vt 0.0817 0.7415 0.0000 -vt 0.0170 0.5000 0.0000 -vt 0.0817 0.2585 0.0000 -vt 0.2585 0.0817 0.0000 -vt 0.5000 0.0170 0.0000 -vt 0.7415 0.0817 0.0000 -vt 0.9183 0.2585 0.0000 -vt 0.9330 0.7500 0.0000 -vt 1.0000 0.5000 0.0000 -vt 0.7500 0.9330 0.0000 -vt 0.5000 1.0000 0.0000 -vt 0.2500 0.9330 0.0000 -vt 0.0670 0.7500 0.0000 -vt 0.0000 0.5000 0.0000 -vt 0.0670 0.2500 0.0000 -vt 0.2500 0.0670 0.0000 -vt 0.5000 0.0000 0.0000 -vt 0.7500 0.0670 0.0000 -vt 0.9330 0.2500 0.0000 -vt 0.0833 0.0000 0.0000 -vt 0.0833 1.0000 0.0000 -vt 0.0000 1.0000 0.0000 -vt 0.0000 0.0000 0.0000 -vt 0.1667 0.0000 0.0000 -vt 0.1667 1.0000 0.0000 -vt 0.2500 0.0000 0.0000 -vt 0.2500 1.0000 0.0000 -vt 0.3333 0.0000 0.0000 -vt 0.3333 1.0000 0.0000 -vt 0.4167 0.0000 0.0000 -vt 0.4167 1.0000 0.0000 -vt 0.5833 0.0000 0.0000 -vt 0.5833 1.0000 0.0000 -vt 0.6667 0.0000 0.0000 -vt 0.6667 1.0000 0.0000 -vt 0.7500 0.0000 0.0000 -vt 0.7500 1.0000 0.0000 -vt 0.8333 0.0000 0.0000 -vt 0.8333 1.0000 0.0000 -vt 0.9167 0.0000 0.0000 -vt 0.9167 1.0000 0.0000 -vt 1.0000 0.0000 0.0000 -vt 1.0000 1.0000 0.0000 -# 97 texture coords - -g Capsule001 -usemtl 01___Default -s 4 -f 1/1/1 2/2/2 3/3/3 -f 1/1/1 3/3/3 4/4/4 -f 1/1/1 4/4/4 5/5/5 -f 1/1/1 5/5/5 6/6/6 -f 1/1/1 6/6/6 7/7/7 -f 1/1/1 7/7/7 8/8/8 -f 1/1/1 8/8/8 9/9/9 -f 1/1/1 9/9/9 10/10/10 -f 1/1/1 10/10/10 11/11/11 -f 1/1/1 11/11/11 12/12/12 -f 1/1/1 12/12/12 13/13/13 -f 1/1/1 13/13/13 2/2/2 -f 14/14/14 3/3/3 2/2/2 -f 2/2/2 15/15/15 14/14/14 -f 16/16/16 4/4/4 3/3/3 -f 3/3/3 14/14/14 16/16/16 -f 17/17/17 5/5/5 4/4/4 -f 4/4/4 16/16/16 17/17/17 -f 18/18/18 6/6/6 5/5/5 -f 5/5/5 17/17/17 18/18/18 -f 19/19/19 7/7/7 6/6/6 -f 6/6/6 18/18/18 19/19/19 -f 20/20/20 8/8/8 7/7/7 -f 7/7/7 19/19/19 20/20/20 -f 21/21/21 9/9/9 8/8/8 -f 8/8/8 20/20/20 21/21/21 -f 22/22/22 10/10/10 9/9/9 -f 9/9/9 21/21/21 22/22/22 -f 23/23/23 11/11/11 10/10/10 -f 10/10/10 22/22/22 23/23/23 -f 24/24/24 12/12/12 11/11/11 -f 11/11/11 23/23/23 24/24/24 -f 25/25/25 13/13/13 12/12/12 -f 12/12/12 24/24/24 25/25/25 -f 15/15/15 2/2/2 13/13/13 -f 13/13/13 25/25/25 15/15/15 -f 26/26/26 14/14/14 15/15/15 -f 15/15/15 27/27/27 26/26/26 -f 28/28/28 16/16/16 14/14/14 -f 14/14/14 26/26/26 28/28/28 -f 29/29/29 17/17/17 16/16/16 -f 16/16/16 28/28/28 29/29/29 -f 30/30/30 18/18/18 17/17/17 -f 17/17/17 29/29/29 30/30/30 -f 31/31/31 19/19/19 18/18/18 -f 18/18/18 30/30/30 31/31/31 -f 32/32/32 20/20/20 19/19/19 -f 19/19/19 31/31/31 32/32/32 -f 33/33/33 21/21/21 20/20/20 -f 20/20/20 32/32/32 33/33/33 -f 34/34/34 22/22/22 21/21/21 -f 21/21/21 33/33/33 34/34/34 -f 35/35/35 23/23/23 22/22/22 -f 22/22/22 34/34/34 35/35/35 -f 36/36/36 24/24/24 23/23/23 -f 23/23/23 35/35/35 36/36/36 -f 37/37/37 25/25/25 24/24/24 -f 24/24/24 36/36/36 37/37/37 -f 27/27/27 15/15/15 25/25/25 -f 25/25/25 37/37/37 27/27/27 -f 38/38/38 26/26/26 27/27/27 -f 27/27/27 39/39/39 38/38/38 -f 40/40/40 28/28/28 26/26/26 -f 26/26/26 38/38/38 40/40/40 -f 41/41/41 29/29/29 28/28/28 -f 28/28/28 40/40/40 41/41/41 -f 42/42/42 30/30/30 29/29/29 -f 29/29/29 41/41/41 42/42/42 -f 43/43/43 31/31/31 30/30/30 -f 30/30/30 42/42/42 43/43/43 -f 44/44/44 32/32/32 31/31/31 -f 31/31/31 43/43/43 44/44/44 -f 45/45/45 33/33/33 32/32/32 -f 32/32/32 44/44/44 45/45/45 -f 46/46/46 34/34/34 33/33/33 -f 33/33/33 45/45/45 46/46/46 -f 47/47/47 35/35/35 34/34/34 -f 34/34/34 46/46/46 47/47/47 -f 48/48/48 36/36/36 35/35/35 -f 35/35/35 47/47/47 48/48/48 -f 49/49/49 37/37/37 36/36/36 -f 36/36/36 48/48/48 49/49/49 -f 39/39/39 27/27/27 37/37/37 -f 37/37/37 49/49/49 39/39/39 -f 50/50/50 38/38/38 39/39/39 -f 39/39/39 51/51/51 50/50/50 -f 52/52/52 40/40/40 38/38/38 -f 38/38/38 50/50/50 52/52/52 -f 53/53/53 41/41/41 40/40/40 -f 40/40/40 52/52/52 53/53/53 -f 54/54/54 42/42/42 41/41/41 -f 41/41/41 53/53/53 54/54/54 -f 55/55/55 43/43/43 42/42/42 -f 42/42/42 54/54/54 55/55/55 -f 56/56/56 44/44/44 43/43/43 -f 43/43/43 55/55/55 56/56/56 -f 57/57/57 45/45/45 44/44/44 -f 44/44/44 56/56/56 57/57/57 -f 58/58/58 46/46/46 45/45/45 -f 45/45/45 57/57/57 58/58/58 -f 59/59/59 47/47/47 46/46/46 -f 46/46/46 58/58/58 59/59/59 -f 60/60/60 48/48/48 47/47/47 -f 47/47/47 59/59/59 60/60/60 -f 61/61/61 49/49/49 48/48/48 -f 48/48/48 60/60/60 61/61/61 -f 51/51/51 39/39/39 49/49/49 -f 49/49/49 61/61/61 51/51/51 -f 62/62/62 50/50/50 51/51/51 -f 51/51/51 63/63/63 62/62/62 -f 64/64/64 52/52/52 50/50/50 -f 50/50/50 62/62/62 64/64/64 -f 65/65/65 53/53/53 52/52/52 -f 52/52/52 64/64/64 65/65/65 -f 66/66/66 54/54/54 53/53/53 -f 53/53/53 65/65/65 66/66/66 -f 67/67/67 55/55/55 54/54/54 -f 54/54/54 66/66/66 67/67/67 -f 68/68/68 56/56/56 55/55/55 -f 55/55/55 67/67/67 68/68/68 -f 69/69/69 57/57/57 56/56/56 -f 56/56/56 68/68/68 69/69/69 -f 70/70/70 58/58/58 57/57/57 -f 57/57/57 69/69/69 70/70/70 -f 71/71/71 59/59/59 58/58/58 -f 58/58/58 70/70/70 71/71/71 -f 72/72/72 60/60/60 59/59/59 -f 59/59/59 71/71/71 72/72/72 -f 73/73/73 61/61/61 60/60/60 -f 60/60/60 72/72/72 73/73/73 -f 63/63/63 51/51/51 61/61/61 -f 61/61/61 73/73/73 63/63/63 -f 74/74/74 62/75/62 63/76/63 -f 63/76/63 75/77/75 74/74/74 -f 76/78/76 64/79/64 62/75/62 -f 62/75/62 74/74/74 76/78/76 -f 77/80/77 65/81/65 64/79/64 -f 64/79/64 76/78/76 77/80/77 -f 78/82/78 66/83/66 65/81/65 -f 65/81/65 77/80/77 78/82/78 -f 79/84/79 67/85/67 66/83/66 -f 66/83/66 78/82/78 79/84/79 -f 80/71/80 68/65/68 67/85/67 -f 67/85/67 79/84/79 80/71/80 -f 81/86/81 69/87/69 68/65/68 -f 68/65/68 80/71/80 81/86/81 -f 82/88/82 70/89/70 69/87/69 -f 69/87/69 81/86/81 82/88/82 -f 83/90/83 71/91/71 70/89/70 -f 70/89/70 82/88/82 83/90/83 -f 84/92/84 72/93/72 71/91/71 -f 71/91/71 83/90/83 84/92/84 -f 85/94/85 73/95/73 72/93/72 -f 72/93/72 84/92/84 85/94/85 -f 75/96/75 63/97/63 73/95/73 -f 73/95/73 85/94/85 75/96/75 -f 86/50/86 74/62/74 75/63/75 -f 75/63/75 87/51/87 86/50/86 -f 88/52/88 76/64/76 74/62/74 -f 74/62/74 86/50/86 88/52/88 -f 89/53/89 77/65/77 76/64/76 -f 76/64/76 88/52/88 89/53/89 -f 90/54/90 78/66/78 77/65/77 -f 77/65/77 89/53/89 90/54/90 -f 91/55/91 79/67/79 78/66/78 -f 78/66/78 90/54/90 91/55/91 -f 92/56/92 80/68/80 79/67/79 -f 79/67/79 91/55/91 92/56/92 -f 93/57/93 81/69/81 80/68/80 -f 80/68/80 92/56/92 93/57/93 -f 94/58/94 82/70/82 81/69/81 -f 81/69/81 93/57/93 94/58/94 -f 95/59/95 83/71/83 82/70/82 -f 82/70/82 94/58/94 95/59/95 -f 96/60/96 84/72/84 83/71/83 -f 83/71/83 95/59/95 96/60/96 -f 97/61/97 85/73/85 84/72/84 -f 84/72/84 96/60/96 97/61/97 -f 87/51/87 75/63/75 85/73/85 -f 85/73/85 97/61/97 87/51/87 -f 98/38/98 86/50/86 87/51/87 -f 87/51/87 99/39/99 98/38/98 -f 100/40/100 88/52/88 86/50/86 -f 86/50/86 98/38/98 100/40/100 -f 101/41/101 89/53/89 88/52/88 -f 88/52/88 100/40/100 101/41/101 -f 102/42/102 90/54/90 89/53/89 -f 89/53/89 101/41/101 102/42/102 -f 103/43/103 91/55/91 90/54/90 -f 90/54/90 102/42/102 103/43/103 -f 104/44/104 92/56/92 91/55/91 -f 91/55/91 103/43/103 104/44/104 -f 105/45/105 93/57/93 92/56/92 -f 92/56/92 104/44/104 105/45/105 -f 106/46/106 94/58/94 93/57/93 -f 93/57/93 105/45/105 106/46/106 -f 107/47/107 95/59/95 94/58/94 -f 94/58/94 106/46/106 107/47/107 -f 108/48/108 96/60/96 95/59/95 -f 95/59/95 107/47/107 108/48/108 -f 109/49/109 97/61/97 96/60/96 -f 96/60/96 108/48/108 109/49/109 -f 99/39/99 87/51/87 97/61/97 -f 97/61/97 109/49/109 99/39/99 -f 110/26/110 98/38/98 99/39/99 -f 99/39/99 111/27/111 110/26/110 -f 112/28/112 100/40/100 98/38/98 -f 98/38/98 110/26/110 112/28/112 -f 113/29/113 101/41/101 100/40/100 -f 100/40/100 112/28/112 113/29/113 -f 114/30/114 102/42/102 101/41/101 -f 101/41/101 113/29/113 114/30/114 -f 115/31/115 103/43/103 102/42/102 -f 102/42/102 114/30/114 115/31/115 -f 116/32/116 104/44/104 103/43/103 -f 103/43/103 115/31/115 116/32/116 -f 117/33/117 105/45/105 104/44/104 -f 104/44/104 116/32/116 117/33/117 -f 118/34/118 106/46/106 105/45/105 -f 105/45/105 117/33/117 118/34/118 -f 119/35/119 107/47/107 106/46/106 -f 106/46/106 118/34/118 119/35/119 -f 120/36/120 108/48/108 107/47/107 -f 107/47/107 119/35/119 120/36/120 -f 121/37/121 109/49/109 108/48/108 -f 108/48/108 120/36/120 121/37/121 -f 111/27/111 99/39/99 109/49/109 -f 109/49/109 121/37/121 111/27/111 -f 122/14/122 110/26/110 111/27/111 -f 111/27/111 123/15/123 122/14/122 -f 124/16/124 112/28/112 110/26/110 -f 110/26/110 122/14/122 124/16/124 -f 125/17/125 113/29/113 112/28/112 -f 112/28/112 124/16/124 125/17/125 -f 126/18/126 114/30/114 113/29/113 -f 113/29/113 125/17/125 126/18/126 -f 127/19/127 115/31/115 114/30/114 -f 114/30/114 126/18/126 127/19/127 -f 128/20/128 116/32/116 115/31/115 -f 115/31/115 127/19/127 128/20/128 -f 129/21/129 117/33/117 116/32/116 -f 116/32/116 128/20/128 129/21/129 -f 130/22/130 118/34/118 117/33/117 -f 117/33/117 129/21/129 130/22/130 -f 131/23/131 119/35/119 118/34/118 -f 118/34/118 130/22/130 131/23/131 -f 132/24/132 120/36/120 119/35/119 -f 119/35/119 131/23/131 132/24/132 -f 133/25/133 121/37/121 120/36/120 -f 120/36/120 132/24/132 133/25/133 -f 123/15/123 111/27/111 121/37/121 -f 121/37/121 133/25/133 123/15/123 -f 134/3/134 122/14/122 123/15/123 -f 123/15/123 135/2/135 134/3/134 -f 136/4/136 124/16/124 122/14/122 -f 122/14/122 134/3/134 136/4/136 -f 137/5/137 125/17/125 124/16/124 -f 124/16/124 136/4/136 137/5/137 -f 138/6/138 126/18/126 125/17/125 -f 125/17/125 137/5/137 138/6/138 -f 139/7/139 127/19/127 126/18/126 -f 126/18/126 138/6/138 139/7/139 -f 140/8/140 128/20/128 127/19/127 -f 127/19/127 139/7/139 140/8/140 -f 141/9/141 129/21/129 128/20/128 -f 128/20/128 140/8/140 141/9/141 -f 142/10/142 130/22/130 129/21/129 -f 129/21/129 141/9/141 142/10/142 -f 143/11/143 131/23/131 130/22/130 -f 130/22/130 142/10/142 143/11/143 -f 144/12/144 132/24/132 131/23/131 -f 131/23/131 143/11/143 144/12/144 -f 145/13/145 133/25/133 132/24/132 -f 132/24/132 144/12/144 145/13/145 -f 135/2/135 123/15/123 133/25/133 -f 133/25/133 145/13/145 135/2/135 -f 135/2/135 146/1/146 134/3/134 -f 134/3/134 146/1/146 136/4/136 -f 136/4/136 146/1/146 137/5/137 -f 137/5/137 146/1/146 138/6/138 -f 138/6/138 146/1/146 139/7/139 -f 139/7/139 146/1/146 140/8/140 -f 140/8/140 146/1/146 141/9/141 -f 141/9/141 146/1/146 142/10/142 -f 142/10/142 146/1/146 143/11/143 -f 143/11/143 146/1/146 144/12/144 -f 144/12/144 146/1/146 145/13/145 -f 145/13/145 146/1/146 135/2/135 -# 288 faces - # # object ____001 # # -# object Box003 -# - -v 28.3398 0.0000 23.8471 -v 28.3398 0.0000 15.4440 -v 37.2512 0.0000 15.4440 -v 37.2512 0.0000 23.8471 -v 28.3398 7.3427 23.8471 -v 37.2512 7.3427 23.8471 -v 37.2512 7.3427 15.4440 -v 28.3398 7.3427 15.4440 -# 8 vertices - -vn 0.0000 -1.0000 -0.0000 -vn 0.0000 1.0000 -0.0000 -vn 0.0000 0.0000 1.0000 -vn 1.0000 0.0000 -0.0000 -vn 0.0000 0.0000 -1.0000 -vn -1.0000 0.0000 -0.0000 -# 6 vertex normals - -vt 1.0000 0.0000 0.0000 -vt 1.0000 1.0000 0.0000 -vt 0.0000 1.0000 0.0000 -vt 0.0000 0.0000 0.0000 -# 4 texture coords - -g Box003 -usemtl 01___Default -s 2 -f 147/98/147 148/99/147 149/100/147 -f 149/100/147 150/101/147 147/98/147 -s 4 -f 151/101/148 152/98/148 153/99/148 -f 153/99/148 154/100/148 151/101/148 -s 8 -f 147/101/149 150/98/149 152/99/149 -f 152/99/149 151/100/149 147/101/149 -s 16 -f 150/101/150 149/98/150 153/99/150 -f 153/99/150 152/100/150 150/101/150 -s 32 -f 149/101/151 148/98/151 154/99/151 -f 154/99/151 153/100/151 149/101/151 -s 64 -f 148/101/152 147/98/152 151/99/152 -f 151/99/152 154/100/152 148/101/152 -# 12 faces - -# -# object Box004 +# object Box006 # -v 9.6273 0.0000 -20.5036 -v 9.6273 0.0000 -30.0944 -v 19.2345 0.0000 -30.0944 -v 19.2345 0.0000 -20.5036 -v 9.6273 9.2192 -20.5036 -v 19.2345 9.2192 -20.5036 -v 19.2345 9.2192 -30.0944 -v 9.6273 9.2192 -30.0944 +v -24.2372 0.0000 8.3985 +v -24.2372 0.0000 -7.0529 +v -10.7449 0.0000 -7.0529 +v -10.7449 0.0000 8.3985 +v -24.2372 8.4897 8.3985 +v -10.7449 8.4897 8.3985 +v -10.7449 8.4897 -7.0529 +v -24.2372 8.4897 -7.0529 # 8 vertices vn 0.0000 -1.0000 -0.0000 @@ -777,152 +35,40 @@ vt 0.0000 1.0000 0.0000 vt 0.0000 0.0000 0.0000 # 4 texture coords -g Box004 +g Box006 usemtl 01___Default s 2 -f 155/102/153 156/103/153 157/104/153 -f 157/104/153 158/105/153 155/102/153 +f 1/1/1 2/2/1 3/3/1 +f 3/3/1 4/4/1 1/1/1 s 4 -f 159/105/154 160/102/154 161/103/154 -f 161/103/154 162/104/154 159/105/154 +f 5/4/2 6/1/2 7/2/2 +f 7/2/2 8/3/2 5/4/2 s 8 -f 155/105/155 158/102/155 160/103/155 -f 160/103/155 159/104/155 155/105/155 +f 1/4/3 4/1/3 6/2/3 +f 6/2/3 5/3/3 1/4/3 s 16 -f 158/105/156 157/102/156 161/103/156 -f 161/103/156 160/104/156 158/105/156 +f 4/4/4 3/1/4 7/2/4 +f 7/2/4 6/3/4 4/4/4 s 32 -f 157/105/157 156/102/157 162/103/157 -f 162/103/157 161/104/157 157/105/157 +f 3/4/5 2/1/5 8/2/5 +f 8/2/5 7/3/5 3/4/5 s 64 -f 156/105/158 155/102/158 159/103/158 -f 159/103/158 162/104/158 156/105/158 +f 2/4/6 1/1/6 5/2/6 +f 5/2/6 8/3/6 2/4/6 # 12 faces # # object Box008 # -v -13.1344 0.0000 45.4839 -v -13.1344 0.0000 32.9018 -v 4.1393 0.0000 32.9018 -v 4.1393 0.0000 45.4839 -v -13.1344 0.9776 -5.1609 -v 4.1393 0.9776 -5.1609 -v -13.1344 11.0748 45.4839 -v 4.1393 11.0748 45.4839 -v 4.1393 11.0748 32.9018 -v -13.1344 11.0748 32.9018 -# 10 vertices - -vn 0.0000 -1.0000 -0.0000 -vn 0.0000 -0.9999 -0.0128 -vn 0.0000 -0.9997 -0.0257 -vn 0.0000 1.0000 -0.0000 -vn 0.0000 0.9916 -0.1293 -vn 0.0000 0.9666 -0.2564 -vn 0.0000 0.0000 1.0000 -vn 1.0000 0.0000 -0.0000 -vn -1.0000 0.0000 -0.0000 -# 9 vertex normals - -vt 1.0000 0.0000 0.0000 -vt 1.0000 0.5000 0.0000 -vt 0.0000 0.5000 0.0000 -vt 0.0000 0.0000 0.0000 -vt 1.0000 1.0000 0.0000 -vt 0.0000 1.0000 0.0000 -vt 0.5000 0.0000 0.0000 -vt 0.5000 1.0000 0.0000 -# 8 texture coords - -g Box008 -usemtl 01___Default -s 2 -f 163/106/159 164/107/160 165/108/160 -f 165/108/160 166/109/159 163/106/159 -f 164/107/160 167/110/161 168/111/161 -f 168/111/161 165/108/160 164/107/160 -s 4 -f 169/109/162 170/106/162 171/107/163 -f 171/107/163 172/108/163 169/109/162 -f 172/108/163 171/107/163 168/110/164 -f 168/110/164 167/111/164 172/108/163 -s 8 -f 163/109/165 166/106/165 170/110/165 -f 170/110/165 169/111/165 163/109/165 -s 16 -f 166/109/166 165/112/166 171/113/166 -f 171/113/166 170/111/166 166/109/166 -f 165/112/166 168/106/166 171/113/166 -s 64 -f 167/109/167 164/112/167 172/113/167 -f 164/112/167 163/106/167 169/110/167 -f 169/110/167 172/113/167 164/112/167 -# 16 faces - -# -# object Box005 -# - -v -40.0584 0.0000 -35.1705 -v -40.0584 0.0000 -39.3744 -v 4.5723 0.0000 -39.3744 -v 4.5723 0.0000 -35.1705 -v -40.0584 19.0217 -35.1705 -v 4.5723 19.0217 -35.1705 -v 4.5723 19.0217 -39.3744 -v -40.0584 19.0217 -39.3744 -# 8 vertices - -vn 0.0000 -1.0000 -0.0000 -vn 0.0000 1.0000 -0.0000 -vn 0.0000 0.0000 1.0000 -vn 1.0000 0.0000 -0.0000 -vn 0.0000 0.0000 -1.0000 -vn -1.0000 0.0000 -0.0000 -# 6 vertex normals - -vt 1.0000 0.0000 0.0000 -vt 1.0000 1.0000 0.0000 -vt 0.0000 1.0000 0.0000 -vt 0.0000 0.0000 0.0000 -# 4 texture coords - -g Box005 -usemtl 01___Default -s 2 -f 173/114/168 174/115/168 175/116/168 -f 175/116/168 176/117/168 173/114/168 -s 4 -f 177/117/169 178/114/169 179/115/169 -f 179/115/169 180/116/169 177/117/169 -s 8 -f 173/117/170 176/114/170 178/115/170 -f 178/115/170 177/116/170 173/117/170 -s 16 -f 176/117/171 175/114/171 179/115/171 -f 179/115/171 178/116/171 176/117/171 -s 32 -f 175/117/172 174/114/172 180/115/172 -f 180/115/172 179/116/172 175/117/172 -s 64 -f 174/117/173 173/114/173 177/115/173 -f 177/115/173 180/116/173 174/117/173 -# 12 faces - -# -# object Box006 -# - -v 26.3586 0.0000 2.1948 -v 26.3586 0.0000 -13.2566 -v 39.8509 0.0000 -13.2566 -v 39.8509 0.0000 2.1948 -v 26.3586 8.4897 2.1948 -v 39.8509 8.4897 2.1948 -v 39.8509 8.4897 -13.2566 -v 26.3586 8.4897 -13.2566 +v -0.0752 0.0000 50.0000 +v -0.0752 0.0000 -50.0000 +v 47.8119 0.0000 -50.0000 +v 47.8119 0.0000 50.0000 +v -0.0752 1.0000 50.0000 +v 47.8119 1.0000 50.0000 +v 47.8119 1.0000 -50.0000 +v -0.0752 1.0000 -50.0000 # 8 vertices vn 0.0000 -1.0000 -0.0000 @@ -939,40 +85,40 @@ vt 0.0000 1.0000 0.0000 vt 0.0000 0.0000 0.0000 # 4 texture coords -g Box006 +g Box008 usemtl 01___Default s 2 -f 181/118/174 182/119/174 183/120/174 -f 183/120/174 184/121/174 181/118/174 +f 9/5/7 10/6/7 11/7/7 +f 11/7/7 12/8/7 9/5/7 s 4 -f 185/121/175 186/118/175 187/119/175 -f 187/119/175 188/120/175 185/121/175 +f 13/8/8 14/5/8 15/6/8 +f 15/6/8 16/7/8 13/8/8 s 8 -f 181/121/176 184/118/176 186/119/176 -f 186/119/176 185/120/176 181/121/176 +f 9/8/9 12/5/9 14/6/9 +f 14/6/9 13/7/9 9/8/9 s 16 -f 184/121/177 183/118/177 187/119/177 -f 187/119/177 186/120/177 184/121/177 +f 12/8/10 11/5/10 15/6/10 +f 15/6/10 14/7/10 12/8/10 s 32 -f 183/121/178 182/118/178 188/119/178 -f 188/119/178 187/120/178 183/121/178 +f 11/8/11 10/5/11 16/6/11 +f 16/6/11 15/7/11 11/8/11 s 64 -f 182/121/179 181/118/179 185/119/179 -f 185/119/179 188/120/179 182/121/179 +f 10/8/12 9/5/12 13/6/12 +f 13/6/12 16/7/12 10/8/12 # 12 faces # -# object Box007 +# object Box009 # -v 16.7020 0.0000 46.6052 -v 16.7020 0.0000 35.2692 -v 28.8644 0.0000 35.2692 -v 28.8644 0.0000 46.6052 -v 16.7020 8.9065 46.6052 -v 28.8644 8.9065 46.6052 -v 28.8644 8.9065 35.2692 -v 16.7020 8.9065 35.2692 +v -57.6132 0.0000 50.0000 +v -57.6132 0.0000 -50.0000 +v -9.7261 0.0000 -50.0000 +v -9.7261 0.0000 50.0000 +v -57.6132 1.0000 50.0000 +v -9.7261 1.0000 50.0000 +v -9.7261 1.0000 -50.0000 +v -57.6132 1.0000 -50.0000 # 8 vertices vn 0.0000 -1.0000 -0.0000 @@ -989,40 +135,40 @@ vt 0.0000 1.0000 0.0000 vt 0.0000 0.0000 0.0000 # 4 texture coords -g Box007 +g Box009 usemtl 01___Default s 2 -f 189/122/180 190/123/180 191/124/180 -f 191/124/180 192/125/180 189/122/180 +f 17/9/13 18/10/13 19/11/13 +f 19/11/13 20/12/13 17/9/13 s 4 -f 193/125/181 194/122/181 195/123/181 -f 195/123/181 196/124/181 193/125/181 +f 21/12/14 22/9/14 23/10/14 +f 23/10/14 24/11/14 21/12/14 s 8 -f 189/125/182 192/122/182 194/123/182 -f 194/123/182 193/124/182 189/125/182 +f 17/12/15 20/9/15 22/10/15 +f 22/10/15 21/11/15 17/12/15 s 16 -f 192/125/183 191/122/183 195/123/183 -f 195/123/183 194/124/183 192/125/183 +f 20/12/16 19/9/16 23/10/16 +f 23/10/16 22/11/16 20/12/16 s 32 -f 191/125/184 190/122/184 196/123/184 -f 196/123/184 195/124/184 191/125/184 +f 19/12/17 18/9/17 24/10/17 +f 24/10/17 23/11/17 19/12/17 s 64 -f 190/125/185 189/122/185 193/123/185 -f 193/123/185 196/124/185 190/125/185 +f 18/12/18 17/9/18 21/10/18 +f 21/10/18 24/11/18 18/12/18 # 12 faces # -# object Box001 +# object Box010 # -v -50.0000 0.0000 50.0000 -v -50.0000 0.0000 -50.0000 -v 50.0000 0.0000 -50.0000 -v 50.0000 0.0000 50.0000 -v -50.0000 1.0000 50.0000 -v 50.0000 1.0000 50.0000 -v 50.0000 1.0000 -50.0000 -v -50.0000 1.0000 -50.0000 +v 1.8428 0.0000 8.3985 +v 1.8428 0.0000 -7.0529 +v 15.3351 0.0000 -7.0529 +v 15.3351 0.0000 8.3985 +v 1.8428 8.4897 8.3985 +v 15.3351 8.4897 8.3985 +v 15.3351 8.4897 -7.0529 +v 1.8428 8.4897 -7.0529 # 8 vertices vn 0.0000 -1.0000 -0.0000 @@ -1039,25 +185,25 @@ vt 0.0000 1.0000 0.0000 vt 0.0000 0.0000 0.0000 # 4 texture coords -g Box001 +g Box010 usemtl 01___Default s 2 -f 197/126/186 198/127/186 199/128/186 -f 199/128/186 200/129/186 197/126/186 +f 25/13/19 26/14/19 27/15/19 +f 27/15/19 28/16/19 25/13/19 s 4 -f 201/129/187 202/126/187 203/127/187 -f 203/127/187 204/128/187 201/129/187 +f 29/16/20 30/13/20 31/14/20 +f 31/14/20 32/15/20 29/16/20 s 8 -f 197/129/188 200/126/188 202/127/188 -f 202/127/188 201/128/188 197/129/188 +f 25/16/21 28/13/21 30/14/21 +f 30/14/21 29/15/21 25/16/21 s 16 -f 200/129/189 199/126/189 203/127/189 -f 203/127/189 202/128/189 200/129/189 +f 28/16/22 27/13/22 31/14/22 +f 31/14/22 30/15/22 28/16/22 s 32 -f 199/129/190 198/126/190 204/127/190 -f 204/127/190 203/128/190 199/129/190 +f 27/16/23 26/13/23 32/14/23 +f 32/14/23 31/15/23 27/16/23 s 64 -f 198/129/191 197/126/191 201/127/191 -f 201/127/191 204/128/191 198/129/191 +f 26/16/24 25/13/24 29/14/24 +f 29/14/24 32/15/24 26/16/24 # 12 faces diff --git a/src/chapter9/Chapter9_13.cpp b/src/chapter9/Chapter9_13.cpp index 0774ca4..7009df1 100644 --- a/src/chapter9/Chapter9_13.cpp +++ b/src/chapter9/Chapter9_13.cpp @@ -49,7 +49,7 @@ Scene* Chapter9_13::createScene() auto camera = Camera::createPerspective(60, (GLfloat)winSize.width / winSize.height, 1.0f, 1000.0f); camera->setCameraFlag(CameraFlag::USER1); - camera->setPosition3D(Vec3(0.0, 50.0f, 80.0f)); + camera->setPosition3D(Vec3(0.0f, 30.0f, 60.0f)); camera->lookAt(Vec3(0.0, 0.0, 0.0), Vec3(0.0, 1.0, 0.0)); scene->addChild(camera); @@ -75,12 +75,36 @@ Scene* Chapter9_13::createScene() auto agent = NavMeshAgent::create(param); auto agentNode = Sprite3D::create(filePath); agent->setOrientationRefAxes(Vec3(-1.0f, 0.0f, 1.0f)); - agentNode->setPosition3D(Vec3(0.0f, 2.34667206f, 0.0f)); + agentNode->setPosition3D(Vec3(30.0f, 1.0f, 0.0f)); agentNode->setScale(0.05f); agentNode->addComponent(agent); agentNode->setCameraMask((unsigned short)CameraFlag::USER1); scene->addChild(agentNode); + { + auto obstacle = NavMeshObstacle::create(2.0f, 6.0f); + auto obstacleNode = Sprite3D::create("box.c3t"); + obstacleNode->setTexture("HelloWorld.png"); + obstacleNode->setPosition3D(Vec3(35.0f, 1.0f, 10.0f)); + obstacleNode->setScale(3.0f); + obstacleNode->setScaleY(10.0f); + obstacleNode->addComponent(obstacle); + obstacleNode->setCameraMask((unsigned short)CameraFlag::USER1); + scene->addChild(obstacleNode); + } + + { + auto obstacle = NavMeshObstacle::create(2.0f, 6.0f); + auto obstacleNode = Sprite3D::create("box.c3t"); + obstacleNode->setTexture("HelloWorld.png"); + obstacleNode->setPosition3D(Vec3(-35.0f, 1.0f, 0.0f)); + obstacleNode->setScale(3.0f); + obstacleNode->setScaleY(10.0f); + obstacleNode->addComponent(obstacle); + obstacleNode->setCameraMask((unsigned short)CameraFlag::USER1); + scene->addChild(obstacleNode); + } + agentNode->runAction(RepeatForever::create(Sequence::create(CallFunc::create([=](){ float x = cocos2d::random(-50.0f, 50.0f); float z = cocos2d::random(-50.0f, 50.0f);