From 9ede3895f8c2a58892d73303f4da04dcbac6c23a Mon Sep 17 00:00:00 2001 From: HyroVitalyProtago Date: Sun, 12 Feb 2017 17:19:31 +0100 Subject: [PATCH 1/7] physics interactions with cubes some tests with physics interactions understanding the concept of authority thinking about how really handle all interactions... --- Assets/Materials/Blue.mat | Bin 0 -> 5016 bytes .../Blue.mat.meta} | 4 +- Assets/Materials/Green.mat | Bin 0 -> 5020 bytes .../Green.mat.meta} | 4 +- Assets/Materials/Red.mat | Bin 5016 -> 5016 bytes Assets/Prefabs/Camera 1.prefab | Bin 79924 -> 0 bytes Assets/Prefabs/Camera 2 1.prefab | Bin 9116 -> 0 bytes Assets/Prefabs/Camera 2 1.prefab.meta | 8 -- Assets/Prefabs/Camera 2.prefab | Bin 82508 -> 0 bytes Assets/Prefabs/Camera.prefab | Bin 82508 -> 0 bytes Assets/Prefabs/CapsuleHand_L.prefab | Bin 36348 -> 0 bytes Assets/Prefabs/CapsuleHand_L.prefab.meta | 8 -- Assets/Prefabs/CapsuleHand_R.prefab | Bin 36348 -> 0 bytes Assets/Prefabs/CapsuleHand_R.prefab.meta | 8 -- .../Prefabs/{PlayerCam.prefab => Cube.prefab} | Bin 13972 -> 11384 bytes .../{Camera.prefab.meta => Cube.prefab.meta} | 4 +- Assets/Prefabs/LeapPrefab.prefab | Bin 74348 -> 0 bytes Assets/Prefabs/LeapPrefab.prefab.meta | 8 -- Assets/Prefabs/Player 1.prefab | Bin 84268 -> 112048 bytes Assets/Prefabs/Player.prefab | Bin 23852 -> 0 bytes Assets/Prefabs/Player.prefab.meta | 8 -- Assets/Prefabs/PlayerCam.prefab.meta | 8 -- Assets/Scenes/Game.unity | Bin 34640 -> 0 bytes Assets/Scenes/Game.unity.meta | 8 -- Assets/Scenes/Main.unity | Bin 23088 -> 25296 bytes Assets/Scenes/Menu.unity | Bin 18176 -> 0 bytes Assets/Scenes/Menu.unity.meta | 8 -- Assets/Scripts/CubeSpawner.cs | 40 ++++++++++ Assets/Scripts/CubeSpawner.cs.meta | 12 +++ Assets/Scripts/EnableOnLocalPlayer.cs | 9 ++- Assets/Scripts/NetworkCube.cs | 70 ++++++++++++++++++ Assets/Scripts/NetworkCube.cs.meta | 12 +++ 32 files changed, 146 insertions(+), 73 deletions(-) create mode 100644 Assets/Materials/Blue.mat rename Assets/{Prefabs/Camera 2.prefab.meta => Materials/Blue.mat.meta} (65%) create mode 100644 Assets/Materials/Green.mat rename Assets/{Prefabs/Camera 1.prefab.meta => Materials/Green.mat.meta} (65%) delete mode 100644 Assets/Prefabs/Camera 1.prefab delete mode 100644 Assets/Prefabs/Camera 2 1.prefab delete mode 100644 Assets/Prefabs/Camera 2 1.prefab.meta delete mode 100644 Assets/Prefabs/Camera 2.prefab delete mode 100644 Assets/Prefabs/Camera.prefab delete mode 100644 Assets/Prefabs/CapsuleHand_L.prefab delete mode 100644 Assets/Prefabs/CapsuleHand_L.prefab.meta delete mode 100644 Assets/Prefabs/CapsuleHand_R.prefab delete mode 100644 Assets/Prefabs/CapsuleHand_R.prefab.meta rename Assets/Prefabs/{PlayerCam.prefab => Cube.prefab} (55%) rename Assets/Prefabs/{Camera.prefab.meta => Cube.prefab.meta} (65%) delete mode 100644 Assets/Prefabs/LeapPrefab.prefab delete mode 100644 Assets/Prefabs/LeapPrefab.prefab.meta delete mode 100644 Assets/Prefabs/Player.prefab delete mode 100644 Assets/Prefabs/Player.prefab.meta delete mode 100644 Assets/Prefabs/PlayerCam.prefab.meta delete mode 100644 Assets/Scenes/Game.unity delete mode 100644 Assets/Scenes/Game.unity.meta delete mode 100644 Assets/Scenes/Menu.unity delete mode 100644 Assets/Scenes/Menu.unity.meta create mode 100644 Assets/Scripts/CubeSpawner.cs create mode 100644 Assets/Scripts/CubeSpawner.cs.meta create mode 100644 Assets/Scripts/NetworkCube.cs create mode 100644 Assets/Scripts/NetworkCube.cs.meta diff --git a/Assets/Materials/Blue.mat b/Assets/Materials/Blue.mat new file mode 100644 index 0000000000000000000000000000000000000000..a8841fb1d0d0ca542efca8956f05d164ec6b7ffc GIT binary patch literal 5016 zcmeI0J8T?P6o${P?TzC=z!*qE2r=)s6A0#Myoq12Nj7%8NkBBiWPR-&n4Pg^W`iwJ zOoapu6;dQ3q$m;%0wF3I5Csh_5uyl>GAU@%qA2G7@66upwT&$LJ<-YB``vTToX5`k z?uhjMC^B$fMEXVU#6@IyXn5%0;vu=YwzgI%0Ng{mw)W|jtNU(T-Mw<{o!RRb_gvUj z0WD&^#AV1!A}O}4=}9V5z`rlLB>lD^X*VEUWm=H!82<`>8?Hsei}ELY?8lt;U2S{_ zexAU*H(zV{`LHPIPr09-Hv4uzj4!hiUZ zOx~sA+>1SovyWVBmz;#{yHL(|7+w(gkWnb}rBdME%J+87GTt8NPQ$Y}k7CYv?!Z-2 zZEwZNE^ZcQKe<*r&btiH`t=s(%xeHjVINt~I>zL86GF(ZgMWZA`GsgVvKSKy9$Tsc2^}Ii;S;pHx|3ikCs| z`aZsF?Cn0jVz}MMR}HuO_!{_TeHH|zLFJL#dvmcG1k7O{LoEwAfX>du|%>YXT@bfAcH#w^_Bmf?=r)DHJ|H0 zcKJ9`aoCJ%Dn8I;Xxbm&f#7(U zgo}$9NtwUl^E#W_8FR#|`#%vUV?GX(+yU7Mby_(Z!sXxt7f!@@SToR2^W-}iRk^NM%5%z!BSG^V!pps50Jj!E{*V=fm3aSVNz!d z=o-(d<8?O(l+SID0jN`5R<)+@M$f0@_MfUZ~T^OoDt&n-#I{{p_$KV<*_ literal 0 HcmV?d00001 diff --git a/Assets/Prefabs/Camera 2.prefab.meta b/Assets/Materials/Blue.mat.meta similarity index 65% rename from Assets/Prefabs/Camera 2.prefab.meta rename to Assets/Materials/Blue.mat.meta index 6aa9f22..106b99a 100644 --- a/Assets/Prefabs/Camera 2.prefab.meta +++ b/Assets/Materials/Blue.mat.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 -guid: 61cc92642ab6a4c418ce2ea33674c6d1 -timeCreated: 1475592569 +guid: 849f200d547021a4599b4e3b6bfadb13 +timeCreated: 1486909065 licenseType: Free NativeFormatImporter: userData: diff --git a/Assets/Materials/Green.mat b/Assets/Materials/Green.mat new file mode 100644 index 0000000000000000000000000000000000000000..83b9d54798400bf226b7541f4e4d8f71dad1b1ae GIT binary patch literal 5020 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 diff --git a/Assets/Prefabs/Camera 2 1.prefab b/Assets/Prefabs/Camera 2 1.prefab deleted file mode 100644 index 2db6e9f9725ab525dc13ae562fd44741c4675278..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9116 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 diff --git a/Assets/Prefabs/Camera 2 1.prefab.meta b/Assets/Prefabs/Camera 2 1.prefab.meta deleted file mode 100644 index fd02714..0000000 --- a/Assets/Prefabs/Camera 2 1.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: c876153b102d1b047913eb5c56abd7e6 -timeCreated: 1475682244 -licenseType: Free -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Prefabs/Camera 2.prefab b/Assets/Prefabs/Camera 2.prefab deleted file mode 100644 index 61dbe967af465509db2990992fec036622d1906c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82508 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 diff --git a/Assets/Prefabs/Camera.prefab b/Assets/Prefabs/Camera.prefab deleted file mode 100644 index c80c959941654b8d188331af334a43e419f4894b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82508 zcmeHw3wRa9`TmBR5k(QHMpO)n8WoVc5y^#nK)`S{wp0k@K!Uk>l0Z<@BO*rY1yLm6 zrD#zjQba@>kzm9dDo|{drf3xrD_U#uo+|49duR7O*|R%(c5Tit`9BXwm&|_eelzdP z&V9a_HH?xgjJUz04Z}FvFiIB7U!z}-zCC))>}CA$3S=V#Hn)0{)GjqwapZ)Ii+M|-!Y&ktep8IQ@VaWf+VR1(2Ji`cy+K+N8F397I zhguq;^@6n$5uP(I{A(C*iu_3V+d?ip8z-)JMDsYg$MY?1@*d*PDRLigVdnF3#-bKR z=mpE4*0$&E{d9`K$#2JtT>dwDKyHP5jtI`Po;hx}nne!fj!Ei$S1RQ?$Nxk_g=~sJ)R=5>=4IpYoWRWNviwpFXiS|REGx+! z5iBYz9-CbdFs9BZDl8Qbh81Q{&ky7nQ)dOUON#RfXN3hhf#TBKNrk0(`4ftBC4?E- z`6DH6Iiibz=VT-B@!2_fWhKVcg6#4^Vc}3{%2Q>fMI!=*!m~6mI(uFqSYk|&0P@Wn zV`^!jpg5nHk&h>gsd)_%Q#uinu|-4j^NKCGijd_-Pz6G0#^mh$JV_~GW=t)~Et)$t zFuiQn=)A&!a17sHR90GCR%)f>#6WqeN;-KE?#X$9xyH9r4J7w$x8NVca~`<$t8e~Z zGh)QagY(-Ay=DH7w++sob42%B%TGZu+k`A2*P&+H>`0*a9cs2Cn=!A=HmWgH-}Yu3 z-JL;}9L+YH0jb4}EVmLvu*Qd zp(RJNZGXPPlB3zS%Wt;iNe=m9ORk!2oBwxOa@A}rx!EjLT5{EF+nV_YExBs8MeeoP z7#k>^TNJ!(!VIZON9IU#(%_QXt}I|!4`gJQFEDsDSDG8Lyqj^1zyk16LZzHdd zk=NJA>u2QkH}cLi@{*0b^92GdcrSUNmpsu+9_iH&0R)0`0>O(4^XJLU=pw23Gga+8 zsH`-%D416|&-hO2$A=11>pEtQD|{_KbN*HyqjUk zRsCqmQFq-U7x<|9QOP5_jcQn9$?e0eMA7lzZH(yC6=u&;oyUS~xh|* zM8VA&f;JH|Lud-k5oDW)nIUw2OnEB<-Lo>ekPZzq7Of*@^3e4$pKop0s}yv7=+8Cc zzFjW(qq;t-3X1fnVa6iTpCp?<=*r)Xd%4i{iBnyfRtEh4qg?P`b$vAcqwAyN*)1$@ zrMjfmxR(nYMa zvYuBBne{v>oQ)!v`rJsA3l6Up$ke=&j6k-O@-mse%dz^HnCYB6exl6s6$P{NFU}5P zdQqm@Fz;uR7*m6RvXa2?piE1a3@-|rT~q127RewqDD#a&19S3b1SZZamYGMl?BYDk zHHrtShg@7FGm2{VPfaB9c4$BbuxeGV_>ON%D>l^k>)&bP?N6lKvFO~(3tp^Ul{Mv! zUWfhePXos6L(}+(Tu9|ZHNv49;eV+SPy$gSpaeFITFnxux)>r?HG)+FF{~Ob7itRB z2)f0Hh8iKVra+CrngSzP%mTunhOTX7je{CNSL2{Ypg-V`**@@3l#8>E=n^fETXc!K z$Y0B!h%Q<~*EX`N-O#mdX;g|XyF?9L+g1@>G<(<9-X%iU7U6oWq3lCsECdV+7FgAk zZV+ttT*d@Sa;3g1!SY7{H!`4}m!BtN?cn%8Nl|{8wa%ah&Use^a>6~R63g$fAXOz+ z{zvB)cRzdi(R(Z7Pi}kF?cH0CzwoxeeOLZ)@#NS0O#P(mMr0CXm_wBhEeFiPa%f2* zvJgdEQt(W)wHMhDVYyjR$rw3=v_fS&NTp6IqpLjM zR>Fp?U05DD20zLsw^wYiMlt;{(-~t<_>ZvhL;BmTRE~i#1bO6Khq6XVhdeS~4b~`; zRuvt^8{`N2kH!e;h6YgQzsiH@ZvT&$$4!4C{YTwK|2IqeWXL_zM>T*7i)^4&m)Mfq z(?>OcN^YjlMdC*Ks0Pp`|3XYDP*Eq%5h+pRw6<&{pt?ktJ$jJfKJ}ubDUHwmXjBd*?$pU$eR8 ztBGjE?z9M%N`{FjY)bzBPho2;)2|OCbD+?&uo>}*^72|J)0bqCaP7f1duMu-X0pt=z(Yv#_mnr5g&HG^t@Z`J08UK~De8!UlPqng}ZueN+l3 z$zQXQimY@{*i3n3rGwrk-4KJG(mE@^DqP2`V zL6%Yj1c#O72ZDoO4^xsMgH;g^$<52pktsKE4i{4&F^4IbI=-l=^rE2jI8~n6`R^Zx zKYvbor>|SoK0o*RMMs}4oNty|tcCo=5B0~5rc+#I9DmAm^e}nur%Xrj9+4g`GyM{qx7du`1weGz=8h!T>U|R4wvT#DUC>f8XD`L?=WKG7~GL(@I%-# zS_&b*qs*)N!$=gVS>KEm8JEn>KGBk+{(!uN{QH^YUkO`< ztLhJhnc)^$&#U^wCcoU0tNOzxFR|pR{;D7m@T8M5T6{;>rO2%-Go51wcK>7rz&9Q6V7vsr(b z{;220AB2ng13&l=d3Q_R)f6i^(&2oO%m1qW;Pa5DS#pFU^wsnCi+sGu;Xh`Z@MHSS zwB%_2@Pi!w%(MJC%M=?!WUefj?W39+B6fzs;rZFKN~BI1oIT?*%-n$N_EhP=-ueP z_n%LmeR###q+TMUNk3j0>SeT>a2p}>z5Z0aj5_G2>Sg3dSg-lte5GJ z*Ls=$IO}ElW3QKyk0S>1!WsD+^Vj{9JF;Gee267i^|C4h=JTje<<{)i+2lEvT=nae z+kAeGB}cu?a)`m|ZUHd+c<1m(48|=JTgpa@5Oqxop``&!b+B zOAm?LY!AkW9O0r~=JWRppJ|pH{WH6~)RLMlJdXe2H7t#UoGnD_4@1=X#pU8CR z5tf^Lp0NB!KS!K$NpC~)8%*3=$bC=9(hUOxRI?V9j-`(gaCS-Qgxu_$qPb?xJR^`d zC(s}mQ-nHlva}dQV(Tq^UbGcr>pnd&sYEQ6L^3`wGvBmBiV$-O7D^M!ro(!%Fh|yW z)IGY^GX`gu&d5bySe{U-g9>MeEn-9AaIejY6P#)-5yz}XcS}@E7d>=j2kCS zhSwu!6&3{pW}AnVry;r7!O{jxDR}@3Ri)X5r6Wedy8yTcaxTsb24-TlDkCo^NA=dn zlocrb31*unwvt7YCXdN3msUu8P_0Q=rh5Hmx|5u&wTq9^1eKscb4wAvaFKRU zO)RK=1(v`Z9(0jc`^LTRzIJV8?;D@K=aXl@UtaeYbX$kvmCJ=6nxVd?Q~itV@l(wZ z=DB{V8A4dd_ATXtA1Jn{){x!(G(+^q*$mMiugwtsaW+Hrr>*cBWHId{?o_!@+z>}| zQNt{5^amIg7o71zGXyz`kL>P{x8=F;s6qxkyk7iO#!8jH-+5Q&sN;5zoc7J6-19yv zM!@|Mh+O#Lg`sXyzYyd<{lf6Ff9i#G6-@WSP_OuTVf4rO!sw6J7e;@aFO2@!U)V~? zSP}h(LGm)oa`K8`4T9|@p5MU~iS1+8O}(hFu3wVkVEI!i zo+y|u#ql=%q&WR?ra1lan&R}wnd0;(T8a-2bwV;lIk;A@zL3(u~U6N^bV1xzQGW znf|xJ?2TGOhCj&LCePN!Jc;jRau1%!+vfA8c^-M9`lsB^6FR26wOVQk%02v7)qeK8R&O zut;qDOXu08MyZ+sF^Vlr&6UhiyMv0R&z4@Rbi8GD!|aBR4-|+QmCXHE%US3Oo1vS8 zR?hkc1zP=(;;4Z>YH7}K^j!DW zN`zj5REJJK7uFS=25hBZPM(QZ-jSJ-gS~NP=|Er^Qr$Y=->759qywuH%*o}_Hf1A#O_S=_iLD;qWhAiuf;qX&eDzF) z6-#yP#P+2Pz6g5t8mv{#E`_10aq49aN*@osc&XBz*uj(AP5`!8uqPe)tbLy^6_z1Y zzB3M;C*N@~^mb~nRo`yN0+uCBf>ZD2y0;a!M=&RseFLAo1bVsBWH_+{PhRvJUgfh9__xt%AAy?AUD%uuN(8oLJ#MlNDB{!A?D?XfE`oNweq-ucGB)<-qm}=JYf7*j4j@ z6-%?})Z2Mhn=66UYp^RyTg?X+l4jNEXQvbHR9L(;txjz5^&_r<-eL{bb;%Jo085aj z*U4q=*rye?QiCPk-2O)BB}vol3~zN>>sx`X(_o?U_Z5~bO}A5T_%RpV2EAGhwxZ*L z+ks_B)9%zun6pD+J2hBhznrDe%Sv?XCEu`0VS6-K?dQ+j1-;xZZoMgw4_gN8fMCvg z@Y55nP*_O14$ky^VE<9ep%;Ie8%sR%DTNUj5;yhkzxY;l}DW9$XEqR)bA`chDMO8E3lnI=+0v zW59L_R_3T%7xfOUQ+i2my~Q0iC~T)-&iD;obN71aWu4{57SH@xVS5B~#&65V8=in( z?%8g=QJX)18rT61w&?j+HUTR?$L(ik+M_kVFp=vF@7BQT=YUmcu;lu(7l5^w2@q#q zTKU7?t-w|a=8XG>uOE30SW*u+*15Rvc3|rSbEfr6ANG4)>B&T~)6blO^Zu&z1iRPq zjy}HS$Txvy%0#j=ep}Mc-UX~quz*8v`gyM_EWMXIyxnhhcpG|K1#|j2VEVFusPKBb z(`D_@88n~op<0kHUf zhH;f6em$3c{2{Ok!JOe`9NS?(u=f4k*wtUnQCOu0yJz~ukD-?+!*(anedmt;1Xz_0 zdn8+7J*D&Q=d4z(oR zB!$&!u)%*G{|)q}UEtPh@!&Tf9qf0Mv0t!aNo(n5%Vmxq^55U{FJM^%-B{Mv<(~lC zs=>N`yW&$|$tiBV^<&=s3|N&0TX*=>Z-6Dptg(~JuCF`Q1FO(rgXi^ESiJ_D_}dK% z%T06pS>0{nf8l4H25V8U^*dl0>2AI0JFhtitXhN3pEtVY_ktx2a_c?tT6!yBl^QI# z;@CF8;s?9+K0WqVhXE_sVEg8rb~v#88tja!6WapI8she|;>?V8z_x0ziTej01uS`} zTW|E>-3qJHV84E|&C$?H80Oady7l&BfK_O)(BHcy0ISzvb${7*0483X%R?)w!!jdxFdRza}xhwQ4HQ2_jc}c+HN4oXS`0VMk zft72ps`00s18lzr8~Wasp1`t3x&7?;?+1GW+p58K-?~*{$rrly2F@FIKJ=uy+oZS1M!s;|wW`AQO^fJb}^*Y_V zSYg!~?9v5`E`(mvMQ%M~XtzvYl^Seii+2?kpXt`i>9Kqq^vX5ZO-mlW1lWEJmeadt z8nCQ!Za*t7`dw#41XiWNUiz?l7O;c~ZoMTNd(Q?|p~0pc zl~D|=UV|<9!{H^sawod|oIa+!6j+@GJ8Hs#GGG~#+|nC1tzyjy!qm5@3}YZ1{#PcL0l@?$)cn^z1u< zm20r}OD6pu*nSPRcir%nz_Mnz{rus>qwfc{Rf8Rv`NIRil5^a8FV$>#5LlH4J9WZa z4+BdGxb=?wu3r_f3Jvz_X?H8EUW3h<+xAiD<<4~b*{yrZAA!|ru+CjxehgT~EVo{( zsf*SFtJYu#?i=|8u%ukK-l*1{Hvp^DU|%O5^Axc7Jhxu{^8^0`tX!}=jmUC4@#-E= z18YCqtvBa`KDEHGv&Y%5TRrygTYw$VU}yjLvX_BPyUeY(>e-E3f$h{_!^>%eeE>PkntY&h%h3R@|dGwxej zFWCjX_C;=N;(ML`1}vn(x*l1z8`uF2HoouVw}4HPz?|XrO@HS-U^_L~ec+!uxbtI}W(-1VlylIObh7LH383calw?B?Dl4g;1|?$*0!LW>c=_G_>KDG3(> zE1&1q`+9wa!s4%RV_#l=*I4LPYOq!9MveoPbfsHw$!m)y0jt(vfBEh4lYwQ-ck5m8 z@6`&c(_m9-9-9KaTp8Fq^ThtW2NYJX!JcYA{8H#uT0z!I);W3P^XDi>Il z2D@Ux3A2GEhunHb|Gdk9ZPj24F8^~Ou&is{dJjD_u?X0H4L0XrCRV<{t+(=}pUe)E$OIqmGo89e|D}hyOu!XhHT?H)Tdbi%9+~-5U>NMD0H-4h9 z+(mA^^^>2v7JBs>EU9hT^}s4_aO-{C>x{*~5-Qx-g4*;ufK_R*MX$ZM6j<_&ZoLOO zpRxkjRt>i4{myp-%eu*}m$m0N3fr&4e)SiHmH*DIcjSuO?t`E4H@mSO-TL1TtWtx0 z@@0=d086^Xtygj5($&DKHCX0~6^{bTxYe!q>xEaX1y-lQb`PHU1hCxO+Nz`sWh`^+4Gf;}I|?Lo3%#uxZ08xn-UpU-k6W+w zsmm0$UxRhqIbt95%I|gSZN05ZVe$95u{8tE`v7{C8f<^hi3&^ly<0D%@=1kNYp_#? zo$xRCnX%HXH*wp)6jrCf)}Q#{C(z5i->uhm?&hz6)oZX{uRr-)U=W}*#Sn?{jUe&n&C~T_++t&RIBS-YI9(3z{T)ngvu>BfrbLi2- zfR#Vw*2|xk)D~F$!*1*^8&|XkR;j_ti=XcREUC(^x9_>_#{#R?V6Ud1&=FY1BW}Im z*wcRntWJX!k67IaSng`KUgwFWCjzV2U?;7;S78;8y7flC(z-MB64tn}jj6j6fmLa+ z{hwwmnUqpyB>&Mc`WoimjxJXJI{4(bcK|EaU{@S0xeHj82D|63yH)_(qrr9;zJCv} zgthMQemLpodx2$Yu+rh}?gLh#!BSU#^Lt>m8Z7;}jw^xHYp}5gTK)l8&&S+cmVCJ8 zL14KWtm2zJ3R|hc+D~}nA?VdmN{9h6YP7-%$muuF0S)%)?(3ccmh`xr%i8Um6*f(St*EMf26~kmY-jh+6t+`?t-bof8tBEZ zcZYZI)$29`OV?nVD!V@mtXzW`EtV^6od%2l>g-zR?bl$dAGt(fiBGt>?5o}VJoK_O z*qX10z6NZu2D|5ih1-B_)nNS#kKF;x*x(MY+u^6Z4lG%NwR!X4Ux5{Cu(g+;vI|(1 z2K)42m%jnqqrnbN|MOeG5}wp>XRk_i4Xpj2+~Mtcb@eyE zGBjA~?qlnLg*4cbJ3jdqShWV5(qh>`Uo_Pgm_!i;C!;r)=- zFBy8t8mveE0}3nFVAI~JIv;vf8f<3COA6bg!K&|xONCy-CO4NB%brLBmZ`yJ|9MS1 zunG;fqv-BIz-l$v?5pPu0amZUTBNia0jy_@o6FAfM>2rrYOsyB{ALWWl^X2R?{|y? zR;R%-zWrh%u=bnX;e9>m?u&tCXt4dq*DEZf!QPm9RTlKBHP}N#I!pz2K!de?>%nQj zlAd*Q>GZq33Y(_El3tIS4!ueZwsy_Y3frl{cBlMHVez%@@HXx&nFT-7HQ4wG=j8z_ z*I>ajlJbGA(_jNz-leep8m#=vmrJ3S_?(-|*eT~-2`o#4Rh%<_KCs0aY)|1`R{`6q z!9JP!o2!8tTioHz?;C#&uw)H(SK-cUffZ}86~8N30IW)bjr#JiMZorGu-QY8y#ZLl z^KLFT&v{H?nHp^I{^d78uR?>pbkDBafYoZS^<5Uv>-gd+arJ_AGt5KJ$65XB&rkc! zhU@=6JTB=46PqIV6brjz%(ok6wOAULCD>4rV<$&Y{^Hm9ch5ZyY^7jtw=mR6sX=A6 zFZXR8`w&>@Wy8pqXK}7_P<8_0_fp}~_*}sb2==AibH9ywfL-~ zGH(9Yae+67{_ZU^dE0h8b=lu;d12HaiZj3Ja_@TwOljhaM?UtaoYlkbe{@Orx(Tl? zHlD^ptDvtQ-o7qsee z&Wf84`*6hVkDAgB5595dpAUO-#EO(Dn;zSe*WQ#a-?(Nh9WrgwqnW@vuWczGh;Z!-pL(VZVKELy+#~6NuzGN>hR;L``_Hb%ya8!%-wqLnWv3jdidTISALTs#}Sx6>vh-y z)jMh5&*%Bq{xtWtfCt_meq3AcV%{3;a~yBobBzSIhs!mlXvSruig2=%x%*8%rItNw zmYj~P`GJF19<*^I5BA^4gLAhCrkz|D2W6jZCQqXB#s#`w`Q%vkB;>;}2KjJ~7JeQf z7mkBZR0&g}icw>w3vJcNgZ(1%;2b4*pd9*nH_-8%9+q7Wd9bff9-Iq?pRwdY8$`={BM+|K z#F__f)5wEkKJwtYcdXwFZPv(xb7JJdHHKL8puIMEaL$rEXs-}!9<(VZ56*9s2iG9M zVrTh4*xiQx_Xs1Qslw0IC*fb4PM2vKBKK9 zd2sH6Jh(0d9=Om3y zNgiCsjWrM2@{T>pkv2ArG$4kO%EJ zzysrAt3C3ZCUH=7{B-%0``5^W>nP+wTT*xx%kZ~T#*Oo z>B)n(J>-#@onOG|H7{f1I4C-Px^m0?7v#aUL-L?q7QBjOdEvfG^5|x*>5~U-2Eiki z`IP%7$b)MnZ~x{(LhjmU$xSh428{i5VSI}GxmohNw2a^97DUdV&?HRM4% z+*tGA-eK~fJqvlzJ{LSSLLRh-1&>&kTkf+a587Rj2lu7KIz70Djyz}^ zLLRi&jdgl(Pda(frjR^nmkA!$e5d*ft(Q6-I&t{N@zd4o+^bF=TstQZ?m>cAu`IXT zCrci*$085z#Q+bK7ta5pgX$$syru{D{gDT4LCAx4wz1~Hee~o(dsOn^o)7SdWx3^^ zVe+6|C3$eKM67x6dMSUdC+#7Jh;~Y zJYtzoxi6nQXtPHi+)Ee1V{lPvX;FcvIS{Y!g=goG2W_aygZoOsBbM)l`_9ROHtyuX z{g@Hy5d*sbp6kH*LE1X;o;F3`fpv-@*~KODX)Y|gP8~1zUfMe7dVN1UbB5_cTYRPq z_XNYwSgup>j1cmmJui81FD-b)vc2P(D&#?1dh+0YAn=G~e&sn3Zi z%^(lj;*tmVy2d&^(yjAe$b(<`KJQCpZRJ9oKBW;~Orn}t^h-V-&|8XA@@44>^emUnCMvJVm>rbBF#&qHSG^PvB2Lqp2rVGz! zBMG2hzT z6`nQ8e9C=r(Cr}C$U^zPVfGAswrEUtp?tqn9`uq|y`~4xIAwZpk1W%JXW4*HEbYa3 zb|!i7j0^JMnQPz?%ksiAAjyM!amj;c3B{TR&&wtc?vW=Co>v7Pu`Dk<=bb#bAD=vU z{#>ki@Z4(h;CTY%!L!6-{a$#!CV6lVGdKTqy}0y(uXkLXHsJial=r?iQg@!PI>j(TX$=>&B7f}Dogw15NJ!nW zJ;e>b#gRO=vgY0QOE#T){p}n34!I`nUy1jnI2z zJQ`}aLTN|*?GGu7w|pgWGmN4R*A3)_d*_egVe@&k@c4~9c{J2;g(Bj|u<%!&as3z` z`VY~<R zEw4#f9G99g{Mo4ah2fp%A%6Up(G7DarEGe6`zGVPM+bCYa!p#WygcRfHgTzaU%o_6 zI`Ni2&-M@=zuP8{h8nIA!mD9;(cT~9C;Cy}AHTQQ5EjA>Aw5%=p3%Z%e!)04T7C(C zbIB3E=}TT#<MN` zJQ`}aRC%vqdB1JTR|9#;Gp--s->(FT7C(O9Q63F7T#?~Ldw&eiOZ~!cO``lwlKS)e zg|~0C%3nCYApbO6!piYue(_TN_#IL4BGhn&(%z{%Z1d@-v`Fncd|8Uu_#G=AL`zS8 zBkzUEK+U=V6Q8}K-5+c6UO6&N@@Ea&2jtI&xar#mre}8#;qlvn4RJHepWGWOmM>40 zOHMEHmY#h)gvW0jKGNsnn)++oqz(w~yCC(ltJ2!`|3tM%>48(C#*gpsOb_AlTa2H* zysYN5W7gDsF>(7dr%b;(ZPl7FDLbD1J|*GNtD@G|4DS>V;qg0^aeXhYIcho~>eal*=?tgci z=kkstZK9QTe#_4pp4^AapV#^&!9#fb2H?>PvTC;M?vqyY@5w0%-TVEb_Na%4@c4aB zc{J2;MZQ0;@$2LvJbttFfp^=byqVQEt>ankYB~(=m$rFhZpy(&K1*5mhZ@iI%Q+sx z|*@f+gK_{qKR_Q*?l;5XoZEO2}gx6C%iT3{ZjpiSv z|JhIapC?T+`=7t0J?iWsJbsJ#=i=uze|l+e`3>C02+vFZh2N@oh9~vsX4aq4;>Y?0 z>sHa;AHPTM49`A)#<4X1%5$zC%b%C=^iwbXwY@HX+UI+s#gE~ENVNFz`{MFwsNo8w zb#Ht4rm{}wq^75?jyfO0^hBwO7T)3`wzNe2tof{gGM}~4n$PmxpYSrD)v9LKMF{U* zX>UKfw$0|5GG4)W)1F_V)h~>nm-d$5Pd{SovYM1*)}-{EwEY5%H`|w{*7O+OB6ab? zN29jy3@_0`dKP~AYEYM7?DdP+{L;!pcq=+CxE7wB?hIHC^xQn3{O_ zicMbA^CS=9t@?IDmM(sx8g7rGg~#&H+e3K#&O7?^&%9qU@Mx<)e^%k$HTj9(rBv46 z==uGf>LI+WQ5Vcc{QfEP*H_E@^=@na+TLG^7C+{ft{%ecbi$qUqorrG{KD|CMiZ^P z&$+PErMmEB{w%et$N4k9KQHrVQyw3-Oc$O|MSj_gIRkrozWvn`TjV6>A;A0MANlc& z3%Gf%9o)2GhnxFh;N~7oxVfGMH}@jI&3)c*(*_J~+9kowz0YvdZXa&0DZ|Zk9^j_! z4%}SNgPS%AaMP{^Zl0+EC(l2Hn`hO+&2>_^d1jlETi?lrn>L_u^V}M^xz`YG+GWDc zy?=1iz6NftQNvC9LAbe>1a6+s12=7?;pRCtaPuq>xOq+r+&r@iZtjzTn>Gt@^L#D1 zc{VNF+>Zt~&n$qO`&{AX9zM8vPAA;7DTkZ;x8SA?3*6if05`|0C`-}GQ-=+k5|O`O zlKNt%tXHnF)+?X=`|BxtPyIF}@wkGh^%Kj}=^nzXD>+x&UzYYPM%aL#D!jtvb@cfO}@Vu;7_FVSyhq~}2X*{=Q zjGveGEU{nCQiRvRobP+K_TQ6htoc6Q{Vgx^eZ3bA`Zgrt$uHD!h0-os^>U5Z@iF7) zWqh14XNT&KAgm5Yj=_3)sMD|$BG#KliV%wbv=qUMqV6`}(2R z@VvCwi)VhkzOnL)m+|U=>C67{GvRq^Kl!bBNlt_3)56U&@ZhFh5ZpW?2X5}0gPUjl z!p;2;aPy34xOsl2a{qQi{XzN0FMhO-gPVIe;O4$fxOs*H+&nJ`ZtgvSo9E@hP1_x~ zc`g{-JhKvRo(Bat&t8X{=T^W?+fKN-4+?JXy@8wOPs7c#WZ~wy0&sILEZjWL25z3^ z2{-NH;O3c@aPwSPxOrwS+&tG9Zte|-o9Dy8%`=|h=6MTnb8i{kJZ}hY?zxAX=b6CG zJri)#P8@EYH4QhR^-33s&eJ9@(ztB}7xkn!L*G9H{~jR$|pe5jZ8 z$H_H4dm=o}-^qBX2IHj{KIxd^b-cv()6012>JLXfq$|Jn_0DMR8N-A9YP9rRJ-o|E zglCO+Yh=8u)>rNQ1F!XAqKEKKJ*jA}E`EP_yid)ge{7Xn+37XU>vOOZjuyX#3tK*@ z3(r2DkCvWn&%E@1dcHGzr7k>s|1Mg1e1EVDj~2h&V^_`7g=e>CiWVN@=f(bJ^1Fl9 z=)&9k_WheUpY1g~FY7yrSKpeX3(r1Z;Wa#@Wwi8MSXXeGE0?^-Et>dHS=_${)|v^^%@1ec11HglE}Pq=-F*n%|Q8rDmH)dkW?kFZL7} z$9CASi=Vx|j+UMbuf2!&SNr)hcOg7${rFi~KTfgMkHh1SXz9uDysRJR6rA^0D}KU` zKehfC(#==!3Hx8ZKggox&ry?JDA1*+)Gsw0KYC41FZIi!-l286@W9ot{e~C&qV|2h zoS+NOzFrnBek^}p%0vCegR6DnO?suW=IOqzQV(3S*K>P>eWB6b-{R{>T%!xmo}OOg z=Vkux*1+oLbm2*Rn=;j7d&~6n(%$lWONdXy&s>j>yyuv%L8?Zba?3rSKoV3n`zD!ZS9b6+&z|CSo}KyXRC$fj-d{q; zZgZHPGEX3FVtAe)JkR4beqQDY5`vFh&hQYHd4#L!aEr#Tb8+A8zmy-s!jE;Mmv!5>B&6oWnSQc#5$FplFdR5 zS12vD?coFGc(f~E{Ji8(f$GMU}3vtukrI@2gZI1%j%0S3{Aaz#fsD~KL0%R z{*^0jb|7XyW&5^mvM!T7RAvhYOM1v}Wjg+q&xfiX-1eX9%cx2qaZuLz8^ZoYs~6ZG zjZ;5;Jz@{%r`={Dc@Jv9;KP^;XJARefcU@;fEWi ze1-RO+R`T+gfB&wdY0CG- z^K+UDAD(w(=M&Bnz8sB{f4JYp&ZjBgS9rgHBGmNlJM9;mOZw0rt-0{w{+H&$hwHA* zg%8)E?0kF`^YFusQ{H(VKy%^4dH?3Zhx_sDe44U8@cw>9sOi@Wcs`6heVVd-(VolBCtPHF zIU1*Yalcn{;X}J5JD;X}U)(R>T=>wAs=4stc{6rCzOr%n;l|0&JkPSZ@ZtHBc0Ns+ zpLrf%bK%4DHtc-DS;Cj2aq&jiZ4gw)IYRCw)1Jq^x=6yc0Rt6 zCH!#Xq!0I1G#5TRKh(~rDc={*6K*bi!sk~iLQTKk6h808#-}OYSNOa}8=r8I@#Sco z^2L1~_Wa|EM)={z;lus0&4o|+{Oo4(zPNwCxug%z|FQFF%JRkYUYiRae(%K2CtPHF zIU1*YaesDm;luM;?0lLs|L}W1&4o|+JYhws>D$xr{`Y3Whvx&^-&j(uO7#_e)YKD%kTT+zCOR<(cZ~#c-$A_SC95yetFW)$FCmkDg5ej z-0N45>&t%ixDM=BkNXGwz6Y-J`qg89$}dl@qxjXMJ%e98+R6HjAJ=#N>hYWkzj|En z@~cO?9KU+u@tq?hWARM{-83U%0>2uO82F^2?L!4}QbrzBs>n+@Ix_ zC(niQtH<>Nzj{0;(61iP_wuX9eY}3tlk01K!{fSvUp@P|j^G-tKJxoKzpq1o@psR> z$DGL$HC%q@j{daJ_(ROT9$-%od|&y{H}4L8^X_}=n@Rtd-@Ieqv}gR4v%bO6vg*h0 zBJeq!hpHuG+T-oaU-&kGF5c1nan{3l z{+IaUY!`I(IpTnym-_tBH`q`*4}F7;b$hJ8!4|EYbbR@S$8bJ3pNm${;NAU_dWPRa zVmSCFr>;D{-R7|mSr5NdxHKMh+X?dQ$imVye+6T`Cy* zOX**r<}nQPqXq}dN^))WKEk|a_NIX=mYUVr{S3TsOZ diff --git a/Assets/Prefabs/CapsuleHand_L.prefab b/Assets/Prefabs/CapsuleHand_L.prefab deleted file mode 100644 index 8e8462e57779edf8e05ce7490b59c5e6fb72f1a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36348 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 Bgc1M% diff --git a/Assets/Prefabs/CapsuleHand_R.prefab.meta b/Assets/Prefabs/CapsuleHand_R.prefab.meta deleted file mode 100644 index 78e008b..0000000 --- a/Assets/Prefabs/CapsuleHand_R.prefab.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: bef07a2347620974fb9dad0e4f5d8c52 -timeCreated: 1486828177 -licenseType: Free -NativeFormatImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Prefabs/PlayerCam.prefab b/Assets/Prefabs/Cube.prefab similarity index 55% rename from Assets/Prefabs/PlayerCam.prefab rename to Assets/Prefabs/Cube.prefab index 61d480157e1c2e70ded4e553dc3306c83fb38637..b4601a0dae9189dc0996ea0c935d03b98681e3d3 100644 GIT binary patch delta 1271 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 Yk8G4Xp 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 Pp81W=t+D8_=8yjZqlQRh delta 11827 zcmZA73tWuZ{|E5zscB3}O|%&{8brA^2)V?#Y@39s86?SsY*Ngx)y#A=;~tVU)ia3< zLP9$lx>%PMOK9zgt*p?x=3ZFRy8O>nK6rhKv|8bjeWo^7ZRi#68yAskzDB!k$=R(3DY0=J5j}DoBM?UPctm!<|>e*fIpFL+A3sgo5(;x3G3)_u@b|h#~_B1LSn-QD&{D`?5xqp(5 z1-|wq=e+*(esLZPDkxid<4Je*ew@SSym{wZ2H9UN(&HR9Tu;?{!c}RUZPG8YK!`68 zb8xm@&q}tH6_iuPs!8Z&!Lb5iXR;XoADSv^Y^HskxAaIeB?IG&kFLf znF}s2F0x~0;+zv1YqROyI7^Wg=&+e{x&QU5{eRmh(3&*$SlJlX{!Wx5ReKu!34_=7~3)9qt{O zX$3*fZ8?=`@NxgdIZJb_z=+Wtth3(y`tV*W5cMDh>$rw$-7zbupp3in`}{K}@FBtX z9rM^ir^v*la(w8pnLFrrmObRoC45L+NKRCER25Km10OpIzYMW?vg{5H@=0*<^bSe8 z9^xEj5M1W8>j}>FA~|WlxuG|o;v6>f#JYx$iCInf5aS!Md4WUHUVRwx4jP*<`X!6@_obgg*Z2mEM`dh zZSlIF*w8o-U;pOgRDII;^-dHUBJhLKY()-kUAjcGp`Nnh^rsfDm$M;gFqt_1m}tPb zST@vRGmq7cPEL8HW`k%5$?Z67P{*!jgArR>4)@>Dg_rpzg$=$QW&{YG5ghU%lMUtA z%bpq$GnHT8Jvh*LL zD#ItpFcMtS`|X3$a(p6TGY894KF`_t2R=WB6I<>VDx3WXpC6P}$qhb1FWJEJB=x2w zT^keL#0D)kbG?wILnHm)vw=GT-+#@kPCZz9-S{6H(lDBX#%QaTDPQmjHL^mNOf zXW0Rgv6*x1Me~Qe<>E)@C}NvgzguqdwgV+L89ssWeF`=k5{|r^YzGa*R4~ZKb4BHJ zI|%Y3!Mah2oVq|esKA!oKG-#Q!P;%J>_9Y{DR#gY;+*OFH%)wz^PAut#xxVQ zn``{L=!mWOxjT{A&a=)A3F&qqqs-N5YMnIG4(cf@Jsv))@-Xh!BrJT~bMWNeG^pYZHkb}BGZ`1hTd4R!Z$3w=ni(1SBA;4y9?Wy9{ox}X=hg+G#9 zL#OM~n$Ng{lnuFT@#x$a+(BQGlXY3p@1V6k$XX5e-_-s=*ZtU6JKIA&6+9^w-ag@I z52C4LaKB#`CT{)S9?B_eYzjCy!`U7LekA8NEO(@&zdh(E%e$v7+dR-7xYJ0EquM(; z_~~GKP*eD9){z*gz#bYY)4OSwZT7PVsXrNf$|2y;B(XghDSL76uh@ml>_Ir4X0Zg=p$5@!!8{tOa4Gq}JfBf%chD68Ia|5ouT{H1Ot$%*8TtNNwm7E+Gd;G`sUvUT9Ox4Q(P)?cX@baavCvrg$OmZ{2-qNK_ z*8)#t}sal0r?%Px}I z?85C@K!SB+`^P)!xFDmf^M_F%%J$(FQYMVo+}N=ncTh^kHnTGFo*c#f-exxxJ$Kt`EUT(qa^$}k70r%)ddBI)4i0HUAB z;5UzIG@%n5pq#S3{ccX^=i>l^2$CD7DUa;x>i{~+dOn|Se`!td1bTvk-w81 zK)V!w|1-C`rE-UF)fxxjM3RC#y*u?-xxoRHl*#{&^tRsS01dPi4c!}><^Vy<$k^s_ zEgmPfJ3s|xF@+oAJY9UjD+*vc?!2Yx&;KELL0g@w1Hgze10xH+IMSA(9q$D|L^QGd z{jU>U|G{^o<;3>>d}(#`^8nCN#tl5NdG*@>5Ue1%#FjscEdL9D3d#!J#6QbWu>(Ph zTVS5J=bOke@9hJjnX+I`+=klDfspn;lJi`jwCp?QKyZ&Cc52ET-^#v$P)?amwJkSp za3BQzOmYtwV#biqsew>WSs`~%w}c&mpo}NE0Z*@bb=?~X+yr75c!zkp zGF2etQ|P-(XO~)!+dXB9Em z>9Ppp)tw>6v2SzNRcLxh^xptl{e zEbZ~rYBe#RZvW1dVAE12|F}LW*HH|DH6-`xb!xeXvluEUQx)b%tb5a24AQkESlVs( zxZ4ZF&`g=@0lWK?7K$Nl9m!>F4ZY;ESPbs#iCtte-zSEPp`0=w*FFK)qQwxjf#huG zc}XHxi&fA_p=0mZ%?_zzNZv?-dH){rx6c#Wd767}T3hIoxhj`vo_h3bmKSz}rFwXUty}^Aek$vQ&qKuTw9J z!8e8E9Qn^fZ~ZBTddjo~xt|)V#Gu?ta!!+em>7IZ4BS*=%T*0$d-nfZ4EYp>=)YcE z@Q)aT+emQGb}ze`uf$MGS@+#Nb~S$%gDj2Y*8Kd4J^zasIQaHvK95#r{n|9; z7Tb(H|CT2Kl~+0mUfb})pLe@Sz(`r=1M;Y!dPpEbLvlSITs-H*m$ZU;lA=yaT)Os_ zfEI(<-dAcom-dr@Ad{GIY40u*+$B)aW~$cq+txgP-er&kq*)~BGwoUSe_j%3rcBl_ zxz>8L1kxCi`!w>`{7XMdz+FqMFtTc+YQ6-@DdYcRef4#?1cI_jZrDJTKX1x12{cj| zwfaJz8!IG`yn_T&?D+wiF%sbC5R+Xl6&qGcpp>%iSw+SFBuhZFljPQ&@7XssMFI_! z4Vc63{$-m4)T&)1cwzT{`gs`=;N=n%F1NoqDNh1=%HDK1GCBHy1blas+yJkq4}UC? zKs{wQ9X}s>Q6>SUj^rMCEV>@?y9Bs<+Dv6S`%7Pm7nEO-Kz=)#OxMz_^w&xW2=|h~ zr^c(Z@~S0JOPT(|nP2}`BLUeyk~{8ak$V6eCy!WRq*M3Vx9~|wS$$lxYFyz<33%-% zLC>?suBsM%5>mE&*T&qMPxvG}Kyvc>i>zYSEP#W=uBAQ-xQtCpS>wW+E0Vg+0zp2> z3Dqu#BJub3ihSyJ`~E=L(Y`}xf%FgwM*T8o+LuwYpqVm`&!kOx;#f#40Pw_}vcfM; zn77ZF@K~sz?AfJT;SS63WAZS`smI2wwp|emUS`AdgO}x_9{Q-&R3(b^Woagef;8H9Ij*?02_FR9x@MZ(_l>kWAvaM^}A!YCVk~$6bm4lM9Ar^1!=U~%QrrXf5xVLJC92zJ*7uaWN zRFHorn-hLr4&?+v@I0W8<6Sv4Q&zQ55OC<890bS7 zB;&Kb7sNe~Lj+~KWq+LM{8SD)%H%EUzi?m4p_a1aEdS3VUa923JwXZ%8tlB&=dB!k zDJzi7&YgixOw*&>~DO0VQU(@H>S_L#vSTz5NZq)__@Jq=g{2zF=<2ETEh_byY8%1|g z6p%(4^uDodWU2xxD66_taAe$G1wa|8S8tp!cuS!|1zr?ZB|3_8OBEoaEcnIa`V%J= zkWX1{$?O*yrxj37*}_>#F;CAbfOnEi5+TW~ef66HM3h~es$FyciUN{b4fo&F{$iK1 zu0FBG7o%(%Qs z_|H29)KV6zdN?ej|3?LIPmzN4e&;XySS!JoGENF-a^65Cs3|MBH>`BxcqNol_E_om z`{|iVXrwGrKcm;PKqa`JrsjBbOWi0|f=WtZ?SsSnpUzQ&ma^azTb|U;Rf3VSC8e+5 zc+XP;=L{)0TleV7^iU-TDQl>@vS-Q)B`7K5UcDHRC|82M%~Y-JFR)sE^U*3LG*H2l zwtc5h+o%NoSu#mf)oS0RsY(cu1Ls4#&$GW zV9kBWoP(K2_&b?I?w>ONUCKmy%HnHQExU6q6Y(#STw-HV!n=PmQ5t3At>P!{wah|r z382mbpaY)6{jOY9KAo3^>MsMNVc_7`f#O@Dd4en?yFv;sX&K7bPscgRl7~ybdaTVt zqN^mA_0jNb`<5(JPFeGo1%5#(Sx8Vxa#yUjb&1W+Lb^&7L8sSqt^JQ?A?_c<#{YEt z@|g!&NKKjR9+xN68?#U&W%9=*7v?l)A?Y;$3El~7{Cab5Y_Bm^3@XKDKJFE>XGhg^ zWRUxx?S|)v;8$=#W6L0|8L>(AANnQqWDv&)Fa`f?gI|u-Esrt=Fi3>WTrgu!&VMI8 z8B|VL^RqyHlNW;o*GX>Vc8?d?KQc&1S?BJK6I4qUFo;`4f}xv7AB9K;sVUQ)VqaPn z$Dl^a+%-G8EJ$FG^aeSe&t8Xi7HwmYu$t5}`aW^FzKcP6Y^ELQh+pTXq_0oi!=UDB z{Qb|oC$rs#p32|LpokhWIN}HPPQSAZs>SvW546RvCFnsyr*jN4){@+kp3PA^Yw*Ok zh@BdiW7~2UPmC=DkL!eAJ0@fZ2fo2O{I@xW`+w@x9q%h0wMhL90q#CwXY)sBQ6pt5 znezSd)3iu>n;a6q`F%fs^w*+%Y~~%gfBSHbbcPo3>WDq;_4+~XOf5>L%;wryhX+!b z7By37=dyA4s+C$4afb{Z^zr0=POKKyVvE3gVTWH;JGSSCtFj|&rra2tTa@9IGpfR&%Ys>_G>221xvt{nA3h!$Ir&WGp8EB_ zJf5mqn&PZ^o3ck!T-TG4xgkeG?bbZRaB`7tQQBgpk)%sB{F{9>-Wrw0Gow-Cn5EPt zGHT6AZKI|xyV-CmM{Qv^p4*HJu6txGjqL%Y=FZ1|*aK!#HW zFT^qbeXODJxR-^k>FO6ng~f%(@P}#|)BQCmB{D-)X(KXJo|GYt^XX)R^O*)K&5Lau zL*j)X3yuG!#(hUBEDf%e5y-&0hJz1{G7CfH4V*symr|2gtu*Ycsbg8<`;BH}-3UW@ zoeUXtcLgks??ahE^oVPzF*XP_`Z|F@|FqFk!+lk6kiHfnMz{!Z45Fq|#K>atC-qzW zsoV!~H2n7wj7W|+=^rAP`sH|2{RejorhYp9)Y#&Sn6w1c(O~%0*TUfYRcFDZ4MUs~ zsRi=2WP~EbVfbuR%cONcGNzt`|5t8}>KUULXM`OQ9xWS>KkDpEABEn?nhE2g8ipTY z8rT^{lr(onxF$Cehty7{kU(J?%0s3lxZ#iW&iG@A&IPFvvS51kLN3n4OSpp&%hEgo z@2|BjGX2-~i!j#AQ4f-@5Fkff>W%;{u)y!$!&^(1M0>Wq?;6qOpGP4#{ELaErL0YV zj#n_QZ3W}nVlTbhV$+3fD@vO9Z3a#G9S)9qYuYmoK2v4&bR7}`hWkg*CpO_+jcoR znAA+3XX-h#YaSuNQe3q>q;+|3RZPn&W$xwbY9;yy& z-Gi-RZO7r|A~X*n8)kJl@~}4lvQg`gquNy?d(Ocho5In-b}^mm9hu3C(Fik$=Htr3 zpO6g0v7boLbU9$!9)VWiH?)*&sa=Ycm;xfvw|UZ@nXe8>L;d|SI2*w!F1wdX(GbtN4L%smVkaT-EZ7Wxa(1crRk%r z?Puv`gzr4uY~-rhd7RV9^o?nPyXiTFA6g}=Q_!f^usb8zj(nN=bn`HN23{8<*o1f` z!YsTbrlJ6UOk+?QVzgTjj}aU|z9s5xQ*lv_c~sg?Q`C3>@ihAFtp7Jz(=K$-f)VaP zYNldWdj*ES7gaD7nTVIQ52>@pq5-C-A-lCY)4UIFQ!+SOn}=*Wv_Hi(yVJWdwi}Tr wBifHj8PNe;kE}>=5U;5C5DLN%l0A4NuEx~}cCa+kR1T9;fCe$r!^r>t0BiA_@Bjb+ diff --git a/Assets/Prefabs/Player.prefab b/Assets/Prefabs/Player.prefab deleted file mode 100644 index ee0ca723aeb038fbe5a5b652346fc2552bd2166d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23852 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 I^zz|<0eapaC;$Ke diff --git a/Assets/Scenes/Game.unity.meta b/Assets/Scenes/Game.unity.meta deleted file mode 100644 index 44f6ff4..0000000 --- a/Assets/Scenes/Game.unity.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 814b14891c712634d9e80dface97f8dc -timeCreated: 1476451470 -licenseType: Free -DefaultImporter: - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index e6f3cd539e15840b4d04a16854092bd4b37cfc30..c9c6f4499ea233e128c992afbecd85b6a9a2984a 100644 GIT binary patch delta 2651 zcmbVNZERCj7=CZpb{#4kY{CQzY`BQgHT^Epuyx&7z^t-0YZ*oz-F6F|>u%Ft2E*xX zNJJCd++Jp?c5yN z`pLO9Cw|J@JNez8!u&YW;cFZg95*fOcF3z#YZq0OAfbQ*55KWMfv!G`gA57UD1(~- z1wXE>d=zn485DLR=D=aYq2m^~j(9unQI~2byg+AVf(Px;Kv+@BjRULZU?Y;q0U6T` zSs{VzL7kvh824>3ib7w(JqcY!xHjx1LLV~WW}(CpK%qZ2*o{te2$0f8=%7Hj-K-N!=W*_smU?0I^DAcud5dNnFO3_jdY7AVD#2dJ$ zS3PRrrIA=?!i$kmD9r1P13hQ&;GQB;Yv3h0Qy(+%(v)p5;glMR1PR(`;I@*~Yy!-z z{xTaB6_FsPK@i{s8aj`AGPK#iEhUDwm~hPwdwKhM$rPsh(p8uni}1PtCH8V-D=V zEbb}rEs-cC7mgw}jx%v19IL_$Pvf2%s#V7n2y>9K)5b4mIYy1Ni(?arkwH@1&aoY+ zw&*xq_q_{`U=p!f{*ayLU*AjE40=rCOk$ci=0=BE>Rz-9%^aLSunqV0{4ai!<2b=x z#4Fu_8C|(jB5e6{>xWbN6xVZNy%rGaNlm4$dJsgoRA4y`N(T zs@Mk|Uct_;cN}LYqw8vH8=P~s&f~j2eCA!&J0AIkzPKzN4YG65`3m^x$EF{iyx$a= zKKuL`i`D1LH?we8SfPZH^c$fu$Bo!(%|oWQL+VcsbxQd(6|w6mo>NlXE|16W4SGFp z`baPQR^pH1Rr2F?c>}>fz!O@avcKXL%D?$OhIgr$8vQP}*Y6H_g9~I@E#o^T$yx(y z+9?o??qzw3`OyZEM6Wc(t<_6N)=_uq4TQa|2>dyAjfE zOlHnJap_H)79DEfmVP-sBI-8W>}<69RKjYVIQWN+U5!4@w!Yw)KHb$_w#gTET}ge~ z@~rP$+vVG>W1j(peE<{9w^a2C8;kkbY}BDu1$H;A3eH^|yIN^}Xh~I&-bI0hm3S0b zy5n)VgQaz(#$ddP58I=cf{mx8AcZUnUN+YOWL39e3krWhxP37ot`+6Q2|8(^H9U emZzxMie*O+qfz|Pnk;dD?AM-q8vWM(&c6XWObI#w delta 586 zcmYk3-77&qu?~a;axvsk>=|qs*#!B! z2WnxY8;K6#vbS5Ycd!=Z5~xS9n!+qA1q)Kj*k&NwA0@GJ{PhX2zzu83z8)ox;f0;1=Hp-FzIhu`Oif!q7|c z=h>V0ruox?iiRh{GYTHPHgW+mEnAP}X?v3N~`X81SZWsUn diff --git a/Assets/Scenes/Menu.unity b/Assets/Scenes/Menu.unity deleted file mode 100644 index d9f4d8c01b781127941c392ed985565b0ad03d2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18176 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 + _rigidbody = GetComponent(); + _collider = GetComponent(); + _networkIdentity = GetComponent(); + } + + public override void OnStartClient() { + _rigidbody.isKinematic = true; // isKinematic <=> enabled + } + + // If we have the local authority, disable trigering and enable physics interactions + public override void OnStartAuthority() { + _collider.isTrigger = false; + _rigidbody.isKinematic = false; // isKinematic <=> enabled + } + + // If we haven't the local authority, disable physics interactions and enable trigering + public override void OnStopAuthority() { + _collider.isTrigger = true; + _rigidbody.isKinematic = true; // isKinematic <=> enabled + } + + // On each collision, the local player is changed + void OnTriggerEnter(Collider collider) { + if (hasAuthority) return; + + // remove the authority from the previous owner + // CmdRemoveAuthority(_networkIdentity); + + // assign the authority to ourself + // CmdAssignAuthority(_networkIdentity); + + // HACK + // we haven't curently the authority on the object, so we can't send command to server + // remove the authority from the previous owner + // assign the authority to ourself + CubeSpawner cubeSpawner = collider.GetComponentInParent(); + if (cubeSpawner) cubeSpawner.SetAuthority(GetComponent()); + } + + void Update() { + if (hasAuthority) { + if (_renderer.material != green) _renderer.material = green; + } else { + if (_renderer.material != red) _renderer.material = red; + } + } + + //[Command] + //void CmdRemoveAuthority(NetworkIdentity grabID) { + // grabID.RemoveClientAuthority(grabID.clientAuthorityOwner); + //} + + //[Command] + //void CmdAssignAuthority(NetworkIdentity grabID) { + // grabID.AssignClientAuthority(connectionToClient); + //} +} diff --git a/Assets/Scripts/NetworkCube.cs.meta b/Assets/Scripts/NetworkCube.cs.meta new file mode 100644 index 0000000..fb179f8 --- /dev/null +++ b/Assets/Scripts/NetworkCube.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 496f0ce23cc885344abcae22466ec784 +timeCreated: 1486908628 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From c5590799e933f44db92fb312aacb34674d03509c Mon Sep 17 00:00:00 2001 From: HyroVitalyProtago Date: Sun, 12 Feb 2017 18:11:47 +0100 Subject: [PATCH 2/7] grab cubes with network sync use of the leap interaction engine with the network --- Assets/Prefabs/Cube.prefab | Bin 11384 -> 12456 bytes Assets/Prefabs/Player 1.prefab | Bin 112048 -> 90148 bytes Assets/Scenes/Main.unity | Bin 25296 -> 26976 bytes Assets/Scripts/CubeSpawner.cs | 2 +- Assets/Scripts/NetworkCube.cs | 25 +++++++++++++++++++------ 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Assets/Prefabs/Cube.prefab b/Assets/Prefabs/Cube.prefab index b4601a0dae9189dc0996ea0c935d03b98681e3d3..e3526ab5125d0e0b251c0a269249b82cca124e98 100644 GIT binary patch delta 605 zcmewnu_954fkB6Xfx%z}kPrm26@WB@sh+8xL7FkczyJULGjeZK`YET*#1K%sy2ky& zRo_q5vGb;|eUzE->EE+1x7`a<%_m&f(PN8|18OYTEHCBF#OO5nADc6)H&7sL@_SYL z$z^JKj-GiXsYQv&C7JnozKMB>>8V9_4Dq=T7DGTlNs)~TiV~pe%)}h98VGZ>?#Tz$lzn#sZD0gqF0&6?Y7X)<`~W!th?#(x<>sX|5%WSAGJp!E0Qt;7 z{N{oVE)$e)w-G>j&DXvs`2&=8s2p`pXbIeDu_ItR?5 zlO;3_CLhtVm|UYN#C68@>=_82oT#BNIY3Ke@&ipCMwZEMHM<#ECs%5@GBR%7uO-Pi x*+EBSa-IecJ186+KChk3uWdW|j&=$o^JGUIVHHrgDR3(QNl2)`*r3pWu>t!&tVjR= delta 341 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 diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index c9c6f4499ea233e128c992afbecd85b6a9a2984a..e34128214ad7905b48d9ae974bcb3ce2092cfbd4 100644 GIT binary patch delta 1531 zcmZvYZAepL6vvn zA#8=kv=^wGq$9&{j#8*i1?_`4oSH>i&H7OEp>x?2e%QHiIQRMepZ|GzY-0k)q(DSS zzLSu%WzR&3aa?ZvdBA25}&5nwe$@7^Sh z!lY1`3@-6cV)%u;(O64|5V>#}3OjFei|NXCZqkUiQ{ z*Y9R@A*CkElk)rK5#fG&i)^kP=`pEgbsn zSZK`Dx#SL{MesfQxAF-O1H(8@jJ}ilAuX&wO#W}R$bRa@1D)}|ksc*wRo#kAMCdP2 e^yIE1rJj$PT_1jV3IOhc^nzbC1WdF65w2rLqfu?mcHoTJWQ>Wq9YBTqPR6*H6$U)+*$B(2jUgtS z(~8WxHYH~B!X)=yjFp!8ND6in({j-h>!GcRm1+8idfGLyIZhiiPR3pnJVJ%$$U_!x zt~Rw*+3}EB53?vX&4wQQ*3?UaWn!9_^z$EnPP0sC(oUFlaZN18$%4j@Vo$W7c6+a( zOJH-_OR3!vyQb~xGe&Mi@SAvS0DZ)~m}{$#%$I3IR5AZzl>YWJCHJ6TeP-`MYQ5lu F{{fo6O&9(); } + static void SetRigidbodyEnabled(Rigidbody r, bool enabled) { + r.isKinematic = !enabled; + r.useGravity = enabled; + } + public override void OnStartClient() { - _rigidbody.isKinematic = true; // isKinematic <=> enabled + SetRigidbodyEnabled(_rigidbody, false); } // If we have the local authority, disable trigering and enable physics interactions public override void OnStartAuthority() { + InteractionManager interactionManager = FindObjectOfType(); + GetComponent().Manager = interactionManager; + _collider.isTrigger = false; - _rigidbody.isKinematic = false; // isKinematic <=> enabled + SetRigidbodyEnabled(_rigidbody, true); } // If we haven't the local authority, disable physics interactions and enable trigering public override void OnStopAuthority() { _collider.isTrigger = true; - _rigidbody.isKinematic = true; // isKinematic <=> enabled + SetRigidbodyEnabled(_rigidbody, false); } // On each collision, the local player is changed @@ -46,8 +55,12 @@ void OnTriggerEnter(Collider collider) { // we haven't curently the authority on the object, so we can't send command to server // remove the authority from the previous owner // assign the authority to ourself - CubeSpawner cubeSpawner = collider.GetComponentInParent(); - if (cubeSpawner) cubeSpawner.SetAuthority(GetComponent()); + // CubeSpawner cubeSpawner = collider.GetComponentInParent(); + if (!collider.gameObject.name.Contains("BrushHand")) return; + + CubeSpawner cubeSpawner = FindObjectOfType() // TODO cache + .GetComponentInParent(); + if (cubeSpawner) cubeSpawner.SetAuthority(GetComponent()); } void Update() { From 9d4030fd8d3b4fefb0dce3cc962b144ef43c9891 Mon Sep 17 00:00:00 2001 From: HyroVitalyProtago Date: Fri, 17 Feb 2017 22:43:06 +0100 Subject: [PATCH 3/7] Fix #3 #4 Maybe handle the #6 Need to be tested --- .../Scripts/InteractionManager.cs | 2350 +++++++++-------- Assets/Prefabs/Cube.prefab | Bin 12456 -> 12456 bytes Assets/Scenes/Main.unity | Bin 26976 -> 26976 bytes Assets/Scripts/CubeSpawner.cs | 29 +- Assets/Scripts/NetworkCube.cs | 74 +- Assets/Scripts/NetworkCube.cs.meta | 4 +- .../NetworkCubeInteractionBehaviour.cs | 24 + .../NetworkCubeInteractionBehaviour.cs.meta | 12 + ProjectSettings/ProjectSettings.asset | Bin 40973 -> 40421 bytes ProjectSettings/ProjectVersion.txt | 2 +- ProjectSettings/UnityConnectSettings.asset | Bin 4192 -> 4208 bytes 11 files changed, 1276 insertions(+), 1219 deletions(-) create mode 100644 Assets/Scripts/NetworkCubeInteractionBehaviour.cs create mode 100644 Assets/Scripts/NetworkCubeInteractionBehaviour.cs.meta diff --git a/Assets/LeapMotionModules/InteractionEngine/Scripts/InteractionManager.cs b/Assets/LeapMotionModules/InteractionEngine/Scripts/InteractionManager.cs index b1d2844..e8954c5 100644 --- a/Assets/LeapMotionModules/InteractionEngine/Scripts/InteractionManager.cs +++ b/Assets/LeapMotionModules/InteractionEngine/Scripts/InteractionManager.cs @@ -9,1182 +9,1184 @@ namespace Leap.Unity.Interaction { - ///

- /// InteractionManager is the core behaviour that manages the IInteractionBehaviours in the scene. - /// This class allows IInteractionBehaviours to register with it and provides all of the callbacks - /// needed for operation. This class also takes care of all bookkeeping to keep track of the objects, - /// hands, and the internal state of the interaction plugin. - /// - /// - /// - /// InteractionManager has the following features: - /// - Allows instances of IInteractionBehaviour to register or unregister with it. - /// - Registered instances stay registered even if this behaviour is disabled. - /// - Dispatches events to the interaction plugin and uses the returned data to drive the registered - /// behaviours. Takes care of all bookkeeping needed to maintain the internal state. - /// - Supports the concept of 'suspension', where an untracked hand is still allowed to be considered - /// grasping an object. This is to allow an object to not fall when a hand becomes untracked for - /// a small amount of time. This helps with actions such as throwing. - /// - Multiple instances of InteractionManager are ALLOWED! This allows you to have different simulation - /// settings and control for different groups of objects. - /// - /// InteractionManager has the following requirements: - /// - The DataSubfolder property must point to a valid subfolder in the StreamingAssets data folder. - /// The subfolder must contain a valid ldat file names IE. - /// - public partial class InteractionManager : MonoBehaviour { - #region SERIALIZED FIELDS - [AutoFind] - [SerializeField] - protected LeapProvider _leapProvider; - - [AutoFind] - [SerializeField] - protected HandPool _handPool; - - [Tooltip("The streaming asset subpath of the ldat engine.")] - [SerializeField] - protected string _ldatPath = "InteractionEngine/IE.ldat"; - - [Header("Interaction Settings")] - [Tooltip("The default Interaction Material to use for Interaction Behaviours if none is specified, or for Interaction Behaviours created via scripting.")] - [SerializeField] - protected InteractionMaterial _defaultInteractionMaterial; - - [Tooltip("The name of the model group of the Hand Pool containing the brush hands.")] - [SerializeField] - protected string _brushGroupName = "BrushHands"; - - [Tooltip("Allow the Interaction Engine to modify object velocities when pushing.")] - [SerializeField] - protected bool _contactEnabled = true; - - [Tooltip("Allow the Interaction plugin to modify object positions by grasping.")] - [SerializeField] - protected bool _graspingEnabled = true; - - [Tooltip("Depth before collision response becomes as if holding a sphere.")] - [SerializeField] - protected float _depthUntilSphericalInside = 0.023f; - - [Tooltip("Objects within this radius of a hand will be considered for interaction.")] - [SerializeField] - protected float _activationRadius = 0.15f; - - [Tooltip("How many objects away from the hand are still considered for interaction.")] - [SerializeField] - protected int _maxActivationDepth = 3; - - [Header("Layer Settings")] - [SerializeField] - protected bool _autoGenerateLayers = false; - - [Tooltip("Layer to use for auto-generation. The generated interaction layers will have the same collision settings as this layer.")] - [SerializeField] - protected SingleLayer _templateLayer = 0; - - [Tooltip("Default layer that interaction objects")] - [SerializeField] - protected SingleLayer _interactionLayer = 0; - - [Tooltip("Default layer that interaction objects when they become grasped.")] - [SerializeField] - protected SingleLayer _interactionNoClipLayer = 0; - - [Tooltip("Layer that interaction brushes will be on normally.")] - [SerializeField] - protected SingleLayer _brushLayer = 0; - - [Header("Debug")] - [Tooltip("Automatically validate integrity of simulation state each frame. Can cause slowdown, but is always compiled out for release builds.")] - [SerializeField] - protected bool _automaticValidation = false; - - [Tooltip("Shows the debug visualization coming from the internal Interaction plugin.")] - [SerializeField] - protected bool _showDebugLines = false; - - [Tooltip("Shows the debug messages coming from the internal Interaction plugin.")] - [SerializeField] - protected bool _showDebugOutput = false; - - [Tooltip("Will display the debug messages if assigned.")] - [SerializeField] - protected Text _debugTextView; - #endregion - - #region INTERNAL FIELDS - private const float UNSCALED_RECOMMENDED_CONTACT_OFFSET_MAXIMUM = 0.001f; //One millimeter - public float RecommendedContactOffsetMaximum { - get { - return UNSCALED_RECOMMENDED_CONTACT_OFFSET_MAXIMUM * SimulationScale; - } - } - - protected INTERACTION_SCENE _scene; - private bool _hasSceneBeenCreated = false; - private bool _enableGraspingLast = false; - - protected ActivityManager _activityManager = new ActivityManager(); - protected ShapeDescriptionPool _shapeDescriptionPool; - - //Maps the Interaction instance handle to the behaviour - //A mapping only exists if a shape instance has been created - protected Dictionary _instanceHandleToBehaviour = new Dictionary(); - - protected Dictionary _idToInteractionHand = new Dictionary(); - protected List _graspedBehaviours = new List(); - - private float _cachedSimulationScale = -1; - //A temp list that is recycled. Used to remove items from _handIdToIeHand. - private List _handIdsToRemove = new List(); - //A temp list that is recycled. Used as the argument to OnHandsHold. - private List _holdingHands = new List(); - //A temp list that is recycled. Used to recieve results from InteractionC. - private List _resultList = new List(); - //A temp list that is recycled. Used to recieve debug lines from InteractionC. - private List _debugLines = new List(); - //A temp list that is recycled. Used to recieve debug logs from InteractionC. - private List _debugOutput = new List(); - #endregion - - #region PUBLIC METHODS - public Action OnGraphicalUpdate; - public Action OnPrePhysicalUpdate; - public Action OnPostPhysicalUpdate; - - /// - /// Gets the current set of debug flags for this manager. - /// - public virtual DebugFlags DebugFlags { - get { - DebugFlags flags = DebugFlags.None; - if (_showDebugLines) { - flags |= DebugFlags.Lines; - } - if (_showDebugOutput) { - flags |= DebugFlags.Strings; - flags |= DebugFlags.Logging; - } - return flags; - } - } - - public float SimulationScale { - get { + /// + /// InteractionManager is the core behaviour that manages the IInteractionBehaviours in the scene. + /// This class allows IInteractionBehaviours to register with it and provides all of the callbacks + /// needed for operation. This class also takes care of all bookkeeping to keep track of the objects, + /// hands, and the internal state of the interaction plugin. + /// + /// + /// + /// InteractionManager has the following features: + /// - Allows instances of IInteractionBehaviour to register or unregister with it. + /// - Registered instances stay registered even if this behaviour is disabled. + /// - Dispatches events to the interaction plugin and uses the returned data to drive the registered + /// behaviours. Takes care of all bookkeeping needed to maintain the internal state. + /// - Supports the concept of 'suspension', where an untracked hand is still allowed to be considered + /// grasping an object. This is to allow an object to not fall when a hand becomes untracked for + /// a small amount of time. This helps with actions such as throwing. + /// - Multiple instances of InteractionManager are ALLOWED! This allows you to have different simulation + /// settings and control for different groups of objects. + /// + /// InteractionManager has the following requirements: + /// - The DataSubfolder property must point to a valid subfolder in the StreamingAssets data folder. + /// The subfolder must contain a valid ldat file names IE. + /// + public partial class InteractionManager : MonoBehaviour { + #region SERIALIZED FIELDS + [AutoFind] + [SerializeField] + protected LeapProvider _leapProvider; + + [AutoFind] + [SerializeField] + protected HandPool _handPool; + + [Tooltip("The streaming asset subpath of the ldat engine.")] + [SerializeField] + protected string _ldatPath = "InteractionEngine/IE.ldat"; + + [Header("Interaction Settings")] + [Tooltip("The default Interaction Material to use for Interaction Behaviours if none is specified, or for Interaction Behaviours created via scripting.")] + [SerializeField] + protected InteractionMaterial _defaultInteractionMaterial; + + [Tooltip("The name of the model group of the Hand Pool containing the brush hands.")] + [SerializeField] + protected string _brushGroupName = "BrushHands"; + + [Tooltip("Allow the Interaction Engine to modify object velocities when pushing.")] + [SerializeField] + protected bool _contactEnabled = true; + + [Tooltip("Allow the Interaction plugin to modify object positions by grasping.")] + [SerializeField] + protected bool _graspingEnabled = true; + + [Tooltip("Depth before collision response becomes as if holding a sphere.")] + [SerializeField] + protected float _depthUntilSphericalInside = 0.023f; + + [Tooltip("Objects within this radius of a hand will be considered for interaction.")] + [SerializeField] + protected float _activationRadius = 0.15f; + + [Tooltip("How many objects away from the hand are still considered for interaction.")] + [SerializeField] + protected int _maxActivationDepth = 3; + + [Header("Layer Settings")] + [SerializeField] + protected bool _autoGenerateLayers = false; + + [Tooltip("Layer to use for auto-generation. The generated interaction layers will have the same collision settings as this layer.")] + [SerializeField] + protected SingleLayer _templateLayer = 0; + + [Tooltip("Default layer that interaction objects")] + [SerializeField] + protected SingleLayer _interactionLayer = 0; + + [Tooltip("Default layer that interaction objects when they become grasped.")] + [SerializeField] + protected SingleLayer _interactionNoClipLayer = 0; + + [Tooltip("Layer that interaction brushes will be on normally.")] + [SerializeField] + protected SingleLayer _brushLayer = 0; + + [Header("Debug")] + [Tooltip("Automatically validate integrity of simulation state each frame. Can cause slowdown, but is always compiled out for release builds.")] + [SerializeField] + protected bool _automaticValidation = false; + + [Tooltip("Shows the debug visualization coming from the internal Interaction plugin.")] + [SerializeField] + protected bool _showDebugLines = false; + + [Tooltip("Shows the debug messages coming from the internal Interaction plugin.")] + [SerializeField] + protected bool _showDebugOutput = false; + + [Tooltip("Will display the debug messages if assigned.")] + [SerializeField] + protected Text _debugTextView; + #endregion + + #region INTERNAL FIELDS + private const float UNSCALED_RECOMMENDED_CONTACT_OFFSET_MAXIMUM = 0.001f; //One millimeter + public float RecommendedContactOffsetMaximum { + get { + return UNSCALED_RECOMMENDED_CONTACT_OFFSET_MAXIMUM * SimulationScale; + } + } + + protected INTERACTION_SCENE _scene; + private bool _hasSceneBeenCreated = false; + private bool _enableGraspingLast = false; + + protected ActivityManager _activityManager = new ActivityManager(); + protected ShapeDescriptionPool _shapeDescriptionPool; + + //Maps the Interaction instance handle to the behaviour + //A mapping only exists if a shape instance has been created + protected Dictionary _instanceHandleToBehaviour = new Dictionary(); + + protected Dictionary _idToInteractionHand = new Dictionary(); + protected List _graspedBehaviours = new List(); + + private float _cachedSimulationScale = -1; + //A temp list that is recycled. Used to remove items from _handIdToIeHand. + private List _handIdsToRemove = new List(); + //A temp list that is recycled. Used as the argument to OnHandsHold. + private List _holdingHands = new List(); + //A temp list that is recycled. Used to recieve results from InteractionC. + private List _resultList = new List(); + //A temp list that is recycled. Used to recieve debug lines from InteractionC. + private List _debugLines = new List(); + //A temp list that is recycled. Used to recieve debug logs from InteractionC. + private List _debugOutput = new List(); + #endregion + + #region PUBLIC METHODS + public Action OnGraphicalUpdate; + public Action OnPrePhysicalUpdate; + public Action OnPostPhysicalUpdate; + + /// + /// Gets the current set of debug flags for this manager. + /// + public virtual DebugFlags DebugFlags { + get { + DebugFlags flags = DebugFlags.None; + if (_showDebugLines) { + flags |= DebugFlags.Lines; + } + if (_showDebugOutput) { + flags |= DebugFlags.Strings; + flags |= DebugFlags.Logging; + } + return flags; + } + } + + public float SimulationScale { + get { #if UNITY_EDITOR - if (Application.isPlaying) { - return _cachedSimulationScale; - } else { - if (_leapProvider != null) { - return _leapProvider.transform.lossyScale.x; - } else { - return 1; - } - } + if (Application.isPlaying) { + return _cachedSimulationScale; + } else { + if (_leapProvider != null) { + return _leapProvider.transform.lossyScale.x; + } else { + return 1; + } + } #else return _cachedSimulationScale; #endif - } - } - - public INTERACTION_SCENE Scene { - get { - return _scene; - } - } - - /// - /// Returns a ShapeDescriptionPool that can be used to allocate shape descriptions - /// for this manager. Using the pool can be more efficient since identical shapes - /// can be automatically combined to save memory. Shape descriptions aquired from this - /// pool will be destroyed when this manager is disabled. - /// - public ShapeDescriptionPool ShapePool { - get { - return _shapeDescriptionPool; - } - } - - /// - /// Returns true if any InteractionObject is currently being grasped by at least one Hand. - /// - public bool IsAnyObjectGrasped { - get { - return _graspedBehaviours.Count != 0; - } - } - - /// - /// Returns a collection of InteractionBehaviours that are currently registered with this manager. - /// - public IEnumerable RegisteredObjects { - get { - return _activityManager.RegisteredObjects; - } - } - - /// - /// Returns a collection of InteractionBehaviours that are currently being grasped by - /// at least one hand. - /// - public ReadonlyList GraspedObjects { - get { - return _graspedBehaviours; - } - } - - /// - /// Gets or sets the default InteractionMaterial used when InteractionBehaviours are spawned without a material explicitly assigned. - /// - public InteractionMaterial DefaultInteractionMaterial { - get { - return _defaultInteractionMaterial; - } - set { - _defaultInteractionMaterial = value; - } - } - - /// - /// Gets or sets whether or not the Interaction Engine can modify object velocities when pushing. - /// - public bool ContactEnabled { - get { - return _contactEnabled; - } - set { - if (_contactEnabled != value) { - _contactEnabled = value; - - if (_handPool != null) { - if (_contactEnabled) { - _handPool.EnableGroup(_brushGroupName); - } else { - _handPool.DisableGroup(_brushGroupName); - } - } - - UpdateSceneInfo(); - } - } - } - - /// - /// Gets or sets whether or not the Interaction Engine can modify object positions by grasping. - /// - public bool GraspingEnabled { - get { - return _graspingEnabled; - } - set { - if (_graspingEnabled != value) { - _graspingEnabled = value; - UpdateSceneInfo(); - } - } - } - - /// - /// Depth before collision response becomes as if holding a sphere.. - /// - public float DepthUntilSphericalInside { - get { - return _depthUntilSphericalInside; - } - set { - _depthUntilSphericalInside = value; - UpdateSceneInfo(); - } - } - - /// - /// Gets the layer that interaction objects should be on by default. - /// - public int InteractionLayer { - get { - return _interactionLayer; - } - set { - _interactionLayer = value; - } - } - - /// - /// Gets the layer that interaction objects should be on when they become grasped. - /// - public int InteractionNoClipLayer { - get { - return _interactionNoClipLayer; - } - set { - _interactionNoClipLayer = value; - } - } - - /// - /// Gets the layer that interaction brushes should be on normally. - /// - public int InteractionBrushLayer { - get { - return _brushLayer; - } - set { - _brushLayer = value; - } - } - - /// - /// Gets or sets the max activation depth. - /// - public int MaxActivationDepth { - get { - return _maxActivationDepth; - } - set { - _maxActivationDepth = value; - _activityManager.MaxDepth = value; - } - } - - /// - /// Enables the display of proximity information from the library. - /// - public bool ShowDebugLines { - get { - return _showDebugLines; - } - set { - _showDebugLines = value; - applyDebugSettings(); - } - } - - /// - /// Enables the display of debug text from the library. - /// - public bool ShowDebugOutput { - get { - return _showDebugOutput; - } - set { - _showDebugOutput = value; - applyDebugSettings(); - } - } - - /// Force an update of the internal scene info. This should be called if gravity has changed. - /// - public void UpdateSceneInfo() { - if (!_hasSceneBeenCreated) { - return; // UpdateSceneInfo is a side effect of a lot of changes. - } - - INTERACTION_SCENE_INFO info = getSceneInfo(); - - if (_graspingEnabled && !_enableGraspingLast) { - using (LdatLoader.LoadLdat(ref info, _ldatPath)) { - InteractionC.UpdateSceneInfo(ref _scene, ref info); - } - } else { - InteractionC.UpdateSceneInfo(ref _scene, ref info); - } - _enableGraspingLast = _graspingEnabled; - - _cachedSimulationScale = _leapProvider.transform.lossyScale.x; - _activityManager.OverlapRadius = _activationRadius * _cachedSimulationScale; - } - - /// - /// Tries to find an InteractionObject that is currently being grasped by a Hand with - /// the given ID. - /// - public bool TryGetGraspedObject(int handId, out IInteractionBehaviour graspedObject) { - for (int i = 0; i < _graspedBehaviours.Count; i++) { - var iObj = _graspedBehaviours[i]; - if (iObj.IsBeingGraspedByHand(handId)) { - graspedObject = iObj; - return true; - } - } - - graspedObject = null; - return false; - } - - /// - /// Forces the given object to be released by any hands currently holding it. Will return true - /// only if there was at least one hand holding the object. - /// - public bool ReleaseObject(IInteractionBehaviour graspedObject) { - if (!_graspedBehaviours.Remove(graspedObject)) { - return false; - } - - foreach (var interactionHand in _idToInteractionHand.Values) { - if (interactionHand.graspedObject == graspedObject) { - if (interactionHand.isUntracked) { - interactionHand.MarkTimeout(); - } else { - if (_graspingEnabled) { - INTERACTION_HAND_RESULT result = new INTERACTION_HAND_RESULT(); - result.classification = ManipulatorMode.Contact; - result.handFlags = HandResultFlags.ManipulatorMode; - result.instanceHandle = new INTERACTION_SHAPE_INSTANCE_HANDLE(); - InteractionC.OverrideHandResult(ref _scene, (uint)interactionHand.hand.Id, ref result); - } - interactionHand.ReleaseObject(); - } - } - } - - return true; - } - - /// - /// Forces a hand with the given id to release an object if it is holding it. Will return true - /// only if a hand with the given id releases an object it was holding. - /// - public bool ReleaseHand(int handId) { - InteractionHand interactionHand; - if (!_idToInteractionHand.TryGetValue(handId, out interactionHand)) { - return false; - } - - if (interactionHand.graspedObject == null) { - return false; - } - - if (interactionHand.graspedObject.GraspingHandCount == 1) { - _graspedBehaviours.Remove(interactionHand.graspedObject); - } - - interactionHand.ReleaseObject(); - return true; - } - - /// - /// Forces a hand to grasp the given interaction behaviour. The grasp will only be terminated when - /// the hand either times out or the user calls ReleaseHand. - /// - /// - public void GraspWithHand(Hand hand, IInteractionBehaviour interactionBehaviour) { - if (!_activityManager.IsRegistered(interactionBehaviour)) { - throw new InvalidOperationException("Cannot grasp " + interactionBehaviour + " because it is not registered with this manager."); - } - - InteractionHand interactionHand; - if (!_idToInteractionHand.TryGetValue(hand.Id, out interactionHand)) { - throw new InvalidOperationException("Hand with id " + hand.Id + " is not registered with this manager."); - } - - if (interactionHand.graspedObject != null) { - throw new InvalidOperationException("Cannot grasp with hand " + hand.Id + " because that hand is already grasping " + interactionHand.graspedObject); - } - - //Ensure behaviour is active already - _activityManager.Activate(interactionBehaviour); - - if (!interactionBehaviour.IsBeingGrasped) { - _graspedBehaviours.Add(interactionBehaviour); - } - - interactionHand.GraspObject(interactionBehaviour, isUserGrasp: true); - } - - /// - /// Registers an InteractionObject with this manager, which automatically adds the objects - /// representation into the internal interaction scene. If the manager is disabled, - /// the registration will still succeed and the object will be added to the internal scene - /// when the manager is next enabled. - /// - /// Trying to register a behaviour that is already registered is safe and is a no-op. - /// - public void RegisterInteractionBehaviour(IInteractionBehaviour interactionBehaviour) { - _activityManager.Register(interactionBehaviour); - } - - /// - /// Unregisters an InteractionObject from this manager. This removes it from the internal - /// scene and prevents any further interaction. - /// - /// Trying to unregister a behaviour that is not registered is safe and is a no-op. - /// - public void UnregisterInteractionBehaviour(IInteractionBehaviour interactionBehaviour) { - if (_graspedBehaviours.Remove(interactionBehaviour)) { - foreach (var interactionHand in _idToInteractionHand.Values) { - if (interactionHand.graspedObject == interactionBehaviour) { - try { - if (interactionHand.isUntracked) { - interactionHand.MarkTimeout(); - } else { - interactionHand.ReleaseObject(); - } - } catch (Exception e) { - //Only log to console - //We want to continue so we can destroy the shape and dispatch OnUnregister - Debug.LogException(e); - } - break; - } - } - } - - _activityManager.Unregister(interactionBehaviour); - } - - public void EnsureActive(IInteractionBehaviour interactionBehaviour) { - if (!_activityManager.IsActive(interactionBehaviour)) { - _activityManager.Activate(interactionBehaviour); - } - } - - #endregion - - #region UNITY CALLBACKS - protected virtual void Reset() { - if (_leapProvider == null) { - _leapProvider = FindObjectOfType(); - } - } - - protected virtual void OnValidate() { - if (Application.isPlaying && _hasSceneBeenCreated) { - //Allow the debug lines to be toggled while the scene is playing - applyDebugSettings(); - //Allow scene info to be updated while the scene is playing - UpdateSceneInfo(); - } - - if (!Application.isPlaying && _autoGenerateLayers) { - autoGenerateLayers(); - } - - _activationRadius = Mathf.Max(0, _activationRadius); - _maxActivationDepth = Mathf.Max(1, _maxActivationDepth); - - if (_activityManager != null) { - _activityManager.OverlapRadius = _activationRadius; - _activityManager.MaxDepth = _maxActivationDepth; - } - } - - protected virtual void Awake() { - if (_autoGenerateLayers) { - autoGenerateLayers(); - autoSetupCollisionLayers(); - } - } - - protected virtual void OnEnable() { - if (_leapProvider == null) { - enabled = false; - Debug.LogError("Could not enable Interaction Manager because no Leap Provider was specified."); - return; - } - - Assert.IsFalse(_hasSceneBeenCreated, "Scene should not have been created yet"); - - createScene(); - applyDebugSettings(); - - _shapeDescriptionPool = new ShapeDescriptionPool(_scene); - - Assert.AreEqual(_instanceHandleToBehaviour.Count, 0, "There should not be any instances before the creation step."); - - _cachedSimulationScale = _leapProvider.transform.lossyScale.x; - - _activityManager.BrushLayer = InteractionBrushLayer; - _activityManager.OverlapRadius = _activationRadius * _cachedSimulationScale; - _activityManager.MaxDepth = _maxActivationDepth; - _activityManager.OnActivate += createInteractionShape; - _activityManager.OnDeactivate += destroyInteractionShape; - - if (_handPool != null) { - if (_contactEnabled) { - _handPool.EnableGroup(_brushGroupName); - } else { - _handPool.DisableGroup(_brushGroupName); - } - } - } - - protected virtual void OnDisable() { - for (int i = _graspedBehaviours.Count; i-- != 0;) { - ReleaseObject(_graspedBehaviours[i]); - } - - _activityManager.UnregisterMisbehavingObjects(); - - _idToInteractionHand.Clear(); - _graspedBehaviours.Clear(); - - _activityManager.DeactivateAll(); - _activityManager.OnActivate -= createInteractionShape; - _activityManager.OnDeactivate -= destroyInteractionShape; - - Assert.AreEqual(_instanceHandleToBehaviour.Count, 0, "All instances should have been destroyed."); - - if (_shapeDescriptionPool != null) { - _shapeDescriptionPool.RemoveAllShapes(); - _shapeDescriptionPool = null; - } - - if (_hasSceneBeenCreated) { - destroyScene(); - } - } - - protected virtual void FixedUpdate() { - Frame frame = _leapProvider.CurrentFixedFrame; - - if (OnPrePhysicalUpdate != null) { - OnPrePhysicalUpdate(); - } - - simulateFrame(frame); - - if (OnPostPhysicalUpdate != null) { - OnPostPhysicalUpdate(); - } - - if (_showDebugLines) { - RuntimeGizmoDrawer gizmoDrawer; - if (RuntimeGizmoManager.TryGetGizmoDrawer(gameObject, out gizmoDrawer)) { - InteractionC.GetDebugLines(ref _scene, _debugLines); - for (int i = 0; i < _debugLines.Count; i++) { - var line = _debugLines[i]; - gizmoDrawer.color = line.color.ToUnityColor(); - gizmoDrawer.DrawLine(line.start.ToVector3(), line.end.ToVector3()); - } - } - } - - if (_showDebugOutput) { - InteractionC.GetDebugStrings(ref _scene, _debugOutput); - } - } - - protected virtual void LateUpdate() { - Frame frame = _leapProvider.CurrentFrame; - - dispatchOnHandsHoldingAll(frame, isPhysics: false); - - _activityManager.UnregisterMisbehavingObjects(); - - if (OnGraphicalUpdate != null) { - OnGraphicalUpdate(); - } - - if (_showDebugOutput && _debugTextView != null) { - string text = ""; - for (int i = 0; i < _debugOutput.Count; i++) { - text += _debugOutput[i]; - if (i != _debugOutput.Count - 1) { - text += "\n"; - } - } - _debugTextView.text = text; - } - - if (_automaticValidation) { - Validate(); - } - } - - protected virtual void OnGUI() { - if (_showDebugOutput) { - for (int i = 0; i < _debugOutput.Count; i++) { - GUILayout.Label(_debugOutput[i]); - } - } - } - #endregion - - #region INTERNAL METHODS - - protected void autoGenerateLayers() { - _interactionLayer = -1; - _interactionNoClipLayer = -1; - _brushLayer = -1; - for (int i = 8; i < 32; i++) { - string layerName = LayerMask.LayerToName(i); - if (string.IsNullOrEmpty(layerName)) { - if (_interactionLayer == -1) { - _interactionLayer = i; - } else if (_interactionNoClipLayer == -1) { - _interactionNoClipLayer = i; - } else if (_brushLayer == -1) { - _brushLayer = i; - break; - } - } - } - - if (_interactionLayer == -1 || _interactionNoClipLayer == -1 || _brushLayer == -1) { - if (Application.isPlaying) { - enabled = false; - } - Debug.LogError("InteractionManager Could not find enough free layers for auto-setup, manual setup required."); - _autoGenerateLayers = false; - return; - } - } - - private void autoSetupCollisionLayers() { - for (int i = 0; i < 32; i++) { - // Copy ignore settings from template layer - bool shouldIgnore = Physics.GetIgnoreLayerCollision(_templateLayer, i); - Physics.IgnoreLayerCollision(_interactionLayer, i, shouldIgnore); - Physics.IgnoreLayerCollision(_interactionNoClipLayer, i, shouldIgnore); - - // Set brush layer to collide with nothing - Physics.IgnoreLayerCollision(_brushLayer, i, true); - } - - //After copy and set we enable the interaction between the brushes and interaction objects - Physics.IgnoreLayerCollision(_brushLayer, _interactionLayer, false); - } - - protected virtual void simulateFrame(Frame frame) { - _activityManager.UpdateState(frame); - - var active = _activityManager.ActiveBehaviours; - - for (int i = 0; i < active.Count; i++) { - active[i].NotifyPreSolve(); - } - - dispatchOnHandsHoldingAll(frame, isPhysics: true); - - updateInteractionRepresentations(); - - updateTracking(frame); - - simulateInteraction(); - - updateInteractionStateChanges(frame); - - dispatchSimulationResults(); - - for (int i = 0; i < active.Count; i++) { - active[i].NotifyPostSolve(); - } - } - - protected virtual void applyDebugSettings() { - InteractionC.EnableDebugFlags(ref _scene, (uint)DebugFlags); - } - - protected virtual void updateInteractionRepresentations() { - var active = _activityManager.ActiveBehaviours; - for (int i = 0; i < active.Count; i++) { - IInteractionBehaviour interactionBehaviour = active[i]; - try { - INTERACTION_SHAPE_INSTANCE_HANDLE shapeInstanceHandle = interactionBehaviour.ShapeInstanceHandle; - - INTERACTION_UPDATE_SHAPE_INFO updateInfo; - INTERACTION_TRANSFORM updateTransform; - interactionBehaviour.GetInteractionShapeUpdateInfo(out updateInfo, out updateTransform); - - InteractionC.UpdateShapeInstance(ref _scene, ref updateTransform, ref updateInfo, ref shapeInstanceHandle); - } catch (Exception e) { - _activityManager.NotifyMisbehaving(interactionBehaviour); - Debug.LogException(e); - } - } - } - - protected virtual void dispatchOnHandsHoldingAll(Frame frame, bool isPhysics) { - var hands = frame.Hands; - //Loop through the currently grasped objects to dispatch their OnHandsHold callback - for (int i = 0; i < _graspedBehaviours.Count; i++) { - dispatchOnHandsHolding(hands, _graspedBehaviours[i], isPhysics); - } - } - - protected virtual void dispatchOnHandsHolding(List hands, IInteractionBehaviour interactionBehaviour, bool isPhysics) { - for (int j = 0; j < hands.Count; j++) { - var hand = hands[j]; - InteractionHand interactionHand; - if (_idToInteractionHand.TryGetValue(hand.Id, out interactionHand)) { - if (interactionHand.graspedObject == interactionBehaviour) { - _holdingHands.Add(hand); - } - } - } - - try { - if (isPhysics) { - interactionBehaviour.NotifyHandsHoldPhysics(_holdingHands); - } else { - interactionBehaviour.NotifyHandsHoldGraphics(_holdingHands); - } - } catch (Exception e) { - _activityManager.NotifyMisbehaving(interactionBehaviour); - Debug.LogException(e); - } - - _holdingHands.Clear(); - } - - protected virtual void updateTracking(Frame frame) { - int handCount = frame.Hands.Count; - IntPtr ptr = HandArrayBuilder.CreateHandArray(frame); - InteractionC.UpdateHands(ref _scene, (uint)handCount, ptr); - StructAllocator.CleanupAllocations(); - } - - protected virtual void simulateInteraction() { - var _controllerTransform = new INTERACTION_TRANSFORM(); - _controllerTransform.position = _leapProvider.transform.position.ToCVector(); - _controllerTransform.rotation = _leapProvider.transform.rotation.ToCQuaternion(); - _controllerTransform.wallTime = Time.fixedTime; - - InteractionC.UpdateController(ref _scene, ref _controllerTransform); - } - - protected virtual void updateInteractionStateChanges(Frame frame) { - var hands = frame.Hands; - - INTERACTION_HAND_RESULT handResult = new INTERACTION_HAND_RESULT(); - - //First loop through all the hands and get their classifications from the engine - for (int i = 0; i < hands.Count; i++) { - Hand hand = hands[i]; - - bool handResultForced = false; - - //Get the InteractionHand associated with this hand id - InteractionHand interactionHand; - if (!_idToInteractionHand.TryGetValue(hand.Id, out interactionHand)) { - - //First we see if there is an untracked interactionHand that can be re-connected using this one - InteractionHand untrackedInteractionHand = null; - foreach (var pair in _idToInteractionHand) { - //If the old ieHand is untracked, and the handedness matches, we re-connect it - if (pair.Value.isUntracked && pair.Value.hand.IsLeft == hand.IsLeft) { - untrackedInteractionHand = pair.Value; - break; - } - } - - if (untrackedInteractionHand != null) { - //If we found an untrackedIeHand, use it! - interactionHand = untrackedInteractionHand; - //Remove the old id from the mapping - _idToInteractionHand.Remove(untrackedInteractionHand.hand.Id); - _idToInteractionHand[hand.Id] = interactionHand; - - try { - //This also dispatched InteractionObject.OnHandRegainedTracking() - interactionHand.RegainTracking(hand); - - if (interactionHand.graspedObject == null) { - continue; - } - - // NotifyHandRegainedTracking() did not throw, continue on to NotifyHandsHoldPhysics(). - dispatchOnHandsHolding(hands, interactionHand.graspedObject, isPhysics: true); - } catch (Exception e) { - _activityManager.NotifyMisbehaving(interactionHand.graspedObject); - Debug.LogException(e); - continue; - } - - //Override the existing classification to force the hand to grab the old object - handResultForced = true; - handResult.classification = ManipulatorMode.Grasp; - handResult.handFlags = HandResultFlags.ManipulatorMode; - handResult.instanceHandle = interactionHand.graspedObject.ShapeInstanceHandle; - - if (_graspingEnabled) { - InteractionC.OverrideHandResult(ref _scene, (uint)hand.Id, ref handResult); - } - } else { - //Otherwise just create a new one - interactionHand = new InteractionHand(hand); - _idToInteractionHand[hand.Id] = interactionHand; - } - } - - if (!handResultForced) { - handResult = getHandResults(interactionHand); - } - - interactionHand.UpdateHand(hand); - - if (!interactionHand.isUserGrasp) { - switch (handResult.classification) { - case ManipulatorMode.Grasp: - { - IInteractionBehaviour interactionBehaviour; - if (_instanceHandleToBehaviour.TryGetValue(handResult.instanceHandle, out interactionBehaviour)) { - if (interactionHand.graspedObject == null) { - if (!interactionBehaviour.IsBeingGrasped) { - _graspedBehaviours.Add(interactionBehaviour); - } - - try { - interactionHand.GraspObject(interactionBehaviour, isUserGrasp: false); - - //the grasp callback might have caused the object to become ungrasped - //the component might have also destroyed itself! - if (interactionHand.graspedObject == interactionBehaviour && interactionBehaviour != null) { - dispatchOnHandsHolding(hands, interactionBehaviour, isPhysics: true); - } - } catch (Exception e) { - _activityManager.NotifyMisbehaving(interactionBehaviour); - Debug.LogException(e); - continue; - } - } - } else { - Debug.LogError("Recieved a hand result with an unkown handle " + handResult.instanceHandle.handle); - } - break; - } - case ManipulatorMode.Contact: - { - if (interactionHand.graspedObject != null) { - if (interactionHand.graspedObject.GraspingHandCount == 1) { - _graspedBehaviours.Remove(interactionHand.graspedObject); - } - - try { - interactionHand.ReleaseObject(); - } catch (Exception e) { - _activityManager.NotifyMisbehaving(interactionHand.graspedObject); - Debug.LogException(e); - continue; - } - } - break; - } - default: - throw new InvalidOperationException("Unexpected classification " + handResult.classification); - } - } - } - - //Loop through all ieHands to check for timeouts and loss of tracking - foreach (var pair in _idToInteractionHand) { - var id = pair.Key; - var ieHand = pair.Value; - - float handAge = Time.unscaledTime - ieHand.lastTimeUpdated; - //Check to see if the hand is at least 1 frame old - //We assume it has become untracked if this is the case - if (handAge > 0) { - //If the hand isn't grasping anything, just remove it - if (ieHand.graspedObject == null) { - _handIdsToRemove.Add(id); - continue; - } - - //If is isn't already marked as untracked, mark it as untracked - if (!ieHand.isUntracked) { - try { - //This also dispatches InteractionObject.OnHandLostTracking() - ieHand.MarkUntracked(); - } catch (Exception e) { - _activityManager.NotifyMisbehaving(ieHand.graspedObject); - Debug.LogException(e); - } - } - - //If the age is longer than the timeout, we also remove it from the list - if (handAge >= ieHand.maxSuspensionTime) { - _handIdsToRemove.Add(id); - - try { - if (ieHand.graspedObject.GraspingHandCount == 1) { - _graspedBehaviours.Remove(ieHand.graspedObject); - } - - //This also dispatched InteractionObject.OnHandTimeout() - ieHand.MarkTimeout(); - } catch (Exception e) { - _activityManager.NotifyMisbehaving(ieHand.graspedObject); - Debug.LogException(e); - } - } - } - } - - //Loop through the stale ids and remove them from the map - for (int i = 0; i < _handIdsToRemove.Count; i++) { - _idToInteractionHand.Remove(_handIdsToRemove[i]); - } - _handIdsToRemove.Clear(); - } - - protected virtual INTERACTION_HAND_RESULT getHandResults(InteractionHand hand) { - if (!_graspingEnabled) { - INTERACTION_HAND_RESULT result = new INTERACTION_HAND_RESULT(); - result.classification = ManipulatorMode.Contact; - result.handFlags = HandResultFlags.ManipulatorMode; - result.instanceHandle = new INTERACTION_SHAPE_INSTANCE_HANDLE(); - return result; - } - - INTERACTION_HAND_RESULT handResult; - InteractionC.GetHandResult(ref _scene, - (uint)hand.hand.Id, - out handResult); - return handResult; - } - - protected virtual void dispatchSimulationResults() { - InteractionC.GetShapeInstanceResults(ref _scene, _resultList); - - for (int i = 0; i < _resultList.Count; ++i) { - INTERACTION_SHAPE_INSTANCE_RESULTS result = _resultList[i]; - - //Behaviour might have already been unregistered during an earlier callback for this simulation step - IInteractionBehaviour interactionBehaviour; - if (_instanceHandleToBehaviour.TryGetValue(result.handle, out interactionBehaviour)) { - try { - // ShapeInstanceResultFlags.None may be returned if requested when hands are not touching. - interactionBehaviour.NotifyRecievedSimulationResults(result); - } catch (Exception e) { - _activityManager.NotifyMisbehaving(interactionBehaviour); - Debug.LogException(e); - } - } - } - } - - protected virtual void createInteractionShape(IInteractionBehaviour interactionBehaviour) { - INTERACTION_SHAPE_DESCRIPTION_HANDLE descriptionHandle = interactionBehaviour.ShapeDescriptionHandle; - INTERACTION_SHAPE_INSTANCE_HANDLE instanceHandle = new INTERACTION_SHAPE_INSTANCE_HANDLE(); - - INTERACTION_CREATE_SHAPE_INFO createInfo; - INTERACTION_TRANSFORM createTransform; - interactionBehaviour.GetInteractionShapeCreationInfo(out createInfo, out createTransform); - - InteractionC.CreateShapeInstance(ref _scene, ref descriptionHandle, ref createTransform, ref createInfo, out instanceHandle); - - _instanceHandleToBehaviour[instanceHandle] = interactionBehaviour; - - interactionBehaviour.NotifyInteractionShapeCreated(instanceHandle); - } - - protected virtual void destroyInteractionShape(IInteractionBehaviour interactionBehaviour) { - INTERACTION_SHAPE_INSTANCE_HANDLE instanceHandle = interactionBehaviour.ShapeInstanceHandle; - - _instanceHandleToBehaviour.Remove(instanceHandle); - - InteractionC.DestroyShapeInstance(ref _scene, ref instanceHandle); - - interactionBehaviour.NotifyInteractionShapeDestroyed(); - } - - protected virtual void createScene() { - _scene.pScene = (IntPtr)0; - - UInt32 libraryVersion = InteractionC.GetLibraryVersion(); - UInt32 expectedVersion = InteractionC.GetExpectedVersion(); - if (libraryVersion != expectedVersion) { - Debug.LogError("Leap Interaction dll version expected: " + expectedVersion + " got version: " + libraryVersion); - throw new Exception("Leap Interaction library version wrong"); - } - - InteractionC.CreateScene(ref _scene); - _hasSceneBeenCreated = true; - - UpdateSceneInfo(); - } - - protected virtual void destroyScene() { - InteractionC.DestroyScene(ref _scene); - _hasSceneBeenCreated = false; - } - - protected virtual INTERACTION_SCENE_INFO getSceneInfo() { - INTERACTION_SCENE_INFO info = new INTERACTION_SCENE_INFO(); - info.sceneFlags = SceneInfoFlags.None; - - if (Physics.gravity.sqrMagnitude != 0.0f) { - info.sceneFlags |= SceneInfoFlags.HasGravity; - info.gravity = Physics.gravity.ToCVector(); - } - - if (_depthUntilSphericalInside > 0.0f) { - info.sceneFlags |= SceneInfoFlags.SphericalInside; - info.depthUntilSphericalInside = _depthUntilSphericalInside; - } - - if (_contactEnabled) { - info.sceneFlags |= SceneInfoFlags.ContactEnabled; - } - - // _enableGraspingLast gaurds against expensive file IO. Only load the ldat - // data when grasping is being enabled. - if (_graspingEnabled) { - info.sceneFlags |= SceneInfoFlags.GraspEnabled; - } - - return info; - } - - //A persistant structure for storing useful data about a hand as it interacts with objects - //TODO: Investigate pooling? - protected partial class InteractionHand { - public Hand hand { get; protected set; } - public float lastTimeUpdated { get; protected set; } - public float maxSuspensionTime { get; protected set; } - public IInteractionBehaviour graspedObject { get; protected set; } - public bool isUntracked { get; protected set; } - public bool isUserGrasp { get; protected set; } - - public InteractionHand(Hand hand) { - this.hand = new Hand().CopyFrom(hand); - lastTimeUpdated = Time.unscaledTime; - graspedObject = null; - } - - public void UpdateHand(Hand hand) { - this.hand.CopyFrom(hand); - lastTimeUpdated = Time.unscaledTime; - } - - public void GraspObject(IInteractionBehaviour obj, bool isUserGrasp) { - this.isUserGrasp = isUserGrasp; - graspedObject = obj; - graspedObject.NotifyHandGrasped(hand); - } - - public void ReleaseObject() { - graspedObject.NotifyHandReleased(hand); - graspedObject = null; - isUntracked = false; - isUserGrasp = false; - } - - public void MarkUntracked() { - isUntracked = true; - float outTime; - graspedObject.NotifyHandLostTracking(hand, out outTime); - maxSuspensionTime = outTime; - } - - public void MarkTimeout() { - graspedObject.NotifyHandTimeout(hand); - graspedObject = null; - isUntracked = true; - isUserGrasp = false; - hand = null; - } - - public void RegainTracking(Hand newHand) { - int oldId = hand.Id; - UpdateHand(newHand); - - isUntracked = false; - graspedObject.NotifyHandRegainedTracking(newHand, oldId); - } - } - #endregion - } + } + } + + public INTERACTION_SCENE Scene { + get { + return _scene; + } + } + + /// + /// Returns a ShapeDescriptionPool that can be used to allocate shape descriptions + /// for this manager. Using the pool can be more efficient since identical shapes + /// can be automatically combined to save memory. Shape descriptions aquired from this + /// pool will be destroyed when this manager is disabled. + /// + public ShapeDescriptionPool ShapePool { + get { + return _shapeDescriptionPool; + } + } + + /// + /// Returns true if any InteractionObject is currently being grasped by at least one Hand. + /// + public bool IsAnyObjectGrasped { + get { + return _graspedBehaviours.Count != 0; + } + } + + /// + /// Returns a collection of InteractionBehaviours that are currently registered with this manager. + /// + public IEnumerable RegisteredObjects { + get { + return _activityManager.RegisteredObjects; + } + } + + /// + /// Returns a collection of InteractionBehaviours that are currently being grasped by + /// at least one hand. + /// + public ReadonlyList GraspedObjects { + get { + return _graspedBehaviours; + } + } + + /// + /// Gets or sets the default InteractionMaterial used when InteractionBehaviours are spawned without a material explicitly assigned. + /// + public InteractionMaterial DefaultInteractionMaterial { + get { + return _defaultInteractionMaterial; + } + set { + _defaultInteractionMaterial = value; + } + } + + /// + /// Gets or sets whether or not the Interaction Engine can modify object velocities when pushing. + /// + public bool ContactEnabled { + get { + return _contactEnabled; + } + set { + if (_contactEnabled != value) { + _contactEnabled = value; + + if (_handPool != null) { + if (_contactEnabled) { + _handPool.EnableGroup(_brushGroupName); + } else { + _handPool.DisableGroup(_brushGroupName); + } + } + + UpdateSceneInfo(); + } + } + } + + /// + /// Gets or sets whether or not the Interaction Engine can modify object positions by grasping. + /// + public bool GraspingEnabled { + get { + return _graspingEnabled; + } + set { + if (_graspingEnabled != value) { + _graspingEnabled = value; + UpdateSceneInfo(); + } + } + } + + /// + /// Depth before collision response becomes as if holding a sphere.. + /// + public float DepthUntilSphericalInside { + get { + return _depthUntilSphericalInside; + } + set { + _depthUntilSphericalInside = value; + UpdateSceneInfo(); + } + } + + /// + /// Gets the layer that interaction objects should be on by default. + /// + public int InteractionLayer { + get { + return _interactionLayer; + } + set { + _interactionLayer = value; + } + } + + /// + /// Gets the layer that interaction objects should be on when they become grasped. + /// + public int InteractionNoClipLayer { + get { + return _interactionNoClipLayer; + } + set { + _interactionNoClipLayer = value; + } + } + + /// + /// Gets the layer that interaction brushes should be on normally. + /// + public int InteractionBrushLayer { + get { + return _brushLayer; + } + set { + _brushLayer = value; + } + } + + /// + /// Gets or sets the max activation depth. + /// + public int MaxActivationDepth { + get { + return _maxActivationDepth; + } + set { + _maxActivationDepth = value; + _activityManager.MaxDepth = value; + } + } + + /// + /// Enables the display of proximity information from the library. + /// + public bool ShowDebugLines { + get { + return _showDebugLines; + } + set { + _showDebugLines = value; + applyDebugSettings(); + } + } + + /// + /// Enables the display of debug text from the library. + /// + public bool ShowDebugOutput { + get { + return _showDebugOutput; + } + set { + _showDebugOutput = value; + applyDebugSettings(); + } + } + + /// Force an update of the internal scene info. This should be called if gravity has changed. + /// + public void UpdateSceneInfo() { + if (!_hasSceneBeenCreated) { + return; // UpdateSceneInfo is a side effect of a lot of changes. + } + + INTERACTION_SCENE_INFO info = getSceneInfo(); + + if (_graspingEnabled && !_enableGraspingLast) { + using (LdatLoader.LoadLdat(ref info, _ldatPath)) { + InteractionC.UpdateSceneInfo(ref _scene, ref info); + } + } else { + InteractionC.UpdateSceneInfo(ref _scene, ref info); + } + _enableGraspingLast = _graspingEnabled; + + _cachedSimulationScale = _leapProvider.transform.lossyScale.x; + _activityManager.OverlapRadius = _activationRadius * _cachedSimulationScale; + } + + /// + /// Tries to find an InteractionObject that is currently being grasped by a Hand with + /// the given ID. + /// + public bool TryGetGraspedObject(int handId, out IInteractionBehaviour graspedObject) { + for (int i = 0; i < _graspedBehaviours.Count; i++) { + var iObj = _graspedBehaviours[i]; + if (iObj.IsBeingGraspedByHand(handId)) { + graspedObject = iObj; + return true; + } + } + + graspedObject = null; + return false; + } + + /// + /// Forces the given object to be released by any hands currently holding it. Will return true + /// only if there was at least one hand holding the object. + /// + public bool ReleaseObject(IInteractionBehaviour graspedObject) { + if (!_graspedBehaviours.Remove(graspedObject)) { + return false; + } + + foreach (var interactionHand in _idToInteractionHand.Values) { + if (interactionHand.graspedObject == graspedObject) { + if (interactionHand.isUntracked) { + interactionHand.MarkTimeout(); + } else { + if (_graspingEnabled) { + INTERACTION_HAND_RESULT result = new INTERACTION_HAND_RESULT(); + result.classification = ManipulatorMode.Contact; + result.handFlags = HandResultFlags.ManipulatorMode; + result.instanceHandle = new INTERACTION_SHAPE_INSTANCE_HANDLE(); + InteractionC.OverrideHandResult(ref _scene, (uint)interactionHand.hand.Id, ref result); + } + interactionHand.ReleaseObject(); + } + } + } + + return true; + } + + /// + /// Forces a hand with the given id to release an object if it is holding it. Will return true + /// only if a hand with the given id releases an object it was holding. + /// + public bool ReleaseHand(int handId) { + InteractionHand interactionHand; + if (!_idToInteractionHand.TryGetValue(handId, out interactionHand)) { + return false; + } + + if (interactionHand.graspedObject == null) { + return false; + } + + if (interactionHand.graspedObject.GraspingHandCount == 1) { + _graspedBehaviours.Remove(interactionHand.graspedObject); + } + + interactionHand.ReleaseObject(); + return true; + } + + /// + /// Forces a hand to grasp the given interaction behaviour. The grasp will only be terminated when + /// the hand either times out or the user calls ReleaseHand. + /// + /// + public void GraspWithHand(Hand hand, IInteractionBehaviour interactionBehaviour) { + if (!_activityManager.IsRegistered(interactionBehaviour)) { + throw new InvalidOperationException("Cannot grasp " + interactionBehaviour + " because it is not registered with this manager."); + } + + InteractionHand interactionHand; + if (!_idToInteractionHand.TryGetValue(hand.Id, out interactionHand)) { + throw new InvalidOperationException("Hand with id " + hand.Id + " is not registered with this manager."); + } + + if (interactionHand.graspedObject != null) { + throw new InvalidOperationException("Cannot grasp with hand " + hand.Id + " because that hand is already grasping " + interactionHand.graspedObject); + } + + //Ensure behaviour is active already + _activityManager.Activate(interactionBehaviour); + + if (!interactionBehaviour.IsBeingGrasped) { + _graspedBehaviours.Add(interactionBehaviour); + } + + interactionHand.GraspObject(interactionBehaviour, isUserGrasp: true); + } + + /// + /// Registers an InteractionObject with this manager, which automatically adds the objects + /// representation into the internal interaction scene. If the manager is disabled, + /// the registration will still succeed and the object will be added to the internal scene + /// when the manager is next enabled. + /// + /// Trying to register a behaviour that is already registered is safe and is a no-op. + /// + public void RegisterInteractionBehaviour(IInteractionBehaviour interactionBehaviour) { + _activityManager.Register(interactionBehaviour); + } + + /// + /// Unregisters an InteractionObject from this manager. This removes it from the internal + /// scene and prevents any further interaction. + /// + /// Trying to unregister a behaviour that is not registered is safe and is a no-op. + /// + public void UnregisterInteractionBehaviour(IInteractionBehaviour interactionBehaviour) { + if (_graspedBehaviours.Remove(interactionBehaviour)) { + foreach (var interactionHand in _idToInteractionHand.Values) { + if (interactionHand.graspedObject == interactionBehaviour) { + try { + if (interactionHand.isUntracked) { + interactionHand.MarkTimeout(); + } else { + interactionHand.ReleaseObject(); + } + } catch (Exception e) { + //Only log to console + //We want to continue so we can destroy the shape and dispatch OnUnregister + Debug.LogException(e); + } + break; + } + } + } + + _activityManager.Unregister(interactionBehaviour); + } + + public void EnsureActive(IInteractionBehaviour interactionBehaviour) { + if (!_activityManager.IsActive(interactionBehaviour)) { + _activityManager.Activate(interactionBehaviour); + } + } + + #endregion + + #region UNITY CALLBACKS + protected virtual void Reset() { + if (_leapProvider == null) { + _leapProvider = FindObjectOfType(); + } + } + + protected virtual void OnValidate() { + if (Application.isPlaying && _hasSceneBeenCreated) { + //Allow the debug lines to be toggled while the scene is playing + applyDebugSettings(); + //Allow scene info to be updated while the scene is playing + UpdateSceneInfo(); + } + + if (!Application.isPlaying && _autoGenerateLayers) { + autoGenerateLayers(); + } + + _activationRadius = Mathf.Max(0, _activationRadius); + _maxActivationDepth = Mathf.Max(1, _maxActivationDepth); + + if (_activityManager != null) { + _activityManager.OverlapRadius = _activationRadius; + _activityManager.MaxDepth = _maxActivationDepth; + } + } + + protected virtual void Awake() { + if (_autoGenerateLayers) { + autoGenerateLayers(); + autoSetupCollisionLayers(); + } + } + + protected virtual void OnEnable() { + if (_leapProvider == null) { + enabled = false; + Debug.LogError("Could not enable Interaction Manager because no Leap Provider was specified."); + return; + } + + Assert.IsFalse(_hasSceneBeenCreated, "Scene should not have been created yet"); + + createScene(); + applyDebugSettings(); + + _shapeDescriptionPool = new ShapeDescriptionPool(_scene); + + Assert.AreEqual(_instanceHandleToBehaviour.Count, 0, "There should not be any instances before the creation step."); + + _cachedSimulationScale = _leapProvider.transform.lossyScale.x; + + _activityManager.BrushLayer = InteractionBrushLayer; + _activityManager.OverlapRadius = _activationRadius * _cachedSimulationScale; + _activityManager.MaxDepth = _maxActivationDepth; + _activityManager.OnActivate += createInteractionShape; + _activityManager.OnDeactivate += destroyInteractionShape; + + if (_handPool != null) { + if (_contactEnabled) { + _handPool.EnableGroup(_brushGroupName); + } else { + _handPool.DisableGroup(_brushGroupName); + } + } + } + + protected virtual void OnDisable() { + for (int i = _graspedBehaviours.Count; i-- != 0;) { + ReleaseObject(_graspedBehaviours[i]); + } + + _activityManager.UnregisterMisbehavingObjects(); + + _idToInteractionHand.Clear(); + _graspedBehaviours.Clear(); + + _activityManager.DeactivateAll(); + _activityManager.OnActivate -= createInteractionShape; + _activityManager.OnDeactivate -= destroyInteractionShape; + + Assert.AreEqual(_instanceHandleToBehaviour.Count, 0, "All instances should have been destroyed."); + + if (_shapeDescriptionPool != null) { + _shapeDescriptionPool.RemoveAllShapes(); + _shapeDescriptionPool = null; + } + + if (_hasSceneBeenCreated) { + destroyScene(); + } + } + + protected virtual void FixedUpdate() { + Frame frame = _leapProvider.CurrentFixedFrame; + + if (OnPrePhysicalUpdate != null) { + OnPrePhysicalUpdate(); + } + + simulateFrame(frame); + + if (OnPostPhysicalUpdate != null) { + OnPostPhysicalUpdate(); + } + + if (_showDebugLines) { + RuntimeGizmoDrawer gizmoDrawer; + if (RuntimeGizmoManager.TryGetGizmoDrawer(gameObject, out gizmoDrawer)) { + InteractionC.GetDebugLines(ref _scene, _debugLines); + for (int i = 0; i < _debugLines.Count; i++) { + var line = _debugLines[i]; + gizmoDrawer.color = line.color.ToUnityColor(); + gizmoDrawer.DrawLine(line.start.ToVector3(), line.end.ToVector3()); + } + } + } + + if (_showDebugOutput) { + InteractionC.GetDebugStrings(ref _scene, _debugOutput); + } + } + + protected virtual void LateUpdate() { + Frame frame = _leapProvider.CurrentFrame; + + dispatchOnHandsHoldingAll(frame, isPhysics: false); + + _activityManager.UnregisterMisbehavingObjects(); + + if (OnGraphicalUpdate != null) { + OnGraphicalUpdate(); + } + + if (_showDebugOutput && _debugTextView != null) { + string text = ""; + for (int i = 0; i < _debugOutput.Count; i++) { + text += _debugOutput[i]; + if (i != _debugOutput.Count - 1) { + text += "\n"; + } + } + _debugTextView.text = text; + } + + if (_automaticValidation) { + Validate(); + } + } + + protected virtual void OnGUI() { + if (_showDebugOutput) { + for (int i = 0; i < _debugOutput.Count; i++) { + GUILayout.Label(_debugOutput[i]); + } + } + } + #endregion + + #region INTERNAL METHODS + + protected void autoGenerateLayers() { + _interactionLayer = -1; + _interactionNoClipLayer = -1; + _brushLayer = -1; + for (int i = 8; i < 32; i++) { + string layerName = LayerMask.LayerToName(i); + if (string.IsNullOrEmpty(layerName)) { + if (_interactionLayer == -1) { + _interactionLayer = i; + } else if (_interactionNoClipLayer == -1) { + _interactionNoClipLayer = i; + } else if (_brushLayer == -1) { + _brushLayer = i; + break; + } + } + } + + if (_interactionLayer == -1 || _interactionNoClipLayer == -1 || _brushLayer == -1) { + if (Application.isPlaying) { + enabled = false; + } + Debug.LogError("InteractionManager Could not find enough free layers for auto-setup, manual setup required."); + _autoGenerateLayers = false; + return; + } + } + + private void autoSetupCollisionLayers() { + for (int i = 0; i < 32; i++) { + // Copy ignore settings from template layer + bool shouldIgnore = Physics.GetIgnoreLayerCollision(_templateLayer, i); + Physics.IgnoreLayerCollision(_interactionLayer, i, shouldIgnore); + Physics.IgnoreLayerCollision(_interactionNoClipLayer, i, shouldIgnore); + + // Set brush layer to collide with nothing + Physics.IgnoreLayerCollision(_brushLayer, i, true); + } + + //After copy and set we enable the interaction between the brushes and interaction objects + Physics.IgnoreLayerCollision(_brushLayer, _interactionLayer, false); + } + + protected virtual void simulateFrame(Frame frame) { + _activityManager.UpdateState(frame); + + var active = _activityManager.ActiveBehaviours; + + for (int i = 0; i < active.Count; i++) { + active[i].NotifyPreSolve(); + } + + dispatchOnHandsHoldingAll(frame, isPhysics: true); + + updateInteractionRepresentations(); + + updateTracking(frame); + + simulateInteraction(); + + updateInteractionStateChanges(frame); + + dispatchSimulationResults(); + + for (int i = 0; i < active.Count; i++) { + active[i].NotifyPostSolve(); + } + } + + protected virtual void applyDebugSettings() { + InteractionC.EnableDebugFlags(ref _scene, (uint)DebugFlags); + } + + protected virtual void updateInteractionRepresentations() { + var active = _activityManager.ActiveBehaviours; + for (int i = 0; i < active.Count; i++) { + IInteractionBehaviour interactionBehaviour = active[i]; + try { + INTERACTION_SHAPE_INSTANCE_HANDLE shapeInstanceHandle = interactionBehaviour.ShapeInstanceHandle; + + INTERACTION_UPDATE_SHAPE_INFO updateInfo; + INTERACTION_TRANSFORM updateTransform; + interactionBehaviour.GetInteractionShapeUpdateInfo(out updateInfo, out updateTransform); + + InteractionC.UpdateShapeInstance(ref _scene, ref updateTransform, ref updateInfo, ref shapeInstanceHandle); + } catch (Exception e) { + _activityManager.NotifyMisbehaving(interactionBehaviour); + Debug.LogException(e); + } + } + } + + protected virtual void dispatchOnHandsHoldingAll(Frame frame, bool isPhysics) { + if (frame == null) return; // @Hyro + + var hands = frame.Hands; + //Loop through the currently grasped objects to dispatch their OnHandsHold callback + for (int i = 0; i < _graspedBehaviours.Count; i++) { + dispatchOnHandsHolding(hands, _graspedBehaviours[i], isPhysics); + } + } + + protected virtual void dispatchOnHandsHolding(List hands, IInteractionBehaviour interactionBehaviour, bool isPhysics) { + for (int j = 0; j < hands.Count; j++) { + var hand = hands[j]; + InteractionHand interactionHand; + if (_idToInteractionHand.TryGetValue(hand.Id, out interactionHand)) { + if (interactionHand.graspedObject == interactionBehaviour) { + _holdingHands.Add(hand); + } + } + } + + try { + if (isPhysics) { + interactionBehaviour.NotifyHandsHoldPhysics(_holdingHands); + } else { + interactionBehaviour.NotifyHandsHoldGraphics(_holdingHands); + } + } catch (Exception e) { + _activityManager.NotifyMisbehaving(interactionBehaviour); + Debug.LogException(e); + } + + _holdingHands.Clear(); + } + + protected virtual void updateTracking(Frame frame) { + int handCount = frame.Hands.Count; + IntPtr ptr = HandArrayBuilder.CreateHandArray(frame); + InteractionC.UpdateHands(ref _scene, (uint)handCount, ptr); + StructAllocator.CleanupAllocations(); + } + + protected virtual void simulateInteraction() { + var _controllerTransform = new INTERACTION_TRANSFORM(); + _controllerTransform.position = _leapProvider.transform.position.ToCVector(); + _controllerTransform.rotation = _leapProvider.transform.rotation.ToCQuaternion(); + _controllerTransform.wallTime = Time.fixedTime; + + InteractionC.UpdateController(ref _scene, ref _controllerTransform); + } + + protected virtual void updateInteractionStateChanges(Frame frame) { + var hands = frame.Hands; + + INTERACTION_HAND_RESULT handResult = new INTERACTION_HAND_RESULT(); + + //First loop through all the hands and get their classifications from the engine + for (int i = 0; i < hands.Count; i++) { + Hand hand = hands[i]; + + bool handResultForced = false; + + //Get the InteractionHand associated with this hand id + InteractionHand interactionHand; + if (!_idToInteractionHand.TryGetValue(hand.Id, out interactionHand)) { + + //First we see if there is an untracked interactionHand that can be re-connected using this one + InteractionHand untrackedInteractionHand = null; + foreach (var pair in _idToInteractionHand) { + //If the old ieHand is untracked, and the handedness matches, we re-connect it + if (pair.Value.isUntracked && pair.Value.hand.IsLeft == hand.IsLeft) { + untrackedInteractionHand = pair.Value; + break; + } + } + + if (untrackedInteractionHand != null) { + //If we found an untrackedIeHand, use it! + interactionHand = untrackedInteractionHand; + //Remove the old id from the mapping + _idToInteractionHand.Remove(untrackedInteractionHand.hand.Id); + _idToInteractionHand[hand.Id] = interactionHand; + + try { + //This also dispatched InteractionObject.OnHandRegainedTracking() + interactionHand.RegainTracking(hand); + + if (interactionHand.graspedObject == null) { + continue; + } + + // NotifyHandRegainedTracking() did not throw, continue on to NotifyHandsHoldPhysics(). + dispatchOnHandsHolding(hands, interactionHand.graspedObject, isPhysics: true); + } catch (Exception e) { + _activityManager.NotifyMisbehaving(interactionHand.graspedObject); + Debug.LogException(e); + continue; + } + + //Override the existing classification to force the hand to grab the old object + handResultForced = true; + handResult.classification = ManipulatorMode.Grasp; + handResult.handFlags = HandResultFlags.ManipulatorMode; + handResult.instanceHandle = interactionHand.graspedObject.ShapeInstanceHandle; + + if (_graspingEnabled) { + InteractionC.OverrideHandResult(ref _scene, (uint)hand.Id, ref handResult); + } + } else { + //Otherwise just create a new one + interactionHand = new InteractionHand(hand); + _idToInteractionHand[hand.Id] = interactionHand; + } + } + + if (!handResultForced) { + handResult = getHandResults(interactionHand); + } + + interactionHand.UpdateHand(hand); + + if (!interactionHand.isUserGrasp) { + switch (handResult.classification) { + case ManipulatorMode.Grasp: + { + IInteractionBehaviour interactionBehaviour; + if (_instanceHandleToBehaviour.TryGetValue(handResult.instanceHandle, out interactionBehaviour)) { + if (interactionHand.graspedObject == null) { + if (!interactionBehaviour.IsBeingGrasped) { + _graspedBehaviours.Add(interactionBehaviour); + } + + try { + interactionHand.GraspObject(interactionBehaviour, isUserGrasp: false); + + //the grasp callback might have caused the object to become ungrasped + //the component might have also destroyed itself! + if (interactionHand.graspedObject == interactionBehaviour && interactionBehaviour != null) { + dispatchOnHandsHolding(hands, interactionBehaviour, isPhysics: true); + } + } catch (Exception e) { + _activityManager.NotifyMisbehaving(interactionBehaviour); + Debug.LogException(e); + continue; + } + } + } else { + Debug.LogError("Recieved a hand result with an unkown handle " + handResult.instanceHandle.handle); + } + break; + } + case ManipulatorMode.Contact: + { + if (interactionHand.graspedObject != null) { + if (interactionHand.graspedObject.GraspingHandCount == 1) { + _graspedBehaviours.Remove(interactionHand.graspedObject); + } + + try { + interactionHand.ReleaseObject(); + } catch (Exception e) { + _activityManager.NotifyMisbehaving(interactionHand.graspedObject); + Debug.LogException(e); + continue; + } + } + break; + } + default: + throw new InvalidOperationException("Unexpected classification " + handResult.classification); + } + } + } + + //Loop through all ieHands to check for timeouts and loss of tracking + foreach (var pair in _idToInteractionHand) { + var id = pair.Key; + var ieHand = pair.Value; + + float handAge = Time.unscaledTime - ieHand.lastTimeUpdated; + //Check to see if the hand is at least 1 frame old + //We assume it has become untracked if this is the case + if (handAge > 0) { + //If the hand isn't grasping anything, just remove it + if (ieHand.graspedObject == null) { + _handIdsToRemove.Add(id); + continue; + } + + //If is isn't already marked as untracked, mark it as untracked + if (!ieHand.isUntracked) { + try { + //This also dispatches InteractionObject.OnHandLostTracking() + ieHand.MarkUntracked(); + } catch (Exception e) { + _activityManager.NotifyMisbehaving(ieHand.graspedObject); + Debug.LogException(e); + } + } + + //If the age is longer than the timeout, we also remove it from the list + if (handAge >= ieHand.maxSuspensionTime) { + _handIdsToRemove.Add(id); + + try { + if (ieHand.graspedObject.GraspingHandCount == 1) { + _graspedBehaviours.Remove(ieHand.graspedObject); + } + + //This also dispatched InteractionObject.OnHandTimeout() + ieHand.MarkTimeout(); + } catch (Exception e) { + _activityManager.NotifyMisbehaving(ieHand.graspedObject); + Debug.LogException(e); + } + } + } + } + + //Loop through the stale ids and remove them from the map + for (int i = 0; i < _handIdsToRemove.Count; i++) { + _idToInteractionHand.Remove(_handIdsToRemove[i]); + } + _handIdsToRemove.Clear(); + } + + protected virtual INTERACTION_HAND_RESULT getHandResults(InteractionHand hand) { + if (!_graspingEnabled) { + INTERACTION_HAND_RESULT result = new INTERACTION_HAND_RESULT(); + result.classification = ManipulatorMode.Contact; + result.handFlags = HandResultFlags.ManipulatorMode; + result.instanceHandle = new INTERACTION_SHAPE_INSTANCE_HANDLE(); + return result; + } + + INTERACTION_HAND_RESULT handResult; + InteractionC.GetHandResult(ref _scene, + (uint)hand.hand.Id, + out handResult); + return handResult; + } + + protected virtual void dispatchSimulationResults() { + InteractionC.GetShapeInstanceResults(ref _scene, _resultList); + + for (int i = 0; i < _resultList.Count; ++i) { + INTERACTION_SHAPE_INSTANCE_RESULTS result = _resultList[i]; + + //Behaviour might have already been unregistered during an earlier callback for this simulation step + IInteractionBehaviour interactionBehaviour; + if (_instanceHandleToBehaviour.TryGetValue(result.handle, out interactionBehaviour)) { + try { + // ShapeInstanceResultFlags.None may be returned if requested when hands are not touching. + interactionBehaviour.NotifyRecievedSimulationResults(result); + } catch (Exception e) { + _activityManager.NotifyMisbehaving(interactionBehaviour); + Debug.LogException(e); + } + } + } + } + + protected virtual void createInteractionShape(IInteractionBehaviour interactionBehaviour) { + INTERACTION_SHAPE_DESCRIPTION_HANDLE descriptionHandle = interactionBehaviour.ShapeDescriptionHandle; + INTERACTION_SHAPE_INSTANCE_HANDLE instanceHandle = new INTERACTION_SHAPE_INSTANCE_HANDLE(); + + INTERACTION_CREATE_SHAPE_INFO createInfo; + INTERACTION_TRANSFORM createTransform; + interactionBehaviour.GetInteractionShapeCreationInfo(out createInfo, out createTransform); + + InteractionC.CreateShapeInstance(ref _scene, ref descriptionHandle, ref createTransform, ref createInfo, out instanceHandle); + + _instanceHandleToBehaviour[instanceHandle] = interactionBehaviour; + + interactionBehaviour.NotifyInteractionShapeCreated(instanceHandle); + } + + protected virtual void destroyInteractionShape(IInteractionBehaviour interactionBehaviour) { + INTERACTION_SHAPE_INSTANCE_HANDLE instanceHandle = interactionBehaviour.ShapeInstanceHandle; + + _instanceHandleToBehaviour.Remove(instanceHandle); + + InteractionC.DestroyShapeInstance(ref _scene, ref instanceHandle); + + interactionBehaviour.NotifyInteractionShapeDestroyed(); + } + + protected virtual void createScene() { + _scene.pScene = (IntPtr)0; + + UInt32 libraryVersion = InteractionC.GetLibraryVersion(); + UInt32 expectedVersion = InteractionC.GetExpectedVersion(); + if (libraryVersion != expectedVersion) { + Debug.LogError("Leap Interaction dll version expected: " + expectedVersion + " got version: " + libraryVersion); + throw new Exception("Leap Interaction library version wrong"); + } + + InteractionC.CreateScene(ref _scene); + _hasSceneBeenCreated = true; + + UpdateSceneInfo(); + } + + protected virtual void destroyScene() { + InteractionC.DestroyScene(ref _scene); + _hasSceneBeenCreated = false; + } + + protected virtual INTERACTION_SCENE_INFO getSceneInfo() { + INTERACTION_SCENE_INFO info = new INTERACTION_SCENE_INFO(); + info.sceneFlags = SceneInfoFlags.None; + + if (Physics.gravity.sqrMagnitude != 0.0f) { + info.sceneFlags |= SceneInfoFlags.HasGravity; + info.gravity = Physics.gravity.ToCVector(); + } + + if (_depthUntilSphericalInside > 0.0f) { + info.sceneFlags |= SceneInfoFlags.SphericalInside; + info.depthUntilSphericalInside = _depthUntilSphericalInside; + } + + if (_contactEnabled) { + info.sceneFlags |= SceneInfoFlags.ContactEnabled; + } + + // _enableGraspingLast gaurds against expensive file IO. Only load the ldat + // data when grasping is being enabled. + if (_graspingEnabled) { + info.sceneFlags |= SceneInfoFlags.GraspEnabled; + } + + return info; + } + + //A persistant structure for storing useful data about a hand as it interacts with objects + //TODO: Investigate pooling? + protected partial class InteractionHand { + public Hand hand { get; protected set; } + public float lastTimeUpdated { get; protected set; } + public float maxSuspensionTime { get; protected set; } + public IInteractionBehaviour graspedObject { get; protected set; } + public bool isUntracked { get; protected set; } + public bool isUserGrasp { get; protected set; } + + public InteractionHand(Hand hand) { + this.hand = new Hand().CopyFrom(hand); + lastTimeUpdated = Time.unscaledTime; + graspedObject = null; + } + + public void UpdateHand(Hand hand) { + this.hand.CopyFrom(hand); + lastTimeUpdated = Time.unscaledTime; + } + + public void GraspObject(IInteractionBehaviour obj, bool isUserGrasp) { + this.isUserGrasp = isUserGrasp; + graspedObject = obj; + graspedObject.NotifyHandGrasped(hand); + } + + public void ReleaseObject() { + graspedObject.NotifyHandReleased(hand); + graspedObject = null; + isUntracked = false; + isUserGrasp = false; + } + + public void MarkUntracked() { + isUntracked = true; + float outTime; + graspedObject.NotifyHandLostTracking(hand, out outTime); + maxSuspensionTime = outTime; + } + + public void MarkTimeout() { + graspedObject.NotifyHandTimeout(hand); + graspedObject = null; + isUntracked = true; + isUserGrasp = false; + hand = null; + } + + public void RegainTracking(Hand newHand) { + int oldId = hand.Id; + UpdateHand(newHand); + + isUntracked = false; + graspedObject.NotifyHandRegainedTracking(newHand, oldId); + } + } + #endregion + } } diff --git a/Assets/Prefabs/Cube.prefab b/Assets/Prefabs/Cube.prefab index e3526ab5125d0e0b251c0a269249b82cca124e98..eb62e91a0bfbb76ab3e05f840dd83d998b01bee9 100644 GIT binary patch delta 91 zcmZ3HxFT_bth~UY7jJuxd@+*q+LhKVar}nBW?lKk-0X999AtQDI%D#6trmfUI~UG~ ssGjG$P5$)4{tDHVo3phG8DT0mKh{~v$jZRT$iOgJP}gSjS-sng0Huy6n*aa+ delta 93 zcmZ3HxFT_bth_)#?dlr$3s-$VRmaYo!uC;Sv#$JNZuUID)LiXzB_}Fv&ekqugsIs4SZ5_8D(); - _rigidbody = GetComponent(); - _collider = GetComponent(); + //_collider = GetComponentInChildren(); _networkIdentity = GetComponent(); - } + _interactionBehaviour = GetComponent(); + } - static void SetRigidbodyEnabled(Rigidbody r, bool enabled) { - r.isKinematic = !enabled; - r.useGravity = enabled; + void SetRigidbodyEnabled(bool enabled) { + _interactionBehaviour.isKinematic = !enabled; + _interactionBehaviour.useGravity = enabled; } public override void OnStartClient() { - SetRigidbodyEnabled(_rigidbody, false); + InteractionManager interactionManager = FindObjectOfType(); + GetComponent().Manager = interactionManager; + + //SetRigidbodyEnabled(false); } // If we have the local authority, disable trigering and enable physics interactions public override void OnStartAuthority() { - InteractionManager interactionManager = FindObjectOfType(); - GetComponent().Manager = interactionManager; - - _collider.isTrigger = false; - SetRigidbodyEnabled(_rigidbody, true); + //_collider.isTrigger = false; + SetRigidbodyEnabled(true); } // If we haven't the local authority, disable physics interactions and enable trigering public override void OnStopAuthority() { - _collider.isTrigger = true; - SetRigidbodyEnabled(_rigidbody, false); + //_collider.isTrigger = true; + SetRigidbodyEnabled(false); } - // On each collision, the local player is changed - void OnTriggerEnter(Collider collider) { + public void OnGraspBegin() { if (hasAuthority) return; + CubeSpawner cubeSpawner = FindObjectOfType() // TODO cache + .GetComponentInParent(); + if (cubeSpawner) cubeSpawner.SetAuthority(_networkIdentity); + } - // remove the authority from the previous owner - // CmdRemoveAuthority(_networkIdentity); + public void OnGraspEnd(Hand lastHand) { + //if (!hasAuthority || isServer) return; - // assign the authority to ourself - // CmdAssignAuthority(_networkIdentity); + //if (GetComponent().IsBeingGrasped) // TODO cache + // return; - // HACK - // we haven't curently the authority on the object, so we can't send command to server - // remove the authority from the previous owner - // assign the authority to ourself - // CubeSpawner cubeSpawner = collider.GetComponentInParent(); - if (!collider.gameObject.name.Contains("BrushHand")) return; + //// Transfert rigidbody informations (velocity, angularVelocity) to server + //Rigidbody rigidbody = GetComponent(); // TODO cache + // CmdTransfertRigidbodyState(rigidbody.velocity, rigidbody.angularVelocity); + + //CubeSpawner cubeSpawner = FindObjectOfType() // TODO cache + //.GetComponentInParent(); + //if (cubeSpawner) cubeSpawner.RemoveAuthority(_networkIdentity); + } + + [Command] + void CmdTransfertRigidbodyState(Vector3 velocity, Vector3 angularVelocity) { + GetComponent().velocity = velocity; + GetComponent().angularVelocity= angularVelocity; + } - CubeSpawner cubeSpawner = FindObjectOfType() // TODO cache - .GetComponentInParent(); - if (cubeSpawner) cubeSpawner.SetAuthority(GetComponent()); - } void Update() { if (hasAuthority) { diff --git a/Assets/Scripts/NetworkCube.cs.meta b/Assets/Scripts/NetworkCube.cs.meta index fb179f8..87031c7 100644 --- a/Assets/Scripts/NetworkCube.cs.meta +++ b/Assets/Scripts/NetworkCube.cs.meta @@ -1,11 +1,11 @@ fileFormatVersion: 2 guid: 496f0ce23cc885344abcae22466ec784 -timeCreated: 1486908628 +timeCreated: 1486937740 licenseType: Free MonoImporter: serializedVersion: 2 defaultReferences: [] - executionOrder: 0 + executionOrder: 100 icon: {instanceID: 0} userData: assetBundleName: diff --git a/Assets/Scripts/NetworkCubeInteractionBehaviour.cs b/Assets/Scripts/NetworkCubeInteractionBehaviour.cs new file mode 100644 index 0000000..13d1c52 --- /dev/null +++ b/Assets/Scripts/NetworkCubeInteractionBehaviour.cs @@ -0,0 +1,24 @@ +using Leap; +using Leap.Unity.Interaction; +using UnityEngine; + +[RequireComponent(typeof(NetworkCube))] +public class NetworkCubeInteractionBehaviour : InteractionBehaviour { + + NetworkCube _networkCube; + + protected override void Awake() { + base.Awake(); + _networkCube = GetComponent(); + } + + protected override void OnGraspBegin() { + base.OnGraspBegin(); + _networkCube.OnGraspBegin(); + } + + protected override void OnGraspEnd(Hand lastHand) { + base.OnGraspEnd(lastHand); + _networkCube.OnGraspEnd(lastHand); + } +} diff --git a/Assets/Scripts/NetworkCubeInteractionBehaviour.cs.meta b/Assets/Scripts/NetworkCubeInteractionBehaviour.cs.meta new file mode 100644 index 0000000..26b92d5 --- /dev/null +++ b/Assets/Scripts/NetworkCubeInteractionBehaviour.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1c9b1a8985b7e9d46bf1bc1af887529a +timeCreated: 1487359943 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 89ad6b26fbf38635aad7d5372bc64c2b9000e299..caa0891c47c8706d889c19d186fe2f9ded443432 100644 GIT binary patch delta 10708 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 Date: Sat, 18 Feb 2017 23:47:06 +0100 Subject: [PATCH 4/7] Fix #2 Show cylinder on all clients --- Assets/Prefabs/Player 1.prefab | Bin 90148 -> 91308 bytes Assets/Scenes/Main.unity | Bin 26976 -> 26976 bytes Assets/Scripts/CustomHand.cs | 1 - Assets/Scripts/EnableOnLocalPlayer.cs | 5 + Assets/Scripts/LinkHandSpheres.cs | 169 +++++++++++++++++++++++++ Assets/Scripts/LinkHandSpheres.cs.meta | 12 ++ 6 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 Assets/Scripts/LinkHandSpheres.cs create mode 100644 Assets/Scripts/LinkHandSpheres.cs.meta diff --git a/Assets/Prefabs/Player 1.prefab b/Assets/Prefabs/Player 1.prefab index 62a2e7100e39f2d5b389b6541fbc217dadb3b0f7..bcce2c979c87d355e45a9cb142bb9b7edb2c8ce5 100644 GIT binary patch delta 9697 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 NB89c_dm>5V{{g8)%A^1Q delta 9387 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 P0!Tkd2-y51F@qfdvvpBS delta 195 zcmaEGiSfZD#t9P425H6{rOyU&GAw&y_ek@fozv!zLFF8iJK{7ZXGCjER*2P@ToJD^ zc>|EI5w9@`$c%{5nCt-*z5x_^090}yHem7$Ab$st9RQSH0K^}F_(6ikjUjQ`k0+78TF<^28P%Z(e?gY?G P4xreC1dYu<5;NEVuxn2$ diff --git a/Assets/Scripts/CustomHand.cs b/Assets/Scripts/CustomHand.cs index 467f589..c889692 100644 --- a/Assets/Scripts/CustomHand.cs +++ b/Assets/Scripts/CustomHand.cs @@ -121,7 +121,6 @@ public override void InitHand() { BuildSpheres(); BuildCylinders(); updateArmVisibility(); - _hasGeneratedMeshes = false; } diff --git a/Assets/Scripts/EnableOnLocalPlayer.cs b/Assets/Scripts/EnableOnLocalPlayer.cs index cee29e6..c7903ad 100644 --- a/Assets/Scripts/EnableOnLocalPlayer.cs +++ b/Assets/Scripts/EnableOnLocalPlayer.cs @@ -9,6 +9,8 @@ public class EnableOnLocalPlayer : NetworkBehaviour { Camera playerCam; [SerializeField] GameObject[] rigidHands; + [SerializeField] + LinkHandSpheres[] linkHandSpheres; public override void OnStartLocalPlayer() { leapController.SetActive(true); @@ -16,5 +18,8 @@ public override void OnStartLocalPlayer() { foreach(var rigidHand in rigidHands) { rigidHand.SetActive(true); } + foreach (var link in linkHandSpheres) { + link.enabled = false; + } } } diff --git a/Assets/Scripts/LinkHandSpheres.cs b/Assets/Scripts/LinkHandSpheres.cs new file mode 100644 index 0000000..d01a020 --- /dev/null +++ b/Assets/Scripts/LinkHandSpheres.cs @@ -0,0 +1,169 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using UnityEngine; +using UnityEngine.Networking; + +public class LinkHandSpheres : NetworkBehaviour { + + private const float CYLINDER_RADIUS = 0.006f; + [SerializeField] + private int _cylinderResolution = 12; + + private Transform[] _jointSpheres; + private List _sphereATransforms; + private List _sphereBTransforms; + private List _cylinderTransforms; + private bool _hasGeneratedMeshes; + private Transform mockThumbJointSphere; + private Transform palmPositionSphere; + + private Transform wristPositionSphere; + + // Use this for initialization + void Start () { + _jointSpheres = new Transform[4 * 5]; + mockThumbJointSphere = transform.FindChild("MockJoint"); + for (int i = 0; i < _jointSpheres.Length; ++i) { + _jointSpheres[i] = transform.GetChild(i); + } + _cylinderTransforms = new List(); + _sphereATransforms = new List(); + _sphereBTransforms = new List(); + _hasGeneratedMeshes = false; + BuildCylinders(); + } + + void Update() { + updateCylinders(); + } + + private void updateCylinders() { + for (int i = 0; i < _cylinderTransforms.Count; i++) { + Transform cylinder = _cylinderTransforms[i]; + Transform sphereA = _sphereATransforms[i]; + Transform sphereB = _sphereBTransforms[i]; + Vector3 delta = sphereA.position - sphereB.position; + + if (!_hasGeneratedMeshes) { + MeshFilter filter = cylinder.GetComponent(); + filter.sharedMesh = generateCylinderMesh(delta.magnitude / transform.lossyScale.x); + } + + cylinder.position = sphereA.position; + + if (delta.sqrMagnitude <= Mathf.Epsilon) { + //Two spheres are at the same location, no rotation will be found + continue; + } + + cylinder.LookAt(sphereB); + } + + _hasGeneratedMeshes = true; + } + + private int getFingerJointIndex(int fingerIndex, int jointIndex) { + return fingerIndex * 4 + jointIndex; + } + + private void BuildCylinders() { + + Transform[] fingerJoints = GetComponentsInChildren().Where(c => c.name == "Finger Joint").ToArray(); + int k = 0; + + //Create cylinders between finger joints + for (int i = 0; i < 5; i++) { + for (int j = 0; j < 3; j++) { + int keyA = getFingerJointIndex(i, j); + int keyB = getFingerJointIndex(i, j + 1); + + Transform sphereA = _jointSpheres[keyA]; + Transform sphereB = _jointSpheres[keyB]; + buildCylinder(sphereA, sphereB, fingerJoints[k++]); + //createCylinder("Finger Joint", sphereA, sphereB); + } + } + + Transform[] handJoints = GetComponentsInChildren().Where(c => c.name == "Hand Joints").ToArray(); + k = 0; + //Create cylinders between finger knuckles + for (int i = 0; i < 4; i++) { + int keyA = getFingerJointIndex(i, 0); + int keyB = getFingerJointIndex(i + 1, 0); + + Transform sphereA = _jointSpheres[keyA]; + Transform sphereB = _jointSpheres[keyB]; + buildCylinder(sphereA, sphereB, handJoints[k++]); + + //createCylinder("Hand Joints", sphereA, sphereB); + } + + //Create the rest of the hand + Transform thumbBase = _jointSpheres[0]; // 0 * 4 = THUMB_BASE_INDEX + Transform pinkyBase = _jointSpheres[16]; // 4 * 4 = PINKY_BASE_INDEX + buildCylinder(thumbBase, mockThumbJointSphere, transform.FindChild("Hand Bottom")); + buildCylinder(pinkyBase, mockThumbJointSphere, transform.FindChild("Hand Side")); + //createCylinder("Hand Bottom", thumbBase, mockThumbJointSphere); + //createCylinder("Hand Side", pinkyBase, mockThumbJointSphere); + + //createCylinder("ArmFront", armFrontLeft, armFrontRight, true); + //createCylinder("ArmBack", armBackLeft, armBackRight, true); + //createCylinder("ArmLeft", armFrontLeft, armBackLeft, true); + //createCylinder("ArmRight", armFrontRight, armBackRight, true); + } + + private void buildCylinder(Transform sphereA, Transform sphereB, Transform joint) { + _sphereATransforms.Add(sphereA); + _sphereBTransforms.Add(sphereB); + _cylinderTransforms.Add(joint); + + } + + private Mesh generateCylinderMesh(float length) { + Mesh mesh = new Mesh(); + mesh.name = "GeneratedCylinder"; + mesh.hideFlags = HideFlags.DontSave; + + List verts = new List(); + List colors = new List(); + List tris = new List(); + + Vector3 p0 = Vector3.zero; + Vector3 p1 = Vector3.forward * length; + for (int i = 0; i < _cylinderResolution; i++) { + float angle = (Mathf.PI * 2.0f * i) / _cylinderResolution; + float dx = CYLINDER_RADIUS * Mathf.Cos(angle); + float dy = CYLINDER_RADIUS * Mathf.Sin(angle); + + Vector3 spoke = new Vector3(dx, dy, 0); + + verts.Add((p0 + spoke) * transform.lossyScale.x); + verts.Add((p1 + spoke) * transform.lossyScale.x); + + colors.Add(Color.white); + colors.Add(Color.white); + + int triStart = verts.Count; + int triCap = _cylinderResolution * 2; + + tris.Add((triStart + 0) % triCap); + tris.Add((triStart + 2) % triCap); + tris.Add((triStart + 1) % triCap); + + tris.Add((triStart + 2) % triCap); + tris.Add((triStart + 3) % triCap); + tris.Add((triStart + 1) % triCap); + } + + mesh.SetVertices(verts); + mesh.SetIndices(tris.ToArray(), MeshTopology.Triangles, 0); + mesh.RecalculateBounds(); + mesh.RecalculateNormals(); + ; + mesh.UploadMeshData(true); + + return mesh; + } +} diff --git a/Assets/Scripts/LinkHandSpheres.cs.meta b/Assets/Scripts/LinkHandSpheres.cs.meta new file mode 100644 index 0000000..297a65d --- /dev/null +++ b/Assets/Scripts/LinkHandSpheres.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5c05dec50c3fede4285966a3321adc21 +timeCreated: 1487453920 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From b67cddc1170a24819eb9eda53e6d7bbfaf6ddf35 Mon Sep 17 00:00:00 2001 From: stephdim Date: Sun, 19 Feb 2017 14:42:28 +0100 Subject: [PATCH 5/7] Fix #1 Set movement threshold to 0 and Network send rate to 13 --- Assets/Prefabs/Player 1.prefab | Bin 91308 -> 91308 bytes Assets/Scenes/Main.unity | Bin 26976 -> 25296 bytes Assets/Scripts/NetworkSync.cs | 3 ++- 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Assets/Prefabs/Player 1.prefab b/Assets/Prefabs/Player 1.prefab index bcce2c979c87d355e45a9cb142bb9b7edb2c8ce5..aab200a9f5d5e18819584ed86f1555ea561c69b9 100644 GIT binary patch delta 2959 zcmZ`)4NO~A6n}6Ni=B4+<+JeY!oQavQ0Wxu!OR84i~cFvP^=E{gezf zm0`lD?R^dgRTsrU5LpIG);Nsfii=yjEej~(M6wY@t%Gc6rt{p_-n0+2LIg_ty^-@hi4G7IoGZMmcrwKSQD4h; zpX+_y|KvEJ5jh?DMWTpD#KKRvJ75&K3H**i@ee-hU(tZ^&da_T>D9@Wm$|IA_ z;pa~0zli}AoOWYed((#wm{V}W74O%X`W#>ymwiuER@vsia)1Z9T0HbYl#b4)u2o!e z!0K;gyXdOn#DY5xa7mmsaN~91O?e-LIYD(n5T=$1LNq!H>rRsPNGJHem7P(6ixln=Z;mO9dfLKLq%t5dXTeRlDUMi*0<+&I>D>p+}4F#$9*;@XuPta zrF&&ZVz(0pku&1~u_zroUfH(Bg9-X%yXe%6H+)_vG%GmG@bKwf*D)Cdr+#O2{;@es z=CbTNbhqtx-tSI$#;YJ_DsSvATf}6p$c71X`F)W~_FMasSNXHYdjDNUpz*4#{zwzq z0nr5J6x^((Sh%pY7~F{yRGg#1;a6Y!6ni;i!g$t49e~CS@+V z{EOtVP6A#9=hfXz^c^Rl`A!hDSeA!T-o5hPYmc8LU_*|@t1XP^Dmh22u!N)^jZ`Rm z%QJ3fO=7O!%Z9(yEpK&96EIE5oI9;E_HX1o$l1{E5tNI+!hmgtfZ+$(uH-F!W~3m( zsDkUx%{$W-A;RiuY8ULTqSlt0gE1nwBr?!(4GXg`?2Q*e^`j!-UqgrISBlWA;BJ38 z(ECu52z~{(r?SU)FkJ-8b=h~7ZSjxnED^lO=`dkBi+uh=^#H}}Xo^|sDRu|Pg<>`m6tjv@9P9@x z&=1zL6tj7uIMAacU=v(VlxM4tV%De>vwKs_#)M*4H;UOJpxBUR4HTJvu*RdfB>2V@ z`-9IzF?(l!S>cF-G#cV}U z%vKo1tkWrGe;5?A-Apmt1QgRLNT*{!KiEp5m`wu3fwl?Q1Q+$G=R5O0A!-Z6s-D(& ztff}$N9qc}azDGl$Yb3_Q2(*37=Y+D@nW@U!AR6)AyqD2NL6n|NR_RIr|Qy!o7hTu zDk+U6ZW?%loRRkRFuRPz8zJfbi=(fG)V~NPh&%@ zo^oDPw-M?`G$x1&Bc2kT!Cft{8d5|PH)5NambVHlWWvA+ID&dDkcpQ$Ix=6)JIuTV zrie<u@LU*T$TRzFFmU~%Lr4ow;bi`W< z8Qd&W2|kUAEa6%pd$ggm;tpNlXxZ|5C%{ HmP_S7jAps$ delta 2968 zcmZ`)YfKbZ6rMv1f`CP|EorJO_C;(XsI=KCkF{Bz;Uz4v6oIK4N?Q_1V=b_hH8E{B z)l_BKy^C0?#8j->Zb~A?Y?K&V9=3LA8_~#1&_W3h!7h%6xRB)@yqnsZiXY7`>7t{M&AI96v(1T>Fk9&Xqx``O!u9_=#Ophv;w4U8FzPTD}* zC;Oc!F0o8su|Yd>m4aCif^fqU2Zx;d4AI3R1opIez!QBJ_E;L5&u^Q`bb0UcHc%j+>$KzBneF@sY}4m)J$1;?m+^=pe%N$O+@y8MW7lvJ?82uT$lBYpMH6qzh8RXdQT&|&nzF-H4qcS%<5zwr8-2rX|x6b;DX-Saowy(jg_e{?gW|Y44@IfZ} zA)$mH|(~S)n^0<_oMz^ zW$E~?KJR%mlj9A9g?hjouahZeAD3b_Mkr>XP|W&(Vqa>^(qZfa zQ3IsE@{H=vmH2*oUy67QR%6fcW3)1)}0AXsv#fps>;Y~)bP zih<(Aili@6Mi=&Btwd=y|0rH)Q0#boSR2v8TWoP^U~NjVuQwzC8<3P|RZ1~yb&6SK zQOtUhV)mDiux~C>O#c8I=`Vo3u!g0WO?Qebd~=Ut-+bzbY1wj$M7#qbVOJAE6R3qg zyTbQvB7^xLKF%J{gMqXgc>*-43A9^P1O{Tv<(aCIVK;GZhd6EoubmuC1|VIjJgF3+ zW1FfeB8O*krGblR%XubgLoN5p^Li*CwWSdJc$j#D_)c90-0>q#S#W|>ZdcvACSBDe zimE0r_p3?4x{Fm+qbVw;cruy;H6&L(rxx`CC)I8cPjd4?gWoDj4>=^TRON63(Pr^X zm|spwxeQnw9wVV5pNzZ zj_G2EC)LFu5@Q+9E?uFA*DIYU)dOkI=E*Wkc-M24z#y@3Nf#D!1k`IVF);8kFfe#zYr6v}h83I)3=&W=+m&_xAh847 z3=Ek-ngxjMpkf9*3=9Q8KF}}*d#Km~pqLAg&kw{$zLbOlDTWt7v0NYx(t8vt7QqYG z8_jSGDtH1Y2-6%E`xvB$K>+BoTBzo5sMrLcSPV!Gh$En4AAn*xj0_BdK(R=uSc1Uj VM*-_N7&$jjjJ(dc`A1>~I{?ZjFZ2Ka delta 1304 zcmca`l<~nOMh*ssz{d;>nF$Ly0_t}Fd3+2E3?A9q?m&vcLV$rmf(asKyRyz7Bo-h9 zR1KtAfY=Tyb^s_=0OSL;GuT7L41^gNT!4IjAU^V?Bos(7Q~JEoPiCfBsbnSwK#);VRA#9h{&ZRgTR&d%P=LDREu}? z^J0+@IDIUmrmO-}$EuL9d48X<=%|amu6(W;i{)Vpo}TiJ!(!B>8j;|6JFw_j#;G22 zbC$eJiW6`23jXjHXAYuvorJKx*x$V_57c znG>?}?PV-Rz1wo#GcF5@j;MsJnPIM2?07fD`v^xc7KvAKA{~97u-Fl`wfp&vNGu+V zNH|htDvQPPO^0`VI{y`m#Dfd=y4~xrSbpR2>ZLEkvDk5B^Mcg0KUiF~sHZ*PZVwit tj(uFgb)p7~<<8W3l6b*Wr_HoR~T`XGCYP0|1klZvFrO diff --git a/Assets/Scripts/NetworkSync.cs b/Assets/Scripts/NetworkSync.cs index 4d3e867..5eacf6b 100644 --- a/Assets/Scripts/NetworkSync.cs +++ b/Assets/Scripts/NetworkSync.cs @@ -23,7 +23,8 @@ void OnValidate() { NetworkTransformChild ntc = gameObject.AddComponent(); ntc.target = child; ntc.syncRotationAxis = NetworkTransform.AxisSyncMode.None; - ntc.sendInterval = 1/29f; + ntc.sendInterval = 1/14f; + ntc.movementThreshold = 0; } } } From 7673a2f40cd32c3be135af17c36aa26d9410c921 Mon Sep 17 00:00:00 2001 From: stephdim Date: Sun, 19 Feb 2017 15:17:18 +0100 Subject: [PATCH 6/7] Implement #7 Cube authority is set to server and then server destroy it --- Assets/Scenes/Main.unity | Bin 25296 -> 26408 bytes Assets/Scripts/NetworkCube.cs | 31 ++++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index fdc22917054a0017921b639d8bebb0a023ba6519..8600e23528a918bbf8effa58282f024bde416f5f 100644 GIT binary patch delta 1015 zcmZ9KPe{{Y7{{O2wpz8)xpb>Q=L8u{W`a^-=C)QTmH*n*pl}3hnVPvI)GT-GR_nQR z=#ZW45GcF!hssDhgvE{?W7Rblbr6Eq_xbhyNPOYpeV)(r|NZ@PD{B6e@)AXV5+!{^ z`@ZZ3y#Xl^H_kz# zbSHltu^McFxXc)#-UT$@YzITL7r{x%@G3X0ws6uqXwX>CGo2akDNprguF>4$BD z?1Csm6rCpSa#gam%02sS3#H@0c8D=Cc@S1Yb7-Fgvp}#7&VN1xOL)294SX1uaHn8{ zE0X%7u%!MT!5iXHKWHRWY;u?lDmQVnflKr7*d#x#8g!l=noiIpP0=)s4jxNfok*mz z?^-^Ts~W!Bx#*ZdxI974mFiN-%yCbbv$Y+g&coUcsnwnW*frP^9SWb>i;Ln`q6}`? zEUei&&!K{ED^We@PDn(11~ij>k85@ZOe)AHIH8$`f1tv>ZA3nN@!jyW5BpEzqGuS$ zty$}n+g-wPXkk9eQO$xJ>UPd9piu-7ve@#kiI_yMgUOrA#4DOzMssts_nNJNnYqtz zR*y)o2cwMZ+!vZX05fx6YGy;jZlY7hPt$kdi}a%bz*{=GU$Zr^^I-B54QO_#jA%st z`+?4BHt)#hyI))Ez{Zj0{3v#WJ-rrQx@gOOjkWI(#cz%!VdglZ%Oge-*C$eAQ_<8= zGMPvbzv=I=o2y9-&kXM4y8d#N=kZttFGaoe8{HBjM;TKTLLXOGTZsxGVbEW(qu0X= LFNf#Ix7z7y@f`AkQgQ=dWo?)6H!@vLk|1%10R9a-cd8XY- zAtpJ7$;p8meG7m}IDl9&OP(L3`~WipLn)AE0b(Vnm<5ot0?6kCVr8h<1E3g8ucMQ% zBv6VWU~*!Rult?dpHTLE;C1XRp+Wt~4r?7(EkU}0MWprJ6=*+XR(0L5H@ zDnQ;m@}(pcr1}L=EEh|>B31_7YuwNTaJP_YR>u^5mX u5Jy18J^;mX7{PJC5D67a5ZL@FcpuB;JrOpW|3n0EO+FLBvAHK@4if;0%T46~ diff --git a/Assets/Scripts/NetworkCube.cs b/Assets/Scripts/NetworkCube.cs index 42a6263..f05671d 100644 --- a/Assets/Scripts/NetworkCube.cs +++ b/Assets/Scripts/NetworkCube.cs @@ -79,13 +79,26 @@ void Update() { } } - //[Command] - //void CmdRemoveAuthority(NetworkIdentity grabID) { - // grabID.RemoveClientAuthority(grabID.clientAuthorityOwner); - //} - - //[Command] - //void CmdAssignAuthority(NetworkIdentity grabID) { - // grabID.AssignClientAuthority(connectionToClient); - //} + //[Command] + //void CmdRemoveAuthority(NetworkIdentity grabID) { + // grabID.RemoveClientAuthority(grabID.clientAuthorityOwner); + //} + + //[Command] + //void CmdAssignAuthority(NetworkIdentity grabID) { + // grabID.AssignClientAuthority(connectionToClient); + //} + + void OnTriggerEnter(Collider other) { + if (other.name == "DestroyTrigger") { + CmdDestroy(); + } + } + + [Command] + void CmdDestroy() { + _networkIdentity.RemoveClientAuthority(_networkIdentity.clientAuthorityOwner); + GameObject go = NetworkServer.FindLocalObject(_networkIdentity.netId); + NetworkServer.Destroy(go); + } } From bbdfb07c331fdc590dc08cb600fde800910bb290 Mon Sep 17 00:00:00 2001 From: stephdim Date: Sun, 19 Feb 2017 19:20:54 +0100 Subject: [PATCH 7/7] Fix #12 Setting colors for each players --- Assets/Materials/PlayerColor.mat | Bin 0 -> 5024 bytes Assets/Materials/PlayerColor.mat.meta | 8 ++++ Assets/Prefabs/Player 1.prefab | Bin 91308 -> 92140 bytes Assets/Scenes/Main.unity | Bin 26408 -> 26472 bytes Assets/Scripts/CustomHand.cs | 17 +++++++-- Assets/Scripts/LinkHandSpheres.cs | 15 +++++++- Assets/Scripts/LinkHandSpheres.cs.meta | 2 +- Assets/Scripts/NetworkCube.cs | 3 +- Assets/Scripts/NetworkPlayer.cs | 49 ++++++++++++------------- 9 files changed, 63 insertions(+), 31 deletions(-) create mode 100644 Assets/Materials/PlayerColor.mat create mode 100644 Assets/Materials/PlayerColor.mat.meta diff --git a/Assets/Materials/PlayerColor.mat b/Assets/Materials/PlayerColor.mat new file mode 100644 index 0000000000000000000000000000000000000000..2227c76aa8044bd9c98a91585bf7ba6dd1fdeef7 GIT binary patch literal 5024 zcmeI0J8T?P6o$|4`V|KP#y}E6hZo z%aGSaQfz7INh(snzi&#C{!oy#2av8ZEyx~>e+Rz{*P`J?`5QitU{3o|2Oou>XD}bg z*V=wQD@yuH?x(lIzS9rm%j}EN>8IcDg3QDJxA4RGd5=QMJ;lNp;-Qi==E5X-Nym8z zdl=^+xz>`Lf$c|7&i5K#5crT|Q07aez`vF6-I`^*GtPa6XK|juoblX)tEAfAij!U3 zDb68st#+LE8J_j)eaxBHFqFbRvYvH}$?qqGklz6R6l2DtKPD-;UAG5mthrsc{p1kV z^9cILy3x-8!j!y6_vNdcA2htz%J(7gEZ;t>FNesr_E~*-*znB%Ao|Gr9tO|uYx{qM z_LKBw`{(C$C;uZkFJkp`j4wgy|502s|3zK5?{fZ_;Uz1t#|`hX@_K?C!uoX9?McFv zyjQ-!s9m?G4DZwR{1J1;^R(gp)_wV$W%&+R_kEUJ>ws0y=M3+apD<=US>xxS6xQu~ z^!Hbc`PqMg5K@qS?Z5rJzo=QpJ3s%UhWE*z@ckR+d`6E#MMkurE6DdMW`9dp)moIGXxb{}6e-0ma3FSTs#;~U1_ z?&F(=+kJe?aJ!FhgYVSG339D=AKx*&S6EN>k#*zu7KPteeBPlt-!fskJ>N;g?R<}u zL$>BSMVOM?`A!>d=R0G#o$oC8PWjG}Yqj&`_h`m@KJIdYTaE?5tp-(8Jtv`pM=p$3~x&E=s$B~M| zW>i!0(Iz8zmYbfRc!8rflE}TizdPzypj&}%1-cdJR-jvf|6c+A{kr74n<|>-&$j+O z=2@Jw2kOjL7OK^S#nTw`mz-x{T=W{x)y`D2vCi{_B`J=L)J%BZa%NQGdj4^LS*?V- z*fXZwzT(Co=U&>EJNiByMh(~B#W(*pab_D{%=6bSwmQFx>jgLhweOx??HGpWvx5A5 z->aSQ!#LjN7#8*(z6Wp?Yc;>QV<6k?b=*sCgnPIf+uYl}S?@vmXK%8zn)b(cAvh)` z;p!?zQs&?Cd7Vw|j5*@f{hx`GDIbSQ?tturI_(^daaz_r)7%SG9MiPScMh5D=2^As zt6GAZ>!sXxyJob8@ZFA630IV!iRk^NM%5%z!CF%1V!pp!50Jq>zMkN_1E<;u!=%m_ z&^4Y{r|WJID4*LP!%(NXu4+x+jplKL_IZqEP`S@)RJ)yTTIPEt=lq4Ls$l@pHT>Yc c$V(VyTIPE#ZIeAdH0hAEtn1bOyxqa(KP!woK>z>% literal 0 HcmV?d00001 diff --git a/Assets/Materials/PlayerColor.mat.meta b/Assets/Materials/PlayerColor.mat.meta new file mode 100644 index 0000000..ebe5720 --- /dev/null +++ b/Assets/Materials/PlayerColor.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e7c8197ccda909b4585bcb4ac8633cd6 +timeCreated: 1487516646 +licenseType: Free +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Player 1.prefab b/Assets/Prefabs/Player 1.prefab index aab200a9f5d5e18819584ed86f1555ea561c69b9..d34efe10be677f87ccf19d7420324e4b3520fdbe 100644 GIT binary patch delta 10109 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 delta 9507 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.Where(c => c.name == "Joint").ToArray(); int k = 0; - + //PlayerColor = new Color(UnityEngine.Random.Range(0f, 1), UnityEngine.Random.Range(0f, 1), UnityEngine.Random.Range(0f, 1)); //Create spheres for finger joints List fingers = hand_.Fingers; for (int i = 0; i < fingers.Count; i++) { @@ -256,13 +260,20 @@ private void BuildSpheres() { for (int j = 0; j < 4; j++) { int key = getFingerJointIndex((int)finger.Type, j); _jointSpheres[key] = joints[k++]; /*createSphere("Joint", SPHERE_RADIUS);*/ + _jointSpheres[key].GetComponent().material = _material; + _jointSpheres[key].GetComponent().material.color = PlayerColor; } } mockThumbJointSphere = transform.FindChild("MockJoint");//createSphere("MockJoint", SPHERE_RADIUS); palmPositionSphere = transform.FindChild("PalmPosition");//createSphere("PalmPosition", PALM_RADIUS); wristPositionSphere = transform.FindChild("WristPosition");//createSphere("WristPosition", SPHERE_RADIUS); - + mockThumbJointSphere.GetComponent().material = _material; + palmPositionSphere.GetComponent().material = _material; + wristPositionSphere.GetComponent().material = _material; + mockThumbJointSphere.GetComponent().material.color = PlayerColor; + palmPositionSphere.GetComponent().material.color = PlayerColor; + wristPositionSphere.GetComponent().material.color = PlayerColor; //armFrontLeft = createSphere("ArmFrontLeft", SPHERE_RADIUS, true); //armFrontRight = createSphere("ArmFrontRight", SPHERE_RADIUS, true); //armBackLeft = createSphere("ArmBackLeft", SPHERE_RADIUS, true); @@ -273,7 +284,7 @@ private void BuildCylinders() { Transform[] fingerJoints = GetComponentsInChildren().Where(c => c.name == "Finger Joint").ToArray(); int k = 0; - + //Create cylinders between finger joints for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { diff --git a/Assets/Scripts/LinkHandSpheres.cs b/Assets/Scripts/LinkHandSpheres.cs index d01a020..3e1a6cb 100644 --- a/Assets/Scripts/LinkHandSpheres.cs +++ b/Assets/Scripts/LinkHandSpheres.cs @@ -22,9 +22,12 @@ public class LinkHandSpheres : NetworkBehaviour { private Transform wristPositionSphere; // Use this for initialization - void Start () { + void Awake () { _jointSpheres = new Transform[4 * 5]; mockThumbJointSphere = transform.FindChild("MockJoint"); + palmPositionSphere = transform.FindChild("PalmPosition"); + wristPositionSphere = transform.FindChild("WristPosition"); + for (int i = 0; i < _jointSpheres.Length; ++i) { _jointSpheres[i] = transform.GetChild(i); } @@ -32,6 +35,7 @@ void Start () { _sphereATransforms = new List(); _sphereBTransforms = new List(); _hasGeneratedMeshes = false; + BuildCylinders(); } @@ -166,4 +170,13 @@ private Mesh generateCylinderMesh(float length) { return mesh; } + + public void SetHandColor(Color color) { + for (int i = 0; i < _jointSpheres.Length; ++i) { + _jointSpheres[i].GetComponent().material.color = color; + } + mockThumbJointSphere.GetComponent().material.color = color; + palmPositionSphere.GetComponent().material.color = color; + wristPositionSphere.GetComponent().material.color = color; + } } diff --git a/Assets/Scripts/LinkHandSpheres.cs.meta b/Assets/Scripts/LinkHandSpheres.cs.meta index 297a65d..9227486 100644 --- a/Assets/Scripts/LinkHandSpheres.cs.meta +++ b/Assets/Scripts/LinkHandSpheres.cs.meta @@ -1,6 +1,6 @@ fileFormatVersion: 2 guid: 5c05dec50c3fede4285966a3321adc21 -timeCreated: 1487453920 +timeCreated: 1487522303 licenseType: Free MonoImporter: serializedVersion: 2 diff --git a/Assets/Scripts/NetworkCube.cs b/Assets/Scripts/NetworkCube.cs index f05671d..6d9c53e 100644 --- a/Assets/Scripts/NetworkCube.cs +++ b/Assets/Scripts/NetworkCube.cs @@ -6,7 +6,8 @@ public class NetworkCube : NetworkBehaviour { [SerializeField] Material red, blue, green; - Renderer _renderer; + Color playerColor; + Renderer _renderer; //Collider _collider; NetworkIdentity _networkIdentity; InteractionBehaviour _interactionBehaviour; diff --git a/Assets/Scripts/NetworkPlayer.cs b/Assets/Scripts/NetworkPlayer.cs index 9305e82..deacfe7 100644 --- a/Assets/Scripts/NetworkPlayer.cs +++ b/Assets/Scripts/NetworkPlayer.cs @@ -6,36 +6,35 @@ using Leap.Unity; public class NetworkPlayer : NetworkBehaviour { + [SyncVar] - public string playerID; - Camera playerCam; + public Color playerColor; - public InteractionManager interactionManager; - [SerializeField] - GameObject _leapPrefab; + void Start() { + //playerColor.Callback += OnColorSet; + SetColor(); + } - void Awake() { - playerCam = GetComponent(); - //if (isLocalPlayer) { - // GameObject.Find("LeapHandController").transform.SetParent(transform); - //} - //else { - playerCam.enabled = false; - //} + public override void OnStartClient() { + if (isServer) { + CmdPlayerColor(); + } } - //[Command] - //void CmdSetPlayerID(string newID) { - // playerID = newID; - //} + [Command] + void CmdPlayerColor() { + playerColor = new Color(Random.Range(0f, 1), Random.Range(0f, 1), Random.Range(0f, 1), 1); + } - public override void OnStartLocalPlayer() { - //GameObject.Find("LeapHandController").transform.SetParent(transform); - transform.GetChild(0).GetComponent().material.color = Color.blue; - GameObject leap = Instantiate(_leapPrefab); - leap.transform.parent = transform; - leap.transform.localPosition = Vector3.zero; - leap.transform.localRotation = Quaternion.identity; - playerCam.enabled = true; + void SetColor() { + if (isLocalPlayer) { + foreach (CustomHand hand in GetComponentsInChildren()) { + hand.PlayerColor = playerColor; + } + } else { + foreach (LinkHandSpheres hand in GetComponentsInChildren()) { + hand.SetHandColor(playerColor); + } + } } } \ No newline at end of file