From 0b2f60fb2754236407d71c39238c00096662b3e0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Dec 2016 15:36:46 -0800 Subject: [PATCH 01/45] Update tutorial to use new trigger configuration for touch --- .../controller/touch/Oculus-Labels-L.fbx | Bin 361644 -> 380412 bytes .../controller/touch/Oculus-Labels-R.fbx | Bin 399212 -> 377212 bytes .../touchControllerConfiguration.js | 6 +++ tutorial/tutorial.js | 37 ++++++++++++------ tutorial/tutorialEntityIDs.js | 13 ++++-- 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/interface/resources/meshes/controller/touch/Oculus-Labels-L.fbx b/interface/resources/meshes/controller/touch/Oculus-Labels-L.fbx index 4f1f60be0b11dcbe9862c19af57bbdd0c023def8..03d98edae029a268120a193f171cc45e7ed18782 100644 GIT binary patch delta 22052 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 u=*P8{!AEhx9-731^^H95_b2oScmK3 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 QTf=>Rnf2gQm)VW~2X5`hT>t<8 diff --git a/interface/resources/meshes/controller/touch/Oculus-Labels-R.fbx b/interface/resources/meshes/controller/touch/Oculus-Labels-R.fbx index 49a3d6c8328641b53479e29a74c7f8146ed8c4e3..9fe929c1410f73059dd6a73f54e4f8ecf41434f5 100644 GIT binary patch delta 54564 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 delta 81357 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Ξ@zqF)UV! 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 Sj$k5#CDxN_!G6?}hW`&S=L$Cf diff --git a/scripts/system/controllers/touchControllerConfiguration.js b/scripts/system/controllers/touchControllerConfiguration.js index 6241a776c4..08e0470877 100644 --- a/scripts/system/controllers/touchControllerConfiguration.js +++ b/scripts/system/controllers/touchControllerConfiguration.js @@ -74,6 +74,9 @@ TOUCH_CONTROLLER_CONFIGURATION_LEFT = { teleport: { defaultTextureURL: BASE_URL + "Oculus-Labels-L.fbx/Oculus-Labels-L.fbm/Teleport.png" }, + both_triggers: { + defaultTextureURL: BASE_URL + "Oculus-Labels-L.fbx/Oculus-Labels-L.fbm/Grip-Trigger.png" + }, } }, @@ -230,6 +233,9 @@ TOUCH_CONTROLLER_CONFIGURATION_RIGHT = { teleport: { defaultTextureURL: BASE_URL + "Oculus-Labels-R.fbx/Oculus-Labels-R.fbm/Teleport.png" }, + both_triggers: { + defaultTextureURL: BASE_URL + "Oculus-Labels-R.fbx/Oculus-Labels-R.fbm/Grip-Trigger.png" + }, } }, diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index b75bf74579..a3941cbef0 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -58,6 +58,9 @@ function info() { } } +const CONTROLLER_TOUCH = 'touch'; +const CONTROLLER_VIVE = 'vive'; + var NEAR_BOX_SPAWN_NAME = "tutorial/nearGrab/box_spawn"; var FAR_BOX_SPAWN_NAME = "tutorial/farGrab/box_spawn"; var GUN_SPAWN_NAME = "tutorial/gun_spawn"; @@ -323,7 +326,7 @@ function hideEntitiesWithTag(tag) { //}); } -/** +/** * Return the entity properties for an entity with a given name if it is in our * cached list of entities. Otherwise, return undefined. */ @@ -516,12 +519,14 @@ stepOrient.prototype = { // STEP: Near Grab // // // /////////////////////////////////////////////////////////////////////////////// -var stepNearGrab = function() { +var stepNearGrab = function(tutorialManager) { this.name = 'nearGrab'; - this.tag = "nearGrab"; + this.tags = ["bothGrab", "nearGrab", "nearGrab-" + tutorialManager.controllerName]; this.tempTag = "nearGrab-temporary"; this.birdIDs = []; + this.controllerName = tutorialManager.controllerName; + Messages.subscribe("Entity-Exploded"); Messages.messageReceived.connect(this.onMessage.bind(this)); } @@ -531,11 +536,15 @@ stepNearGrab.prototype = { this.onFinish = onFinish; setControllerPartLayer('tips', 'trigger'); - setControllerPartLayer('trigger', 'highlight'); - // Spawn content set - showEntitiesWithTag(this.tag, { visible: true }); - showEntitiesWithTag('bothGrab', { visible: true }); + if (this.controllerName === CONTROLLER_TOUCH) { + setControllerPartLayer('both_triggers', 'highlight'); + } else { + setControllerPartLayer('trigger', 'highlight'); + } + + // Show content set + showEntitiesWithTags(this.tags); var boxSpawnPosition = getEntityWithName(NEAR_BOX_SPAWN_NAME).position; function createBlock(fireworkNumber) { @@ -572,9 +581,9 @@ stepNearGrab.prototype = { debug("NearGrab | Cleanup"); this.finished = true; setControllerPartLayer('tips', 'blank'); + setControllerPartLayer('both_triggers', 'normal'); setControllerPartLayer('trigger', 'normal'); - hideEntitiesWithTag(this.tag, { visible: false}); - hideEntitiesWithTag('bothGrab', { visible: false}); + hideEntitiesWithTags(this.tags); deleteEntitiesWithTag(this.tempTag); if (this.positionWatcher) { this.positionWatcher.destroy(); @@ -696,6 +705,7 @@ PositionWatcher.prototype = { /////////////////////////////////////////////////////////////////////////////// var stepEquip = function(tutorialManager) { const controllerName = tutorialManager.controllerName; + this.controllerName = controllerName; this.name = 'equip'; @@ -714,8 +724,13 @@ var stepEquip = function(tutorialManager) { } stepEquip.prototype = { start: function(onFinish) { - setControllerPartLayer('tips', 'trigger'); - setControllerPartLayer('trigger', 'highlight'); + if (this.controllerName === CONTROLLER_TOUCH) { + setControllerPartLayer('tips', 'grip'); + setControllerPartLayer('grip', 'highlight'); + } else { + setControllerPartLayer('tips', 'trigger'); + setControllerPartLayer('trigger', 'highlight'); + } Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ holdEnabled: true, diff --git a/tutorial/tutorialEntityIDs.js b/tutorial/tutorialEntityIDs.js index 0200c2c247..e98131e8ed 100644 --- a/tutorial/tutorialEntityIDs.js +++ b/tutorial/tutorialEntityIDs.js @@ -52,6 +52,16 @@ TUTORIAL_TAG_TO_ENTITY_IDS_MAP = { "tag": "farGrab" } }, + "nearGrab-vive": { + "{88221a22-b710-4d35-852b-5257b0aa77dc}": { + "tag": "nearGrab-vive" + } + }, + "nearGrab-touch": { + "{7c0f2fde-6c5c-459b-bf82-421979cebf2e}": { + "tag": "nearGrab-touch" + } + }, "nearGrab": { "{55c861ef-60ca-4722-a6c5-9c6967966ec5}": { "tag": "nearGrab" @@ -59,9 +69,6 @@ TUTORIAL_TAG_TO_ENTITY_IDS_MAP = { "{644d655b-ae66-43b1-9bab-a44b9a8ad632}": { "tag": "nearGrab" }, - "{88221a22-b710-4d35-852b-5257b0aa77dc}": { - "tag": "nearGrab" - }, "{8bf0baa1-88d0-448a-a782-100d4413bd82}": { "tag": "nearGrab" }, From efb3e577d2af5b84400366ed6926b3a4cbdd55ff Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Dec 2016 16:00:41 -0800 Subject: [PATCH 02/45] Add support to tutorial for touch grip equip --- tutorial/tutorial.js | 9 +++++---- tutorial/tutorialEntityIDs.js | 24 ++++++++++++++++-------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index a3941cbef0..77fd497361 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -535,11 +535,12 @@ stepNearGrab.prototype = { this.finished = false; this.onFinish = onFinish; - setControllerPartLayer('tips', 'trigger'); - if (this.controllerName === CONTROLLER_TOUCH) { - setControllerPartLayer('both_triggers', 'highlight'); + setControllerPartLayer('tips', 'both_triggers'); + setControllerPartLayer('trigger', 'highlight'); + setControllerPartLayer('grip', 'highlight'); } else { + setControllerPartLayer('tips', 'trigger'); setControllerPartLayer('trigger', 'highlight'); } @@ -581,8 +582,8 @@ stepNearGrab.prototype = { debug("NearGrab | Cleanup"); this.finished = true; setControllerPartLayer('tips', 'blank'); - setControllerPartLayer('both_triggers', 'normal'); setControllerPartLayer('trigger', 'normal'); + setControllerPartLayer('grip', 'normal'); hideEntitiesWithTags(this.tags); deleteEntitiesWithTag(this.tempTag); if (this.positionWatcher) { diff --git a/tutorial/tutorialEntityIDs.js b/tutorial/tutorialEntityIDs.js index e98131e8ed..f53ac1a56c 100644 --- a/tutorial/tutorialEntityIDs.js +++ b/tutorial/tutorialEntityIDs.js @@ -77,13 +77,20 @@ TUTORIAL_TAG_TO_ENTITY_IDS_MAP = { "tag": "nearGrab" } }, + "equip-part1-touch": { + "{470f0634-8be7-4b52-a8bd-5183d489fcb6}": { + "tag": "equip-part1-touch" + } + }, + "equip-part1-vive": { + "{97ced5e7-fc81-40f9-a9e8-f85b4b30f24c}": { + "tag": "equip-part1-vive" + } + }, "equip-part1": { "{d73822ca-0a34-4cf4-a530-3258ac459a14}": { "tag": "equip-part1" }, - "{97ced5e7-fc81-40f9-a9e8-f85b4b30f24c}": { - "tag": "equip-part1" - }, "{8572d991-5777-45df-97bf-7243d7b12f81}": { "tag": "equip-part1" }, @@ -109,16 +116,17 @@ TUTORIAL_TAG_TO_ENTITY_IDS_MAP = { "equip-part2-vive": { "{b5d17eda-90ab-40cf-b973-efcecb2e992e}": { "tag": "equip-part2-vive" + }, + "{6307cd16-dd1d-4988-a339-578178436b45}": { + "tag": "equip-part2-vive" } }, "equip-part2-touch": { "{69195139-e020-4739-bb2c-50faebc6860a}": { "tag": "equip-part2-touch" - } - }, - "equip-part2": { - "{6307cd16-dd1d-4988-a339-578178436b45}": { - "tag": "equip-part2" + }, + "{9b0a99ae-221b-4e59-ba3c-d8e64a083774}": { + "tag": "equip-part2-touch" } }, "bothGrab": { From 3d84ccd4f0195e38aefb37eb75c36d7c33f3e65f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Dec 2016 16:17:30 -0800 Subject: [PATCH 03/45] Update oculus hand controller help image --- .../html/img/controls-help-oculus.png | Bin 121979 -> 125680 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/interface/resources/html/img/controls-help-oculus.png b/interface/resources/html/img/controls-help-oculus.png index 85e25c2a19efe72a7dd54e9a5887b29a00ff5656..0bd0a656debf2203bce976b1fe956ca308704b23 100644 GIT binary patch literal 125680 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ɰ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%0Ae;gBBT$dl2U+s1jZ>oFFE3=qtY7Rrl3KX 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 z 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 Date: Tue, 20 Dec 2016 17:17:30 -0800 Subject: [PATCH 04/45] Update oculus hand controller tip labels --- .../controller/touch/Oculus-Labels-L.fbx | Bin 380412 -> 382332 bytes .../controller/touch/Oculus-Labels-R.fbx | Bin 377212 -> 379132 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/interface/resources/meshes/controller/touch/Oculus-Labels-L.fbx b/interface/resources/meshes/controller/touch/Oculus-Labels-L.fbx index 03d98edae029a268120a193f171cc45e7ed18782..50f415b7ca92eecfd1845af220567f2a09328a01 100644 GIT binary patch delta 33156 zcmYhBdpOho|NplkyeXBU6e@+@Ii$$hDwRa3l=GnoF^9yQW_#&GQdVzeMXX4295Hj+ zM#UF*N@#eVi9!2 z+}PUehJ~@YxwW;ib&y4{vGrlg!xk2nR!2fDj$vv~%5Af`ej_F*#O6j!aQF?ITQ_6k zW8!Yc+_JH@yl!J^0PFzVE{WGro@7(+(n_JkZBhLcjJ}0mtG*sVm8_yt*fh30D(sAjN+6CV4OT24CE$(l5XJb z6HZZy2)unSU9IM(5w5|&gZ@1oo5)HH0D-T4;+HiXtzfGRHI)BiqEhk5+R@(fhNuDv zDC<+dv4*m0u~{NFSOKAMVh zJ-UF$qCod3vPYD_e02;l6X(R$wFmXxjmHpluk~ee9svXADlRdfN7#NeAIKL?Mc5v6 zJbgb68v6kZzE&U9NZslEL52u_@=fgQNY$P`<3=@ovQojuRIoE9QqoStWUAmkU-5kZ zf^l?FyWz<;0~c7(66b{n8k7b)3@NCx4y*G|5UV2>Tr%h%zR=+w_XGzl2a$I0VwVOdoAiW>s%eo5dXswh*`<15P z%Up$_gd{vN=3F+yD45_M-jlr6Bxcy3g8}mcltHm{J)&j5V;fJ%U|yvU4J9O^Pg({D zRw|-0tRJz3-J!SEqw$hGG7oax5gq?1+;`KyC)(HbrO3+0SPwLysa_xanv?6Ou~d6y z^2ty_h)${PZL(%ck&~5(AtXIvIjU1w6+;Q9Y16T;#hA!^1-rysEv?_KJZp;$5avl)K?=IYX?a*G(X3!a0in_6kJbH~w_H+<9gf#m|r@Q!D zgfm;?cJsR^>DzNAv%h^R_T9!XxI*Wvj4_`GAE2(|k@fYt7l~D9K(I2zFVTV8l13-S zro(U*4QTUQm0>H5Vqb^AN<(}!m@4?)uXVB^wVTzNS<86>;s&QQWByuGd5`kSr`4o^?~4lHL! zH3bswETNvow|xTQ7EJhC>ScO?(FG#FVd7(8}J<2jiMc z4%nv(!b>~F>E3Y;DX00}u(5Q9>}hR1JG9B)L_}4nqAD^DIZ+flty#gAOD;h4y>u|x za;@0OD8(=6PKLV6QGv2o4h`MdNhV}EmAafw+ozj#L0u~9>2d*hjw!h&Vp zWMTRgKmqzAPOOU*wjCQk_FGd_5SO|a{Ym9q#cA$Aq=v%1MS8aq-~Lf;q6b~~3jKnk z1BIk+6*Js>>GhK-iM^G|(r1d;2HkzvHoeHawlesBH=sMkus3%65%c1~#?1Nngq_hz zR|lAVhp__>9(o9O{Idddu4<9}k6G;R*!s3lt{x7^QFmc87~L#3;sNMdnU~otncy36 z5&JCg$N39uQ3SCQMk4h7GIm&jVnw-w>vtroZ}9vLdJ#*~TsB&r_XGB*#3y*I zkIFNg>4j(u^Wx)VvMqyUyc|dJU8EG(-3ex_}=-OkKbxy4T*?Lqs+^@ zOJCj)xeW2smwyZ|?%1$W-LK_Qd;LC#S@-cn`5|d>n(SiudBXtTSzV2W(GqVvX19 zw?a09W;Hrk&@1%4-eU5*_9>v$s6Ob=aB+BH_F z4$BR`Q`}(XHr>2kJu`R{g>jWmjhBeaN-U_q2hG?bZ|%L4g5}!aT}cz_%Shqz4ex%6 zcYz?spZME8l3m&)YTBdH5`Iux9AY%PXH{!O*Ky~Br%zSzJs|a<)31b42p@J#B~O^H z;8*y-OTK*C1LJ{eG}Yh1?jS4T!pjjZ)&=Z>Xgjm- zmAylp?c?M?((Ap8?^VIT*pHRMrzZ@moeXk^-vxufdpc^cH+w`skK~m&=y`qViF+Sj zM(zEyrd(p7TH?FyU2VEZQNIzmmz`l>MnPzH{0eYSiFQ)!nzw)S?PX0<23iJW6+T^o z>7cn|^e2-5rz3C0tvuOo0@u~K);w*q+^uu^kLGI)M_b%%t-t=ZX1y_zIZm-y32X+; z?qF+u) zvR9@XtRa8r5Aq7DjCv|dC!%Eic^~Kp7qypunvsE7rFnE!vYoyTW9In|AEUOKx3hje z_HQMbg=sfSIDeFH2F(v7D2?oMY}+!CaxHEXs3qjiE`_D0lA-nf8(n~^b7rng<%m}* z@E02P7|Vu-^>__)T(Xw@=Hb(2Ri#PT;)g7JB=eYqRPC~*?!HIw-e-V1;)Z#TJMJ@9 zI>kVqpj>(1mLJqa8>6pC3-Gn~k7Z|43VMyy7M0hE(+e$69v>UBOPA~Ta?Kvx7P=Eu zluxLef$Bd!)-)Jq)WZK`v@NJxruKfdu@loiogy|OrIG5Cs4oJHLw9M+qheOMSb@)B z+q=`-jN1{zb~;@jvk@Kn_J~vm9Nfle%@4@i`MJsbLxS6J^G{#yPwFEe6R(;4%#PQf zYe!W;werC&Gi2gmSdKa>xLanLd)@_!0v@4Z^(F!>j@I}Og7K%gkbE75sqw5;aUqWj zJS{-ne}~v5wY{`|Xd}5f0iqBzjuO9n9Og|gG0IJ12OtlnObxrWlL}rj&Yu^^1OLA9 z>D}|npkw)<%^lJ8;zSc(Q^Q+kv?*^VON7y=)LZ?M9E)}jI|x_q-yG1f%=}hEElU6uJgy!C$X-I1#S%4Qs7doaf0Xe@fM3O+_HV*5KM<0 z1Htw+Z_ge+|4p=&83h>Ku1PE-zw(FDW|TJ9Zd=g~9%Ckky{WXtypJ03uZ+~N^mzQD zTW4r;1!XVC-qaBh+_rTSC^78q_C%3=dA*M+W8z1LLm}(5aICL^s|62Gasrn>M;e6J*lr> zMCtj4A~@~c8uW@%VkLj`sc?rHuHoMDQD4H1DA$*Eu*aea&W+_pJ>IWmc3uI~4xOwJ zrkZ5DkO&R(8oQoM>LKXHj<2)8ju%w*QoA7N@Kgt=so$mEEA+2#^xv@2X$cwb_DNVM$`7BNcfX)z=v( zyWo&8xD^OYFv;&Upc3LIazkqN+HW~N@vLLjPiFE+DqP$l<{t5i`E;`T#*XAjw4|^n z$f#2nO6*1gcfHOfjBmAz3CL@Y3e67Q@gSt0@6@%70_=NnUdufH5OLMA4Xq|7Nizs(}q9LgVI2>}P z1)1}`@xqtyx5)u{JEM8eTN_R_I=rt>83yIXgOnJ(CnbZCLM3uw-n?>S^K=tnKu*mz z86e98Gc^smlZnCbCnr))g`VRaIH$-p9pZZi+v(RbaJ^A`r#9gNy^EN=adEy64ew9* zM1{G{!%{~;WCZgev{swm7&;hNnR!F<$tg%oUqVy8z+5F>vg4=Pwdd5Fg;x+`N=mDzqAcL|) zYwNg#VDvEPL*TR$m5guNWed-cCVNN{XEJ`bdN4W)Xhp(t3>Q6Hc3gCigH!|G znb}!UEe3mh4wc4UIF74c5oS9+Hb$*JFElk9GswO1WbY17laFzdqW%Sobv0d)V$&gX z&%AJA;&6vZ3tQ%O;fTI>!o)9YsjW|dKxdkC>JBPe%Kn*6DGIwr-kZh0V1}K3X*8A5 zbT3+*Z`&!BR#M~Uu@&s+NBk|XWEBF%7T#hCG9swaPu;TYkC7C5IV#4;g%GB-88o}y zIMZ}N34Fd+xv_P+Nz>Quc>VXPJZ56i>4kR@Eqllp!&X#g6hdw%zI@DG=9pHMc##9% zhn0Onol=RYUq@Dsn)pp&nMz-2L)#v+o#&zMK8|~APCw&+IwCY1mH1^%S$qNV*c|p> z{al6_^j+rg>AlL(Kpz%oP9 zoQaP-bCoR|Ey|d(-RaX?aBZ)}1xm=?{;rrS^o$lAM9_wXoX&bQ%SCd(>nc(zLNE}A5D|K;4 z_U$AMlRot&(n0I$OZWL&K+C|>z1QBqMdp7qtw6Li7(Ofl!e)Li|FGW9jR~+)08i$7 ze?Zkz_|%=7_a#Y_jvkVVtet|yVr2_X%qm2@{*oW-U#1&fFM5d{LYAPE>0ZNewt*Xw z+T^*|g+*?XE1r1$FFuYq$fV8+PPuo;?)Z1ec72aG!KfVOf;JbG7^Xm?|2@&$>tkbM z(DSJ-KziDYx3{K(!6J0f!CC?}FZ*`M#CNBJ_6vu2E~%Z5 z3=!F7w<>)f%yUD;RZO^OOU`NCdGmRfRgK}Q9lY}XyqF^gxjLQq`7f7t8OuyfdhlZ4 zSQem;0)yYUh2<&=@w*$Bp zj>dK@-3@%Tys|GH?0?aHf2VM3PL*J(&wEgcuTOW1&$@oxZKva!n3_jP>@JFW9rQXy zaO>TiHX_~qT} z-wV?clwJ;w@0jk|>w#?|Q_RpU7j*!$4(93lt(3p^z=M5*lfKYX<2CSxpU@QtQNc+x zv*1RPQ=qxRv|ZOFHD-Z1`#`CMAACD`EHOCWjQx2r#JvkZlu`A4 zq*x!HoIG7`*EI$CGzHP+aQtv0U*3G?wJO-``2n8_hUFdFPK9A!iN%?QULf218aY0V z*_zmm+pAAM;}Sc5@y*MNi8W|ykw#qD@SvTJAU|p1p^P6=B2ACv60o+N!AsN2KV}jf zD`RCorDqvaBvUvMMD2xfKj34Qhnfb%)DQXKGbHg7zgegl%RL}-b;zham=kR!U*7^0 z8(iDUx=iW$=rA@NX7&d-sPEVL$Ov$cqJA@d)s*hYHlLM{p^O~Gls{cE0oQwVO59S* zs`aAT`$Rig{}g5G{L&kqL>FcnsBvF^-gH2GBfM&K$T;^5GSmHC%%wfF9z;r<#$547 zn8rN2#3BFn68-10?0wLP+8&VkY~{yrtBV8nV7A#C_OIiV7qh_Zu2nssUUFXGKH`_d z_dIil&%c~{A8KZ|@H|2kPtlOcR!Z>ax*7`tQy6;|UX{QHbTx2ZCcNKy6t$g>++B%m z;+t76(FKP3RMBBN8L#MFv^sH_0Xx>s3zqD&!2}r&1rFJv zj^nkhi^x9%7J#GGr~8(5?Q_mQ7NV06$L8Sp_Zc^Zgh7Lvca<;iBG+yQG!~CMDNNhp zu)^=}-bfsEx!<|*>8PcOZSz~xIn-D#?m+rB@#=0)`(l%QErn#fD=ul?=w#3f^p1RD z9F1D^z{VtabHKC8Yp2Groui{7n2bi6Pid%an}HR22AQ|zjVX4Zn1jnXRru6qXJ>;?Tm z4-r@%NZVp_$aFIH1oT+e`1{2jV!SH2H1x!lY^?#-Bgo!PTk_v3c|@jA^6H2Xu_Hcf z>X)Op5p-)(eymA&`>Hf%aX;p)L9A_qJ^GfIhTI(@dk%k`BN@8nA-R9N6GvzHT>6U zu_jwaN%x|RB+1{E3W1r249bX%Y*@A3ec{n_h7mC)@|f-9wCfqwm2%$(zUB8h8t?^8 z{nF(E+c%%8!0q*Rb=XJ9=y4b0w5~ymFnbphB*J7=OqS}Qmc&0!+uqT8xYm9azXXDR z%uut^y*R@7l)b};J4|#w7Ru3_@=e{gLX%dk?q2$Yyct z8t)7S@|E=IG&@oVn!==WLPBE4l^df+IukY`XQ!+iqH2El<)6MvFif8?qr?VYS_!B! zxu@nW3<|H>p-y!5w762)X)R(O8L7ck9Qi*vD9N5bJwTg-E0NbY8ll(5s> zV|d$UR^8b@;{L}|tdQjFo&@n?`k0{Us%@E3mC4ePYUIQ*#{mDgaF;@A#j@npw-qihyH_gh5hg!=t4Y4- zW87-Cn|Y~ZsGsbA{u<*cHq-a$moNMRJHga$-S;!L*-`cKfQ_TG>)~-Ix_xnHfG6KD zHKu2>_823}B`&Zxzw}M3HF|ouB9&p#Acc@)~{Wyx&+YTIgg)YcYXY*zR>a0e4T*(9Kv(qmkg zN0`Hfll16U9F${do#D@yvhj&ye4!W~nqg#~+v9%LoGWmuW#s%t^QGO#!8f+1zf$$< zvi*zm&*|Bd>Bg1aL8Le=re}*^?hNep{0N%AU~zuT=wOIXNAN$KO*>C{B$)fu%X<7I6v|jbPjG$FG~DSKGEpi~+E2i=r>NyJ883I90L?L9)5{NiFzu3%aqTN) zi4D#4&55w9=^vG@o_8~JuyVvJZ2ZqhwUwLIbNO?f#v%te`eJ!Vgad>Cfwrd$YQ z6Bx7Qx?C{Fv%Ofq=lEYu{Q{^6q`_(bT!@5y|!f?E!&|lDj-6+;d~DeqX+ttpMst#asO+ z{tK{LjrE!-cmpWy9c=#wH97{f<&peONXiKeH(bsN;t-8#x0l-?Hy&{g=FM?)?;W44@@KLy#5 zP4GM|KX3}-+K4fFBySB#$^I`vAN^m#PBbR(k^D2c6X^dTRH89wv*g2-*=YIyY}EdL z^TANF`3T64X3RKV{y3ykk)Yckk3A3Z>cq6kDIAkiQBuG>t(Vu7t5;I^&r+8v zVGhYFWXn;N6#lzDmdco6d4*62Tp8n_pkSxz(y8#DIeu#WKduL2D}l>_T!W~dIC=EM zkyB>>`WnptkKN&aWUK!#|7&-^WS^BU1gNJEkU*fu>Hl>iC^o{W-kaB7N!;|5mCtW& z-}>-mb^Mm!fAJx=6;3^ZI4C7WC7s@O=~UzGsB4bx69@mgdFqjZ%GJ&HLHmgJR`-Cn z{`2%CsVS_t(0irV2ZqJ5IjIN8jFmrP^6QU+Q5cR$74^2RTrerw4+2dNeTK9j#KamX z7-4Q1DRg1>98}ndQ8Q8q#oYQ^;Rwd|puz!Q>7fBACMgzCjEHAYTN{bB7~RRY+>s78 z#(%8v)~pD5yCo2$+=k?bY7$Ia87ef0@kMZ&$H-(t&Ng{r8}R3{K&HDDSk|UtsV2INwn_mPWefU z-z6XDzjd;JSVUY+8DH3^u2F^6AM{7V-s zmOgZqJXf6Yny}M$lETJiK%8kbnK{L;3v1?Bh70`f$!z2vK7)zJlwBt88=psS?Gco5Teq|U=)>p)a2f{{f> z7tE6w@5U3^OG`tV1VK}yWb$6T)HE7RZnUo+Unu%bYiS(!lDHP+p-$Lj-yY%&ef;1# z@tdT^c3AP(nLgx6iL0ni5vPc8%~Jv$07FSF9+z#5iA}mOMApW?t~-|S;Xtu&yb3mp zkSCv-Vq;e>$=p)KQy{#V3!O@g4gQPL)NdjhtrrL<%^FC&mH z6;;MZBG8lW0@xEpx+6Nwp?{*1T_o^s0YrsSF+~ddv4B zH0w`m`j0u(NVX8S{PSvEgrDxzELbBpA8#2J0uJ0wa%-c1FHuaR8GXG2S);KG_Je?& zI#~rVn#Oxy#$=HL#z;sWFXaNu=%+hpio{ySFbS-A01x|-`#ad5 z-BLM%z%gn2&R%#pbB0_ms?aV8NYNAsj?H_WOUsEVO#A!(L}^8zMzIi$19?+j@d6stRynq{NC6=e_b})3jBcGHfxn zpwqQ2yR~%iD?^$TQ28?IX$r0@`n*H&1K-)~LJ>N(^ zvC(y69Z+q*A(6Nj`J_%NC z^DlGnfxoN0z@|Nu2^@l#WIo1ctH2AMgf!6!C263ow$oGTkiYyf7%l=B0cIaTzXF0! zEhW|Csbo2OGY)jSt{I1` z?jO>43*RvJEv%8Tj#|6NUg4_)`@wC+Q?WF067{C;2hND}I5w_5MpuY)=Tl)Py49c{ zW}|e=dQCj6#Wk0o5gN0XKJAI4x%rKeRvhe0N6YcKx{~#T-D+7{BSRk_lMABBr{0iE z;Ktvm<5N^=YrzeibkVYb(o0yH5a%7*+G@|hX5$6u7Uvp)58EOY_|z+aeH&q%r}PcR zG^W#j3reORigK!z0${fUM0V2<{4kV0afr9Z8hvcD>_>ZTcSt)-y71?#C1W;LT+SDA z(+x<0Ved(0+D^puh#ry4C`_`(cL2`VW(N*#unHg$Cld1}X>cQGvL<#QBcYna+k_Hi z(0QvP=c`L-KqRd{V9FzKfIM7XV%n4rE9+g8F7jD~lW(eKS{-TMv0%4W21 zG^t2CF-dw3@i^c3Il{*lR~nkR@G!}^Liiyb31kJqe(;LaDOb?HGL6%S5wU+L@1_ko zgt6IJ8cz*-JB#e@5RWQ##ZB=>6-h((srG=sN;&_oOsh>+5bt+UERJ9KSVJMuBv0sYk%SPt+X9%A zDH`0Bt?P)Kq9&(AKKpJBO|5DjhL((bZhR~gX&2^e5(G3%X-j??@!4YKyK4P4z``%9 zw7Mi^g7s;RaXVJ@nayC`U!JCit+?QR9WAPM78bBM?TUD6KQu0#`oS$)CfQ|NR)#%| zJ#ZhiALLol&LWcKOqRE zDVJK1bpK5{tybd`sz0nHV^MykytoRJ{naolX-5YegCoff4a63F3kw{m1umV1NaIDL zPS{^4XcN%{0O}5$EwSH_CV!2>%9xY|jgZ0)ehze_^wrXZ z#eQ-GYE#zq-^Op6yuI59_~VuOSFq3dPEIVCh}9oE-T~haviKz=9YVb~c`50S_xrJ) zsYy^fE2`SgD6ucajAsajiK*1_Z~JDn4$Jy9Ufah4+tWyNdsomxP!C~Tn8KdmW%TnN zYm{nKl4QL!GG5^sLlANJcw9AXo=(TFCWp5S&yM5Fz;n*WC5WZ5qXuB?po1d|fZ~zo zw}R~A7kT?8X)(HOoIyxt9A5|&Xe13!l1_^~@QNVEGKQwF=e7Q*07quq|8)}E@1QbVa=;>4 zHUd+XR;WdChTuh#Sb_B#;5EdWQ*mo$2C(wbGcG<`1?tAiYc65U47cda3lh8a=kb2= zs(ZjUBYwJR_lPX!C+gQLGf$7(0n8H-yq$8>mggx)p5wKi4(lueD-Jpg_V8!aXeOqXir2hnb%8Wv3OOqwN@7ME6!od z7u21uscd9VFD-!MaA4e`3CZ9m-!lCttr<1rPG?xAd5YxUn5A5azCn?PNoVHLln(HN=luHVLN&b`-SipSArYI%c3-?`a z_Cm13tk#!;2)gh}jO^P)%0sRF1ugO)CYTf5Uj9oW3!3;f@FH~Mr32SEL$q)MXz^pI&?}*d~CE;B`3+6z~ZXr(PEcNF?U4y@9qw&QL z7Bc8+S|M$nGWo(HSX%_~%QIFRW0FLS)w(xh_g1br-Nh1Dc%!+zX4?rn z(HGGQ!hcgD(s%~em>cbhRsL}AF#N=lbr{5<)t`?2r&1Xd(6cpd^lmL$EbzcG{g!-T zQovmcsB!?7zz#TgyzmMUR*){8&sg$FUdRM-52(%a{97dkIK)2Z6yYn~(hbgt8BYd6 z7xINTy~dbN869=_9+5?Z3#x3?1s@eBM@Ti2C>w!mn*o0Ro80bK%AkO#t!Y|+hM&ns z7FL8|&76saI=&DHNU8Bb7A|Xf%6FT(0&0x8IQBowp$3pIy2)wi7X6Y^8%5#|I&jJ9 zgkXJ=M&pkmGzM*!N(+=)aRcfX_S^HC*Ss-b{C~FOqShT+J4;hzMZ30#L3+7_!zQY^ z@*s37m+nfsLQLwE`8KbWzDtIcWim+&HmMJF#v&AH4Q0W6r0U7E!d0@tthob2yhKCHD(((2-{_G=R?)Y!1yN=v8M0IrbJ`F{$@xbzRr8xt2W_? z=s{R30~e{xh8-C1OmngVCpoLsFGQ1dpJnT%>&CrT6Qu-l`W9QV%LmJZXje6q^7*DI zA>(_c3;UmCHM;Io&++{)*O|u3jYEBStsSj!mA|X=ls{y>WRMj0mP)OL`|4!3pD=kI zkXOx{iP0DMr56DCeOIGa)(mq&Ewn(tCudZEo;Wx$`2tI{!WjR>nYgg?iZK{j z5np)+psC;CGaasRUXYwaBu3)L{N&h8oFD&GumAK912i1`UxMw*m5=kz&wCZRi;{qN zQL&&eteF!N1KeaGWn4ZUo%AITLpxvWAPlWqDSR1?dsnKzN0)wgz5<2YAhD#It?8E1 z^UpW#YC5176F=4HqS6^5;o{DDa@;QZej}}JX^oyB9EcV^iu01|vKb9@%4JM_;a&A5 zNt=LpN%1nFNWTOdp9S^Jc?sk%o-ZvAE13>O;gBj&U+OfuQH{BhKTv@27&=l|I`-SA z9BWU#N$bxqmHcd2e=YkXmwQWa{%;oZ6x&FE7)btJg*q*YEc?cDDw*!qYSSwKU19V? zc+_Y;-65i^(_X_D&Y#hu1*qwH?8h&PrP|5-TGLtNfw(h1yhJn!7vG(pC-M zu%>DMhUQ`{C^PnkDR(B?-Jq@0N~bIPWJ?X$*2aQ-Y7~yG25qDGFx>G4H~eqxOiZel zRqNrXO`XAI;B`+t#pD+Z9y)2fc=#rIAtf6faY9`12YBNPFi+FO>#ddkF0x-!{8#hs zqZg}scmG>s!?AfjCW+bS{|;V~shLCrR`$(D2h!vx-!Ghknzn@jhs#%V`W~1W!zTzfk z1N9C3WZ*qnbHMzo#N^#b>Qii!8_tPnLOR6eEchz=P1r@zehzNBg%4S}*I;>8TZntI zf8yYi^M6yfh{>P-UXvaEcjpU1SK#_@OaRqt|Dg4}w73Icr2d27N1&J&8Tn{3n$}*MMjhDY;cbw4&(0h;5JAD3v{&)J+=k11P!`rspY_Fq-xICrt~u zB$)Mg1ir1LS6<9h{M|adXZ4DN%^JJD^(i$zvPn{#B3$s0E3&Cuo)2$%UnK2qfr6CV zJPF5n(85MZM(&=$FDsOQp1U&NrZW)|u>q%*1lO1p1Pqvw%-NV-_A7bRp+o&B75eD# zO1RW~tRE0o9KFEWi4IJS75z}0TuZ5-1`bFsygsxB(627Z-p;p2VpMK1)YHndw++2Y z!zwwqH91ofayS7c#%v>BmzW*u`K@w?rI!JG>51duc4|Dv_eyjDwB< zmee(Yr#g#_9bit+!vftW8)*;bG4ENr_6%DfyV+}XqrX1kU9ZL>{PB8QykE?1@*u6o zYpOC@be%GIzHFRYJ6$Oy-tndkK6NRQ)3i67eL#U*%Ts zt29#EpX~skmHCakiqk`9sL@z!vrW!>kgM22?Jg*O3h^4Nm^zV=TA6 zo%S?UN-e;V6I4d4-K*RKF@WCC&)UTJ%(0K7-Yo25Dls>d)McUT;vcu&Ny;*NT`|OD zzB5~vy}b(@hujh^xE?qD*@QU?wpVTpY%v>#Zo-SY54pWwX;zsL*|*V7YagiAKF*Ku zg(ZK%t_~-E7}_INPrS?Unc!WbEj3+KPvb$x@+!$p3qXHJeo`?3AW5s|*TeL5LS?rM zepF|5u}Hhzi0^}wLbdc{#382j87UBAV-kV-e52iT54aH)_&U3o7pp(%M=Cl1#y>B~ z_K@*JOLnj{o@CxjuZ4;CO_Puau~<{`Ec2o!efZfF@$#GIH;Zf{QYQk=?v6_&1qkxj zsswAbWD9l-@YO?CRDk2|7JH30(5oWQA_jA7QwW@aA$q4VemG=t@T6~^k-X&WY!Bie zgXm@6IaA9$U@Nz+Kf)l=saH8^4ieum$f8r=LbLZU1Ii`(@ULk44QCt4{!H=n>AJ5f zzP}A%=AmUT*cQSjb;`0VS!B1mz!OYY;D$(x0Q@&Uz=V(L%luu;pTr$ikBL(hB$t-l z$L3}Gw+u(X1_iO1V;{BlaH)egte<&74nVZHzvxZ7svG(O(bZyC)M%r}bUo?sYyoyjPk8>R*I)nG9)@5Z(kt zQ(a0eAFdD0H_of6;YLk(1BoQ*1=?ouus?#Fz+_RKDLiG}*U`At-v<(tb_d4AiXIo> zXcVcFaUZcjqr}urR2Q1KEaZO7nDZ$wxdOy6SuyZf(Hq3-OX5(N#Hd_P1`l1{Z6Ske zyN>^^FkP$ClldSa=;suB5M>ECz`obAp#`r0CYPG(YC}yAAfCQC4l0Y$;6DpnmqQ*x zHQQr+E-$%MCv7bJ8BPB4rB=JzIyv*iS@!ZJSY2Quk7#q!&&e5TsvTyVWHr=)gI`BQ zB86T_QNV%@$uc5Hst|5VU#g5ZI#|ZQA#76}Z4&+nxfSrLyNymlrJ8e_WiireQUSH9^~kD&S!&hCQYyl$F&#W=uEZ`@(E*6 zRS;+?C-ya7lV!)hF0gi5l2yk0p|6I0S_lo)HCa>K52A$;y}hc)_MY=DRTOmo1EknO z9}IuDME9u?M;m`l>hqsqr~wV{%5p8)Y#Z_K1Yd-oi&nG~`@?Fc0m;+y>3WO7)|^sK zswC5ZgsPi%c$Wb)m?VCDQd%%?@5!0ApzgToKvuX4v)Hjda;R4{oe)q_`i^euEkw_c zn7!{kf@HqBJCxFca%m=h#Bd@r*E8NtuiuXwoTLeawDJ8fE19eSprNa^+{6JZ^eL~? z!`83x^2{Yo@riX7JS$nOXcw2QNnoIYu1zHjEqB`#FKNs-*2NaoO1yu8mkbeOa!IZh zAFAA&;oqD2e$^uR*A)t(Smh6TcK8ZMbbc5CP$IuDi1K8#8G@SqlXm|@%3{CbSg)|H83}Om#zH)`4deN(XPeG5m~Z}d0~zE z@zzR(OfEWfBMIf%(s^#}rzbv`{I{~$-`MaG#lK(rb?V-N6P>ji>u3*UdbxUWrd<%uXH_bt2(tUHj5xHIh5z!EwGY~D9^N@}~dom6F1RGS+h?u_64 zt7^uId|2CQ9ovvoLoO#8pvn)J@%ZEH(F)pH!Q)g~oUhYeXvKj8@H_Lq4RK4|xvdVr zPECs3jk!rEgfXc}yNfoq|4r%%TeRB+rgj;XUAK}SbL8dH3-(JYXDsT034$iz>|PAgAt!MG$}t1z2*FKJJjuy5oL zB7sPmNMa{o4{NURp9y&?mwhhYE|#<~qQ|BroP&uwZtjlWdiM1+m(vl;!2MqTX8Voi zLS5Q@`~Nld-ce07@8fnrqk>2ik&cKcJ)P)8jkB9JZ&GZ%)|;o)4_z@ zcpAX)o^a41o2zvAY~u=B63>XvZe1s_(&X-5z{9tLocMO3mmAeSgE@_<8)J^uWA^w} z=XvDV9TLyhuAS0ei$cT( z-v+lk%|+YZxB;R7fk1!W%1DDjpgUwB5ITq#%vAm70l0(=Ju3(nL;t=H23ONkf@ zSeot@7xgFkEU2hQ$RFI!e4wy6_6!7ipJCYWdjl5%{JOf-dUNWwdWaICy}6rTcx$d- z?p!koaN6OX?eE>TYieHfgvpip$L4VO_|0u#G;yx-?k7__Dc&48vF|pK59%OtL|0%$ zW^VS}H@w(8Y$0mDyp}k=`=+S-$zdPyxMmSv+}w=D#|jih<(5sodbP~C4dtto z8V{Ghj&X5}6|znB7JoWYM>S#^cfZD_9^Y>kk>9QMoi|6s(Stx<0ZXlmgn6~w=SZdN ztSS#1S^b!w>R6rGj%kJZV(^#B-oY?O6i)xnFX-!!uI@MQ7Q_ z8JMzeO=?xTqpu1gE;V)yzv43?2S>_c38fhP3l|&3n#Mh>7E_a!Ca$j%XiS@S)Jr;Q zSjo3nxJi&-9??%|8Sy|e{N2@V+~DJ(0D+*k;a2POPsZhgcrgIG!LLKBo83KJf7#xn zJU9{fXWjR&C97&gJl335<3D!JqAgmPG5)$Wt#q<&b@O=`?PdwIneGR>QhYO-X^C&d z=xXM!uY>A4Y@c0Ziw=7@@TOpC?sV|T;k~h>jT$9hTw4s9)B3mK=3WOr)w3w% z&#CY3X_?lSz4gk;CJ!X?lvuobI(A3fvKa4@RF|dyDp`_Z&h3hD1YnlCVYjkMn+nX< zCSo>pJ^Fkm?=dcx9&_i+X5Hj1XT^sj4XXGgLmm#%+{x+#ko`#jFMN;R} z|JV|IGC`4F9Xt$pg^jtYEWf@>ce8OsMv$);ey|&t+TRl!uyja3H0?CzR}>7bdCeiD z(whV>X4HPmd8<~Wn4vJ5_NV=)35WL;9ECzMkgQvL4yv9xbdx+^jc;%E{BouKU}#)u zQ9~7u^`}K^u`S9jcg;t2cv9;H_xR2Q=?`{WNE|^8O8~7_EyJJqluV(^02=SvBWrJ& z-VpQ5Aw+LfjMeqMoVD=~zw-u}o4U`&{i^go-cS61(U*$p;4@>^Wj}@4E zcCL~(egdAt^Icp_ig6DGe;KLOf7pS(QV7B#D8s4iKMYi9c>__Kxp=mlQS|=KK>DBA zQ+xc~!;h7|?ZicR+{oVBcyT8SHiYLb# zNN{lQPiZL|{Pm4d7Y=4bw} zCmqGcj>4eCmIn7)HQ)qMXj8`@Jf3Zqv%ZDx+naHo#ckIGV|OeYRx@7nD4gT)HOWw* zF80vy^3vL^ap5RUDGGmLn)1ZjqN^>}{_JE#W2!t7FKcEAkm+ zz-H=cBB5W4s8fZJ3j#Li7WG0BtCsK0DBD&tTa~5E4?MAP;jpR-ewcpQ1a$72_N3$ZuJEsP8(sKR9JM zZd&y0!QpM~{^0)OYh{-~pmEPOS_s z(M7@(bHwtju(tK=mWtbPCTfN>2fNzc_ct*qePu>ihxFmZ0zNdQ256&S6($BavJ9rO zAm%LjTy1-M)`)!;0>dsbuYsJ+0z@PT1k&@0_PibMC{@OsWGL4>mjkQ* z%E)3-)%kkH5`um2^Y6-nG2xy-K_B-yk@@lK<74L5DDcn1`hi0{q3;VYflTEq+!(Ls z5tthK-oz`uBY15_4v(Nb#VE}?_XJgp@vRum#Old1Z+4_j(fHt*fs{rIX;&|~{@?c3 zzprF9l6ce*Zz4W7`f+ye1KL8Jvr}KTAMzOZU_=?yi!Hwp|e*psbzQhO;C!?ko!a9 z7N^hPmULR6@m*yBKncl?jw`$2vN*w)zrDZq(wyAyQe!Xu{qXKzlSr7uBisPhEXR4gy6a zVt*I3rJe-2<@v&!&%I7|;7Q?+^bo*=L1=$QmK=M4NB#Vgrd_xDH6w%iW5-lgnN0Wd zldZ+L5;YT&Czf2jJ1MftzUneouAFB>|JKG{o=l@rM7ERi0E$;bd2fUHV?&Q^&-}WT zgo>XndZrOTrORaL>u4mT!ij zGxpNQ!NJpBy1-hZo4;!YGCSd@CS@|BWoVKhl|02^IcxK{ezs70ry-4+9t3(x?HNwi z5+?3+4JBpuHc_e8G&gBBKfuCMc48`Cz;c&q>S;FMEcDY%scdVxnca2v%9d+hi37fN zb~Sg?KECos$6+*DFC>o0*ySk2DOXv)llyegCnRW0PN1M!EaxdQ=1#BN{o=H_HG??J zXx4_74nd%qc%U~nRp-8SoLp2K=j(#2J{`*{DC*iOB16W+JN6qk`VH`tMJebS38{g+KQh~4`5ckT~11{XwUTxZ$V zW_SC$ENaX0duQ`&(VhE&GdYs30*2F;GPQuX*FiaQHtiK~H8fTW&9`M4-TAr zta5m*y>qXz`nQbJA#Z%KwfTF{d%io#Dz#|JQ)yY5h@`5$!09t{1MVZ4%d-eMZrbj9 zdx4@3()xRO4c5i)?w>SIbDqC|bvU2+xX=55Wj5X-&7Tj;eK|a!N0jeN7jcd6EHwcq zFC3dK_q^F#t+#BiwUcbLr|3xZ{?MQxO3VZ!8K>RqA_^PyZj`3J@pH>xDj3(EZR)+s zMb1SM>^V@Tis#p~#h`NXN*$z5bj0TREN5#u#)1cH+B~8|kaXUZ8~Q_gdC95z&*Tu= zrO$IX_m}M=Ne2p}wLN1Uhe+))TL6lB$DXC>efQ!hE`QJX&HS16%Q=ysLnxm%*G!>r*Az{hvdzHOL~tZ6)7utfMcz3G2|&0zuz&JG+dEvV zQ7F+Rq)^MQDvh3L(xP@pV2f3{HOt_6nZ;dvNvn~g&g@CVpYC* zJO9nx)jb@8CXdla$9T}<#*ddDbK+Wf^n(Y_j)=QaN6~5fs`C;1X5Jj@T_>Z}CjG^uAJ*pA5N@KO(6<|nj%zLJ zfI=WG(SDU*6ygxEfPZ7_2%B#IG~siJjamQGh~~iuv?hCzc+F*{?^PCTD8+6HxjD6q5ss`ax?jI? zYYK(s&?Q4|g7ddiZ32d1^f9gM2M75G{iJ3Sj*{u~22^E`pOp)bHr=GN!AmtV7k=EY zrRQ@uttrCO?c~{mDsBRhOEXA{mpK^}d}I8#d2!=DJ=Y9<(931~y*d3}QQ56R@{tzu)yYcHM%iP4d(LjV@f8AzK}CzOsYG1} zb@d%|4ey$c=S(O%IIBa&dme5qN(+g0e-GEbqv6XI(VV$#8-{yuaR$D1*Fv~WNNVBd z>xevV~pY7M|eY-Krsrt$1nWf6x>D2x7+lFYD25d5^)0w&bF(On7 z(vOru87U2GcklA;*M3GEc{3zH4hZny4T5i0q+vL`Nk_U+lpW`y7DB@|K!-R4^pkd< zQRjP{ASV2Tk|UvChg{>u*2wVmsu3n}sqp=0$l7vIr9C>Mhz;R(vLJJ>s~zbs)RIGh_OqIXj%A> z07fOjp#O<#V#$f4kB(1b64nK%70$93kz=Vk@M{qTy$%}g3!{Bsh0$7@3L_kHP_z)?Rk zrCG*x!N-GKPfp=ckGHR;=`z*!&8v-&tB+{MQ;f+N7g+Bcj+1&W~r zwlrc{nfovyG!k-hj?jF|an9%5cc<87U}^elG@AFw#UQ7^WN1m`%rbmgv60?}T8Jk1 zcDLZCbpq2#O$M968^IhvrVpxZDmbxx)J1>asY7bdcEk-rL5cQ}>&V*X*BS~~NO$gK z$IX{9pu^5nEP|Y^F#y!$6cgr=igF#b#OWA}s^b=h@D1WuWt&vw=S>-FDtg{&tnTBT zznnJ<-MhF?WDSzpw)iUJ!p!<><+*#L$CX>?dt7Y`TdY~C*^}m%n)vTL z8O!(OetiiZU%Ny*x}5tNU|FFyr}qg|gE&y~bxYqC=~M`v2gY-$dD}914BD4QToY{- z!+$NstJa>>+9Wq(zHc1HWUOfkURe(d*!wZU@`gLPrtCE>Oy%LILuihe%C=tGtzelp z7YlEzey(EeXEg2T^S(+0`Qix+ZKTOxIe%U)E{zZdCGli}(YJ@UzJ)b-2nsk|f7+pC zi}dpoQiBVV!hkH)k=%U=2lFR_f+o?wL{f&f{Tg%kZ4GObDV{3N`*w&6<~Vfqr^l0l zKtqylim^~i9mz{2BE!bEpOmDlO!gBD*-dpRuRG@atQMU2Eas)WwU4#!%i`t9LQcEi ziidod(xopgc-G4;-BWl<@{lU2iS)AgQL??tto4+lJ`*UE73*_e+gl#^zMU0l6veq|6}N6LDr5FQR0dBU?@F2RUip^yF$Z@FKi5N5TXtf~VrW6&z4-uW{o zD&1pv*+9lj@@k0MV&yu89RqSrup1N$vNztXCVFDPzArm0QFtXZVeVdjUV zpAmcr1xzyeSR5;5i3?G6&QDjI8DaSkZA=`HT6~##^KnjNPqdPf#Wa%RvQ+ZY+FFwZ zFP=crZ7es$7HbP23{xm^9*>|~0gFlB1p7zWV9z8ZWSNO{fMVMo&e?qT4{mowrgPe! zyo4pk;$yuG@63sY1;kdE`^xN$xc#jM5KnWUWw+@5%~96H>|9zqXb|nsZM@2sGr>$m zu{XrtVlWzizOuEESS@4pb=e{#MSFJQnvkXQRzZ`#Wbn%VL9a7Dg%slYs9N+MhruCA zpx<#e;kv2(9P~lU2Iq`9b!k)f0;!~6FRILS2d=vn*#iQB@_*)cj0TPN0c$Oy9aRAO z@hVeRtj%T5n+ZbtPa6A|rmGZ$QifFHEtM)syUke=S5xvo@0DE= zsJ-l#t=jpZ9}+BLo^OtPVY{>;}{(zD#@LMdMSv#8J_c_r@z#4)X&(dUQ&I^Rtl2e)oQzF6j^@K zSGIr8On}GUp3XF@!=nb<{dm>F?m|$t9hc#*ZxZY@;p_oZA_nWIO}}1XYbD=avwk76#|s5^dCQ3YT||T ziD=U_5{7W)u@%A_7K!%4KC(jcR9Ie;<*O#0#pJP!UI*9Tqf4&)x4W&(-?7~bKVTIy z3Sn*Nn7QHd%sRXuKG9Yc%6?fz4wJ>|<8(U#z49$fLysIWoB8sAbc7G(lK7$J+nn`> z(J9JbVQ82U_w(b)O{hFzO+n`LBV@<rbeEKU%L%Y0iKxlhOU zt9r3)qk-an)OeToe)d8GM7B_= zjtUx^%0gZHakJXz0w?>7MRTdT#v}}Yar!-!fZ_}GCSR-({X!zkxKzO?5i~MF~BlWDIpMFkNE+Xz- z_=W{J2xPyo)VkU)wob%~zfA0~{?#aV+_3Aw8`4#3YGrdON|Rq`rN@*{6Z}i}SDGu6 zB0F8b)tZNKIIF8X$~*3m_eZ#$_@at2a`+^o1&#f1Sn8_Zt@qLOEk@e?r9G=#TbuaNLwL=G?rXU!8fJALM_mcgKHxmX0Z@?MfGc*Wb zfQR9GPATe6oG5WZ0~YVgoQ@jww4U_#n3z6zc*{FrGE9Wuj5_`L5VV4wlGsXpwNz?= z4HcpGakk}**0z3OFT?`t`Yc~2IO~$;SK^pfdzqq=uL@z-F`ppseqdJgHS4f|eN413 z1+OK=lT&l=mCSjg?SlyUjiH8U$rpZ_K)+XFnVL^;(J^@}TVD1`k5q%?JP&VvzMM8| zYnVdGJf*RxeK&IbTwDrf-c+`4A%uPEI{lbb6myXff__zdG(n9iIy?&->|hHDCBxHw z2@5Qc`>VooFsNtQL;opZ?Y6-(lt6Sb>3tgT&Sy%_^*As&=Zlcwz9!sAW>^tu@3kXX z&sETKR=?rih?<0Y_I7bA?Of`~Z}i6<+w4@1hV~<=9SQ6H9U;$Kq@8V;>&wR&Tgd3q6mrVdeT-q}gdwF&^-$JMQs6KrI8Oe z%x}cYsD7!bXM9y0ZrzEqcKUum&$v+ZDjn*1z~{X6Sj}}YJ`%0Lr}j2ccR>W=pp0L% zm<&3Ml-jH{9jZF@OYR*{dS#R+VQ_k=_m-0R`aYJSIQ+70!MadJv|KNc^$eE#+?ah) z_sK0eY^?issro>6){R}er0%_=dZaq_RQDVk`f~AM-poY(%RWSR1?TwN>;!b%gXAq* zLp&c13o(x968nzNNzUeTbY9IXWb(8^FnxB3E@cSkQ1I!U?800)tY2Iaf4I8*;+QS3 zOqXKB39h(NV{!5>IVu_efj}au`Gq?qqx~P8d|2JlX{iu)F0X`)Hl`$^#d@vhgM>?% z2DN)D^WznUGt-O(D;&oGDc}xX7o&X>-BbadZs?P#$#FI%FLwBPlxD1quy84>&1M(OdDGLK`YkHYOju?G0tXM~&f4vEuR>43jJ)PHX_`Pfc;M@RUPUcJ0S9 z=s_+TZ>4q<|B4jrE$~f2DGgV*)z`o`CVn8A701QgyU1db#2p|FG-$!5lFJOK%csq$ zZ+!Bu6HSYcjBS%VtrfJ3A?P|)rRegVvSQAsvYEVD(@T0Ek4x1CNLe&fwT!{ThRUeF zx8;UpO&3*$@B^h!9K<+XYDgT9F0w0aW}jJtpth5$l^xcK(@@XoaU(DEA@P+!Lx;KlZWecf4aUmE~>UWYF$5zD}#PYF9b}o>6_w0bj;_ogdLlM6uw<}&N3*}OXNt8a#v&ub-mE~kLr|0Y76Nwro3qJe-NJyJ2XecV3pYM5q`79D zfST(E98y~j^kRI(K%k$J*WZe$d{OaMf9Rlc>tmT{@#|z*457l+i68T`c1LdtT~pN_ zDfDW`?;Jbcw0{ka@>QpgU~YnKp@Cw_EKB|vz*ng`w)dhU7NwOg<3MB*c1`h1XxY;2 z($=s-ZD*e%HBKF~*@|P4H-1(K7#X|N5AIj)+vX~h(pmW&>88ILAJ?vlsqbEDS2$sm2W2|WNH;KL)YSeb8)Bv zIN1(6NX5W}M-8oFYr5|dYa^qKQHX=iGGosqL3O{rAEDJb5+Kme`$xrv;@F1#F?#jS z^dASQU2+~Hd1bW`m5=T)iZ2alzu|+}G_u28JEdPvVRC6~C|~310Bt8J7DGM9mcJfP zg2erEY4$ldObbUd-~kc*<0shR~Z5&R4h~*MDNJbYQJeM=oKx!AK^5wS*SNR==j4{Xu+5)H~Tj zx)cevwXCsO;sl6D_N3MUCt;R$2ZfDtGO9p_Od8hu= z8$&+b-tjj>MjiNyE-CtNlrHnajC43T9cH^_!+KY;M~K*is!U1l-AxjRQ;_@$Nb4S1 z<=hFv-tFzDh75C`f}gzUx~~EfrEH(asCb?!&>|-=O%c7>@JGJfLhMfJ+oT)&&vpj# zi%CXr1SDuAwrY1!NgXRKQYOG1{|pE7k|KZON@{+>$Ay|khq)ZDgv_^j3N_RdFte!?M*ci;nv9=giVAElN|)fQtD@rKesySJD>gS47Lgl5tS` z6crd&XN8Xci#LmSs`E52vhlj}y7Imsrifz{zcvP=G_4H;H@%b9|`I%Q}37_k@jX>ZU z>d+S*TDHVy?cfrQ&zqZRxYe<@qx_beL2~!TjZeA_$*5L;L9@?D{S=&3-o{L9_GkT4 zhrzsSHkC|%fUU@D?uVe4w@x`*W0WZ_73J=<#)e<|2IGuo8WnsxhBT?Dn_jDU@Q5Y^ zP5l`2H6B|1kjBb|->QAJE(9>4p(-X%|J#)%;}GAv%D2a#&t_%PLF->4c!`K;`;u=Q zXmn5F#%OVO?s3W9_!X&xap~fEH!btGDtxCF?-DzHdI8cOr_uLfA7-Wu)s>&*v0IzC z&(e(OSk*mHaMV~`C^xBWju;!ZUEpTZsvm0|m-AZRVDKoC4$p!FRS52Ma)o@+qd46! z_PFs@(X7gckX-_CH{LP1E!ICWrfb?=;@XD}dD&&;I+ZC@aYL^> zy*I%E0s(h=KRAZPQ*$+KR!$;qKi1fK`Jb#QQ^jP>UpX` zYOllrvzAL``@#IB8`{Chz35;2o*P!>0>(8Dk2B;A$}Ud4v1AqWiEts;)%YeV9nMQX zr8m7po76YIrW#=RR4>;}h~*UvvMaCfob@qH3TAXPhjPe^oKayUUVXE%vJQs5FpSdW zFjrT#8{iPcKd03j^}(S=Ki^krvl)3yB=0?KMKd1kpfz5`P?T3^QlKT z{LXX4HA|OxzNXygN0px21QU!LkowoF{b8f%SY9JVtzmE`n9Xw$*dW8XGBom$--d@Wm1e4IC zQff8nX5-GS4Lf%0cTSor)fElu{-Z;7)5Et{WC_OAc^zxN=(RunQK4NyG(&NqPE3nh z;2muGmLx{#@}%FA*^1f+tZ@v(0x+VF?jEi-=tR!QiwAsl4ea95#LE<}JGM9l7^pel z{?ssR(Y|?qdzyBNxv+nltEwbod5JKJ*~oyvaYf=zGgZkGQ2Eif-HOp2wOx1y;!4fb zA6ust{h8h>{O9L78 zucp<#Q^rfZB4IfS25M}@pD@w%cR(+x&mpa`%3m`A5LB1&`kEcHRRuPcNJD1N7|Hq; zt-+pEq;!xYlEeB&v+0ocgL(JgikzycAq9r4dc7OBUlq3J3EvA#-)*&CoG^N#0C|yW zCvw=Q6G{e~h&?W_%y({T0m^Xt(n;Bc&ahRMx+Q*+{ydjNQa@ZqBT2r$b(xDJf;Ay4 zxx4S~Ckr>r!%>HT`lK=6C8TG5$!4pXHt40uAy%a8Mn(=Y;A$_`d95G_Saor2bH{f0*QQ_2 zB-VtkJ+hb_H8Z%uejGgqXZGlV$4t#OzA4~bHTP>F|1hZPDhQ+IvWL*GUn=3LQl&b$ zh4e)P^d96(bq}A*Q-`5T9*-kbGb{`(4Pc@XuuIg={hvm3GHuLvUOb`ak5SSeE-Q6} zCXT<#7Q~to${uDPR{A;!u(I5tC1Nd4=_)S%TbpKAxT;A@R=vhdEaE}2&CZwT z?Bo0_;CUkP%4&+d>V#gg&UGtqKBSh^f{M9wl$WImj-?*R-ra;v!@cZX42JfU;@;iJ z8FgUeRAAJ!TV7UP{Q z?xxA|8&BR{z&=_VFo@)6rX}9CkhIg}B1j89Capf3Go5ZbPxJN{-J+iQzKrRxs6;mY z9b(X_1o;2~vGNV|(Ahux@ zWCdgGX`o%mS5^G<;wUx7PHGg+zCPw^qWg_!)>5~Ge%4Ull=XVEvhBOSvh2sRmv$3+ zXOdAZnabyVVQ^CeF%am{HD4D2GJctyhP4$Lv__~f0jsSc;HCP=JDxH_HG>!>x>WK) zDgqE$F57oZ4idty{9f?xiAS)hc>Zk=el?eS7)-hy@qm6TT=**6p_e(@pLlQeA^Goj z2H8C?p&PTkJXGhL*@WZ;m+9O{UklNsAz!T=m!h+~5g((lydGz*Ukt5Np0l5d7c#nzuf)IcdA2{PZmbHid{$AYSBxxl^XB6U>EEDg; z7dVzttZh_x8Zb)2s;>-kS1k2@oz~pxU$m1o5Lt5P94^H@;yh4XiVXW4{vAW=#<@ZZ zV*ZvyHs@TG+59GSkpS)VVgAu}KhTe+q%6-~Eqy?)cYdNGQ17~IH&g2tI~`hq2guR@ zZ)IrQ-{yc)XZ6Hf;^s~K)HOJkT|nB-p*tr&+}(3VbwV7-Yh9i>kJzLJb)y@bx~=Kl zo~d^?;Pr%qo-4U^62vjtFKq<9w)K?|7F3B!exoAK1k=fRLVsf9H0Q&WN4k$@jjYXD zV%t6V2SQfZ+4%hT$@F5Mq+C8?8$S_LU+jApSPR7;{#1$NJ6) ziaz80n*!u2?&0ZAYV3#}%HIf+a_#uDC)}uk zVKiMBO7a(C%N{GX{6mnuc5viy`3lJX)w!gSmocko711QGk(8aw6W9dckuQwdT;A3< z4f93xa20#AaeP8A_OtDMIawG#c4m-!&A?OCCnQ2kl|+TtZ%(&J=JZT5SDE(7!1+q= z59N%9xFQ1~*sH$xA|&W%eR=`3zCg+-xI7>=9$p21EfkdeYJOn8#3I@|RE{(|h}BRIhKZxb zh$R67>E<|*pF+-hOX8GEdYhYx@Tu=?p6?v5x-<1lR|NCxIo8DPFR^jH5f zV}w*rZVh&q#Y$sFV)zPDG`ZQI?V7@7=|&j?7=@7qhP)Zo{%^y?w66uYUr(ybC=<%; z_WP!Ia_&znBM7JpPi-s89K4rw^UzFENaA+qwQ_J{f$#XKRvJAM!-uD9YR>)U3L`Mu z>g+`i?Z;;J)Y~0o@L8D#EH^l18?H#EP4N_2F>(hdpYc_h_Kw_B_iOVcqcgVF-?^#|CO2|}tYu|TQxSKX1J+9ymvQB> zwF$%HI`$JTHO0<5Q}=S%#=HduGO@{%Z9+h^OR#2yimbjjO`iBzNukGtX_a++svdPn zFOD~->>3lu=nV+d`_WN@8!h9Zt&PlW<0ZUYg=3}WM^(UY z|4A}CbJ9#xBh)us0FH49Y;fdic6*Sh3imwZi*Ks5-;|4(T1hz)JV~=jc{`pe5e7`W zN6Jm6^wJEyZHrks?HDBu_g(5mn0O@O>(j_rZSKfB9r9nhDjs$W5%Dpe`L&XD9b!WP z-rq$CAsb~Tq57p7w*=)M=jcB`l9H_E77twJ|C(HHEHcpYZ{AUd& zMPWPrBswv%Jli^=!opp8F@2NEE?>Ym=zJR3bHo$Ovc z?D6%D0cZBK%3}7>TTCK(T|Ujt^>Z65=ljQhOIoBH(66?qcluhvy(q(Io77D3|RvMvt<)x19Xy+gs6L(vwtc4~9=6*#Vjjcvp_) zoaX1aYF7Kg2&bJo8D#X{tV~+kbcM{sI!l)!6#aLGaT2zS*jd}^c$eElg6^>GZ|~Z3 z?v}p30RolWyk{oNK$UVs??+shUw*bODt$(h68Yu23rt{Ojf9L7RbAzA43(%PQKj5A z9d_kz*Yx$NCn}Vfs25*j0m2@kRixlkMP;$6Ib{=j0tc4%m5K_HT@84407O;Zv) zhMFa04Dd#5g|<>Ii#oabAm{!LVBex%)>Rk~F>jm~UFLVcTyZi(O|{VxMAcQZTcS#L zM|HPx_n&lEWI5ZZi#u>UU)icWZbHDW_Icb#otAXxvHPtpYoZkaU+yYvq4ZjWPm#^= zlQ@|KUMqxWjkP)jOjPL%DTwWw3Mdgw+CM~o;;nc*hApTr=G@l2kAI9&H3#_Mc1F`vb~33`$~meShfPg zH@-sbmT8dTgUY_~*w}Y$AzNem%IV|soGX%PrJIPg$eSdu6`e3nttVe49>Hj*tIuUK z2QNRU&Q?MQF4)gJjOZu5tNmayC&UkRoK8u9BZo8w##xhgA$0gM#MTg5-V##lyMt4S z{qCY(WcqY zJ6@7rsJ}4bC^cJl@T@~#|2RB%8#!FSZVHd%`9!gmyC>=}K&0Qmhgt>XOwkM@*(H!G`MZMXt{|Q55?gs@fjoEvhuqK1 zGGQN1tgP##xLC3z-4trBSkfTTbR6^Ko}*b(4oNnY{41O3VU9y1^2bgB@hovDb7X!g z_l2T{;if`|?cCIOqj;gDs_D)>MiTHj{qzs8)xbBejpGj#Wr#FwG>#>s-T-9h zlRZ$lzDor*Znb>40b7a>o*b8Ya4K1H`u!Pi@C@GCtWkkM!i!V&-3$sr)Ui_@4{J9o zUMDBg2Eu23I9z|5t#Ewj>NjDr{7hS0kY*Pz5liL99*(%Y(iEuGWjMc^fkr&9Ru<#LWq{bZw8U57nD4XOcRDv>@A%eyh{pk%75{ zHh)IidP9Mj<6@lY^55kK>@KuQ$UFj%r~Np`=DBG*KU-G5xtr#&Q%2uWvY7iU1L(`f z_?lUnse}POUzFE>*;AYXYpOBH(8=jG^ZM-D`wt->o>^IbLM+>D_HurlW4pVw2#bVK z2*kr6Ns2wlfggJmtk*eJZf2CN9Zz5h%GsXRa?NZ!V@NGu#3!Ry5a(sOlJ)n4K9;nO z3k&a8Z~2tB`^6F@Nm^Eli_cT_$4r*kk{BzOF4DW1?mv&m+qVFGhiJ!$e<5F$G);bh zE3dVd-iRj!oxv)Q_G-XrL9z+^CVrhSQuLXL!Dc|(otkevHa(5VK$`!fnBEmraa7XYW7Od!)oz2{H2E$!BLo^<%w*K%m{v*$7`bN0Es=q)*%xke) z-MX4TD)^c8M*0z)#`!v4!z8}Xpx{gSQS?X%HE;ZnN<+D;nmqp3?c2J=JRy3ePWm^S zzuz?2B%r`u2OV~scXI^jk-Cn5&kbt_4aC)G@*zO1wE(_m!|zY;m1@uDM`YfnwX-Vy zVxSHtc5biBATIp1Y)Id5FJ*RLz~z zgmS@wD-n-E#BCT9YeuCOyk!`PnG_GOCoZD=Flo>kJHWsMfdgwXe6Eo=?Dt_W)R;Rb{$*R9Sp;ej9f8fD+&dq*5 z@ZRXApiYrX0&>gW6;2>h$1gMGMH~ha-dtw@!q^{wysy;}va6;~$bj(KMC26`b1fG5 zj*FmoA(Jr)em7F)&;LePTCqNdhl+Fv{wX+11M)up2;0gRE;vNXK zg(GdLch4xxP&S|1hN`I>B;yMmIs?3IM@xCSKX978317OrSmFiaHIKWR@Js=fv{k79 zC|`S=Tf#(kiu)5vo5$GFUzYb_^Lb{Ucm}}_7$(UGCs`VF78`FYJ>2hhirvWy<)5bU z`Z{(Z2!3Nn`o!>@`?Zat?y+5^(BP*l@+{8s0voFxCg*sXoVvT2qxiH|tAmEoTKGsX z2YR(J#FD^ta+1&ilO-d|jAHKf3rTwg1d?XuCMW2%u|Dnkt5Nj+wD&P4Z7TNZiLYcP zrS^uY9{0}Rdq##oU1RYN_BSD$pqk1pW!2~}WAZLs9uM3jW_7!<; zsiVA`=Pdf>7ALHFAY==6Ef#t8*>0cmmitiNma%SGrFi-8shObl(e#)&I)T$FEt53U z`wwcSbFvrxsOcI~HF&aDJ#@wIL3XcUBl&OT%knM_bq$Li)1B&Co>!yg!_v!ycq?A@ z@NhGS4HWWlZg|_$EnBN5JXHTEj*SB8=1i*BK<2uc^`TRr(*w+opQur5jk!JIs4& ztS&txuB$$G4a*;;1uLdv?S{qA8eX!WD;C{8pa*9yFX*+MOHrr+u%2k(#g_J!4WNg6DG6 z9_RVaPsP*b^S{l+<44xV=SD2>P!RxfvUt90*?xZJbYA}xVtE~YcE)n@1t3_SL3S-q z#?E6{K^N1K3EtEEWfArg9n}QBjegk#es-~;vzC4>bKT>Qv zKXf{uIy!Lj6$%yUs3CjU5#Q`{)(;Tp+Rl#^&xyM<=LyAuA{|UppbjR2XaC=b^R%Ob zG?kNM?P~9Ou=FKri9hEQ4?(|0o8Pv4(@Ff_SK4E=uHImY9lrRd`ajEcWhX~R1l-NW z$`YZnEtf34LE zEA3yP`30sU@AwxaFJS9mFuwqXu7AP=T!7rakbeQM{(+m?B~-Hi3-jN$2LEgQy|7CD zg*z=^I`Xl9LG=R8{sqSi;ORzxXaVz(Yjpn;uHmB6^WDqlH_+(&XG&^xIZ2l)@DIpTpS(=0x{gIB{6??1h8FqM6#jP>Sn4|2h2^ zj&B>7mi%cCI=l@mP5!9|-Fe~E|DOZ2gE`TH?Ow zqyx-}p1yFhdePe#&SEc`w*w5NVD079bD}pdoXURm*@Z*sM@x5tp%elG|2aDs zPI4!hmK-sFF6snJlV=Q|S1+8Y|8vs1z?^7}E-)?mtwFR!7g(BHZx9{d1%^_D4E{Hc zb~l(4eRAQn52C5N!P4ZHhS1Nt!B7ghq5quo3#XtPOiS)Qgl@WU%7@TL-C!vBb*l zN8a`?m|ir?_kgdFZ~VU+I&%8qe*(@h6GZ+OQ1rz>% delta 31186 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 diff --git a/interface/resources/meshes/controller/touch/Oculus-Labels-R.fbx b/interface/resources/meshes/controller/touch/Oculus-Labels-R.fbx index 9fe929c1410f73059dd6a73f54e4f8ecf41434f5..9e9d92541c53c972e2557fafc1b7f6d76f4b37aa 100644 GIT binary patch delta 33082 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 delta 30991 zcma&tXH*kg+Xws*f`|wx90ir4B66gNsED-0u84@z1wvFr1f=(p3>HL0!3IGPq9PzQ zqJ*A=ra6KTr3EPo7(?hu2#|!7dDnfPXT9(9wvirf$YWFpE~XuKQceA*ka;_R^;+O+&z3*&fst1UtgfHHE%D!7~cKpA+jd!oo9O9 z&h$q}KhB4rAGB)Tox!R6WpZoJ(6EB}PMyv)s3jl#{)^hYnE%Rqb$)T4#1ZhV^p+RV zQE>qQ0aVU_g|f1;5(F}Q`1aIa5J(E7-faa|BL{p>fD99jlAg>AH@mT{>6nyPH3@E^ zp4n9!^x{U7eIRmIyFy*F&0JZB+!~!H{ZM!#Tvb<7`E8CmBv&c8BGTE7jua+MV%)51 zjKJx?9E)Ah=BD36SGD`dOMLtFohH5lP8#u!U$+!AiP4QX1(YV%!0VW-qu z^(&SX!w{_(tSkmk#_opMHW+a(_)h__&gHvrUenM3m{i zi#p+^TGqu;)=Aq1a=zOye;5%6FcsbrmAZ&Sx&oM!#qB#hg^YXr-U5M^CihT$sU_(RIW z^9;4}rEXWJNT2k3<)6-WP^r~jX=gudiXm2Ooe^Z51`%+wAdkxqcxyy)WwlE{KXrD8 zOJn-m?v+M=Uq3}xf3SS4$;hLsYoX#3>j$Tj`eY~ek9hK%2*d+tM%iXYU7YhpDt9E} zftJTh?24rhr9v@>JqI$&3bnNF%>E2qrZcnt%sH%wObz9wrltl;7k02WtgS3zeOzUL z$MkR#+wbg`#2-rxY!~4A9rx52Li1vo@9(`f!7bNjEZKxrbTK#BGWagUwXc>HOJB>A z{T1ZcFC~m?z|X{bR5y9l+#@;k(nKRJ+jvm#TlSaF6fOo{V#N77x{zAd702h1p2`n9 zlb#u8cVLj&`L3*YZgAX(bHvZAntM^?vC`tVGQ~y5XYT<=o)z<2=P`S(V!5cMxWDk9SwL z7UURfkk9W>TS#A=Cp1EBv_dyC3p7iFBiB#(Jr2QqdyM4UxU#aXa(mj(gp1kddv+wP zNv_}O?kVBMQE#m;ezCPXn(|Kms>HHwm>&Qnof5E7dl%`R!b0X zuCfq0{Tb$9oa4%=!4DD~{RLlKJ}|xnM99?Bqxk)VHVN7X zh(=vk9}C7^1j0qFyPGs3X#%dU`Yxlr$o+ALN{$L@NQo{S=3K?6&{q_zm}!vQWW+&D zk)K?9Xy(|{z4-MKk!H$28ldWC!fZKYfkd6$h*eHv_AnPG2u~%G0dK<<2+^%U~ z5I)HP!`N4UV!J>cK7XdXwKJ5`twTZF;z?%KXM@KL{+tY)8RBHITX_;~t-R{&VD^Ef zNu`2*K9&cJFnQQN=lga<3bnU(xT|VMK^{)-GruWrc98gfzmo2o?)i$v&0(ZZ?h#L= zj9LP|*G?aYSU6?Ty;NKd3y;qOic`0=F@Y zbeHkuhiD*kL!ZoQ;&Fc@`&?)FS?c+PZu>KHYxJl{>Wnpe^y0MD{ErCEXizrg@uZF5 z7LZ`#?wI&nJsZ4M)Af_t_tkj6%9us=E04cu)7@v{$I(YT<0t2}q32aR9v7wn=T-_e zDDM;d%u^sw7xIh`E57HMtZZxBy;rgtSVp}w-9!$cFsb|E_wU{Hz{6*3$#Y}lmHvLV z&aR2h9Ll>B#Isq2b0<`59UYp#ipI@<1^~e5=1`gOV18+p>wIHG@>x$Kg2-#^tXf{b zz#tL&jwX6-o|=-2TPbvnO|?vUr2_d$(Cs*JJ(=H-v!-1uVc-L@!IvkgZr-}$NH5t@ zHt8V}pk?w6h|w_sctZ$Q9aptJHr{r=xzI5t6NAz z+w_K*Fym$(BMr@an?u}+E8fq9{9Uh&tT?_f_L;rC3iPP8T|HZ0;oBV1O)cuP>bgXB zaTco%RVYC`YLoY_R(2^*38kVFz*=`<3Sb&NwqDN3X(jxPmQk4@WO$GKv5n{}V@rC* zOD}z954nF&&jE8cZbJ^03b?P&boZ@T8$~c)wawkw6~nO}3&5K3n$~WV`aHXpSV)d* zo~^pIJY2=9$;Czwt*5|0Gl^s`l3Dd(Nas@$;;`-3DAiCK3a9^#;ZAoiAfwUIAPKq~ z)@l35@41y+>)x%9-^$@XmJpt^pa0xvOm852k9-_p2in<{njfhTiKM66shD;vS%kcR znJrv9ooIlsaJoLzXH0m_bQ!NsG@c5$-M{4NDl^+YIjs49wfIil_qP!S*DdfdR4e5J;IiypIHtwyPG4u^CP>p_4peMLgnSFcUuZk0P1Xc}L-32xvSF9nmRac|w z59Jcx>L0tE?_MA2d_QIQ=c=Yk))za;4=aF7$|VzQ*cP9=B3(R zN|WGclX?}u*h^OQTXe@q1P0AAoN*!Sq7W!|?eN-SLH{OW=~xS^235KmF^B#^a9B7R zm!W&%ARV0^$#7NM@vzY}q{GVh`Sj-nmnf>^QF1G9G_$71NdDNEhu^1!(OeKH>q3P< zckSHz^r3XyJ40aNS8C>tT{~BA4I8DUG>hXQXxHodA3sdbzXIbbk?5Ok?D}8t{3s)$ z&p#4L{%8Fs#p0ly<^TLu6yNrL@)W% zT_&Z`CTts7vnnIFBGR?oyKBT~FK%Wg;jv1l?cv6Nn96u6%E&IZCRJH ziTT1WzSq#%t|ZdY=<`CNFrqr;YmFMpb*8}MGLMAxlBok8$VnbkfOMAvA zHBT|$^{aH@p2)X`)EW`?YW8ii`7$S=jDBs~)oS@;!sFE+C@S2ClF#hYgLZNVWb}MT zRBL=}-gxo8=2P7(=VQ^x8LNkW2x2S0#l&O#{#O%?>ElU2T_>mW=vwiR089vC?5s2c zaNX=b2Q;>%E02|H6-`Gx{<0(@Sd^)|tx>c%RtVln~957!1alU*-yxz@A*s`q=bOuX~8^ z;$|P~;zozBSb1&6<<4H)U}LC-<3|C-gm2G8Q5I^kJ=rp?rN2%>aIPPgfH_ye-=|n$ zNEzL2+Z$S)R);wmH=CW3>9FI0Ty~xYmn<5N_^h)Gvo-Fay-xWsA2QBl$0ex7p6!_y zN!hMu#x|i5j$d!IM&$^Jo=UfH1ElEN^NBj9wQ3HZn;B54<`!mda18ec74S0=XDqE) zc2^g6MBjGaCLZWK_{QK!nYOD;|09`T^h-QzQXWxgHc?m8=o?LiOS zyhN7n^V#AP2u{wR0}|J*4!jLfZ{s|Yh#DM58Yuf>>z>ps;qrb80%+Qyi%*Z-cE0j% zi40z1fd{gItM0dteDyo)bnL>$O#kD4M=yONd{?xSt1-E?3~RAo3Gkq$W}4m6$>DMQ zKJhKmx=4Xd4iCR-EjP0c24{nwGluSm8v9|!p!}#AGw!xjcDM)r{f*E!jD{en35kdQwA>BACY`2D9-EYMxla9IR+ zt8##)%aEI2w)(*_m8ySLou!nhXxwwCR{hJy^lN9uai`YLiI*Zoe$@votH2gy^~V@H zO80h59cg0jkr|l+6i@Y}>b@lZ^C08}dAel0X$$IOsVP%%UG@C(3ABykPrcrM*t{N* zT?4wqufB&i5VoV&J}80uJFz)@qu@c0dWW3oc}@!1 z2Q@60qw@K1W6Z~afd72cFfS9bq_t6u_9@pp=YJ|r- zL65!ATC5p0BHcgl-tg|-r~L@(HS?BP-@uNkV0mwrnQVAQ)UvN|bXwH-O&icHQs;fk zfgBjNif@#=+ASevS4XQF72XcNd=@h7zwIsAp(V?s;40){l1F7aklcZ0D~RBjZyQ?- zo2SmNE${`vsj@E6^nnrRZfbOXU9}`P=||lkhHshfyMvCwNA6H>co-B1x_tiZg|Rd$DyoHZTDsT` z`>e?Zm(nUqvrXr0=7V&u&A&Tb*fW1Um(jc(qbqmD=0$~O6^?6=jy$Z{%i<%(ZF~Tob|BC zyWM{b=->=91-rdues>lU?MgKQ&8L8fZqUVrAMOZ|d(-yDaOd9IuLs^dx0Ac4 z{4h7xG)rof ztrvT6?%ft)lFsq@t@_$Fi<+agwyQ*QQpqr2!a;eF4#m#Th&K@pGQ4FRT$kxeg3rj0 zCGbWza17$vIIZ+>mko1XN$Y+}prdDo*;Ji5x#nP>N+JfSjb)VXH9yYX54ZM<;%8Fw zyy(DBo>;N!AdC_ zOHuX)LogJB%fF=~D;*ej?wOs>HePVNe(Oirc8qQZVdTN<@k*n#YOYn~H(Y+5KwuL{ zIzl%#c#vP~_)q5f8GVn4@54%o04|5}o1U*Chqi?_l$4lEkNcLr+~$lkFqG^M6(LNvt;&CY zW?CW<&{$n(l3!)h&EpTOi{`1nrM|v;dTqfi;Y1K)oKfqB|BpeZX zz?jOefn!~M^e;AGgjibs~LWK)qvvu%^RFnhmJhzx>orX;0)N}_tDclf3K*N z`P%PYHQ(mjw=z|+zu3Y~Pnnp1x zSKB!*t};2fH!WtY9dWlUfK$~!THahbjsAFQI<4?$kw4u*h!n_yGjmHSwxQF^X{GpMq%yT5N=Z}qeLY-r z-&xGS9VGN4jq^ht!GA2u7ONW0boiO?T11x-*>?{XzL<3cMn-%JPx1q>>mQB2A2efb zKh8Zwe{>PcdhlS{@mDERu>0x4vphkJ=lSKWx>l*QRhg@rLzB0Y5vbRb4Zd*xx`g*DwC462Z(ja-ejrrNr!c@N|lKbux z^K(%w&`>1vdbdOlaHAK@(ucI(twjIlC6W7jvZwue{Dm?!l$0ln{QMDn@o(5`9Jw}2 zt6x*FCzkR=w2={(V3Me~_^0S_PM7avLx8nG=J;I!Xh4-?XH9k)NzAAmo&o*2e+E4- zcR+gQ1SLbaF!z+U@u>p%7ups+f`0G|S&v^ve@527uKES-@`_H$mDjM_@H0w7gQxdw zBrbN{Cdk)4iO_crmPd9x+O^kvi|y(g!<|Mf^R02CO2m>6wqNd#Okc+!%h`&Le?OLZ z`Mwx21pMoWbvhoKw_kTFs^c-tAJ0DtWcJ)?I&cuTntv<;Ux^KV4v(h-}cgN8))}K_A z>ED1-T*x^MO7q1IYLUP3*Uk9o5RRwPbZ=RL#k&u+K;U%7A&i;3)kyWEz>oDt!`jI3 zCqN{-bognqQicu9GsRQ-y37^{rm&!^&i1R-WBVudz1gM1+k{Oj!J5bmZKY2Lxu6cc{pM2L( zXu2i#u?5Uh=eIfRzj2rn1OkD%CWQODz#tIF$=iY9j}OAIm#@ojRRRve{_Ds7>l+?{ zU4@nGiyZG&z)gnfSm765fRgjKPG*+G*n>n~Wsj>4eU80-TZ7+i;G`G5H@kN%IJ zcJyB#{jdMGEi3?vKl-n)XN9e_g@r=>t+3j5uv1V|O#O8`SpO;LwGUX!yD%%AEX@Dq z+W`OL?+5<%(WfPbKU*6e#=GoGZg7SHXgmOw0eBYVhI?XUhvNZx6IhP;XQX!#P4{ zK4H7Xup>GY1ioc5f}W9byjK}$awVT zy4L2ir_D31iZVBE`MEj#kJ5$>8?-JRr@-zyecPtHo>&??t}_H@kFBkV*J9&h$RH?a z=Ag&j&~sx^PHt5M>PRrl`8*T?@wJqH{ThmWtFN#d8?LXQQGa!h!ecprngHe2S!Tt> zU!Y2lSZ0NB78K)ewuJMA`z^C98IFXo^P-(`CeeVPh!y z6h>o0OLq?wMF(t2Z3YnT1>vK73U=HU2cyS?E@;IMDYlcAzl~Cb)VU1-L7|$2(GgXTJvZYX< z5vGffPVoqqS!&G*66@0K@pP7R7uqU^lhbPq0)$0SKTH=Pp5n!LBre9?rXufwiHdKk zccKaPdK0f)0FPu>YqMDiE1x1RnH%dtbMh&;F#FSvP)w?c6GgCacWfmAw%*Iew#|RxA2x5ZdeLjUf-XVCKbDc=+6VAx`Q_b|!yqA0K`R2NYzRj;6U+NeuED&xduGd`e~Wd(Y* zhk2+kL4%Jp_C@@e;@Ro)w1SU0H-{!;#A{|>cGRQZGv+7!R#d;A^%cfh94(Jap-*kj zl17Eo zc1xY<-Q*B)g0O6XYDOvMkn=nxuktB0+xB1?qd#H?iwy9Em8DN%$2%Hx&nj?2J_b(77bD6LV&V5X7P~}W(-;!08>pN!a6g)6{*QUUN4+4%vHwm4MTM~ zaj8t{QuHE;M-9~lgi|~<)QP+NZ3|#M{7`|7xlTgHR$(&RSX-=F_ht=Wf0dV^*C7`1 zLv?}K^K6krs4n=fZv|XK(ThFIW`-?k)?e32<-KeDAv#L-OM)~CapZc9SiWUUO(%}$QO zJIP5u)YJ4)2^6xi*%A-CeJ2LYr=&4#WtS6|v)A-dz!$!xeCq*>k60F;dpsTsmEdo& zmm*rK7anwnN&f;!IGLN5&(%o%fkFS})+@>u!Lo=!yj9Y8V*laL{)}UABN^ z0D9bqN~<1rQ=C-nEUJ``>;PZ(s_4RZBLglTLxVx}4T)zbSgy<+(d{TQLg|VaKysCmKru*0CeVS>LhCmlxo<_boW1il^;FGPtQyV+;5aTZy}Sa~ho zFRl;VzeoDA?h@~-M?5_-;4S^vhYVA_z5jXi%$$%SyiP*Uw(p40wqXko*__%ONKp6+ z2#Tjbz@9zYM^n8t8!Y)$x|~NZCYD&Dzg7#jZ<2h=r!?E?Q@p#qWbw+wixrxEqKn-x z+y(DDpL}A>?$hq@crP^)j}~9aj0|DCl}aRa9`V&)6p)Gg%m`S?T^rub1{fRgE?>!6H7uQr6_@Q8pGBtXZM_SEv1+|xrcZ>Q z)wZ>weUm`tc;CBaki;=FtBm+dS3V^K|_X0?zzYe-V9G~Rgl^%{h% z8U4MlI$a&Vg!!4K#iUfZovchOV7wA!s+PyL+NsFehUn`E=qe1Am z4+-?Ld6c}|ZCe5~nXlgKW35drrjl-uE zi%h+igqF2kIQAh+Kt{C8A`72_bve6anbBjh^*OUr;7(d{q1iAjXQfGe#cWCHt8qUo zM5%REm7Y(4z46W08_VRMGtHMgT(!-5N58f$Z3E22jqa_(mXe`t&?zka3tCAAgxeH0LvwLBT~a0)A1_NgyIz*G z30U&z&%k4VXosVilMY&$)!AXR=g-Ki_j_lsh|XZV9=Kq7ZtbM0Xsq1d7_n$>2qD-O z58VbcG({~<0mby}4+U4?6YcDQ$memPN{eVd0(E_-7oO}8Gk}w&Nf?o-hju}D1w z2sq=fdy-g!xz^<4F3MZwPvFLQ+CWUy0y#Kqd*|vICGVAB$?sUS-E7yYSs03qde82z z7!}F>F*cL~-W2fHK%iP$um=)9WxHqx2^+^iXcORzz8JBD?5128#AR4Y=%sKFfmcvC zJNtm3_pGpYFWp7?sNPpvEh-OK&7_KsJ8_3m@k%)F7rm(1vnk8fra)W5Yu(taQwxd9 zcV;4OzBM(;GO6FFubX>CI}mUE;`uh1RbpFra<3POuWy!I8SA)q+Du&%Hn{&R2fM0+ zZ4#WL{qk_d|73{PP6;|DjTKCLIyl_Q z@@gL9i?^nW=hGO^#w6q!Tib==@Q6!9MFuv}@C`ji_MGw(HXywM z>_^sj>}Wld4;k>DBbdA&vP4w7a?sg{+fHTr;! zTue5cuGH}L-DxMNFWEp2F<39hZF&tE$Of~5j&n=jQ)sjNe(&qN1Oc~&#Mfch)$zn@ zK)}3pSqvT9WQ6{_yu7ZH_uU$m zsEbhUM7yAKlwpfuMoDDJ$zB|o1m}@R&x1+2qW3G77e8NwLGUk>j+vsiB8NVxtgl3Xx`q8spO$qv!1~`Z(V_T)m(hZON%4HX@1K})!?0h_^dhEYH==s6 zs%e^cL=)~VFhEc0+X^(tcyu6RHHuff7eaW?308%>3$!IEY$19!4jNQSXsVydi-QKK zUlLqSKK02E60hR`nKf%AEit^&zEK@v#4WPIz`8X_OH$&+;E=`Q9v}gg;PfIV%|2*< zh`MAgN$VW>B`pRwFjO2CJ*f?p=y?d-$8o$z%6b)Tpod+16mYs}Y`f6Zt54`W5bBE$ zwQqGNu3|hA;g+yCJqE@SDZbdMcgy~mUD|)Hz#*k$RXSD1V9g*~(`TkJse(GP^1HuJ z8nlw|zIuZ6O$Q)<$9;jl8EPOcq-G5ceiJ9hO;nGFD9A@E&g(1&t1pq~+bJ?u4-+Mh zh{0>5IOsek&2QHD6L}WO`#Qslxma$0tl*Xyrv`Ti9*{XvGK}=zs*TZqZUjzygSn?V z#8#kmOse4O!477Ko0^Mj zWi5&jdW7uC2ff2|8B;Mkl|HEKnN5C>XgG1Ndb!0y>BFJz^fv}_i1vELa6P2oCQlV0 znog3&Eg+=|9=0Tx_{9+$@QSA$Aho%B#|*s=|7paToMayT@?c$4IR8*T26J3W5}D4}cK=Cm@16}x zcQ5#a>B(s&EW{9lUAjN}&Wy?f@xB@`y3` zBn+gvVzQ!1-I8GZatmif9jw32UNsZ0LJDcHH{~ne2)697(kMs&i?nUczS8EcDMM^o z%BE#FK4?N3Iy31lLG!Uf$qFA~i(Is1;4?U*nM@Uquw~@Y3eIlw*xZ-o(&%cx>I!UJ z%wduDjBFA40Z8Yh)xy^4mL}3xJG|bJrQ5iZrf;M;>aXC%lSXsYdU7Aey=8R+RgCUy ze2LGINt>bzKW^mu7(xcgA$Jm`a>BL+4(4Q2Z$S#UsZcEMb(eR1=2wVg0=6kq>Rdu1 z4MbhSi9LKLkCJN?R8V3V)vUpnDXrU${W)>CF1|VVajOc=!5Y7k&fu750QI_3FS{R9fz&|U@ zg67EjFJ6Nj*gzg1mEF5ATX;6C4`V+b7gIDrv7N+Uu^b}Kp4L@6G*&?`NbIqL*8?%1 zB9W&hr)PXhxb8~2IJ2Zc=ir;*1tlRk5=GOilU{69EMW&b9aCAQb9MC?mW0m5lenLJaejYe z)jZQ3|E*~o*TMG>KgjS++<7eEO&Kbq#iXtVybp+@Lj@?6$8)|F0=fiU~3 zyK^qkc4fz0bPSPCe6lOsPKZ|$>yZ;Aeap%8SL^mb)Qag!!iZf;4O4|FR8^|9!s}8r zV-;rGRYI({TEBgckN&(It>`hB{mIFmoj6GrZ1kN&_1^^;4n#u`( znZ_S&G8XjrHM&hR1p0HnO>^R!O>G_jp+crT?`kW?w-IVtGkQbM0yx0(n zX-mCt$KVmsiJfz~X-=#A3-G}vpIYcT$Hf*L3}z@5*H73}HB?KUIV7aF#H^QzpLPYq zKt{b?n2HQMAt>AR$n3hx!odA40Ad(iIhmHh*y z^{19U7e3=q5F_+^dhy&Ey&u(OU~KrszEnY_Zx~9Xg*ozCeH11NHrpc%OGsst5AUo7 z=!0vs#^jul#Jb*f@z@>)fL;AOd1Yj5#2Y;{0lpaFWCU+4d%Ob^%muq&WCO>bANlDs zEwf8UpQm{F5yv&Sa)Lc_N1eOv=u`d@^`@JxZt~e4^~|wymK(ylXEJzvM=eSc)5pi! zeTnksNRkC?p}1z+3-yry{VE*BvrNjoJ-xi>6Ijm~$dUz(%eb1((zyMO`**TNEsHP`mn<*c-s#P4s2P)7xm*gkW!jpIKg1>YU0Rj+9@It+@%S3 z_ecfqh2>LbpDYT8FSqhgi$V#9cQEU1&N|X)Y8Lup6Xw^q&(+mXu);>Yh9g~1MFPGp zzuPIYLBC|j7*Bc_k!!;=U7QhL;^cH@gSgyk+AP1Q&qo9r+y#z7xqX8+a)cY~2)Yt5 zZQt5I^3feIN0p1J3Z9YpcI5r=a-!4O*>!DtQ{LLCEZVExm~waY>VYgd^gU{Zh_*=cK#j)d|kr zEEjyX=vy|$N=VyUt5;Th99)^;1UC*9KmW{0;Kwtt@f#b_44*^*Oh_cH;~*VOEgNfh zHLoj1i2ZE?3SiQUns9d@7BlOIabyf*;DFQ)Awd7*aeGCi-~q(beOEQolBG^q>z#59 z7uA1oV3Imx#R=(Z7*T^e=_Di!TF;O%6w2J}04|K&pnFEDAbCHUkD1lMPmcFvuK%5+ z*6i%-U_0B%u)Z~utqCv9xgilKqnLVh-WXXt#nVT%Q}3Y$tEu`HyOIg@E0>5Ge8J*T zJQ5OeCgw8LG8kJE@o0A9=S5I79|k2kYkklk}9adp~5G|AP4tS3ZXuuC3T^| zLDS(6bgym7VLoj**ifI+`7 zj(c7fb)n7_Nk&>@6^C%%oHz=tTpTT1)<_OnNs^u|?e@RsaehPhzAqa*oR*5dlz7l!BOw4ye(bGW`E z`Md`U#I;n@pOPiVcg`<>rxplcbc-)>;4uhU%c42Mc|;=_xx#iHmw=lE(>}CpuwhaVp(5&AP<#rpJ%bNLw9ct5Qz8r}3<-L(=ySt( z%n5wOx(hKDGZfN4Y~njR`joD(KH02*(&u}W$ZbO?ee5cbbax(CivVjycZ4WP#$Com=fZxbmHLE1~&*5Ljk1ker5Jcs6Z+| zxIacLBg=Hs1v_lt3g)YW`M`hDTHk*4QoU!r#$Bk@gSeu-F^HW74jCljc|7m(c?7}) zsS6i0Fvwnc{C+PkNM8W)Z$sPhrcsC{VgTwHq%f-SWm1v{m{f;y&GP#^YEusp1;!jM zBgkS1Ws7PbcHAMmi22V(#Kby_s(KQ5MY$K=ELA53?{q|yfG~h7i1Du&+Dsmx(+L_s z)Ep_}4}*Tll=4xpSNK8LB1=1=WW;Lv#p3#lvkTICTj8(=0mg%u#f&lLHshGxBVy5) znI_|`740F%Ck(uTQ_Mkb+)-hRSs-oLqpox55dP_Vddvao!OizreV@v=i^ zaMWEY@i(6oBi0pl-srN}DL0|iT$|`VcS*(fw-JLg)8ICJ?>$`vPbSm!zOHkW+xed@ znAPk*e_@~PRycs2*rT9;Er%)`!d~5@kc-`d)$SW9N-|SIPthgAM`Dgn+A z6&34TL3BBwlEh=9`1~AN;*3zB*Su`Kf8XRV|9CV?6)0p^N09*8iZ)|K_ly2a0Dn4| zLTxnGu(D>1GBZ(0VqTGL=~%>*u@zp?*giyOQtZt3#yJ9UI0>~FulGB`?t2YU7_*7- zEpjTWTSNmU5hkhhDK~eN|7EtW;FuKZ0T4_juo~sclP37EDn-MFYi- zSZ}G3SL8=DK4!wa*Z3!+jl;w7Gw#1kxIfD`Sv)!NN%Xk;&iv)=&)ZjO)nb^&M)}L{ zO>p(_?w{MbyRZ0W*^x?~JBT}_*(lX^Zb%T2r&_(h{1b~C>7)^S{pVhJ;`W7Acl}je zH(K-$9xTa9cCd#+Ak_S*+{C6$vG`qGBJ#!jtKwQ^|DmVJD#sj>G9$zH_-n$djZ4^X z_Ui4~B5iP9@4=r$K9Uksg+KfEzscJ*9N0qI_MzZJF7Q(8kHO&Zy7#=~1&{FVwxp*( z`{jb(fXY8TqH$b5b5Mv*xe^;_zkz+&EG~Y38h>WzpC@=bJs-_Urf7=kpTCLKlSBYG zOYvY9p2rmIGy_mn7Cgowzw_vVI*GM$Oc!i%uBUzfwXa2%9Bx4s6l=d0)H;|<(PmLr zI=*)55Xe=S8pZe@)`5mDhlAmb!2PLP{zQbwua`xC41Tn@?y1Rf?wqg)gA($y=on}E zeGf4Z_1F87T2q8I!7urvQf`#+k=mJDpZ#M}Pg(#C7O3YrrHrox7F^DKs554srCg4^ z2K?G{eJ&``H}l<&Y-&l#Q zRdTWDS-50_lS8c*<#_iepP9_8C`tmheTlb@bj$Z)BPJ2C`` zqx;+EcUCF>*r&6QKb+P+x@CpgypE#u1)lnkLxkr>a@3>ZF4MsIO%_bAXHV_)ZING->-eb70d5&0a6;IdM79Z?|(h!j}Gb^0KWsY4h1OFA|f< z3(oEl+3mk_1r~c7XaxfyB;<8xD>`t zj%-|j9Bxp&u$5YL zAj~_ok1QJw&RaacdvzbJI8hw=5gk`3h;9h`y~?xhud#OX+AR*{GPN){TqhJyc3>aWX(?f<@J8v5Vye}}3t5ZpUy`)2 zzMwu<&K?4pNH}zt`>6zGfHZ2K@jo&*JI8|Q>%^vCv7DJgA|=IdNZR)U#g2J%?ETcs ztCZ#kz$mbV>5!i%U|kpmt;e*H?QDXf&Em`G*B_AQWmW$nHSAyBf#N5HyvU8SVz#3)OMyblz8bui=$PWPP5~i9?G%1yMy%NU~B&$)Q=VKd( zEx>9zU%a)D#r3Q|eFSTX)W!a;+<{AikgAD#rF+e9n`pu@wT&?gf7c>$3gBuV*FMFhZF?Y)R`tR^9V#W_@5hd-HWe2eRRV7|w;7+uuWB5KO#q0rea zw@=bHwd5?&QwdL59~N!)YM+%8*L8m%hKw~SFCY+ll|t-2+N-|0Of>4#Co|L8{1g1P z2S19Ud~<#Pp??)plFy$lxZXSHXjPoi282plm>=VaMNtFF0V-iMo1@~pA7X+z5%$hj zxj(}X3*MRlEw#JEw>FIj+E->~`iGuikal3*XQHh0Zq{JfI;C4!|4&nQ9?eGgz>h!G zs_LS2u`g|vqV|1Pw6tO=O6{s@31W*awzQ9;i>1{NB%-RQ*1jY{&{Dg^zJ{nZworl~ zmf!Jtp5OQToj>Nx>pgewoilUh%$+;u%n+&64biivdij%(KpjX1^?I_WsNc2>MjzP#G7 zSMxGV4IYy^`KK=EugX%1_f~Dx%i93JUp(#-(P*^;W`yWeNn#|o9m8BkI6MniWf<=^ zf~&Va$Mm|Wpzz)%xJ#$H+`q4{1;Z`JcY3B^^;hD)Rv-J?-g^Y)>Q9?|SQhDzeNp%0 zxxG_$J{M_dE9%_%l~}h&(Gl@ClIwWAYr@B2Mdr?#6%m8-iUn2T@5H;j#gX7)WZfz3 z$6ZjU(kh(=mG(4{Q6wU2TrgiU7>?fIOX-@9C~L&*T;(%G*73T1niJ$&Up4F}SXXzY zS`WX1FlM`0q&%?$?`Xg111I;+qG_Vqy|53%ubx4<;_^k{5$Ux{xkiiNf={`>9AJA% zrR7sEchj}YtQf)|tDR#uDL3N9|8zqkP z4%AV)v3_OXaPQqyD{?hJOTGUP7BqW^Yt-zedNBb1JMyBZL>whEZS=}j2UMhf5d-oL zYkxub%Cgxo1x^yxs^j79-gf7)%*&`gCUgeRgsc2P=&OUm+qV)Y5plRwm zsG?tf?4OsV(JFm$Zw4~0DpaVYTWvFJxXxZ9s69mvhh+@_4b1rv=&d1(o>-Q?w_;M zZ=vi|hDfLHO2C9Z%zvUID$?5bxM7Z}9XClHVt+>;K=0h$5s3_EbC%%uAf1UU$w?MQ zm`xXDvqfBrrSV|&<_J+KgGsQG_2kb-&y$HJnS)7EGFGk(-`z_0hOEX&e=XmuxzM)) zx4BkCx32B{__|Tz(D35}TPON?j;YQfiGG8=614`gEloUxtvHnog-K4U8`W*yX958D zJx)p8t79EE;%DX5AQvgMDV*1cJ$zp;Y<9si@Oa%s(@y!O1@2Ita(PnQ??<9EO)cCf z4fw5In)0){x(J`h?brN6UWKo8($22)!$|!(ikX%a7);FOQ8^!*bZN5j zH7D=dT#h${386`_P)1=vh-^Xd1DG{ms#1|;VPiu%YsmfhL)PW_9M*qbpe$v^BQ=LcXc$%GFU_aY)Tl+?>MTniMMJhM7=U5w- z$1aONwdMci*(YjSKsCI56RQz_)F~N1OM0p~ci^xPr%lc72_^^1 z18drwPmHW_T+vGI+RhZe$t*BcL7j+4&Fws_I0FFK=zoZ0n*m-<>T#J?%O}gci3^M& zv5Qay$<^QJA#RNZ&+p2 zjRJp39->2y0HRW@R2c_*&w|%%>;bp9`Q5mC|Jh( zGNXx*iofqksbdmmZZDK%`J^9ZRs-~Bb6i<@^hK1B0IL{q3^#KM7rSpHD!K7% zKy@qW&Piwg>MgSGZ>h^OO)rwa1O24Nyn9IdUe2GuEnHIMF)PCan9{MJ=r%K1)4m2P z|JIsh;ofS#Iq}rNuIo36kG1~wH=%pUm+bEk)Ba)Siha0+r+t zkn1TTFuD`P=nTkc(RC|PNgmNm5=mp<{uCI^dg#<_(|~@kkQ*H>jY0&t6GK7!^=VK~ z;XtbQL}53Q*JY?4wndB9P8rA-fbk5BG_iJ6ifP41h-&@e57;WQT2eDehPQo6M7KNeX?YwSGxz>MhH+Sl2meg&Di4| zs3|)1Z1^S9_U8t^7Vg95;q#-C1IrnU##dV#!G2z55C{(pu_EU7eyp$CYF|X2RxEi6 z0ALGziRy9jCrjF3dP7PElI${Zs;FkimlZ{onEgcDvQC%Af?i1U2a;?lzNBxb;#0%l zEPX1_<`Y5q!BT+#g<{6p*Layh9^F3i`-hNEx@#=i7B)EI^n)RaR$h&<&Ol-K>w;}j z1M*fK&k#%&=OH9jq(h+bJJUzU)K{SH?OaEiJFge^U?OCNb|j~w8a;N7gL#TPB#ul| zgq9p5AbVz|_wDq%ESF>DUCpB$W3tWQ&1(q(`)vUW+nAPiX^KahKg~V*hF^#YJ>|1M z4(rMv{B%RqL`*PqWI|0qI=9B>Xnj+=TR~$TmOFGD)=L~v^*GeZa&s$Il=6)t=BoAX zX)Uu(jsEGEZ-(j@G$vUdKu8Zy21Y_my(hHZsRd@lJcE2wf5`Iwo$#Y`61Xy?63G4=z@iLDWKE zg{RNUf!6KH`rtX691$q9sy0t$UCPkvd5RAJra7`IVM_R9pz0uXC~>3evVLWS?Fl5+Zyh5iLs-o-WT zC4g*987bM80W1K(Lq_l6lTFF{V^Tj`AA1a*jrI4bTvG5;$9%n}JR$wck7qixRP6lq zEmswan9(DUW9a0W1z~?a5e`>FFZ3@LU+NTn;OC6NOmJ=!Cf7stx`^>3Qjj~$VYYu` zBxibl(NXP~TH|3cbC`%1=+fZq8>wZOa|=CfGgLBv3&AWb^gHOuv(w%SjuhY$&@{q~y3$x5hupzxkSCJ3dLB~fzlbNk1=6&UnluVqkHB2XNYc8o~ojq zwoA;eXGf*wh4Sc8Z9nml3LY`eP{?oV5^=VdV&W}dzRT~3Q(&q)E@Mn`*2|E^@4Py) z7C4&S_F@GT&YDEeor`|z5?NRw`lfC!r`zR47iU7b)^y~%&V62n+az`y{6l<;4+%OdoPdg-oo> zA+2dRj$@EGUFB_M)EycTFUW(wt)&f%Cvta@NP<7M4uWWJ9lKy_{ zzTpM?t*Ny|%q{Q`2iXs6W%?v#nC8a2WVjs*FCdkO(7N%7xYJnC?8?T+Y>ao+lNy(P&jRqqp`m1;; z7VJ~2p5pM%tDo8%Fxr+2P&7$9&A-$u!sBi;73tUx+HI|K*b<$2g+fAcbP8tMRx+HqmrU-S$eiTF^C_8K88A*erk?e zET4^#R_XbLFaH&#iG(UtNXAyVK8+me0i#s2C?zA;OwHbEA^W2bs27{D!8^e4@#L!2 zJ3TEo?WuQV?rv-t7gTY^QhlFKnzBj<*o;*S&7%%qUr_OVez_8Z{l&;HUG9e|SNmKc zLMMSIV{)j-%tNUAVYDr$@c=*PL|txajGw-(anj^@;0gjdo)Bl^QmlRZZ0(ZXqGy z?8x)1`gQYHwZlmtE8t^wo(tyQ3OOPR>+u>aLSOTQpJe_R7nz94I9;*uIZoO4hF`5! z>QNp8jwyTBIJ}Eme>o?ZjS$g)x3Mdp%$qx4e5F(LSu$u-`p6W7gYhZyH7AAK%R^a^ zZ{OK5Hw6_`XM3Li^_0BDdx_=+Axl!$8i?F?hb#ZF?K4kfFpFIKQh-C; zNUhizGZr>(NPGyX^-03sxsB_^m6OVph^1wrrF5|dNPlQ#^BuxodFk7j)zr%r{h`6ky*N5d6wmAi38uKoPOP5hEBOF! z%SR!O%)BcHH&k-zUOZd`=s!EccTSzW$q@YXvcfrOvim5pua!5xo0-D%hLBjqvS*OF z-3N5;z7mr$FXYn+9ZsIF!f|mlQKQzo=Y{6*_kCP){W7~cbB@H>N(ps1kVy0-I??B; z7j0bW4y@-~y^O4%`(Zw{OWUiM$C<`Eu|S}8tK_^6o=K<7UGexHtHsI1G)wqU?Vv~6 z-(BC|zH;_B>1iWAiQmt$$acX!THmv$O7oX$N!X?AbwMcz_b}aO>U+pkfdcV6Y3F_- zRyYLg?GbJrA}p}kZ*teKR=Id&zkzSb&MkGo0v4Wk<{UuvO*@3uF$$9v;4a+7j{2(j zV^?46z#OzAZ71U*ye7)o>HReO3SAIhrJTeH?MO*^oi8pTNb}^Y6{LF#jq8(TA=s}` z3`UsB>>_9Lx8cz(l39-U3&~y?AYT3IH{1_wx6xWv+O0&3oC>v8^ZVB|y5Qio@<+XC zu;NP_>mjN08&eA+YCak;$ix+VhE;@Y-7|t)r~G9f<$-SD4OS10-$T%jm<7muF29IF zC&M%|=c~k;4f+mt>OL#B%;G#!s6Q6U-sQPG+OJStii_F~6pv!FvMqeQj8*GVU*por zT7UTH6A9w4N96L+WA|-mXRg$JY?Wr*RCjFfXLW`sYiAPf zcVWz5*oAyXldPmqMVIEvh)9)+#bOM$PZw|q(z6EKblkmhPan4eox`DMgG^WrC#hi2 z{?zvMeG~>9I-KLsRg4fRzS!Z39(l-@#6EMdr=5sVoBzh|uIb2jDJHzO0-gQ={#*GF zmr&mU9Yj+73gJhuXhI~ZII@9Qg4#LAC*W@D3PN|6VUw%4qYDpPc@8I4hnS0`eWR|$ zqXg?&KAZsn&%y**Y+%iV0ed55u99_RB$&Nvn5^4KwmR+8K+}l<&Jj>$uot2VBCS5z! zlARDB9d;k;Gu!8TjFhYM!RGZUuhgUr;TU8bmZYG}?1ZGAfhxehco(-y)UTMMM~H89 zA=0G&U2-o3aj~24mfSffWp+u8I29Stm>0^GZ?q;k#Hqk_y%qE#PUMM*RB3h5?4@C( zQ)RBtM3KdUVq9P5Rk^VWn@tVmzzbaj=I_kYQ>EhU}9WuSKd!x83Dz19`%j=hm z6SCTbwC%#sNmi0h#67g(?3U)prmL1AuOWwCMYP>;fOF-xkx=sE=Sd&io)mL$qJds% zc0UMrd<9cPaUOiYC)gN=s@C^2OTD0%JK;AVw=QQOTHHJT3iGH4y17^A)*Vi=ei~JW_ ziNGbCq+C!t_k#Z$*&C&EgzAh|u>@Ixo88EC!~)e&$j3u4*`a8?Nh|>IXpOGt?rz(< z_ED~=4mK%ibci<3m_qLW0D!tbjhKGPl_#YfMsZjE8Drc0tP2%WH*>4hy}_wC*K6hh zM^urM%GF*tlu=g(3#!gkfJlu6SiZzM@zCi=jW3p&$KPbO&`lPM)yoPVKCx%-ue>h7 zwA_d{y$9Z|rY=d*ctSP2fs2RaY_%%aV=>{vY)=m{(vsU)nX_zK(0Ku7dDHmLq}0;jQ)tuaJ#GThr!}&r*&Y9u>o+A)o;l# zXRv@<)>J^2-$j336 zigh%4Y&%JNCkm{bb$W&c6oePY_3$lzBo{t)rdJcKy#&3+A=zoj1^;OlDRx+|0hiAY zXXWCU&e|N+BrFy3uFd3~_4~%vchWGmAbyjaCXbyOAz&l8T05Eiuz;g#-8V2{fj+y| z%HOK#HDLLzX88i6Ko+S|9lXW4fWba9&JuVaRjEVV>otYE_wKt-tB+gwJf$rQ<*cONtCqAsPxRidwd9a};jf78( z`jUxt!)>iAZj#@!7uf!h-7QLftL^-z;K*)#WVLd3b1#^91?HBc@>=l_~H00J=Fe{sO-_9 z=6(DDEu~2eEBomt9`o_1WU=$Wz7DkTr8-O7iZr>#c`g=ueir@FG8tCdruEt)5I@;F zfU92dG3w%;lxMk>kaw`B)bw~k7IZh3Bt_j$N~oCQUmKs}@3Df_248F4UAOcUz81F| z7pE)kWI9{sd=BA4enQ#O4X#J__m@dvq{gq^1S{vtNX1=bIt@_nJ66+FOD+48xzC>; z0t5@zT#~=~Ild)VzZZ8)v{b5FKOJQ>DpyOL$;Mo0M&9#`3ILh# z4a6|wm zaNxdd_<@o3`bt`r<##QOgv|$AvpMte{dqHM}`As8+2T%g| zt>E*Y?h?J1WwEtHq+(wBMTw=1{p`8^k}!p7Iw2~ z-aPm2QgqX;2-urKAUgO)Ui>$$K?#?zpB8roSbq5Os;3>*cDfT+6W|u4u(BsHa{*n? z-oBzu?0jIX4ep%Re;ri<%uumt;-5$L_nRrk20SfRp1byClBOnk)61B2v;ztezQo}T zGPz0fNpLo>AH>x?3t4|V4bn;B7SHy(v89;{2ak_7|AB27F*xVdzDs^h6}im~esByY zTInbdI*~nKMwb2LhyzP@i;}_xeDNWk6pzU6bYrhNL*Wcav=$OSHgV=o!F&t(9h z>;<6sHEhA5i(frIS!5Xk;6^z1^gVs+*f-#=F`sZRR3Uet*pGYRG}D*?M7j;{BF1v> zv}RA&xL>UD>6Q$5zbtCeSqWV7xilU#&wu`TXNWQw1onJ>AEkUrxXaT8g46_OR$|`* z)O;aSm21lOg#*6!!QXZkY1#dO??sZuLU87Cu;C+w6cJLl-QODQZU?ml>FCd>9zi*& zlx=|}61P!y0((4wg6o53&0FbF82GABS*i9~@byC#+Bd{<8$SO!t-=`S2D4qzj+fST z`D;%uI;QivY~*(p;X7`o65V`HUxxf~|DJ*17(R@%L?iaq^<{hjqhDnp!oY5}N|^Fz zz|U6be2_2E1mrVhEO+iwgg7MO>#*{2mqMEy7ER^TR#eTrz=?fRIcvrCm7#zja+JmMhoXoIVw^h3a_;(wJA*SDsb!?{7z3#K!GqUmFBdZ1B2YFW1%><_-MLzTBH zQ@OdWGcvOZdA{zxLM3IIw{|`_L+OB&g8B3s`|3EHA1YNrzL;-Em-%h?-o)`?CUCZ3 z^3Ryf{RZDBPTq1!MDv7Gz_HYQpQ#_vh9=B_i7GO!uSO*3k^rtVz$)w^VVGuP+Eqpg z#%cbZ4ftT&S;+4rzxaR-oA;bD2&)b5F?1@hkG<63CcwezWLV=?CE(&On;8bv#vtuF zkLpM38}K-*R5p4$9FE}{IpU8U!7<_zr>xyz0)+K8NUPO5>3e{mqF+^2-gOsnq@iZ` za}+7_aaTT&XXW!xL#v8$#k}gUCBk39!Y?Aav)@9b`2XAnY!vq!o2!!{fbN(ECeKR4hPjZ0{kkCaA3#DK83@ zsuVV|TP`&?{#->oyO^crF=kn6e!(SN9BQI6^SPwv5#FyDl;}7Rxh+EEM(Y!ec>SKR zj`*Ly6f+ZyTu3joH0`?0!U_P$KJVsg`ukmW*9%Ui!*1lYT#rf&o;xj7tC`4~PPW%6 z;h}Ks4O(^dD|1YpH7dZwY#nd~H2mcr&eU57;MHZUKAf_j_^nfb&Xyc-v9CI4LRlfP z&4{!&-| zBuF2h!d&&KAunw2x(Xq2J$c&Lp0Kq)Wx-&?WM_lz_a{Gn9=Q0j+16Gb z7PI#~LIqKF0J9@P-jMAs)>v_30N#m8tw9aIcQy`uLXFY- z)d~|dvh`!@{_J^4)WaEBL9NSnKbUI%O)6Em)mU|5u2a0lu>k5QAynDW>3bCx^w6kN zohFX36uYTDzpdO>@(kn~wq~X0HhD2qFKSrrp=1t|NYT%>J0{a_^@lnSMkm}Inxx(z zS}#~$Xm^E2XG(>&f^-rCzsMV9Z+eC+{_t72hifo)!nmx3>^9dvsv(<8fYy%43Gj4g zO-PS^mV_V^wwo*dat6v}Id~E8S)r4dSR>z+vk_6WaK7_6!`?sEH zBzz&bRbC-S5D+GJvxb=~U!&7$zHQxhrfMxsIRl_Nk!}9aow2@IQ~kI0imi+Y-kU+5 zBSCEbK>l|q_g9hcvK(O$AA9)h8A{0Gg1vY8$Zr*Mak*dbPn<5KqWs1LufXS>?D-XCVU5D)%UpK`}XE*)gxpbZlOeqHgIk}D4z^um@} zw_4BehnnS=g(?$*ZnRuZ#0#%Vos)9doG5+l?swSB>rsD`eMf3_IjOVZg9JVH=r1Lj zUCqZ(nz5#%w*68$D8!^r8>tX1=HeHW>AfEH#ZL08Eu^hCKmT&rLmEET4z6jDiB5qB z*IMgjUTM9RK!Y{Z)mLElCj0^}g~|nvT7EF_$nRHS+j8XezWaGQvz=sWJw2|u9B-v( z_|+!85{HFj*B==LByBj1^Z>nv%p%^7%;_HXh5cjMfA$(+)DVbE%R%+qoL@(3ccpM7 zgnWP|x~6GU-Qc~5hKFjvJDYZT*f3&;Ev77qk3p&=KaNgRZ5k(=_DP+YbPP+k$zpzmG1#} zScsFnQ{xLKqbABlN?1XT-+-y`VFuPJJYyF`&6SD(U@4f&?dIr%YT@_3hXO8^!MK6!f#=rso16JnhSJz4WUiKBs;8*U zvt5)Lg%IDT?Ih04T#de3-U!)(XM4Tet92!$g_vE*1DCNoysee_P?cu_h7qy{HwXrr zpez+kmSvr^BEpRXa>|Zo{fvm+!XvHN**tBxh2$c}G=HrXU+@F5GH-2wrJx%8;Cd^V zobUAn^yjXUPxxbm%i2ar-QV!ySn^Zkn~2Kd5VmW`h})Z+Bf0N%{FI}M2-XAQcyVMM z6T=SeZvx*Ywq~-IaQXS>JsE$=1R(v@+13I8vE7r#LsdVpVqJd+D-Pd-7i$uG#;39{ z*SY1scNiWY`IA@HF4sqEul_Y*6sN;jdLsVLckw!b*?z1#ulHRQItpD(2y)>Hu<1{t zgzJRTlVmbBqi>8I*gPU7sZSsM`n9uQ%WWC*s3q1_BTUGQ9EuuGy!!pE;7rgQlyl3&2ekx>Rd{Im1LgFUB2Y-kd zBDkAMg-|SIa(R9Qfr{69N?|jDsXyD0(a5EpOgLT=OTuuV7xh zKA<_IeWJ6v@aTs#qGAMH=(fx>x8yFV9&HV%07P~zru&k->(hr3un41zo0I}#QI0b- zugBwpM`Vy8A>hmQfwfq<*~+dv0f-nZ!=1dhE9yH2bA4`jEND+m$ZCMDK?H_6qVBFG zEK!Wdc#epK@|>f(goi<`hCoDTWw=O1zA(Ww>(IGl-LYCRI4&8R zy97?28IPPYLeDnDYHNi#ou5VZGzt-(>G$#*eOg$YPlJiWaib0JE2(LQ2|w^A1@?yQ zUyq_bdJx8OO4d9)#-3)WZQvMfV3APUYEEi%&|**~qqV1b)o7|(`?v+AE6YiX=vPek zo1;?Q7SyUqqR#-&OaMeH`8~xh0p;R5t`C9}MqF9apJ3e9A@&}ob?$Lp?B!8=hwf$l z<4xM4uv-ECU?=p7;svolpRw$n?S-5MkF3M$uaA(;9l*lq8pnWLC1r@8E4{ypCkc~v zo09>H%RBr#jlVl>)+HS)&-Za*TPSZd=nln%o;x2)iE*7c^q4@FsU-|Vk^`4lhAKUL z-i-|WYRu+oSpau=qp@HtFCuQ7Gjv?Ew4~%Bx1u@vAf-!Ma-DX1|8}B0 zNmZ)3b9mS`r^5GzEEF72g+f)JVH1P(5ZcP}>pOXdgVFS=b%@eFZ~QZM}=_q>*3@X$o!BpcdWJ zBYvh)&2-gknw%~fanz$+SM*wGHB6#^HM?>}PAHTcVLLn3@LPQQ8RqrTR^=m8G}w1$ zuw?#{RKW*odM2DeqQH;~CfkjR#`*;Pbxr#g=GIH85) z>n$J78%1PJs2F@5OM@vU@44lz=8MMvQ#QcQ#kEh`8S@E93M6|>iFYfo&D#c-J|LEZ z%zcH>y@_Mr1rqq(Ii0` z7S{mA)2?zV)D%c+Q<|Z2IQ!bCQB=n;E08meU5W2-wd1E@>--T7$tL+~MOS6+V$=v; z2YJp1799geQKP?cJ|CQB5Ajl6>So91AsKDriLpA6E5qNqCCYDlW(dF5?=bHGDTsmh zcnw+azq9?Ms=J1oh5{myJ944Vg z__Tzv;Hk5)0)Iac;mLDkz74KAqv)ebX(^UnDoTejI)GlFe)j)y>l(-QC8Eq0_?%n! zYa2VH5diSg=~rZ((QcFIcWyp^pqP3Oa(uq`9Sqvf-Iy4nUiVNuRV_f(n3E0k6ElZ@ z8a0Ra%fJ;&+5wjs-==Nm>UjjOYfKmIHS>eL{jd+DRwl5RAlsDKfSKGFj=xbWU;LndR*e{VS2%yZtY`$%8RkBhh7v*&m9g~a&RiRvVOrQ z%^K~7?Aj{#(-I{onvNz!k<*x^C>rY+M|j3{srg54_D3)q->PCyyTH-ytB4mrx@XsV zKEaa5|0HRMZ7_{v1Ho_6S^&V$kEFv!nW|feS^(52cjSe03_s+3xQ+eszOHi}LAXc~ zXSOfl8mm=+!d7pIOKJEqX4@9F6`Zb#t{Po~Q7Ad9SgEw$6cw$|3&~nAGcIrNw5|>Jazdve$`H>eb z(Ro^+eBA;lcwUxQBkytVwL7zUV|RkV(Lu5zREHtuHB0Kdf+l(=uKn)BrwqE%u-3sg z%<17tr-yG3zYp8b7i3Rt-O-X>U!j9A5q{abdg8?qp5q2-IjTp>e5$b)9|-c`^DX^S zY(8LFL$JO$lv+5JTs%j91=DF$g`}b8#$3u{AFq6mWHY(lBc)YnWlJWB8oIa8Q8-8@XLAio+hi}N-S&#$E)>(5;yaduk)BM zpHHzGyt(t|x+m+~r*k4-Xg6bd=`Oe^7eq_e3 zl-J*0tUO(zO{r(5v-RLmX_w=8x$($(wsGI@*h2--%I%sU*P0IF zY(xA+u-7olBV=osul%2xGVs8#U1#?Sw`(`-_W|j636^ktICZeHyImS7l_1wzb4s=~ zy)ojb6vmipIo@eJxV&-sIJPuau9f?wZdz#1p4su#?sm4}!F~^x70ax8noZ>IF{>+9wk1oHERC{-fL@yyo{xwXt3Ob-8{ z^8_*f;_AyisdFdW8UO#AfB&x(cO5eaQ{R8kIl=CKa6f@i)xR|-p1|NgRGk3)A4n&F z|BI``_Z;RJu?SW_kU170qtL0#VZS+{Nom2T;%+muCesZ(0@Tc`%w&g0vauW=*D-^@xs>ytW>3s)bpVX}2Ds(Za0BB-?<1wlFI*c{L!)Px5aKh?SGPr{Ukj zsMX5M!L;)qUYtOn@!vJ?PjLTVT(!Rts`0 Date: Tue, 20 Dec 2016 17:26:42 -0800 Subject: [PATCH 05/45] Add ability to disable avatar and object scaling in handController grab --- .../system/controllers/handControllerGrab.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index 1f536b9567..39af4f7dd3 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -195,6 +195,8 @@ var STATE_OVERLAY_TOUCHING = 8; var holdEnabled = true; var nearGrabEnabled = true; var farGrabEnabled = true; +var myAvatarScalingEnabled = true; +var objectScalingEnabled = true; // "collidesWith" is specified by comma-separated list of group names // the possible group names are: static, dynamic, kinematic, myAvatar, otherAvatar @@ -2314,6 +2316,10 @@ function MyController(hand) { }; this.maybeScale = function(props) { + if (!objectScalingEnabled) { + return; + } + if (!this.shouldScale) { // If both secondary triggers squeezed, and the non-holding hand is empty, start scaling if (this.secondarySqueezed() && this.getOtherHandController().secondarySqueezed() && this.getOtherHandController().state === STATE_OFF) { @@ -2333,6 +2339,10 @@ function MyController(hand) { } this.maybeScaleMyAvatar = function() { + if (!myAvatarScalingEnabled) { + return; + } + if (!this.shouldScale) { // If both secondary triggers squeezed, start scaling if (this.secondarySqueezed() && this.getOtherHandController().secondarySqueezed()) { @@ -3018,6 +3028,14 @@ var handleHandMessages = function(channel, message, sender) { print("farGrabEnabled: ", data.farGrabEnabled); farGrabEnabled = data.farGrabEnabled; } + if (data.myAvatarScalingEnabled !== undefined) { + print("myAvatarScalingEnabled: ", data.myAvatarScalingEnabled); + myAvatarScalingEnabled = data.myAvatarScalingEnabled; + } + if (data.objectScalingEnabled !== undefined) { + print("objectScalingEnabled: ", data.objectScalingEnabled); + objectScalingEnabled = data.objectScalingEnabled; + } } else if (channel === 'Hifi-Hand-Grab') { try { data = JSON.parse(message); From 71294f57974a6bdaac22d1b2185a7f6c8b851942 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Dec 2016 17:27:04 -0800 Subject: [PATCH 06/45] Add disabling of avatar and object scaling during tutorial --- tutorial/tutorial.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 77fd497361..26fa51e896 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -374,6 +374,8 @@ function disableEverything() { nearGrabEnabled: true, holdEnabled: false, farGrabEnabled: false, + myAvatarScalingEnabled: false, + objectScalingEnabled: false, })); setControllerPartLayer('touchpad', 'blank'); setControllerPartLayer('trigger', 'blank'); @@ -402,6 +404,8 @@ function reenableEverything() { nearGrabEnabled: true, holdEnabled: true, farGrabEnabled: true, + myAvatarScalingEnabled: true, + objectScalingEnabled: true, })); setControllerPartLayer('touchpad', 'blank'); setControllerPartLayer('trigger', 'blank'); From 8b5a05c409a193df7a1fe2061c8265b8b4014459 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Dec 2016 17:58:23 -0800 Subject: [PATCH 07/45] Fix right touch controller tip labels not showing up --- scripts/system/controllers/touchControllerConfiguration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/controllers/touchControllerConfiguration.js b/scripts/system/controllers/touchControllerConfiguration.js index 08e0470877..a4622fd5e6 100644 --- a/scripts/system/controllers/touchControllerConfiguration.js +++ b/scripts/system/controllers/touchControllerConfiguration.js @@ -215,7 +215,7 @@ TOUCH_CONTROLLER_CONFIGURATION_RIGHT = { modelURL: BASE_URL + "Oculus-Labels-R.fbx", naturalPosition: { x: 0.009739525616168976, y: -0.0017818436026573181, z: 0.016794726252555847 }, - textureName: "Texture", + textureName: "blank", defaultTextureLayer: "blank", textureLayers: { blank: { From 627a5d56daedef1c0761584596b6a5541a2b690e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Dec 2016 10:11:10 -0800 Subject: [PATCH 08/45] Update content set URL --- server-console/src/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-console/src/main.js b/server-console/src/main.js index c99e39faf8..b387aa5dd0 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -42,7 +42,7 @@ const appIcon = path.join(__dirname, '../resources/console.png'); const DELETE_LOG_FILES_OLDER_THAN_X_SECONDS = 60 * 60 * 24 * 7; // 7 Days const LOG_FILE_REGEX = /(domain-server|ac-monitor|ac)-.*-std(out|err).txt/; -const HOME_CONTENT_URL = "http://cachefly.highfidelity.com/home-tutorial-release-5572.tar.gz"; +const HOME_CONTENT_URL = "http://cdn.highfidelity.com/content-sets/home-tutorial-28.tar.gz"; function getBuildInfo() { var buildInfoPath = null; From 0ad9786f6b36f2422a8ae9195a10ec5524006bee Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 21 Dec 2016 16:12:00 -0800 Subject: [PATCH 09/45] requestsDomainsListData --- assignment-client/src/avatars/AvatarMixer.cpp | 34 ++++++++++++++++--- assignment-client/src/avatars/AvatarMixer.h | 1 + .../src/avatars/AvatarMixerClientData.h | 3 ++ libraries/avatars/src/AvatarHashMap.cpp | 5 +-- libraries/networking/src/NodeList.cpp | 16 +++++++++ libraries/networking/src/NodeList.h | 3 ++ libraries/networking/src/udt/PacketHeaders.h | 3 +- .../src/UsersScriptingInterface.cpp | 7 ++++ .../src/UsersScriptingInterface.h | 6 ++++ scripts/system/pal.js | 2 ++ 10 files changed, 72 insertions(+), 8 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index d8d0b10fea..2aa140470e 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -50,6 +50,7 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket"); + packetReceiver.registerListener(PacketType::RequestDomainListData, this, "handleRequestDomainListDataPacket"); auto nodeList = DependencyManager::get(); connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &AvatarMixer::handlePacketVersionMismatch); @@ -205,6 +206,11 @@ void AvatarMixer::broadcastAvatarData() { // use the data rate specifically for avatar data for FRD adjustment checks float avatarDataRateLastSecond = nodeData->getOutboundAvatarDataKbps(); + // send extra data that is otherwise surpressed + bool getsOutOfView = nodeData->getRequestsDomainListData(); + bool getsAnyIgnored = node->getCanKick(); + bool getsIgnoredByMe = getsAnyIgnored || nodeData->getRequestsDomainListData(); + // Check if it is time to adjust what we send this client based on the observed // bandwidth to this node. We do this once a second, which is also the window for // the bandwidth reported by node->getOutboundBandwidth(); @@ -275,14 +281,14 @@ void AvatarMixer::broadcastAvatarData() { // or that has ignored the viewing node if (!otherNode->getLinkedData() || otherNode->getUUID() == node->getUUID() - || node->isIgnoringNodeWithID(otherNode->getUUID()) - || otherNode->isIgnoringNodeWithID(node->getUUID())) { + || (node->isIgnoringNodeWithID(otherNode->getUUID()) && !getsIgnoredByMe) + || (otherNode->isIgnoringNodeWithID(node->getUUID()) && !getsAnyIgnored)) { return false; } else { AvatarMixerClientData* otherData = reinterpret_cast(otherNode->getLinkedData()); AvatarMixerClientData* nodeData = reinterpret_cast(node->getLinkedData()); // Check to see if the space bubble is enabled - if (node->isIgnoreRadiusEnabled() || otherNode->isIgnoreRadiusEnabled()) { + if ((node->isIgnoreRadiusEnabled() && !getsIgnoredByMe) || (otherNode->isIgnoreRadiusEnabled() && !getsAnyIgnored)) { // Define the minimum bubble size static const glm::vec3 minBubbleSize = glm::vec3(0.3f, 1.3f, 0.3f); // Define the scale of the box for the current node @@ -333,7 +339,7 @@ void AvatarMixer::broadcastAvatarData() { && (forceSend || otherNodeData->getIdentityChangeTimestamp() > _lastFrameTimestamp || distribution(generator) < IDENTITY_SEND_PROBABILITY)) { - + qDebug() << "FIXME HRS sending identity to" << node->getUUID() << "from" << otherNode->getUUID(); sendIdentityPacket(otherNodeData, node); } @@ -349,6 +355,7 @@ void AvatarMixer::broadcastAvatarData() { maxAvatarDistanceThisFrame = std::max(maxAvatarDistanceThisFrame, distanceToAvatar); if (distanceToAvatar != 0.0f + && !getsOutOfView && distribution(generator) > (nodeData->getFullRateDistance() / distanceToAvatar)) { return; } @@ -388,7 +395,7 @@ void AvatarMixer::broadcastAvatarData() { AABox otherNodeBox(otherNodeData->getGlobalBoundingBoxCorner(), otherNodeBoxScale); AvatarData::AvatarDataDetail detail; - if (!nodeData->otherAvatarInView(otherNodeBox)) { + if (!nodeData->otherAvatarInView(otherNodeBox) && !getsOutOfView) { detail = AvatarData::MinimumData; nodeData->incrementAvatarOutOfView(); } else { @@ -396,6 +403,7 @@ void AvatarMixer::broadcastAvatarData() { ? AvatarData::SendAllData : AvatarData::IncludeSmallData; nodeData->incrementAvatarInView(); } + //qDebug() << "FIXME HRS sending" << detail << "to" << node->getUUID() << "from" << otherNode->getUUID(); numAvatarDataBytes += avatarPacketList->write(otherNode->getUUID().toRfc4122()); numAvatarDataBytes += avatarPacketList->write(otherAvatar.toByteArray(detail)); @@ -527,6 +535,22 @@ void AvatarMixer::handleViewFrustumPacket(QSharedPointer messag } } +void AvatarMixer::handleRequestDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode) { + auto nodeList = DependencyManager::get(); + nodeList->getOrCreateLinkedData(senderNode); + qDebug() << "HRS FIXME received requestDomainListData packet from" << senderNode->getUUID(); + + if (senderNode->getLinkedData()) { + AvatarMixerClientData* nodeData = dynamic_cast(senderNode->getLinkedData()); + if (nodeData != nullptr) { + bool isRequesting; + message->readPrimitive(&isRequesting); + qDebug() << "HRS FIXME handling requestDomainListData packet" << isRequesting << "from" << nodeData->getNodeID(); + nodeData->setRequestDomainListData(isRequesting); + } + } +} + void AvatarMixer::handleAvatarDataPacket(QSharedPointer message, SharedNodePointer senderNode) { auto nodeList = DependencyManager::get(); nodeList->updateNodeWithDataFromPacket(message, senderNode); diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 521fe72f39..66cf9470c0 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -42,6 +42,7 @@ private slots: void handleKillAvatarPacket(QSharedPointer message); void handleNodeIgnoreRequestPacket(QSharedPointer message, SharedNodePointer senderNode); void handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleRequestDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode); void domainSettingsRequestComplete(); void handlePacketVersionMismatch(PacketType type, const HifiSockAddr& senderSockAddr, const QUuid& senderUUID); diff --git a/assignment-client/src/avatars/AvatarMixerClientData.h b/assignment-client/src/avatars/AvatarMixerClientData.h index 78a30d8206..462968eb37 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.h +++ b/assignment-client/src/avatars/AvatarMixerClientData.h @@ -101,6 +101,8 @@ public: void incrementAvatarOutOfView() { _recentOtherAvatarsOutOfView++; } const QString& getBaseDisplayName() { return _baseDisplayName; } void setBaseDisplayName(const QString& baseDisplayName) { _baseDisplayName = baseDisplayName; } + bool getRequestsDomainListData() { return _requestsDomainListData; } + void setRequestDomainListData(bool requesting) { _requestsDomainListData = requesting; } private: AvatarSharedPointer _avatar { new AvatarData() }; @@ -129,6 +131,7 @@ private: int _recentOtherAvatarsInView { 0 }; int _recentOtherAvatarsOutOfView { 0 }; QString _baseDisplayName{}; // The santized key used in determinging unique sessionDisplayName, so that we can remove from dictionary. + bool _requestsDomainListData { false }; }; #endif // hifi_AvatarMixerClientData_h diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 8871769261..c0aafa7f2b 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -112,7 +112,7 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer mess // make sure this isn't our own avatar data or for a previously ignored node auto nodeList = DependencyManager::get(); - if (sessionUUID != _lastOwnerSessionUUID && !nodeList->isIgnoringNode(sessionUUID)) { + if (sessionUUID != _lastOwnerSessionUUID && (!nodeList->isIgnoringNode(sessionUUID) || nodeList->getRequestsDomainListData())) { auto avatar = newOrExistingAvatar(sessionUUID, sendingNode); // have the matching (or new) avatar parse the data from the packet @@ -145,7 +145,8 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer identity.uuid = EMPTY; } } - if (!nodeList->isIgnoringNode(identity.uuid)) { + qDebug() << "FIXME HRS processing identity packet regarding" << identity.uuid << "ignoring:" << nodeList->isIgnoringNode(identity.uuid) << "reqestsDomainList:" << nodeList->getRequestsDomainListData(); + if (!nodeList->isIgnoringNode(identity.uuid) || nodeList->getRequestsDomainListData()) { // mesh URL for a UUID, find avatar in our list auto avatar = newOrExistingAvatar(identity.uuid, sendingNode); avatar->processAvatarIdentity(identity); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 27b3e11fda..d10e954f5d 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -930,3 +930,19 @@ void NodeList::processUsernameFromIDReply(QSharedPointer messag emit usernameFromIDReply(nodeUUIDString, username, machineFingerprintString); } + +void NodeList::setRequestsDomainListData(bool isRequesting) { + // Tell the avatar mixer whether I want to receive any additional data to which I might be entitiled . + if (_requestsDomainListData == isRequesting) { + return; + } + eachMatchingNode([](const SharedNodePointer& node)->bool { + return node->getType() == NodeType::AvatarMixer; + }, [this, isRequesting](const SharedNodePointer& destinationNode) { + auto packet = NLPacket::create(PacketType::RequestDomainListData, sizeof(bool), true); // reliable + packet->writePrimitive(isRequesting); + sendPacket(std::move(packet), *destinationNode); + qDebug() << "HRS FIXME sending requestDomainListData packet" << isRequesting; + }); + _requestsDomainListData = isRequesting; +} \ No newline at end of file diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index d3f04cedd8..9289d2c660 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -82,6 +82,8 @@ public: void kickNodeBySessionID(const QUuid& nodeID); void muteNodeBySessionID(const QUuid& nodeID); void requestUsernameFromSessionID(const QUuid& nodeID); + bool getRequestsDomainListData() { return _requestsDomainListData; } + void setRequestsDomainListData(bool isRequesting); public slots: void reset(); @@ -153,6 +155,7 @@ private: HifiSockAddr _assignmentServerSocket; bool _isShuttingDown { false }; QTimer _keepAlivePingTimer; + bool _requestsDomainListData; mutable QReadWriteLock _ignoredSetLock; tbb::concurrent_unordered_set _ignoredNodeIDs; diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 162e565b83..ed40f1bdad 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -104,7 +104,8 @@ public: UsernameFromIDRequest, UsernameFromIDReply, ViewFrustum, - LAST_PACKET_TYPE = ViewFrustum + RequestDomainListData, + LAST_PACKET_TYPE = ViewFrustum // FIXME! RequestDomainListData }; }; diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index 191952e354..61120b6e89 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -61,3 +61,10 @@ void UsersScriptingInterface::disableIgnoreRadius() { bool UsersScriptingInterface::getIgnoreRadiusEnabled() { return DependencyManager::get()->getIgnoreRadiusEnabled(); } + +bool UsersScriptingInterface::getRequestsDomainListData() { + return DependencyManager::get()->getRequestsDomainListData(); +} +void UsersScriptingInterface::setRequestsDomainListData(bool isRequesting) { + DependencyManager::get()->setRequestsDomainListData(isRequesting); +} \ No newline at end of file diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index 855dc06c11..0ebd8797c0 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -24,6 +24,7 @@ class UsersScriptingInterface : public QObject, public Dependency { SINGLETON_DEPENDENCY Q_PROPERTY(bool canKick READ getCanKick) + Q_PROPERTY(bool requestsDomainListData READ getRequestsDomainListData WRITE setRequestsDomainListData) public: UsersScriptingInterface(); @@ -105,6 +106,11 @@ signals: * @function Users.usernameFromIDReply */ void usernameFromIDReply(const QString& nodeID, const QString& username, const QString& machineFingerprint); + +private: + bool getRequestsDomainListData(); + void setRequestsDomainListData(bool requests); + bool _requestsDomainListData; }; diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 9c23e1f775..77f939d2c5 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -252,9 +252,11 @@ function off() { } triggerMapping.disable(); // It's ok if we disable twice. removeOverlays(); + Users.requestsDomainListData = false; } function onClicked() { if (!pal.visible) { + Users.requestsDomainListData = true; populateUserList(); pal.raise(); isWired = true; From 344272f24a18fc50c5fe440e28d8888ef4d4b846 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Thu, 22 Dec 2016 09:16:07 -0800 Subject: [PATCH 10/45] unignore checkpoint (untested) --- assignment-client/src/audio/AudioMixer.cpp | 5 +++++ assignment-client/src/audio/AudioMixer.h | 1 + assignment-client/src/avatars/AvatarMixer.cpp | 3 +++ assignment-client/src/avatars/AvatarMixer.h | 1 + libraries/networking/src/Node.cpp | 20 +++++++++++++++++++ libraries/networking/src/Node.h | 6 +++++- libraries/networking/src/udt/PacketHeaders.h | 3 ++- 7 files changed, 37 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 01715497b1..9a80289911 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -65,6 +65,7 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::NegotiateAudioFormat, this, "handleNegotiateAudioFormat"); packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); + packetReceiver.registerListener(PacketType::NodeUnignoreRequest, this, "handleNodeUnignoreRequestPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); packetReceiver.registerListener(PacketType::NodeMuteRequest, this, "handleNodeMuteRequestPacket"); packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket"); @@ -225,6 +226,10 @@ void AudioMixer::handleNodeIgnoreRequestPacket(QSharedPointer p sendingNode->parseIgnoreRequestMessage(packet); } +void AudioMixer::handleNodeUnignoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + sendingNode->parseUnignoreRequestMessage(packet); +} + void AudioMixer::handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { sendingNode->parseIgnoreRadiusRequestMessage(packet); } diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 59cdec7732..14a0167c3e 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -62,6 +62,7 @@ private slots: void handleNegotiateAudioFormat(QSharedPointer message, SharedNodePointer sendingNode); void handleNodeKilled(SharedNodePointer killedNode); void handleNodeIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleNodeUnignoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleNodeMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 2aa140470e..64353e65b1 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -585,6 +585,9 @@ void AvatarMixer::handleNodeIgnoreRequestPacket(QSharedPointer senderNode->parseIgnoreRequestMessage(message); } +void AvatarMixer::handleNodeUnignoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + sendingNode->parseUnignoreRequestMessage(packet); +} void AvatarMixer::handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { sendingNode->parseIgnoreRadiusRequestMessage(packet); } diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 66cf9470c0..296b82f1aa 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -41,6 +41,7 @@ private slots: void handleAvatarIdentityPacket(QSharedPointer message, SharedNodePointer senderNode); void handleKillAvatarPacket(QSharedPointer message); void handleNodeIgnoreRequestPacket(QSharedPointer message, SharedNodePointer senderNode); + void handleNodeUnignoreRequestPacket(QSharedPointer message, SharedNodePointer senderNode); void handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleRequestDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode); void domainSettingsRequestComplete(); diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp index 66086e583e..133c8adcab 100644 --- a/libraries/networking/src/Node.cpp +++ b/libraries/networking/src/Node.cpp @@ -90,8 +90,14 @@ void Node::parseIgnoreRequestMessage(QSharedPointer message) { } } +void Node::parseUnignoreRequestMessage(QSharedPointer message) { + QUuid ignoredUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + removeIgnoredNode(ignoredUUID); +} + void Node::addIgnoredNode(const QUuid& otherNodeID) { if (!otherNodeID.isNull() && otherNodeID != _uuid) { + QReadLocker lock { &_ignoredNodeIDSetLock }; qCDebug(networking) << "Adding" << uuidStringWithoutCurlyBraces(otherNodeID) << "to ignore set for" << uuidStringWithoutCurlyBraces(_uuid); @@ -102,6 +108,20 @@ void Node::addIgnoredNode(const QUuid& otherNodeID) { } } +void Node::removeIgnoredNode(const QUuid& otherNodeID) { + if (!otherNodeID.isNull() && otherNodeID != _uuid) { + // insert/find are read locked concurrently. unsafe_erase is not concurrent, and needs a write lock. + QWriteLocker lock { &_ignoredNodeIDSetLock }; + qCDebug(networking) << "Removing" << uuidStringWithoutCurlyBraces(otherNodeID) << "from ignore set for" + << uuidStringWithoutCurlyBraces(_uuid); + + // remove the session UUID from the set of ignored ones for this listening node + _ignoredNodeIDSet.unsafe_erase(otherNodeID); + } else { + qCWarning(networking) << "Node::addIgnoredNode called with null ID or ID of ignoring node."; + } +} + void Node::parseIgnoreRadiusRequestMessage(QSharedPointer message) { bool enabled; message->readPrimitive(&enabled); diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index 2a64bb9943..0a344c9479 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -72,8 +73,10 @@ public: bool getCanKick() const { return _permissions.can(NodePermissions::Permission::canKick); } void parseIgnoreRequestMessage(QSharedPointer message); + void parseUnignoreRequestMessage(QSharedPointer message); void addIgnoredNode(const QUuid& otherNodeID); - bool isIgnoringNodeWithID(const QUuid& nodeID) const { return _ignoredNodeIDSet.find(nodeID) != _ignoredNodeIDSet.cend(); } + void removeIgnoredNode(const QUuid& otherNodeID); + bool isIgnoringNodeWithID(const QUuid& nodeID) const { QReadLocker lock { &_ignoredNodeIDSetLock }; return _ignoredNodeIDSet.find(nodeID) != _ignoredNodeIDSet.cend(); } void parseIgnoreRadiusRequestMessage(QSharedPointer message); friend QDataStream& operator<<(QDataStream& out, const Node& node); @@ -97,6 +100,7 @@ private: MovingPercentile _clockSkewMovingPercentile; NodePermissions _permissions; tbb::concurrent_unordered_set _ignoredNodeIDSet; + mutable QReadWriteLock _ignoredNodeIDSetLock; std::atomic_bool _ignoreRadiusEnabled; }; diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index ed40f1bdad..30bd6e8c54 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -105,7 +105,8 @@ public: UsernameFromIDReply, ViewFrustum, RequestDomainListData, - LAST_PACKET_TYPE = ViewFrustum // FIXME! RequestDomainListData + NodeUnignoreRequest, + LAST_PACKET_TYPE = ViewFrustum // FIXME! NodeUnignoreRequest }; }; From 2f2940b7cce9c121e7f708d769b2090a69468231 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 22 Dec 2016 11:10:27 -0800 Subject: [PATCH 11/45] fixes --- assignment-client/src/avatars/AvatarMixer.cpp | 7 ++-- libraries/networking/src/Node.cpp | 2 +- libraries/networking/src/NodeList.cpp | 32 +++++++++++++++++++ libraries/networking/src/NodeList.h | 2 ++ .../src/UsersScriptingInterface.cpp | 6 ++++ .../src/UsersScriptingInterface.h | 1 + 6 files changed, 46 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 64353e65b1..1192dfb200 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -49,6 +49,7 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::AvatarIdentity, this, "handleAvatarIdentityPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); + packetReceiver.registerListener(PacketType::NodeUnignoreRequest, this, "handleNodeUnignoreRequestPacket"); packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket"); packetReceiver.registerListener(PacketType::RequestDomainListData, this, "handleRequestDomainListDataPacket"); @@ -208,8 +209,8 @@ void AvatarMixer::broadcastAvatarData() { // send extra data that is otherwise surpressed bool getsOutOfView = nodeData->getRequestsDomainListData(); - bool getsAnyIgnored = node->getCanKick(); - bool getsIgnoredByMe = getsAnyIgnored || nodeData->getRequestsDomainListData(); + bool getsIgnoredByMe = nodeData->getRequestsDomainListData(); + bool getsAnyIgnored = getsIgnoredByMe && node->getCanKick(); // Check if it is time to adjust what we send this client based on the observed // bandwidth to this node. We do this once a second, which is also the window for @@ -339,7 +340,7 @@ void AvatarMixer::broadcastAvatarData() { && (forceSend || otherNodeData->getIdentityChangeTimestamp() > _lastFrameTimestamp || distribution(generator) < IDENTITY_SEND_PROBABILITY)) { - qDebug() << "FIXME HRS sending identity to" << node->getUUID() << "from" << otherNode->getUUID(); + qDebug() << "FIXME HRS sending identity to" << node->getUUID() << "from" << otherNode->getUUID() << "gets mine/all/view:" << getsIgnoredByMe << getsAnyIgnored << getsOutOfView ; sendIdentityPacket(otherNodeData, node); } diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp index 133c8adcab..0f3a6ee30d 100644 --- a/libraries/networking/src/Node.cpp +++ b/libraries/networking/src/Node.cpp @@ -118,7 +118,7 @@ void Node::removeIgnoredNode(const QUuid& otherNodeID) { // remove the session UUID from the set of ignored ones for this listening node _ignoredNodeIDSet.unsafe_erase(otherNodeID); } else { - qCWarning(networking) << "Node::addIgnoredNode called with null ID or ID of ignoring node."; + qCWarning(networking) << "Node::removeIgnoredNode called with null ID or ID of ignoring node."; } } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index d10e954f5d..49c689b007 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -811,6 +811,38 @@ void NodeList::ignoreNodeBySessionID(const QUuid& nodeID) { } } +void NodeList::unignoreNodeBySessionID(const QUuid& nodeID) { + // enumerate the nodes to send a reliable ignore packet to each that can leverage it + if (!nodeID.isNull() && _sessionUUID != nodeID) { + eachMatchingNode([&nodeID](const SharedNodePointer& node)->bool { + if (node->getType() == NodeType::AudioMixer || node->getType() == NodeType::AvatarMixer) { + return true; + } else { + return false; + } + }, [&nodeID, this](const SharedNodePointer& destinationNode) { + // create a reliable NLPacket with space for the ignore UUID + auto ignorePacket = NLPacket::create(PacketType::NodeUnignoreRequest, NUM_BYTES_RFC4122_UUID, true); + + // write the node ID to the packet + ignorePacket->write(nodeID.toRfc4122()); + + qCDebug(networking) << "Sending packet to unignore node" << uuidStringWithoutCurlyBraces(nodeID); + + // send off this ignore packet reliably to the matching node + sendPacket(std::move(ignorePacket), *destinationNode); + }); + + QWriteLocker setLocker { &_ignoredSetLock }; // write lock for unsafe_erase + _ignoredNodeIDs.unsafe_erase(nodeID); + + emit unignoredNode(nodeID); + + } else { + qWarning() << "NodeList::unignoreNodeBySessionID called with an invalid ID or an ID which matches the current session ID."; + } +} + bool NodeList::isIgnoringNode(const QUuid& nodeID) const { QReadLocker setLocker { &_ignoredSetLock }; return _ignoredNodeIDs.find(nodeID) != _ignoredNodeIDs.cend(); diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 9289d2c660..6d7026b562 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -77,6 +77,7 @@ public: void enableIgnoreRadius() { ignoreNodesInRadius(true); } void disableIgnoreRadius() { ignoreNodesInRadius(false); } void ignoreNodeBySessionID(const QUuid& nodeID); + void unignoreNodeBySessionID(const QUuid& nodeID); bool isIgnoringNode(const QUuid& nodeID) const; void kickNodeBySessionID(const QUuid& nodeID); @@ -112,6 +113,7 @@ signals: void limitOfSilentDomainCheckInsReached(); void receivedDomainServerList(); void ignoredNode(const QUuid& nodeID); + void unignoredNode(const QUuid& nodeID); void ignoreRadiusEnabledChanged(bool isIgnored); void usernameFromIDReply(const QString& nodeID, const QString& username, const QString& machineFingerprint); diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index 61120b6e89..b118423236 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -26,6 +26,12 @@ void UsersScriptingInterface::ignore(const QUuid& nodeID) { DependencyManager::get()->ignoreNodeBySessionID(nodeID); } +void UsersScriptingInterface::unignore(const QUuid& nodeID) { + // ask the NodeList to ignore this user (based on the session ID of their node) + DependencyManager::get()->unignoreNodeBySessionID(nodeID); +} + + void UsersScriptingInterface::kick(const QUuid& nodeID) { // ask the NodeList to kick the user with the given session ID DependencyManager::get()->kickNodeBySessionID(nodeID); diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index 0ebd8797c0..c8866376da 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -37,6 +37,7 @@ public slots: * @param {nodeID} nodeID The node or session ID of the user you want to ignore. */ void ignore(const QUuid& nodeID); + void unignore(const QUuid& nodeID); /**jsdoc * Kick another user. From 768b747b3aff236bb032837487b982861be68d28 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 22 Dec 2016 14:15:51 -0800 Subject: [PATCH 12/45] Make avatar go away when ignored, even when pal is up. (But currently, it comes back!) --- interface/resources/qml/hifi/Pal.qml | 32 ++++++++++++++++--- interface/src/avatar/Avatar.cpp | 8 +++++ interface/src/avatar/Avatar.h | 2 ++ interface/src/avatar/AvatarManager.cpp | 1 + interface/src/avatar/AvatarManager.h | 1 - .../src/UsersScriptingInterface.cpp | 2 ++ .../src/UsersScriptingInterface.h | 2 ++ scripts/system/pal.js | 7 ++++ 8 files changed, 49 insertions(+), 6 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 4abaccfe2c..5c475f16dd 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -190,7 +190,7 @@ Item { id: nameCard // Properties displayName: styleData.value - userName: model.userName + userName: model && model.userName audioLevel: model.audioLevel visible: !isCheckBox // Size @@ -204,15 +204,26 @@ Item { HifiControls.CheckBox { visible: isCheckBox anchors.centerIn: parent + checked: model[styleData.role] boxSize: 24 onClicked: { var newValue = !model[styleData.role] var datum = userData[model.userIndex] datum[styleData.role] = model[styleData.role] = newValue - Users[styleData.role](model.sessionId) - // Just for now, while we cannot undo things: - userData.splice(model.userIndex, 1) - sortModel() + var key = styleData.role; + if (!newValue) { + key = 'un' + key; + } + if (styleData.role === 'ignore') { + if (newValue) { + ignored[datum.sessionId] = datum; + console.log('fixme hrs adding to ignored', JSON.stringify(datum), 'at', datum.sessionId); + } else { + delete ignored[datum.sessionId]; + } + } + console.log('fixme hrs pal action', key, model.sessionId); + Users[key](model.sessionId); } } } @@ -336,6 +347,7 @@ Item { property var userData: [] property var myData: ({displayName: "", userName: "", audioLevel: 0.0}) // valid dummy until set property bool iAmAdmin: false + property var ignored: ({}); // FIXME: reset when changing domains function findSessionIndex(sessionId, optionalData) { // no findIndex in .qml var i, data = optionalData || userData, length = data.length; for (var i = 0; i < length; i++) { @@ -354,6 +366,16 @@ Item { myData = data[myIndex]; data.splice(myIndex, 1); userData = data; + var ignoredID, index; + for (ignoredID in ignored) { + index = findSessionIndex(ignoredID); + console.log('fixme hrs adding back ignored', ignoredID, index, JSON.stringify(ignored[ignoredID])); + if (-1 === index) { // Add back any missing ignored, because they sometimes take a moment to show up. + userData.push(ignored[ignoredID]); + } else { // Mark existing ignored. + userData[index].ignored = true; + } + } sortModel(); break; case 'select': diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index dc5b6233aa..bcd6ef7527 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -292,7 +292,15 @@ void Avatar::updateAvatarEntities() { } } +void Avatar::setShouldDie() { + // This will cause the avatar to be shrunk away and removed (the actual Avatar gets removed), but then it comes back. + _owningAvatarMixer.clear(); + // This removes the avatar from physics and makes it shrink away, but does not actualy remvoe Avatar from Avatar Manager. + // FIXME hrs remove, unless it can be made to work cleanly. + // (In which case, this could be on AvatarList/AvatarManager instead, and consider moving pal.js usage to Pal.qml, and removing (un)ignoredNode signalling.) + //DependencyManager::get()->handleRemovedAvatar(AvatarSharedPointer(this), AvatarIgnored); +} void Avatar::simulate(float deltaTime) { PerformanceTimer perfTimer("simulate"); diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 784f380028..3478b3ed21 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -178,6 +178,8 @@ public: glm::vec3 getUncachedRightPalmPosition() const; glm::quat getUncachedRightPalmRotation() const; + Q_INVOKABLE void setShouldDie(); + public slots: // FIXME - these should be migrated to use Pose data instead diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index c5222641ff..25006d52a0 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -198,6 +198,7 @@ void AvatarManager::simulateAvatarFades(float deltaTime) { if (avatar->getTargetScale() <= MIN_FADE_SCALE) { avatar->removeFromScene(*fadingIterator, scene, pendingChanges); // only remove from _avatarFades if we're sure its motionState has been removed from PhysicsEngine + qDebug() << "fixme hrs at minimum fade scale" << _motionStatesToRemoveFromPhysics.empty(); if (_motionStatesToRemoveFromPhysics.empty()) { fadingIterator = _avatarFades.erase(fadingIterator); } else { diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index f38796ca08..a423e34f8f 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -93,7 +93,6 @@ private: // virtual overrides virtual AvatarSharedPointer newSharedAvatar() override; virtual AvatarSharedPointer addAvatar(const QUuid& sessionUUID, const QWeakPointer& mixerWeakPointer) override; - virtual void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason) override; QVector _avatarFades; diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index b118423236..e736bf2a84 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -19,6 +19,8 @@ UsersScriptingInterface::UsersScriptingInterface() { connect(nodeList.data(), &LimitedNodeList::canKickChanged, this, &UsersScriptingInterface::canKickChanged); connect(nodeList.data(), &NodeList::ignoreRadiusEnabledChanged, this, &UsersScriptingInterface::ignoreRadiusEnabledChanged); connect(nodeList.data(), &NodeList::usernameFromIDReply, this, &UsersScriptingInterface::usernameFromIDReply); + connect(nodeList.data(), &NodeList::ignoredNode, this, &UsersScriptingInterface::ignoredNode); + connect(nodeList.data(), &NodeList::unignoredNode, this, &UsersScriptingInterface::unignoredNode); } void UsersScriptingInterface::ignore(const QUuid& nodeID) { diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index c8866376da..394e006451 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -95,6 +95,8 @@ public slots: signals: void canKickChanged(bool canKick); void ignoreRadiusEnabledChanged(bool isEnabled); + void ignoredNode(const QUuid& nodeID); + void unignoredNode(const QUuid& nodeID); /**jsdoc * Notifies scripts that another user has entered the ignore radius diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 77f939d2c5..7e25496537 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -329,6 +329,12 @@ pal.visibleChanged.connect(onVisibleChanged); pal.closed.connect(off); Users.usernameFromIDReply.connect(usernameFromIDReply); +function onIgnore(sessionId) { // make it go away in the usual way, since we'll still get data keeping it live + // Why doesn't this work from .qml? (crashes) + AvatarList.getAvatar(sessionId).setShouldDie(); +} +Users.ignoredNode.connect(onIgnore); + // // Cleanup. // @@ -338,6 +344,7 @@ Script.scriptEnding.connect(function () { pal.visibleChanged.disconnect(onVisibleChanged); pal.closed.disconnect(off); Users.usernameFromIDReply.disconnect(usernameFromIDReply); + Users.ignoredNode.disconnect(onIgnore); off(); }); From 8b9c1446cddbc1a9d92517b142d50859aca03e71 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 22 Dec 2016 14:21:35 -0800 Subject: [PATCH 13/45] protocol versions --- libraries/networking/src/udt/PacketHeaders.cpp | 2 +- libraries/networking/src/udt/PacketHeaders.h | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/udt/PacketHeaders.cpp b/libraries/networking/src/udt/PacketHeaders.cpp index 8c43aa2bc4..07e1ece0cb 100644 --- a/libraries/networking/src/udt/PacketHeaders.cpp +++ b/libraries/networking/src/udt/PacketHeaders.cpp @@ -53,7 +53,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketType::AvatarData: case PacketType::BulkAvatarData: case PacketType::KillAvatar: - return static_cast(AvatarMixerPacketVersion::SessionDisplayName); + return static_cast(AvatarMixerPacketVersion::Unignore); case PacketType::ICEServerHeartbeat: return 18; // ICE Server Heartbeat signing case PacketType::AssetGetInfo: diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 30bd6e8c54..c7e497bf79 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -106,7 +106,7 @@ public: ViewFrustum, RequestDomainListData, NodeUnignoreRequest, - LAST_PACKET_TYPE = ViewFrustum // FIXME! NodeUnignoreRequest + LAST_PACKET_TYPE = NodeUnignoreRequest }; }; @@ -209,7 +209,8 @@ enum class AvatarMixerPacketVersion : PacketVersion { SensorToWorldMat, HandControllerJoints, HasKillAvatarReason, - SessionDisplayName + SessionDisplayName, + Unignore }; enum class DomainConnectRequestVersion : PacketVersion { From a9e781f56546680bac037b0bc1624d61d7a3db49 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 22 Dec 2016 15:25:43 -0800 Subject: [PATCH 14/45] naming consistentcy. No functional changes. --- assignment-client/src/avatars/AvatarMixer.cpp | 10 +++++----- assignment-client/src/avatars/AvatarMixer.h | 2 +- assignment-client/src/avatars/AvatarMixerClientData.h | 2 +- libraries/networking/src/NodeList.cpp | 4 ++-- libraries/networking/src/udt/PacketHeaders.h | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 1192dfb200..fdb6b10cab 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -51,7 +51,7 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); packetReceiver.registerListener(PacketType::NodeUnignoreRequest, this, "handleNodeUnignoreRequestPacket"); packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket"); - packetReceiver.registerListener(PacketType::RequestDomainListData, this, "handleRequestDomainListDataPacket"); + packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket"); auto nodeList = DependencyManager::get(); connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &AvatarMixer::handlePacketVersionMismatch); @@ -536,18 +536,18 @@ void AvatarMixer::handleViewFrustumPacket(QSharedPointer messag } } -void AvatarMixer::handleRequestDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode) { +void AvatarMixer::handleRequestsDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode) { auto nodeList = DependencyManager::get(); nodeList->getOrCreateLinkedData(senderNode); - qDebug() << "HRS FIXME received requestDomainListData packet from" << senderNode->getUUID(); + qDebug() << "HRS FIXME received RequestsDomainListData packet from" << senderNode->getUUID(); if (senderNode->getLinkedData()) { AvatarMixerClientData* nodeData = dynamic_cast(senderNode->getLinkedData()); if (nodeData != nullptr) { bool isRequesting; message->readPrimitive(&isRequesting); - qDebug() << "HRS FIXME handling requestDomainListData packet" << isRequesting << "from" << nodeData->getNodeID(); - nodeData->setRequestDomainListData(isRequesting); + qDebug() << "HRS FIXME handling RequestsDomainListData packet" << isRequesting << "from" << nodeData->getNodeID(); + nodeData->setRequestsDomainListData(isRequesting); } } } diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 296b82f1aa..865dd36106 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -43,7 +43,7 @@ private slots: void handleNodeIgnoreRequestPacket(QSharedPointer message, SharedNodePointer senderNode); void handleNodeUnignoreRequestPacket(QSharedPointer message, SharedNodePointer senderNode); void handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handleRequestDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode); + void handleRequestsDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode); void domainSettingsRequestComplete(); void handlePacketVersionMismatch(PacketType type, const HifiSockAddr& senderSockAddr, const QUuid& senderUUID); diff --git a/assignment-client/src/avatars/AvatarMixerClientData.h b/assignment-client/src/avatars/AvatarMixerClientData.h index 462968eb37..861086893a 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.h +++ b/assignment-client/src/avatars/AvatarMixerClientData.h @@ -102,7 +102,7 @@ public: const QString& getBaseDisplayName() { return _baseDisplayName; } void setBaseDisplayName(const QString& baseDisplayName) { _baseDisplayName = baseDisplayName; } bool getRequestsDomainListData() { return _requestsDomainListData; } - void setRequestDomainListData(bool requesting) { _requestsDomainListData = requesting; } + void setRequestsDomainListData(bool requesting) { _requestsDomainListData = requesting; } private: AvatarSharedPointer _avatar { new AvatarData() }; diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 49c689b007..6905feb370 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -971,10 +971,10 @@ void NodeList::setRequestsDomainListData(bool isRequesting) { eachMatchingNode([](const SharedNodePointer& node)->bool { return node->getType() == NodeType::AvatarMixer; }, [this, isRequesting](const SharedNodePointer& destinationNode) { - auto packet = NLPacket::create(PacketType::RequestDomainListData, sizeof(bool), true); // reliable + auto packet = NLPacket::create(PacketType::RequestsDomainListData, sizeof(bool), true); // reliable packet->writePrimitive(isRequesting); sendPacket(std::move(packet), *destinationNode); - qDebug() << "HRS FIXME sending requestDomainListData packet" << isRequesting; + qDebug() << "HRS FIXME sending RequestsDomainListData packet" << isRequesting; }); _requestsDomainListData = isRequesting; } \ No newline at end of file diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index c7e497bf79..cae4eaa43e 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -104,7 +104,7 @@ public: UsernameFromIDRequest, UsernameFromIDReply, ViewFrustum, - RequestDomainListData, + RequestsDomainListData, NodeUnignoreRequest, LAST_PACKET_TYPE = NodeUnignoreRequest }; From 7faa689d1dc8a308029a6820d32f9586214dd427 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Thu, 22 Dec 2016 16:29:14 -0800 Subject: [PATCH 15/45] avatar body goes away when ignored, and comes back when unignored --- interface/src/avatar/Avatar.cpp | 21 +++++++++++++++++++++ interface/src/avatar/Avatar.h | 4 ++++ interface/src/avatar/AvatarManager.cpp | 13 ++----------- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index bcd6ef7527..ed8433aade 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -44,6 +44,7 @@ #include "Util.h" #include "world.h" #include "InterfaceLogging.h" +#include "SceneScriptingInterface.h" #include "SoftAttachmentModel.h" #include @@ -467,6 +468,7 @@ bool Avatar::addToScene(AvatarSharedPointer self, std::shared_ptr attachmentModel->addToScene(scene, pendingChanges); } + _inScene = true; return true; } @@ -477,6 +479,7 @@ void Avatar::removeFromScene(AvatarSharedPointer self, std::shared_ptrremoveFromScene(scene, pendingChanges); } + _inScene = false; } void Avatar::updateRenderItem(render::PendingChanges& pendingChanges) { @@ -1336,3 +1339,21 @@ void Avatar::setParentJointIndex(quint16 parentJointIndex) { } } } + +void Avatar::addToScene(AvatarSharedPointer myHandle) { + render::ScenePointer scene = qApp->getMain3DScene(); + if (scene) { + render::PendingChanges pendingChanges; + if (DependencyManager::get()->shouldRenderAvatars() && !DependencyManager::get()->isIgnoringNode(getSessionUUID())) { + addToScene(myHandle, scene, pendingChanges); + } + scene->enqueuePendingChanges(pendingChanges); + } else { + qCWarning(interfaceapp) << "AvatarManager::addAvatar() : Unexpected null scene, possibly during application shutdown"; + } +} +void Avatar::ensureInScene(AvatarSharedPointer self) { + if (!_inScene) { + addToScene(self); + } +} \ No newline at end of file diff --git a/interface/src/avatar/Avatar.h b/interface/src/avatar/Avatar.h index 3478b3ed21..d03a8e9a54 100644 --- a/interface/src/avatar/Avatar.h +++ b/interface/src/avatar/Avatar.h @@ -256,6 +256,9 @@ protected: ThreadSafeValueCache _rightPalmPositionCache { glm::vec3() }; ThreadSafeValueCache _rightPalmRotationCache { glm::quat() }; + void addToScene(AvatarSharedPointer self); + void ensureInScene(AvatarSharedPointer self); + private: int _leftPointerGeometryID { 0 }; int _rightPointerGeometryID { 0 }; @@ -264,6 +267,7 @@ private: bool _shouldAnimate { true }; bool _shouldSkipRender { false }; bool _isLookAtTarget { false }; + bool _inScene { false }; float getBoundingRadius() const; diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 25006d52a0..c534e9b499 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -159,6 +159,7 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { removeAvatar(avatarIterator.key()); ++avatarIterator; } else { + avatar->ensureInScene(avatar); avatar->simulate(deltaTime); ++avatarIterator; @@ -198,7 +199,6 @@ void AvatarManager::simulateAvatarFades(float deltaTime) { if (avatar->getTargetScale() <= MIN_FADE_SCALE) { avatar->removeFromScene(*fadingIterator, scene, pendingChanges); // only remove from _avatarFades if we're sure its motionState has been removed from PhysicsEngine - qDebug() << "fixme hrs at minimum fade scale" << _motionStatesToRemoveFromPhysics.empty(); if (_motionStatesToRemoveFromPhysics.empty()) { fadingIterator = _avatarFades.erase(fadingIterator); } else { @@ -220,16 +220,7 @@ AvatarSharedPointer AvatarManager::addAvatar(const QUuid& sessionUUID, const QWe auto newAvatar = AvatarHashMap::addAvatar(sessionUUID, mixerWeakPointer); auto rawRenderableAvatar = std::static_pointer_cast(newAvatar); - render::ScenePointer scene = qApp->getMain3DScene(); - if (scene) { - render::PendingChanges pendingChanges; - if (DependencyManager::get()->shouldRenderAvatars()) { - rawRenderableAvatar->addToScene(rawRenderableAvatar, scene, pendingChanges); - } - scene->enqueuePendingChanges(pendingChanges); - } else { - qCWarning(interfaceapp) << "AvatarManager::addAvatar() : Unexpected null scene, possibly during application shutdown"; - } + rawRenderableAvatar->addToScene(rawRenderableAvatar); return newAvatar; } From 38a3ee410455020e17bc8da695758c4742ac475c Mon Sep 17 00:00:00 2001 From: David Kelly Date: Fri, 23 Dec 2016 14:14:45 -0800 Subject: [PATCH 16/45] Some code review feedback more to come --- assignment-client/src/avatars/AvatarMixer.cpp | 8 ++++++-- libraries/networking/src/NodeList.cpp | 8 ++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index fdb6b10cab..27be882c6e 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -207,9 +207,13 @@ void AvatarMixer::broadcastAvatarData() { // use the data rate specifically for avatar data for FRD adjustment checks float avatarDataRateLastSecond = nodeData->getOutboundAvatarDataKbps(); - // send extra data that is otherwise surpressed + // When this is true, the AvatarMixer will send Avatar data to a client about avatars that are not in the view frustrum bool getsOutOfView = nodeData->getRequestsDomainListData(); - bool getsIgnoredByMe = nodeData->getRequestsDomainListData(); + + // When this is true, the AvatarMixer will send Avatar data to a client about avatars that they've ignored + bool getsIgnoredByMe = getsOutOfView; + + // When this is true, the AvatarMixer will send Avatar data to a client about avatars that have ignored them bool getsAnyIgnored = getsIgnoredByMe && node->getCanKick(); // Check if it is time to adjust what we send this client based on the observed diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 6905feb370..b1d7f0b5fc 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -812,7 +812,7 @@ void NodeList::ignoreNodeBySessionID(const QUuid& nodeID) { } void NodeList::unignoreNodeBySessionID(const QUuid& nodeID) { - // enumerate the nodes to send a reliable ignore packet to each that can leverage it + // enumerate the nodes to send a reliable unignore packet to each that can leverage it if (!nodeID.isNull() && _sessionUUID != nodeID) { eachMatchingNode([&nodeID](const SharedNodePointer& node)->bool { if (node->getType() == NodeType::AudioMixer || node->getType() == NodeType::AvatarMixer) { @@ -821,7 +821,7 @@ void NodeList::unignoreNodeBySessionID(const QUuid& nodeID) { return false; } }, [&nodeID, this](const SharedNodePointer& destinationNode) { - // create a reliable NLPacket with space for the ignore UUID + // create a reliable NLPacket with space for the unignore UUID auto ignorePacket = NLPacket::create(PacketType::NodeUnignoreRequest, NUM_BYTES_RFC4122_UUID, true); // write the node ID to the packet @@ -829,7 +829,7 @@ void NodeList::unignoreNodeBySessionID(const QUuid& nodeID) { qCDebug(networking) << "Sending packet to unignore node" << uuidStringWithoutCurlyBraces(nodeID); - // send off this ignore packet reliably to the matching node + // send off this unignore packet reliably to the matching node sendPacket(std::move(ignorePacket), *destinationNode); }); @@ -977,4 +977,4 @@ void NodeList::setRequestsDomainListData(bool isRequesting) { qDebug() << "HRS FIXME sending RequestsDomainListData packet" << isRequesting; }); _requestsDomainListData = isRequesting; -} \ No newline at end of file +} From 4fdc093cfab470ca78d155a174b3249eba310ffa Mon Sep 17 00:00:00 2001 From: David Kelly Date: Fri, 23 Dec 2016 15:23:43 -0800 Subject: [PATCH 17/45] Throttle extra avatar data When PAL is open, we send AvatarData for avatars out of view, or those who have ignored us (if we are an admin). For those out of view, we really don't need their info at 45hz, so this is a super simple way to get it less often. Chose 1/10th (4.5 hz) randomly and could be much lower. Just wanted to push this and get the conversation going on how best to do it. --- assignment-client/src/avatars/AvatarMixer.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 27be882c6e..25acdb162d 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -110,6 +110,9 @@ void AvatarMixer::broadcastAvatarData() { const float CURRENT_FRAME_RATIO = 1.0f / TRAILING_AVERAGE_FRAMES; const float PREVIOUS_FRAMES_RATIO = 1.0f - CURRENT_FRAME_RATIO; + // only send extra avatar data (avatars out of view, ignored) every Nth AvatarData frame + const int EXTRA_AVATAR_DATA_FRAME_RATIO = 10; + // NOTE: The following code calculates the _performanceThrottlingRatio based on how much the avatar-mixer was // able to sleep. This will eventually be used to ask for an additional avatar-mixer to help out. Currently the value // is unused as it is assumed this should not be hit before the avatar-mixer hits the desired bandwidth limit per client. @@ -368,6 +371,11 @@ void AvatarMixer::broadcastAvatarData() { AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID()); AvatarDataSequenceNumber lastSeqFromSender = otherNodeData->getLastReceivedSequenceNumber(); + // this throttles the extra data to only be sent every Nth message + if (getsOutOfView && lastSeqToReceiver % EXTRA_AVATAR_DATA_FRAME_RATIO > 0) { + return; + } + if (lastSeqToReceiver > lastSeqFromSender && lastSeqToReceiver != UINT16_MAX) { // we got out out of order packets from the sender, track it otherNodeData->incrementNumOutOfOrderSends(); From d3c2ba5199b8c46224ce74f4eb277f1e14c6a3c0 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 28 Dec 2016 13:39:53 -0800 Subject: [PATCH 18/45] Fix throttling extra data --- assignment-client/src/avatars/AvatarMixer.cpp | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 25acdb162d..6285150070 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -111,7 +111,7 @@ void AvatarMixer::broadcastAvatarData() { const float PREVIOUS_FRAMES_RATIO = 1.0f - CURRENT_FRAME_RATIO; // only send extra avatar data (avatars out of view, ignored) every Nth AvatarData frame - const int EXTRA_AVATAR_DATA_FRAME_RATIO = 10; + const int EXTRA_AVATAR_DATA_FRAME_RATIO = 16; // NOTE: The following code calculates the _performanceThrottlingRatio based on how much the avatar-mixer was // able to sleep. This will eventually be used to ask for an additional avatar-mixer to help out. Currently the value @@ -370,11 +370,6 @@ void AvatarMixer::broadcastAvatarData() { AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID()); AvatarDataSequenceNumber lastSeqFromSender = otherNodeData->getLastReceivedSequenceNumber(); - - // this throttles the extra data to only be sent every Nth message - if (getsOutOfView && lastSeqToReceiver % EXTRA_AVATAR_DATA_FRAME_RATIO > 0) { - return; - } if (lastSeqToReceiver > lastSeqFromSender && lastSeqToReceiver != UINT16_MAX) { // we got out out of order packets from the sender, track it @@ -400,15 +395,21 @@ void AvatarMixer::broadcastAvatarData() { nodeData->setLastBroadcastSequenceNumber(otherNode->getUUID(), otherNodeData->getLastReceivedSequenceNumber()); - // start a new segment in the PacketList for this avatar - avatarPacketList->startSegment(); - // determine if avatar is in view, to determine how much data to include... glm::vec3 otherNodeBoxScale = (otherNodeData->getPosition() - otherNodeData->getGlobalBoundingBoxCorner()) * 2.0f; AABox otherNodeBox(otherNodeData->getGlobalBoundingBoxCorner(), otherNodeBoxScale); + bool isInView = nodeData->otherAvatarInView(otherNodeBox); + + // this throttles the extra data to only be sent every Nth message + if (!isInView && getsOutOfView && (lastSeqToReceiver % EXTRA_AVATAR_DATA_FRAME_RATIO > 0)) { + return; + } + + // start a new segment in the PacketList for this avatar + avatarPacketList->startSegment(); AvatarData::AvatarDataDetail detail; - if (!nodeData->otherAvatarInView(otherNodeBox) && !getsOutOfView) { + if (!isInView && !getsOutOfView) { detail = AvatarData::MinimumData; nodeData->incrementAvatarOutOfView(); } else { From 800389cf20be3f0a002c50cd1ff879d5f80caa2d Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 28 Dec 2016 14:37:19 -0800 Subject: [PATCH 19/45] Remove HRS logging --- assignment-client/src/avatars/AvatarMixer.cpp | 4 ---- interface/src/avatar/Avatar.cpp | 5 ----- libraries/avatars/src/AvatarHashMap.cpp | 1 - libraries/networking/src/NodeList.cpp | 1 - 4 files changed, 11 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 6285150070..1de1f093b7 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -347,7 +347,6 @@ void AvatarMixer::broadcastAvatarData() { && (forceSend || otherNodeData->getIdentityChangeTimestamp() > _lastFrameTimestamp || distribution(generator) < IDENTITY_SEND_PROBABILITY)) { - qDebug() << "FIXME HRS sending identity to" << node->getUUID() << "from" << otherNode->getUUID() << "gets mine/all/view:" << getsIgnoredByMe << getsAnyIgnored << getsOutOfView ; sendIdentityPacket(otherNodeData, node); } @@ -417,7 +416,6 @@ void AvatarMixer::broadcastAvatarData() { ? AvatarData::SendAllData : AvatarData::IncludeSmallData; nodeData->incrementAvatarInView(); } - //qDebug() << "FIXME HRS sending" << detail << "to" << node->getUUID() << "from" << otherNode->getUUID(); numAvatarDataBytes += avatarPacketList->write(otherNode->getUUID().toRfc4122()); numAvatarDataBytes += avatarPacketList->write(otherAvatar.toByteArray(detail)); @@ -552,14 +550,12 @@ void AvatarMixer::handleViewFrustumPacket(QSharedPointer messag void AvatarMixer::handleRequestsDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode) { auto nodeList = DependencyManager::get(); nodeList->getOrCreateLinkedData(senderNode); - qDebug() << "HRS FIXME received RequestsDomainListData packet from" << senderNode->getUUID(); if (senderNode->getLinkedData()) { AvatarMixerClientData* nodeData = dynamic_cast(senderNode->getLinkedData()); if (nodeData != nullptr) { bool isRequesting; message->readPrimitive(&isRequesting); - qDebug() << "HRS FIXME handling RequestsDomainListData packet" << isRequesting << "from" << nodeData->getNodeID(); nodeData->setRequestsDomainListData(isRequesting); } } diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index ed8433aade..1ade21930d 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -296,11 +296,6 @@ void Avatar::updateAvatarEntities() { void Avatar::setShouldDie() { // This will cause the avatar to be shrunk away and removed (the actual Avatar gets removed), but then it comes back. _owningAvatarMixer.clear(); - - // This removes the avatar from physics and makes it shrink away, but does not actualy remvoe Avatar from Avatar Manager. - // FIXME hrs remove, unless it can be made to work cleanly. - // (In which case, this could be on AvatarList/AvatarManager instead, and consider moving pal.js usage to Pal.qml, and removing (un)ignoredNode signalling.) - //DependencyManager::get()->handleRemovedAvatar(AvatarSharedPointer(this), AvatarIgnored); } void Avatar::simulate(float deltaTime) { diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index c0aafa7f2b..c708176da7 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -145,7 +145,6 @@ void AvatarHashMap::processAvatarIdentityPacket(QSharedPointer identity.uuid = EMPTY; } } - qDebug() << "FIXME HRS processing identity packet regarding" << identity.uuid << "ignoring:" << nodeList->isIgnoringNode(identity.uuid) << "reqestsDomainList:" << nodeList->getRequestsDomainListData(); if (!nodeList->isIgnoringNode(identity.uuid) || nodeList->getRequestsDomainListData()) { // mesh URL for a UUID, find avatar in our list auto avatar = newOrExistingAvatar(identity.uuid, sendingNode); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index b1d7f0b5fc..e745954d88 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -974,7 +974,6 @@ void NodeList::setRequestsDomainListData(bool isRequesting) { auto packet = NLPacket::create(PacketType::RequestsDomainListData, sizeof(bool), true); // reliable packet->writePrimitive(isRequesting); sendPacket(std::move(packet), *destinationNode); - qDebug() << "HRS FIXME sending RequestsDomainListData packet" << isRequesting; }); _requestsDomainListData = isRequesting; } From 46e8bf5283163eb031c0ff671545049ac42a4392 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 22 Dec 2016 12:42:50 -0800 Subject: [PATCH 20/45] First steps, holding off til Howard finishes --- assignment-client/src/audio/AudioMixer.cpp | 50 ++++++++++++++++ assignment-client/src/audio/AudioMixer.h | 2 + interface/resources/qml/hifi/Pal.qml | 33 +++++++---- libraries/networking/src/NodeList.cpp | 58 +++++++++++++++++++ libraries/networking/src/NodeList.h | 4 ++ libraries/networking/src/udt/PacketHeaders.h | 6 +- .../src/UsersScriptingInterface.cpp | 12 ++++ .../src/UsersScriptingInterface.h | 23 +++++++- scripts/system/pal.js | 2 + 9 files changed, 178 insertions(+), 12 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 9a80289911..f7ea49a642 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -66,6 +66,8 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); packetReceiver.registerListener(PacketType::NodeUnignoreRequest, this, "handleNodeUnignoreRequestPacket"); + packetReceiver.registerListener(PacketType::NodePersonalMuteRequest, this, "handleNodePersonalMuteRequestPacket"); + packetReceiver.registerListener(PacketType::NodePersonalMuteStatusRequest, this, "handleNodePersonalMuteStatusRequestPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); packetReceiver.registerListener(PacketType::NodeMuteRequest, this, "handleNodeMuteRequestPacket"); packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket"); @@ -230,6 +232,54 @@ void AudioMixer::handleNodeUnignoreRequestPacket(QSharedPointer sendingNode->parseUnignoreRequestMessage(packet); } +void AudioMixer::handleNodePersonalMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + // parse out the UUID being muted from the packet + QUuid ignoredUUID = QUuid::fromRfc4122(packet->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + bool enabled; + packet->readPrimitive(&enabled); + + if (!ignoredUUID.isNull() && ignoredUUID != _uuid) { + if (enabled) { + qDebug() << "Adding" << uuidStringWithoutCurlyBraces(ignoredUUID) << "to personally muted set for" + << uuidStringWithoutCurlyBraces(_uuid); + + // Add the session UUID to the set of personally muted ones for this listening node + sendingNode->addIgnoredNode(ignoredUUID); + } else { + qDebug() << "Removing" << uuidStringWithoutCurlyBraces(ignoredUUID) << "from personally muted set for" + << uuidStringWithoutCurlyBraces(_uuid); + + // Remove the session UUID to the set of personally muted ones for this listening node + sendingNode->_ignoredNodeIDSet.unsafe_erase(ignoredUUID); + } + } else { + qWarning() << "Node::addPersonalMutedNode called with null ID or ID of personal muting node."; + } +} + +void AudioMixer::handleNodePersonalMuteStatusRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { + // parse out the UUID whose personal mute status is being requested from the packet + QUuid UUIDToCheck = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + + if (!UUIDToCheck.isNull()) { + // First, make sure we actually have a node with this UUID + auto limitedNodeList = DependencyManager::get(); + auto matchingNode = limitedNodeList->nodeWithUUID(UUIDToCheck); + + // If we do have a matching node... + if (matchingNode) { + auto personalMuteStatusPacket = NLPacket::create(PacketType::NodePersonalMuteStatusReply, NUM_BYTES_RFC4122_UUID + sizeof(bool), true); + + // write the node ID to the packet + personalMuteStatusPacket->write(UUIDToCheck.toRfc4122()); + personalMuteStatusPacket->writePrimitive(isIgnoringNodeWithID(UUIDToCheck)); + + qCDebug(networking) << "Sending Personal Mute Status Request Packet for node" << uuidStringWithoutCurlyBraces(nodeID); + + limitedNodeList->sendPacket(std::move(personalMuteStatusPacket), *sendingNode); + } + } +} void AudioMixer::handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { sendingNode->parseIgnoreRadiusRequestMessage(packet); } diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 14a0167c3e..353db84a15 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -63,6 +63,8 @@ private slots: void handleNodeKilled(SharedNodePointer killedNode); void handleNodeIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleNodeUnignoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleNodePersonalMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); + void handleNodePersonalMuteStatusRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleNodeMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 5c475f16dd..eb35664707 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -210,22 +210,28 @@ Item { var newValue = !model[styleData.role] var datum = userData[model.userIndex] datum[styleData.role] = model[styleData.role] = newValue - var key = styleData.role; - if (!newValue) { - key = 'un' + key; - } - if (styleData.role === 'ignore') { + if (styleData.role === "personalMute") { + Users[styleData.role](model.sessionId, newValue) + } else if (styleData.role === 'ignore') { + var key = styleData.role; + if (!newValue) { + key = 'un' + key; + } if (newValue) { ignored[datum.sessionId] = datum; console.log('fixme hrs adding to ignored', JSON.stringify(datum), 'at', datum.sessionId); } else { delete ignored[datum.sessionId]; - } + } + console.log('fixme hrs pal action', key, model.sessionId); + Users[key](model.sessionId); + } else { + Users[styleData.role](model.sessionId) + // Just for now, while we cannot undo things: + userData.splice(model.userIndex, 1) + sortModel() } - console.log('fixme hrs pal action', key, model.sessionId); - Users[key](model.sessionId); } - } } } // Refresh button @@ -422,7 +428,14 @@ Item { } } break; - default: + case 'updateMuted': + var userId = message.params[0]; + var enabled = message.params[1]; + var userIndex = findSessionIndex(userId); + userModel.get(userIndex).personalMute.property = enabled; + userData[userIndex].personalMute.property = enabled; // Defensive programming + break; + default: console.log('Unrecognized message:', JSON.stringify(message)); } } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index e745954d88..f80dbad23d 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -875,6 +875,64 @@ void NodeList::maybeSendIgnoreSetToNode(SharedNodePointer newNode) { } } +void NodeList::personalMuteNodeBySessionID(const QUuid& nodeID, bool enabled) { + // cannot personal mute yourself, or nobody + if (!nodeID.isNull() && _sessionUUID != nodeID) { + auto audioMixer = soloNodeOfType(NodeType::AudioMixer); + if (audioMixer) { + // setup the packet + auto personalMutePacket = NLPacket::create(PacketType::NodePersonalMuteRequest, NUM_BYTES_RFC4122_UUID + sizeof(bool), true); + + // write the node ID to the packet + personalMutePacket->write(nodeID.toRfc4122()); + personalMutePacket->writePrimitive(enabled); + + qCDebug(networking) << "Sending Personal Mute Packet to" << (enabled ? "mute" : "unmute") << "node" << uuidStringWithoutCurlyBraces(nodeID); + + sendPacket(std::move(personalMutePacket), *audioMixer); + } else { + qWarning() << "Couldn't find audio mixer to send node personal mute request"; + } + } else { + qWarning() << "NodeList::personalMuteNodeBySessionID called with an invalid ID or an ID which matches the current session ID."; + } +} + +void NodeList::requestPersonalMuteStatus(const QUuid& nodeID) { + // cannot personal mute yourself, or nobody; don't bother checking the status + if (!nodeID.isNull() && _sessionUUID != nodeID) { + auto audioMixer = soloNodeOfType(NodeType::AudioMixer); + if (audioMixer) { + // send a request to the audio mixer to get the personal mute status associated with the given session ID + // setup the packet + auto personalMuteStatusPacket = NLPacket::create(PacketType::NodePersonalMuteStatusRequest, NUM_BYTES_RFC4122_UUID, true); + + // write the node ID to the packet + personalMuteStatusPacket->write(nodeID.toRfc4122()); + + qCDebug(networking) << "Sending Personal Mute Status Request Packet for node" << uuidStringWithoutCurlyBraces(nodeID); + + sendPacket(std::move(personalMuteStatusPacket), *audioMixer); + } else { + qWarning() << "Couldn't find audio mixer to send node personal mute status request"; + } + } else { + qWarning() << "NodeList::requestPersonalMuteStatus called with an invalid ID or an ID which matches the current session ID."; + } +} + +void NodeList::processPersonalMuteStatusReply(QSharedPointer message) { + // read the UUID from the packet + QString nodeUUIDString = (QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID))).toString(); + // read the personal mute status + bool isPersonalMuted; + message->readPrimitive(&isPersonalMuted); + + qCDebug(networking) << "Got personal muted status" << isPersonalMuted << "for node" << nodeUUIDString; + + emit personalMuteStatusReply(nodeUUIDString, isPersonalMuted); +} + void NodeList::kickNodeBySessionID(const QUuid& nodeID) { // send a request to domain-server to kick the node with the given session ID // the domain-server will handle the persistence of the kick (via username or IP) diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 6d7026b562..5b3f334366 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -79,12 +79,14 @@ public: void ignoreNodeBySessionID(const QUuid& nodeID); void unignoreNodeBySessionID(const QUuid& nodeID); bool isIgnoringNode(const QUuid& nodeID) const; + void personalMuteNodeBySessionID(const QUuid& nodeID, bool enabled); void kickNodeBySessionID(const QUuid& nodeID); void muteNodeBySessionID(const QUuid& nodeID); void requestUsernameFromSessionID(const QUuid& nodeID); bool getRequestsDomainListData() { return _requestsDomainListData; } void setRequestsDomainListData(bool isRequesting); + void requestPersonalMuteStatus(const QUuid& nodeID); public slots: void reset(); @@ -104,6 +106,7 @@ public slots: void processICEPingPacket(QSharedPointer message); void processUsernameFromIDReply(QSharedPointer message); + void processPersonalMuteStatusReply(QSharedPointer message); #if (PR_BUILD || DEV_BUILD) void toggleSendNewerDSConnectVersion(bool shouldSendNewerVersion) { _shouldSendNewerVersion = shouldSendNewerVersion; } @@ -116,6 +119,7 @@ signals: void unignoredNode(const QUuid& nodeID); void ignoreRadiusEnabledChanged(bool isIgnored); void usernameFromIDReply(const QString& nodeID, const QString& username, const QString& machineFingerprint); + void personalMuteStatusReply(const QString& nodeID, bool isPersonalMuted); private slots: void stopKeepalivePingTimer(); diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index cae4eaa43e..76c5120823 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -106,7 +106,10 @@ public: ViewFrustum, RequestsDomainListData, NodeUnignoreRequest, - LAST_PACKET_TYPE = NodeUnignoreRequest + NodePersonalMuteRequest, + NodePersonalMuteStatusRequest, + NodePersonalMuteStatusReply, + LAST_PACKET_TYPE = NodePersonalMuteStatusReply }; }; @@ -245,6 +248,7 @@ enum class AudioVersion : PacketVersion { Exactly10msAudioPackets, TerminatingStreamStats, SpaceBubbleChanges, + HasPersonalMute, }; #endif // hifi_PacketHeaders_h diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index e736bf2a84..e25a9603b6 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -21,6 +21,7 @@ UsersScriptingInterface::UsersScriptingInterface() { connect(nodeList.data(), &NodeList::usernameFromIDReply, this, &UsersScriptingInterface::usernameFromIDReply); connect(nodeList.data(), &NodeList::ignoredNode, this, &UsersScriptingInterface::ignoredNode); connect(nodeList.data(), &NodeList::unignoredNode, this, &UsersScriptingInterface::unignoredNode); + connect(nodeList.data(), &NodeList::personalMuteStatusReply, this, &UsersScriptingInterface::personalMuteStatusReply); } void UsersScriptingInterface::ignore(const QUuid& nodeID) { @@ -33,6 +34,17 @@ void UsersScriptingInterface::unignore(const QUuid& nodeID) { DependencyManager::get()->unignoreNodeBySessionID(nodeID); } +void UsersScriptingInterface::personalMute(const QUuid& nodeID, bool enabled) { + // ask the NodeList to mute the user with the given session ID + // "Personal Mute" only applies one way and is not global + DependencyManager::get()->personalMuteNodeBySessionID(nodeID, enabled); +} + +void UsersScriptingInterface::requestPersonalMuteStatus(const QUuid& nodeID) { + // ask the Audio Mixer via the NodeList for the Personal Mute status associated with the given session ID + DependencyManager::get()->requestPersonalMuteStatus(nodeID); +} + void UsersScriptingInterface::kick(const QUuid& nodeID) { // ask the NodeList to kick the user with the given session ID diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index 394e006451..a7e6ec3a3e 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -39,6 +39,21 @@ public slots: void ignore(const QUuid& nodeID); void unignore(const QUuid& nodeID); + /**jsdoc + * Mute another user for you and you only. + * @function Users.personalMute + * @param {nodeID} nodeID The node or session ID of the user you want to mute. + * @param {bool} enable True for enabled; false for disabled. + */ + void personalMute(const QUuid& nodeID, bool enabled); + + /**jsdoc + * Requests a bool containing whether you have given the given Avatar UUID. + * @function Users.requestPersonalMuteStatus + * @param {nodeID} nodeID The node or session ID of the user whose personal mute status you want. + */ + void requestPersonalMuteStatus(const QUuid& nodeID); + /**jsdoc * Kick another user. * @function Users.kick @@ -47,7 +62,7 @@ public slots: void kick(const QUuid& nodeID); /**jsdoc - * Mute another user. + * Mute another user for everyone. * @function Users.mute * @param {nodeID} nodeID The node or session ID of the user you want to mute. */ @@ -110,6 +125,12 @@ signals: */ void usernameFromIDReply(const QString& nodeID, const QString& username, const QString& machineFingerprint); + /**jsdoc + * Notifies scripts of the Personal Mute status associated with a UUID. + * @function Users.usernameFromIDReply + */ + void personalMuteStatusReply(const QString& nodeID, bool isPersonalMuted); + private: bool getRequestsDomainListData(); void setRequestsDomainListData(bool requests); diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 7e25496537..7f38857702 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -132,6 +132,8 @@ function populateUserList() { // Request the username from the given UUID Users.requestUsernameFromID(id); } + // Request personal mute status from AudioMixer + Users.requestPersonalMuteStatus(id); data.push(avatarPalDatum); if (id) { // No overlay for ourself. addAvatarNode(id); From e26d3476822bf398d30279b0256ae3839d94038a Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 22 Dec 2016 16:21:53 -0800 Subject: [PATCH 21/45] It seems to be working, minus removing from list --- assignment-client/src/audio/AudioMixer.cpp | 11 ++++++----- libraries/networking/src/NodeList.cpp | 7 ++++--- libraries/networking/src/NodeList.h | 2 +- .../script-engine/src/UsersScriptingInterface.cpp | 5 ++--- .../script-engine/src/UsersScriptingInterface.h | 2 +- scripts/system/pal.js | 15 ++++++++++++++- 6 files changed, 28 insertions(+), 14 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index f7ea49a642..3589c025f4 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -250,16 +250,16 @@ void AudioMixer::handleNodePersonalMuteRequestPacket(QSharedPointer_ignoredNodeIDSet.unsafe_erase(ignoredUUID); + //sendingNode->removeIgnoredNode(ignoredUUID); } } else { - qWarning() << "Node::addPersonalMutedNode called with null ID or ID of personal muting node."; + qWarning() << "Node::handlePersonalMutedNode called with null ID or ID of personal muting node."; } } void AudioMixer::handleNodePersonalMuteStatusRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { // parse out the UUID whose personal mute status is being requested from the packet - QUuid UUIDToCheck = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + QUuid UUIDToCheck = QUuid::fromRfc4122(packet->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); if (!UUIDToCheck.isNull()) { // First, make sure we actually have a node with this UUID @@ -269,12 +269,13 @@ void AudioMixer::handleNodePersonalMuteStatusRequestPacket(QSharedPointerisIgnoringNodeWithID(UUIDToCheck); // write the node ID to the packet personalMuteStatusPacket->write(UUIDToCheck.toRfc4122()); - personalMuteStatusPacket->writePrimitive(isIgnoringNodeWithID(UUIDToCheck)); + personalMuteStatusPacket->writePrimitive(isMuted); - qCDebug(networking) << "Sending Personal Mute Status Request Packet for node" << uuidStringWithoutCurlyBraces(nodeID); + qDebug() << "Personal Mute Status: node" << uuidStringWithoutCurlyBraces(UUIDToCheck) << "mute status:" << isMuted; limitedNodeList->sendPacket(std::move(personalMuteStatusPacket), *sendingNode); } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index f80dbad23d..ab63c81b9a 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -129,6 +129,7 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) packetReceiver.registerListener(PacketType::DomainServerPathResponse, this, "processDomainServerPathResponse"); packetReceiver.registerListener(PacketType::DomainServerRemovedNode, this, "processDomainServerRemovedNode"); packetReceiver.registerListener(PacketType::UsernameFromIDReply, this, "processUsernameFromIDReply"); + packetReceiver.registerListener(PacketType::NodePersonalMuteStatusReply, this, "processPersonalMuteStatusReply"); } qint64 NodeList::sendStats(QJsonObject statsObject, HifiSockAddr destination) { @@ -875,7 +876,7 @@ void NodeList::maybeSendIgnoreSetToNode(SharedNodePointer newNode) { } } -void NodeList::personalMuteNodeBySessionID(const QUuid& nodeID, bool enabled) { +void NodeList::personalMuteNodeBySessionID(const QUuid& nodeID, bool muteEnabled) { // cannot personal mute yourself, or nobody if (!nodeID.isNull() && _sessionUUID != nodeID) { auto audioMixer = soloNodeOfType(NodeType::AudioMixer); @@ -885,9 +886,9 @@ void NodeList::personalMuteNodeBySessionID(const QUuid& nodeID, bool enabled) { // write the node ID to the packet personalMutePacket->write(nodeID.toRfc4122()); - personalMutePacket->writePrimitive(enabled); + personalMutePacket->writePrimitive(muteEnabled); - qCDebug(networking) << "Sending Personal Mute Packet to" << (enabled ? "mute" : "unmute") << "node" << uuidStringWithoutCurlyBraces(nodeID); + qCDebug(networking) << "Sending Personal Mute Packet to" << (muteEnabled ? "mute" : "unmute") << "node" << uuidStringWithoutCurlyBraces(nodeID); sendPacket(std::move(personalMutePacket), *audioMixer); } else { diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 5b3f334366..b8022c2d72 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -79,7 +79,7 @@ public: void ignoreNodeBySessionID(const QUuid& nodeID); void unignoreNodeBySessionID(const QUuid& nodeID); bool isIgnoringNode(const QUuid& nodeID) const; - void personalMuteNodeBySessionID(const QUuid& nodeID, bool enabled); + void personalMuteNodeBySessionID(const QUuid& nodeID, bool muteEnabled); void kickNodeBySessionID(const QUuid& nodeID); void muteNodeBySessionID(const QUuid& nodeID); diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index e25a9603b6..0d6983a1e9 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -34,10 +34,10 @@ void UsersScriptingInterface::unignore(const QUuid& nodeID) { DependencyManager::get()->unignoreNodeBySessionID(nodeID); } -void UsersScriptingInterface::personalMute(const QUuid& nodeID, bool enabled) { +void UsersScriptingInterface::personalMute(const QUuid& nodeID, bool muteEnabled) { // ask the NodeList to mute the user with the given session ID // "Personal Mute" only applies one way and is not global - DependencyManager::get()->personalMuteNodeBySessionID(nodeID, enabled); + DependencyManager::get()->personalMuteNodeBySessionID(nodeID, muteEnabled); } void UsersScriptingInterface::requestPersonalMuteStatus(const QUuid& nodeID) { @@ -45,7 +45,6 @@ void UsersScriptingInterface::requestPersonalMuteStatus(const QUuid& nodeID) { DependencyManager::get()->requestPersonalMuteStatus(nodeID); } - void UsersScriptingInterface::kick(const QUuid& nodeID) { // ask the NodeList to kick the user with the given session ID DependencyManager::get()->kickNodeBySessionID(nodeID); diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index a7e6ec3a3e..31024defc6 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -45,7 +45,7 @@ public slots: * @param {nodeID} nodeID The node or session ID of the user you want to mute. * @param {bool} enable True for enabled; false for disabled. */ - void personalMute(const QUuid& nodeID, bool enabled); + void personalMute(const QUuid& nodeID, bool muteEnabled); /**jsdoc * Requests a bool containing whether you have given the given Avatar UUID. diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 7f38857702..f69a4eb369 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -133,7 +133,10 @@ function populateUserList() { Users.requestUsernameFromID(id); } // Request personal mute status from AudioMixer - Users.requestPersonalMuteStatus(id); + // (as long as we're not requesting it for our own ID) + if (id) { + Users.requestPersonalMuteStatus(id); + } data.push(avatarPalDatum); if (id) { // No overlay for ourself. addAvatarNode(id); @@ -160,6 +163,14 @@ function usernameFromIDReply(id, username, machineFingerprint) { pal.sendToQml({ method: 'updateUsername', params: data }); } +// The function that handles the personal muted status from the AudioMixer +function personalMuteStatusReply(id, isPersonalMuted) { + var data = [id, isPersonalMuted]; + print('Personal Muted Status Data:', JSON.stringify(data)); + // Ship the data off to QML + pal.sendToQml({ method: 'updatePersonalMutedStatus', params: data }); +} + var pingPong = true; function updateOverlays() { var eye = Camera.position; @@ -330,6 +341,7 @@ button.clicked.connect(onClicked); pal.visibleChanged.connect(onVisibleChanged); pal.closed.connect(off); Users.usernameFromIDReply.connect(usernameFromIDReply); +Users.personalMuteStatusReply.connect(personalMuteStatusReply); function onIgnore(sessionId) { // make it go away in the usual way, since we'll still get data keeping it live // Why doesn't this work from .qml? (crashes) @@ -347,6 +359,7 @@ Script.scriptEnding.connect(function () { pal.closed.disconnect(off); Users.usernameFromIDReply.disconnect(usernameFromIDReply); Users.ignoredNode.disconnect(onIgnore); + Users.personalMuteStatusReply.disconnect(personalMuteStatusReply); off(); }); From d3700fc9229c1ad9323a733202dff522d9cb7dd4 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 28 Dec 2016 15:47:28 -0800 Subject: [PATCH 22/45] Fix merge errors --- interface/resources/qml/hifi/Pal.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index eb35664707..819da7eea5 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -212,14 +212,14 @@ Item { datum[styleData.role] = model[styleData.role] = newValue if (styleData.role === "personalMute") { Users[styleData.role](model.sessionId, newValue) - } else if (styleData.role === 'ignore') { + } else if (styleData.role === "ignore") { var key = styleData.role; if (!newValue) { key = 'un' + key; } if (newValue) { ignored[datum.sessionId] = datum; - console.log('fixme hrs adding to ignored', JSON.stringify(datum), 'at', datum.sessionId); + console.log("fixme hrs adding to ignored", JSON.stringify(datum), "at", datum.sessionId); } else { delete ignored[datum.sessionId]; } @@ -232,6 +232,7 @@ Item { sortModel() } } + } } } // Refresh button From af1c67a252260f306655ece46885f8c9d3ae7881 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 28 Dec 2016 17:23:56 -0800 Subject: [PATCH 23/45] Progress! --- assignment-client/src/audio/AudioMixer.cpp | 5 -- assignment-client/src/avatars/AvatarMixer.cpp | 4 -- interface/resources/qml/hifi/Pal.qml | 37 +++------- libraries/networking/src/Node.cpp | 21 +++--- libraries/networking/src/Node.h | 1 - libraries/networking/src/NodeList.cpp | 67 +++++++------------ libraries/networking/src/NodeList.h | 5 +- libraries/networking/src/udt/PacketHeaders.h | 1 - .../src/UsersScriptingInterface.cpp | 10 +-- .../src/UsersScriptingInterface.h | 19 +++++- scripts/system/pal.js | 12 ++++ 11 files changed, 81 insertions(+), 101 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 3589c025f4..c9b00eb874 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -65,7 +65,6 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::NegotiateAudioFormat, this, "handleNegotiateAudioFormat"); packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); - packetReceiver.registerListener(PacketType::NodeUnignoreRequest, this, "handleNodeUnignoreRequestPacket"); packetReceiver.registerListener(PacketType::NodePersonalMuteRequest, this, "handleNodePersonalMuteRequestPacket"); packetReceiver.registerListener(PacketType::NodePersonalMuteStatusRequest, this, "handleNodePersonalMuteStatusRequestPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); @@ -228,10 +227,6 @@ void AudioMixer::handleNodeIgnoreRequestPacket(QSharedPointer p sendingNode->parseIgnoreRequestMessage(packet); } -void AudioMixer::handleNodeUnignoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - sendingNode->parseUnignoreRequestMessage(packet); -} - void AudioMixer::handleNodePersonalMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { // parse out the UUID being muted from the packet QUuid ignoredUUID = QUuid::fromRfc4122(packet->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 1de1f093b7..43ad2cbaff 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -49,7 +49,6 @@ AvatarMixer::AvatarMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::AvatarIdentity, this, "handleAvatarIdentityPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); - packetReceiver.registerListener(PacketType::NodeUnignoreRequest, this, "handleNodeUnignoreRequestPacket"); packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket"); packetReceiver.registerListener(PacketType::RequestsDomainListData, this, "handleRequestsDomainListDataPacket"); @@ -595,9 +594,6 @@ void AvatarMixer::handleNodeIgnoreRequestPacket(QSharedPointer senderNode->parseIgnoreRequestMessage(message); } -void AvatarMixer::handleNodeUnignoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - sendingNode->parseUnignoreRequestMessage(packet); -} void AvatarMixer::handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { sendingNode->parseIgnoreRadiusRequestMessage(packet); } diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 819da7eea5..07f9386b2a 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -210,21 +210,8 @@ Item { var newValue = !model[styleData.role] var datum = userData[model.userIndex] datum[styleData.role] = model[styleData.role] = newValue - if (styleData.role === "personalMute") { - Users[styleData.role](model.sessionId, newValue) - } else if (styleData.role === "ignore") { - var key = styleData.role; - if (!newValue) { - key = 'un' + key; - } - if (newValue) { - ignored[datum.sessionId] = datum; - console.log("fixme hrs adding to ignored", JSON.stringify(datum), "at", datum.sessionId); - } else { - delete ignored[datum.sessionId]; - } - console.log('fixme hrs pal action', key, model.sessionId); - Users[key](model.sessionId); + if (styleData.role === "personalMute" || styleData.role === "ignore") { + Users[styleData.role](model.sessionId, newValue) } else { Users[styleData.role](model.sessionId) // Just for now, while we cannot undo things: @@ -354,7 +341,6 @@ Item { property var userData: [] property var myData: ({displayName: "", userName: "", audioLevel: 0.0}) // valid dummy until set property bool iAmAdmin: false - property var ignored: ({}); // FIXME: reset when changing domains function findSessionIndex(sessionId, optionalData) { // no findIndex in .qml var i, data = optionalData || userData, length = data.length; for (var i = 0; i < length; i++) { @@ -373,16 +359,6 @@ Item { myData = data[myIndex]; data.splice(myIndex, 1); userData = data; - var ignoredID, index; - for (ignoredID in ignored) { - index = findSessionIndex(ignoredID); - console.log('fixme hrs adding back ignored', ignoredID, index, JSON.stringify(ignored[ignoredID])); - if (-1 === index) { // Add back any missing ignored, because they sometimes take a moment to show up. - userData.push(ignored[ignoredID]); - } else { // Mark existing ignored. - userData[index].ignored = true; - } - } sortModel(); break; case 'select': @@ -429,13 +405,20 @@ Item { } } break; - case 'updateMuted': + case 'updatePersonalMutedStatus': var userId = message.params[0]; var enabled = message.params[1]; var userIndex = findSessionIndex(userId); userModel.get(userIndex).personalMute.property = enabled; userData[userIndex].personalMute.property = enabled; // Defensive programming break; + case 'updateIgnoredStatus': + var userId = message.params[0]; + var enabled = message.params[1]; + var userIndex = findSessionIndex(userId); + userModel.get(userIndex).ignore.property = enabled; + userData[userIndex].ignore.property = enabled; // Defensive programming + break; default: console.log('Unrecognized message:', JSON.stringify(message)); } diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp index 0f3a6ee30d..b2670fd9b0 100644 --- a/libraries/networking/src/Node.cpp +++ b/libraries/networking/src/Node.cpp @@ -81,18 +81,17 @@ void Node::updateClockSkewUsec(qint64 clockSkewSample) { _clockSkewUsec = (quint64)_clockSkewMovingPercentile.getValueAtPercentile(); } -void Node::parseIgnoreRequestMessage(QSharedPointer message) { - while (message->getBytesLeftToRead()) { - // parse out the UUID being ignored from the packet - QUuid ignoredUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - - addIgnoredNode(ignoredUUID); - } -} - -void Node::parseUnignoreRequestMessage(QSharedPointer message) { +void Node::parseIgnoreRequestMessage(QSharedPointer message) { + // parse out the UUID being ignored from the packet QUuid ignoredUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - removeIgnoredNode(ignoredUUID); + bool addToIgnore; + message->readPrimitive(&addToIgnore); + + if (addToIgnore) { + addIgnoredNode(ignoredUUID); + } else { + removeIgnoredNode(ignoredUUID); + } } void Node::addIgnoredNode(const QUuid& otherNodeID) { diff --git a/libraries/networking/src/Node.h b/libraries/networking/src/Node.h index 0a344c9479..28afb8b943 100644 --- a/libraries/networking/src/Node.h +++ b/libraries/networking/src/Node.h @@ -73,7 +73,6 @@ public: bool getCanKick() const { return _permissions.can(NodePermissions::Permission::canKick); } void parseIgnoreRequestMessage(QSharedPointer message); - void parseUnignoreRequestMessage(QSharedPointer message); void addIgnoredNode(const QUuid& otherNodeID); void removeIgnoredNode(const QUuid& otherNodeID); bool isIgnoringNodeWithID(const QUuid& nodeID) const { QReadLocker lock { &_ignoredNodeIDSetLock }; return _ignoredNodeIDSet.find(nodeID) != _ignoredNodeIDSet.cend(); } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index ab63c81b9a..89b5590025 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -778,7 +778,7 @@ void NodeList::sendIgnoreRadiusStateToNode(const SharedNodePointer& destinationN sendPacket(std::move(ignorePacket), *destinationNode); } -void NodeList::ignoreNodeBySessionID(const QUuid& nodeID) { +void NodeList::ignoreNodeBySessionID(const QUuid& nodeID, bool ignoreEnabled) { // enumerate the nodes to send a reliable ignore packet to each that can leverage it if (!nodeID.isNull() && _sessionUUID != nodeID) { eachMatchingNode([&nodeID](const SharedNodePointer& node)->bool { @@ -787,63 +787,36 @@ void NodeList::ignoreNodeBySessionID(const QUuid& nodeID) { } else { return false; } - }, [&nodeID, this](const SharedNodePointer& destinationNode) { + }, [&nodeID, ignoreEnabled, this](const SharedNodePointer& destinationNode) { // create a reliable NLPacket with space for the ignore UUID - auto ignorePacket = NLPacket::create(PacketType::NodeIgnoreRequest, NUM_BYTES_RFC4122_UUID, true); + auto ignorePacket = NLPacket::create(PacketType::NodeIgnoreRequest, NUM_BYTES_RFC4122_UUID + sizeof(bool), true); // write the node ID to the packet ignorePacket->write(nodeID.toRfc4122()); + ignorePacket->writePrimitive(ignoreEnabled); - qCDebug(networking) << "Sending packet to ignore node" << uuidStringWithoutCurlyBraces(nodeID); + qCDebug(networking) << "Sending packet to" << (ignoreEnabled ? "ignore" : "unignore") << "node" << uuidStringWithoutCurlyBraces(nodeID); // send off this ignore packet reliably to the matching node sendPacket(std::move(ignorePacket), *destinationNode); }); - QReadLocker setLocker { &_ignoredSetLock }; + QReadLocker setLocker { &_ignoredSetLock }; // write lock for insert and unsafe_erase - // add this nodeID to our set of ignored IDs - _ignoredNodeIDs.insert(nodeID); - - emit ignoredNode(nodeID); + if (ignoreEnabled) { + // add this nodeID to our set of ignored IDs + _ignoredNodeIDs.insert(nodeID); + emit ignoredNode(nodeID); + } else { + _ignoredNodeIDs.unsafe_erase(nodeID); + emit unignoredNode(nodeID); + } } else { qWarning() << "NodeList::ignoreNodeBySessionID called with an invalid ID or an ID which matches the current session ID."; } } -void NodeList::unignoreNodeBySessionID(const QUuid& nodeID) { - // enumerate the nodes to send a reliable unignore packet to each that can leverage it - if (!nodeID.isNull() && _sessionUUID != nodeID) { - eachMatchingNode([&nodeID](const SharedNodePointer& node)->bool { - if (node->getType() == NodeType::AudioMixer || node->getType() == NodeType::AvatarMixer) { - return true; - } else { - return false; - } - }, [&nodeID, this](const SharedNodePointer& destinationNode) { - // create a reliable NLPacket with space for the unignore UUID - auto ignorePacket = NLPacket::create(PacketType::NodeUnignoreRequest, NUM_BYTES_RFC4122_UUID, true); - - // write the node ID to the packet - ignorePacket->write(nodeID.toRfc4122()); - - qCDebug(networking) << "Sending packet to unignore node" << uuidStringWithoutCurlyBraces(nodeID); - - // send off this unignore packet reliably to the matching node - sendPacket(std::move(ignorePacket), *destinationNode); - }); - - QWriteLocker setLocker { &_ignoredSetLock }; // write lock for unsafe_erase - _ignoredNodeIDs.unsafe_erase(nodeID); - - emit unignoredNode(nodeID); - - } else { - qWarning() << "NodeList::unignoreNodeBySessionID called with an invalid ID or an ID which matches the current session ID."; - } -} - bool NodeList::isIgnoringNode(const QUuid& nodeID) const { QReadLocker setLocker { &_ignoredSetLock }; return _ignoredNodeIDs.find(nodeID) != _ignoredNodeIDs.cend(); @@ -876,6 +849,18 @@ void NodeList::maybeSendIgnoreSetToNode(SharedNodePointer newNode) { } } +void NodeList::processPersonalMuteStatusReply(QSharedPointer message) { + // read the UUID from the packet + QString nodeUUIDString = (QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID))).toString(); + // read the personal mute status + bool isPersonalMuted; + message->readPrimitive(&isPersonalMuted); + + qCDebug(networking) << "Got personal muted status" << isPersonalMuted << "for node" << nodeUUIDString; + + emit personalMuteStatusReply(nodeUUIDString, isPersonalMuted); +} + void NodeList::personalMuteNodeBySessionID(const QUuid& nodeID, bool muteEnabled) { // cannot personal mute yourself, or nobody if (!nodeID.isNull() && _sessionUUID != nodeID) { diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index b8022c2d72..1e0a7fa8d1 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -76,17 +76,16 @@ public: void toggleIgnoreRadius() { ignoreNodesInRadius(!getIgnoreRadiusEnabled()); } void enableIgnoreRadius() { ignoreNodesInRadius(true); } void disableIgnoreRadius() { ignoreNodesInRadius(false); } - void ignoreNodeBySessionID(const QUuid& nodeID); - void unignoreNodeBySessionID(const QUuid& nodeID); + void ignoreNodeBySessionID(const QUuid& nodeID, bool ignoreEnabled); bool isIgnoringNode(const QUuid& nodeID) const; void personalMuteNodeBySessionID(const QUuid& nodeID, bool muteEnabled); + void requestPersonalMuteStatus(const QUuid& nodeID); void kickNodeBySessionID(const QUuid& nodeID); void muteNodeBySessionID(const QUuid& nodeID); void requestUsernameFromSessionID(const QUuid& nodeID); bool getRequestsDomainListData() { return _requestsDomainListData; } void setRequestsDomainListData(bool isRequesting); - void requestPersonalMuteStatus(const QUuid& nodeID); public slots: void reset(); diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 76c5120823..78ae1e7ff0 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -105,7 +105,6 @@ public: UsernameFromIDReply, ViewFrustum, RequestsDomainListData, - NodeUnignoreRequest, NodePersonalMuteRequest, NodePersonalMuteStatusRequest, NodePersonalMuteStatusReply, diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index 0d6983a1e9..b558c2572d 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -24,14 +24,14 @@ UsersScriptingInterface::UsersScriptingInterface() { connect(nodeList.data(), &NodeList::personalMuteStatusReply, this, &UsersScriptingInterface::personalMuteStatusReply); } -void UsersScriptingInterface::ignore(const QUuid& nodeID) { +void UsersScriptingInterface::ignore(const QUuid& nodeID, bool ignoreEnabled) { // ask the NodeList to ignore this user (based on the session ID of their node) - DependencyManager::get()->ignoreNodeBySessionID(nodeID); + DependencyManager::get()->ignoreNodeBySessionID(nodeID, ignoreEnabled); } -void UsersScriptingInterface::unignore(const QUuid& nodeID) { - // ask the NodeList to ignore this user (based on the session ID of their node) - DependencyManager::get()->unignoreNodeBySessionID(nodeID); +void UsersScriptingInterface::requestIgnoreStatus(const QUuid& nodeID) { + // ask the Audio Mixer via the NodeList for the Personal Mute status associated with the given session ID + DependencyManager::get()->isIgnoringNode(nodeID); } void UsersScriptingInterface::personalMute(const QUuid& nodeID, bool muteEnabled) { diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index 31024defc6..05082602b8 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -35,9 +35,16 @@ public slots: * Ignore another user. * @function Users.ignore * @param {nodeID} nodeID The node or session ID of the user you want to ignore. + * @param {bool} enable True for ignored; false for un-ignored. */ - void ignore(const QUuid& nodeID); - void unignore(const QUuid& nodeID); + void ignore(const QUuid& nodeID, bool ignoreEnabled); + + /**jsdoc + * Requests a bool containing whether you have ignored the given Avatar UUID. + * @function Users.requestIgnoreStatus + * @param {nodeID} nodeID The node or session ID of the user whose ignore status you want. + */ + void requestIgnoreStatus(const QUuid& nodeID); /**jsdoc * Mute another user for you and you only. @@ -48,7 +55,7 @@ public slots: void personalMute(const QUuid& nodeID, bool muteEnabled); /**jsdoc - * Requests a bool containing whether you have given the given Avatar UUID. + * Requests a bool containing whether you have personally muted the given Avatar UUID. * @function Users.requestPersonalMuteStatus * @param {nodeID} nodeID The node or session ID of the user whose personal mute status you want. */ @@ -131,6 +138,12 @@ signals: */ void personalMuteStatusReply(const QString& nodeID, bool isPersonalMuted); + /**jsdoc + * Notifies scripts of the Ignore status associated with a UUID. + * @function Users.ignoreStatusReply + */ + void ignoreStatusReply(const QString& nodeID, bool isIgnored); + private: bool getRequestsDomainListData(); void setRequestsDomainListData(bool requests); diff --git a/scripts/system/pal.js b/scripts/system/pal.js index f69a4eb369..2e35ff3d6e 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -133,9 +133,11 @@ function populateUserList() { Users.requestUsernameFromID(id); } // Request personal mute status from AudioMixer + // and ignore status from AudioMixer/AvatarMixer // (as long as we're not requesting it for our own ID) if (id) { Users.requestPersonalMuteStatus(id); + Users.requestIgnoreStatus(id); } data.push(avatarPalDatum); if (id) { // No overlay for ourself. @@ -171,6 +173,14 @@ function personalMuteStatusReply(id, isPersonalMuted) { pal.sendToQml({ method: 'updatePersonalMutedStatus', params: data }); } +// The function that handles the ignored status from the AudioMixer/AvatarMixer +function ignoreStatusReply(id, isIgnored) { + var data = [id, isIgnored]; + print('Ignored Status Data:', JSON.stringify(data)); + // Ship the data off to QML + pal.sendToQml({ method: 'updateIgnoredStatus', params: data }); +} + var pingPong = true; function updateOverlays() { var eye = Camera.position; @@ -342,6 +352,7 @@ pal.visibleChanged.connect(onVisibleChanged); pal.closed.connect(off); Users.usernameFromIDReply.connect(usernameFromIDReply); Users.personalMuteStatusReply.connect(personalMuteStatusReply); +Users.ignoreStatusReply.connect(ignoreStatusReply); function onIgnore(sessionId) { // make it go away in the usual way, since we'll still get data keeping it live // Why doesn't this work from .qml? (crashes) @@ -360,6 +371,7 @@ Script.scriptEnding.connect(function () { Users.usernameFromIDReply.disconnect(usernameFromIDReply); Users.ignoredNode.disconnect(onIgnore); Users.personalMuteStatusReply.disconnect(personalMuteStatusReply); + Users.ignoreStatusReply.disconnect(ignoreStatusReply); off(); }); From bb2b48d4246e77b0c7337a86d8af1205152a560e Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 29 Dec 2016 11:35:20 -0800 Subject: [PATCH 24/45] Getting very close. --- assignment-client/src/audio/AudioMixer.h | 1 - assignment-client/src/avatars/AvatarMixer.h | 1 - interface/resources/qml/hifi/Pal.qml | 10 +--------- libraries/networking/src/NodeList.cpp | 15 ++------------- .../script-engine/src/UsersScriptingInterface.cpp | 6 +++--- .../script-engine/src/UsersScriptingInterface.h | 12 +++--------- scripts/system/pal.js | 12 +----------- 7 files changed, 10 insertions(+), 47 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 353db84a15..5c98475790 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -62,7 +62,6 @@ private slots: void handleNegotiateAudioFormat(QSharedPointer message, SharedNodePointer sendingNode); void handleNodeKilled(SharedNodePointer killedNode); void handleNodeIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handleNodeUnignoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleNodePersonalMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleNodePersonalMuteStatusRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); diff --git a/assignment-client/src/avatars/AvatarMixer.h b/assignment-client/src/avatars/AvatarMixer.h index 865dd36106..5d54622ac9 100644 --- a/assignment-client/src/avatars/AvatarMixer.h +++ b/assignment-client/src/avatars/AvatarMixer.h @@ -41,7 +41,6 @@ private slots: void handleAvatarIdentityPacket(QSharedPointer message, SharedNodePointer senderNode); void handleKillAvatarPacket(QSharedPointer message); void handleNodeIgnoreRequestPacket(QSharedPointer message, SharedNodePointer senderNode); - void handleNodeUnignoreRequestPacket(QSharedPointer message, SharedNodePointer senderNode); void handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleRequestsDomainListDataPacket(QSharedPointer message, SharedNodePointer senderNode); void domainSettingsRequestComplete(); diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 07f9386b2a..fc55916832 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -398,7 +398,6 @@ Item { myData.audioLevel = audioLevel; myCard.audioLevel = audioLevel; // Defensive programming } else { - console.log("userid:" + userId); var userIndex = findSessionIndex(userId); userModel.get(userIndex).audioLevel = audioLevel; userData[userIndex].audioLevel = audioLevel; // Defensive programming @@ -410,14 +409,7 @@ Item { var enabled = message.params[1]; var userIndex = findSessionIndex(userId); userModel.get(userIndex).personalMute.property = enabled; - userData[userIndex].personalMute.property = enabled; // Defensive programming - break; - case 'updateIgnoredStatus': - var userId = message.params[0]; - var enabled = message.params[1]; - var userIndex = findSessionIndex(userId); - userModel.get(userIndex).ignore.property = enabled; - userData[userIndex].ignore.property = enabled; // Defensive programming + userData[userIndex].personalMute.property = enabled; // Defensive programming break; default: console.log('Unrecognized message:', JSON.stringify(message)); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 89b5590025..0657b2c5ac 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -795,7 +795,8 @@ void NodeList::ignoreNodeBySessionID(const QUuid& nodeID, bool ignoreEnabled) { ignorePacket->write(nodeID.toRfc4122()); ignorePacket->writePrimitive(ignoreEnabled); - qCDebug(networking) << "Sending packet to" << (ignoreEnabled ? "ignore" : "unignore") << "node" << uuidStringWithoutCurlyBraces(nodeID); + qCDebug(networking) << "Sending packet to" << (destinationNode->getType() == NodeType::AudioMixer ? "AudioMixer" : "AvatarMixer") << "to" + << (ignoreEnabled ? "ignore" : "unignore") << "node" << uuidStringWithoutCurlyBraces(nodeID); // send off this ignore packet reliably to the matching node sendPacket(std::move(ignorePacket), *destinationNode); @@ -849,18 +850,6 @@ void NodeList::maybeSendIgnoreSetToNode(SharedNodePointer newNode) { } } -void NodeList::processPersonalMuteStatusReply(QSharedPointer message) { - // read the UUID from the packet - QString nodeUUIDString = (QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID))).toString(); - // read the personal mute status - bool isPersonalMuted; - message->readPrimitive(&isPersonalMuted); - - qCDebug(networking) << "Got personal muted status" << isPersonalMuted << "for node" << nodeUUIDString; - - emit personalMuteStatusReply(nodeUUIDString, isPersonalMuted); -} - void NodeList::personalMuteNodeBySessionID(const QUuid& nodeID, bool muteEnabled) { // cannot personal mute yourself, or nobody if (!nodeID.isNull() && _sessionUUID != nodeID) { diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index b558c2572d..f18eef27cb 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -29,9 +29,9 @@ void UsersScriptingInterface::ignore(const QUuid& nodeID, bool ignoreEnabled) { DependencyManager::get()->ignoreNodeBySessionID(nodeID, ignoreEnabled); } -void UsersScriptingInterface::requestIgnoreStatus(const QUuid& nodeID) { - // ask the Audio Mixer via the NodeList for the Personal Mute status associated with the given session ID - DependencyManager::get()->isIgnoringNode(nodeID); +bool UsersScriptingInterface::getIgnoreStatus(const QUuid& nodeID) { + // ask the NodeList for the Ignore status associated with the given session ID + return DependencyManager::get()->isIgnoringNode(nodeID); } void UsersScriptingInterface::personalMute(const QUuid& nodeID, bool muteEnabled) { diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index 05082602b8..f7b25a72c2 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -40,11 +40,11 @@ public slots: void ignore(const QUuid& nodeID, bool ignoreEnabled); /**jsdoc - * Requests a bool containing whether you have ignored the given Avatar UUID. - * @function Users.requestIgnoreStatus + * Gets a bool containing whether you have ignored the given Avatar UUID. + * @function Users.getIgnoreStatus * @param {nodeID} nodeID The node or session ID of the user whose ignore status you want. */ - void requestIgnoreStatus(const QUuid& nodeID); + bool getIgnoreStatus(const QUuid& nodeID); /**jsdoc * Mute another user for you and you only. @@ -138,12 +138,6 @@ signals: */ void personalMuteStatusReply(const QString& nodeID, bool isPersonalMuted); - /**jsdoc - * Notifies scripts of the Ignore status associated with a UUID. - * @function Users.ignoreStatusReply - */ - void ignoreStatusReply(const QString& nodeID, bool isIgnored); - private: bool getRequestsDomainListData(); void setRequestsDomainListData(bool requests); diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 2e35ff3d6e..a21eb8c6ef 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -137,7 +137,7 @@ function populateUserList() { // (as long as we're not requesting it for our own ID) if (id) { Users.requestPersonalMuteStatus(id); - Users.requestIgnoreStatus(id); + avatarPalDatum['ignore'] = Users.getIgnoreStatus(id); } data.push(avatarPalDatum); if (id) { // No overlay for ourself. @@ -173,14 +173,6 @@ function personalMuteStatusReply(id, isPersonalMuted) { pal.sendToQml({ method: 'updatePersonalMutedStatus', params: data }); } -// The function that handles the ignored status from the AudioMixer/AvatarMixer -function ignoreStatusReply(id, isIgnored) { - var data = [id, isIgnored]; - print('Ignored Status Data:', JSON.stringify(data)); - // Ship the data off to QML - pal.sendToQml({ method: 'updateIgnoredStatus', params: data }); -} - var pingPong = true; function updateOverlays() { var eye = Camera.position; @@ -352,7 +344,6 @@ pal.visibleChanged.connect(onVisibleChanged); pal.closed.connect(off); Users.usernameFromIDReply.connect(usernameFromIDReply); Users.personalMuteStatusReply.connect(personalMuteStatusReply); -Users.ignoreStatusReply.connect(ignoreStatusReply); function onIgnore(sessionId) { // make it go away in the usual way, since we'll still get data keeping it live // Why doesn't this work from .qml? (crashes) @@ -371,7 +362,6 @@ Script.scriptEnding.connect(function () { Users.usernameFromIDReply.disconnect(usernameFromIDReply); Users.ignoredNode.disconnect(onIgnore); Users.personalMuteStatusReply.disconnect(personalMuteStatusReply); - Users.ignoreStatusReply.disconnect(ignoreStatusReply); off(); }); From 24eac771159b57276001409a12d7f2d6412ca85f Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 29 Dec 2016 11:57:51 -0800 Subject: [PATCH 25/45] I'm about to refactor this. --- assignment-client/src/audio/AudioMixer.cpp | 2 +- interface/resources/qml/hifi/Pal.qml | 6 +++--- libraries/networking/src/Node.cpp | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index c9b00eb874..d1f7abf379 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -245,7 +245,7 @@ void AudioMixer::handleNodePersonalMuteRequestPacket(QSharedPointerremoveIgnoredNode(ignoredUUID); + sendingNode->removeIgnoredNode(ignoredUUID); } } else { qWarning() << "Node::handlePersonalMutedNode called with null ID or ID of personal muting node."; diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index fc55916832..2c75e8f049 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -386,7 +386,7 @@ Item { // Get the index in userModel and userData associated with the passed UUID var userIndex = findSessionIndex(userId); // Set the userName appropriately - userModel.get(userIndex).userName = userName; + userModel.setProperty(userIndex, "userName", userName); userData[userIndex].userName = userName; // Defensive programming } break; @@ -399,7 +399,7 @@ Item { myCard.audioLevel = audioLevel; // Defensive programming } else { var userIndex = findSessionIndex(userId); - userModel.get(userIndex).audioLevel = audioLevel; + userModel.setProperty(userIndex, "audioLevel", audioLevel); userData[userIndex].audioLevel = audioLevel; // Defensive programming } } @@ -408,7 +408,7 @@ Item { var userId = message.params[0]; var enabled = message.params[1]; var userIndex = findSessionIndex(userId); - userModel.get(userIndex).personalMute.property = enabled; + userModel.setProperty(userIndex, "personalMute", enabled); userData[userIndex].personalMute.property = enabled; // Defensive programming break; default: diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp index b2670fd9b0..484ea882b5 100644 --- a/libraries/networking/src/Node.cpp +++ b/libraries/networking/src/Node.cpp @@ -82,15 +82,17 @@ void Node::updateClockSkewUsec(qint64 clockSkewSample) { } void Node::parseIgnoreRequestMessage(QSharedPointer message) { - // parse out the UUID being ignored from the packet - QUuid ignoredUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - bool addToIgnore; - message->readPrimitive(&addToIgnore); + while (message->getBytesLeftToRead()) { + // parse out the UUID being ignored from the packet + QUuid ignoredUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); + bool addToIgnore; + message->readPrimitive(&addToIgnore); - if (addToIgnore) { - addIgnoredNode(ignoredUUID); - } else { - removeIgnoredNode(ignoredUUID); + if (addToIgnore) { + addIgnoredNode(ignoredUUID); + } else { + removeIgnoredNode(ignoredUUID); + } } } From 10b5b957f276ac468cc42c59576647383fa49186 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 29 Dec 2016 13:09:40 -0800 Subject: [PATCH 26/45] Ahh...It's beautiful and simple now. --- assignment-client/src/audio/AudioMixer.cpp | 51 ------- assignment-client/src/audio/AudioMixer.h | 2 - interface/resources/qml/hifi/Pal.qml | 14 +- libraries/networking/src/NodeList.cpp | 137 ++++++++++-------- libraries/networking/src/NodeList.h | 6 +- libraries/networking/src/udt/PacketHeaders.h | 5 +- .../src/UsersScriptingInterface.cpp | 7 +- .../src/UsersScriptingInterface.h | 8 +- scripts/system/pal.js | 12 +- 9 files changed, 88 insertions(+), 154 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index d1f7abf379..01715497b1 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -65,8 +65,6 @@ AudioMixer::AudioMixer(ReceivedMessage& message) : packetReceiver.registerListener(PacketType::NegotiateAudioFormat, this, "handleNegotiateAudioFormat"); packetReceiver.registerListener(PacketType::MuteEnvironment, this, "handleMuteEnvironmentPacket"); packetReceiver.registerListener(PacketType::NodeIgnoreRequest, this, "handleNodeIgnoreRequestPacket"); - packetReceiver.registerListener(PacketType::NodePersonalMuteRequest, this, "handleNodePersonalMuteRequestPacket"); - packetReceiver.registerListener(PacketType::NodePersonalMuteStatusRequest, this, "handleNodePersonalMuteStatusRequestPacket"); packetReceiver.registerListener(PacketType::KillAvatar, this, "handleKillAvatarPacket"); packetReceiver.registerListener(PacketType::NodeMuteRequest, this, "handleNodeMuteRequestPacket"); packetReceiver.registerListener(PacketType::RadiusIgnoreRequest, this, "handleRadiusIgnoreRequestPacket"); @@ -227,55 +225,6 @@ void AudioMixer::handleNodeIgnoreRequestPacket(QSharedPointer p sendingNode->parseIgnoreRequestMessage(packet); } -void AudioMixer::handleNodePersonalMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - // parse out the UUID being muted from the packet - QUuid ignoredUUID = QUuid::fromRfc4122(packet->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - bool enabled; - packet->readPrimitive(&enabled); - - if (!ignoredUUID.isNull() && ignoredUUID != _uuid) { - if (enabled) { - qDebug() << "Adding" << uuidStringWithoutCurlyBraces(ignoredUUID) << "to personally muted set for" - << uuidStringWithoutCurlyBraces(_uuid); - - // Add the session UUID to the set of personally muted ones for this listening node - sendingNode->addIgnoredNode(ignoredUUID); - } else { - qDebug() << "Removing" << uuidStringWithoutCurlyBraces(ignoredUUID) << "from personally muted set for" - << uuidStringWithoutCurlyBraces(_uuid); - - // Remove the session UUID to the set of personally muted ones for this listening node - sendingNode->removeIgnoredNode(ignoredUUID); - } - } else { - qWarning() << "Node::handlePersonalMutedNode called with null ID or ID of personal muting node."; - } -} - -void AudioMixer::handleNodePersonalMuteStatusRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { - // parse out the UUID whose personal mute status is being requested from the packet - QUuid UUIDToCheck = QUuid::fromRfc4122(packet->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - - if (!UUIDToCheck.isNull()) { - // First, make sure we actually have a node with this UUID - auto limitedNodeList = DependencyManager::get(); - auto matchingNode = limitedNodeList->nodeWithUUID(UUIDToCheck); - - // If we do have a matching node... - if (matchingNode) { - auto personalMuteStatusPacket = NLPacket::create(PacketType::NodePersonalMuteStatusReply, NUM_BYTES_RFC4122_UUID + sizeof(bool), true); - bool isMuted = sendingNode->isIgnoringNodeWithID(UUIDToCheck); - - // write the node ID to the packet - personalMuteStatusPacket->write(UUIDToCheck.toRfc4122()); - personalMuteStatusPacket->writePrimitive(isMuted); - - qDebug() << "Personal Mute Status: node" << uuidStringWithoutCurlyBraces(UUIDToCheck) << "mute status:" << isMuted; - - limitedNodeList->sendPacket(std::move(personalMuteStatusPacket), *sendingNode); - } - } -} void AudioMixer::handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode) { sendingNode->parseIgnoreRadiusRequestMessage(packet); } diff --git a/assignment-client/src/audio/AudioMixer.h b/assignment-client/src/audio/AudioMixer.h index 5c98475790..59cdec7732 100644 --- a/assignment-client/src/audio/AudioMixer.h +++ b/assignment-client/src/audio/AudioMixer.h @@ -62,8 +62,6 @@ private slots: void handleNegotiateAudioFormat(QSharedPointer message, SharedNodePointer sendingNode); void handleNodeKilled(SharedNodePointer killedNode); void handleNodeIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handleNodePersonalMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); - void handleNodePersonalMuteStatusRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleRadiusIgnoreRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleKillAvatarPacket(QSharedPointer packet, SharedNodePointer sendingNode); void handleNodeMuteRequestPacket(QSharedPointer packet, SharedNodePointer sendingNode); diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 2c75e8f049..e6a762ecd8 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -202,7 +202,7 @@ Item { // This CheckBox belongs in the columns that contain the action buttons ("Mute", "Ban", etc) HifiControls.CheckBox { - visible: isCheckBox + visible: styleData.role === "personalMute" ? (model["ignore"] === true ? false : true) : isCheckBox anchors.centerIn: parent checked: model[styleData.role] boxSize: 24 @@ -211,7 +211,10 @@ Item { var datum = userData[model.userIndex] datum[styleData.role] = model[styleData.role] = newValue if (styleData.role === "personalMute" || styleData.role === "ignore") { - Users[styleData.role](model.sessionId, newValue) + Users[styleData.role](model.sessionId, newValue) + if (styleData.role === "ignore") { + datum["personalMute"] = model["personalMute"] = newValue + } } else { Users[styleData.role](model.sessionId) // Just for now, while we cannot undo things: @@ -404,13 +407,6 @@ Item { } } break; - case 'updatePersonalMutedStatus': - var userId = message.params[0]; - var enabled = message.params[1]; - var userIndex = findSessionIndex(userId); - userModel.setProperty(userIndex, "personalMute", enabled); - userData[userIndex].personalMute.property = enabled; // Defensive programming - break; default: console.log('Unrecognized message:', JSON.stringify(message)); } diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 0657b2c5ac..8b4cb41cc9 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -129,7 +129,6 @@ NodeList::NodeList(char newOwnerType, int socketListenPort, int dtlsListenPort) packetReceiver.registerListener(PacketType::DomainServerPathResponse, this, "processDomainServerPathResponse"); packetReceiver.registerListener(PacketType::DomainServerRemovedNode, this, "processDomainServerRemovedNode"); packetReceiver.registerListener(PacketType::UsernameFromIDReply, this, "processUsernameFromIDReply"); - packetReceiver.registerListener(PacketType::NodePersonalMuteStatusReply, this, "processPersonalMuteStatusReply"); } qint64 NodeList::sendStats(QJsonObject statsObject, HifiSockAddr destination) { @@ -802,14 +801,18 @@ void NodeList::ignoreNodeBySessionID(const QUuid& nodeID, bool ignoreEnabled) { sendPacket(std::move(ignorePacket), *destinationNode); }); - QReadLocker setLocker { &_ignoredSetLock }; // write lock for insert and unsafe_erase + QReadLocker ignoredSetLocker { &_ignoredSetLock }; // write lock for insert and unsafe_erase + QReadLocker personalMutedSetLocker{ &_personalMutedSetLock }; // write lock for insert and unsafe_erase if (ignoreEnabled) { // add this nodeID to our set of ignored IDs _ignoredNodeIDs.insert(nodeID); + // add this nodeID to our set of personal muted IDs + _personalMutedNodeIDs.insert(nodeID); emit ignoredNode(nodeID); } else { _ignoredNodeIDs.unsafe_erase(nodeID); + _personalMutedNodeIDs.unsafe_erase(nodeID); emit unignoredNode(nodeID); } @@ -819,16 +822,82 @@ void NodeList::ignoreNodeBySessionID(const QUuid& nodeID, bool ignoreEnabled) { } bool NodeList::isIgnoringNode(const QUuid& nodeID) const { - QReadLocker setLocker { &_ignoredSetLock }; + QReadLocker ignoredSetLocker{ &_ignoredSetLock }; return _ignoredNodeIDs.find(nodeID) != _ignoredNodeIDs.cend(); } +void NodeList::personalMuteNodeBySessionID(const QUuid& nodeID, bool muteEnabled) { + // cannot personal mute yourself, or nobody + if (!nodeID.isNull() && _sessionUUID != nodeID) { + auto audioMixer = soloNodeOfType(NodeType::AudioMixer); + if (audioMixer) { + if (isIgnoringNode(nodeID)) { + qCDebug(networking) << "You can't personally mute or unmute a node you're already ignoring."; + } + else { + // setup the packet + auto personalMutePacket = NLPacket::create(PacketType::NodeIgnoreRequest, NUM_BYTES_RFC4122_UUID + sizeof(bool), true); + + // write the node ID to the packet + personalMutePacket->write(nodeID.toRfc4122()); + personalMutePacket->writePrimitive(muteEnabled); + + qCDebug(networking) << "Sending Personal Mute Packet to" << (muteEnabled ? "mute" : "unmute") << "node" << uuidStringWithoutCurlyBraces(nodeID); + + sendPacket(std::move(personalMutePacket), *audioMixer); + + QReadLocker personalMutedSetLocker{ &_personalMutedSetLock }; // write lock for insert and unsafe_erase + + if (muteEnabled) { + // add this nodeID to our set of personal muted IDs + _personalMutedNodeIDs.insert(nodeID); + } else { + _personalMutedNodeIDs.unsafe_erase(nodeID); + } + } + } else { + qWarning() << "Couldn't find audio mixer to send node personal mute request"; + } + } else { + qWarning() << "NodeList::personalMuteNodeBySessionID called with an invalid ID or an ID which matches the current session ID."; + } +} + +bool NodeList::isPersonalMutingNode(const QUuid& nodeID) const { + QReadLocker personalMutedSetLocker{ &_personalMutedSetLock }; + return _personalMutedNodeIDs.find(nodeID) != _personalMutedNodeIDs.cend(); +} + void NodeList::maybeSendIgnoreSetToNode(SharedNodePointer newNode) { - if (newNode->getType() == NodeType::AudioMixer || newNode->getType() == NodeType::AvatarMixer) { + if (newNode->getType() == NodeType::AudioMixer) { // this is a mixer that we just added - it's unlikely it knows who we were previously ignoring in this session, // so send that list along now (assuming it isn't empty) - QReadLocker setLocker { &_ignoredSetLock }; + QReadLocker personalMutedSetLocker{ &_personalMutedSetLock }; + + if (_personalMutedNodeIDs.size() > 0) { + // setup a packet list so we can send the stream of ignore IDs + auto personalMutePacketList = NLPacketList::create(PacketType::NodeIgnoreRequest, QByteArray(), true); + + // enumerate the ignored IDs and write them to the packet list + auto it = _personalMutedNodeIDs.cbegin(); + while (it != _personalMutedNodeIDs.end()) { + personalMutePacketList->write(it->toRfc4122()); + ++it; + } + + // send this NLPacketList to the new node + sendPacketList(std::move(personalMutePacketList), *newNode); + } + + // also send them the current ignore radius state. + sendIgnoreRadiusStateToNode(newNode); + } + if (newNode->getType() == NodeType::AvatarMixer) { + // this is a mixer that we just added - it's unlikely it knows who we were previously ignoring in this session, + // so send that list along now (assuming it isn't empty) + + QReadLocker ignoredSetLocker{ &_ignoredSetLock }; if (_ignoredNodeIDs.size() > 0) { // setup a packet list so we can send the stream of ignore IDs @@ -850,64 +919,6 @@ void NodeList::maybeSendIgnoreSetToNode(SharedNodePointer newNode) { } } -void NodeList::personalMuteNodeBySessionID(const QUuid& nodeID, bool muteEnabled) { - // cannot personal mute yourself, or nobody - if (!nodeID.isNull() && _sessionUUID != nodeID) { - auto audioMixer = soloNodeOfType(NodeType::AudioMixer); - if (audioMixer) { - // setup the packet - auto personalMutePacket = NLPacket::create(PacketType::NodePersonalMuteRequest, NUM_BYTES_RFC4122_UUID + sizeof(bool), true); - - // write the node ID to the packet - personalMutePacket->write(nodeID.toRfc4122()); - personalMutePacket->writePrimitive(muteEnabled); - - qCDebug(networking) << "Sending Personal Mute Packet to" << (muteEnabled ? "mute" : "unmute") << "node" << uuidStringWithoutCurlyBraces(nodeID); - - sendPacket(std::move(personalMutePacket), *audioMixer); - } else { - qWarning() << "Couldn't find audio mixer to send node personal mute request"; - } - } else { - qWarning() << "NodeList::personalMuteNodeBySessionID called with an invalid ID or an ID which matches the current session ID."; - } -} - -void NodeList::requestPersonalMuteStatus(const QUuid& nodeID) { - // cannot personal mute yourself, or nobody; don't bother checking the status - if (!nodeID.isNull() && _sessionUUID != nodeID) { - auto audioMixer = soloNodeOfType(NodeType::AudioMixer); - if (audioMixer) { - // send a request to the audio mixer to get the personal mute status associated with the given session ID - // setup the packet - auto personalMuteStatusPacket = NLPacket::create(PacketType::NodePersonalMuteStatusRequest, NUM_BYTES_RFC4122_UUID, true); - - // write the node ID to the packet - personalMuteStatusPacket->write(nodeID.toRfc4122()); - - qCDebug(networking) << "Sending Personal Mute Status Request Packet for node" << uuidStringWithoutCurlyBraces(nodeID); - - sendPacket(std::move(personalMuteStatusPacket), *audioMixer); - } else { - qWarning() << "Couldn't find audio mixer to send node personal mute status request"; - } - } else { - qWarning() << "NodeList::requestPersonalMuteStatus called with an invalid ID or an ID which matches the current session ID."; - } -} - -void NodeList::processPersonalMuteStatusReply(QSharedPointer message) { - // read the UUID from the packet - QString nodeUUIDString = (QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID))).toString(); - // read the personal mute status - bool isPersonalMuted; - message->readPrimitive(&isPersonalMuted); - - qCDebug(networking) << "Got personal muted status" << isPersonalMuted << "for node" << nodeUUIDString; - - emit personalMuteStatusReply(nodeUUIDString, isPersonalMuted); -} - void NodeList::kickNodeBySessionID(const QUuid& nodeID) { // send a request to domain-server to kick the node with the given session ID // the domain-server will handle the persistence of the kick (via username or IP) diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index 1e0a7fa8d1..ba19f56f9f 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -79,7 +79,7 @@ public: void ignoreNodeBySessionID(const QUuid& nodeID, bool ignoreEnabled); bool isIgnoringNode(const QUuid& nodeID) const; void personalMuteNodeBySessionID(const QUuid& nodeID, bool muteEnabled); - void requestPersonalMuteStatus(const QUuid& nodeID); + bool isPersonalMutingNode(const QUuid& nodeID) const; void kickNodeBySessionID(const QUuid& nodeID); void muteNodeBySessionID(const QUuid& nodeID); @@ -105,7 +105,6 @@ public slots: void processICEPingPacket(QSharedPointer message); void processUsernameFromIDReply(QSharedPointer message); - void processPersonalMuteStatusReply(QSharedPointer message); #if (PR_BUILD || DEV_BUILD) void toggleSendNewerDSConnectVersion(bool shouldSendNewerVersion) { _shouldSendNewerVersion = shouldSendNewerVersion; } @@ -118,7 +117,6 @@ signals: void unignoredNode(const QUuid& nodeID); void ignoreRadiusEnabledChanged(bool isIgnored); void usernameFromIDReply(const QString& nodeID, const QString& username, const QString& machineFingerprint); - void personalMuteStatusReply(const QString& nodeID, bool isPersonalMuted); private slots: void stopKeepalivePingTimer(); @@ -164,6 +162,8 @@ private: mutable QReadWriteLock _ignoredSetLock; tbb::concurrent_unordered_set _ignoredNodeIDs; + mutable QReadWriteLock _personalMutedSetLock; + tbb::concurrent_unordered_set _personalMutedNodeIDs; void sendIgnoreRadiusStateToNode(const SharedNodePointer& destinationNode); Setting::Handle _ignoreRadiusEnabled { "IgnoreRadiusEnabled", true }; diff --git a/libraries/networking/src/udt/PacketHeaders.h b/libraries/networking/src/udt/PacketHeaders.h index 78ae1e7ff0..1867d2193c 100644 --- a/libraries/networking/src/udt/PacketHeaders.h +++ b/libraries/networking/src/udt/PacketHeaders.h @@ -105,10 +105,7 @@ public: UsernameFromIDReply, ViewFrustum, RequestsDomainListData, - NodePersonalMuteRequest, - NodePersonalMuteStatusRequest, - NodePersonalMuteStatusReply, - LAST_PACKET_TYPE = NodePersonalMuteStatusReply + LAST_PACKET_TYPE = RequestsDomainListData }; }; diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index f18eef27cb..58680b944d 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -21,7 +21,6 @@ UsersScriptingInterface::UsersScriptingInterface() { connect(nodeList.data(), &NodeList::usernameFromIDReply, this, &UsersScriptingInterface::usernameFromIDReply); connect(nodeList.data(), &NodeList::ignoredNode, this, &UsersScriptingInterface::ignoredNode); connect(nodeList.data(), &NodeList::unignoredNode, this, &UsersScriptingInterface::unignoredNode); - connect(nodeList.data(), &NodeList::personalMuteStatusReply, this, &UsersScriptingInterface::personalMuteStatusReply); } void UsersScriptingInterface::ignore(const QUuid& nodeID, bool ignoreEnabled) { @@ -40,9 +39,9 @@ void UsersScriptingInterface::personalMute(const QUuid& nodeID, bool muteEnabled DependencyManager::get()->personalMuteNodeBySessionID(nodeID, muteEnabled); } -void UsersScriptingInterface::requestPersonalMuteStatus(const QUuid& nodeID) { - // ask the Audio Mixer via the NodeList for the Personal Mute status associated with the given session ID - DependencyManager::get()->requestPersonalMuteStatus(nodeID); +bool UsersScriptingInterface::getPersonalMuteStatus(const QUuid& nodeID) { + // ask the NodeList for the Personal Mute status associated with the given session ID + return DependencyManager::get()->isPersonalMutingNode(nodeID); } void UsersScriptingInterface::kick(const QUuid& nodeID) { diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index f7b25a72c2..223ddb879b 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -59,7 +59,7 @@ public slots: * @function Users.requestPersonalMuteStatus * @param {nodeID} nodeID The node or session ID of the user whose personal mute status you want. */ - void requestPersonalMuteStatus(const QUuid& nodeID); + bool getPersonalMuteStatus(const QUuid& nodeID); /**jsdoc * Kick another user. @@ -132,12 +132,6 @@ signals: */ void usernameFromIDReply(const QString& nodeID, const QString& username, const QString& machineFingerprint); - /**jsdoc - * Notifies scripts of the Personal Mute status associated with a UUID. - * @function Users.usernameFromIDReply - */ - void personalMuteStatusReply(const QString& nodeID, bool isPersonalMuted); - private: bool getRequestsDomainListData(); void setRequestsDomainListData(bool requests); diff --git a/scripts/system/pal.js b/scripts/system/pal.js index a21eb8c6ef..d2312e9ed4 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -136,7 +136,7 @@ function populateUserList() { // and ignore status from AudioMixer/AvatarMixer // (as long as we're not requesting it for our own ID) if (id) { - Users.requestPersonalMuteStatus(id); + avatarPalDatum['personalMute'] = Users.getPersonalMuteStatus(id); avatarPalDatum['ignore'] = Users.getIgnoreStatus(id); } data.push(avatarPalDatum); @@ -165,14 +165,6 @@ function usernameFromIDReply(id, username, machineFingerprint) { pal.sendToQml({ method: 'updateUsername', params: data }); } -// The function that handles the personal muted status from the AudioMixer -function personalMuteStatusReply(id, isPersonalMuted) { - var data = [id, isPersonalMuted]; - print('Personal Muted Status Data:', JSON.stringify(data)); - // Ship the data off to QML - pal.sendToQml({ method: 'updatePersonalMutedStatus', params: data }); -} - var pingPong = true; function updateOverlays() { var eye = Camera.position; @@ -343,7 +335,6 @@ button.clicked.connect(onClicked); pal.visibleChanged.connect(onVisibleChanged); pal.closed.connect(off); Users.usernameFromIDReply.connect(usernameFromIDReply); -Users.personalMuteStatusReply.connect(personalMuteStatusReply); function onIgnore(sessionId) { // make it go away in the usual way, since we'll still get data keeping it live // Why doesn't this work from .qml? (crashes) @@ -361,7 +352,6 @@ Script.scriptEnding.connect(function () { pal.closed.disconnect(off); Users.usernameFromIDReply.disconnect(usernameFromIDReply); Users.ignoredNode.disconnect(onIgnore); - Users.personalMuteStatusReply.disconnect(personalMuteStatusReply); off(); }); From f96508e197b6c62f5770554b9c16026b2f14a1df Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 29 Dec 2016 14:19:40 -0800 Subject: [PATCH 27/45] Gotta fix these bugs... --- .../resources/qml/controls-uit/CheckBox.qml | 17 +++++++- interface/resources/qml/hifi/Pal.qml | 40 ++++++++++--------- 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/interface/resources/qml/controls-uit/CheckBox.qml b/interface/resources/qml/controls-uit/CheckBox.qml index aec579755a..503e6b8739 100644 --- a/interface/resources/qml/controls-uit/CheckBox.qml +++ b/interface/resources/qml/controls-uit/CheckBox.qml @@ -27,7 +27,9 @@ Original.CheckBox { readonly property int checkRadius: 2 style: CheckBoxStyle { - indicator: Rectangle { + indicator: + + Rectangle { id: box width: boxSize height: boxSize @@ -51,6 +53,19 @@ Original.CheckBox { } } + Rectangle { + id: disabledOverlay + visible: !enabled + z: 100 + width: boxSize + height: boxSize + radius: boxRadius + border.width: 1 + border.color: hifi.colors.baseGrayHighlight + color: hifi.colors.baseGrayHighlight + opacity: 0.5 + } + Rectangle { visible: pressed || hovered anchors.centerIn: parent diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index e6a762ecd8..0d5cdb0503 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -40,7 +40,7 @@ Item { property int myCardHeight: 70 property int rowHeight: 70 property int actionButtonWidth: 75 - property int nameCardWidth: width - actionButtonWidth*(iAmAdmin ? 4 : 2) + property int nameCardWidth: width - actionButtonWidth*(iAmAdmin ? 4 : 2) - 4 // This contains the current user's NameCard and will contain other information in the future Rectangle { @@ -85,7 +85,7 @@ Item { Rectangle { id: adminTab // Size - width: actionButtonWidth * 2 - 2 + width: actionButtonWidth * 2 + 2 height: 40 // Anchors anchors.bottom: myInfo.bottom @@ -116,6 +116,19 @@ Item { verticalAlignment: Text.AlignTop } } + // Separator between user and admin functions + Rectangle { + // Size + width: 2 + height: table.height + // Anchors + anchors.left: adminTab.left + anchors.top: table.top + // Properties + z: 100 + visible: iAmAdmin + color: hifi.colors.lightGrayText + } // This TableView refers to the table (below the current user's NameCard) HifiControls.Table { id: table @@ -191,7 +204,7 @@ Item { // Properties displayName: styleData.value userName: model && model.userName - audioLevel: model.audioLevel + audioLevel: model && model.audioLevel visible: !isCheckBox // Size width: nameCardWidth @@ -202,12 +215,16 @@ Item { // This CheckBox belongs in the columns that contain the action buttons ("Mute", "Ban", etc) HifiControls.CheckBox { - visible: styleData.role === "personalMute" ? (model["ignore"] === true ? false : true) : isCheckBox + visible: isCheckBox anchors.centerIn: parent - checked: model[styleData.role] + checked: model && model[styleData.role] + enabled: styleData.role === "personalMute" ? (model["ignore"] === true ? false : true) : true boxSize: 24 onClicked: { var newValue = !model[styleData.role] + if (newValue === undefined) { + newValue = false + } var datum = userData[model.userIndex] datum[styleData.role] = model[styleData.role] = newValue if (styleData.role === "personalMute" || styleData.role === "ignore") { @@ -264,19 +281,6 @@ Item { onExited: reloadButton.color = (pressed ? hifi.colors.lightGrayText: hifi.colors.darkGray) } } - - // Separator between user and admin functions - Rectangle { - // Size - width: 2 - height: table.height - // Anchors - anchors.left: adminTab.left - anchors.top: table.top - // Properties - visible: iAmAdmin - color: hifi.colors.lightGrayText - } // This Rectangle refers to the [?] popup button Rectangle { color: hifi.colors.tableBackgroundLight From be4050aa78e1b808bb0a94baa865f6b1138fa7d7 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 29 Dec 2016 15:43:42 -0800 Subject: [PATCH 28/45] One bug down! --- interface/resources/qml/hifi/Pal.qml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 0d5cdb0503..a977de1c3f 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -182,7 +182,9 @@ Item { movable: false resizable: false } - model: userModel + model: ListModel { + id: userModel + } // This Rectangle refers to each Row in the table. rowDelegate: Rectangle { // The only way I know to specify a row height. @@ -217,7 +219,7 @@ Item { HifiControls.CheckBox { visible: isCheckBox anchors.centerIn: parent - checked: model && model[styleData.role] + checked: model[styleData.role] enabled: styleData.role === "personalMute" ? (model["ignore"] === true ? false : true) : true boxSize: 24 onClicked: { @@ -225,12 +227,13 @@ Item { if (newValue === undefined) { newValue = false } - var datum = userData[model.userIndex] - datum[styleData.role] = model[styleData.role] = newValue + userModel.setProperty(model.userIndex, styleData.role, newValue) + userData[model.userIndex][styleData.role] = newValue // Defensive programming if (styleData.role === "personalMute" || styleData.role === "ignore") { Users[styleData.role](model.sessionId, newValue) if (styleData.role === "ignore") { - datum["personalMute"] = model["personalMute"] = newValue + userModel.setProperty(model.userIndex, "personalMute", newValue) + userData[model.userIndex]["personalMute"] = newValue // Defensive programming } } else { Users[styleData.role](model.sessionId) @@ -238,6 +241,10 @@ Item { userData.splice(model.userIndex, 1) sortModel() } + // http://doc.qt.io/qt-5/qtqml-syntax-propertybinding.html#creating-property-bindings-from-javascript + // I'm using an explicit binding here because clicking a checkbox breaks the implicit binding as set by + // "checked: model[stayleData.role]" above. + checked = Qt.binding(function() { return model[styleData.role] }) } } } @@ -415,9 +422,6 @@ Item { console.log('Unrecognized message:', JSON.stringify(message)); } } - ListModel { - id: userModel - } function sortModel() { var sortProperty = table.getColumn(table.sortIndicatorColumn).role; var before = (table.sortIndicatorOrder === Qt.AscendingOrder) ? -1 : 1; From 3bd68f5e3e2213ce287577945323ae880f6ae8d6 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Thu, 29 Dec 2016 16:09:31 -0800 Subject: [PATCH 29/45] Checkpoint for removing userData --- interface/resources/qml/hifi/Pal.qml | 39 +++++++++++++++++----------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index a977de1c3f..8514cb36b2 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -228,17 +228,15 @@ Item { newValue = false } userModel.setProperty(model.userIndex, styleData.role, newValue) - userData[model.userIndex][styleData.role] = newValue // Defensive programming if (styleData.role === "personalMute" || styleData.role === "ignore") { Users[styleData.role](model.sessionId, newValue) if (styleData.role === "ignore") { userModel.setProperty(model.userIndex, "personalMute", newValue) - userData[model.userIndex]["personalMute"] = newValue // Defensive programming } } else { Users[styleData.role](model.sessionId) // Just for now, while we cannot undo things: - userData.splice(model.userIndex, 1) + userModel.remove(model.userIndex, 1) sortModel() } // http://doc.qt.io/qt-5/qtqml-syntax-propertybinding.html#creating-property-bindings-from-javascript @@ -352,13 +350,11 @@ Item { } } - property var userData: [] property var myData: ({displayName: "", userName: "", audioLevel: 0.0}) // valid dummy until set property bool iAmAdmin: false function findSessionIndex(sessionId, optionalData) { // no findIndex in .qml - var i, data = optionalData || userData, length = data.length; - for (var i = 0; i < length; i++) { - if (data[i].sessionId === sessionId) { + for (var i = 0; i < userModel.count; i++) { + if (userModel.get(i).sessionId === sessionId) { return i; } } @@ -372,8 +368,18 @@ Item { iAmAdmin = Users.canKick; myData = data[myIndex]; data.splice(myIndex, 1); - userData = data; - sortModel(); + userModel.clear(); + var userIndex = 0; + data.forEach(function (datum) { + function init(property) { + if (datum[property] === undefined) { + datum[property] = false; + } + } + ['personalMute', 'ignore', 'mute', 'kick'].forEach(init); + datum.userIndex = userIndex++; + userModel.append(datum); + }); break; case 'select': var sessionId = message.params[0]; @@ -397,11 +403,10 @@ Item { myData.userName = userName; myCard.userName = userName; // Defensive programming } else { - // Get the index in userModel and userData associated with the passed UUID + // Get the index in userModel associated with the passed UUID var userIndex = findSessionIndex(userId); // Set the userName appropriately userModel.setProperty(userIndex, "userName", userName); - userData[userIndex].userName = userName; // Defensive programming } break; case 'updateAudioLevel': @@ -414,7 +419,6 @@ Item { } else { var userIndex = findSessionIndex(userId); userModel.setProperty(userIndex, "audioLevel", audioLevel); - userData[userIndex].audioLevel = audioLevel; // Defensive programming } } break; @@ -423,10 +427,15 @@ Item { } } function sortModel() { + var sortable = []; + for (var i = 0; i < userModel.count; i++) { + sortable.push(userModel.get(i)); + } + var sortProperty = table.getColumn(table.sortIndicatorColumn).role; var before = (table.sortIndicatorOrder === Qt.AscendingOrder) ? -1 : 1; var after = -1 * before; - userData.sort(function (a, b) { + sortable.sort(function (a, b) { var aValue = a[sortProperty].toString().toLowerCase(), bValue = b[sortProperty].toString().toLowerCase(); switch (true) { case (aValue < bValue): return before; @@ -437,7 +446,7 @@ Item { table.selection.clear(); userModel.clear(); var userIndex = 0; - userData.forEach(function (datum) { + sortable.forEach(function (datum) { function init(property) { if (datum[property] === undefined) { datum[property] = false; @@ -452,7 +461,7 @@ Item { function noticeSelection() { var userIds = []; table.selection.forEach(function (userIndex) { - userIds.push(userData[userIndex].sessionId); + userIds.push(userModel.get(userIndex).sessionId); }); pal.sendToScript({method: 'selected', params: userIds}); } From f26b7c01342d9efe5bda7e30523cfdfc6bb07143 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 30 Dec 2016 09:51:43 -0800 Subject: [PATCH 30/45] Checkpoint --- interface/resources/qml/hifi/Pal.qml | 42 ++++++++++++++++++---------- scripts/system/pal.js | 9 ++---- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 8514cb36b2..95c196fc3a 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -41,6 +41,8 @@ Item { property int rowHeight: 70 property int actionButtonWidth: 75 property int nameCardWidth: width - actionButtonWidth*(iAmAdmin ? 4 : 2) - 4 + property var myData: ({displayName: "", userName: "", audioLevel: 0.0}) // valid dummy until set + property bool iAmAdmin: false // This contains the current user's NameCard and will contain other information in the future Rectangle { @@ -350,9 +352,7 @@ Item { } } - property var myData: ({displayName: "", userName: "", audioLevel: 0.0}) // valid dummy until set - property bool iAmAdmin: false - function findSessionIndex(sessionId, optionalData) { // no findIndex in .qml + function findSessionIndexInUserModel(sessionId) { // no findIndex in .qml for (var i = 0; i < userModel.count; i++) { if (userModel.get(i).sessionId === sessionId) { return i; @@ -364,10 +364,20 @@ Item { switch (message.method) { case 'users': var data = message.params; - var myIndex = findSessionIndex('', data); - iAmAdmin = Users.canKick; - myData = data[myIndex]; - data.splice(myIndex, 1); + var myIndex = -1; + for (var i = 0; i < data.length; i++) { + if (data[i].sessionId === "") { + myIndex = i; + break; + } + } + if (myIndex !== -1) { + iAmAdmin = Users.canKick; + myData = data[myIndex]; + data.splice(myIndex, 1); + } else { + console.log("This user's data was not found in the user list. PAL will not function properly."); + } userModel.clear(); var userIndex = 0; data.forEach(function (datum) { @@ -384,7 +394,7 @@ Item { case 'select': var sessionId = message.params[0]; var selected = message.params[1]; - var userIndex = findSessionIndex(sessionId); + var userIndex = findSessionIndexInUserModel(sessionId); if (selected) { table.selection.clear(); // for now, no multi-select table.selection.select(userIndex); @@ -404,7 +414,7 @@ Item { myCard.userName = userName; // Defensive programming } else { // Get the index in userModel associated with the passed UUID - var userIndex = findSessionIndex(userId); + var userIndex = findSessionIndexInUserModel(userId); // Set the userName appropriately userModel.setProperty(userIndex, "userName", userName); } @@ -417,25 +427,27 @@ Item { myData.audioLevel = audioLevel; myCard.audioLevel = audioLevel; // Defensive programming } else { - var userIndex = findSessionIndex(userId); + var userIndex = findSessionIndexInUserModel(userId); userModel.setProperty(userIndex, "audioLevel", audioLevel); } } break; - default: + default: console.log('Unrecognized message:', JSON.stringify(message)); } } function sortModel() { - var sortable = []; + var sortedList = []; + console.log('sortedList before:', JSON.stringify(sortedList)); for (var i = 0; i < userModel.count; i++) { - sortable.push(userModel.get(i)); + sortedList.push(userModel.get(i)); } + console.log('sortedList:', JSON.stringify(sortedList)); var sortProperty = table.getColumn(table.sortIndicatorColumn).role; var before = (table.sortIndicatorOrder === Qt.AscendingOrder) ? -1 : 1; var after = -1 * before; - sortable.sort(function (a, b) { + sortedList.sort(function (a, b) { var aValue = a[sortProperty].toString().toLowerCase(), bValue = b[sortProperty].toString().toLowerCase(); switch (true) { case (aValue < bValue): return before; @@ -446,7 +458,7 @@ Item { table.selection.clear(); userModel.clear(); var userIndex = 0; - sortable.forEach(function (datum) { + sortedList.forEach(function (datum) { function init(property) { if (datum[property] === undefined) { datum[property] = false; diff --git a/scripts/system/pal.js b/scripts/system/pal.js index d2312e9ed4..2bc016dd06 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -132,17 +132,14 @@ function populateUserList() { // Request the username from the given UUID Users.requestUsernameFromID(id); } - // Request personal mute status from AudioMixer - // and ignore status from AudioMixer/AvatarMixer - // (as long as we're not requesting it for our own ID) + // Request personal mute status and ignore status + // from NodeList (as long as we're not requesting it for our own ID) if (id) { avatarPalDatum['personalMute'] = Users.getPersonalMuteStatus(id); avatarPalDatum['ignore'] = Users.getIgnoreStatus(id); + addAvatarNode(id); // No overlay for ourselves } data.push(avatarPalDatum); - if (id) { // No overlay for ourself. - addAvatarNode(id); - } print('PAL data:', JSON.stringify(avatarPalDatum)); }); pal.sendToQml({method: 'users', params: data}); From ea40582afb067d8d24c9a7cfe807b1f54eda2fa9 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 30 Dec 2016 12:55:46 -0800 Subject: [PATCH 31/45] Remaining bug: Hover when sort --- interface/resources/qml/hifi/Pal.qml | 46 +++++++++++++--------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 95c196fc3a..05f0334615 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -118,19 +118,6 @@ Item { verticalAlignment: Text.AlignTop } } - // Separator between user and admin functions - Rectangle { - // Size - width: 2 - height: table.height - // Anchors - anchors.left: adminTab.left - anchors.top: table.top - // Properties - z: 100 - visible: iAmAdmin - color: hifi.colors.lightGrayText - } // This TableView refers to the table (below the current user's NameCard) HifiControls.Table { id: table @@ -249,6 +236,18 @@ Item { } } } + // Separator between user and admin functions + Rectangle { + // Size + width: 2 + height: table.height + // Anchors + anchors.left: adminTab.left + anchors.top: table.top + // Properties + visible: iAmAdmin + color: hifi.colors.lightGrayText + } // Refresh button Rectangle { // Size @@ -390,6 +389,7 @@ Item { datum.userIndex = userIndex++; userModel.append(datum); }); + sortModel(); break; case 'select': var sessionId = message.params[0]; @@ -438,11 +438,9 @@ Item { } function sortModel() { var sortedList = []; - console.log('sortedList before:', JSON.stringify(sortedList)); for (var i = 0; i < userModel.count; i++) { sortedList.push(userModel.get(i)); } - console.log('sortedList:', JSON.stringify(sortedList)); var sortProperty = table.getColumn(table.sortIndicatorColumn).role; var before = (table.sortIndicatorOrder === Qt.AscendingOrder) ? -1 : 1; @@ -456,18 +454,18 @@ Item { } }); table.selection.clear(); - userModel.clear(); - var userIndex = 0; - sortedList.forEach(function (datum) { - function init(property) { - if (datum[property] === undefined) { - datum[property] = false; + var currentUserIndex = 0; + for (var i = 0; i < sortedList.length; i++) { + function init(prop) { + if (sortedList[i][prop] === undefined) { + sortedList[i][prop] = false; } } + sortedList[i].userIndex = currentUserIndex++; ['personalMute', 'ignore', 'mute', 'kick'].forEach(init); - datum.userIndex = userIndex++; - userModel.append(datum); - }); + userModel.append(sortedList[i]); + } + userModel.remove(0, sortedList.length); } signal sendToScript(var message); function noticeSelection() { From 951db2e2dae9f9c3f07515ca283450ea338a3af1 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 30 Dec 2016 15:12:17 -0800 Subject: [PATCH 32/45] Bugs fixed! --- interface/resources/qml/hifi/Pal.qml | 54 ++++++++++++++++++---------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 05f0334615..366e0ab30d 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -194,8 +194,8 @@ Item { id: nameCard // Properties displayName: styleData.value - userName: model && model.userName - audioLevel: model && model.audioLevel + userName: model ? model.userName : "" + audioLevel: model ? model.audioLevel : 0.0 visible: !isCheckBox // Size width: nameCardWidth @@ -205,11 +205,19 @@ Item { } // This CheckBox belongs in the columns that contain the action buttons ("Mute", "Ban", etc) + // KNOWN BUG with the Checkboxes: When clicking in the center of the sorting header, the checkbox + // will appear in the "hovered" state. Hovering over the checkbox will fix it. + // Clicking on the sides of the sorting header doesn't cause this problem. + // I'm guessing this is a QT bug and not anything I can fix. I spent too long trying to work around it... + // I'm just going to leave the minor visual bug in. HifiControls.CheckBox { + id: actionCheckBox visible: isCheckBox anchors.centerIn: parent - checked: model[styleData.role] - enabled: styleData.role === "personalMute" ? (model["ignore"] === true ? false : true) : true + checked: model ? model[styleData.role] : false + // If this is a "personal mute" checkbox, and the model is valid, Check the checkbox if the Ignore + // checkbox is checked. + enabled: styleData.role === "personalMute" ? ((model ? model["ignore"] : false) === true ? false : true) : true boxSize: 24 onClicked: { var newValue = !model[styleData.role] @@ -225,13 +233,13 @@ Item { } else { Users[styleData.role](model.sessionId) // Just for now, while we cannot undo things: - userModel.remove(model.userIndex, 1) + userModel.remove(model.userIndex) sortModel() } // http://doc.qt.io/qt-5/qtqml-syntax-propertybinding.html#creating-property-bindings-from-javascript // I'm using an explicit binding here because clicking a checkbox breaks the implicit binding as set by - // "checked: model[stayleData.role]" above. - checked = Qt.binding(function() { return model[styleData.role] }) + // "checked: model[styleData.role]" above. + checked = Qt.binding(function() { return (model && model[styleData.role]) ? model[styleData.role] : false}) } } } @@ -327,18 +335,22 @@ Item { radius: hifi.dimensions.borderRadius } Rectangle { - width: Math.min(parent.width * 0.75, 400) - height: popupText.contentHeight*2 + width: Math.max(parent.width * 0.75, 400) + height: popupText.contentHeight*1.5 anchors.centerIn: parent radius: hifi.dimensions.borderRadius color: "white" FiraSansSemiBold { id: popupText - text: "This is temporary text. It will eventually be used to explain what 'Names' means." + text: "Bold names in the list are Avatar Display Names.\n" + + "If a Display Name isn't set, a unique Session Display Name is assigned to them." + + "\n\nAdministrators of this domain can also see the Username or Machine ID associated with each present avatar." size: hifi.fontSizes.textFieldInput color: hifi.colors.darkGray horizontalAlignment: Text.AlignHCenter anchors.fill: parent + anchors.leftMargin: 15 + anchors.rightMargin: 15 wrapMode: Text.WordWrap } } @@ -395,11 +407,13 @@ Item { var sessionId = message.params[0]; var selected = message.params[1]; var userIndex = findSessionIndexInUserModel(sessionId); - if (selected) { - table.selection.clear(); // for now, no multi-select - table.selection.select(userIndex); - } else { - table.selection.deselect(userIndex); + if (userIndex != -1) { + if (selected) { + table.selection.clear(); // for now, no multi-select + table.selection.select(userIndex); + } else { + table.selection.deselect(userIndex); + } } break; // Received an "updateUsername()" request from the JS @@ -415,8 +429,10 @@ Item { } else { // Get the index in userModel associated with the passed UUID var userIndex = findSessionIndexInUserModel(userId); - // Set the userName appropriately - userModel.setProperty(userIndex, "userName", userName); + if (userIndex != -1) { + // Set the userName appropriately + userModel.setProperty(userIndex, "userName", userName); + } } break; case 'updateAudioLevel': @@ -428,7 +444,9 @@ Item { myCard.audioLevel = audioLevel; // Defensive programming } else { var userIndex = findSessionIndexInUserModel(userId); - userModel.setProperty(userIndex, "audioLevel", audioLevel); + if (userIndex != -1) { + userModel.setProperty(userIndex, "audioLevel", audioLevel); + } } } break; From 4a21eaa33fbf7a305a0275958e9d98053388faa5 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Fri, 30 Dec 2016 15:18:01 -0800 Subject: [PATCH 33/45] Cleanup before PR --- assignment-client/src/avatars/AvatarMixer.cpp | 2 +- interface/resources/qml/hifi/Pal.qml | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 43ad2cbaff..30ce210eb6 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -368,7 +368,7 @@ void AvatarMixer::broadcastAvatarData() { AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID()); AvatarDataSequenceNumber lastSeqFromSender = otherNodeData->getLastReceivedSequenceNumber(); - + if (lastSeqToReceiver > lastSeqFromSender && lastSeqToReceiver != UINT16_MAX) { // we got out out of order packets from the sender, track it otherNodeData->incrementNumOutOfOrderSends(); diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 366e0ab30d..2196692e1c 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -244,18 +244,6 @@ Item { } } } - // Separator between user and admin functions - Rectangle { - // Size - width: 2 - height: table.height - // Anchors - anchors.left: adminTab.left - anchors.top: table.top - // Properties - visible: iAmAdmin - color: hifi.colors.lightGrayText - } // Refresh button Rectangle { // Size @@ -295,6 +283,18 @@ Item { onExited: reloadButton.color = (pressed ? hifi.colors.lightGrayText: hifi.colors.darkGray) } } + // Separator between user and admin functions + Rectangle { + // Size + width: 2 + height: table.height + // Anchors + anchors.left: adminTab.left + anchors.top: table.top + // Properties + visible: iAmAdmin + color: hifi.colors.lightGrayText + } // This Rectangle refers to the [?] popup button Rectangle { color: hifi.colors.tableBackgroundLight From 899dd21328cb790d4c150278e1aadd711474985d Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 3 Jan 2017 15:43:30 -0800 Subject: [PATCH 34/45] Lots of CR feedback --- assignment-client/src/avatars/AvatarMixer.cpp | 4 + .../resources/qml/controls-uit/CheckBox.qml | 4 +- interface/resources/qml/hifi/Pal.qml | 125 +++++++++++------- libraries/networking/src/Node.cpp | 4 +- libraries/networking/src/NodeList.cpp | 22 ++- 5 files changed, 96 insertions(+), 63 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 30ce210eb6..3cacfdedf1 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -110,6 +110,10 @@ void AvatarMixer::broadcastAvatarData() { const float PREVIOUS_FRAMES_RATIO = 1.0f - CURRENT_FRAME_RATIO; // only send extra avatar data (avatars out of view, ignored) every Nth AvatarData frame + // Extra avatar data will be sent (AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND/EXTRA_AVATAR_DATA_FRAME_RATIO) times + // per second. + // This value should be a power of two for performance purposes, as the mixer performs a modulo operation every frame + // to determine whether the extra data should be sent. const int EXTRA_AVATAR_DATA_FRAME_RATIO = 16; // NOTE: The following code calculates the _performanceThrottlingRatio based on how much the avatar-mixer was diff --git a/interface/resources/qml/controls-uit/CheckBox.qml b/interface/resources/qml/controls-uit/CheckBox.qml index 503e6b8739..9db4f621f9 100644 --- a/interface/resources/qml/controls-uit/CheckBox.qml +++ b/interface/resources/qml/controls-uit/CheckBox.qml @@ -27,9 +27,7 @@ Original.CheckBox { readonly property int checkRadius: 2 style: CheckBoxStyle { - indicator: - - Rectangle { + indicator: Rectangle { id: box width: boxSize height: boxSize diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 2196692e1c..3c3cde7a67 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -42,6 +42,9 @@ Item { property int actionButtonWidth: 75 property int nameCardWidth: width - actionButtonWidth*(iAmAdmin ? 4 : 2) - 4 property var myData: ({displayName: "", userName: "", audioLevel: 0.0}) // valid dummy until set + // FIXME: Need to determine & handle when this list gets reset. + property var ignored: ({}); // Keep a local list of ignored avatars & their data. Necessary because HashMap is slow to respond after ignoring. + property var userModelData: [] // This simple list is essentially a mirror of the userModel listModel without all the extra complexities. property bool iAmAdmin: false // This contains the current user's NameCard and will contain other information in the future @@ -187,7 +190,8 @@ Item { // This Item refers to the contents of each Cell itemDelegate: Item { id: itemCell - property bool isCheckBox: typeof(styleData.value) === 'boolean' + property bool isCheckBox: styleData.role === "personalMute" || styleData.role === "ignore" + property bool isButton: styleData.role === "mute" || styleData.role === "kick" // This NameCard refers to the cell that contains an avatar's // DisplayName and UserName NameCard { @@ -196,7 +200,7 @@ Item { displayName: styleData.value userName: model ? model.userName : "" audioLevel: model ? model.audioLevel : 0.0 - visible: !isCheckBox + visible: !isCheckBox && !isButton // Size width: nameCardWidth height: parent.height @@ -204,7 +208,7 @@ Item { anchors.left: parent.left } - // This CheckBox belongs in the columns that contain the action buttons ("Mute", "Ban", etc) + // This CheckBox belongs in the columns that contain the stateful action buttons ("Mute" & "Ignore" for now) // KNOWN BUG with the Checkboxes: When clicking in the center of the sorting header, the checkbox // will appear in the "hovered" state. Hovering over the checkbox will fix it. // Clicking on the sides of the sorting header doesn't cause this problem. @@ -225,16 +229,20 @@ Item { newValue = false } userModel.setProperty(model.userIndex, styleData.role, newValue) + userModelData[model.userIndex][styleData.role] = newValue // Defensive programming if (styleData.role === "personalMute" || styleData.role === "ignore") { Users[styleData.role](model.sessionId, newValue) if (styleData.role === "ignore") { userModel.setProperty(model.userIndex, "personalMute", newValue) + userModelData[model.userIndex]["personalMute"] = newValue // Defensive programming + if (newValue) { + ignored[model.sessionId] = userModelData[model.userIndex] + } else { + delete ignored[model.sessionId] + } } } else { - Users[styleData.role](model.sessionId) - // Just for now, while we cannot undo things: - userModel.remove(model.userIndex) - sortModel() + console.log("User clicked on an unknown checkbox."); } // http://doc.qt.io/qt-5/qtqml-syntax-propertybinding.html#creating-property-bindings-from-javascript // I'm using an explicit binding here because clicking a checkbox breaks the implicit binding as set by @@ -242,6 +250,29 @@ Item { checked = Qt.binding(function() { return (model && model[styleData.role]) ? model[styleData.role] : false}) } } + + // This Button belongs in the columns that contain the stateless action buttons ("Silence" & "Ban" for now) + HifiControls.Button { + id: actionButton + color: 2 // Red + visible: isButton + anchors.centerIn: parent + width: 24 + height: 24 + onClicked: { + if (styleData.role === "mute" || styleData.role === "kick") { + Users[styleData.role](model.sessionId) + if (styleData.role === "kick") { + // Just for now, while we cannot undo "Ban": + userModel.remove(model.userIndex) + delete userModelData[model.userIndex] // Defensive programming + sortModel() + } + } else { + console.log("User clicked on an unknown checkbox."); + } + } + } } } // Refresh button @@ -363,9 +394,10 @@ Item { } } - function findSessionIndexInUserModel(sessionId) { // no findIndex in .qml - for (var i = 0; i < userModel.count; i++) { - if (userModel.get(i).sessionId === sessionId) { + function findSessionIndex(sessionId, optionalData) { // no findIndex in .qml + var data = optionalData || userModelData, length = data.length; + for (var i = 0; i < length; i++) { + if (data[i].sessionId === sessionId) { return i; } } @@ -375,38 +407,30 @@ Item { switch (message.method) { case 'users': var data = message.params; - var myIndex = -1; - for (var i = 0; i < data.length; i++) { - if (data[i].sessionId === "") { - myIndex = i; - break; - } - } - if (myIndex !== -1) { + var index = -1; + index = findSessionIndex('', data); + if (index !== -1) { iAmAdmin = Users.canKick; - myData = data[myIndex]; - data.splice(myIndex, 1); + myData = data[index]; + data.splice(index, 1); } else { console.log("This user's data was not found in the user list. PAL will not function properly."); } - userModel.clear(); - var userIndex = 0; - data.forEach(function (datum) { - function init(property) { - if (datum[property] === undefined) { - datum[property] = false; - } + userModelData = data; + for (var ignoredID in ignored) { + index = findSessionIndex(ignoredID); + if (index === -1) { // Add back any missing ignored to the PAL, because they sometimes take a moment to show up. + userModelData.push(ignored[ignoredID]); + } else { // Already appears in PAL; update properties of existing element in model data + userModelData[index] = ignored[ignoredID]; } - ['personalMute', 'ignore', 'mute', 'kick'].forEach(init); - datum.userIndex = userIndex++; - userModel.append(datum); - }); + } sortModel(); break; case 'select': var sessionId = message.params[0]; var selected = message.params[1]; - var userIndex = findSessionIndexInUserModel(sessionId); + var userIndex = findSessionIndex(sessionId); if (userIndex != -1) { if (selected) { table.selection.clear(); // for now, no multi-select @@ -427,11 +451,12 @@ Item { myData.userName = userName; myCard.userName = userName; // Defensive programming } else { - // Get the index in userModel associated with the passed UUID - var userIndex = findSessionIndexInUserModel(userId); + // Get the index in userModel and userModelData associated with the passed UUID + var userIndex = findSessionIndex(userId); if (userIndex != -1) { // Set the userName appropriately userModel.setProperty(userIndex, "userName", userName); + userModelData[userIndex].userName = userName; // Defensive programming } } break; @@ -443,9 +468,10 @@ Item { myData.audioLevel = audioLevel; myCard.audioLevel = audioLevel; // Defensive programming } else { - var userIndex = findSessionIndexInUserModel(userId); + var userIndex = findSessionIndex(userId); if (userIndex != -1) { userModel.setProperty(userIndex, "audioLevel", audioLevel); + userModelData[userIndex].audioLevel = audioLevel; // Defensive programming } } } @@ -455,15 +481,10 @@ Item { } } function sortModel() { - var sortedList = []; - for (var i = 0; i < userModel.count; i++) { - sortedList.push(userModel.get(i)); - } - var sortProperty = table.getColumn(table.sortIndicatorColumn).role; var before = (table.sortIndicatorOrder === Qt.AscendingOrder) ? -1 : 1; var after = -1 * before; - sortedList.sort(function (a, b) { + userModelData.sort(function (a, b) { var aValue = a[sortProperty].toString().toLowerCase(), bValue = b[sortProperty].toString().toLowerCase(); switch (true) { case (aValue < bValue): return before; @@ -472,24 +493,26 @@ Item { } }); table.selection.clear(); - var currentUserIndex = 0; - for (var i = 0; i < sortedList.length; i++) { - function init(prop) { - if (sortedList[i][prop] === undefined) { - sortedList[i][prop] = false; + + userModel.clear(); + var userIndex = 0; + userModelData.forEach(function (datum) { + function init(property) { + if (datum[property] === undefined) { + datum[property] = false; } } - sortedList[i].userIndex = currentUserIndex++; ['personalMute', 'ignore', 'mute', 'kick'].forEach(init); - userModel.append(sortedList[i]); - } - userModel.remove(0, sortedList.length); + datum.userIndex = userIndex++; + userModel.append(datum); + console.log('appending to userModel:', JSON.stringify(datum)); + }); } signal sendToScript(var message); function noticeSelection() { var userIds = []; table.selection.forEach(function (userIndex) { - userIds.push(userModel.get(userIndex).sessionId); + userIds.push(userModelData[userIndex].sessionId); }); pal.sendToScript({method: 'selected', params: userIds}); } diff --git a/libraries/networking/src/Node.cpp b/libraries/networking/src/Node.cpp index 484ea882b5..8063075e22 100644 --- a/libraries/networking/src/Node.cpp +++ b/libraries/networking/src/Node.cpp @@ -82,11 +82,11 @@ void Node::updateClockSkewUsec(qint64 clockSkewSample) { } void Node::parseIgnoreRequestMessage(QSharedPointer message) { + bool addToIgnore; + message->readPrimitive(&addToIgnore); while (message->getBytesLeftToRead()) { // parse out the UUID being ignored from the packet QUuid ignoredUUID = QUuid::fromRfc4122(message->readWithoutCopy(NUM_BYTES_RFC4122_UUID)); - bool addToIgnore; - message->readPrimitive(&addToIgnore); if (addToIgnore) { addIgnoredNode(ignoredUUID); diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 8b4cb41cc9..64f0479a51 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -790,9 +790,9 @@ void NodeList::ignoreNodeBySessionID(const QUuid& nodeID, bool ignoreEnabled) { // create a reliable NLPacket with space for the ignore UUID auto ignorePacket = NLPacket::create(PacketType::NodeIgnoreRequest, NUM_BYTES_RFC4122_UUID + sizeof(bool), true); + ignorePacket->writePrimitive(ignoreEnabled); // write the node ID to the packet ignorePacket->write(nodeID.toRfc4122()); - ignorePacket->writePrimitive(ignoreEnabled); qCDebug(networking) << "Sending packet to" << (destinationNode->getType() == NodeType::AudioMixer ? "AudioMixer" : "AvatarMixer") << "to" << (ignoreEnabled ? "ignore" : "unignore") << "node" << uuidStringWithoutCurlyBraces(nodeID); @@ -801,16 +801,17 @@ void NodeList::ignoreNodeBySessionID(const QUuid& nodeID, bool ignoreEnabled) { sendPacket(std::move(ignorePacket), *destinationNode); }); - QReadLocker ignoredSetLocker { &_ignoredSetLock }; // write lock for insert and unsafe_erase - QReadLocker personalMutedSetLocker{ &_personalMutedSetLock }; // write lock for insert and unsafe_erase - if (ignoreEnabled) { + QReadLocker ignoredSetLocker{ &_ignoredSetLock }; // read lock for insert + QReadLocker personalMutedSetLocker{ &_personalMutedSetLock }; // read lock for insert // add this nodeID to our set of ignored IDs _ignoredNodeIDs.insert(nodeID); // add this nodeID to our set of personal muted IDs _personalMutedNodeIDs.insert(nodeID); emit ignoredNode(nodeID); } else { + QWriteLocker ignoredSetLocker{ &_ignoredSetLock }; // write lock for unsafe_erase + QWriteLocker personalMutedSetLocker{ &_personalMutedSetLock }; // write lock for unsafe_erase _ignoredNodeIDs.unsafe_erase(nodeID); _personalMutedNodeIDs.unsafe_erase(nodeID); emit unignoredNode(nodeID); @@ -838,20 +839,21 @@ void NodeList::personalMuteNodeBySessionID(const QUuid& nodeID, bool muteEnabled // setup the packet auto personalMutePacket = NLPacket::create(PacketType::NodeIgnoreRequest, NUM_BYTES_RFC4122_UUID + sizeof(bool), true); + personalMutePacket->writePrimitive(muteEnabled); // write the node ID to the packet personalMutePacket->write(nodeID.toRfc4122()); - personalMutePacket->writePrimitive(muteEnabled); qCDebug(networking) << "Sending Personal Mute Packet to" << (muteEnabled ? "mute" : "unmute") << "node" << uuidStringWithoutCurlyBraces(nodeID); sendPacket(std::move(personalMutePacket), *audioMixer); - QReadLocker personalMutedSetLocker{ &_personalMutedSetLock }; // write lock for insert and unsafe_erase if (muteEnabled) { + QReadLocker personalMutedSetLocker{ &_personalMutedSetLock }; // read lock for insert // add this nodeID to our set of personal muted IDs _personalMutedNodeIDs.insert(nodeID); } else { + QWriteLocker personalMutedSetLocker{ &_personalMutedSetLock }; // write lock for unsafe_erase _personalMutedNodeIDs.unsafe_erase(nodeID); } } @@ -879,6 +881,9 @@ void NodeList::maybeSendIgnoreSetToNode(SharedNodePointer newNode) { // setup a packet list so we can send the stream of ignore IDs auto personalMutePacketList = NLPacketList::create(PacketType::NodeIgnoreRequest, QByteArray(), true); + // Force the "enabled" flag in this packet to true + personalMutePacketList->writePrimitive(true); + // enumerate the ignored IDs and write them to the packet list auto it = _personalMutedNodeIDs.cbegin(); while (it != _personalMutedNodeIDs.end()) { @@ -903,6 +908,9 @@ void NodeList::maybeSendIgnoreSetToNode(SharedNodePointer newNode) { // setup a packet list so we can send the stream of ignore IDs auto ignorePacketList = NLPacketList::create(PacketType::NodeIgnoreRequest, QByteArray(), true); + // Force the "enabled" flag in this packet to true + ignorePacketList->writePrimitive(true); + // enumerate the ignored IDs and write them to the packet list auto it = _ignoredNodeIDs.cbegin(); while (it != _ignoredNodeIDs.end()) { @@ -1008,7 +1016,7 @@ void NodeList::processUsernameFromIDReply(QSharedPointer messag } void NodeList::setRequestsDomainListData(bool isRequesting) { - // Tell the avatar mixer whether I want to receive any additional data to which I might be entitiled . + // Tell the avatar mixer whether I want to receive any additional data to which I might be entitled if (_requestsDomainListData == isRequesting) { return; } From 14def61eb8158147eb1087ed67d0e0044a604ab9 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Tue, 3 Jan 2017 17:32:47 -0800 Subject: [PATCH 35/45] More CR comments; 1 bug remaining re: sig slot --- interface/resources/fonts/hifi-glyphs.ttf | Bin 24428 -> 24436 bytes .../resources/qml/controls-uit/CheckBox.qml | 25 +++--- interface/resources/qml/hifi/Pal.qml | 82 +++++++++--------- interface/src/avatar/AvatarManager.cpp | 6 +- libraries/networking/src/NodeList.cpp | 4 +- libraries/networking/src/NodeList.h | 3 +- .../src/UsersScriptingInterface.cpp | 1 - .../src/UsersScriptingInterface.h | 3 +- scripts/system/pal.js | 8 +- 9 files changed, 68 insertions(+), 64 deletions(-) diff --git a/interface/resources/fonts/hifi-glyphs.ttf b/interface/resources/fonts/hifi-glyphs.ttf index 1c98f4e6f38fa3fd1516ee0b64d2dd36e6ab6d88..3dc3069ef562a2411b242bc5ad93e83162e6e5ac 100644 GIT binary patch delta 1395 zcmYk6U1*zC9LAsjdC&Wi@3cwZv}v+5Y5TtE(yydxlCB?HyY*vRx_+)}y1Fjg+Gbt5 z71rr`p_x!|h&S8Y$(Z17bl%8ND??-q5jR9cL>-8DA;Sw9Lnf$K+Df{Bo{RtUz~Kky zc{t}hxkrE8qdW+J4VNHbxUX+~@Iv-x4w#t);OpPl+lL#FfSDA4s-dx_*wEedFhGU< ziIYp&<<$Cj?*MEaVA_24{PNZo1Yo8afHJ?hI`_&${V5<`2gd4iv)NPTp3Z9kegcrl zGCOkK8tdQLF}q< z8EeK>Hk99mc66WIrO0iT}UE@1PM;KPQ+1<1~j4xt%xFq7L4F1M$wCLv>C^R*1!==BZDbS z;yE0{42~m<6F7-en8Rr-7#|7xo?Y!7oxAsR5A5AH*1!M2!RFyedT>71*VC0uB@Q1N zn(+ApvsJ+}i=pb8T1^kv?TptqG&Z$HV=W^`M|;QHj7sk1N2W7VMmJwGhPh(g=Uw>$ z>$3Hh^^t9d?Y4c?{)1!A@u4&Ayj^;+^oeWA^@-~@x8i=@eW$FkY@zIys;bNCXP$A- zjq*hKTNUn#zKYi?e)NXC3*Jw?k1Io!Cn~?L{M)Da+`cZ~oNwLt$e-}f`LFwb-SJ*v zD)4dDiK+*|UqTb1r`30Awc2mAVO4uc`$}Ka-wyl2;cz^BJiK04U-!nwbunAM@q6Hl zRG#B9uF)#x;6@UII9<3rl58hg@~Fv#uIY{2R*&nNEXh)}6k#FBPj1!IqPE0#kVkEa zB@>-YFKc3rq-)h$gtfM_STd3H#I@E&YSnbDz=CfUT4QqIlpbs~}!L6SsSurlUkjEPK8 zL_4;42^SpPBw9+epxZ5SE}GO-sU+FTZA3P6zhWoi-n?RB+}$2Yy-Bi(mvBbi+^qJJ z%($KVTrx3HG6#Y+HHsiIGSvX!Si==sr3J`vAc}r~WJ%ji302m$M1WLDk8gM7pa>Pa zQrju!`F~lu)QUgOr@qaQ)y*Ub0Mp0BSu!m;vmYOoA(#eGO0o`Gs)G_&~}qV!6Z6GChp~`6~>*( zI$gu7+Yh{u(1Hg=FT#SyMK8fZc0KJy#y718C#iJ<9ues z5k~`}Xh00jh$3k`%v34yhG;{qIhr&!GiQyZsrwQ_G(w{rsiW<*@$&S$%r0LzyL4e? S_LR6ijqps$`rlWxnf@1s&HXn3 delta 1439 zcmYL}No*5W9LB%*X7!B6@iLxq9B)~eiJh1@PU0klC4jR4*#jmCA;Ezp4s{?ZVHK@G z0*T&G2elEGR`h~6pq3!YA>vR0YEf@p)I&v4RaK~>>ZO&6R7B-qweRrWPfz+jz5geD z@6QM1#RF0R0ifUl7z}lH@9kf1c>Elg9s&^PNq2SQI(T3@0U$Cs+K?Pv>l*^d7=X;- z#q3fhck3ZQuL0DU&z@L%{Td7~T?;^*&!3%p_w3w<0Jj2+Msl;+BR1!(7r>7IQn}o0 zAcn4`;{jAG-&zYemsw_RJEVkSTz)6(4jgyEywt zYApkd-3Q3(((x0^uO5E%12Bo;QH5&MU;_-8s6`Yp)S(_JY(xVRXhbWT(2N$0;vn{-2N`r&hnSY|IHqs_ zlbFCX4k3#f9L5pMVh%aHg}il_F*`SJ*}84}j-9)^y7%qc)7PIIi4P1e9PLeawr^_N zKQufR2!`h)l~vU>8w|5H8mp^MZEQ$1wl+1lj2_(Elj*Q3SU)>Hbzsuk&R(*HSkZdK zZY?}k>Xo#TS8gaz9e&5HvVpR1oioncu3pzI&$8#ano;kmzj;~j+ul1`OqL6ZTS2evUsV8+!*P4>8sV&s>Hc-Pf z>X?=elGKZLt$MT3(rgqR-gtPmqSG4zNfAmp!UztrP{uN%=nz?{*5h`tE`?{QA}KCH z9Fj|98S3@e90KDBQ&F-2f4IV;f0nf@!3}MB~@P;)_{T@j;?$x>n5O zzo=5C*EAaFdR9!bwUBBhD``oS)3O>)%bJvy)bpy_sRRh8NQ%cPadw3zs@LXVL=TBj zp2`&r>lE#bO(PszLx?{usd8G@21+(7UQu*9LX6A4Pj(W*s6LqrdQY>jevR^s9AXAp zv)Ew}T*2zA;KMfS(U?&%@!op1i$luzs>B>*{9a-nGI4QKdE{}{IyB+63gg4BMkEkNJK{*L*EwbVG#;@vCgSb! zWTG);4Ne$Ve4^J{o_NfYVKRcM)y@MQL=jFNTRgcudxR_QtLG+fQY$gtX8-?Na@+p} DWX1v; diff --git a/interface/resources/qml/controls-uit/CheckBox.qml b/interface/resources/qml/controls-uit/CheckBox.qml index 9db4f621f9..d3cbb87e5b 100644 --- a/interface/resources/qml/controls-uit/CheckBox.qml +++ b/interface/resources/qml/controls-uit/CheckBox.qml @@ -51,19 +51,6 @@ Original.CheckBox { } } - Rectangle { - id: disabledOverlay - visible: !enabled - z: 100 - width: boxSize - height: boxSize - radius: boxRadius - border.width: 1 - border.color: hifi.colors.baseGrayHighlight - color: hifi.colors.baseGrayHighlight - opacity: 0.5 - } - Rectangle { visible: pressed || hovered anchors.centerIn: parent @@ -85,6 +72,18 @@ Original.CheckBox { border.color: hifi.colors.checkboxCheckedBorder visible: checked && !pressed || !checked && pressed } + + Rectangle { + id: disabledOverlay + visible: !enabled + width: boxSize + height: boxSize + radius: boxRadius + border.width: 1 + border.color: hifi.colors.baseGrayHighlight + color: hifi.colors.baseGrayHighlight + opacity: 0.5 + } } label: Label { diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 3c3cde7a67..2c3137c8a0 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -198,8 +198,8 @@ Item { id: nameCard // Properties displayName: styleData.value - userName: model ? model.userName : "" - audioLevel: model ? model.audioLevel : 0.0 + userName: model && model.userName + audioLevel: model && model.audioLevel visible: !isCheckBox && !isButton // Size width: nameCardWidth @@ -218,31 +218,24 @@ Item { id: actionCheckBox visible: isCheckBox anchors.centerIn: parent - checked: model ? model[styleData.role] : false + checked: model && model[styleData.role] // If this is a "personal mute" checkbox, and the model is valid, Check the checkbox if the Ignore // checkbox is checked. - enabled: styleData.role === "personalMute" ? ((model ? model["ignore"] : false) === true ? false : true) : true + enabled: styleData.role === "personalMute" ? ((model && model["ignore"]) === true ? false : true) : true boxSize: 24 onClicked: { var newValue = !model[styleData.role] - if (newValue === undefined) { - newValue = false - } userModel.setProperty(model.userIndex, styleData.role, newValue) userModelData[model.userIndex][styleData.role] = newValue // Defensive programming - if (styleData.role === "personalMute" || styleData.role === "ignore") { - Users[styleData.role](model.sessionId, newValue) - if (styleData.role === "ignore") { - userModel.setProperty(model.userIndex, "personalMute", newValue) - userModelData[model.userIndex]["personalMute"] = newValue // Defensive programming - if (newValue) { - ignored[model.sessionId] = userModelData[model.userIndex] - } else { - delete ignored[model.sessionId] - } + Users[styleData.role](model.sessionId, newValue) + if (styleData.role === "ignore") { + userModel.setProperty(model.userIndex, "personalMute", newValue) + userModelData[model.userIndex]["personalMute"] = newValue // Defensive programming + if (newValue) { + ignored[model.sessionId] = userModelData[model.userIndex] + } else { + delete ignored[model.sessionId] } - } else { - console.log("User clicked on an unknown checkbox."); } // http://doc.qt.io/qt-5/qtqml-syntax-propertybinding.html#creating-property-bindings-from-javascript // I'm using an explicit binding here because clicking a checkbox breaks the implicit binding as set by @@ -257,21 +250,29 @@ Item { color: 2 // Red visible: isButton anchors.centerIn: parent - width: 24 + width: 32 height: 24 onClicked: { - if (styleData.role === "mute" || styleData.role === "kick") { - Users[styleData.role](model.sessionId) - if (styleData.role === "kick") { - // Just for now, while we cannot undo "Ban": - userModel.remove(model.userIndex) - delete userModelData[model.userIndex] // Defensive programming - sortModel() - } - } else { - console.log("User clicked on an unknown checkbox."); + Users[styleData.role](model.sessionId) + if (styleData.role === "kick") { + // Just for now, while we cannot undo "Ban": + userModel.remove(model.userIndex) + delete userModelData[model.userIndex] // Defensive programming + sortModel() } } + // muted/error glyphs + HiFiGlyphs { + text: (styleData.role === "kick") ? hifi.glyphs.error : hifi.glyphs.muted + // Size + size: parent.height*1.3 + // Anchors + anchors.fill: parent + // Style + horizontalAlignment: Text.AlignHCenter + color: enabled ? hifi.buttons.textColor[actionButton.color] + : hifi.buttons.disabledTextColor[actionButton.colorScheme] + } } } } @@ -374,8 +375,8 @@ Item { FiraSansSemiBold { id: popupText text: "Bold names in the list are Avatar Display Names.\n" + - "If a Display Name isn't set, a unique Session Display Name is assigned to them." + - "\n\nAdministrators of this domain can also see the Username or Machine ID associated with each present avatar." + "If a Display Name isn't set, a unique Session Display Name is assigned." + + "\n\nAdministrators of this domain can also see the Username or Machine ID associated with each avatar present." size: hifi.fontSizes.textFieldInput color: hifi.colors.darkGray horizontalAlignment: Text.AlignHCenter @@ -431,13 +432,11 @@ Item { var sessionId = message.params[0]; var selected = message.params[1]; var userIndex = findSessionIndex(sessionId); - if (userIndex != -1) { - if (selected) { - table.selection.clear(); // for now, no multi-select - table.selection.select(userIndex); - } else { - table.selection.deselect(userIndex); - } + if (selected) { + table.selection.clear(); // for now, no multi-select + table.selection.select(userIndex); + } else { + table.selection.deselect(userIndex); } break; // Received an "updateUsername()" request from the JS @@ -457,6 +456,8 @@ Item { // Set the userName appropriately userModel.setProperty(userIndex, "userName", userName); userModelData[userIndex].userName = userName; // Defensive programming + } else { + console.log("updateUsername() called with unknown UUID: ", userId); } } break; @@ -472,6 +473,8 @@ Item { if (userIndex != -1) { userModel.setProperty(userIndex, "audioLevel", audioLevel); userModelData[userIndex].audioLevel = audioLevel; // Defensive programming + } else { + console.log("updateUsername() called with unknown UUID: ", userId); } } } @@ -505,7 +508,6 @@ Item { ['personalMute', 'ignore', 'mute', 'kick'].forEach(init); datum.userIndex = userIndex++; userModel.append(datum); - console.log('appending to userModel:', JSON.stringify(datum)); }); } signal sendToScript(var message); diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index c534e9b499..e3ccc10a65 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -82,7 +82,11 @@ AvatarManager::AvatarManager(QObject* parent) : // when we hear that the user has ignored an avatar by session UUID // immediately remove that avatar instead of waiting for the absence of packets from avatar mixer - connect(nodeList.data(), "ignoredNode", this, "removeAvatar"); + connect(nodeList.data(), &NodeList::ignoredNode, this, [=](const QUuid& nodeID, bool enabled) { + if (enabled) { + removeAvatar(nodeID); + } + }); } AvatarManager::~AvatarManager() { diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 64f0479a51..d0281d0029 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -808,13 +808,13 @@ void NodeList::ignoreNodeBySessionID(const QUuid& nodeID, bool ignoreEnabled) { _ignoredNodeIDs.insert(nodeID); // add this nodeID to our set of personal muted IDs _personalMutedNodeIDs.insert(nodeID); - emit ignoredNode(nodeID); + emit ignoredNode(nodeID, true); } else { QWriteLocker ignoredSetLocker{ &_ignoredSetLock }; // write lock for unsafe_erase QWriteLocker personalMutedSetLocker{ &_personalMutedSetLock }; // write lock for unsafe_erase _ignoredNodeIDs.unsafe_erase(nodeID); _personalMutedNodeIDs.unsafe_erase(nodeID); - emit unignoredNode(nodeID); + emit ignoredNode(nodeID, false); } } else { diff --git a/libraries/networking/src/NodeList.h b/libraries/networking/src/NodeList.h index ba19f56f9f..75958f1847 100644 --- a/libraries/networking/src/NodeList.h +++ b/libraries/networking/src/NodeList.h @@ -113,8 +113,7 @@ public slots: signals: void limitOfSilentDomainCheckInsReached(); void receivedDomainServerList(); - void ignoredNode(const QUuid& nodeID); - void unignoredNode(const QUuid& nodeID); + void ignoredNode(const QUuid& nodeID, bool enabled); void ignoreRadiusEnabledChanged(bool isIgnored); void usernameFromIDReply(const QString& nodeID, const QString& username, const QString& machineFingerprint); diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index 58680b944d..81ed0c9c63 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -20,7 +20,6 @@ UsersScriptingInterface::UsersScriptingInterface() { connect(nodeList.data(), &NodeList::ignoreRadiusEnabledChanged, this, &UsersScriptingInterface::ignoreRadiusEnabledChanged); connect(nodeList.data(), &NodeList::usernameFromIDReply, this, &UsersScriptingInterface::usernameFromIDReply); connect(nodeList.data(), &NodeList::ignoredNode, this, &UsersScriptingInterface::ignoredNode); - connect(nodeList.data(), &NodeList::unignoredNode, this, &UsersScriptingInterface::unignoredNode); } void UsersScriptingInterface::ignore(const QUuid& nodeID, bool ignoreEnabled) { diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index 223ddb879b..06f1fb6fae 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -117,8 +117,7 @@ public slots: signals: void canKickChanged(bool canKick); void ignoreRadiusEnabledChanged(bool isEnabled); - void ignoredNode(const QUuid& nodeID); - void unignoredNode(const QUuid& nodeID); + void ignoredNode(const QUuid& nodeID, bool enabled); /**jsdoc * Notifies scripts that another user has entered the ignore radius diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 2bc016dd06..d61c75099f 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -333,9 +333,11 @@ pal.visibleChanged.connect(onVisibleChanged); pal.closed.connect(off); Users.usernameFromIDReply.connect(usernameFromIDReply); -function onIgnore(sessionId) { // make it go away in the usual way, since we'll still get data keeping it live - // Why doesn't this work from .qml? (crashes) - AvatarList.getAvatar(sessionId).setShouldDie(); +function onIgnore(sessionId, enabled) { // make it go away in the usual way, since we'll still get data keeping it live + if (enabled) { + // Why doesn't this work from .qml? (crashes) + AvatarList.getAvatar(sessionId).setShouldDie(); + } } Users.ignoredNode.connect(onIgnore); From c79c489002139c5a24e2674f518a29968f30d97b Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 4 Jan 2017 11:19:32 -0800 Subject: [PATCH 36/45] selecting user in pal shows entities lastEditedBy user this session --- scripts/system/pal.js | 77 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 9 deletions(-) diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 9c23e1f775..9a6be03da3 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -1,6 +1,6 @@ "use strict"; /*jslint vars: true, plusplus: true, forin: true*/ -/*globals Script, AvatarList, Camera, Overlays, OverlayWindow, Toolbars, Vec3, Quat, Controller, print, getControllerWorldLocation */ +/*globals Script, AvatarList, Users, Entities, MyAvatar, Camera, Overlays, OverlayWindow, Toolbars, Vec3, Quat, Controller, print, getControllerWorldLocation */ // // pal.js // @@ -48,7 +48,7 @@ ExtendedOverlay.prototype.select = function (selected) { var selectedIds = []; ExtendedOverlay.isSelected = function (id) { return -1 !== selectedIds.indexOf(id); -} +}; ExtendedOverlay.get = function (key) { // answer the extended overlay data object associated with the given avatar identifier return overlays[key]; }; @@ -73,6 +73,45 @@ ExtendedOverlay.applyPickRay = function (pickRay, cb) { // cb(overlay) on the on }); }; + +// +// Similar, for entities +// +function HighlightedEntity(id, entityProperties) { + this.id = id; + this.overlay = Overlays.addOverlay('cube', { + position: entityProperties.position, + rotation: entityProperties.rotation, + dimensions: entityProperties.dimensions, + solid: false, + color: { + red: 255, + green: 0, + blue: 0 + }, + lineWidth: 1.0, + ignoreRayIntersection: true + }); + HighlightedEntity.overlays.push(this); +} +HighlightedEntity.overlays = []; +HighlightedEntity.clearOverlays = function clearHighlightedEntities() { + HighlightedEntity.overlays.forEach(function (highlighted) { + Overlays.deleteOverlay(highlighted.overlay); + }); + HighlightedEntity.overlays = []; +}; +HighlightedEntity.updateOverlays = function updateHighlightedEntities() { + HighlightedEntity.overlays.forEach(function (highlighted) { + var properties = Entities.getEntityProperties(highlighted.id, ['position', 'rotation', 'dimensions']); + Overlays.editOverlay(highlighted.overlay, { + position: properties.position, + rotation: properties.rotation, + dimensions: properties.dimensions + }); + }); +}; + // // The qml window and communications. // @@ -93,6 +132,25 @@ pal.fromQml.connect(function (message) { // messages are {method, params}, like var selected = ExtendedOverlay.isSelected(id); overlay.select(selected); }); + + HighlightedEntity.clearOverlays(); + if (selectedIds.length) { + Entities.findEntitiesInFrustum(Camera.frustum).forEach(function (id) { + // Because lastEditedBy is per session, the vast majority of entities won't match, + // so it would probably be worth reducing marshalling costs by asking for just we need. + // However, providing property name(s) is advisory and some additional properties are + // included anyway. As it turns out, asking for 'lastEditedBy' gives 'position', 'rotation', + // and 'dimensions', too, so we might as well make use of them instead of making a second + // getEntityProperties call. + // It would be nice if we could harden this against future changes by specifying all + // and only these four in an array, but see + // https://highfidelity.fogbugz.com/f/cases/2728/Entities-getEntityProperties-id-lastEditedBy-name-lastEditedBy-doesn-t-work + var properties = Entities.getEntityProperties(id, 'lastEditedBy'); + if (ExtendedOverlay.isSelected(properties.lastEditedBy)) { + new HighlightedEntity(id, properties); + } + }); + } break; case 'refresh': removeOverlays(); @@ -117,7 +175,6 @@ function addAvatarNode(id) { } function populateUserList() { var data = []; - var counter = 1; AvatarList.getAvatarIdentifiers().sort().forEach(function (id) { // sorting the identifiers is just an aid for debugging var avatar = AvatarList.getAvatar(id); var avatarPalDatum = { @@ -147,7 +204,7 @@ function usernameFromIDReply(id, username, machineFingerprint) { // If the ID we've received is our ID... if (MyAvatar.sessionUUID === id) { // Set the data to contain specific strings. - data = ['', username] + data = ['', username]; } else { // Set the data to contain the ID and the username (if we have one) // or fingerprint (if we don't have a username) string. @@ -186,9 +243,11 @@ function updateOverlays() { } }); // We could re-populateUserList if anything added or removed, but not for now. + HighlightedEntity.updateOverlays(); } function removeOverlays() { selectedIds = []; + HighlightedEntity.clearOverlays(); ExtendedOverlay.some(function (overlay) { overlay.deleteOverlay(); }); } @@ -267,7 +326,7 @@ function onClicked() { pal.setVisible(!pal.visible); } -var AVERAGING_RATIO = 0.05 +var AVERAGING_RATIO = 0.05; var LOUDNESS_FLOOR = 11.0; var LOUDNESS_SCALE = 2.8 / 5.0; var LOG2 = Math.log(2.0); @@ -282,12 +341,12 @@ function getAudioLevel(id) { var audioLevel = 0.0; // we will do exponential moving average by taking some the last loudness and averaging - accumulatedLevels[id] = AVERAGING_RATIO * (accumulatedLevels[id] || 0 ) + (1 - AVERAGING_RATIO) * (avatar.audioLoudness); - + accumulatedLevels[id] = AVERAGING_RATIO * (accumulatedLevels[id] || 0) + (1 - AVERAGING_RATIO) * (avatar.audioLoudness); + // add 1 to insure we don't go log() and hit -infinity. Math.log is // natural log, so to get log base 2, just divide by ln(2). var logLevel = Math.log(accumulatedLevels[id] + 1) / LOG2; - + if (logLevel <= LOUDNESS_FLOOR) { audioLevel = logLevel / LOUDNESS_FLOOR * LOUDNESS_SCALE; } else { @@ -309,7 +368,7 @@ Script.setInterval(function () { var level = getAudioLevel(id); // qml didn't like an object with null/empty string for a key, so... var userId = id || 0; - param[userId]= level; + param[userId] = level; }); pal.sendToQml({method: 'updateAudioLevel', params: param}); } From 56a25dfdeeeeaabfac5c8c1dedeb84012904b51d Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 4 Jan 2017 11:56:24 -0800 Subject: [PATCH 37/45] Check setting value changed --- interface/src/Application.cpp | 1 + libraries/shared/src/SettingHandle.cpp | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b58bedb363..832419a75c 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1137,6 +1137,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo _settingsTimer.moveToThread(&_settingsThread); _settingsTimer.setSingleShot(false); _settingsTimer.setInterval(SAVE_SETTINGS_INTERVAL); // 10s, Qt::CoarseTimer acceptable + _settingsThread.setPriority(QThread::LowestPriority); _settingsThread.start(); if (Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson)) { diff --git a/libraries/shared/src/SettingHandle.cpp b/libraries/shared/src/SettingHandle.cpp index 626d7e7ef5..a04a7c3f61 100644 --- a/libraries/shared/src/SettingHandle.cpp +++ b/libraries/shared/src/SettingHandle.cpp @@ -74,7 +74,9 @@ void Settings::endGroup() { } void Settings::setValue(const QString& name, const QVariant& value) { - _manager->setValue(name, value); + if (_manager->value(name) != value) { + _manager->setValue(name, value); + } } QVariant Settings::value(const QString& name, const QVariant& defaultValue) const { From dde5f69ac9ff44505b50c397b77be4a8376b70b7 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 4 Jan 2017 12:41:30 -0800 Subject: [PATCH 38/45] More CR & simplifications --- interface/resources/qml/hifi/Pal.qml | 11 +++++------ .../script-engine/src/UsersScriptingInterface.cpp | 1 - libraries/script-engine/src/UsersScriptingInterface.h | 1 - scripts/system/pal.js | 9 --------- 4 files changed, 5 insertions(+), 17 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 2c3137c8a0..c9adb03d24 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -218,10 +218,9 @@ Item { id: actionCheckBox visible: isCheckBox anchors.centerIn: parent - checked: model && model[styleData.role] - // If this is a "personal mute" checkbox, and the model is valid, Check the checkbox if the Ignore - // checkbox is checked. - enabled: styleData.role === "personalMute" ? ((model && model["ignore"]) === true ? false : true) : true + checked: model[styleData.role] + // If this is a "Personal Mute" checkbox, disable the checkbox if the "Ignore" checkbox is checked. + enabled: !(styleData.role === "personalMute" && model["ignore"]) boxSize: 24 onClicked: { var newValue = !model[styleData.role] @@ -239,8 +238,8 @@ Item { } // http://doc.qt.io/qt-5/qtqml-syntax-propertybinding.html#creating-property-bindings-from-javascript // I'm using an explicit binding here because clicking a checkbox breaks the implicit binding as set by - // "checked: model[styleData.role]" above. - checked = Qt.binding(function() { return (model && model[styleData.role]) ? model[styleData.role] : false}) + // "checked:" statement above. + checked = Qt.binding(function() { return (model[styleData.role])}) } } diff --git a/libraries/script-engine/src/UsersScriptingInterface.cpp b/libraries/script-engine/src/UsersScriptingInterface.cpp index 81ed0c9c63..d0ad699846 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.cpp +++ b/libraries/script-engine/src/UsersScriptingInterface.cpp @@ -19,7 +19,6 @@ UsersScriptingInterface::UsersScriptingInterface() { connect(nodeList.data(), &LimitedNodeList::canKickChanged, this, &UsersScriptingInterface::canKickChanged); connect(nodeList.data(), &NodeList::ignoreRadiusEnabledChanged, this, &UsersScriptingInterface::ignoreRadiusEnabledChanged); connect(nodeList.data(), &NodeList::usernameFromIDReply, this, &UsersScriptingInterface::usernameFromIDReply); - connect(nodeList.data(), &NodeList::ignoredNode, this, &UsersScriptingInterface::ignoredNode); } void UsersScriptingInterface::ignore(const QUuid& nodeID, bool ignoreEnabled) { diff --git a/libraries/script-engine/src/UsersScriptingInterface.h b/libraries/script-engine/src/UsersScriptingInterface.h index 06f1fb6fae..4182d5244c 100644 --- a/libraries/script-engine/src/UsersScriptingInterface.h +++ b/libraries/script-engine/src/UsersScriptingInterface.h @@ -117,7 +117,6 @@ public slots: signals: void canKickChanged(bool canKick); void ignoreRadiusEnabledChanged(bool isEnabled); - void ignoredNode(const QUuid& nodeID, bool enabled); /**jsdoc * Notifies scripts that another user has entered the ignore radius diff --git a/scripts/system/pal.js b/scripts/system/pal.js index d61c75099f..378d62c69c 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -333,14 +333,6 @@ pal.visibleChanged.connect(onVisibleChanged); pal.closed.connect(off); Users.usernameFromIDReply.connect(usernameFromIDReply); -function onIgnore(sessionId, enabled) { // make it go away in the usual way, since we'll still get data keeping it live - if (enabled) { - // Why doesn't this work from .qml? (crashes) - AvatarList.getAvatar(sessionId).setShouldDie(); - } -} -Users.ignoredNode.connect(onIgnore); - // // Cleanup. // @@ -350,7 +342,6 @@ Script.scriptEnding.connect(function () { pal.visibleChanged.disconnect(onVisibleChanged); pal.closed.disconnect(off); Users.usernameFromIDReply.disconnect(usernameFromIDReply); - Users.ignoredNode.disconnect(onIgnore); off(); }); From 3f2fdd1915642331998700711476508f837ddf8a Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 4 Jan 2017 13:20:49 -0800 Subject: [PATCH 39/45] Expose dropped frames count to stats UI --- interface/resources/qml/Stats.qml | 4 ++++ interface/src/ui/Stats.cpp | 2 ++ interface/src/ui/Stats.h | 3 +++ 3 files changed, 9 insertions(+) diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index 6be114694d..895055618b 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -79,6 +79,10 @@ Item { StatText { text: "Avatar Simrate: " + root.avatarSimrate } + StatText { + text: "Missed Frame Count: " + root.appdropped; + visible: root.appdropped > 0; + } StatText { text: "Packets In/Out: " + root.packetInCount + "/" + root.packetOutCount } diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 07a99d9991..95f31283d0 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -125,6 +125,8 @@ void Stats::updateStats(bool force) { STAT_UPDATE(framerate, qApp->getFps()); if (qApp->getActiveDisplayPlugin()) { auto displayPlugin = qApp->getActiveDisplayPlugin(); + auto stats = displayPlugin->getHardwareStats(); + STAT_UPDATE(appdropped, stats["app_dropped_frame_count"].toInt()); STAT_UPDATE(renderrate, displayPlugin->renderRate()); STAT_UPDATE(presentrate, displayPlugin->presentRate()); STAT_UPDATE(presentnewrate, displayPlugin->newFramePresentRate()); diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index 79d522b44e..f0bd1f8ab7 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -39,6 +39,8 @@ class Stats : public QQuickItem { // How often the display device reprojecting old frames STATS_PROPERTY(float, stutterrate, 0) + STATS_PROPERTY(int, appdropped, 0) + STATS_PROPERTY(float, presentnewrate, 0) STATS_PROPERTY(float, presentdroprate, 0) STATS_PROPERTY(int, simrate, 0) @@ -135,6 +137,7 @@ public slots: void forceUpdateStats() { updateStats(true); } signals: + void appdroppedChanged(); void framerateChanged(); void expandedChanged(); void timingExpandedChanged(); From c6958780255a5aec42b4385f4f9f4e30a804a7c1 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 4 Jan 2017 13:31:16 -0800 Subject: [PATCH 40/45] Clear local ignored list upon domain change --- interface/resources/qml/hifi/Pal.qml | 4 +++- scripts/system/pal.js | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index c9adb03d24..565809762e 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -42,7 +42,6 @@ Item { property int actionButtonWidth: 75 property int nameCardWidth: width - actionButtonWidth*(iAmAdmin ? 4 : 2) - 4 property var myData: ({displayName: "", userName: "", audioLevel: 0.0}) // valid dummy until set - // FIXME: Need to determine & handle when this list gets reset. property var ignored: ({}); // Keep a local list of ignored avatars & their data. Necessary because HashMap is slow to respond after ignoring. property var userModelData: [] // This simple list is essentially a mirror of the userModel listModel without all the extra complexities. property bool iAmAdmin: false @@ -478,6 +477,9 @@ Item { } } break; + case 'clearIgnored': + ignored = ({}); + break; default: console.log('Unrecognized message:', JSON.stringify(message)); } diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 378d62c69c..505c1840da 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -332,6 +332,13 @@ button.clicked.connect(onClicked); pal.visibleChanged.connect(onVisibleChanged); pal.closed.connect(off); Users.usernameFromIDReply.connect(usernameFromIDReply); +function clearIgnoredInQMLAndRefreshPAL() { + pal.sendToQml({ method: 'clearIgnored' }); + removeOverlays(); + populateUserList(); +} +Window.domainChanged.connect(clearIgnoredInQMLAndRefreshPAL); +Window.domainConnectionRefused.connect(clearIgnoredInQMLAndRefreshPAL); // // Cleanup. @@ -342,6 +349,8 @@ Script.scriptEnding.connect(function () { pal.visibleChanged.disconnect(onVisibleChanged); pal.closed.disconnect(off); Users.usernameFromIDReply.disconnect(usernameFromIDReply); + Window.domainChanged.disconnect(clearIgnoredInQMLAndRefreshPAL); + Window.domainConnectionRefused.disconnect(clearIgnoredInQMLAndRefreshPAL); off(); }); From 03fbfc85f953274e9d480f11fd1b3714e48772bc Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 4 Jan 2017 13:50:37 -0800 Subject: [PATCH 41/45] Short delay before populating PAL when changing domains --- scripts/system/pal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 505c1840da..bc9784fb17 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -335,7 +335,7 @@ Users.usernameFromIDReply.connect(usernameFromIDReply); function clearIgnoredInQMLAndRefreshPAL() { pal.sendToQml({ method: 'clearIgnored' }); removeOverlays(); - populateUserList(); + Script.setTimeout(populateUserList, 200); // Short delay before populating the PAL to allow the HashMap to populate } Window.domainChanged.connect(clearIgnoredInQMLAndRefreshPAL); Window.domainConnectionRefused.connect(clearIgnoredInQMLAndRefreshPAL); From ac41e8abc41cf453ed4f469686695324775cbe13 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 4 Jan 2017 14:06:51 -0800 Subject: [PATCH 42/45] Bugfix re: population; remove user image for now --- interface/resources/qml/hifi/NameCard.qml | 4 +++- scripts/system/pal.js | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/hifi/NameCard.qml b/interface/resources/qml/hifi/NameCard.qml index 9b90ae6c3b..0ad8bfd57e 100644 --- a/interface/resources/qml/hifi/NameCard.qml +++ b/interface/resources/qml/hifi/NameCard.qml @@ -35,6 +35,7 @@ Row { property int usernameTextHeight: 12 property real audioLevel: 0.0 + /* User image commented out for now - will probably be re-introduced later. Column { id: avatarImage // Size @@ -48,10 +49,11 @@ Row { height: parent.height } } + */ Column { id: textContainer // Size - width: parent.width - avatarImage.width - parent.anchors.leftMargin - parent.anchors.rightMargin - parent.spacing + width: parent.width - /*avatarImage.width - */parent.anchors.leftMargin - parent.anchors.rightMargin - parent.spacing height: contentHeight // DisplayName Text diff --git a/scripts/system/pal.js b/scripts/system/pal.js index bc9784fb17..8d7422109c 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -334,8 +334,10 @@ pal.closed.connect(off); Users.usernameFromIDReply.connect(usernameFromIDReply); function clearIgnoredInQMLAndRefreshPAL() { pal.sendToQml({ method: 'clearIgnored' }); - removeOverlays(); - Script.setTimeout(populateUserList, 200); // Short delay before populating the PAL to allow the HashMap to populate + if (pal.visible) { + removeOverlays(); + Script.setTimeout(populateUserList, 200); // Short delay before populating the PAL to allow the HashMap to populate + } } Window.domainChanged.connect(clearIgnoredInQMLAndRefreshPAL); Window.domainConnectionRefused.connect(clearIgnoredInQMLAndRefreshPAL); From 675159be45bdf617dcaaeff7f7afd8ae1b170c64 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 4 Jan 2017 14:33:02 -0800 Subject: [PATCH 43/45] Last commit to fix final bugs --- interface/resources/qml/hifi/Pal.qml | 2 +- scripts/system/pal.js | 13 ++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/interface/resources/qml/hifi/Pal.qml b/interface/resources/qml/hifi/Pal.qml index 565809762e..833cf4efe2 100644 --- a/interface/resources/qml/hifi/Pal.qml +++ b/interface/resources/qml/hifi/Pal.qml @@ -478,7 +478,7 @@ Item { } break; case 'clearIgnored': - ignored = ({}); + ignored = {}; break; default: console.log('Unrecognized message:', JSON.stringify(message)); diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 8d7422109c..5eb35c2595 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -332,15 +332,14 @@ button.clicked.connect(onClicked); pal.visibleChanged.connect(onVisibleChanged); pal.closed.connect(off); Users.usernameFromIDReply.connect(usernameFromIDReply); -function clearIgnoredInQMLAndRefreshPAL() { +function clearIgnoredInQMLAndClosePAL() { pal.sendToQml({ method: 'clearIgnored' }); if (pal.visible) { - removeOverlays(); - Script.setTimeout(populateUserList, 200); // Short delay before populating the PAL to allow the HashMap to populate + onClicked(); // Close the PAL } } -Window.domainChanged.connect(clearIgnoredInQMLAndRefreshPAL); -Window.domainConnectionRefused.connect(clearIgnoredInQMLAndRefreshPAL); +Window.domainChanged.connect(clearIgnoredInQMLAndClosePAL); +Window.domainConnectionRefused.connect(clearIgnoredInQMLAndClosePAL); // // Cleanup. @@ -351,8 +350,8 @@ Script.scriptEnding.connect(function () { pal.visibleChanged.disconnect(onVisibleChanged); pal.closed.disconnect(off); Users.usernameFromIDReply.disconnect(usernameFromIDReply); - Window.domainChanged.disconnect(clearIgnoredInQMLAndRefreshPAL); - Window.domainConnectionRefused.disconnect(clearIgnoredInQMLAndRefreshPAL); + Window.domainChanged.disconnect(clearIgnoredInQMLAndClosePAL); + Window.domainConnectionRefused.disconnect(clearIgnoredInQMLAndClosePAL); off(); }); From e80ae92327ac230771d9d2763a7d653924abc72c Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Wed, 4 Jan 2017 15:06:18 -0800 Subject: [PATCH 44/45] Also clear personalmutedlist upon reset() --- libraries/networking/src/NodeList.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp index 27d9aa4572..bd3203150e 100644 --- a/libraries/networking/src/NodeList.cpp +++ b/libraries/networking/src/NodeList.cpp @@ -242,6 +242,10 @@ void NodeList::reset() { _ignoredSetLock.lockForWrite(); _ignoredNodeIDs.clear(); _ignoredSetLock.unlock(); + // lock and clear our set of personally muted IDs + _personalMutedSetLock.lockForWrite(); + _personalMutedNodeIDs.clear(); + _personalMutedSetLock.unlock(); // refresh the owner UUID to the NULL UUID setSessionUUID(QUuid()); From 97780ac97e4f0b62da024943538a501f3a4541ce Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 4 Jan 2017 16:09:15 -0800 Subject: [PATCH 45/45] color, infront --- scripts/system/pal.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/system/pal.js b/scripts/system/pal.js index 45ae6fc9d5..e727f9a1e3 100644 --- a/scripts/system/pal.js +++ b/scripts/system/pal.js @@ -85,12 +85,13 @@ function HighlightedEntity(id, entityProperties) { dimensions: entityProperties.dimensions, solid: false, color: { - red: 255, - green: 0, - blue: 0 + red: 0xF3, + green: 0x91, + blue: 0x29 }, lineWidth: 1.0, - ignoreRayIntersection: true + ignoreRayIntersection: true, + drawInFront: true }); HighlightedEntity.overlays.push(this); }

;L>03w0E3`gA80riXJc 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 literal 121979 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� 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