From 2f7e346f6ac26f0a97ca49ed338c15f694fcdd8c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sun, 2 Oct 2016 22:14:33 -0700 Subject: [PATCH 001/300] Update entity scripting interface to allow modifications to unknown entities --- libraries/entities/src/EntityScriptingInterface.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index fe7fccaece..6d15e1da65 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -386,10 +386,6 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& } }); - if (!updatedEntity) { - return QUuid(); - } - _entityTree->withReadLock([&] { EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); if (entity) { From c0c060ef40891113507bdd991fc8db5e101bdf8e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sat, 9 Jul 2016 02:51:51 -0700 Subject: [PATCH 002/300] Add FIXME comment to change to allow uknown enity edits --- libraries/entities/src/EntityScriptingInterface.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 6d15e1da65..4c3e365ac7 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -386,6 +386,15 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& } }); + // FIXME: We need to figure out a better way to handle this. Allowing these edits to go through potentially + // breaks avatar energy and entities that are parented. + // + // To handle cases where a script needs to edit an entity with a _known_ entity id but doesn't exist + // in the local entity tree, we need to allow those edits to go through to the server. + // if (!updatedEntity) { + // return QUuid(); + // } + _entityTree->withReadLock([&] { EntityItemPointer entity = _entityTree->findEntityByEntityItemID(entityID); if (entity) { From 667a737018b1cf0f75d52c01b51b0e21c7c8e029 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 26 Sep 2016 15:37:51 -0700 Subject: [PATCH 003/300] Fix ScriptEngine not properly resolving paths --- libraries/script-engine/src/ScriptEngine.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 160ad77197..1919da81e4 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -1091,14 +1092,19 @@ QUrl ScriptEngine::resolvePath(const QString& include) const { return expandScriptUrl(url); } + QScriptContextInfo contextInfo { currentContext()->parentContext() }; + // we apparently weren't a fully qualified url, so, let's assume we're relative // to the original URL of our script - QUrl parentURL; - if (_parentURL.isEmpty()) { - parentURL = QUrl(_fileNameString); - } else { - parentURL = QUrl(_parentURL); + QUrl parentURL = contextInfo.fileName(); + if (parentURL.isEmpty()) { + if (_parentURL.isEmpty()) { + parentURL = QUrl(_fileNameString); + } else { + parentURL = QUrl(_parentURL); + } } + // if the parent URL's scheme is empty, then this is probably a local file... if (parentURL.scheme().isEmpty()) { parentURL = QUrl::fromLocalFile(_fileNameString); From e3be3331449c169b4bb0c8e614795f840da9b61b Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 26 Sep 2016 16:20:08 -0700 Subject: [PATCH 004/300] Remove 'EntityID' from entity script filename --- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 1919da81e4..1f91a8382d 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1329,7 +1329,7 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co auto scriptCache = DependencyManager::get(); bool isFileUrl = isURL && scriptOrURL.startsWith("file://"); - auto fileName = QString("(EntityID:%1, %2)").arg(entityID.toString(), isURL ? scriptOrURL : "EmbededEntityScript"); + auto fileName = isURL ? scriptOrURL : "EmbeddedEntityScript"; QScriptProgram program(contents, fileName); if (!hasCorrectSyntax(program)) { From 8e3f4b705f26e45593c313995882033a2e26c6e0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sat, 9 Jul 2016 03:57:29 -0700 Subject: [PATCH 005/300] Add entity url back into entity script filenames --- libraries/script-engine/src/ScriptEngine.cpp | 23 ++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 1f91a8382d..93d9ed2190 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1096,7 +1096,7 @@ QUrl ScriptEngine::resolvePath(const QString& include) const { // we apparently weren't a fully qualified url, so, let's assume we're relative // to the original URL of our script - QUrl parentURL = contextInfo.fileName(); + QUrl parentURL = extractUrlFromEntityUrl(contextInfo.fileName()); if (parentURL.isEmpty()) { if (_parentURL.isEmpty()) { parentURL = QUrl(_fileNameString); @@ -1303,6 +1303,25 @@ void ScriptEngine::loadEntityScript(QWeakPointer theEngine, const }, forceRedownload); } +// The purpose of the following two function is to embed entity ids into entity script filenames +// so that they show up in stacktraces +// +// Extract the url portion of a url that has been encoded with encodeEntityIdIntoEntityUrl(...) +QString extractUrlFromEntityUrl(QString url) { + auto parts = url.split(' ', QString::SkipEmptyParts); + if (parts.length() > 0) { + return parts[0]; + } else { + return ""; + } +} + +// Encode an entity id into an entity url +// Example: http://www.example.com/some/path.js [EntityID:{9fdd355f-d226-4887-9484-44432d29520e}] +QString encodeEntityIdIntoEntityUrl(QString url, QString entityID) { + return url + " [EntityID:" + entityID + "]"; +} + // since all of these operations can be asynch we will always do the actual work in the response handler // for the download void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, const QString& scriptOrURL, const QString& contents, bool isURL, bool success) { @@ -1329,7 +1348,7 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co auto scriptCache = DependencyManager::get(); bool isFileUrl = isURL && scriptOrURL.startsWith("file://"); - auto fileName = isURL ? scriptOrURL : "EmbeddedEntityScript"; + auto fileName = isURL ? encodeEntityIdIntoEntityUrl(scriptOrURL, entityID) : "EmbeddedEntityScript"; QScriptProgram program(contents, fileName); if (!hasCorrectSyntax(program)) { From ac888733f5b3d1f2f96f03cf18d852e28bcbf56a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sun, 2 Oct 2016 21:18:33 -0700 Subject: [PATCH 006/300] Add setMapping to AssetScriptingInterface --- .../src/AssetScriptingInterface.cpp | 17 ++++++++++++++++- .../script-engine/src/AssetScriptingInterface.h | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libraries/script-engine/src/AssetScriptingInterface.cpp b/libraries/script-engine/src/AssetScriptingInterface.cpp index 80cd30a8b6..f3944f3ea7 100644 --- a/libraries/script-engine/src/AssetScriptingInterface.cpp +++ b/libraries/script-engine/src/AssetScriptingInterface.cpp @@ -31,13 +31,28 @@ void AssetScriptingInterface::uploadData(QString data, QScriptValue callback) { QObject::connect(upload, &AssetUpload::finished, this, [this, callback](AssetUpload* upload, const QString& hash) mutable { if (callback.isFunction()) { QString url = "atp:" + hash; - QScriptValueList args { url }; + QScriptValueList args { url, hash }; callback.call(_engine->currentContext()->thisObject(), args); } + upload->deleteLater(); }); upload->start(); } +void AssetScriptingInterface::setMapping(QString path, QString hash, QScriptValue callback) { + auto setMappingRequest = DependencyManager::get()->createSetMappingRequest(path, hash); + + QObject::connect(setMappingRequest, &SetMappingRequest::finished, this, [this, callback](SetMappingRequest* request) mutable { + if (callback.isFunction()) { + QScriptValueList args { }; + callback.call(_engine->currentContext()->thisObject(), args); + } + request->deleteLater(); + }); + setMappingRequest->start(); +} + + void AssetScriptingInterface::downloadData(QString urlString, QScriptValue callback) { const QString ATP_SCHEME { "atp:" }; diff --git a/libraries/script-engine/src/AssetScriptingInterface.h b/libraries/script-engine/src/AssetScriptingInterface.h index 2c2c596e09..85746ad36e 100644 --- a/libraries/script-engine/src/AssetScriptingInterface.h +++ b/libraries/script-engine/src/AssetScriptingInterface.h @@ -26,6 +26,7 @@ public: Q_INVOKABLE void uploadData(QString data, QScriptValue callback); Q_INVOKABLE void downloadData(QString url, QScriptValue downloadComplete); + Q_INVOKABLE void setMapping(QString path, QString hash, QScriptValue callback); protected: QSet _pendingRequests; From 7d491c2b1e7d191f3ed3cfacc88df31a8a9fefa0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sun, 2 Oct 2016 21:19:03 -0700 Subject: [PATCH 007/300] Fix ScriptEngine not moving AssetScriptingInterface to correct thread --- libraries/script-engine/src/ScriptEngine.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 160ad77197..6e6563d022 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -143,6 +143,7 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam _fileNameString(fileNameString), _arrayBufferClass(new ArrayBufferClass(this)) { + _assetScriptingInterface.moveToThread(thread()); DependencyManager::get()->addScriptEngine(this); connect(this, &QScriptEngine::signalHandlerException, this, [this](const QScriptValue& exception) { From 2a18c7a297ed1af3553fa727abc0aaf6a440a522 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sat, 9 Jul 2016 04:16:12 -0700 Subject: [PATCH 008/300] Remove forcefully moving AssetScriptingInterface to ScriptEngine thread --- libraries/script-engine/src/ScriptEngine.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 6e6563d022..160ad77197 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -143,7 +143,6 @@ ScriptEngine::ScriptEngine(const QString& scriptContents, const QString& fileNam _fileNameString(fileNameString), _arrayBufferClass(new ArrayBufferClass(this)) { - _assetScriptingInterface.moveToThread(thread()); DependencyManager::get()->addScriptEngine(this); connect(this, &QScriptEngine::signalHandlerException, this, [this](const QScriptValue& exception) { From 26545b2b99fddcd8d2db16f67353a0ff46a2cd35 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 11:41:17 -0700 Subject: [PATCH 009/300] Add new help.html info window --- interface/resources/html/help.html | 71 ++++++++++++++++++ .../html/img/controls-help-gamepad.jpg | Bin 0 -> 173140 bytes .../html/img/controls-help-keyboard.jpg | Bin 0 -> 139444 bytes .../resources/html/img/controls-help-vive.jpg | Bin 0 -> 187239 bytes interface/src/Application.cpp | 7 +- 5 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 interface/resources/html/help.html create mode 100644 interface/resources/html/img/controls-help-gamepad.jpg create mode 100644 interface/resources/html/img/controls-help-keyboard.jpg create mode 100644 interface/resources/html/img/controls-help-vive.jpg diff --git a/interface/resources/html/help.html b/interface/resources/html/help.html new file mode 100644 index 0000000000..4956dc20ea --- /dev/null +++ b/interface/resources/html/help.html @@ -0,0 +1,71 @@ + + + + + + Welcome to Interface + + + + + + +
+ + + + +
+ + + diff --git a/interface/resources/html/img/controls-help-gamepad.jpg b/interface/resources/html/img/controls-help-gamepad.jpg new file mode 100644 index 0000000000000000000000000000000000000000..339e155f82dd924f62b8928a3b316c8aee460c8c GIT binary patch literal 173140 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%0AgxRH&;gD*{6X3Gf)CEjHw#l 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 literal 0 HcmV?d00001 diff --git a/interface/resources/html/img/controls-help-keyboard.jpg b/interface/resources/html/img/controls-help-keyboard.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7de9ae6d593517b18f0029f4d22bbce65bdbe2c2 GIT binary patch literal 139444 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 r^NphfKGpvng+hte#N^{ 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%0DBot2t9y=> zh@ACm%O*9~CKkf@d0#|c9tm~VtE13yGtD;3gQv3!Kd#7G!%OvD~z4kot?^$UW znzqO2_4&m?h~;d{wx;fW7y4ozKu|QD1PaM#5mjLdkQmu1mUp}Io*u1x4)BQ4YLQ0=HA%7YytS6_W z7I3T>QFWhQ`yUO6)oEMgew^RAEW=FmtD3%NT6D>dEMITghZ4o+17;2{O|k1dOTk&P z-*VPy3R4u2z@c$S?OCB^$C>5jqWdNafDgunH8bXILimH1nIdWI&2xHgkDy!ra*yah zGkB>z{f@$KhsjlbBY5_SjWHFA^%0LsJ1k$UA$AEt#NrZF&*RD-!<0YQtRE}RI{cn~ zf|7HVNXKCk3o5NuIvB6VeTG*;aUL3+3SIzZ^=fC`^vnBR_&PMWZcBLa9f&mjBwKz} zlUI)34+T!v8*pSCH!A|gtVu9y9*GUk{b@Uv1Byse_(TgEKZBPoi7nXt#gWnG&F)=_ z%I_H~sB@NOMYVY^Dn14Il22&LJ#Y0A`S}I5&*Bhy&^1L=Gjkbf#5WWwl}U`IVA-x% z<^Y=93S2spqP)7R!fl#esI4Djc)`WcrE5d@G;C@m*Sz$EUV>&@avQ(LiyGYE$csdT z^`Mw9V|*$gbF~*q8m;(|>eB#y{g3AMKbq_H_5E_H7u{jM%M@M>oHwzV80Aqh$W#Pr>$NzgZJUHh5=rgUKYv4EjuX zu`ymOD37-~z2yC~+i1^Y@btX$a<6_LSt)8Vk{^z=@E3U8(e<)9v;_G4%O|3itD7~& zN-xLlxYV68eRb`W+T z$Roz^W{NC=s`jzt6qYi_34mL14%YQgLMD0fP72-@U)mE+7iP*-?(0p77>@W}1KM1T zK@v6q&}K_mgtufs`cYZU){!XeRrKPvS_7hZY3i9L%WK%}*`@ACCmZQja_%F38D)Mjm!E>qkZ|==S-U%?o_S zn#b6;{SS@}YzJA2jK8f5y$&v@)L5@yp9PNF{kulb8SPIy=9*wf?Lm7dAw$aOY{UMF zB0uKeAEyJd-}U%9yZIY<`cd+rWpF=&X!`_j>o}XN?h00+^!3d?fknnnr+x&-V<6{~ zk4yYz)XJILN&o@Ryj4{}Z!nN2(rqydG~PUM#GBlY;?d$S9?i8LH^*RYO2%&+9=2@S z&h>83yCy8o-_P_cYsTiUj#MX4uEYqY(^As~^lMwxPZDfIlC5rM1MfM3&Ok=_<5uQm zI$h9oYaU1}*)0*L+4R}5`Y~+viF;42k-Q}`8CN_hr;RCpzQZY#DjDt6_yn-!05=;{ ztn>_}GWSJ(PMdTFqs(MyliWUM9-5Acr5SqKY02v1(lpaFA+2>Ckpl_rlTe1)3_Tyd z*%oRsxVkO-I0x4IseCzQ))sB$--%Xutf|5Tw9~nsL$Gmoem{9rR^yY{IqpDqIcxri z*55cO*`Ge+4zjEw%|iEk2C$tOG`&lyXfU9S%NidqeU{JQcj_pfFfVUK(ZflwLJ++U z)sMn>NLAnl5p2jaNg*WA8R$p!2z4)60IJpIukUPkE!U>#Za~>RX`3W`?7v21^!Tt5 zO%J`Q`5Frqqrnq+caGQ}N>(s)VbCTDJe+eqvG6dC*pp&r;`NW_?W9b=&6{juov1N1 zkbr9qW2q?^>_=aGt;xlPV`j3|8+c%jlt0^=s3|MnCow@Tq<%-)_IvtWgcB&4#Yc<% zabp5&QOxXMqwgF#X2Cc`KUs#Yw!uzx9L8u2$D6>33!7rU8m4j4^zBo%J=O-&Ak)>om;5d~pvOak zLPvc!dci$he6=Ng=XNe&+Oj~HYnR1_u+Ewft><@bNK}OxOS0^-W z+`uD>D*8dXQQd&}fV_|X1Hz$MRRe%*O1|!-fR%++Z#{^tpSP%q z)Y-wKP?va2f%e*Fr+-dQoQNynI3lXOpTy4#^+bJwFf8)<@>6gkKJn9Rzo^4ghg$V+T& zsd0SXs(`|`PwhB~n^mGkc@cbIWiBMS$nD^jbZBm|So;!5Pe-X4=q-nU=i-I~V`O4v zH!KQYC?O@$JXfv2!VSaX{M+8iyM`2e6~>LJ(9&XdAvQd25QP(Px1v^vy=f+h?xW3< zd0b+yi|DXPWq12B?J3A8)FO-gn6HGjPJX-CPcfu2jHoqRRDfhART zWxr}}P}ow+Aw0G}eqRP1L^!7{Vba^sT4pY)in!TE_Q4hB#6jzC6yc}aEA`Fe zBqt+1d6UK2U+A<1EuKoCp(%CgFgJR2wsVYgBX+~kPNBX^{82{#AOhF7)CA>ikWdnY zZ?Ui2kDUZ<#3S-$>Uyq$$A|4eMJgfdkBeP|PRQnQaY?NvKk0$%Dn)KwgN_p9U@IRWt zAo6BXIoCK~mFXYNYMbYww&@)Y!F{@aH2b#L(_*39!IOlQWaYZt*!ToveW&=UyT$z{l1wmnN3RNU^(fio#PNqbO-_5M zpDOeit;poEx%5!c72mBu|Iu+I_vZEg$HGegUvkf@tVgv@<+)J;!l6HH@I(jUkl|IT zSI|d!>6`lek3sTNT9N-$?gBXav}K%ZoBBUyW^VjGz3F@Uyp7{%xN0BwfC|l1IxEK1 zg^nIc2>&fFAVN|ONRB+Y?GmOv>}ioh)@x;W)9BN%4p!k@0P3e-KS=Jc^s|TOcuwk) zsIf^k@ZuHl!cqM{Vg)o;t+4-SAl7SptCy3&Yx|kwK^t-4i;&Ezt=tRi=+|2R^-=l1 z!@sTDCJ}GIveHoQZ6yosK%*&-a{dliWG_+(Vef67WGfNomh0Z)(NT)ygP*gN?pyV5 zHlH)wx$7#%In&gCbk~x-vDwVy*zk(@g6!5Ry7X?O-lqj%TXallO?56*I%wGwju zRX>uOOA1EGYu}-HK z8F?oLyODK`^;!?W>{^h4owmdNIc=YX^x5caq?U)ShI)Jsh`asBnOOR1!b-r|7MI^$ zDeuD&Zy!OCdO3ZDj_uFDK1vd-R%q<}G3ZqCYBU!f9`ha{LIZWr z-4QVkL67_(^P+ZQNIz+kdmuA}ccZr!qyIRqNTAg3m8qiBWy)*$*ltesuxUk2BU5jc zqGsd;@a!K=ns);vI}BtM&?$d(zOv*wBcpT5l?Tu%@~AS0og;s7AUy5!|Is`x$`Mg= z6uA4{zhYII!E0u3Ztr-cUMY^LEXh9@{bx*3-5mPpP1i90iC71@xeeKbqW%(Me9(Df zq`N69Y}1kQH;vQVMaQcJ=A6^uQ=O-!DBRi8a2c{JepCLA=RWOPOFv1H(zBzgw%_Tv zYySF`ncSjjd6NN!6O!g@U+O;VS*(m{dR7TK;hw9rZ2_h_0zSpKEwl#V)`ZgfAKYyE zM?;5A&swaOwqLzpxqVBsZrFOHjO+zRxmRX3Re_|vbIdc+qvNMw{kMTU?40o*Y!kh* zU66Z#I=voEJ!N|ic-3sn%U;&J?iH5r*`)UU9^L292F6kq!#p?X)dQOQiU`6zn3S9; z3Oc-;*1pM<^Td6_z#K1htMLq3S1Wsiefo@EI5OT+!tYSQ)F~$%bc9P=gt-oVG7;Zbs;zRR;8Ew@i{`?!u97WvYv`o{gtvXht2Q@+iW<@S#=tWLV#{8=L1 zMCh#iBH4WW`L9d*PtiMRIfFLeB{)%k`rtE0Zl`XiJQhPUYb^T@t9Ro|fEUEjA}X`v zGk@#Gl|C1+Q|EV9;>n>bqWxY&EQ{%XnNFYNh-GLbf7m6yXG;sd>Wn9qAv zrh3>MZ7n>{%FS%nT?3 zs%Nno4>vKY+&3#FN=hDyfftSc+XsE%v$6 zuV<-cdF?0TB*tp#-Lpim}Sy1NWjp*mkgg2WRiT#g}o zB4iFp@~aginM0SsnmGvD*hgTywk>%0bheAh%EPM{a;-LVD`LyEB5+-4hLiCxVRS>k ze?XMhQMbi9F(oW>t;9Vo?%Ef}??fiSLNAVijQEu_<`nntNv;>Be~x~+Z5oB@4&Ki` znByb-P?=5eQ=+S1MK^tQu>8ySy}iw;NQXHwE1O?y%2jDt7~QpS&G;XU!XGL=^aguP z)dO3-t$cwUA%re9thiy46w|@&*Uj>Fa$_vVhK(~QkxxL~+2LKdYah_*V=)_Jm=i+X z8U3Oo@sHjQP<~ax@+0=L^WR&LysjZhk1 zIHppR{TDx0e4@gdgk*3f&XrSeCag|yh{Akr!63aoJ5NZeou)p(Fh1BJrFZPs@gjJBQ(h;}b)Jj|%Jm z(WJZbFDlUNltU~Qbwdl;VL7uMbl=I*v0;Q168u5n}w5= zutA)=6J&Q_Tn*IM8^i(fr#H7vkNvJfA9O6BJ(qq4yA#iW$n;lek!=;B;BJyCa7A*} zGH+U#0iq>$QykLUr45_re9^V`ZLv#g90((TtpwKaKQN4UltC;^5@6?T&z&$ ze)O16i_Ao(mSWv2yj7}u%NrT&KbqJZpO zM_q;ww(>z+7Qq~x?G*Dm5BgsJ5W=pore5c$yvt6`lfa~96qjfltT-Y_F*?1mPHQSD zWJgE91Rzr=+v%$Wl)B_37{au0*fWb)VVD+1e46Iy9fgY?R?4Nz+E(=>k1`#PvIAFi zZ#ZskyCGcsMY!6~TlLA4@bxX!lh*rx37qn|={!%BFF$VjO_#`2-;ftng`UbF2UYhA zBr5;3_k6v}P#YV$xY)r4UrxC{M(>U)45ciAy>zrK4x&>1OJ3H&V^l1s_0TnJ3<<*= z;Haf*_ftY5OZJT5d`$}C@0JYI;(J6>)kve+qgK|&2j?T*3BR5Mk65kA^YV1oY zuNiJUXbdZqyK()o9P?_%>T z^b;nNo$3NDv)rEEcD=_aaZ}kxBKnKKL@xBFZR-MAut5Z#I0tWp%&uU+p2(FJiMQYl z47cB@SUoz)Fx zyGkAyRyOPshpIOu(mH+2li=;j(vasB;2=-%;4jW1*Dz}};whHhy*Ndd!9`F~^=;8# z^f=wG)#q36x>WCQH@9;cPm-+84x=Y~8^>+dx!=G!P6e9UehebKiKA0|*b{DYt=Lnf*aY!JXu*`F`e5jj=Bi{rh$pfrLOl zv;1wxv8!aRabMz^NyStx%*b(Q4rbSW+4UI@l_C!Jxst$EXOG8y{ml^OWM0Ae8hYlM0~EHA zqWEY8e&W47;zlMu@a6jGewEV4dsXq>ja_b`Zr`PW;u|6>{;*s9=vg95@M%XaHedQ0 z+LG(OAOVSe$8I7&>;;T~hz}JB zBlL#H*S)SQsX@4u-HgN%R6yu4nb5FWxa{sqr4eL_VAMZ9AmniRBbpxHYR*k%XUWW% z)@T8}GUEbSBXZgaqwZfMXmlb$Df_k{?b2` zCwMQ3sk^Ov&r?E9BgB5>x4iW6_(wx~zr3PKer}Ez&9`~Py5c%FzjNf9d zZEb5*-27fEm$1{IvUK!$oQ;Pt5jSSp0jsIk*zj!N4iGk*O8nIV9sBy{&QPH_c+3~Z zQW{i5;NcaOy)l$4EHXIij!n9fYW#DEeXE>|RbjTluCi83Dg@tu)VLkQ6lXR9s<7Q_ zsql6iw08(!@#d^dXO%~Co^O>3HfI#6Gg49npED5n#?n1;mpk?V@f{LOqR+gr09@n&&Sx~HXz zs;sO2vI@4$l#-BO_=+g;In!%~ZtlN3X8&))OEo&vdh$1;HZ1d@?q%J(G?#rQnhE={ z-2tP16!n{b6)cEcs^O^~BliLX6a>@XwwQ2d>A%bD@y&%1eG)%&&%dXfgvEYqU~ahm z(S$^dUmrIRo<^prn|s^*!k$$Jq$>!sdL8hmO9tc~+CYBBdm_v~0p0SVke2ZosNy@C zHOxX1ODDH+-V0e6kIFK=oIBae-5OVK!ho{(dwho*i9wFs=LO#k8>2_37wow~yvm-8BCrdG7R#=rCO>D*2@ygutC`6%;NsK-TO#0EF@}W)cx|Yjp zlz}+&kvv*Iffk_~Y4at4iD2=%4LxK#iyq1S@P?1=WOmRa`X>O@}scr*wo z6jZ>T|HH-lXi;3$E02x4i5rpPj&iS5Pe&Avw$3;*$L0gF62!{#-12Kmd!oX3*vO7MQPICm*Evn@jhWpdi34_g> z$^A#eRrjpdcw|@fXeRuoI#bYVz$u@vAzj zd(7?7><(X^(pzGKe)&sGOteE*%!Hy$HhoUA^gaDgSKeSC)Hn^?gf~`6a0kT*1GC zg8&Fz6MLsGu7GZE==RMKr{h-iC`yoSx zhVfp@BYX5{;rHN`K^JLSOPy(UKFIwT>0+Xxj&xRbRyj^-yT}TWk(v0CQg-`y43XnY zHu534)NZ+v*v~wtgfK8P*v&1v_GnZ$MPdEMA3|`{b*lFag|L_ zOa9mG+1gYsfj?8?cG_3mKd#z66IT45o`Tw|OM#tBu#NWoP%?h`OQqm`)kBHKmqsMi zz|?CC5Ic#jzJ3Cdk~}Jy{8jrTBDHku&4#?i=PNg)2(|{32g~N1VCA^E{npSA(C%ff zm@G=mWq_f&Qmiqsh*QIpWrAr#g6NoTz4l_g_DQnDV2Ud%@x{HDe}4oX6pkf4Si2)W zZabv?X~GOR)CU=cRVmKl+?U9(gT=_^<-PH!E7K*C1il{AH)KgeOp3-X-O;zvoc$~5 z@gmR$=G?+%fR*0{{1QLa;Ml8Q6aUPh?paSa_Li`GUM2>5Z7Tg{&rsDvOTeP@l3#k@ z{L?J@_Y&r+#!y$s&C|%F$&l!|hC$KlxZVR%bze%xnPzn{mrP|OV^8^O0g*dMMA0*c z4O8QO{-_n+G=*Ekr9{c=!A`#7nd~XKWE<*^8Pv#Q>qsK`SzLJwPvG|1phB+nmGs2N zg`f$MqiAi--K1)sVPFyTNkq=m4=(y861Q?Mv9UlQizaufqOtIoGR;Xsz{Kjb9&5ovDTKVN9My9ZRQW`vvD zzd}~Tc|@61c%*0@M-PLUccxNdv+DL$rKX;~)9v>RiL0{VQg*L0d031ErER|Y#PK>f z(%h`D$-%HB_}s;PZ$aJL+p)>s5w)`3OD5u8zP71=--^@!3%tLJz6-Ari2f)cfWW(m~(<2ThG>F4u1(X@w}Ssu3AmA zI+qIsZ?;X=&-68C59%?O>#4KOnE6Vc_`kc-@w;8nv2yl^=;(Blbg@85iI9W_>p5zd zLgED)^|g+JrGBt`87ySEz>{MZ4b;{g_0kpEISs?k2Yc=s;c8p1t=~X|K_Q#@BYFWO zIJy_*RV*?pXDWB?-M(w&^wXJ=86|&Fh~675U0IxfOPb#~%=&p}tD=oYn#8!QA$Xbo z!*L(OD~Mp_d8(^7YNWQx%9fk1qrU7{upz^Gt)k9+@U1mEN(g+imyL*z_V zhiMJ1r}Y8d&3zAIxU*ue7q^d15g{_S`t#yLd|>2(3W<8*4@YO0aoMln^{(uk=!d2v zblPm7`hGinr<58azaF=CF^F5UQM=;)waeeM1H<=6K?|HUD}hb@O-g^&v&@s_vKVxB z%o}bt_+rxp0bWH_M6VbFNnZ&AaISh$ag+X{gd`Tg|Dw@|M*WEMA59x|6hv?#Hy_RB z+v&bC+dB0y>%@pjnSfF*XBTN8?`HQMr1fW*K8-1?x-0GJRwS(voow{=csTD_y)N566;_RM5Bx9K$O7@IeX$mJ&wpy3DZsmBmV?7L zT00+?&SKo#ii+KXV?*bTc6ukLCF`1vo293v6kUKjeXgvRAPo{zW@!c8KCrZi`KGb zAHNl^4#x^IOu|2Mu&3@la>l{=F@#hO;urZx11zjODp$Z)6=yvr$qr>J+b~7>kzSWx zxmK#6(5EWTHBiQ-K-=mknPGNQ!#c54w)@zei}H{xoK+9Y91r{>W%SI;Rd+?&#=jy} zh`m%|dg!&R5LxmhT%W9eaQ+;Tn~L!ZvPSW>oFXU>kobvtEg}D73E%c z#uLmD{-{c`#CYLRqfnD7i~04-(!ou#2XUX!Aa#%J&wCAoSNxb(9hKIpS#9gXHfOq2 zkGXbitL^I@uxZR$&{aCHgDtBIJ?+hJ6}w^;8vsDAy zRES=4dh?IQUXcId+qwVs4C7TZ%dL+E73l!}E5dgM4V}!hs881!Ku{Nk=K)Q?)h)+6 z?XtO!D&MF9W9njC?y}AvFX`W}xcO#%9TG8jkpi!XtkvfCURJ{Vg3S9(q#20&%;cC& zmBBo-w6gJlDL7}dKgct~H-V!i8}_PDSFgF!l%u~n0E15CA~oectr#dZNM%>JG9}R= zhl=hFo&D%X&B6nfvW`@M13f*BI*nD^GEdx@>gI*FRI+TeJ+ro&iMUS5cudYVrn=|r z+_63g@mNNdyfvnvWJ=L1!B!1YBbI@4HrNDvTBS7Syze$sjwqwi0CPAqGmG<&>SQ=9 z6<+$x`EAJQ3)Z00If}F_*s+|V?f~Ff;&Ux?v;d0XKwI)B{RWmEGWpK27J;&E(ums8 zTtSBOAI?HU+~ZOj`hN6jdpF)d{!S~Ft?B>H=9ROBV#HITcMAI*R=nW-@I5Y+AX4-L;eq zJFWqyh`e4$u9e#!C|gj)a}dgo$(J9QetHgvM_)gT6};UD9+{D1N_q0YZKf~0stpG! zu1u2NU>6NP*F;_fnbn#FOL1>DS*O;g^Wp*@K9rfMU}d=IvAF*5U7cU5@ha<+x#e?0 zXcFHnjId+kentM9S-iYy5_0}XvI<)ioQvS9QH`#$3*kiO>j*<@6GX)i=~=X5$Lhx72|XaAob z)#8je+=RajF0@anRKU-r;>c%;U-8YQ@T$F*w6s#WNrE@;F;!R2!{QM|HYC*5XIqAu_py!G189;t#C6uE%@V0L$LF%l0pI%cgY zfCn^=ME?H$WL4j5p<}@5aknGe#-5xcPJYRoMdg>NCn$OeXg8c!`E4EVw|&fRxOwU> zDKvU1E6v_A9#ASdDkvj0X#-{9=jY`$NH`2x;@`+!P-f@TFX~mQe*4_Vxd1+HHYJOS zuKejB?(vVtau$8A1LA&EVIw{Hd)uInSz>caa+F)gm;2oeG8aUmuHX+@r%W}13Ke#^ zUs}rEq|u<*9g*;RLGkC;(X_9%F8@z1vTFb-2{Zq(;f_Wz@wf6P(T)3qo zgI)HhbJr(K*7;3d?#DTJJYKW1v*b%o6Gvx}ZR6GSv`jZN^F9%J zu?9bOHx+#rz7Z*Z)7eNH#oI5=uf*LQP13gwWA#Lt28N6PnTqB#=OWgeFR_(n1HNw}2o;LGc;qJnf$IKjYr< zj60rt-|Wx(-x_1hIoF!=yT)(K89CNs^2@^7?FYAQx*i1NF7{*1W9cPs(DxNht<#`u z?Yw72uBuav)<<*|>gyG+hyLiOAQ3;9#hnM+a+zJ>UFwm!W(cevbfJ6;M}l}fhK;pv znD|^tFr5oNCJmj{J$3-njqhElSk4w*BgRl{q=F_&xS)8ahZzg~A4kCg2K}_+H-`eh zr&H+5-~!kdB(K9TJXmI$>S zEc1$kCo5H3mvE(SQ&7&oHthIk+$X79v5J_~u5*ClZ?N60MiQ*6Uc z9;KQNFh$5+mZc^E56~%)x2xPG&Kj>2t$w zcu7_+`{jr;Ze++jA#hONQ47@K@ORAa9&<-iZLRZ4edmU%WUkpzgZ|<{rvO{cD;8%rT%~jKPGF#K8BQq$ z;8yQ7{r3&iq}|vnZP@bj6+m@UPC1JuH?-10_BQ-a{q_APBhVhwHA61iip6R`o=y_U)7 zxUW)EISH2UUeK@!V6QKcj3$rw=%SL5_gj7aWOFpuOj28?j!m-%hXo$Ks|v)?Ut}zJ zHV!(G$G<74=rjXF1k?A|U%B-~iH@7BV~?#rB3(t7B4nosk=l=`+so*eI=_A@8; zN2c~ZefCB3a)QYHzH_ra({*34&(Th6N)Bb}M9+M3fbod&O-GYmHJJ}8B}}y_glx)D zUDsYgN~*P}`LNN^&%o+v4!efkcVF5#I!VnwyC$QIK;gOACa6t{Pd4JO1(%NvpK2?v zec#caqH=KbhR~LE>H@3FV1=fr501C^ay^7wM|y5RE%e(e(X2aX?pOJXS-gjZd5Hxr z&!vnw1;YzNni>jUSgiWU71qhu2PbZY@=NPKm#m!7E+GyJch6^ZIR22~V(?zhO5FK~GnHHdsy>#)=gV zw`+d(%BLtOFD%uQC3mY+=QmqhpP^B{E~V~%VN%uXO+rywO`ktTnEv1lTW#%tJXva0 zSYg1c{#wxV0j9!v?WzLus@$d=noR2>-wHY|>a8}hQh!a@PCpPf>)RwXzS}@wyD1rD zE9-6uL*AOsf1apuU$bFsat>5jR1|!5JiJm!2~(LgI_ixG3R|!@^St0}(kJ0b(V(b4 zN$OGwPV%eeL!3ya5zYH*i~ z>ihb#4t+;J$kdb2zxy?7n>*ckfNd7pdSFN?BT7>VZm|EQI+4svb?&!&-h%HCR zB@nUFhzxf|(xu8(`GZd8C$&PE9Zzrg%#kq&@C`>gNhwlbT{8EttPHAyT~=J>_tvko zo#XNIgFxz*86j%tv;tIPT(IXt?eRx^Kk}T5ru1$Pf>SP41r5UMA9jg0Qte-24fLbO zG^~0^98qu947O)CD3y?V&?;`>zMM(q!+FR-|AEnjJlQSwJO}^HA;w$0M_qVtq8D(~1iN32(X(z6piyHPYRW}!^vI~yolb*x$DfNXF8HIcuC zqvd=AUtQ)*;|t^j(voK*Gn4s%a~V&)PtiZ5v+s2IeOQ)kCmX0?>$lYdN$GE#s91aK+RzYh34U4d@7Dk%;%^_2=8d>tLI*Qkc@UaL@j zGBT2-{&qUoWgNW8XbvefdqWa9Bk)sf6_HZqWgYJQ&?^52|8nA02kz!q-rnEdI(eAY z-Sayw@nMerML+8oJ+@18E$y4bY=L}2DxT6yr-#XwETVI8c56ek;Jg4PEf3bi8f;KQ z9?WH?of6SBlPiL9)SBgHRhe}8%HFbrlp~?H&;t8UmGm=2s{N!H7%h|RA%S(Z4BqM* zQib2-I%bBmBh7r{>w(D;(|uFRSC+JNe5e5?GQidggpOieZfl9pTQpXsWZe)G z#MJnIUC7AlA9$1VLCE=efp4N}Qbu6n8uW&k5FXNs*D?*%fGxtbsw<(4R}AF0VP96J z#|vtoGg5oXS*6k}b>plCVsN)dNU41zZX?afkgT5(9o?bR>#BOev#Y%NNztczk&93C zd@SL?V=nT}g9i_34m}O!ujZ^~q#AUEb#PBlxq8oNfb2KK&^Y#7_f* z_2FB(pAiI$sgOl`!_M&hSd#%^s4a>C)IVB{#uKfqD;TwHTf4c!jfc9Igp)rwZoXc! z>o;Bd43#{n%O}iVQ9};}mHP;tUl|oer+C4MV|qUyGa0!~ES%~wOz%~C7KS4fN?n5AiYe+N-PW+q!*A3pp4*i@))V*NPo z37)3)Egfq)EM~`J`)rpry76?Uy)ZGMl9{XdDGE9+Gnr!;U(&=TyW7IV-TKvXardm> zY{*0d-F`4eW27ne+S6hufki(3&HA=3wQ348N^%4>%ah$n44Nm=2fa;WPiM zLsUs45m=3dC}|`Z(ik*V?rK9(1y0w`=(O*RWpR~lZEhKYz5UxpTSd=?`n*?dq?C+d z%chs|!uL>%XqVX4X%f(4NOC+YET46yzUeVWMZeFk&1`YcS$O}^z}sxw@lWJ5{xI-? z=AOHp^&bv=-7}*+OJ6g(`^JII50nA#-e`7zRu(kn&zk0k_?|{R2t{Q2%E#I8NVcd9 zymH5u$Ld0$8G_3@z5zNUdkrudGX}@p^WXf1uh~8<|LQWoeeg2Pw{B1w=^6@$3lBZe zPMq#dGS!L=ArUx>AT(~5(d+Cw!y>ZJu=G)}h1QO7`PzKmEW$ahg z`F=#GiK0_M`h%Z|Ww?ecuSVd{tn||DM#4<|qLQZ!6lZ)x{Q{V! z-3sSxb?Yj0wgU;IPe<*nmwhvz_`X`RCz#rEIqi^Y%0f+cCt7OXX@jNE5_No#D}A!$ zj7pg)0rBq9@M4F4p0)3SQH@N&KL;oU$V@RfQpb{0(Ja)~!vTjT&$X*YS9elVUZvtS zuU?X!x;o#v(Abr1LuCoQdpTC!G91|m$5(&wC~kOSvU{>Mn()faXtHK~#GMRJU$Mf} z+Ip{#+9j$3g~{Zj<0h1YY|-|VT1ZJHU%8rsgt)zV9p>XySeLL|{S6@sg}b44cZ-|g z&1CWx5b}xjuN^jw-eYdJ;pWqMhihSjqVhj}iWCSDnJCL$-m|8Sme7vmFSt#E1lJghXNzY_8S||&=2TzQRc0t;IdmuamEE@6&*eat8 zH?)Dtt$ctG1p0u*J(R|Lh8|(pQ>HM!o!Kv$En`i3ZmIx7eKceh|#;#jrZI_ z1-9&xPx?5(GKmI6%(_a<#zJSC;+4d#B5BIk`z8MQ@68d_$z|R7d6tx9E}+v$R4; z>|G6p=QkUv!WQ#&i@~sD<`%M~m%Y;cL0(qMKgn?;)1ou(f6w{4JQkwS;IiwbB>bNR znxiHj7fo0mCYk1GGdOuo4|xT@A~@nEB5%Mh}PLEFyz_w!hfY$=MiQsl31Rv}*g zJ?W+0ANuZ5_TM#{<0IZZ@xpD9QM)YLg<65t!^~g%z1o`swK}7iA{d{b#jolRL4ADe z$=25UC3Wko!d%}`)HuG26^Q9$$wR|Y!q(Jd3nZmbtoREiN~p!2vvRcT0CFnR9qS>J z@BLC9g)v};o=arkv2+*eXl-~CR>lR%-e@R46W{nF{@W!ekd{!%;V*Yx zl(#SAiWL~QU$6^n7y$27#S7%HNBw$RLs5#Fq?0$~RIUFGMWjM~0$)ADOaUO^)3B^T z_w#Ld$TL^?&ypGLE6cyx@V0a?P|(9fO1|Hm#%t~qYgdkcSvh7~Isvn+=7zYodV2+G znIkZc-D4vp0S+r}=EtHk4-b^Tq06J=lyum z6td=AZG)*^;$M>dqQLHvk&noh$p3M{z+jGT@MnbFdZXFg(TXP%Ab3$;&HSUSEc+F{ zKFLw2*lTBIINODH%>;F|IA4Z~q#8nW$E$Jk6sy$uN^ysa3aj;P(9qYE?hRH2DL?2* zZY>aYC0~KtGFs-C+x)y^#+kfH`K9i%THwP!a3iyx5hFvsMC>ZW<=kX7WGT(vM!_B{ z_wJx+yv%Xy8-H%I)Tz1yGKGQgW{}%bK_8eVN6Hd^Q$h~g65Ur5X1V=u+3eOo5iyXr z-xzX_ywq`gjc0zuAm8u-4_I{cig$&@ry*~wk6NhtqE5f@pPftEJ-1#97i3>wD{y~5 zg&EKY)gVsUhyjAfRW}07)g?N{V^zmM>sN9~h1JvKjrv{1K8|1IH69mdDr&OawCdeV z9SCKf*tEc|-LA)sQt?3o;{69!6BMNoYERl1PJ7~`Y+XN#X=+U;whm%Om8c)uidWUL zA!U=pkEFQ)ix&08R+#;M6M!1s)j)|cL0xKbIKbcU`a@A_`9^ZUmO|ZKI+j_$$S&QbRhPWL_<`R|7`EB4i&*bZl9}b z^49KrXp(xMHdgdVOm!o>y3ryAG|zjD2*y4aTyfD`Cyia*Hem*8TjXbzvtV+Oai*tD zzZ+U56041;UUG$GI6b;zccWJ;rLqbqc?rS%hTmGn^m%W)IET!&XTK=NYv4yX2-4hlpIXOX#Q)p9l zj7v$CCGSzTw49%HFn2WL_(s_%Bjpe3bqeVFZ?;P=*m&O;LA{B_r%moFW44eeYg%)y zy5!_cS(TO_UP(*9GK^loj?kjewkBR`zsTt%F5%olnSBoqndQw#WRh=g-Ln#S;Z`)!=Dl9bwq7 zb1dC zc2A83NkN0jcgy4L0|ps-A;GL9;JQv2yY*+U%Hv#(zi|!$Xz%A9Fgn>CrRp?C-199D z2Oo^};Y$)MPrWJJBIo%2+R$m7U8r`fkh5ap49s;JqPuP<>aWQy#q8=ya5^c;ZWe?c&>Kb>MJR+xIum}@i9G+3wKwl-z^SqZ~Y5F8y7Te|BNW({40 z!jI2BP;oDo@Lj>k2%d6JOQ7}_5S4=fd;5t1Fp{Kmhp@6^DdwbtT990S*OzPbxpKBX zpP%zfb$yuXE(1(2$FuOOB|pR>u;KIJ>x^7M!b%9pVi{hLtvSuB=gYw|#br0? zt>}ZQGoDmW`hMz|%j-b=<>ZK@THmHy{_a)J)A)WQg(5X5U9qV_j4nYz5YKIl4qguG zo{0L9*xsgZi!-EWagaX0o)(rK52CLiA>mS0@)bD-ba~{^-9iS8I`4gRWmj$`g;=uo zHdZ5qBobTZWE07%CKy>2OpH%bF(k;OfK_aFm5paNV`xP}RlyB5q*%^jMWltDw0`X> zqMERma)0oCEIw>j@EN(Ao&{EbH5?>#a=ft6%2AXqju3BM;An7F0=YhEL!Xa z+0$-p!a@LX-V41;#-!Zeo7~5>$j;>0n;P(9T#W6_8u~QXMVE{=j=`*ZwT%q^MA9I^txR+ z&20P9`0UF)AeV397p>+${pLJ`au=@VM%Lb=h5J?iW(zwQsUPi$JE>%P8%y^TpZz*$ zF2aon$?!{d*8cAILHEXQw&0%<<9$NMxkqtJE1FlFSWfQdPJK>`o5t)7SIuuEA1^rR zwY1n&gvKS5*N3e)rfjIJWt_L}s_$7dTJ4JI-b?;?m*2}!ai$#~VOY<~yqFikH$E_{ z9I=(9(_mM(L1MqZrnz_iAdrnP@9M!KpmJqyko6>v%H=pWM+n!q=<1)TD z|9t{bMd-{1mHUP}&|KAHW^)VcIacn?`fSRiuCytqW&7iewQt98x7Kt4Am#xAqCPne zxk^^N&Q@2QY9-YJXF>rD+0$F1*5pw@qp1r~E!FO7f&#mit?zm(^TMS|V|NnY$Z;7D z_2V`q^e$xRNhNV=CvBVep}kX;X8=jL6J(;J990Vqy1UrUWJAQP1(M^NB3t$uaSaZl8 z#k#aOni?GFOnWioZ1wca8FMo8PJ2JK*-;8{((ZQ^BjM&xkRK1eY_C=O3xp~~JxrgN z4*JEwMd19TWrwy*Gr4PGdfgS9$``BXt=(gD1}+wvhmJ}zW_dq?y71zO8XQ0l4pRJdM!Xh&e2rfK zl`16#;8in_Nm)-)9HdwM=xOmZq?cgfAOU8cZ)8iQTFshUmCotm3Yyv%+(BlM@#$VH zMU3Q*^ECF3ZO_xFA-_sMHEzRm#im*PGAZ>ZBCvr+h)O$*gx{OE)Xd(QpnNDaBSg)( z{X>ub$MHuJqB5w;of65Jvh)!F`I*zv1W)Pn4;RGF{+vlYRGy)-oK-(gu593>1xZ)~ z%BDM>j;CYw;m(2%%QSX&EB5Q}X9J-{!Azczt^lk@VZ5~=FCaYqMo-3uIHgBc*-&<; zdmp`s3-0V_>__9BRsb7{na6(m##WyE(=!AJ1T1H75}5RT+}LZ7nORk2NwQH8Hfh%Z zM^5*2F522mY6LyZqIcbK89a8rtM2l-mcX3XN(%=j@Ah5FV(RpzdcX_A$_Qnmjo{dZ zK4X_w6B24HQf2(GCPR>alP}c~t`!a`nGmN?4i2#4a`SK~KIW1ee44q-p=xVu2pFs$ z7FP(OgCn>v{H%CtLoy#2{~{W38Rl})^HVaIvqBpsJDiAKNPLCBu{@HEXyDn`fj~?H?aQokf zs#H(np;mji$*D?js@$&H=!1N_qFF;K-le?#ee%zO%`8#Wc}*k}vHRC*jaWHn6Y^Q| zR=kaL)`A-%O+Uy=yvO(i(1h833vy+ z86t_mxefa#hi4RP1bv}e#K)wW#qrhINZ81At*W7it8m$8EEVdM9S^ByqrJ6C2C-O2 zUh6zLKniO?e^*c$z8P6a%_CeXPN?Z<(WJTi%6%G>ffs@}U)fk6hz9MbJa{dq@BHsA z9G*&*%zc7=PC4!WU-py#-^?EpuveGj{9g74ymJ4%DJ!s`(XQ12)7NyYLM?pJ9N^JA zU*HsGMts$-%YOU9-GBFNItKR%SFGh#k!FQ6ravE1B z8Yd@R6QExPLS*A!rgU*BSY)*2`)%1<4gq6W5hi6q_)aWJwQpq6 z)=q;A%qw;)V$2>3d<$4qoJ#U@l~fOQOLc$l^>8XWm-{1l;%yFh1nm3brw-8?16_4h zp*E5grfity&HBgzht0H~AxH#daFc`TGL=`>%c4$%NJ&vdra;HdfqEOV^88h@?M4#k znHEDmMYTWeDR=HT>v7my4=78ZQ+!OsZp8>-^M11#+clP&@RLaJM#Ox|)XX`U*wmVs=L1g z;vTfkXc_*$W_&5fFOb;8)oE1<0=F>9Sz+M5@9 z+cz7?rHg`Qt*D`(S9@5GvcVC9 z3T4{UeVeSe`S2vN?!j+17vizzlw_E{A)naT4_8*S=KAmg@)h zx$mlJvq2)J&D3;@eUIO43Z9L!Uh`rzh4$NX)?v7%pSP~PaEx4eyjXvHd)v-+_W(ZB z{zO#g|6Sqw|FZz@pYQ*%-#_v5&-wZ1{`lwq{3n0>lRy8dAO5MI{;41Tsh|JR5C7<= z|8M$H9HS+`6a|f-rN=X6>?RBuna{<$11#&AYw{5^iRYpho$8Qz8AiXp={Fl?)a&F0 zS@;5bWoxrPb;zO>r46fGQi!5onM|$MZlk4bJSirCiJe0mmkH{6cqqvO1LrE^=3}4@cC|3BLV3*< z$$s=O-}_`BC@<&@5er18V)gd*M~qgCt%X%N)r|6BT&)^co%R$h^q^;@<8oi~?|tUx zE-UOZymbZbG7`?s9h(BQxLvv@{rTq6|LQ&c`D8H5ZAK_INlO^|7g|hcv<1>V>7LvQ zvfx|p)}b~LP%dls((El)JxL~CR)UbT>|J4t;De^F>C6w9xC_XY52N{o!I_*|x>aM( zi6CB6jBZxoCuTNq{h(zHk>`XwUIqpptm9@?mYuq@eDWlB42U!!B7S8a}du! z_k&GeI4J0bgzCQ1_~4=w4T!@vmzz}K5@}&lBVv3e--)<4*AHM-NtvL1dH7l)h;_N z(%aDm+rAZwV+z#fSR>>DSR(;O>uffWloKTK(06E5-k(0FsL2ZU0r)8TxvVvCDnA{bAv2HTcVK4SF^( zl9Em7yq6cZxwS-AK}Nz$cF`?d#${At;`L>@V)*9t);2xxZuBr-z|J^_aVtjKFN~RW zcMYb|9ZkgM0gCF@6+ks!rkl|E8Q!Z0^{E z_q?o668UB$j3$oML^YS!!e(1Wt75Oe3AcAL<>)aB^GHaneK0j*BRYso?bnjnj(N## zb5;~kmY7+H4)nb|J6`K)0F2r`2l$a@x4rz3wh6SIA9X!rV?webW4N03Hc0h)C27>p zj}f!VAyawf;~T5YOGQ@NOK=cK92P`QVKN5?pzME@<>8Rm|C1Zo*tFz7iz>74Ju#ob z$aw;$y1=jO(wm4ld;(ndNcXA> znJgu?k@8}P*{QX+J&kV~t(~Qs7A4sx8w-6AD{;Htn4cz;Z4zX#4WCD4QqMkUlt}fg z?=@OXoT(mKOOGZv;cN}^^87)z`owo*CpR*lx9tm}5wjUCrr|>nINY8}WrW;p!aMik znD)f7@zue8d>=Z=T2*K%9~9OqV7CAHUrfh#`na&Jx#7pT7>Rx06&6lY*sUgs;QZ5! zOVH5Mtn6_DtvI)xioW$S`Bv}DDI)zmDyy}{{KX}gsR_aSppBrjqr-Xvg9G-e@j%uv zX$uY-$y)>3ivj?JT+I64Y-PW+)?z=3>~$H!Foe7)~@|}r@Knu+I4(2l1 zGr9|-lf^pe>BijG<*!x+eY@l54z1i56+EkqE&+C1ViSWRMRVzD$fZe3DEgq{8P#5o zI7S&^>4ys~k7@-H^Gn;4)lys5n=OyBFH?QX#0H6N zE&^rmUjQGC|Nm1~{E_m^nxDVZqa2Z|T_GVORPgO?+Ymy0oiBl1CExo{CV90sqFzX- zROow`QBgqF!rk{PG>GSn!A3is86$?t2eEf|7Zt!NPNQl{VjI{kQjOELJ1lx_77`>Y z8*c?hld;q?`_vWMZL*tg>>?0oOO)cQa^7ARj~Mb|bdluLz(EXyXfc8eEfwEHgzbK0j|CaM zgU<-beic=cl(?(PL&PHZ<}^lNwkvQ_LAg2`eItteUht_YW})WMQ*l0XGCN7rU}wrm_}x4}@f9V5ZPk&@{K@KH zQm$y<#@8dg%8#ejf*j49C`{>yF@WlbZ3ORSXWxo5hWdNN5YVNn&MmNyg^l-F6z`IQNW5Thx~qhWyTBH*aMw!msu__be$^}wUF6Y^NNET@n4HtH zs`5aj3h$pvXX>h*ur@~s>q{VK0SrKK6zy(1L>xs`oQaz-@M_@Y)ivr!C&NmeP{_)p>er&<1{vA1MsUZ10U3G9+w z>Yp}HoAo3ItoAWqEuYMbTH`^Uc$Ie!Suu8x8tUqn-I@4!6=S%HI7rKq}Ahe zDQ|zkpN!IWMqf)y)xHs(tNbPUlHO^pd?1!J5d@ z93;j@FAY`iv|9`-K4!3LioUHESr3${H_$w2)s|*~N`1fL6|g0p+#a_7#1&cM!8JGl0FcrK^L(dM^FEt+QGMd6fH6Sg{%d}~BP&avqkTL?x$(#t6l15+E z3fQ-s;|?F`_0zq*jaaaCu}N_l+kvx-Cu-8I_^?=)ErO?nYg^c@|e) zKRRoHuU&CWqd$_bT`|D|o%P!9H0u_K9nkn1&KQmhbJYiKbmjcjX6EZWMjMNfq%5dL zZb6;I9gAbA(NCX77|M<&h*p4ZfdJhFGtD0Qy-97HjwzT2D}C>#@LuUn~YkK=3^(gg|ItMSQ|Vi>pIKUAM?LGh+RA3rpld!d7=dxiprKe zGP%iygVDrMxYOY%&hY)1!J0;YDDT6<-LqAl2-OEgaO{IJ@{T6Y*bU$ z;W?|L)2sOz0*3}O=o*zgc+xY9!~GvoyEg(k1icl>Q!@Czn;|oHY4?}@9#84cOLEK= zRX(@L9+&a@rFI;00O7)#*maL5oKuR>h$e;A*Y6r5BF6o`xG4*B4j%@yw^d{qo^&_D z#lr1yV44-NbYgN$L*dKQ!tdu?zbrC7%$TfI)v^Q7<;8VIbO1#H#EPkYZZb&2mLwQ< zjs)8)e^plX=?WW-Rh`z}yPVV+lV05A!HXZV+Tw!kWF~(*9)*zcak;NW5)9DK^0!z> zUt|Hb0h-T)S}h4s7OH|!pA}t+LfPEe4mG~!u;_U z5@r`p&1Cbr%dWLOZ;i&G`pLzx`bi0sis3?mtcdeDr*<;GSEa67GiyuK5d^-aC0+bl4hoEyY$y%|8a0xGIaUbQ7X? znK>=o9eAMFB~)(ghSF3Q1pwr%tU~hgiq8No+VqyaJ!>)!4lf4=v(v%LbZ#;n?@dD6 z#m2_9SXq}eaBU3t$yLLCKBNJDsC5MPPZ*%DdVDn_#>cFD@+QXb`e9%5M+dHEY#xQ@ z-`K?n#F5Qj&FE$i<;hG1{7G#rVR^?{7C)rldsw>mo9**Dq~vJ9y$2JfCy_GcQRrQ6 z1nR_{RH#xaLYacCl>i;F5%q`0Sf?t0r64#fOpq{Vov5$f&Tc# z?Z+LOvP<%X|*r2@*c$#8>82Ust-fq=fF@uUpX+VJE6+7%1B@3jiZpdor%m@nRG{q zzvRtqx$x2c&zEnZ+|mGn?dW)@##mk`A7e)VgFAAbLbTx zAwgFJNYHGP3Rfy*!(TZSxSPuUcT8Hk=LdtwHu7#atqrREF;yu_wmZ);YW^tr;xdruD<5X;Cmx@%jV0Uq z?r5s$gTmQGD3R`lR=1beTm|-uzt`4uZPlvl{V>dDtN-7H$}z zE~-X5a_Sr$2;_j-1I)P)_Tmkq+0kT}Vqifw9IF)e{$C^LzlYX~-SK6$q))bGO%0RV zi?Du41QKagll&#utd*fR&dwh7BGAZSU|F!)*eL0C6l!`^dM=%=>Dhj#_+6Oth&hd> zSnCk~ZSK@!wx=&c=m3BkpSko-XbO=rAl)Etr z;a=fHD)ixE3AGPuZ{1*NV*)r}T7Wt(P7-=A2m52PvKeV{0{f=V;K&NTHGu zU=T^w1i)lBR{NJsWf8{va3b`S4!UA=>9L!zHI0_((PZa4aQ;QzPCWhZ)E*C}BNC5^x-PQUQfYM2IVTI|^_|LO4 zd!!4Xs`aO(kjQHx*MiKn^=qlKea^Pjdq>nSZjIZIo#oe5k~a4PUS3K(`OS7JWb-Ha z=tYr87q;zz?zsu_aLz`Q;*rx2I&O)`EC-=PpD>e)eHQvlS!ArsQ}!F2(}Jl717Q(* zd`+!A7d#TuJ4qa8!}V-{5-}sQ6J=-Op|O^LZ%PaPJvH8`i^g9xN?lob;y!k!n`}ORy)>sLFOl zssLgP81$I^-?|b02mbK?eyt*3%~BR4E;M;T^L2bGzP8zyVv;AboP9|Qihbao5RdoV zFzcuhEl{`45EJBY4_NL0xMnALx&K$kJYWesny{u z+*+gxdL~7hn}1zx)c4Gdo6ycH)86jvM0(99>fGTzzW&bOs4Y;8htn_{Kk5b+%@}Fh^ z-Sy5kFKqkFbQktb(mLb_rcu)rGwUn9MGxrtpfb&g#qyN1%jVDfo%g1DmuL>J(vv)E zJQEABA!W~1x{|k!C0dTvIapekkvG)R_%D#<=#`X5v051P+svE<^z08%?3@pr-CDg2 zPXk-Ye4^B@BjNWLHF4$ssWtpuHH?(nU|!xnoK_Er8fX@Ko0Mo9Hf}6KsA^@(Mq@`o z!z;_TqO~ID{@R}W`QXv@MV<`etfbqWCJ~R6cke9uC7kIGm_hgE*3 zWcocX&e3g;PWPQ-@{q0#YJ9aQT*g_cn6O9^1gq=8^+!ndR)C1#Y?qqZTUeVb=1OQ% zZzfbHz=x}Pm^?F*sQQT}!eBkXhK{}9S-e~cHJoNVJ7448tK zoS7vZjV$wA3Uu?J%vqOX=C%VE9TG*k6A+s1yVDSXv<<-|OJ5l2i9ptE;A?k&_^3U# z+(dnkMm&*@jP#$7NaZnMUC(DPM^@XyLx@Dt02is$s&LrVQcSZ#jXH1^sJ1M~?sgm= z4lhOIFVAS&8_Q;;sSYG!4QL>5>=%m<5;QbC$f?X`U!z(TpC^mwxK4F|5^v)N{QHfm zSbHt$vwxK|Jlau`NfM_T0%D}&`RMHd@$qL4tqXgD>CI2OVKjcl(*g<;8`|~bGf*@h87wHOIQgPhJ$2Ub4s6HYt&j_ns(Ib67JEPrw*z*4eG?kcLQ~UbY#1Nmq4N_~QOjjf{;@t+F$UR>d(z2RgKEBe?C}>OcU0`obj=vnqP;y*|-E`cw zSNPOA3`e*rN!CnE^pY=sok<=G7{7I*>4WRAV7wTS@y?%wxSdx3arZ+#;3-f)coNu@ z(@{XqegG_%t?zRCwITV}wN>Q9<%QB2{l>;t(Hb?gV;?cN7hapGAk7@(FxDbOPwJv;(AUd)vu`StBLsH=8-I0UH8$hm{3C~<-iQ4n{(p+-L%&uzusZ>tX)HaCU* zW&<9n56$L`AI24LMQ%{oWS+*aJ3os%mXC5eDC0c^3DbLRMe zIANzcixe;0ylKDH>C0CnkFw!v8?a6<>M;8}-mk;Y5nDpD7~*E{B%wgWV1+KE$2OzU z23N1=;_%tgPMs&u?Z~NOb);*lami*@E{MxTm|~(=n$sTctQhZAq{H8E zgk_Zb-ucn1Kd9CtmH^Kso_A>)yttaJs)Ix2$rD5?uD$*0XUw=V?9}cRxcO_?2QBG( zCM#TYFc@<&{LHX5Tw<|vDu#Mr$TDhxm=HRnt$=rg?~!zJ@|P8%dkE2+qVDB)**K`)QaKfbYX5R`=iHW ztvFgcy^uDnzX9sxvJU)0_mc1LHuA1H8=g{DmU}_ySA%%H*V)}6 zWr>5#=uOsenji;}uvO;T*&~D zf+YuOsfMcss|37sX`%#-V3GMc+cNk+y*aV5{V~IvHjsX6J*Ryz^Zy|1y~CQow!Tr% zjJ*!M<4Bc+A|*g*9+l9GKnf%jA=D%w9R$=F5rhE2&`Ut+kdQ!t0HHZZ?@|&<2q-;3 zP!zD@e9w8md!PHB^WFR2-@p5hUDjH^XO+FzW_$P7tc{gc8=iK+ZEiCszA1rX@30zQ z953GVs~=iP+_^e^4*252ytao$crFF#IkND*)P7G|>g1lsZpS4&%;WQ`Uu9p-A0r-Q z!K0J^~Ro#{It>$T{mf3%Mtt_^PqTgJeZgwW#e0VrV+Ail(?YF*=Q>S!~ z-GEY6m~rY}WaYjwfWE>nRQ;ej`B3a~>XYclZ-L{|FWVYy3g|HNIhWgIPiKPPj@*x> z(odVLYl(v;2=s{8T=$P&wJin$(roz-z9zXW#|(t8BbWKt#kBY9FO@9$?(cQKKkGBT zA>p+csi?lE!*Ny^hg$;Z;n*T7T=$%JcFpCSTKqJu$opwp7NdRG}~1fe%rlq@4ai?&8WbJ zorLV1Z@K20j)cP8L+6H&$fs|IsrnSkw~;AXk~@yy=@Zp)_5Sm1Ayw3U(6-r9=s#zH zWsJ>f*U`l4acnhDrv-7EE=WDE+4_IT?SH~Kdka=TOB%BdV0d~6pQhdukeXUQr=216 zSAB4ccW+NZ%*!5)>~7S%sn%gNt-82Mt=m!(%LmeKyO-_fKYF8x6xVHQox60Jjl*q z_d;ACoLRHEJ^3uRcCO?H(rU=rvEN$6$&JXZCS|~L&4ET@jhQbaZggosDaZMy&k%}m zhL>JMJx@G~Q-AB*y5{5HCil=e8@Q=J*@#{s6Lv9$@h{z?cg(P4=TRB%IvXqTKnoIb zvJEEx=i?@(d6|QAGryM1D4V26?#DQ7Y(*~~BmYwx7kbveGkD1Mm<}vmK`5b;4>(l_ zwQ&}MCV~F=Ho9`{lZrCIK3<^gj&Xu*Tgr9y1Mr*8|M~fx56Jpl}GRF zSgLu*Q3XxB=!5GXzhJyTuxLGa#anz;@#AD_eyiRyJ9Ht|v_)dq#BNz$_&T0eIL`sf zNFhnCd_l@&@}{v%Np=`fjE-SkEn0}On~ScxGjmXsVp(u|_KF2JFtENB?J}c*9W=~% z9wqqE^URrO$1#03*$;VpP^X659X93sy$jNQ(B?gEp_kXLTAgNwLT%!{A{t4wqanb^ zI!ImdrlQjms(^y2)mK05*2m9e4!igtSUwTn@GYVaSD$AoQ}Uob?HTwzF!Qn z?YD`to2T!~=#AfMX`v=s@f?~100VM$URv-r#n9u6Y=TEgWzo*wM8~qR{8-=*EbJ?! z1^0&0;mT7h_vvw-`I$vxq`k79ZfxoZZR`2xPO<48_r?OViDBFDiQ1fCRy@!mRDZZQ zWBTLQnr}15fm2n~g@po0hsxQfA)k~}E!M`gb}Q|x=RdvEt-KnwcEq{XRsX83fr%IW z+9LYin^;R6lB`pQ&ZL^+u%pN8=nc6Fdn1>! z;#gv|A4cJ5{0$H0VGwJ4&$RG)^|lE4741;+M^J0&r{@Bxl>Q}2R!@HTA!DD@Kc!F- z=sgcn5lHm^OppaRysm)hDFxZ+Y1)P64ZWRdw=r9e9Bakp`|3`wL~hp|JzzO3rjWHE zLMfS!ESU-&GN6=(wF)V%{Dn4*7P=n9j&W<6PCA`$QS@b75rRv7*+g@C-Pnf$c!r*Pc z={i0(0ZB$Ey*3?+9q0GUW0YeG3^Q#{;@S{92NN!plu7F^Q z*$a(E_Bh?aP9CsC6z80FPjUlcDT!~9{%zbAYHKwE2Mt%JP-UPHva;R>O3IjJ!$-qU zA(W!r#rX&C8Q^5eHrb15i%l>y`NfRRGzh#r$Tu54iKx@8p1AuT6eW`mi-1jJxEiu_ zigegYoCsFCy>~kkYVSw=r`~*!x0nIs@r8O&K;yLd z4(Xt88GLZhbGnRc<~|zr^C#zLUX#YY{Tts3x8l;ra}8I$jUKO0kG^2;y_lav)`|ap zq6*v*{#V?KZ4K`7&z0Gqc`ts}v*_Pv!h)EBOxRAM;q}O95%RbWNprz3K^AQF@#>bxskF0~==~Bz<4OLDn zjgNaQ>E(<(4KK*6vuYV*FHChr%K<*zD3TtB{4v-5szw4B+aJi`j%AOasuX!fY&&mB z1)REROc>aHiZGS+iA41yS?kzBG`q)k^n#l9+D0ES$}3hB16nt&2C3+PSsFGe8R_&%C1`uN`od3(vBV)ObE3C&haYJM_^lQ$FQW$nL4 zJlJ#qs%K#xT=}39%f;BGo-awfv92qZTK3kt`DX$MmTJBcm6{nA^r6t*ryp*eXR3kJ z3nPf*L`Pk0ss7F{)3`>rO<5P}r-o+K$v=_AwchDXEk|`HugSAVmbLo}_*Q6|IKx)> z1KO`4|3Yfa4V|>Z<2^gxEc2Xq0snxqv>ujgCGSXPz{(s1OrGAEox`as-$$4AzU7xR z^_$Y*eL_-Fl69e-+i4hi2iMQw@zRh`@)z6ah>I`(U0MGzXMXv8M|xMeyAk$$bJ_ge zH~x0ZWp6)&9544=as21FGb8_@;GX>{w|sAf@;B-ZN+R2hsV`0`U93su@HP<9>nN_Y zg7|liKk*YIm#AfCnvF3YMTFSeg*hgBfQOr`nD#dgX9Eu?ft@iW?eDeo3co+Qot7ToWG*%9$onLo1`93wZSEaYxl>v9wSi^s)mE}wV#OHil*KbiUvkDJ zT&lus@^jqAorTlBQ1Nz5RdkJ=SL8WTE@NwFv1KW?bknF1V`O(>Whb=WAEi$eG-Eoi zAutt^)ePiR^6N_VzfV-i7!2%IMVwv@dk*|s&@QgYImoa zcGWQKPMr9~W%66-{43oE zKltnLT@Fy5J6%AAOL!!D%?;i&@pWMNv#`wk7;$h4*X2`uUYyh6N}vPRr9GnW#G z#>BD&DP|17CICdP3QJtIYbVUIi?IIKYt^kKRf_P;g;@CXZwvB%_xTlPxzTIoK$nbr zhck+@mpIe%vc5xr2lA9e>W#XXhWrD}ZilIU{)gGIM>joJ%MosFR=qxB$0GtrLb?;o z<$}mex)orMQfiDORXstmil!r&wV!=u_WcYdixcDr(A4$tW^r5`&77jV-kFxO2dB#z zSZtJ^WfesDCW3VBfiwu}e$f3k6D!O01|oI!VHHg+M_QzaDM|AU5fbyr^GZn;7X4=` zp`d#8GIZo}Vqk)(IddOBZ=ldty&Eq-&0?HqUNk-k7oE6Q@u(llgRhnmLh02atK_oo3q0q z0kU3Q>!UU;lz+sGrYDBOUgj%bg6HHa38(shV=tejK$|S1)?sZm;&?gq^Wo~;Xglsm z=-%Z*`)u2^7lG|GKPxro0=d{P3>kofS2l|R6A=O6*8?5f%BsH0*B!+MaJ}X=I@7QE z^KHu~T!Q421LX6AwkyUu!r`4Xh`AhCe1I4EBA+{S#~u+_lu5fA6CgSh+gU)Hx@Ffd z8Z$2G#t{u7i5Pimf!)XoS``{E$$t6+e;J`#_iej3-v{#}n~{q{f`+fF2Ph5*9@MmM z>Jektc<}gL1Kp5pF{Ki!|2_7ZCeX~lx!^O1u|hQml)<9O4it!(f5G!(i?JGDQXki-pD77#)B7gvF%*A>;Gj zzTC%x@s{6(dwaa4-#)XxEN~mL`ZUwyT(#HHNUBr=Zne&a(7A+AdDKhzw(+10LRQEy z-b$H=ngdGJjFe-gnveD*{aihFRjJBh;gpgm*GW{edNv$Hu7N^IsemL5`lauGIJ_r* z1^z zyoO`@pM;vUIU(FZIiEH_bL_d;J;HTi_;`kvta4NopIK^Sy5-BWh}m-HBjFdl_X*`c z=N2vm_x<@yO*Izdve8pnbR}P)L8G96oRnrIPflt>^>n}U!0uwxHlvyYH@8nQvMaaU z;LfhGmrRzKmw3OQ`cw?(*Cs2OUO7p@Tl&-~we% zwv}3}7Nw`9!Aq%dOas;SY?fP`NW{-yZ~lP13lsm5_}JIgV{<=Gssroe!);MtpSJf= zbs9a0Ens1gj&2(6*rFOR3~FogeR$j`V5o+-r+$0fJ+f>|H+-1Q?Hce*Jxwj^y`xwA z`VQ8rtbfcMC^z0Uq?7&d_j!>V4}dBSF1Ot>eiPVrl*nb~yhjhHu_GoGG`ZtkP0sCp z1)NWlRT6nEts4JT5>KNP)ktqha2b=u)%V*k;O;vIsqJ%g4WGH$r!_ueHi(4|?gog-q###X^r18H~=NrpU-t zZ#Yr27A={?rl*-=k?aZqDn?FDPEkNGDdddA_*;JGlcGi#T7`Q;hekjQM6Z-5Vj-b534e^@cOsT}#nVQ#8=tG&7|!PkG1>c&{CN;kEVPlp!?I65A~^= zQR+Z7@0{l7SSbnO)}FVudYhaYYSS16sgo={3f5>hyccBKnBz)7g>Qt3QZD50epYL? zV1SV|%6lu=LtT8bxiTBc(id5*)U=Hk1FNKv#4FXq;)UlXT>T^lswDa$w?rH;MU|6K zh?R!0lNW=-7pr0H=Bj)}8GWyu9Fwsb>qOqR9Er|5qC4epaOAjtUrTGqm_w|ti=mLJ*<~o0JJ76Dd0R8uRrYGoDhK};=T1N>dTFCi zNPx(gGM+LNMj+EEQf6bn;8U9adK0RyG$pwurL?T7V-FEd#^F3NN@OAf| z!FOd1Z)wQ&X%QlnKieI$pcIy|sn{PA(XUPTsi%_BvskeQco0aNBp0lP(r4UfC@|5K zcXuwl;N)GJPIt9iZ)kqi4_sKsN6!O6dfV;RlTMByrB$+kB77yNh|qoY-feb&s9RA< zZH*twnPbsz7ILn^V80^Q4w~Y*ukhj1LFdmaOP^mz)p=OFBYfPGYI=otk&2rKl_#y6 zm+erH25k%kfz0l}L~iz>)#-%Si=4lH7`|I;JEKWC-%Fhwc4q0Q#>8=jr>hdKhXzLO z*ls^KuH<>1$T5_geeUaDU$Z zt`h!zH*3m1`Wq&WfB^evS&_+gCrwTF<>ZuqO}P-?!ym;($DOJbjjnbGzjHxKI*?2$ zGGhn`xUM6>0kBXq6$Y~n4@=x(d6gMwT^Fqg;WNneb>d#Jo@qx16 zT-F?!xh~mre+E}AZ~Z(Gfk-+y=G#TsY2=_3ZwjNl(VidCjDx3ubvR(^wH&nCzJC z%&eO9ti0>IUVd!ZKSO_+>G8*WOZb*q?^}Nx7tK5RaGEj-h}U@&pe?$m`(S5fR0(<> ze~f&YQvLxJ3S|TGQJ|T?p{CD1pS1I=W7}~}uMQIji64urv&=Pu1n08FCfQ+Ow)1E^|tN2?b-&il#*r|DQ|wlb+dZ*O6*$9kQ}8vluRbG zU1r{XP>={BmE~K{7;Z5gYTMV z#h#8nS88ikxgQ`N59v}ZkI@_(-@ApNf4y^gp|Y>k42Hgb`<=o_rc|XSi7-6Bq_D?u zF1OB+qvTgC6r@=(T^C>i)p!c@EeY{wx=phhJ7i5NEU5J>ta|7{>UyX98de~kmJ3|0 zW|soCLrWE5c4Cd*VKVutH)8WLI#mNIi~v8!Rg>Rnm);mzdf(&8EBtNPQ+@V9)_!I< zk5HDLsi(Z4V>o{pz=BMZv!^MIF#Rb;l@OgD*~Qv5nmcBoH$o4UI?uMjz5yv_6=vHN zfF`P)*}cjSD~gq#6~TKCl_=ey(bx|Cf?J;|B(#u<(q&7Q3i~U{5PA9dcM!{r+!{LR zN}UgLRyvLe&L{;6S+Ta(%V5b?Oc4hM6(rd~pJYiKsC638>=|lCD2%hYnn20)7z;)@ zhD`*i@vw1HZIP;hlmzdQ3IV-9wB z(k;=u2?@q+=So=fqv(8OG(!$?C==%!b*8{vUGn1;U&7Wkzbw}_7UUmR<8jJ1IDEAF zf0E<>#y{$?V2EYWYYq2i5RQ?sr#wQ1RDWf%KS|%zmB zcOLxPk3{lb>=M1NBolx|=@6HLvNmk$pZD>`%C|nKHD`+K^y%wT z`YxW>mXME1V#msMOE0;f@!)Q(xP9&tbd;+xR+Qf9p;2Hz4B0lKxR%g$p~^=?jq~7( zt_S1Ve`dD4-UxbUor1E?59A`jMB_0epmcJO1^L(Gz*vX7b<06qN@`mK!CE=JrPBvw zt~RRK*+!Hu$opKDL4}6G^#66|_l6~W*LvKyKK0@h+r|)n6SP*ktO9(FLdO>T zTmSj>8ofACU3*%8aJ6_T*2V4A$W>`R66lJbl{>!P1U>cx74eJB=5t%WdKHhGQoPf~ zVx^0+u?1w7)fWew=oQ0%Ye(uWSE}ge(SnapeV(5cjTR`!IVo#taHY$&66GTU1zlcm z0KA79pX7r3HAw`2wavEd-<#2EMcgzDko2lVKm>6pgW~L{Ml`+;6@r{11t2Wt7y3a! zE9N*96M_tJpDwO&e3P}nsKAEt=H9&CKz5ZIB`Zw=eaR+a*| zkx~N{SS1n04mFUKb+amw5}sZAJsA0Z#*=(l2E9(nF_MIyW;n_kzbjiFu6$eVBi~Pd z{;evumrR6HcjxehY5?T_JwQLF;69jquXjZ;VxVHho;#p&8O z*=mUrWO#dl6=NeBK!KPH z^2IT~dXb^z#H4mPOVvm+li>SKcu_!PFfLQ6yWT0+*ud}Cf@zVgS7|=<=GFoQBw#>l zDX9rkN^x*(f+8a)?{0gys4w=|<;o33NXrC`a=AQ-v225JQpF*@(% zgZ=cz(f29oX>MY^`rYnQMYQ{XWv)8@PIGsjAweKVQ(~XlFE7G*Nuj6Om2`fmoz)Y`@VlKOSGk>gZZx0{!@nm+j zdgLk`WCt{1M*aj-n0@(|{`GxuQjv+=_R{w0cB?iC382H!0t*fv#1|{BL?5H*zRu6} z|0o#Ut}cJ4@8Q#R)Q~oN&jpH5hzeP~jGy!aW)z;>&F>1X)SjDgknMZGKNm2ZyO1pq z9uV0EjF971_)|X-0}i8)g!XYBbam^6z@O3tcx^|2=%m9B2IOIQX?YTz46iWcdH zyg~newbA|G_^gY2xB664=a!!xS2fd@ic*MJ1P3#RGp_%RhiIj!HY9diIj$;cHm0Iw z%%{b_$`bqWJn8DBq-+@MZBh~m28;b|HOKj7^7QydgDA*#6YL<#E``Bh(Q=lRYzWTaMdy(!nR&pBkzjVHlq5CJh_UH;nRY>17)z2}8c89Mlah)-$g62C?Q#6})3&Z1as2QFhBxb! zt6}Im`khW;OHi_1!w9*g-tl?sP%7@A-{5J;kZQ89Ey8NOR8EdeuJe*p7J=;x>3l%l z-YI<6U>NydCq%_M0BB)3NlD3lFnCg;6^4PP7Md%M=4G7NncYqB zwYE43>6|06SHq5@5kks9}t?Jn%HrNr5Wicx_<^A4~S)!H=KWGhMp z7$gS+T20lg-WfX|!JKKVKFvZ&C9|);8`*;XzQ)S&T{gL@?>2)8wApV1?+3)8Gfy3> z7~hnV@oC+S-;?nlR6cw#t#e()Lw$3dl&HPf)B#(4&)t(Gp}aM%GM~WHu1efHf|JzYJve@fIvx_mo`K1MYRs1a;3+11vMBQsmu+p)Qt0Asu!Tt7OD# zGQfR7=SrIU=!P5eQ_Sx6r>&@>ACj7a=SRx8Lg#@?{X}MQ6}J*6&b1`uO}KtLsoQ_} z`GWtT52~E+r8#_1mDW`E@v5V*rhs#cvKp%~gjS*G;!IS7CtHdvh*G+*cR=3`^;zBS za5V7+{jfd=b|v@Q7A9U1?A~8cg5r2OIZ78j>pMewT)Dn zYwB!#^{0BRB0knH(nJr$M@CML!5|+={fC9}LkcAYhz+haZC<$=qKALfkul1~nOC=4 z;%!HHX2Xql$=Nnyidtsf^y2Xtf|-lEr50*HnAQp}EpwnD005YXl+~mYUQNZ$_}NJ& z4l0`R7&O+diaf*&^2CW{#Nj?nC&CIWjb}lSWkjczKZo)vIXl$M2lvSHzvq*gD1~jW z%XXR#G`j+Pb{n=6^TgbBNG|MN-neZ>E|@nhaWzVOH=#_>x>X4eLdta#FbMnih7a zuL;Aa=@C>?;#mKywMVjc7H-?LExfwhP5;qk4y)?_r99Bd>O-?B{Ia-S&p`2IJ3 z*}jo%o=ZS5r`JB2vt{mTaQJ~-R$T{WV89GhvpT^%EFdjCaNl>62AXlA_W*yfyL z>HgjthJI)t3!%dnZSVAEE$O`x{Y}hz-XaVvNyYNb*{Vf{Q?}hH~`HThZ-KE{s$SnHq$znwws167YVf3eYC) z;dCOtmZNodtaj`7t*7An%qK-gn@z5(5-IHOx`!P78j&uJkEn@60iH0a(bR@8Bjamo zl7YxI2ofw}c$e(u{pFcO+cV}p?6g2`>lhblJQfCKFJB>WGeI=dD0Kv?bDvy_@nQ^h z-(9TRZ%?FJt`9xp+^LgVJf=RL5``*Y?`zYp$faE0cJMxa$s-B{ z`2w;*7jfR@5~@v7i31X?LQ%E5J)`SKX0G4}gUtmby^EXfW|8(Re>6-$s>Fdz>AomB z-#*7I>S++G81hl#G0+HQP>MvU;gx&D#=eINYG%OYh}|D~>#!IbR;+`F^eUyKY~tR( zN9B=jl67fI%3#_DS?lf7 z=AnUIZML1knu|-wmF6-0lJjf)=f(L&4{!NwFF(G0&{2<}AxH}>;i1oBh5_qHJLAAY zRsGqbH&84k zC%Nx@xYU!^pT2}~zPm5+2;7V%&)tVF@`|T&;q%roX7c`Q-mKZ6Vt4`ZdhbjZrnL4- zj~bJ{4%PS~jctn4*CS+(Rq1w!IHzwnymkn~iUcX;sd zCQ~s+bDIqwH!~=JORm8hB4>S{A{{rI-d}Wiy?&i%OE*hzS9+z<|Xk)M|#(#ZMGO79y1`UiA5%T+Q z_H>dpaOS|j^HYsNq=SoZ>iB1m5Ko;_AGo4ua+kddIM4Lh2`N!F&PRCbYTePj_5tT7 zF|O@1Keh6f>-@D5`AC#g&9-$#CR3ht8mU4`JH-;SkXe_>oFL$M;RZjlU}#B2vr$2s zQI22tV$lI1mabgeWJi2DoD9$qT=9rlRw(9mL2Td0CQjMU3;xy;$yefbPhf$6pYY`& zXakm$%f@-`7D>8&oj&;OOEh_lQ7VUA6FWncx&lmE3gs{Mjq_T&>`?Ps@~rgc7oR81 zW^ZpAyP0lKh;LeQQr`@KL7+-JC$_3W^!q0)`dbJ((LK&_0a%KwU!MQ_L_}-RK9^2Z zz|f9->FD;%;)dD=dP>QAea6=Dq0e+&$bis`d14Cn+RdVzg#_^KvwGB@C{j-au2An% zv5s8ucui|cZ!FJb`ea@y*{uP6KGP`j`5uMao@o2@>(p6Cdw+|oB`%ST#&GKbfJ4d^ zV9wW@k*VgoHJjJQvY5PPFwP1++_{hLy72|pJA1@J)PxfUe zx={2H1I_l;(ab3fmu>1vhHt>j%%bdbSo3A;}2M8u>}_ z_4Z~mUBI8^W=F0N8~2dR+NtB`FV}F6T!5KIo+9LBt+jVj#O!liUONWWhDzu- zJ+o**X}D_!F)ia)&kHZMYq_RvXlshfn$tcM)z@MO45c!z4jy+{K?C2A7ULmgetMvKg2v zq0BE0boSz-I{rYA%==cj*a{~j|3R`;xo&5a+QsIkC!OsMej3(V^ETEr7Nx=nW%2o( z$nEEqHWjN&KRKdOLIJJPG_HfzBaCr`%}7M7=zJy>wlMvfhIMVrmny&~Wtnd9epw09 z^W7NQO#~HzS~Di*bCmoUIfwM&+)pkHf!cMjaejuSWawIcI-HU%O|edF(cAj(&Y9S+ zi68ZJMUS5@y{M~22{&H~P(jko-UN=-w3`4K-xxU%o~8EPS#u+ao(iEj`qq(br1}UiYE7kf&~~(W)VxX zzlO#4jgW>GR@k#@(jP1z;C5=`GR=j@Eb3g~nsjhoXtVi6zg5AK+1Xz~~HjjGee!z;g zup@=$_9>X=*Ze)a;?Z~0FlPpqRZVdbPPG-CTTv| z4rF!84}%6*Mgn;Z1-DnH=S;joDlRhT^NrT#s2v)ApYY$kL|9ZZ!8sij6^-Ho4+tGC zF_WT3rkN;f1gp)k~-LLk+UwFPGM_caYjSS@)@0JP`h3onh-}#Gxnjr{)pNW z1Cjn$OARSK_4!0U(T+klsW_Kf{3L&|a?+fibMMb-=icF`S}L0o{TA+ddj%fLw^|?O zoU8C@Sa4@L&oU)x)+#J%Dx|U;&Tt5TLhS`5{ywpC=0ak}+z7F~sX6!e#bP;~?0wBC zg`ko7vb^*#*x-Qt5`M-FkRA$nFyekygnwUA5B>GQj;=JW#yH|Je&&c$+a)cK$O(Z) z4tOv_KqhU}0%O}{sC;hlBYyj8i>`rp#kl^F+K1n>-6qsU~QvGTM%0jcfO7Y z6L5%|V~v<~I(MA}e;Z18GEueff)3Q->xVXndI$2ort12e*Xug5UI_x@UM&+vskZhB zigqC6yB6;=$~y=65w{=T=AN1bX6~?o-(^FTa~0NRy$2h^H1`|TNvI*02Z_AQUa@1z zvW!i|?V9gqJ3%Ph_W`L-jM+O+TQ&#j=D`Op41gYLVU|2Hf|SGj9CMrBR71R){*h~; z6`QyhRABDC^WG~#U5TFHf}xi!4<~;#WpmVeBEaDq?>Ul_as87TJ$h~TrDrKR?k$bB z4C8r+4=!so7WD9^=!Eb);UL^hdfg0tUF(*2jdT~M-{!ppLIUvMwf@57P>YGrEvb^u zFYoDhHp?eNfghTkKD!cpbR5J!FQdla76)uF`JY$*K5=C>(>yB4ws1f8)grax_0n{Q zW7(^YitSsl0vhDVPGAy`f4`(*(=%?~`Tr2kxk7@+&uif~|2`qXczm#Q(fR1{H%`jm zCq@HbZRXwmR`d6XA3dRu*T7dkSrX^-kZt|t^!$pQY=$C`t5tQ+E9Pj-6>himarxVPuFSP1+^iL=x z_16^}EG7db_1J3R-F4^L8-pwmpEe|A2o#>h;dDO=&@Vfs*WGq5FLy(1+pI4?Pi{n= zZIkyA-W6I!LwC=*qz7*77DrPb5_IrOE|Q-?>NJ5dFJ4*(ctqL~I4O`~E-&IwvbQ>H z*uzclyXiDEv<}6=Bbc2nPb|>HxgBLKOJrSvvpm|D8PNowWs|qq@D`_5LBE+Tt4)(| zt?1w! zifwS`IZsg&SfBS@b0gz?D0o~TuZyo!We9U;CjVsSus zw20l3`@q5@*EE(URe>Y*Tbh9=s^ina=}2SgRA`D7LpGuf>uFpE$ITOaSB}{!Iwn5vT)vp(!P8K$#Vy7=`6ZOuFMAZ8-Y>ibsSW|*iS(zzU= zhnuc+jUXlex|S@{H{r5@U1^@8+h3V;Moe~O`JFk};Zu>(zLi0dDv@o&&jk<_n&+j( zhf6N$Fy(%`X=9*t_xLlqCS`j132zq>wD2{LUph1toC}8qrex?Tfe^D{?FA{;3=V7ZLsbw(lSZVRF<3(eao39qZDO zJu49g!e8@YVeO9t_bFAOrq!zub615-1=aXI(NsuAXQn~{;J0Myr`^GJSvCn9_eEO$ z9&5{EpCjbm#)*99n>JVW@O#Y>c$pYoz(KM)tAzQ%xwDKJX-op1KBM>)E3$iJ;hA}L z95Xm{6)Ra=i&01cVhCXc`kG{N+OA!% z-Rl=W3_XLt{3N~&)fLTo5)R-GCUl28~>w%OG1qV@YW~4tp?jm7b*XSVZVP*InHCw2L3i<$aI_6s6j&Tt)ztA>FQ-|v)=9p03u)Xsc0 zN7u8W++uv|jI~jDcP#vcpJ)G(_3(-UK1e4)MseEmAe7Hlf=uaJ#ohbTokChQ4mOZl z`MB2;+7pIWeZHuq)h93-mbV6JNDw7pO84z93?vt9{RE2T^Nv}GUJFZmeVk`n6zRzZ zXBH}_9STGLE04Q^uj!618Qb8p*R`7`+;W@eE3o`(q?Tusbk+f7EAr!eod}VhA*j5J zAuPkuZZ;!0LQLfb`B`wK4Q_2?{6S29#^9pgamLEZ12w4t?*nx4rlxH3T{2UWTup$5 zWxH9CnV1gf&fh1l6h8jdvq4A&?Gtd>_N!`#UHD zM9@UoV$=5a;ck((_%jVxKZz}`O^E?lZvhwuP89}IW5YWIkX@%%o)NT3ey97x;?c$- zBtQLe?bO5mkQdJ+`b{622>Ro*+1v{_aDugy|m*Qi*> zG*i=WSN?J4&A+Yu^xaQkR(JGhH5%6|9+qd;~FSw5IB8Rb1P|c>wdwQRU4}Ndg5Q3-Z;H% z=ylrr7ISDK(_SrLJWxA@h4K+GoC!^Mfap&$R{`#)%$v((#)R->S~fyII#;S&Q*zN# z^XG>TlU4duB-?L0L?4L{HdoHZYw-t8>vk6=9J0bW(T?v}R%(7`Vep!6%$~|$v!#`l zzmrt=1d(a2gcG7(}Bc$K;y0(MLD$3w4rPbAxbNZhFzrPdmQ=#D#uYK?;)Ss}s zP?&w>w6v*%_b)%{r`i z^5B;>(@=o?YAo^yY_tIu7=uC~U`9$HIa4+3SZnNF_4vz-t!p6XeBvKDkTWXl%GWCt zh1bh^r-E}ropR6gUv@p1aJ`HIe*fX~+HJL}V2LN-a8-&cH7WL_6iiNm*ew~^b$Ogi zTokqI-=wPDr;mpM`a*=1(qI%gxxtJ{rn+AzXG2yJ&EC;kcew`8+(M@Ug7OR%xW7E7HH4h^FFN7PO_Zp6HMKgPpG8c5$@Bq^4dJDl0tghr>i}C zT0LZ1e_T7=%v6r7=F|j`&q(PL7VihAqNS8H8#BfG$3xLl;GIk<@D6DcJW=&Knaps1 zlaywqeDcnRbN}6je;s^g;0H*~>jhtm|7}gzDpZ`g?IhecuH}T*Kk)m-0VZ10efJrN zhG7iiS$5Yu@t4D@(K2_$H~;m$=*Cbg+Ryl3Q;pk_Hb1V3z~GcVD2R%YM<%7&_1@y# zEHiG5=nl2Y=Wyb>+-)ZQg** zw-DaJs+<7K@Rw46L-fmk4XZS`9*i60g8O6qWV8vbKl1x;i8$2*i-~auU1^&?lXP~TQ zVFFvJIp1&S7W3`G*3Z9SSmeGW%2vl#`H%SjmV5bR3lVSt5%2N<#Nkq_O0-i%j@n_fQsjL6u)3?^HRA?B?VUPi_|HsE8T{DVo(*I)aytdkX{oYK z&He`GVz0B#v-a70TS=s*%hWW&)Vwb-f-z`I_#rGSb|&~;o}rSF+wBcHo+hxNgt?O; zC#m6d%AtcS$bHuPao!>mjR-wA$IS-DkJh5Lw~YkpYDn3*(fR~Pjahul^9z@V_!-~4ZXwV+X-pnr!c%ynW{LZXTh z>YD6Q;c?>&R-8?)KuO9d`3Ekr@bDf-bXaH0kY+FGhts+!?B)Vt8+m z(f)du=%DC&+0i#0K6+{QIL{2AeYU<5P^2@f-{Kn@VIDK$BO@`eS2Jd&m7kgx%f(fX zm&9%U8l8OC=nCh}QU9kDHAf1ZTe>>u@ojHU0J>yQtYFh)@Za(d!b}SQD|#OYZvw^H zv}RjjWNz(?Sd!+qqGEw3jUc7a4w5PqTP+5ImVXcz=_I?xiqaB+=4=`;U3(X|k_i4R|;@W!OL>Mbsm@d<_^?mr1|5Ki1{+yZhc*;w7F^DP4A zz9iSxp8Q*+#Wb24=y9^6H1a`d3ffJsJEZ{E>n}!ApR7CUFq*cYMdIV*ByPAUpFBW8fV>kyIMr3)}fj3kK3$G0fivQ0lU6p&51V30jv4Qg3d z0(so2FP=$iEM2hC2pUq+G1YjuGi4aGSD5xe?SGxH$2|W@d29lcqz}LGfTpJA@7sm< zu55yrdFYZ*lEpK)nFZ0mB+VhL7J>yw{ioaC+SB(@ATyYZ~c=Yfdk+3xODnL#7W_iQ z>6oJzna8b-kk2zVKh)pCZ@iI1{FK?&Ya{8WSMknliE=-P=1gND2S)=fm7wyMcK; z0&ZCt6>77F;vgwxCyBj!737y&!qy=@+<}Nic-n5WT#hC()V*1!7Ka=x&X3gj@djrp z<@bJ63x}wiMXh7lVIMzPjdwo8!eNW)M}UWx#umAH9un!)^yceRJZ+d_62L*^JW_9| zX8NS?ZN#;)Ny6$!GuyYdwF+9G+iD^5U}AX(RaMip-OvI;?RUO+H`>cYJhehdF3$YE zskoNRBPRBV-PP-%S9{h&()%lp$3#$zW2kfvxfK=Alni)_E~xinNsZ`hk6kLviB-|N z%=0%>PN~Qj;t*q+1qg}8kg9oWxV&FRyGAJ7nXc~ z>c}3n78MpP5wIXz1^Xe`r10r*t2KKNDRP9*TvyHdLr@K8s^SqJpnCK`Zn4#hrsS|Y z44k`kMk&~)DL#sxGFuVDQ!$@;lPH6=u z*f*e&RTA^gb0s9xY8yN0i}Z6GidcgKu;mOaISKT>1V#wr}Zsa zN6Y>8vm-il-%foqih8Q51cXN=FD~erSjk7l`=tsc9FNW>@4mx5scm`%qru>1a!IrI z#}bYIEThbW3b0ttWTu=i%f!I=$PBzkcD38CWH^dUNEtzjNnc-3J5hMUqL!B1m}xam z2*;}o+4;tehxFYzw`)9iYfyOlD1B}Q)jU5IJy25mdZ2qaAErj%3Sd_6&1=8h;_fYT z*%UX>8S`M&&7s}szt$SoM&?3RmF>_^syVjYH34s{)V1*!*oa!1TNaSH(uS7m;<^a+ zxEwhdFQ165mbw=I**L5F&`i-hl-s;@hY;0y;(rVuMZ5T`xBvHFs@is_jTbm%a9o)@j?H+jkXa+SiDwIHM4o<>4q*L9sN01N!(iJz?|Cg zL}?=@uFVoqA|~%psiUWo8h>n-Qu|%fcuZ8%%c45aW!&sHw()Swg<#p@T+&|RPX3-V zYAkjtD6pc}WBFV$ZB+pI%+S2p@ygDrX{xVMG=wblm#Xa?5zv7Ud*a5Jg4yuDR8AHOEW}R;f4mth_!JQ)0;d$Z9c;WvM_Qa|x6HBgO1nPE zuHzEqts*}Lcv=nGRJ@a)Gpu@fhgA2gzh^E>3b2!VWX4~i~#@hz}m+8A_b_jcC)l;y18 zKRsO-BmDf|4{vAlS9IWX1IIX4je_yUwF&EPk>dT?1+Mm0SD!;!qp&a4KNK(LmVFTB z4rWs6FsldgBf`&~Us1P-*0>7Jy1HjRa>B6E|GH)Q>BQ zek@~9-JadtD$fC2gr3bdmvGm`dtun!uX)jME>oqSFN6Hh=q8IlO*ne%XH~F=+&O|4 zQU~$*lei}Q5m&nrYt;IFQlCeKF4t>I4Q2a6$2UT=svI@9S>154U6Wn>c!3S2xa-yz z>$L{wHNOr_|MoMtyXSHOr{zn0-xxdnGLpQwY%zE7d}U)vp|+DWbX^irbVWoY4V#EX zyITFJvD;kMYEk@*j!|q*n8*A>bcP7W zH2)-`Yyew=?vlzf>m$cM0zL$M-X`$6cy{NGrT4(<$?Q8$k57IKGT#}V25`HRct(qm zDICyUSMg2*^O>N9FPMeXzM&3neRYH$&I;)CwgY6nbYp4rAIrGo)s0&+m5Y7e9`=dr zmqh`i?GPpK&t*8;3X=>O_5Vxt5=!mW5m=W;#;Kc1Sx7c!UIm3cth{yal0lDp>0wP0 zzD_~T<1?i0JS@x?RH)$)tbM+0PMEAJ-Tr;H_y zB_pQ``ITx8Hde3K!vyLxz6Vfj%;H)s(Hg`X&l}ir-Q2;lYuHhYXN%l0l_l7wpHQ(X z4>&6!1dI1{&MM1_oiv}#uuLx5zHRj}GO?Jjq;*1pNiM@H+K-V!=GNu3>tuHF*NPnO zs``hgrU2uYQbNSzleL_}WCCZ#3zvw))W?=Vx7cC76|Kod^*n}4Gj&iEA8@zD%Hq!m z@BzDJF^~Riv6q#xk?c?1&%GHTK25`01rkyr!_=OeuOB@5U{a|IbzZ7bBwzRek5J=@ zY>hGVIg_AL#R%*zadggHhhY0phY9%Cg6O8x=$l-xbgNHBXLQ$BpE@O4RhZg`JfxN$ zH)iw4)f=`^62_v*Wj$#%VHTcT8rn&@^8_Jox|7jWschIl&)Q}SelFtX?D@kxZcN8# z@5}OKBRqnRRtyi6LfFFNIg5U8z1t$y3m@j^^JEc$+Y1{_j}+8PSKO;+mFzk_8cbPI z`WX>TkVUc=k3_WU9*M)p%h=3z+QAdEwwNMu>%)YhPXZ&>kB{mtYTz%GbQ()BG3wSx z4TFp!{t!5+<0UPv@Vm35M={u8sdTB{C~Rc0N&0s6GBCuh;(*z;qU=nn9HPZy{G=+^ zbw=l|DRq6LA$b*gIdqN~H)z{i_$tNAIW*T4lBhj_($=uvdyI+KD)u$5^3L==gSsL;;Z^!3Or1+NsvIoSCeHdH|qikwpGK%hwizi3u&sr2$;ws>LK?Uf0A|CZCdhcH2hzhuGI@pX+rD z%Tw6VIq#cqyteFy)p&4|!VPyrmd?ar(_05IU$4Sjap;Zt0~PS|EYR$khmfL1KD@++ zLVD`-X|`nl0_{McQ-hA_?}ge5Byr1q(b>Bk_dv>;V~EKc97B30uiW%lSNeHm-{@Qn#eB)> zGTKgEZ$3h0eJAG}{8CeDtPkjGoZ~`E}wVm zA#5LGHzwDPgg&yc?ZA0%oIaPr7wwLy$b)ERyVvEblB@I_LztCM>COg+rBsgr%;M;_ z=V9(AGyJaz#Y0f$hjB8A&wYBqwT_|3YHrOQhU=djIKh4nBccF8UZ5TwOO@!8lXv*Jdpu0z-!y%3sgumEWV8_OeDsdg+gYHzds_~65pE-bh^WBu zD;M`CP50OpJ2n5LKO3drT#(Yw@vv|+;AMJELsPp8nOy*9}A^sG7Ki&{+)Yrg>*A}Gq4HE*eMlAtV`e>0$g+4{pR?=PL^OOGA za@^K4{_c$}zbg5a)=IF-jmG^7%boVo+G^jreXLMVqM%NJecZ=*glT&>ph7`RYnc{( zGb;JdXj_gEN~z6aNOw4|kTXBlzlISvcKrTZG3JquU}d2oKnlyYNThQ zM<<5VUXyg2<=yR-sOyR?yg)ZW)0|eDA>5@QH^rKINQcVFe|naQfZTTBHH57!EOn5S z%6+0cYb&He{@tna3LqO`@LX(L!QK0;1S>Xh@TT-X?HLT?Pkfl~yxh1YrzB&AXX5%Y z!o?#!Y#r|A;^7k>w_Qo5JVjPwoK@asAUi)eeYR7W-<-Py8s`}qEVKwTvH_fsOfI{)mtgnS#`wtMmG(YX<}mjRXT%2!E-}tWTnA=G$+! z)?Re#I7~oTS~4+eE>#}240mq7^@hRyFCyQ#09M(ry5&pmoDa)2tRE83uLfVgXZ@{# zTsF2L9|oaF9Wo>Fq2ztR{`4M)tI$Qe%oGt@1DkW3u~SGcDDI}K>?K0D7DrLjA%d$XlhUuBzLYEf>iMh6ePmE0ttEf9pp1-GyF{xlv}&P5Cx?i&qO6&-?d zaCRC#L>;zL@);d#M61%H3WsI9N_m=Wy^UwE#}?8Q#?qKYG$fXdqE3Sf?_?KNyid*& zg?+Q2(_sus87{<6GTRj(LG4GS;vu6He5*-o`RRpUz3qeds1#zGPl(9M(*va%Ngw`@ zxbU-^NnEdkkPmK-TW)!YT+%4Nv6CF!3M-|UJw7#Nw1ZjBE^+iGh0o?hzN%DjecCG1 zYiS3q4+<~{*$eeb!n6J=jp|*b^S&b)>yRH}R4$NWsqTc#$P^xDX( zTuy0fE?qeQ#YWBBYc9Hzpk}FU93<5og|i{ze79m#WY1Z!bAJQ#@?&HZK^{#pvN)pa zx&5LevW`yO`X9G<$((XT^vbn5kV@dZg4k>LMzq24s@LlQpo)VP&olJa(AbRFzBqqM z#AmfFBoHOq>^kkW!47Pim2#?hRC>kk^+L5ElqRhsvNu$(T3j_{xyJZd&WB7WZv1vO z{B>ST@{A5G>1Lk$6$>g$_T_l$ab#QK+%nHARFkq@>K;&EH?>{HV5#3P3*2>GjImUz z96FGBsqh27lkhTP2(O7JLaNU4#$Acu@cZ{ZO)eh>j@&oLW6v{GP-7jM|T;^?o3+9@&*Xlm|TN&E? zAO*rFAR*Sp3XAexAO(+;1@;r0@WYRsg(qNJ&>fW^h5K~l;hhhp654>msDF1Q%?YnO zRu-jr9^NssKPIeU`ZkM6>-!8!P7Pb_v7^7QRfXWz2yGOH@W!L+eTb8fx&TRSVQ+yT zh2|Xw7w>V<+f~{E+=r15qU_#g%Px-Qox!i)Ter$NK#~|t!_cb-W3i^MA2WrfQ3wR! zfQ5pYoW38TAjnp&JGJRsB>?EI;qc7K0=kRRB4u z)j)=Qh6Mmm7T`nuF-uZyLbIZlb}kkMc>k5%auo_+I57{r>~-Cb2#ULUwZhWk_yVxt zz-2~G^2Q20FmW!Kg4ma#bQ(77FGbt$^>T-D^)=c_-wLW2JU&dzpDFKbB*=MNo)u5b z6*xMRR#5A?0%43dL+8wrL*Pg4q-U!0-lXzP;3S8Tk`m+Z7#w{Gz% zkn%$u=h3R9#H7wMpgzpQ()5#aU2Bn-xb!u*wDffRkBctGhl}lQ*{VSiG@gpjnP#+P zneG~gd5skg?2r6&?2>NtmLvmzXf%AMXtJd{3*&^olJnl86L!~$a{V`?eM~DXUxJTg z?EZ{tLna^nSiY91KMiDlveA8|L76}b*_slD0J;@cEj(vy)O2Ui_)#M&8$R{CdCHeW$_&=QOu02fPWFe~L`^yDk z-F9TTsCwkRitY5jR5tF#Dcd->9jU8oz^$#~^ymDsK8r9}Gj%Z;?CBuf@$Vh$f@*;v zfd$m)NE|K<(-HT{)(JC5kER$O7b*4NJOC05_6Daj}-eDV(rD~UP zcy-n7n8^v<0xYgzb+S}6l2mjYDBzdT#=exIjxv`m^x*Lw=Rtg7{%Fu-EaHW8zk`OX zB)_Z6ynl|-qK#mLSoUqaCzP07P&>#Rg&LXMYss27;A^b%2qh99tPGoHlr9x3HMaP< zA@y_OXGB^i@bz6J{r6TSI@7Gr% zjQspl(&I3D8;cD&Hll%MlJ_6r2)YAXepKfuxS0)qhDPqAQ1TxTv{&~@6Lw~~XcJHx zY>pT+_r?WB?=CUjVy=5n$~4|m05%~kkOQ^!cDZens_>vejJfx^9sy^;n`5!_m>uny zZb#0*z*k$lNp0R7^IWtx2*tsRYxL;E=F`m0z>e2q_l?VB21gP;Z6@hYQA?b{F{@6zF$xy67RJ7_m zTawHXrPZVH?Boy0lrB`V{$S(A@Jj9RGJYEr=)nWC>Hv?nb4^r&y}b*d98qB1?!wCF z18rI)p%MCDmPosRwKi+s(6R*d_$6mX0T&g;37|rCI@Qy}7+JFQNOXOrr2txaVUc4-*<|jcF!*w(#PIaFCy7 z7c?XtudH2=l~6DzPjuK_Vi9Ys%X{Ou_NWrw9qur8%$FiehyP*3sZ};_IeKL=VINNQ zfU#G`@v#kk%zcdGNmJfkSY>qQpHgZh={N+Yw0IA$WTh1)Y8Brh8KRa7zzY2MXwxrX zpMf0PxTPfP8%zbn#*VEvQ{?bTzw1WBItdjdqoo5@+ED|As$to4!@4uu@GtVa`>g{7 zgMnFMYkgy4rKq_f+%xw7tZGn4EMQGMyppoD2WN@wKkESWQ5p#9@CD4}O_r_O$k=@@ z>m)UY7g7)fjVv`;S1X~wv}e~1FvolFpTFzvSMWW?$LxF9-4P7fbUBAKiIV{yfBi0WX@z|9GQI2%8t9!zX4t*<9Mb!~u;WoF;Bt62 zWb)%gO9I-)%udFqRAvP<71TnCqr@{c^GX8+PD7N2Bat5-a}++6JhuVG%>l>$QVE^Y z-gMabF&CSr@vQ$KC5?@~qCs|CH9%CYrfkXPo(rO?qEPpV%7>Q&uARdm4bG*}$--vS4ktRw z$F}Sh$3kEJen#}{!fmrOHQP}-r{Gs`JPh&f4z+#HQVkaGIp@n7erhY&b<>$bs21hc2~eX4r=n1*DwTe9z=jN+c9G3vDcRBr*$v?_vWHrPJDH|A_fgvn zd!w*cDHe0AtWUFDJp699*0&%(yph$Z%<6{rIb)NaLSlCCB%g}a&1|ha9#%S@hgKUN zHJlucl;umo!nx={VuAWq-)KvNUEILXUNo9uGesGX&<;2wRmu}!HW#v3_OE?Poe$)a z;ChNRpYm9&w|E2I08(Pc9E>RW^!yeSb#1?>+V9-`e zdDtnl3CQHeR7(_ar!Uw7Y>&BpH{7A3f4euy?Yy5SW`P^rN)tSsWnbWf^)|Xeu&Z9S zt~K{q;uXYMto6-ziRM3n)=A7><~r)W1K;^53COpV$~L1^_grJgR;6tbGg}BtJ>_79 z<;#m$;}=jF^cHvGI(BXo!?AF^LyWTr0!RT)&U7!_S^G$y!@8sXV+ zR1fwJz<~f0*UtxDQufC%4S!(aL{|gYgLvYNT~Zi^0eoE=q(1o>5awDnm5S4nec#Qt z1?3g-k@&>3m}On4T<&k*lH{<(Oz!rIbTGxPM&Xw&epU{05s@=!NMila!^99JUI${ zrpszAmx!kT*`gN7(~lQ$^0b48844u+&zd_MAO^Eomod4)qo*Kd!ZrMkgJvkGZMyfMovMK^Y^4Z7u5*!z}koXBe`?x9pD{wNKg)1dxUwSqxfLoi~%fEBeez(GSqFSzl+?1vlsXVDBXCiEEudv$(DG8o zC<~l+BU6o|%Hl6osJ#o-|7^9nzUciY{G>qlD~ETA^u!-)Z!X)BnPCq^@N2%a-!yN& zp5O}Ai{!k6%{CZ8&t^?Pb*QckjO-TBI9Np+5Saeh!olr?+RCiJ2jnq^)7wJ?;fP5m z`t+<}`xhyqh&_g{uanBX5z*5;H)7lF=2x_}CdP4x)Mo$Q@odLY&3`;L$p}b?DGxw? zlT1&sv3&In2=um!@sAmXS;Y5-<>48H(^Ns)xkaNH(FX2@_Z9}(^G=+J)%-zOqAAHS ztrTOo6Y6lwtjdEGOQ=bJd4@JKQbDb@>nyqtA+XY3URggPd=uPiFj$pL*OVj2=On>g zo1<>_1sWJk9qYRpRW>;+X)}1nET$k0+OwP7@EljKErkqLLwv`vBA(Js9L6t3{gGN- zSv9lul+s6p7qagX(p+-serfTjM<0FVG{B3UYqW~|P;)^k@%NkwVdhgGb}cBMowmcc zI@20KgDtAAK6PBi(Sy9yF9W#POA9`Qo>3+eX~tY}cZ%Q8V@SAS@aksf$DTk|IIC9> z58llb-Uej^F9~F1RS((mdYg%==e4Op3og18&VnnTivT89g4c!a=KIiZb=N>-*f@}G z8q{UlfT44nDN$l|ueBow$|?}G97btQX+;cf!lJpxl|1!E!dOPzy(!31DN@i_5YC*H z?K9ghrM?wxdRkMUJ<@B#R|`G!xv4B0zUK5Xt#*neNSs=B-!t44um`-&#hA$J?HA-! z>UkW@@Qr^Yv(kKifH=&H{7e8SNAo6>KxWa5c%LSXsg{5 z*d5LHMeYofG#yL2@~(Ba)jR|FS{RCzxh^X}CK_~rL2^7_GdoIJqObwQ+- zs0K@~0y~)xvAD_F&wVB>Nsapw{bKHU`RegxB7A6$9ySfRTBL$$om(HxZ3T|Pxw{gdn$0g+O-I47P#TnLF z_la`Uj;9$@9W?2LLH}LN=J?dvm%uTh#&y5816B1TtD}MA?NPnt6vjoe-gB{aC(!ml zNJX2x?!`4owPTME^Jc2UPyH}mbv?OxrZgXY!$@nrH#h3U)I0j6THqMPvD~0pNu>rb z!HjaYl4b;`z_RB$#ZDU!k^$;f>&z|Ds%8LCbqF9n`W-=P?Cef9v6^x#HY8W_^Qrx> zfWacsCh5pbBEc@lJUjt6GON5{HMo2Woi2Evc3J=-~kT8?+t8~ZZX)f*%KQf1H4qb4BQkl$|9;>he;pvw=$ zEq!0H%jg42)wf{aiSs_!V0hIi;vd2TS!0pp{XEF7>PS@^(*H)i{c+dvpA{>5`>NzE z`3aB;9hBAxb#HB08a89z&`v3<`kB(veJj8wvg}u3A=e}-H0S6T9-l8Y*3v($S1Dhh zbiMN9;F~$2U$k3Yr-&?wPtWyJO8N(rjWZ2+%#VK!j#m4U0{Z1lnQnBM6w#One2K1}@z z>IbD);THYt)u!Ode*0y_%kWuC3xFZ#yF`sam5F(0Gh6j%2rJ(zbLH`C-sr>J!#n3* z-G{;9H%;LAl2w=;H}Pbwq>tN<#W)^dhE4Sg8hrl3D{-0SZB2oeZ%yrQcc9HoNynm~ zD%(m>CSS%!xv%m(;>JRrxs@BkkCZrS0W`Q60#>o4GqzH66D`%zwCxh)NXHL&56V~K zSjb;OY-Q1R_n=yz4>0E6T%(M^{4<5Q29a~xR~*nr`Z#|+xO z=O5JyYMTmN{C)n&gA^yR$`}QaM)^GtmdP)waMAMH;~J+$$Oim<`=Phd1*$HOwB;EX z{Odives*v8 za=SO8awV+z@O>LesA7}CL<(GI}s1Iw}4qywr)OYdocXHr{5J>JQYo=y|4Cr2N`w+Wz)VNzr5l8-~CRF zi3-^=cOynzM>ycIZ)Hs!50pcgSvO!`bE?Geb70Q?Qc1xyB(-#BpwoJ`n+clDrcLma zM0n*+3S2LV3#7c3Z!+Po+fFUqpxPE>C1BX~fwjXgq-Vb7@|vVyr#ryo;l`;Pc@CZg zJSa+OY*Zc-lTN=>XdGYosYlN$elO%fnz!Y{t)dniUGofJ;_~go#2yEK&e#R^Lx_DF zAwRCjC*y?9Z037@DdqQ|e(l!pA)E?SefTN+bjnKSHj%%DudO~F(?F-KnHo$7WZ3%R z@G$vJ$}iGjH*YVP6Pug0N%I*WemC(#+aO)k_m=H-zNywTdaho6dG!zR@1%;8S0?tD zK{2nuU8d1V8X(63UcQM2t8Be8vH|+~Yk~tPpQiFo3&-ApBk_!8@cp`*Z~=kbBr_yy zTDM@t8W>YfNB}P4U-%Wc7GpLAK;Fyc^N*arQBDOPKr(2($M%X?zUkW6A0KWwa$po{ zy54VQ_oO9vfz>i}rxkwR9lR7GRR}XSm^Wxl*~0=6@NqL=dXT>5s=9kkTk30+?-FEm z7A5PD3x8(IT#GnA4hH!GkNer33GYsvDn#5PT-f zvHKCGS4*Thxv+q#+OT|(^%fO4559FF=4j*PI zhp);Wyxbg=OFHXz;V-8jne$A?e-sCi)q%+GzIwNBeLa{St*}!*lC+Hx===9>{5-ep zVK)h-sCHpxg0pB3YY(08t?zt(eAyux(t0)}8k9O-s}}&DdL(wy!S#OC+mrT5+peDD zipHnD8;9#vtmCcsU^l?%Nc4{;wuS6wXciowuin%OZo4RdzI1BE<^m%Pzlz{7@-#Yn z)#aNnaL9YA8C_dzDNC~XcE1zY*iYydMzjQPVScO3wjgxxA zm`5msgGSG-@Lkb>uVs?03OOS&3uvO$=S3E-@!ArLpg)6I=;0@RqCB)}PHE49(Cu4n zy4~N|aXrV$4U3__8_(Q_wzX4d3!VmeT|rU;GQ;h!J`$cJNY&giXQV@*%GDKn$%^vrvi$2S*{VP;+k1EFtN z{70Cl2rUHoJRr$IZMG2FbPyH+lkPMyJOl?LSIaIl^Kn^sZ32PI6GU9u*x=)az}C@^ zC|ny*ix{(uFSfl<1VXsgrbz0CiM!DV0>}MIk4>~Y9nIH_TOh%NWLs)A$%Av}c zNu@nRMycHkJj9|V!R*y563JV@o%Q~BPqtC#lwCy@p8h4si{_K9*dg4qA-`F^ zwR5v-Bw^!bwf^q!QSB8Nm)2mExtKk8$IcrdmVo@$A-K(3DnF@wX2ZqrBzOCxQI;<} z-+6Wb?NxZc5BzzaqHg{m7}RqAxnrcJ;hb1u+~!%zCIDsRjYZE`~v$yxt zr0(y5d_o|qZiAWEgbnb?7q&vi9CRBJSK*%mF(0T}0qyfl49^bfiE7oSz$W7(8}>lZ zonbx6-pFoB(PRY+aW=`$`_eAg;ye39&<(oV#ZYic3JY%2^?`tz6BgR2{n^0cu3%kJ zImA{0m<#vwzK_GC2%C5rbqF?v{x)7vao-8XcS6XT=^nl3s85(5b-_C-om@&!$Tv+~ zZP|t!vdRaX`m3hN*EV-zmTdwZj{j1{ROlP4EJv7+<0pI~{4fzb)=N`}ou)_|jR{jS z%SX|C6G>-@nk8`zgQ8*s{+{;`Uk~=l?E=-g$iz%@Amg>`wq30XKh&DQ-$fYomxMb) zhAyt$N?wzH5@@@G3Q}Eh(OEZ9YrzaZG=gw8Fv&Kv;sc=Ty`pln4FMTO0qfmcHvD%z zV-V1`@g1ONxQA#Z+C#{fShdlIGq?JM?Ol^#zs99!Z0o%t-p#uQKs<;3oN8`Rtl6Gn z=X>7OAC|ub)Hdc4{5B=9$`+U|q`z}BGzlGi7v3GXs({ypekf4R++n-LdcU#?u-(4M z5i_NxWb#R2D=A>b^=FEij)CPiuNOR@=xgrHvf;9n>dG_R_VN$kGkT*PxcQSm;-oeK z93`XTP+us|B)og$U?6To^Zq_l5HmtKnp}s&PO6lM<6SS%uT--IHjA?pYjBF-cjb@s z8S>ig>56bGGCs!KhX!|fYO#%@SSjVx%f*zU$Cob^=g|)nva0&@A1LRagG$1S+Bxna z1tpM;8&3CKL^2Ue`KDD5(kjq+t>-%GD`E=-r&`yN0Sj*MTqbuT)er*8sH}(602%Wy1pS#T@Qr zp3`Sdb8Wi;UejI5id-=ZDL610Dz(ae6D3JaJ+M1Qu1tes?tw+oPL}>8Kf1by*Jr}s z2Qcc8x%?(O&W*+WFH_+lQ!LN!0grF7@X3SI(Uf;cn6LIhLRw&*(p|%>?P|$a!DAyw zd5FYeJ{#S-fA&OwEu_pocNU{$Qknl@K6e^~ZdmCMsuTl%ONR9>N-!I7PzS_q1OfTI zre17(hCj)@l+FuJOV9Z=VKc8Ub6FHt50FOMb1p((-g;nl85i!V?AQaucv@-TCEcB9koz8u*qlzR6_ zKv?z0`q?K%1+?U00O-t0{1Lc=`g37Ao!qo#`D7k+W*lfPh`kaWxW8dDDiU7zh}-fBf7$GO}k=bJ8sYrPOzc zIlmEi^N0%{odTTG4@RYod$fG<6FbL5Mw`2S$sGo?6F4WNADIuzM@}k`Drn{#x|((iAUsJjbB$*5 znM=#q*WDGTg^ZIR4x{<6ooy*?i1Pcb09gNWgo@uwyV*r`eEy^t`BI@YwY=IL^d6a> z@F+Ryv+#p3$*&aH;_G15of(#HpF0-4D?ja)evfbUOo4sawP+`=s{j_@QNZm$Z0OlK z4N0vfPqQE4OJs65GsR{vuhntiA8+Qr%!NnCm*;|4Hapf{7EcpiYXcRd@;!hrj(Rif z$`q9TXw8HkZ#Y<^4JY)`@LY#!F3pQW!jy z&E2j$VEzdBpZL@*h^^n)g|P3DrFn4oimWmb%Ax6(sy!o*_;V}u-hC{G^>=pTi6xkl z_ggdjakp_FYVn&q#*5iWc}X)5fC{cQzuco$_)sl7iQmshC47du~DLBqrUQjMhq zmOU9C$)ooX{ggkWKuxw1gm2u41leE?!?5lWqWgq~CQ&}wwJI;A80eR>`UkG5^f_KJ zh}B=Q{gjBZux$i&kYgKeYvWG0k#R;wrx&dxqeFwetKt9*i=Fh=xpz71emPsN<~x7F z+0m|HAvkRWOTG7@uTE*4il1KkOShJ9X#mnA^w?~&s;Tg6adUq_8QS8jD{-!u`X-8N z*8*|%rmMi;2g{A9GXi_I9Z`B3EMZKwHiK9g>PGLtbm+|<^tsnjXSn&BE*Kcy*y&NA zS~#uwCUqf0Icj@mUa?rWe#}^J*Yg&KMM1$As&Kzi@A|IiQ;KeFEIL#UwpVbYHE4ac|ElTpBu@&jYw+eD&&r_hg#5+nUWp zFBM-IF4#4U{`~IHw^UL^VMt}`FqNwcyoM!DiL>A3U)%X;UQY+E;xynY*{K$?GA!ZF4fU_OTl*i4i7+b6v(ehrGdHkG<)z$0Uln zwvH=W0Q+4hd9{>bu}<&Pt?QFpH;rq&_(&Aa>6sssZQ`Y+O1zc}5x2bk%`$HBKI`(< zR++V$tG<_ea_uiw;)u~`^XdMa_diYryLlq9!WG0v$$dxq5k6Ewss9CsHTDF@ z-=YNo)ggbW*dzTqkN=sWHNA4gKCLZCgWJLfbtGy1P4?2_|5C-t>2m$0ieO%j@DOop z>0+@Ax^dbN+1=WmA|-6F&{ot2U4m`xBuT&wE$;HH9oXA1?D^Skx4y}lzkC|x-RP)& zP>0wqPkCc~E|Ne_?XBBSTtwXROLU%L>LDeK|&HgxcFs&6zXT)(r5 zIKOv{BuATmcaSxK%6a(&KbaeqR9G)nK)-fvpUjQbPj)k@%BBycE3UuY*#Gi0VX zFPz6mKrOxG3x121B{OC3s?J<>_7_Bo9XDOA9d^;qnIq4B z<6Dsf%#D$vMxb*VhXo}yXGhx{2R;2io=yy zY|>`rpT)_nYJo9Vh6)vU$XScel6ssG9HL?_|ZA(q|e0Tff zPDazbrD1BtV#bd*TxLfFNw!v=0e`8|IpM3zZ@P9tVWogxj#G_zgjXql$RL>_J~D>q z-*K_WukEx!k`T=bhF8%tq-x&BOTzaLb8Q5#?6jwkpV?jB%{B_R@^xsRE>qG4b&P^s z#*CPU>Vu>G^hSJ)qy?h291Hh4B{3f`_WMajI4|#p~zt!qZ60hrV|)q-5NL4De7;}h5PlqUPtq6Tj&WLF_K zap+Ah7uRy|bKUQf?*_%CW=jpsflX`E7%qeO<<9NKu7(AQ+n4>9JT#9G~1%~NXy;Oj3K6aQp znxq}q-hXMtKgd>^#U~&dn0&AOGrK!#(~ma@37-$z{6(C+KN}#8*8z%47xVq`4@Y`iK0rOlkb9nO0&=TvT3j1DO_Hv2j6l3x8dY&_Wa~* zl&33C7imzr^)MY@A7bn>RwmXJVEY5 zlc)kxdWLM_%a}7(mYI9!pO`(Cde#02`kZkGxejKdJFl9jP+BKD2yC^~ihveeX-?GW zjllTN$4Xx4##S|WYnavuBC7>$^HQj}ceM>N-cAbs!rmp2WcHO}DK4K(d4{N96x&@_ zgZ<(g{BrblkxVu0%WVOT0NXZ%AnHdbCnzaAyG(FY=SDN^PhSTCq5L&dvWm7z0>;4= zr|$qwwt;ze4ro-u)B3aHn}Ug=MsMUfDQZP|`8ShP*v|`Ss@V*USn%zBYb%0f* zC7*vp9)zVIwJre1IZihp3Ua~*+)v$D4Q^O$1D<8U?n;NbVJ4gC(P7U=Qu4tsP8)Kn z0bfWFV%uORzCmqoSX($a z!l}pLb0TGv8GtOrY%XU*RX|b4NwoB*Xl_}9FlGNEB4VPziUoa72oEJc?@P39wm0O` zngiH-2m_!r*yb?PQ3~3-Wd+m3--esO+ItSppY5f7Azsq$c(?Ao(8YWd>S|f^g|Uf- zjmfwzmF?YU$gzCNV8+*t_pJm_;e5C~0`KVcyf865?#=8>)kDaN+XK=URPdf(OBC_x zW;0n|v*o$|TRZ3B&4%K5@wTc<>DTN->8s+|o=ubvd)A7bSTPgS9x2s_s#UcWv1gVM zi5awN3ngO2YHgD6icnPF@BHQ;@jKto|8UQ}=bn2m#a}_X()10YIGTxeFnc4r)CGb} zNu|_zTn2l3Lbf35UYqMKW2R$|qon2KrM`boC`K2@CkpjsX2vq~5Z$q-)Ip$Uu0{?} z2Qn}oQoMfozeb3c!}sq^Hg~K|@TfEDoLul)@U&S$uU*Gp?6mFZW1sbyPtRCA2{E8C zE$z24P?uVLio+lF@ummw9tgMR#w4pO8p~(B&MrBW+00UMKppFv`mq@karFmO$QX_+h7g?T@)$j2LeSFl(WA|oobq?Hb2(6b7Y)sqb$$# zvc!$VGWaf`l(jk=nK>K_=t;Wv=lJEqB_TaLKU|!{gl68Q1A!9Ta^asx2YMoI&do(v z^gLKy%ketbW@#H)=8up-U)!W*FAUS;=k3&DzyExfkg&$q{|jStbH#_c;m%RSZn&2n zCnEU+u;iZ|=$lhrVBNmYu|0y&DPX&?Lb_hqpWQMx0_)Hlu%$#4&zF3ezZbq{`z6e9 z?%2NYr_9BBD)su3ztl5Ha4V$salv=BS0tcr|(MXA%Q03qJk^JYb|hg=QD zVkhSo&>e&Hv*~kMA5YM8s8V(xAp-Tj0CmFSxRmdHu>14tCM*QC5_UmaD$&mdY~;e1;Gr>zb1Raw8lTOS+`7l+!Ms?$$KrxX9uDwr=IdthbL`b2j(Vj$H-eU z)*g~4eo{KGi;;(ixi%!@K9i>|sK++0J9(HOtCA07fc9h?ezU6!^$6dcgwkO1ndKHd z0b0vM;f-?_LBXSZ{Wcrm+MG^~McyZpZU5;iY^)U;Putp7n3V3O%u4y|O_d@Q4a&s& znwEioF3s{Kl!>xSgI>v^BbIySqnZ7G5iWo>X*tJUqLp3GHeelkF99qDg6C){r+g~@^oQYWJ@ z*-gs75&|1T_-*x#CqZ88NlE%zw$(Z}S``g{+bOs?P`P=3RKVX#HDQLK)AFU7*Ec^Km zX6a~_wBiU@%;IO^9n(`v8yv~2DmylZVUN+X`GlGursb{B%&LaV0Fl~QNg?0 z@5@Hw=bNq(JmV@?%((x9p1X{*-nh-d!0v0kVr@!Bnly?q6X)|E%B8Mi(>_Q~24{O^ zzJp9X#i_~m9@%&GY54nAJ*btfxdSX|RVzosy5* z8zH&tmvVIaEQF=_Cj*mQVO6kZ=+b3gXAJ{l1F8MS_2A6keuI^Pp1Q1$H93VQ}M)h^TqI?f{KqdlOYNTJRE0jQuDiO9k=T>pi&WCspfZ!*%Q1UxqTeACET`t0yW>RwYV|Ezl#DNMb+mowcY}PIkS17^lBM- zE{uSIFFS42_}}bj|X23`0w=BXos~qxb9^ed1~GbYlo|Nr%+CKW3F?G4BU}r{(M;U z#|+-FEL0>D+}n!h4#;#i5jxLVvu}PUm6+j9YQ7X{9Gn3+e=zhWb0tAa`t#1&#mTH4DA}BWhZE5BI`^Hb} z<}ROh;ZCWq2GHR1Otx_pM7!4%#}+j9(?m1JcUpXVEhEJWhb1*wxh`XKqHnGim0opF z6m`g2J8FwaY)ZVuHCFq3nGALhNP=NaMtz?%_x`da{j z@vW5oRIES~zbRhJ8d#c8ysn){RW(fFyAds_6d_57%(`x@aywjMu9wBD?ldoWH|hCo z=x%P2dEb4DCl`*>oxF15K@SElD4ADr&z{tamn^VuUl0+v&{r7DNPpLgmId?$)ttXASq7E2=CMg6;22cQwiD^0Dqo629r`Q zXCIB9DSUcM^vfD9KyqKZWWQPB`LZ|Aqtza~$V@~Kho<#FUmCjHR+syyC`r-XH3&B6 zVZWv8FUfpb4{OA>rxS>oJO|}2@u35MZoyI#_4IDIiVVIS-(XqLF71?VqYo_}i89A0 z>KSOxH>u5(+Hj#Ws5c10Q=Fda`-hv=a9C4!=z4Ps(R3J~>3o-6Y4MV%_p(QEdqijr zr~t%dJT(?%8*>)ocKkk(9^Ihdl}^3w;ZA@HCJCuvE08|2Z^>S|&;ImwH~;9EEkjd3 zeyjay8y}$COIE$3b}El6pi4mYR=a1Ka7>Je`FuSO;(0Cp9nk|Vac(RhK2xu(6@l?l zkPZNTAm7p!U1S+x!u7tE$sIHimUUeK_S+Ob`imXhDM~^ zX_N+RGHSkg!yZMgrBC=Oli_>VyW7k2W85v&uJ4L1@ z&-#i6d<<+jqw2*2d*Eb9jGalU7ELfi}qlem%ptYhxPP5VJpM10zBUfu=UF?6yxs)#+m>{d2;YIT=nVN2*+dVhZ51<`!*SGFwadK z@kiASCfgSXI5|9db#T**R2CjPF?&}icW{)as4nl_OpIY(TxbO2UlG|qs;uqH45_rS z&K#cIU-;QW+wEjb3DpA9) zg6o>i#dv`>#oS17mOx@ud4LO6PNDLvpAG2VsN=SlrPCyw8eb8W?KpNv5dY7mPLgkM zm;QdbkQfSmo{5GI^XB37t!X1QzIGBy0i^QtxT`>`LxGJ8JrZT5E1I~|f9Po*;2W|> zdQh%$%^pPb)Qk6JRAQ%=I|kjW>%)0a_Te{Wm4GtJud~u2<|mEASWXtQ(;@qYnP2X+ z*?HV9E!W#g(ofdDC@^i&ZHe5T)VYW$5~i5q7S;F=M5q0ZWhi7>Oa@8WDjl{9@(4+` zYL-6Ad{H3avFvl8u_7YjT&GWCx!w`xQ5bzT1+GMeiHYYoOqGcgDsLkLO6n|KkCp;D zuiBg&>9xcetB>5<0$c;6{MPG%H~3RSsPdbS%90&Uc=|zD-q4(&SINgJR-*&6fFkf~ z2MS!lA>O3dP}(28%)#5WaEurQs~ivBv@mQ0=N58uusqURM!QxXCZ1Cf<3ahCwBbBaJW9 z2esPG_98nTos5hydGOT2DB_3ZqA7W`RINu?9^JFoN#a7#+;*Y+_36URX|d>XKl3}B zDRqONe&}($j;sBj+te#Zz7vYtZax6BYw@UKUMUelTfS+svx)gO2VjN3D%A$L(kS^+CXbM0712!vhg@YG9pH`??)X#|jq3I&Ce+!WLeFyh94VP-S>&|w ziqo3iZ(j+F57?{@vZ^X3aUMP*Z;oF)4{osPf~L?5E&1wq3h+x$2KoEKUi1^VSoFh4 zSaaf>a!k#Z*GVfW5J>=MRgYho&VD{tZCvDE)R@DUdi`M|s+=(+v%e7dgGQhYDId4~ zKyLrAjlIXl@IHj4X0Q3j1ABdp^3E%0gX+H&oYg=Bj53S_VCGjZ66nRRl+*BH_4Vkv zk|?z0INenw5dP`#GDyT{L!8Ys!7h%a0mD5ebU65%wAgdUamy02Z18tg2S2&RDaXg} zk9Zh=%OaW*iBBgrSh3+T`l!Z=wNfmF?W&V_h*69EHt!6lLh^f2r2L2biueQTf;4I) zAp!@t?I&`UEI7gq12sJ#hb}A)4mlnVpxXlwfv@m8OUaPTB*?~5zuCI@@ z)bxo~Q#WMsb9x&e-9Op1C~Hh^7t=@xpM6q8xlL~k^##LxFfL7@pJ8V*_`JCuXbd6-Nr=N#E&DO*DvlH6 zI`W^Mx+}vBmzIy39MpZ@j_tH5OO&vo`ODR?BJHxuROC9l&b9<)Y?r zS>!Eoykl_=k+z^OmxIz(P7LRgjkduAPgxNIA|DO9qIifwSvhUJT#2<~sRe{&KT)ct zBCcT_KQrXp_BC&^L+4r05$Flm+&AIUR|)Gq1@Frfpw%hc(gxo=~$ORGNTdwji{f45D=|%(iH$)zr0&vaqM> zL|19$X&c42(L@71y9zn7O%o+}XW_xm{euChHflKh29l3y7VwHegX+FpeAu%&~R+S*)%R)<<+Jye)XG}U3l7!rQqhEX*+RhPv|^&v z!XAPiFh>~F#gy6uW@qm#=pjP;H{*i#&VqjqbJ0@&ZHkMn2(9>^Ua57J-&0FEz@gN< zoO~P*AP`8+59S2&3UGsX*{MNqfxKLA!Cb(%9B+Ywz_)^+x77aytthoH+}uJ?T}tM^ ze8J5vL}>pjD0g>vPIqoj2e>5{5DW%$y#;ZBKpb#$3l3*bdlyp=4tr<1zgv)kIz!;r zjxN>?_SAn`G&OT@brGSZ{d)*7$Nx6_zs=P@OjK6>|DOtj{r7BV7j@`g>;2yvcGmQC zgmS4vogG}^5U4uTg6>aOj)IbKsHuwsT+_k9?(bQAZ{^_P;B4jKNG&P(x2#b!E1N>B z?f)EP`J0xqvY@=Zvx})c1S&5jLhAu@QXX)UjBFSic&df+j~+jNfb-x1;NinZe~AEqC)kg%9z1&b z@Yx>#z>|j$9zJ^f^x580*Oc?5BA61cc9M;)sZWv}2kRueEjPro`1i zBua=;2eGN7#>FJ|qDA=?o9+2@O7w09%|^Ejnh5P?PAjsnaKr1l@!dMw?ij`)O8H zrx{$5{0jJB7&wmwotwzOA)^S zD!{V`xKv)6ZRi5Raj`KSd}(0S-KI~misIfq;OV2WLxsgTVn*d$@5Q8HZ+#TC26@5l z0i~ysCH2!ybuxXtzW9Vlcgl{2T12#X_0&w5;w-+D&`O5yy2-0+# zsEQm94V4*UQv3~6_Q=Zu=-pRN-W$~VJsTKeZONFhn z7t1kY@8t(hO8)cg1;6vhb8Kca<+V} zvM?V$KA|Y_Gm*;&K5j5yX{rBZGPW@jQJ+`Ryfs51O0qj?5}E5iDeZ|CQCyq1Is7I$ zG`u)B3W0EehWwuKj&ZF->TP4hb4son)6gn3RToV^EqnGKNp_jDd*jC9mD=(J;dOf9 zSzB${*I^}%%oFS~y91FL9pJ%*>IeorDUAM*?tuxTOCEEJ6OR}IUf93$aAz$11 zdw@yhu@_6PAC*FzjDG^ChEj3eJRj}B;(8Hs>=s4C3l1mpZ<`hMqOYoK)x7%Q>t*QlT8 zCaxZT16-_0R+A2&+GTlUm{QZ``$|>hhx6&FArkk*> zc*UOC;v#Zod1TGg%)b{N2Q4sOz!Ca%Rnp}vlh+PTX#eqfa?rq~g0W24yBJm<`*X`6 z-RtylD(k|1-Ji5x_Dw~7%IoiW`i1o=cEvyHue7>2CbUutm=hE;AByMX#%O7C;)4n8 z*Be2Kv{{5S!^!@XY)&<-t&GGR zmb5q&8`VwS1HRNOk6!eOSq51D_O7y?obU5msQ$IP(rRp!+Abwj)?#wiW;|8AOUk={ zEZ^6#n5KVdN!IAz>#w9tU|lC6otv9(mdao?pE~R%P~F0Kr0XV|knU1by)v-rWZP&5 z0R@`*@X?&8H0q(^j0_Ej#(g$Z>jdz;(7TZ5)~X7t>(`JY4zKI+L?hlKeTJo=8Yfl7 zi$(3<@cj~EGI#TJw8-QzZ||@}e)Z_~0fsW=XEUmPqn*}S@%=A_BC9%^g!BFi)Oca% zNT-q6S`HIw@-OF>kmydDO{TTihy-aOA3CB*EtVhe3upw18TU8eFnO$iUCj=LlP}Mj zBwQ8L!$!B6uSWypvS+6j#${?9W-3l=Fb8Zq2XnEF$4MKSM~7N-+EO$)bn`7)Vwf4b zH;i#D`WZz?1vMkyhKH2;viz4J+qZfPk)w-b(yM|d3AIy?E64dF9CAT!)?XeEzYp!m z9U{nMj{7Vy;P91#fr2)CaDn)ku9T*^4Cx-=CkwO{INv1Ui(+ClK36I z(ZqVVuz!~Ge!@K<$DZV{VE1(~zl2~LjcwqRgYit4JXo??{T{%F6YtN9>SISuu}|)7 zf4XhD2S{sf?#m%Zj5o-WnizeXcE?HYqD>M#i$DI8N9Etkt=>JLdLd`~T*Z;5wVuF5 zGs|&TdcRzICLSK5Wn=BND^sV?mCWb`;aVQDz8ElEpYGHN?rgp_gowmpgbpHj?*X1* z<_hHE*PZsAp`Fgw?E-RW3+-Q{=kvhgg zdg}ScI@CMIisdGxX*{s9(i)dh)o!`Lq$)0Z#|6W{b7paBg@JBI5Uac^*P^#K6E%@IB{)6}8U?NvE`0HI0LvPvd6rUf89D3x}Q@Te6M{lN2!*bMjeB@v(Iv*oK zVryU&ondt6dB7!wl!}_NI-3*K`O@r?bb-)y1Gk?{u^$2%K|YW+=@;Hqn6f^8q4?&L z(zu-xVyY^!r@zMyx3Z6Z7ckD9UwF{R~L%CmQiB-VONTbEPZe43qK_>YX<)n=l$Md@OQu&hgvo%~Z zIk&N0v?d;#dTxbMvi37tyA`4dL3oEE|1fX86UE_vdONB1D3)DnIQ?Gv@T{qJ^)3-P zm0L-tGRk{Y9&-;^RSfnD=x=+!au0CjA8^~VYk@`@LZEfUAm(47GSq%W9>QZ=T*eqw z{1zqwciOiXjoiHlxL@_Y@YY;sqI;^s=Y?VAjwXn7Xru%fJSqI&+Cg7pt@J zbxdA^ zrNE|nD{FXPD>Q$bx9(E{o4okLrVPx08JHZ&I#Jw=^B)*njn_fDQvzr((y#sn3*9u+ zn~#9UTgd0G&Sr3fNV2;%isR6TUC$kT*J7rjj>wBV_=sOcmx`?CMT3(0^ySY!blw`D z9?{srfzrC@Te}BWo@d-GSAjIt-JIB~}TW zpzhQUj~s&i98P>Y2;J8_{fUc&RiA#;p|o-$9(Rv3jzyknovw@#A5aWgMeG`^-2+$z zI-TbDDKMIJB>~LR*_=Eg!IkC=92#siYz|+gf`=hf1( zl3*_l9EyWzQ$~D~<==O&2&lE1qJVjo3#kQtN%Sin(kQD`jRAfw0jF$)#JThs z)FKR*QRN{o4c7#Q0Tj>9bf*15?)K@4_W&K@t7=iA-USV#OYkN6$*ZBvFR1y6yAudiB|fJZej4CxD!HCJ3<8wc($=`f+pjSEVTAQE^e4L{ zeKi}sU9?oZ(gn-78h4@q&^g?av`^_HM<&*VNt1}Ur(&@{dbV!0{$;I2f{k@iELf&W zp;QXw#0_gRFy;|Q@3YnEK2dBoc$S|N%tS-Zr>vv+E%c-NBkS3Ynf_&pjS+J7m4nN( z4~?Vj;jF2dv2MmH#*KXycS86F(&@)AqW9x5@=P{gL%ctK!;nJau`MODx!GvKMcuF@ z&R(zf<+rqhb|}5CtPi#e$wd36@vjnXkNl%_$OhV_wnYM-JwZDS4zb}bky)DAK&pM_ z`l9XuswXyb+`x=NcTU}&Pv`|Ua1};os+wh@2 zQQ(Zg61)tPuErSRNo&yHuB7Jsm3uuX+1ppGJxyj^awV8Be!As#?03F=F1ur z4G#|yN?NU8$ljN$>dZyC%-n$S%)A87A39GC#^7625drnn4ddxP%v?1g-%%{D9p~7Hjvkj}D|I2ZvLm5o{-~RxQ)*=~Kju z^Q&Rc*a)|4YKB%q3ARiu#y*c4PZ_D+){JO+e5Ck$lIeVxTxZJ?EH{00K)zDq8smoKe z2IMp9c-Gg}z*Z9R!j2(kfcV4P!p5RaZUM&($F-L?T;(QZ``;hApQ4K}4(+)anLGv< zn+})U1#n02^K@jo-4{d^1{QBXdHJn-+E!ctwA(V8pzd-yIE>c|HO5-+GNX}O^g@!P z>7mtG<xsv?Qpn}SCui8;u+4H=m|cB z0CRk~CO+rS*Kj~7&XGYX%vFWIC4&N<)gC!$!Fb%Hv$i-VtGP+eS>1;}J#C|@s5WR} zoXC6`310DN+&efp2e3B&TeerXq5d^rR`{E_CSN|`$|_SgPV%PF{hTq?81-oUQ!o{51L(5ke zuZ)hLS%nuQ*>>TRpfZO z>=9FH#v?}a{8j=!i@b)H$0WyHcz9oV*uIq13(6C-e)wVl7Ijdu9AxfW%&R(VB$>Gu z1|DC#PPXhEWH%`ew2Ph?4GqY%FkaafNcLsKdl{vs_N)wCxSeHIpM*I(`wUN3boZb9 z;tCXv4zX-v%p&P-#t&1}j!jh8tu+Q4{z~#8$~tk-__3T2Fl)ej=I*c)rdTBSq#JeG z+gVdDr^TdkGo_YbokMpm6AZRr^L8_S-zBn{PeJ*ve_9FEb6w&8a|FV(9&Q zfTK}+m@PT~Zs|RsxX-+$WBHu7;wGN1Z)tT)k$FY8*8i9d{Dmp8AX1vSO>6_*F_3lV zyR>gA8tJsN+n+Eb1X_u3j>LruIU^dQM8ophReQD(jbdGkeCL)o8J}ZBKKq#g09eT@ zCU=)_6z>7QlYiU;?g1`4-(F4Xlv`eX6q_s>5Ic;%YxF;4IW9B#C3Icm5ATRxbXa$* zx@o$6wV8PBF_`@$RWZJl>7tI`Ox&`i`H?cWXwgCiuV0EUm8s ztrz7mkd$948&36WCtu1J69#%|=PWSVMqX}v*W9=dhk<-jLEMAqrrG;nA7gE|mHL`5 zI6nJSo5_8F+1Ba|YwvGBy@N~oA9xYJfb#EOB(W35NpbF!PC)t37UJdI9LQw_j^BsL z`v}^F<*9rxtbUZ++K~;Xvi7e*4gLBR8Goa9hS%s=;CQyl~UWy_dR%$aJf$j}K zOU@}?Pu1j*_bm;c#W7&ILKDzK&-m|L3DPaCYHbsiwK?9%zZnkufko&EKjWJu@HN>@S=(MD`1r;-MnUCe>d#j%U5@ zG~$+yTRYz$pw}9Sjn@ulrYf{oa2(Ng&biH@QiKV$(&*~f5n|^d!sm2~l`@F9aRx+e z63$aU7RzNzBr`?9-Pw_wYQ+n9-h`# zc`z%-jWguteA-0qPUxTyq&-%vG#^#7AWoy^m+Qx(f#)*yE z-fmu277>%OS$wY?;6pS|zc?99>ZRCC2;r6+fv4H>tLjrr)VgE?Uda-Jg9p4KuQ?3M z+A(0oesu4y+OKftGy`9xZQ~hJbY^*Cw06y_L%x5TIy{fKH7HBVbVn&n zv7J9@Hec+i*-7|RD#vInq;0(|*WiRF?p!#GVTBe83bLfIYsN&I*N(>>Wq)zgN&uf= z8-l}%T=p_cGOvZ&v-AT@I=9!nlI`rVPl#=Iyn38HiZT8!SsgAVVH=1C0j|P)r5rO2 zb)e+E&P)-jRdJ2LzVZ@=7M@N4ldNKDm;r%bvl;IW78lHv?y z^p?0dkT(I#4dvBqufrlfV`K~FFR<(1j2Cpg6`#rib&e&KC=JO0&6}Hi_6rcp4=yg( zVKq?WhQ-w;dwpA6_j>j@vN`T5tLT*NFFDZnjqS;9t+$>W))WL!7L%-s2$(~rlZzGe zvy|6|FK5`qOl-se*_a9=023t2n$IN=Wu-P(at+ z3R>nIM6SZ*?*YTsdtPqc9)h#%wTok(xk*UW!IKGc^;xv2;lBKvlcO}YZtWk=iRf?N zdxgsh_Su36?43_p3urxoRj+4rK5>jt3YEmUO}Pk9)?sw!TWZHEzO+B<_{67l`Q~@Z z`HPw3=`Qb+-l{dEzFSKRRYIm)^v%8)xUl0HPn{)?2x;+~s;L{Fma$7Ax#%2F*bD(k za5M-34CF0yJGXS$)2Yks1G38WfF@@M8qKPExV^Z9Ya*8h6r3DJ0g8ldD3H?`FU>v_jP z3L5ug{-tr2IhHY}1y=Npy-?Y~zFM>@+j%=2k=;L@gd&=b*aDb?)?uuREF zbs*(!If)PDsfgfwR@KQ&m(@j;%fhzqivsnR>`z(Pw#$=j>03(6`;C|@F3GGGLz);W z5Gk+pn+{1=7jvAR9`dW;ccWVv52nGME+*2`l~voT>20%xy9^`>`hGTv=IxpGSTbIA zYhQk(1+Fg@o_B=UG7ktke{@AH#MbXS7*UVa;Z?5-QC5dKu~sKVD%;!G<(_n zzn~cHqWV+8E%n0(#M?6V_6mCoO)u7zf&S^IR!mELt(s8M>5k{=>N_dI-u*2ihW7vh zA(hdF4x#WPn}Ya6vzy*bTVpMjGZn{l&4Cq_(yuOYlpPz^J6Y&(XS!6MjXRpD5x&V$PF1~0;Nf$-byNk#yYL7*v$ZS*bM9~m3Gyuq!L+QvyFdR9;Y2ta zoft%tKU||b@`@n#+%bqKHb9F-T^PZu{3?cq6Xmy~O0_CO4LO({K;ax(B>Hf3=Z`x*AI?zu_9Dw2wZ{{CfBP zSNal;_3~vTPS%YW;j%=-u(6l1mxGrBygTqN-Fwd5xi2d17LkYH?_exTQOES%s#ToD zvz!(e>97iJnK3T@N+qa&EiZ+qRNyx~AeX#zLUO{P%Z?q#M0d;5rXT|LQ0pCr!v`#{ zJWpiD&nrA8Ybg>*`{sVr*XCoU63H3-WN|8_C-u}PkZWJ{cj*n8Yx)D_jPIH^^x}6pI!^7WRWFCPhOJ|8SuE{goA5u%cq+Tm98F zww$hKe2yDzld!T-(YWr~S7H+9!xUlj#=sO9;g`b)oKbzsXt>g(9s9`rOky(=3vXGL zNQBMffyZ2HC}!S$eh%Av9xU5rgD7O3g=r(tttN?J269Q_5iu=tAim$_M&HiDEfi|p zzU;x95!%eJ$tRd5Ee$o>bUYsIV0}+r!$n4t2tcyxq=(|#Ow8VA6|lcW@BidzDP}M* zX07wA)0ZD}@U+v@jxeg0wv=zQ%SJb#6rRx8{qUcu+&GxX+(5Vf+#r6cXD39IY6e@x zO%3CNr8@97dp@ZrZ4|+7Vj0z#%?QzpsTJ`_b7E3tjIrRuSw@0rSw6f3dVPV362K7B z=s_>P<7V#&L;Ju_A!U=xb*?6Q%JodwinIh?ja${^7Kh;Rc16^^f^JkK?i=PXZ&#_g% z)NN*YDIH6@$jYSbGWPzXyQ-bEe@)X4i>o&ZWo%%7C=V;CELBUyJ?@h?1}%bxicIu3 zCu4o9;(oZ{3Q??0tmfyx&|&7_)J)|O3cvJ_isp~E!BX9F=V;@$6_ze`#2&YdtVy_# znfke3*66u_LI+8u1y8%vo9Wl;Hx=tu+O&Qto?`5F!8dxGU}5>R{$$H03$Y{f4kzAv zQ#LQNl$fIN(CCa~kzDpu+R^G_e$ePplc(mG+e?WZV+orpRHj9t@~3jwS(%Q8mY#IU z@`^x@O=+Lo)$JxVVsj|jV<_st#}PX??a>@%a(k?Xw~q5Yzzc^LZj#ixG{>tWxUu=8 zM1!(?r=iT%xHZ~=+`L>1)L_W$$p?Ea9@f`S{)#Y4&ElhE>%^u%S^ZMBSZ>81XXmJ! z&VE0T;U$oxmG^Lc_f%&+={BI6WBd%8DwT0(wAP!cch&rdPBpFa<=pS{vcO>tVt|id zLK=F_{Y{&gugxi9bNU_->*mkVxK&i><6Y|azFpVvgZ?gO{Z*`!30W~_iw&bnuc-Lq z;+OrJ0n6Gw09W#yWg08=w0y%dKfPvbEs-)&G;99z^t>Ws)(4Rb*AHmfzN%iS&&d@0 z96t3&q&52c`<+C+gcGZRib0>`alXL`@q2)$k*URn_y=Gb^@dJ?Dz5cnGnqwnzxVoP z&3eZZC{OSo975dc^K14ku^;4ra4^eBD@ly9)qgeeNj}iVBCmDg+XNTHpjp|gUac;F zgfER9PCVJ)P9D59LeEC{*3Ggu9eb4zO>w=+@6GSS5Wn^eZJuzZ&an&%k5((!@FrVF zvBr98E63?E{9r9)#WrO3(z#7ij;~3FJ5>mS_3~VWf1Po0XQU5ZR5-=Y;o*buU*u8k zDrnz*v1TcxE>;e&$%o+^jc@#bekR6mQll*_B$|rPsIK&hI+I#qV*gghj;LDYDmeeX zMsM=Q;}_X}YVyuv=vq6f#0dAz*+`l?^KWm6)r)*PJm&_B1xBUT?$5QqY#-RPDc4(m zbDP>?*AZkR{~gncEIAQ!mY;2sL_Rm}sQ>ACYpRxx8N(}989#SJ}Eq#MCATbedQ!ewh0^<}8m)%i;Gkt+q+-szBaXU*Fr#BhO zUplm}nCB>)r#QS^F?kiu*J;qvU8>O$oLimK-_)AO>?LMMSXy0iQk45XSM5oe2q_M^ zdVXvl&of0zeFkRCRnxJ0xRJyFwWKA9GWs!Fows{CMP@_a_MH2T@sMa`eTTPP$ICMc zm+?7_p`fbVUf*$vMqsYRKnN+{?EWNK zFB)W(b>W@bd>sJA&4mhqwfYpRfk>E)_kQnF@BvF%YTE5Yn@-DTkU-50|)O>D|=C z>-TszydBsyXc&iu7Cb4ubkU$1D$ZMOwo1zk&j_22Q43eE@ufYjuszKQZ_9a&f;xct zJTIFxFe7xdii?Tbvw>d4t8>=;Ed1tMEPgmpbHZ4!lANj`w_k<(b*XJHXDspzSz=$55?;rPLT~-1G}928S1aQk`*ch4U^cx;hu!&jh!T4GjyD8<-BCB z5oV!`AXX&|##bXOF52iM$!L;p%hZf$J3NC1D!6`KmKk+Oj+P*JlhNKJemQP8kd1C%?V4f8wWy1Tz6V(JZ`0T9&d!DT0WBq6EkV8%(E(z2a!GKT*`@5JuT>xvYkPXk$M z&ug7JdzBCd*GkzHjEC6Krq&SVqvF(6VY1q$_;S-%N!_*@L}9W1It>)}0F2!{vw+in zi~aYwg!CU}U_WI-x|1A+3tZcKz)K;OLl@ZQ_2%!^u2)({4QSqm3s*PYj&(ik3l;re zklTXPTx4F-8dp9dG-R1CB2IkXrT2i<2#k=Kn`R42NguamHzntp8dHznA>wzycNP+r zCSXY&qCu=~wk)_ujQgNHTk6hDVs5LwezrfY7z+2tgeo2p`;)KEyMKj^&Uy?}kQn%Q zolj8+Wu6x>mF{JBgVE}KlYWYu1xAC7T3Q&*4K*k+IQ~7Fa|MbUo8FzL1R>RmVeiDThS=6HF ztdrcL3R>vS0k5e04wOY^s44-TPsHHX2mQAnAN2#TV^!T`_W+dQk@G3u)nXq2ColZg z#}}fn0oYNH-;5c1k<)`n42In&|g5_khs8yWPsiX@7Fd-cQTbr9>skVq~*6{*&L|g67LZ+gZ_G=q0 zB!@?GV{g1T6YMnz2h#0MMT>Ho=W+WKZ*yFotA|A>w=ViFweiz;KNIK0C0@BzmGC-y zmf``viv5>sM(=c3>nuhFm!oHDjO}BInhhU?DAk&vzU^PBP?j+D;5mK4 zMlyUwY6y`Bc67@dmhIo!Dt#fFQ3ZRSFs}NEY3F+r2@6CUE;G0jq^^7RP)O>V7|q|gU^Uj z@=APD+E9l)XH0$;;GQXR4@l01um;kGy{0Gm+b)?*ZS@q5}$x zGF0cFggt9KWnQ)8JFpi_qT4~DgYMU41Gj3~H%zIptoj8D>b#WIYB3UT&R*g26E$HV zkEn^MEWX|^i<2_r%Qu&hTLqBIgop}?y;C>*cY zpTaiuyNuy3!GU#QD|RH2fAUxewb$ofRoYGxLA)YrQ$Oznmky)&`XwYSIJuR7>TtVC zIgJ6P1HxyPY^d&`T@}9vL=pxB>l!@2kSAyP14$dGfrV7izjL=wi4etA5UFQXW^SQe z)A*1b`Zg#9zVIoY->dgS`P1zfMV7te*V4u7G(+PQNKWT*3a^(%9Q327&DkPUOw*rl*$Pz}(EJzl7p->q2M~_Ayi5)pSItwwDCK+6fC`FH8RrcP7(_%AlnH^QD?Y z@ex^)o_=~LzQ{9qtAZDL0ttzqSf)S%de4&Bxp_(st~t0)a zrHQY>s6+8WB~t;n;3&;@Vr-pvXpGMc|Ctp-8cI)H+Gg8~;%$bdU|7(L7@KaicuQ1R zjN)@*0dTbLg{r`azk~R%*|Q%uksHCr1~z-6(eaTs9vhh%Y_C=}m+ivU5|o<2tHwg* z^5_OrR&`>=lYwO36GKapHei&KZI6w2UR@sgHOFbo&rKOiLO0Z4jA*A}Qq*UmUY{q8 znP0yq_;Nf7n)iRvW0y>HO)wYs4@J+6$29&`9$G{i?Yscd3?XVNF`G8B{4i}Fo&t4)O%=bAjjW-;^s+Gx@4 zbgri$XZnhw#s5@5w;@*D)}uT@oa)r7|15t0;6TjM`YmKVZ{!*OGTfuHT0zBzlGmA8 zik^XPhTR3OUaXnkB8~MT8X^5u>$x;{%oYP5FtdOZ3-j|Cx2+Avn)n`oKI?AH3`us6 zD>}F$a;0sra5pN<0LK;zVPgG03jk6Fh2>- zYowzm69wwN#TWx~;`XXNf&%^VM2s_neYxUCVM$}d;^_YF>@(gp0&Hcielv)OayW#v zf2}U7D8O1L-DlG?Ra=xTW#AbpxaVd7Iay9dnPW%2ZH8XQ88eveZ{kWocw%^zM3!X{0Wj+NtQ z)45JAbqJ08Ka`{7RgAdQoPInLgT+u}7|X%|YwcqdzvCKo?a7BzPyT}+=pWqtW$C4XX-wZ)Y*e1NxXAJ(Q5CTVVa zx_7W{QNnxOrn~!Q^oyX3x$AnA7JWMVA?c$NP5=Oa6V~GKTWNA$ZH4meb8JmZ16+kW zYQzCJHe!}oF3nctwi8FTVgn=Xs*E*Dorat0GvX^63(W#W`jNU1Rv=TZK+I8rDAr&t>V&9L&C|iMm2`H8>3Tp z6Unq6Y`Jd1mmXt>+01IQCwZ>1>kAlU!>G21K^xDLMNG@fJJhMUO9Y7DWoIGBas2q) zDp5oE?OE#OWJxt$+=O9Kz7ILIX}!qoP^E`_yiZQ{kh*iG}>>>uECFJP0F`1 zTCtoMCniB>%#IFSvKanI}y_kkdlt)lKIEa8R)jmC)wwW*=P?-P9<#7 zi+ccaH)GHGCr`MQN_IV$2^jMhx4R1C$bDS#B?@r{3demDN8J%xHD>nJ3dw zmEWIJVznVNuFKgq2sRsKpF?-PuJ+UG77PFvu!sQ3l9C+Z^dEp%6`#^-=6~>eYmvWi zXyH<}A@u5lwdwH@_DI^l! z1*0^niJTQ2apDa>=S$k*!o*9>%Iqpdi*0|WzHcyFKO29XgZgE*xSNH zw?LOrQdd-)Y{WFfra}DjrBpR`LgVSp#_)LdQa#K;lMc7yOnGypj4!^!(oRG#@55Qy zc_tAR*M|~2>^a1tlu9x?2CO}#PM?_2jgk(dTw?7QNdS1Kd3m1<oBZ^;Cb>zhZlIH|PwoM|0QKd+`X}Il z-Km{0XM3KWC$?Rr1Fe-T$*0NDS56pGA)ChY{tM6T*cc)3RdAnSR8b??i#eJb(Qi$( zcn_dCxoX3s$stDXYT@gcC#<+xvbW}NOO4T`P=v-rIixnY9)InbZ4zfJ`-82Nh{xv< zg+#vH`oe-xdx!3nTj|=ultlHGk3D>gfe+nC*gNc$W??kU9lj>Q9lpl68@@(Y(e95U z+M*_;Q);kXLzv)O?GVAI`6(;6?yfmH)RjGck!ZVB2Tls#WtE|xDd9=blHfEn50n*I zXaYM&)@~iOADRhlU%t?x-rd{B=pP)1e4!^S4Ge2WjC~S+lk?TPRSzR>iPJEm^@rA2 zSsZJ!*yJ$iiz-I?Ra$7-+I!QRGdV#N3_3UU`H;$GrGmRD4TrR662i&YMBRZh{P{0EUpf8t4ZDd@5( zkZ@scPKId6)2gYF^lNfj12A+woM|5wcB_fbl7tVKwnpmK=0cW3?+dPq zm1l?mBxnegR=b(0Olb|0XIE*<{hSR=YZ_4%wEIIa|Dv39IhUp;BfaV8UKEBTzOD{K zPDhsceRvhF914o=f9p+7k2+QO$^0{B-vYAO6l6?YHVPj8Sq@qN<@=;^& z6kf3Nv=A9R;bKUsfQkhSdR3orDj7lq zcC0H1(v?Fyv_3j$>Yur(TfQA;Fx1(ttbASzVf&C^j%nFuh-9HhOXnK$K-{gOrH?RU z!A9_?qFarvH@UT#i#L9cec(rR@&QxF<(gH3@hQ$peT2y_PHci`*;{g4t;poiu!!(< zQ|6oi#)P*EHMtXV(}E)TG$+=6UvDe}7i*iQQW?)>fZ5?A?7BooJtI1$xJkq0q(IXR zosaRc3X~cQoX*QaXx3Af_6p31WSFGpNV|sWo}Bi$3Ip}iLCmU%vC*f^lFbwwq@d)A z{YD5Nu4r?ilm0hFqhFXS>6;G2;`K~jA@eVV)1}S!%F(=Dyxmm^vC~8sLCzFmzTmm; z8HT()4m=5wFg<#sJnRHDt2Isx%WVG7KDmRp`NFjDwUvTeMw?y?ach5LD37F6MpZa_ zPnDrA8!UBdnnHoP3&(3a8jKiWN$e9PZ_`CTKy$`z+l_4KX4CNt-1#^?>%7pO9B7@ z9(`+3c1gCs6@kJJGN~Tl12lT#;}%Y61{c6k0+^_Cev4aiJ!n`#wm(^T#k`ffIJw$B z8Hu~V8LOI~;;kCAd=DTk?U`Oi$Gh@!7sXcHpDnaEMsp6k>0h-3GmtJ#cY3h1fN?H}y#Qz*An z+`6cDUM^}B6)B<3mi}oxzr~?(-ggi9F3SDW+ActAkGziKjibG#8)`e4g+nHGz-qoB zAn}uZ?0OYh8?UzqPlnXL0VU|v zb6@k`XCy@N%&S)kJt@I54TzSJ#39+kbGv3+z8DEN!J!$=TlwLw znvJi*Wv_qe(u5*$tHOUp!x8PQ#=%G?#gACv2b}v`OWms7?pRa+Hr9~PakLmMIRjf~Vobd`galOJd8^Lw0 z)XAGO%HIYqJuB4Bfj!T8_P`3p&1(VQ#2QCd_2`v;EpwO;=ZH99HfcW0Tzn zA0P2=aV3K+8fahlq z>-A|qr?aEo{FFC7l#IB&UCl;~pAmb?qag_sZ)+{;E$qXnC(D?C#cSVAe)U*Ehd--1 za}p}AsH3!Go9wnIrun#$B`qiZ->k<^l3vH3pANz5SLwMl-A^=*&zyV3r(mP89?>%R z+iz+@Ua+G&b8b-jNqyoKe&(Q0ao}jByb)ubF|Oi?t={PN#%TxFiIyV1D#sI4Yj|R$ zUTd82qpionfiDKRp(%2M5`%(~(#_S2Y;k`ajYr9gJ?Mj5T(!y=mGTw^1jh`dh6~sH zdTYHpy++w0WZ`r)S~hS@NTjRY?mj|uQghL($tyQdmnPlhOK+pXx zV$rYN*52BCtLFFbS6|oH;eGq* zue+aiF2}Fo33yr_Rm_73mnzm;VqmI9t_cIBrlV(sW) zsn8}L5ErA&!O60hO4X>T7Yr%V{>JV@;FOg3d)I?m#F->tEZ-CwJ( z>J^f8Y_z4H5fIrNO6ukPp>1v36PJ|c%etQKz!s&>JA?}`kQJ3Ho5H)a28Bm6fOg&o^Q-rwOrF zeS;kdu;$DoX1Xscq{|XO_fR)OgV(H6IhmLmg_DBvYp#Io#|Zk9_w|1-K_ozHkZ>qm z^rKtuo-^Ahnd|O_*$uv(tH9(&Y`SVpDb-7dP2W;u8vMAbED!ELoHTAr2XCK%ahc!$ z0Oh&cL;!EeoXj#H+lj$w+htGIZ$a|vueC^9hmgz%7oKGkm{0RoWvb0NA?J9;0UvY% zjFvYe-tsA$T~$~VPNppWFMBgv75MC6qDD~Yg`ZoF&>@?L%Xw)UbB%vvY1aL(jV$4O zOngG^EWIPvTQS(?#x8m1mt3~q;Ke7rf16k&9r%f-#KV^;g0+_Jl`dU*702a@NYB>K z5*u2(W`or=bbOz9R|FTU9JuHWG%U$9Kf&wVt;OA_Km4-Jtj^!Zq>}a%SKs+WcKikI z*LO=+aSxmxE5~0>OF6e>M>9wdlHJB}J|v;DYQNU*3*&h6>*3)G!Vpy~YT7Q=XN*;P znyDtWB79K%l|C0$q-&wQ_>*A}hSKPdm>Hj$u?9x7v7(i(X0sJ{n3=hYYzF@|Zsv!q z$B<{tG36rQrfZm`rJ%DNV~~@Bb=6w2EZ!bAj0##i+k1%KyKhzc3}cDkR6(>Fv!CyG zyOz+NXmGhO?cwMAk6kNzDLtnTd6=;p2@~6oHKwL$y!v#sg{=G~An0!>q{Jbz|5+~R z&&O2z_ruL(@(7knOU)WG^*>!FnvczZb;VkpxLz$cmQ=e&*U*%WRKcm~z2}GIL!O|= z?6i903>c6q$n1{pnfW*E&5IDX04s%o;;}(i4(SEh1GInw_eP%j#p6Hd!yN+ zYA?HJ{C@HfldEry6r$T=!R@W+AShf?2KJ_K`yG!SOr_EnZ{_VYfRGi(w(8OJ57CXQ1II83CGBAj5;fS~N*P6lbT3sJQ7OT!~R6%SyIz01faVTWF{6~p)E zJ<764W$3%uFz-HB#q5RpnVgaf_9+&NjC424$xAP*%{G4b4U3G_<50~|Kkj~Nni}7@W%p-f)4E-77>RMhZuBQ0-^TJWRPXj!K1>SF#5wcYy#D-cVPg&R6;(Sb-<0<^G-h)Z7 zi~VMBSpDSDHSFGeg;i#CS~^gVUbc+?@RPiLs##w?8**~olXtB=IYz2amn^OH=aI0~ z!D1@&Rf{iOLU61aam^Z?{7u!+A1t@nB5Qw`Iz8e1a~-oV*JHw!y?t%I4#(o0IsC3J ze`8>v`O?D*(Beof8~r16f@k8y!sEV|OZ!LMNuxp>FL#B?EKW#;E-93txev$3@+k;s&Ir(=_sft!Hx}3iR`U z#q4fUO>@vKnOGt`wWAA?--&t!ufxMR3v_j59&#B4eE)~6$M zy717?Oy%n|Dz%mDHGL78`3>BeAQc$P?6ZR;8n0BjOSyU7^s1wylZ246geA8$auN)= zI6LM=Q+6+%wT7#7uBedHtOj78mm+dS(yEq*)cGv{UdAPT84BSvD$g^B0AndSL5UiR zdkKl(NfJ~ObaJ$}WE08A@>?>o`cwaL4ZpkzGuj7|uMmm)h)-fM!pG-Rj>a%qsSv^7 zQ1oWMT$#q+{h?wL!|_luvfrdyURU;1j%2G1m@W#LG*R;>e>Dy4b)9~mw0~e=`-Y&Z zIb|dIw|^We3GeS=;;j|~Ig`}{2^@#rlF14w820?lM_(UBTY286s3HVWkMa=L&|TPg zO6_0^t!e0Y(4le~ss@*EyV>AVh=S+8SA&+KbI~TXYEOnG%=XvG=W-cZ!WI0)wOp^BO*MhfJ!om7@Fb>5B-Umdl&6^kkSmhmPRm-aESMKq z_5@2vdJ^pytfRFI@SAn>S-Uum5#IW6AmsYZxBMob7cj?BHMRISwmYIR4t@l0C8|@4 z!TR)#la1t85|gq#V1F;?qn2e!wUVW!kuNbR+&|N+d%7%{CpZ_2=NYuBJ&oQi+c0wj zhUHqVmKL`q^KBHAhkb6z+!HDfzH}SLnre%isUXE2oMml0= zw5j>>JeP?99`%-B^3o@@`IYLPSNf34$ju-Q6bF<`I<*PFCYN{VawX>}%FElH9iCLz zP}M+8t9!M(?OiU`)L&&dozQS49XhMsO?rE_uWkRXWFDN5GpfK^?3p~N28g+Q~L3uH0ftG5=p&HRg z-^Cp(1tv^*1W~ePv|HcJ^6cHxKE(37rpZlEDpg=!fB39VRH?Baezo2x(2{?KlOc#j zQ$)b-?vzw!YeXl9JI47o`vWm``H$VrQdY0==+1Jb$;jB?mX zwcqRMEQ2xDm-sgU+1l=GoMydEu%62yE^GOpFE}9Btm|y=n&o# z<#)|zVqS<-+v)!RHnP@aleqE*YLls%I_PG4G@p%$8 zX_TPu4RzNuOGuuSwBW7=g4OA7P=Cl=^aEr@+xm#^fyo&bc?Bv-H$ z=9dYN;8HR)yQH+{7g^c}5i6mS%DbRS#cPy2->ui5r zF?>sQ$$EK9*3-E;5dOQ&_LX3Gusq$iXZkJKz!17H9au3JK~1U z=;;#QU<4>9LdAsn|7zX;G0J*BXLgT*SD!Ei_?jH6B7FJN+ncmX-_<{ogvH&T*x6v} zF&qYsG3u(7pVZswVzs2=9OvaZ?7J&gvSqwe(!9||AMOi>nxl7mM%^+_DsIWl3ozrD zHtr(*(F><&&N>Y$0LiKrX)Xwc*vRVzj!0uW}%j`lHiod6i)8^_|ISeGp@|P&r3J2ZI@^lXlzfp=^2ewu~SuY zU;LI}$Km+V)#OXJ@IjAupuY?I-$Bc7cs`aoz?#mKUg?wGb2g*K*yJQG=wsPlvLl}& zhwCZ*j_7G>K5AK#fH9KxP+sE27I z`2y1hBCo<-5 z+}kxw+qoeIS7FNYr~6^{;z;%0TQWRIgPb$RR4&}4tLMue){t`_`m6O^TJdL0C}sm2 ze|ARw3(WQ(qxwJN4ukhCSvg2~-tCqwPm0X#-@QjJU~^06X?IITlXyMxj$GzHE8_nc zzumJ|-egWZv%Do+)BB6@=YRi@-?b;giRrgw-43^8;K|?h|NE2wukfE9!h-pcw7Xr6 zI%BRZhb``LN(tr!}&TyG>|*be;x9Kw&K3_pA3ymN8rBYV?q}m|kY0BV zJ7hWgep%BVY8lQP=6#d5H&``s;C>#lOpCo1+?{o3r)Psm?;;Hr6A5giN({#rH+s3R zLh>i)in1^J{TKiEx4L%zQ`LWZ^`8O!Pptlvmj21W|4cUj%&Y%Mh=0`5zlh*}gyBEJ z@PE57d=F@lP>rJ@xbj<+O=(KtAIZ4qL1l;c^QUBV%97=xS6gYcy_|fvdPjkacArCP zYVGGk{KgdJT%op%myDd3Ve_9c^PS3GHCCUUT5Bx}k32=Xd4`Hx6h9@)J^FVG-GBIp z|9^vP_y`Nqvg?CUz3#!j6Zf>J7G>7|KBm{V%Yt2LZf2v*u9phfu)|8b zed9aX;R5Ct;dbAbF2c=5mV-h$THi0@%Ux@#P8@H^K6IsRqJFF^!2KpVfpixJ^JOQ) z!3L%^bgY9ed7Sv8OVOi-o{^+OLF)`~HiYZUe&XUusi#$FmG*A2!JfXzReu*IF|1QY zU`2!>V{WRm7%xo-%?`~lk0gXf6cuA63&a+A``l==uI^)Hl>TqGSB5O{V~d z3#yNSzO??CSA@X4fA(-+aY%l0rm(jZ%yyv3i&mTdt$q{dRxKzV44@m*COR$JxU@y% zbkLVI<9a+SOCePb3zK`z{teojuy~0HauPI20_ELD0;*LaX()cQv5)p3_E+`mJ3s0X{uU)Ow4Qbt=vNU#XDHv zxagdT>aB-8rb2=8E1_-{=X#6pMq4Bs*}E!Is75R#quD-=*E{O;o|j0bKI@(F`aVzO z+Q#MI z!mvv>vN@X3^B%C@-&6glua?>ovv|8f)oSFZkH+d6qI1?0QNk0jI*$sGos%uil_iZ^ zGD79J&<(wFt73G(Gwr4oe=cZ^heB1jQCeHrC3?{1M{b=#olme+K|zo@DNV62c;E;c zQQp!yhG^^RgLo-6=v+}x`regAyUB%RbHMX!EnY4jZ}OcATG8W99Vicy_DAw+?T>~1 z&>`(i?1cU;!t16*?xWp)^YvS@-tB(FD?XirWK!cWsq@>lLn$Y0CC3_rcDA3y`XwK4f9Vpdsfp%&QlT2vGWeV2CU8EoZ3n0Nq0o@-`q`sV7WjgDW z{L*8U+|m0W=Znf2mKpNT!+6`D?YJ;kO#@anUWyKh1*W_=eS1Ue3y1OtWQ)09iYLC? z`E=M-RyWW?^hM-$+WyL)Snzt*ewfkdqikI3Gb`o)VyYGq#=jj;5ZUkc{HhnmnLE!T zM<-rZS}Se@dXkC3f%H1z*}>&GElb_c=^mb8b@&ThqAD#}#dKQ>aW0bkloS8r0>aIN zlP&Uh(`zoiC5w$Mj-j=n#J01Mzv;7AF*tvICh>AACwcD6xUDqvJX69l64U?>ZV-UF zA)`iBd>hg2Ua%*h(a+@`7)cv?k45@F3k+H(=tNm{)`oWy^evnpWSIjN?pi&2Tem%l zGT`Sm`n4`XggdaA-6hyv(e4gu07<}GGWDj`Dp8T+=kfI8=GRGvcxc!&rz)GdSVc!A z8|)(6NSj;Iwoy1GG&K_zMJ*)hn+gLy-&keQ9`IZEgsLV8SdBq0JrUCuSlv&5Epr;X z3S~L!mLvUQ)h5@ur&EFbEeV?ALbYeENH{f)A#4WxY>Ob?Xpx{ctwFLvHBQ zrifaSWOTYETP=v0Q+qH_3q}QfZnuAL*0kHyL~LZJJM_0nFv90m`1v;9l@}{ZXk{C6 zpK)NVZ2+rDm2r*7f+lEr#srp~T#JD5O4>WD;E(&e4|U;7dN?lYD1ipyU@@RI7xWui zjzv5JjrDzk@5B=ioIhs+QkH+L^XdzW#a@ZJNZyitKuNVuxX9>KVQ86N;ipW{1D_9-{>w`;>xcrzA^~^9G5-NIGo#RP!qahW zNOx5{v)7Jy`S9%t4kUA%Fr8*{SRYP@ECA;%Pe${}j_HPPfS zp^&h-ZteeWy%8&)v(-Llb+1MsoYF*(Z+2ua=S`FsB25CL86BECDBEar(6_%MDsoN7 zIEe>gl<(<#7=hpOi4c&#o6cginWDVRpW$tt4^oSM94{*pA*P<1XuU%-FRNBWlh~cUAc7xe8RUtE+?PU$VtkpTd zr_Mc`B4~|$h-VBNqL+^Kr{wq42OdVeuu!ykZ%BH1kuYwk#;Ty^RB5pFgCfycx4l8; zWPK#~y9rSF^vu$1;?lS~r(S1IJw2wKy!;YL2-t1yk}iQousu>F>Ad{V^3rtC%+n+2 z(jA|$Eb@`3ckv5_?Q@BAMyXc1uapWj)=q^(eIJFky^F`))Hly< z(o8jDxjy^UdJq-8QVrjhhy;qx7(2+E0M$i$+G*DvmfwJvUa#}^$>4+nN@$@5dlKeN z7EM-ZLV-l^m|cXsNuHx`+`LRXxw?<1n8D=8hmOZk-v6jU{$JNsfuyWDz4s3v?ZKGt|vQHWqXX%MgamY)6#AGfZibOSI_}~A|gaQzCAOu-O9A zI)`5UTPcq6JctV=8sDgijUsu`HP2(Ye)E?sn-2-Yb3bKE)6D0O_ZF0`ev4#>T8;+p zrF>kM5e9Uo_dwPV%p?Rg`iBoaN%rw-vl+8n5#!19ENXGI1tV}JTHyy8DX0w{AH@1X zH_Su4B7AN{LtzPAzP)q13F)gqEmCH9qt={qkYvd?wFwf7?8tIUNP7Ep`1yZLjQ?WT zo0@j#C8L|-HnrYvQ9p>&bs61}AWS{{{y9q9&cZfT$r<@P>C4k1wKg*&Mb%gNtj`_I zakP37eYG#+S&)IBM;bJb0F&1j#`^&iA68XcTalPdMTO~dn}>%1N2m8l9R#gz!Aqv} zfm0p!j4A=Xss}stW!RQp!fi1SWk59#4f>t7QO;b` zY4Lg+VX_<7lJUk)ZDymA0W6~p&)PPz_+tF{jSqJ28&84uIo{2wwXx=nzoiE~^+A#8 zsa42FFZxy|j4MVfu9%@*MaCYipKmiM`v?hsW@Fy|axt(am>uP7x;^#uQ1swMZhEMJ zdeOa$VyMkAUTb_d*_LwhiZ0iKdGq19eVKz-leC<8b%oD`I;*OcQDryn=(ic*28MFX zkIs+tC^=*a%S8{TQ| zhw@znigXdW*N@m_gbgNSu)ZhTb>5@{Q&ytxPM=FFJ8D<}YZUe@GQ?3_rrN6!%%$nnT+)8?w#p_ z!94vuTETHA7jqtwG>z!{b&VE_Syn~UHD%x5m6;rm87V#_U`kLrj~`5-ASF!mJ&od~ zI|Tl<7&`tX7W5za(!la2ev7zZCPuE zZE|K?@M#DJhy^F8Cvxzw6Ruh^H9E|erk6dkF>Sr*Krqjg$;&(Wd7>p;FUZKODAHaNly`*@j_AFDm*;R!afv5`_BvWg<#wp%LpcPgKwZO|!VWV7Au>gFHGIpHcAKa z2gJ~t|JxY--^iWT;`&r#Fu}sjgx5V#DCWBFaokji~|~X|2k>$n2`7R(N!X3z8Q}cHg-j0mgbUT z{mfc0ZbFuuc@e1_LinT|W;dtF#_T}>cR%c<=yJoGBEcAkP*)LgPg$WU87K~Xl-j-lm6uKt~V@sCo?kNCwfw&6RdwKt|pX_})0qnNGS8ZW{k<1?6`|V+F9vZux8^?Il$$ zSMg%1bEM5a8#H~Abx9SCWR0OrC@=V5%w!ku-o^Y;k$6H7@G*4Qiib|L35ikF9UKGo`q!;$BZcltl6rWSG*Z ze&3Q~f!F@M!2`5tZ1v}7GbO#XO}K0}gRTpW5L9~FO*}avw5krh@$FLbsSR> zTgeuUw_fuopK<1i@X{XO?c1us#F1@8R!Hx8o8@-u5aeV^h`n%ec37YMnLYM@6oDdA zd7~0SI#mT|$v*Q1?KimhKaTX{E$n``0udy(_qHIaK@1;S0T0o=`8ZzNWct3Kl(kY) z3moq@?cLDY#tcnTX=e<&rekO*O66^3UM(>CB*--k($k(2;cv(dnKuC`={19dc4mM3 zzI{-)zJ00Ttu6M6WIX{w6miZwE&9ogS*PSB-m4XfwFQ`YT-^|9L%&tgj#UdVc1Yfm zG4rL@ss34W;GN`qYT<%yxa(kkhCo1#Br3$!I3ML*J(u3*Ypbb)6TrQVls8N!b=K7U zMEe59g*;17qNH~vpE~Q-dn-dN7wfP;0BaL>rexGwl9^OJAWOR^vQr_;o~kK6`!j&X z0URD&>u+5oE9(|Ahe}eGD=eX1>ON`Y{`lX2l0`FLxB)Qn0vYO^jGOsuE6^b4sohg}EIT@fl$C zl0`IqHb0j%L+1G}rERb!uuQ~h4#diTg>Q4$jbc@eS3 zII+&dIFtf$qR`Ccty_2?oap@3wUT;sDrH6@7C`mu8ofRuyZI9ch)xe0k15Z(B{LPe zCCj9jl`o$9bcFBCFS%*`ns|Mv(W8unco^mt3NfynTD`Ldi%(rdePqe=nXx|>&!j(D zTV&}XD5H)Rl}BY7nYa_uCuG7=wC#k%7LU$9B;7uTN>v^6Foe%Ge2DmlCnNiP#nre% zx--m5RVUNsL6FJG7xd^;w0?X-8-Dv)D% z9}kH#NmDgVB7i?^A>SRqAE`keUf|CKod_)YGRP30DDe?m`$)y#bv`N(L3E_ znfwi?;mldYI+t_VidGjeC5Dj;S;WI&pBwEha+|CG^b$V^c)^tS)-P$w zi)8ysv3y_yDlML*wbh7re1$Wxrg17@u2aN;cEd0u_)z_m-X4^w`8BlZ9qX-u*vnZ zrSSVc+0PrT^4;;lx-I_J8(RtDHi}z@|t?sJeX$`qxhsi_fvcqLW^O4aR#we`z-s$Pv`a;0d2qZd-C3lX!N?;E#Tp6&ANz>|!O?6avk;W-S+!wsv+{Do5mUTr9EdF<^Pt%$f-2FODFI1wBwE}GhyxeQQ zs0&{_s@Mwo*eYwGTYUXFr~2JjN^Re&PY=0swBTG&zv>F2%Zz`27uL4q^Z&=)ng2y7sCsO&@BpRh zk)GDDzFc+U1GZM0&7@ zG^xjtV`YEEg(Xv#>i}r%SF0*;FaE6teV>A$j&zuRqgU|b<-Z>mL{Yf*9DImLDUhEv z$W3&hwob z;455stbwF)5^y$oH$Wyn$}H`tTu@x6$C|6(fTg@c4>2Dy4$W-WmsU*M780UIf%?MqEP%@S3C#`EE@2wmXV;goTxMBf_bP4VXqsBpdq|p!($Ud%}5@*g8SDnf9KU ztGCN#np(+({xV{6)hB+DVzl)%3AhD^D*qui!?0-4u!DL(#-+{$o~-H#9w)6x0xfO9 zw0vrkRSrW~j5wG{ZHWmJg zLfodxI%by2N7XEQ-^cS0xwI=bwS9~Yse=pvk>St6(2EBol}zq?T3jKL+V&3eSs=>K z;I3)MYL&hVMKf(2W4ebFF{CnugF87jbQoHNY8BXyt55zga-s9%JeO(aTtODqu5E#) zM=h@KskDo*u|1}*#`N-O1Lme42wX0tR2swOzm3AvW$WwRAzj3o^eXo#M~`Nu%iFu9_6taBA(aNGGNMVnybemPJ~KafQ>$huJXMRfCl-njlbmXCD$*d;n+ zYmk6#HH%)FF0b4|EZgKb#`D{N{c&0yecEm)NcU!;j@SHbzN1fQ;;_w#YrH)7U~c3N zNhvj+UrbbrxY?Gf_6&+QTjEDn8a8Cj8ylx*+HV`JYL*NdGZnEY2Gm0fAu4#d-YaK1PPE-Adbm1<>*eNsv704>9;)~@!>tAYW1=ICwxfT7>E zh8Ma?3(K}`KQ-NvNgqqN67=yzht~nYl{$M^-LG2;ho3;fwo={b`6Z{G!!lEK*{4^u z4ucIFbHB2EfKC#H|K9(VjO_R2{Z;*u0@q}C#@sdyHoZhML=I^rHmhyyzeOFBU%vh| zbP|WI5;bJbu~^pz_GUg#3ch4sCiiEX_I??wq}6MZ)1!L%-YB#V-^w}mGgQ0D+Z1et=G3u}OgRPgwmA2GW@3$1N1S+5N$0vz^v{7Fc>SIoSd&B7*D!A*vTv`#a6 z;8(|8T7J45oK14{R-eTG9RG$=uz#x+S@P|5jWG=BGWf!7u(E& zwvgMjCAz>%TtDiYcHkvk#^?#+Ejy!oHrKmMALBzbz_m?FcEw3u1j8t5Qj&<165wqK zqiG|(14)gguZJ7YPvqY4LOYbd7otA-oU{~{j%+O1wq(>|lgdu4a{W@oWHj~4J+-IH zoz`{6;`wKo%01Ar*Kf5M{GolEm3kQsp!iyb0G;;Gjv_O#&f!je={n%J2kV(Nj9621 zW8AFV=FA@cgvrL{>IYI1owh{;qIRZ0?NsbGeBA@Rxe#@h!#xCp8O}l`ZQw-zvZ{Oh zu}pPCe05w>YO>=K`X5Vi_0aL5r2ROU;Ku8t*zVr3f_rg8FK1)|mT^&f61~>&RVj)% zXW6xv`*9^)54cxmqlGIPeDJ5KgQWuPX@a_S!Dfz)HzBy_f>AS&hA8m zsm~~2LeOQ!vpLEIE5hMLT%@3(FT;r?IN8WPO97TBSeB*wPt_Fky3*D{er-#G!-~>f zco^h0=M7j9G?NFyczzn`aA^ok9ooPd{Mi0%@-RTOZYC!V-XCJ)0VdUz_z5Zhuqo(O%uaj4=RrmDRVCwBy!k z+gu4&+n^t@9=xVSvady=e9LAZ7g%%HJbA+AZqwlxtUUxM<2QM1%_ zkWSJ|tQtbrJ)2N(SWLnQgd#2fGnsjhG-8RGyJcJoA4aB=ES5syq~>$;P{mQHiWNkJ z4Z;>7`u=0-`N!geOXRL7UkHcOrcCO@o~gIp(fF4}`KW%sLnsxX#pmjSIvz3!G)&i( z-|lYLvS6IElY`~acd}c&b+t3ht;Uh>1w1P8_8TcR2R!-`>+z;#4lU;M2uXV96AGcf4@9f?hDw+H6LW;% zC&ihfKMP-y$7QQMNiI%y6eZYyEtX=>n4DtBeA?9&S>9Kx{jbXcK1FK#bW`G5vS7>A z6$|p-Hr^N0657s+w(w}sdPCDejx&ZA4#(L;JsOfV{uIXGw98COz1`jx=X@uf!u&$# z!nMXzwYpS+T@GAXW2j0etCRflyX4Ii&&4)nHzG97_h04tF0jX)dQb0k^pyO)Z3)~x z1qy(!8j9$N4+xSDWt)@Z5$Bb~5NZPK+Ae%pFJ3a>X+|+)-jJ03aVtpR?ZZ#=H zG8ri#z}`f78wb3Spxuu`^x)P>-OMYb9{gel(jiK-v`kX9I$NyHv0n1B2!^)gAGwo$ zK04eJ#Xf<)`y~X}s&pc>1J^F8+kKXL<;$)$b@%+(K#x|9vA)2Mu4bL-eTAu?tKsH~ zwTggmFEVA{O`vNvL$Ybe4|-6`H-QO|MeyMQ(sd9n@}dz@fvNPH$uojVYnae`iIKAsxEO{4IDLj(^fFiK_gP46gF8yK zh{?zOV=c^~%5hA`miV&D79)cbnXU9m_0{%Hw#wnbiK1=C4+SdwJ+LrGeN&;Vz)AEg zttmB(D@@xk8=_&kQw*LnDFReOqtpxky-oam)EzoMj1Y_+`B|7o@80%L-A!T4CL4KS z3?EMfF9K2OPF*A{4s}+1^;>;f)%T`qxJBYO)tcsmw&^xlMT^Jk{Bb>q($SwZ)$U2H znnYdlkcQv)e%tfj1$BR+5%*=WR8=v+10Nw|T<7mi%LhnXT7~2k7egaFO8GvcRbndL zLPamQyZh9%!VNVptMrZ7YNuE=67pf^yc!yn34&F*^(3!zIaxa>7h2FE0?yvH`DAVN zrtyc_pKZY_!M1Usx{GR(pV|0?f8rS!zDTR5&Ct2oGsGdTv4*SXw&R1bf|Xgz9<_!Dz6PQeXIe$W1!ubH zoN7YUnCs6OmMXa^E3U5KSyMfgCYMr4aj>PfP{}aN9!OaavDI`IWH3*P_j6F~DvQ!L z=2t1rOmKX{q=?0Seo(Q)l;}0P`s6GmoWWjJnaNV(M zF2+%_rMNlrz%mEonWf?z$J+j9hld-4tJVgM_PN$W@i{mU2F0evip>jWKU4~8jK|G) zSUIO{Hcrwx;|0r#IsAa~J@iFb85=bdt9w&Yf^sQ_egy00M1u!SFRSh2D2h&a=n~l1 z(K`bc4kta&(P71G4-a?ZDw9t-;DJ>Tr`_i${Iy!0Z+dIb*>IX7#gY5WZbc~n@`P6C z6I$=?N*!Aw$QS9NUzzej1^@Pc@i)Q$G}19n{gYYi9SI-&V{H@xm~*(9bK%0xp zb!FE9oL=s?Jf*S`^B8W>C1u>=q*Soyar4%p?{sZd4|M-vmAB-K6RNE zZI?2NSb{-l{W#9sLM12X_hhsUK@kRs6ib(5Ju%($%jjFOvU*AVvdJ5s8kacJFdM77 zYn>a1u}Z$lr0~QWjA4Dc|GA@bwP)M$wMg;l-+yOT#a*=*5YMjqoelijDQoKNT!A_l zE+@{dUD6est|J{)g`x6H`+-c6pyro1m5M1Y7s5P;efwEc+b*K@M_VyD!wuOE6pj3j zX3Eoit1l_u)OXi!<`n&~cLWG4Rf0mU-CNpda<565MDXC0OecRuIPr6myV;Kmq+MOr zm&0qTsqpp!r#T<9bz^zROt$h}(`#|oz7V;k#qPE;uAkxl0=g6XlG)8x9!v4ZNiG^q zlFlyX#kXYAk*MQ&#;_lt%Ag}rtM00gxl^Q^CW4)BU2V`7n%*ihGzMmby5Sc#nVq|o z)TwIx9uANSZ6_^H$~W{#E(*4|=&*#ytt=>%^H#a~_C~l>=E$j>1cf%Fas~va+IAbK z88o*E<0-iAzR;gJfpI(YP9ftQ7;edaJli6*D|?_9cO+~QzqYIQYCk_Kg!0I%pVxvO zsbyEM*sshhQ}8x4f4e1Hp5W8CDsFl;Q2Jko4AtykqlTAKJp!VB$-d?zm|01A&lxm( zCg?-fI^AC8pWVETsVKh1Rk%pNklDJ(O5n@MtqIR+=FR`jPJrhOJy?CiCg zCJ;8&289*1dS)he8nQe*jEl1BJos~(OIpf+OMrLp()oBGy@?izN!SPEi>j=~_Iyk| zmlCpejfi*k*GH^w%)vS|{HDwu3+*LYJhbgyXUoR-iwQ4Fk0oj|jsMKRhL3DLzp;+R zY4SmZj|rlqlWG#rb+S)`>H_;>BWajCo*nG3#d=bY!d&^Pt<*HBB$1PC;p{~nD>a$ao>ma zHFAwTsLzw9Ut`i^AkE~ws{c48?;q%)v_^bI;O?8=Lpz6=RC4y>qwT(+vaIeq(ceMSI0D^^? zae)a+=Z&6?Jsg3lO~Ff?Ma)}{yRyYuX=1Gz%)8M9mgzn1l-PE1C8%q_edne?a2njdDIq$ebxqT?%>Aht(gt;^BK z$Jt5=OX*bEoo$njsY$?Xm|5es{=f$lA-V@k%#CLEeOQU2_jF?d5d6Bi;uRH3X6cl> z^1sK=8_kSEh>}M!b8gz3H46p1<8v^ErA0$vMNG<0)|i}cQqRL{#O%vDuRyq|g|?)Q z^W28ly*2-CJROxBC<|bBXMff9UYL`D=vFq^eoT0RaS#K>wvrO;=OxVqBuVyFs!p>) zIp5~OGwQnrTpcK1x!r-oBWH}hp4$BVp_&C>7Rd4JuKs+;SDd35)$byh?Pm33{`Ekscn?lRWYUhaED4DsQ7QygOj+>>`}dy-gJ^9>_89;kOOTHTWIF1&5#$=Yx2*k0uC zQHbw!_uG*<>6Vpy4|tm$oFcjw*@EFUH{P=BBM{viHeW!4!Vb!?G(LY+&2JAmUJR@t zf;lYp)Z4ta2rLp}vrC?$p|ski#wlKFV# z(nX6Tmb2z!g)Pnl=^rX7>vs^oj}*7bW{h$t8z4OVLUo^C(JtfN9r!=Q)?ikP6)>We zw`3O~pSXp+?>H_QCJz9`N8FNmVeMAyPkFxI*b00EV)%bq zv&mo;j5|5t{?5hnd-aGw1Ny-cs2^5zd$1bRL?`WKP%ABRoimr^BVyUg7UOXcA5ron zJMNaOw|w*b3Ci=o(DvrBv|^|sK?pVW z>?(?&1Stu&d5#K##IQ{vQPeCVlo)CVHIL$;zH-_JFK zv}jjQWPFiN|IXZu5Y3XmO*XDK}!RtY66(2iq+*T zmN#o3h4T@)e)N{y@%&V`1h2c;O=7s6UMOs3}V4f6`{^i?h*HqJ@dJHMO& zNkmJ7LwmMo4zcn*!|f4+2Lt50f}B+_ob;)K6LH$^?)_t}sVI=)v3<#WS+GrTM@2I( z6>Sx=N>~8(e6M{Q2WPdqv!D|&D@WG+9lr?w{IP(oWCtM!E#4kdg59z&UF*TIWu14i z=m63P{GGezVbc8j`j}kG`if!~kBLh@S1f|Qls@jWwD^j*{sGDRJ*I{REk}eRH>fp! zQELitt<*g%AS+MKm1IIOLR(+)XB$)1-qJ2wlY6jqfO1}Nm@@@Qvo?^pB{i~T!ZSK zD~$lVX5@C|3G7t8GItQTH? zPGM|u9)g>`-)n3vdrbhvIo=Ip(mH@WB0{X{ZUh~leCA?qN?R4P&T#F@u|}aMRo|uK zBynE+lA~jkd-ebA#~Mg`NdgWt-4JYJ^_Or#i`u!>75@a`GB z)>CP+fp{kOO@H1=3Z;$?1io}1N}R4zw<6~ZH6(+s$`{~N42*_u(TudI3N}bu)+I+w z!7+H&Q1d2P6CxwZ33dQ$uW7F)1lHAk-&sgVaF*+>^{R%F6RR%- z^cGRBpQiXU4{S3r0WpiW`EkwNA%n)mJ6^rU@oNtl$DcRGzKI(F>92t=+qh{BH={(_*nk#Z71>d)%@%Sv{t0% z*-qu{4yFEx1E_@v73Q<6uljePt-gq_Mh-g+CF6R6mZLWgq+v28la{y#tH(lya;$-m z3Pv`>ASP-j#m2!Hig`Ns2}16Z)IMC|S)J%nP9u?rS;<`?j--#7 z0cN=?Hy=-2pN4x!Tyi{l2N5;bYYTq8Wu4^(&mpUAlEg;9Hil|PV4s^n&?9KWVTYQS zqJ(E?{^tq2R*{m)4eY0-`8&h6F*DrfcCQP@bKC4VHPu++CWppf^RB*6OLrnAqj_KE z46VqyAdZUOmXsRQ_D0>qH#a^O4qZ#ryyOUVwBCcpV+M}&z0HXJrXDv7A0q}ApIdkJ zrLGKolRYD+m|6RD$UDoGV%v`%M2XPKngAtb!JF~|ea#OTi-%WbKcb*ty6rz2m%fsw ziF9xd3u|O1yhFj!!CbiPr~LW{+(@&a9CgxGm=k5elaK^~-!$jaepI*<4Gn(<#)K6@mH_!T#j>?qI6mUzcuqpEc!bVL7o76WMGGr6wAbKOL z^}o6L{}R{Y>N}43EgpRcY@)_b6o%}VJ0{Y$fkRv=b8)4!Gs9rD@qD|--*OSIUSA|N zoomxx*z7wZsQUJBO>-^>`B?o*qS#YC*(xtJ=6>ZXFXP#RVcR_%_80$O#;#lpnWKWK zLHcuawQ%?uNNk((*s-QJ*7X3cq;ZY$q~e6JvzDd?zgU?MYr_M zj;3kX>bo90e%lvfEtVovr@|RjqaFFW^QB9UJL?sZ+Db*+cPm6S%#U7F1@yT9*kR8z z_K!Uha`%nI9@m2{o;92^U7s#~V7bg2U=tkKfkf(CzdW#GsEtLJ-{B1gbS?0Hvf_CU zPQ+vQFzI(@VZ!Q}$AgWgIE2vTc6X^(bDd+$;*hWka3Q_aCgbtVY@tTB@pkV4G{zw^ z;K;0nt%I6N%%x#NPH3+57+Nf7_TsA9X3`IVeywig48F?CSb5!^9OZuL~>Pf15K?G2zt;kX4zRvdUU}T zZbUug5RJN$@n^5 zAx`I2VS7ynrz{VrXg;xQjDye=(rUZ>yDnG`vMc>%cYUoozP4dyXBx@ESv zbz3HY{D(fb!Jx@zkedcdNkBE;f!0D94jCvdk4k7V2f|9jX@OH_N$G*1dckn6>Q_lX zLg~DpA8}RlNSL9DfJb&jSAur0lWbqw?)!5Im|JMpnKV--$GxzcEn)QAR(mpr`U<|) zPoJ6nd$?4saljxaSMD9#uvZ6!^Rr277(}={;RdzXQXUpOPeTPv%ox}RoleW{pe{L# zH%m9_HtnE8&q>Ol2TcO`T{$DQ{m^AMw^ir>FMzbwn=|?xXS*Qv-Bi_F{a8f7SIN`g z;CX6ltI2pMpF;SvKhi|8u45r8&XU>h3q6opI@fDj%+j8`U{0sW68w-uL22!gRS`t% zJmiPZ1aBFIoJwk5Qm4HCJ9hkeLhl8S;9c|AagXGyJPX;CIi<@YhvzsPXGA`DIW+;M zdANSs2(z)AL6vGrRjf{KPdjUmq$hk>%jMaq(95jgKaFLpID2xkq$fIUDdtn+*8-)yQ0;Gbv=kT zcsHIn#>Q%Uy`Qc2 zN-?-g)ajE?ymvoXw!$PO=7WoFMMe5C5MO7WlFOu1RP_-j`O*V@ul<#RzfxbV_n}lO z->^ZcA_dAPR$h~gHH|W|XK*Np2*R}fxp4l0)mZsQ#4knpj2iOxI^s z4++tG>Y%ssLf17t?x(W_bYxqIThFOUxYC7RhEu%*q;P=B=rOX+eSW%y_!ZEp!>^j5 zlmtrr0~1ZELc+wTNpBmkd9eIr5CPG??dCVF;cDoz(FU828mDW+cKrq_!xG898GbRZ z)!jGbmW3(W%~TWVDttFRlwI!`8Zdp>k`$G^qME(rF}v)l#OMVf9wxuawuasocw3b( z`^YCP!3B^T=bMKmjyEHKyy_y*JA zRusa*!Vjlx`6Q~sY35Sf7M2bch)EkX0*!#>JnRPi*C)uq^Y+huupRGq4x?&c)=gBL zo6|!m(@~Z+GJ0AsiZ=5HY|=AdQ?|q!J%RV|wLCOyZp$Us44FD*)}v&mkX!Gca>>!< zfoXBlCbCmysta7RwLl*yGrN?Y$9-xSn>$}jZ#O57zm)s=!**6czFieV^Fm!q=SYQd zfKqI;GE)sHA0VBT7Qotw3$q0!NC&|8s<(-#YC`j~^NOTN^WuA&^)+sdKPd}W2<*MG ztj=5wGjGu6^ILOva(Chp|1jrKaN8>6Aqty$RrWYR8U3PEDN#2U2J1_D{t0UywwvCh zSlSTo%n}-7ZzMxhM-FL0JJKQHVM>NYUgakQ=3)-!%fi)UqO45iR*wxK3|Kg+bs~&B zGHNGP`adZ&p;FC_+dpQ1h*DIPW{2)tr^9C-r+tWAd#bR^TE%C82AbeteT%|Gp+2p8 z+^W{lGq82W(kftwobWopys8cEni)^h;B-2fTO{7L7Ns=Uqg}XA-|BsBB zxOZt`*?p5+>y-tG&&JG3wT6Pc3XGo!3ag;}R!db<;Rr1gYI(1QbR^B{o%71*TSwxl zWV--WS_TN$TB0=wl+w{AciMWu((&GDX3J|+&1GJEb!IO4W2of8JN{`NMr6UC0sZGH zg>>azgEX_bH=O{wCR}H3BvpN}`g325YdTos!FHuL^S_Qu0HA$aU z?EV>1HO#0jJ$>Bh%+fp$gbCGs@%*1B{;xx${{CmJPYh-E`l(mSx@ugFNDwTA2K{Dr zRWT*!TmIci8>j@Ks-~|F@~ni*?Z7(8yX;tGJq3kxcAk++%7%nO&AlI3$XTTyO9@No zoZsM0zk``cNi)f0?h7!Ijbn{#0Bldu7rOUlS#^(c96e{MLKE(L|FAxh1<*UAJ`P*F zwdD40ACjvX0>Sx8O0$t&M`i!iM!pql7wv>st8U!h2|{6iA@#&13i@Ule8t}nEqM5?5Y z>qlO$w%1)(%SGY&gV{SMdDk^J#tOJ&M_6z44O&`$Ix;G0J!SBcqe}y)$Pj*Q*8-J; zzqxwuc@^V$EE*A&e7y0!-P~H?jg#ZH&o8vTOAa+x`ZfJABGi3;g;qqqm%s5uh<@6# z<_QS!KT<=*GY9L{@B<__2bl$zCs|VYnRI6IB?m(x>U>GZ&cdNjLtEZO<3%(4^(9BV z@t1yn! zcUycDY_Q@#XGYh$bl7S2)7ehammHL8DsxW-h9`Yjb0Lzcl9A%QGXQqvqZtHWaQDdy((F3V4xqR0(W2%7iSA1@444OoijEZE1Hi9?-I|+ z2|703>{xP5f(^3gr+UO3$Xi&DQz7QJSHF3-wTFastA791*WIJmxf3H-H!xR_nEqOu zCY?>xaT#m&*K&Qzs0xA1ES;89ZlyX{P^sm1zu^hEWud;A!J86G3>jXA%SMMwdC#7N za}?cT0EQhUc~>^m82GyVSkRLY^9w&0R3<=!2jIb7x^l_ErG`He`$@%B@g>PyGzk)W z6%;n@(b|}QLsTszUg;Kv+lv#h>)uI?QH;40J2Vimc$UR2F)N>?51tp}+w3C>8WQIc z91G9ZC-##FDyaDtQ^R=o1Hl(_p~jn`Q@Oz5bsRy4pfUGVw9sa)srAOf;NcA3Q|Z60~17=euQ~nr#3EJ$+Fk8;BO7 zQ&dv^7B%rX=SsfOSyTV}NR0P@C+_e0m6^h=meLSzT4FVu@h?}&r`;M}R*+xo#O~=< zoD0+xJFB?L3ramt*k6|#|K2v*Q`O&eQ#3H$LTHM~S)13+MS#d>WTmK(K&IZkohGK* z6DQF%fh5W8u0E#Pp~$inJX%_+MF@!PuzPNRRK&0gpt`Z}4nNU|#NZ=dZm(K%AF~@3#(t6P9}y zXvt3I|Gai&xTL5ijg;ma=GzY3<D4f*2B5bm?5M%ehy7@bfUH&}67WcSVB6GqeySf;o# zKU0Rw?UKU~X>QmLq^KsQuO~ka0@+(>T$w61;9E*6-K?4bKdQV#D+lv$JS%>xnrkDp z^86V7xtaQJ5j#8(BA3e0&$0}!kWK{YE*&@BXOWj2_dc=6WenV#pTm6{S6+@p=U>G- z`;F~}zA`NOW%mEii2pkF#dY65>3pdDzN@^#dPha0^P{&3KkTm8Vqzh)ZdiF7rUmr( z#yizmrJxy?G10q!U^er=&w7Oq9nxI@_s>IJ2zOaW0ZaKTxw)74h4s5UbWE(^mS_ga zha4DC^0tF_Ps4GkgYKbl`=?QkYgp@@y})h$IYEb!62I$E)kxqpzmBG3vA&I*TzN)G zW#DI66t?j9uayfexG;3dc#qjM#gO4M-2_{=ae}E5NR##0z*tb(*G(c^9h_e`6llH= zG47LGiG;rIsz6+Cwuxd_dMD<#2sX0rMEXEI4R#$j9*o(}KpcS;?VHi!a5l^#G{i-Y zj4Uzy;eZ9#6Q8&&{tc3~)$Ylalqe}KO!s?&1a;NWM)Vh1az|c5!Y$`E;fx)rd`+8> z>moMw;-{)FU1|+hbR!gY&+?614lDE%h(1JD>*lPJmTr&A*=qB}C8q7_%N5w6OChdg z|Mkj9%632^BB!jaOMgEdV%jY6?mLHG`S10aX?}EmXU%}hSHHi#mJ7l-*epCsGm!ia zt*k5qa9U%8sr7ju|Mk`B7!Lp+;A}+SD8P7fCU7yf^Z$6yblu+7nVB6#uzu5V*vW%{Ax-ClWBet=X-nN!^viW%?%HObksM031u?PH~|iy}rV+XC0p_0T79sIvLx%Q1nA)Oc-tKOQMd*Rn$%E-{12)y_ry z1>YY2&sz7t2n7$pWI>=568{g0Hq|g!6_i(V$UP9eC{<0rh7x;Lp-vfO&TLz%VnU4V zCw=ds1*Np9XF&;ZQ(Z?2pEb7_nHg*bU#l_|&iRJ3v>~^tO_x6)@KEc1^^!}CpQy!} zzFOZJZN4Sru@2WyDg@i65nb}~1J*(xL_L%t{OtfG^%ZutVaLeflH;eMTDEgcoyMW( zM5AQxbL1sQ4)BcIt+7}A!jGU}JKRJx4OGAieRF@PmKXXnJ&M`E^J8A+O&bkem~2PX z+#mRy@n%)YHBLHDN2BIW(*bsFHJ$=!dGqZoSRxxca}MQc zyFG3ETf1bfxt_0A!SnB_2@!ph7^u`xkoJ(QFBHAh{y8^{-@?C4>))ja?^3wyh_3a{ z0x*pZ169_`F4zV$mmGJh{kCeqys;!m;+MV*&)4%_>;(-{2c|ALc;y8i*?o<@4eV5W z^bD%p(NujJ2lfwQdqc5$^v`i!L^4I~htNF%jMi_~mmG#%DCpfUkFxL7W_ajt<__rh zT@Vdw&-bK`^>f05h`mq!rvZ-lJL+PS@9tKPy~*f(G^+#GGn4D~_VYBw=$RG)+p-BC zhr%NQg5CT5yy!omh3!u}M$amTKBGE*omAd4{@n5QJFfiDee(?TA)4xDCAFhXfAB1b z7kyjtJdqJS=9N5bCd>cndbfKo-V7>513v6fts`oONh4fx+doH%UD>-kuJ8R!w*oFW zZ+Ym??oT@B)~LFDb7)_F)Ql0G=F%4*kJ+r}>bTN#!LO?|B6+aEI{r-8pcIlXIf~#G zTGqRjOkTZVBkjO)n0dq{$FQDW)KBIcVexv=O)nQ6ztS%`6xxDtOL&{UqsKvMe#gw= zABViJvufj99Jl+h=iKER--~{7!39O@oz7jQ)t^aBxNYq?<>@wjf7?Q;uS~56p*{2I zQMb1*w$v4KvgZQxy$I7h()Tb!MeQ11f6N*S3en>Hxv2w3>Y}H~BhqGXVvWO!g1>>= zqGGnULayw$4hiPoAva8YYbr5xJildOQMC_o&GZWG{JHA1s%=MDPS0sZfuUjpWGiR^ zHT zG0CSzZU4ivY~7D1TxrQ^@sV|ija-L^;ikMvsKTkb-r}+I8-n6jqPf@NU06g2*zng8 zYdoz?cuKS5+LQlW3Pa&WEBs#-;3sAPeto^A#k%SuIs$LMxt==(De*Nm*pNmt^z!QN z521CJk_DcXs&R$cvpDZcb-mU%M}KIh)+sJvlaHM~zp7Q8ec*2A5$*1WqyQ{hx+}L;5Rwxu4qRF+lcubi|2`op}=^i|jm<$c` zM!w43$YFd4Nm6LFlz60mEf-K;-@U2W-FR@8>p9eNL*(0F{y-z$alui7{g-5ANhkEZ z5wGC~(6h4u&lOrMdQ98^6V$&7KtHR>k05jfw=leVJd)HR!x?(P2YLH6MB+iT7tFfi<87cO{Zq~mfUiTas z*I7x4Ym1AtXJl>>+hU|0wYprQOeM33O@G*VvV*_?cEqhjc_ZUoMA{SC*=HHU^LG}> z#TviCBi|r;^6p46bbQfURvGT+Wl3owWx+Klk6(@as_NFuq+EliEcFj0Qk)1*eJ6c) zXV;mq_$W>Kt<a94pq-+&+_KLEFr7Bapv2nwA6aP1zF2`A>b@HeL~QM;s5= z3PMHX2dFiaAKCv(%u@dHnNZ)jav(cS3mhzSs+0MMbd~*tiJ$Wf`;J{2h(d7d#kXz= zT0;M!&NRi#NHxusoKEBM_UMe4)t4M5i_IGcVf4}FgYVHnq#g5Afp%yc>>QI=Zg?}Y zJLB%i%Dz?HslU91YY3PJv(UZ*a3D4 zm7)RSYhO&|exkkveM+;yh6L`gfidkE%m?QlZ(*KJ-LEu!MWVBp)V+ul#4S1l&d4RN zJpCD7L(kL;20lv%I+$9+3~wb`*x+(d_i@Fe<~guSjt_q4u0HkQ^ZqINOmG6VOh(qE zyoQEx@w`NvqAiMQGUjdH3J=WH-Q=t=gGTuqd9)^+!PEDytfrdmQ++OY00R z+{>P)ob8s{c8)py0#Ub-yc)`Ax>2kDnw;Y+d&XqaeENsyl0W3Y0Z)3)irk&7Ep6$@ zov1VDl9QrSs(6OWOk-_*-GrQ%&1SB^n3V7cOx1!ci-T$}k)6S@DRI;LTQ=Z(2knP> zN#$GNOF^$;cKs$r4^UCD=~p(PPv>r0n;>y2-=ZlYynI8#*o~H*@LG)1Y14HVpxHx> z0SSw3XTDbhn0KR&hPWoyOjcTzM0KT!oj+2KP{@m}+j7ZYX0&}@SD-B(&1?=ZmbS+rihy>&3@SzxG-59Hu#=v)IAh}Y@WRM^as6PDtgL+~7T zA9(rprE6Vb)1@Y#=$h?&1pkaJ?1k7qTZlKspdKeu z8Bl3z^-ghQ3fgX}Zo42WOY=2iR5`l1t}F8{&+5phe9vXvl+W;gH2kwjPE8WEa`V0R zDy;dmYRw)*3)7ODegb+@A!}esR7!=gEtTznQF8`-*nVdi?_t@uduZWb#O*zD2S^5Y zutET9^UyfipnQL`-=qx=J=`78zLN|YS>O(pc*#K>ZB_|1!_Rk8MG_&>GbOLB?DY$Y&Js|_;@TZ{S0ES^D{Ek?xeprE65f56nVX(oCcuNAjrGla zJ!QygRF_$#sx{5K*{)st3+q99`n$yg)JD#v z+B-CAan?P@lkp*tU6uh0@jII^oz-fXOr{{|f=tLbU7*Z-!bElgiAc^gm+dk&QDxFK zXU5VqwakxtNPcf0G)9J;Sw1cHSCM*Jr@(ahS$j&^)&Ls;)3@Sr|7KKxGA7t)nm^*s zrlGwNi%kfWeCUu^vLDN~kf8E=iPnhh2172=1IZhR@j1d*8Hw^OW{y?OS7_$pwx(xw zCLrD7*~@m&&RKRqX?4HNOm&>&k#Fzk3JY=fw$ElM%O2bnL-rYz3=08x!mdsp{kAac zq9xYhK0Snc1HP4XS3K=p;#lP&I^k1(y(!7~ME;pbK?Wueb>9Q6QkPcSvk<{f3)9K< zhchHTjsY$$WHXXOM@K2pLdQ(g809 zlM{n;62GQ6r}YqOa31Pp?i{Z^=sbWKOKPsZLzuEGW%92^>xMUGs9-wv{Q6yUMSUhZ zp?&eY+}^*rpJw{`GNh(9BY~1Tk1mEnEMXyAH_w90N8TO;R={@*Lu;~#+Pp7*IF{|R534NET6LQlt zZFg7o<+WaiUq@cD?4qAV%>zhsn4CuW)%(~ytVH>KtO~whf+rgel(h-lX-lpr{4=el z5h1r#6f&UaXApoKO?-hirj!K~JTw4K`$0XoD;5TPW@PQLwlmv~N6b*)N&To9gF%@h zP?x%OiO?`@PcUK{rmJej^j&H#l5@(JtT3^WxhXHm+pbq{Z(nHxG7UtaYDu3_El+}~ z*2K*+O+Wp%qxF9oesQ4(-*@ zOil6IzwfSO=J&OEC@?cN7SrM}74w(#)@P#W!*^f;I=TmQ5|x0Ax&hxNvm>t1qxag} zK}n5J@G6XGVt6ZY2iB3GEHGmN7*!;FTaT7sRfMQj`zsj$4t4*Wv&N2zgc!G+4)Xme zaRMufL;=)d1E7(&V^XU|M&B=4E{ny#JwqppmMNzuhFjj`alMjMYQA&0arzNh*6|=C zHzdf?K`_@KJ2G^Xe&JVC<5arpdWiNV`*+vxJGuf%V#rcngBKlszC)vR+C)G3XKjRk zwuSC3N#zRr|EmQ7m89s^1sDbf)|}P9!vf5u*Pzo+1jRdlV}>S=MSjkT-j2!^M*NU% z3wG)6eQhXD7b@Z3G;TVc;%Bw$_{I%T9)9a$+?#mPyv9`aTU8*)u(B81t}+8e{-fydJ@xIavDq6!S_k3$>E4TJd!;ag+ z?V9~7JvF*|y?R>}Zca}KD0vMe*6D;U_WDpj(dHOip85WOBmX}Y*bQFgIEpHcA=u|FLR*M>h-WpHVWCZ|c zeII3w$+x);mD5JIq&fe^p1WOjo-N~GLe6w&r1|lcQF%MbK*G@eMRI-mlAlA^APWi` zRtmK<#Rh`ponJcR-(rl4-8U1XM1c^27_S4e#)p9G;$B3*os{T>4kN!RK?x<$1B)=8 zzGMvKI?#i=&N?@+5U$-^0W^1(Xgn|j@d!FQuZK)&Xp4`;U^4Nhw5e;)>(rv0a$Gvx z-{sd7>3P4R&ibWmexLBa&n9Qs%F-genwwGE41Q4;fH>=~54$0)>t%Awa_3ciRakt# zgJW)mCN(&a5SZ>=wy7X4_<2uDJbL5Pw*B*emLl{GK=Y8$)*LCWbvrAV1}Sh^lkT)3 zJmS0{xybrDtD2K|zkuI()xq@c zo=xfFsiF?G>5ljfp2}TDjyRyhziOEDXW_3PA4#AWvaD`9o62u({HIy-6APVb=Un*g zgEHOtB)NMaV6S7DH3Vss|)1LdOk{vY_Ly7e#yGb_s1G zaA}5}Dr4KU4bM=b^p`4G8f3c{Mao>Wn^_y^efO=S%Bt3-|4)Ys-$vFU?_mU_l5?_n z+%V~ehB<+dO}}*kv$alpHexdTC&*>Fz_@OvJ?cvv{T@gknDVXT3m^f6fraf@mxfzi z8*|HhrtWPLa`K_l@zt!?V|b#a1yObG#5_#LMg2@+`8vsFfLL8A1HRE#(fn9tEaaI^ zV>NkG=9Xr+s?a4@t+(}vi>dLrT2A@DZSq`n*-=EgE;F6av9>r!$RYJ4$l5}QchuCRM%}Ox=OsL(hGJ(HK)KDxs z&P(`I?XP#RF>{~Rn_vG+)s=rW!cZDF3}<*VR3>316?C$}4@B?J>hIYVwM)W{h*7O2 z-J}Dx+ksGV=K5N3m)BKUQ=&@j_nZfX4#dX~$!cElB1^Q{wye@zRqN4nZ>gDF>u^f{ zgElchnIK=0^IG(7d3~FF?@SA5?(fsrJBLFM^wm4fri}`EUEHQH_b1v8=0m+x!7}+F$6PG?57J3sk;EG8jR$z+R26&4G0F5jLwpY-?ruN#5Nv|( zIDg!>WZDgD{K`(lT-=@)ZO@lOuctF4f?LI&Pf(vl3?l_!>BZIBR(<;td~k!m@PJ5u zQEGv*k-CwpuBX4+Ou>=uQ_K|a|A0QItn_NSLIuvkz}w`g5>2aQ$G(|Y6E>#dVCpBICN=#NFN9y8u!jdt4^KBD6G#QsnL-Vrrkcki z=wu%o+%nvtX&!z*q2HWd!%5|I8E7;x>eKc)$q-GrJ_yFPxmVbEvb9@xBsb=~D~mhP zHi`&@m-y$e?y%O{H1-lck4~2yrMR1DhC=R!Pfxvm zp!fW5CtBJj-ctKHVxh%9D(umRSsQRa7=(C`EchW*>@KgGj-J-Nnj_mEN`n%$um_v{ z?>h`D>Dr5$m#enj0NE_@+`X$VvIf+`rDwm_BE ztZ;Mub(@n~fq0>&g{MY71ncU2^y@R9!wCR8-lfB4+BmA)Ja|`FU5$O;z0KG1GamPq zJ`A^YA$6**&iH+83rfC9p9Ma?C}@Vn`~J92a(a8o(Z>o)zR-epD*Hcy9UfJXHOyC` zy-XEMGTGA>>gzK3eee8z-vT=hIe4t-nmV+dtmADsU_AbE@v!*GwQQthBYz^VyNC2r zpAG(k2Y+x-dMg1l<7fQv6+&>vjU_&^<8^(0R*Vr9Fw_Th*#zE8D?Ik##MQ(v?A;S+ zD`%HYT!?$uBb>gwm`_TdO4F~jy6z#qj^@Rr{yO$AR){h*q+ljI56q#9I_yG!z;G0U&s2L|zm2Ew*|5&{AB z;=cAYMN?H*&UBdiv5n%-xjGf7Z5}&r@)m| zH{aG3@7HyCcRrDzhKU~_35)hZlQ4BB4@(*4`=4Jkw3ik%l0o)#UPAeFnG>n+Nk-wa z8N7l*_hE2Z{Lwe+$j-GwxW4f9@JRnFPXVXAyg?*?(lhr8{BUF}>1s+)Gm-Z8y5Zr_ z;*f;7R*w0e`i@p+7(HfS?~9z-4iokIScT5eCHr74tdbimrqgp!xk0gLRE9eiRk%nv zw6M%hBMl_)ni+pZ@INIrLh$E)iO>gKL6o)$v!%6+jpPHmIT*ZIQ=+{pD&1OLx9-QdIpiIn=pG9P6upDzR$`29>_%9y?fJ_6%mbDg+ClhB~)udgn{2JW-H~A zWot*1!+55OYGh`~68%5^m`C=|4@E;FbfwTFrv!KToudj0qh8f3Q*wV&z%}+tUghBw zbV8$6Aq24b{$1g%n(}Z&-rzfPHCwQ=_9IDWTUC>W*q$Y9y@)kKp*JbmWCeol?s`Y7 z_&s6VhRljuCgabNE$D#q>AG}VD0q1pobIhLyDTp=(d3by(U{Q?XxXs6koR$?U9{O_ zSENW`$fKD$pd8Tl=hEELSRf=VHrSf%R%CDs-*%6CS*x$L>aCLfe?>1LO3#nL>Q}EL zLn0;=43j_1&_n#nzHIn&RrjJ5A6i4NQ0&#?pXCOnv?u}hf82Ma^7PGwK-z*cLQb62 zFWOEt1~rZ$a{1H(yMQZuEgA~*;&=i7551L;$E2=*x+|?*-)bQS93Ni`6^Z9phj<!=XV_MBa)J=FR|C)ju(9&b=e(CRJiMl97 zdt_ttI^4dF?y5ct*XmM5y)<(r*fF%%l75IE=~rH#K27LvQpEW5%{1?&&aqi?n)VhZ zrs@n$ivdKL;3#N;Wfx+*cxu0%tX<}3+#L*KSnN!r89dV!#_LwrO$l)@oPczdlgBKI zAAGHj*Fd1|7AnHp^4EKainB?Z77tskMr`{=W*b}pt`${DZ!C6ecz2Jlh;t+L+mtiU zyZapg+51m>kLQ>@L~VdrZ5wM8o3R-+$@E)VMIKpF2DXXTM8;hQx)zX8z@O~hp?Hxt zV!LP!TC%)1XZq)>Z`nb;cD{9Dx0>M$pe~L!zJA5Z_B!oaW&cM4qM2%%ZR79@-~A;J zcytg8?Y6&}h7hK;r3h%+{q_hy&?w2YUC%-No)hXS$#P7$LT#r1<$!31lG?U(Z^qa` z&bw%!CWw!}Agm7^m||$>YfWG{ruTHeE7F;jk{!yqCvR3X6tdMkuoZruJGBjqL|bK zMeo8~sF|RF)Pr>3$+0v(C(`9 zxHTnK6>dKcHLQFP_0l!COxB;F-AB2wwl^mz-btRGar9UXAI)KTf|PX%1%5I=IbZ5j z&nzUK(5lxtTl60?V<;$8LcgEjwW0-S3+B8$bm@e^tQjQps!lF@gjV^Z+~;chNn(el zH`ZBPFR%Vu969hjLY~lWM3&t5O)M^y)r3hY z6j6V2UoQ^+^c4DQZ`@A(rmw|gU`L?qDcDS+`tBu%RdP*cXRQa3wsvgV_$;liDG8AW zRScup1{?}BoN4%zdTLxR9GXL{(t;g#`Y5#mcmjTHd6I_lYnt)Tx+V%5?N;$70Oezg zJy%^@($j+7GAfEecSu$S50iq8ZAUGIyS$~XKYWx0qTEz6Gtt;I-PQpaI4FH9V^v1h zq(e{^z<3i&=w=Yv9j`j8{AS9_MB#;;{1dhk5M=Lb!&`5yPy{k4FCdi|E#GoYW+RPkSk8;*nyW0MXk#^H1KEH;l$V6e&71N8 z1GQHIvgd~- z-w2;&d}3P4*+~9XD|X3|2ye&jSZa7aZ$h+%crAku@^sy^J{|;5@|!ma&*c$KLiBrB zf~cg^4o*{ zZHoQy{lfR-UJIt5BW-&P+-0`z6N|0 zsUYXw`}>6W)DQ-69jTU%ZTcxFlXm!{ot<+hL}OUgiwLe*GQ5>bw3uc*T5zsL-7ALj zZ_`|qi@uZ|ZkubgZS!U_hN`>E0+uzuQ!-!M5NGPj%S2uuP@Ryk_lT35x#^RYUvp5_ zzTgO$sH@?WHzQmP*yp!5tr6c1l?i+UwMk7Vu*EvKZ4qwqPa#jjLbLi(SKU6q;_*(s zd?@RU<=u)?^oC9}ODG~_!BR9XXkhjX`dDAxkk7U{c@*E|yuwD{pyDTn#ea9Gwd^0$ zk6p{L__Mm@y^WAqV&JwaEjnH|o1Tr9Q|OJIqO4b@JbG!4&dYw_&iVS9BUh;7qWpW(0&LIJ@ZqU+`(7{6R|TTKTG>Mqc#yy)%u}H~ z$U~-|uo{#A={>oAcmnhsDs^a$P&Eaxln96@37Gh_`%_nh)%o`4tcv}rABJDYw=<^( z0Fjl4c|nbKS}dap{Ee zjO&;Va(^DJ^Ok$kjKcWh+|xp)e^$t`_9G`}@N1c)mesG}j`pJYn*-WtnkQmojBN{B z$I09g%WBUK!p4uzwnvC(8&ZSc-=#KCm^9}Q+px=0)krB|gUcPL_b+_Swb*Abg*n_WIajf=g zH8d^lpGxB%6A<>4&6q0Tobn;~Wo*d8rUf<#Y`5UB`|`XKP?LMX(yT=yQ#*68f$n3A z_DfLz?8SwNg+<_N5v^gzX-ew49aRXvJd7p3opf8NA9E zcSj+lzQ5t=T!9g;QmsQGCBO!-Zh>A7pjqGG@+tbTz@Jbb=IaSs4gq!!V43%f#pF(}*p8 zzZd4s8a6bte0H1Zsf~_{S>ijSBYM zzQrj0Yxes08l$(O+Z6l!iN(GB#s8N0|o6eI}rM%wOH@WA1IgT(BJSORqP7xf_2vUx5P=h@B8qNr#EZxx80( zag=c&nW&8|i^yFDq+wPtIXYjXJ6A4kG8=%dc*W7wN`^o&#b3jwpy9Rkwd`2z7rcp( zzzkgJJEi*_(t6kjGb|0WXceGH9U2me)7~3?+2;vTM$469lgE$LL2ZAmf1%x!5F*Kl zH)EkM(j|f5O3HEYG?&U3KAG~W05{3UQbCJ|;>l*bh4dERU5hbM`RX{6zm{_*n?+Sa zU0o)g$@~e=YN{(IKQ?u_Z4zs)Sz_eD^ML*NF+d9+wK3-Iu69S<{qo5C@Kk1#9!EWw z1hlpZ!fiu;n&nB;=iIkloqm*`P_7#?anQ2L&ga_=(V($eF~j^(9HYa|G+|oVAtoDR zS#Vhj%xaeQ>4_I8=GcA7UyoR@lGd8j=`-z|@G&kq_CuQTLGp)U50gB3YdBOV>dmXB zC!H_?M8f%9d$nSo(B$u!lqQ38*;~dDBp9kdQV&X%!MW~(&Ew1yYr-n{hDPP#WSx<( zqcAFDGrU+mFG2q!p3}}Y8s|&!gW^#S0Kle$F~PB5{Z~%nudFjyOUYI@p!nNs6Q1r) zwkFnYbNsZ99CmGez1dpgI6=;yS8s63E@eXSMuZ1CpK)X=QikNQ$A+ z)By_5&jg#%tB}K<3=5ZkC>k5fpfNu8C{7Uf!Lb#!dZh`aMMga?Fy&g+yS}_X-y)Bn!1~7lYBg`VCLYAYNa01&>QaWR5Uvx&(7~@n z-wr}zizXH?@_qh*z-oP_yB{`}4!nN)PxXGY8Gk=BShdm3>gu6`v94m#Ajmrucn)d$=Cf z&G=3#9(p!jkBaAoTxRV(P-Dry{9nI+O|vhMvC@8yRmOyq+$0|x2u$tOr~BX; zQ@&pmk*(zqK_yP(32FXL3_CRR{N$hDr*R5*B{-a*Hn$iN3=1dJB)}q9aVYHfO+u3= zDuYejbvLI(4jbfay~)va!4m8->9$7+j88!OuMG!mmeFW+d+qK?U+YXK32}_iGhLi zr;baYZztnIDf$+WfS(;Jc2W4KxJe(Bd@Wz4cOA9C83ml!SW>1+wrU0q%_F) z>$9}d1@W{yMw{0qHo5eLGdvSKiwm-p_2gEH<&k=ZFe4L9WvW z)`gW$tDG3!4|#Ia6#*KAR)h-(#oOVc4w{#@PwZ}TM zgq>eipXoj1qkZXq?%0VR;6^k62 z(1r?+{^^0u(3#;Qp<(4knoTzBf9ZpZ&7|JZQ+@U}veHu;Rt1vSbPQx4sTAK{R!cvn z6;+J1ak(xqo}v@O;GH{1OF}1BN5k1&{xyp}YAe%0PznHYg&AcadtVWeUuTy8DPRNX zgS$5H@_&4=|HmOPvNt~$8n}MzESb>7#pPWtk$h57OJ4l8pBXl)Wuz7N)V@)PEe#i( z->ZjdlJ$UG`!X1UbQy9;@*A#$n`ZdjyI`5JQABit0xL@ft>q%bd?8m$4kIlPH3hqQ zXO<@w@}?B7B0jOIjo;I*9*tC`D95DFm zxRzX5u#jKGC;nR)DYoOTXCUmZO}-T!4SVZ9A6FdV!9xz4`%;6Ng=eHZ@}zniJVzt4 zT`^xYj65a53WWt?10}zadE?d6{rMbJi^@^3awTdn9Q5a_Kl8B4?* zrWxvF20Qg#CT!$-bxw&IgY2oLC*Ec~y4GU)(Qn>uARZW@5!q=4AWY@13rXD@a2Nrp1{6Y)lletXD`AK5eT_pi8K#vG9dmXO&|FBum7-wycDPFm$^h#m8I9Oup(Gx zvnfUt9b|;)Sk{$WgEq`A9}cw}Pw5X5{XL2mv;WqF8tmEcgW4Fj%ujw<{+81HAN09L zgGH`s|9NL$OmQNvXI>pMMS?AJU0-SuDR$v7_h`(ZM1HjJ5QOP7W!*7$dP~F3HOP5wAlx+Q8b;ulfu;0 z8S>?mvL=i)6TB(!MSYw(+%g{$o_=o(8Etyrv~4a$@4IFHbF954`=2|1v)uhsU}!q2 z=GYVV3v4m7UUU$>F%4XOZZ{ORg=W zd!cf{w0$qhhC$-a)sMWb9Yq^`4>LJAloddDfN3wW7^Y%wS;PM8(=oN=)v-Qm?Bs=_ z3CV3p{!T8~CH|(!tImZiu?b)QFoUIOP*Qox1Bo%`gJtnkcVe&s$g3V!;CF1Wu$=d> zb7>+ht(x2m5eU!}1bTxxDBi}nRWdq_}ku_F8T*r}A z>AwG4H`3A4Ri9RN%M2>mP6{2IU!&wY@~jh}jOOF%Pdb!qQ}FC3!TR4;sl|(3?>rUb zDi}CYIkSNB4pdm^njZ-4de1ZE6&{Sit>J(=y_MoNAbT8oSf>WfFw*}|B{D@yJi*n8 z&+mVR(w`yk#z?#^TGwB_ZDG#h0*lKPt3db~;|EgLI=|f{_>rY%pff?T_G$rGFX3EZ zM)#L^^wO0+wegV(&61> zhXM^(*30F+f`>I_0+|~1l6~C=%K)+&3R9S!66d*+d~i0}##;t2lGDf{?ym%MdIJ?^ zKD&y}FI8`2{wbt6MRLw|3eE&0mU$edm)R;%+$HUC{y!(%e0{3^6oIE=Uu0MvrY=G)nt` zI&S`mU$b0c)CaYOs)~kg3n%UZ7Q(@*66V;PurwPlhPu6^tgE&29)A6{$ zv1~2;4kFBBBJ`yi*4F&6RtMG7e7lwUtDF`nodX%I^KR`IhfuBL0yj56byQCXLtlW^_wvOjHa&MYD0+>X){uE<7eBC_eUOl4Z3*@ry7Y zHM>b@4H2mN5<#=gP8{3X>627}aCi!ZAMB-U7&}ybDc{`J z;&P?o{YG~~Z%{5+-bK5m#6Ia7(U#9na~)m|-j9xG(wRyIEvq0{TLig+SC~&giLSVq z$>F%C`j>}+u1V_w<+x@yHK3c(NMmv(IpoKP^(TKpVg?}P-}A!nsL^~;58mRLEzUMR zzVIsl;yhspNDHw>ATCKbk2HGQFBVo8SPc9aMPRZ8AcnHgSkGNvu0_CnQwer{2UCVV) zlXA_d4$5j|7-(6GQX`|0aWM~u#BY3=1sug+l@Gy=Z#<_@SCQ%oDW1UwN+WUyv=>#O z+I+U^9&4oRh8%na^~D%>;?(A_{bw9d8Dp83uJwTF4D41_n-Jp? zo#Ujv30WIMA1L&IszNU&df^DqQFRBU0M#vy66yWd^j3jPLJkuVleG(%ee}vEJ#9W6 ziK^ND0#7{@Cqc2SVZRaHfrMgH@aG+s)&gRZBM-HbBlu>8gakp`E%+vf_-}ZCxr(gO zJZh3HUB;;<&G>RVFe-Nfh&ZYsS&Ah#=?pv-r(>ij#BM^fRx^>rmsGQ|cc9eNw=cnm zW;z74Xf5y%28(#tsmyJuY!`*Tohbu7!o%Fy`a&(D7m*jz7PoWi5IWTBpF!jc>@Q`u zd!^DmjI1~D$4{v_&GzEq><##*Tf)0vngA!*fVXZXXyKB5iuAFeafpq&=P8Ks2VV4lcxRWYQyzQ2l*pabgtbdjc7oISveL`i*Z19I!JX z!HZ1|H<;Iqw^;u@h#p+s()d7zlUl!9mgofhemfa1#ea`_f7DhjZHJ|$A)I5~3vb~rXP^&xr=Vb5RY1#@>W&)59{f)rCw zAR?T=zh-JWurs5x>ET1%8!Gxk(DwgDR*i_}0(^HChCbdg-)8o~#_wxIM^$Ynr_}2! zK@_Uc=||Ca8V5_<2dHf6sN@W=?!h`L$`XCSVpKJ`)B3jF&HaMqCt@wH`)&Hk?Zfov zyZ0jU=l_%%spM(3gHO2)=nw1!f>>YXh3h&ZEnK_$o`?TSbj-D-Z4sj|uy=b?1$z?u zZq)(Y`g$C2`?ml*i?MB_ZT&6d)?SLlU4_9`^{DBRA5)!g@>3WM4ZNj|tyMT)1bTQ` zl)j}Fxi5PB?&HizTUcz0icWc}BVE^%ivF-R*%@S(=NmijFSSLj^%v5RzrMfCObJH< zrg`7>*P3zBf2oa$ZGl6Z%r01DWpI8+)F}vcS2hmh%f0vbOcheMKB5q}y6Grn`mW?! zyHmOX{n$`)hh``Ly-{oL!2y1IUJYrU`&a-_ec#zWPjJvhKF+iv>9dK3csyFqv4r1b z%<#N%#ueD2dm}S3@4X&wKg-6C&wF*g-+$c6W2QK~^_GI^xwT1g$(Et@kK#9iwlDu@ zLI0n|<-cbaF@fE3OL`+xsqM~gZV!KtZnu4SVmS2RgQpDpn?_+7j)L@Cd>Q4CJC1i1 z?1fD(SiJwRX+IjyZooLh;vEadJOV4C5}qI8!hY@f$PncAHZj(9xO1odKk`gkG$)z@ zvK`TqFkIA$CPtfYhbS${a5!kjFw;HhJw%(=t6uT)m zIMfs)=DamP^;Y%gQ@ATRroI)#ZTOw47sK$Q#T}VC2%8GbYX@k-0f-Jq16RTcW#O;ZJ;$HEWMGL z!0eVV>DO*uu=Mlx$MKFB(eBG3Wv$n}<-AkOTEGNsBdv&GBgQ-1q>yh? z8`dzU(j1W3u-8scRWOZocBgeTjs=|6x9qyOb@A{wm|M8-kSYA(xSJIA`3(e@A-J4X zFt9I9s#Ndi;-9JM=jk;Eoe7g2o@+M=G(wx2$qD^+ecuGm*Tlt@tlUImKju*vSFB|K zG@DjGUdcpbKV!W=V?W^Hq9Gh;Kng_6LhVjwY^ll5`RDJ*|7BfOPI~!gVW#?URra_Q zX=mITcEJ+Tdu>%pOpBar*HJfL{4P7mNLg%aXxUCz87x(#cy}$>CiJRsM$NFgXutjZ zO<5+YS!-WCF;e2IWcIdkR;iMMl`(zlFc9H79KLN(k?Jp7bv;<1g(6`ysr+sc2}1bz zk(Mr5QaY%lj@JqwHAo^a@K45sEZoZJ$w5by2GtB{9Lo5>>e(rudRKg?W8{?uqB&fA zoKoz*qGBdosZYc7*bDvVT-n6b7`C*>r5K6U!&_rTiG=B=>9NCsLvt37P_g9Zu-OGE zqf)YB+=w|QH&$Pi3ICOD6;N)u`XN`LIJ$5U<_?e&W$=i=j_wu&C|~V9wOCE!sO_!X z#<$#8(~7;8K{6gDgV2+tJN-%D*xJMl`aCp_0x*8gj0IDv62=(tSIc?84wv$RO>0%( zi|}xKlF>?@Onogp9yRU(C5z(Hg2F=q(?CQBkdyXd^-u&%=rhFkFe+jgso^=tXTek2cb3J z3^Y1nyyr{Dl338UMEp;X=l{kZ zj&saGgUv}H;j-$dqww=r`%f}V3f{0*408Bq$#9jS+ktrwYvIOw3Ge9Pos)`qivdQm zeX9xmg5`1H{HQl#F6-U27|yr7mC!19QY4@mcyM~VEpQN*_WQ+#t*Yh?Js*m4s~XIN z|9*Icz-s+abKlJU?hMe3X!1RU4}rH}!f1V^cRK9ypoG?S{35hRSxtc01kE^z8P;R9 zZPH+B>}}Zw3^(K(sqGmhM=8>RaE``mt)6YJ)(Q36N$k>0SeOB8uBt!$h`>yXlOdX? zm?Z^df}aK*K1aL;#K$I<`$nG8uY#Ss9>)0-9jz!oTY2WZ@0I+byN}P^r!?DKZE@yp zd=PPoOYs)sFMOZ&x7TJ*B_~7eU+YjR&mMWcc5e)EWeUMl&MjTjVeWKS-Z(&i`Sf;E z+9IM2$n;^w?+cc~O@O+q-P&e4NvQpr+=I)% zaUvW?H!b4*DkZ-8wf4_uMakdMayU%CRO0e`n9u?vINn;%o2zRGa*$o&VNlV>T@g}+)mHvlCt-rvo zTiJ|W_dJ~K?97gllO(nkie%JWuvFMZGw}Kd>bdmHM6Hw$!|aiu*==a}yZgEFfygaJ zf0d#01MvZ+cY8bY1;ddX3$?k+ zkpWm`(^buvt+y2fP_ARNXuQQ7BBch-pMIy8@!lZN!{VyemY4*9EVEnDnRQrM7KITz z89$3W`qf=I-E(YMa$3aiJ#55Csdcl(c1)GO!IsOWKXchoRq*E$H!TW&V&XlmztF4E zTyn3c5aRer&Hq!OYk%w^k(faVTT<}ll#bT=-7KppO zDYEyaPNnV7S_QU}Z8FjkGaZ&}N11ATcNa_pJarSx55q;)`coXFj%-W>%dzy%`*lxf zCja|GT~{!sN?dKMR~aX-0fpQK#5ioo#>7 zu={g2MHFI-Uv7M&sl&QE&?9OCu0m&}8W${utq!Hz6$?SVhOcVkMeV{}BR68C^5oHX zL@P8cT*su?%=_^ACi%s$FMle?ci|HH)ynzMCE%CclMx>445}Lm!og#^QA}B@5G+dJcZwECN)ynDPw{XI{2O<(h?SvQxmSA{hVCbys+JKq2ei*z1O2E}t_ zcI*%2Sy{f%L*-{JMV=j#f5GPJ|45fMDsawu(YdAlZo}4ctPiw*TARE1>Min`X3_g6 z=K`(oFIbGYf-hKHhZ;llYbaHLJxQm%n@S4X1FG@AO+`#8Ri=OBCj3iXd`cabzjAvU zOORgWXbwcqafU9KB#*3@Q~7@onps6_-)2~h6z1H|(cIHP1G2+c z3WV7)uj?<1O$!~HjVNp<`yjfOs7FCd0EOi^~n-A((rf6md2ZXu+DOUj7*k*NdO7%|!@29VG^#_I1QZ@O$)MVdLUoW0a z3Zsn6MfM9W>l=@0lx%=rm%H+NaIK?KbQ-P2x)vXq`pzHG@H~z6W0JbOIB#Rm^ma|S z1-A1jnrAquh{&2gtB0cQcvbxvjjNM%N%i?8?-k(j4sq@&~hrWFsT?vO~b}e={inu|& zp%`n+ArTF#7fF0J@9hBQU|>~#fCz1%o>zr@8*8v%eYoxKo5)9Q5N~4ImYoYJoyFx4 zEL^372kbpW)5;;0IaL8qCs%MQ`%*~8IQb)HC-B87nD!|>E-|l`=Mq#S`X9LC-?b)f z4ysw0w2-z`5phqf39d$~=AX)O4FY)it=!;QwuxMgEjFP^Iori8Q+(z!GzbiqDggwQ zK31I+D{GzqU9f%@9QvNWl-_pk)9o#3EQOv_9!FS)25CRH0xBgu-xVNGl^_f` zp7)p`q^fqTa>apmaao1y1M_by{V%p*Srs~uJA#sCCccvxfyUo4DSWr=h9+wQvP|kB zODfCo1vE9!kQ)FdiPOu=fM+#r|k`)#83QCq>%(9)d|W@4PudW{Okb;d17 zG;4%Yf0d!1Le~EGXsG)!Y5Tmq&xWa{hh5SjE7mmGT-D^oWUnR+O+PIh;w5H@6vwKQ zq`E?8y|dxEc|`mDC#DtVAU(s)B%O--Yoa*AN{-~ce{Na7zWpMj<1Kg1`QrMnV9(x| z&I91s@5xg;c!;2P`K~`H2YaJm!SqYWLH*|I;41Kru8<|Nh}yaoIX*qISCeK84%c-i z2WxVi(}JQlKjk&1ko2oke|oFlmbVjc(do$}Z)4SnDew zA>3YAetiU&OMEr%BL#TsBKE_lX%GkoNOg~TVls40K0$;@uZH`s!JM9^=$bq0M*0;W z4?{l^8Yx8@hmyS#`54Q&>!q~L;BQI;rvs*6)W5Y(;56~R#S`ARN~KgQ&B;`N=%jz3 z4IJ#}O8}E#Z#@sdW`m|b1q`0C1cwi_S^f2FvX+?pSL{S%M3;><fwpP`W@^R>J2XTiICVySq) z8)9OX-no&qVl>jfi~Rad^>Zp?>qTP8)CJ4j1GKmm2U+7*9O^J3*$sHQ26`=_3xFz2Di^uN3L#S!tB}it8=P}s` z$R3@RlJF6Y$mZQfrP%&D3-H=thB(lBx2+~ytfibST;)+SQr2)ahWyG}@u)^$xif>L zVWh2s%eW>1#9;Ms9usAMF?^ zM@%-F>51ykJMefUB7<+1!baYIw$}e*_Fv;aasY|;Ln7$U@e29k&O$1f*tGbdSsk!E zSo@pL=(8@}SNY%!9oJ=H={O2MR{V>f^AZnPiRGMMX@XVoa|CqUe(ay(Z;ksFv)Y=~ z{V7&;Xdgqq+5}@w@MmV$J&0OD_1h^u@2jRRGK{82CFlq_rqM=`W6uo0kz?AadfG?- z{x`ek*#iB+uyY}3_|i4c0)nyr^@fwy3h{BT`hAIacD)a4s{NJL-*aIpHtDgKOX%k7 zfe?6EnQVv=&}x{Y==VyNS-kl|jQ+O`2Cc*xw?I$rnW3fM5OAB2uW8m#hq~Qz!(an)q zEnUxlv#^XV@4r9vhTCS`uT|SgTjdvXRt>$(Y4qmqQsH=~vdvCK7RfJ5WkO3TRmoF2 zf}Mx*47Nx1S6h<_*8Y}2e9sZ3|D#ggwzLckl%f=l8?_R}_qI%ieMznALSxG6YomQH zLNo~TFFvPa#i&v#l2SlLBqH7nYzA7!p;wH9TXkp_*b$j%{RhaV9rSEE{3%itK%oKHFyipOpK`%`g zPxdJ&LJP}-#0xHcaEl-J|A}3AB#@ObN%E<3ZIBSU8xTzX#0YD%VM;XyNr1Q{8+*kR z6x-#j5|-uEA64beZYQcVMX6m0TJPfI$Ov+bk(J=B`C?1z^_EfQv@!^6kREyDlVTP| zmg^uvo4voUaAL}~xonHO(v&-$vws_Ugd1^Mcs?uRe5G$3Qe>V(itvy+w@@*n`M(_f zRS9BncT60_G%U%Hgv3!jiA!Ab<$I_hQn*kKNRH-sXIQdr-TTKlV#-Wz*FEhxr(tpZ z1+d;VDqU7>$>L3Iuj5l14dpa`QZ9DAIJcT!mN~9z+gTFiu9~puQ`tLm`&vGsk%6wY z+$$&sCdJDeCi_*o=RJ(JrwQ-gejz`1v+l)*!kRenS$f$_~DnZ$x8U#M2u2wer>@He(|<<{FRFEQ-opY!{4fIDm1l?C!DU9%hQVLk6+LUpXRNnmM1pwozf*&E471P&0|Qm z>Au~$v9OT@{TACpL2QBAXf@qp_=C)!pf-_5vuZbb)y)G6swiQZ%uBucML(^-J=NM+ zD?xvnZ1G10cE#(pRB;9LPxvW1W!Nv-%i18bP_j9ujuM=savs-TWuK||J|RXGFoT6B zLKbP&n_3AZ$i78#pc3_2c~( zt0{K}sw}G`*U|d+#G%GZiVle6=4zuQd@?sP2Ahz1>%i$+6@@f?K_9!H9`2FU!ugG| z@0hf`+VIIJERw7?AuXNn{cOpn@o1RLT#r9nQ9C@rzNDjeQd8i^Knc-K{_tD>wF^h3 z(?}e=l$*X~#w~y28LoWPC&pdnGg{93HKdg18NZw*pSYA+nj9&46}#M9P`sV(q41}! zGOVY{kGYm=Q`ZY*k00o)@;%{=t9%H-d~2@|DREv=p{f-F-_Mm4>}zbL^=-(ba!ebPbwXw5rASG^2gUl2Ul$$zL&UzbF6DJd2xxNU?2R zMD#N8_<}h{(cbi*W;AS;$Tm^DU-d)_lx1*ESg(y*IQ!GH!h3e9e%_7lvP{qKsfe<) zl!tYt@t$K}#^slMzssw_uLEq=vNn}1#l@m==_XDbN!f?lEsFa|*?R{c+LS>)b^51j z74@%A+xX7K5|)+C=RyezgY%@*v)8Aa+6p_OaX!NO*(?IGOF3Ll6A$X{ir#)6G+X2| z7nCbUUf@m^cnCZoNyKZ*Zm{+_7`Rytnmm6TER}q@cN`7OUZ5b{ch763*P!Jo7NDd* zC0>1xNn6H6oRsgl7Sbatu<5?RzES9P2EjITbwKb*gY$-cI=v?wE7Af#D+s`&;P&p- zcm*2>^#)KHfx?R|hWbR=VIK8OD+x@{Ig)?*ceS1# z6#63}mE`!?kcp&l&d2jlyxzu+)U0p>=HL5dYagv>yny`j;fYCYh*i*Zg6q!C!I6*U zU`4J>6YfKM}eP&?e>rV$tn#`ZK(cl6u6|0*HUf!kqzSy-tBoDr0Ok4*u zsCDa+2qzxSEGf&KVAFIjbg0x03{$kxC(j@Y&JpC8B3d`^ve`Hq#&|zIq znLm=&PY%WmTYFcHj%thi{;8I+3FRJ|51j+D_VMN$+Td%-vEAnM)>HZ-~58YVT;$w z#|OvQD&$>j6d_Pkc+_sb%v%*vr1JDYq`B=X&#U@@)$0Mvk`y`f z;nff!jj@&|bE!MD5g$)nK+kdrKNQ-}$^_YgS1>(L~Y^=5S*kgQl zj^rI=k>2loE;HYWD|Hh-Jc@yNA)=Y!p0MQfhr!*R9pPG2NYS$%ZgmzK$x0Wd;lQW1cYqC4s#0ZxT&Xl zjKGCgBgWcqzLG|2KykH&1v7vBfS@AK8?c~Q{kU;JnZ<9V9J1mEw3j5Pbqv4YgIRF1 zmR{-TDCxn|_%T)$2KT^ z)e{)b@aHIY^sz~*5SvT~=&vtZo^L*9)S`Lp`FOsjZcNzn$?_`)^WQDO$~1Jx(SlUr zegxKy6X}wsZwOyIlJ(oPB2RLpVMCfNZahd}VXaF3>~%5N&h?c!xwR+Uef896;XuYK z)7H6(A|`fQu%t5nvv{Sdd$3XY6n;3hsf_1ZTz2A*8l%UYOJb~P3!e-cQ6{(lX&>vr zZQsw)39zd9g{!>gc3K_5l~5HszoDTxfk#$X`>kbvvBbkLkCvZ+_idwP!yeZa0VGGV z2Ku1^r}I(8@KerR_x6T$QtK|sW%wr2sbK&*tzS8{DK)i5{8VOJ0I&x6&=$Cxr1ucM ztX%n<{RHhQ$TL+pyGHs01?5`Q62mVgAoGXx4q@4n2}tl1xAuDW{b_d3eQ~9+5y-P6 z%QB%(vNpeCU_(foGeNNgLB<~Uz8E($v#daarEL%O?$W#`(`q8A3XOd|`&Lmw#9F{sO+GWQ14E9XB4p_xm6KAIoplI^>~?RteB5yxefo&bOf{sBYiavc~V2 zOwTenj)crh!g$mMl5tMBB`Y}qGGN(dBfj#NfqazRra4HmNP-BH*XSGg%g0Kbt2elM zY&AU25*jz2IJ=geARbCDyK*b)A$8NRNP0u=3}c+u-IBChVM4T#H%*+KXUa{#cY}vy z08-tY78vh8mUdf`NM%__RQOz=N&^p2DJ~~+d&Aayrt&Q+tcv~Ck;oH3ewck$HtV(^Id)?$294d6?!4}mzZYhWxF>h-ze&RXcic&KXu4gDy92nE z3atn#f)iG3p|)j>wg#}SL9P!6khlQ&1q;+vuLnr!WC*>8<#d-_;CW)GE^X46xkTYV zPDc7x%L5a6KyC#$#N?~#J{29PsWUNcnqZt5DmD)GeZFj>v@uQci(P6InTyFYq zFTPSydp6XDB+hx5nw&xa_FQ|y=HE@Ny{VbyRY_8axzh=6JXmm4mvNDvn>58dt}kn` zt_>)Xv6>E2vQ6y7Zm3I@@{9qC(ETs!MuLPEio`Q2ZCx#Uc4bWXPNwcKJAL2z*j3DA zxT5S`4IbhNa+?V*u<%M}=I%o!`D_Vk9G>Ley)!}IaRHP&N$)4ttYI7y&0f{0!`m_t zLeJIjxR41YE$eoDSLCcM96;R1+{fGwVOZm3D~QSVM$CyRAqwuFgsk+ed-dqeC`ZfN z&;;#=Xz>!WUv+RN$j1zQ&RUBfnI}XlalBKux78$`E9Jdcu#SC`dOAo?B89uN&%bPe zL=apjK3>PZ_HdpZNU$tMXV2(+)w`mXxwQF7uk}@$&BXR-sEuZiM5e&;P{U*wf;OS_ zzygWQ^7l>M$!{{o%>mKx!;M>k=0@Vlqz#$@o@tN!gm<5Q7ls}1E4)I7S{bEcPXxiY@G0wtoo^AB>7Y40a&qF4I-E!BxILH*q zpwP?;vHZ2+x|W=0hb5vEYd?_Q2WMWuZj{bqH*S+t^>eLRV;`?5trT8)}byg;ikE3Nk>Rv^Q* zk5hy8y%6H(FfuPb9lnsIF8Xz1TRtBJINoYwdwyb)lh`nS?7xX0ecbFJp!EP0IjnCC z`U~UnAbmg!s*u+@S4P*B~@8IkQE+fKZc!~ zatNMj?`--zqoi$WGU@hwp>}Fa{ZIrO@-^#D-i`hM>=onoZ@*mxwD5WEeonmM zxm**k*3K_jPANWvq*|lbLECee<=3@d15`_bgBw7aDM#DqlVM#tmdh6`6L(P^taj6P zPrmi#^tJYFDxVUHrpLzCHa314Yrc0LnQJ_1xki!z4a&_=pa~0^KA?YJuy}ToDu{)Q znXIOF@&UQCDAel=HEGOoJFfzUvaV*7?V`1z+w4UDo;y?ELUFd z_b`n6+Nx5<1*KH%NP5L){9B9mJI!FH0&3zn83n(X^@ zjrx&pDV_i=dK4v?TJWQOLiWSt(#DPgyu;o{ro)FN zkVivPLMtj)U7`vp~xscUp-8l>05DP!siJ+yBgbvpi~_7LIQMzBnR45-we^7iv0a1u4#Rm6LhYs~(@~c{vH)v{QHc?yW*9+&@X- zy|uoTyi&yB4fRM$C?9I@j5_UgmaDrkbf9qi>kGTvO5Xbo3W~p_qI}Q$lC}v5=?a&R zB{r*RztXnk7rf{LoEqe`%zEeD7l9A1|1||l2^SDwXMI_0|I!LMR20e~-@fPiHX`RL zXymazyIOXtz`*{WQ*5tS_V;>n;^+~oC1auR&rPgu(`x5|U%_`)Wh$`Yj{bK&SE;C? zsO74VU7LDuE<^w|BK%KY><)XcXzb2hr{-$Lb1^OD%&3gLp1q$9gF&y0!5@ihU}dD$ zYH0b6A$>5XJK=(*n-Apsi9e}~G4FlqWlX1~3~cvdywP+v;Z~uu{%y%{iu6 zmMWy*>IeQ>=+4PqNjLY$f6+EL$}o%>^^y6w>fkJ8rK7QPfb4i4Pblr7uSxIHA*GBY zmq9;+#2iBc#Ih&9&D&k{3a2~R~>SQAJzQg%PX4gqdfEMi^~Y%`u&f>F#z-MXf7#aKx{TL z%M>!3D8}6Yi(KR}&fv zQzToT)uU3*B<4Fl4&Q%eH;1&yR62@?40fL^aOU~h_`odMpyR^vyJ+Dd<4pcCihLU$q*vE1-)c@kav;aT-1+h#!PbT1L30do#do|5OApH|-mo=9-SOqV^*Y zOIcIc>=WxrNB0^GbMW?IB|}bl&y%9f{$m$42OuNKM0U6`YEEaugNL{3k7t?Q zke|;oqr#*s2>bBdP)73GN|^1_J=*5KXjKv%tnR3f$$<+Q`7?7#^1V&{qiB!k=bHD6 z)e!#|YwsD=gtoN{=WIJFZjoNM(z~>fP`5~t7NmEO5|99agx-%Ls6aqM?@E;}Eg^&= zAPEo&QbR`wq4(bT#`)fR?>J|S`{Um4d!HZc*ZQ-@nrn>bnQPAZ#BG8OO<5H$>ER}L zgxk+zpH$Qet0kNEa*~&N)_}ll4NwC&I+@kHokM*+>97a~TbtR+J+~k>kzUvSnc$o4 z#J!>|4&`U6sw^6=v)1)@zZ;%E!Ia4<=Wb~!cx2=s%K_5F(`nxyG4N=fD?@8*TSF_| zM+#RH7SaMYl}!sWnmRkazIjom>6KA+(&Mk+nXu&GX*v{@0bi)BdFHI`Vv>DcDr~K2 zYgA_BljBLb6Hvlf#PUbM+)N(wA|Y%249nLh88A`Pct*@OBhg_SpxVa!G1Gw~RI!-d z$2KBm%Y-xc-E0r!yOHuA7-c4mr5lI-72tKts4+V_%b1cz=O&C1y@$dud^mkJtWIu9 zefw(uPILB@^}DP_P3Y@+U`P~mM{LQ^%{doD*lA0hq8~Yx88Vw-raXKCv=ntvFPu{f z>X4u_jx|K%Mhldo6=?~Qumg@LXCzk^%Hv@3m}4d!0+%rE&HvzJopD=pqOQCN(PTQ} z3j%i~2hDhW8)DC$Pj;|isosx6YCwpnG%!u6ZPOyP$?yxVlU=F!HGP<5xQrm!c? zzDBkt+Yc3Dzv?Y~JOI+kr8g&WNDf;C*#)dVrQyvJRpRYzVat8{G03DibGzZG%wUNo z2656qmo{=EX~FJw@)>w@0=&K4oHdBjtUbcTNn?EmA#NV^Xx^z>d7Y&aX6;XD*nDPz z>B@YD|BxAn+H*22;3V`_pvdd(uDk5>ckJIc>>=(?kD0?Zpi@DPe34FRA_8ANr~sAw zU;m(Cy-w;3c(?-=3|ZJ3{05MzN<6U9J7ZLNVgDl5hO#6rFDdGIp6@=1CCXDy2aFqW z_)Qz<5HVn3fc;6v1&}a3nki7kJ0+sdO4M5@5-+nPZUeakHBRvD3%5{v{IIFa19E<{il1VG9)xqD*8vKln%pE66 ztTw_%8d#o3Sp@$L0Nm+B4YRhS;Dt;>=tE#pNeCxgX?B>JQE6he=jasYg||sF?40*q zjK@+jJ@Nv)64!GKAJN?FK|HO!0<3avlG+yC;wrH_?lyc4$5x{KrZ@@LNBdU*m<%30+)WK^maX#c7{Yey2mC~WgPQC zef$d0_c$M|kq^28@bl>=EVEx+0Rp=hI7T6RDHn$tgSmO*vB7G0x79?R+P~oq=m@NO zaC_c5;?X4fRDxbiWOE2|QdF7Rc2HSE?rHNV9_PCMOz6K<^&*qHG}e?gv{iqOv8 zKi){%I8F+ZIe2SUg~|g)2Hy+FL~=Q=e{21_h!9@GXApOxj8OS)9CQK>g%Ga*51Qu5 zjn$6brHVBr$LHNa5m6QcI>94Gw3w9(5hpeiv9pC!v-=)7lZ}L{=RKt78 zL4!LYI#oaC1%^G7>5Tb49x}&&tjHLEXehNZ*{bZ8&b=CMugi8V^@*D&&+vkGTKerD z6nnCS^31-X>Dr$a9iJO0?pTXf=k3tA6V|H?W2w~_=0TIMQrjYH_74M@yoR4)ERjaf zKE|8U6K!E;@4<)(W46|oe;Nq1`(!UP%0n87_658e|0lY!hAt#T3(QE?0Ugp6YsuYHZ&q z(khf8RtJH|j7wpv+0oBKdnu7%Q@ld<=0YV;V%NfOtXL9s0(vhlL>7*BoN8L01K~`a zJ<5FE6|98$RM(i*Y=vDb7YQjaYua_U@$0%YaK^Xov})hn%xQDH;0lQ-cwzCH!P4}( z^f!>`@Ohn*K&zoG3ms@R9yqDVkKgQzOlb5(ZtTHYE$OG&UVnuBzAJ*?139u9E_Z!qrLEcO6g|__=o^8Xu_>WhBj?Jhm!01%`6`=mlFzUn= z0I^{&>V451_G2M}%$atX;B-l+f*4Rew*A$1I+-|o`1V0_i2bH=IStN(O=!$cIO#-R z0S4A1+O^0Ef>(gMO)OUcYoy}kuV+UI?ia*{(8|ukoufyIR{#*w{!}^PSeV5|Ov>La zR9oFhWcX(K>sYUU4pADxA9_pKjJXa?@RJfgcAf-A!h;0xZ|ZeP7_{GCKYvO_sIPmk zX6NgV>IRA4oGSLpuq}$U??L!%1SD3yY3=FQVRK)>-Q|qQXqTmckhC0hO@T{-{^Mc+ zptx<#km+gFX0@eC<|`^sB@;i7(A3wQAMT?Gzj)uBn=M&pt~9>62ztwkiFwg<=zMpg$_C1oQa<{ci$o${YuSb7S-X+!V*uH`{AB3RXFU_YGT8^CcF zHFPHE26x*?uryQkqEyL9TgA`{Qt=bzlMKils0{Gl7K5p9;KV+k{>Z6LZSuR&B#Lci z_ePVpfZrWNSam1zD0@>YCF6OCckv2|VO`L#VF8jQ8`ES8k?Ua523hM3(>6sPvldfQ z>{$=&J?BGI|CsczXh^A{IgZ#Z#p1>ELbgkL3!0EWss-?pn4d3nfK=L$Ncrfvp~n)a zCe?}!DHann?#^+JIyXKV zYAs+|@*xFdx}q4~Q`pVW@H*Dv8{Dvxe$9fS^5_Gm*3W-gFDEUX6!#?3xnTG)Cr6n` z-fGU4hs}{_65R4-Z&}79~3c}224?lmgztmiU|qYbAd_d&Wgx1M4hJhkgsnJZ3aQurpd zUUi}vI;O2-L`yF)aAM|hohhqny38q(^DRR+yyzG98ykH$p_-ukYC~9PzBs>fQuiAw z9a8gmocHU-A5(utLuzsrw)Yn4LP^+`p_@4+JSY!;#ix&p#+g@y%6Fk$ayp2(^QI@~ zWy1wr_8H2``@L-+5YtPNNv@}FehQmx$p<+8rsCAR?s~mD&@rm=H`$dDi|Ou87F7Q0 zYYF~9pXs-{?%%CSAIAJ_QOxB{ty8}?AK$HN(6fY*>kB89dn>vW-b3D}#|eU#Q% zHqv9jxmXPqSdBi8gMbgoQI+mP>`^> za0J<7(GQAsFusm#{$&655uOw(H0xpGa@gT9!A zBc!FJ=T`M2+QoZ^l=E{e9hEUmgtB);_b4Gn@TTI_Hh){V0j`X4@ z@eHQ2jD|{urL~eYMYRLEjcM(E2TU4j_BN@-P)y@P#Rj?(&&$ORItB|1Vern|+btm4 zqkVan*e0rh9FY`1N3(WTD#@^0J`y%wG#AY;tqrD_48fl!3pzXTgT$HF6f67|Q5nPR zR{-aRNg4U+6#J&JikBnqes*m)>f?bBMh&Vzw>G%%jCs4&D4Z9C{y7@M#$g-;It zm_QB!4k@Qy^PGVH$d5%z)k-v-bJy$B`dr8MacuA> zU{@LHK`|uwHNE#b25QBQ9u*n5B6~zOP)=a zstW6)AW(|h6~Nzap&%`+*4Amu?GC}J6Q}HJU^2Kd0V=)%#72>Y+jua2RG%K~!+_EA z)%D4zJ983Auoie(x0{!9nwO7`xb|5<#A7R~S-41QOYyI=`kasTd6O>d4Hyd5637Ai zcy?{I4%g*{IpcnkB^DH^YFHQ|lpj>!gnPo+sLQzvx3vqy$KM=4#cGacg=bO50-0K?gAg`c4&A@V_H} zS#yV1{=@e7lUzD|H>;|e0n zWeYLZ-EFJC25MN%!gwjxR&l#luU6r9Wzs}wB z}#I#3S;=*@FyEsmR1u}CetAP%$k8%)VkL?Dn-J7m zv;E>zEiux?QuLs>wvU>@@JzAi_S9-tKA0TrCutK_9lx1HP#zD|iHc1S((IW`OihQbKW=f>a70Ow-CA&kFZ(Suk%lJ#)_?Ov^na6j#Ok* zi_NfkYduA)B$+-3XX%MHNe>7<2)XW9`6t*0&ZWWefN$>fL*YOryk9WT)dHhvX?{a6 zig{-~9q1EBWg{Ts5rLc3tUTp9Zi@to`x3ao#CO^C+U6crrW2EHZYGNdpefvFXZ?Bu z^4>B$aZ4|s?H)`W<)^>K%5W-F;ni>w31IboG?!CN3IAXJ7=S!E4VeYg_oa4V6|7=Q;_^$>Y>KpXxxQC& zejOhQu4D4f*SBKwrB7VoViErH_>uu4ZTvg+3Q%&1hBvo1Zl1l%mE;~-QOSiiDYKVJ z=35o#pqKL&3Bk%r*tLk`Txxilvt`%e3oXQwHs9*%*RIW&WN4yXL2^AzCuY{iK2ISj zHq9bubwc2CIX{Hbu;_QJ8A#Sse+uP(0dA*z-j@2wS};iPFU;L|ni&`s=X66-jj^cf zKs>>ndMpZ`a6^FxjumjK8xVtv!b|4a@AcZeUA{itT4ee6t-GP+(%3s~EQ3$uo4%Ug zD0F{&s3|P&=Vb|;<&bQ)ijEGxm^T}jtHr0$BQ=eJhOQ8hh35K9`Gd>%PK zs|ag(kqn8uDbhI#95+q6ByAXbvr6j{*18W}?-x1ka8;!r7*5tuE;Vm0ER~%Y^&LD< zr1iOp%1wfkR92glQ4C0-mC3>kK(H`2l_Ml&s~U=$hkR{c|tlY0!aYT%aLO-#bS0d2QZLk-s+uL@zHUt+i}k zZ)gW&LVfIZn(Dkt+=8zF-^&g2l0?%;`-lAv#85MCb`^Nnj&)zo-WIzhiS}#foDq_R z6i5Vo8;LNiG8oyvtRJ}9&j~*rf|zeG+1hg90#!Sd51b1q66T5$oi&|*d+3i7QEzH8 zzI|$%;w$tvh;_YB@%6gZDg46dpY!ia1*HPDUpD^&&DDyS>bUgOn!{N{Xe9NWBR_(U zaH=>+Gv@I*os8nN~7s+p?&Z74F;9PP%Uwa)4f^c*;WbIFws@g`D2p-`qG0 zTDZ5M9DQ`7=#_nY7du;07%zdWfXKb?A01e?UMXckjV>RN!{4i7_I8{*kJOU<7EhPT z+@b!M?z#xzf;sr3f^zOwC)c+#0kbaLg=`~N09Hi>3FY^cyWqM1mBw%SavG9f-D>e^ zv8OKk_cVf{tPp!GRu|7C`Bp!ojv|%QTw!0q>>YIbPK(S7y@LQ?BlF9h$FBeZyuG=F>!6d|FPjp^$sr}iD1`hZ z?QW%Mi0vEC3v6z#U1a-SCbrFS+*Iii6;xl64}iB!_-5$t? z?-jV}mahMdb%cfnIQJG)zj#~PKiMzvpw*LPJP|);Whr=rk%`N@PntQd038|uAhVpsOVG@#sY1!NsW-aHQSCl^Fd^*(Q|?t3Pn#o0bRJm+m^8erujj9Hl^3-K;CFxt6@iZE3h-(|DMpP?3Qo)cp^$Sr{-nSJ6^vAGIG#+ z<#tO5+BW!435`|P2lM!%EZ`2@aZ0!|-n1BG^W({J>pPhFG)Al=$u8#O=lnypPyEQClFmp<<5S<7BBID76%Otb!) zs0a_#bvo8e`I}KKbHB8AHAe%5?F`e~E!4Miy|74FQ=v}0N_LSjDVTa5Ypi3) z=4j@RH?Hd9e)hbGbNnK6TKt9`>{MGlA-a#ebhmN4f9}(C^h#pg&NMZ`KP=5C$IopR z3~4G)2zXIy=`m-OTpw10+)PbS-*;gVSqe3e(#&hNlqj#YX)Y@-KF?ZzsZD-KBvh>x z(GA%-kHG)jOz=%ZQch6vbt+K)uS})N?loya(J##MaPje`P{@zL*CKI|OO^9X&bzX$ z4tR7UDd2W`$%`dnQufYKK=2t9apKgg*qH{af=GED9tji)e4eLnY1&TLT7fW`4{{Ma zOX;M-)y;=OOLzAOsNaWL*aS<9{uR_kJ0V-uIt z7Ye7X66q%biimZs6ziWkWlTiZ8L z8GAJq=)QjZ`F0tnPSiVjTpOF(D>B_-*%MwmB=sRQL^qoX>W=M|VDJux<>s)vmwX>B zt?tM&7_%5511TK5WpQYCllgsjyBf4n?6I+S$v|QM%M+FFe+=z}&KP3(7C*+vI|Me= zNss77xba%LxFu_8N$&q9pfD1U##6<2OYc-AILJEZrx>Li)ms?~uOp6tJ&a2gcl)s) zH+C4B=fl;uFfCr@@1A^$wjAlgOm zjy4w2XVfHY2$bGMXYtTjz{Gvj6@aljS5RoOwtPil?`v9@hy6(?+noc^o0a`Tm1l6A zyX_g!gXg>=gdqZ@QhLTdd>mk+#&pqx`D~SR2lH+`tvh;!3L-yJ0}hGwF*t!%;(nJF z#D&~4=O@MsKADnwRUc)EZ4VckDV^?pr;L$m_CU9 z_3y$+k)`glRY6zI9@L!83^GUH(I@#(Yz^Wh`Lf1g#wmO8Ka!-#6OC$FtOOn7G!P-| z?dS|&1@#0|{WF)o`wAc)NRGY)k#=DHvO5+EVDbP;a?5Q7{LXqvYcjD>OG<0U4eIqf zSiq$1Yn5nJH*ivD1<{``*sU~H&m>UK7FxUG_o^^?5 z3^%IX5Yy;#I;hD?o|iEdbU7NVht=56WvZuDS{De)uw7oy0sm>AvS4uq;63LzB=U@3 zRv|rW>I*X7G{7I)Q3N?F?%L07#4{^+5z7pUqoXPsmY&M_#Yj4=-M4O8tJA+bki4K$ zi>nx!G-uU^vMFg>ou%VGltk$j8`ixWh1clDrAHH<%1ydR3Qblr~Vc7(-G|v*@b~#>S6a-v1qkdMuT$?(XsFPb0Tq=Yse+<$VR_i__ zVxPOmAVOeX2M2lh?5+!@F_~j+F^)#WT{pDsY^6ai=EuT9#mp-ona)Tj1decH{iHUx{>uO;!b| z!@GE8oSVj!G7Tz&7x(xFXqgqxwG6}sZtvj*=8LRq?QHOTc;{!sK^9wCj3-^}U1m>I9L;Hv9(+k*WVKc}^!0Y% z%MfLLLB1DXQ)ge6wFJ(EKFPgT+sn~-66cvVba<#@jPiB5kjA~v#)~GT=YAv`rFodE zFM)M6Dhg*RYQW6Q=2I0LO)_{%#dUnSQSz(Jrf~IwsX2YW_HpN?#u1ap)8db9%n~iD zp7jv=yjo_Z9{km7^~BoCqZCwXL42)>N2c~v&%Lp)l2d_o zO`D#*gm-=^_Y2#hbUNK<4^yh_ngBfG z>G*xxv~*b?tdg^X)@Cdzw|nQEXD$`GFmB^wU_Y2 z0nZ*E9f9<6S9J0#YpD>2Hbb&t{M4QN~Pk%|u4{szOH58L1 zzii{;`$*qrG$)m%8AkndHJo|o?2CBb8jh%bKhW*KR~OmT4PK1A@;VT9&HyPWjURgQn^n1A?^sd@%Q7XN&W^X%bIgZDUVFul5z7aJYp& z;tEh5o)d9-V1>N`bUJfsYAf#@r7-1Wv{wcd_%DH}EiZx`ENCs&j>bnmE=mP?p9anm zVU_o9K!=U2?bFyp^wzUfe|lzC_|{5^WomalN8^)H23-Q){mm5{m9fD2ptS1kZx?LQ z$*j7yS;i<@qG6@9hB%*d76rUi9v06!OU1eqtSjlR04@Yjgs5{!n2+SnvaS&yEU7SI zAoHKdE5P7{3(06+vTUbb5*XV~5%IXZ^W7LH^{Q$2mc_#czsvsF3f}zUjZk+=KwlET z+Be)tG$~h@HMwRwtrw$?0|Mfe9k3FE)U7hHzJ!;a;)#_(&%f4JeV{1zCuO3|B3_JP ztN&tOZW}`i(2V zr!2zG*NGjkf8w82RWy3WZe-bD#{KD8VL0K9=%^>Kunj23&nZ-sWoHkv;YVZ&jVnh( z&sEgRfMPNfb69E0tasNpezHYKm9_5hG%(dG-+60@|_=HLMz5Ye5;CSL8enCg6ab0fS=nBBbe3`V*d&v;-!6L*>6Uj4pUesD}1^Dr=P4tuNLNm`#wU$ba;TN=2}+?yq*e zdl}FE757Nm=ti1iitX18zeoDOg*ZYmm7gG$y~G>w9eiW*NA;v)iR!d_B=ufK{s;4$ZQc?Xifak@?m{xzTi0PXuhK9AYX* ziTBqPkESXLx;FG_k5$M>#2=c$psTwK2GhbrH%&=cK||>Mx6~UFGPzL_Pi>r72~U+a zGP2SdX$JBtu9y(Ao@i>H0dt2gR zR%JU2$dAq&W^vZnJ(h$-YJYSDHZ(4JJ+g6ycPyYA+P%^scKRb7e$R$tQZQz#wLYbd z4HdRtFZwY?=nW-GKQPajf0h0Wzs>5TIqrRK^?A2OqNyUwA*Hd0N}c755vhJ6l?^RQ z?2h#*wY;qc@%sIy#epIK7IkkOf2}_|e$Xa3Id9eG8XcySl3ufhcLLpBO+J#SNlQAFF zd^>h}uPLY{|BVTDG{EpMv*t`;G=;e+tg?HUx7^a{q-ed+IoRl+1Oam*adq;ixC)g{ zh|VY4a9o21;)#rBEq8Z>ri7au!@kb5+Gdvuztkei#EFm*qkI-#Uc=mOt0I+f}X zpIYV|)f_90)q0@N*t6{%BFE%qZD&9? zT_e)f-rk#Y40&2cn%Xo>x#-983LK6ESK7i90?tm?xcI>~x``W?RR~nSAYw*7r>R1D z256nA$xzO0T>bDF`1dOZg2Z7Vx}_iAdtnrxv^lu^Xj|{NuDfZk=WA-xUfT4{UFQ2g zV`T;SC!X`TxY!QcIF>W5N4~C5ef~4&3Fp_qo}+~p+FIoVa>xDmB!NHGoD+}yX7krV z^5U2M+#^PT(njwfKYq%g}Jkg_7!_uT^MM}IXl ze*=<{TYs%>(_xF~Us24z0RZNbj|;~Q@4W{GPIna_#Ak)$>1KH*L*(w>n{*&b>z+!N zH!NR7tzAS=enA=;_I8iBYE@@lJWl-DLuKAEt2?&c^<6f$t0yg6yL5HC4zak?tf7ab zak@&3g>lyTL(AaW^4r45|M7G94@Jb=`XYRy736mMCEb}s{^{Q*J-Y86e{r$uBR5H* zens(uUeiW^KI?=#6qR=2IaUL2+L?>UIVH=a==kxS(!R?Vng+W}{pDx%{sy{1H>r~S z@k2?sC8H-{DJI07-ti7mNK>uS*eKt|8QqDe?)gam((4*Q3Z89yadB4r(HK0MIO3B~ zG9kx7aGVMVt?W?E3fIR-p7~a;g?_f=)fLt_zleuf7tZta#&S(dF~+btEpj^NQ^k18pROQ+ayoG!?zYm= z#x98q<3j5lSGEqYn2fj!x5C)SdAD+DND)fhCLbqUPj=$8VsuP<8)qV`9m1fg;uY>? zEo(id$h|UYc3Yc|enOMm%gF}nIEyjCJweS7+cInm3K=DQBL7^F@`*e1R*;wu(94_# zvw@jS&YeUB`K|!$o&_?GP>8aCz2{I=N zG9as;JTMh%VZQ>@O*FGFpR!uVPrt!C^m|RMRGo`5qu&iCTb&zBhEriGosnsNV}qEC%Uc}$LR!0~3Ri%~$0L{Gpz}jXn*d$Ya65^xz!TFeKt)CI zpBVR@1#|zlC|L{9+4G3AE5JO%G-bl<|ESGMXKJ#XCuJs^6He3jlZ^4Gx}hj}=R|D! z`fgz+yC%)Kc3pyJ{isKNH7j`X4!B&7$rbjyxU(4X+Eum7ppw5^Du?4;rG190J!#_# zfITs=_YP}^u74sXUHEaYT>)GPlJiFq3)#;L?6%lDW^Kl-MrrPpwAIjZ%ZZeEltWsn z_3BWZ!F+8-mE|jLtv)rKI%BRLkVliQfR~$o9O|KzoKN;DXRnYG*Yk8DnCy|h1g=YB zB}n~i0R}ID510PBGb*3lob`T45=490-M7U=EWIUZr}}FLAMi?QNHV8KfwaP6AQ$3J zXYyXczJ+XNvE=9^QWesdoizc7%ijw4pior%@eZ<~b6_jpJwZ}-41cdV%xG~lckZk= zsT>+q@WW9I0wdFGML7dLRJe$MO}ZDNU!HXH=npxqD}QQ0kbkt=Y*h&#+`b=XWViA< zyS~!wi|L<+m3E0XW{5p%hl!|Xih>8PHB>-v2&fa|Oz`>VE!2{u$NfA|N)~hmu1Meg zj?2F`DtgZ)6GP^;{`%}&#c=tGu0hME@N6zSEc2)exR|lyUOGnm`U~}>$4_r;?0=oF zR~0!yX~vFKa$W%fY#(#T_2ioM@wL0%+-~+6_$uf#CYJK-!F(xim?&^0u)ZfU$I^}P zqg_94!GA~}$4rRf6`mB#*9OimXsX!R0qK=?_r#(sep&Sz!KCa_m^AYNztsu#EIgK$ zl{}R&osDXI^!?jrWf5Ym--5~DA*-{;9(=*cz3;()&NPu`Ofe)Qng^^;)mF|3op@}POZq&J*eN|q?{P|gj z&HE*x&VD8i$gwm)oGIzCGdc#U=o7e)sG>a{DO4UU=<9c+n-OGOV zmT>>HauuRZP-hwUjW#G)`zUdHgZse^0~}MRayY540MT2Fmq8?t7^6ohi~dKAYXjPc zT><=4sim@66gnx?e^wA(e_!g)82xoT*)xGPFWm=Hr=g#d>l4SIon+2;oUJnslu3{j zXNP79UjdTLdA+{D57!k(C3bX111Xxp5isGifrz(=QORv-$-YK{r0l$P0uw2$erev) zJOJ}3**?wj3Sfm-^hlVCk(bbPcVQoTO{%Zrk!Uz*s1tuv4vl%v)LeycEXjb)4FG*| z5Ax9_JLJ~5M5>(b5Z6s&y2pqIo|ZCqHVIKTJsv#N<=zTzQN3sENBW)3hk8&HS}mCB zeJVL^?kd=ky^W#;G)W3aaQ}bUZ{$uL(JDCc<@W}<)Xr;Q@ zw>@t9nod+c+s*G|hN999eMI4n9^Drd-4=!S8ylh-%w217S)adw>cfAG9nsqc;Jwns zlnkO~6PYWsBNh=;lMxfOcPETg3dV2|Psf!dyN-4)6YbV;ZX;TE>AI9)#ck)+V3YiY z5sF5&{zJpAaNGYJ9L^Os;UAux#4c{!Aiy(Ty=<7Hpw}pcVta|%IC)VkQkLtMmCvb{P}K82BK!p=-6HOlARG|H>9r zs+q&DonAlDwQ2F#CT`v%iZTL);-`5^zW|Cy<6|%1xhBr%(beG^AH4K**eO% zGE;TqlHy8G`t_xPEHE@e%1l|PjHy(#6^}Oqc4^)#6@?-!bzmZWFX2r+m}eVh8BkPA zmMcSDkxtqVE2e!1Ch#Lgv=A~0bdn8w*_pdkw=j^09Vw_8E#VN+FD&u|YRbIyELwct zT0a4S>GR6K4*p<<5AR$WV`=O7ndh(%Gpltx0@`4Z6U`8sqSM7lTd-K^Mi?c-l6i&2 zN*?hQI^v!YiH7l}Fq&;oRRNPB&ql5SY=rHB#MsQwE5MBf-Gc$+D}X?8_?v_FE5N1i z1WPAwzT`M(TR&W&N%ebZa7WU9TC)6n;~|y*m=ht9Y;`VNICLmi%C^27{ggw{;qR_Q z*#ZYi=I##*13*ZOhm&hw-D`DJwv&J!YCz&{_L~niPd&o=5g-3Bl>askEVN8 zI(`I$oyOwV)UQ4Nom}bPa1C=AAL1Oh1WZML@cm+Sd=nYeKwDs zR$>cB^bd%L?K5^|LJO~756Q61aOHF5;r^BTWYb18`!Kn2?d_*132CS7ap6Y-(oU{7 z2tFTf+DT}_)qebVSJ6{zr77Bly#lzJ|4uXig~x0VZ@q5MUBX$@c?-YyT@uWXGe4QF z;V<_rO!DNFECCOd1Q55QiaoVMx|@0on?L|p2Xulp?j>w2%pmdbJW%_@pyl=zNt6KnmWJ9AvEiUvgxBpm~TpDjS|Bo~w+ zQH?J~U4hJE(u0Lf%Q0K56lRcLD*mH~i)6V^8N3r5f{=%5SmJJgk!9-!FE91iGMpF6 zld^d16)i8WeQ3%JYYP#j&l^aBGX*(+l3?<3!yc?$zHMhT$as^N(XcquxN)dcG2v2l zhe!~Q$O&N&F3!@IoshGh>1jafm+(5y3RMff?k%PKYfv2`ygy2IAAyD$qK#sWw7)8( zNt!H}=ta$cWaF`#_=VCJu5ZvY3ctptxpH_iolt3U#P+Y5t|SH2pu)1KW9sMhs?QK#b9kjF0S zBO&2br%}J2OBedkbEZ;XVt26C6H$znRVI@5|CUJ2Zshj=Pz(6qrNVzV`}k(SWQb^K?qWsq<&bwAX6kt{RRA+IC# zMU{T-NlOXsL!k3T!oR)b|H8Ghwv+?HuQ?)vUsvK8JBC!l+rltR88>aN7ZCH?$e%Nn z8>xNfI0y7TGD|hN-AC3RXTK-|%WqG8HT0SzdMwx|dQdZVqc}28)jGSgbhu%-UW-xE zzIzk!d96W_KmV!B>s|7i>*L?KWxL!#b>?ta?ufrr*P?7}Do zh~|C_Y428J!6~q^vE@VI;FKn2wHD_$!4;v+vIRbv;I0WU5eX}faQJ{+y7icpBv9re z-0j3TMus)7bN1Cq|GeLU8_F=rcD*Cc&)mv%X>!g!P&}k8Sm&i^{&-?}=1?i77L%Ph zyo$jIt0BUNDGh z2NWKZBw5W5I_UI(r3XAU5m?#1QE^TCL8aVZgWOwI6_+kGLK!b6WiZ&MB0V6zbTUWI zs1X6F_DMHrlZvHzOadkPOiIUL)q*`n=O$M@T3A1>^3N28(SDWY8UGfvN=rx z+fhlJVN45J+&Ok-*|6I3V)lc~w+#n%8e~I@-1q+(Gt2bz4N6Wc zC!MQO-5QyeUW&B~=3I-9$HNVi{T?c}py-+mj&QE1lV@BU$} z_E}05lWpvyW%HLN9#-e7$;F`7S&bPCvT~DMQDhR6twkLS%K$SAoXf4}Dh`COdv!4| zQz2|u0QrZtig2=9l>GB&p1v6h65P@$iKER<5*<|y!EbX`aE^y|t^Ie4i={PQN`3Qi zy-AkA*E06!7^j6gIZI(|JgP<;j8cJprrSn#^b&qVoC*q-r}j7juCIckd8QlZFmG~V zRpCC78!3KEyUp36MRz1>vfY}9cO+`i`m&=XGQ|S?V$y>?LumRU7Z-bca!OKY&6M(| z#BkhHbKr`fOj5-hDN4^L3%r)(Y^8o=f#49B}|E_c$b4zwMd0vYcQ{<;Ojdc4OnW zgnB|B%<(E+0UU@6*{Z4@xW?)IAWQw&!sYJLpvI%oD}ZJ%JWedqZtP%rLQI}pxX1Kl zOTADlK+)Y`;aaz5i8V+eM!M9J&rmc)COgE0*P{Os_%xXM_0!Hd>&8sU+(rX%jW`Rd zl%F37(h)v4{Hu932pe_07Mb1DYDjy@(cgWe0Yj_g@kYY&kyd z`aX+5o$T`iAU$%2d(VO=*v)A3! zWZc>$#u^mF2V`ecd>vfj<#=qvzQ=_f$zo2z^n+-Q!w%n?*)nL2@p=qY>h`9DWf^3m zG%B zcGMgQ<%t>d<3~Wz#`4zac=u*K4^Ek~I#8Cn<5|W{hx}Qo^Jn`ru(9%6+aPC?To<`S z7Y18Lv>}vsOWX%VQ|VJkx`of5%VK5G9$Le_M8-uPhiUiMQYmj8a0>E1)oe{C`X-&i zC08*rRfiDc_wc~v8Wxd>*+>J!$AZo&&w7+5X7?oDt|ej5i|GJ+kLfj9Qxb=gJgP9? zs&gTWQ=4b8T_H_8!E<=;xYVYgGi6+3xay!+W-la_kKIo75SJWXOv5hX~uh ztphK`e|9{YS^DQWIgdep>HP5; zX#*4vUb4bu<$Lsm^};peWk}AtRFX&FEuhpnr^6%5#s`6wq9+gAB4V4?WB0NIO&eQZ zJCT}XRErCOg9;NUJL`tFEnS(#r$y{xLmw!Lx_*P}U0y^p)k{Hv*| zF7shwQHM)2va3(Rj`u6U(v4?k2%ju#xXegBnG`kjskX5V+FJvo(U}2EbimEF7yiEX zFzgqf;jJC3fD9iwW3)=8%t}okubN6b9ISZWjWin{N&W-l`|w`W>nA)x04PY(GdafT zbCdasJ-CuU8yI{stW%W=!2~4u&ceBiU*)?q0|jDof7NqBIPerdM%b>rbzRvCuHWVk zPcBi)5P$9yqEdgI=xAaw;Z~fbQyofF%F(S`hT3dv1lt&cU@h)79-O@w{Pq7v_|U^{ zkZgXmiV4Zcit2p!<_B(PYC=$lIaCBjqCGyl^h`U|?Y4(tAIczELcZY8w z3h_H{cyN4HK}k{SA4*T09QzAhknxAIn;qPe5Dzazk1Ob4n(@fa}aQGTK?GQ)+F6wf+t z>{o<{ku-F3b>Upgob^~&W@VgD z#?ZT$d?WwU8v4uPW{>SF@9sEEFz!PmdK31{^1@OghbiNm|H~Y0o#Kr}R)LILv0g6s z{na{lG?Ir;H@X5yTw_-Sxx9XR`jx+Sa2etD*DYn#1JWoGd5Cl=F@uW@$2%Q zq1*_M>0PmofA)2HWhQi1zx)xbXpd}s^3my4dBj3_>6mnzZh`^lev*l05>PNe(J138 z=6kZKvUCb?mpB`=C8DI#TH-~nk(|X=DLH{GLfvs?MMy*NCmUo-l0|sh%w&GnW{sat zqR-(%D1|%wGG$yn^9dX-72vd$!C(T#WnFFv*8jux?4h`m_?ph~Z`ff2Ys^>y7u{ z6JI1``?om`Mx-(exW(UV^}yes3N+dhi^ApP@I?JGIo(2<_|2`eAE z3cg6{4b~L8kZ;&rr(V~yRUh=1DRv%-PPB~|1&}+S(^FU9NBWWdMVTeLB?Wd9Kr0HP zfam(#uc{_4KwZ+p@B4WQjQ2k?*ikqqmvL`ST|PaQn+Ag5jvU9d8F}v}6WKZ8Vi{s4 z<*LMD@zyC#kwX?IUBbbw1{k(v`}HTCWJq0rN(n%}2@ zJ&BKx=S27#R>RgcB!!v3AKxPkUc*&klfAB7>j`FA!aJtA7#VN7wko5Xk6wJz7-%k< zN{X^`iaay~z7RO318UVA<~6jUuteDp_v47`TC&uI-FD<=1|wg%<~Z4-_8x=ysc~g+ zDb4x9FSb0EG+~qc)Tpezu-e<_{5aPZL1>2Gowt9!;ZBN{F%1?bEnYjej5c>V%d&MB zAed!&4+Vt!J^Yend=cv>^PqsWxCaGZ#T@DZWq~jF8fM{iKo`XEq`J{K`(PFMN=Fjn z6s9}@H3l}>3@Hy+G$sV6JjD6#ARH+6iAgbrk>D6auDt{r6YiOvs8fj6%Mit=wv z$lUMOpV^Mqy(fXzJ79FRUdEuk;Xgm^rN%4Q^36G6Wq+6*oiBS3C9q`Pa z;E-EVQx(~ABwUcq49?B zNvF~QxV38m&8Z{b6GnbIfEFD2w=NYeAF&TxxQ4jdAAe)a^Uj^OLDB)TC8u95YzU)s z>XCFnHkA(e2Y-6g;Kg7|=>S#?XAH{uJUQVzZfy*r#jD~{euuj?@czKQwKQ2Ad^S~?xs|Y$WTaRT+B$=m^C#Gv8_R8evdk1v zUs`^M%${nEKI>=s@LRRLyXvs?7Mmd1M#?rnw;hIxSZhJ0muEB)m*^R)^w3E0 zh0p$e8s!)#b3-AksbtHq*L=rGTAE=zs_0 zhVh*;kO)B`;dzbyouc#A(H1NBk&euv-l-ju8PXcFH^T8N`-$m&{}IL)J(CT*X26tM z?6ce8x;kl)pfF#7nE*{{>mi=P@H4mHK*E)q->gW7ZzH>55mHzp_Aa~H3S z@-R;UIrJm^Tg1oD+g#;aL(z{dcn{5avpuuY21a)4%Aw-pJOx-%(qxG>OzJqU8;Ej|L2 zbBIHrS6=^H+c&&VJWR8SYi&rSZ|yUXlsS2Y9@P_{PHY& zxRFenxPCB%DS|x=ptWr7h=awaIdw(k%|9i(ov|C6j$=32if$gQ4vao|9pg<0uxY<@ zz&VEw%6_Q%o~e;8GWBQt6fjiyAp&i7n&9v{Da9T0fo$f}`s!EAk;{tH)RyY0+=5!>~}(~hbjmj`9vQl8@O z>MD4l#A<8N8N*cbZ|hEdc;5^cC1L|^QX`t-&7rzvjncGpgl(wEW_4f1&i6S{=&&_L7m2RK}oYP>$QDsn$ zoUJSRW+7lbGagDD+1jo>BcP&me z*A!WSz;}3)mnEW=t6rUwe3Gw|M&4A8JdHIM5=|7ShC_^wWC zFDs#0AT4mMdL86D{sc|TWmgIg$hI2E)pnz;ivmBkReOeip6+?prK|U%A#M8bsP=;t zF`R-3k;-gmJIm**Q`y4WCcWAkpxV8ZsYfUN z@Buo2vHgodPzmEC%-<|D;A;o0D?LH_X^|aFf4xYlE?q+wWbHn<;TRkJ`|Vst_`iH; zkh$=cn`U%!`4>6M7ZemNH+klTk+JaljfTJPo4emLZ0|D+bp+zWu>-$oHylJ}f={V= zJ7I0q2UEhG>WWKSEf*d{L8M8s!D3~f%gi3;)7Gf*XBnR#|9JDzx74>ZZ#X}eMG$(dR4+Wod3(-d0y&XO|p!u{|5)Bce8 zwEMLwrEASGY5Xxo>7~_(Z?WtXY3GTFAG-x{`!xif*z5Ds3T-MG>Ss3e$$#6Tvw_N1 zcfgM1^f!tKTn@RH+Zs}{4U;i_X&NFI41+dorwSH%Vd#I!qrFE?BO#ei3Va&t4nuLzAKTjZ* zWSOA?ag(2VjeCN{mxwTHGEpJQUzSr}Uy|Y}sG<+))t?O%07+$(REVJj0!BaREn$Mw zyu(VEV=fzdOnMS5;!%$&K^dLCIoWbasSV`b#j0M@Kq5Xo$IGd;{p4KJB|DqU--2#a zf8f`66{}V;;c+2K0bnk(LFrQR=CJF|XeUM>*6e5TXpow+Lh33O3&JWFK`{kY?WU#JoYL~-q_ zR_wcQFB0=8Mq3)oO@q&xPl7I*MYQ?LZDsI4K5)Y_Bo|{My1JLcr(|qV1dBf|Uo8)K zpByr?Q~_a+s1hx9NJtQ?@{)k87UIe_pSygsLb@;56ph)IsVv;65JD}qmMi8}fv z4AoYawc*sfQ!99E8>pKS+fuc;A4+PIX}_q_)n@D_R}kK3v|scp577D@8@HujaF3jW z(^#WLC-fbCYr($L2Vw1mf+>UImUMA02i3!M29LmMNdwP+(8gO$6{|jgWj8e?gnE4# zu6nN+v~TJsrOM^zYO_J$|q>CVC6W>7}P;WW`W{%m{mjmxt(KmD{Ff6qa;f{B{!x7G@R z0rLc6E?;M%`C!HBn3fd#J%6LjZ(UQ&##N}2qXe@?6AtC?S3VOEIsnTy%}xifoK!2% zUvHUGk9PNJ+Ya|m!1m1HC9+|$y=W4j@S&H_HFhOju*6CxHCS?fH7jdvN>w9}iG0}O zOkJKc{%Y-z96|?lJFbDNQr;y&T2EsCJaF}KD8}TgdqYK%hAcJtxG6n&qm)Bgqu9Aq zDt95q=eXa6xP07~wJ()oPKc-{>gRR*+VXU3W7_U>%-(h=vfqPr5Pbjr@;%Yv96P=T zznPWjv?p@Omt=4pxwX{qgjZ4S3UAf&YJo5rfhKhtm1;ZaDBJuo0;<0jl%~m-0gOn%f-t}i_-_8Y|YX(Kjy>d zypn7NM4Mp7Epn~7`N4zlx*>`UtU3(tw33sA{^II-X`{beqi08CWsjvJU@{r+ld4_H zTVfTBOHAIPezkzrd{g}L&nQPWlBj8Zu>7*YLq;OP+3+V+^Texu+jm}0x|&qP5oP9nyO?ZVwm;&O1 zrv^BtTd#`W0w2>vtZB6gS+Jj}B#pj@iae_H4UYNeg5?#Ydi6los`l%M1Gl2#fB{iB zpUF3U2bJ9&P-vT7R)qR_D*fSP4y{Vc7RMEG{e2LV zc^t-amih^a4@lvEOox>~DKn%87~~i&fS8z(l42e5LL3i|w;%*0_z{SHG{cI900M9* zmeN*-Rc5O}&iSeJO$G9re~XEmRc&-$aQ5<;xaZ{8%o-;Q8~fb_TVvsrTl85+Fnu}c z{YkOOl2D$74BK8>z)^#Ne;;lHQ(nSB*3sT?2AymWp`wKr>!~SmQ;*Wjz2kg$5b>jI zq&*en@6p_IN+bCQL}rPLh|5DEIms5>#7KWb>Sh{{waXMEqioE{TH$(!u#B%a=#gsp zFlo@vJ^{HB^qTAekBaAEv|+)Bs0V6oJ+P#5(M zvZqDSDQijt9WZ#c-H}?=rix~2`AX}IoC+2(_tL5N1I2&74D&lz%0y=~I0+Ob|2rYO zmAcri5`9_n!?Soye$%&h9mgt=dviO<Rv^j1{DO zz+0ZRRAhL<<1}Gioc+W4>81Iu$878YVHi=VrH_@dW1-qXY<>+}RB0&U)McA0Vrwpw zR*Zv~>m}tZCk4wjHdMC8v=j;}X|HJSHB&T3`K_otSY_K#1%k8D;e&^e<7Fx-B^2I{ z6BbuqqKc5bb{mdFvh4Vj78)GizUzF!6f22-1Yvo1N32gglqps(;>KUxcgwi#4>P_% zvmRbaFEq>fqG;W~rqTK_IUf`ah<}h8+A+7imgw?Cs`)5%SyY4+W<9#^siYmIFU}Xy zQSW`>@j+kiNFb5%vu#eyU`H2KiHP&D$|ab-z=vMPOaV| zl0ChncfaQ_pXZx`pDs^sRk&4%S87|7n_x%eN3{q{=#FQaGRM zynh!CjmH}JrCZ25wQfcws(*`cdAUodco z^xUYB3QT$1*n_NS3R}N(?GsSm;kpb?enaLiPiNg(EoMZpbBvoetvD{)H=1ia*@wUe z*4XFP;oj>L$y;#bNymIQE!J_^^gKTj5 zW`#%xZE?AU>^4|dx{{2D|9AsJg6vnE{{3S(xp{4FJThx;!ChZ&TwIXx{gS%x+tIl| zja)X4vzGexO|15)L6zy|0S^!Au}JgCG{?yxcC^`Za4YL}#HMELj87HIg3VZzc(gm4*_l(TE@RB3BK<@(+Z%5_MKK9*^QkGTmeBTUY6r3@c7y_^cFchKp-Eh`G{ zrcQLlB?Dc0AjT!;zbg5nPPTYRsn9oZw>^gZDLODyW7antDeGi7hB*x~;vsAko3ei7 z!Y_6hJ%M&@HV9r0g?i0FtH4eL0ooF)+KQ}64ASVrW%1a zo}eupe*cTB^{Xk%{vuqd3$HF86s`O&B+yGeE@**jLzXs=*DKX|f-a|!3sU0!pR<-o zv-_p`r^i_y>hQDtY_<8+b-Fj~268dX-@@Rk2b=LdlPo)f4I4!qA{W1JdPn=UIJD%n zzk)%MXZMVVcivpcWL~QlF`H(bs^4vY#IGIeb{FKeOX|_+Qjq3AXi~letIYg7F`!S}L#$C+F~zH_7sVKB(_ed9^euCf zI~%LyL|7r853X2A!iDE64<4^r0S)wNw;uR?K$z*v0};L)E2HK-M7i1tj`jce+}p8O zZW_pCNeby;g0K{@vi?k3QUU(^j_|*YV*$*_lwP;L#j`GkM^5Z7SM;1LU(KlM7naGJ z7w5am$eTN=;1v>@_)SyugjJM^bIQ>1ia#e#P2wb@zNcCC>SIMRJuD_xCrk>A{M=5F zp$!TdPqy|}IC}Q`eo++3kgWguj(=e0O+%4(-j_8;AtIWBaQf4H&_d2YHRc|QyI;m9 zPT@#1pMtKb&LP}vuIJePEq2U5L>S3YrFz&VJdNcGotFI(cGgakIRuML%lhm4&TL_< zac`=erO|_pLQ7daDIO-$#bz;gPWEJTw1?yaxrKSw0^}dV_RU}4Ysd{wW{G}+zMZFRz=-0jfq$nfx2C1WL+M)0?Q z=W_;cOYU~*zeWkwBMQVCia13w-RdR?{J(Fg{g+z%o_3iZ*+1J&gW7I<%xL_?4+9!H za1Kjr448RCL%XM9`142p`py29RO^Bl(kUIDtfP?Pco(nqP%YYyY5B6E8Lh^t2yr_m zWjRHX&9^`$S6d5Nx3+t+?Wre9w9ul9+QXd*e>+_@%-w}BWQ5YhOFG~XRotw1q z(<5jb`dbX9z3#(T2h24l*tZ1l6`N;%h_^7mt1@Az`n)-hW%d)h$-^qFh7(E1*75Dq zeEME>-l#+lmq-tQG0VZKNdwvwLY4Pr69!vUHh<~VtFeKR;wX@9P za@XGM=X=`C>U8Moc8`4z{&|DKoTCa}@1v{mMnaqFPY=t{W{sL1NxlV4T8@48>}5M0 zuz3>XaeDVY)`TbVcU#jHN;oy`AvJD+Uv0>KN4+hyMe}xX;*3`Z`FgYKEZ!gXZTjim z(SKe$nr`(wn-Qm9ze~e>crX1f?i(^rs<}iQW2s^;D{n^AWRsgfPjBbYEH{od7hU*7 zz-cQU0Y(z_ynbUuPQ1p>1=q>p<+$RNA>~ZnYsYv{X9K&nptsK==Ph3pnv*?JE>&Kk zURO7@rCwzXInM-B?>PLR15_lxy9Z?s)4I&3-9#O%7t)<%L9VG5-<>Op*by`i5lz9g z$x*u)%3o9Axrm19I%j0!VXkuR>c()u+E!M0j#*;oIi9x5#Mr2?AaudN?cznG19T7g zeEp|c+)u<>a`Brc&vh%s{{ClO72X(H_?KO^q&=%3Bj zZ-idejrAG2me}9M`y$@mzt9<74Kv~P-}f3B8kl9ZK1-#P8WF2kB(@tQ8;#L0YdWA* z_nL4ds}+AGd+$BT8~9>y>s-?gx>aOaa)REp4Q_M{XVvHO^CbRsv-7ZF`>fLxg_W#T z04|k1ExZJZ-$MU}-EvCvS7A(WfjGKupxtEeH1!iqNJ*6kO3w8G68m;XE9)zp(J9nR zhIah*$rduBz z0hH8YzvHSo!4B+G^@t$UdwRH8P$UR#*RE-d8XZoM*}!AjO%Kv;^)Js(TzU6_a4Ton z!;|>sGe(hxyrQklUNegdyKK*`ol`DCmQDNf?Pz7tv1It4iZ}dyZ^d>sF!*qol9z7W zd(_{RWQ@Y!t#H9w$!Dn;$*Cpj*uIYxW0qYjQ2WXkxeM8UqS_*>pCmau!e3U(>f%s!z?y?1)MVE-7LBEj#Q$ zzVA=%vH5~KZtS1G=&k4U@|JL?VFnTs6N?O)Z;u|ua}Ny#Z9F2njjoNjJh0eCH^M`g29MZhJX}P2XB%cge;}5_$bDe--lM{BQR#Aq~7cZK{>hN%Hmw z>~g=mK#(eO7W?Cw0mi(7EM%-i2Ci`LM-yHF@s>DxCg7+Gz0w-GCWrPZ_qr(AwQ2Es zm<)lea-8iNw`L=KBU$GZ*Ul|yTbb|a0M>m%gh28gANQPNG{|MGwnxpo7BmJ=Fn%s! zDDfc*qO+j^b*KJxPcb60eLPe%lCJqN^@uD{k-+9GPW zh4kBKcr@j0ib8pylH+T}O+!v}6m^-Gxn=Lp_^8-R4wQHf&+cvXln0wfDLPLi-hu!* zjz{`hcvHI+noISFiH@mKv9X^vuVrnoch0%rg98`_YGyCm7;J@yxvhBKUWv*2wNS}s#zuC5JpCFvc_g9D9hoBCzF$f%>|sEVo(-2W^zXy6#j6b3U)6e&1AW+^0-;`S5h{8f@ zJSvM*%dYLgpHeFjWy6reiCT9Ovj5LS(LJn^Wkd>k8<-Uu(h@9kCG9_*KVQ4ZANxcv z;%4kW1)RVAJA=7N>ho9U)7`tWEAEeK@z>ARBQ7N1=I%Bld+^NL$DwMqq^pR|wxu(z z7t5po`|EpZe32qE23I$gCv6$)!!;KIIx07b^+9V_D~jLuj)P9WZT}%J6>vtbS?+gx z<2jN%P_%03Cux&9bgTbmM^wT$(K9XZdD};O?8ISszd$tQ-ezL2NXHM@>9rYt=7}#j zYQ}GrI?WluAH67BL!?j>2}p>V|3bYP8eT4zz(r+3UO>#Y zj%mLP^zYQdd%SeT_n<}m-K40Dn;rbvl4UU|8c03T7vT?@Sl1zoZ!GdF1kP@GUfw$@ z+t{3>29+o3bF*sPvL(51WfePveH=bLV~I&9F$Fo1L^7TG55LirF{ows&k?B0ys?ghVJM-y`dUgshP5E5L zrlHg`Q02|~&k}Lw^QJ+Q+=`E`zeL7ykk*YUPp@W3%`>?dEY36Sn)8XoB{Ma|X5Zm$ zhqB_zTK@PS)15RI&$>47&z+EJFAHC9%jm!Ud#3yUK5oo@*rI8%F7ply{Y(bGDQ-+tLo>fN$snqCb<90!?b<2iL1YkIIDS zic`cYf?OpJy9Gj#McxU4OsKi-nXTFy%jKi&EYQJ}%D&fpPyij!t%nVU7aIw1&xWu& zy35xjfA6b97LT}!R6=7vE?3TOPc8s8nXQ=!yz@O9{5SD%LgYWz-}LW2`aNL>1rC~F zf#E(uNmbW70%ekNTlV**6I-g!FhmY>oc|oJU%NqN*0Rh9kEgSTBl+Dz#Y~P5Zt$#|X%9A2TEy#J zlFLusC>q9Ll$(#ki}7-ZW#^w;XQUhp?}l|~hm6;&u1D~c%NXU7u1oef#Zdf7?H;*# zWFcaxfYGDOLk))V_!P-gI8HbfURrpWC2g%rGus<2EZ+5JtyjX?FX_BjEgUkDWW_T1 z?WWF62SpLyJ1W?44t;&ZP`POSTOoXr1@90u7ZCn2`nn@!sCDaFE9;}hL^(E;&-sU^ zU&K?3xtthdAEW$?+SCJk3p(KEm3kCOnIYFe8I_5Wm;JbBV<%i@FmD~O;?(yf76t+V zwdL7oLU&v|Z9!s2SFr zx*g`vV7{c>vR}0kn$}^0kuP76oqPQu-lw7khfX6^DfYKrq&1cK`EI+(hxcA7EvajA z;GFUYoG6l64PYBd*;-ND!459`3Jaduh&zx)Q0?DLPenK+-*3KNPiLtX06F9dT!QXH^Acicz~i6(RCt1RM(%Od8CKS3|FT2Q*fbYO zAy)F(!#WCnI&IBodmB|aT{K43y_Jq$@uZf7b7fg|dIpxbbuIe+v3vXzOXVdfpZ3HPJGLM~pausUV|EUjF+0Z+DVh|9QKuw#1OIHw%Q6&xj93Wl7~T{ETH5dYvPnBYt7= zxb~xCwIM}A{)SPQ$sYg!Kt@Z;Mg*6xruYHaXO<8@^{8hHe2@KB;-rPr8*$b(1S)D* zm0jeVESIoTHK`9wool@K{nEXFtNP;w%G#X{SdGw%F0(y1weVPEA@Pq4jLgZa`%kag zBv|S+U-K*5Wotf+Qh5aL`*(Nz@@x`Q^kKFc52XW$(KAm6&BG1Fj~q9B&G;%CoO54ey?0Y8Ud`qoVz>Zq?Bv26+)^vbgJG|=SmwBW82el|i25#TY z66dvKS8Qv1yWO+01LB9T#cJS}Ns ziR^g0Vw#r?lyVVPbV`jeh@^^o?tK?|pRUPbpJ(PCc$6dN?w?f?flTPqE4XJo5Stv6 zrhB_TGcLzP`v*Kn-Zs1TBQr7gJ&Crh44t4{w2LIHdX|S{totC?jI<#pyBT9SpXB2{ zqetOLhaPI0Z-gxNM3-s%nZ(7h;d>uDlp?em9@O8F=y_2$ z@5(XMXJNE)7#6qQ-<*El6lgE8-YnUr1XdQ;tz5k8j<}TZZQILqtUr%#gfWejiB)di zS4Yel7B)+UwW{t6^k5>C%>5;P%W|)%`kX9JcyFD{=VY@f328_RBoYo5kK3j#+-7i- z>P9v91AA<|PVTTeiD$%Bv~@!A*!hkwkUNiz6favM4){B6bKm$v=3USdT$R9nxcjTYo-HhA`=K$$lyPz+?U2i2DCGV4AO)57l~|vH!F}qV$=eBc|Ipxp~#wiX55w963-&og%0>q)HF7QC@)f#UybNDHj-fn7i`Ry%q-A!4DzIMj(XcN zj&{zQM+!G_M?=T)97lK8&5`<{@{21KEm}tJi_5Nn#xg!kj{Gya)wOCT&EDY~=&g?t z#LP?2E_c7i-Bz2TO7KtgVf&r0rF)}qnvli{tq$-9#hM%!t-L_f*ei~0m9OrDS~vIQ zgy?{J*ZQy(N*Z79rKjWImayZ?`5sF3j%!_SO3!HBm+Yc>sWensZUIpLoyA34lw8dg zKV!6KM$YkI+ZIyyLU|}CAVOLu5xHkQ)jkza4Fa-FpSMGLfWHdI^#ysC_!XFVnDx{w zyIoH`wad1)yIr9!yZn5?PM`=<+n{Wizh6{)uK$1FNC9pLJBaowifpMA_A4gv9@)7ad1!wI1)J4VJFzmz%iQyt1w; z%xG?L52FK8XE~D&691yE9kov>m$aC)C8cDwEX&?8XUu=S&?)J;gRMSx`*$ z#cHkZdMo9~{V9_$*OEj1mU1QLNC|$Elzb|h=1vEIF67u?W@O6`;rfKH{@ILwMC90L zRlBdC3yNK5DeJ`s@z>fD7bAsd20(!*t39q#TN>vJj^q1b^S)REHXB$kNX>FWv9O}g zSfM8JXnJtyBE-*aM4Jw98kyDLospdLSU5}2u@_pd*Ic!4(pM}l;6?{OgSH*Js5r_ujY^mRbjJ!!jjG?2b zk`L))0Oi8LyjIkecV5!&w+g<6loW;|IsoTZy*M!o<|#KV$lmic1E0P56(-!=aoiDG@`!JpDkkha`FE3+|iZD780V1k8CBETZIN9Xavg z-x!%cA6j?(GU;1x!Zg=3pWy8){?j&sIVD40$dQXdK>oM0LFQHCw!O1s3di<&h-39L z37Ul5icOLC<$&wLtF0!akRV>Zd6*8OO-`W8dNsvS# zRnC1#JaOPUs99w5O1pHoO6SiI-IN1~=>uL_Dl}9`+yC_h`u`0!Xr*JE`}Mm? zi#|i}?A`4Cn@XXNhMMVs_dlGOfT^N;t$v6LtUP6%zt}s{^_dhU6X&+@w!^>kGQ0a0 z9YB)Q44MRLJ-}W7g=@}2`Sv?T^GshF*8Ye6cXf699qj$q@1(G|VzPAp$33uB2aM*Vbb!8i>^_M5s?m3Rioo+T^;JYun zkIte4^f(WvZ*AqEHo2ko+x^5R?jfhw)oi8y6UA++UxR)y|BnN3FMA!384FKdlg?$7 z-UNl4st>GP+^KNQ%t=j3FmnaUJ0ExwI`zG(NC;Q0SLwd*pL1WNMP|A1vF4@^ON9#2 z0aArTtB@C-4c=*xQLBj-*r9AEmvY$p+qz>nhNZe)Yrir6hdVH|3bsr4^V+BMs+|Tm zM`8-M)QQE=y5#h)qt9JOe>U~`AdW zjD*(C*GR>kniB(t=zvjk@zZ}zSUZ@AP%12Eh1~i4XYsqg9+fd}_hu~iVJjXMg>pw}qwdaqoU|5|bE2#n zau#~mgni0quGD@n%>NJ*JP;Qy6D*Pj)-lNpwJ^TlsqZWYLn8 z)qiy9=34J@dFyfszfFD&ii1=Q<{4xuQId~U4$?;PoQh6$=_wobYeo(}_RU>o;uC&8 zL=AP3>QEZ#=949jgP#ROm_1mJfHv$H1wUMT5V|^ZuxYKq_r15lKzB2wni(`V?vy#l zZRf1OvWA0JOlG=19?pBHdmN*yEoY(i0#z*0=7YNMO)PZ7Yz8{p`0iyVM{+~cJ)1U| zVg0>{uLv(6??yn)c8`M|mG&$AE5G_L$V98eN0V+_Sothv9U!@$D&|T`CcoX5-%ckZ z<5OdDe>%-1_Q@Mkcpo5WtN5E8nY~pLTwaIA+4Xe5@n=;!;2AhXSEXG!*D#U{_q^7M zqXWWS4KBxZ)As}-$u~aU3tZlC?ht;hq|sKEpFZPKu15#Vp9CdXC`AsfhWQ`+@v60B zD4{QBSMyR>u6bqQ6Z?U5KqxWckZ_iMrp!3){9}}csO|R8zj>FxZS?-YKk`~J3RM1vT&28NhR9 zd0r%9JM@|_z=cc{`)NwEVp|ByLnqdV)y&}pbzTA|-{Km`qH>+Q+U$pg@>+`h#-PiI3)`E=s zuCKQwW2t8q0FC2wxn2Exp66-&6+-Z?_GokiSm6Njeag zA?l6jHa6lQ$#LO>C&j7OM%jMn@%?ZO-Ny0FNY$|9_}aCpK^;va|Fg8I^3;n9!j=sr zmZ6bfM&H=2p1pDMv;|(*HN{`$Go>iWdXyyOk8i_T^Szk&+T>M*d@>kd6Mx?J*^bDG0f4+TZ&bOwt!HVO}S%%Mce}D7zz3MoaoOkS}JXWWaco=bd ze!8W6EK_4+iZ|M2bhxkjM&QWoF^NZ^*2jke6Jeon;0MUcP-#>d+BAEEFNs@vrq^nIXG4nBXhOYz(mj2H0aG?S^IF8TTejRR zS40kOmoWvs3=|D$k*Sa=VN$WsCl!U%i}fizFK%%!C-J0i#!l3hK&*d!-A4!i+2<25 zoGAxCF;EU0aCGQ?Kv8z0X%pp;5yr-f5{)2cci4PY|H~snkX;@5bDWmp7dyK~hq##} zIp)c@Y`5X&BO8{Nt#M!AE$)@AQco$0jzt-jM2aiarWIOl)tS7O>@+fwu;LjUG_#M% zDjh~M7q8EeEuX`^3BWF9V+CUcL>^}^x@LDeM{QK8UAMuN2G+5YahVRUqb@CQO=+_c zZh1k|EJ=o`8>v#|L)+PwItF^{h3V$*Yw2A1&vEu&=TzIryh~?t2sAf>rA?sxmb1e` zHK)|e<;wHo8Z-DO$A13=BRk zdcL)r`;Py$I6RB*$Y}b9$9E5fpt?UM^KFO97w`1#TZ-${NFkG~3c&berxc{Ke6b#D zs<<2~_4BBqt9jj4;|_PR(gb3W2UW3X!INcbhS7fnchf5^KCjD~=+yefXt428Q?g&- zOmmUj_0Pt4 z=Oe&}$)oY2iu~*{2!mz!k>mvM68tWwE!u)r!M8ltr7Ilg6vOXRyT?n3$nm#vh(c~1 z4h?n!1C8Y}Kc(qupXf!v}zBWcZIT2+^j&KU~OU)Wv zM;ZlYMM{wxWk6UThQ}du$E{%oRjH{Uvjo>{s>E{f3YA|V!Xfqd^qMU=VXb8|n~MZ? z(2M%$z21-HXjdjdBr^(!nx;;ItpU<`Ex^QbRA*BIoGZM-= zMZU9QBaL|~D}a+gWqZ%LB4;UUhB^2}aHU=zbm!eJwjZpE8pSHO_%V=t6sJv-( z(K>an#=LGgs)$Wx`c%L%9{cQs-Y01sf zB4A~yy4xG{tZ3?2$J7M-f3WGJ`b7*55BvPH?0JXh8hPRy1_^O6X-lGS%dmdE?*GNx zdp|Xyy=&juDk>saXhH@&Atcm*^sRshp-3;GZ0Up&T1W^@L3$Gc z1QLo6LJPfj-Z^LHooBx1=kq+DzhKRp`-kgV*LBZ2ibhf!LPkc;ko0TyJdcxeAy#2_ z?Q<(7+}>T&wO*y2@!a40R+n5CW%{3<2O9AsLv|Yk`0_r@*BspFYJ_N}pLZJJj2d{r zy@Da58EdXCw6>8wS$u8^8|&2|1dl^K_vNS@bW@RrcHw^Kra;ZN*^h^6!*|^iQ0s9*$^AR*AS}jZ0Ev_Oclaq4VMURx@ou#ErNBnMVCGYun6w z5@lujeyS{{?jYDud2yb5@X~$y21+^{w^I^%x!L zDP)otzUezd*TLLp$3Sys(+|R_UDOGQvUYSzrHNoFr)k#wvaSLA^Inh@KU-s|)R-7; zMMWA%;jn&ZuB@dzDX~nTQNORJz3A_hvW4uP#y~%;bu+g@p+B9dgQo-Oes`~8=Cink z^~_Af;>Qb)1SxYRT^yQ*SCqgn0(xg5D+?MGXlRKz^Q4eW2pttmCoz*7%zr{eI#uPZ zINW;LpBs#t^c&y)sik2yW`tV{VGJA`*K^he(-q~T^nGZ=xEZ;jNuBuy`LF9;f`AX{?_$BO&RUWma`^BgFK3&lZNOjNyUAB6PDX{c$n?c3o)hJ+05!`JQs`^lsPf!^AW zL41UCL_(tDn)pT<{e-^nXhg+kM2RJg_q4Z!nNrr;;nciC{Hcc=va<8A=yvQda(p`P zp*GPVAd6uNpe^8d)Rw?2@YfAvvQ3-zAmg_L$rZAEcX;I4fR(ef?*dzpAAM6Co0&QG zcrRA$6qJN0HeBUA5S*{DYUy-@!j8^bPV3!dwvd)iXU*hw^CrKodgo>!{-NU{W+i4B>LQ{RFmJ#bUoRb6qmrZZbWx`1!$AmAZ#YOcl04x-G^QqH7+Su zXAbiPNv?_(A@sSVHEFi#lO^(Mr=M=Ce#3|kK4Q!Wf?OjzhtO*@BFE-|Mg_OnG+c^U zr@;t4D_u8{aMy_mb$z`OHwoptN&YvRFycbk-4)p_yQV{N6q9;~rxi^9MjV0d(D!ip zUdYrg_Hrw9FjJ6{nxHf#BlTxC`m9PH4n{RRBW}+cV|+rzqxudrtZim;Of#*Z`f<_z zGOHlkDW(JXc6M6ss4{z!_W!XV|CgZo{b$dv-}Z3av?^GugbmYTeJ#1zRBlV4Ux5$E zG}j^j`Q&Z}R(kxjB{ciJ7S`|zFq_GI1@Lg4HoXG4I4JMsR~>i@cn#3aomJ^n_g?|# z%*4YMlWi9dQ<~psz4`A`H#9#?(A7$3mt}sQ00vt|dyp#}9tiyTw`d73JN`s3>3xhk zSy|01n_L`{^QI(16SPNPy9$d77#qA4Tq?c-^m3g!dQoY7+D2Pd;g+NQhru}e%ki^)B|(rrrDLQ>lMoXaMxVRw;zdCH?OCMlo1Bk!l33G=`I=T0at z`}cNSJYPi`;|k`^zHM|$@8@*E2F03~%-+^iqb`em*}8o$HnEXd+VtnT`b2N8vl#>z z33cRMo3I;T;ku63yH>hirC$|{xF#3YvD>^jk>#@WMah{$Se09Ah7r0AM{um|&2sY+ zj#?P{q5y@&F={-rB4|eOXAOyTkuqYg@P5XJAUh;yk0FgWs@QO#Em3+!%PM-GI_kaiZ1+v;dTfSp z$m&sFw=ed9P04#UKy#@*A*1$9i*b|jWWnQ2tm>$@x+af0{g|BUrg)Q&-28c_SGGvU zQ@FgeMhF|8gJW;z%$!kI^QBmZGABg=(cjED%!@L^PmtqJJGi`V-;f{_5kH} znse`cSF5*cQr)q}oP7P%!0HG?>tn(BlU;)x35VkuZyQJSR5wJ7R?pzH0Pps-3)?w*``RxLusPAH>DI!$Vh%!(!Mp5HRI>q zbj0mW5ID-=EU$%wVRgN=z{@J+?CZ`(ZcD$%EavWdw)=9rj7yDyw=3Jw!R6%u^g9$`cZN_ntr~LHT5xoy8Rp})`D8xwCi>w?IVhXpoIeWz;)WB zy14hN28|t)yN?IG!Ud*-`GQ5tQz2IX*R8YGWn*2-G|)_n-k@hr8U^p4M$s7&HhgT#)@XT4fV%8I*f;K$QuM4> z%~ey5%_h%_LA`q23huG^ypBI)-s;y&(nrwCOsRvDJ{ zF^;=GMm3o>fYPo2&XpT+_gqoh?qyU}w`(~?MJpu5w`Bq5j@$`Ojac#p+pmQU?!xEJ ziy`(w>7rhdK1(c5n7V8grgx-cr<>OmE|BM1lFkqqK1xm^$XVdj#R%>51tRSmQmOv-wZYN8j_7RV%6xG5Cx_i~Z2V1fCj#4sesN0u)E#ZeUebP@T7j@7iEp+5TrEC);#U5qAWXR9~i3FoTXj5v#EOe&}E8 z2nX?mg40}Y-||4zYrw`oEU+>Di4Zg!@&GL&IIjTJ8;K?Qj>f2mOi80ngwn6SH4{zFX%()JX>nP z*Qre=%R8cZ+CYaonbr%NsT|z079GDwcRA-;FhV%BI^V!ES7Dx&Mxe8_*NUp2TRWlE z{qhi{k2O($GKHNOw%PjBvb?yoKv6(G`vPkG76B=jYbpU2S(~UCM%35`)m9Ow!D*HD zYr+2@dp)2kkh8)!7I&pWfG~b${S@84H9=jI#c|tzjEXpntkrb#lg}TO%J{*HAN_1f zAU`3nb(`E0{@IkWc^>6mb*Ez5YKU00B-3ZgPZ{Soj2%sX+voP~uyrL`!Q zG?wM_&dO3u&0hJvsaG;|IrW^_X%Bm`Gzk1?Rx0o2(}VLHVTu`dXZ`skrFC(b>c+qxwukbZnN2kLT~fZf^8!EDlZ2;H9M+ zO&fJTt}fZNr`~ldQhk7wIkXc!UDu4E)_VJ!%mt^23U|w`@lOxy{w{5axZDvJ``~Y$ zIZ!0@pj&_=-F8x1(EA;-E2-V7YWaQ4N<@EfV~08ef>|l%PiBpTqCRPkI~k>6cTq#D zBB@cP;*qB6Kcg9*kXew;l(ezAk@`(*_IG}@a!2kFCyhm8UrYBU`Wwb=vy1>exl31F z$)PaLo1{B{L)4yembuCyC5cK0|+& zi#atX2%l0vf$33&wg}9^15|un{dV-WH&?@Tw1=hA3=T@#Xi0a}lvZac6H0*uNP1>Z zQ$16do~2v?W=*A*ISI%>Ype8V@0_!EuXwij%3q}K3YOB3vnX%@a>X5c7)Y&Ye0)a8 z=YuApx3!49cpV;FP*u_<<{S4f-qhxAi!Rg67z4wSbqjYnzfSV^>37qYwuSvKvKpGQ z64TV2z9ip}T)WDIRLbpc{H75Zo<$?|$1yGAU)VZ<6KDZnbyi$3DMq2_-*k?{ap~YmA9KE_727 z)F-W8E2iN}U4$%E23Lcf$7S_m(Et1v3?hPYIbf z9AjGI?JVmP?i_EAd%xNE(d3WbK%}J!hh#`?e46o_4-O%V=#3<>afNNHrL|t0=JDoE z*I^5ZE3l-ui9ZS2Xk2xyhl|Z_5-A=8rzCAvX*Jh`G;|WK_`eq2XL0-r2x=koS)Oo7&?Qg#RT>}>#RWFoV#MXvs{hmZ#+(exs`*xEfZ1qv zfgG{UCl~s7eYc3O9Ie(Sp**YhFeybo`BSusv(9P@r11&p5`WTYH~sE+N=CzmYeQCn zV5BTM>FJ!902q`L5eVIY%YBCS*16!Do#O8zPrSoQGgi{{ILJ*>Qn+Ca^^tC+XQNVg5}vv-TSE#D#)eoiBb>$!iju)2jIZ___2D(^ z>4$>r>)a)kNpJ(QxvB%@Y4*SQt#>GWcQ_OTi*K6D^&g&dAl#>RVLe2OnyT!WE65;}{ zjW>ImlB$pXX1Ix(q-Xe(RwHZV8P_+2!H#Ciz_>}b!`^mMqx}AICwylnhlOXhrzFx?O1tha}U$O*wMp==Sb(LoxhH}}4p0SCs@6@he0rG#f&Rs@DVSZFy z7&RJq@ZXvbB{$e#0XF1wIh7X)gF8DmLP&u>u`GZ8r)&S~W8?eRZ`U{(iC(c3b=+TW z-&5sy1;6m}k)HKLJ9<0w8uRG<4Q&tM5e-}>21iHnO$4cRfVYE;$h(qz`o^b$1*QT^ z86!JZNo7}nQTL`d=<`bDvj=fgWe?_VW3eZO{v!8kkJeSJSQYQ6)k2XEgmsUF-Z}2e&*@*IT>vz*wY(=m zc!GIXRaGz~x|h_l`dO_@Ydlgnic8(wVTY7dYBVRbA#D|;hc6Bc;xm`nZBgz(>2RF2 zT3rFy%efwkpL1{|A5R%>Y@6F)HXGU3YGk^mEUe`eVrNEsFS!Ej2}pt-j447z>pu$u z|L>uT{=rI#Ut&nGT9$CM=@4U^R`ra=4UAQYKN2t+@=97<3c*ih0~G^VN!hevCA+Z! z4Pzw}j6+EJU_qaE;N3D8<5o<&&whB4CZ-6zK4sE*{t#Ja$$E_c3_dT?PLH!-w=j6} zGsgLWftbCixTjr8zqog~v9=W#jS^jQQEtYNcpmiuOID!r!x6YaOwzVXHv_|e1<)dx zdyLk=wCOxI-6La8@m=;`q$)-U2hUt=8vHHw{)s?*8okg#wf3JG$qVZ@C0{i`oBmUx z(U72oZsEsY#ddp{yOE%wP31^cu(@91y56ozz|RI-ruTF6c)f>(Uu*3D$C?AHZD4X! zR5O!LvcqyeR7-NmCz;I4ZC%~#fL~YgHhhl_%Kk%HjU_AQX-Mz|?U{J#d>JpUE)hi~ zr^*Lj0r1RXcXSgBPKxC>M+YkFo`B~I57%l=gB86v+oHZxbKapslwrGN{MievDMuMm zLcm8|Z|4sis`?AFtV0_NjT?8e_YeIUNf*~qf+E|(Y(XqrS*;4ew=ToEp;-x)mYudm zqGI)0i_0FaSAZO*>Nj+60iuK_$uE>yu+pZmh+e)_OFwJYw_l`mwn-B`uLhnjKdCl+ z-(MZwjVXZ!1=^!LtOhVAg4nLkFKt>}{7+B^m3_52VZvVDcbL^_!+Q_zWkPH5X3mgf z{jfFr4eW^p_*i%tQ&MN!ZlF&u;`#r6H2(wsA;C5;j@~LISvTmo4-QnI62v&{6F?WC za?6$6c^cVQX_bwY3iMl63?!H6^UODN#oMB7l?T31;`onKe|wxqTptexONNLnVpCn0 zNY&8$@ojf&M77QH6lIfD{=eN0^Hv6 z;?d4gzF%Zupq6h!#0j7&i9_*IRHQ~$3QC!OHO9h9=5Tb70D!T+oMJzcin|c}dnarh* zzu;b&^7mx_`}|3>4dJ}mJtXYh0>7Js-QK-$AE^0A>a50J0Xm(RWmc~MIwE0DG=IIU z|L5AO4_GFl)5?;_sa%PFCGq4XQKGQpy=YW*9?pPP)2KlVVr;Di&;3}bu8 z(`M6WCBcmwQ4Rh}m+-|e$U^tQj&cef-ael5$DHS{ zA#BA&&H)xS;|v~lGdYdU1__xPme^WTQQS^a3na}~l$hi8ah-M5*bv9Jm?I9{3D{s6qML--~7doQB-b@#Vzfhy-<<-q-4oQVh`9`AoT5uzcVJrbmW8oQD z;ep}4nw`5)8*KD--6h-Nq56f(g4D?uoAzrQD9@tlKhKUTO(5TY5*kkUYfljN{K}=^ zW~XJ0$e~C>nLZ+--5`b}kl4*RooB8DU{>V;a46Zv{;F(T9Do$X`4D=HB%%PK0U7RGZkE0Zwk~2Pj3& zenV%qMn$){hdQoo_~43<&rBB)^v15FX|{-pQ0A+Zzl5WWf8?7y^Q6Mj8R zLezGmIEgP9!aNw*)^cpS1BVv!J?Img_-7_y+Jh6Xqw`&T9y=79OF7y!x&&0@?h5Ah z0y~jybuL$c40?_yv|fb$UYf!TS#F0kj|i)Z8M_KLxgHX)Q0nwjWtSPY zt?Y@fmR4?wC%B;#y9Rkh-y&U5IjoyAo)n~epk>b26;U|Du38;DI2JQl?Jt17E-kc* zE`OwN;)YLdI1yD5_%X>4`h0?hTqkAGQq^W^DLyrE5#%yG?2j}t%ZaA@E2<>!SIAR4 z!FOfoj;O?b8PAz->}}Ut6p)YGs<3tLkeT=7{kvcKJj%*20(X|#;HVNPvL4wCqtCol z*|U#fq0?TJ)C%YK_;=+#fhzAu$Ajs(>#v>YO%v<yRQ zT?}TfhE1#yJKSU0)j()CUMkLlyCLqZs|LK#cQMg1SJuYrQ&mmGcL6an$zAbJ+^Zfo z5t}q-dz22l%kDAy-etUPp_f;z1rGVHM>J$i(I~f&Kg~ji%B{rdQwen`h8=9XR=Ui@sqb+c!O%#; z=v)E70rdjRiuRp!mi`8;EP)rRIT-s?c*IP_d?^zZ(foM4*{Xs{s;Z(mHO}3~0C_eH zoC*o=Jx6^!jjUDF-e{rgm5V&LvL7#&@uJ*s_X>|>M?|KHTsjm?KdlISn^}b&(Q$iv02tZHhi zl;HEoo|`RxT^HDunFV1JvKaGQ;oI8I5-Vg+XWAa*Uvy7|J7@TYbnU{FAhNLq- zcGZ1rStc7(>8^SLcC_nb6VidT%)ScoBk37YfiwrJZ)}EgAFA6nB|L=&ll{%EF;n!| zK%Ac&s80Jch?Y%UAC;SL{IaiY2XFm5LkS+?WAUOWU0cho)o54porf8dy>N(UA#6P9 ztFnp+=Yx{3SzXr#f1GL$$hAN;H%fv{sV|7IiHQ(MEosD&|Gl&+7buENBzuB19glpj z+rja46r;0HE?9qN7CS!>n_czupV%RbRMQ0WPsnBbu&Hf*CnhO4U=cQPP=F*Ze`93e zfIyWxRxk1i?p`}ph@6axs7OLjAj>$`?E-HUv*3Q09`qfZVm&i7j&`A5Ad+|D zwqQBIr?C|EEk8Prx1G239_stk|8`%D{`A6Hkq2gM@RM62N`k1hg3T4!u+deXy#IoO z8x3_4DLTC1GPOeIzYBI;;(AiAP_ftqCQ1MH;64l=WA^^erj^8a@ucIu>~epu?D)qm z=W#Uxg7YUD6uL7q)^boO;xFRQQMRRqB=K&5QuC{bhphIH6~UR$e1n>a>NRm$jxo_??U?EFY475AifFZ-EYN%s4) zkefqv7Xd30+oB&&_8r6?SNxUR=iyMnV0YWE)Uh*eZU)I zR~9#erawsDuJslO$T8;i%+r2fXwLnIvbx@@6HA_ye%w_$(vPuta#B5AYuEM==lVcT z)7v?7)gL%erzbHJ?t#G1r}0XJQ5;yfBaZ(|gpRqq7>gatZo%+|XR68B)#-`eX?WO0 z8!}Ct4-a2{B#h_47{urC z&mR;L&pLwV{^(C0MV6m)j3!WAkpF+D`TsyO8Jdr3kuOK0BKE$Dz8`)gp={Ind_qsJ zORFO7w$&8?SWx?@TNdYl6{m~G4h3qX^z%w4D?>wqhBQMI)9meB3EQ|iy&uMpps+wP z_U9D<7RE#(uHkT!MKlsy}^AkXkP_Vd3Y+E!3p$~LA4rd)T^>Qz6yHldfXdO1SM=m+j z({t5&^QKdB|aNY?aB|3RurgWFbKOA18M6?v^(i=at2erY<+v57cn6p0yu#%h3zJ&Ae4` ze28ED(hb!P^6_pst=+WnyKDo6h+Y`3A#kf0l(pp;^7DU}%iq!;rfw8hq>sie2P--% zRtq6CEzsLNJ^@WLnvJeygym3)k9%hKk3&MKd~#^f|ifcSD#<#1VKA^dj0`v-= zd9hP1<^*@X9jI35!e%~)X}eH2NAXaR7{R4qtr0Up*DZ)mWO4NqL(qK>g@)(Ecg0wg=y4Pn}J@_P{ddm0Hdx$TGZ;wf?d@z0z}Y1Dju=ZBkdo=5XLGSS)tzy=9; z<~u3K*5KvaUCo-9Py!my@uLxqZZkK?Uln01;qg=Z>BuF*GHeIc*pRI(H6&r|K+YeM z+ITgCLr8eQJbmOdLXObD?G5O;H&y_TznX67@RAbptxJxqAKE7 zoa^D_U%U?=To~39ihQ8-?}y$f3kpy*g7*OR^VQhb$V(l2zNb9To$ zwRc4D4ek!_+z*IapQyHDR{+E?1OoL&1hV)+*fyFR15=Z=UEsWa{o<|rYG|_VlFgoO z?t}!0{xiv8HBQAAo(7TWdR3k-JeJ%S#{BVs`VaR-+*Zc&d2KrTA<5>LzZ4W){EA|o;!rbtebbrN?+y+>*zwQjk8F}%J)2tK4p zl}{uF7N-YS)S*niR~q**$AEQKf$=kA=(DD1OaoSjt4-8mDJ)+hli zrljLFtwdMbWBw`*3(9?cZcA=^9=2?|Idd`6OrU70UvAkZURnjWZYzrfc${WlM(sd{ zLgWx5R%ZBv{11fn}r`6 z0c=m~GpEPK3pQ{TuJAZ>pPUAz#6j6NgGL{Cd}nIo-6>5lgKHdktL8a51_X>iocO5= z)@voXnx0@S<8$ypooA%WM$KQdiJ|$8#H`DeGqYK6oJf++?~FwBJzE`RnF>ss$*Rz{33#ASfo0jWF`7oDg|t1ZIkV%d3-sXUx-ql=+I`_DuB>+C z?wH5T6I!1{JSYYp{PgC%;N5axZ`C`6p@WJ4)>Vy6R4XF&5BQQt6+TXECmqg3*b(f( z71*Vy z1%wBYB{;Axp=mdusN6+G%JUMtvAgBC@nFy)Lqil=H2A!eKb&pAyjZI=s>t1coPYaM* zqiwMxiEr>?ti5~J(OVmI}D zlsWTSI(Nu%Ucl=fN+wP628k+3{*x`Qhsb?j!8Fhjo*@fqhZc0V_S1_luD{7$hJ4qx z8&4y>aR)X*da1Z~^8#D2%ieL-QgD^B*PMY-{=v{}{fLJ=1H!6et;J9$9Qk8XG;2x1 z_O_a|i;1^dFa`BbeZ}|LzpM^9XC{M;i!mQUtIq?93nq5t;5J3u88U7Cr@ME&yB%Us z{_S1e0wNTr%38Vr%#`=>rF}J(O@hzhFW~=pkNaQa`ijd&$1RBM3)5#!4)d%K6VW^N zJoC6nb7oJ&Kfi_y-(?JIlVuKrUV@M#$1Iqf#0WU0YF$GirMIp2dG-B8X)hy@dzt6%~`>kfM*B{d#QZ7shutQgLC6pyR+`_S9jXT9(tu zu4F|^i`#Xp(W_U07;DWE zQHc@)eXFbJK)gUM0$={|Qv7H7kt{X07Zy$vt&f0Dh|&>UcAvbbrpjfCb7ng-y7VDFQQR+l^fGzpURG?MGh!eCzV7|`x<&H@N;x^YbG>It7fQJDuj=z8iwL9nMz zxviRzQHfeQQ!bEupK3l`Z_N&%A{Hy&>q>9E=USwh^3l*B$GzTV&4YtsE(|x}Ufyq& zCb5&_hre_$>+d(Ec)*>$HjfNz5m7aX}PnZ*G(Syjp-VF>6_QtEcWLq z7fHP}Zg6TJjKS8_-4RWbO)3xG*?QUWcH;%G_?Wn7YmWIcMnG3KdYOpyJNI;ta}3Jb z$nHtIe%r{cH-4{p9{(qDFD}??;pp!T3_JJqu6RR_rj})G>zXs-y15?sA{tV##Nw82 zLu9f3x(Y&!4b>yM-#yTw?joJoHZ`8=-Tech3v~3hbNQ;HPkj(qs#B_9SwGdlcSKUK zCPzx3<@>4>RCa+juiLQe3~C~;93Oxy<^8kpWwfQM=3ja+LMx@N>9@k&Z${_Kh+&Ud zg{zvyQmUripd~8l_*$K_3>_Ccj#rNp_e*i@U9-Cg`sw z+vrQ{kb3+cl>Z~lp*IRl(*Xw#Ift$)>Fi7dLH0c0+0q1yD}cRMms7OIpKVMLgJ0)XV)h(Y z#kTnWy#jE*ESo=(DqjD#Cn{evo#&zb3D|%7alK#u^i#dC(~s)$O7u*Bpkhao{&d)a z5xu(28vXAhjUM8m(M4T~f1pjFj=Yz7XD_cu1}e2Eam~x!I8`vt26vsix2`#j?sl}5%yrq<`#*?vamaP(aM2%>U#`dY6(FkGmp+W6LMjmBGW*`Jfp;PqeW281 z=s)V4))5=V`WA8$CR0~kZUz^HhnsU}@%gh|XKiT_msZOk4>W{KR0M9hzJ@UH2=$jk z{4nVKJ7+*ML$(b|25hG5lX7rSEv0t-Zh0(F^=T6tyCdXQ z)?j=~V)Lss8v3$VAL>?bmxi6M8_%Ihy?In>iI$|tGdMq#yc@ol zB+n0dEPP|{`cE5evwdpFQdh}aXN}}ib18Z#dvD7NUS*G27p9|!8}5WkNOw7OFk+4* zmC4ZJr*)@~K$XyzQ&W^;?lo`hd#R_8wO_uN$CYc%L){QM^A6YgQ0!31BY2eaD(AKRW22!+}xURkxs_cDd+;o!A-23pmDiNj#tZ(2**CM$yJmIVd0(2~3zNg1OFa32avt zZV@T?Qx~Z@sAq6!l$`ETTx8*R`wYm9RcFZLPBq-T=8?NUL)m9ShdyEFxVcmm$5D`0 zi$f$TKxT~10u;q6)`1C*V^!%oDj3lN`k?Caz@c((v6!*F71H&Ifw2xXaH-9YnAtlV{+vmb4QiWlf(126`2_YscP9zy{(&6M?RHHi78*7I z4ZdUlw6DT0C)d!|vj1->!~cS=ZlH8}iuT_lstV6R+WM%`xfw44@#t08&_v?kGt(s+ zk6E9FW2n7Zx}wkTWpNyA=q{gCYkIKX%pvUsmo&6k?o46&t+19o>JVKl1=_Y`-4IOB z@-B#mUI98p!K);-i*%)#z-GwM6f^^mH#w8{UQS^BLy5Dq@LMT+{v{0y003xy>kET7 zX}QViJ$l~Uf%D|285xF>S$OTAIEV85Qf=oS+#GNRIWvL1aG(H!w_CUI;qn#W`p+}| z(ZO!7*wMq2k1$P6p!i|Wjhay7E{XKe%?+g{>f~gd@f!mj z_+^eu9gW3kpZ<4A=RaY!H7a$5KJXsmS={8+JnB9RyeSpbr^@dvY;4M}p|FU3W$>*m zrMuft*YHn^cr5H!HzWbkE^Q_@gp$8Ds64(gP}%mY$bpsYf;>9808TJ~eA80r>bA^I zuK-o+L~m}c_G$5rB-PH_5JfmL@r!|5c}Z>OCT*b6D?g z&IYp-eSC|zHn~_Skq}vkl_GPw`)l9Y!DG2Geg;t$K}=TwwP63igwFJu{>$M$gPMoJ zyW|}g&Pm)xyngfShA}%mRfXx7M1Th{nmhY=*dV2KsO3$0 z95pTq2gR)lN}ZVA+8!44?D9H?!o`xV03T8@N_b^oayF#9wYg=tX~Sl69AoGgEPSpd z5i6tY)WEwT@FOPeEdT(xr6z+I-r8(II>QqBJcgCoGZ%x~x|Nke&3ET!>B50?k+Zh* zZOOu%(iEMM(9UVC8WRjo}Aq$l?R>P2BIiu|;8|8ay= zZR&V}-OYO~0L$%ofIKJV9p>``DkUe8M5O5IdqF4i z;$|(W`NN2Xp`7lZ?qqgIE>Y*%Q3gl*)Mm9*1u;mJgyu3>M2m!*^v&iF{}pEOM%ybv zKBf4u6KJt<)_q@K|M1MJ2Zo1z{FG0l<%FNkk7>yXCr@SsVog6&NC8n&%1Y( z7sCG9PTUP++MRn~+y9aJ$+Xok>{24kU#wsG3czvc7wUC9d(a$ zw{ouly&t)D{-OI`aiO}l{n)R-OWJjXjRT%fbhVs75Z%jxFnXVANM`Qhp{&N+Rw}%p z#WDmwA%&xSksu^W3NIt#wMv`2~_^Pku zdjLfo8KAT}RI+&Q$x&77>JD8@fqkZ!{1)Nxc51a zDh$`DA~-=Hip@s`_3#k?>`{|(hs zRIRY-hAUgQ8!ya^_ka^e?$m8_FFkLrZBF%Ensz=NO|;JcF*fqv3at-!W#+6fEF1^@ zND>Z4k(Y+YvJUxSUZG_FIb4{k)NeVelW72J7GFV_B}%52Y-{e9o2;cXDcV4dV-W2z zi5tFEjZ93?VEQ%8CYG((@rM_yXGArY4%`jD z%eg5FaidNb?VHl>7aHD((V!A@&LecA_+L#Po+g!L_Z~d3Z8XYN*=c%b@OM5aFfl5O zX&AK3a<>$kYw!UFlTneoI1y#&p+N zt;fGHmg?sF(14~oKd`>nay;3dSLw&=6EBx0sZ9W%)+Ha+)*26n68H)WoBZ$PD87o( z9=d6gv!>n+@u4d{C<1%T|QLwzE zZRMTXbza11TBJY6B2nbFsYs5-+rRW*aPh!w%E3K4A42e^AqibouN$h+nFXdt3R1Wk zW_N0TD>Sg(<~j^jEC#y8_}fh1Nn+OT%aY)SCUgq-P2IPHPXAa$Z|Ps~SEFZ|;t}dG znAK3B+E}t7|jdqVKEUT+DQceqB%UB1Kk2fEh({4Q)AYmZ2Lu@UiI|2=J@{CWz z5NcX6@VHvM*+?SuBXdz?V;74|ec`y!8s~VMSCxu-xq=Gk^mK*0NB-tV5Ov9EV-4Cf zl|Uclj0l%ChunA7JY9y}aWjapRwoALpA~Hy_$tQP1X$Oo0h@k$YG)QEGnVE&Uvqdvb4`B<<#`2Gi3}(^_yn))ecKfO{p4bk^gA zXF%jWaf~g(Yo|3L38w$_rWK2KbE_XFg zw9_(K#2b;vk!iZxg!DJ;1YEDFb*@4rXZv~?Esi;f`}5>*^0^FM>*zd}bw?Wjc5BhHu$h@FL9lik-Wd95+M{1AQns>(K|Ycl z^3*-av=xA0sd9M`u8Y{nD@*xpx(k5Yr`oNfldX%GVv0$fetWyj1w- z3f9E}Jev1LZf0FNQO9+{t=vPn@2K|muwub!9q3+ug$8(55R~@A*Y{hY*?}(%$R&JR zP{cs@g|4xi-)_B&6cFz`OxT`n1_=#Y<8(A9{%gc? zWlSk`EI4z+O~UR?(irBulj3n#VkQ!!O+b4|Trq^pPZ0i6_xil?+x_|y1;1Zjqo+%_ zU8JZS;J&q)dVRJ8c8%L_CPmGjCJLPwNc@aS7{fZh3IN-ryc$3VAe=Zvli>~?EE%?* zn|%eTJ<>?M(#(b{2A-McO}$l3;aMKImK2Sz?+3lgr)lhDXE1QBe{>6BV`6z|9Bp0~ zD*mjmWkj#{za-3i9slNDh#! zC#~PyTR@Ga=y!w*EzEyP+e^%6Ea>$A)iv*6Z{=~A9>hJut0)ltbVZgw&eeNQ7OTU;+5a zY)$2~)_64>Etd2CyU5I0X78B8Xuz)7FlQR4@xW^I0eo0cd@@3#Vk}je?~Z! zzycQw1?Yz+8|HaW>z~RxkHX1=iUf_+#EReH!^xn~#UvX+!CV|vh--OtMoCBZxnHHe z;{(B9hamw4dBx@SCrVNOQ|ABLzg}eDWGypLC z3GZBp9$&GOdB01L%zu#(iqXlDM`iy<$M8ZiBy%vuae48K)h#p5_O;<|iWVmgJlWlI z)Ag^FRxXs%>e5&OBg^=!wGR@YVt0*`L|kC417s3a24!Pxw+ww38soWD=RDT981y^# zh*G`kmDAVqE-)}*7ONK#Z?_@hvO^NINA1xrGOcZQ-n+sf&8Z@JqT=F5X{V6%q%6f> znd28+gut0<0dFS>Ha_6l=(h5r--GJC$%Z}xn=C2Kjh;qfw zoY0+KaW`(D>`+#hO}pdJJpfZ2;;(7>oHKdMVxhp1#B|mBoT_QJNdxx!EmAHK*_Z&d z^e{bKzp#B}&C&7O#~(pZ1Ycfe>4;3#UFac$7R*Zlj|=?fU3plGq;TH#Xif{ePqrMZ zB!xMD^ON8}etz4HFZ)Zg&x$4OJw}_aj~NGe+dXm*=)%rm?J8x!8ja;e9=*D4%~AT%8&LIoO`?+yd~w_Xq^W%>JthQUs6IP> zyTw?=sUod~;;|LN1%B4;CuDv6&wH!e_pcb@Uuiej4ZJCmb4>4lK`UWr?}~;V{1{UJ zG9Hcf1PveMK>`Wf*$1m-!ip9=YmuIOo3JOFS*zsx8-kljPZ1@PlDwUe-LD}m_9Y4u zI%J>+VeRO(;kgTkcpXtQ^s=6hc;~}eARlBZT%$G1*DF`P@IM(}C$Ym-`5^Y@fXsYb zt07oSmQezKxSuLS-9Uf|6DsVJ*b~ zw$!UxL)I}bKn<;qCy9o;&Z+#;(45=)%Q@ne(OaUeJS^isH9ArrpTRCBaLeF4*#_0J zxG|oOGEODge6%%nXa$tc#vy@^-HVuJF}nHKWUmHppbH=id$M4V4>3OQ%aHH>_u zQ*gzwPOd;WPm9edD1YCRE=ps!0Fg;`HCbLEER<9bb}Uu?Ao*CAP>2a-OORm1E>srE z2)egFKrS>}AlWBrUgAu_%n4F-uvOSVR-wSl`%C|Ml6`_;r%FOzQy}+=>+KXiD zMSTQ!wz4oO0QJO4_}1{mJY7Ud2sZ1^c=C3*>yST|zNbORwrT_K&x%M+d;9D5nb+hS z5AL-kh?f9iG=1;DvZd=KLN`?n@sskDUj$mvq{u!CnQ107_|6V#FfxW*n@t zV*RzgQKL5y4X5Hf_eFM9^TZsh%KZlfOuyU2+3`^E`RORhdSQ-puwj5ezJd*-D70DF z0YIKrd_A1|bL)xq8xFK}paB}O(_)(CXq=#RV>4%Cj|2)&39wk&}1DR7u4=*+a_t zat9C`H<+51)((bSmG5Rm14X_K?E@NI>8Z=F*AyHLKOZ)WWovV9u#{MPSn)J|232bXE2tQj+`wo8UGiXkypaoBTL!}FEsX&68GyVq#MTI(f86t?fE=I%6EfFE9JbHz}`_qyCk24`dh zaf;5%Yx};9qb6tFb28+5QnSzHr1C5yfXZ$GG}BPf6n0cQDbFMAT`>T0C*X6#iO!%D zh2+#mugvYogR>Iw;O%S*$ZX;_bT6iP2T>hLLDkCIoaGG27?Xmp7`iy;ChEuMZN!e) z)NGu?oOD9WGXg$S!ItElexW^Gv1UmZdDgT?^~33|dw-w7%f0VT3o> zSKydAlSDbRnF|XlFL`^pTMx*M+Hmp97O5~B-d@i$>hxZBsa5rh_u`CGAIwQg8}bz| zLek7NvuBS7@En_MwbT4wumN*`UVkzsB^~O-%NBYq)h2ONPyMgxa>=9mAE!BSNN4*N z64;i9;P5!ox!EL4a*pa8AEWdj9=tTw1fCZyyr~rSfXdyqsG6kWb#BATK6n@7XM5r9 z7aKKaNI(#Aueig?fP!qRhaTFc8<0bdPn+jwODZYh9#+Pz&!PLGp^ zYHCQ>CN%xmBYzQNBs;usP095fxk|0kL3~KX$x>)$!-$>8VV|<<_L@lpadE;xsJOUJ z+S*r2X?dDip*op88a~*oTb!Hks1kp#wo0qDjfHaCiyE$SL-=;gybF zigu8Z`57?#KKb7DZpw4a*4~V}1Uh0~TD-U7f#f-4Z5qCphy+-~?!wxprq+BDYi28lIj4E{=8G zQ8a!bQ0zSVIcG50MR38UkbAV9M^cH+Y$bx-=C=8HwJ!wf1bl`83>X_6jUwGDh_a>X zg`xP~CemPRp&})^*~!aD-I7EOeOLSfKvA>eo2aEs|nK|TS?4w zOK3iE2?PbZyPOcT`|OYfu-<0RYcKQ1go4GyaFu8JD?N3)o3e4Yis#?uNZ0-S-oaPx z{DoiNwDc;p-dCk%hct;oVL+H2f~i?)+4lP8SX+`g82`ZJ#GKswRY@xlxX=K0$0wAl z>+kgKe^_}v&>br?kmqxJV76Ygqa!#uRjgRmUS96`Ln2^5F5T=@WGZCHa7rv7(=t29 zUHiwF^kb6FYGvLtL|154lk1#ZkcYA-(!JEQyy%|iP~`1_J&05{`ccnjNDtEv2DvmZ zH+$<_py6|jX_85d2W+NzvN+eR)i$VlF4yaXEeuXYxFqD8ZK3)rg!v)?CO)`9kK(*% z#e{Oiv-}^maw9S^(=f-Ze2qk|k8RrNhV^K!M$fWO-6l^3=<5N!I-bRmX&a^ zW4nx8XLYcrDz7ZP)8;P&qhF#P$Mit2Z3Rkh zQ;ZoDW&?UNl8a`4iB*md5yC^Oplge@z$YWj-<+R5k-pI!IKO}V`CC#rA@B^lw^}Yn z@E~_rN&w4AiRM#u&jZkY=I43e6ei5B+iVVWXJB5&#EQMiTxD-(YlCfsB2Z*z17!Ig6qqL{#Ei;@4pW$XbauQy%~b6kiE$#j%gORwsa8xTW9*a;Pgwc&@MS^VEy6L z%EXR?0Cjp%e7sZ!%HFrcV{sR$F9DM=lUAmN6kgKtDSKQ|1*6;iRF175IqO=Ezhck{pjrOh`LuEY?-!}(^DFPOO2aJ=3bjkF&Boq?Mh?+XGRk;iPtn@MUv{^CiM<`h&HQb2%SN!+3L6^I zwC9RyH62Y^<8{6v`>bo4l&e8nIwjlWQbFcU#}2jm*?*@);A-_Y5(-vM72D=k=Z+hn zgz^$l&$^(S$o?|uf&lRg%x7&np$tmDE@^~dWk0%=sb#3;wAVj~30xlD5FIfz$v6R) zQoVoRtQr;BRBQ#qA}N}RQ_R{pX5uX}kgtWG?WIV!)JK8jaQ~eDYWwGYJZ3YWj0rah z>W+Lfb-Z2bZM6(($tm63R`CdxpN8Xy`#mbX{I{d)M30jxf97?Sn0tc^E^PZqwt!&G zvK5mP6I#?_`Sq1$i%L62CAUDp#ro3l1-A`Z6-(i&Br)Z-#UhVbx+r^`x>dy`rJP=@ z^}twS^&#$i*`ON~4{h(2@YQkJVN-5ira8;IEt^bxrV)|m zhvKptmBSFMBgq852Abs>1cq8{joj|ZNl&Y*o$@qD(w+%8aQ-t-u1zGyx!F(SYmQnt z#=YWqQz1;5BeKh=>sP=MzKWDfK1;G%QyJpU$#6!nCoXZ*-Su|;l7OA&=)j857>Hda zQCn{Imw^yXY$l0hgvEW2iHAU;aC38+KvC9vBaZx>wADvf3?i*>#ZJ;m(`jhBajETeG#pK&9h9~Uy26`k48FSkY)r`r zFYuP&c}3ljz`Swd{5^gBmkLPXWMFjDq1ajRr(Vcw+4y-?%Z8pQiP}X*je5Cb=94<+ z-nVy;=EEL&_$0MboTKhp0cAB=p?nC|0O*F`COP>T|4QGq_&?=Q~% zZkbG9|E05LLu+c90O{y^%QhHv|KKvq`>UAh%O$zn!kl)m_L5w-b;+wMh@hk+D7ZM&ra&Q*|qoN=U9-{SN27#zREVmuHQC*RvS-^#TSA zZLMnqD4c@76)$E$Co*EN#{zkVWi(ZbT#FG`dN_{_C?|cIhMza|N5}A6H!WL4yeMvV zq;m=iI>|u!Jyk67Zn9z3Ht*}X8g$6{XzeoL{}kKUS`N~DIs6i?)E(=llM7I9@~WhK z3DIC7-uSGBWR=d4m}!K(G0NaB3j3NSXoHtsY>5}j$qh)Q5@MvJyXn7Ka01NQWV0 zc*mt(fZ`Axt>cPttOuUY|MG%w&|8E%)y9_BY4d!`tGrA?bNunHid=BT_WC~Bb6vVi zwc6%HXi8wwKmfDAR0&|C3mOS_%$!E?(A)+yh&lSG;r=#k5=~BVxv`(9;O*^LBBHGa z^V~M5Ft2iJT)NEMFEnss3k}M^I*}tM@C)-2gKN?OR{yDvfr!Q_7v_P!5JDGq2c8HN zFQk>^hHkXtOPu7MuA6S*oREL(mPMj0yO9;urO7qsPSQMEKfC?hdzwE@WwI&uEzb(F zTLng2cKulGQZBn zhLxn4+_Y~WGCjzX*zqbDi?45?Vr0})GYah{Cf5-k0OtW|&3BTj>&VZbXLRS+dy^$M zPg6xLmTlWn1G`b8a)kDzG3MDOyL=zl&ss+1zQGtf$3N%ZXlIUZHND8Dz5uEjxQL#J z!A*n$240C&1hPJ#_CZgbJ7kE-6CfLTo1b7mH>6-({43Z~oOY{{1TVzUO=wpkN>53C zCw}M&9Z$~b+rv?-Qu90)EXG7SYgefnB|S!m*+(HJ$=(FX$1o4DF?8^chE9lbo>Wzd zn~gk}N5x=wu35J1mph!Z&~bWIyJFq57&$R8`SA)JZTEPf2_%_Unwe}mh%El?ThoYR zm|>uTG_`t4v}YL4!5KIY{2BYY&%*w6knm(=N~JO@M^IE$*k&^$ar^i1ESJ#(bYw{` zZJSd|J)-&OI6_Zu<@F8A=BzOn3K(Qb(q@&v|5HJK z^R)J+n6Bsv4Fom{A%xlV9w+onS;+|?7FSBD`9+$vbQ)JZ)i@Vaqm?g`3TPqB-;LpY zTW&qmbWa8S0eW%(v*BZ3q))l2F6Enh6KTBA&*N|Ob2&`r-qefRp@Tq3#Y=Dghhtxr z{N2l|OQme;o^SmehV46qUI4jsL6=r<2sDdZdF!e1>nub2Bs(~qaRtDBA@_Q9QCjZ_$2>fx#B1=Ru1!zN#Ss%SXHp229_<7%_CKD7p zalaX8?MXfo{knxSEK1(T`+=X~4ca4SHfC6sJ_6U?A!P}4)BF)8uqm{}(ZRp@dq#4) z&gmB-p3;8ydR_Kp<+M}r@LT}Ly?utEf%W$?HLavkEb=BLpcgS~`Pp9sW@zkVx8;^? zsK3<(fUPG#R34~uw`|IH6aAI$NPvcT{#@$*s5Fibl4*7J?dh8W=&5Zde}AfoG%?|E#jAlgYczNLv9or=@8=Z|>hA@;n3 zWQ64P7KhD6@y#HdlGD2J`2*}ZkDC4F*8Dd(GBu?;zV-EX4iYEWjU(!d1J+9%C6fcn z)^K~?ri1Hiil4LdgUCV z_YHDB~eun~ewU9!0D(<_3fv()CuBExDE=Ng=B_Y0zn~%)|=fiVJ?Cq6v?ynpKCp)-dMioW#EepPcH5F zvw(bf?ES!GpenNNPa9T2l0%!HUSS^5}&mD4KN6|ug!`ROYs~^xaM%EXj%4c8- zJwZkodA#I z!f?uZ$1pW0$7v*g;CVg?aOdX$8c7-9Mw*ue_?eKpMNK9P-<KAt?b4pYXDN3NGbz{cbwbbRtA`CRDSuo)9q<}G`$OiN- zk=!)cs;D4HEl+k6I@BGV3f5Y~hJKU;c<#0hg}dAZze_62uI*{(qYPq6MKnb!^Ue90 z>2#k&9l|!>_2U1@lZk)vFaF2ig>|0+eIBh74y`irnPA*Ys1X60Kg+ZjIC)ncB{J!y zC21Y3xvSdquqXW0QP2f=<|mgjWCl)=bqHLm$gPQ(-dLakT;lS>8g{Kc$OiH|1gEV; zd=h?zethh45Cm*>d)FK+H*DYr(vO| zHZHr5_Qp}?J5_4EkShj}*PEVFbHThUcAF(T<~u)ITf=MWPd=Zz0WOXw3znLqU{8zYHy|(1*NuE<+6NwL`575H*VX}Zbc-=o{wHz9K3)doYVgL0T|GKY#z39Kr{NFm|->U8ZPYs*EZPnC>tW^a>?(-hcj-CCOP?ZlVDllUfu4&n*TbrlGkXQp2lir?)>% z=ybMY*E81U+4L%+N#e**_Xe;Lo(9T`zlYl0?#5Yf0BS27Wxc{i@+8nm&>*hg-vcCw zv`qWk`Tt~J_rLi63LZ_-6#Fl+(j$KF%S3%M*m~qcpOi@|(}hO-CfNR>3C$&SEnuI} zgiDPtjO89Hjhn?Ayctdx$&Ho1|2j+Up6QpVjzoL~~UC zZ58^j(O)|L`C8)tar|~sqS#GPVipQi?)h^?O9}M}4{zuf{ftCN55vL+&fNOL1%aj7 zzbWNn#p4Uun}4L}k@+mTPmBasSP3}&5X0y2V5S*3vFa~TSQ>w2s^e!F4- zST6r=B+@MxdhjE!f5=+QgD?tQx?+$O#%uh67eBZ$?FPk1Y%p;?J?VZ;Q2u$x6jy$! ztJ)EDLhT(KKq$5|&A#}-zn}oA^$M4%tqzCto@u!?GmU%rz3dTxfs%Ss(=seHWp~fI zP|k`RC!O@Ef+L!Y`Ep-6-9>2I+~9s=Z$0~{z6+=&^mgB_TZjsax%`54N-OHnH0qO> zA)tNG(O`%5ih-l$uJ52F*C2RCUWKNnvfP%YAH|sRuy*xut<;x(;;)q8SUpuWk}zt%mB!mXudo)F_$_2X5sprUq&p zt{qTQ`+w-g@JuTC+~UjrgOY${F?MLI-hEHoRZ0k1`JshqzZf?Oix~Rt3*pJ5w9o{nE3)s5LrP_lT^ZM>@J+ zgLoGcJxy4&%(Qlxcoq&P+@CAXVM+4G`A*xhWxoVGx93APi4wGxv>E13dQ=rSxs}4W z(K7?Rg*kfU4tYX%yE6*gYUU)tu6D3NntQq~@hZleGqM&S6)0* z>QQ#v^2UkE3A2Yt{nWFHhW7=hbPPkbza8YMD2Rez#L$4k0scL~0d|g|->OF2Exu<( zBzKe9JGWN8k?-D5_*$R8Ncj$?jGB}+(sm;%{AsXPDQ;ePE!)M~LFuIm&)QFVI9&sg@+_@sJ#%Q( zj|;{mk3-H3-+BFdiQ$7RPEHmd62(rFoum{3U!=;ongsKp*xHv^+JHJy^9m0OIAu>zUe+(0e>U{ zW0VZ--37!QWgzAg@|dxYwOjboU0w{{REtP-*jRZRjD9$MxtR}91}2Ez+! zfAX+`*e(Q}8W1326@W<$4LbGz*5AWX4qGX?F_Gw1p7hIQHP|U~y6cKz>*B!`!@$#L zmkDP{hhkR@YpYibBg}-NY4xX%%jSxsjaX#1VpRqyWAe6~mB(hlLIiPbPt!YqRKAjE_Eb{dd;? zCvdO&&X>NC*Afn%r?e1JOPX*_k7S0M@Vl8K5wJT*}$s1`j#e zYQrSE%t%@J0X*Zn5vRJIT=Xz0z9>#XtFiv{3~|vpLgBmo-Vy2C5-{cX(kRQG>e@d% zG&TYjGuOMQ8bn)c5;ug$+(-4iTPk8gLvY4NN6t6Ku=2?A7jXa1DVW%&iBeNyW$#<< zxy&@{!hmZYU_*^*pmNEySME_K$4S3l=P|)C5zXQB#>~O7`fa)MgP}Nm`yAGqRM_x= z!;PL7DYF%k%RnQgQO|aMCdtR+KI<7C6<+Yc*~|hCLn)&khdnUsUl;n65~HV`-)7~T zJxHhsiX6M^7 z$0n}Zj+0i}zx_wm7a@{yQwR{4epAR;X+nlB2OkPK=Af&ZD1aMB3Ig5~u^BdA*7|IN z&iZlZDq*=XSeT~=wy{ZpzN6dvEt7j!x5(Hi|=goADr( z%;d^rkLiX42#-{3MioMB4ZGzPId5#IxAr}sOiz6IqDIUADw7dhzrk_SKHWtHiWNVgA`+jV zIKP>8w(LrF^iyi)0(rO-qVAP6=~7*I%M6(>BN7b;x~H*_tsP^xGU4fi-5z>E%X>%* zSaj&ZZ1(wu)$rbobR9C6T7}!$cFXsDS5$?AsrKsS`hv0Z_qQXwBCxjh+xu^ppeuby z-^+{BKzlpTv=b9ZW*GbO=Ezjm?WV}$w7T)&Z;nc2<&nf$)!Klsxmw+N?cOJFD>(MY zhM&k{NFWMubH}PGiZTEnfAYc%xY4C0RM7UJUc8=`UOezr=fl`E4@W zf&7AmJDGszv2TVlx|ytGrSh|)ciSYigtQfEheq@Y77n}!_-S(3Rt!25g|~96t{mW4Jm90^TkRMr zdydfDn=%n9-Ii^&dl&rXKK>8ktLReWW>@x)Bf#> zq3ry(`lB!z91!Icc%Eiz8_0Zm2Q5g*to21I8#@!UtruaFn~7PHF5jKqC(;j5Pdpk! zR@sHqn52!;2c-B*OJ+ofOA4a&b1^)KpH;(9tzd}$YwBQkf5$-mU75#dv8qNx8EeG> zDXrWSQ|+&~*}-ce)XG_0^M^=khM5<#Pt8Gj1y&-`{;@n)`Wn~BKa|D5aP1JZRywWL zeh(`HH38?2a@hd~xbHD_*}mpvA(6X-(k~no#aa4k(4zqVcp(2T}(KCe8dZ#UmTf1sfErheOX=r`Yc(8t`;3|g}Ct^hS3xzD*Q5b zCtFer>yn(;wRDy&SC8I`tZmRo9=Q&eIO=6oFHBV2G`O)Upzk82H2f)xZ3B^{PIWJC z0{NHRvCo5K=m@mfco*wUQ|M4nPw3!6QUY*m0HganhL0wyb6^a$&&%*G){!3-N||nV zr|h#z%wd8*8Rn|GV!+k}Pl6NRCL@B+p_Fh}z>_Ur5@O1#IP&6eKM6qcZDZq5+8w90!#%99;_|x%bYfPh zkx}Q=ayyet#T7#bu?cXt6nig7&LG>$7jNM2W7Z@nbr?QHIy=}lK3a_g#eaS<_56Pg zoLc3HqSdp;Z{^;L6-x_D4^d7$KZ6_J4m?>FYZA7dp|khAI9TFeS8E+?w;c{$TdKet zeG9i*34!c2?E8m$)aI^DfMi2GmP*L4i~Td(@>s*vAczJj5u_MJAiIO#5mrFn(Clf; zuo5z`)y=_pXKJQ#p`evj995qj)Ow8S+1I?cz8<*v4Of8SHY=*Ni1*d7RbOc7xS@5B z9Jif$@xktd(F2LSyY1caJd{2Bl%vnjReOL+KJ!FwHHNuDNvnoJ9G zg(p`SwlY2to7q1yly2NnF_*1ZP}S$$M#k3StpFwnF>CijjIr^tX_jq5>m#E2+cW2O zv`0XoRtB1y*H%r)e>GV9%$!XHwmIu8q)BycCfe%ah?qM~nF-*$!(x3?MLxYF;ZN0> z#wLd=wn;V#^=kBF(=RpUrsfV5M@hs6G&lKBw;{vtlW9OC#AM7(kSx7Tzz(A{6U@b-0{re67pNLOHu@@d8z}%))cb~WOMdrS3J-?cQAN_n=(W96|@1QVRMP5 z5pofHSXe`%XX{MO_fnxMB0%D>RO$vLH0|Kojc1r0E^YWy&|ad#`{_Xz^Dc1iS0)+o zorE0v%@B_7Q+#n|tt(pN^vEm+PZbsou_YxtgDF8kq$4#2X)-R>w^oiFF_0XouLW_Y z6MIM0p;4cQJ9G9`=M7q4Q8UMeQGLyQwbF&2MbNyGi@qh90Gu~MJl3X~X5SgAP zWPFd-^tWlRG{k=x`oZYc*^6~yj>SB%`B=N5zv1BQ7#?F9Z42a|I)74L+8mHdSUmJF z`x!2M`AqHh;kC)Om-xLDR)7`UVL_W^D9BR`BQ=5>RhFc@s(Oif;<8iKTc=LZw&0K( z@*1|7pNVPlTz3qIMnD|DJaed%j1I&YnST6Fa*S#QZaC8?FTB+_PCrMcXv8c`<=kMh ztXl2OaKsr2n*0NKbQdVYOWT(3TD||t0?CTdN^N$ zoF&Ek(`ib&jViSmBG5^YRkB-6VA2G#y+w4L{qQh-?w{1%9(}cHBlWvWZNOPe^|RMV zb6mYAeqcCf;b9P`wXJAz-LOnQs(xX=*Yp-FNBvHYPBf>|2K32zqM1VcNUu$iYph_NE^L`0Ko4 zBDH-zRSG2#?>AZIWaGxQNSeOOja|DkSKXRI(@S0IYWQDam=BABZ7fIb>t$(I479Af z%sWYU)`E0O3%xDa{%Ddq`XR-`OV~%MJwFqoVvQp^4?MB-LB5BDo)tkkQWC8J(GZ=; zEcc17T{<${W2|~~_t8<|@5@b%;S*bobr*NoSg3Y6cj}lQp1rYf&g?d)N%%+S8SPsQ z>KVpkCmZ5w=N~M;CnLAql7O;YewuT+zMl@2w8!qlVVdSTGJHndT8aa8B+_mlThjI}cE9B_Z_YNJ(9j z-q>`U&WVQ5V~i-;-4AMNM5)reVn{GF%IQ{PnLFlgGh`>5-gDLQ_dNrAE%uTl>Ht)@ ztk+93tkp|TAJhdzJq=o!n@cx0NPbh-xnYp+pw0B?@AEsqa%eEitv<&*lyu-SDd!(G zmq@s|nN3SV&>W=~mHK};J%KOna0*M(Y~n=-n?t~X9~e*2Zrq!vyrN^bUv^I@p4vLP z+zQmI4jl#A)cBp?pC5EifKn%_^$k$I)9Bf+B9UfW-w2coL1&x0C618w+`c_w0~`u< z?6N&xQtH4eTeN24`)wwdb9OLWe}~&Y=y5jD{I>#pR3gt9zx?&j<{oT7G$(ri1jqG0 zA(*?o7jQ>5U<>Hwv-!E#KcnZ|h}SBDrCU&nU-<1&&>=BMEvx}V(0HORwT!s5MSdR` zQMv`@4XTHEoNHy>e!Z3#2K!00Fr)-(V>_*a)(M(9Rq->CRVF92dL18XrfA~J8d#r# ztUK1lMirj^=S=@stHHLs90U&au>P?pX=vOm4bAMMl_OKY>*f=VND3~vL9O5M;P+|f z=NvA-pNQ&(z*$4qAqcuhbn3XnZ$v+cF>$S!eC;Oh77(D@E(I(J3=GU?T+>UaDMB_-uS@018hd6Vr5vH07`Vf z-8O5dc3mqp{2yXoEz`Z+Nomm{aoz=yDtlYE3<~QUHjhvs^~bX!mezj3adppqL-IX$ zTf)I+!2vMQ+mnM4;Kq$K@2ztzLSy15_q=Nb>z4lJ=4Xmm!#7Hx$)6>+j>}7UY8tXE zCih6kJ(Y)gq>Fhd1lro|JDlg*QJ}6a4`?KwHksheZCo-$1_Irf*>DHOYZV_KPd8zk zB>`1uh-r?#F_yOpx2&E?6Q8`LH@XN=v{3o5Xc05p=fOG5{pnWx@HeoYd%z{d9<6AV z$u_;l1)GoQU)xdxATiCpuF!_`u{Dtn#kN)sw+bSYSKd#J(5SE5Q&iHt#H@?G-Cd8J z89(9s>&vCE1r?wR3n?9%0nMzcVgI>=md9tY^9y(!2>*~dv=WX_SF@(Et=n=Va;wVI z_a2p}X2iqZH^+<%G4p|aKIKT>bKLW;=F*sKGx}CpAVgHI?m#rRpo;0&g~tZeFfqk* zNoHl!Kds4Cqe#1j;Xgr3Vs44a_&eRJGanD@79rz|1Pa8wc8B zyxNL|0y81Jx0`)t6p~RgTe$ue-Nz~F`cKW!W+F>tJC#(9GVhj#{iioeGBWMrxmsvH z`EP;MR;SBMUD#3tO5ZzdjirxrS=f)JH$}z?<=J>VN|VElj5ztY#BCV_amQ$o4W!f7 z$d&3v4gkByOHYh*CtyXK4niBL(5z5g<+p~z$n!B>Yhfb)O>)%h3&t54h??OclY)Y) zq1?B%B`csqMAB^ZURiRQQ`Uf}wr(aSMx~55(B!GD#a>~WO`F4>Gtl<`X_9y}r9ayv;-v4te%~$am!4fN84Bx`S9ZD4FB8cmVfN74s-d_jm8nH~Qnw(34CSpp*BM3rg zk=HufGC~>GYIj@q3U~*6Wjtq(B=&qz^-^N+gL{>zuZ3BFzdwP+ys$j2%I%L)8IvVh zIxg&nrywK6UVX=0sx6aZ@1X+@o09zyu%S@-XoCxBdc{E8y<*sR>X-UaxEgb2& zgTB&!IbwZpuf%_@k*OW65;yQIh}9$6PtT(~frR=ZQo7a&83E=Rb$v^I^ zTne0wa({2kbWm%*aY0r#Jl_UOXJsUCdtoASZL=WOL9e=NQ4LEz`&HZj{U3vh=Gy-H ztZX=KO?SLFQ;n2plUTE8oX+sU?nA9~U+Q+V-p8QqK|jq=A9>J|;d5l`2o zP*T?h7k?Iyp4?9>KGoQ6O+%8d7-r9(DqPI349<*o{x!eo_ftkYbpPVb!Fmk7M$p-r z+2itSmesODM^wA5{AAWfyZYS`B8XUZ!OLu%t2K`*bMW7?BDRi9&Iy;9tIpOt6$GkYy7{6T8>44!3yocd2_s%fKEguPr zbm+}()nJ7k`ESrs#$zL3TWM;<>!G=$Q_t{kc|o&_Y|>O5JS&Zw{GZy4*vv-tk@F?i zTVr0C-KJDl2bg=+>wV+?*&Wt~+M~W<;5Yl^A#paT~ z)tdnJTMk*n%{SA!15TcJ=tzB(Oqxn;9#-ev)vD?Ree_O7lI2t{te@{4<~`BK)3Fl2 zW7%(y^uVZKnbLK~S7|Pvj+R%s^`)TSt2o)C&(hY&*Zx{K4U3gE{h0MeWdp-eA*J9PbLIHVp_Y?I5}x7K%SyS^B*5(p5Qv`|73klv((03jfR4xu-} za>u#jjyv9S?j7IvJ%87aHD+0J%{kXIm-)l#-;PxNiXSe@2kPB1Ouloxiv>y!H%`7B#D0P7$m)s#74$)$a`3uQ0onKcHs(AZ> z@g-`E9#S~}=~y#!SIr!YpllqFA5ujX+?Naw9GeG1QQNXB8md)x7ohzplg!Ax96QJy&qkOAUxS z;coP-24lY2SslFE4cd)azFe~(mLdwYJwvU5aey&7E7%oGsA!N9I*)g%Gj!aEaJl_# zcL4X!X82hjy%GbJ5U|N<+I%Zr&OMP@TgGNCjnTWt0k9fOC~>&RKrPnp@Eet!XLU=d zz^%tb10%ZB=~7bmF*IIqLm*Gsjqds4EZ`E zYaPV3QF0QmtT0lrQ=gz(11l@o5am7f+8Aa|Mjxi=js$AR5ee@qku!^L;%YLWru$FZ zKtFG!?^U-xR>5BwwFUhkD?}3dlBargJ!F+C-aT{S{86sc==k~$Ej}S^75VN@noa_v z#ib$G+Xv^d?f}1)teYAI?WP5rvG22$Y+IZ(g7X`FeZ0B$i$w4D4d*L~VO57}bMy+w zI^36Wj}_<7=K-Ui#s<3vNZFUoJV$XE6xmwxcZv<-jalWlf{N)5CAG43w4U>pv&?a0 z>Jh#6GNtBke*s|a|D;r}UNxQX zn!PW=alv_s3+qKL5;vM!rs%mrNnn3%IWpzTv(lh#n}!DeyNxdO9gPkot1SaQuK#ZR ziMpDifbYC{Gbv;>VKn0K~QSPRrQNvaFMXdkXdMNl-qfCT;bGUcIRiLcb4dQZny0$|~^3kxR zSLwg|^A)yKE2PyJ#!;K9nx{G~Nk>vCrtXwxOH;4Pe?t3u92~l}<8na_nf4-5K~SBt zi31B@NAg>4o-x@6UjtV@llu8-^%n)xi2w$XbV<)s$N=2(|r_;>6Z5nP?KM+%y9E=q$lAp_HfzZ1ZGI=h5s^ zr|Z*OKNmTAOy4Y~1#~1NfvsioCv9mJsGBQv0J2Mb5EJKzk!K&=I)}}g1e~@%PTNeC zZVViq-*`8KZb)|v;haUpS`y5AtA?aX@(QOHs5~VA)b@v)D^ZKTeSa1aoLaLp|5{zy^bU_98+9YWdn`Hn-9UTxEs%cl=I?`b?qWTSnTCHG&5-{g>cb9%B$MAP{s~ z%vm1MSY&RzFCKB}Ig85IZM3Q137cAmX8<*+mST>g>r%i5o??zwAlQ5yi4BkcRz}NCRx!CmFtApZQ zZPr29uSK01kH|lC7~v_~!Y$eo{4xG&;Lu*)4E=t~hD7||tJF}inZ11Urbgkk$UjKy7=lHGb>lUfxc7?twtNTSsW? z9otHgs}(!7h!<5&Qj;yg-af}@>sqW?l9$)r-n>x3>PoHYFVj!Wf}TRbl~VPml|+$x z!_h@L_cJwsT zn%8|L{X+zOM1*r*lDzsVo`>bcbgL?)H&KGf9+7 zH^*f>*8UZ(^-`-7Xw=wf_484i{H*4xLqKU*hD}_*hC@{Aj*sq+SK4ZLCd_jFQc)V__R3w#s|@ZE>Lyslv3mnn!kRw&nbuJTV&N{ z!Br;|BfQg+&Sqo;vnYIsZ) zv*5Y5@t;B~e*|>P0`Fubcb_6xJ>0PQp&V}%+~>LlmnG7J1ZF!YpL8GdtgJnYS9*?A zLVIcU2B$41))Z$r1`9C%+DVN}go631);W%$V6FNB!(sVByM20fKK0fPgHt7>x0mTy zX%^$?B~4^r*X78Clx|JUk1Nl;m6zzq$qY%$BBI)Pxqmmpim$Y>QYfPE$_k^v& zMhoY(WVBw4x3hn)r8>$b4rWzpUoa>5L&c9v{Fp#T2Y%#&HJjy}oQCp%4pSk0I+C`9WN}%~~+m|OSDeQrIyt!7s zzS3I3V!Z_4y2tkSXD$9)>I$&dH@@oiHaQhky*SI1JC@i^#G4Y!M>C%<_Q^?arS z+d>C-ZuTsDnUzeu+VSpHF{e7%dxw?1%FM$=fWn>e7h(hCw!V-Rq4%)(JFu;CvF4rG zMCX5w9EnNKdLZ7K_qBt~sXd)Q_3!;gwqV~D3r%^ya@YqzRQX%tL^U0QCBwSf2o8F( zR$k6kemvp1^S7_sss`?)a#PNfy8dFngE8*b$lgTf8aKn+v(~?^FyR!IE#2RV3AKnV zZEPuqg?1sk6aa0oxo+F4&-Kwi_^VIv{<`wrV29GX*c9+xMeOlwy1GCcS-o44e`p|s zw&Y-S27#I-C4Qb*nC(zE-*vLCl-Ii)9M$n2DBIjs&>wX|5jNCA2B#VAeJ<#0m4wev zH7dHE`hp3)BTllSqwNE#8PN}CIWwJQ}!@X2^ z*i_f8rl)*FEW)ZsN?R0{S(}AO|2rUzM$jt_ZoLCnCcP;t*xNFApHPt5F@;*>+K_r%6RxC-uHi+Az~`k3zQ3$21WI|2(U5F=*0WR9R%rRrDthX5E4I4|2)+OoBy!U9pki7QQzE z(~VWBKeM{`(i;1w@_=T&wfSG5hSxZ?CnGg>!5aS9^r>W41`ahO5938-{}{mOTJ%A4 zPM0;>4`Jn~F59L^J+`}pK29Fcg&z+h`WA30sZK2=OJDN$cmFY?v*9J zxX?2R%79G-`HWGiyk|y+nHXpM2{lBv*~Arh?f+){D495}Ujx+SH;t;K`m3P-dIQ(B zNqAMCJAPs^Q;E7X*n&q&48~ZG>21~r8(F9XSii?079@2mEF=5{o0O&#E$*!&y>!JPOkyw&fi+7+BLm7O0E+!Sr?6BnCM6108PA7@)Ux9V zRxe&uDc2%u{gqM@LZRkZkaziJ;fC+qJ9Ga@M7c&YX=A7j&!Ox&NuAJ-lC#~)Cf2J? z-Th01+OJjitCO5*mMmIl(7egI#Hca)cpL4-d+EQ~?DtJp!>4`TuYrrQjg763k+rQq zj+ycf{R#Yt$ZKQiWZmX}>=%sAv!UH~VF-_8`Ax!xs*;ggw6~sWc`2R3FZHK;5wN@u z6=hxyw)E!|!=RhBT1UlMP|GBj1M&T%^LD*^%jX3S)y}Urt5p>64Fy(YBQ5pNa*o{G z{5Hmx{aL6ljRHe%mu1CJ$sTabEFx$le@rVX$4uH_Vk>CpFb|H>x{O{J(T^ziiikh&;^gJn_`Lc=eC-J~tj!Xyq5^oGeJ9Dex@ zwV9#A8r)VK&d-~yg_=jmb5)Wr#4+a&Kp|S>e<>XYkJRf-G8CeMqthpE&>WHe<`YUF zDS!q*R}BGgbMT`X^49-nu)Qtc1AX@E3Q92Z%u~!nfA66Wx(6YnJ2m^2Zq%L`&Qawt z4U=v*fTeMnSQ~v(xIgecW{;z-jhGtmJG!pV5CBc>r&I0=iSnpQ zwOv}XH=!)r^O$nc_PKo7+G{AF$Bydk&NOeahzqI-2WiWi`3Ivf7g2e+C_R>S&%mx1 zyxl@G(Kk>PhARI31Kwa_>pUh_smL_$W=@V-wDYGi90TQlgM z)<$lPHLt#tF2#6g7MR_1a|FJA51;;!P;wBTmYM$uF6qEW9=MrF`WST8t5Q1LsO6; zSQ(8QZX5p__zxeKdbMc%AD|f(TM>1gkjt>&tkyW6Z>X11`RhuBVUKf$dS+r!5H9QWv*O(zkheSscK5G~ zyPu*>j)y!O{|dgtY7AuZT(t5|%C@JOBmAxG_yMsxCFOY4T11t7C-6y+jR{N(aWc3k zqzR)p8cQ!tmVir_hO%x8%gD8CliWzPgQb4iz3K=zFWun$!Y2H>J0nv=R-6uRa|q}m zUyy%Pv~LnCA_xZe(bBP&ZahTtIvH?(lMK%gkEuP)#-_@Z)ttUwH6ei zj5mHT+UE2YSZb`@{oTo`-0czzvCXg!@Wnlx^CT?BD{G!|$<7Mip;79ZOV7NC)exi} zx)ZYW+1R8Tyfl9Sv3cX0eHIp^`gR?x>|PHB8hyrqn4h7EhDO)B60s7B7H*ot&ISW} zRUHar%2Rl5-)SGy=S}iz7`SRZ&AJ{2EpB4%mhah2t}ubJ#fw67c+nCyHyU`}b*iYC zfVK~KcA~d^Rf}OU6lL#2)|z&D`OQ1&cLBUQ%tbF>(qY-4+^;(JvW7vYl{mj*4bdC# z+||o7m^up!f1j>4`E}RWx!;Y2+wE%u=;Bn^<)1?LB)3>BS~sQEeA3yI*z{=RKihEs zKlsN-@D%HjoLkYlto4mov$5Z86K>ji^Q`h~5Kpd?I)6K^W%z8^EN_Ued>pDPxboavvlr62JqZ$j zEkYtE@hP+UQk%a`AKVDfv0D1D;&C4h|FU-U;8u-)Gq1>8PTc|#>=ZZFIKwl;JDY|- z0FY;_8?dnw5}f-3J-XaW5d!Ob+ImzEEC2AYndwD^IVSvL<*Y*f4#x_9(P~1gz4X(a zr|$j-d}D4iVz{AC+n25L#vR;);Ad7+MTER?B-N)QD`McyNans{VaV8=-zol`LWCFZ zr&;C>WfUeW#?3A{AMRW9!E%+G;Jqoqm7lD790MqPoHrC!HJc$PI224jIC3dLqE;py zne*vcAyR4*74{e^5~4PqEnbe2SXZ$%yyopIDOfI?duSGrj_*EJj*=Tv5`U_=&k`W| z@jkxS+Sa_C`m!fQ$g#FPj;|s-Z&c47O}WfMM~3WDBdv3Byt@=wWa!+fJG0Mw$Kr_b z-tzSE&2P!4s5WcN?)dh2fn1SE5&xNzg<0(%hv?MUe8WMNAfX?HIRMkx`8rgt!XJ9i z{k%RTp^rzEwf6ctxMt0;H)&B$Daue~)BO^HbNX)gNcViu2V5iF>KrBS=7B&jNi0=( za4k=_PYs7{DgX0-x=FvmGw^6f0OxgH5f$nEUa{vhM5w!S3-Gze9mAbD@w&KS%K@y{ zRfS-*8&Gh{Z85`#z{g(uEzA%wXnG)yd;Pv=WVDN3Q-W)PS@9q%Jv^{z5zeaIL31D3 z^2zc8y%U+tSR%Dj)}a8}`;J?gdLps{QcrMDGdseUb9m0gO4}_T$so4$F?E|5e+`(rdyPF*J&2jmtJFoT}bWTqwPZfDt=99)5ACY>S(niMG z6ycD$#PJiX8O$lZSc~1Ye7nBO6J`X#4m-<=;_vS--Dqqhx#G4@| z5F}B9;hE9+7$v9E{KSE;0@(yCq04KFUV6xfOp=w)99!8p7E0V3A+_8(;VWNiIcv&# zX0J;4F&A&mBdK0RBe~uI|&>QMIkWn!=02)F9 z<5RYP&yS(aHXJd=6(G5CCt-WU3zbjLroF9vsFx6hE~XUp@^)49e+g@z3N#G_|8U!uy{&Q0r*#fa>}>!Crt>@B zG6yxBnp}n@>pn;2ACA8gBgqP;{y7u}DZoM7Q`7 zQd{#2aI{bBEO_;XDdGb9cyr$IZ3YeT_@O_DXCP4b`vz36490{uLRmjVn9Ch z=m#JqyyJHy9d2nQyO-`_@~;tvVxAs(2lz2ap|U*z={2*!2b<4#vF`x^bGkZ_CSt@;B!lu15F+rJA)DA~&+J>#o& zXV^gJtB4WzxmaIBljO>db~=sG>tf3-J1sp{O6e@@xHt~}{iZ@?UNbL;>!cjMtgAIl z-UHCU)1$}@P{$ZA1w1{c;u=TkAKj@#eWNr;xi#d4Rd=I;wH`Z&g4#&mmTMvLUj^Jo zXZMboxRu(#GG|C61?zzg41~P+284uvzpmkIsHQy7kC*L>bu0#`@$>?GRsp*I(p%dD zWeclvLB9l2H~)>kN$Hwej;I9NuD7^N zypJK<@R}XBtPG=NywpXG^h4@)A>xmLm*>EKKewtN{Jo51%=#^A@R1y-6V>L9^VY2V ze=>?(ZHcCrhUEbn$0Vf{YHe^T+#di2_f@_3R-MaCmc(t0)ryw*eB@nv=&OFSt}jn@ z5hKcH_K(Gh zB$gpz_NUdc-|C`g0bTD_{XOMS+Yv5 zkNG`i_=A1EkC35Ul}XCY4DkFIP9zSU$)NywbHdu~b1sTn`MT~>bht?_R%AN|Yi%-1 z5cV61x_6UwoE$Urx7gW;aq)n|hoIRk;BfNs9Epgsu`L5YJ=hwSgOtVtBblNY+`y`SW(ol?|Ih7*Jdj;PUDV{#9L-lj#*vN zgl)D`bkmk2^3zsJ(m@5%T^~8u>L$KSTZvE+W7oK+7nkuT+=gk~g&b5#n(PA^)c;i3 z39zfx!GL*-W8hOQEKEeKMOex9fZT}Z=ZK{G?4tS6biZ=7TVug_#)^3-QTK$=#q?9#2BsuNzRvR70^bij)wK5-zFM`iXT>(bwg*MIQ_% z$h*xF>!f>+=!y%dB12Z+l)Jz2B(3^k%l-mt_6{~{`N&vrR-KS;3I>ZOjJ$CJs)HTZ zOHACOSK#z_;+#1lFe~^5eo4AAqD{?PJ_NFP&P#pUz7ttom0YL7E_vS9+*@8=3kDR= zPl?aj*Ej4_i&<(l@8JKI@%(R~trieTG#yrWp_WwXx1#Q^_Unq+{vkqt&nonp8DjI& z&>cEgvFNP)Q8aNxJ23(B=mXY5QwdE}q8AwXa|QKn37y>nj5sWgYuxpcC531l8*A5> zy{G_H-}R5st8DnP@6?w%=Cu`eqBD4CQc~;~+zaRBgz*@ro~CAYp}o`q|U?BBu|B_F`)F{@?f) zti@M(pN{rk>a~W!cm@FBs3D=?%6iJ*Oo?#x(&_ zP>xikXvs7DeH}iJHt8hF5y}j(=WmJ6AkEn%%PFNA%zM8^A0QjsY(KYRXt!63>Bjqh z>~5y%gzI*`j^rgKS7wSK_$n|`wpIZ-^fjHJ=(5uBLPH4D`y+&syQ8+U=E`#Py1Mpq0>6%pPs?kv z@g)ft$LKI2`}@0bsHe_h)aGE>YW()7EY7}z@hJMA9p3rlHM*I%w5?=iNUJ4n?%pkrP(wd_?K6@iwU1Bv zQ=dI*)^#N0DA@THh!15l(n8dxc}_iC?RvgJ)|^jfdjl%%%Zj!xVtRm zoYsV1dAqvCTAiV6Vs1L!Gq}|uEe!kUq`!3SBb!qiIheD4B)xgb0=H zMz*C7_}#+7m2apurQX$ie`)nF$NQN$~Go;@bb0F_DJ(+(~?B) zB(<>^rvQ!H@(HZ$ImO`TioVH-UXOj{e#vO$v6!7cFgmCD@Mc^3dk-yYTEn`S*ghvnY)HqM`H zRr0!>PAFFI;Zy%poq=?!3cqF|Dq4|Ata5wq_%KQ_%NCdpOiCYmlirsSeCK<`_qpO2 zD9XyL`uUK|U*oFu=y9}|M_FIzS*UNhuR)=I_@?I&d52U6VeS5dqF@#^powV=))e2P(9Ai;ENJAz6ZZQd3lonw_? zP#Az6gnHh8Y&rez)ls+A>|ONxk-wt&d3%G=17S!COrSh~62ZDu09sMBTY40BQ+(;a z9|xP3_(Z(FXBE`Uy7b_WMifhu(K+TT`|ApPq8gThCA3FAYEAnCo)j^}ImPd2n3m(vXk~t0 zCMu^(d$oo-U@)c9SG*Jz0-FI%rhLDy(5xIiOo}z+xpP;FO`;mu`oYF6O43ytgVEA` z>v)HNW9D_wm}u)|pcTLOSog0hasBPc)hS z(Zv58M#H>se%~Qa0mfo=-^|~dUlWvdpKbCx_`v=S3Hj_Kwg@_V1WJ@CUNCVn_o{x7 zZ-whad3-8~D9rGh;AGzk914X{ltX-`e_%9BLkhEAC(b|i~T<6N>qqj7%2ReDeq5-2)wk9#Shce{&reG^^Rx7+ z^fngAC|RSt9@Vh&JtVq!s!Q*;e^&jxnIwCs&N{Ff5C7p6xA2+#WcGeCiYzV=TAJ`Y zIBW|!M$>?;-(hHIq2Rl@2*o%nxWbFXT5o+*MSh##^V0%a>>CJY1zr82U_#=Y&gqAHl`u#jS4X=O|}Y<9?`D;=DhvJV2~k>HoT-204S> z3Dwkj<#dABbFNHxlVaRj<(ROSU~K+2hX8s>&YwRMy9YtYbzi8E1hdI&y%g){nIQ0^ z!=m=&+j5oRDA>)WW;Mypz{;V2`=jmlpWWg7xZ5#Z0j9KR`9z0n_34$igjecoQ;Y)6 z-z0$lwe)$R_5Gk}ksw4B(J5LnTc_cqqC&C)Th_WQcOP%D1}nQ2_)!wGiSqy(_g4)T zSRQbof7s!Kc`#Jgw)ep_8yI9{ZI(}2-T`V0(fq$PFS7!;QB@am!@Zf-iyl;Jh?U*P z=|7Uq(JM@MRyCP={n}c(6SECw*L2dM+S}!goH@-oZ)wxtS!if>5?}Wi&(^?Y8);4N zmV2e9?F$(_EK7t=_p0y;z4Om<4D|y(I|@scp@&8s1}hH5aXOX{d#{Xh0;>s*lbG=y z4Psh!CNeg;GNybg z^YavZBD#u2o}@ERQ0uq(GAGmDGx*l*toRDII=agxhHULCs15Fi+q`~1t`@?E@^Y}F zkVJaduPf_)q8|!v*!{Kf0)vs!IeElkioG?(8hHldzLOmA|9CF`c z&XNYaPc%Y4^^+sj9?jK}z)%fDgi`38s7Pvb`!Qc_g@;d;X~~OUR~SAPBQ~|S$>Fuj zyHv8w7{-a3ok?M@)ce{eq7J(WIr?FCT-O6;#9>#hd;EH)0V z(#@_bmr;9q$w7+?0ldo}onvzRy24gH=hWJlsK@zJ_(NY+0j|j=jXWl~2yYJcpULvD zUu+z1M}d5oxU$};R?5m6mGkq4^-Tjcn1syT%4xx7L(1IJtf4l;(f8# zKOdrCIF+}$eTwXSj4ti`aeFdS-&$ssvQ+j2YKC}$!A~YeS3*J6;oAoXPSb}LsK;6P zbuPVwSengwrKwNL&{8K4yphw$4|$ozZm~_8B}_3+^nsz*_v!80!EQvbBeVL=`s{0o zd_&mWo<(=NCYhldiC{ogHMIFbCA-rr$LM+C8o{5ne)TRFudTW03G~mKjKH1wpaUOP zFx?HyyVk2_o?d)iIOhCGC^W-oyPS5H@(}pgxyagnZ+-f+sES{KQ;qY?QG!mhlq5yc z0GE@RoD;IV03I6FFv)+}apaR?jL#yK?5b->d|o@pd2k*!yUV@S>$3`HhwiQs7Bzd} z^wqWpyFXb&-3t+|zpj{`DL&WGdzuwW%vdtk-mt7l`sf|lgDe{xB%!Q$m^y!*fleRO zdK(F6Vuc-d7B*Xhohrs77Dm*kzIhmRdSNJ57PNB*9gA4A<~nn|4)ebBfvcDz#PUZIdIR%%i@a z!gUJOimx0sSWz8QttRofk_B1Ij%8~ff(@$HbR$o8;w~_z<{&$~|LpJow*>r$O3=`+ zD`BvEzpk9%Y<^w2*t;ek_4wD7HAeNXD|4EQKec|pM>YL*WlaG4>&lFF{I4s8j!3NS zVtv@UQ4G>*{jj%pnxtpa9o()ezFR%+cq-iZ zA)qn~$;7PRj_ldF94pB1luzHB$a2nEU+LRl=~9#a{vhATro@!1{j<4EB`vlt%S)~^Qd(NBf6kt!ij&oUW;ArYsHt*EBl*%{ z7(3IcA0}}x)A0?fWg#pb!ARyfW=&!YFAhPd^@#mWsN!Rp*AZ| zx%HxUrkMff?9y-_;>%q1b1X;o>P~Ec3a}q!@!!6jMnvp5ZU1PjJAuv+IuZ>I?;9nP z>9b`jflXf&Xj1^kwop#&ioXBDo#st1rY;M2!hFy^uH++KC zZxI0jJt0vXEr$ajfr>pRUTpj+lMM&Mq$Uc|ChoDacD({QUfavHwYrU?S-bQdap|X}B-7E3#qTdf1w6$&_bmy84=60k!_pS59?)z(oVndy)LW!UUzyrS zGbm%Q%Cuv*6~js2I2G0;hg0>6ZcMo)viB+9g`RkuQ9&O}2y@chNIOQ|AOBy_e zlJ?Y?R?V~TYd(;jO@0Iq%x#~rCoDF(2hBaoU!-h$9^9CX zrAPXv8o@y`H2cNZ@u-9h=#uN~lwg~8h+Xu6KAFV2rdWq8$WNLxc!R>bZIo`uV%+22 zhZTS@&Xkv{G~gjrUeI}A^!+M3~x^KK?z| z%-j1z@Q#D?{gqZ>wk*T$X1}zzc)bLOI{aq{?0s!mL!+N)M#{`qF~Fd?*PPmq{WjuT zKY|EAJQ<$#TK(XA`QS79_hCYldWa^V4`r;-$rSG#xZ==07J~1K+ z3i7Zcp#pwMm34ghAr2A1pxK+viTm)gZs%STz3F~s*Iokcd_JP#X&v)(QufdQ z-|~l=K|*{LpZ+MxXPiUnR^2Jo@bmA;cLD+ele1HtL7fwi(3QpEET6BJ zxE<@rYM6D&-)>~lsMv+H5hfX@n?l5{+(MoYJs}FfkBc3@xQ|%`JS>FRnKU=$aN56& zH{eJ&i%Rc*-!!0v7LtPQHv4ayh~x<_v2wPW=nIEac@GZLbIouRBSAh;^Q+~or^qcQ z8?FMPK(GuQ<*P|r;g@Y0el4TzRt3zc$aw;UmM(8qP@(2#???zZs6gn%*zFP1vmLzx zT>pt+_klDMR5~hH(K&*prgqP;;(6j_Q#Hy}S}iUDJ;fq({>KcD|2ltKo^BLY{?65G zD6b=II)riSbipJ@r(toCana*IF$LJMELbq2QHjNJvtEUNcuZDBKvRGx35e)2vt^(E z`JMsIvbThuFQ5GowcM)Dkm+0Si6Yd@_)x0aRBZBdDu+diRBt^8e*){pV+=I-^iwdK zMHfKSE>?7tUqbIu)XSdHp!_Bt0j7%LZgI!GY zQb{Z!PVFYt{0*+FxLKM!fkj{ulh!LI(RQgng*AV6|JlX0`8F;Ax~@AEO0v<F$VUmpp_Bm7V1UORM+wMnRHdW zbIplSiVEKAT5s@MH{Bq-m*%Jn`lL6gpoF*ANH~5jxX{<=Yq-F=h3=rhx&|~4>W9;P zTwYd(KR!)yKtwc_Yogsa|20k`^xNBiXEFaK9o}3lf}>exrJJ`;fTo6Q#X3;0JSX;W zs-CA-t#%nh;_mq>FW-Qx%w4S54V1HI0k_eit@teTM+P=54VN1qykmg@o14)ZK&3rE z?{bjj@$>GK#Xs+S^G_?xXdW%4%BG904VHq<;}CVwGe-~L;G+PtGCmhHuobGI`cqwo z_qdhN|CfN?X90`G-Fd@qS4gkmfGZ$zFs}k7F37x9{WU#bCVN-I@lt;nkMph;qD#p| zP$;4+^DgrzS$+-^x?>gf#x~Rw4%Ru(Y^WD=91=dOn~zM3b@OOgNo<}@2cEWHOxG}75H zjkIx+W%Y$tNF+YQ%k4g}hw@HlK2U-R^gKoiEPZyQs1b?@)^>%ZrR6s@&tx7hv3mik z65omJyW%uQ1$luybtpGGt#xUzd@oeK*SpsYu2$i}#gzCu>AjUxKSJNv;3Ghn3^XQh zySTf#i)r=_7L~vfK&mB3h`>`Fqxro21Xf=-+Fl zfu;bU0YJJ$UPuxfTZh3n={-WM6C=K&mb}(kIky%4+jpXhaxJP5Ro;5Z0D}^OlWs)z zW&1!K;tl{#Ih9mEF#wWV{UmPdd8ZnGE<-baMH1Ynz|!5HpZ%qu#4NC5p-LlOsZ1_5 zI4LgQf4DV*jm?1D08?k0UrLpjG9dyj1_J%Ec*mUHQUV!g@CCDcRz_Nereq@Dt(=YU#Aft*nlj4;orb`p(e%;Zw{zj03YK5O>c1I6besz3eY2xGfP zxO~em7=&KuQP<+<84Y5jG>w@YUj)&9%d_9t^nNV-5`ccn(W4G_UB3oM!hh{iSD{@~ z2%6L!RY~j_bUe_>fU8=7kFS4Ls}`)?Tml=RXG4kQ|nbL4hs)561Js zJZmhGK=Z7B1u8%g+D&-;&mn(P>l3eGHy-(i80WVosec{ZV=OMje2>(=tYb{_uzIyy zPENUJe_o+(SG5`Wg|Nm^`TrKvjvxm2&D7FfY|5k!7J`Xx_n%FPd~}u08N&0#i`1Z* z|B9SngLyR@q{&73Wz{Z6nuh&N5P-h1VS(l30VL8wH=zZAMQek)Hnlp3i2}sh*r2$3 zv^Ent3l|ds#_V=}TksU3M00F7$!7#fbL!wdlJU-SGGTH8$;`O4BGZvJFG3YeFQlr{;>DD-s`a5t8RLt743I& zVI)K6_BGFH{?_IUZ8<*II@x6D3F+R2Xg(=_{Fvc%2GQNkKZE8WHzz;scb7;&x+DUd z%~0;cn{skQc7!|Ht;p;5PKvd%mpZ}`$GeGN*AxgHk>XhNYqf6I3iI7BfaW?9G==L_?pjt+RR=8D7i8nIDXPP6-H>`|9Q!9B@>Z zP@p{Grm)TsW~(OVSr=SOt$vy+nljs6E10RiQg07xAnZCZY>cW}s^Y&)yV@nt%+iaJ z)C7fZX=&S3Iphr-U~$(S2V|bgMe#oMDr;FUtNRfy9N6Dq)(FEUWu;(zo%;w|NZ8xB zG@d@u+!7vn(c&8e1|b^_rUv6-Q8&Ihwjd6ITf$aDp_Z({6oHDu?J^8UkyHdJdyv0A zu2+esH|)kE%wCHEjrOi;umWrj>RL$Ng$6A=GhN5KOjP1)|RJ)L*oHg{#) zGC*iIUC6Q9-?Dqw;e)}}9TU{;gYyKJrNOu)newoqE;c2W(?Z&$sqm+$p(fZwU*IYd zuTT}44nwll4)PO~=8+sqDN)CL(B}U0^i?2mq)}se(dHnJN`*bLvf$}z_=*83e$IOK znhO?sy(@*w3i;^SMCbI2t%94P`bC&9r9;2336drpO&7Nu-FQxaF9Ec9(j&ZS)du5H z`Yqce-3CLYl*$c^vGqwnNke0K3~frTW!Lh+QI52AN;JLi!A8nUkhH`|g&(@1{x9m@ z>!}HV>-t4eQ4tgo5CSN@2`D8r&%R=09x)Cdo{tDu zk&V5&QCoQkzTMB$QlckqH`&G2OZA!eF`v*duK#~e&Hw)v>&l74w_PmD_2#Nh=ZQaO zdIu=4RI`^Uf3rAkf@iWTRvIu%+*+o=oaIw+y@ooTE0d|@JHmZR=KGb%<;(vVE^CAz z_e6bVZVD*huy@j2+`bdSSBtEB=-|C=XJoyxp?O{bvzhT-4! z?B;4RTgt|s)I?3jTsZ>IlZKTn8?-x1oS1w*Vq+U|9bO3Y2QXdoevER9jmSAt_5?JX&`%pf?ae}`~>5hcPjvb4tp^4No?V3Hl z!&~=7-Zd#PNrSScOx<%aRXZNZRH`u|Pxe-XhVbTu=P~h#`m1Gky3dG&^b?DT+>+WT z{*GKAeRSrPxz$h1BFwVzFG10P(u~R&Fk|QbBJsX5qa^#oRTlTa?bm9N$Ql=}-#)U( z@Y?CRPOf33txfAxKj4WiVX`^?nT7yFbCYPGSx|O1(kj8HGX`R3$++s3$A0S*9VJlN z8N9?)wW@42a7R!vvj2Nz6C|Wgr~^xyT@tn=k-d+e$!#?kfZr(q^Q9y1OMKQ)efx(c`Ny)nE8Y{Kw`DD* z#J<$RI_sGkik|UXDqSxa z`J!@{!*~Ml{(J7X#1CQa?>?{cT1?feGTOnihqu<=FKdgvMA%fdgJ`rQovQ}Vx8QAG zHFP(c@aB#CnO!!=aGfO^4zAZQ{^Q(F%=`o6Q+iTsbahz4qBKs+tz-UtIA$umk;GH< zK^N*}GYwsSVuvLt2j4DZ3Nn|WpN%em&zmUX_y zijq|pg1TeFbz}ItYITcHo{fa1xnlNB`KLHF_Yc%&JmA^Yne!^?F9Z>FuC{f__e074YXM;H!!8gy4mj(QYN%8`27 zhjtn(<}^)%$KuyP--K%vl268fWzxPPM12z5Y5J$BGou&F#hA%N6h4uw%5=4b*Aed66KEkigj%y!-TBYS#D(Y^6GA6 zhC5C8PDMOh>x;k${$ofv&G~cqX<7U5l4O%&qe4P~2N;4-ad~gsZu!|Bw@?t`^>DI@ z{&D`TYdKd|WVFeO*8NoO@Jq#gvc@#!<`+j*!TnnwW)-tL#;=1<0~W@vn|tP;0mhHw z{vc?9N`bfF$l%M$wxbO=Q1w;6g*u4h10fT=2A)>WpTx&$AAf6o_9FNQ;iH{HJeZ3K zYg4`}_Z-rVgS<9aXM7qJkE%pFe~h01&ejo%q^ddzE?rfr*r%@SAMgG>M@^rQySdgV zuXp1&jBN)aG3!3bNBZfP5-U9>@vkt9GF7z% zJ};HtzG?~mI=46eme=E>59@=UtdIQo-D!7*3K|mu{%fvM?FQy!fuzqk(m`*3n~uH) zMvrI(c6!rhZ%w{HUbkmZR(%EklW=J@ZguoDIRBPkJkfvUBvGsbGVTPS`QbX&mIM&+nB{P zSYoxP7oODc5WD!1a`PQSIL`+80R~IB%@<19oC5H$h=P>rZXZ{XliaI69OERAZQnG* zK*km$mRFpb;53(kS)KchqUP46S60?}*1wl!@>ig5AD9A-Ok_l<`+M`5`3V%>6it_~ z?WFsbflNF>XG+%V1?W45Vs`o{48Fx7`-7*;p1 zoOe$qc!1G!>E+Fb?~KcJ{hi5`O6w;+;GL%NIPTillbHnjVx_PSCMj&@M4L$Kk;6#F z_q@ou?G9Q!U;|h2)Ay{K&0DY%@wi+Otl< z&UaHMlkv-nsN&aHT1yJU6PtyXsDV6Vc=y{S3#Qu@u%qgg(&ntJ+`lyAIY4`z_xH`o ziq0i(D^!&EmShKJEcj}pnQ0i8X^UXI7_YfOqnFUT%GblShU;^wr~Sv6VS|qJ=qlMk2O>;qIKSbTMWiyP)c4iA=kv6ZBT)D%75|*0rqPiNS zsx;CDZaX|Ol>$3xKlK7gY~E-@{sb2rkuF;BwG{=YRZcK7jE}V>g+40CHMZv8ZrZe< zmk!eyi+>+@6~G42GeMNMq8+GBq9Nj)qLfAxwLS976VxN}0krd)>PnNL1HSWv{6U6; z$iC)ttq$2lUIj|EAI_+yGWb&GtMTqMmXNnSuv_r*>KTV){?O(04AQS=Jx(=`H_1~+ zncrMpQScV-ex-!e!cX{A*}fPJH-_YcM8>z$FY*X{eNKxWVxyDNv|phC_Lf^y1&`;# zTm0bdyDD|QZs=pkY2pe7h4J>ND(e`kP?@?Ez9s*Fc_43i0d)VK{5O4#E9-CU>r}@- z1bMczpu)a-fw&D*ySF5f>m2m>BuL1Tx1<#e@n)Z}TBh?EtDdkV`QVz%tv6FI0cPDh zOQFNhi8+0*t$|jTAHFt2!9ihFWg#qswa-k2l(mro_qs}XEp#w7fzogNWbZ_LV?So^ z6W>^w!PJv-v*bDdF}(H8?hrvPG-7VO`t<`G_=kll`9MaZVV}|guhsE9YifoJ>}96a z36$+?e}QBInOi9Zxz7EUWe>cyc zZfUl#yw&s zK2uZtFNoUMZr$+Q%Puc2oGTl366sf)!5;aZ9Hxv?#DcZbV~VOapj-2l^jXcVM30Xv zhkvU&{Q8TU(I#Q+9-2?;Re}IKX3e%E?>_jwV}4eEfAuVEU~JCNtIJED5_H9$tc&^P zmu7B629tw85x4Y{fo&`g*lbJvLgBhli}+S{=+#s1voxQ3dF}y-s)Uqe`G?AiSLaQ{ z3NqHNd{(1hk&)WaaKL}|mv!)u*V#!ub8dX*A9rLHp@cn3zm)k>0)d)VS7;qa|0XXB zE%TF0<&Fa9geur$)m)hB!tpn=8TmNY-mNt?$V|rl?Obx8$tlue8?l+xx798mPWipQ zmNO?&_Yim)%3@cS%!@lU3V%OgzO7$!GkYf>0ZYqC2>r*h9Cv&UN{d(*SRZ!;hjEtmhC#l`H6B7(oc+nY}%H_>=x>dZTXh8rT%mV1i}6A0VH`5#je_hWGX8?jPj43QJ&6OCWkkK+k zqv-B!LQ8*-F-WZUuiwbV!;ZthFCRG0U;M{lvf09(8QMX+cZ4wX7vxvzxZ=Aci|XMA zaxRtXbEc9aE&aRf%KNA#OJwa5_auSL4=*mtF3bTQ#;f+z9XmtV*# z+uFfk(t2!c4Db-NG#tlBzS$^Q1Lr~YqBIAE%+ z?7K2EKK`bi){D*Ar(@WFYI!4rM}?TDo(_8SNaewYUL}Eb6$3I(ZH&SF$RKYcbQRs+ z?{0hu5CfJ9LSu6RFFZnbNg(-m##PzF$n=7VZ41S$N7}6G$FrL#XW7ymCY=Knx{T( zHw;N?M36)-vC%w>^)Cmo8rM8Sx$~fD>fi^3naZ1(|=?v zk{Ho|JMaN*%o%qTSl4e{48C>`eV8a6W)4=hxFiA&@7{w z1CV~v+Kai=KP?o;S;>MrspOBgyNhmK96=l@{aru!cgd3E^l3TI=DkG8skN;8V>e9x zf)tARL7j}xX1a?yg~u}rb+#&32(ck-8slEs+fzey+$E~`^ z4K30#A!(->aZK)d+9Vk@L~wuiBSfT}w?x!|A^LFC%-H7!zQz5l)N8eRKz!a;IqJW( zF+4H|*PG_mpP(?09Wr@iYnroZW-T65>*kO2WG)2o{oRipcyK6vAtmUqu}??Ybpd2R zj{d|Gsh>( zVp|{dMj23HS~h;Btmk%jSIb^(4`S@RNa14(z`T^gWsZ1Tx@!Ez$&vuC<#x`dfQp|O z{v+@Z;UT6kcT`VKKJxrd!#YNCL!!ju)#USsQWf`35N-GsCDj^Zo=qMHncSx14VI9a zuHXq)qYxZMCc2=V=Y6zWm;Dv4r_}1S`QL$=Ra?(J=5EW}xy=lM>{I4(y-S6(g-upv zr<&!~=%KT76~V-LN(NaJ$=p&__H}IjL&gM-@AGw zrt?*A&EueGIVk_JwU<#AT|@3#37{boJ&3J@vSk>TUjU1pcPP zfL|3qH2;MB2)^3p-N`qW#x>ln0n<-f@9-p4*-^se&EOI7!J*&cASp|R9E+v~+CLMy zFJ2LPoU%CNvekUFDVpw@Q38-43T1_W@5&*Qq<3JEYg;l@DcfO>aio2)?MZ@92U4!i zi*y)i1z%6TQ?zk>IU-=MxG)`UiSoWSNFOdrP%c;VvB8MlT^4U?gSzIwHdijzA7z6W z{7C8><;mPbKgZ=4Nx52yl0Km9gCJjcy0%_J;`Cko&9N0l9xdn{Ry*~t0e?vIvAm`4 zOqUSeI8*9J<)r^*>i=_nGopAOCclkzZ}?{2BlBqhjQ+>Km-Qj*H;1!O|8I~#V1bo4 zT<((mh{Q6vc$&t)7j&bGynbO)dwKgFHhdFPYU}?tg=dSPTDMLqMD%IX!X(R8<TeYQALG0PbFMO>)S8!#oP%61g*+I%_Zg9m zPY_*r*%<7qTy2H(M|1mIw>-_c7+fK^+ z?_VmYZ<8LRw>5n{awpB5HhCbRpV6xrI3XJA6AUVFP&ax!HtF(Y&O2?)vNFxG+&JsO zF@mnv64*rSH7`1ol>n-@lV0{iqJ1!lu&t2C$99&KoIb+w-Ocl?LVLT+Z1;{`~3Z9{_vFppFzT5?Vx5_uGX1bZm3e8 z3fL!eH;*lIHf?GyYe?L>Xy~S@^8;-0iz22$X=g-!%GmH%JdWWQOzF@LW>$4{b<7M} zc{2ch=#S~`Eq%w+F83fo7|~+mGPtbm`QXZhhd$yMbh-7}Y zi&fss9IL8#n&k-rmp2N+eY=pbjG;a>I@E4&)>^yaLu4weAMaC z%A6^q8HuCmg*ra=35C@*97uW9{@LlwLzVnQ){z|oGCoW?)uLG^MLWq`rz~+e{I1T> z^DZ^HK*nLG-J?u9e^S`W)H0JG5IL`}9d9EMFdbIsW-kqeg++NsDYiKB_qjF>8RVvT zzRwIA(-D&jVIt&Lrw;MP@wPDzSnY0PoIL4^n9W?;7QixB7a+{?ECbL-MuQ(8Vk|^A zQ-dX{F%i)6Oc7n^Ojozp61qaVG0*Cz5y`*!S|dvN)nxUbH**$=&9!IcTl5Z-Su~zt zglVrn6S-eJCl@8Fm8D(};?*%#(z+eqld6W_OITl9Y>Ok82Bd#GG7;P!OO z9n!tbtp1si@sZ_Q3O)Gmluu(ZjI-lbU-vj9wo3#qQlfHc$h$#TUsqmx6wsLxK9B#Z zGAtf&ZY^e|M{XnU;b~*nFaq>x%S{SqZbAJ(-GFLuE=#fsb7cB~)ejOe%%*4Hbh_YXElBN6@=9H1;QL<+8o2HH$p`g(>i0?#uR4q4QGohC`U$v z4Pd0j2;)nMi_(~lu|unrTV4+>dwM+=q&cf`#_JW%i_;7r3Qpoq-VAzQPHgQR{g>RQy)9=(Cg0*e>VaZ};y+m%orNm6D+sZ>}E|upoGcuNE z@4N~-9qE<^1k$AFI^vsetC7A92B@5cce837CtX1qyHyC!O6BKRv2vP%SqdwF{tTr5 zh6Mm-v6L`XLr4iwrf_$Nx>56VN2TrwH@90@$Qp+LvWg^;1CvyA5=cS#F+A z-LjozYC8=>_Y8GwKCx;&QxtId{{8-GsY}0>m(;b! zZ@l`(P;s2))7u+fRbn?;S?4DnaLY7InG68^13d0NKfEKX%+}&aD+hL;&;T07ZWwSt z!%`6cSf{l;Uoa&y8=Wd%7%WmPVMP!s_dXS*z8ea>0GZW;Mx>$2osj~x_^m3uz99)Fim@>E+e zMeau{BOlxUbg=*Di2q}V(x5Jg(aX#frjhiX2H;mRo+jnLNKY7Rq7X7tcp&YmyO&df zb$o{mTdkv23i|uy81}uAto+jwmtPpE`5Q<6G}BcDpYEns)&kC$E$ZN!I3PES|GH6mBf@LF z)jlQ`!Uk9}>JlbNnocRar$abRIbFjc;^9t?n8J_YO7_&YLj&c?v-lQZ#Bp?*i**Z2 zY$E9l*4$J?%{)w4q<83hHE%ZUy9Fs0M+F25dvHmn`j|eEyVro%Tx5U)7}GoRs0utf zRh00A*;837m?DpKts?Fdwd4Hqlc|mS$z~#P&2h-2FCq@r;&=&jobCuf2@fZv4}Z@g zG5{`4<*N0Oh(f8re&6 zUD_I~QPt8FpA=5|MKHyaHO$03d8YrPEaxAS04`o@fHI@Oae(Y|sB|pjN+eSRiA##_ z(i+PupmKDs7p|x$o-??uFljD~def#l4%A1q5`7u690OoEjbWlp0eb$cX^nt4H7jn* zE-;O`Jn-yLt!hJ)3!f8`G1P%nULr8EAMWDHU(iuDvc|c_2Fb2UyUlnz`M$CzWfJED zI@TU6lR4e$UO;uph;Pv{Gthxxhx=d6+ezg5)DfGAL`Nhi1ZbMx`whU?ttQVde8?c^ z4q$(-{pl&#MONwddROEEJeJYU$vxNO+?9G(JW$~%`+d;1c~W9)p$c~{cbc}GI$oMh zES8dT-$bO9-)VOiV?*Ar9*_v(hE!~=*{spNnZ2e_t`Af*(? z>WQ3AX`TRhTov!^gZ(tKvYnaGD>$%LiDnuD>}1Y;Gf_F{6*=_XbJ~H!K((^{vfXo7 z803JTZWpwcRyk$#Q5yMfC!l@{GN5kL{tnUZuENZlL(~s&xvMV^=~~W6{l~zFy9fEW z^z?A78U@#BXsl>)z^C_2vGt@nsZvao#7N*xlQo)oeb2o%yEfyS+Tn|=YKHevzWfB6 z5e>Va__+3e40^j+DY>ChU9}pAT|$-!dQM%nl!G9jwnki=lwFn0f^@S>^jJUF9arJ7<1z!3~As5n9x<&K%+h6;PL zG`y8eC}`-4KJiBg4brTZ!hfK%f7=+|W)VCXVtoqdOuGhjKcNBG5~FVijc?Z3>F*%C z9?o_-<7V#O$c8^sy_=AGKZyEgzf|s?c}8;r^+@6eTFn>9Fih{Z-Yt4*DXCDfJ%o6S zXm{_S|A{uGhNU@ghV}_Hs^3nHG=0@Nz2c0HXaJ?blZ8{&0TmYi80sM|4F8X-{QNZZ zZ|Gj0?sot*QFi37HI&bGaBRQ>gM2A?cy{U4_dR01Mu9vOX|~92|9ITkzPhP11t+%* zHbSZD1XWP#4*DPpxmW#ta8=}%bKlGR!4}-=w?;0N>W{R?+YCdU>a${oWACTeLjnfD} zTl}bDFeQ1c)hxcR?$V?z)O{$5n@qahNm4mHXbs|PPp-A^Yfy8ARr47|_6abW`0?=+ z=Y4!}NFRy2gm)z}7rtV_(TIicxuw+X?f|X~F0a5lQ*NdiE&l9qvT#Zos^3lkY9^tP z)1vO5chaeNh%ED;2HtX|c%A4jMZNe@ea?P8Xc&BT)V|ZS26xqMtVo&5y~=JqKu(dW z?J#ud;EK4x#h^&OVP#Lf!4S@&Rw%u3NQM@O4r*9 zu!|~kq4Q4J$yMKIBGhj)?i+?n!Vut_ES#}|-ez8Axt_Tn;f|pD~>u3BiaXaFjT>e*I28yy&&eNQ3dX-giCE?T?Nu7JnG$Ws|ntP zs>5c=02yz5;82@`H*i2~+=-IQexOyUA>VigX_&}I^rmBBZB8PF?N$WuOFp56CqLiG2Qwax=f8UhwE+K!Vc ztl5!|*q%x+2vBV*7p6_`XHJbyh{x2cr7UHk9x+3Md58nR;jD!4e9`XI0KJr$FIh4o zY8H#&^PRZGp!ekgbK~4BNC>WHv=j64D@!j9J=?TT?@?r8c{x{yBz%F)U`#^CEiHhC zyl>;Q`qT_3oy}}D9%HP$E6i1f&q1-)na%G zXx5SB6WI4e(<^R<^G#)*ws&RKnLF5Ktf*~TM2&kkFjX)mTmHMk9Rnj#&#dyrfxF6p zD&QsJYf6VwQG0Z`#1dAft!~97(DAAeFv>nx89>SE-#W*aCa1r}az z_W!BI=x317DY3-)e*eJ3WCD<8(cw2xWWuWBeVnbHS5=qi;tTt$V6Q~zP{ApR*D7py za1uVNWk{4>9@aW2XsnrHgY>_N%u{o@tE0fm>WlXDI_hlm;KO5(r6%8b(bFvZhFdce zSs>!>QD4NnKK#ydNw8#i^h&OnrQIuiv z9H*WmqgQG&%Ny|>;F7H3JTyp)sBsj7kyB4sdcw+QLkhQ}T4Vhx07WT{pZb{1a(~G4I zEd`a}^uLhJ7~8m%vgMLg?9k2F=cSHP01hdGZ>o}MoGR_eFA7E3BPqU@jIBcvKWlY! zLRe+}XSXBJribTk=K@E(i4O+WJtnK9IMFm!fIS46Zs90!2(!<^Y^CzZSl-cvnG#yRRbD=-s6{=E%P=25P0SBkib#r7 zECqBS3Aks@+CElnaO+zMvApZIs`-ZBbUxrd2iWO|57mmKC-Sl5ZCX-{N9FZ^R@ z?ow4?(dTkjnwsfp*<^{o@)d8agq?J7NpLL%*W}8qGCsrJL^sq%%>jqh;e)#ElWotc zANPHxuImfa1aD4eOsPnJ`p{;zHrL;+@%HJ-}JHwC1V2XTj5lrN6~1RgR}0Tg}MlN|B{*>Db9k zF+`aB&1>hkvxBrLoza0ed9`XiS5!+R50a#xNp-u;6c5FDaM45ipXmTnDn|wC?ptt?^}~^KEEI<=*?=azdtiKt1(qpGSWVF5tEUN z$qJ%3i6)zRWa+;a|8(*YEO6MJz1Y3E3@PA>+?7h9#>eHpsjGYO2VVTt&J!k`!ia(4 z>|fX4Q_V8hs9ZaX7lS4F&YEf54E@6Yrh0jVRW2pmM6n=ZjoYSv=hS|akT{aahXO_} zjQ^(bEW8V!;pMIvC0mwrG)9^vQ`iBHg}La|1Dh}d+Z7Jo?>zpLuQ?x}Igo1q?k{&A z{>Mywp8hL2)>jSP0wFudl0cx^pWs8e!-yOJ*FcTs4@Z!$yIdQ)TZ?~QChvnWEV9PO z+!T1FyS?P($x{nZ+B5wdUq5l#4z1}`VDII<*>-RufBY!Y2EN!Y{o=^T58u_FwT&~0a|WgDS6*=3c4 zn3HN2`~>c@`I;Eqru0o7#vZ1)l{7iyP=-hxT-TS0IrTQ|KyBE!nU#p>y?z^vtgJo! zdLs7&@=WH$6u6;|NHvBiK0%i8y!J$QXV^AEKaGuTq~-~VC2$rmxYpIZwD>wK(tVSpY7~cpdFfu+XTm($1BXY8QDNMpezzm2N?C;wBGUWU9U^ zX8*i=i%o5b3gD407#tMV4gC_d3`u;IS;-#{R@IqlhN5L9XD5UT;5`f4_;Vg@euV$u?ro-hX)qDxF{)`o`GWxYD)u zkAYD)JwLeh5QVC%BpuFqA8Ir-71@1r_}%!fvUEcFzPUo7?N=MqMk{Y#gpW<_-N^*) zh#+4!U`XXLhj2x;==lrSP*2#;FbC>)6W)wQWB={MgWtm%{}?8>o7rE0lz4~o&qSF$ zde`}W#;oNxZrUNr)n}>)1yps)`*oc~bsNT58+GomG1@NsporDq_lf2PP@*BZ1vC(y zUs1Oc{Ib_t;k-&}e)D9%Rj3vTZu@3=ugJ;T$COZ}@bqm+%$_2?Iw4=hV5m^9TW52*I{(&#NgO8FC#ecrO;>r7_U*Y%1sso`{Ko!!PO$W&p9)u0hVp;m%3r&mv zl(G#xn*Ogc^qeDc1n9I6GK&ZKF}cu8v1};3>1|vj8xq1&^S=_1q!(8+ql{H_X_r#ir6(Nlp2cMt-ST0 zSo;e(<(sw(WkS-#&jpwJfvUC?K48*d0kQ@r+`iOac#Q}#}eZ1QT2H1R`EelNMN zF;%)T*%+=2#lF4qDR9dmih@eS?`j(O$-!GT%vHZx_|-+Tzsqg3EIEvF7!J{!^=W&= z6Ybz|Zom23b#|0gb*4Ig`bl%eWVFo}WM_5db7sADwy&T&mB=38>heR(mn{`AQfKoe zsx_kVMbU`ClqisOh}-~Z7gZ-#E~(2I=jLNyPe}>&yW^yIW8DNRXef))#oo84~f8k%;C4?Mu) z16#yKkUPbcG?Lts*PUg8&kE4Xue|j zN1GOduJwXcStqTjKl6(ke0n*t=@LA@w}mo&+poR)kpGK4p7LsjG||%47fgoKEo^fl zfK*~@$~fy!o;NA20`3QP63*)pWZOATJJz|d+9hd3DR1V0ZuMuq8%cakret%smB(*d zx%!hH__W$F)@mv)DQcitp8I}r+l}lAoU|QJg4k5Hzw=x{!`hsW^*TViVotVYA2Ow+ zeVBwmjrygxHGAvsuk~WGUq1+30M@?VKb}0|zqrAIP15&-YEu#PK}`9u{yzqh8G=I_ zOB*(ARpn#-pO{Cy^Y>B|b6w7V5fZ|&qlrYJv~A|v2kiVOHVS~P_*?mnHv8TW&6tlHF)B#~IYBq^n!<17WEt}Hezs^~sZM___KI|E z4{D^%{xO8nd_0b1D^At1HD0&G6fSR4ZNUdtRYdwC^*tc)u-}cH72D)(8g8SrWgZYy z8S+f#Q}UKW#))8(eM?yCYP4q9Gp{pl3)-Pq0hqb}uQuZS#Og7Z-r{g#i1SpZ^9pfu z42fP`4bBYsAc1ZMJBi(HbPHV<@m3Lfth_x;RMqy&^VT*)D@}C(69Xqyv_fHdHGRs` zA#Pby)C~&@904R1!G>u(yJOnYr%k;~)Qi_!tMF1qgnvBf)e+1&U-#c-SY^55OtvKG z8;6^c9c@tv(<0EU^Lq&{q(ArL#r!!y12*Y(*(M>&C9_gQWCRDn)yvhJ?$cv++p@a^ zM9eLmH9}gQ)HgvU@fU?H|K?h{jaASRwSglJ;r%mc#vy ziHS9CK*fjDQN{JXey#9lu#Qerncwv;pbtSsoj}#bm3DjkhvAI4G5!BvOZnHODhxYpza(KWsr)!Sw2Dm%JUr>SS%*vz*R zdpufkbvOMO5&|llzCjhLR2a|j! zu2RGI55I>;xa2X3w3Un&$kB0!K=deAq!{#s>pqkVchb*nV?@Sr%+lSM*ia`pA{bG4tBz;o~Yx#Hf}%g;QGt*b~`4B>Mf=L9W(g>SS4FYl5uYY!%e zyWZLCnx{`(vLV$SZp$j3iP()a(IL?)=Xq>Mo$oT<#<;1`sWxN}6Y+D`cRJqlByLyN z-F{dcnM4Ji$=4qNi|Z)PN5rc7op@)Ed7Vw-i-WE=DaPcE^X`o_cjKNnhnyp4N}hqf z1bl3Pd^XFRWvKP{5dHyUNGlm{1++JZHTgTETDDGytv8Yst7-~%3_u&S)dp`42rWcW z`f=;nJqtn%ndeVN;kU;RiYmN80+)xcc0FZT7+RAbIGGzkx6hna8hXLO{ihyxG24nW z9_(!_-NlLeOR~3{%_-q4S`piHK8q7*% z94f_S@xjdj&kV+aGqo{MOVM^Vn|xKD^`G)apWmsvy$y0S%hzl``p3{+1la0)tMJC+rPA)V zUH8Rh%W^-{VND48pT(6&9o%KC{}}q>erd?3%T3Q3NU59;C215=9Qw1^%Qx(Z)Hd%9 z|GmCURZ&T%UC~OmG#G5TXWIYiUU>S`gJ6Oy&e>EWfy3@3+Nh1p9O z+)}z-*5u%K=VFk>hKe4yeDi0ug&)s=kBquR?9Jip2gf$ZN8Qx`wEFb?h1J@ZD?_23c84|h`!#d$c4?uB5OhBRVN7)9I?vSP2Ae%?Tc2};$ z;zTN-FGlPN%eh__dg~-}$_u(C;D0f@`WQ!YX!h-Dy!3YOGphaM_pJy3FcYc562{KF zs)jr@B0V0HJfyd`^Lxu4(<;y$7SsV9g(p#l0fSTPXwhe8-nu7`SUKOygjab z$C(OhP!7^zpcd3m)v*~`wf6yiWiH z;4KYa^+4AZ`(B-v;gNHC%7icK5q%dG(<>U6h}b1Q7uQnw6WyQEZ~LTV#)}Qi!FBVa zI6i~-Gwmz2oi!x7^kx-*=Z;-gL7Ke8dGWrw^v{{+U;kfkxC{(Uz;0-O;ITlBTODun z5`k!?*XF%vIAnX&Ki;4VRr3A-CFfzBcO52n2v>%6Hcdc6ecZ)qg2EC32{&3l@whiF z`3M9yW=saI{GOrY*ha^N&Y7Fr(3!i~^t&1-Sy=3wZKY6XBW)heKG(V_q3NDbs)X_j z!rMTw^7s?M^eg9?^JmCtIJ5h&n!W4klZ5dIS3K~b&0@axdV>?K_9cuZ zbJ#(?jRVB|y#8C0_TDO{Q%q)7SUW>`LIU(kc=+hPvKO|tSv{jUM0*gE)_}D!5v}i; zYe5XR(vY8dI)&rSzSAwG6cXr2gDeeJTjPRF~ER9y?o{tcllhB}!M$&B);XQ#>uNriw(#GI@{fG4Tgmt`3 z=H;pp@7JQ6{0_Ur@H__qboXrvK!FmyVIyq>f7^Zt9-;JV$0ba<{$p@(A8<=0NNgy& z&!YTejnd=&*3(=0SYqo!Cu57Lx|3O2K6}Bg1lj_%)k6W5a_gA%#*p0u! za)9NRGYC=f-JxPe@~k+qH$v+*VR0ifS=|A6z#}5&Q1_^}0p6s0L$X!bZ2k>I-6=fS`rmLzig#^zi@v7lxd)TDv zVaWjT>X@O#{8i;a#{VePxu9*{(Z=@0Z?_)OEA1Sy>R|~}0QYsA1 zy5S=1N7OamN5C9WI+HeH)^81WlLYwNG9qFXXY^%LU#Arw+*^6N^tY=?ae4x;P}@XK zXi>YQ@b}eXZDL#=)pWB+8#{dp?5Q|VzsVQ~8D^6?OIea(@qkqKo1VJl4?cR4`$L+) z9P$NcH9cYPh&&4|V6&f{lsuD#_zfqjCQo;H@=PXA-W1tYG*T>nFR`cJ zv$G5_J<(1T)e}huGN2XIJL(V8S*bOnn~yHMoz123X=Ay=MOh8@j5@VkVO^~mVI#x+ zJ;7JV^#|IKT7&^{!eRKk*BPCSTc*}5gekF>G%{0TE#j}xG2fLd{ao>XZ7bRPN3r;? zd_bO*c`=5k=DWyts^}cMgu#8(+XcSS43&5HIoW!uuPerjdF7;&1LG4g)!WKV8Ul?E z>HV0G>nRPJ4T`^QP7ibKoYw(Qnx%>M(fU#YX=Ra)p~yuZ*$lOy!OF*ixA{GG%{szL zykk_km4XtH)lH?(8=T8wRHVC|akb4@H|dl$7FG>14Wem!;;dRz+@Og$`o_#ItiN#V z#`VnVj}IVAAiZ~Yxe8tC=s5eXQgId5gyCh;*RMu-LX$yD9I}ymRwWN}hYi{m!spVy81UCQlv^96g&S8gOwDJ`gB{MIv1^ zP9&i{7pqlaA_0!WRaKd@_@t?@akzgNjh8$Cb3FmG%rK;U?9y+0$0YAk;BZ>Eh1lFx z$eFr_8{lmnZ-;%iOhjtdLQkS8(dN|lH*_nK-Fe_!pxIUA8T#h`jDg^YIGN-0OxVBD0FRz9^;o z+gN6+C;}a=id7P?!Wh(_xCBD^PJ~A zi@)+49PL#CSTM7m+lg)#Mt$mby%lgF*K7K;7lSgerTo9tHzEB##^1=KS_glCN$av5 z`zIjXgpJ>_wj)A%?JC|1!*+q#+EV*Ec$m{+x_dq(nf!kImHp9uxP_Shs2C*`qr>Ey zPj=$Fk0v_YRP*bv2GYGpDcxT?ZnsdJH1H<$Mv8oMz_s2{UfPGqA5961bE-23o@hn& zDCWc>%PtGGlzO-L;bn%?9t_GZY#np{c8^Pj%3(d7cl;9Cxn+N)Z=ZBmX7nIc>c+Ev z%+YIyt6jyuo9_o`?=={Xy1C;Ht~L39pQsMOi>RH%)w@;~!86-~Cu|FnPx#5d^h9X| z!T_DM8oG1*SnD7P&%+f1BB`n2`=}W6NmFqVZGXxI)66r>l4S z7lzGP&G8ARS9AUnUX}*2Mh)sA7r*xA^jt~Q3F>J&M>7GLn!OIge?dZY1<#B*6aq*t zN3hw?;CduzTS1j`M`}(g-|XZNxXP8TW$0;nlwE+%kVf3Tx0DPgaE0LT-Z_O34>-}Gr0HW<3^ufy6xWU>8vO6vZQmUp`xqdi$$As zws`(MNoG5ukl7b6MdgsxCN9(On`QrfUW9gwib{weA#bdifGA3dzvHW|%IUw2(H{n*~26G*eQj$`| zZ(jq!PePZ`YyLO1o1LRoKj#`nh(`ug{Mn;ARPY%!a4XLzg<75F%8UHVq)S>qPYj||K+Jj*xsLkbAH@3RQF6%?o% zx^ySqjcHIT229ms?ER|51o91%WF`8XqZPVxo13?2Ymx#oBuF&4UHes!%UMS}h~TUf zrOc9WFV5;UKYO5TQrBH!V0n~vZSVgbb7rCSE-;X^BRWK*Lfpi31M4wX@4M&P|%o^nfd}VaP5o@4vR^iQ=l-$O=a$P|9a;$ zg?L)~7(fV8IMh~id4)k#sh-jSL$3fwDYo*HoW{Qw##$01^{4ahE^!L*#iFmHg@dvL z;;2zsY5VhYS^eWxquNUrYWN+k~*tE-8pdwW{oYg+Wf%rNNRq@bl1+~D%tusgJfC{Yd^|kjBt~QuNP2aC|FcJaGYF7y z0@V)Zvh|`VH9ljyvbdV{O%kUrIN_WRXo<^GNUGl;9;!5DS^MerSp+RA!ZVY4M@5UP zXH~-KVU9;!y!|GUsPgDDSlOL4x@{$WwTtq-yy_kL7uNa5U3a&!_MaWl zSkzE|J;=rAM>||am6Y-PVfue&$>Pzu3mUyqG4)@9)BRVjZy)q_oM;+X(gM#2QdBHwijPU__sJcQjY2YH9fR2U`o##9x_Zh z`^KGOdg(Ht{3}X#0#240J|CRN7?JWS>8v7`EZ2TA#_hEz7tn@{iDu&*}kGDSsc*5O$GAv5BU zW}HQ2hc((zuf3cx;79X0tShg1R05!{(6+CN&+Q+mwb;v}1F7KEuvX(OCUZlC!o`Qv z3MY#`Y3Qc{jq62j31X8J0O(vQ;9O0*Ok-M%>T_SnsnaRdbmk7|WbDHi|NTSVx9&4& zbHx>92tE`?*c4Tkm9i5X9&)sV%$+p++J*<+&ZZXh$Kw_XZ{vH{}-x zdxJ91+bvt98~oOE)OYIUml7`;vj6PaQw#Hw(0{bqrg7MbTG149eokrZi-VE7P()nWeIZAl zARX=sqF;5Y6+6;w^&N*IeNd^BbwBgBxvh)M6;Jf^3rz`%D`weilb9MI2W)QI%$f{g zM$fmjWoA+M>4^IihLeBxpoiLod*n{`^vYRc^SO&p)qLSU=i4q~0*w)XEwakUN?m>0(z<$YACdMuax zQEX13Kr}mXdgLRr!)-o!bRB_KBSo`!4R>LFdmYT%Sz}NT|AJ{FDb{sfx72hYJ)1nf(>tc2w>r#UIv zCHoxXT|lnaAZIEnBgTJ(XLQ;rMNG*n1wND)x?Ll#=_fpF-W1~L?b3rLW(@^)s+B)T zjGt=NYV%1I|L7Ou)#>@1lK9HKIpFcF-VW~-2b&;`G$wdAvgV0PyX+V53pDGU>J{X< zw;>8N&PTz(qU*>5CL2EmKda-ZpvMWSYU6~qG@v2^z)+vOLsDXi8)jJ5NZjE-w%H_m z6=ew45-Ei{@q2(2#=LSD|EZjnd9H#)-$A`+b-D^=AGpj)!1;?y{w}&ia2bmG*}l_k m& Date: Wed, 21 Sep 2016 11:43:28 -0700 Subject: [PATCH 010/300] Change default InfoView window width from 720 to 1024 --- libraries/ui/src/InfoView.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/ui/src/InfoView.cpp b/libraries/ui/src/InfoView.cpp index 77b641e8c6..6b6d6645f5 100644 --- a/libraries/ui/src/InfoView.cpp +++ b/libraries/ui/src/InfoView.cpp @@ -66,7 +66,7 @@ void InfoView::show(const QString& path, bool firstOrChangedOnly) { QString infoViewName(NAME + "_" + path); offscreenUi->show(QML, NAME + "_" + path, [=](QQmlContext* context, QObject* newObject){ QQuickItem* item = dynamic_cast(newObject); - item->setWidth(720); + item->setWidth(1024); item->setHeight(720); InfoView* newInfoView = newObject->findChild(); Q_ASSERT(newInfoView); From ef8c2a288847e951a750d4a4886b0b0b229447a5 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Sep 2016 10:46:54 -0700 Subject: [PATCH 011/300] started to move WebEntityAPIHelper from RenderableWebEntityItem to OffscreenQmlSurface --- .../src/RenderableWebEntityItem.cpp | 29 ---------------- .../src/RenderableWebEntityItem.h | 23 ++----------- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 33 +++++++++++++++++++ libraries/gl/src/gl/OffscreenQmlSurface.h | 25 ++++++++++++++ 4 files changed, 60 insertions(+), 50 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index cc022d9df2..e821a3b582 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -38,35 +38,6 @@ static uint64_t MAX_NO_RENDER_INTERVAL = 30 * USECS_PER_SECOND; static int MAX_WINDOW_SIZE = 4096; static float OPAQUE_ALPHA_THRESHOLD = 0.99f; -void WebEntityAPIHelper::synthesizeKeyPress(QString key) { - if (_renderableWebEntityItem) { - _renderableWebEntityItem->synthesizeKeyPress(key); - } -} - -void WebEntityAPIHelper::emitScriptEvent(const QVariant& message) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "emitScriptEvent", Qt::QueuedConnection, Q_ARG(QVariant, message)); - } else { - emit scriptEventReceived(message); - } -} - -void WebEntityAPIHelper::emitWebEvent(const QVariant& message) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "emitWebEvent", Qt::QueuedConnection, Q_ARG(QVariant, message)); - } else { - // special case to handle raising and lowering the virtual keyboard - if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD" && _renderableWebEntityItem) { - _renderableWebEntityItem->setKeyboardRaised(true); - } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD" && _renderableWebEntityItem) { - _renderableWebEntityItem->setKeyboardRaised(false); - } else { - emit webEventReceived(message); - } - } -} - EntityItemPointer RenderableWebEntityItem::factory(const EntityItemID& entityID, const EntityItemProperties& properties) { EntityItemPointer entity{ new RenderableWebEntityItem(entityID) }; entity->setProperties(properties); diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index 47808c4262..3a4a5293e7 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -13,36 +13,18 @@ #include #include #include +#include #include #include "RenderableEntityItem.h" -class OffscreenQmlSurface; + class QWindow; class QObject; class EntityTreeRenderer; class RenderableWebEntityItem; -class WebEntityAPIHelper : public QObject { - Q_OBJECT -public: - void setRenderableWebEntityItem(RenderableWebEntityItem* renderableWebEntityItem) { - _renderableWebEntityItem = renderableWebEntityItem; - } - Q_INVOKABLE void synthesizeKeyPress(QString key); - - // event bridge -public slots: - void emitScriptEvent(const QVariant& scriptMessage); - void emitWebEvent(const QVariant& webMessage); -signals: - void scriptEventReceived(const QVariant& message); - void webEventReceived(const QVariant& message); - -protected: - RenderableWebEntityItem* _renderableWebEntityItem{ nullptr }; -}; class RenderableWebEntityItem : public WebEntityItem { public: @@ -86,7 +68,6 @@ private: QTouchEvent _lastTouchEvent { QEvent::TouchUpdate }; uint64_t _lastRenderTime{ 0 }; QTouchDevice _touchDevice; - WebEntityAPIHelper* _webEntityAPIHelper; QMetaObject::Connection _mousePressConnection; QMetaObject::Connection _mouseReleaseConnection; diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 5ab2678474..0dd0a4b13c 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -829,4 +829,37 @@ void OffscreenQmlSurface::setFocusText(bool newFocusText) { } } + +void WebEntityAPIHelper::synthesizeKeyPress(QString key) { + if (_renderableWebEntityItem) { + _renderableWebEntityItem->synthesizeKeyPress(key); + } +} + +void WebEntityAPIHelper::emitScriptEvent(const QVariant& message) { + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "emitScriptEvent", Qt::QueuedConnection, Q_ARG(QVariant, message)); + } else { + emit scriptEventReceived(message); + } +} + +void WebEntityAPIHelper::emitWebEvent(const QVariant& message) { + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "emitWebEvent", Qt::QueuedConnection, Q_ARG(QVariant, message)); + } else { + // special case to handle raising and lowering the virtual keyboard + if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD" && _renderableWebEntityItem) { + _renderableWebEntityItem->setKeyboardRaised(true); + } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD" && _renderableWebEntityItem) { + _renderableWebEntityItem->setKeyboardRaised(false); + } else { + emit webEventReceived(message); + } + } +} + + + + #include "OffscreenQmlSurface.moc" diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index a4a5ecba7e..77ced00db6 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -28,6 +28,28 @@ class QQuickItem; class OffscreenQmlRenderThread; + +class WebEntityAPIHelper : public QObject { + Q_OBJECT +public: + void setRenderableWebEntityItem(RenderableWebEntityItem* renderableWebEntityItem) { + _renderableWebEntityItem = renderableWebEntityItem; + } + Q_INVOKABLE void synthesizeKeyPress(QString key); + + // event bridge +public slots: + void emitScriptEvent(const QVariant& scriptMessage); + void emitWebEvent(const QVariant& webMessage); +signals: + void scriptEventReceived(const QVariant& message); + void webEventReceived(const QVariant& message); + +protected: + RenderableWebEntityItem* _renderableWebEntityItem{ nullptr }; +}; + + class OffscreenQmlSurface : public QObject { Q_OBJECT Q_PROPERTY(bool focusText READ isFocusText NOTIFY focusTextChanged) @@ -69,6 +91,9 @@ public: QPointF mapToVirtualScreen(const QPointF& originalPoint, QObject* originalWidget); bool eventFilter(QObject* originalDestination, QEvent* event) override; + // XXX make private + WebEntityAPIHelper* _webEntityAPIHelper; + signals: void textureUpdated(unsigned int texture); void focusObjectChanged(QObject* newFocus); From 02dba2fe49fa3e099aefd5ea896b553ee60e4bbe Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Sep 2016 11:23:37 -0700 Subject: [PATCH 012/300] started to move WebEntityAPIHelper from RenderableWebEntityItem to OffscreenQmlSurface --- .../src/RenderableWebEntityItem.cpp | 68 +--------------- .../src/RenderableWebEntityItem.h | 4 - libraries/gl/src/gl/OffscreenQmlSurface.cpp | 79 +++++++++++++++++-- libraries/gl/src/gl/OffscreenQmlSurface.h | 11 ++- 4 files changed, 83 insertions(+), 79 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index e821a3b582..bcaafee862 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -53,20 +53,14 @@ RenderableWebEntityItem::RenderableWebEntityItem(const EntityItemID& entityItemI _touchDevice.setName("RenderableWebEntityItemTouchDevice"); _touchDevice.setMaximumTouchPoints(4); - _webEntityAPIHelper = new WebEntityAPIHelper; - _webEntityAPIHelper->setRenderableWebEntityItem(this); - _webEntityAPIHelper->moveToThread(qApp->thread()); - // forward web events to EntityScriptingInterface auto entities = DependencyManager::get(); - QObject::connect(_webEntityAPIHelper, &WebEntityAPIHelper::webEventReceived, [=](const QVariant& message) { + QObject::connect(_webSurface->_webEntityAPIHelper, &WebEntityAPIHelper::webEventReceived, [=](const QVariant& message) { emit entities->webEventReceived(entityItemID, message); }); } RenderableWebEntityItem::~RenderableWebEntityItem() { - _webEntityAPIHelper->setRenderableWebEntityItem(nullptr); - _webEntityAPIHelper->deleteLater(); destroyWebSurface(); qDebug() << "Destroyed web entity " << getID(); } @@ -103,10 +97,8 @@ bool RenderableWebEntityItem::buildWebSurface(EntityTreeRenderer* renderer) { context->setContextProperty("eventBridgeJavaScriptToInject", QVariant(javaScriptToInject)); }); _webSurface->resume(); - _webSurface->getRootItem()->setProperty("eventBridge", QVariant::fromValue(_webEntityAPIHelper)); _webSurface->getRootItem()->setProperty("url", _sourceUrl); _webSurface->getRootContext()->setContextProperty("desktop", QVariant()); - _webSurface->getRootContext()->setContextProperty("webEntity", _webEntityAPIHelper); _connection = QObject::connect(_webSurface, &OffscreenQmlSurface::textureUpdated, [&](GLuint textureId) { _texture = textureId; }); @@ -343,62 +335,6 @@ bool RenderableWebEntityItem::isTransparent() { return fadeRatio < OPAQUE_ALPHA_THRESHOLD; } -// UTF-8 encoded symbols -static const uint8_t UPWARDS_WHITE_ARROW_FROM_BAR[] = { 0xE2, 0x87, 0xAA, 0x00 }; // shift -static const uint8_t LEFT_ARROW[] = { 0xE2, 0x86, 0x90, 0x00 }; // backspace -static const uint8_t LEFTWARD_WHITE_ARROW[] = { 0xE2, 0x87, 0xA6, 0x00 }; // left arrow -static const uint8_t RIGHTWARD_WHITE_ARROW[] = { 0xE2, 0x87, 0xA8, 0x00 }; // right arrow -static const uint8_t ASTERISIM[] = { 0xE2, 0x81, 0x82, 0x00 }; // symbols -static const uint8_t RETURN_SYMBOL[] = { 0xE2, 0x8F, 0x8E, 0x00 }; // return -static const char PUNCTUATION_STRING[] = "&123"; -static const char ALPHABET_STRING[] = "abc"; - -static bool equals(const QByteArray& byteArray, const uint8_t* ptr) { - int i; - for (i = 0; i < byteArray.size(); i++) { - if ((char)ptr[i] != byteArray[i]) { - return false; - } - } - return ptr[i] == 0x00; -} - -void RenderableWebEntityItem::synthesizeKeyPress(QString key) { - auto utf8Key = key.toUtf8(); - - int scanCode = (int)utf8Key[0]; - QString keyString = key; - if (equals(utf8Key, UPWARDS_WHITE_ARROW_FROM_BAR) || equals(utf8Key, ASTERISIM) || - equals(utf8Key, (uint8_t*)PUNCTUATION_STRING) || equals(utf8Key, (uint8_t*)ALPHABET_STRING)) { - return; // ignore - } else if (equals(utf8Key, LEFT_ARROW)) { - scanCode = Qt::Key_Backspace; - keyString = "\x08"; - } else if (equals(utf8Key, RETURN_SYMBOL)) { - scanCode = Qt::Key_Return; - keyString = "\x0d"; - } else if (equals(utf8Key, LEFTWARD_WHITE_ARROW)) { - scanCode = Qt::Key_Left; - keyString = ""; - } else if (equals(utf8Key, RIGHTWARD_WHITE_ARROW)) { - scanCode = Qt::Key_Right; - keyString = ""; - } - - QKeyEvent* pressEvent = new QKeyEvent(QEvent::KeyPress, scanCode, Qt::NoModifier, keyString); - QKeyEvent* releaseEvent = new QKeyEvent(QEvent::KeyRelease, scanCode, Qt::NoModifier, keyString); - QCoreApplication::postEvent(getEventHandler(), pressEvent); - QCoreApplication::postEvent(getEventHandler(), releaseEvent); -} - void RenderableWebEntityItem::emitScriptEvent(const QVariant& message) { - _webEntityAPIHelper->emitScriptEvent(message); -} - -void RenderableWebEntityItem::setKeyboardRaised(bool raised) { - - // raise the keyboard only while in HMD mode and it's being requested. - bool value = AbstractViewStateInterface::instance()->isHMDMode() && raised; - - _webSurface->getRootItem()->setProperty("keyboardRaised", QVariant(value)); + _webSurface->_webEntityAPIHelper->emitScriptEvent(message); } diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index 3a4a5293e7..4ae771f24d 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -46,15 +46,11 @@ public: bool needsToCallUpdate() const override { return _webSurface != nullptr; } virtual void emitScriptEvent(const QVariant& message) override; - void setKeyboardRaised(bool raised); SIMPLE_RENDERABLE(); virtual bool isTransparent() override; -public: - void synthesizeKeyPress(QString key); - private: bool buildWebSurface(EntityTreeRenderer* renderer); void destroyWebSurface(); diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 0dd0a4b13c..6fcdee2812 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -419,6 +419,9 @@ bool OffscreenQmlRenderThread::allowNewFrame(uint8_t fps) { } OffscreenQmlSurface::OffscreenQmlSurface() { + _webEntityAPIHelper = new WebEntityAPIHelper; + _webEntityAPIHelper->setOffscreenQmlSurface(this); + _webEntityAPIHelper->moveToThread(qApp->thread()); } static const uint64_t MAX_SHUTDOWN_WAIT_SECS = 2; @@ -432,6 +435,9 @@ OffscreenQmlSurface::~OffscreenQmlSurface() { qWarning() << "Failed to shut down the QML Renderer Thread"; } + _webEntityAPIHelper->setOffscreenQmlSurface(nullptr); + _webEntityAPIHelper->deleteLater(); + delete _rootItem; delete _renderer; delete _qmlComponent; @@ -754,6 +760,9 @@ void OffscreenQmlSurface::pause() { void OffscreenQmlSurface::resume() { _paused = false; requestRender(); + + getRootItem()->setProperty("eventBridge", QVariant::fromValue(_webEntityAPIHelper)); + getRootContext()->setContextProperty("webEntity", _webEntityAPIHelper); } bool OffscreenQmlSurface::isPaused() const { @@ -829,10 +838,68 @@ void OffscreenQmlSurface::setFocusText(bool newFocusText) { } } +// UTF-8 encoded symbols +static const uint8_t UPWARDS_WHITE_ARROW_FROM_BAR[] = { 0xE2, 0x87, 0xAA, 0x00 }; // shift +static const uint8_t LEFT_ARROW[] = { 0xE2, 0x86, 0x90, 0x00 }; // backspace +static const uint8_t LEFTWARD_WHITE_ARROW[] = { 0xE2, 0x87, 0xA6, 0x00 }; // left arrow +static const uint8_t RIGHTWARD_WHITE_ARROW[] = { 0xE2, 0x87, 0xA8, 0x00 }; // right arrow +static const uint8_t ASTERISIM[] = { 0xE2, 0x81, 0x82, 0x00 }; // symbols +static const uint8_t RETURN_SYMBOL[] = { 0xE2, 0x8F, 0x8E, 0x00 }; // return +static const char PUNCTUATION_STRING[] = "&123"; +static const char ALPHABET_STRING[] = "abc"; + +static bool equals(const QByteArray& byteArray, const uint8_t* ptr) { + int i; + for (i = 0; i < byteArray.size(); i++) { + if ((char)ptr[i] != byteArray[i]) { + return false; + } + } + return ptr[i] == 0x00; +} + +void OffscreenQmlSurface::synthesizeKeyPress(QString key) { + auto utf8Key = key.toUtf8(); + + int scanCode = (int)utf8Key[0]; + QString keyString = key; + if (equals(utf8Key, UPWARDS_WHITE_ARROW_FROM_BAR) || equals(utf8Key, ASTERISIM) || + equals(utf8Key, (uint8_t*)PUNCTUATION_STRING) || equals(utf8Key, (uint8_t*)ALPHABET_STRING)) { + return; // ignore + } else if (equals(utf8Key, LEFT_ARROW)) { + scanCode = Qt::Key_Backspace; + keyString = "\x08"; + } else if (equals(utf8Key, RETURN_SYMBOL)) { + scanCode = Qt::Key_Return; + keyString = "\x0d"; + } else if (equals(utf8Key, LEFTWARD_WHITE_ARROW)) { + scanCode = Qt::Key_Left; + keyString = ""; + } else if (equals(utf8Key, RIGHTWARD_WHITE_ARROW)) { + scanCode = Qt::Key_Right; + keyString = ""; + } + + QKeyEvent* pressEvent = new QKeyEvent(QEvent::KeyPress, scanCode, Qt::NoModifier, keyString); + QKeyEvent* releaseEvent = new QKeyEvent(QEvent::KeyRelease, scanCode, Qt::NoModifier, keyString); + QCoreApplication::postEvent(getEventHandler(), pressEvent); + QCoreApplication::postEvent(getEventHandler(), releaseEvent); +} + +void OffscreenQmlSurface::setKeyboardRaised(bool raised) { + + // raise the keyboard only while in HMD mode and it's being requested. + // XXX + // bool value = AbstractViewStateInterface::instance()->isHMDMode() && raised; + // getRootItem()->setProperty("keyboardRaised", QVariant(value)); + + getRootItem()->setProperty("keyboardRaised", QVariant(raised)); + +} void WebEntityAPIHelper::synthesizeKeyPress(QString key) { - if (_renderableWebEntityItem) { - _renderableWebEntityItem->synthesizeKeyPress(key); + if (_offscreenQmlSurface) { + _offscreenQmlSurface->synthesizeKeyPress(key); } } @@ -849,10 +916,10 @@ void WebEntityAPIHelper::emitWebEvent(const QVariant& message) { QMetaObject::invokeMethod(this, "emitWebEvent", Qt::QueuedConnection, Q_ARG(QVariant, message)); } else { // special case to handle raising and lowering the virtual keyboard - if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD" && _renderableWebEntityItem) { - _renderableWebEntityItem->setKeyboardRaised(true); - } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD" && _renderableWebEntityItem) { - _renderableWebEntityItem->setKeyboardRaised(false); + if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD" && _offscreenQmlSurface) { + _offscreenQmlSurface->setKeyboardRaised(true); + } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD" && _offscreenQmlSurface) { + _offscreenQmlSurface->setKeyboardRaised(false); } else { emit webEventReceived(message); } diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index 77ced00db6..5c7444c947 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -27,13 +27,14 @@ class QQuickWindow; class QQuickItem; class OffscreenQmlRenderThread; +class OffscreenQmlSurface; class WebEntityAPIHelper : public QObject { Q_OBJECT public: - void setRenderableWebEntityItem(RenderableWebEntityItem* renderableWebEntityItem) { - _renderableWebEntityItem = renderableWebEntityItem; + void setOffscreenQmlSurface(OffscreenQmlSurface* renderableWebEntityItem) { + _offscreenQmlSurface = renderableWebEntityItem; } Q_INVOKABLE void synthesizeKeyPress(QString key); @@ -46,7 +47,7 @@ signals: void webEventReceived(const QVariant& message); protected: - RenderableWebEntityItem* _renderableWebEntityItem{ nullptr }; + OffscreenQmlSurface* _offscreenQmlSurface{ nullptr }; }; @@ -91,6 +92,10 @@ public: QPointF mapToVirtualScreen(const QPointF& originalPoint, QObject* originalWidget); bool eventFilter(QObject* originalDestination, QEvent* event) override; + void setKeyboardRaised(bool raised); + void synthesizeKeyPress(QString key); + + // XXX make private WebEntityAPIHelper* _webEntityAPIHelper; From 123ac541eaed95211f684cecb27e371a0f518363 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Sep 2016 11:31:48 -0700 Subject: [PATCH 013/300] started to move WebEntityAPIHelper from RenderableWebEntityItem to OffscreenQmlSurface --- .../src/RenderableWebEntityItem.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index bcaafee862..8ff9187adf 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -52,12 +52,6 @@ RenderableWebEntityItem::RenderableWebEntityItem(const EntityItemID& entityItemI _touchDevice.setType(QTouchDevice::TouchScreen); _touchDevice.setName("RenderableWebEntityItemTouchDevice"); _touchDevice.setMaximumTouchPoints(4); - - // forward web events to EntityScriptingInterface - auto entities = DependencyManager::get(); - QObject::connect(_webSurface->_webEntityAPIHelper, &WebEntityAPIHelper::webEventReceived, [=](const QVariant& message) { - emit entities->webEventReceived(entityItemID, message); - }); } RenderableWebEntityItem::~RenderableWebEntityItem() { @@ -102,6 +96,14 @@ bool RenderableWebEntityItem::buildWebSurface(EntityTreeRenderer* renderer) { _connection = QObject::connect(_webSurface, &OffscreenQmlSurface::textureUpdated, [&](GLuint textureId) { _texture = textureId; }); + + // forward web events to EntityScriptingInterface + auto entities = DependencyManager::get(); + const EntityItemID entityItemID = getID(); + QObject::connect(_webSurface->_webEntityAPIHelper, &WebEntityAPIHelper::webEventReceived, [=](const QVariant& message) { + emit entities->webEventReceived(entityItemID, message); + }); + // Restore the original GL context currentContext->makeCurrent(currentSurface); @@ -161,15 +163,10 @@ void RenderableWebEntityItem::render(RenderArgs* args) { #endif if (!_webSurface) { - #if defined(Q_OS_LINUX) - // these don't seem to work on Linux - return; - #else if (!buildWebSurface(static_cast(args->_renderer))) { return; } _fadeStartTime = usecTimestampNow(); - #endif } _lastRenderTime = usecTimestampNow(); From e5b56fec7c6b189937b03a17e826f1a9da7ffa4a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Sep 2016 11:32:17 -0700 Subject: [PATCH 014/300] put keyboard on location dialog --- interface/resources/qml/AddressBarDialog.qml | 38 ++++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 2536fdade9..646c6bf2f0 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -18,6 +18,9 @@ import "hifi/toolbars" import "controls-uit" as HifiControls Window { + property bool keyboardRaised: true + property bool punctuationMode: false + id: root HifiConstants { id: hifi } @@ -68,7 +71,7 @@ Window { AddressBarDialog { id: addressBarDialog implicitWidth: backgroundImage.width - implicitHeight: backgroundImage.height + implicitHeight: backgroundImage.height + (keyboardRaised ? 200 : 0) // The buttons have their button state changed on hover, so we have to manually fix them up here onBackEnabledChanged: backArrow.buttonState = addressBarDialog.backEnabled ? 1 : 0; onForwardEnabledChanged: forwardArrow.buttonState = addressBarDialog.forwardEnabled ? 1 : 0; @@ -217,8 +220,8 @@ Window { } Window { - width: 938; - height: 625; + width: 938 + height: 625 scale: 0.8 // Reset scale of Window to 1.0 (counteract address bar's scale value of 1.25) HifiControls.WebView { anchors.fill: parent; @@ -235,6 +238,35 @@ Window { horizontalCenter: scroll.horizontalCenter; } } + + // virtual keyboard, letters + Keyboard { + id: keyboard1 + y: keyboardRaised ? parent.height : 0 + height: keyboardRaised ? 200 : 0 + visible: keyboardRaised && !punctuationMode + enabled: keyboardRaised && !punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + } + + KeyboardPunctuation { + id: keyboard2 + y: keyboardRaised ? parent.height : 0 + height: keyboardRaised ? 200 : 0 + visible: keyboardRaised && punctuationMode + enabled: keyboardRaised && punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + } } From f6398315b1aedaf80b9e1f714df17807bb9370cd Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Sep 2016 11:48:14 -0700 Subject: [PATCH 015/300] avoid a crash-on-exit --- interface/src/Application.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 904a6c5b65..92ebd6b045 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -486,7 +486,7 @@ bool setupEssentials(int& argc, char** argv) { // FIXME move to header, or better yet, design some kind of UI manager // to take care of highlighting keyboard focused items, rather than // continuing to overburden Application.cpp -Cube3DOverlay* _keyboardFocusHighlight{ nullptr }; +std::shared_ptr _keyboardFocusHighlight{ nullptr }; int _keyboardFocusHighlightID{ -1 }; @@ -3587,7 +3587,7 @@ void Application::setKeyboardFocusEntity(EntityItemID entityItemID) { _keyboardFocusedItem.set(entityItemID); _lastAcceptedKeyPress = usecTimestampNow(); if (_keyboardFocusHighlightID < 0 || !getOverlays().isAddedOverlay(_keyboardFocusHighlightID)) { - _keyboardFocusHighlight = new Cube3DOverlay(); + _keyboardFocusHighlight = std::make_shared(); _keyboardFocusHighlight->setAlpha(1.0f); _keyboardFocusHighlight->setBorderSize(1.0f); _keyboardFocusHighlight->setColor({ 0xFF, 0xEF, 0x00 }); From dd39d468838fb46bad5192f6fae58c9d842ab6ee Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Sep 2016 13:41:09 -0700 Subject: [PATCH 016/300] fold WebEntityAPIHelper members into OffscreenQmlSurface --- .../src/RenderableWebEntityItem.cpp | 8 ++-- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 40 +++++++----------- libraries/gl/src/gl/OffscreenQmlSurface.h | 41 ++++++------------- 3 files changed, 29 insertions(+), 60 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index 8ff9187adf..e6ebbf7668 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -100,7 +100,7 @@ bool RenderableWebEntityItem::buildWebSurface(EntityTreeRenderer* renderer) { // forward web events to EntityScriptingInterface auto entities = DependencyManager::get(); const EntityItemID entityItemID = getID(); - QObject::connect(_webSurface->_webEntityAPIHelper, &WebEntityAPIHelper::webEventReceived, [=](const QVariant& message) { + QObject::connect(_webSurface, &OffscreenQmlSurface::webEventReceived, [=](const QVariant& message) { emit entities->webEventReceived(entityItemID, message); }); @@ -308,7 +308,7 @@ void RenderableWebEntityItem::destroyWebSurface() { // The lifetime of the QML surface MUST be managed by the main thread // Additionally, we MUST use local variables copied by value, rather than - // member variables, since they would implicitly refer to a this that + // member variables, since they would implicitly refer to a this that // is no longer valid auto webSurface = _webSurface; AbstractViewStateInterface::instance()->postLambdaEvent([webSurface] { @@ -318,7 +318,6 @@ void RenderableWebEntityItem::destroyWebSurface() { } } - void RenderableWebEntityItem::update(const quint64& now) { auto interval = now - _lastRenderTime; if (interval > MAX_NO_RENDER_INTERVAL) { @@ -326,12 +325,11 @@ void RenderableWebEntityItem::update(const quint64& now) { } } - bool RenderableWebEntityItem::isTransparent() { float fadeRatio = _isFading ? Interpolate::calculateFadeRatio(_fadeStartTime) : 1.0f; return fadeRatio < OPAQUE_ALPHA_THRESHOLD; } void RenderableWebEntityItem::emitScriptEvent(const QVariant& message) { - _webSurface->_webEntityAPIHelper->emitScriptEvent(message); + _webSurface->emitScriptEvent(message); } diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 6fcdee2812..fe25940198 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -419,9 +419,7 @@ bool OffscreenQmlRenderThread::allowNewFrame(uint8_t fps) { } OffscreenQmlSurface::OffscreenQmlSurface() { - _webEntityAPIHelper = new WebEntityAPIHelper; - _webEntityAPIHelper->setOffscreenQmlSurface(this); - _webEntityAPIHelper->moveToThread(qApp->thread()); + // moveToThread(qApp->thread()); } static const uint64_t MAX_SHUTDOWN_WAIT_SECS = 2; @@ -435,9 +433,6 @@ OffscreenQmlSurface::~OffscreenQmlSurface() { qWarning() << "Failed to shut down the QML Renderer Thread"; } - _webEntityAPIHelper->setOffscreenQmlSurface(nullptr); - _webEntityAPIHelper->deleteLater(); - delete _rootItem; delete _renderer; delete _qmlComponent; @@ -540,13 +535,13 @@ QObject* OffscreenQmlSurface::load(const QUrl& qmlSource, std::functionloadUrl(qmlSource, QQmlComponent::PreferSynchronous); if (_qmlComponent->isLoading()) { - connect(_qmlComponent, &QQmlComponent::statusChanged, this, + connect(_qmlComponent, &QQmlComponent::statusChanged, this, [this, f](QQmlComponent::Status){ finishQmlLoad(f); }); return nullptr; } - + return finishQmlLoad(f); } @@ -588,7 +583,7 @@ QObject* OffscreenQmlSurface::finishQmlLoad(std::function(newObject); if (newItem) { - // Make sure we make items focusable (critical for + // Make sure we make items focusable (critical for // supporting keyboard shortcuts) newItem->setFlag(QQuickItem::ItemIsFocusScope, true); } @@ -616,11 +611,11 @@ QObject* OffscreenQmlSurface::finishQmlLoad(std::function_rendering || !_renderer->allowNewFrame(_maxFps)) { return; } @@ -691,7 +686,6 @@ bool OffscreenQmlSurface::eventFilter(QObject* originalDestination, QEvent* even } #endif - switch (event->type()) { case QEvent::Resize: { QResizeEvent* resizeEvent = static_cast(event); @@ -761,8 +755,8 @@ void OffscreenQmlSurface::resume() { _paused = false; requestRender(); - getRootItem()->setProperty("eventBridge", QVariant::fromValue(_webEntityAPIHelper)); - getRootContext()->setContextProperty("webEntity", _webEntityAPIHelper); + getRootItem()->setProperty("eventBridge", QVariant::fromValue(this)); + getRootContext()->setContextProperty("webEntity", this); } bool OffscreenQmlSurface::isPaused() const { @@ -897,13 +891,7 @@ void OffscreenQmlSurface::setKeyboardRaised(bool raised) { } -void WebEntityAPIHelper::synthesizeKeyPress(QString key) { - if (_offscreenQmlSurface) { - _offscreenQmlSurface->synthesizeKeyPress(key); - } -} - -void WebEntityAPIHelper::emitScriptEvent(const QVariant& message) { +void OffscreenQmlSurface::emitScriptEvent(const QVariant& message) { if (QThread::currentThread() != thread()) { QMetaObject::invokeMethod(this, "emitScriptEvent", Qt::QueuedConnection, Q_ARG(QVariant, message)); } else { @@ -911,15 +899,15 @@ void WebEntityAPIHelper::emitScriptEvent(const QVariant& message) { } } -void WebEntityAPIHelper::emitWebEvent(const QVariant& message) { +void OffscreenQmlSurface::emitWebEvent(const QVariant& message) { if (QThread::currentThread() != thread()) { QMetaObject::invokeMethod(this, "emitWebEvent", Qt::QueuedConnection, Q_ARG(QVariant, message)); } else { // special case to handle raising and lowering the virtual keyboard - if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD" && _offscreenQmlSurface) { - _offscreenQmlSurface->setKeyboardRaised(true); - } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD" && _offscreenQmlSurface) { - _offscreenQmlSurface->setKeyboardRaised(false); + if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD") { + setKeyboardRaised(true); + } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD") { + setKeyboardRaised(false); } else { emit webEventReceived(message); } diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index 5c7444c947..ecdf3fbef5 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -25,31 +25,7 @@ class QQmlContext; class QQmlComponent; class QQuickWindow; class QQuickItem; - class OffscreenQmlRenderThread; -class OffscreenQmlSurface; - - -class WebEntityAPIHelper : public QObject { - Q_OBJECT -public: - void setOffscreenQmlSurface(OffscreenQmlSurface* renderableWebEntityItem) { - _offscreenQmlSurface = renderableWebEntityItem; - } - Q_INVOKABLE void synthesizeKeyPress(QString key); - - // event bridge -public slots: - void emitScriptEvent(const QVariant& scriptMessage); - void emitWebEvent(const QVariant& webMessage); -signals: - void scriptEventReceived(const QVariant& message); - void webEventReceived(const QVariant& message); - -protected: - OffscreenQmlSurface* _offscreenQmlSurface{ nullptr }; -}; - class OffscreenQmlSurface : public QObject { Q_OBJECT @@ -92,13 +68,10 @@ public: QPointF mapToVirtualScreen(const QPointF& originalPoint, QObject* originalWidget); bool eventFilter(QObject* originalDestination, QEvent* event) override; - void setKeyboardRaised(bool raised); - void synthesizeKeyPress(QString key); + Q_INVOKABLE void setKeyboardRaised(bool raised); + Q_INVOKABLE void synthesizeKeyPress(QString key); - // XXX make private - WebEntityAPIHelper* _webEntityAPIHelper; - signals: void textureUpdated(unsigned int texture); void focusObjectChanged(QObject* newFocus); @@ -109,6 +82,16 @@ public slots: void requestRender(); void onAboutToQuit(); + + // event bridge +public slots: + void emitScriptEvent(const QVariant& scriptMessage); + void emitWebEvent(const QVariant& webMessage); +signals: + void scriptEventReceived(const QVariant& message); + void webEventReceived(const QVariant& message); + + protected: bool filterEnabled(QObject* originalDestination, QEvent* event) const; void setFocusText(bool newFocusText); From c396196e0f068b6f9c0e5c34ed1faf50111d6cc1 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Sep 2016 16:48:46 -0700 Subject: [PATCH 017/300] show and hide keyboard for qml windows --- interface/resources/qml/AddressBarDialog.qml | 5 ++- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 34 +++++++++++++++++--- libraries/gl/src/gl/OffscreenQmlSurface.h | 6 ++-- 3 files changed, 37 insertions(+), 8 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 646c6bf2f0..e743031465 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -18,7 +18,7 @@ import "hifi/toolbars" import "controls-uit" as HifiControls Window { - property bool keyboardRaised: true + property bool keyboardRaised: false property bool punctuationMode: false id: root @@ -70,6 +70,7 @@ Window { AddressBarDialog { id: addressBarDialog + objectName: "AddressBarDialogDialog" implicitWidth: backgroundImage.width implicitHeight: backgroundImage.height + (keyboardRaised ? 200 : 0) // The buttons have their button state changed on hover, so we have to manually fix them up here @@ -126,6 +127,7 @@ Window { } Image { id: backgroundImage + objectName: "AddressBarDialogImage" source: "../images/address-bar.svg" width: 576 * root.scale height: 80 * root.scale @@ -175,6 +177,7 @@ Window { TextInput { id: addressLine focus: true + objectName: "AddressBarDialogTextInput" anchors { top: parent.top bottom: parent.bottom diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index fe25940198..4e7200c6c7 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -814,15 +814,29 @@ QVariant OffscreenQmlSurface::returnFromUiThread(std::function funct return function(); } +void OffscreenQmlSurface::focusDestroyed(QObject *obj) { + _currentFocusItem = nullptr; +} + void OffscreenQmlSurface::onFocusObjectChanged(QObject* object) { - if (!object) { + QQuickItem* item = dynamic_cast(object); + if (!item) { setFocusText(false); + _currentFocusItem = nullptr; return; } QInputMethodQueryEvent query(Qt::ImEnabled); qApp->sendEvent(object, &query); setFocusText(query.value(Qt::ImEnabled).toBool()); + + if (_currentFocusItem) { + disconnect(_currentFocusItem, &QObject::destroyed, this, 0); + setKeyboardRaised(_currentFocusItem, false); + } + setKeyboardRaised(item, item->hasActiveFocus()); + _currentFocusItem = item; + connect(_currentFocusItem, &QObject::destroyed, this, &OffscreenQmlSurface::focusDestroyed); } void OffscreenQmlSurface::setFocusText(bool newFocusText) { @@ -880,15 +894,25 @@ void OffscreenQmlSurface::synthesizeKeyPress(QString key) { QCoreApplication::postEvent(getEventHandler(), releaseEvent); } -void OffscreenQmlSurface::setKeyboardRaised(bool raised) { +void OffscreenQmlSurface::setKeyboardRaised(QObject* object, bool raised) { // raise the keyboard only while in HMD mode and it's being requested. // XXX // bool value = AbstractViewStateInterface::instance()->isHMDMode() && raised; // getRootItem()->setProperty("keyboardRaised", QVariant(value)); - getRootItem()->setProperty("keyboardRaised", QVariant(raised)); + if (!object) { + return; + } + QQuickItem* item = dynamic_cast(object); + while (item) { + if (item->property("keyboardRaised").isValid()) { + item->setProperty("keyboardRaised", QVariant(raised)); + return; + } + item = dynamic_cast(item->parentItem()); + } } void OffscreenQmlSurface::emitScriptEvent(const QVariant& message) { @@ -905,9 +929,9 @@ void OffscreenQmlSurface::emitWebEvent(const QVariant& message) { } else { // special case to handle raising and lowering the virtual keyboard if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD") { - setKeyboardRaised(true); + setKeyboardRaised(getRootItem(), true); } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD") { - setKeyboardRaised(false); + setKeyboardRaised(getRootItem(), false); } else { emit webEventReceived(message); } diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index ecdf3fbef5..bd83d4f41d 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -68,7 +68,7 @@ public: QPointF mapToVirtualScreen(const QPointF& originalPoint, QObject* originalWidget); bool eventFilter(QObject* originalDestination, QEvent* event) override; - Q_INVOKABLE void setKeyboardRaised(bool raised); + void setKeyboardRaised(QObject* object, bool raised); Q_INVOKABLE void synthesizeKeyPress(QString key); @@ -81,7 +81,7 @@ public slots: void requestUpdate(); void requestRender(); void onAboutToQuit(); - + void focusDestroyed(QObject *obj); // event bridge public slots: @@ -119,6 +119,8 @@ private: uint8_t _maxFps{ 60 }; MouseTranslator _mouseTranslator{ [](const QPointF& p) { return p.toPoint(); } }; QWindow* _proxyWindow { nullptr }; + + QQuickItem* _currentFocusItem { nullptr }; }; #endif From 44af3b43cc53437fe870bbbfff23f7e9b69f4f9a Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 9 Sep 2016 17:02:11 -0700 Subject: [PATCH 018/300] fix property access --- interface/resources/qml/AddressBarDialog.qml | 23 ++++++++++---------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index e743031465..f257999dd9 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -18,9 +18,6 @@ import "hifi/toolbars" import "controls-uit" as HifiControls Window { - property bool keyboardRaised: false - property bool punctuationMode: false - id: root HifiConstants { id: hifi } @@ -71,6 +68,10 @@ Window { AddressBarDialog { id: addressBarDialog objectName: "AddressBarDialogDialog" + + property bool keyboardRaised: false + property bool punctuationMode: false + implicitWidth: backgroundImage.width implicitHeight: backgroundImage.height + (keyboardRaised ? 200 : 0) // The buttons have their button state changed on hover, so we have to manually fix them up here @@ -245,10 +246,10 @@ Window { // virtual keyboard, letters Keyboard { id: keyboard1 - y: keyboardRaised ? parent.height : 0 - height: keyboardRaised ? 200 : 0 - visible: keyboardRaised && !punctuationMode - enabled: keyboardRaised && !punctuationMode + y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode anchors.right: parent.right anchors.rightMargin: 0 anchors.left: parent.left @@ -259,10 +260,10 @@ Window { KeyboardPunctuation { id: keyboard2 - y: keyboardRaised ? parent.height : 0 - height: keyboardRaised ? 200 : 0 - visible: keyboardRaised && punctuationMode - enabled: keyboardRaised && punctuationMode + y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode anchors.right: parent.right anchors.rightMargin: 0 anchors.left: parent.left From 38a1556716bf46d36e2daa5cc63339c66ad0f940 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 12 Sep 2016 13:28:46 -0700 Subject: [PATCH 019/300] qml keyboard for running-scripts window --- .../qml/hifi/dialogs/RunningScripts.qml | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/hifi/dialogs/RunningScripts.qml b/interface/resources/qml/hifi/dialogs/RunningScripts.qml index 3f05a140ae..e1db3bc02f 100644 --- a/interface/resources/qml/hifi/dialogs/RunningScripts.qml +++ b/interface/resources/qml/hifi/dialogs/RunningScripts.qml @@ -16,6 +16,7 @@ import Qt.labs.settings 1.0 import "../../styles-uit" import "../../controls-uit" as HifiControls import "../../windows" +import "../../controls" ScrollingWindow { id: root @@ -92,6 +93,9 @@ ScrollingWindow { } Column { + property bool keyboardRaised: false + property bool punctuationMode: false + width: pane.contentWidth HifiControls.ContentSection { @@ -353,6 +357,28 @@ ScrollingWindow { visible: !isHMD } } + + // virtual keyboard, letters + Keyboard { + id: keyboard1 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + } + + KeyboardPunctuation { + id: keyboard2 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + } } } - From 4c370d0d32db74940935d09b28a1f5103d44bae3 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 12 Sep 2016 15:31:07 -0700 Subject: [PATCH 020/300] qml keyboard for query-dialog --- .../resources/qml/dialogs/QueryDialog.qml | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/dialogs/QueryDialog.qml b/interface/resources/qml/dialogs/QueryDialog.qml index 05cb347169..865c2f1bd7 100644 --- a/interface/resources/qml/dialogs/QueryDialog.qml +++ b/interface/resources/qml/dialogs/QueryDialog.qml @@ -15,6 +15,7 @@ import QtQuick.Dialogs 1.2 as OriginalDialogs import "../controls-uit" import "../styles-uit" import "../windows" +import "../controls" as Controls ModalWindow { id: root @@ -53,11 +54,17 @@ ModalWindow { } Item { + id: modalWindowItem clip: true width: pane.width height: pane.height anchors.margins: 0 + property bool keyboardRaised: false + property bool punctuationMode: false + + onKeyboardRaisedChanged: d.resize(); + QtObject { id: d readonly property int minWidth: 480 @@ -69,14 +76,14 @@ ModalWindow { var targetWidth = Math.max(titleWidth, pane.width) var targetHeight = (items ? comboBox.controlHeight : textResult.controlHeight) + 5 * hifi.dimensions.contentSpacing.y + buttons.height root.width = (targetWidth < d.minWidth) ? d.minWidth : ((targetWidth > d.maxWdith) ? d.maxWidth : targetWidth) - root.height = (targetHeight < d.minHeight) ? d.minHeight: ((targetHeight > d.maxHeight) ? d.maxHeight : targetHeight) + root.height = ((targetHeight < d.minHeight) ? d.minHeight: ((targetHeight > d.maxHeight) ? d.maxHeight : targetHeight)) + (modalWindowItem.keyboardRaised ? (200 + 2 * hifi.dimensions.contentSpacing.y) : 0) } } Item { anchors { top: parent.top - bottom: buttons.top; + bottom: keyboard1.top; left: parent.left; right: parent.right; margins: 0 @@ -110,6 +117,35 @@ ModalWindow { } } + // virtual keyboard, letters + Controls.Keyboard { + id: keyboard1 + y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: buttons.top + anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + + Controls.KeyboardPunctuation { + id: keyboard2 + y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: buttons.top + anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + Flow { id: buttons focus: true From 3e86b2f0f284d42a7b8f22adb723a514d4fdd9b8 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 12 Sep 2016 15:34:29 -0700 Subject: [PATCH 021/300] remove some unneeded objectNames --- interface/resources/qml/AddressBarDialog.qml | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index f257999dd9..66e613ff4d 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -67,7 +67,6 @@ Window { AddressBarDialog { id: addressBarDialog - objectName: "AddressBarDialogDialog" property bool keyboardRaised: false property bool punctuationMode: false @@ -128,7 +127,6 @@ Window { } Image { id: backgroundImage - objectName: "AddressBarDialogImage" source: "../images/address-bar.svg" width: 576 * root.scale height: 80 * root.scale @@ -178,7 +176,6 @@ Window { TextInput { id: addressLine focus: true - objectName: "AddressBarDialogTextInput" anchors { top: parent.top bottom: parent.bottom From b841e3094d02f8260cbc59ec798ff153080b40c4 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 12 Sep 2016 16:23:05 -0700 Subject: [PATCH 022/300] qml keyboard for file dialog --- .../resources/qml/dialogs/FileDialog.qml | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/dialogs/FileDialog.qml b/interface/resources/qml/dialogs/FileDialog.qml index ff8be580db..86804099e0 100644 --- a/interface/resources/qml/dialogs/FileDialog.qml +++ b/interface/resources/qml/dialogs/FileDialog.qml @@ -19,6 +19,7 @@ import ".." import "../controls-uit" import "../styles-uit" import "../windows" +import "../controls" as Controls import "fileDialog" @@ -27,7 +28,7 @@ ModalWindow { id: root resizable: true implicitWidth: 480 - implicitHeight: 360 + implicitHeight: 360 + (fileDialogItem.keyboardRaised ? 200 + (2 * hifi.dimensions.contentSpacing.y) : 0) minSize: Qt.vector2d(360, 240) draggable: true @@ -100,11 +101,16 @@ ModalWindow { } Item { + id: fileDialogItem clip: true width: pane.width height: pane.height anchors.margins: 0 + property bool keyboardRaised: false + property bool punctuationMode: false + + MouseArea { // Clear selection when click on internal unused area. anchors.fill: parent @@ -619,7 +625,7 @@ ModalWindow { left: parent.left right: selectionType.visible ? selectionType.left: parent.right rightMargin: selectionType.visible ? hifi.dimensions.contentSpacing.x : 0 - bottom: buttonRow.top + bottom: keyboard1.top bottomMargin: hifi.dimensions.contentSpacing.y } readOnly: !root.saveDialog @@ -640,6 +646,36 @@ ModalWindow { KeyNavigation.right: openButton } + + // virtual keyboard, letters + Controls.Keyboard { + id: keyboard1 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: buttonRow.top + anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + + Controls.KeyboardPunctuation { + id: keyboard2 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: buttonRow.top + anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + Row { id: buttonRow anchors { From 2c0676d9b1bf5446d33eb27a092d8a4993a2f2ba Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 12 Sep 2016 16:28:24 -0700 Subject: [PATCH 023/300] make qml keyboard work better in running-scripts dialog --- interface/resources/qml/hifi/dialogs/RunningScripts.qml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/hifi/dialogs/RunningScripts.qml b/interface/resources/qml/hifi/dialogs/RunningScripts.qml index e1db3bc02f..043e454f46 100644 --- a/interface/resources/qml/hifi/dialogs/RunningScripts.qml +++ b/interface/resources/qml/hifi/dialogs/RunningScripts.qml @@ -24,8 +24,8 @@ ScrollingWindow { title: "Running Scripts" resizable: true destroyOnHidden: true - implicitWidth: 424 - implicitHeight: isHMD ? 695 : 728 + implicitWidth: 480 + implicitHeight: (isHMD ? 695 : 728) + (runningScriptsColumn.keyboardRaised ? 200 + (2 * hifi.dimensions.contentSpacing.y) : 0) minSize: Qt.vector2d(424, 300) HifiConstants { id: hifi } @@ -93,6 +93,8 @@ ScrollingWindow { } Column { + id: runningScriptsColumn + property bool keyboardRaised: false property bool punctuationMode: false From 753e4c4c7bc079ab463ff2ce2dacaae1b60388da Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 12 Sep 2016 16:49:10 -0700 Subject: [PATCH 024/300] keyboard for avatar attachment model url dialog --- .../hifi/dialogs/attachments/Attachment.qml | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml b/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml index 6d371741ea..730ab367fa 100644 --- a/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml +++ b/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml @@ -9,6 +9,7 @@ import ".." import "../../../styles-uit" import "../../../controls-uit" as HifiControls import "../../../windows" +import "../../../controls" as Controls Item { height: column.height + 2 * 8 @@ -34,6 +35,9 @@ Item { anchors { left: parent.left; right: parent.right; margins: 20 } spacing: 8 + property bool keyboardRaised: false + property bool punctuationMode: false + Item { height: modelChooserButton.height + urlLabel.height + 4 anchors { left: parent.left; right: parent.right;} @@ -71,6 +75,35 @@ Item { } } + // virtual keyboard, letters + Controls.Keyboard { + id: keyboard1 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + // anchors.bottom: buttonRow.top + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + + Controls.KeyboardPunctuation { + id: keyboard2 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + // anchors.bottom: buttonRow.top + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + Item { height: jointChooser.height + jointLabel.height + 4 anchors { left: parent.left; right: parent.right; } From 161424afaf7164abfd5501b21c60ead6e3a787e0 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Mon, 12 Sep 2016 21:39:52 -0700 Subject: [PATCH 025/300] qml keyboard for browsable preferences --- .../preferences/BrowsablePreference.qml | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml b/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml index 2cf50891c9..2e5ea7578c 100644 --- a/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml +++ b/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml @@ -12,12 +12,17 @@ import QtQuick 2.5 import "../../dialogs" import "../../controls-uit" +import "../../controls" as Controls + Preference { id: root property alias text: dataTextField.text property alias placeholderText: dataTextField.placeholderText - height: control.height + hifi.dimensions.controlInterlineHeight + height: control.height + hifi.dimensions.controlInterlineHeight + (keyboardRaised ? 200 : 0) + + property bool keyboardRaised: false + property bool punctuationMode: false Component.onCompleted: { dataTextField.text = preference.value; @@ -33,7 +38,7 @@ Preference { anchors { left: parent.left right: parent.right - bottom: parent.bottom + bottom: keyboard1.top } height: Math.max(dataTextField.controlHeight, button.height) @@ -76,4 +81,35 @@ Preference { } } } + + // virtual keyboard, letters + Controls.Keyboard { + id: keyboard1 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + + Controls.KeyboardPunctuation { + id: keyboard2 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } } From dff567054dc0d2f4891fc5b60138b3c94d58628c Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 13 Sep 2016 11:17:00 -0700 Subject: [PATCH 026/300] qml keyboard for avatar preferences dialog --- .../dialogs/preferences/AvatarPreference.qml | 39 +++++++++- .../preferences/BrowsablePreference.qml | 73 ++++++++++--------- .../preferences/EditablePreference.qml | 58 +++++++++++++-- 3 files changed, 126 insertions(+), 44 deletions(-) diff --git a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml index 8f05ca4ffe..16a96f791f 100644 --- a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml +++ b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml @@ -12,6 +12,7 @@ import QtQuick 2.5 import "../../dialogs" import "../../controls-uit" +import "../../controls" as Controls Preference { id: root @@ -53,12 +54,16 @@ Preference { Item { id: control + + property bool keyboardRaised: false + property bool punctuationMode: false + anchors { left: parent.left right: parent.right bottom: parent.bottom } - height: Math.max(dataTextField.controlHeight, button.height) + height: Math.max(dataTextField.controlHeight, button.height) + (keyboardRaised ? 200 : 0) TextField { id: dataTextField @@ -69,7 +74,7 @@ Preference { left: parent.left right: button.left rightMargin: hifi.dimensions.contentSpacing.x - bottom: parent.bottom + bottom: keyboard1.top } colorScheme: hifi.colorSchemes.dark } @@ -94,5 +99,35 @@ Preference { } } + // virtual keyboard, letters + Controls.Keyboard { + id: keyboard1 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + + Controls.KeyboardPunctuation { + id: keyboard2 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } } } diff --git a/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml b/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml index 2e5ea7578c..4989c57694 100644 --- a/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml +++ b/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml @@ -19,10 +19,7 @@ Preference { id: root property alias text: dataTextField.text property alias placeholderText: dataTextField.placeholderText - height: control.height + hifi.dimensions.controlInterlineHeight + (keyboardRaised ? 200 : 0) - - property bool keyboardRaised: false - property bool punctuationMode: false + height: control.height + hifi.dimensions.controlInterlineHeight Component.onCompleted: { dataTextField.text = preference.value; @@ -35,12 +32,16 @@ Preference { Item { id: control + + property bool keyboardRaised: false + property bool punctuationMode: false + anchors { left: parent.left right: parent.right - bottom: keyboard1.top + bottom: parent.bottom } - height: Math.max(dataTextField.controlHeight, button.height) + height: Math.max(dataTextField.controlHeight, button.height) + (keyboardRaised ? 200 : 0) TextField { id: dataTextField @@ -49,7 +50,7 @@ Preference { left: parent.left right: button.left rightMargin: hifi.dimensions.contentSpacing.x - bottom: parent.bottom + bottom: keyboard1.top } label: root.label @@ -80,36 +81,36 @@ Preference { }); } } - } - // virtual keyboard, letters - Controls.Keyboard { - id: keyboard1 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && !parent.punctuationMode - enabled: parent.keyboardRaised && !parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } + // virtual keyboard, letters + Controls.Keyboard { + id: keyboard1 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } - Controls.KeyboardPunctuation { - id: keyboard2 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && parent.punctuationMode - enabled: parent.keyboardRaised && parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + Controls.KeyboardPunctuation { + id: keyboard2 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } } } diff --git a/interface/resources/qml/dialogs/preferences/EditablePreference.qml b/interface/resources/qml/dialogs/preferences/EditablePreference.qml index 8acf8e1f76..40df94dd9f 100644 --- a/interface/resources/qml/dialogs/preferences/EditablePreference.qml +++ b/interface/resources/qml/dialogs/preferences/EditablePreference.qml @@ -12,10 +12,11 @@ import QtQuick 2.5 import "../../dialogs" import "../../controls-uit" +import "../../controls" as Controls Preference { id: root - height: dataTextField.controlHeight + hifi.dimensions.controlInterlineHeight + height: dataTextField.controlHeight + hifi.dimensions.controlInterlineHeight + (editablePreferenceColumn.keyboardRaised ? 200 : 0) Component.onCompleted: { dataTextField.text = preference.value; @@ -26,16 +27,61 @@ Preference { preference.save(); } - TextField { - id: dataTextField - placeholderText: preference.placeholderText - label: root.label - colorScheme: hifi.colorSchemes.dark + Column { + id: editablePreferenceColumn + height: dataTextField.height + (keyboardRaised ? 200 : 0) + + property bool keyboardRaised: false + property bool punctuationMode: false anchors { left: parent.left right: parent.right bottom: parent.bottom } + + TextField { + id: dataTextField + placeholderText: preference.placeholderText + label: root.label + colorScheme: hifi.colorSchemes.dark + + anchors { + left: parent.left + right: parent.right + // bottom: keyboard1.bottom + } + } + + // virtual keyboard, letters + Controls.Keyboard { + id: keyboard1 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + // anchors.bottom: parent.bottom + // anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + + Controls.KeyboardPunctuation { + id: keyboard2 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + // anchors.bottom: parent.bottom + // anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } } } From 92bda6827b73ea74db8bc5bcca6c6adb34430044 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 13 Sep 2016 11:27:10 -0700 Subject: [PATCH 027/300] remove vive keyboard --- plugins/openvr/src/OpenVrHelpers.cpp | 82 ++-------------------------- 1 file changed, 6 insertions(+), 76 deletions(-) diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index 820476191a..f5e36492bd 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -44,7 +44,7 @@ static const uint32_t RELEASE_OPENVR_HMD_DELAY_MS = 5000; bool isOculusPresent() { bool result = false; -#if defined(Q_OS_WIN32) +#if defined(Q_OS_WIN32) HANDLE oculusServiceEvent = ::OpenEventW(SYNCHRONIZE, FALSE, L"OculusHMDConnected"); // The existence of the service indicates a running Oculus runtime if (oculusServiceEvent) { @@ -54,7 +54,7 @@ bool isOculusPresent() { } ::CloseHandle(oculusServiceEvent); } -#endif +#endif return result; } @@ -123,65 +123,12 @@ static bool _keyboardShown { false }; static bool _overlayRevealed { false }; static const uint32_t SHOW_KEYBOARD_DELAY_MS = 400; -void showOpenVrKeyboard(bool show = true) { - if (!_overlay) { - return; - } - - if (show) { - // To avoid flickering the keyboard when a text element is only briefly selected, - // show the keyboard asynchrnously after a very short delay, but only after we check - // that the current focus object is still one that is text enabled - QTimer::singleShot(SHOW_KEYBOARD_DELAY_MS, [] { - auto offscreenUi = DependencyManager::get(); - auto currentFocus = offscreenUi->getWindow()->focusObject(); - QInputMethodQueryEvent query(Qt::ImEnabled | Qt::ImQueryInput | Qt::ImHints); - qApp->sendEvent(currentFocus, &query); - // Current focus isn't text enabled, bail early. - if (!query.value(Qt::ImEnabled).toBool()) { - return; - } - // We're going to show the keyboard now... - _keyboardFocusObject = currentFocus; - _currentHints = Qt::InputMethodHints(query.value(Qt::ImHints).toUInt()); - vr::EGamepadTextInputMode inputMode = vr::k_EGamepadTextInputModeNormal; - if (_currentHints & Qt::ImhHiddenText) { - inputMode = vr::k_EGamepadTextInputModePassword; - } - vr::EGamepadTextInputLineMode lineMode = vr::k_EGamepadTextInputLineModeSingleLine; - if (_currentHints & Qt::ImhMultiLine) { - lineMode = vr::k_EGamepadTextInputLineModeMultipleLines; - } - _existingText = query.value(Qt::ImSurroundingText).toString(); - - auto showKeyboardResult = _overlay->ShowKeyboard(inputMode, lineMode, "Keyboard", 1024, - _existingText.toLocal8Bit().toStdString().c_str(), false, 0); - - if (vr::VROverlayError_None == showKeyboardResult) { - _keyboardShown = true; - // Try to position the keyboard slightly below where the user is looking. - mat4 headPose = cancelOutRollAndPitch(toGlm(_nextSimPoseData.vrPoses[0].mDeviceToAbsoluteTracking)); - mat4 keyboardTransform = glm::translate(headPose, vec3(0, -0.5, -1)); - keyboardTransform = keyboardTransform * glm::rotate(mat4(), 3.14159f / 4.0f, vec3(-1, 0, 0)); - auto keyboardTransformVr = toOpenVr(keyboardTransform); - _overlay->SetKeyboardTransformAbsolute(vr::ETrackingUniverseOrigin::TrackingUniverseStanding, &keyboardTransformVr); - } - }); - } else { - _keyboardFocusObject = nullptr; - if (_keyboardShown) { - _overlay->HideKeyboard(); - _keyboardShown = false; - } - } -} - void updateFromOpenVrKeyboardInput() { auto chars = _overlay->GetKeyboardText(textArray, 8192); auto newText = QString(QByteArray(textArray, chars)); _keyboardFocusObject->setProperty("text", newText); //// TODO modify the new text to match the possible input hints: - //// ImhDigitsOnly ImhFormattedNumbersOnly ImhUppercaseOnly ImhLowercaseOnly + //// ImhDigitsOnly ImhFormattedNumbersOnly ImhUppercaseOnly ImhLowercaseOnly //// ImhDialableCharactersOnly ImhEmailCharactersOnly ImhUrlCharactersOnly ImhLatinOnly //QInputMethodEvent event(_existingText, QList()); //event.setCommitString(newText, 0, _existingText.size()); @@ -208,11 +155,11 @@ void enableOpenVrKeyboard(PluginContainer* container) { auto offscreenUi = DependencyManager::get(); _overlay = vr::VROverlay(); - + auto menu = container->getPrimaryMenu(); auto action = menu->getActionForOption(MenuOption::Overlays); - // When the overlays are revealed, suppress the keyboard from appearing on text focus for a tenth of a second. + // When the overlays are revealed, suppress the keyboard from appearing on text focus for a tenth of a second. _overlayMenuConnection = QObject::connect(action, &QAction::triggered, [action] { if (action->isChecked()) { _overlayRevealed = true; @@ -220,23 +167,6 @@ void enableOpenVrKeyboard(PluginContainer* container) { QTimer::singleShot(KEYBOARD_DELAY_MS, [&] { _overlayRevealed = false; }); } }); - - _focusConnection = QObject::connect(offscreenUi->getWindow(), &QQuickWindow::focusObjectChanged, [](QObject* object) { - if (object != _keyboardFocusObject) { - showOpenVrKeyboard(false); - } - }); - - _focusTextConnection = QObject::connect(offscreenUi.data(), &OffscreenUi::focusTextChanged, [](bool focusText) { - if (_openVrDisplayActive) { - if (_overlayRevealed) { - // suppress at most one text focus event - _overlayRevealed = false; - return; - } - showOpenVrKeyboard(focusText); - } - }); } @@ -276,7 +206,7 @@ void handleOpenVrEvents() { updateFromOpenVrKeyboardInput(); break; - case vr::VREvent_KeyboardDone: + case vr::VREvent_KeyboardDone: finishOpenVrKeyboardInput(); // FALL THROUGH From 447de7cd5a41ce07b8ca1ab37e4c1d241d408f9e Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 13 Sep 2016 16:31:59 -0700 Subject: [PATCH 028/300] qml keyboard for edit.js window --- interface/resources/qml/ToolWindow.qml | 195 +++++++++++++++---------- 1 file changed, 120 insertions(+), 75 deletions(-) diff --git a/interface/resources/qml/ToolWindow.qml b/interface/resources/qml/ToolWindow.qml index f6a4600e06..59ef7520f5 100644 --- a/interface/resources/qml/ToolWindow.qml +++ b/interface/resources/qml/ToolWindow.qml @@ -18,6 +18,8 @@ import Qt.labs.settings 1.0 import "windows" import "controls-uit" import "styles-uit" +import "controls" as Controls + ScrollingWindow { id: toolWindow @@ -47,92 +49,135 @@ ScrollingWindow { property alias y: toolWindow.y } - TabView { - id: tabView; + Item { + id: toolWindowTabViewItem + height: pane.scrollHeight width: pane.contentWidth - height: pane.scrollHeight // Pane height so that don't use Window's scrollbars otherwise tabs may be scrolled out of view. - property int tabCount: 0 + anchors.left: parent.left + anchors.top: parent.top - Repeater { - model: 4 - Tab { - // Force loading of the content even if the tab is not visible - // (required for letting the C++ code access the webview) - active: true - enabled: false - property string originalUrl: ""; + property bool keyboardRaised: false + property bool punctuationMode: false - WebView { - id: webView; - anchors.fill: parent + TabView { + id: tabView; + width: pane.contentWidth + // Pane height so that don't use Window's scrollbars otherwise tabs may be scrolled out of view. + height: pane.scrollHeight - (toolWindowTabViewItem.keyboardRaised ? 200 : 0) + property int tabCount: 0 + + Repeater { + model: 4 + Tab { + // Force loading of the content even if the tab is not visible + // (required for letting the C++ code access the webview) + active: true enabled: false - property alias eventBridgeWrapper: eventBridgeWrapper - - QtObject { - id: eventBridgeWrapper - WebChannel.id: "eventBridgeWrapper" - property var eventBridge; + property string originalUrl: ""; + + WebView { + id: webView; + anchors.fill: parent + enabled: false + property alias eventBridgeWrapper: eventBridgeWrapper + + QtObject { + id: eventBridgeWrapper + WebChannel.id: "eventBridgeWrapper" + property var eventBridge; + } + + webChannel.registeredObjects: [eventBridgeWrapper] + onEnabledChanged: toolWindow.updateVisiblity(); + } + } + } + + style: TabViewStyle { + + frame: Rectangle { // Background shown before content loads. + anchors.fill: parent + color: hifi.colors.baseGray + } + + frameOverlap: 0 + + tab: Rectangle { + implicitWidth: text.width + implicitHeight: 3 * text.height + color: styleData.selected ? hifi.colors.black : hifi.colors.tabBackgroundDark + + RalewayRegular { + id: text + text: styleData.title + font.capitalization: Font.AllUppercase + size: hifi.fontSizes.tabName + width: tabView.tabCount > 1 ? styleData.availableWidth / tabView.tabCount : implicitWidth + 2 * hifi.dimensions.contentSpacing.x + elide: Text.ElideRight + color: styleData.selected ? hifi.colors.primaryHighlight : hifi.colors.lightGrayText + horizontalAlignment: Text.AlignHCenter + anchors.centerIn: parent } - webChannel.registeredObjects: [eventBridgeWrapper] - onEnabledChanged: toolWindow.updateVisiblity(); + Rectangle { // Separator. + width: 1 + height: parent.height + color: hifi.colors.black + anchors.left: parent.left + anchors.top: parent.top + visible: styleData.index > 0 + + Rectangle { + width: 1 + height: 1 + color: hifi.colors.baseGray + anchors.left: parent.left + anchors.bottom: parent.bottom + } + } + + Rectangle { // Active underline. + width: parent.width - (styleData.index > 0 ? 1 : 0) + height: 1 + anchors.right: parent.right + anchors.bottom: parent.bottom + color: styleData.selected ? hifi.colors.primaryHighlight : hifi.colors.baseGray + } } + + tabOverlap: 0 } } - style: TabViewStyle { + // virtual keyboard, letters + Controls.Keyboard { + id: keyboard1 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } - frame: Rectangle { // Background shown before content loads. - anchors.fill: parent - color: hifi.colors.baseGray - } - - frameOverlap: 0 - - tab: Rectangle { - implicitWidth: text.width - implicitHeight: 3 * text.height - color: styleData.selected ? hifi.colors.black : hifi.colors.tabBackgroundDark - - RalewayRegular { - id: text - text: styleData.title - font.capitalization: Font.AllUppercase - size: hifi.fontSizes.tabName - width: tabView.tabCount > 1 ? styleData.availableWidth / tabView.tabCount : implicitWidth + 2 * hifi.dimensions.contentSpacing.x - elide: Text.ElideRight - color: styleData.selected ? hifi.colors.primaryHighlight : hifi.colors.lightGrayText - horizontalAlignment: Text.AlignHCenter - anchors.centerIn: parent - } - - Rectangle { // Separator. - width: 1 - height: parent.height - color: hifi.colors.black - anchors.left: parent.left - anchors.top: parent.top - visible: styleData.index > 0 - - Rectangle { - width: 1 - height: 1 - color: hifi.colors.baseGray - anchors.left: parent.left - anchors.bottom: parent.bottom - } - } - - Rectangle { // Active underline. - width: parent.width - (styleData.index > 0 ? 1 : 0) - height: 1 - anchors.right: parent.right - anchors.bottom: parent.bottom - color: styleData.selected ? hifi.colors.primaryHighlight : hifi.colors.baseGray - } - } - - tabOverlap: 0 + Controls.KeyboardPunctuation { + id: keyboard2 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y } } From 23450e929bb7927d4c9be20fcda5b471ad5055c8 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 13 Sep 2016 14:21:43 -0700 Subject: [PATCH 029/300] Add special avatar id for attaching overlays --- interface/src/Application.cpp | 39 ++++++++++--------- interface/src/Application.h | 2 +- interface/src/InterfaceParentFinder.cpp | 8 ++++ interface/src/Menu.cpp | 30 +++++++------- interface/src/avatar/AvatarActionHold.cpp | 2 +- interface/src/avatar/AvatarManager.cpp | 5 ++- interface/src/avatar/AvatarManager.h | 2 +- .../src/scripting/HMDScriptingInterface.cpp | 2 +- interface/src/ui/OverlayConductor.cpp | 6 +-- interface/src/ui/PreferencesDialog.cpp | 2 +- interface/src/ui/Stats.cpp | 2 +- interface/src/ui/overlays/OverlaysPayload.cpp | 2 +- libraries/shared/src/SpatiallyNestable.cpp | 2 +- 13 files changed, 58 insertions(+), 46 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ec0a2687ba..1361938fbb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -671,10 +671,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : // send a location update immediately discoverabilityManager->updateLocation(); + auto myAvatar = getMyAvatar(); + connect(nodeList.data(), &NodeList::nodeAdded, this, &Application::nodeAdded); connect(nodeList.data(), &NodeList::nodeKilled, this, &Application::nodeKilled); connect(nodeList.data(), &NodeList::nodeActivated, this, &Application::nodeActivated); - connect(nodeList.data(), &NodeList::uuidChanged, getMyAvatar(), &MyAvatar::setSessionUUID); + connect(nodeList.data(), &NodeList::uuidChanged, myAvatar.get(), &MyAvatar::setSessionUUID); connect(nodeList.data(), &NodeList::uuidChanged, this, &Application::setSessionUUID); connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &Application::notifyPacketVersionMismatch); @@ -704,7 +706,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : connect(this, &Application::activeDisplayPluginChanged, this, &Application::updateThreadPoolCount); // Save avatar location immediately after a teleport. - connect(getMyAvatar(), &MyAvatar::positionGoneTo, + connect(myAvatar.get(), &MyAvatar::positionGoneTo, DependencyManager::get().data(), &AddressManager::storeCurrentAddress); auto scriptEngines = DependencyManager::get().data(); @@ -741,7 +743,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : connect(&_entityEditSender, &EntityEditPacketSender::packetSent, this, &Application::packetSent); // send the identity packet for our avatar each second to our avatar mixer - connect(&identityPacketTimer, &QTimer::timeout, getMyAvatar(), &MyAvatar::sendIdentityPacket); + connect(&identityPacketTimer, &QTimer::timeout, myAvatar.get(), &MyAvatar::sendIdentityPacket); identityPacketTimer.start(AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS); const char** constArgv = const_cast(argv); @@ -820,7 +822,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : // Tell our entity edit sender about our known jurisdictions _entityEditSender.setServerJurisdictions(&_entityServerJurisdictions); - _entityEditSender.setMyAvatar(getMyAvatar()); + _entityEditSender.setMyAvatar(myAvatar.get()); // For now we're going to set the PPS for outbound packets to be super high, this is // probably not the right long term solution. But for now, we're going to do this to @@ -841,7 +843,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : bandwidthRecorder.data(), &BandwidthRecorder::updateInboundData); // FIXME -- I'm a little concerned about this. - connect(getMyAvatar()->getSkeletonModel().get(), &SkeletonModel::skeletonLoaded, + connect(myAvatar->getSkeletonModel().get(), &SkeletonModel::skeletonLoaded, this, &Application::checkSkeleton, Qt::QueuedConnection); // Setup the userInputMapper with the actions @@ -1055,7 +1057,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : applicationUpdater->checkForUpdate(); // Now that menu is initialized we can sync myAvatar with it's state. - getMyAvatar()->updateMotionBehaviorFromMenu(); + myAvatar->updateMotionBehaviorFromMenu(); // FIXME spacemouse code still needs cleanup #if 0 @@ -1090,10 +1092,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : static int SEND_STATS_INTERVAL_MS = 10000; static int NEARBY_AVATAR_RADIUS_METERS = 10; - static glm::vec3 lastAvatarPosition = getMyAvatar()->getPosition(); + static glm::vec3 lastAvatarPosition = myAvatar->getPosition(); static glm::mat4 lastHMDHeadPose = getHMDSensorPose(); - static controller::Pose lastLeftHandPose = getMyAvatar()->getLeftHandPose(); - static controller::Pose lastRightHandPose = getMyAvatar()->getRightHandPose(); + static controller::Pose lastLeftHandPose = myAvatar->getLeftHandPose(); + static controller::Pose lastRightHandPose = myAvatar->getRightHandPose(); // Periodically send fps as a user activity event QTimer* sendStatsTimer = new QTimer(this); @@ -1141,7 +1143,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : properties["throttled"] = _displayPlugin ? _displayPlugin->isThrottled() : false; - glm::vec3 avatarPosition = getMyAvatar()->getPosition(); + auto myAvatar = getMyAvatar(); + glm::vec3 avatarPosition = myAvatar->getPosition(); properties["avatar_has_moved"] = lastAvatarPosition != avatarPosition; lastAvatarPosition = avatarPosition; @@ -1156,8 +1159,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : properties["hmd_head_pose_changed"] = isHMDMode() && (hmdHeadPose != lastHMDHeadPose); lastHMDHeadPose = hmdHeadPose; - auto leftHandPose = getMyAvatar()->getLeftHandPose(); - auto rightHandPose = getMyAvatar()->getRightHandPose(); + auto leftHandPose = myAvatar->getLeftHandPose(); + auto rightHandPose = myAvatar->getRightHandPose(); // controller::Pose considers two poses to be different if either are invalid. In our case, we actually // want to consider the pose to be unchanged if it was invalid and still is invalid, so we check that first. properties["hand_pose_changed"] = @@ -1204,7 +1207,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : OctreeEditPacketSender* packetSender = entityScriptingInterface->getPacketSender(); EntityEditPacketSender* entityPacketSender = static_cast(packetSender); - entityPacketSender->setMyAvatar(getMyAvatar()); + entityPacketSender->setMyAvatar(myAvatar.get()); connect(this, &Application::applicationStateChanged, this, &Application::activeChanged); qCDebug(interfaceapp, "Startup time: %4.2f seconds.", (double)startupTimer.elapsed() / 1000.0); @@ -1581,7 +1584,7 @@ void Application::initializeUi() { FileScriptingInterface* fileDownload = new FileScriptingInterface(engine); rootContext->setContextProperty("File", fileDownload); connect(fileDownload, &FileScriptingInterface::unzipSuccess, this, &Application::showAssetServerWidget); - rootContext->setContextProperty("MyAvatar", getMyAvatar()); + rootContext->setContextProperty("MyAvatar", getMyAvatar().get()); rootContext->setContextProperty("Messages", DependencyManager::get().data()); rootContext->setContextProperty("Recording", DependencyManager::get().data()); rootContext->setContextProperty("Preferences", DependencyManager::get().data()); @@ -3331,7 +3334,7 @@ void Application::init() { entity->setCollisionSound(sound); } }, Qt::QueuedConnection); - connect(getMyAvatar(), &MyAvatar::newCollisionSoundURL, this, [this](QUrl newURL) { + connect(getMyAvatar().get(), &MyAvatar::newCollisionSoundURL, this, [this](QUrl newURL) { if (auto avatar = getMyAvatar()) { auto sound = DependencyManager::get()->getSound(newURL); avatar->setCollisionSound(sound); @@ -3387,7 +3390,7 @@ void Application::updateMyAvatarLookAtPosition() { } } else { AvatarSharedPointer lookingAt = myAvatar->getLookAtTargetAvatar().lock(); - if (lookingAt && myAvatar != lookingAt.get()) { + if (lookingAt && myAvatar.get() != lookingAt.get()) { // If I am looking at someone else, look directly at one of their eyes isLookingAtSomeone = true; auto lookingAtHead = static_pointer_cast(lookingAt)->getHead(); @@ -4236,7 +4239,7 @@ PickRay Application::computePickRay(float x, float y) const { return result; } -MyAvatar* Application::getMyAvatar() const { +std::shared_ptr Application::getMyAvatar() const { return DependencyManager::get()->getMyAvatar(); } @@ -4824,7 +4827,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri scriptEngine->registerGlobalObject("Rates", new RatesScriptingInterface(this)); // hook our avatar and avatar hash map object into this script engine - scriptEngine->registerGlobalObject("MyAvatar", getMyAvatar()); + scriptEngine->registerGlobalObject("MyAvatar", getMyAvatar().get()); qScriptRegisterMetaType(scriptEngine, audioListenModeToScriptValue, audioListenModeFromScriptValue); scriptEngine->registerGlobalObject("AvatarList", DependencyManager::get().data()); diff --git a/interface/src/Application.h b/interface/src/Application.h index 02682defca..dd4610453b 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -401,7 +401,7 @@ private: int sendNackPackets(); - MyAvatar* getMyAvatar() const; + std::shared_ptr getMyAvatar() const; void checkSkeleton() const; diff --git a/interface/src/InterfaceParentFinder.cpp b/interface/src/InterfaceParentFinder.cpp index b1db63debd..7c6c23616d 100644 --- a/interface/src/InterfaceParentFinder.cpp +++ b/interface/src/InterfaceParentFinder.cpp @@ -13,9 +13,12 @@ #include #include #include +#include #include "InterfaceParentFinder.h" + + SpatiallyNestableWeakPointer InterfaceParentFinder::find(QUuid parentID, bool& success, SpatialParentTree* entityTree) const { SpatiallyNestableWeakPointer parent; @@ -45,6 +48,11 @@ SpatiallyNestableWeakPointer InterfaceParentFinder::find(QUuid parentID, bool& s return parent; } + if (parentID == AVATAR_SELF_ID) { + success = true; + return avatarManager->getMyAvatar(); + } + success = false; return parent; } diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 08abbf63d2..79033dbff7 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -166,7 +166,7 @@ Menu::Menu() { // Avatar menu ---------------------------------- MenuWrapper* avatarMenu = addMenu("Avatar"); auto avatarManager = DependencyManager::get(); - QObject* avatar = avatarManager->getMyAvatar(); + auto avatar = avatarManager->getMyAvatar(); // Avatar > Attachments... auto action = addActionToQMenuAndActionHash(avatarMenu, MenuOption::Attachments); @@ -182,19 +182,19 @@ Menu::Menu() { addActionToQMenuAndActionHash(avatarSizeMenu, MenuOption::IncreaseAvatarSize, 0, // QML Qt::Key_Plus, - avatar, SLOT(increaseSize())); + avatar.get(), SLOT(increaseSize())); // Avatar > Size > Decrease addActionToQMenuAndActionHash(avatarSizeMenu, MenuOption::DecreaseAvatarSize, 0, // QML Qt::Key_Minus, - avatar, SLOT(decreaseSize())); + avatar.get(), SLOT(decreaseSize())); // Avatar > Size > Reset addActionToQMenuAndActionHash(avatarSizeMenu, MenuOption::ResetAvatarSize, 0, // QML Qt::Key_Equal, - avatar, SLOT(resetSize())); + avatar.get(), SLOT(resetSize())); // Avatar > Reset Sensors addActionToQMenuAndActionHash(avatarMenu, @@ -486,38 +486,38 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderOtherLookAtVectors, 0, false); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::FixGaze, 0, false); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawDefaultPose, 0, false, - avatar, SLOT(setEnableDebugDrawDefaultPose(bool))); + avatar.get(), SLOT(setEnableDebugDrawDefaultPose(bool))); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawAnimPose, 0, false, - avatar, SLOT(setEnableDebugDrawAnimPose(bool))); + avatar.get(), SLOT(setEnableDebugDrawAnimPose(bool))); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::AnimDebugDrawPosition, 0, false, - avatar, SLOT(setEnableDebugDrawPosition(bool))); + avatar.get(), SLOT(setEnableDebugDrawPosition(bool))); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::MeshVisible, 0, true, - avatar, SLOT(setEnableMeshVisible(bool))); + avatar.get(), SLOT(setEnableMeshVisible(bool))); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::DisableEyelidAdjustment, 0, false); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::TurnWithHead, 0, false); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::UseAnimPreAndPostRotations, 0, true, - avatar, SLOT(setUseAnimPreAndPostRotations(bool))); + avatar.get(), SLOT(setUseAnimPreAndPostRotations(bool))); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::EnableInverseKinematics, 0, true, - avatar, SLOT(setEnableInverseKinematics(bool))); + avatar.get(), SLOT(setEnableInverseKinematics(bool))); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::RenderSensorToWorldMatrix, 0, false, - avatar, SLOT(setEnableDebugDrawSensorToWorldMatrix(bool))); + avatar.get(), SLOT(setEnableDebugDrawSensorToWorldMatrix(bool))); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ActionMotorControl, - Qt::CTRL | Qt::SHIFT | Qt::Key_K, true, avatar, SLOT(updateMotionBehaviorFromMenu()), + Qt::CTRL | Qt::SHIFT | Qt::Key_K, true, avatar.get(), SLOT(updateMotionBehaviorFromMenu()), UNSPECIFIED_POSITION, "Developer"); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::ScriptedMotorControl, 0, true, - avatar, SLOT(updateMotionBehaviorFromMenu()), + avatar.get(), SLOT(updateMotionBehaviorFromMenu()), UNSPECIFIED_POSITION, "Developer"); addCheckableActionToQMenuAndActionHash(avatarDebugMenu, MenuOption::EnableCharacterController, 0, true, - avatar, SLOT(updateMotionBehaviorFromMenu()), + avatar.get(), SLOT(updateMotionBehaviorFromMenu()), UNSPECIFIED_POSITION, "Developer"); // Developer > Hands >>> MenuWrapper* handOptionsMenu = developerMenu->addMenu("Hands"); addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::DisplayHandTargets, 0, false, - avatar, SLOT(setEnableDebugDrawHandControllers(bool))); + avatar.get(), SLOT(setEnableDebugDrawHandControllers(bool))); addCheckableActionToQMenuAndActionHash(handOptionsMenu, MenuOption::LowVelocityFilter, 0, true, qApp, SLOT(setLowVelocityFilter(bool))); diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index 51171b9c6b..20d27fe548 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -37,7 +37,7 @@ AvatarActionHold::~AvatarActionHold() { } bool AvatarActionHold::getAvatarRigidBodyLocation(glm::vec3& avatarRigidBodyPosition, glm::quat& avatarRigidBodyRotation) { - MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); + auto myAvatar = DependencyManager::get()->getMyAvatar(); MyCharacterController* controller = myAvatar ? myAvatar->getCharacterController() : nullptr; if (!controller) { qDebug() << "AvatarActionHold::getAvatarRigidBodyLocation failed to get character controller"; diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 441130bd83..18856ff914 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include "Application.h" #include "Avatar.h" @@ -323,7 +324,7 @@ void AvatarManager::handleCollisionEvents(const CollisionEvents& collisionEvents // an id of null. Thus this code handles any collision in which one of the participating objects is // my avatar. (Other user machines will make a similar analysis and inject sound for their collisions.) if (collision.idA.isNull() || collision.idB.isNull()) { - MyAvatar* myAvatar = getMyAvatar(); + auto myAvatar = getMyAvatar(); auto collisionSound = myAvatar->getCollisionSound(); if (collisionSound) { const auto characterController = myAvatar->getCharacterController(); @@ -399,7 +400,7 @@ void AvatarManager::updateAvatarRenderStatus(bool shouldRenderAvatars) { AvatarSharedPointer AvatarManager::getAvatarBySessionID(const QUuid& sessionID) { - if (sessionID == _myAvatar->getSessionUUID()) { + if (sessionID == AVATAR_SELF_ID || sessionID == _myAvatar->getSessionUUID()) { return _myAvatar; } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index f09aa9791c..8cdb8006e6 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -39,7 +39,7 @@ public: void init(); - MyAvatar* getMyAvatar() { return _myAvatar.get(); } + std::shared_ptr getMyAvatar() { return _myAvatar; } AvatarSharedPointer getAvatarBySessionID(const QUuid& sessionID) override; void updateMyAvatar(float deltaTime); diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index b031e05789..a4676428a9 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -79,7 +79,7 @@ bool HMDScriptingInterface::getHUDLookAtPosition3D(glm::vec3& result) const { } glm::mat4 HMDScriptingInterface::getWorldHMDMatrix() const { - MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); + auto myAvatar = DependencyManager::get()->getMyAvatar(); return myAvatar->getSensorToWorldMatrix() * myAvatar->getHMDSensorMatrix(); } diff --git a/interface/src/ui/OverlayConductor.cpp b/interface/src/ui/OverlayConductor.cpp index 2ee106b6b3..dbf58c5cbc 100644 --- a/interface/src/ui/OverlayConductor.cpp +++ b/interface/src/ui/OverlayConductor.cpp @@ -43,7 +43,7 @@ bool OverlayConductor::headOutsideOverlay() const { bool OverlayConductor::updateAvatarIsAtRest() { - MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); + auto myAvatar = DependencyManager::get()->getMyAvatar(); const quint64 REST_ENABLE_TIME_USECS = 1000 * 1000; // 1 s const quint64 REST_DISABLE_TIME_USECS = 200 * 1000; // 200 ms @@ -69,7 +69,7 @@ bool OverlayConductor::updateAvatarIsAtRest() { } bool OverlayConductor::updateAvatarHasDriveInput() { - MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); + auto myAvatar = DependencyManager::get()->getMyAvatar(); const quint64 DRIVE_ENABLE_TIME_USECS = 200 * 1000; // 200 ms const quint64 DRIVE_DISABLE_TIME_USECS = 1000 * 1000; // 1 s @@ -103,7 +103,7 @@ void OverlayConductor::update(float dt) { auto offscreenUi = DependencyManager::get(); bool currentVisible = !offscreenUi->getDesktop()->property("pinned").toBool(); - MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); + auto myAvatar = DependencyManager::get()->getMyAvatar(); // centerUI when hmd mode is first enabled and mounted if (qApp->isHMDMode() && qApp->getActiveDisplayPlugin()->isDisplayVisible()) { if (!_hmdMode) { diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 2a0094de29..c47da011e0 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -32,7 +32,7 @@ void setupPreferences() { auto preferences = DependencyManager::get(); - MyAvatar* myAvatar = DependencyManager::get()->getMyAvatar(); + auto myAvatar = DependencyManager::get()->getMyAvatar(); static const QString AVATAR_BASICS { "Avatar Basics" }; { auto getter = [=]()->QString { return myAvatar->getDisplayName(); }; diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index fbe272a562..8141d1a0db 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -170,7 +170,7 @@ void Stats::updateStats(bool force) { STAT_UPDATE(entitiesPing, octreeServerCount ? totalPingOctree / octreeServerCount : -1); // Third column, avatar stats - MyAvatar* myAvatar = avatarManager->getMyAvatar(); + auto myAvatar = avatarManager->getMyAvatar(); glm::vec3 avatarPos = myAvatar->getPosition(); STAT_UPDATE(position, QVector3D(avatarPos.x, avatarPos.y, avatarPos.z)); STAT_UPDATE_FLOAT(speed, glm::length(myAvatar->getVelocity()), 0.01f); diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index 174873a5c7..7cc74d60e0 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -64,7 +64,7 @@ namespace render { if (args) { if (overlay->getAnchor() == Overlay::MY_AVATAR) { auto batch = args->_batch; - MyAvatar* avatar = DependencyManager::get()->getMyAvatar(); + auto avatar = DependencyManager::get()->getMyAvatar(); glm::quat myAvatarRotation = avatar->getOrientation(); glm::vec3 myAvatarPosition = avatar->getPosition(); float angle = glm::degrees(glm::angle(myAvatarRotation)); diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index b37fcd3699..19fa9f81b3 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -856,7 +856,7 @@ QList SpatiallyNestable::getChildren() const { _childrenLock.withReadLock([&] { foreach(SpatiallyNestableWeakPointer childWP, _children.values()) { SpatiallyNestablePointer child = childWP.lock(); - if (child && child->_parentKnowsMe && child->getParentID() == getID()) { + if (child && child->_parentKnowsMe && (child->getParentID() == getID() || child->getParentID() == QUuid("{00000000-0000-0000-0000-000000000001}"))) { children << child; } } From 5e8c8f84b5e5a9d75c00818b6e756bd7f881af65 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 13 Sep 2016 16:24:22 -0700 Subject: [PATCH 030/300] Handle edge cases of AVATAR_SELF_ID being used with entities --- libraries/avatars/src/AvatarData.h | 5 +---- libraries/entities/src/EntityScriptingInterface.cpp | 9 +++++++++ libraries/shared/src/SharedUtil.h | 6 ++++++ libraries/shared/src/SpatiallyNestable.cpp | 7 ++++++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 715c24b8ee..a5314bf4a8 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -55,6 +55,7 @@ typedef unsigned long long quint64; #include #include #include +#include #include "AABox.h" #include "HeadData.h" @@ -138,10 +139,6 @@ class AttachmentData; class Transform; using TransformPointer = std::shared_ptr; -// When writing out avatarEntities to a QByteArray, if the parentID is the ID of MyAvatar, use this ID instead. This allows -// the value to be reset when the sessionID changes. -const QUuid AVATAR_SELF_ID = QUuid("{00000000-0000-0000-0000-000000000001}"); - class AvatarData : public QObject, public SpatiallyNestable { Q_OBJECT diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index fe7fccaece..656a6bd281 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -12,6 +12,7 @@ #include "EntityItemID.h" #include +#include #include #include "EntitiesLogging.h" @@ -181,6 +182,11 @@ QUuid EntityScriptingInterface::addEntity(const EntityItemProperties& properties propertiesWithSimID.setOwningAvatarID(myNodeID); } + if (propertiesWithSimID.getParentID() == AVATAR_SELF_ID) { + qDebug() << "ERROR: Cannot set entity parent ID to the local-only MyAvatar ID"; + propertiesWithSimID.setParentID(QUuid()); + } + auto dimensions = propertiesWithSimID.getDimensions(); float volume = dimensions.x * dimensions.y * dimensions.z; auto density = propertiesWithSimID.getDensity(); @@ -357,6 +363,9 @@ QUuid EntityScriptingInterface::editEntity(QUuid id, const EntityItemProperties& if (!scriptSideProperties.parentIDChanged()) { properties.setParentID(entity->getParentID()); + } else if (scriptSideProperties.getParentID() == AVATAR_SELF_ID) { + qDebug() << "ERROR: Cannot set entity parent ID to the local-only MyAvatar ID"; + properties.setParentID(QUuid()); } if (!scriptSideProperties.parentJointIndexChanged()) { properties.setParentJointIndex(entity->getParentJointIndex()); diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index f3e5625484..0470a032ce 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -23,6 +23,12 @@ #include #include +#include + + +// When writing out avatarEntities to a QByteArray, if the parentID is the ID of MyAvatar, use this ID instead. This allows +// the value to be reset when the sessionID changes. +const QUuid AVATAR_SELF_ID = QUuid("{00000000-0000-0000-0000-000000000001}"); // Access to the global instance pointer to enable setting / unsetting template diff --git a/libraries/shared/src/SpatiallyNestable.cpp b/libraries/shared/src/SpatiallyNestable.cpp index 19fa9f81b3..f75557f73f 100644 --- a/libraries/shared/src/SpatiallyNestable.cpp +++ b/libraries/shared/src/SpatiallyNestable.cpp @@ -12,6 +12,7 @@ #include #include "DependencyManager.h" +#include "SharedUtil.h" #include "SpatiallyNestable.h" const float defaultAACubeSize = 1.0f; @@ -856,7 +857,11 @@ QList SpatiallyNestable::getChildren() const { _childrenLock.withReadLock([&] { foreach(SpatiallyNestableWeakPointer childWP, _children.values()) { SpatiallyNestablePointer child = childWP.lock(); - if (child && child->_parentKnowsMe && (child->getParentID() == getID() || child->getParentID() == QUuid("{00000000-0000-0000-0000-000000000001}"))) { + // An object can set MyAvatar to be its parent using two IDs: the session ID and the special AVATAR_SELF_ID + // Because we only recognize an object as having one ID, we need to check for the second possible ID here. + // In practice, the AVATAR_SELF_ID should only be used for local-only objects. + if (child && child->_parentKnowsMe && (child->getParentID() == getID() || + (getNestableType() == NestableType::Avatar && child->getParentID() == AVATAR_SELF_ID))) { children << child; } } From e50649102678dde1b8e2d497125f97900eeb684a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 13 Sep 2016 16:35:13 -0700 Subject: [PATCH 031/300] Remove blank lines --- interface/src/InterfaceParentFinder.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/interface/src/InterfaceParentFinder.cpp b/interface/src/InterfaceParentFinder.cpp index 7c6c23616d..1979f8344b 100644 --- a/interface/src/InterfaceParentFinder.cpp +++ b/interface/src/InterfaceParentFinder.cpp @@ -17,8 +17,6 @@ #include "InterfaceParentFinder.h" - - SpatiallyNestableWeakPointer InterfaceParentFinder::find(QUuid parentID, bool& success, SpatialParentTree* entityTree) const { SpatiallyNestableWeakPointer parent; From b48270c9a79b44cfd5455b1dd3b48685a33e041e Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 14 Sep 2016 10:25:30 -0700 Subject: [PATCH 032/300] don't accidently select entities through edit.js window --- scripts/system/libraries/entitySelectionTool.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 461204b7aa..6ae283573b 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -1029,7 +1029,9 @@ SelectionDisplay = (function() { var entityIntersection = Entities.findRayIntersection(pickRay, true); var overlayIntersection = Overlays.findRayIntersection(pickRay); if (entityIntersection.intersects && - (!overlayIntersection.intersects || (entityIntersection.distance < overlayIntersection.distance))) { + (!overlayIntersection.intersects || + (entityIntersection.distance < overlayIntersection.distance)) && + (!(Reticle.pointingAtSystemOverlay || Overlays.getOverlayAtPoint(Reticle.position)))) { selectionManager.setSelections([entityIntersection.entityID]); } } From 409ebe526b19e6a458e994b464a87dd48dc3d746 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 14 Sep 2016 10:38:08 -0700 Subject: [PATCH 033/300] qml keyboard for Browser window --- interface/resources/qml/Browser.qml | 37 ++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/Browser.qml b/interface/resources/qml/Browser.qml index 631036580e..a221108bdc 100644 --- a/interface/resources/qml/Browser.qml +++ b/interface/resources/qml/Browser.qml @@ -6,6 +6,7 @@ import "controls-uit" import "styles" as HifiStyles import "styles-uit" import "windows" +import "controls" as Controls ScrollingWindow { id: root @@ -52,6 +53,9 @@ ScrollingWindow { width: pane.contentWidth implicitHeight: pane.scrollHeight + property bool keyboardRaised: false + property bool punctuationMode: false + Row { id: buttons spacing: 4 @@ -202,7 +206,7 @@ ScrollingWindow { url: "https://highfidelity.com" anchors.top: buttons.bottom anchors.topMargin: 8 - anchors.bottom: parent.bottom + anchors.bottom: keyboard1.top anchors.left: parent.left anchors.right: parent.right onFeaturePermissionRequested: { @@ -234,6 +238,37 @@ ScrollingWindow { profile: desktop.browserProfile } + // virtual keyboard, letters + Controls.Keyboard { + id: keyboard1 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + + Controls.KeyboardPunctuation { + id: keyboard2 + // y: parent.keyboardRaised ? parent.height : 0 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors.right: parent.right + anchors.rightMargin: 0 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.bottom: parent.bottom + anchors.bottomMargin: 0 + // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + } + } // item From 2e83f218449499f243091310c1d9989ced0b51bc Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 20 Sep 2016 13:32:05 -0700 Subject: [PATCH 034/300] merge from upstream --- scripts/system/libraries/entitySelectionTool.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 25bd0bd495..9d98a19305 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -1032,9 +1032,7 @@ SelectionDisplay = (function() { var entityIntersection = Entities.findRayIntersection(pickRay, true); var overlayIntersection = Overlays.findRayIntersection(pickRay); if (entityIntersection.intersects && - (!overlayIntersection.intersects || - (entityIntersection.distance < overlayIntersection.distance)) && - (!(Reticle.pointingAtSystemOverlay || Overlays.getOverlayAtPoint(Reticle.position)))) { + (!overlayIntersection.intersects || (entityIntersection.distance < overlayIntersection.distance))) { selectionManager.setSelections([entityIntersection.entityID]); } } From e1164edfde3a6199a31220931a130ce34e62c915 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 22 Sep 2016 15:28:49 +1200 Subject: [PATCH 035/300] Display keyboard only for editable fields --- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 29370194dd..e8b300f171 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -835,7 +835,8 @@ void OffscreenQmlSurface::onFocusObjectChanged(QObject* object) { disconnect(_currentFocusItem, &QObject::destroyed, this, 0); setKeyboardRaised(_currentFocusItem, false); } - setKeyboardRaised(item, item->hasActiveFocus()); + const char* READ_ONLY_PROPERTY = "readOnly"; + setKeyboardRaised(item, item->hasActiveFocus() && item->property(READ_ONLY_PROPERTY) == false); _currentFocusItem = item; connect(_currentFocusItem, &QObject::destroyed, this, &OffscreenQmlSurface::focusDestroyed); } From 52137cb3c1357b50cd327ade13746e3e1b3aa5d4 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 24 Sep 2016 11:40:38 +1200 Subject: [PATCH 036/300] Put keyboard at bottom of scrolling dialogs rather than under controls --- interface/resources/qml/Browser.qml | 37 +----------- .../qml/dialogs/PreferencesDialog.qml | 4 +- .../dialogs/preferences/AvatarPreference.qml | 39 +------------ .../preferences/BrowsablePreference.qml | 41 +------------ .../preferences/EditablePreference.qml | 58 ++----------------- .../qml/hifi/dialogs/RunningScripts.qml | 34 +---------- .../resources/qml/windows/ScrollingWindow.qml | 55 ++++++++++++++++-- 7 files changed, 65 insertions(+), 203 deletions(-) diff --git a/interface/resources/qml/Browser.qml b/interface/resources/qml/Browser.qml index a221108bdc..631036580e 100644 --- a/interface/resources/qml/Browser.qml +++ b/interface/resources/qml/Browser.qml @@ -6,7 +6,6 @@ import "controls-uit" import "styles" as HifiStyles import "styles-uit" import "windows" -import "controls" as Controls ScrollingWindow { id: root @@ -53,9 +52,6 @@ ScrollingWindow { width: pane.contentWidth implicitHeight: pane.scrollHeight - property bool keyboardRaised: false - property bool punctuationMode: false - Row { id: buttons spacing: 4 @@ -206,7 +202,7 @@ ScrollingWindow { url: "https://highfidelity.com" anchors.top: buttons.bottom anchors.topMargin: 8 - anchors.bottom: keyboard1.top + anchors.bottom: parent.bottom anchors.left: parent.left anchors.right: parent.right onFeaturePermissionRequested: { @@ -238,37 +234,6 @@ ScrollingWindow { profile: desktop.browserProfile } - // virtual keyboard, letters - Controls.Keyboard { - id: keyboard1 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && !parent.punctuationMode - enabled: parent.keyboardRaised && !parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } - - Controls.KeyboardPunctuation { - id: keyboard2 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && parent.punctuationMode - enabled: parent.keyboardRaised && parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } - } // item diff --git a/interface/resources/qml/dialogs/PreferencesDialog.qml b/interface/resources/qml/dialogs/PreferencesDialog.qml index 5278118a22..ac9aad0e4a 100644 --- a/interface/resources/qml/dialogs/PreferencesDialog.qml +++ b/interface/resources/qml/dialogs/PreferencesDialog.qml @@ -97,9 +97,9 @@ ScrollingWindow { footer: Row { anchors { - right: parent.right; + top: parent.top + right: parent.right rightMargin: hifi.dimensions.contentMargin.x - verticalCenter: parent.verticalCenter } spacing: hifi.dimensions.contentSpacing.x diff --git a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml index 16a96f791f..8f05ca4ffe 100644 --- a/interface/resources/qml/dialogs/preferences/AvatarPreference.qml +++ b/interface/resources/qml/dialogs/preferences/AvatarPreference.qml @@ -12,7 +12,6 @@ import QtQuick 2.5 import "../../dialogs" import "../../controls-uit" -import "../../controls" as Controls Preference { id: root @@ -54,16 +53,12 @@ Preference { Item { id: control - - property bool keyboardRaised: false - property bool punctuationMode: false - anchors { left: parent.left right: parent.right bottom: parent.bottom } - height: Math.max(dataTextField.controlHeight, button.height) + (keyboardRaised ? 200 : 0) + height: Math.max(dataTextField.controlHeight, button.height) TextField { id: dataTextField @@ -74,7 +69,7 @@ Preference { left: parent.left right: button.left rightMargin: hifi.dimensions.contentSpacing.x - bottom: keyboard1.top + bottom: parent.bottom } colorScheme: hifi.colorSchemes.dark } @@ -99,35 +94,5 @@ Preference { } } - // virtual keyboard, letters - Controls.Keyboard { - id: keyboard1 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && !parent.punctuationMode - enabled: parent.keyboardRaised && !parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } - - Controls.KeyboardPunctuation { - id: keyboard2 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && parent.punctuationMode - enabled: parent.keyboardRaised && parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } } } diff --git a/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml b/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml index 4989c57694..2cf50891c9 100644 --- a/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml +++ b/interface/resources/qml/dialogs/preferences/BrowsablePreference.qml @@ -12,8 +12,6 @@ import QtQuick 2.5 import "../../dialogs" import "../../controls-uit" -import "../../controls" as Controls - Preference { id: root @@ -32,16 +30,12 @@ Preference { Item { id: control - - property bool keyboardRaised: false - property bool punctuationMode: false - anchors { left: parent.left right: parent.right bottom: parent.bottom } - height: Math.max(dataTextField.controlHeight, button.height) + (keyboardRaised ? 200 : 0) + height: Math.max(dataTextField.controlHeight, button.height) TextField { id: dataTextField @@ -50,7 +44,7 @@ Preference { left: parent.left right: button.left rightMargin: hifi.dimensions.contentSpacing.x - bottom: keyboard1.top + bottom: parent.bottom } label: root.label @@ -81,36 +75,5 @@ Preference { }); } } - - // virtual keyboard, letters - Controls.Keyboard { - id: keyboard1 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && !parent.punctuationMode - enabled: parent.keyboardRaised && !parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } - - Controls.KeyboardPunctuation { - id: keyboard2 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && parent.punctuationMode - enabled: parent.keyboardRaised && parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } } } diff --git a/interface/resources/qml/dialogs/preferences/EditablePreference.qml b/interface/resources/qml/dialogs/preferences/EditablePreference.qml index 40df94dd9f..8acf8e1f76 100644 --- a/interface/resources/qml/dialogs/preferences/EditablePreference.qml +++ b/interface/resources/qml/dialogs/preferences/EditablePreference.qml @@ -12,11 +12,10 @@ import QtQuick 2.5 import "../../dialogs" import "../../controls-uit" -import "../../controls" as Controls Preference { id: root - height: dataTextField.controlHeight + hifi.dimensions.controlInterlineHeight + (editablePreferenceColumn.keyboardRaised ? 200 : 0) + height: dataTextField.controlHeight + hifi.dimensions.controlInterlineHeight Component.onCompleted: { dataTextField.text = preference.value; @@ -27,61 +26,16 @@ Preference { preference.save(); } - Column { - id: editablePreferenceColumn - height: dataTextField.height + (keyboardRaised ? 200 : 0) - - property bool keyboardRaised: false - property bool punctuationMode: false + TextField { + id: dataTextField + placeholderText: preference.placeholderText + label: root.label + colorScheme: hifi.colorSchemes.dark anchors { left: parent.left right: parent.right bottom: parent.bottom } - - TextField { - id: dataTextField - placeholderText: preference.placeholderText - label: root.label - colorScheme: hifi.colorSchemes.dark - - anchors { - left: parent.left - right: parent.right - // bottom: keyboard1.bottom - } - } - - // virtual keyboard, letters - Controls.Keyboard { - id: keyboard1 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && !parent.punctuationMode - enabled: parent.keyboardRaised && !parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - // anchors.bottom: parent.bottom - // anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } - - Controls.KeyboardPunctuation { - id: keyboard2 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && parent.punctuationMode - enabled: parent.keyboardRaised && parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - // anchors.bottom: parent.bottom - // anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } } } diff --git a/interface/resources/qml/hifi/dialogs/RunningScripts.qml b/interface/resources/qml/hifi/dialogs/RunningScripts.qml index 043e454f46..3f05a140ae 100644 --- a/interface/resources/qml/hifi/dialogs/RunningScripts.qml +++ b/interface/resources/qml/hifi/dialogs/RunningScripts.qml @@ -16,7 +16,6 @@ import Qt.labs.settings 1.0 import "../../styles-uit" import "../../controls-uit" as HifiControls import "../../windows" -import "../../controls" ScrollingWindow { id: root @@ -24,8 +23,8 @@ ScrollingWindow { title: "Running Scripts" resizable: true destroyOnHidden: true - implicitWidth: 480 - implicitHeight: (isHMD ? 695 : 728) + (runningScriptsColumn.keyboardRaised ? 200 + (2 * hifi.dimensions.contentSpacing.y) : 0) + implicitWidth: 424 + implicitHeight: isHMD ? 695 : 728 minSize: Qt.vector2d(424, 300) HifiConstants { id: hifi } @@ -93,11 +92,6 @@ ScrollingWindow { } Column { - id: runningScriptsColumn - - property bool keyboardRaised: false - property bool punctuationMode: false - width: pane.contentWidth HifiControls.ContentSection { @@ -359,28 +353,6 @@ ScrollingWindow { visible: !isHMD } } - - // virtual keyboard, letters - Keyboard { - id: keyboard1 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && !parent.punctuationMode - enabled: parent.keyboardRaised && !parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - } - - KeyboardPunctuation { - id: keyboard2 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && parent.punctuationMode - enabled: parent.keyboardRaised && parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - } } } + diff --git a/interface/resources/qml/windows/ScrollingWindow.qml b/interface/resources/qml/windows/ScrollingWindow.qml index f1dc744344..2050f0fbf2 100644 --- a/interface/resources/qml/windows/ScrollingWindow.qml +++ b/interface/resources/qml/windows/ScrollingWindow.qml @@ -15,6 +15,7 @@ import QtGraphicalEffects 1.0 import "." import "../styles-uit" +import "../controls" as HiFiControls // FIXME how do I set the initial position of a window without // overriding places where the a individual client of the window @@ -23,6 +24,7 @@ import "../styles-uit" // FIXME how to I enable dragging without allowing the window to lay outside // of the desktop? How do I ensure when the desktop resizes all the windows // are still at least partially visible? + Window { id: window HifiConstants { id: hifi } @@ -30,6 +32,9 @@ Window { property var footer: Item { } // Optional static footer at the bottom of the dialog. + property bool keyboardRaised: false + property bool punctuationMode: false + // Scrollable window content. // FIXME this should not define any visual content in this type. The base window // type should only consist of logic sized areas, with nothing drawn (although the @@ -73,7 +78,7 @@ Window { verticalScrollBarPolicy: Qt.ScrollBarAsNeeded anchors.fill: parent anchors.rightMargin: parent.isScrolling ? 1 : 0 - anchors.bottomMargin: footer.height > 0 ? footerPane.height : 0 + anchors.bottomMargin: footerPane.height style: ScrollViewStyle { @@ -119,18 +124,28 @@ Window { Rectangle { // Optional non-scrolling footer. id: footerPane + + property alias keyboardRaised: window.keyboardRaised + property alias punctuationMode: window.punctuationMode + anchors { left: parent.left bottom: parent.bottom } width: parent.contentWidth - height: footer.height + 2 * hifi.dimensions.contentSpacing.y + 3 + height: (footer.height > 0 ? footer.height + 2 * hifi.dimensions.contentSpacing.y + 3 : 0) + (keyboardRaised ? 200 : 0) color: hifi.colors.baseGray - visible: footer.height > 0 + visible: footer.height > 0 || keyboardRaised Item { // Horizontal rule. - anchors.fill: parent + anchors { + top: parent.top + left: parent.left + right: parent.right + } + + visible: footer.height > 0 Rectangle { width: parent.width @@ -148,10 +163,38 @@ Window { } Item { - anchors.fill: parent - anchors.topMargin: 3 // Horizontal rule. + anchors { + left: parent.left + right: parent.right + top: parent.top + topMargin: hifi.dimensions.contentSpacing.y + 3 + } children: [ footer ] } + + HiFiControls.Keyboard { + id: keyboard1 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardRaised && !parent.punctuationMode + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } + } + + HiFiControls.KeyboardPunctuation { + id: keyboard2 + height: parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardRaised && parent.punctuationMode + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } + } } } } From 8663455d01c23d3da02c00b80796abda01bcdc60 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 24 Sep 2016 17:34:02 +1200 Subject: [PATCH 037/300] Unfocus field and hide keyboard when click in blank part of dialog --- interface/resources/qml/controls-uit/ContentSection.qml | 7 ++++++- interface/resources/qml/windows/Window.qml | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/controls-uit/ContentSection.qml b/interface/resources/qml/controls-uit/ContentSection.qml index 98350a9333..3a87e3058a 100644 --- a/interface/resources/qml/controls-uit/ContentSection.qml +++ b/interface/resources/qml/controls-uit/ContentSection.qml @@ -109,8 +109,13 @@ Column { } MouseArea { + // Events are propogated so that any active control is defocussed. anchors.fill: parent - onClicked: toggleCollapsed() + propagateComposedEvents: true + onClicked: { + toggleCollapsed(); + mouse.accepted = false; + } } } diff --git a/interface/resources/qml/windows/Window.qml b/interface/resources/qml/windows/Window.qml index 40ef74c59b..4e0231ba06 100644 --- a/interface/resources/qml/windows/Window.qml +++ b/interface/resources/qml/windows/Window.qml @@ -133,7 +133,9 @@ Fadable { hoverEnabled: true acceptedButtons: Qt.AllButtons enabled: window.visible - onClicked: {} + onClicked: { + frame.forceActiveFocus(); // Defocus any current field so that the keyboard gets hidden. + } onDoubleClicked: {} onPressAndHold: {} onReleased: {} From 0f672c3aa29c415d8a1fa27c5b0f2e76ff87d9f4 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 24 Sep 2016 18:56:35 +1200 Subject: [PATCH 038/300] Scroll content if necessary when keyboard is displayed --- .../resources/qml/windows/ScrollingWindow.qml | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/windows/ScrollingWindow.qml b/interface/resources/qml/windows/ScrollingWindow.qml index 2050f0fbf2..ca378b82f2 100644 --- a/interface/resources/qml/windows/ScrollingWindow.qml +++ b/interface/resources/qml/windows/ScrollingWindow.qml @@ -31,6 +31,7 @@ Window { children: [ swallower, frame, pane, activator ] property var footer: Item { } // Optional static footer at the bottom of the dialog. + readonly property var footerContentHeight: footer.height > 0 ? (footer.height + 2 * hifi.dimensions.contentSpacing.y + 3) : 0 property bool keyboardRaised: false property bool punctuationMode: false @@ -121,6 +122,10 @@ Window { } } + function scrollBy(delta) { + scrollView.flickableItem.contentY += delta; + } + Rectangle { // Optional non-scrolling footer. id: footerPane @@ -133,7 +138,7 @@ Window { bottom: parent.bottom } width: parent.contentWidth - height: (footer.height > 0 ? footer.height + 2 * hifi.dimensions.contentSpacing.y + 3 : 0) + (keyboardRaised ? 200 : 0) + height: footerContentHeight + (keyboardRaised ? 200 : 0) color: hifi.colors.baseGray visible: footer.height > 0 || keyboardRaised @@ -197,4 +202,19 @@ Window { } } } + + onKeyboardRaisedChanged: { + if (keyboardRaised) { + var delta = activator.mouseY + - (activator.height + activator.y - 200 - footerContentHeight - hifi.dimensions.controlLineHeight); + + if (delta > 0) { + pane.scrollBy(delta); + } else { + // HACK: Work around for case where are 100% scrolled; stops window from erroneously scrolling to 100% when show keyboard. + pane.scrollBy(-1); + pane.scrollBy(1); + } + } + } } From 5b6835fbdb3714a6968ec7decf890900c502ce0d Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 24 Sep 2016 21:23:30 +1200 Subject: [PATCH 039/300] Fix defocusing --- .../qml/controls-uit/ContentSection.qml | 2 +- .../resources/qml/windows/ScrollingWindow.qml | 2 +- interface/resources/qml/windows/Window.qml | 21 +++++++++++++++---- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/interface/resources/qml/controls-uit/ContentSection.qml b/interface/resources/qml/controls-uit/ContentSection.qml index 3a87e3058a..5fc86fc565 100644 --- a/interface/resources/qml/controls-uit/ContentSection.qml +++ b/interface/resources/qml/controls-uit/ContentSection.qml @@ -112,7 +112,7 @@ Column { // Events are propogated so that any active control is defocussed. anchors.fill: parent propagateComposedEvents: true - onClicked: { + onPressed: { toggleCollapsed(); mouse.accepted = false; } diff --git a/interface/resources/qml/windows/ScrollingWindow.qml b/interface/resources/qml/windows/ScrollingWindow.qml index ca378b82f2..2b80b01d95 100644 --- a/interface/resources/qml/windows/ScrollingWindow.qml +++ b/interface/resources/qml/windows/ScrollingWindow.qml @@ -28,7 +28,7 @@ import "../controls" as HiFiControls Window { id: window HifiConstants { id: hifi } - children: [ swallower, frame, pane, activator ] + children: [ swallower, frame, defocuser, pane, activator ] property var footer: Item { } // Optional static footer at the bottom of the dialog. readonly property var footerContentHeight: footer.height > 0 ? (footer.height + 2 * hifi.dimensions.contentSpacing.y + 3) : 0 diff --git a/interface/resources/qml/windows/Window.qml b/interface/resources/qml/windows/Window.qml index 4e0231ba06..35e0fb961c 100644 --- a/interface/resources/qml/windows/Window.qml +++ b/interface/resources/qml/windows/Window.qml @@ -44,7 +44,7 @@ Fadable { implicitHeight: content ? content.height : 0 implicitWidth: content ? content.width : 0 x: desktop.invalid_position; y: desktop.invalid_position; - children: [ swallower, frame, content, activator ] + children: [ swallower, frame, defocuser, content, activator ] // // Custom properties @@ -122,6 +122,21 @@ Fadable { } } + // This mouse area defocuses the current control so that the HMD keyboard gets hidden. + property var defocuser: MouseArea { + width: frame.decoration ? frame.decoration.width : window.width + height: frame.decoration ? frame.decoration.height : window.height + x: frame.decoration ? frame.decoration.anchors.leftMargin : 0 + y: frame.decoration ? frame.decoration.anchors.topMargin : 0 + propagateComposedEvents: true + acceptedButtons: Qt.AllButtons + enabled: window.visible + onPressed: { + frame.forceActiveFocus(); + mouse.accepted = false; + } + } + // This mouse area serves to swallow mouse events while the mouse is over the window // to prevent things like mouse wheel events from reaching the application and changing // the camera if the user is scrolling through a list and gets to the end. @@ -133,9 +148,7 @@ Fadable { hoverEnabled: true acceptedButtons: Qt.AllButtons enabled: window.visible - onClicked: { - frame.forceActiveFocus(); // Defocus any current field so that the keyboard gets hidden. - } + onClicked: {} onDoubleClicked: {} onPressAndHold: {} onReleased: {} From 023efe05f0a132726150ac10f4ad75569ad072e3 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 25 Sep 2016 09:54:48 +1300 Subject: [PATCH 040/300] Move keyboard QML files --- interface/resources/qml/AddressBarDialog.qml | 4 ++-- interface/resources/qml/ToolWindow.qml | 5 ++--- interface/resources/qml/{controls => controls-uit}/Key.qml | 0 .../resources/qml/{controls => controls-uit}/Keyboard.qml | 0 .../qml/{controls => controls-uit}/KeyboardPunctuation.qml | 0 interface/resources/qml/controls/WebView.qml | 5 +++-- interface/resources/qml/dialogs/FileDialog.qml | 5 ++--- interface/resources/qml/dialogs/QueryDialog.qml | 5 ++--- .../resources/qml/hifi/dialogs/attachments/Attachment.qml | 5 ++--- interface/resources/qml/windows/ScrollingWindow.qml | 2 +- 10 files changed, 14 insertions(+), 17 deletions(-) rename interface/resources/qml/{controls => controls-uit}/Key.qml (100%) rename interface/resources/qml/{controls => controls-uit}/Keyboard.qml (100%) rename interface/resources/qml/{controls => controls-uit}/KeyboardPunctuation.qml (100%) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index b48adf2e68..ca2f5e6852 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -244,7 +244,7 @@ Window { } // virtual keyboard, letters - Keyboard { + HifiControls.Keyboard { id: keyboard1 y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 @@ -258,7 +258,7 @@ Window { anchors.bottomMargin: 0 } - KeyboardPunctuation { + HifiControls.KeyboardPunctuation { id: keyboard2 y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 diff --git a/interface/resources/qml/ToolWindow.qml b/interface/resources/qml/ToolWindow.qml index b3f46a79db..705e59bbc3 100644 --- a/interface/resources/qml/ToolWindow.qml +++ b/interface/resources/qml/ToolWindow.qml @@ -18,7 +18,6 @@ import Qt.labs.settings 1.0 import "windows" import "controls-uit" import "styles-uit" -import "controls" as Controls ScrollingWindow { @@ -150,7 +149,7 @@ ScrollingWindow { } // virtual keyboard, letters - Controls.Keyboard { + Keyboard { id: keyboard1 // y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 @@ -165,7 +164,7 @@ ScrollingWindow { // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y } - Controls.KeyboardPunctuation { + KeyboardPunctuation { id: keyboard2 // y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 diff --git a/interface/resources/qml/controls/Key.qml b/interface/resources/qml/controls-uit/Key.qml similarity index 100% rename from interface/resources/qml/controls/Key.qml rename to interface/resources/qml/controls-uit/Key.qml diff --git a/interface/resources/qml/controls/Keyboard.qml b/interface/resources/qml/controls-uit/Keyboard.qml similarity index 100% rename from interface/resources/qml/controls/Keyboard.qml rename to interface/resources/qml/controls-uit/Keyboard.qml diff --git a/interface/resources/qml/controls/KeyboardPunctuation.qml b/interface/resources/qml/controls-uit/KeyboardPunctuation.qml similarity index 100% rename from interface/resources/qml/controls/KeyboardPunctuation.qml rename to interface/resources/qml/controls-uit/KeyboardPunctuation.qml diff --git a/interface/resources/qml/controls/WebView.qml b/interface/resources/qml/controls/WebView.qml index 22c751fb24..c3381ab824 100644 --- a/interface/resources/qml/controls/WebView.qml +++ b/interface/resources/qml/controls/WebView.qml @@ -1,6 +1,7 @@ import QtQuick 2.5 import QtWebEngine 1.1 import QtWebChannel 1.0 +import "../controls-uit" as HiFiControls Item { property alias url: root.url @@ -105,7 +106,7 @@ Item { } // virtual keyboard, letters - Keyboard { + HiFiControls.Keyboard { id: keyboard1 y: keyboardRaised ? parent.height : 0 height: keyboardRaised ? 200 : 0 @@ -119,7 +120,7 @@ Item { anchors.bottomMargin: 0 } - KeyboardPunctuation { + HiFiControls.KeyboardPunctuation { id: keyboard2 y: keyboardRaised ? parent.height : 0 height: keyboardRaised ? 200 : 0 diff --git a/interface/resources/qml/dialogs/FileDialog.qml b/interface/resources/qml/dialogs/FileDialog.qml index 86804099e0..2d245958ad 100644 --- a/interface/resources/qml/dialogs/FileDialog.qml +++ b/interface/resources/qml/dialogs/FileDialog.qml @@ -19,7 +19,6 @@ import ".." import "../controls-uit" import "../styles-uit" import "../windows" -import "../controls" as Controls import "fileDialog" @@ -648,7 +647,7 @@ ModalWindow { // virtual keyboard, letters - Controls.Keyboard { + Keyboard { id: keyboard1 // y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 @@ -662,7 +661,7 @@ ModalWindow { anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y } - Controls.KeyboardPunctuation { + KeyboardPunctuation { id: keyboard2 // y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 diff --git a/interface/resources/qml/dialogs/QueryDialog.qml b/interface/resources/qml/dialogs/QueryDialog.qml index 865c2f1bd7..eae2c037c4 100644 --- a/interface/resources/qml/dialogs/QueryDialog.qml +++ b/interface/resources/qml/dialogs/QueryDialog.qml @@ -15,7 +15,6 @@ import QtQuick.Dialogs 1.2 as OriginalDialogs import "../controls-uit" import "../styles-uit" import "../windows" -import "../controls" as Controls ModalWindow { id: root @@ -118,7 +117,7 @@ ModalWindow { } // virtual keyboard, letters - Controls.Keyboard { + Keyboard { id: keyboard1 y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 @@ -132,7 +131,7 @@ ModalWindow { anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y } - Controls.KeyboardPunctuation { + KeyboardPunctuation { id: keyboard2 y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 diff --git a/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml b/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml index 730ab367fa..9dab51437a 100644 --- a/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml +++ b/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml @@ -9,7 +9,6 @@ import ".." import "../../../styles-uit" import "../../../controls-uit" as HifiControls import "../../../windows" -import "../../../controls" as Controls Item { height: column.height + 2 * 8 @@ -76,7 +75,7 @@ Item { } // virtual keyboard, letters - Controls.Keyboard { + HifiControls.Keyboard { id: keyboard1 // y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 @@ -90,7 +89,7 @@ Item { // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y } - Controls.KeyboardPunctuation { + HifiControls.KeyboardPunctuation { id: keyboard2 // y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 diff --git a/interface/resources/qml/windows/ScrollingWindow.qml b/interface/resources/qml/windows/ScrollingWindow.qml index 2b80b01d95..b49f8fe4bb 100644 --- a/interface/resources/qml/windows/ScrollingWindow.qml +++ b/interface/resources/qml/windows/ScrollingWindow.qml @@ -15,7 +15,7 @@ import QtGraphicalEffects 1.0 import "." import "../styles-uit" -import "../controls" as HiFiControls +import "../controls-uit" as HiFiControls // FIXME how do I set the initial position of a window without // overriding places where the a individual client of the window From 7d1d71084d0e970f0ab334cfd349a32ac31eb1f9 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 26 Sep 2016 14:32:29 +1300 Subject: [PATCH 041/300] Add keyboard to custom query dialog --- .../qml/dialogs/CustomQueryDialog.qml | 48 +++++++++++++++++-- .../resources/qml/windows/ScrollingWindow.qml | 20 ++++---- 2 files changed, 56 insertions(+), 12 deletions(-) diff --git a/interface/resources/qml/dialogs/CustomQueryDialog.qml b/interface/resources/qml/dialogs/CustomQueryDialog.qml index d1fb885e0b..563dfc3099 100644 --- a/interface/resources/qml/dialogs/CustomQueryDialog.qml +++ b/interface/resources/qml/dialogs/CustomQueryDialog.qml @@ -22,6 +22,7 @@ ModalWindow { implicitWidth: 640; implicitHeight: 320; visible: true; + keyboardEnabled: false // Disable ModalWindow's keyboard. signal selected(var result); signal canceled(); @@ -50,6 +51,10 @@ ModalWindow { } } + property bool keyboardRaised: false + property bool punctuationMode: false + onKeyboardRaisedChanged: d.resize(); + property var warning: ""; property var result; @@ -110,7 +115,9 @@ ModalWindow { var targetWidth = Math.max(titleWidth, pane.width); var targetHeight = (textField.visible ? textField.controlHeight + hifi.dimensions.contentSpacing.y : 0) + (extraInputs.visible ? extraInputs.height + hifi.dimensions.contentSpacing.y : 0) + - (buttons.height + 3 * hifi.dimensions.contentSpacing.y); + (buttons.height + 3 * hifi.dimensions.contentSpacing.y) + + (root.keyboardRaised ? (200 + hifi.dimensions.contentSpacing.y) : 0); + root.width = (targetWidth < d.minWidth) ? d.minWidth : ((targetWidth > d.maxWdith) ? d.maxWidth : targetWidth); root.height = (targetHeight < d.minHeight) ? d.minHeight : ((targetHeight > d.maxHeight) ? d.maxHeight : targetHeight); @@ -130,7 +137,6 @@ ModalWindow { left: parent.left; right: parent.right; margins: 0; - bottomMargin: hifi.dimensions.contentSpacing.y; } // FIXME make a text field type that can be bound to a history for autocompletion @@ -142,7 +148,43 @@ ModalWindow { anchors { left: parent.left; right: parent.right; - bottom: parent.bottom; + bottom: keyboard.top; + bottomMargin: hifi.dimensions.contentSpacing.y; + } + } + + Item { + id: keyboard + + height: keyboardRaised ? 200 : 0 + + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + bottomMargin: keyboardRaised ? hifi.dimensions.contentSpacing.y : 0 + } + + Keyboard { + id: keyboard1 + visible: keyboardRaised && !punctuationMode + enabled: keyboardRaised && !punctuationMode + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } + } + + KeyboardPunctuation { + id: keyboard2 + visible: keyboardRaised && punctuationMode + enabled: keyboardRaised && punctuationMode + anchors { + left: parent.left + right: parent.right + bottom: parent.bottom + } } } } diff --git a/interface/resources/qml/windows/ScrollingWindow.qml b/interface/resources/qml/windows/ScrollingWindow.qml index b49f8fe4bb..7298c94a4f 100644 --- a/interface/resources/qml/windows/ScrollingWindow.qml +++ b/interface/resources/qml/windows/ScrollingWindow.qml @@ -33,6 +33,7 @@ Window { property var footer: Item { } // Optional static footer at the bottom of the dialog. readonly property var footerContentHeight: footer.height > 0 ? (footer.height + 2 * hifi.dimensions.contentSpacing.y + 3) : 0 + property bool keyboardEnabled: true // Set false if derived control implements its own keyboard. property bool keyboardRaised: false property bool punctuationMode: false @@ -130,6 +131,7 @@ Window { // Optional non-scrolling footer. id: footerPane + property alias keyboardEnabled: window.keyboardEnabled property alias keyboardRaised: window.keyboardRaised property alias punctuationMode: window.punctuationMode @@ -138,9 +140,9 @@ Window { bottom: parent.bottom } width: parent.contentWidth - height: footerContentHeight + (keyboardRaised ? 200 : 0) + height: footerContentHeight + (keyboardEnabled && keyboardRaised ? 200 : 0) color: hifi.colors.baseGray - visible: footer.height > 0 || keyboardRaised + visible: footer.height > 0 || keyboardEnabled && keyboardRaised Item { // Horizontal rule. @@ -179,9 +181,9 @@ Window { HiFiControls.Keyboard { id: keyboard1 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && !parent.punctuationMode - enabled: parent.keyboardRaised && !parent.punctuationMode + height: parent.keyboardEnabled && parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardEnabled && parent.keyboardRaised && !parent.punctuationMode + enabled: parent.keyboardEnabled && parent.keyboardRaised && !parent.punctuationMode anchors { left: parent.left right: parent.right @@ -191,9 +193,9 @@ Window { HiFiControls.KeyboardPunctuation { id: keyboard2 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && parent.punctuationMode - enabled: parent.keyboardRaised && parent.punctuationMode + height: parent.keyboardEnabled && parent.keyboardRaised ? 200 : 0 + visible: parent.keyboardEnabled && parent.keyboardRaised && parent.punctuationMode + enabled: parent.keyboardEnabled && parent.keyboardRaised && parent.punctuationMode anchors { left: parent.left right: parent.right @@ -204,7 +206,7 @@ Window { } onKeyboardRaisedChanged: { - if (keyboardRaised) { + if (parent.KeyboardEnabled && keyboardRaised) { var delta = activator.mouseY - (activator.height + activator.y - 200 - footerContentHeight - hifi.dimensions.controlLineHeight); From 302c8ede602b0186398f4fec57637a9cc223eea6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 26 Sep 2016 15:34:39 +1300 Subject: [PATCH 042/300] Miscellaneous fixes --- .../resources/qml/dialogs/FileDialog.qml | 24 +++++++------------ .../resources/qml/dialogs/QueryDialog.qml | 4 ++-- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/interface/resources/qml/dialogs/FileDialog.qml b/interface/resources/qml/dialogs/FileDialog.qml index 2d245958ad..0942e728f9 100644 --- a/interface/resources/qml/dialogs/FileDialog.qml +++ b/interface/resources/qml/dialogs/FileDialog.qml @@ -27,7 +27,7 @@ ModalWindow { id: root resizable: true implicitWidth: 480 - implicitHeight: 360 + (fileDialogItem.keyboardRaised ? 200 + (2 * hifi.dimensions.contentSpacing.y) : 0) + implicitHeight: 360 + (fileDialogItem.keyboardRaised ? 200 + hifi.dimensions.contentSpacing.y : 0) minSize: Qt.vector2d(360, 240) draggable: true @@ -109,12 +109,14 @@ ModalWindow { property bool keyboardRaised: false property bool punctuationMode: false - MouseArea { // Clear selection when click on internal unused area. anchors.fill: parent drag.target: root - onClicked: d.clearSelection() + onClicked: { + d.clearSelection(); + frame.forceActiveFocus(); // Defocus text field so that the keyboard gets hidden. + } } Row { @@ -645,34 +647,26 @@ ModalWindow { KeyNavigation.right: openButton } - - // virtual keyboard, letters Keyboard { id: keyboard1 - // y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 visible: parent.keyboardRaised && !parent.punctuationMode - enabled: parent.keyboardRaised && !parent.punctuationMode + enabled: visible anchors.right: parent.right - anchors.rightMargin: 0 anchors.left: parent.left - anchors.leftMargin: 0 anchors.bottom: buttonRow.top - anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + anchors.bottomMargin: visible ? hifi.dimensions.contentSpacing.y : 0 } KeyboardPunctuation { id: keyboard2 - // y: parent.keyboardRaised ? parent.height : 0 height: parent.keyboardRaised ? 200 : 0 visible: parent.keyboardRaised && parent.punctuationMode - enabled: parent.keyboardRaised && parent.punctuationMode + enabled: visible anchors.right: parent.right - anchors.rightMargin: 0 anchors.left: parent.left - anchors.leftMargin: 0 anchors.bottom: buttonRow.top - anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + anchors.bottomMargin: visible ? hifi.dimensions.contentSpacing.y : 0 } Row { diff --git a/interface/resources/qml/dialogs/QueryDialog.qml b/interface/resources/qml/dialogs/QueryDialog.qml index eae2c037c4..cf1b1e370a 100644 --- a/interface/resources/qml/dialogs/QueryDialog.qml +++ b/interface/resources/qml/dialogs/QueryDialog.qml @@ -128,7 +128,7 @@ ModalWindow { anchors.left: parent.left anchors.leftMargin: 0 anchors.bottom: buttons.top - anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + anchors.bottomMargin: parent.keyboardRaised ? 2 * hifi.dimensions.contentSpacing.y : 0 } KeyboardPunctuation { @@ -142,7 +142,7 @@ ModalWindow { anchors.left: parent.left anchors.leftMargin: 0 anchors.bottom: buttons.top - anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y + anchors.bottomMargin: parent.keyboardRaised ? 2 * hifi.dimensions.contentSpacing.y : 0 } Flow { From bc8c400448bd909d0266640d37e332bd6a965a7e Mon Sep 17 00:00:00 2001 From: David Rowe Date: Mon, 26 Sep 2016 16:39:34 +1300 Subject: [PATCH 043/300] Fix up keyboards in attachments dialogs --- .../qml/hifi/dialogs/AttachmentsDialog.qml | 23 ++++++++++++- .../qml/hifi/dialogs/ModelBrowserDialog.qml | 2 +- .../hifi/dialogs/attachments/Attachment.qml | 32 ------------------- 3 files changed, 23 insertions(+), 34 deletions(-) diff --git a/interface/resources/qml/hifi/dialogs/AttachmentsDialog.qml b/interface/resources/qml/hifi/dialogs/AttachmentsDialog.qml index 15467f8021..cc9a570d47 100644 --- a/interface/resources/qml/hifi/dialogs/AttachmentsDialog.qml +++ b/interface/resources/qml/hifi/dialogs/AttachmentsDialog.qml @@ -45,7 +45,7 @@ ScrollingWindow { Rectangle { width: parent.width - height: root.height + height: root.height - (keyboardRaised ? 200 : 0) radius: 4 color: hifi.colors.baseGray @@ -128,6 +128,10 @@ ScrollingWindow { } onCountChanged: MyAvatar.setAttachmentsVariant(attachments); } + + function scrollBy(delta) { + flickableItem.contentY += delta; + } } } @@ -204,5 +208,22 @@ ScrollingWindow { } } } + + onKeyboardRaisedChanged: { + if (keyboardRaised) { + // Scroll to item with focus if necessary. + var footerHeight = newAttachmentButton.height + buttonRow.height + 3 * hifi.dimensions.contentSpacing.y; + var delta = activator.mouseY + - (activator.height + activator.y - 200 - footerHeight - hifi.dimensions.controlLineHeight); + + if (delta > 0) { + scrollView.scrollBy(delta); + } else { + // HACK: Work around for case where are 100% scrolled; stops window from erroneously scrolling to 100% when show keyboard. + scrollView.scrollBy(-1); + scrollView.scrollBy(1); + } + } + } } diff --git a/interface/resources/qml/hifi/dialogs/ModelBrowserDialog.qml b/interface/resources/qml/hifi/dialogs/ModelBrowserDialog.qml index aeffb8e4bf..a5a254f605 100644 --- a/interface/resources/qml/hifi/dialogs/ModelBrowserDialog.qml +++ b/interface/resources/qml/hifi/dialogs/ModelBrowserDialog.qml @@ -30,7 +30,7 @@ ScrollingWindow { Rectangle { width: parent.width - height: root.height + height: root.height - (keyboardRaised ? 200 : 0) radius: 4 color: hifi.colors.baseGray diff --git a/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml b/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml index 9dab51437a..6d371741ea 100644 --- a/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml +++ b/interface/resources/qml/hifi/dialogs/attachments/Attachment.qml @@ -34,9 +34,6 @@ Item { anchors { left: parent.left; right: parent.right; margins: 20 } spacing: 8 - property bool keyboardRaised: false - property bool punctuationMode: false - Item { height: modelChooserButton.height + urlLabel.height + 4 anchors { left: parent.left; right: parent.right;} @@ -74,35 +71,6 @@ Item { } } - // virtual keyboard, letters - HifiControls.Keyboard { - id: keyboard1 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && !parent.punctuationMode - enabled: parent.keyboardRaised && !parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - // anchors.bottom: buttonRow.top - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } - - HifiControls.KeyboardPunctuation { - id: keyboard2 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && parent.punctuationMode - enabled: parent.keyboardRaised && parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - // anchors.bottom: buttonRow.top - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } - Item { height: jointChooser.height + jointLabel.height + 4 anchors { left: parent.left; right: parent.right; } From 39d352e1a7bdaeddd937183a54314ad7cceed02d Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Mon, 26 Sep 2016 11:27:50 -0700 Subject: [PATCH 044/300] display location/connection status in address bar when it doesn't have focus --- interface/resources/qml/AddressBarDialog.qml | 50 +++++++++++++++----- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 0bbe053897..1164a0f01e 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -15,6 +15,7 @@ import "styles" import "windows" import "hifi" import "hifi/toolbars" +import "styles-uit" as HifiStyles import "controls-uit" as HifiControls Window { @@ -168,7 +169,24 @@ Window { } } - // FIXME replace with TextField + HifiStyles.RalewayLight { + id: notice; + font.pixelSize: hifi.fonts.pixelSize * root.scale * 0.50; + anchors { + top: parent.top + topMargin: parent.inputAreaStep + 12 + left: addressLine.left + right: addressLine.right + } + } + HifiStyles.FiraSansRegular { + id: location; + font.pixelSize: addressLine.font.pixelSize; + color: "gray"; + clip: true; + anchors.fill: addressLine; + visible: !addressLine.activeFocus; + } TextInput { id: addressLine focus: true @@ -179,14 +197,12 @@ Window { right: parent.right leftMargin: forwardArrow.width rightMargin: forwardArrow.width / 2 - topMargin: parent.inputAreaStep + hifi.layout.spacing - bottomMargin: parent.inputAreaStep + hifi.layout.spacing + topMargin: parent.inputAreaStep + (2 * hifi.layout.spacing) + bottomMargin: parent.inputAreaStep } font.pixelSize: hifi.fonts.pixelSize * root.scale * 0.75 - helperText: "Go to: place, @user, /path, network address" - helperPixelSize: font.pixelSize * 0.75 - helperItalic: true onTextChanged: filterChoicesByText() + onActiveFocusChanged: updateLocationText(focus) } } @@ -344,12 +360,24 @@ Window { }); } - onVisibleChanged: { - if (visible) { - addressLine.forceActiveFocus() - fillDestinations(); + function updateLocationText(focus) { + addressLine.text = ""; + if (focus) { + notice.text = "Go to a place, @user, path or network address"; + notice.color = "gray"; } else { - addressLine.text = "" + notice.text = AddressManager.isConnected ? "Your location:" : "Not Connected"; + notice.color = AddressManager.isConnected ? "gray" : "crimson"; + // Display hostname, which includes ip address, localhost, and other non-placenames. + location.text = (AddressManager.hostname || '') + (AddressManager.pathname ? AddressManager.pathname.match(/\/[^\/]+/)[0] : ''); + } + } + + onVisibleChanged: { + focus = false; + updateLocationText(false); + if (visible) { + fillDestinations(); } } From ec001299884ccdbdec54d561d38b0f9b7f49cbfd Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Sep 2016 12:51:00 +1300 Subject: [PATCH 045/300] Don't flood event bridge with raise/lower keyboard messages from HTML --- .../resources/html/raiseAndLowerKeyboard.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/interface/resources/html/raiseAndLowerKeyboard.js b/interface/resources/html/raiseAndLowerKeyboard.js index 723767790a..84a166ace3 100644 --- a/interface/resources/html/raiseAndLowerKeyboard.js +++ b/interface/resources/html/raiseAndLowerKeyboard.js @@ -11,6 +11,7 @@ var POLL_FREQUENCY = 500; // ms var MAX_WARNINGS = 3; var numWarnings = 0; + var isKeyboardRaised = false; function shouldRaiseKeyboard() { if (document.activeElement.nodeName == "INPUT" || document.activeElement.nodeName == "TEXTAREA") { @@ -28,13 +29,15 @@ }; setInterval(function () { - var event = shouldRaiseKeyboard() ? "_RAISE_KEYBOARD" : "_LOWER_KEYBOARD"; - if (typeof EventBridge != "undefined") { - EventBridge.emitWebEvent(event); - } else { - if (numWarnings < MAX_WARNINGS) { - console.log("WARNING: no global EventBridge object found"); - numWarnings++; + if (isKeyboardRaised !== shouldRaiseKeyboard()) { + isKeyboardRaised = !isKeyboardRaised; + if (typeof EventBridge != "undefined") { + EventBridge.emitWebEvent(isKeyboardRaised ? "_RAISE_KEYBOARD" : "_LOWER_KEYBOARD"); + } else { + if (numWarnings < MAX_WARNINGS) { + console.log("WARNING: no global EventBridge object found"); + numWarnings++; + } } } }, POLL_FREQUENCY); From 875566d9568e72bcaffd8bf393073b85062f2810 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Sep 2016 16:40:38 +1300 Subject: [PATCH 046/300] Raise and lower keyboard for HTML fields in Browser window --- interface/resources/qml/Browser.qml | 46 +++++++++++++++---- .../qml/controls-uit/BaseWebView.qml | 2 +- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 32 ++++++++----- 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/interface/resources/qml/Browser.qml b/interface/resources/qml/Browser.qml index 631036580e..8374fa5a98 100644 --- a/interface/resources/qml/Browser.qml +++ b/interface/resources/qml/Browser.qml @@ -1,5 +1,6 @@ import QtQuick 2.5 import QtQuick.Controls 1.2 +import QtWebChannel 1.0 import QtWebEngine 1.2 import "controls-uit" @@ -19,6 +20,9 @@ ScrollingWindow { property variant permissionsBar: {'securityOrigin':'none','feature':'none'} property alias url: webview.url property alias webView: webview + + property alias eventBridge: eventBridgeWrapper.eventBridge + x: 100 y: 100 @@ -197,32 +201,60 @@ ScrollingWindow { } } - WebEngineView { + WebView { id: webview url: "https://highfidelity.com" + + property alias eventBridgeWrapper: eventBridgeWrapper + + QtObject { + id: eventBridgeWrapper + WebChannel.id: "eventBridgeWrapper" + property var eventBridge; + } + + webChannel.registeredObjects: [eventBridgeWrapper] + + // Create a global EventBridge object for raiseAndLowerKeyboard. + WebEngineScript { + id: createGlobalEventBridge + sourceCode: eventBridgeJavaScriptToInject + injectionPoint: WebEngineScript.DocumentCreation + worldId: WebEngineScript.MainWorld + } + + // Detect when may want to raise and lower keyboard. + WebEngineScript { + id: raiseAndLowerKeyboard + injectionPoint: WebEngineScript.Deferred + sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js" + worldId: WebEngineScript.MainWorld + } + + userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard ] + anchors.top: buttons.bottom anchors.topMargin: 8 anchors.bottom: parent.bottom anchors.left: parent.left anchors.right: parent.right + onFeaturePermissionRequested: { permissionsBar.securityOrigin = securityOrigin; permissionsBar.feature = feature; root.showPermissionsBar(); } + onLoadingChanged: { if (loadRequest.status === WebEngineView.LoadSucceededStatus) { addressBar.text = loadRequest.url } } + onIconChanged: { console.log("New icon: " + icon) } - onNewViewRequested: { - var component = Qt.createComponent("Browser.qml"); - var newWindow = component.createObject(desktop); - request.openIn(newWindow.webView) - } + onWindowCloseRequested: { root.destroy(); } @@ -230,8 +262,6 @@ ScrollingWindow { Component.onCompleted: { desktop.initWebviewProfileHandlers(webview.profile) } - - profile: desktop.browserProfile } } // item diff --git a/interface/resources/qml/controls-uit/BaseWebView.qml b/interface/resources/qml/controls-uit/BaseWebView.qml index cefaf653fc..ef4764b08f 100644 --- a/interface/resources/qml/controls-uit/BaseWebView.qml +++ b/interface/resources/qml/controls-uit/BaseWebView.qml @@ -9,7 +9,7 @@ // import QtQuick 2.5 -import QtWebEngine 1.1 +import QtWebEngine 1.2 WebEngineView { id: root diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index e8b300f171..d53c1289e4 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -565,6 +565,19 @@ QObject* OffscreenQmlSurface::finishQmlLoad(std::functionbeginCreate(newContext); if (_qmlComponent->isError()) { @@ -577,6 +590,9 @@ QObject* OffscreenQmlSurface::finishQmlLoad(std::functionsetProperty("eventBridge", QVariant::fromValue(this)); + newContext->setContextProperty("eventBridgeJavaScriptToInject", QVariant(javaScriptToInject)); + f(newContext, newObject); _qmlComponent->completeCreate(); @@ -835,6 +851,9 @@ void OffscreenQmlSurface::onFocusObjectChanged(QObject* object) { disconnect(_currentFocusItem, &QObject::destroyed, this, 0); setKeyboardRaised(_currentFocusItem, false); } + + // Handle QML text fields' focus and unfocus - testing READ_ONLY_PROPERTY prevents action for HTML files. + // HTML text fields are handled via emitWebEvent(). const char* READ_ONLY_PROPERTY = "readOnly"; setKeyboardRaised(item, item->hasActiveFocus() && item->property(READ_ONLY_PROPERTY) == false); _currentFocusItem = item; @@ -897,12 +916,6 @@ void OffscreenQmlSurface::synthesizeKeyPress(QString key) { } void OffscreenQmlSurface::setKeyboardRaised(QObject* object, bool raised) { - - // raise the keyboard only while in HMD mode and it's being requested. - // XXX - // bool value = AbstractViewStateInterface::instance()->isHMDMode() && raised; - // getRootItem()->setProperty("keyboardRaised", QVariant(value)); - if (!object) { return; } @@ -931,16 +944,13 @@ void OffscreenQmlSurface::emitWebEvent(const QVariant& message) { } else { // special case to handle raising and lowering the virtual keyboard if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD") { - setKeyboardRaised(getRootItem(), true); + setKeyboardRaised(_currentFocusItem, true); } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD") { - setKeyboardRaised(getRootItem(), false); + setKeyboardRaised(_currentFocusItem, false); } else { emit webEventReceived(message); } } } - - - #include "OffscreenQmlSurface.moc" From 2344d15dbcedf8e5ae09bd6e85c56cb709868b7f Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Sep 2016 16:41:01 +1300 Subject: [PATCH 047/300] Raise and lower keyboard for HTML fields in Marketplace window --- interface/resources/qml/QmlWebWindow.qml | 18 ++++++++++++++++++ libraries/ui/src/QmlWebWindowClass.cpp | 24 +++++++++++++++++++++++- libraries/ui/src/QmlWebWindowClass.h | 3 +++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/QmlWebWindow.qml b/interface/resources/qml/QmlWebWindow.qml index 153498e2f7..7ea45bff6b 100644 --- a/interface/resources/qml/QmlWebWindow.qml +++ b/interface/resources/qml/QmlWebWindow.qml @@ -66,6 +66,24 @@ Windows.ScrollingWindow { anchors.fill: parent focus: true webChannel.registeredObjects: [eventBridgeWrapper] + + // Create a global EventBridge object for raiseAndLowerKeyboard. + WebEngineScript { + id: createGlobalEventBridge + sourceCode: eventBridgeJavaScriptToInject + injectionPoint: WebEngineScript.DocumentCreation + worldId: WebEngineScript.MainWorld + } + + // Detect when may want to raise and lower keyboard. + WebEngineScript { + id: raiseAndLowerKeyboard + injectionPoint: WebEngineScript.Deferred + sourceUrl: resourceDirectoryUrl + "/html/raiseAndLowerKeyboard.js" + worldId: WebEngineScript.MainWorld + } + + userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard ] } } } diff --git a/libraries/ui/src/QmlWebWindowClass.cpp b/libraries/ui/src/QmlWebWindowClass.cpp index b964f305a4..5a357a83d4 100644 --- a/libraries/ui/src/QmlWebWindowClass.cpp +++ b/libraries/ui/src/QmlWebWindowClass.cpp @@ -43,7 +43,29 @@ void QmlWebWindowClass::emitWebEvent(const QVariant& webMessage) { if (QThread::currentThread() != thread()) { QMetaObject::invokeMethod(this, "emitWebEvent", Qt::QueuedConnection, Q_ARG(QVariant, webMessage)); } else { - emit webEventReceived(webMessage); + // Special cases for raising and lowering the virtual keyboard. + if (webMessage.type() == QVariant::String && webMessage.toString() == "_RAISE_KEYBOARD") { + setKeyboardRaised(asQuickItem(), true); + } else if (webMessage.type() == QVariant::String && webMessage.toString() == "_LOWER_KEYBOARD") { + setKeyboardRaised(asQuickItem(), false); + } else { + emit webEventReceived(webMessage); + } + } +} + +void QmlWebWindowClass::setKeyboardRaised(QObject* object, bool raised) { + if (!object) { + return; + } + + QQuickItem* item = dynamic_cast(object); + while (item) { + if (item->property("keyboardRaised").isValid()) { + item->setProperty("keyboardRaised", QVariant(raised)); + return; + } + item = dynamic_cast(item->parentItem()); } } diff --git a/libraries/ui/src/QmlWebWindowClass.h b/libraries/ui/src/QmlWebWindowClass.h index 86d0e9b2c4..95851d2857 100644 --- a/libraries/ui/src/QmlWebWindowClass.h +++ b/libraries/ui/src/QmlWebWindowClass.h @@ -33,6 +33,9 @@ signals: protected: QString qmlSource() const override { return "QmlWebWindow.qml"; } + +private: + void setKeyboardRaised(QObject* object, bool raised); }; #endif From a94d77ee12b8e786d03f8c7e2ea20ca77138886f Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Sep 2016 17:57:53 +1300 Subject: [PATCH 048/300] Raise and lower keyboard in entities editor --- scripts/system/html/entityList.html | 1 + scripts/system/html/entityProperties.html | 1 + scripts/system/html/gridControls.html | 1 + scripts/system/html/js/entityList.js | 2 ++ scripts/system/html/js/entityProperties.js | 2 ++ scripts/system/html/js/gridControls.js | 2 ++ scripts/system/html/js/keyboardControl.js | 41 ++++++++++++++++++++++ 7 files changed, 50 insertions(+) create mode 100644 scripts/system/html/js/keyboardControl.js diff --git a/scripts/system/html/entityList.html b/scripts/system/html/entityList.html index 58dca4567f..6ea281e467 100644 --- a/scripts/system/html/entityList.html +++ b/scripts/system/html/entityList.html @@ -14,6 +14,7 @@ + diff --git a/scripts/system/html/entityProperties.html b/scripts/system/html/entityProperties.html index 6de1eec7d0..5cc8b67b44 100644 --- a/scripts/system/html/entityProperties.html +++ b/scripts/system/html/entityProperties.html @@ -19,6 +19,7 @@ + diff --git a/scripts/system/html/gridControls.html b/scripts/system/html/gridControls.html index cd646fed51..c0bd87988d 100644 --- a/scripts/system/html/gridControls.html +++ b/scripts/system/html/gridControls.html @@ -16,6 +16,7 @@ + diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index e9075da3eb..185baefcab 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -412,6 +412,8 @@ function loaded() { augmentSpinButtons(); + setUpKeyboardControl(); + // Disable right-click context menu which is not visible in the HMD and makes it seem like the app has locked document.addEventListener("contextmenu", function (event) { event.preventDefault(); diff --git a/scripts/system/html/js/entityProperties.js b/scripts/system/html/js/entityProperties.js index 8ce3fbbe00..67aa8bdb13 100644 --- a/scripts/system/html/js/entityProperties.js +++ b/scripts/system/html/js/entityProperties.js @@ -1590,6 +1590,8 @@ function loaded() { augmentSpinButtons(); + setUpKeyboardControl(); + // Disable right-click context menu which is not visible in the HMD and makes it seem like the app has locked document.addEventListener("contextmenu", function(event) { event.preventDefault(); diff --git a/scripts/system/html/js/gridControls.js b/scripts/system/html/js/gridControls.js index cc268bcbff..a245ed4cda 100644 --- a/scripts/system/html/js/gridControls.js +++ b/scripts/system/html/js/gridControls.js @@ -127,6 +127,8 @@ function loaded() { augmentSpinButtons(); + setUpKeyboardControl(); + EventBridge.emitWebEvent(JSON.stringify({ type: 'init' })); }); diff --git a/scripts/system/html/js/keyboardControl.js b/scripts/system/html/js/keyboardControl.js new file mode 100644 index 0000000000..e33b0c8159 --- /dev/null +++ b/scripts/system/html/js/keyboardControl.js @@ -0,0 +1,41 @@ +// +// keyboardControl.js +// +// Created by David Rowe on 28 Sep 2016. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +function setUpKeyboardControl() { + + var lowerTimer = null; + + function raiseKeyboard() { + if (lowerTimer !== null) { + clearTimeout(lowerTimer); + lowerTimer = null; + } + EventBridge.emitWebEvent("_RAISE_KEYBOARD"); + } + + function doLowerKeyboard() { + EventBridge.emitWebEvent("_LOWER_KEYBOARD"); + lowerTimer = null; + } + + function lowerKeyboard() { + // Delay lowering keyboard a little in case immediately raise it again. + if (lowerTimer === null) { + lowerTimer = setTimeout(doLowerKeyboard, 20); + } + } + + var inputs = document.querySelectorAll("input[type=text], input[type=number], textarea"); + for (var i = 0, length = inputs.length; i < length; i++) { + inputs[i].addEventListener("focus", raiseKeyboard); + inputs[i].addEventListener("blur", lowerKeyboard); + } +} + From b60f649e0a7ebc4a330e3da71411396f1ae41eaf Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 28 Sep 2016 19:27:16 +1300 Subject: [PATCH 049/300] Scroll HTML window if necessary when raise keyboard --- interface/resources/html/raiseAndLowerKeyboard.js | 10 ++++++++++ scripts/system/html/js/keyboardControl.js | 15 +++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/interface/resources/html/raiseAndLowerKeyboard.js b/interface/resources/html/raiseAndLowerKeyboard.js index 84a166ace3..a4138d1627 100644 --- a/interface/resources/html/raiseAndLowerKeyboard.js +++ b/interface/resources/html/raiseAndLowerKeyboard.js @@ -12,6 +12,7 @@ var MAX_WARNINGS = 3; var numWarnings = 0; var isKeyboardRaised = false; + var KEYBOARD_HEIGHT = 200; function shouldRaiseKeyboard() { if (document.activeElement.nodeName == "INPUT" || document.activeElement.nodeName == "TEXTAREA") { @@ -31,6 +32,15 @@ setInterval(function () { if (isKeyboardRaised !== shouldRaiseKeyboard()) { isKeyboardRaised = !isKeyboardRaised; + + if (isKeyboardRaised) { + var delta = document.activeElement.getBoundingClientRect().bottom + 10 + - (document.body.clientHeight - KEYBOARD_HEIGHT); + if (delta > 0) { + document.body.scrollTop += delta; + } + } + if (typeof EventBridge != "undefined") { EventBridge.emitWebEvent(isKeyboardRaised ? "_RAISE_KEYBOARD" : "_LOWER_KEYBOARD"); } else { diff --git a/scripts/system/html/js/keyboardControl.js b/scripts/system/html/js/keyboardControl.js index e33b0c8159..4041687c25 100644 --- a/scripts/system/html/js/keyboardControl.js +++ b/scripts/system/html/js/keyboardControl.js @@ -11,18 +11,33 @@ function setUpKeyboardControl() { var lowerTimer = null; + var isRaised = false; + var KEYBOARD_HEIGHT = 200; function raiseKeyboard() { if (lowerTimer !== null) { clearTimeout(lowerTimer); lowerTimer = null; } + + if (isRaised) { + return; + } + + var delta = this.getBoundingClientRect().bottom + 10 - (document.body.clientHeight - KEYBOARD_HEIGHT); + if (delta > 0) { + document.body.scrollTop += delta; + } + EventBridge.emitWebEvent("_RAISE_KEYBOARD"); + + isRaised = true; } function doLowerKeyboard() { EventBridge.emitWebEvent("_LOWER_KEYBOARD"); lowerTimer = null; + isRaised = false; } function lowerKeyboard() { From 52f2d360963891f89071bcedeb8a2b7ed4c6d6b8 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 29 Sep 2016 10:17:31 +1300 Subject: [PATCH 050/300] Move "," and "." to numeric keyboard for ready use with numeric fields --- .../resources/qml/controls-uit/Keyboard.qml | 4 ++-- .../qml/controls-uit/KeyboardPunctuation.qml | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/interface/resources/qml/controls-uit/Keyboard.qml b/interface/resources/qml/controls-uit/Keyboard.qml index eb34740402..1d957ce9cb 100644 --- a/interface/resources/qml/controls-uit/Keyboard.qml +++ b/interface/resources/qml/controls-uit/Keyboard.qml @@ -304,13 +304,13 @@ Item { Key { id: key31 width: 43 - glyph: "," + glyph: "_" } Key { id: key33 width: 43 - glyph: "." + glyph: "?" } Key { diff --git a/interface/resources/qml/controls-uit/KeyboardPunctuation.qml b/interface/resources/qml/controls-uit/KeyboardPunctuation.qml index 6fef366772..485468b46a 100644 --- a/interface/resources/qml/controls-uit/KeyboardPunctuation.qml +++ b/interface/resources/qml/controls-uit/KeyboardPunctuation.qml @@ -208,49 +208,49 @@ Item { Key { id: key22 width: 43 - glyph: "_" + glyph: "," } Key { id: key23 width: 43 - glyph: ";" + glyph: "." } Key { id: key24 width: 43 - glyph: ":" + glyph: ";" } Key { id: key25 width: 43 - glyph: "'" + glyph: ":" } Key { id: key26 width: 43 - glyph: "\"" + glyph: "'" } Key { id: key31 width: 43 - glyph: "<" + glyph: "\"" } Key { id: key33 width: 43 - glyph: ">" + glyph: "<" } Key { id: key36 width: 43 - glyph: "?" + glyph: ">" } } From 40bfbf40210de2551e1728c595d211226f136bea Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 29 Sep 2016 10:35:18 +1300 Subject: [PATCH 051/300] Prevent flicker of keyboard area when navigate to a new page in browser --- interface/resources/qml/Browser.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/Browser.qml b/interface/resources/qml/Browser.qml index 8374fa5a98..b258dadae4 100644 --- a/interface/resources/qml/Browser.qml +++ b/interface/resources/qml/Browser.qml @@ -134,10 +134,11 @@ ScrollingWindow { case Qt.Key_Return: event.accepted = true if (text.indexOf("http") != 0) { - text = "http://" + text + text = "http://" + text; } root.hidePermissionsBar(); - webview.url = text + root.keyboardRaised = false; + webview.url = text; break; } } From 2933e37a0a59c370502922b273f028e47c66b065 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 29 Sep 2016 10:47:15 +1300 Subject: [PATCH 052/300] Fix field not scrolling into view when raise keyboard in settings --- interface/resources/qml/windows/ScrollingWindow.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/windows/ScrollingWindow.qml b/interface/resources/qml/windows/ScrollingWindow.qml index 7298c94a4f..ce4bd45cff 100644 --- a/interface/resources/qml/windows/ScrollingWindow.qml +++ b/interface/resources/qml/windows/ScrollingWindow.qml @@ -1,3 +1,4 @@ + // // Window.qml // @@ -206,7 +207,7 @@ Window { } onKeyboardRaisedChanged: { - if (parent.KeyboardEnabled && keyboardRaised) { + if (keyboardEnabled && keyboardRaised) { var delta = activator.mouseY - (activator.height + activator.y - 200 - footerContentHeight - hifi.dimensions.controlLineHeight); From e9a398472a81e9a7f29c1014948d6b930f345a02 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 29 Sep 2016 12:09:04 +1300 Subject: [PATCH 053/300] Remove duplicate keyboard Fixes keyboard raising and lowering when select entity with editor open. --- interface/resources/qml/ToolWindow.qml | 37 +------------------------- 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/interface/resources/qml/ToolWindow.qml b/interface/resources/qml/ToolWindow.qml index 705e59bbc3..a3a04be13e 100644 --- a/interface/resources/qml/ToolWindow.qml +++ b/interface/resources/qml/ToolWindow.qml @@ -55,14 +55,11 @@ ScrollingWindow { anchors.left: parent.left anchors.top: parent.top - property bool keyboardRaised: false - property bool punctuationMode: false - TabView { id: tabView; width: pane.contentWidth // Pane height so that don't use Window's scrollbars otherwise tabs may be scrolled out of view. - height: pane.scrollHeight - (toolWindowTabViewItem.keyboardRaised ? 200 : 0) + height: pane.scrollHeight property int tabCount: 0 Repeater { @@ -147,37 +144,6 @@ ScrollingWindow { tabOverlap: 0 } } - - // virtual keyboard, letters - Keyboard { - id: keyboard1 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && !parent.punctuationMode - enabled: parent.keyboardRaised && !parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } - - KeyboardPunctuation { - id: keyboard2 - // y: parent.keyboardRaised ? parent.height : 0 - height: parent.keyboardRaised ? 200 : 0 - visible: parent.keyboardRaised && parent.punctuationMode - enabled: parent.keyboardRaised && parent.punctuationMode - anchors.right: parent.right - anchors.rightMargin: 0 - anchors.left: parent.left - anchors.leftMargin: 0 - anchors.bottom: parent.bottom - anchors.bottomMargin: 0 - // anchors.bottomMargin: 2 * hifi.dimensions.contentSpacing.y - } } function updateVisiblity() { @@ -268,7 +234,6 @@ ScrollingWindow { return; } - if (properties.width) { tabView.width = Math.min(Math.max(tabView.width, properties.width), toolWindow.maxSize.x); } From 8e44096981f7dbfb008ed46ee0735ffee7a75cf9 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 29 Sep 2016 15:59:24 +1300 Subject: [PATCH 054/300] Fix last entities properties not scrolling when keyboard raised --- scripts/system/html/js/keyboardControl.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/system/html/js/keyboardControl.js b/scripts/system/html/js/keyboardControl.js index 4041687c25..b19b8953c0 100644 --- a/scripts/system/html/js/keyboardControl.js +++ b/scripts/system/html/js/keyboardControl.js @@ -25,12 +25,15 @@ function setUpKeyboardControl() { } var delta = this.getBoundingClientRect().bottom + 10 - (document.body.clientHeight - KEYBOARD_HEIGHT); - if (delta > 0) { - document.body.scrollTop += delta; - } EventBridge.emitWebEvent("_RAISE_KEYBOARD"); + if (delta > 0) { + setTimeout(function () { + document.body.scrollTop += delta; + }, 500); // Allow time for keyboard to be raised in QML. + } + isRaised = true; } From e3be34528fb7af7a809f38dd1b73244bf0080326 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 29 Sep 2016 16:53:20 +1300 Subject: [PATCH 055/300] Fix keyboard flickering when select entities Fix entities list footer count of selected entities in the process. --- scripts/system/html/js/entityList.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index 185baefcab..60aa2ebe25 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -122,6 +122,8 @@ function loaded() { focus: false, entityIds: selection, })); + + refreshFooter(); } function onRowDoubleClicked() { @@ -184,6 +186,7 @@ function loaded() { function clearEntities() { entities = {}; entityList.clear(); + refreshFooter(); } var elSortOrder = { @@ -236,13 +239,16 @@ function loaded() { refreshFooter(); } - function updateSelectedEntities(selectedEntities) { + function updateSelectedEntities(selectedIDs) { var notFound = false; for (var id in entities) { entities[id].el.className = ''; } - for (var i = 0; i < selectedEntities.length; i++) { - var id = selectedEntities[i]; + + selectedEntities = []; + for (var i = 0; i < selectedIDs.length; i++) { + var id = selectedIDs[i]; + selectedEntities.push(id); if (id in entities) { var entity = entities[id]; entity.el.className = 'selected'; @@ -251,10 +257,7 @@ function loaded() { } } - // HACK: Fixes the footer and header text sometimes not displaying after adding or deleting entities. - // The problem appears to be a bug in the Qt HTML/CSS rendering (Qt 5.5). - document.getElementById("radius").focus(); - document.getElementById("radius").blur(); + refreshFooter(); return notFound; } From 64ecb06088bc0bbcb57b3a4f698e265e01865bb8 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Thu, 29 Sep 2016 10:18:54 -0700 Subject: [PATCH 056/300] add developer menu support to enable/disable dynamic texture management --- interface/src/Menu.cpp | 39 ++++++++++++++++++- interface/src/Menu.h | 2 + .../src/gpu/gl45/GL45BackendTexture.cpp | 33 +--------------- libraries/gpu/src/gpu/Texture.cpp | 31 +++++++++++++++ libraries/gpu/src/gpu/Texture.h | 9 +++++ 5 files changed, 82 insertions(+), 32 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 3c1aa26a4a..74490b6dd1 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -355,7 +355,7 @@ Menu::Menu() { //const QString = "1024 MB"; //const QString = "2048 MB"; - // Developer > Render > Resolution + // Developer > Render > Maximum Texture Memory MenuWrapper* textureMenu = renderOptionsMenu->addMenu(MenuOption::RenderMaxTextureMemory); QActionGroup* textureGroup = new QActionGroup(textureMenu); textureGroup->setExclusive(true); @@ -383,6 +383,43 @@ Menu::Menu() { gpu::Texture::setAllowedGPUMemoryUsage(newMaxTextureMemory); }); +#ifdef Q_OS_WIN + #define MIN_CORES_FOR_INCREMENTAL_TEXTURES 5 + bool recommendedIncrementalTransfers = (QThread::idealThreadCount() >= MIN_CORES_FOR_INCREMENTAL_TEXTURES); + bool recommendedSparseTextures = recommendedIncrementalTransfers; + + qDebug() << "[TEXTURE TRANSFER SUPPORT]" + << "\n\tidealThreadCount:" << QThread::idealThreadCount() + << "\n\tRECOMMENDED enableSparseTextures:" << recommendedSparseTextures + << "\n\tRECOMMENDED enableIncrementalTextures:" << recommendedIncrementalTransfers; + + gpu::Texture::setEnableIncrementalTextureTransfers(recommendedIncrementalTransfers); + gpu::Texture::setEnableSparseTextures(recommendedSparseTextures); + + // Developer > Render > Enable Dynamic Texture Management + { + auto action = addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::EnableDynamicTextureManagement, 0, recommendedSparseTextures); + connect(action, &QAction::triggered, [&](bool checked) { + qDebug() << "[TEXTURE TRANSFER SUPPORT] --- Enable Dynamic Texture Management menu option:" << checked; + gpu::Texture::setEnableSparseTextures(checked); + }); + } + + // Developer > Render > Enable Incremental Texture Transfer + { + auto action = addCheckableActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::EnableIncrementalTextureTransfer, 0, recommendedIncrementalTransfers); + connect(action, &QAction::triggered, [&](bool checked) { + qDebug() << "[TEXTURE TRANSFER SUPPORT] --- Enable Incremental Texture Transfer menu option:" << checked; + gpu::Texture::setEnableIncrementalTextureTransfers(checked); + }); + } + +#else + qDebug() << "[TEXTURE TRANSFER SUPPORT] Incremental Texture Transfer and Dynamic Texture Management not supported on this platform."; +#endif + + + // Developer > Render > LOD Tools addActionToQMenuAndActionHash(renderOptionsMenu, MenuOption::LodTools, 0, dialogsManager.data(), SLOT(lodTools())); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index b25603caeb..95cd4c5aa6 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -98,6 +98,8 @@ namespace MenuOption { const QString EchoLocalAudio = "Echo Local Audio"; const QString EchoServerAudio = "Echo Server Audio"; const QString EnableCharacterController = "Enable avatar collisions"; + const QString EnableIncrementalTextureTransfer = "Enable Incremental Texture Transfer"; + const QString EnableDynamicTextureManagement = "Enable Dynamic Texture Management"; const QString EnableInverseKinematics = "Enable Inverse Kinematics"; const QString ExpandMyAvatarSimulateTiming = "Expand /myAvatar/simulation"; const QString ExpandMyAvatarTiming = "Expand /myAvatar"; diff --git a/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp b/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp index 275b1d54ab..8aa6633f9c 100644 --- a/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp +++ b/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp @@ -17,7 +17,6 @@ #include #include -#include #include "../gl/GLTexelFormat.h" @@ -25,34 +24,6 @@ using namespace gpu; using namespace gpu::gl; using namespace gpu::gl45; -#ifdef Q_OS_WIN -#define MIN_CORES_FOR_INCREMENTAL_TEXTURES 5 -static const QString DEBUG_FLAG_INCREMENTAL("HIFI_DISABLE_INCREMENTAL_TEXTURES"); -static const QString DEBUG_FLAG_SPARSE("HIFI_DISABLE_SPARSE_TEXTURES"); - -static const bool enableIncrementalTextures = (QThread::idealThreadCount() >= MIN_CORES_FOR_INCREMENTAL_TEXTURES) && - !QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG_INCREMENTAL); - -static const bool enableSparseTextures = enableIncrementalTextures && - !QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG_SPARSE); - -class TextureTransferDebug { -public: - TextureTransferDebug() { - qDebug() << "[TEXTURE TRANSFER SUPPORT]" - << "\n\tHIFI_DISABLE_INCREMENTAL_TEXTURES:" << QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG_INCREMENTAL) - << "\n\tHIFI_DISABLE_SPARSE_TEXTURES:" << QProcessEnvironment::systemEnvironment().contains(DEBUG_FLAG_SPARSE) - << "\n\tidealThreadCount:" << QThread::idealThreadCount() - << "\n\tenableSparseTextures:" << enableSparseTextures - << "\n\tenableIncrementalTextures:" << enableSparseTextures; - } -}; -TextureTransferDebug sparseTextureDebugInfo; -#else -static bool enableSparseTextures = false; -static bool enableIncrementalTextures = false; -#endif - // Allocate 1 MB of buffer space for paged transfers #define DEFAULT_PAGE_BUFFER_SIZE (1024*1024) #define DEFAULT_GL_PIXEL_ALIGNMENT 4 @@ -274,7 +245,7 @@ GLuint GL45Backend::getTextureID(const TexturePointer& texture, bool transfer) { GL45Texture::GL45Texture(const std::weak_ptr& backend, const Texture& texture, bool transferrable) : GLTexture(backend, texture, allocate(texture), transferrable), _sparseInfo(*this), _transferState(*this) { - if (enableSparseTextures && _transferrable) { + if (_transferrable && Texture::getEnableSparseTextures()) { _sparseInfo.maybeMakeSparse(); } } @@ -373,7 +344,7 @@ void GL45Texture::startTransfer() { } bool GL45Texture::continueTransfer() { - if (!enableIncrementalTextures) { + if (!Texture::getEnableIncrementalTextureTransfers()) { size_t maxFace = GL_TEXTURE_CUBE_MAP == _target ? CUBE_NUM_FACES : 1; for (uint8_t face = 0; face < maxFace; ++face) { for (uint16_t mipLevel = _minMip; mipLevel <= _maxMip; ++mipLevel) { diff --git a/libraries/gpu/src/gpu/Texture.cpp b/libraries/gpu/src/gpu/Texture.cpp index b573c8e899..44804abebe 100755 --- a/libraries/gpu/src/gpu/Texture.cpp +++ b/libraries/gpu/src/gpu/Texture.cpp @@ -9,6 +9,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // + +#include + #include "Texture.h" #include @@ -28,6 +31,34 @@ std::atomic Texture::_textureCPUCount{ 0 }; std::atomic Texture::_textureCPUMemoryUsage{ 0 }; std::atomic Texture::_allowedCPUMemoryUsage { 0 }; +std::atomic Texture::_enableSparseTextures { false }; +std::atomic Texture::_enableIncrementalTextureTransfers { false }; + +void Texture::setEnableSparseTextures(bool enabled) { +#ifdef Q_OS_WIN + qDebug() << "[TEXTURE TRANSFER SUPPORT] SETTING - Enable Sparse Textures and Dynamic Texture Management:" << enabled; + _enableSparseTextures = enabled; + if (!_enableIncrementalTextureTransfers && _enableSparseTextures) { + qDebug() << "[TEXTURE TRANSFER SUPPORT] WARNING - Sparse texture management requires incremental texture transfer enabled."; + } +#else + qDebug() << "[TEXTURE TRANSFER SUPPORT] Sparse Textures and Dynamic Texture Management not supported on this platform."; +#endif +} + +void Texture::setEnableIncrementalTextureTransfers(bool enabled) { +#ifdef Q_OS_WIN + qDebug() << "[TEXTURE TRANSFER SUPPORT] SETTING - Enable Incremental Texture Transfer:" << enabled; + _enableIncrementalTextureTransfers = enabled; + if (!_enableIncrementalTextureTransfers && _enableSparseTextures) { + qDebug() << "[TEXTURE TRANSFER SUPPORT] WARNING - Sparse texture management requires incremental texture transfer enabled."; + } +#else + qDebug() << "[TEXTURE TRANSFER SUPPORT] Incremental Texture Transfer not supported on this platform."; +#endif +} + + void Texture::updateTextureCPUMemoryUsage(Size prevObjectSize, Size newObjectSize) { if (prevObjectSize == newObjectSize) { return; diff --git a/libraries/gpu/src/gpu/Texture.h b/libraries/gpu/src/gpu/Texture.h index ae1afcafcb..61d03c070c 100755 --- a/libraries/gpu/src/gpu/Texture.h +++ b/libraries/gpu/src/gpu/Texture.h @@ -144,6 +144,9 @@ class Texture : public Resource { static std::atomic _textureCPUMemoryUsage; static std::atomic _allowedCPUMemoryUsage; static void updateTextureCPUMemoryUsage(Size prevObjectSize, Size newObjectSize); + + static std::atomic _enableSparseTextures; + static std::atomic _enableIncrementalTextureTransfers; public: static uint32_t getTextureCPUCount(); static Size getTextureCPUMemoryUsage(); @@ -154,6 +157,12 @@ public: static Size getAllowedGPUMemoryUsage(); static void setAllowedGPUMemoryUsage(Size size); + static bool getEnableSparseTextures() { return _enableSparseTextures.load(); } + static bool getEnableIncrementalTextureTransfers() { return _enableIncrementalTextureTransfers.load(); } + + static void setEnableSparseTextures(bool enabled); + static void setEnableIncrementalTextureTransfers(bool enabled); + class Usage { public: enum FlagBit { From 5e842843c61c3103264939bfd4a7784ef5a6e9e7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 30 Sep 2016 11:54:32 +1300 Subject: [PATCH 057/300] Set alphabetic/numeric keyboard per field entered --- .../resources/html/raiseAndLowerKeyboard.js | 38 +++++++++++++------ libraries/gl/src/gl/OffscreenQmlSurface.cpp | 22 ++++++++--- libraries/gl/src/gl/OffscreenQmlSurface.h | 2 +- libraries/ui/src/QmlWebWindowClass.cpp | 17 ++++++--- libraries/ui/src/QmlWebWindowClass.h | 2 +- scripts/system/html/js/keyboardControl.js | 19 ++++------ 6 files changed, 64 insertions(+), 36 deletions(-) diff --git a/interface/resources/html/raiseAndLowerKeyboard.js b/interface/resources/html/raiseAndLowerKeyboard.js index a4138d1627..aeca4dc112 100644 --- a/interface/resources/html/raiseAndLowerKeyboard.js +++ b/interface/resources/html/raiseAndLowerKeyboard.js @@ -12,10 +12,11 @@ var MAX_WARNINGS = 3; var numWarnings = 0; var isKeyboardRaised = false; + var isNumericKeyboard = false; var KEYBOARD_HEIGHT = 200; function shouldRaiseKeyboard() { - if (document.activeElement.nodeName == "INPUT" || document.activeElement.nodeName == "TEXTAREA") { + if (document.activeElement.nodeName === "INPUT" || document.activeElement.nodeName === "TEXTAREA") { return true; } else { // check for contenteditable attribute @@ -29,26 +30,39 @@ } }; + function shouldSetNumeric() { + return document.activeElement.type === "number"; + }; + setInterval(function () { - if (isKeyboardRaised !== shouldRaiseKeyboard()) { - isKeyboardRaised = !isKeyboardRaised; + var keyboardRaised = shouldRaiseKeyboard(); + var numericKeyboard = shouldSetNumeric(); - if (isKeyboardRaised) { - var delta = document.activeElement.getBoundingClientRect().bottom + 10 - - (document.body.clientHeight - KEYBOARD_HEIGHT); - if (delta > 0) { - document.body.scrollTop += delta; - } - } + if (keyboardRaised !== isKeyboardRaised || numericKeyboard !== isNumericKeyboard) { - if (typeof EventBridge != "undefined") { - EventBridge.emitWebEvent(isKeyboardRaised ? "_RAISE_KEYBOARD" : "_LOWER_KEYBOARD"); + if (typeof EventBridge !== "undefined") { + EventBridge.emitWebEvent( + keyboardRaised ? ("_RAISE_KEYBOARD" + (numericKeyboard ? "_NUMERIC" : "")) : "_LOWER_KEYBOARD" + ); } else { if (numWarnings < MAX_WARNINGS) { console.log("WARNING: no global EventBridge object found"); numWarnings++; } } + + if (!isKeyboardRaised) { + var delta = document.activeElement.getBoundingClientRect().bottom + 10 + - (document.body.clientHeight - KEYBOARD_HEIGHT); + if (delta > 0) { + setTimeout(function () { + document.body.scrollTop += delta; + }, 500); // Allow time for keyboard to be raised in QML. + } + } + + isKeyboardRaised = keyboardRaised; + isNumericKeyboard = numericKeyboard; } }, POLL_FREQUENCY); })(); diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index ad7561e9f7..2112288db1 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -857,7 +857,7 @@ void OffscreenQmlSurface::onFocusObjectChanged(QObject* object) { } // Handle QML text fields' focus and unfocus - testing READ_ONLY_PROPERTY prevents action for HTML files. - // HTML text fields are handled via emitWebEvent(). + // HTML text fields are handled in emitWebEvent() methods. const char* READ_ONLY_PROPERTY = "readOnly"; setKeyboardRaised(item, item->hasActiveFocus() && item->property(READ_ONLY_PROPERTY) == false); _currentFocusItem = item; @@ -919,14 +919,20 @@ void OffscreenQmlSurface::synthesizeKeyPress(QString key) { QCoreApplication::postEvent(getEventHandler(), releaseEvent); } -void OffscreenQmlSurface::setKeyboardRaised(QObject* object, bool raised) { +void OffscreenQmlSurface::setKeyboardRaised(QObject* object, bool raised, bool numeric) { if (!object) { return; } QQuickItem* item = dynamic_cast(object); while (item) { + // Numeric value may be set in parameter from HTML UI; for QML UI, detect numeric fields here. + numeric = numeric || QString(item->metaObject()->className()).left(7) == "SpinBox"; + if (item->property("keyboardRaised").isValid()) { + if (item->property("punctuationMode").isValid()) { + item->setProperty("punctuationMode", QVariant(numeric)); + } item->setProperty("keyboardRaised", QVariant(raised)); return; } @@ -946,10 +952,14 @@ void OffscreenQmlSurface::emitWebEvent(const QVariant& message) { if (QThread::currentThread() != thread()) { QMetaObject::invokeMethod(this, "emitWebEvent", Qt::QueuedConnection, Q_ARG(QVariant, message)); } else { - // special case to handle raising and lowering the virtual keyboard - if (message.type() == QVariant::String && message.toString() == "_RAISE_KEYBOARD") { - setKeyboardRaised(_currentFocusItem, true); - } else if (message.type() == QVariant::String && message.toString() == "_LOWER_KEYBOARD") { + // Special case to handle raising and lowering the virtual keyboard. + const QString RAISE_KEYBOARD = "_RAISE_KEYBOARD"; + const QString RAISE_KEYBOARD_NUMERIC = "_RAISE_KEYBOARD_NUMERIC"; + const QString LOWER_KEYBOARD = "_LOWER_KEYBOARD"; + QString messageString = message.type() == QVariant::String ? message.toString() : ""; + if (messageString.left(RAISE_KEYBOARD.length()) == RAISE_KEYBOARD) { + setKeyboardRaised(_currentFocusItem, true, messageString == RAISE_KEYBOARD_NUMERIC); + } else if (messageString == LOWER_KEYBOARD) { setKeyboardRaised(_currentFocusItem, false); } else { emit webEventReceived(message); diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index 46abef272f..31741b09d5 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -70,7 +70,7 @@ public: QPointF mapToVirtualScreen(const QPointF& originalPoint, QObject* originalWidget); bool eventFilter(QObject* originalDestination, QEvent* event) override; - void setKeyboardRaised(QObject* object, bool raised); + void setKeyboardRaised(QObject* object, bool raised, bool numeric = false); Q_INVOKABLE void synthesizeKeyPress(QString key); diff --git a/libraries/ui/src/QmlWebWindowClass.cpp b/libraries/ui/src/QmlWebWindowClass.cpp index 5a357a83d4..84d0aa0489 100644 --- a/libraries/ui/src/QmlWebWindowClass.cpp +++ b/libraries/ui/src/QmlWebWindowClass.cpp @@ -43,10 +43,14 @@ void QmlWebWindowClass::emitWebEvent(const QVariant& webMessage) { if (QThread::currentThread() != thread()) { QMetaObject::invokeMethod(this, "emitWebEvent", Qt::QueuedConnection, Q_ARG(QVariant, webMessage)); } else { - // Special cases for raising and lowering the virtual keyboard. - if (webMessage.type() == QVariant::String && webMessage.toString() == "_RAISE_KEYBOARD") { - setKeyboardRaised(asQuickItem(), true); - } else if (webMessage.type() == QVariant::String && webMessage.toString() == "_LOWER_KEYBOARD") { + // Special case to handle raising and lowering the virtual keyboard. + const QString RAISE_KEYBOARD = "_RAISE_KEYBOARD"; + const QString RAISE_KEYBOARD_NUMERIC = "_RAISE_KEYBOARD_NUMERIC"; + const QString LOWER_KEYBOARD = "_LOWER_KEYBOARD"; + QString messageString = webMessage.type() == QVariant::String ? webMessage.toString() : ""; + if (messageString.left(RAISE_KEYBOARD.length()) == RAISE_KEYBOARD) { + setKeyboardRaised(asQuickItem(), true, messageString == RAISE_KEYBOARD_NUMERIC); + } else if (messageString == LOWER_KEYBOARD) { setKeyboardRaised(asQuickItem(), false); } else { emit webEventReceived(webMessage); @@ -54,7 +58,7 @@ void QmlWebWindowClass::emitWebEvent(const QVariant& webMessage) { } } -void QmlWebWindowClass::setKeyboardRaised(QObject* object, bool raised) { +void QmlWebWindowClass::setKeyboardRaised(QObject* object, bool raised, bool numeric) { if (!object) { return; } @@ -62,6 +66,9 @@ void QmlWebWindowClass::setKeyboardRaised(QObject* object, bool raised) { QQuickItem* item = dynamic_cast(object); while (item) { if (item->property("keyboardRaised").isValid()) { + if (item->property("punctuationMode").isValid()) { + item->setProperty("punctuationMode", QVariant(numeric)); + } item->setProperty("keyboardRaised", QVariant(raised)); return; } diff --git a/libraries/ui/src/QmlWebWindowClass.h b/libraries/ui/src/QmlWebWindowClass.h index 95851d2857..e32c6d5a04 100644 --- a/libraries/ui/src/QmlWebWindowClass.h +++ b/libraries/ui/src/QmlWebWindowClass.h @@ -35,7 +35,7 @@ protected: QString qmlSource() const override { return "QmlWebWindow.qml"; } private: - void setKeyboardRaised(QObject* object, bool raised); + void setKeyboardRaised(QObject* object, bool raised, bool numeric = false); }; #endif diff --git a/scripts/system/html/js/keyboardControl.js b/scripts/system/html/js/keyboardControl.js index b19b8953c0..291330e8de 100644 --- a/scripts/system/html/js/keyboardControl.js +++ b/scripts/system/html/js/keyboardControl.js @@ -20,18 +20,15 @@ function setUpKeyboardControl() { lowerTimer = null; } - if (isRaised) { - return; - } + EventBridge.emitWebEvent("_RAISE_KEYBOARD" + (this.type === "number" ? "_NUMERIC" : "")); - var delta = this.getBoundingClientRect().bottom + 10 - (document.body.clientHeight - KEYBOARD_HEIGHT); - - EventBridge.emitWebEvent("_RAISE_KEYBOARD"); - - if (delta > 0) { - setTimeout(function () { - document.body.scrollTop += delta; - }, 500); // Allow time for keyboard to be raised in QML. + if (!isRaised) { + var delta = this.getBoundingClientRect().bottom + 10 - (document.body.clientHeight - KEYBOARD_HEIGHT); + if (delta > 0) { + setTimeout(function () { + document.body.scrollTop += delta; + }, 500); // Allow time for keyboard to be raised in QML. + } } isRaised = true; From c849307b3dede646b8baaa70e71353e7740c8eb3 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Thu, 29 Sep 2016 15:22:21 -0700 Subject: [PATCH 058/300] avoid repetition with fade on injectors --- assignment-client/src/audio/AudioMixer.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/audio/AudioMixer.cpp b/assignment-client/src/audio/AudioMixer.cpp index 2d2f9c267e..ccd80a4a11 100644 --- a/assignment-client/src/audio/AudioMixer.cpp +++ b/assignment-client/src/audio/AudioMixer.cpp @@ -269,19 +269,17 @@ void AudioMixer::addStreamToMixForListeningNodeWithStream(AudioMixerClientData& bool forceSilentBlock = true; if (!streamToAdd.getLastPopOutput().isNull()) { + bool isInjector = dynamic_cast(&streamToAdd); - // reptition with fade is enabled, and we do have a valid previous frame to repeat - // so we mix the previously-mixed block - - // this is preferable to not mixing it at all to avoid the harsh jump to silence + // in an injector, just go silent - the injector has likely ended + // in other inputs (microphone, &c.), repeat with fade to avoid the harsh jump to silence // we'll repeat the last block until it has a block to mix // and we'll gradually fade that repeated block into silence. // calculate its fade factor, which depends on how many times it's already been repeated. - repeatedFrameFadeFactor = calculateRepeatedFrameFadeFactor(streamToAdd.getConsecutiveNotMixedCount() - 1); - if (repeatedFrameFadeFactor > 0.0f) { + if (!isInjector && repeatedFrameFadeFactor > 0.0f) { // apply the repeatedFrameFadeFactor to the gain gain *= repeatedFrameFadeFactor; From a0dd3d877175eaa32780c8cbb37c8bf8e147fede Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 30 Sep 2016 13:43:55 +1300 Subject: [PATCH 059/300] Debounce lowering keyboard and immediately raising it again --- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 2112288db1..74cdb78b46 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -853,13 +853,17 @@ void OffscreenQmlSurface::onFocusObjectChanged(QObject* object) { if (_currentFocusItem) { disconnect(_currentFocusItem, &QObject::destroyed, this, 0); - setKeyboardRaised(_currentFocusItem, false); } - // Handle QML text fields' focus and unfocus - testing READ_ONLY_PROPERTY prevents action for HTML files. - // HTML text fields are handled in emitWebEvent() methods. + // Raise and lower keyboard for QML text fields. + // HTML text fields are handled in emitWebEvent() methods - testing READ_ONLY_PROPERTY prevents action for HTML files. const char* READ_ONLY_PROPERTY = "readOnly"; - setKeyboardRaised(item, item->hasActiveFocus() && item->property(READ_ONLY_PROPERTY) == false); + bool raiseKeyboard = item->hasActiveFocus() && item->property(READ_ONLY_PROPERTY) == false; + if (_currentFocusItem && !raiseKeyboard) { + setKeyboardRaised(_currentFocusItem, false); + } + setKeyboardRaised(item, raiseKeyboard); // Always set focus so that alphabetic / numeric setting is updated. + _currentFocusItem = item; connect(_currentFocusItem, &QObject::destroyed, this, &OffscreenQmlSurface::focusDestroyed); } From a2da749f52d435b4a57856e4de8a0a9620bb05eb Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Wed, 28 Sep 2016 19:17:24 -0700 Subject: [PATCH 060/300] Backup old domain. --- server-console/src/content-update.css | 62 ++++++++++++++++++++++++++ server-console/src/content-update.html | 22 +++++++++ server-console/src/content-update.js | 12 +++++ server-console/src/main.js | 61 +++++++++++++++---------- 4 files changed, 134 insertions(+), 23 deletions(-) create mode 100644 server-console/src/content-update.css create mode 100644 server-console/src/content-update.html create mode 100644 server-console/src/content-update.js diff --git a/server-console/src/content-update.css b/server-console/src/content-update.css new file mode 100644 index 0000000000..8c9a7c159b --- /dev/null +++ b/server-console/src/content-update.css @@ -0,0 +1,62 @@ +@font-face { + font-family: 'Raleway'; + src: url('vendor/Raleway/Raleway-Regular.ttf'); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Raleway'; + src: url('vendor/Raleway/Raleway-ExtraLight.ttf'); + font-weight: 200; + font-style: normal; +} +@font-face { + font-family: 'Raleway'; + src: url('vendor/Raleway/Raleway-SemiBold.ttf'); + font-weight: bold; + font-style: normal; +} + + +* { + font-family: "Raleway", "Open Sans", Arial, Helvetica, sans-serif; + line-height: 130%; +} + +body { + margin: 0; + padding: 0; + color: #808785; + margin: 0 auto; + text-align: center; + font-size: 13.5pt; + -webkit-touch-callout: none; -webkit-user-select: none; + cursor: default; + overflow: hidden; + font-variant-numeric: lining-nums; + -moz-font-feature-settings: "lnum"; + -webkit-font-feature-settings: "lnum"; + font-feature-settings: "lnum"; +} + +.selectable { + -webkit-touch-callout: text; + -webkit-user-select: text; + cursor: text; +} + +h1 { + font-size: 29pt; + font-weight: normal; +} + +a:link, +a:visited, +a:hover, +a:active { + color: #B4B4B4; +} + +a:hover { + color: #2D88A4; +} diff --git a/server-console/src/content-update.html b/server-console/src/content-update.html new file mode 100644 index 0000000000..7b3d1f343d --- /dev/null +++ b/server-console/src/content-update.html @@ -0,0 +1,22 @@ + + + + Server Backup + + + + +
+

We backed up your old server just in case.
If you wish to restore it, do the following:

+

+ 1) Stop your server.
+ 2) Go to the backup directory bellow.
+ 3) Move the content in the parent directory.
+ 4) Restart your server.
+
+ Backup Directory:
+ +

+
+ + diff --git a/server-console/src/content-update.js b/server-console/src/content-update.js new file mode 100644 index 0000000000..c77cfc92c6 --- /dev/null +++ b/server-console/src/content-update.js @@ -0,0 +1,12 @@ +function ready() { + console.log("Ready"); + + const electron = require('electron'); + window.$ = require('./vendor/jquery/jquery-2.1.4.min.js'); + + electron.ipcRenderer.on('update', function(event, message) { + $('#directory').html(message); + }); + + electron.ipcRenderer.send('ready'); +} diff --git a/server-console/src/main.js b/server-console/src/main.js index 82fe6b6b4d..2835dd338b 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -488,27 +488,51 @@ function updateTrayMenu(serverState) { const httpStatusPort = 60332; -function deleteResourceDirectories() { - const dsResourceDirectory = getDomainServerClientResourcesDirectory(); +function backupResourceDirectories(folder) { try { - fs.removeSync(dsResourceDirectory); - console.log("Deleted directory " + dsResourceDirectory); - } catch (e) { - console.log(e); - } - const acResourceDirectory = getAssignmentClientResourcesDirectory(); - try { - fs.removeSync(acResourceDirectory); - console.log("Deleted directory " + acResourceDirectory); + fs.mkdirSync(folder); + console.log("Created directory " + folder); + + + var dsBackup = path.join(folder, '/domain-server'); + fs.renameSync(getDomainServerClientResourcesDirectory(), dsBackup); + console.log("Moved directory " + getDomainServerClientResourcesDirectory()); + console.log("to " + dsBackup); + + var acBackup = path.join(folder, '/assignment-client'); + fs.renameSync(getAssignmentClientResourcesDirectory(), acBackup); + console.log("Moved directory " + getDomainServerClientResourcesDirectory()); + console.log("to " + acBackup); } catch (e) { console.log(e); } } -function deleteResourceDirectoriesAndRestart() { +function backupResourceDirectoriesAndRestart() { homeServer.stop(); - deleteResourceDirectories(); + + var date = new Date(); + var folder = getRootHifiDataDirectory() + "/Server Backup - " + date; + backupResourceDirectories(folder); maybeInstallDefaultContentSet(onContentLoaded); + + // Explain user how to restore server + var window = new BrowserWindow({ + icon: appIcon, + width: 500, + height: 350, + }); + window.loadURL('file://' + __dirname + '/content-update.html'); + if (!debug) { + window.setMenu(null); + } + window.show(); + + electron.ipcMain.on('ready', function() { + console.log("got ready"); + + window.webContents.send('update', folder); + }); } function checkNewContent() { @@ -537,16 +561,7 @@ function checkNewContent() { message: 'A newer version of the home content set is available.\nDo you wish to update?' }, function(idx) { if (idx === 0) { - dialog.showMessageBox({ - type: 'question', - buttons: ['Yes', 'No'], - title: 'Are you sure?', - message: 'This action will delete your current sandbox content.\nDo you wish to continue?' - }, function(idx) { - if (idx === 0 && homeServer) { - deleteResourceDirectoriesAndRestart(); - } - }); + backupResourceDirectoriesAndRestart(); } else { // They don't want to update, mark content set as current userConfig.set('homeContentLastModified', new Date()); From 23c1469df77b7874df49a098f0fb026116724be4 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 29 Sep 2016 12:15:48 -0700 Subject: [PATCH 061/300] Fix windows odd folder name issue --- server-console/src/main.js | 48 ++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/server-console/src/main.js b/server-console/src/main.js index 2835dd338b..b442d28855 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -503,36 +503,44 @@ function backupResourceDirectories(folder) { fs.renameSync(getAssignmentClientResourcesDirectory(), acBackup); console.log("Moved directory " + getDomainServerClientResourcesDirectory()); console.log("to " + acBackup); + return true; } catch (e) { console.log(e); + return false; } } function backupResourceDirectoriesAndRestart() { homeServer.stop(); - var date = new Date(); - var folder = getRootHifiDataDirectory() + "/Server Backup - " + date; - backupResourceDirectories(folder); - maybeInstallDefaultContentSet(onContentLoaded); + var folder = getRootHifiDataDirectory() + "/Server Backup - " + Date.now(); + if (backupResourceDirectories(folder)) { + maybeInstallDefaultContentSet(onContentLoaded); - // Explain user how to restore server - var window = new BrowserWindow({ - icon: appIcon, - width: 500, - height: 350, - }); - window.loadURL('file://' + __dirname + '/content-update.html'); - if (!debug) { - window.setMenu(null); + // Explain user how to restore server + var window = new BrowserWindow({ + icon: appIcon, + width: 500, + height: 350, + }); + window.loadURL('file://' + __dirname + '/content-update.html'); + if (!debug) { + window.setMenu(null); + } + window.show(); + + electron.ipcMain.on('ready', function() { + console.log("got ready"); + window.webContents.send('update', folder); + }); + } else { + dialog.showMessageBox({ + type: 'warning', + buttons: ['Ok'], + title: 'Update Error', + message: 'There was an error updating the content, aborting.' + }, function() {}); } - window.show(); - - electron.ipcMain.on('ready', function() { - console.log("got ready"); - - window.webContents.send('update', folder); - }); } function checkNewContent() { From 4c066bf82187d5d239ca03a5167ac34d30551e58 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 29 Sep 2016 15:42:25 -0700 Subject: [PATCH 062/300] Update instructions UI --- server-console/src/content-update.css | 122 +++++++++++++++++++++++-- server-console/src/content-update.html | 71 ++++++++++---- server-console/src/images/step1.jpg | Bin 0 -> 10485 bytes server-console/src/images/step2.jpg | Bin 0 -> 3403 bytes server-console/src/images/step3.jpg | Bin 0 -> 6329 bytes server-console/src/images/step4.jpg | Bin 0 -> 10065 bytes server-console/src/main.js | 45 +++++---- 7 files changed, 197 insertions(+), 41 deletions(-) create mode 100644 server-console/src/images/step1.jpg create mode 100644 server-console/src/images/step2.jpg create mode 100644 server-console/src/images/step3.jpg create mode 100644 server-console/src/images/step4.jpg diff --git a/server-console/src/content-update.css b/server-console/src/content-update.css index 8c9a7c159b..ebfd8aeba0 100644 --- a/server-console/src/content-update.css +++ b/server-console/src/content-update.css @@ -28,7 +28,7 @@ body { padding: 0; color: #808785; margin: 0 auto; - text-align: center; + text-align: left; font-size: 13.5pt; -webkit-touch-callout: none; -webkit-user-select: none; cursor: default; @@ -45,11 +45,6 @@ body { cursor: text; } -h1 { - font-size: 29pt; - font-weight: normal; -} - a:link, a:visited, a:hover, @@ -60,3 +55,118 @@ a:active { a:hover { color: #2D88A4; } + +.header{ + width: 95%; + left: 2.5% +} +.colmask{ + width: 95%; + left: 2.5% +} +.colmid{ right: 25% } +.colin{ right: 25% } +.colleft{ right: 25% } +.col1{ + width: 23%; + left: 101% +} +.col2{ + width: 23%; + left: 53% +} +.col3{ + width: 23%; + left: 80% +} +.col4{ + width: 23%; + left: 82% +} +.footer{ + width: 95%; + left: 2.5% +} +.header{ + clear: both; + float: left; + position: relative; + border-bottom: #000 1px solid; + background-color: #b4d2f7 +} +.colmask{ + clear: both; + float: left; + overflow: hidden; + position: relative; + +} +.colmid{ + float: left; + width: 100%; + position: relative; + +} +.colin{ + float: left; + width: 100%; + position: relative; + +} +.colleft{ + float: left; + width: 100%; + position: relative; + +} +.col1{ + padding: 0px 0px 1em 0px; + overflow: hidden; + float: left; + position: relative; + +} +.col2{ + padding: 0px 0px 1em 0px; + overflow: hidden; + float: left; + position: relative; + +} +.col3{ + padding: 0px 0px 1em 0px; + overflow: hidden; + float: left; + position: relative; + +} +.col4{ + padding: 0px 0px 1em 0px; + overflow: hidden; + float: left; + position: relative; + +} +.footer{ + clear: both; + float: left; + position: relative; + padding-top: 8px; + border-top: #000 1px solid; + +} +.bottom{ + clear: both; + width: 100%; + float: left; + position: relative; + +} +body { + border-width: 0px; + padding: 0px; + margin: 0px; + font-size: 90%; + width: 100%; + min-width: 600px; +} diff --git a/server-console/src/content-update.html b/server-console/src/content-update.html index 7b3d1f343d..3c0eff2fa0 100644 --- a/server-console/src/content-update.html +++ b/server-console/src/content-update.html @@ -1,22 +1,57 @@ - - Server Backup - - - - -
-

We backed up your old server just in case.
If you wish to restore it, do the following:

-

- 1) Stop your server.
- 2) Go to the backup directory bellow.
- 3) Move the content in the parent directory.
- 4) Restart your server.
-
- Backup Directory:
- -

+ + Server Backup + + + + +
+ diff --git a/server-console/src/images/step1.jpg b/server-console/src/images/step1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd80ae553782fb968216d5b0dc5494cc0fa63485 GIT binary patch literal 10485 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 z�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 literal 0 HcmV?d00001 diff --git a/server-console/src/images/step2.jpg b/server-console/src/images/step2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6bc285ac472f867528f5ecc1b4e6f77be574e32d GIT binary patch literal 3403 zcmcgsc|6p4AOFqec<7LdZ9As1>15`I!3<+6L#b$+8F#5M2ZK4xjLZn=ihb@2xFb_pPphF6x`%3@_00#ho0sx9`80ae!@$qOhS7=OQ@VuGEbRGvSrt#6B zF$N7-6UBTQ-JdB!dNY04TmovS^gas7W)M)WSVxQ_-UN10tSnKnjKVd zaIkT(sWDIBg9dRp92#SSHZd_0Fjz)H30FiD8*zmOa|$G;kS<{JMQk1ysZ^wS^MXVK z6l!h=9R3&CuX^>jKu5=aAIjl;i57~;%=vo1DlDW*_)IjJDdYtS=u9$`WuQ#O$J+{+ zG!aigRdbC*lcxd3>a;t;#jzCPx~b%~dvTR5Vo%v3jovE$4g)PR;#A2r<#%zvD;?aXROs;5-%b4fdF343b z2#zu{i78+oWispqJPuMda6EhAT5t>M&2kwF*Ro?lF4_iZjaE+Y-==%6iA=IretucJ zHpuzq&*U-)C;^ISqZkAhtClRl_zeI6h@u_%8Gu3{5GVu+g+gJ<8wOK8;4mfN2)GIe zgqoVVni@hwLsL^jLt9HrOM4zlDjW{iKp-@&L)devY*Xc};O4I4JI)?`>>*}px|gH%^5;*zH{A6(;~M@t&ZqKHhP`HFVqev$ zZF5=R{U#UvByT(>jDNRbV8}nFx;kvQu%taay^nq1MTJIEYW~f3?9&iu+bMmb{Ze(IlhTpFD zBV1CxWmwA062H~c(^VJU-N)lWOM|Yp3czQ7Qxm^d&%@JW+)7&WjRJT)SzfL?JU#^; zqad(UGPq*(nKOZGox-Su?N73QM*RJ{qVirpc*FL{;>p}4KfcL28|}Tj1q_R%U#KPq zwRQ%~e2(Z`)&A~YdsrN+?(UOcjocYIU0DCMlklUs};qp2;{eZRTrO5rD4UcO7d{`%pZ-v~_0(23zdl@-xVbsxvXaK+D@hxz zhE}ybrIgf8)b-z7okzQo@g_{}>1os%>h|%W0+1Z~Jn8HVA1*q1^Ma*Z(&BR4Q>{(f zR+R%jJ+PIPgj=JV=@%HDgI$%?ZkOs(S1_}$C~bQ z!>&LMww~R2UdzWUtn%fo|^JKTO)2?M@%F!$Q4!+(iwse!ukO;j?!ZLlnY1+0i zZtWVcW}&Y~iC$o~+uiTG$^Lxh!FB3`-m>Em-r(sYqoO`K1u@sw*(a@)$m{=t3H#B(bQ@B9D&fPTdKz)efnjwyhs=1~EQ!W2wALRTdJ$^Lk@ zDsSAmw=OGw!vSTW3XWD8!L22{xQuxVF3zYd@GLF7XS$4KNlofhM$)EENUv-UZJ9Ck ztbds3826}aTg7ML)yzN8i|@3$UfPo87H2=J2|&ySW4c&<6)xu|5(wj$lYOYSQz##U zLfxNSJGx1`-*JiVQ3E#c-vf{;?-cBha z`zB%>o|hf1Z;G0dysI{hjGdNUlixX)8!%%w_D3w~;g3$LUmy8A)Awynt^DZ%LS5T@ zXasRay~&Z-Z1F&ao2)YA{obe+QB>r?tQl<(mmRmC+SZ-=Ns?3JjhPHIT-0FI|I(ta z0X3pt(O4MuHg;lxiRy@huICG+4^!KbO();nzfxxtstefnFoWuvm{tD zbnSgd68a*^hpxO0Z)Ee-3r=2rZ+~_;vp#xCzq6W>{$}eV_gJU1=SM&EKJRhO7{MEG zQm``~iysT)dh#A-l12yLDBFFbi^VOUe62v4Yy2I<%esxFsgyXcm^AZN`Qe@`{k1qR zkB%hKey71OC+86R)9pUd5%E72uI`ce3)uApt9xTO=e||{cjO-g@A=tZ1P4 znYG=(?Heg+OhIMSosQ$l=wBMkYad&nV48iM^4@P_AU}@|1&%EG{fEks;JcqrzTQqF zSalq$5+E@tmj`WV_m=AKcbZs-={T*uF*Ed+1TINUcUC})V>mQnCP=@qayaz7zE`cw e*p_oAvZA~&xOII{&H!Lw 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 literal 0 HcmV?d00001 diff --git a/server-console/src/images/step4.jpg b/server-console/src/images/step4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..27694aee7437ea9acfabfab87112f58bb46910a0 GIT binary patch literal 10065 zcmcI|cT`hb_iaK40R^#u^xhH(y?22G>Alwg0YeF)cMud1kdE};qzHr#B2AmJ0r2p#7s3_*fI>L|1b~0+W(z>3 z;BM{c4FCdg004kC0C2N_4Y5a~UBq~JoZP^cHqKUXu(dOi$IH@%2Lk5h0Z2%Dxma2| z!qN0ra65#PB;#&NJ0m^9Mv_rqP?cBJMILUCQ1(H=wSCldtbH7uVEfW`ri<=qa>s3uc-6}sv7k2&L}v&AXo@w4S_)D zg+;*-K@omFL2i0JUWgzMuP6_M7sLw@gYb&+@zVb>Mk#s;l#Q*JmV)A+SSTA?Nya~u z^7Qlsd-8*wQFc5KQBhGIUOpZ^J`l>r7UbsbgtqhoIk_?Yt)KvRvqm9Y&hP^Y|+0EYBgWwM;eX}w zNYP91{94}svD|+TX(=fF`uU&cm7@Qr{ozhFl8h)uX{nnX0O{|R1=zd?006+7S->*@ z77z%;0%BodVPXIJVq^b0;9&nU99*2=hKq}bhmVJcOF%$KNI*b*>((vef9w|(2M31$ z7nk4`AwJfHW~1y8}JPP1OV`XK;S<& z0U$OGE*?Gs79kN32*CdR`Humy{yKRF0L1>4KLN=tQbLknlf=Tt0pOC6<1yUDhiFm| z$i|H@Y9~A-v~;ar7!}Y-EV!p@%bv?8hl*!n9>1?gq-C|pKZeGzxQEp}5Z3R=tC6=6 zN}i$&4(YVcuT>C)7kY?LkpZx<0617Uw{UUs@P8)=B*S8WkYj7&%DTqk>{$lqGHS)& z#k>EYx?^O4FCj;#7cZOeG*^x5Y7Q2cLC*HY7Y1=({H!2GFFP?lxP=QlFm5Jj6;c|^)HYHR=kfX5m^5$`9D(_-Sg>u$qjYwP`Z)^9C@ zPHtNTrQ%_eIsj$ZiBtwU?$idfVb|x%c&jV{WyEB1nA&q7pR%%ifMY#CGO?h65<+cw z9qps4a`Nzay;e~DzcEe@Pt7j?M1qYcXu^v4bSM&%FePve`k;iM zt)=w|Bal8Rj12=XuTRWX6S^}xLvx;lDI|pLX);m#povV0$|hyj9)Wti|2B8 zL>Z0S+#S=7W8h&E(@6|I5tTzl7u!l^VhqUO(spqrfp!S*T*e>`BJ8_M3iBT#zFI$D za7l=rl?s;85_Gwk@n?|nU0=-#LLYvXv7!+;941ZkUL!af%4k1Wl0jaLW!*C^xS#?y zyLG<7WLwJ!t9j{qBy8E^t$!w}9QBU|%!@AQ&Zt-CJSvvpY=NE#V53*V^bt}Yf}Aq; z%C_0Q43qpv!u**&Lb4zDFCN?6Jw3kh5)8IuJL~+C+325G)N4V66&w{jSL|$|L3{4K znnNQ!k^{+#cg>+;4MOM3I6Gj)UwB11*Y;(cX{ANZWN6(18r4KcC^KV0zX%D>a1<*(;A?s-^)8ybbSv`~D@6!GMS@s5weW zK}|&JGiP5-^9`W;ipi;V28?3uwVLqo2eB@*9Cce3G|@~A*Ky3{SQ!((|L!Vr!QrTA zjdW10jQv1o&1}%vo^LxF#|(ucSIt$xy`)bp-bPe*+RA0aiR3g6(pXp&NKFf{5DX>S zQ!Afq3nCkbx(Yt8^`~u6ld_cehk-zLCiw*ZN3{tgXMO3^kge@|_nI+EPrMJdLC6*s zkY()7hsr+f_brGkW6Nf{HMP>gXw3Sjf$|mjQWtd$vheOb^tTnik~u6rZ9lhqAqEE3Wb@eb== z;O2dX*+zaDL#y^Pe&2u|sX`!sfsX)o0j&?#v$7yt>LXmiuj}{k<>~Z}YjrD{crPyq@e&VO@Rbl+PHuaf~tF|D^n-e#H@aFdZh+p#IN&{m- zbnGVni{gnt@l#!@?9a#gBpolfy?tD;mv6x~fPmlWa7xLoP;<>lVGh)dt_Nt%{D42@mUhYJia(lkh517N$WOL8o=@&&>$+sN zNamUJ+O~Msh&+>gDDbjE9S-X;aMOPPIa7M)X`0g3n4H$V)KhqxWgHi%-DD2g)!Atw z{fs)iYhb`;7prA!P1Z4DbfIvbw2435m;PBX$XW8PjB*YIZb}5*^!&w7G0&^c&He+r z%kAuAj%#M0Zy(Gr15U5QSI@XndaUg#bU~3<{CMAZG~Y+@X@rtL2{%d-2$Cled7IQI zOYfPpgb7}oq**yBny=6;>k~?O@P2*ASZD5Qp)jbZzD8|&U9}5??(FV!&frl&cs~&< ziDgx-=fD3G2Wor+pv2di9qfxt;#-1)LWsOQ4vD{VS*NQ&OH~c)-$s*hOnxbjRgdbW z9r$)lU2!k-QDu^WUX;U>Z9+wh*n*Ff9ZnifxyqlbN zZmMel+j?f`kAxwf?fIa3$_MU8jd=LJ6tC9aQAxp7CbQ@^R&Bii@_^Psd5XHtk4OrB z$hqBd6_pX3|K_`WGS3UEA8LBG_iU!)$;w_=ks7Vx$9hjs&-!gUN94>s$3mkGWZ8tC z1G*sVS)H*~AD19XUtf*A!Pa(xmD5trN34*NPdHj2S*sT|c)!4+y>0tqTJP)WX1%^( z0P{|AedMfmY9}p!am>U07*Q+d`D@&jN9p%=sdPQIO&vaIjpgpJf#i=kzva!r?Y+pk z=dc%TE@rkzEO%KL)E7tPqcjomou2D*cM6k}Z5om+EMz&)hn2^Cvrm!Dj_gnU$6PJVp8d{6>)=)&IyD+eiQ9LFe$w6mTpe2WD(BlMlQA>n zZVv;>rtL;V??*3uXrbR56%K#J?5s+!{54Hh?8UAFy#q%j*mF2A5tQ9!SfzV59k_8C zXm_bA6?erHc>TQP`rB1YW-(b{NW)3QG1qteZIrF6jFOoBZ3?WQI>$z>g0-kYk2|IT z3Y5s28E?J1nu0>6G1k^tw)x6$zB6qZx@Hyc2nE@K&x%`|oKc?+>*|Y6X6B%-P8BT6 zwqXa_n|FT}O7Gm=db1lSc(A*qb7_6_E$apV3g|gYusAl~q@%S~Zzy0XeOdw{bPqRs znwX(zJ2x11TUI7ir@e=|zOT5o`uogbxu$>n`Zvjnq!jnoqAU)<=M>9=JpyBWB|LFn z>QlH8AhAywiKD5ID8eTXE$d%C7Aa~#K7*^_PAmoO)>402bPTy1OPH3QQ?t9!`(Onh zJOYe4YW)n#>imI81t`sY&GtHM-KWPs zZ`LjMdwVSparTqs7A0Ww*!$$oeS!3Csm=8HQJ4$89pj^(WGQQsw6+|GJaV)FDayKb=TvEFe9@eN$Qgdu+ZqN zJ16X*l#ssU?px%0qOc)vF;!51X>C1e-v%l@DRO8zoaco(@uhZAov&~mLY2^{u4aV4 z@D0pmG$I)@$)Hz_XgYqnDF}I5rkIpb(*=dUqC@~e^zn&7A$Wt1wT_EwhS0GV6O)xg z5#QDKHvlr{_0!Cm>qx|7hj_J5!|`EM<=-MLE#f)+lEiuf5b77tE;z?lDormPG6K~^ zcMqnv%wHVn{M~Y;hx*`aL8Y-6-^;p-2a6K_aQr3)+M_j(mi{ziEQ?yTd7Ae1f>eLD zAZm9>$6sW%eZagrfT>TrTz@6;2GFQpQ#@qSayCKtCrpI(;%(qrhefSI<5%?M8^8NI zdWm3_Qe_#fRX%c|yZw$+QlPWYCg+2zp|-XjM@in4(*()gbHtv$&`!p#bzq>?_-tj9 zGmAitnMd6CzGT_d4BL2BRCYNu5i3Z82q=Sw1LaG1qm2cAT*S{9uLaXg--5RiO(tvT z$+^C_aw%~lEK4@XT--^FKsL0y#gCa&mK^ERr&PKoPTJ&16o0Y95q^z;8g*(BV$g4h`wFCr&(vpkB#IS2N#|#*RJqNe#!19{?G=B!rjH6xoV|O z$yine)h`p;po+v{)U%=vk!z!~NMn^D^>q9g1IwAlynOY2PnmhAk?-%5f4t^1b{)@! zu;A2(XSgS{8>JE2B-OlqwE)%APNe1>d+FtogeXYww5uZC8&cGo^s=?V(ElpUueVwO z=M3Q+K&9PJH}ya$M8?3%SGNkIUMlk>hXQag{8#-r(VnK^o67#K$%`;;hPNS0HnEk; zu3TzNBT(8fLPct?+Xbq}4+L8e8;Ex~euDW4M^Ant8|7X#_RG0|wm^k!2qJMsFFxHVk5{1dSkMg z)PdUBd)bhsZ6A}Icywy+eYC69No&NfEV-@$<$%>-aT$c-%^K_n2F`~Q+Snfb)m`kk zzDWe#_%!sN-eU~Xk| zh&7Ki(Px@IH%%H2?b4W!gNMPKTCyZL_h=fwlL9huMck{T7e=30EaeJQTMFO$a9~Ql zZ~tLrl1Y)4d0yb~WgBIbxMqs5rg8vW9$dAN#h1Hax=5-Pqn2GG5?`85R zX0S3t%w;TAdm?l(&Gp%m|Bniza#PH5N?|3%kL_#IwtGU*$&teT#u<^r4#Pb$9U6Va zYwAjI%M~!$S6P&Ge=H@Sz7DH6Q|?ueP^nCC1YTLS>%v0lmSD!E;aL$=y^d>Ach(Ky zK015(Uids^m-s>S>)6?1C2c2pZH*|P12_yhG zKZUxGi0FMmu6%)FMCU@BjBe8FrEft9PW8Y|e$Z z#jhBLfHqOvw$~FV5&7W6ui% zxt4lBqp%_G3H|oyu?|6*_vD;<;C)U*N8#!44-6u4`kpNgL+4Ptl)_STJ-S1VFv`vj zN_}UiXi)R|tbUSVk`bt7n^U*Rfyr9+pBOhL?f+}o4t6->CL*rnA~dKK(Cm0ibKCF+ z*O&44buinK3ttpI7nj0Gl#(QF05<)z$SqL)l^`5_F39PmO|^FefHbPwB&M2`ZJ1Ut z&EmZ9Nt~N1H1p6WMLwOjF8x@;0<$$<*(>#AC3D67pnYK+r>xvdzDGJCG#RE-?XJ;` zX?FjVlCerEMk4-oLcC|^G*ETBVt=xMt2NE5AbD9^ckJAsvagJ`EK|9$uYjgO_1)&f zP+u-h^>Lw(yanjjpUrktd4dsFxcGb`hhq&(7AypOpF#yVcVgC{ zAvQ{n-R|2DtjT%w`YWXr&xsDUn|K#n&vk!L_=;z^dere6-iqh*|J~E_O#LEId$pSd zIoWx+E?)Tnn=%)A|G@vtX>57#o^v@7eCJy(+&tQdj&PIqvvFFtAsGz}FM?^9wh*`x zl%043n6{QtA1@gwVJ&{Wia(LVZhu?V*E06;Sy%l5E^tH#x7ciBZ6;9Otm?Buf@C^3 zrQ3WcNyTLo!HfPZZOxf(J6B5)W^2rX#vGGsW`l28WeQ$$*wn6kXWcsGOc}H9;}(OS zcXOaAU(@al5rT#FzHX8*?9nKnSfLpWHo-)v7!wJz1TpB6#mPz8L&@3q?INR!wJ&%>5Em7#|_e{}DQO z@4F7Li%cf?ZAOmblh{@%Oz{WJxBeuvUsc%ROG zrT1nmbiv{V5E4{~-A4QBm>n0Wn=*U@fJ6he%M-%O8eV zlc0k%l%YlIro9Qy&MP&&(L!cYIiboWUH8SY6SJy;l9l>VUmr1n=97^z(y(yel#P@z zJiAV_LJ9tn4BzpzmEk%1o&10&tEr|j)BB+h2s;Q97kLOQ`6*^Pr5&_B;$${j;GsLK z7rJNLqgzi5UMU+B8MuO19HDM-~M{sx_!>5FmRDpC-pZk>g`koa+qLn*oo$D zcdQX*y6{d+L9XLZe<}uHhG}0D@#O36$0PUFF z{5+Co1~^g~utCf2X^*eibW!4!JD)>CwYrnL_}nAt{|#jIvnW3*p@T-W6)hT5J!aq; zED~_1N@18b<#-&2ooKhGgecnmy3ynY;4gWtnFA8QZ@iw5xY)V9S5!h8kpoKmY=D@T z%-?Ca=uYg!Of&RlyQSv93?fJhB@Ul4lcRE(x9*XoA(1W9y0&vvZ=lD6)sI>g1&gv? zcQrPAv|TO)3rA>7_Ix7n;Aa-GZmy-0(W$S74>fXGGPAQz8X4<#4&)Eenz;C}P@l}h zvi7YTZjWxfX-P^m(oJ&~)aM<40EQfY{(k>i^*s1I2G4MF*$zY2*7nvoK*ys#w&L~k%V-`VY zQdsh=zyn(Hw9Zk=b37UJlkDlJpMr-+Zop@kI%#-w9p&9ek%!R|DS046qFMJO4(43{ zjj?`0>YPxmcb!%Fp#yyxdtOz9d=A)|t;;unFUjdQfE6+4Gr5x6T<05D6u6#?<9OoT zJCet~!QEWrT+hicVa;f04OI%3Sy^pQ63sYwn9$*E6}ee0waz4fl5No2pU`8g>!Ty- z3%J##M^H)aap=Z6-vu(_R)mq*(?0F(t?sZ#dWHqc{;MpQM1cX2iq>QuO)v*e!dnd* zq>N!>M9$G<>F|R#es7zP7>9@C+YLfkH5{(CHAS>A9ib4d+TblJ>*0m{@8@){rtI9e z=MB;PS#{Z(U|t8qYQ_ySW~H_n?h`_xOzzWelCCBrFbyYj>Zwv<1S!904_at=14bpQ zEQ&=mq0%#37w?g{TKWdwfl1$Z8Do6vBU$Ad+Z@GOe7{2J@w(51UX2=L{8&Y~yv4g6 z?6zRe44bOTl=X4iSZHo=fRin$HGa)8n{{mrTP7bMogMyyRJ+H46SCrTUULd%H__gz zZOF3N+VNkRb=df_>6zMfyftP`e4sNS3Cg6S;R(M(qouc|ObX&)hb4uNCdTIhC10u+ z8%ykomStGK-pP6U`y#&|?VevTb;ZUv#^EF|jw$BazC#0_oTNrf_TkvdjZ#1!S_zFC zLVb+*dj!Td9OzPO5K?rT1g&xjeyyfoS~&)Mc`XwacvC3Z&Gxs*Q>bAL{XiHS76IUC zpN)-Pe>)ww+~JJ3eR z#)Fp6gg%WfHvl=uRF5ddtSO(CaN%1t`9`L7vTdTI%U&(5m)>z(n%h-!v9v5rU;2?K zmd3(&z9*gJat^W%n}qLMSQ9f#+&x0&jc!GlkhafKO&JCB1_-xE*iA5SG;Dwb-L<1U z(Gd~yY68X7pbFIrQi_toT0HCbRnk?Ns7Z$PQ?I_#D!PXz>FiB&yX31XHvJ%s*8RiC z!Dq`vFw*y~)0lDWH%gg-pYjI!>86sFy>%2>!qr5m#p#D1PEq+?yhC5zDzG+fui$8? zxy1CWjXqLgSF@dL{h8XIr)a{x`N0+H^TX_AA1fr5mCr!M zLdfJ(!b41+hb1OX#!%$$IWz#R>Q-7ftN+HR=0%(?yYkEaY~wI6L)-L|B#~F*m#)|} z85q3L8$h&k#^J@tE9vybfK?d>GvVv_smuqD9i1aI%M4oC@*!+R%7~{er+aEoswZc7 z)gFn@d9M*i1>FD&Agi)dVkrL}pJgF=EEp3WlcLJH3#e_yo$~PnmZ;DjNn(5AZ`VS! zZf^tY*ghZnsn4yE$bSeNwLZ*S+x9q)rpk?KHnbJ*d>WnspFoFqy@oMWU@S6R9H!mN(BQwxtT%b;6Uj8foZAg`seLDx{!M`5 zgmN^Ax-kT@MTH$~j|*&SpPvWTwQih`>ZKo!x%O)E_1j2VELI#W4!V;kiv8ef&W2Ga zGUHNM*b{F}AGd{%^w5}gDvPBU8lJWJ)|jG`^Tw*F+KfT36q>Zb^(5wYBzD_|FC%JHeSR7Tb?^c4mtb!)SQ>9a_3nuDKU^TtP*#*AS%uO=?+{n3g?NWe_cxFkyO_9e>a=NI#yu6lMd-p(2Z;$KYdZwvYrZC= zFXn?jjKmh$i0wvl*^WH$V4Jg+bN@LcGV3gnJYEp)!Upbbj{7J4Q zx_;V}D~pYQxRG5&22H+k$ zedKfjmbhTQ#e4%`i^({JU6!qj_Z&s<%6{E-6+K*;O{X>SSdxLB3;L~`;R61@J0SLt fso<`IblP4FJ4yRdz|XF$tQ$bCznw?W&Gi2QTb-Bt literal 0 HcmV?d00001 diff --git a/server-console/src/main.js b/server-console/src/main.js index b442d28855..ea8ba6337e 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -408,6 +408,13 @@ var labels = { logWindow.open(); } }, + restoreBackup: { + label: 'Restore Backup Instructions', + click: function() { + var folder = getRootHifiDataDirectory() + "/Server Backup"; + openBackupInstructions(folder); + } + }, share: { label: 'Share', click: function() { @@ -443,6 +450,7 @@ function buildMenuArray(serverState) { menuArray.push(labels.stopServer); menuArray.push(labels.settings); menuArray.push(labels.viewLogs); + menuArray.push(labels.restoreBackup); menuArray.push(separator); menuArray.push(labels.share); menuArray.push(separator); @@ -510,29 +518,32 @@ function backupResourceDirectories(folder) { } } +function openBackupInstructions(folder) { + // Explain user how to restore server + var window = new BrowserWindow({ + icon: appIcon, + width: 800, + height: 520, + }); + window.loadURL('file://' + __dirname + '/content-update.html'); + if (!debug) { + window.setMenu(null); + } + window.show(); + + electron.ipcMain.on('ready', function() { + console.log("got ready"); + window.webContents.send('update', folder); + }); + +} function backupResourceDirectoriesAndRestart() { homeServer.stop(); var folder = getRootHifiDataDirectory() + "/Server Backup - " + Date.now(); if (backupResourceDirectories(folder)) { maybeInstallDefaultContentSet(onContentLoaded); - - // Explain user how to restore server - var window = new BrowserWindow({ - icon: appIcon, - width: 500, - height: 350, - }); - window.loadURL('file://' + __dirname + '/content-update.html'); - if (!debug) { - window.setMenu(null); - } - window.show(); - - electron.ipcMain.on('ready', function() { - console.log("got ready"); - window.webContents.send('update', folder); - }); + openBackupInstructions(folder); } else { dialog.showMessageBox({ type: 'warning', From 6f725e8c02d880ced1fa1aa6d4a4386403c2f492 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 29 Sep 2016 15:49:47 -0700 Subject: [PATCH 063/300] Fixed CSS madness --- server-console/src/content-update.html | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/server-console/src/content-update.html b/server-console/src/content-update.html index 3c0eff2fa0..c4ed14473a 100644 --- a/server-console/src/content-update.html +++ b/server-console/src/content-update.html @@ -15,29 +15,25 @@
+ +
- - Step 1 -

1. Stop your Sandbox server. - + Step 2 +

2. Go to your backup directory: +

- - Step 2 -

2. Go to your backup directory: - - + Step 1 +

1. Stop your Sandbox server.

- Step 3

3. Copy the backed up content and paste it into the parent directory.

- Step 4

4. Restart your Sandbox server.

From 2db8158f4b70b8fc1bbd47a04b7aabdea2da189f Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 29 Sep 2016 17:08:34 -0700 Subject: [PATCH 064/300] CR --- server-console/src/content-update.css | 42 ++++++++++++------------ server-console/src/main.js | 46 +++++++++++++-------------- 2 files changed, 43 insertions(+), 45 deletions(-) diff --git a/server-console/src/content-update.css b/server-console/src/content-update.css index ebfd8aeba0..9303e450b5 100644 --- a/server-console/src/content-update.css +++ b/server-console/src/content-update.css @@ -56,98 +56,98 @@ a:hover { color: #2D88A4; } -.header{ +.header { width: 95%; left: 2.5% } -.colmask{ +.colmask { width: 95%; left: 2.5% } -.colmid{ right: 25% } -.colin{ right: 25% } -.colleft{ right: 25% } -.col1{ +.colmid { right: 25% } +.colin { right: 25% } +.colleft { right: 25% } +.col1 { width: 23%; left: 101% } -.col2{ +.col2 { width: 23%; left: 53% } -.col3{ +.col3 { width: 23%; left: 80% } -.col4{ +.col4 { width: 23%; left: 82% } -.footer{ +.footer { width: 95%; left: 2.5% } -.header{ +.header { clear: both; float: left; position: relative; border-bottom: #000 1px solid; background-color: #b4d2f7 } -.colmask{ +.colmask { clear: both; float: left; overflow: hidden; position: relative; } -.colmid{ +.colmid { float: left; width: 100%; position: relative; } -.colin{ +.colin { float: left; width: 100%; position: relative; } -.colleft{ +.colleft { float: left; width: 100%; position: relative; } -.col1{ +.col1 { padding: 0px 0px 1em 0px; overflow: hidden; float: left; position: relative; } -.col2{ +.col2 { padding: 0px 0px 1em 0px; overflow: hidden; float: left; position: relative; } -.col3{ +.col3 { padding: 0px 0px 1em 0px; overflow: hidden; float: left; position: relative; } -.col4{ +.col4 { padding: 0px 0px 1em 0px; overflow: hidden; float: left; position: relative; } -.footer{ +.footer { clear: both; float: left; position: relative; @@ -155,7 +155,7 @@ a:hover { border-top: #000 1px solid; } -.bottom{ +.bottom { clear: both; width: 100%; float: left; diff --git a/server-console/src/main.js b/server-console/src/main.js index ea8ba6337e..e297ca3276 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -501,16 +501,15 @@ function backupResourceDirectories(folder) { fs.mkdirSync(folder); console.log("Created directory " + folder); - var dsBackup = path.join(folder, '/domain-server'); - fs.renameSync(getDomainServerClientResourcesDirectory(), dsBackup); - console.log("Moved directory " + getDomainServerClientResourcesDirectory()); - console.log("to " + dsBackup); - var acBackup = path.join(folder, '/assignment-client'); - fs.renameSync(getAssignmentClientResourcesDirectory(), acBackup); - console.log("Moved directory " + getDomainServerClientResourcesDirectory()); - console.log("to " + acBackup); + + fs.copySync(getDomainServerClientResourcesDirectory(), dsBackup); + fs.copySync(getAssignmentClientResourcesDirectory(), acBackup); + + fs.removeSync(getDomainServerClientResourcesDirectory()); + fs.removeSync(getAssignmentClientResourcesDirectory()); + return true; } catch (e) { console.log(e); @@ -519,23 +518,22 @@ function backupResourceDirectories(folder) { } function openBackupInstructions(folder) { - // Explain user how to restore server - var window = new BrowserWindow({ - icon: appIcon, - width: 800, - height: 520, - }); - window.loadURL('file://' + __dirname + '/content-update.html'); - if (!debug) { - window.setMenu(null); - } - window.show(); - - electron.ipcMain.on('ready', function() { - console.log("got ready"); - window.webContents.send('update', folder); - }); + // Explain user how to restore server + var window = new BrowserWindow({ + icon: appIcon, + width: 800, + height: 520, + }); + window.loadURL('file://' + __dirname + '/content-update.html'); + if (!debug) { + window.setMenu(null); + } + window.show(); + electron.ipcMain.on('ready', function() { + console.log("got ready"); + window.webContents.send('update', folder); + }); } function backupResourceDirectoriesAndRestart() { homeServer.stop(); From ad5d525340756a624e6f67ffa6f9ccb59fc78a83 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 30 Sep 2016 14:13:35 +1300 Subject: [PATCH 065/300] Fix keyboard status when switching between entities editor tabs --- scripts/system/html/js/keyboardControl.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/system/html/js/keyboardControl.js b/scripts/system/html/js/keyboardControl.js index 291330e8de..964f5f5786 100644 --- a/scripts/system/html/js/keyboardControl.js +++ b/scripts/system/html/js/keyboardControl.js @@ -47,10 +47,21 @@ function setUpKeyboardControl() { } } + function documentBlur() { + // Action any pending Lower keyboard event immediately upon leaving document window so that they don't interfere with + // other Entities Editor tab. + if (lowerTimer !== null) { + clearTimeout(lowerTimer); + doLowerKeyboard(); + } + } + var inputs = document.querySelectorAll("input[type=text], input[type=number], textarea"); for (var i = 0, length = inputs.length; i < length; i++) { inputs[i].addEventListener("focus", raiseKeyboard); inputs[i].addEventListener("blur", lowerKeyboard); } + + window.addEventListener("blur", documentBlur); } From 621e3fc00037b9ed2e8201d0417b6d451220cab0 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Fri, 30 Sep 2016 09:06:17 -0700 Subject: [PATCH 066/300] Expose triggerOption to scripts, plus _physicsEnabled Now any menu item can be triggered. Plus you can do a Window.isPhysicsEnabled to detect when we are done loading assets and such. Whee! --- interface/src/scripting/MenuScriptingInterface.cpp | 5 +++++ interface/src/scripting/MenuScriptingInterface.h | 2 ++ interface/src/scripting/WindowScriptingInterface.cpp | 4 ++++ interface/src/scripting/WindowScriptingInterface.h | 1 + libraries/ui/src/ui/Menu.h | 3 ++- 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/interface/src/scripting/MenuScriptingInterface.cpp b/interface/src/scripting/MenuScriptingInterface.cpp index 7eb80b5946..2fa7470561 100644 --- a/interface/src/scripting/MenuScriptingInterface.cpp +++ b/interface/src/scripting/MenuScriptingInterface.cpp @@ -125,3 +125,8 @@ void MenuScriptingInterface::setIsOptionChecked(const QString& menuOption, bool Q_ARG(const QString&, menuOption), Q_ARG(bool, isChecked)); } + +void MenuScriptingInterface::triggerOption(const QString& menuOption) { + QMetaObject::invokeMethod(Menu::getInstance(), "triggerOption", Q_ARG(const QString&, menuOption)); +} + diff --git a/interface/src/scripting/MenuScriptingInterface.h b/interface/src/scripting/MenuScriptingInterface.h index 03ff4b512a..5b8a437529 100644 --- a/interface/src/scripting/MenuScriptingInterface.h +++ b/interface/src/scripting/MenuScriptingInterface.h @@ -48,6 +48,8 @@ public slots: bool isOptionChecked(const QString& menuOption); void setIsOptionChecked(const QString& menuOption, bool isChecked); + + void triggerOption(const QString& menuOption); signals: void menuItemEvent(const QString& menuItem); diff --git a/interface/src/scripting/WindowScriptingInterface.cpp b/interface/src/scripting/WindowScriptingInterface.cpp index c528c26b99..0f9dd698fd 100644 --- a/interface/src/scripting/WindowScriptingInterface.cpp +++ b/interface/src/scripting/WindowScriptingInterface.cpp @@ -206,3 +206,7 @@ void WindowScriptingInterface::takeSnapshot(bool notify, float aspectRatio) { void WindowScriptingInterface::shareSnapshot(const QString& path) { qApp->shareSnapshot(path); } + +bool WindowScriptingInterface::isPhysicsEnabled() { + return qApp->isPhysicsEnabled(); +} diff --git a/interface/src/scripting/WindowScriptingInterface.h b/interface/src/scripting/WindowScriptingInterface.h index 9303636a1f..f4a89ae221 100644 --- a/interface/src/scripting/WindowScriptingInterface.h +++ b/interface/src/scripting/WindowScriptingInterface.h @@ -54,6 +54,7 @@ public slots: void copyToClipboard(const QString& text); void takeSnapshot(bool notify = true, float aspectRatio = 0.0f); void shareSnapshot(const QString& path); + bool isPhysicsEnabled(); signals: void domainChanged(const QString& domainHostname); diff --git a/libraries/ui/src/ui/Menu.h b/libraries/ui/src/ui/Menu.h index 895e40fe68..ee60a031c3 100644 --- a/libraries/ui/src/ui/Menu.h +++ b/libraries/ui/src/ui/Menu.h @@ -62,7 +62,6 @@ public: MenuWrapper* getMenu(const QString& menuName); MenuWrapper* getSubMenuFromName(const QString& menuName, MenuWrapper* menu); - void triggerOption(const QString& menuOption); QAction* getActionForOption(const QString& menuOption); QAction* addActionToQMenuAndActionHash(MenuWrapper* destinationMenu, @@ -112,6 +111,8 @@ public slots: void toggleDeveloperMenus(); void toggleAdvancedMenus(); + + void triggerOption(const QString& menuOption); static bool isSomeSubmenuShown() { return _isSomeSubmenuShown; } From 46c0e8312717eb304a9bb861eba7cd37631b2086 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Fri, 30 Sep 2016 10:30:21 -0700 Subject: [PATCH 067/300] Restore "Are you sure" popup --- server-console/src/main.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/server-console/src/main.js b/server-console/src/main.js index e297ca3276..8cabb5aaa4 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -577,12 +577,21 @@ function checkNewContent() { title: 'New home content', message: 'A newer version of the home content set is available.\nDo you wish to update?' }, function(idx) { - if (idx === 0) { - backupResourceDirectoriesAndRestart(); - } else { - // They don't want to update, mark content set as current - userConfig.set('homeContentLastModified', new Date()); - } + if (idx === 0) { + dialog.showMessageBox({ + type: 'warning', + buttons: ['Yes', 'No'], + title: 'Are you sure?', + message: 'Updating with the new content will remove all your current content and settings and place them in a backup folder.\nAre you sure?' + }, function(idx) { + if (idx === 0) { + backupResourceDirectoriesAndRestart(); + } + }); + } else { + // They don't want to update, mark content set as current + userConfig.set('homeContentLastModified', new Date()); + } }); } } From 12ecc02899d00655b09771806aad009caa740447 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sat, 1 Oct 2016 13:40:31 -0700 Subject: [PATCH 068/300] Default popup choices to "No" --- server-console/src/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server-console/src/main.js b/server-console/src/main.js index 8cabb5aaa4..c090640ada 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -574,6 +574,7 @@ function checkNewContent() { dialog.showMessageBox({ type: 'question', buttons: ['Yes', 'No'], + defaultId: 1, title: 'New home content', message: 'A newer version of the home content set is available.\nDo you wish to update?' }, function(idx) { @@ -581,6 +582,7 @@ function checkNewContent() { dialog.showMessageBox({ type: 'warning', buttons: ['Yes', 'No'], + defaultId: 1, title: 'Are you sure?', message: 'Updating with the new content will remove all your current content and settings and place them in a backup folder.\nAre you sure?' }, function(idx) { From 2d87e3eb1ac32f0effc67781f9bc501a7dd87a21 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sat, 1 Oct 2016 14:07:11 -0700 Subject: [PATCH 069/300] Fix CSS to wrap folder path --- server-console/src/content-update.css | 1 + 1 file changed, 1 insertion(+) diff --git a/server-console/src/content-update.css b/server-console/src/content-update.css index 9303e450b5..1ac32bd220 100644 --- a/server-console/src/content-update.css +++ b/server-console/src/content-update.css @@ -124,6 +124,7 @@ a:hover { overflow: hidden; float: left; position: relative; + word-wrap: break-word; } .col2 { From 546d4ff986da4e8d47a395a1d4ff8ce00e01e2bf Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Sat, 1 Oct 2016 22:23:56 -0700 Subject: [PATCH 070/300] remove mic and window resize notifications --- scripts/system/notifications.js | 41 ++++----------------------------- 1 file changed, 5 insertions(+), 36 deletions(-) diff --git a/scripts/system/notifications.js b/scripts/system/notifications.js index f3ba466342..d89b532f31 100644 --- a/scripts/system/notifications.js +++ b/scripts/system/notifications.js @@ -17,11 +17,9 @@ // keystroke: // // CTRL/s for snapshot. -// CTRL/m for mic mute and unmute. // System generated notifications: -// If Screen is resized. -// If mic is muted for any reason. +// Connection refused. // // To add a new System notification type: // @@ -92,16 +90,12 @@ var lodTextID = false; var NotificationType = { UNKNOWN: 0, - MUTE_TOGGLE: 1, - SNAPSHOT: 2, - WINDOW_RESIZE: 3, - LOD_WARNING: 4, - CONNECTION_REFUSED: 5, - EDIT_ERROR: 6, + SNAPSHOT: 1, + LOD_WARNING: 2, + CONNECTION_REFUSED: 3, + EDIT_ERROR: 4, properties: [ - { text: "Mute Toggle" }, { text: "Snapshot" }, - { text: "Window Resize" }, { text: "Level of Detail" }, { text: "Connection Refused" }, { text: "Edit error" } @@ -446,19 +440,6 @@ function wordWrap(str) { return stringDivider(str, 43.0, "\n"); } -// This fires a notification on window resize -function checkSize() { - if ((Window.innerWidth !== ourWidth) || (Window.innerHeight !== ourHeight)) { - var windowResize = "Window has been resized"; - ourWidth = Window.innerWidth; - ourHeight = Window.innerHeight; - windowDimensions = Controller.getViewportDimensions(); - overlayLocationX = (windowDimensions.x - (width + 60.0)); - buttonLocationX = overlayLocationX + (width - 35.0); - createNotification(windowResize, NotificationType.WINDOW_RESIZE); - } -} - function update() { var nextOverlay, noticeOut, @@ -480,7 +461,6 @@ function update() { frame += 1; if ((frame % 60.0) === 0) { // only update once a second - checkSize(); // checks for size change to trigger windowResize notification locationY = 20.0; for (i = 0; i < arrays.length; i += 1) { //repositions overlays as others fade nextOverlay = Overlays.getOverlayAtPoint({ x: overlayLocationX, y: locationY }); @@ -533,16 +513,6 @@ function isStartingUp() { return startingUp; } -// Triggers mic mute notification -function onMuteStateChanged() { - var muteState, - muteString; - - muteState = AudioDevice.getMuted() ? "muted" : "unmuted"; - muteString = "Microphone is now " + muteState; - createNotification(muteString, NotificationType.MUTE_TOGGLE); -} - function onDomainConnectionRefused(reason) { createNotification("Connection refused: " + reason, NotificationType.CONNECTION_REFUSED); } @@ -653,7 +623,6 @@ LODManager.LODDecreased.connect(function() { } }); -AudioDevice.muteToggled.connect(onMuteStateChanged); Controller.keyPressEvent.connect(keyPressEvent); Controller.mousePressEvent.connect(mousePressEvent); Controller.keyReleaseEvent.connect(keyReleaseEvent); From f28962af129335d2a79b1d741229c64ba2e3d8ad Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 29 Sep 2016 11:10:21 -0700 Subject: [PATCH 071/300] Remove dead class from oglplus helpers --- libraries/gl/src/gl/OglplusHelpers.cpp | 81 -------------------------- libraries/gl/src/gl/OglplusHelpers.h | 27 --------- 2 files changed, 108 deletions(-) diff --git a/libraries/gl/src/gl/OglplusHelpers.cpp b/libraries/gl/src/gl/OglplusHelpers.cpp index fc02d75329..587c6488c8 100644 --- a/libraries/gl/src/gl/OglplusHelpers.cpp +++ b/libraries/gl/src/gl/OglplusHelpers.cpp @@ -480,84 +480,3 @@ ShapeWrapperPtr loadLaser(const ProgramPtr& program) { return std::make_shared(shapes::ShapeWrapper("Position", shapes::Laser(), *program)); } -void TextureRecycler::setSize(const uvec2& size) { - if (size == _size) { - return; - } - _size = size; - while (!_readyTextures.empty()) { - _readyTextures.pop(); - } - std::set toDelete; - std::for_each(_allTextures.begin(), _allTextures.end(), [&](Map::const_reference item) { - if (!item.second._active && item.second._size != _size) { - toDelete.insert(item.first); - } - }); - std::for_each(toDelete.begin(), toDelete.end(), [&](Map::key_type key) { - _allTextures.erase(key); - }); -} - -void TextureRecycler::clear() { - while (!_readyTextures.empty()) { - _readyTextures.pop(); - } - _allTextures.clear(); -} - -TexturePtr TextureRecycler::getNextTexture() { - using namespace oglplus; - if (_readyTextures.empty()) { - TexturePtr newTexture(new Texture()); - - if (_useMipmaps) { - Context::Bound(oglplus::Texture::Target::_2D, *newTexture) - .MinFilter(TextureMinFilter::LinearMipmapLinear) - .MagFilter(TextureMagFilter::Linear) - .WrapS(TextureWrap::ClampToEdge) - .WrapT(TextureWrap::ClampToEdge) - .Anisotropy(8.0f) - .LODBias(-0.2f) - .Image2D(0, PixelDataInternalFormat::RGBA8, - _size.x, _size.y, - 0, PixelDataFormat::RGB, PixelDataType::UnsignedByte, nullptr); - } else { - Context::Bound(oglplus::Texture::Target::_2D, *newTexture) - .MinFilter(TextureMinFilter::Linear) - .MagFilter(TextureMagFilter::Linear) - .WrapS(TextureWrap::ClampToEdge) - .WrapT(TextureWrap::ClampToEdge) - .Image2D(0, PixelDataInternalFormat::RGBA8, - _size.x, _size.y, - 0, PixelDataFormat::RGB, PixelDataType::UnsignedByte, nullptr); - } - GLuint texId = GetName(*newTexture); - _allTextures[texId] = TexInfo{ newTexture, _size }; - _readyTextures.push(newTexture); - } - - TexturePtr result = _readyTextures.front(); - _readyTextures.pop(); - - GLuint texId = GetName(*result); - auto& item = _allTextures[texId]; - item._active = true; - - return result; -} - -void TextureRecycler::recycleTexture(GLuint texture) { - Q_ASSERT(_allTextures.count(texture)); - auto& item = _allTextures[texture]; - Q_ASSERT(item._active); - item._active = false; - if (item._size != _size) { - // Buh-bye - _allTextures.erase(texture); - return; - } - - _readyTextures.push(item._tex); -} - diff --git a/libraries/gl/src/gl/OglplusHelpers.h b/libraries/gl/src/gl/OglplusHelpers.h index ab47689312..52e63f9431 100644 --- a/libraries/gl/src/gl/OglplusHelpers.h +++ b/libraries/gl/src/gl/OglplusHelpers.h @@ -188,30 +188,3 @@ protected: using BasicFramebufferWrapperPtr = std::shared_ptr; -class TextureRecycler { -public: - TextureRecycler(bool useMipmaps) : _useMipmaps(useMipmaps) {} - void setSize(const uvec2& size); - void clear(); - TexturePtr getNextTexture(); - void recycleTexture(GLuint texture); - -private: - - struct TexInfo { - TexturePtr _tex; - uvec2 _size; - bool _active{ false }; - - TexInfo() {} - TexInfo(TexturePtr tex, const uvec2& size) : _tex(tex), _size(size) {} - }; - - using Map = std::map; - using Queue = std::queue; - - Map _allTextures; - Queue _readyTextures; - uvec2 _size{ 1920, 1080 }; - bool _useMipmaps; -}; From d83d3fe98e826e0bd924fd7de349401e1a1f54dc Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 29 Sep 2016 11:11:55 -0700 Subject: [PATCH 072/300] Make shader compilation from non-GPU code easier --- libraries/gl/src/gl/GLShaders.cpp | 189 +++++++++++++++++++++++ libraries/gl/src/gl/GLShaders.h | 29 ++++ libraries/gpu-gl/src/gpu/gl/GLShader.cpp | 10 +- libraries/gpu-gl/src/gpu/gl/GLShared.cpp | 181 ---------------------- libraries/gpu-gl/src/gpu/gl/GLShared.h | 2 - 5 files changed, 226 insertions(+), 185 deletions(-) create mode 100644 libraries/gl/src/gl/GLShaders.cpp create mode 100644 libraries/gl/src/gl/GLShaders.h diff --git a/libraries/gl/src/gl/GLShaders.cpp b/libraries/gl/src/gl/GLShaders.cpp new file mode 100644 index 0000000000..b8e1bf7391 --- /dev/null +++ b/libraries/gl/src/gl/GLShaders.cpp @@ -0,0 +1,189 @@ +#include "GLShaders.h" + +#include "GLLogging.h" + +namespace gl { + + +#ifdef SEPARATE_PROGRAM + bool compileShader(GLenum shaderDomain, const std::string& shaderSource, const std::string& defines, GLuint &shaderObject, GLuint &programObject) { +#else + bool compileShader(GLenum shaderDomain, const std::string& shaderSource, const std::string& defines, GLuint &shaderObject) { +#endif + if (shaderSource.empty()) { + qCDebug(glLogging) << "GLShader::compileShader - no GLSL shader source code ? so failed to create"; + return false; + } + + // Create the shader object + GLuint glshader = glCreateShader(shaderDomain); + if (!glshader) { + qCDebug(glLogging) << "GLShader::compileShader - failed to create the gl shader object"; + return false; + } + + // Assign the source + const int NUM_SOURCE_STRINGS = 2; + const GLchar* srcstr[] = { defines.c_str(), shaderSource.c_str() }; + glShaderSource(glshader, NUM_SOURCE_STRINGS, srcstr, NULL); + + // Compile ! + glCompileShader(glshader); + + // check if shader compiled + GLint compiled = 0; + glGetShaderiv(glshader, GL_COMPILE_STATUS, &compiled); + + // if compilation fails + if (!compiled) { + + // save the source code to a temp file so we can debug easily + /* + std::ofstream filestream; + filestream.open("debugshader.glsl"); + if (filestream.is_open()) { + filestream << srcstr[0]; + filestream << srcstr[1]; + filestream.close(); + } + */ + + GLint infoLength = 0; + glGetShaderiv(glshader, GL_INFO_LOG_LENGTH, &infoLength); + + char* temp = new char[infoLength]; + glGetShaderInfoLog(glshader, infoLength, NULL, temp); + + + /* + filestream.open("debugshader.glsl.info.txt"); + if (filestream.is_open()) { + filestream << std::string(temp); + filestream.close(); + } + */ + + qCWarning(glLogging) << "GLShader::compileShader - failed to compile the gl shader object:"; + for (auto s : srcstr) { + qCWarning(glLogging) << s; + } + qCWarning(glLogging) << "GLShader::compileShader - errors:"; + qCWarning(glLogging) << temp; + delete[] temp; + + glDeleteShader(glshader); + return false; + } + + GLuint glprogram = 0; +#ifdef SEPARATE_PROGRAM + // so far so good, program is almost done, need to link: + GLuint glprogram = glCreateProgram(); + if (!glprogram) { + qCDebug(glLogging) << "GLShader::compileShader - failed to create the gl shader & gl program object"; + return false; + } + + glProgramParameteri(glprogram, GL_PROGRAM_SEPARABLE, GL_TRUE); + glAttachShader(glprogram, glshader); + glLinkProgram(glprogram); + + GLint linked = 0; + glGetProgramiv(glprogram, GL_LINK_STATUS, &linked); + + if (!linked) { + /* + // save the source code to a temp file so we can debug easily + std::ofstream filestream; + filestream.open("debugshader.glsl"); + if (filestream.is_open()) { + filestream << shaderSource->source; + filestream.close(); + } + */ + + GLint infoLength = 0; + glGetProgramiv(glprogram, GL_INFO_LOG_LENGTH, &infoLength); + + char* temp = new char[infoLength]; + glGetProgramInfoLog(glprogram, infoLength, NULL, temp); + + qCDebug(glLogging) << "GLShader::compileShader - failed to LINK the gl program object :"; + qCDebug(glLogging) << temp; + + /* + filestream.open("debugshader.glsl.info.txt"); + if (filestream.is_open()) { + filestream << String(temp); + filestream.close(); + } + */ + delete[] temp; + + glDeleteShader(glshader); + glDeleteProgram(glprogram); + return false; + } + programObject = glprogram; +#endif + shaderObject = glshader; + return true; +} + +GLuint compileProgram(const std::vector& glshaders) { + // A brand new program: + GLuint glprogram = glCreateProgram(); + if (!glprogram) { + qCDebug(glLogging) << "GLShader::compileProgram - failed to create the gl program object"; + return 0; + } + + // glProgramParameteri(glprogram, GL_PROGRAM_, GL_TRUE); + // Create the program from the sub shaders + for (auto so : glshaders) { + glAttachShader(glprogram, so); + } + + // Link! + glLinkProgram(glprogram); + + GLint linked = 0; + glGetProgramiv(glprogram, GL_LINK_STATUS, &linked); + + if (!linked) { + /* + // save the source code to a temp file so we can debug easily + std::ofstream filestream; + filestream.open("debugshader.glsl"); + if (filestream.is_open()) { + filestream << shaderSource->source; + filestream.close(); + } + */ + + GLint infoLength = 0; + glGetProgramiv(glprogram, GL_INFO_LOG_LENGTH, &infoLength); + + char* temp = new char[infoLength]; + glGetProgramInfoLog(glprogram, infoLength, NULL, temp); + + qCDebug(glLogging) << "GLShader::compileProgram - failed to LINK the gl program object :"; + qCDebug(glLogging) << temp; + + /* + filestream.open("debugshader.glsl.info.txt"); + if (filestream.is_open()) { + filestream << std::string(temp); + filestream.close(); + } + */ + delete[] temp; + + glDeleteProgram(glprogram); + return 0; + } + + return glprogram; +} + +} diff --git a/libraries/gl/src/gl/GLShaders.h b/libraries/gl/src/gl/GLShaders.h new file mode 100644 index 0000000000..b8c8b6770b --- /dev/null +++ b/libraries/gl/src/gl/GLShaders.h @@ -0,0 +1,29 @@ +// +// Created by Bradley Austin Davis 2016/09/27 +// Copyright 2014 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#pragma once +#ifndef hifi_GLShaders_h +#define hifi_GLShaders_h + +#include "Config.h" + +#include +#include + +namespace gl { +#ifdef SEPARATE_PROGRAM + bool compileShader(GLenum shaderDomain, const std::string& shaderSource, const std::string& defines, GLuint &shaderObject, GLuint &programObject); +#else + bool compileShader(GLenum shaderDomain, const std::string& shaderSource, const std::string& defines, GLuint &shaderObject); +#endif + + GLuint compileProgram(const std::vector& glshaders); + +} + +#endif diff --git a/libraries/gpu-gl/src/gpu/gl/GLShader.cpp b/libraries/gpu-gl/src/gpu/gl/GLShader.cpp index a2f44b9938..f8d493c25b 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLShader.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLShader.cpp @@ -6,6 +6,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #include "GLShader.h" +#include + #include "GLBackend.h" using namespace gpu; @@ -68,7 +70,11 @@ GLShader* compileBackendShader(GLBackend& backend, const Shader& shader) { std::string shaderDefines = glslVersion + "\n" + DOMAIN_DEFINES[shader.getType()] + "\n" + VERSION_DEFINES[version]; - bool result = compileShader(shaderDomain, shaderSource, shaderDefines, shaderObject.glshader, shaderObject.glprogram); +#ifdef SEPARATE_PROGRAM + bool result = ::gl::compileShader(shaderDomain, shaderSource, shaderDefines, shaderObject.glshader, shaderObject.glprogram); +#else + bool result = ::gl::compileShader(shaderDomain, shaderSource, shaderDefines, shaderObject.glshader); +#endif if (!result) { return nullptr; } @@ -103,7 +109,7 @@ GLShader* compileBackendProgram(GLBackend& backend, const Shader& program) { } } - GLuint glprogram = compileProgram(shaderGLObjects); + GLuint glprogram = ::gl::compileProgram(shaderGLObjects); if (glprogram == 0) { return nullptr; } diff --git a/libraries/gpu-gl/src/gpu/gl/GLShared.cpp b/libraries/gpu-gl/src/gpu/gl/GLShared.cpp index af03da1931..943cb3c7b5 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLShared.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLShared.cpp @@ -692,187 +692,6 @@ int makeOutputSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, Sh return 0; //inputsCount; } - -bool compileShader(GLenum shaderDomain, const std::string& shaderSource, const std::string& defines, GLuint &shaderObject, GLuint &programObject) { - if (shaderSource.empty()) { - qCDebug(gpugllogging) << "GLShader::compileShader - no GLSL shader source code ? so failed to create"; - return false; - } - - // Create the shader object - GLuint glshader = glCreateShader(shaderDomain); - if (!glshader) { - qCDebug(gpugllogging) << "GLShader::compileShader - failed to create the gl shader object"; - return false; - } - - // Assign the source - const int NUM_SOURCE_STRINGS = 2; - const GLchar* srcstr[] = { defines.c_str(), shaderSource.c_str() }; - glShaderSource(glshader, NUM_SOURCE_STRINGS, srcstr, NULL); - - // Compile ! - glCompileShader(glshader); - - // check if shader compiled - GLint compiled = 0; - glGetShaderiv(glshader, GL_COMPILE_STATUS, &compiled); - - // if compilation fails - if (!compiled) { - - // save the source code to a temp file so we can debug easily - /* - std::ofstream filestream; - filestream.open("debugshader.glsl"); - if (filestream.is_open()) { - filestream << srcstr[0]; - filestream << srcstr[1]; - filestream.close(); - } - */ - - GLint infoLength = 0; - glGetShaderiv(glshader, GL_INFO_LOG_LENGTH, &infoLength); - - char* temp = new char[infoLength]; - glGetShaderInfoLog(glshader, infoLength, NULL, temp); - - - /* - filestream.open("debugshader.glsl.info.txt"); - if (filestream.is_open()) { - filestream << std::string(temp); - filestream.close(); - } - */ - - qCWarning(gpugllogging) << "GLShader::compileShader - failed to compile the gl shader object:"; - for (auto s : srcstr) { - qCWarning(gpugllogging) << s; - } - qCWarning(gpugllogging) << "GLShader::compileShader - errors:"; - qCWarning(gpugllogging) << temp; - delete[] temp; - - glDeleteShader(glshader); - return false; - } - - GLuint glprogram = 0; -#ifdef SEPARATE_PROGRAM - // so far so good, program is almost done, need to link: - GLuint glprogram = glCreateProgram(); - if (!glprogram) { - qCDebug(gpugllogging) << "GLShader::compileShader - failed to create the gl shader & gl program object"; - return false; - } - - glProgramParameteri(glprogram, GL_PROGRAM_SEPARABLE, GL_TRUE); - glAttachShader(glprogram, glshader); - glLinkProgram(glprogram); - - GLint linked = 0; - glGetProgramiv(glprogram, GL_LINK_STATUS, &linked); - - if (!linked) { - /* - // save the source code to a temp file so we can debug easily - std::ofstream filestream; - filestream.open("debugshader.glsl"); - if (filestream.is_open()) { - filestream << shaderSource->source; - filestream.close(); - } - */ - - GLint infoLength = 0; - glGetProgramiv(glprogram, GL_INFO_LOG_LENGTH, &infoLength); - - char* temp = new char[infoLength]; - glGetProgramInfoLog(glprogram, infoLength, NULL, temp); - - qCDebug(gpugllogging) << "GLShader::compileShader - failed to LINK the gl program object :"; - qCDebug(gpugllogging) << temp; - - /* - filestream.open("debugshader.glsl.info.txt"); - if (filestream.is_open()) { - filestream << String(temp); - filestream.close(); - } - */ - delete[] temp; - - glDeleteShader(glshader); - glDeleteProgram(glprogram); - return false; - } -#endif - - shaderObject = glshader; - programObject = glprogram; - - return true; -} - -GLuint compileProgram(const std::vector& glshaders) { - // A brand new program: - GLuint glprogram = glCreateProgram(); - if (!glprogram) { - qCDebug(gpugllogging) << "GLShader::compileProgram - failed to create the gl program object"; - return 0; - } - - // glProgramParameteri(glprogram, GL_PROGRAM_, GL_TRUE); - // Create the program from the sub shaders - for (auto so : glshaders) { - glAttachShader(glprogram, so); - } - - // Link! - glLinkProgram(glprogram); - - GLint linked = 0; - glGetProgramiv(glprogram, GL_LINK_STATUS, &linked); - - if (!linked) { - /* - // save the source code to a temp file so we can debug easily - std::ofstream filestream; - filestream.open("debugshader.glsl"); - if (filestream.is_open()) { - filestream << shaderSource->source; - filestream.close(); - } - */ - - GLint infoLength = 0; - glGetProgramiv(glprogram, GL_INFO_LOG_LENGTH, &infoLength); - - char* temp = new char[infoLength]; - glGetProgramInfoLog(glprogram, infoLength, NULL, temp); - - qCDebug(gpugllogging) << "GLShader::compileProgram - failed to LINK the gl program object :"; - qCDebug(gpugllogging) << temp; - - /* - filestream.open("debugshader.glsl.info.txt"); - if (filestream.is_open()) { - filestream << std::string(temp); - filestream.close(); - } - */ - delete[] temp; - - glDeleteProgram(glprogram); - return 0; - } - - return glprogram; -} - - void makeProgramBindings(ShaderObject& shaderObject) { if (!shaderObject.glprogram) { return; diff --git a/libraries/gpu-gl/src/gpu/gl/GLShared.h b/libraries/gpu-gl/src/gpu/gl/GLShared.h index b5dece7cf4..1b2724fe38 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLShared.h +++ b/libraries/gpu-gl/src/gpu/gl/GLShared.h @@ -44,8 +44,6 @@ int makeUniformSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, int makeUniformBlockSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, Shader::SlotSet& buffers); int makeInputSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, Shader::SlotSet& inputs); int makeOutputSlots(GLuint glprogram, const Shader::BindingSet& slotBindings, Shader::SlotSet& outputs); -bool compileShader(GLenum shaderDomain, const std::string& shaderSource, const std::string& defines, GLuint &shaderObject, GLuint &programObject); -GLuint compileProgram(const std::vector& glshaders); void makeProgramBindings(ShaderObject& shaderObject); enum GLSyncState { From d3d3aa587cbaeb1d8736c8340b77597f922f23ee Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 29 Sep 2016 11:12:11 -0700 Subject: [PATCH 073/300] Remove oglplus usage from OpenVR --- .../resources/shaders/hmd_reproject.frag | 78 ------ .../resources/shaders/hmd_reproject.vert | 20 -- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 258 +++++++++++++----- 3 files changed, 185 insertions(+), 171 deletions(-) delete mode 100644 interface/resources/shaders/hmd_reproject.frag delete mode 100644 interface/resources/shaders/hmd_reproject.vert diff --git a/interface/resources/shaders/hmd_reproject.frag b/interface/resources/shaders/hmd_reproject.frag deleted file mode 100644 index adda0315a3..0000000000 --- a/interface/resources/shaders/hmd_reproject.frag +++ /dev/null @@ -1,78 +0,0 @@ -// -// Created by Bradley Austin Davis on 2016/07/11 -// Copyright 2013-2016 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#version 410 core - -uniform sampler2D sampler; -uniform mat3 reprojection = mat3(1); -uniform mat4 inverseProjections[2]; -uniform mat4 projections[2]; - -in vec2 vTexCoord; -in vec3 vPosition; - -out vec4 FragColor; - -void main() { - vec2 uv = vTexCoord; - - mat4 eyeInverseProjection; - mat4 eyeProjection; - - float xoffset = 1.0; - vec2 uvmin = vec2(0.0); - vec2 uvmax = vec2(1.0); - // determine the correct projection and inverse projection to use. - if (vTexCoord.x < 0.5) { - uvmax.x = 0.5; - eyeInverseProjection = inverseProjections[0]; - eyeProjection = projections[0]; - } else { - xoffset = -1.0; - uvmin.x = 0.5; - uvmax.x = 1.0; - eyeInverseProjection = inverseProjections[1]; - eyeProjection = projections[1]; - } - - // Account for stereo in calculating the per-eye NDC coordinates - vec4 ndcSpace = vec4(vPosition, 1.0); - ndcSpace.x *= 2.0; - ndcSpace.x += xoffset; - - // Convert from NDC to eyespace - vec4 eyeSpace = eyeInverseProjection * ndcSpace; - eyeSpace /= eyeSpace.w; - - // Convert to a noramlized ray - vec3 ray = eyeSpace.xyz; - ray = normalize(ray); - - // Adjust the ray by the rotation - ray = reprojection * ray; - - // Project back on to the texture plane - ray *= eyeSpace.z / ray.z; - - // Update the eyespace vector - eyeSpace.xyz = ray; - - // Reproject back into NDC - ndcSpace = eyeProjection * eyeSpace; - ndcSpace /= ndcSpace.w; - ndcSpace.x -= xoffset; - ndcSpace.x /= 2.0; - - // Calculate the new UV coordinates - uv = (ndcSpace.xy / 2.0) + 0.5; - if (any(greaterThan(uv, uvmax)) || any(lessThan(uv, uvmin))) { - FragColor = vec4(0.0, 0.0, 0.0, 1.0); - } else { - FragColor = texture(sampler, uv); - } -} \ No newline at end of file diff --git a/interface/resources/shaders/hmd_reproject.vert b/interface/resources/shaders/hmd_reproject.vert deleted file mode 100644 index 923375613a..0000000000 --- a/interface/resources/shaders/hmd_reproject.vert +++ /dev/null @@ -1,20 +0,0 @@ -// -// Created by Bradley Austin Davis on 2016/07/11 -// Copyright 2013-2016 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#version 410 core -in vec3 Position; -in vec2 TexCoord; - -out vec3 vPosition; -out vec2 vTexCoord; - -void main() { - gl_Position = vec4(Position, 1); - vTexCoord = TexCoord; - vPosition = Position; -} diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 4c4fcbbd37..9247ebea0b 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -9,10 +9,13 @@ #include #include +#include +#include #include #include +#include #include #include @@ -25,7 +28,6 @@ #include #include #include -#include #include "OpenVrHelpers.h" @@ -45,13 +47,111 @@ static vr::VRTextureBounds_t OPENVR_TEXTURE_BOUNDS_RIGHT{ 0.5f, 0, 1, 1 }; #if OPENVR_THREADED_SUBMIT -static QString readFile(const QString& filename) { - QFile file(filename); - file.open(QFile::Text | QFile::ReadOnly); - QString result; - result.append(QTextStream(&file).readAll()); - return result; +#define REPROJECTION_BINDING 1 + +static const char* HMD_REPROJECTION_VERT = R"SHADER( +#version 450 core + +out vec3 vPosition; +out vec2 vTexCoord; + +void main(void) { + const float depth = 0.0; + const vec4 UNIT_QUAD[4] = vec4[4]( + vec4(-1.0, -1.0, depth, 1.0), + vec4(1.0, -1.0, depth, 1.0), + vec4(-1.0, 1.0, depth, 1.0), + vec4(1.0, 1.0, depth, 1.0) + ); + vec4 pos = UNIT_QUAD[gl_VertexID]; + + gl_Position = pos; + vPosition = pos.xyz; + vTexCoord = (pos.xy + 1.0) * 0.5; } +)SHADER"; + +static const char* HMD_REPROJECTION_FRAG = R"SHADER( +#version 450 core + +uniform sampler2D sampler; +layout(binding = 1, std140) uniform Reprojection +{ + mat4 projections[2]; + mat4 inverseProjections[2]; + mat4 reprojection; +}; + +in vec3 vPosition; +in vec2 vTexCoord; + +out vec4 FragColor; + +void main() { + vec2 uv = vTexCoord; + + mat4 eyeInverseProjection; + mat4 eyeProjection; + + float xoffset = 1.0; + vec2 uvmin = vec2(0.0); + vec2 uvmax = vec2(1.0); + // determine the correct projection and inverse projection to use. + if (vTexCoord.x < 0.5) { + uvmax.x = 0.5; + eyeInverseProjection = inverseProjections[0]; + eyeProjection = projections[0]; + } else { + xoffset = -1.0; + uvmin.x = 0.5; + uvmax.x = 1.0; + eyeInverseProjection = inverseProjections[1]; + eyeProjection = projections[1]; + } + + // Account for stereo in calculating the per-eye NDC coordinates + vec4 ndcSpace = vec4(vPosition, 1.0); + ndcSpace.x *= 2.0; + ndcSpace.x += xoffset; + + // Convert from NDC to eyespace + vec4 eyeSpace = eyeInverseProjection * ndcSpace; + eyeSpace /= eyeSpace.w; + + // Convert to a noramlized ray + vec3 ray = eyeSpace.xyz; + ray = normalize(ray); + + // Adjust the ray by the rotation + ray = mat3(reprojection) * ray; + + // Project back on to the texture plane + ray *= eyeSpace.z / ray.z; + + // Update the eyespace vector + eyeSpace.xyz = ray; + + // Reproject back into NDC + ndcSpace = eyeProjection * eyeSpace; + ndcSpace /= ndcSpace.w; + ndcSpace.x -= xoffset; + ndcSpace.x /= 2.0; + + // Calculate the new UV coordinates + uv = (ndcSpace.xy / 2.0) + 0.5; + if (any(greaterThan(uv, uvmax)) || any(lessThan(uv, uvmin))) { + FragColor = vec4(0.0, 0.0, 0.0, 1.0); + } else { + FragColor = texture(sampler, uv); + } +} +)SHADER"; + +struct Reprojection { + mat4 projections[2]; + mat4 inverseProjections[2]; + mat4 reprojection; +}; class OpenVrSubmitThread : public QThread, public Dependency { public: @@ -60,54 +160,11 @@ public: using Lock = std::unique_lock; friend class OpenVrDisplayPlugin; std::shared_ptr _canvas; - BasicFramebufferWrapperPtr _framebuffer; - ProgramPtr _program; - ShapeWrapperPtr _plane; - struct ReprojectionUniforms { - int32_t reprojectionMatrix{ -1 }; - int32_t inverseProjectionMatrix{ -1 }; - int32_t projectionMatrix{ -1 }; - } _reprojectionUniforms; - OpenVrSubmitThread(OpenVrDisplayPlugin& plugin) : _plugin(plugin) { setObjectName("OpenVR Submit Thread"); } - void updateReprojectionProgram() { - static const QString vsFile = PathUtils::resourcesPath() + "/shaders/hmd_reproject.vert"; - static const QString fsFile = PathUtils::resourcesPath() + "/shaders/hmd_reproject.frag"; -#if LIVE_SHADER_RELOAD - static qint64 vsBuiltAge = 0; - static qint64 fsBuiltAge = 0; - QFileInfo vsInfo(vsFile); - QFileInfo fsInfo(fsFile); - auto vsAge = vsInfo.lastModified().toMSecsSinceEpoch(); - auto fsAge = fsInfo.lastModified().toMSecsSinceEpoch(); - if (!_reprojectionProgram || vsAge > vsBuiltAge || fsAge > fsBuiltAge) { - vsBuiltAge = vsAge; - fsBuiltAge = fsAge; -#else - if (!_program) { -#endif - QString vsSource = readFile(vsFile); - QString fsSource = readFile(fsFile); - ProgramPtr program; - try { - compileProgram(program, vsSource.toLocal8Bit().toStdString(), fsSource.toLocal8Bit().toStdString()); - if (program) { - using namespace oglplus; - _reprojectionUniforms.reprojectionMatrix = Uniform(*program, "reprojection").Location(); - _reprojectionUniforms.inverseProjectionMatrix = Uniform(*program, "inverseProjections").Location(); - _reprojectionUniforms.projectionMatrix = Uniform(*program, "projections").Location(); - _program = program; - } - } catch (std::runtime_error& error) { - qWarning() << "Error building reprojection shader " << error.what(); - } - } - } - void updateSource() { _plugin.withNonPresentThreadLock([&] { while (!_queue.empty()) { @@ -130,15 +187,57 @@ public: }); } + GLuint _program { 0 }; + + void updateProgram() { + if (!_program) { + std::string vsSource = HMD_REPROJECTION_VERT; + std::string fsSource = HMD_REPROJECTION_FRAG; + GLuint vertexShader { 0 }, fragmentShader { 0 }; + ::gl::compileShader(GL_VERTEX_SHADER, vsSource, "", vertexShader); + ::gl::compileShader(GL_FRAGMENT_SHADER, fsSource, "", fragmentShader); + _program = ::gl::compileProgram({ { vertexShader, fragmentShader } }); + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + qDebug() << "Rebuild proigram"; + } + } + +#define COLOR_BUFFER_COUNT 4 + void run() override { + + GLuint _framebuffer { 0 }; + std::array _colors; + size_t currentColorBuffer { 0 }; + size_t globalColorBufferCount { 0 }; + GLuint _uniformBuffer { 0 }; + GLuint _vao { 0 }; + GLuint _depth { 0 }; + Reprojection _reprojection; + QThread::currentThread()->setPriority(QThread::Priority::TimeCriticalPriority); _canvas->makeCurrent(); + + glCreateBuffers(1, &_uniformBuffer); + glNamedBufferStorage(_uniformBuffer, sizeof(Reprojection), 0, GL_DYNAMIC_STORAGE_BIT); + glCreateVertexArrays(1, &_vao); + glBindVertexArray(_vao); + + + glCreateFramebuffers(1, &_framebuffer); + { + glCreateRenderbuffers(1, &_depth); + glNamedRenderbufferStorage(_depth, GL_DEPTH24_STENCIL8, _plugin._renderTargetSize.x, _plugin._renderTargetSize.y); + glNamedFramebufferRenderbuffer(_framebuffer, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depth); + glCreateTextures(GL_TEXTURE_2D, COLOR_BUFFER_COUNT, &_colors[0]); + for (size_t i = 0; i < COLOR_BUFFER_COUNT; ++i) { + glTextureStorage2D(_colors[i], 1, GL_RGBA8, _plugin._renderTargetSize.x, _plugin._renderTargetSize.y); + } + } + glDisable(GL_DEPTH_TEST); glViewport(0, 0, _plugin._renderTargetSize.x, _plugin._renderTargetSize.y); - _framebuffer = std::make_shared(); - _framebuffer->Init(_plugin._renderTargetSize); - updateReprojectionProgram(); - _plane = loadPlane(_program); _canvas->doneCurrent(); while (!_quit) { _canvas->makeCurrent(); @@ -149,29 +248,35 @@ public: continue; } + + updateProgram(); { auto presentRotation = glm::mat3(_nextRender.poses[0]); auto renderRotation = glm::mat3(_current.pose); - auto correction = glm::inverse(renderRotation) * presentRotation; - _framebuffer->Bound([&] { + for (size_t i = 0; i < 2; ++i) { + _reprojection.projections[i] = _plugin._eyeProjections[i]; + _reprojection.inverseProjections[i] = _plugin._eyeInverseProjections[i]; + } + _reprojection.reprojection = glm::inverse(renderRotation) * presentRotation; + glNamedBufferSubData(_uniformBuffer, 0, sizeof(Reprojection), &_reprojection); + glNamedFramebufferTexture(_framebuffer, GL_COLOR_ATTACHMENT0, _colors[currentColorBuffer], 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _framebuffer); + { + glClearColor(1, 1, 0, 1); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glTextureParameteri(_current.textureID, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTextureParameteri(_current.textureID, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glUseProgram(_program); + glBindBufferBase(GL_UNIFORM_BUFFER, REPROJECTION_BINDING, _uniformBuffer); glBindTexture(GL_TEXTURE_2D, _current.textureID); - _program->Use(); - using namespace oglplus; - Texture::MinFilter(TextureTarget::_2D, TextureMinFilter::Linear); - Texture::MagFilter(TextureTarget::_2D, TextureMagFilter::Linear); - Uniform(*_program, _reprojectionUniforms.reprojectionMatrix).Set(correction); - //Uniform(*_reprojectionProgram, PROJECTION_MATRIX_LOCATION).Set(_eyeProjections); - //Uniform(*_reprojectionProgram, INVERSE_PROJECTION_MATRIX_LOCATION).Set(_eyeInverseProjections); - // FIXME what's the right oglplus mechanism to do this? It's not that ^^^ ... better yet, switch to a uniform buffer - glUniformMatrix4fv(_reprojectionUniforms.inverseProjectionMatrix, 2, GL_FALSE, &(_plugin._eyeInverseProjections[0][0][0])); - glUniformMatrix4fv(_reprojectionUniforms.projectionMatrix, 2, GL_FALSE, &(_plugin._eyeProjections[0][0][0])); - _plane->UseInProgram(*_program); - _plane->Draw(); - }); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); static const vr::VRTextureBounds_t leftBounds{ 0, 0, 0.5f, 1 }; static const vr::VRTextureBounds_t rightBounds{ 0.5f, 0, 1, 1 }; - vr::Texture_t texture{ (void*)oglplus::GetName(_framebuffer->color), vr::API_OpenGL, vr::ColorSpace_Auto }; + vr::Texture_t texture{ (void*)_colors[currentColorBuffer], vr::API_OpenGL, vr::ColorSpace_Auto }; vr::VRCompositor()->Submit(vr::Eye_Left, &texture, &leftBounds); vr::VRCompositor()->Submit(vr::Eye_Right, &texture, &rightBounds); _plugin._presentRate.increment(); @@ -199,14 +304,21 @@ public: ++_presentCount; _presented.notify_one(); }); + + ++globalColorBufferCount; + currentColorBuffer = globalColorBufferCount % COLOR_BUFFER_COUNT; } _canvas->doneCurrent(); } _canvas->makeCurrent(); - _plane.reset(); - _program.reset(); - _framebuffer.reset(); + glDeleteBuffers(1, &_uniformBuffer); + glDeleteFramebuffers(1, &_framebuffer); + CHECK_GL_ERROR(); + glDeleteTextures(4, &_colors[0]); + glDeleteProgram(_program); + glBindVertexArray(0); + glDeleteVertexArrays(1, &_vao); _canvas->doneCurrent(); } From 488d191428526a4c9715fcac1babfe5b459b5cf5 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 29 Sep 2016 11:17:17 -0700 Subject: [PATCH 074/300] Remove all oglplus usage and references --- cmake/externals/oglplus/CMakeLists.txt | 21 - cmake/macros/TargetOglplus.cmake | 21 - cmake/modules/FindOGLPLUS.cmake | 24 - libraries/display-plugins/CMakeLists.txt | 4 - libraries/gl/CMakeLists.txt | 1 - libraries/gl/src/gl/OglplusHelpers.cpp | 482 ------------- libraries/gl/src/gl/OglplusHelpers.h | 190 ------ libraries/render-utils/CMakeLists.txt | 1 - .../src/OculusLegacyDisplayPlugin.cpp | 4 - tests/render-perf/src/TextOverlay.hpp | 31 +- tests/shaders/CMakeLists.txt | 2 - tests/ui/src/oldmain.cpp | 643 ------------------ 12 files changed, 19 insertions(+), 1405 deletions(-) delete mode 100644 cmake/externals/oglplus/CMakeLists.txt delete mode 100644 cmake/macros/TargetOglplus.cmake delete mode 100644 cmake/modules/FindOGLPLUS.cmake delete mode 100644 libraries/gl/src/gl/OglplusHelpers.cpp delete mode 100644 libraries/gl/src/gl/OglplusHelpers.h delete mode 100644 tests/ui/src/oldmain.cpp diff --git a/cmake/externals/oglplus/CMakeLists.txt b/cmake/externals/oglplus/CMakeLists.txt deleted file mode 100644 index 089ee5bb95..0000000000 --- a/cmake/externals/oglplus/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -set(EXTERNAL_NAME oglplus) -string(TOUPPER ${EXTERNAL_NAME} EXTERNAL_NAME_UPPER) - -include(ExternalProject) -ExternalProject_Add( - ${EXTERNAL_NAME} - URL http://hifi-public.s3.amazonaws.com/dependencies/oglplus-0.63.0.zip - URL_MD5 de984ab245b185b45c87415c0e052135 - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - LOG_DOWNLOAD 1 -) - -# Hide this external target (for ide users) -set_target_properties(${EXTERNAL_NAME} PROPERTIES FOLDER "hidden/externals") - -ExternalProject_Get_Property(${EXTERNAL_NAME} SOURCE_DIR) - -set(${EXTERNAL_NAME_UPPER}_INCLUDE_DIRS ${SOURCE_DIR}/include ${SOURCE_DIR}/implement CACHE TYPE INTERNAL) - diff --git a/cmake/macros/TargetOglplus.cmake b/cmake/macros/TargetOglplus.cmake deleted file mode 100644 index 16a50f3dd7..0000000000 --- a/cmake/macros/TargetOglplus.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# -# Copyright 2015 High Fidelity, Inc. -# Created by Bradley Austin Davis on 2015/10/10 -# -# Distributed under the Apache License, Version 2.0. -# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -# -macro(TARGET_OGLPLUS) - # our OGL plus setup requires glew - target_glew() - - # our OGL plus setup requires boostconfig - add_dependency_external_projects(boostconfig) - find_package(BoostConfig REQUIRED) - target_include_directories(${TARGET_NAME} PUBLIC ${BOOSTCONFIG_INCLUDE_DIRS}) - - - add_dependency_external_projects(oglplus) - find_package(OGLPLUS REQUIRED) - target_include_directories(${TARGET_NAME} PUBLIC ${OGLPLUS_INCLUDE_DIRS}) -endmacro() \ No newline at end of file diff --git a/cmake/modules/FindOGLPLUS.cmake b/cmake/modules/FindOGLPLUS.cmake deleted file mode 100644 index 6ba883ee2c..0000000000 --- a/cmake/modules/FindOGLPLUS.cmake +++ /dev/null @@ -1,24 +0,0 @@ -# -# Try to find OGLPLUS include path. -# Once done this will define -# -# OGLPLUS_INCLUDE_DIRS -# -# Created by Bradley Austin Davis on 2015/05/22 -# Copyright 2015 High Fidelity, Inc. -# -# Distributed under the Apache License, Version 2.0. -# See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -# - -# setup hints for OGLPLUS search -include("${MACRO_DIR}/HifiLibrarySearchHints.cmake") -hifi_library_search_hints("oglplus") - -# locate header -find_path(OGLPLUS_INCLUDE_DIRS "oglplus/fwd.hpp" HINTS ${OGLPLUS_SEARCH_DIRS}) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(OGLPLUS DEFAULT_MSG OGLPLUS_INCLUDE_DIRS) - -mark_as_advanced(OGLPLUS_INCLUDE_DIRS OGLPLUS_SEARCH_DIRS) \ No newline at end of file diff --git a/libraries/display-plugins/CMakeLists.txt b/libraries/display-plugins/CMakeLists.txt index 5621a9c7b0..b7542c1d86 100644 --- a/libraries/display-plugins/CMakeLists.txt +++ b/libraries/display-plugins/CMakeLists.txt @@ -6,7 +6,3 @@ link_hifi_libraries(shared plugins ui-plugins gl gpu-gl ui render-utils) target_opengl() GroupSources("src/display-plugins") - -if (NOT ANDROID) - target_oglplus() -endif () diff --git a/libraries/gl/CMakeLists.txt b/libraries/gl/CMakeLists.txt index 0c29bf691a..3e2097e89e 100644 --- a/libraries/gl/CMakeLists.txt +++ b/libraries/gl/CMakeLists.txt @@ -6,5 +6,4 @@ target_opengl() if (NOT ANDROID) target_glew() - target_oglplus() endif () diff --git a/libraries/gl/src/gl/OglplusHelpers.cpp b/libraries/gl/src/gl/OglplusHelpers.cpp deleted file mode 100644 index 587c6488c8..0000000000 --- a/libraries/gl/src/gl/OglplusHelpers.cpp +++ /dev/null @@ -1,482 +0,0 @@ -// -// Created by Bradley Austin Davis on 2015/05/29 -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// -#include "OglplusHelpers.h" - -#include -#include -#include -#include "GLLogging.h" - -using namespace oglplus; -using namespace oglplus::shapes; - -static const char * SIMPLE_TEXTURED_VS = R"VS(#version 410 core -#pragma line __LINE__ - -uniform mat4 mvp = mat4(1); - -in vec3 Position; -in vec2 TexCoord; - -out vec3 vPosition; -out vec2 vTexCoord; - -void main() { - gl_Position = mvp * vec4(Position, 1); - vTexCoord = TexCoord; - vPosition = Position; -} - -)VS"; - -static const char * SIMPLE_TEXTURED_FS = R"FS(#version 410 core -#pragma line __LINE__ - -uniform sampler2D sampler; -uniform float alpha = 1.0; - -in vec3 vPosition; -in vec2 vTexCoord; - -out vec4 FragColor; - -void main() { - FragColor = texture(sampler, vTexCoord); - FragColor.a *= alpha; - if (FragColor.a <= 0.0) { - discard; - } -} - -)FS"; - - -static const char * SIMPLE_TEXTURED_CUBEMAP_FS = R"FS(#version 410 core -#pragma line __LINE__ - -uniform samplerCube sampler; -uniform float alpha = 1.0; - -in vec3 vPosition; -in vec3 vTexCoord; - -out vec4 FragColor; - -void main() { - - FragColor = texture(sampler, vPosition); - FragColor.a *= alpha; -} - -)FS"; - - -ProgramPtr loadDefaultShader() { - ProgramPtr result; - compileProgram(result, SIMPLE_TEXTURED_VS, SIMPLE_TEXTURED_FS); - return result; -} - -ProgramPtr loadCubemapShader() { - ProgramPtr result; - compileProgram(result, SIMPLE_TEXTURED_VS, SIMPLE_TEXTURED_CUBEMAP_FS); - return result; -} - -void compileProgram(ProgramPtr & result, const std::string& vs, const std::string& gs, const std::string& fs) { - using namespace oglplus; - try { - result = std::make_shared(); - // attach the shaders to the program - result->AttachShader( - VertexShader() - .Source(GLSLSource(vs)) - .Compile() - ); - result->AttachShader( - GeometryShader() - .Source(GLSLSource(gs)) - .Compile() - ); - result->AttachShader( - FragmentShader() - .Source(GLSLSource(fs)) - .Compile() - ); - result->Link(); - } catch (ProgramBuildError& err) { - Q_UNUSED(err); - qWarning() << err.Log().c_str(); - Q_ASSERT_X(false, "compileProgram", "Failed to build shader program"); - qFatal("%s", (const char*)err.Message); - result.reset(); - } -} - -void compileProgram(ProgramPtr & result, const std::string& vs, const std::string& fs) { - using namespace oglplus; - try { - result = std::make_shared(); - // attach the shaders to the program - result->AttachShader( - VertexShader() - .Source(GLSLSource(vs)) - .Compile() - ); - result->AttachShader( - FragmentShader() - .Source(GLSLSource(fs)) - .Compile() - ); - result->Link(); - } catch (ProgramBuildError& err) { - Q_UNUSED(err); - qWarning() << err.Log().c_str(); - Q_ASSERT_X(false, "compileProgram", "Failed to build shader program"); - qFatal("%s", (const char*) err.Message); - result.reset(); - } -} - - -ShapeWrapperPtr loadPlane(ProgramPtr program, float aspect) { - using namespace oglplus; - Vec3f a(1, 0, 0); - Vec3f b(0, 1, 0); - if (aspect > 1) { - b[1] /= aspect; - } else { - a[0] *= aspect; - } - return ShapeWrapperPtr( - new shapes::ShapeWrapper({ "Position", "TexCoord" }, shapes::Plane(a, b), *program) - ); -} - -ShapeWrapperPtr loadSkybox(ProgramPtr program) { - return ShapeWrapperPtr(new shapes::ShapeWrapper(std::initializer_list{ "Position" }, shapes::SkyBox(), *program)); -} - -// Return a point's cartesian coordinates on a sphere from pitch and yaw -static glm::vec3 getPoint(float yaw, float pitch) { - return glm::vec3(glm::cos(-pitch) * (-glm::sin(yaw)), - glm::sin(-pitch), - glm::cos(-pitch) * (-glm::cos(yaw))); -} - - -class SphereSection : public DrawingInstructionWriter, public DrawMode { -public: - using IndexArray = std::vector; - using PosArray = std::vector; - using TexArray = std::vector; - /// The type of the index container returned by Indices() - // vertex positions - PosArray _pos_data; - // vertex tex coords - TexArray _tex_data; - IndexArray _idx_data; - unsigned int _prim_count{ 0 }; - -public: - SphereSection( - const float fov, - const float aspectRatio, - const int slices_, - const int stacks_) { - //UV mapping source: http://www.mvps.org/directx/articles/spheremap.htm - if (fov >= PI) { - qCDebug(glLogging) << "TexturedHemisphere::buildVBO(): FOV greater or equal than Pi will create issues"; - } - - int gridSize = std::max(slices_, stacks_); - int gridSizeLog2 = 1; - while (1 << gridSizeLog2 < gridSize) { - ++gridSizeLog2; - } - gridSize = (1 << gridSizeLog2) + 1; - // Compute number of vertices needed - int vertices = gridSize * gridSize; - _pos_data.resize(vertices * 3); - _tex_data.resize(vertices * 2); - - // Compute vertices positions and texture UV coordinate - for (int y = 0; y <= gridSize; ++y) { - for (int x = 0; x <= gridSize; ++x) { - - } - } - for (int i = 0; i < gridSize; i++) { - float stacksRatio = (float)i / (float)(gridSize - 1); // First stack is 0.0f, last stack is 1.0f - // abs(theta) <= fov / 2.0f - float pitch = -fov * (stacksRatio - 0.5f); - for (int j = 0; j < gridSize; j++) { - float slicesRatio = (float)j / (float)(gridSize - 1); // First slice is 0.0f, last slice is 1.0f - // abs(phi) <= fov * aspectRatio / 2.0f - float yaw = -fov * aspectRatio * (slicesRatio - 0.5f); - int vertex = i * gridSize + j; - int posOffset = vertex * 3; - int texOffset = vertex * 2; - vec3 pos = getPoint(yaw, pitch); - _pos_data[posOffset] = pos.x; - _pos_data[posOffset + 1] = pos.y; - _pos_data[posOffset + 2] = pos.z; - _tex_data[texOffset] = slicesRatio; - _tex_data[texOffset + 1] = stacksRatio; - } - } // done with vertices - - int rowLen = gridSize; - - // gridsize now refers to the triangles, not the vertices, so reduce by one - // or die by fencepost error http://en.wikipedia.org/wiki/Off-by-one_error - --gridSize; - int quads = gridSize * gridSize; - for (int t = 0; t < quads; ++t) { - int x = - ((t & 0x0001) >> 0) | - ((t & 0x0004) >> 1) | - ((t & 0x0010) >> 2) | - ((t & 0x0040) >> 3) | - ((t & 0x0100) >> 4) | - ((t & 0x0400) >> 5) | - ((t & 0x1000) >> 6) | - ((t & 0x4000) >> 7); - int y = - ((t & 0x0002) >> 1) | - ((t & 0x0008) >> 2) | - ((t & 0x0020) >> 3) | - ((t & 0x0080) >> 4) | - ((t & 0x0200) >> 5) | - ((t & 0x0800) >> 6) | - ((t & 0x2000) >> 7) | - ((t & 0x8000) >> 8); - int i = x * (rowLen) + y; - - _idx_data.push_back(i); - _idx_data.push_back(i + 1); - _idx_data.push_back(i + rowLen + 1); - - _idx_data.push_back(i + rowLen + 1); - _idx_data.push_back(i + rowLen); - _idx_data.push_back(i); - } - _prim_count = quads * 2; - } - - /// Returns the winding direction of faces - FaceOrientation FaceWinding(void) const { - return FaceOrientation::CCW; - } - - typedef GLuint(SphereSection::*VertexAttribFunc)(std::vector&) const; - - /// Makes the vertex positions and returns the number of values per vertex - template - GLuint Positions(std::vector& dest) const { - dest.clear(); - dest.insert(dest.begin(), _pos_data.begin(), _pos_data.end()); - return 3; - } - - /// Makes the vertex normals and returns the number of values per vertex - template - GLuint Normals(std::vector& dest) const { - dest.clear(); - return 3; - } - - /// Makes the vertex tangents and returns the number of values per vertex - template - GLuint Tangents(std::vector& dest) const { - dest.clear(); - return 3; - } - - /// Makes the vertex bi-tangents and returns the number of values per vertex - template - GLuint Bitangents(std::vector& dest) const { - dest.clear(); - return 3; - } - - /// Makes the texture coordinates returns the number of values per vertex - template - GLuint TexCoordinates(std::vector& dest) const { - dest.clear(); - dest.insert(dest.begin(), _tex_data.begin(), _tex_data.end()); - return 2; - } - - typedef VertexAttribsInfo< - SphereSection, - std::tuple< - VertexPositionsTag, - VertexNormalsTag, - VertexTangentsTag, - VertexBitangentsTag, - VertexTexCoordinatesTag - > - > VertexAttribs; - - Spheref MakeBoundingSphere(void) const { - GLfloat min_x = _pos_data[3], max_x = _pos_data[3]; - GLfloat min_y = _pos_data[4], max_y = _pos_data[4]; - GLfloat min_z = _pos_data[5], max_z = _pos_data[5]; - for (std::size_t v = 0, vn = _pos_data.size() / 3; v != vn; ++v) { - GLfloat x = _pos_data[v * 3 + 0]; - GLfloat y = _pos_data[v * 3 + 1]; - GLfloat z = _pos_data[v * 3 + 2]; - - if (min_x > x) min_x = x; - if (min_y > y) min_y = y; - if (min_z > z) min_z = z; - if (max_x < x) max_x = x; - if (max_y < y) max_y = y; - if (max_z < z) max_z = z; - } - - Vec3f c( - (min_x + max_x) * 0.5f, - (min_y + max_y) * 0.5f, - (min_z + max_z) * 0.5f - ); - - return Spheref( - c.x(), c.y(), c.z(), - Distance(c, Vec3f(min_x, min_y, min_z)) - ); - } - - /// Queries the bounding sphere coordinates and dimensions - template - void BoundingSphere(oglplus::Sphere& bounding_sphere) const { - bounding_sphere = oglplus::Sphere(MakeBoundingSphere()); - } - - - /// Returns element indices that are used with the drawing instructions - const IndexArray & Indices(Default = Default()) const { - return _idx_data; - } - - /// Returns the instructions for rendering of faces - DrawingInstructions Instructions(PrimitiveType primitive) const { - DrawingInstructions instr = MakeInstructions(); - DrawOperation operation; - operation.method = DrawOperation::Method::DrawElements; - operation.mode = primitive; - operation.first = 0; - operation.count = _prim_count * 3; - operation.restart_index = DrawOperation::NoRestartIndex(); - operation.phase = 0; - AddInstruction(instr, operation); - return instr; - } - - /// Returns the instructions for rendering of faces - DrawingInstructions Instructions(Default = Default()) const { - return Instructions(PrimitiveType::Triangles); - } -}; - -ShapeWrapperPtr loadSphereSection(ProgramPtr program, float fov, float aspect, int slices, int stacks) { - using namespace oglplus; - return ShapeWrapperPtr( - new shapes::ShapeWrapper({ "Position", "TexCoord" }, SphereSection(fov, aspect, slices, stacks), *program) - ); -} - -namespace oglplus { - namespace shapes { - - class Laser : public DrawingInstructionWriter, public DrawMode { - public: - using IndexArray = std::vector; - using PosArray = std::vector; - /// The type of the index container returned by Indices() - // vertex positions - PosArray _pos_data; - IndexArray _idx_data; - unsigned int _prim_count { 0 }; - - public: - Laser() { - int vertices = 2; - _pos_data.resize(vertices * 3); - _pos_data[0] = 0; - _pos_data[1] = 0; - _pos_data[2] = 0; - - _pos_data[3] = 0; - _pos_data[4] = 0; - _pos_data[5] = -1; - - _idx_data.push_back(0); - _idx_data.push_back(1); - _prim_count = 1; - } - - /// Returns the winding direction of faces - FaceOrientation FaceWinding(void) const { - return FaceOrientation::CCW; - } - - /// Queries the bounding sphere coordinates and dimensions - template - void BoundingSphere(Sphere& bounding_sphere) const { - bounding_sphere = Sphere(0, 0, -0.5, 0.5); - } - - typedef GLuint(Laser::*VertexAttribFunc)(std::vector&) const; - - /// Makes the vertex positions and returns the number of values per vertex - template - GLuint Positions(std::vector& dest) const { - dest.clear(); - dest.insert(dest.begin(), _pos_data.begin(), _pos_data.end()); - return 3; - } - - typedef VertexAttribsInfo< - Laser, - std::tuple - > VertexAttribs; - - - /// Returns element indices that are used with the drawing instructions - const IndexArray & Indices(Default = Default()) const { - return _idx_data; - } - - /// Returns the instructions for rendering of faces - DrawingInstructions Instructions(PrimitiveType primitive) const { - DrawingInstructions instr = MakeInstructions(); - DrawOperation operation; - operation.method = DrawOperation::Method::DrawElements; - operation.mode = primitive; - operation.first = 0; - operation.count = _prim_count * 3; - operation.restart_index = DrawOperation::NoRestartIndex(); - operation.phase = 0; - AddInstruction(instr, operation); - return instr; - } - - /// Returns the instructions for rendering of faces - DrawingInstructions Instructions(Default = Default()) const { - return Instructions(PrimitiveType::Lines); - } - }; - } -} - -ShapeWrapperPtr loadLaser(const ProgramPtr& program) { - return std::make_shared(shapes::ShapeWrapper("Position", shapes::Laser(), *program)); -} - diff --git a/libraries/gl/src/gl/OglplusHelpers.h b/libraries/gl/src/gl/OglplusHelpers.h deleted file mode 100644 index 52e63f9431..0000000000 --- a/libraries/gl/src/gl/OglplusHelpers.h +++ /dev/null @@ -1,190 +0,0 @@ -// -// Created by Bradley Austin Davis on 2015/05/26 -// Copyright 2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// -#pragma once - -// FIXME support oglplus on all platforms -// For now it's a convenient helper for Windows - -#include -#include - - -#include - -#include "GLMHelpers.h" - -#define OGLPLUS_USE_GLCOREARB_H 0 -#define OGLPLUS_USE_GLEW 1 -#define OGLPLUS_USE_BOOST_CONFIG 1 -#define OGLPLUS_NO_SITE_CONFIG 1 -#define OGLPLUS_LOW_PROFILE 1 - -// NOTE: oglplus does some naked "#pragma GCC" without proper platform wrapping, so we need to disable this warning. -#ifdef _WIN32 -#pragma warning(push) -#pragma warning( disable : 4068 ) -#elif defined(Q_OS_MAC) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wpessimizing-move" -#endif - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic push -#if __GNUC__ >= 5 && __GNUC_MINOR__ >= 1 -#pragma GCC diagnostic ignored "-Wsuggest-override" -#endif -#endif - -#include - -#include -#include -#include -#include -#include -#include - -#if defined(__GNUC__) && !defined(__clang__) -#pragma GCC diagnostic pop -#endif - -#ifdef _WIN32 -#pragma warning(pop) -#elif defined(Q_OS_MAC) -#pragma clang diagnostic pop -#endif - -#include "NumericalConstants.h" - -using FramebufferPtr = std::shared_ptr; -using RenderbufferPtr = std::shared_ptr; -using TexturePtr = std::shared_ptr; -using ShapeWrapperPtr = std::shared_ptr; -using BufferPtr = std::shared_ptr; -using VertexArrayPtr = std::shared_ptr; -using ProgramPtr = std::shared_ptr; -using Mat4Uniform = oglplus::Uniform; - -ProgramPtr loadDefaultShader(); -ProgramPtr loadCubemapShader(); -void compileProgram(ProgramPtr & result, const std::string& vs, const std::string& fs); -void compileProgram(ProgramPtr & result, const std::string& vs, const std::string& gs, const std::string& fs); - -ShapeWrapperPtr loadSkybox(ProgramPtr program); -ShapeWrapperPtr loadPlane(ProgramPtr program, float aspect = 1.0f); -ShapeWrapperPtr loadSphereSection(ProgramPtr program, float fov = PI / 3.0f * 2.0f, float aspect = 16.0f / 9.0f, int slices = 128, int stacks = 128); -ShapeWrapperPtr loadLaser(const ProgramPtr& program); - - -// A basic wrapper for constructing a framebuffer with a renderbuffer -// for the depth attachment and an undefined type for the color attachement -// This allows us to reuse the basic framebuffer code for both the Mirror -// FBO as well as the Oculus swap textures we will use to render the scene -// Though we don't really need depth at all for the mirror FBO, or even an -// FBO, but using one means I can just use a glBlitFramebuffer to get it onto -// the screen. -template < - typename C, - typename D -> -struct FramebufferWrapper { - uvec2 size; - oglplus::Framebuffer fbo; - C color; - D depth; - - FramebufferWrapper() {} - - virtual ~FramebufferWrapper() { - } - - virtual void Init(const uvec2 & size) { - this->size = size; - initColor(); - initDepth(); - initDone(); - } - - template - void Bound(F f) { - Bound(oglplus::Framebuffer::Target::Draw, f); - } - - template - void Bound(oglplus::Framebuffer::Target target , F f) { - fbo.Bind(target); - onBind(target); - f(); - onUnbind(target); - oglplus::DefaultFramebuffer().Bind(target); - } - - void Viewport() { - oglplus::Context::Viewport(size.x, size.y); - } - -protected: - virtual void onBind(oglplus::Framebuffer::Target target) {} - virtual void onUnbind(oglplus::Framebuffer::Target target) {} - - static GLenum toEnum(oglplus::Framebuffer::Target target) { - switch (target) { - case oglplus::Framebuffer::Target::Draw: - return GL_DRAW_FRAMEBUFFER; - case oglplus::Framebuffer::Target::Read: - return GL_READ_FRAMEBUFFER; - default: - Q_ASSERT(false); - return GL_FRAMEBUFFER; - } - } - - virtual void initDepth() {} - - virtual void initColor() {} - - virtual void initDone() = 0; -}; - -struct BasicFramebufferWrapper : public FramebufferWrapper { -protected: - virtual void initDepth() override { - using namespace oglplus; - Context::Bound(Renderbuffer::Target::Renderbuffer, depth) - .Storage( - PixelDataInternalFormat::DepthComponent, - size.x, size.y); - } - - virtual void initColor() override { - using namespace oglplus; - Context::Bound(oglplus::Texture::Target::_2D, color) - .MinFilter(TextureMinFilter::Linear) - .MagFilter(TextureMagFilter::Linear) - .WrapS(TextureWrap::ClampToEdge) - .WrapT(TextureWrap::ClampToEdge) - .Image2D( - 0, PixelDataInternalFormat::RGBA8, - size.x, size.y, - 0, PixelDataFormat::RGB, PixelDataType::UnsignedByte, nullptr - ); - } - - virtual void initDone() override { - using namespace oglplus; - static const Framebuffer::Target target = Framebuffer::Target::Draw; - Bound(target, [&] { - fbo.AttachTexture(target, FramebufferAttachment::Color, color, 0); - fbo.AttachRenderbuffer(target, FramebufferAttachment::Depth, depth); - fbo.Complete(target); - }); - } -}; - -using BasicFramebufferWrapperPtr = std::shared_ptr; - diff --git a/libraries/render-utils/CMakeLists.txt b/libraries/render-utils/CMakeLists.txt index 115f4bd83e..ecafb8f565 100644 --- a/libraries/render-utils/CMakeLists.txt +++ b/libraries/render-utils/CMakeLists.txt @@ -7,5 +7,4 @@ link_hifi_libraries(shared gpu model model-networking render animation fbx entit if (NOT ANDROID) target_nsight() - target_oglplus() endif () diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp index 98516011d5..2feb272fbe 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp @@ -23,14 +23,10 @@ #include #include -#include #include #include #include -#include "OculusHelpers.h" - -using namespace oglplus; const QString OculusLegacyDisplayPlugin::NAME("Oculus Rift"); diff --git a/tests/render-perf/src/TextOverlay.hpp b/tests/render-perf/src/TextOverlay.hpp index d9a9f0a320..5e0c211b8d 100644 --- a/tests/render-perf/src/TextOverlay.hpp +++ b/tests/render-perf/src/TextOverlay.hpp @@ -17,8 +17,6 @@ #include #include -#include - #include "stb_font_consolas_24_latin1.inl" @@ -37,23 +35,16 @@ // todo : comment class TextOverlay { private: + uvec2 _size; +// FIXME port from oglplus +#if 0 FramebufferPtr _framebuffer; TexturePtr _texture; - uvec2 _size; BufferPtr _vertexBuffer; ProgramPtr _program; VertexArrayPtr _vertexArray; - - //vk::DescriptorPool descriptorPool; - //vk::DescriptorSetLayout descriptorSetLayout; - //vk::DescriptorSet descriptorSet; - //vk::PipelineLayout pipelineLayout; - //vk::Pipeline pipeline; - // Pointer to mapped vertex buffer glm::vec4* _mapped { nullptr }; - stb_fontchar stbFontData[STB_NUM_CHARS]; - uint32_t numLetters; const char* const VERTEX_SHADER = R"SHADER( #version 450 core @@ -92,6 +83,12 @@ void main(void) } )SHADER"; +#endif + + stb_fontchar stbFontData[STB_NUM_CHARS]; + uint32_t numLetters; + + public: enum TextAlign { alignLeft, alignCenter, alignRight }; @@ -104,11 +101,13 @@ public: } ~TextOverlay() { +#if 0 // Free up all Vulkan resources requested by the text overlay _program.reset(); _texture.reset(); _vertexBuffer.reset(); _vertexArray.reset(); +#endif } void resize(const uvec2& size) { @@ -118,6 +117,7 @@ public: // Prepare all vulkan resources required to render the font // The text overlay uses separate resources for descriptors (pool, sets, layouts), pipelines and command buffers void prepare() { +#if 0 static unsigned char font24pixels[STB_FONT_HEIGHT][STB_FONT_WIDTH]; STB_FONT_NAME(stbFontData, font24pixels, STB_FONT_HEIGHT); @@ -154,14 +154,17 @@ public: } compileProgram(_program, VERTEX_SHADER, FRAGMENT_SHADER); +#endif } // Map buffer void beginTextUpdate() { +#if 0 using namespace oglplus; _mapped = (glm::vec4*)glMapNamedBuffer(GetName(*_vertexBuffer), GL_WRITE_ONLY); numLetters = 0; +#endif } // Add text to the current buffer @@ -223,17 +226,21 @@ public: // Unmap buffer and update command buffers void endTextUpdate() { +#if 0 glUnmapNamedBuffer(GetName(*_vertexBuffer)); _mapped = nullptr; +#endif } // Needs to be called by the application void render() { +#if 0 _texture->Bind(oglplus::TextureTarget::_2D); _program->Use(); _vertexArray->Bind(); for (uint32_t j = 0; j < numLetters; j++) { glDrawArrays(GL_TRIANGLE_STRIP, j * 4, 4); } +#endif } }; diff --git a/tests/shaders/CMakeLists.txt b/tests/shaders/CMakeLists.txt index 4aa66b92db..5b38f473e8 100644 --- a/tests/shaders/CMakeLists.txt +++ b/tests/shaders/CMakeLists.txt @@ -5,8 +5,6 @@ set(TARGET_NAME shaders-test) setup_hifi_project(Quick Gui OpenGL) set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "Tests/manual-tests/") -#include_oglplus() - # link in the shared libraries link_hifi_libraries(shared octree gl gpu gpu-gl model render fbx networking entities script-engine physics diff --git a/tests/ui/src/oldmain.cpp b/tests/ui/src/oldmain.cpp deleted file mode 100644 index 82ba8376bd..0000000000 --- a/tests/ui/src/oldmain.cpp +++ /dev/null @@ -1,643 +0,0 @@ -// -// Created by Bradley Austin Davis on 2015-04-22 -// Copyright 2013-2015 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const QString& getResourcesDir() { - static QString dir; - if (dir.isEmpty()) { - QDir path(__FILE__); - path.cdUp(); - dir = path.cleanPath(path.absoluteFilePath("../../../interface/resources/")) + "/"; - qDebug() << "Resources Path: " << dir; - } - return dir; -} - -const QString& getExamplesDir() { - static QString dir; - if (dir.isEmpty()) { - QDir path(__FILE__); - path.cdUp(); - dir = path.cleanPath(path.absoluteFilePath("../../../examples/")) + "/"; - qDebug() << "Resources Path: " << dir; - } - return dir; -} - -const QString& getInterfaceQmlDir() { - static QString dir; - if (dir.isEmpty()) { - dir = getResourcesDir() + "qml/"; - qDebug() << "Qml Path: " << dir; - } - return dir; -} - -const QString& getTestQmlDir() { - static QString dir; - if (dir.isEmpty()) { - QDir path(__FILE__); - path.cdUp(); - dir = path.cleanPath(path.absoluteFilePath("../")) + "/"; - qDebug() << "Qml Test Path: " << dir; - } - return dir; -} - - -class RateCounter { - std::vector times; - QElapsedTimer timer; -public: - RateCounter() { - timer.start(); - } - - void reset() { - times.clear(); - } - - size_t count() const { - return times.size() - 1; - } - - float elapsed() const { - if (times.size() < 1) { - return 0.0f; - } - float elapsed = *times.rbegin() - *times.begin(); - return elapsed; - } - - void increment() { - times.push_back(timer.elapsed() / 1000.0f); - } - - float rate() const { - if (elapsed() == 0.0f) { - return 0.0f; - } - return (float) count() / elapsed(); - } -}; - - - - -extern QOpenGLContext* qt_gl_global_share_context(); - - -static bool hadUncaughtExceptions(QScriptEngine& engine, const QString& fileName) { - if (engine.hasUncaughtException()) { - const auto backtrace = engine.uncaughtExceptionBacktrace(); - const auto exception = engine.uncaughtException().toString(); - const auto line = QString::number(engine.uncaughtExceptionLineNumber()); - engine.clearExceptions(); - - auto message = QString("[UncaughtException] %1 in %2:%3").arg(exception, fileName, line); - if (!backtrace.empty()) { - static const auto lineSeparator = "\n "; - message += QString("\n[Backtrace]%1%2").arg(lineSeparator, backtrace.join(lineSeparator)); - } - qWarning() << qPrintable(message); - return true; - } - return false; -} - -const unsigned int SCRIPT_DATA_CALLBACK_USECS = floor(((1.0f / 60.0f) * 1000 * 1000) + 0.5f); - -static QScriptValue debugPrint(QScriptContext* context, QScriptEngine* engine) { - QString message = ""; - for (int i = 0; i < context->argumentCount(); i++) { - if (i > 0) { - message += " "; - } - message += context->argument(i).toString(); - } - qDebug().noquote() << "script:print()<<" << message; // noquote() so that \n is treated as newline - - message = message.replace("\\", "\\\\") - .replace("\n", "\\n") - .replace("\r", "\\r") - .replace("'", "\\'"); - engine->evaluate("Script.print('" + message + "')"); - - return QScriptValue(); -} - -class ScriptEngine : public QScriptEngine { - Q_OBJECT - -public: - void loadFile(const QString& scriptPath) { - if (_isRunning) { - return; - } - qDebug() << "Loading script from " << scriptPath; - _fileNameString = scriptPath; - - QFile file(scriptPath); - if (file.exists()) { - file.open(QIODevice::ReadOnly); - _scriptContents = file.readAll(); - } else { - qFatal("Missing file "); - } - runInThread(); - } - - Q_INVOKABLE void stop() { - if (!_isFinished) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "stop"); - return; - } - _isFinished = true; - if (_wantSignals) { - emit runningStateChanged(); - } - } - } - - Q_INVOKABLE void print(const QString& message) { - if (_wantSignals) { - emit printedMessage(message); - } - } - - Q_INVOKABLE QObject* setupTimerWithInterval(const QScriptValue& function, int intervalMS, bool isSingleShot) { - // create the timer, add it to the map, and start it - QTimer* newTimer = new QTimer(this); - newTimer->setSingleShot(isSingleShot); - - connect(newTimer, &QTimer::timeout, this, &ScriptEngine::timerFired); - - // make sure the timer stops when the script does - connect(this, &ScriptEngine::scriptEnding, newTimer, &QTimer::stop); - - _timerFunctionMap.insert(newTimer, function); - - newTimer->start(intervalMS); - return newTimer; - } - - Q_INVOKABLE QObject* setInterval(const QScriptValue& function, int intervalMS) { - return setupTimerWithInterval(function, intervalMS, false); - } - - Q_INVOKABLE QObject* setTimeout(const QScriptValue& function, int timeoutMS) { - return setupTimerWithInterval(function, timeoutMS, true); - } -private: - - void runInThread() { - QThread* workerThread = new QThread(); - connect(workerThread, &QThread::finished, workerThread, &QThread::deleteLater); - connect(workerThread, &QThread::started, this, &ScriptEngine::run); - connect(workerThread, &QThread::finished, this, &ScriptEngine::deleteLater); - connect(this, &ScriptEngine::doneRunning, workerThread, &QThread::quit); - moveToThread(workerThread); - workerThread->start(); - } - - void init() { - _isInitialized = true; - registerMetaTypes(this); - registerGlobalObject("Script", this); - qScriptRegisterSequenceMetaType>(this); - qScriptRegisterSequenceMetaType>(this); - globalObject().setProperty("OverlayWebWindow", newFunction(QmlWebWindowClass::constructor)); - QScriptValue printConstructorValue = newFunction(debugPrint); - globalObject().setProperty("print", printConstructorValue); - } - - void timerFired() { - QTimer* callingTimer = reinterpret_cast(sender()); - QScriptValue timerFunction = _timerFunctionMap.value(callingTimer); - - if (!callingTimer->isActive()) { - // this timer is done, we can kill it - _timerFunctionMap.remove(callingTimer); - delete callingTimer; - } - - // call the associated JS function, if it exists - if (timerFunction.isValid()) { - timerFunction.call(); - } - } - - - void run() { - if (!_isInitialized) { - init(); - } - - _isRunning = true; - if (_wantSignals) { - emit runningStateChanged(); - } - - QScriptValue result = evaluate(_scriptContents, _fileNameString); - QElapsedTimer startTime; - startTime.start(); - - int thisFrame = 0; - - qint64 lastUpdate = usecTimestampNow(); - - while (!_isFinished) { - int usecToSleep = (thisFrame++ * SCRIPT_DATA_CALLBACK_USECS) - startTime.nsecsElapsed() / 1000; // nsec to usec - if (usecToSleep > 0) { - usleep(usecToSleep); - } - - if (_isFinished) { - break; - } - - QCoreApplication::processEvents(); - if (_isFinished) { - break; - } - - qint64 now = usecTimestampNow(); - float deltaTime = (float)(now - lastUpdate) / (float)USECS_PER_SECOND; - if (!_isFinished) { - if (_wantSignals) { - emit update(deltaTime); - } - } - lastUpdate = now; - - // Debug and clear exceptions - hadUncaughtExceptions(*this, _fileNameString); - } - - if (_wantSignals) { - emit scriptEnding(); - } - - if (_wantSignals) { - emit finished(_fileNameString, this); - } - - _isRunning = false; - - if (_wantSignals) { - emit runningStateChanged(); - emit doneRunning(); - } - } - - void registerGlobalObject(const QString& name, QObject* object) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "registerGlobalObject", - Q_ARG(const QString&, name), - Q_ARG(QObject*, object)); - return; - } - if (!globalObject().property(name).isValid()) { - if (object) { - QScriptValue value = newQObject(object); - globalObject().setProperty(name, value); - } else { - globalObject().setProperty(name, QScriptValue()); - } - } - } - - void registerFunction(const QString& name, QScriptEngine::FunctionSignature functionSignature, int numArguments) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "registerFunction", - Q_ARG(const QString&, name), - Q_ARG(QScriptEngine::FunctionSignature, functionSignature), - Q_ARG(int, numArguments)); - return; - } - QScriptValue scriptFun = newFunction(functionSignature, numArguments); - globalObject().setProperty(name, scriptFun); - } - - void registerFunction(const QString& parent, const QString& name, QScriptEngine::FunctionSignature functionSignature, int numArguments) { - if (QThread::currentThread() != thread()) { - QMetaObject::invokeMethod(this, "registerFunction", - Q_ARG(const QString&, name), - Q_ARG(QScriptEngine::FunctionSignature, functionSignature), - Q_ARG(int, numArguments)); - return; - } - - QScriptValue object = globalObject().property(parent); - if (object.isValid()) { - QScriptValue scriptFun = newFunction(functionSignature, numArguments); - object.setProperty(name, scriptFun); - } - } - -signals: - void scriptLoaded(const QString& scriptFilename); - void errorLoadingScript(const QString& scriptFilename); - void update(float deltaTime); - void scriptEnding(); - void finished(const QString& fileNameString, ScriptEngine* engine); - void cleanupMenuItem(const QString& menuItemString); - void printedMessage(const QString& message); - void errorMessage(const QString& message); - void runningStateChanged(); - void evaluationFinished(QScriptValue result, bool isException); - void loadScript(const QString& scriptName, bool isUserLoaded); - void reloadScript(const QString& scriptName, bool isUserLoaded); - void doneRunning(); - - -private: - QString _scriptContents; - QString _fileNameString; - QString _parentURL; - bool _isInitialized { false }; - std::atomic _isFinished { false }; - std::atomic _isRunning { false }; - bool _wantSignals { true }; - QHash _timerFunctionMap; -}; - - - -ScriptEngine* loadScript(const QString& scriptFilename) { - ScriptEngine* scriptEngine = new ScriptEngine(); - scriptEngine->loadFile(scriptFilename); - return scriptEngine; -} - -OffscreenGLCanvas* _chromiumShareContext { nullptr }; -Q_GUI_EXPORT void qt_gl_set_global_share_context(QOpenGLContext *context); - - -// Create a simple OpenGL window that renders text in various ways -class QTestWindow : public QWindow { - Q_OBJECT - - QOpenGLContextWrapper* _context{ nullptr }; - QSize _size; - bool _altPressed{ false }; - RateCounter fps; - QTimer _timer; - int testQmlTexture{ 0 }; - ProgramPtr _program; - ShapeWrapperPtr _plane; - QScriptEngine* _scriptEngine { nullptr }; - -public: - QObject* rootMenu; - - QTestWindow() { - _scriptEngine = new ScriptEngine(); - _timer.setInterval(1); - QObject::connect(&_timer, &QTimer::timeout, this, &QTestWindow::draw); - - _chromiumShareContext = new OffscreenGLCanvas(); - _chromiumShareContext->create(); - _chromiumShareContext->makeCurrent(); - qt_gl_set_global_share_context(_chromiumShareContext->getContext()); - - { - setSurfaceType(QSurface::OpenGLSurface); - QSurfaceFormat format = getDefaultOpenGLSurfaceFormat(); - setFormat(format); - _context = new QOpenGLContextWrapper(); - _context->setFormat(format); - _context->setShareContext(_chromiumShareContext->getContext()); - } - - - if (!_context->create()) { - qFatal("Could not create OpenGL context"); - } - - show(); - - makeCurrent(); - - glewExperimental = true; - glewInit(); - glGetError(); - - using namespace oglplus; - Context::Enable(Capability::Blend); - Context::BlendFunc(BlendFunction::SrcAlpha, BlendFunction::OneMinusSrcAlpha); - Context::Disable(Capability::DepthTest); - Context::Disable(Capability::CullFace); - Context::ClearColor(0.2f, 0.2f, 0.2f, 1); - - InfoView::registerType(); - - auto offscreenUi = DependencyManager::set(); - { - offscreenUi->create(_context->getContext()); - offscreenUi->setProxyWindow(this); - - connect(offscreenUi.data(), &OffscreenUi::textureUpdated, this, [this, offscreenUi](int textureId) { - testQmlTexture = textureId; - }); - - makeCurrent(); - } - - - auto primaryScreen = QGuiApplication::primaryScreen(); - auto targetScreen = primaryScreen; - auto screens = QGuiApplication::screens(); - if (screens.size() > 1) { - for (auto screen : screens) { - if (screen != targetScreen) { - targetScreen = screen; - break; - } - } - } - auto rect = targetScreen->availableGeometry(); - rect.setWidth(rect.width() * 0.8f); - rect.setHeight(rect.height() * 0.8f); - rect.moveTo(QPoint(20, 20)); - setGeometry(rect); - -#ifdef QML_CONTROL_GALLERY - offscreenUi->setBaseUrl(QUrl::fromLocalFile(getTestQmlDir())); - offscreenUi->load(QUrl("main.qml")); -#else - offscreenUi->setBaseUrl(QUrl::fromLocalFile(getInterfaceQmlDir())); - offscreenUi->load(QUrl("TestRoot.qml")); -#endif - installEventFilter(offscreenUi.data()); - offscreenUi->resume(); - _timer.start(); - } - - virtual ~QTestWindow() { - DependencyManager::destroy(); - } - -private: - void draw() { - if (!isVisible()) { - return; - } - - makeCurrent(); - auto error = glGetError(); - if (error != GL_NO_ERROR) { - qDebug() << "GL error in entering draw " << error; - } - - using namespace oglplus; - Context::Clear().ColorBuffer().DepthBuffer(); - ivec2 size(_size.width(), _size.height()); - size *= devicePixelRatio(); - size = glm::max(size, ivec2(100, 100)); - Context::Viewport(size.x, size.y); - if (!_program) { - _program = loadDefaultShader(); - _plane = loadPlane(_program); - } - - if (testQmlTexture > 0) { - glBindTexture(GL_TEXTURE_2D, testQmlTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - } - - _program->Bind(); - _plane->Use(); - _plane->Draw(); - _context->swapBuffers(this); - - fps.increment(); - if (fps.elapsed() >= 10.0f) { - qDebug() << "FPS: " << fps.rate(); - fps.reset(); - } - } - - void makeCurrent() { - _context->makeCurrent(this); - } - - void resizeWindow(const QSize & size) { - _size = size; - DependencyManager::get()->resize(_size); - } - - -protected: - void resizeEvent(QResizeEvent* ev) override { - resizeWindow(ev->size()); - } - - - void keyPressEvent(QKeyEvent* event) override { - _altPressed = Qt::Key_Alt == event->key(); - switch (event->key()) { - case Qt::Key_B: - if (event->modifiers() & Qt::CTRL) { - auto offscreenUi = DependencyManager::get(); - offscreenUi->load("Browser.qml"); - } - break; - - case Qt::Key_J: - if (event->modifiers() & Qt::CTRL) { - loadScript(getExamplesDir() + "tests/qmlWebTest.js"); - } - break; - - case Qt::Key_K: - if (event->modifiers() & Qt::CTRL) { - OffscreenUi::question("Message title", "Message contents", [](QMessageBox::Button b){ - qDebug() << b; - }); - } - break; - } - QWindow::keyPressEvent(event); - } - - void moveEvent(QMoveEvent* event) override { - static qreal oldPixelRatio = 0.0; - if (devicePixelRatio() != oldPixelRatio) { - oldPixelRatio = devicePixelRatio(); - resizeWindow(size()); - } - QWindow::moveEvent(event); - } -}; - -const char * LOG_FILTER_RULES = R"V0G0N( -hifi.offscreen.focus.debug=false -qt.quick.mouse.debug=false -)V0G0N"; - -void messageHandler(QtMsgType type, const QMessageLogContext& context, const QString& message) { - QString logMessage = message; - -#ifdef Q_OS_WIN - if (!logMessage.isEmpty()) { - OutputDebugStringA(logMessage.toLocal8Bit().constData()); - OutputDebugStringA("\n"); - } -#endif -} - - -int main(int argc, char** argv) { - QGuiApplication app(argc, argv); - qInstallMessageHandler(messageHandler); - QLoggingCategory::setFilterRules(LOG_FILTER_RULES); - QTestWindow window; - app.exec(); - return 0; -} - -#include "main.moc" From f3f55c9857ecc675431ac582256a16ec3517a55a Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 29 Sep 2016 11:49:19 -0700 Subject: [PATCH 075/300] Fixing render-perf --- tests/render-perf/src/TextOverlay.hpp | 246 ------ tests/render-perf/src/main.cpp | 14 - .../src/stb_font_consolas_24_latin1.inl | 734 ------------------ 3 files changed, 994 deletions(-) delete mode 100644 tests/render-perf/src/TextOverlay.hpp delete mode 100644 tests/render-perf/src/stb_font_consolas_24_latin1.inl diff --git a/tests/render-perf/src/TextOverlay.hpp b/tests/render-perf/src/TextOverlay.hpp deleted file mode 100644 index 5e0c211b8d..0000000000 --- a/tests/render-perf/src/TextOverlay.hpp +++ /dev/null @@ -1,246 +0,0 @@ -/* -* Text overlay class for displaying debug information -* -* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de -* -* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) -*/ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "stb_font_consolas_24_latin1.inl" - -// Defines for the STB font used -// STB font files can be found at http://nothings.org/stb/font/ -#define STB_FONT_NAME stb_font_consolas_24_latin1 -#define STB_FONT_WIDTH STB_FONT_consolas_24_latin1_BITMAP_WIDTH -#define STB_FONT_HEIGHT STB_FONT_consolas_24_latin1_BITMAP_HEIGHT -#define STB_FIRST_CHAR STB_FONT_consolas_24_latin1_FIRST_CHAR -#define STB_NUM_CHARS STB_FONT_consolas_24_latin1_NUM_CHARS - -// Max. number of chars the text overlay buffer can hold -#define MAX_CHAR_COUNT 1024 - -// Mostly self-contained text overlay class -// todo : comment -class TextOverlay { -private: - uvec2 _size; -// FIXME port from oglplus -#if 0 - FramebufferPtr _framebuffer; - TexturePtr _texture; - BufferPtr _vertexBuffer; - ProgramPtr _program; - VertexArrayPtr _vertexArray; - // Pointer to mapped vertex buffer - glm::vec4* _mapped { nullptr }; - - const char* const VERTEX_SHADER = R"SHADER( -#version 450 core -layout (location = 0) in vec2 inPos; -layout (location = 1) in vec2 inUV; - -layout (location = 0) out vec2 outUV; - -out gl_PerVertex -{ - vec4 gl_Position; -}; - -void main(void) -{ - vec2 pos = inPos; - pos.y *= -1.0; - gl_Position = vec4(pos, 0.0, 1.0); - outUV = inUV; -} -)SHADER"; - - const char* const FRAGMENT_SHADER = R"SHADER( -#version 450 core - -layout (location = 0) in vec2 inUV; - -layout (binding = 0) uniform sampler2D samplerFont; - -layout (location = 0) out vec4 outFragColor; - -void main(void) -{ - float color = texture(samplerFont, inUV).r; - outFragColor = vec4(vec3(color), 1.0); -} -)SHADER"; - -#endif - - stb_fontchar stbFontData[STB_NUM_CHARS]; - uint32_t numLetters; - - -public: - enum TextAlign { alignLeft, alignCenter, alignRight }; - - bool visible = true; - bool invalidated = false; - - - TextOverlay(const glm::uvec2& size) : _size(size) { - prepare(); - } - - ~TextOverlay() { -#if 0 - // Free up all Vulkan resources requested by the text overlay - _program.reset(); - _texture.reset(); - _vertexBuffer.reset(); - _vertexArray.reset(); -#endif - } - - void resize(const uvec2& size) { - _size = size; - } - - // Prepare all vulkan resources required to render the font - // The text overlay uses separate resources for descriptors (pool, sets, layouts), pipelines and command buffers - void prepare() { -#if 0 - static unsigned char font24pixels[STB_FONT_HEIGHT][STB_FONT_WIDTH]; - STB_FONT_NAME(stbFontData, font24pixels, STB_FONT_HEIGHT); - - // Vertex buffer - { - GLuint buffer; - GLuint bufferSize = MAX_CHAR_COUNT * sizeof(glm::vec4); - glCreateBuffers(1, &buffer); - glNamedBufferStorage(buffer, bufferSize, nullptr, GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT); - using BufferName = oglplus::ObjectName; - BufferName name = BufferName(buffer); - _vertexBuffer = std::make_shared(oglplus::Buffer::FromRawName(name)); - _vertexArray = std::make_shared(); - _vertexArray->Bind(); - glBindBuffer(GL_ARRAY_BUFFER, buffer); - glEnableVertexAttribArray(0); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec4), 0); - glEnableVertexAttribArray(1); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(glm::vec4), (void*)sizeof(glm::vec2)); - glBindVertexArray(0); - } - - // Font texture - { - GLuint texture; - glCreateTextures(GL_TEXTURE_2D, 1, &texture); - glTextureStorage2D(texture, 1, GL_R8, STB_FONT_WIDTH, STB_FONT_HEIGHT); - glTextureSubImage2D(texture, 0, 0, 0, STB_FONT_WIDTH, STB_FONT_HEIGHT, GL_RED, GL_UNSIGNED_BYTE, &font24pixels[0][0]); - glTextureParameteri(texture, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTextureParameteri(texture, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - using TextureName = oglplus::ObjectName; - TextureName name = TextureName(texture); - _texture = std::make_shared(oglplus::Texture::FromRawName(name)); - } - - compileProgram(_program, VERTEX_SHADER, FRAGMENT_SHADER); -#endif - } - - - // Map buffer - void beginTextUpdate() { -#if 0 - using namespace oglplus; - _mapped = (glm::vec4*)glMapNamedBuffer(GetName(*_vertexBuffer), GL_WRITE_ONLY); - numLetters = 0; -#endif - } - - // Add text to the current buffer - // todo : drop shadow? color attribute? - void addText(std::string text, vec2 pos, TextAlign align) { - assert(_mapped != nullptr); - const vec2 fbSize = _size; - const vec2 charSize = vec2(1.5f) / fbSize; - pos = (pos / fbSize * 2.0f) - 1.0f; - - // Calculate text width - float textWidth = 0; - for (auto letter : text) { - stb_fontchar *charData = &stbFontData[(uint32_t)letter - STB_FIRST_CHAR]; - textWidth += charData->advance * charSize.x; - } - - switch (align) { - case alignRight: - pos.x -= textWidth; - break; - case alignCenter: - pos.x -= textWidth / 2.0f; - break; - case alignLeft: - break; - } - - // Generate a uv mapped quad per char in the new text - for (auto letter : text) { - stb_fontchar *charData = &stbFontData[(uint32_t)letter - STB_FIRST_CHAR]; - _mapped->x = pos.x + (float)charData->x0 * charSize.x; - _mapped->y = pos.y + (float)charData->y0 * charSize.y; - _mapped->z = charData->s0; - _mapped->w = charData->t0; - ++_mapped; - - _mapped->x = pos.x + (float)charData->x1 * charSize.x; - _mapped->y = pos.y + (float)charData->y0 * charSize.y; - _mapped->z = charData->s1; - _mapped->w = charData->t0; - ++_mapped; - - _mapped->x = pos.x + (float)charData->x0 * charSize.x; - _mapped->y = pos.y + (float)charData->y1 * charSize.y; - _mapped->z = charData->s0; - _mapped->w = charData->t1; - _mapped++; - - _mapped->x = pos.x + (float)charData->x1 * charSize.x; - _mapped->y = pos.y + (float)charData->y1 * charSize.y; - _mapped->z = charData->s1; - _mapped->w = charData->t1; - _mapped++; - pos.x += charData->advance * charSize.x; - numLetters++; - } - } - - // Unmap buffer and update command buffers - void endTextUpdate() { -#if 0 - glUnmapNamedBuffer(GetName(*_vertexBuffer)); - _mapped = nullptr; -#endif - } - - // Needs to be called by the application - void render() { -#if 0 - _texture->Bind(oglplus::TextureTarget::_2D); - _program->Use(); - _vertexArray->Bind(); - for (uint32_t j = 0; j < numLetters; j++) { - glDrawArrays(GL_TRIANGLE_STRIP, j * 4, 4); - } -#endif - } -}; diff --git a/tests/render-perf/src/main.cpp b/tests/render-perf/src/main.cpp index 987fbe33d5..8abb9f54e5 100644 --- a/tests/render-perf/src/main.cpp +++ b/tests/render-perf/src/main.cpp @@ -64,7 +64,6 @@ #include #include "Camera.hpp" -#include "TextOverlay.hpp" static const QString LAST_SCENE_KEY = "lastSceneFile"; @@ -1052,19 +1051,6 @@ private: } } }; - struct TextElement { - const glm::vec2 position; - const std::string text; - TextOverlay::TextAlign alignment; - }; - - enum TextBlock { - Help, - Info, - }; - - std::map> _textBlocks; - render::EnginePointer _renderEngine { new render::Engine() }; render::ScenePointer _main3DScene { new render::Scene(glm::vec3(-0.5f * (float)TREE_SCALE), (float)TREE_SCALE) }; QSize _size; diff --git a/tests/render-perf/src/stb_font_consolas_24_latin1.inl b/tests/render-perf/src/stb_font_consolas_24_latin1.inl deleted file mode 100644 index 12eedd2f43..0000000000 --- a/tests/render-perf/src/stb_font_consolas_24_latin1.inl +++ /dev/null @@ -1,734 +0,0 @@ -// Font generated by stb_font_inl_generator.c (4/1 bpp) -// -// Following instructions show how to use the only included font, whatever it is, in -// a generic way so you can replace it with any other font by changing the include. -// To use multiple fonts, replace STB_SOMEFONT_* below with STB_FONT_consolas_24_latin1_*, -// and separately install each font. Note that the CREATE function call has a -// totally different name; it's just 'stb_font_consolas_24_latin1'. -// -/* // Example usage: - -static stb_fontchar fontdata[STB_SOMEFONT_NUM_CHARS]; - -static void init(void) -{ - // optionally replace both STB_SOMEFONT_BITMAP_HEIGHT with STB_SOMEFONT_BITMAP_HEIGHT_POW2 - static unsigned char fontpixels[STB_SOMEFONT_BITMAP_HEIGHT][STB_SOMEFONT_BITMAP_WIDTH]; - STB_SOMEFONT_CREATE(fontdata, fontpixels, STB_SOMEFONT_BITMAP_HEIGHT); - ... create texture ... - // for best results rendering 1:1 pixels texels, use nearest-neighbor sampling - // if allowed to scale up, use bilerp -} - -// This function positions characters on integer coordinates, and assumes 1:1 texels to pixels -// Appropriate if nearest-neighbor sampling is used -static void draw_string_integer(int x, int y, char *str) // draw with top-left point x,y -{ - ... use texture ... - ... turn on alpha blending and gamma-correct alpha blending ... - glBegin(GL_QUADS); - while (*str) { - int char_codepoint = *str++; - stb_fontchar *cd = &fontdata[char_codepoint - STB_SOMEFONT_FIRST_CHAR]; - glTexCoord2f(cd->s0, cd->t0); glVertex2i(x + cd->x0, y + cd->y0); - glTexCoord2f(cd->s1, cd->t0); glVertex2i(x + cd->x1, y + cd->y0); - glTexCoord2f(cd->s1, cd->t1); glVertex2i(x + cd->x1, y + cd->y1); - glTexCoord2f(cd->s0, cd->t1); glVertex2i(x + cd->x0, y + cd->y1); - // if bilerping, in D3D9 you'll need a half-pixel offset here for 1:1 to behave correct - x += cd->advance_int; - } - glEnd(); -} - -// This function positions characters on float coordinates, and doesn't require 1:1 texels to pixels -// Appropriate if bilinear filtering is used -static void draw_string_float(float x, float y, char *str) // draw with top-left point x,y -{ - ... use texture ... - ... turn on alpha blending and gamma-correct alpha blending ... - glBegin(GL_QUADS); - while (*str) { - int char_codepoint = *str++; - stb_fontchar *cd = &fontdata[char_codepoint - STB_SOMEFONT_FIRST_CHAR]; - glTexCoord2f(cd->s0f, cd->t0f); glVertex2f(x + cd->x0f, y + cd->y0f); - glTexCoord2f(cd->s1f, cd->t0f); glVertex2f(x + cd->x1f, y + cd->y0f); - glTexCoord2f(cd->s1f, cd->t1f); glVertex2f(x + cd->x1f, y + cd->y1f); - glTexCoord2f(cd->s0f, cd->t1f); glVertex2f(x + cd->x0f, y + cd->y1f); - // if bilerping, in D3D9 you'll need a half-pixel offset here for 1:1 to behave correct - x += cd->advance; - } - glEnd(); -} -*/ - -#pragma once - -#ifndef STB_FONTCHAR__TYPEDEF -#define STB_FONTCHAR__TYPEDEF -typedef struct -{ - // coordinates if using integer positioning - float s0,t0,s1,t1; - signed short x0,y0,x1,y1; - int advance_int; - // coordinates if using floating positioning - float s0f,t0f,s1f,t1f; - float x0f,y0f,x1f,y1f; - float advance; -} stb_fontchar; -#endif - -#define STB_FONT_consolas_24_latin1_BITMAP_WIDTH 256 -#define STB_FONT_consolas_24_latin1_BITMAP_HEIGHT 170 -#define STB_FONT_consolas_24_latin1_BITMAP_HEIGHT_POW2 256 - -#define STB_FONT_consolas_24_latin1_FIRST_CHAR 32 -#define STB_FONT_consolas_24_latin1_NUM_CHARS 224 - -#define STB_FONT_consolas_24_latin1_LINE_SPACING 16 - -static unsigned int stb__consolas_24_latin1_pixels[]={ - 0x08262131,0xff904400,0x3ffe1fff,0x3b2206ff,0x2007913f,0x0000defa, - 0x64c00f32,0x0de5c402,0x00a614c0,0x4002ae62,0x98014c19,0x01aa881c, - 0x00d54400,0xb880154c,0x8330020b,0x1e980029,0xaa7d5dd4,0x2001d94f, - 0x3332a6e8,0x999ff0ff,0x37ffa207,0x2600df12,0x8000fffd,0x3fa005fd, - 0xfdff700f,0x8ffc409f,0x3ea02ff8,0x200dffff,0x0bfe0ff8,0x7d407ee0, - 0xfd10001f,0x9fff5007,0xcffff880,0x1ff104eb,0x320017fc,0x7d77e40f, - 0x17ee9f54,0xfd027ec0,0x7dc01fe1,0x0037c40d,0xb0017f22,0xffe8007f, - 0x7dc3fd80,0x741ff104,0x59ff701f,0x7401dfd7,0x2003f60e,0x3fa200fc, - 0x0ff44001,0x7dc6fdc0,0x32236604,0x3ba00eff,0x31003f60,0xdf90dd57, - 0xd93ea9f5,0x037e403f,0x803fc3fa,0x06f882fd,0x2006f980,0xa8800098, - 0xf903fb81,0x88040401,0x1ff441ff,0x0fb00000,0x00000000,0x00020000, - 0xffffa800,0xfadfb86f,0x7fc49f54,0x803ff301,0x200ff0fe,0x06f880fe, - 0x0000ff00,0x05f88000,0x40000fe6,0x0ff504fc,0x81540153,0x100affb9, - 0x22001573,0x31000ab9,0x26200157,0x731000ab,0xcffb8015,0x7dc4ffda, - 0x89f54fad,0x3fe80ff9,0x0ff0fe80,0x3e203fa0,0x807ddb36,0x01dd107f, - 0xdddb076c,0x1fb8bddd,0x1dd12fc0,0x3ff076c0,0x3f60ffc0,0xe98ff102, - 0xa84fffff,0x00dfffff,0x37ffffea,0x3fffea00,0x3fea00df,0x2a00dfff, - 0x80dfffff,0x3bb61ff8,0x3eb3ea3f,0x7f909f54,0xfd005fa8,0x7f401fe1, - 0xffaef880,0x1fe05ffe,0xdf504fd8,0xfffffff8,0x9db33746,0x09fb1b6b, - 0x80ff1bea,0x817ec2fd,0x33fe67f8,0x7dc3acfa,0x0efebacf,0xebacffb8, - 0xcffb80ef,0xb80efeba,0xefebacff,0xbacffb80,0x27e40efe,0x20df59f1, - 0x509f54fa,0x003fd8bf,0x401fe1fd,0x9fff107e,0x7407fe61,0x20ff500f, - 0x6f9803fd,0x777ccfe2,0x7fa8db6f,0x37cc7fb0,0x5fb0ff60,0x3fe9fe20, - 0x3ff105f3,0x7c43fe88,0x21ff441f,0x7f441ff8,0x220ffc43,0x0ffc43fe, - 0x3ff0ffa2,0x267f97d4,0x9f54fadf,0x1ff8ff10,0x1fe1fd00,0x7c417e20, - 0x704fb84f,0x217f405f,0xf9800ff8,0x47f47ea6,0xfd0f95f8,0x260ff885, - 0x21fe406f,0x2ff102fd,0x207ea6f9,0x8ff504fc,0x8ff504fc,0x8ff504fc, - 0x8ff504fc,0x8ff504fc,0x3fd3e47f,0x553eafea,0x261ff04f,0x1fd000ff, - 0xefcc81fe,0x260ff101,0x9bfb105f,0x7d45fb81,0x64df3005,0x9f34f98f, - 0x517ee1f2,0x407f98bf,0x817ec2fd,0x5cbf57f8,0x201ff80f,0x807fe1ff, - 0x807fe1ff,0x807fe1ff,0x807fe1ff,0xf8df31ff,0x47e4bf65,0x203514fa, - 0x00df52fd,0x107f87f4,0x7c403fff,0x440df306,0x7fc41ffe,0x4c00bf60, - 0x97ddf66f,0xf10db2fa,0x2217ec1f,0x20ff407f,0x2ff102fd,0x7c1f64fb, - 0xff17ec07,0x1fe2fd80,0x03fc5fb0,0x407f8bf6,0x4cdf32fd,0x9d4ff22f, - 0x9f7004fa,0xfe8013ee,0x6cc40ff0,0x20df103f,0x3bf506f9,0x7c4ff601, - 0xd9be6007,0x47f23f96,0x227fb06d,0x203ff07f,0x17ec0ff8,0x4df57f88, - 0x406f986e,0x80df33fd,0x80df33fd,0x80df33fd,0x80df33fd,0x64ff13fd, - 0x2a0bf60f,0x29f9004f,0x3fa005fa,0x1be00ff0,0x5fa837c4,0xfa801f90, - 0x4c009f76,0x87edba6f,0x2a09f0fd,0x3209f76f,0xb0bf704f,0x4dfe205f, - 0xf30bf0ff,0xf33fc80d,0xf33fc80d,0xf33fc80d,0xf33fc80d,0x3e3fc80d, - 0x03fd1ba7,0x3f6009f5,0x7400ff13,0x3a00ff0f,0x906f880f,0x401fa07f, - 0x001fe9ff,0xf96e9be6,0x017cdfe3,0x203fd3ff,0x7fd43ff9,0xf102fd81, - 0x27d7fecf,0xfb01fe63,0xfb01fe65,0xfb01fe65,0xfb01fe65,0xfb01fe65, - 0x1fc4ff45,0x9f501ff1,0xfe8bfe00,0x3e1fd001,0x101fd007,0x40df50df, - 0xfbf9007e,0x26f9800d,0xfdb9f56d,0x7e401fb7,0x7fdc06fd,0xb02ffede, - 0x89fe205f,0x4feefffc,0x1fe80ff1,0x1fe80ff1,0x1fe80ff1,0x1fe80ff1, - 0x1fe80ff1,0xb87ef7f2,0x2a9f505f,0x647f984f,0x21fd002f,0x01fd007f, - 0xfb99dff1,0x803f403f,0x4003fff8,0x6c5f26f9,0x01ffe8ef,0x401fffc4, - 0x01dfffda,0x2fd40ff2,0x0e77ff4c,0x3fe203ff,0x7c407fe0,0x4407fe0f, - 0x407fe0ff,0x07fe0ff8,0xff107fc4,0x807fd4fd,0x509f54fa,0x004fa8bf, - 0x401fe1fd,0xfff880fe,0x7400deff,0x01ff6007,0x0fb9be60,0x7ec00302, - 0x027dc007,0x4fc827dc,0x3f203f70,0xfc8bf704,0xfc8bf704,0xfc8bf704, - 0xfc8bf704,0xf30bf704,0x07ffd9df,0x84faa7d4,0x07fc41fe,0x07f87f40, - 0xdf101fd0,0x07f80022,0x2000ff60,0x00fe65fa,0x001fec00,0x98103fe6, - 0x0ffcc1ff,0xff100fc8,0x440ffa87,0x07fd43ff,0xff50ffe2,0x543ff881, - 0x1ffc40ff,0x7dc03fea,0x5401dfff,0xfc89f54f,0xd00df705,0x6c01fe1f, - 0x006f883f,0xf5006f98,0x9fb0001f,0xa80006e8,0xfd8000ff,0xfc86fcdf, - 0x04ffecdf,0xdff701f6,0x2e07ffd9,0x3ffeceff,0xfd9dff70,0x3bfee07f, - 0xf703ffec,0x07ffd9df,0x5000cfec,0xfa93ea9f,0x013f600f,0x401fe1fd, - 0x37c41efb,0x013f6600,0x33007fea,0x2e07fdc4,0xf500505f,0x7e40003f, - 0xfd703fff,0x6e805dff,0xdfffea80,0x7fff5401,0x7ff5401d,0x7f5401df, - 0x75401dff,0x7c01dfff,0x54fa8005,0x00bfe29f,0x775c3fd1,0xddff0ffe, - 0x7fff409d,0x2600df12,0xf300effe,0xf7007fff,0x207fffdf,0x7fdcdffb, - 0x07ffff30,0x80022000,0x0017e001,0x00060003,0x0018000c,0x07220030, - 0x7d53ea00,0x26007fb4,0x3bbbae6f,0x9ddddb0e,0xd12ecb80,0x0f3a600b, - 0x0019bd30,0x073bbb22,0x17bdb730,0x00337a60,0x00000000,0x00000000, - 0x00000000,0x00000000,0x4d3ea9f5,0x00154004,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x20000000,0x009f54fa, - 0x77777400,0xeeeeeeee,0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x4c000000,0x0007d33e,0x77777740,0x0eeeeeee, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x54400000,0x2a20001a,0x0154c01a,0x54400b20, - 0xaaa98000,0x99953100,0x032e0059,0x10053066,0x22004177,0x04c801aa, - 0x01aa8800,0x500d5440,0x51017997,0x51000035,0x0bb88035,0x00d54402, - 0x0007fea0,0xf500ffa2,0x3e6009ff,0x3fef9803,0xfffff700,0xffffb89f, - 0xf8804fff,0x3e0ff886,0x3ffe202f,0x5404ebcf,0x0fec01ff,0x07fd1000, - 0x103fe880,0x05fffffd,0x80007fea,0x7c403fe8,0x04ebcfff,0x88003ff5, - 0x3a2001fe,0x46fdc01f,0x7dc404fb,0x6baec00b,0xabcffd80,0x3fff24ec, - 0x804fb9df,0x41dd03fb,0x236600fd,0x800effc8,0x3e601fe8,0x3fd10005, - 0x01fe8800,0x008833f6,0x20007fa2,0xd9801fe8,0x00effc88,0x00007fa2, - 0x00000000,0x9fffffd5,0x036cf640,0x98407bee,0xf54fffff,0x001fd009, - 0x00020000,0x0007f400,0x44000000,0x0000007f,0x00200000,0x40153000, - 0xa802a62a,0x2a802a62,0x33fb7ff2,0x3bfa204d,0x007fe201,0x53fffff2, - 0x27d404fa,0x40015540,0x553002aa,0x50555555,0x01aa807f,0x554c1544, - 0xf82aaaaa,0x2aa8002f,0x802aa800,0x50aa02a9,0x55555555,0xf102fd81, - 0xf8817ecf,0x7c40bf67,0x1f61ff37,0x5c02aa80,0xfff9005f,0x013ea9ff, - 0xff8803fb,0x3fe2002f,0xfffc802f,0xdf07ffff,0x6406fb80,0xffffc85f, - 0xffb87fff,0x3ffe2003,0x3ffe2002,0x41ffe402,0x7fffc6f8,0x6c0fffff, - 0x6cff102f,0x6cff102f,0x2eff102f,0x4401ba5f,0x3f202fff,0xffff7003, - 0x8813ea9f,0xfffa805f,0x3ffea004,0xaacfc804,0x5f902aaa,0xf103ff80, - 0x559f901f,0xff985555,0xfa802eff,0x3ea004ff,0x7fe404ff,0x5546f886, - 0x0aaadfda,0x7f8817ec,0x3fc40bf6,0x5fe205fb,0x4017e7fa,0x3604fffa, - 0xfff3002f,0x813ea9ff,0xafd802fc,0x2bf6007f,0x03fc807f,0x2a02fc40, - 0x04fd80ff,0x3fa007f9,0x404ffd89,0x2007fafd,0x6407fafd,0x37c42fef, - 0xfd809f70,0x7ecff102,0x7ecff102,0x3e2ff102,0xb004faef,0x7f40ff5f, - 0x3fff2002,0x7c09f54f,0xfd7f8807,0x3aff1003,0x01fe401f,0x3a00fec0, - 0x807fcc4f,0x5f9803fc,0xf8827fd4,0xf1003fd7,0xfc807faf,0x037c46fb, - 0x2fd809f7,0x17ecff10,0x0bf67f88,0xffd33fc4,0x7f88019f,0x0bfa03fd, - 0x29ffd500,0x07f504fa,0x13ee9f50,0x27dd3ea0,0x2000ff20,0x7fcc04fa, - 0xfc80ff60,0x886f9803,0x74fa81ff,0x29f5009f,0x2bf204fb,0x81be22fd, - 0x17ec04fb,0x0bf67f88,0x05fb3fc4,0x3fae1fe2,0x53ea03ff,0x07fb04fb, - 0x4fa84c00,0xfb001fd0,0x3601fe65,0xc80ff32f,0x1fd0003f,0xdf34fd80, - 0xf003fc80,0xb07f905f,0x201fe65f,0x40ff32fd,0x226faafc,0x013ee06f, - 0x9fe205fb,0x4ff102fd,0x0ff102fd,0x417ff7ee,0x20ff32fd,0x500006fb, - 0x00bf309f,0x01fe8ff1,0x03fd1fe2,0x777777e4,0x01fdc04e,0x0bf63fe2, - 0xdddddf90,0x43ffa89d,0x23fc43fb,0x1fe201fe,0x4bf203fd,0x40df11fe, - 0x17ec04fb,0x0bf67f88,0x05fb3fc4,0x9be41fe2,0x23fc43ff,0x2ff881fe, - 0x84fa8000,0x5fa801fc,0xbf5027e4,0x3f204fc8,0x06ffffff,0x7e4037c4, - 0xffc806fe,0xa86fffff,0x0ff89eff,0x13f22fd4,0x27e45fa8,0x2bf52fc8, - 0x13ee06f8,0x3e205fb0,0x7c40bf67,0x7c40bf67,0x2fdcdb07,0x09f917ea, - 0x0620bff2,0x3e227d40,0x985fb006,0x30bf607f,0x01fe40ff,0x8803f900, - 0xfc801fff,0x7fec4003,0x42fd82ff,0x0bf607f9,0x8bf20ff3,0x206f89ff, - 0x17ec04fb,0x0bf67f88,0x05fb3fc4,0xb2f41fe2,0x4c2fd89f,0x3fff607f, - 0x5004fedd,0x802fb89f,0x99999ff8,0x9ff881ff,0x01ff9999,0x4c0007f9, - 0x05fb805f,0x20007f90,0xff886fe9,0x1ff99999,0x9999ff88,0x2fc81ff9, - 0x81be33ee,0x1fe404fb,0x0ff25fa8,0x07f92fd4,0x9f04d7ea,0x7c43ff71, - 0xff99999f,0x3fffaa01,0x7f9002ce,0xff5007e8,0x9fffffff,0xffffff50, - 0x3f209fff,0x07f40003,0x64013ee0,0x3a20003f,0x7fffd42f,0xa84fffff, - 0xffffffff,0x222fc84f,0x2e06f9ff,0x827dc04f,0x413ee4fc,0x413ee4fc, - 0xfdffb4fc,0xfa87ffff,0xffffffff,0x0077c404,0x9f517f40,0x3337f600, - 0xd86fdccc,0xdcccccdf,0x007f906f,0x5c04fa80,0x07f9004f,0x6c2fe800, - 0xdcccccdf,0xccdfd86f,0xc86fdccc,0x37e7e42f,0xf9809f70,0x30ffcc1f, - 0x1ff983ff,0xff307fe6,0x3fffb6a3,0xcdfd80ce,0x06fdcccc,0x37601fd4, - 0x6c6fd989,0x0ff8800f,0xff887fe0,0x3207fe00,0x7f80003f,0xc8027dc0, - 0x4c15003f,0x3fe20ffb,0xf887fe00,0x907fe00f,0x6fff885f,0x32013ee0, - 0x4ffecdff,0xfecdffc8,0xcdffc84f,0x3f704ffe,0xf007fc40,0x00fe403f, - 0xdfffffb1,0xa802fcc3,0x527ec05f,0x84fd80bf,0xeeeeeefc,0x80bee006, - 0xdf9004fb,0xf8dddddd,0x41ffffff,0x27ec05fa,0x4fd80bf5,0x7fe417e4, - 0x7ff776c6,0xfd700eee,0x75c05dff,0x2e02efff,0x202efffe,0x17ea00fc, - 0x14c09fb0,0x82cdba80,0x7fb001ca,0x3f66fa80,0x6437d403,0x7fffffff, - 0xb80f2200,0xfff9004f,0xcb8fffff,0x7fb02cdd,0x3f66fa80,0x3237d403, - 0x46ff882f,0xffffffff,0x8001800f,0x90018001,0x403fd80b,0x000006fa, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x0d544000,0x2600aa60,0x54c014c1,0x14c19802,0x400154c0, - 0xcb9802c9,0x0332e02c,0x30a60f22,0x00332a05,0x4000b260,0x0cca83cc, - 0x01e64000,0x2e200b26,0x6644020b,0x00cca801,0xe8803ca8,0x7ffd403f, - 0xf83fe204,0x3ffea02f,0xf83fe204,0x3ffea02f,0x3f7ee004,0x3ffff604, - 0x7f7ec0ef,0x220fe40f,0x05ff11ff,0xa8003bee,0x6c003fff,0x03bee05f, - 0x202fec00,0x2203fffa,0x4eacffff,0x9d95ff70,0x9003bee0,0x1fe880bf, - 0x7dc6fdc0,0xfd83ba04,0xf71bf700,0xfb077409,0x2e37ee01,0x2a7d004f, - 0x261bf907,0x54fea4fd,0x2213ea3f,0x807fa0ff,0xfa800ef9,0xb003fc8d, - 0x1df3007f,0x403fd800,0x03fc8dfa,0xdffb31d3,0xfffdb881,0x3be603ef, - 0x0017f200,0x00000000,0x00000000,0x7b8dd800,0x6f981ff0,0x8a7c47ee, - 0x020200ee,0x22002620,0x4c400cc1,0x00262000,0x18800988,0x011000cc, - 0x0ffb7fe2,0xf9004c40,0x5555550b,0xaa981555,0x982aaaaa,0x2aaaaaaa, - 0xaaaaaaa8,0x555540aa,0x200aaaaa,0x7cc002aa,0x86f882ff,0x44bee5fa, - 0x0005f94f,0x00000000,0x00000000,0x00000000,0x001ff982,0xff0bf900, - 0x1fffffff,0xffffffc8,0xffffc87f,0xfff87fff,0x40ffffff,0xffffffff, - 0x5fff100f,0x26013000,0x30ffd45f,0xf33fb3bf,0x9dfb7009,0xcefdb801, - 0x677edc00,0x677edc00,0xdfdb7100,0x3b6e203b,0xb7101def,0x2203bdfd, - 0x01defedb,0x01bffb2a,0x7039dfb7,0xfb5550bf,0xfc81555b,0x82aaaaac, - 0xaaaaacfc,0xdfdaaa82,0x55540aaa,0x00aaadfd,0x1009fff5,0x83bdfdb7, - 0x07bee5f9,0x7f4fffee,0x76f7ec00,0xbdfb02ff,0x3f605ffd,0xb02ffede, - 0x05ffdbdf,0xfffddff7,0xfddff705,0xdff705ff,0xf705fffd,0x05fffddf, - 0x5ffddffb,0xffdffd30,0x404fb87f,0x1fe404fb,0x0007f900,0xfb8013ee, - 0xff5fb004,0xfddff700,0x8afcc5ff,0x426200ff,0x27e402fc,0x9f903fea, - 0x7e40ffa8,0x3207fd44,0x207fd44f,0x43fdc419,0x43fdc419,0x43fdc419, - 0x23fdc419,0x1bea0dfc,0x3ff513fa,0x3ee027dc,0x001fe404,0x2e0007f9, - 0x13ee004f,0x0ff5fe20,0xff710660,0x07f8afcc,0xf1017e60,0xf88ff20d, - 0x7c47f906,0x7c47f906,0x4007f906,0x3fe000ff,0x003fe000,0x0df30ff8, - 0x05fa87fa,0x027dcbf9,0x7f9013ee,0x001fe400,0x2e004fb8,0x74fa804f, - 0x7fc0009f,0x27fcbf30,0x5400fe80,0x549f504f,0x549f504f,0x549f504f, - 0x009f504f,0xfb000fec,0x00fec003,0x0fee3fb0,0x05f927e4,0x04fb9be2, - 0x3f2027dc,0x00ff2003,0x70027dc0,0x25fb009f,0x360007f9,0x7ccbf31f, - 0x4bee00df,0x77dc1dec,0x5feeeeee,0x3bbbbbee,0x3bee5fee,0x5feeeeee, - 0x3bbbbbee,0xec985fee,0x981ffffe,0x1ffffeec,0xfffeec98,0xfeec981f, - 0x05fb1fff,0x01fe97ea,0x403fa9fe,0x77e404fb,0xc84eeeee,0x4eeeeeef, - 0x70027dc0,0x47f8809f,0x764c01fe,0xf31ffffe,0x80efe98b,0xffbfd5f8, - 0x77777e43,0x3f24eeee,0xeeeeeeee,0x3bbbbf24,0x3f24eeee,0xeeeeeeee, - 0x6677fdc4,0x7fdc1ffc,0x41ffccce,0xfccceffb,0x677fdc1f,0x3fb1ffcc, - 0x1fe97ea0,0x03fa9fe0,0x3f2027dc,0x86ffffff,0xfffffffc,0x0027dc06, - 0x5fa809f7,0xff7027e4,0x23ff999d,0x4fe885f9,0x33f98fe8,0x002fdc9f, - 0x7dc00bf7,0x017ee005,0xfd81ff88,0x3607fe21,0x207fe21f,0x07fe21fd, - 0x817e47f6,0x40bf64fb,0x007266f8,0x3fc809f7,0x000ff200,0xf70027dc, - 0x4c2fd809,0x03ff107f,0x417e63fb,0xb9fdc6f9,0xffa97e1f,0x01ff5000, - 0x4003fea0,0xf5000ffa,0xfa87fa0b,0x7d43fd05,0x7d43fd05,0x3ee3fd05, - 0x7e45fb05,0x000bf704,0x3fc809f7,0x000ff200,0xf70027dc,0x4cffc409, - 0xa81ff999,0x263fd05f,0x44df305f,0x7c4bea6f,0x80067f44,0xfd000cfe, - 0x33fa0019,0x446fa800,0x1bea1ffd,0x7d43ffb1,0x50ffec46,0x1ffd88df, - 0x7fa85ff1,0x3e60ffc4,0x700faa1f,0x03fc809f,0x4000ff20,0x3ee004fb, - 0x3fffea04,0xa84fffff,0x8ffec46f,0xfb9935f9,0xf10fec5f,0xf983fb7d, - 0x0eccbdff,0x65efffcc,0x7ffcc0ec,0x4c0eccbd,0xeccbdfff,0x373bfe20, - 0x3e21feff,0xfeffdcef,0x373bfe21,0x3e21feff,0xfeffdcef,0x3737fee1, - 0xdffb82ff,0x7fc3ffdc,0x2027dc07,0x3f2003fc,0x09f70003,0xfb027dc0, - 0xfb99999b,0xb9dff10d,0x3e63fdff,0x45dfff35,0xfffa83fa,0xffffb102, - 0xffb101df,0xb101dfff,0x01dfffff,0xdfffffb1,0xdfffe981,0x7f4c1fc8, - 0x41fc8dff,0xc8dfffe9,0x7fff4c1f,0x7541fc8d,0x2a01efff,0xc81efffe, - 0x027dc05f,0xfc800ff2,0x09f70003,0xf8827dc0,0x207fe00f,0xc8dfffe9, - 0x0002201f,0x02620008,0x20009880,0x26200098,0x40008800,0x00440008, - 0x06000220,0x40600600,0xeeffeeed,0x7777e40e,0xefc86eee,0xd86eeeee, - 0xeeeffeee,0x7ff776c0,0x0bf50eee,0x02204fd8,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0xffffff80,0x7fe40fff,0xc87fffff, - 0x7fffffff,0xfffffff8,0x7fffc0ff,0xfb0fffff,0x006fa807,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, - 0x40f32000,0xca814c29,0x055cc00c,0x203cc800,0x98014c29,0x0bb8802c, - 0x40044002,0x298003c8,0x0310014c,0x8000b260,0x157300cb,0x76c17a20, - 0x00f32000,0x32a0aa62,0x027d400c,0xf882fec0,0x205ff11f,0x3ee00efb, - 0x36001eff,0x47fe205f,0x7d402ff8,0x3fe203ff,0x204eacff,0x203ffffa, - 0x7c4006f8,0x005ff11f,0x3fea01f6,0x3fb0003f,0x4fffff98,0x1fd06f88, - 0x8817f600,0x706ffffb,0x7ff401df,0x80ff6000,0x07fa0ff8,0x5100ef98, - 0xb005ffd7,0x0ff8807f,0xdfa807fa,0x1d303fc8,0x201dffb3,0x2ffdcffa, - 0x8800df10,0x007fa0ff,0x37ea02fc,0xd8003fc8,0x26ffea1f,0x37c44feb, - 0xfd800fe8,0x37ffe603,0x3be602ac,0x400bf700,0x10100098,0x20013100, - 0x26200ffb,0x00202000,0x20019831,0x717ec008,0x01be20bf,0xb7004040, - 0x18807fff,0x7ec000cc,0xff10bfa1,0xfe837c41,0x1004c400,0x310007ff, - 0x00000001,0x20000000,0x000004fd,0x00000000,0x6f983fe0,0x0000df10, - 0xfeffe980,0x000001ff,0x17ea3fb0,0x0df127dc,0x200003fa,0x000003fc, - 0x05e88026,0x82f443d9,0x417a21ec,0x17ee01ec,0x00e77edc,0x80e77edc, - 0x03d905e8,0x8073bf6e,0x413ee2fe,0x7ddb36f8,0x3bfb6e20,0xf13fe81d, - 0x6dc03ffd,0x65401cef,0xf91ffdee,0x44dfd305,0x701fd06f,0x7c0bdddd, - 0x7775c007,0x407f305e,0x45fb06f8,0x45fb06f8,0x05fb06f8,0x3fa61fdc, - 0x303fffef,0x7fffdffd,0x3f60df10,0x7f7ff4c2,0x2df903ff,0xdf100ffa, - 0x0bffdff5,0xfffddff7,0x5f52fdc5,0xffd309f7,0xb107fffd,0x3fffdfff, - 0xfff707f6,0xfe837c4f,0x7ffffc80,0x2aa2bf30,0xffff9009,0x8813ea0f, - 0x445fb06f,0x445fb06f,0x205fb06f,0x27f40ff9,0x3fa07fea,0x220ffd44, - 0xe85fb06f,0x40ffd44f,0x01efeff8,0x4c33ffe2,0x220cc1ff,0xd8bf27fb, - 0x9fd0bf17,0x7e41ffa8,0xfe8ff42d,0xff3dfb10,0x0fe837c4,0xfa83fc40, - 0x2fffffee,0xfa83fc40,0x6c1be204,0x6c1be22f,0x6c1be22f,0x3fffe62f, - 0xfc82fd44,0xfc82fd45,0xfd837c45,0x7e417ea2,0x00bffb05,0x9f709ff1, - 0xfe87fc00,0x547f93e0,0x44bf905f,0x3e3fb07f,0xf0dff98f,0x303fe21f, - 0x7f8803ff,0x537bff70,0x7c403ff9,0x4409f507,0x445fb06f,0x445fb06f, - 0x4c5fb06f,0x05f902ef,0x05f91be2,0x0df11be2,0x02fc8bf6,0xefe88df1, - 0x88ff11ff,0x00bf307f,0x50fe8fec,0x3f23fc5f,0x7dcdf102,0x3fa3fb04, - 0x13fc3ffc,0x7ff445ff,0xb83fc401,0x40bf904f,0x09f507f8,0x2fd837c4, - 0x17ec1be2,0x8bf60df1,0x07fa04f9,0x00ff47f8,0xb06f88ff,0xf00ff45f, - 0xdfb4fd8f,0x6f88df31,0xd930df30,0x323ffffd,0x37c4fb2f,0x27f807fa, - 0x23fb03fc,0x7c41effd,0x337ffe27,0x202efbef,0x09f707f8,0x7f881be6, - 0x7c40bf50,0x7c45fb06,0x7c45fb06,0x7cc5fb06,0xf807fa04,0xff00ff47, - 0x5fb06f88,0x4ff00ff4,0x56ff47f8,0x9837c45f,0x677fdc6f,0x9f51ffcc, - 0x745fa97e,0xfd9fe01f,0x3f23fb02,0x225fa80d,0xb0dffeef,0x83fc409f, - 0x0ff105fa,0x5fb83fc4,0x7ec1be20,0x7ec1be22,0x7ec1be22,0xfd80b222, - 0xfd8df102,0xf88df102,0x7ec5fb06,0x7ccdf102,0x17fffc46,0x2fd41be2, - 0x3fb03ff1,0x44bf3fe2,0x817ec1fe,0x413f26f8,0x20df31fe,0x45be22fd, - 0x07f88000,0x17ea0ff1,0xbf707f88,0x7c40ff80,0x2207fc2f,0x207fc2ff, - 0x64002ff8,0xc8bf704f,0xf0bf704f,0x22ff881f,0x4bf704fc,0xfffa87f9, - 0xfc837c40,0x7f417ea3,0x373ffea1,0x04fc84ff,0x42fdcbf7,0x0ffa1ffb, - 0x06f88ff5,0xb03fc400,0x02fe889f,0x2fdc1fe2,0xfe88bfe0,0xd117fc2f, - 0x22ff85ff,0x3a62ffe8,0x307fe204,0x1ff883ff,0x7fc0ffcc,0x88bffa22, - 0x0ffcc1ff,0xffd50ffe,0xfa86f883,0x36237d46,0x7ffd41ff,0x3ff102ef, - 0x3e21ff98,0x87ffea1f,0xffdcdff9,0x00037c41,0xff981fe2,0x404fecbd, - 0x0bf707f8,0xefcdffb8,0x6ffdc2fd,0x5c2fdefc,0xfdefcdff,0xb803ff62, - 0x3ffdcdff,0xfb9bff70,0x37fee07f,0x5c2fdefc,0x3ffdcdff,0xffceffa8, - 0x3e20efef,0x1ffdccef,0x7ee77fc4,0x5fd41fef,0x9bff7001,0xffb07ffb, - 0x83f99fdb,0x81dfffd8,0xcc8006f8,0x1cccffcc,0x177ffec4,0xcffcccc8, - 0x00df71cc,0xf71bffd5,0x1bffd505,0xffd505f7,0x7dc5f71b,0xfffea806, - 0x7ff5401e,0x7f5401ef,0xa82fb8df,0x201efffe,0xd1dfffea,0xfffdb8bf, - 0xffd300de,0xd83f91bf,0xffea8007,0x3ff201ef,0x0c03f93e,0x20017a20, - 0xffffffff,0x3e00603f,0xffffffff,0x4400bd73,0x00044000,0x00020022, - 0x000c0006,0x00c00044,0x01000040,0x3c800440,0x2000c000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x55530000,0x53035555,0x54c00557, - 0xba9800aa,0x2aaaa60a,0x2a600aaa,0x0032e009,0x32205950,0x020bb883, - 0x3c881654,0x6440736e,0x09999953,0x80357510,0x209aca98,0x20aa00a9, - 0x2e014c29,0x0164c03f,0x1dd127dc,0x64c076c0,0xfffffc82,0x7ffe44ff, - 0x3ee03fff,0x904fffff,0x2bffffff,0xfffffffc,0xfffffb81,0x000fe80d, - 0x320bffd3,0x7fffc41f,0x3fa64eac,0x6c3f905f,0x1fc80ffd,0x40fffff9, - 0xefffffc8,0xfffffc81,0x440bf65f,0x88ffc47f,0x1ffe02ff,0x203fffa8, - 0x3f62fff8,0x3a0df504,0x567e40ff,0x5dc1aaaa,0x81ffdb9a,0xecabcffd, - 0x5e7ff444,0x55535dca,0xfd83fd55,0x0efc989c,0xea8007f4,0x84fa85fa, - 0xeffd98e9,0x217ebaa0,0x83fb04fa,0x266624fa,0x2fbf607f,0x360ffda9, - 0x3baabcef,0x3fc40bf6,0x1fe83fe2,0x7d413f60,0x3e03fc8d,0x41fea1ff, - 0x1ffd03fd,0x40001fc8,0x0f7dc4fe,0x8077ec08,0xf70ff400,0xfd17ea07, - 0x45f88001,0x11000ee8,0x3a22fc40,0x22ffe40e,0xff100ee8,0x3e03fe20, - 0x003ff32f,0x1fe205fb,0x20000404,0x9300cc18,0xf885fd05,0x9035100f, - 0xfb80003f,0x4007fe25,0x20000ffa,0x4cdf11fe,0x743f91bb,0x2fc4000f, - 0x80000bf2,0x417e45f8,0x3f23fda9,0x441fe202,0x2e5fb06f,0x05fb005f, - 0x80001fe2,0x00000098,0x5fa8bf70,0x003f9000,0x3ee2fc80,0x00ff6005, - 0x3ee3fd00,0x22ffff52,0x3603fa4f,0x265f884e,0x2a9d104f,0xbf101cfd, - 0xc99827cc,0x8809f34f,0x10bfa07f,0x007fd4ff,0x7f8817ec,0x02f7775c, - 0xeeb82fb8,0x440005ee,0x70bf60ff,0xf90bdddd,0xf3000335,0x001fe41d, - 0xe80003fd,0xdf11f91f,0x3fa5f823,0x44077ec0,0x4403fa5f,0xffeefcdf, - 0x3fa5f884,0x21dfff00,0x3fc400fe,0xf519ff50,0x177f447f,0x7c40bf60, - 0x3ffffe47,0xfc82fb80,0x80007fff,0x90ff13fd,0xf90fffff,0x205bffff, - 0xd85feee8,0x83fe002f,0x403cccc9,0x3eafb1fe,0x07f4fb03,0x90980bfb, - 0x7ffc405f,0x2603fea3,0x4cc05f90,0x2200bf20,0x7ffcc07f,0xffe981ff, - 0x02fd80be,0x3fc40ff1,0x2017e440,0xa80007f8,0x8809f76f,0xdccca87f, - 0xff982fff,0x3fa0cfff,0xa8ff1002,0x7406ffff,0x0beadd1f,0x361fd3ec, - 0x17e6005f,0xff07ff10,0x002fcc03,0x7c4017e6,0x7ffec407,0x3ffae03f, - 0x8817ec3f,0x81fe207f,0x403fffd9,0x2da807f8,0x07fa7fe0,0x6400ff10, - 0x6fd9807f,0x7c400bf6,0x37d4cc47,0x8bec7fa0,0x7f4dd04f,0x74005fd8, - 0x83fc400f,0x03fa02fd,0x2001fd00,0x3fa607f8,0x405ffc8c,0x3f65ffda, - 0x440ff102,0x273fa07f,0x03fc4009,0xfc80fffc,0x7f8806fd,0x007fe200, - 0x03fc97f4,0x7cc03fe0,0xfc8ff406,0x7c737fd0,0x01bf7fa5,0x33265f70, - 0xfd837c42,0xd915f702,0x997dc05b,0x0ff102cc,0x3fe617fc,0xb2ffa802, - 0x81fe205f,0x0bf307f8,0xe807f880,0xfff103ff,0x00ff1007,0xf9002fe8, - 0xe801bee7,0x80df303f,0x267f51fe,0x47f37ffd,0x002ffafe,0x27ff4bf1, - 0x17ec1be2,0xecfaafc4,0x3a5f881f,0x0ff104ff,0x2fe417e6,0x7f94fc80, - 0xf8817ea0,0x8009f707,0xff9807f8,0x401ff603,0x3e2007f8,0x23fd000f, - 0xf5002ff8,0x40df301f,0x11fa0ff9,0x1fd07ec1,0xfd005ff3,0x113eff21, - 0x20bf60df,0x17dc20fe,0xfbfc87f4,0x2e0ff104,0x00bf704f,0x827dcff2, - 0x1fe204fc,0x220037dc,0x03ff007f,0xf8801fec,0x09fb1007,0xff91bee0, - 0xefe83105,0x20bb7cc0,0x77d46fc8,0x7f43fc80,0x5c03ff50,0x9f39f33f, - 0x5fb06f88,0xfe883fb8,0xcf99fdc0,0x0ff104f9,0x3fa03fea,0x8ffcc013, - 0x7fcc1ff9,0x441fe201,0x3e2003ff,0x206fb807,0xf1000ffa,0xfb999b0f, - 0xb999b0bf,0xfd881fff,0x44feddff,0xecdeffe8,0xffbdfd6f,0x59df703f, - 0x1fd09fd7,0x7c40ffdc,0x3bfbbf66,0x7ec1be23,0x3e61be22,0xfb37c41e, - 0xf107dfdd,0x667ff40f,0x3bf66ffc,0x44ffedcd,0xffecdffc,0x703fc404, - 0x88013bff,0x3bfb207f,0x003ff500,0x7ff43fc4,0xfff02dff,0xea807dff, - 0x702cefff,0x25bffffd,0x00dfffeb,0x0b7fff66,0x3ff207f4,0xdd90fec0, - 0x37c47dfd,0x07f62fd8,0x6c357ff5,0x3fbbb21f,0xff99993e,0x7dc43999, - 0x2e0bffff,0x2dffffff,0x5dfffd70,0x3ff33320,0x7fd41ccc,0x666644ff, - 0x3e1cccff,0xffff983d,0xfcccc803,0x1331cccf,0x00026600,0x00cc0004, - 0x00100011,0x1dfb01fd,0x4f980fea,0x2fd837c4,0xfff707f5,0x980fea9f, - 0x3ffffe4f,0x3103ffff,0x00133001,0xffff8018,0x503fffff,0xffff87b9, - 0x003fffff,0x20019bd3,0xffffffff,0x0000003f,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x02ae6200, - 0xdddfd910,0xdd9501dd,0x0f223b9b,0x00014400,0x22179995,0x07ddb34e, - 0x23deedb8,0x0d4c02a8,0x55440055,0x4c40009a,0x551001ab,0x2aa35555, - 0xaaaaaaaa,0x5555530a,0x5554c555,0xaaaa8009,0x57510009,0x00aaa001, - 0xff5013ee,0xf101bfff,0xddffd9bf,0xfeeffd81,0x00df11ff,0x22001fe0, - 0x12fffffe,0xffdff5bf,0xddffd30b,0x103fe8ff,0x01fe21ff,0xffffffa8, - 0x7ffd401d,0x7e401eff,0xdf4fffff,0xdddddddd,0x3ffff21f,0x3ff67fff, - 0xf00dffff,0x07ffffff,0x1fffffe4,0x80bffe20,0xf702fff8,0x1dfd759f, - 0x27e43fd8,0x3fa06fe4,0x2000df11,0xdfd8007f,0x3fe21312,0x83ff30cf, - 0x26140dfe,0x23fd80ff,0x3ea007f8,0x3ffecbae,0x9339ff30,0xefef805f, - 0x021f1aaa,0x559f90f8,0x67ec5555,0x82ffecba,0xffecabff,0xa9adfd83, - 0x3fea03ff,0x0fffc04f,0x3a20ffc4,0x7c43fc3f,0x6c07fc47,0x000df11f, - 0x3fe001fe,0x213fe201,0x017f24fb,0x37cc4fd8,0x3bffffe2,0xb85fa81d, - 0x83fd80ff,0x2fdfd400,0x85dfd0f8,0xb007f90f,0x81ff705f,0x547fc87f, - 0x206f986f,0x4c07fafd,0x209f902c,0x21fe27fa,0x837dc7f8,0x00df11fd, - 0x3bffbba6,0xf301eeee,0x307f880d,0x000ff4bf,0x17f43ff1,0x3b733fe2, - 0x82fd43ff,0x00fe85fc,0x05f9fe80,0xf27dc41f,0x3600ff21,0xf8bfb02f, - 0x320ff887,0x105fb03f,0x0007faff,0x3fe01ff8,0xbf70bfa1,0x3fb04fc8, - 0x67ed5be2,0x7ffffcc1,0x302fffff,0x06f880bf,0x007fcdf3,0x2fd57ee0, - 0x7fd43fc4,0x7cc17ea1,0x98007f87,0x1f05f8cf,0x643e1f50,0x02fd803f, - 0x887f8ff3,0xb817ec7f,0xf74fa83f,0x03fc0009,0xcffa8bf6,0x7ec0ffda, - 0x3e23fb02,0x4ffeefce,0xf3001fe0,0x306f880b,0x001fe2df,0x407f57f4, - 0x49f907f8,0x03fe05fa,0x3f9000ff,0x203e0bf1,0x3f21f1f9,0x202fd803, - 0x321fe0ff,0xb81fec5f,0xf32fd84f,0x1be6000f,0x6ff47fb0,0xfc80dfff, - 0x3e23fd03,0x03fea4ff,0x7ffc03fc,0x7fffffff,0x27d41be2,0xf50001fd, - 0x1fe207ff,0xffeeb7d4,0xa8ffc1ee,0x2aaaaffa,0xeff8b7c0,0x4cc1f1ee, - 0x3f21f0fd,0x24eeeeee,0x87fe02fd,0xefecbbff,0x64077d40,0x3a3fc45f, - 0x6f98001f,0x4f99fe40,0x709f7002,0x0ffe23ff,0x03fc07fe,0x67fee664, - 0x1be24ccc,0x07f71fe4,0x881bf600,0x3ebf707f,0x742fffff,0xffffff1f, - 0x3ee01fff,0x3dddff13,0x06f7c43e,0x3ffff21f,0x0bf66fff,0x3ffe1fe8, - 0xfd00bfff,0x9fffb99f,0x27e45fa8,0x0ff30150,0x3df52fd8,0xa83fe200, - 0x0ff11fff,0x03fc0bf6,0xf1017e60,0x4c6fb88d,0x74040bff,0xeeeffeee, - 0x7f41fe21,0xff817ea3,0x333ff331,0x887f4033,0x3e21f05f,0x07f90f80, - 0x7fc05fb0,0x3f267fe1,0x3ffb200e,0x7ec3fccf,0xfe83fcc2,0x203fc40f, - 0xfffd11fe,0xfb05bfff,0x3fb9fd9f,0x17ec1be2,0x7cc007f8,0x677fc405, - 0xfc81fffc,0xe87ecdff,0xeeeffeee,0xf931fe21,0x882fd41f,0x003fc0ff, - 0x82fc4bf3,0x43e03a0f,0x2fd803fc,0x3fc1ff10,0x320013f2,0x267fe22f, - 0x441ff999,0x1ff82fff,0x7e41ff10,0x4fffeeed,0xfb3effc8,0x7ec1be23, - 0x9800ff02,0x7ffc405f,0x2e00dfff,0x405ffffe,0x3fe204fb,0x41efffee, - 0x0df705fa,0x7fe400ff,0x1f05ffff,0x7f90f804,0x2e05fb00,0x3e23fc6f, - 0x07f4000f,0xfffffff5,0x1dfb09ff,0x3ee09f90,0x7dc17ee5,0x23fb0207, - 0x05fb06f8,0xf98007fa,0x08b7c405,0x803be200,0x99dfc999,0x77fffc41, - 0x10bf503d,0x00ff07ff,0x3bbbbfe2,0x3ea1f05f,0x07f90f82,0xff105fb0, - 0x4fc87f85,0xfb0ff200,0xfb99999b,0xff88060d,0xfb07fd43,0x003fe205, - 0x06f88fec,0x13f605fb,0x4405f980,0x7f50006f,0xffffff80,0x1fe21fff, - 0x7545fa80,0x200ff06f,0x82fc43fb,0x1f03d30f,0x3f600ff2,0x7c2ffd42, - 0x400ff987,0x7fc46fd9,0x0007fe00,0x3fb3bfee,0xc837ec3f,0x47f6005f, - 0x05fb06f8,0x3733ffe6,0x880bf301,0x3f90006f,0xdfdaaa80,0x1fe20aaa, - 0xfeeffa80,0x7f6c0dff,0x3eeeeeef,0x9ff103fa,0x2003e599,0xddddf90f, - 0x777ecddd,0xff05fffe,0xddb13f60,0xfa819fff,0x0027ec05,0x1dfffea8, - 0xeeefff98,0x36000eff,0x360df11f,0x3ffaa02f,0x0bf301ff,0x30006f88, - 0x04fb8005,0xfa801fe2,0xf01cefff,0xffffffff,0x2217e69f,0xff5fffff, - 0xffffffff,0x3ffff21f,0x3ff67fff,0x3e01ceef,0x741ff307,0xfb01cdef, - 0x006fa807,0xeb880180,0x8002ceee,0x20df11ec,0x013002fd,0x74405f98, - 0x00000005,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, - 0x00000000,0xaaaa8000,0xaaa98099,0x31aaaaaa,0x55555555,0x260aaa00, - 0x2055100a,0x2aa0d42a,0x0aaaaaaa,0x0aa60551,0x40335555,0x455302a9, - 0xaaaaaaa9,0x803551aa,0x02aa22a8,0x03530aa8,0x01551a88,0x0154c550, - 0x2aaaaa55,0x00aaaaaa,0x751002aa,0x80551015,0xfffffff8,0x3ffff20c, - 0xf95fffff,0x0fffffff,0xfb0fff70,0x7c1be205,0xfff0fe65,0x21ffffff, - 0x2ff886f8,0x3fffffe2,0x07fec0bf,0xfff737fc,0x2bffffff,0x2fe406fb, - 0x7fd413fa,0xf9807f50,0xfa809fb4,0x220fff26,0xffffff6f,0x501fffff, - 0x36203ffd,0x4c3fffff,0x57fc406f,0x2a5ffcba,0xdccccccc,0x555bf95f, - 0xff880555,0x102fd87f,0xfa93e0df,0x6fed5542,0x0df10aaa,0xaff887fd, - 0x6c5ffeba,0x3ffd43ff,0x99999993,0x81ffc9ff,0x7fcc0ff8,0xf517f441, - 0xf53f9809,0x323fc80f,0x56f886ff,0x55bfb555,0x7ff4c155,0x7bfd01ff, - 0x7cc3ff95,0x443fc406,0x3fd000ff,0x6c000ff2,0x2fd87fbf,0x9f10df10, - 0x9f700fdc,0x9fb1be20,0xff10ff10,0x3637f747,0xdf7007ee,0xfd80ffa8, - 0xfc8bf904,0x2a027cc5,0xf807fe3f,0x0bfbf21f,0x13ee0df1,0xff9dff98, - 0xbf905501,0x3e2037cc,0x3003fd07,0x001fe4df,0x43fc67d4,0x4df102fd, - 0xdaadfbaa,0x4fb81abf,0x2fdcdf10,0xbf907f88,0xf887e774,0xff8807dc, - 0x7cc4fe81,0x25ff100f,0x2fcc0ff9,0x4fd8bea0,0xbfc8df30,0xb837c46f, - 0xff0e404f,0x26f98003,0x3fc406f9,0x5fb007f8,0x22001fe4,0xd87f88ff, - 0x74df102f,0xffffffff,0x04fb85ff,0x03be6df1,0x6fa83fc4,0x7dcfe7ba, - 0x7ec00fd9,0x6c1ff304,0x47fd403f,0x45f883fe,0xfa8bee09,0xfc87f906, - 0x1be22fda,0x3e0027dc,0x37cc001f,0x7f880df3,0xf9804fc8,0x2001fe46, - 0xb0ff12fd,0x21be205f,0x701f61fb,0x23be209f,0x1fe201ff,0x3adf2fec, - 0x803f6dd6,0xa7ec06fa,0xdfb006f9,0xa9be20df,0xff07ee3f,0xfc81fd03, - 0x1be26faa,0x3e0027dc,0x2fdc001f,0xff880df3,0x002ffeee,0xcefc85fb, - 0xfa82cccc,0x3f61fe25,0xfeeeeeee,0x1ba0fc86,0x3e209f70,0x7c402fef, - 0x3e2ff887,0x367f5f95,0x03ff100f,0x2fd8ff88,0x03fff100,0x64df937c, - 0x2627ec1f,0xfd2fc86f,0x7dc1be23,0x00ffc004,0x7cc5fd10,0x7fffc406, - 0x4c02efff,0xffffc86f,0x0fe85fff,0x3ff61fe2,0x6fffffff,0x202fc7c8, - 0xfff104fb,0x9ff8805f,0x7c5ffdb9,0x321fff35,0x009fb01f,0x001bfbf2, - 0x37c01ffd,0x03f23fff,0x83fc8df5,0x22bf52fc,0x009f706f,0x36001ff8, - 0x2037cc5f,0x7fe447f8,0x320bf601,0x099999cf,0x1fe217e4,0x37c40bf6, - 0x7013e3ec,0x2bbe209f,0x3fe200ff,0x443fffff,0xfc97fa5f,0x2006fa81, - 0x2001fff8,0x3a05fffb,0x329f9f57,0x3a1ff80f,0x3e2fc80f,0xf706f89f, - 0x01ff8009,0xf981df90,0xc83fc406,0x20df305f,0xef9803fc,0x9ff99999, - 0x2205fb09,0xdffdd56f,0x20ddffdd,0x2df104fb,0xff100efb,0xf1013599, - 0x3f917dcb,0x4001ff88,0x3e6005fb,0xfd02ff9f,0x3edbe3f2,0x0df33fd8, - 0x8cfb8bf2,0x009f706f,0xfc801ff8,0x406f980e,0x0df507f8,0x1fe40ff6, - 0x7ffffdc0,0xb4ffffff,0x4dbe205f,0xfdccefcc,0x09f704cd,0x05fd9be2, - 0x3e600ff1,0x3617e405,0x4fb8004f,0x7dcffa00,0x5f8fd80f,0x2a0fb3f9, - 0x3207f76f,0x3e7fe22f,0x8009f706,0x77e401ff,0x880df300,0x309fb07f, - 0x01fe40ff,0x6666664c,0xfb2ccffc,0xf11be205,0x2e017d49,0x44df104f, - 0x07f883ff,0xfb809f30,0x0003bea2,0x7dc013ee,0x7e427f46,0xdd9f32fb, - 0x07f47fc0,0x67e42fc8,0x009f706f,0x3f201ff8,0x01be600e,0xffa88ff1, - 0x3203fd82,0x7c40003f,0xf102fd87,0x3ee4f88d,0x8827dc01,0x20ffcc6f, - 0x9f3007f8,0xff13fb80,0x13ee0003,0xf30bfe20,0x47efc83f,0x3f606eff, - 0x0bf206fc,0x2e0dfff1,0x0ffc004f,0x4c00efc8,0x77fc406f,0x983fffee, - 0x0ff200ff,0xb0ff1000,0x31be205f,0x6c07e47f,0xeeeffeee,0xff70df10, - 0xa803fc41,0xc9fdc04f,0xffffffff,0x013ee06f,0x37e417f6,0xff917fee, - 0x1fffd40b,0xff905f90,0xb013ee0d,0xdddffddd,0x3ffffe67,0xff36ffff, - 0x15dddddd,0x19dfffff,0xf900ff60,0x7f880007,0xdf102fd8,0x03f22fa8, - 0x3ffffffe,0x20df10ff,0x01fe26fd,0x3ee027d4,0xffffffb3,0x7dc0dfff, - 0x807fdc04,0x3fee4ff8,0x202ffcc2,0x3f200fff,0x706ff882,0xffff809f, - 0xf34fffff,0xffffffff,0x3ffffe6d,0x00003fff,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x80322000, - 0x8026200b,0x6c40001c,0xdb880000,0x2e01defe,0xe881cefd,0x6d43d905, - 0xdfd98cef,0x00054400,0x207bddb7,0x700cefdb,0xc83ddfdb,0x21bd505e, - 0xd52ed8bd,0xeeeed81b,0xaa986eee,0x2017540a,0x2e1d74e9,0x77441dfd, - 0x6c03b600,0x40df504f,0x7ff304fa,0x0ffe6000,0x7dc04fa8,0x42fffeef, - 0xfffeffe9,0xfd837c43,0x3bff7be2,0x7406fdef,0xffe9807f,0xefd87fee, - 0x7f42ffed,0x442feeef,0x17fc43ff,0xf3ffdb9f,0xfffe8bfd,0x7dc7ffff, - 0x3ea1ffff,0xfca7d404,0x1fffefc9,0x6fa81fec,0x32ebfe20,0x2a01ff9b, - 0x13fe604f,0x805ff700,0x20cc04fa,0x27f47fb8,0x6f887fea,0x36145fb0, - 0x405f90ff,0xdfe807fe,0x513f2140,0x417ee1ff,0x361ff980,0x5c77fc4f, - 0x200fd4ef,0xf70cc3fe,0x2e02fccb,0x45fdf93f,0x837d45fc,0x7fd403fd, - 0x403fffff,0x7f4404fa,0x1efc800d,0x0004fa80,0x82fd43fe,0x41be25fc, - 0x97ee02fd,0x072204fa,0xf100bf90,0x7e4ff20d,0xab7e4003,0xf52ff86f, - 0x32007ecf,0x37cc405f,0x9174cdf1,0x307ff23f,0x883ff0df,0x7fc400ff, - 0x402ffc9c,0xdfb004fa,0x03bf6201,0x00027d40,0x40bf23fb,0x41be26f8, - 0x8fea02fd,0xe80004f9,0x04fa801f,0x0bfee9f5,0x1ff9fd00,0xb27d4ff0, - 0x077d401f,0x37fff644,0x365fc9fe,0xd107f90f,0xfb89f90b,0x645fb804, - 0x7777645f,0x205eeeff,0x7f441ffb,0x5ccccc04,0x981999df,0x1ffffeec, - 0x13fc03fd,0x88bf60df,0xeeefeedb,0x266665fe,0x41999999,0xefb800ff, - 0x5feeeeee,0x0077fff6,0x7c0bffe2,0x0fd8fea7,0x3203ff30,0x746f99af, - 0x3f43ffa7,0xf88005f9,0x6c00ff47,0x363fcc2f,0xffffffff,0x8ffdc07f, - 0xff805ff8,0xffffffff,0x33bfee1f,0x3fd1ffcc,0x0df13fc0,0xcffe8bf6, - 0x2ccccefd,0x3ffffffe,0xff11ffff,0x3bbbf200,0x4c4eeeee,0x200efffd, - 0xff00ffe8,0x01fb1fd4,0x37c05fd1,0x98fd8df5,0x64df3fcf,0x2fd8002f, - 0x3f600df3,0x2a03fc42,0x3fe6004f,0x201ffd43,0xcefdcccc,0x3ff10ccc, - 0x0bf63fb0,0x0df137c4,0x52fd4bf6,0xcccc809f,0x0ccccccc,0x3ee003fe, - 0xfd510005,0x77f7ec0d,0x8fea7f80,0x04fd80fd,0x37ff6fec,0x3e3f27ee, - 0x017e4bf6,0x3fcafd40,0xf989fb00,0x8027d406,0xfd302ffb,0x027d4009, - 0x47fa0bf5,0x8bf704fc,0x97fc40ff,0x01bea2fc,0x01ff4000,0x00007fd4, - 0xdf701ff1,0xa9fe17f6,0xf703f63f,0x17b7100d,0x5ebfa877,0x7e49f5f9, - 0xd1ff0002,0x3bea001f,0xf500ff60,0x03df9009,0x800dfe88,0x1bea04fa, - 0x3e23ffb1,0x20ffcc1f,0x3ffa22ff,0x3fa27f72,0x0054001f,0x8102ffea, - 0x30000cfe,0x23ff30ff,0x53fc3ff8,0xf307ec7f,0x4c00001f,0xfbf32fdf, - 0x80017e47,0x2005fdfc,0xfffdfff8,0x1027d401,0x6c001dfb,0x27d400ef, - 0xfb9dff10,0x7fdc3fdf,0xb83ffdcd,0xfdefcdff,0x7dd9df12,0x403b99ff, - 0xffd806fd,0x7cc7ecdf,0x0eccbdff,0xffb999dd,0x4c3ff889,0xfa9fe1ff, - 0xfff83f63,0x32eeeeee,0x7ddddddd,0xff07ffc4,0x0017e45f,0x002fff98, - 0x37ffbbf6,0x8164c06f,0x70005fe8,0x27d403ff,0x37fffa60,0x7f541fc8, - 0x3aa01eff,0x22fb8dff,0xff90efeb,0x3ff403ff,0xffffea80,0xffffd885, - 0xffffb0ef,0x0bfb05df,0x53fc3ff2,0xff07ec7f,0x5fffffff,0x3bbbbba6, - 0x322ffc3e,0x00bf20ff,0x2006fe80,0x09fb06fb,0x001f4400,0x98807ea0, - 0x00011000,0x00088003,0x26002601,0x0088002c,0x4cc01310,0x00000009, - 0x00000000,0x00000000,0x4407ee00,0x3333264f,0x002ccccc,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x40000000, - 0x3fee0400,0x4fffffff,0x74400000,0x4039fb54,0x64400aa9,0xb9800001, - 0x000001bc,0x03372a00,0x4017bb93,0x16dc04c9,0x200e65c4,0x333100a8, - 0x81333333,0x4cc40bb9,0x09999999,0x26057700,0x257714c2,0x00000bb9, - 0x40000000,0xfeefcdf8,0x7fff444f,0x80be202f,0xc81d705c,0x40dfdcdf, - 0x3203645c,0xfd83320d,0x3f21ffff,0x6cc0ffff,0x3fe207ff,0x3fffea0f, - 0x41bf604f,0xfffffffa,0x0efb84ff,0x3ffffff2,0xfd802fff,0x11ff880d, - 0x54ffa3ff,0x000000ff,0x44000000,0x3fea3fff,0x3ee6ff60,0x8fc46a0f, - 0x717fa238,0x557641df,0x7ec5d88a,0x7d40ff23,0x1731be65,0x32049fb1, - 0x3f7fe23f,0x897ffc07,0x05fd10ff,0x5107fbf5,0x55555555,0x543be603, - 0xebbbbbbb,0x01fec02f,0xd1fe83fa,0x001fe67f,0x00000000,0x3e0ffe20, - 0xfc8bf31f,0x5cfd3fa3,0x57fa20ff,0x27e60efb,0x3f8afcfa,0x0fe83fa2, - 0x07fa0fe8,0x7ec0bf70,0x03fc45c2,0x1fd4bfea,0x75ba13ea,0x8800000f, - 0x05f90009,0x808004c4,0x3fccbf60,0x00000000,0x83fc4000,0xa87f52fd, - 0x77f7544f,0xefe880bf,0x6ab5c0ef,0xbf317299,0x8ff22fcc,0x7f4403fc, - 0x027ff542,0xff880ff1,0x4f987f70,0x44f98fdc,0x99999998,0x20000099, - 0x000002fc,0x37c4bf60,0x00000000,0x837c4000,0xb8bf32fd,0x1ffe883f, - 0x407ff440,0x21ddf54d,0x362fc86b,0x7ccdf12f,0x42ff4406,0x103ffdc9, - 0x25fc80ff,0x117e45f9,0x2a1fd8bf,0xffffffff,0x3200004f,0x0000002f, - 0x037c47f2,0x00000000,0xd837c400,0x223ff12f,0x37f220fe,0xf701dfdf, - 0x2ab90bff,0x88b90fae,0xd8df10ff,0x5407f62f,0x7f9804ff,0xd910ff10, - 0xbdfe81df,0x207e46fd,0x2eee66f8,0x02bbbbbb,0x00000000,0x00000000, - 0x00000000,0x17ec1be2,0x87ffdff7,0xfd33f2fe,0xfe8efb81,0xdb547d45, - 0x22fd89d4,0x137c42fd,0xbffb81df,0xff700999,0x3a61fe20,0xfffb102d, - 0xb827cc19,0x6d40003f,0x2ca8103d,0xffb80dcc,0x55534fff,0x00000555, - 0x00000000,0x7ec1be20,0x40e6e4c2,0x20c3f109,0xbfd10efb,0x99339dd8, - 0xf527dc1f,0xfb93ee0b,0x3ffffe25,0xffddb2ff,0xffffe85f,0x010001ff, - 0x00130062,0x2ffffdc0,0x7ffccbee,0x503fff11,0x3a799999,0x007fffff, - 0x00000000,0x0df10000,0x10000bf6,0x2077405f,0x3ba20fe8,0x741fda9b, - 0xfd007f46,0x999076c1,0x3ae39999,0xccb80bde,0x0000cccc,0x80000000, - 0x8dfd89fe,0xfff50fd8,0x00fffe65,0x333332e0,0x00000004,0x10000000, - 0x4cbf60df,0x3eeeeeee,0x04401510,0xdfb70088,0x00202019,0x00000101, - 0x00000000,0x7c400000,0x2ffffec5,0x1ffd1bfa,0x00000000,0x00000000, - 0x20df1000,0xdddd32fd,0x00007ddd,0x00000000,0x00000000,0x00000000, - 0x06a00000,0x80413bae,0x00000009,0x00000000,0x00000000,0x00000000, - 0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000, -}; - -static signed short stb__consolas_24_latin1_x[224]={ 0,5,3,0,1,0,0,5,3,3,1,0,2,3, -4,1,1,1,1,1,0,2,1,1,1,1,4,2,1,1,2,3,0,0,1,1,1,2,2,0,1,2,2,1, -2,0,1,0,1,0,1,1,1,1,0,0,0,0,1,4,1,3,1,0,0,1,1,1,1,1,0,1,1,2, -1,2,2,1,1,1,1,1,2,2,0,1,0,0,0,0,1,1,5,2,0,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,5,1,1,1,0, -5,1,0,0,2,1,1,3,1,0,2,1,2,3,0,1,1,4,5,2,2,1,0,0,0,2,0,0,0,0, -0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0, -0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, - }; -static signed short stb__consolas_24_latin1_y[224]={ 17,0,0,1,-1,0,0,0,-1,-1,0,4,13,9, -13,0,1,1,1,1,1,1,1,1,1,1,5,5,4,7,4,0,0,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,20,0,5,0,5,0,5,0,5,0,0, -0,0,0,5,5,5,5,5,5,5,1,5,5,5,5,5,5,0,-3,0,8,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,17,5,-1,1,2,1, --3,0,0,1,1,5,9,9,0,1,0,2,0,0,0,5,0,8,17,0,1,5,0,0,0,5,-3,-3,-3,-3, --3,-4,1,1,-3,-3,-3,-3,-3,-3,-3,-3,1,-3,-3,-3,-3,-3,-3,5,-1,-3,-3,-3,-3,-3,1,0,0,0, -0,0,0,-1,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2,0,0,0,0,0,0,0, - }; -static unsigned short stb__consolas_24_latin1_w[224]={ 0,4,8,13,11,13,14,3,8,7,11,13,7,8, -5,11,12,11,11,11,13,10,11,11,11,11,5,7,10,11,10,8,14,14,11,11,12,10,10,12,11,10,9,12, -10,13,11,13,11,14,12,11,12,11,14,13,13,14,11,6,11,7,11,14,8,11,11,11,11,11,13,12,11,10, -10,11,10,12,11,12,11,11,11,10,12,11,13,13,13,13,11,10,3,10,13,12,12,12,12,12,12,12,12,12, -12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,4,10,11,12,13, -3,11,11,14,9,11,11,8,11,10,9,11,9,8,12,12,11,5,3,9,9,11,13,13,13,8,14,14,14,14, -14,14,14,11,12,12,12,12,12,12,12,12,13,12,13,13,13,13,13,11,13,12,12,12,12,14,11,11,12,12, -12,12,12,12,13,11,12,12,12,12,12,12,12,12,11,12,13,13,13,13,13,13,12,12,12,12,12,13,11,13, - }; -static unsigned short stb__consolas_24_latin1_h[224]={ 0,18,6,16,21,18,18,6,23,23,11,13,9,3, -5,20,17,16,16,17,16,17,17,16,17,16,13,17,14,7,14,18,22,16,16,17,16,16,16,17,16,16,17,16, -16,16,16,17,16,21,16,17,16,17,16,16,16,16,16,22,20,22,9,2,6,13,18,13,18,13,17,17,17,17, -22,17,17,12,12,13,17,17,12,13,17,13,12,12,12,17,12,22,25,22,5,16,16,16,16,16,16,16,16,16, -16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,17,21,16,15,16, -25,20,6,17,12,11,6,3,11,5,9,15,10,10,6,17,20,5,4,10,12,11,17,17,17,17,20,20,20,20, -20,21,16,20,20,20,20,20,20,20,20,20,16,20,21,21,21,21,21,11,21,21,21,21,21,20,16,18,18,18, -18,18,18,19,13,16,18,18,18,18,17,17,17,17,18,17,18,18,18,18,18,13,18,18,18,18,18,22,22,22, - }; -static unsigned short stb__consolas_24_latin1_s[224]={ 252,250,247,62,40,106,104,252,17,9,70, -48,159,238,215,91,183,221,233,12,36,1,222,13,152,220,247,223,37,189,26, -40,100,232,1,24,194,183,25,36,50,76,49,87,245,112,196,1,100,129,207, -164,208,176,181,167,153,138,126,34,146,26,177,26,201,62,119,127,171,139,65, -15,40,245,89,74,141,176,48,74,79,28,225,151,52,87,237,211,162,231,189, -41,1,64,201,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170, -170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,252,247,157, -143,1,103,5,186,235,59,201,118,210,238,94,227,167,14,130,140,222,196,79, -221,252,149,60,106,86,113,127,201,198,213,66,118,103,52,155,67,133,173,14, -27,241,1,40,53,129,228,168,182,196,210,224,82,238,1,14,27,144,158,117, -94,172,185,198,211,131,81,99,91,133,159,146,120,234,209,210,188,224,100,236, -49,157,90,63,113,144,27,1,77,14,75,52,115, }; -static unsigned short stb__consolas_24_latin1_t[224]={ 13,49,156,125,27,49,70,1,1,1,156, -142,156,163,163,27,70,125,125,89,125,89,70,125,89,107,107,89,142,156,142, -70,1,107,125,89,107,107,125,89,125,125,89,125,125,125,125,107,125,1,107, -89,125,89,125,125,125,125,125,1,27,1,156,24,156,142,70,142,70,142,107, -107,107,89,1,89,89,142,156,142,107,107,142,142,107,142,142,142,142,89,142, -1,1,1,163,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107, -107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,107,13,70,1, -107,142,107,1,27,156,89,142,156,156,163,156,163,156,142,156,156,156,70,27, -163,8,156,156,156,89,89,89,89,27,27,49,27,27,27,107,27,27,27,49, -49,27,49,49,49,107,27,1,1,1,1,1,156,1,27,27,27,1,27,107, -49,49,49,49,49,70,49,142,107,49,49,49,49,70,70,89,89,49,89,49, -70,70,70,70,142,70,70,70,70,70,1,1,1, }; -static unsigned short stb__consolas_24_latin1_a[224]={ 211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211, -211,211,211,211,211,211,211,211, }; - -// Call this function with -// font: NULL or array length -// data: NULL or specified size -// height: STB_FONT_consolas_24_latin1_BITMAP_HEIGHT or STB_FONT_consolas_24_latin1_BITMAP_HEIGHT_POW2 -// return value: spacing between lines -static void stb_font_consolas_24_latin1(stb_fontchar font[STB_FONT_consolas_24_latin1_NUM_CHARS], - unsigned char data[STB_FONT_consolas_24_latin1_BITMAP_HEIGHT][STB_FONT_consolas_24_latin1_BITMAP_WIDTH], - int height) -{ - int i,j; - if (data != 0) { - unsigned int *bits = stb__consolas_24_latin1_pixels; - unsigned int bitpack = *bits++, numbits = 32; - for (i=0; i < STB_FONT_consolas_24_latin1_BITMAP_WIDTH*height; ++i) - data[0][i] = 0; // zero entire bitmap - for (j=1; j < STB_FONT_consolas_24_latin1_BITMAP_HEIGHT-1; ++j) { - for (i=1; i < STB_FONT_consolas_24_latin1_BITMAP_WIDTH-1; ++i) { - unsigned int value; - if (numbits==0) bitpack = *bits++, numbits=32; - value = bitpack & 1; - bitpack >>= 1, --numbits; - if (value) { - if (numbits < 3) bitpack = *bits++, numbits = 32; - data[j][i] = (bitpack & 7) * 0x20 + 0x1f; - bitpack >>= 3, numbits -= 3; - } else { - data[j][i] = 0; - } - } - } - } - - // build font description - if (font != 0) { - float recip_width = 1.0f / STB_FONT_consolas_24_latin1_BITMAP_WIDTH; - float recip_height = 1.0f / height; - for (i=0; i < STB_FONT_consolas_24_latin1_NUM_CHARS; ++i) { - // pad characters so they bilerp from empty space around each character - font[i].s0 = (stb__consolas_24_latin1_s[i]) * recip_width; - font[i].t0 = (stb__consolas_24_latin1_t[i]) * recip_height; - font[i].s1 = (stb__consolas_24_latin1_s[i] + stb__consolas_24_latin1_w[i]) * recip_width; - font[i].t1 = (stb__consolas_24_latin1_t[i] + stb__consolas_24_latin1_h[i]) * recip_height; - font[i].x0 = stb__consolas_24_latin1_x[i]; - font[i].y0 = stb__consolas_24_latin1_y[i]; - font[i].x1 = stb__consolas_24_latin1_x[i] + stb__consolas_24_latin1_w[i]; - font[i].y1 = stb__consolas_24_latin1_y[i] + stb__consolas_24_latin1_h[i]; - font[i].advance_int = (stb__consolas_24_latin1_a[i]+8)>>4; - font[i].s0f = (stb__consolas_24_latin1_s[i] - 0.5f) * recip_width; - font[i].t0f = (stb__consolas_24_latin1_t[i] - 0.5f) * recip_height; - font[i].s1f = (stb__consolas_24_latin1_s[i] + stb__consolas_24_latin1_w[i] + 0.5f) * recip_width; - font[i].t1f = (stb__consolas_24_latin1_t[i] + stb__consolas_24_latin1_h[i] + 0.5f) * recip_height; - font[i].x0f = stb__consolas_24_latin1_x[i] - 0.5f; - font[i].y0f = stb__consolas_24_latin1_y[i] - 0.5f; - font[i].x1f = stb__consolas_24_latin1_x[i] + stb__consolas_24_latin1_w[i] + 0.5f; - font[i].y1f = stb__consolas_24_latin1_y[i] + stb__consolas_24_latin1_h[i] + 0.5f; - font[i].advance = stb__consolas_24_latin1_a[i]/16.0f; - } - } -} - -#ifndef STB_SOMEFONT_CREATE -#define STB_SOMEFONT_CREATE stb_font_consolas_24_latin1 -#define STB_SOMEFONT_BITMAP_WIDTH STB_FONT_consolas_24_latin1_BITMAP_WIDTH -#define STB_SOMEFONT_BITMAP_HEIGHT STB_FONT_consolas_24_latin1_BITMAP_HEIGHT -#define STB_SOMEFONT_BITMAP_HEIGHT_POW2 STB_FONT_consolas_24_latin1_BITMAP_HEIGHT_POW2 -#define STB_SOMEFONT_FIRST_CHAR STB_FONT_consolas_24_latin1_FIRST_CHAR -#define STB_SOMEFONT_NUM_CHARS STB_FONT_consolas_24_latin1_NUM_CHARS -#define STB_SOMEFONT_LINE_SPACING STB_FONT_consolas_24_latin1_LINE_SPACING -#endif - From 53f358d77a746d651791a131ca78a8b7813894bc Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 29 Sep 2016 13:27:04 -0700 Subject: [PATCH 076/300] Fix warnings --- libraries/gl/src/gl/GLShaders.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/gl/src/gl/GLShaders.cpp b/libraries/gl/src/gl/GLShaders.cpp index b8e1bf7391..3487ae5d25 100644 --- a/libraries/gl/src/gl/GLShaders.cpp +++ b/libraries/gl/src/gl/GLShaders.cpp @@ -75,8 +75,8 @@ namespace gl { return false; } - GLuint glprogram = 0; #ifdef SEPARATE_PROGRAM + GLuint glprogram = 0; // so far so good, program is almost done, need to link: GLuint glprogram = glCreateProgram(); if (!glprogram) { From 9bc0f2477702da1d2ba5dbee6dcfac58bf5f9fd6 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Sun, 2 Oct 2016 12:22:00 -0700 Subject: [PATCH 077/300] Fix GLEW linker warnings --- cmake/macros/TargetOpenGL.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/macros/TargetOpenGL.cmake b/cmake/macros/TargetOpenGL.cmake index 7b3178d579..73c92e651a 100644 --- a/cmake/macros/TargetOpenGL.cmake +++ b/cmake/macros/TargetOpenGL.cmake @@ -6,6 +6,7 @@ # See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html # macro(TARGET_OPENGL) + add_definitions(-DGLEW_STATIC) if (APPLE) # link in required OS X frameworks and include the right GL headers find_library(OpenGL OpenGL) From fab0f8019daf35b9b559b8c1852937833c241747 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Sun, 2 Oct 2016 17:33:07 -0700 Subject: [PATCH 078/300] Ask windows to not try to be helpful --- server-console/src/main.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server-console/src/main.js b/server-console/src/main.js index c090640ada..b8e661ffbd 100644 --- a/server-console/src/main.js +++ b/server-console/src/main.js @@ -575,16 +575,20 @@ function checkNewContent() { type: 'question', buttons: ['Yes', 'No'], defaultId: 1, + cancelId: 1, title: 'New home content', - message: 'A newer version of the home content set is available.\nDo you wish to update?' + message: 'A newer version of the home content set is available.\nDo you wish to update?', + noLink: true, }, function(idx) { if (idx === 0) { dialog.showMessageBox({ type: 'warning', buttons: ['Yes', 'No'], defaultId: 1, + cancelId: 1, title: 'Are you sure?', - message: 'Updating with the new content will remove all your current content and settings and place them in a backup folder.\nAre you sure?' + message: 'Updating with the new content will remove all your current content and settings and place them in a backup folder.\nAre you sure?', + noLink: true, }, function(idx) { if (idx === 0) { backupResourceDirectoriesAndRestart(); From ce8fcfed36aa0e6237d9a3ba6f4b31d3d75d1116 Mon Sep 17 00:00:00 2001 From: Bradley Austin Davis Date: Sun, 2 Oct 2016 17:42:10 -0700 Subject: [PATCH 079/300] Fix mac build (again?) --- plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp index 2feb272fbe..b7b6ae5768 100644 --- a/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp +++ b/plugins/oculusLegacy/src/OculusLegacyDisplayPlugin.cpp @@ -28,6 +28,8 @@ #include +#include "OculusHelpers.h" + const QString OculusLegacyDisplayPlugin::NAME("Oculus Rift"); OculusLegacyDisplayPlugin::OculusLegacyDisplayPlugin() { From 9590d2eef9b225fc4ab464f28ad59ec234fa082d Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 09:08:32 -0700 Subject: [PATCH 080/300] Fix support for audio when input rate != output rate --- libraries/audio-client/src/AudioClient.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 1250f74061..d867bf8b3c 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -817,6 +817,13 @@ void AudioClient::handleLocalEchoAndReverb(QByteArray& inputByteArray) { return; } + // NOTE: we assume the inputFormat and the outputFormat are the same, since on any modern + // multimedia OS they should be. If there is a device that this is not true for, we can + // add back support to do resampling. + if (_inputFormat.sampleRate() != _outputFormat.sampleRate()) { + return; + } + // if this person wants local loopback add that to the locally injected audio // if there is reverb apply it to local audio and substract the origin samples @@ -833,11 +840,6 @@ void AudioClient::handleLocalEchoAndReverb(QByteArray& inputByteArray) { } } - // NOTE: we assume the inputFormat and the outputFormat are the same, since on any modern - // multimedia OS they should be. If there is a device that this is not true for, we can - // add back support to do resampling. - Q_ASSERT(_inputFormat.sampleRate() == _outputFormat.sampleRate()); - static QByteArray loopBackByteArray; int numInputSamples = inputByteArray.size() / AudioConstants::SAMPLE_SIZE; From 0df69b8e15a97c28682d8015182f35c7374fdb6e Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 3 Oct 2016 10:06:58 -0700 Subject: [PATCH 081/300] Protecting the usage of the defaultSkyboxTexture in case its creation has failed to avoid crash on the first usage, removing an uncorrect assert in GL45BackendTexture that would trigger in debug --- interface/src/Application.cpp | 8 ++++++-- libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp | 2 -- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3890eae4c3..894471a251 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4361,8 +4361,12 @@ namespace render { auto scene = DependencyManager::get()->getStage(); auto sceneKeyLight = scene->getKeyLight(); auto defaultSkyboxAmbientTexture = qApp->getDefaultSkyboxAmbientTexture(); - sceneKeyLight->setAmbientSphere(defaultSkyboxAmbientTexture->getIrradiance()); - sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture); + if (defaultSkyboxAmbientTexture) { + sceneKeyLight->setAmbientSphere(defaultSkyboxAmbientTexture->getIrradiance()); + sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture); + } else { + qWarning() << "Failed to get a valid Default SKybox Ambient Texture ? probably because it couldn't be find during initialization step"; + } // fall through: render defaults skybox } else { break; diff --git a/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp b/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp index 3e6e53ffc3..36b7b4886f 100644 --- a/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp +++ b/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp @@ -511,9 +511,7 @@ void GL45Texture::stripToMip(uint16_t newMinMip) { _minMip = newMinMip; // Re-sync the sampler to force access to the new mip level syncSampler(); - size_t oldSize = _size; updateSize(); - Q_ASSERT(_size > oldSize); // Re-insert into the texture-by-mips map if appropriate From 76d9d4c635b2349bf48057cfcfd0c55bbe6f56b8 Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Mon, 3 Oct 2016 10:16:06 -0700 Subject: [PATCH 082/300] fix canRez logic in tribble script: only need canRezTemp, and fail hard rather than retry --- .../developer/tests/performance/tribbles.js | 76 ++++++++++--------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/scripts/developer/tests/performance/tribbles.js b/scripts/developer/tests/performance/tribbles.js index c9ae347a82..4c04f8b5b7 100644 --- a/scripts/developer/tests/performance/tribbles.js +++ b/scripts/developer/tests/performance/tribbles.js @@ -54,42 +54,46 @@ function randomVector(range) { }; } -Script.setInterval(function () { - if (!Entities.serversExist() || !Entities.canRez()) { - return; - } - if (totalCreated >= NUMBER_TO_CREATE) { - print("Created " + totalCreated + " tribbles."); - Script.stop(); - } +if (!Entities.canRezTmp()) { + Window.alert("Cannot create temp objects here."); + Script.stop(); +} else { + Script.setInterval(function () { + if (!Entities.serversExist()) { + return; + } + if (totalCreated >= NUMBER_TO_CREATE) { + print("Created " + totalCreated + " tribbles."); + Script.stop(); + } - var i, numToCreate = RATE_PER_SECOND * (SCRIPT_INTERVAL / 1000.0); - var parameters = JSON.stringify({ - moveTimeout: MOVE_TIMEOUT, - moveRate: MOVE_RATE, - editTimeout: EDIT_TIMEOUT, - editRate: EDIT_RATE, - debug: {flow: false, send: false, receive: false} - }); - for (i = 0; (i < numToCreate) && (totalCreated < NUMBER_TO_CREATE); i++) { - Entities.addEntity({ - userData: parameters, - type: TYPE, - name: "tribble-" + totalCreated, - position: Vec3.sum(center, randomVector({ x: RANGE, y: RANGE, z: RANGE })), - dimensions: {x: SIZE, y: SIZE, z: SIZE}, - color: {red: Math.random() * 255, green: Math.random() * 255, blue: Math.random() * 255}, - velocity: VELOCITY, - angularVelocity: Vec3.multiply(Math.random(), ANGULAR_VELOCITY), - damping: DAMPING, - angularDamping: ANGULAR_DAMPING, - gravity: GRAVITY, - collisionsWillMove: true, - lifetime: LIFETIME, - script: Script.resolvePath("tribbleEntity.js") + var i, numToCreate = RATE_PER_SECOND * (SCRIPT_INTERVAL / 1000.0); + var parameters = JSON.stringify({ + moveTimeout: MOVE_TIMEOUT, + moveRate: MOVE_RATE, + editTimeout: EDIT_TIMEOUT, + editRate: EDIT_RATE, + debug: {flow: false, send: false, receive: false} }); + for (i = 0; (i < numToCreate) && (totalCreated < NUMBER_TO_CREATE); i++) { + Entities.addEntity({ + userData: parameters, + type: TYPE, + name: "tribble-" + totalCreated, + position: Vec3.sum(center, randomVector({ x: RANGE, y: RANGE, z: RANGE })), + dimensions: {x: SIZE, y: SIZE, z: SIZE}, + color: {red: Math.random() * 255, green: Math.random() * 255, blue: Math.random() * 255}, + velocity: VELOCITY, + angularVelocity: Vec3.multiply(Math.random(), ANGULAR_VELOCITY), + damping: DAMPING, + angularDamping: ANGULAR_DAMPING, + gravity: GRAVITY, + collisionsWillMove: true, + lifetime: LIFETIME, + script: Script.resolvePath("tribbleEntity.js") + }); - totalCreated++; - } -}, SCRIPT_INTERVAL); - + totalCreated++; + } + }, SCRIPT_INTERVAL); +} From ee801f4cc2ab13176392872dd75684896274726a Mon Sep 17 00:00:00 2001 From: Howard Stearns Date: Mon, 3 Oct 2016 10:29:33 -0700 Subject: [PATCH 083/300] initial domain-check script --- .../tests/performance/domain-check.js | 201 ++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 scripts/developer/tests/performance/domain-check.js diff --git a/scripts/developer/tests/performance/domain-check.js b/scripts/developer/tests/performance/domain-check.js new file mode 100644 index 0000000000..eceffa278b --- /dev/null +++ b/scripts/developer/tests/performance/domain-check.js @@ -0,0 +1,201 @@ +"use strict"; +/*jslint vars: true, plusplus: true*/ +/*globals Script, MyAvatar, Quat, Render, ScriptDiscoveryService, Window, LODManager, Entities, print*/ +// +// loadedMachine.js +// scripts/developer/tests/ +// +// Created by Howard Stearns on 6/6/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +// Confirms that the specified domain is operating within specified constraints. + +var MINIMUM_DESKTOP_FRAMERATE = 57; // frames per second +var MINIMUM_HMD_FRAMERATE = 86; +var EXPECTED_DESKTOP_FRAMERATE = 60; +var EXPECTED_HMD_FRAMERATE = 90; +var MAXIMUM_LOAD_TIME = 60; // seconds +var MINIMUM_AVATARS = 25; // FIXME: not implemented yet. Requires agent scripts. Idea is to have them organize themselves to the right number. + +var version = 1; +function debug() { + print.apply(null, [].concat.apply(['hrs fixme', version], [].map.call(arguments, JSON.stringify))); +} + +var emptyishPlace = 'empty'; +var cachePlaces = ['localhost', 'Welcome']; +var isInCachePlace = cachePlaces.indexOf(location.hostname) >= 0; +var defaultPlace = isInCachePlace ? 'Playa' : location.hostname; +var prompt = "domain-check.js version " + version + "\n\nWhat place should we enter?"; +debug(cachePlaces, isInCachePlace, defaultPlace, prompt); +var entryPlace = Window.prompt(prompt, defaultPlace); + +var fail = false, results = ""; +function addResult(label, actual, minimum, maximum) { + if ((minimum !== undefined) && (actual < minimum)) { + fail = true; + } + if ((maximum !== undefined) && (actual > maximum)) { + fail = true; + } + results += "\n" + label + ": " + actual + " (" + ((100 * actual) / (maximum || minimum)).toFixed(0) + "%)"; +} +function giveReport() { + Window.alert(entryPlace + (fail ? " FAILED" : " OK") + "\n" + results); +} + +// Tests are performed domain-wide, at full LOD +var initialLodIsAutomatic = LODManager.getAutomaticLODAdjust(); +var LOD = 32768 * 400; +LODManager.setAutomaticLODAdjust(false); +LODManager.setOctreeSizeScale(LOD); +Script.scriptEnding.connect(function () { LODManager.setAutomaticLODAdjust(initialLodIsAutomatic); }); + +function startTwirl(targetRotation, degreesPerUpdate, interval, strafeDistance, optionalCallback) { + var initialRotation = Quat.safeEulerAngles(MyAvatar.orientation).y; + var accumulatedRotation = 0; + function tick() { + MyAvatar.orientation = Quat.fromPitchYawRollDegrees(0, accumulatedRotation + initialRotation, 0); + if (strafeDistance) { + MyAvatar.position = Vec3.sum(MyAvatar.position, Vec3.multiply(strafeDistance, Quat.getRight(MyAvatar.orientation))); + } + accumulatedRotation += degreesPerUpdate; + if (accumulatedRotation >= targetRotation) { + return optionalCallback && optionalCallback(); + } + Script.setTimeout(tick, interval); + } + tick(); +} + +function doLoad(place, continuationWithLoadTime) { // Go to place and call continuationWithLoadTime(loadTimeInSeconds) + var start = Date.now(), timeout, onDownloadUpdate, finishedTwirl = false, loadTime; + function clearHandlers() { + debug('clearHandlers'); + Stats.downloadsPendingChanged.disconnect(onDownloadUpdate); + Stats.downloadsChanged.disconnect(onDownloadUpdate); + } + function waitForLoad(flag) { + debug('entry', place, 'initial downloads/pending', Stats.downloads, Stats.downloadsPending); + location.hostChanged.disconnect(waitForLoad); + timeout = Script.setTimeout(function () { + debug('downloads timeout', Date()); + clearHandlers(); + Window.alert("Timeout during " + place + " load. FAILED"); + Script.stop(); + }, MAXIMUM_LOAD_TIME * 1000); + startTwirl(360, 6, 90, null, function () { + finishedTwirl = true; + if (loadTime) { + continuationWithLoadTime(loadTime); + } + }); + Stats.downloadsPendingChanged.connect(onDownloadUpdate); + Stats.downloadsChanged.connect(onDownloadUpdate); + } + function isLoading() { + // FIXME: This tells us when download are completed, but it doesn't tell us when the objects are parsed and loaded. + // We really want something like _physicsEnabled, but that isn't signalled. + return Stats.downloads || Stats.downloadsPending; + } + onDownloadUpdate = function onDownloadUpdate() { + debug('update downloads/pending', Stats.downloads, Stats.downloadsPending); + if (isLoading()) { + return; + } + Script.clearTimeout(timeout); + clearHandlers(); + loadTime = (Date.now() - start) / 1000; + if (finishedTwirl) { + continuationWithLoadTime(loadTime); + } + }; + + function doit() { + debug('go', place); + location.hostChanged.connect(waitForLoad); + location.handleLookupString(place); + } + if (location.placename.toLowerCase() === place.toLowerCase()) { + location.handleLookupString(emptyishPlace); + Script.setTimeout(doit, 1000); + } else { + doit(); + } +} + +var config = Render.getConfig("Stats"); +function doRender(continuation) { + var start = Date.now(), frames = 0; + function onNewStats() { // Accumulates frames on signal during load test + frames++; + } + config.newStats.connect(onNewStats); + startTwirl(720, 1, 15, 0.08, function () { + var end = Date.now(); + config.newStats.disconnect(onNewStats); + addResult('frame rate', 1000 * frames / (end - start), + HMD.active ? MINIMUM_HMD_FRAMERATE : MINIMUM_DESKTOP_FRAMERATE, + HMD.active ? EXPECTED_HMD_FRAMERATE : EXPECTED_DESKTOP_FRAMERATE); + continuation(); + }); +} + +function maybePrepareCache(continuation) { + var prepareCache = Window.confirm("Prepare cache?\n\n\ +Should we start with all and only those items cached that are encountered when visiting:\n" + cachePlaces.join(', ') + "\n\ +If 'yes', cache will be cleared and we will visit these two, with a turn in each, and wait for everything to be loaded.\n\ +You would want to say 'no' (and make other preparations) if you were testing these places."); + + if (prepareCache) { + location.handleLookupString(emptyishPlace); + Window.alert("Please do menu Edit->Reload Content (Clears all caches) and THEN press 'ok'."); + function loadNext() { + var place = cachePlaces.shift(); + doLoad(place, function (prepTime) { + debug(place, 'ready', prepTime); + if (cachePlaces.length) { + loadNext(); + } else { + continuation(); + } + }); + } + loadNext(); + } else { + continuation(); + } +} + +function maybeRunTribbles(continuation) { + if (Window.confirm("Run tribbles?\n\n\ +At most, only one participant should say yes.")) { + Script.load('http://howard-stearns.github.io/models/scripts/tests/performance/tribbles.js'); // FIXME: replace with AWS + Script.setTimeout(continuation, 3000); + } else { + continuation(); + } +} + +if (!entryPlace) { + Window.alert("domain-check.js cancelled"); + Script.stop(); +} else { + maybePrepareCache(function (prepTime) { + debug('cache ready', prepTime); + doLoad(entryPlace, function (loadTime) { + addResult("load time", loadTime, undefined, MAXIMUM_LOAD_TIME); + maybeRunTribbles(function () { + doRender(function () { + giveReport(); + Script.stop(); + }); + }); + }); + }); +} + +Script.scriptEnding.connect(function () { print("domain-check completed"); }); From 5adedbbb8bfaec1177b406bb0b477a0eb9759534 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 3 Oct 2016 11:27:15 -0700 Subject: [PATCH 084/300] replace the simple log by a unique log --- interface/src/Application.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 894471a251..e11f5159d8 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4365,7 +4365,9 @@ namespace render { sceneKeyLight->setAmbientSphere(defaultSkyboxAmbientTexture->getIrradiance()); sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture); } else { - qWarning() << "Failed to get a valid Default SKybox Ambient Texture ? probably because it couldn't be find during initialization step"; + static QString repeatedMessage + = LogHandler::getInstance().addRepeatedMessageRegex( + "Failed to get a valid Default Skybox Ambient Texture ? probably because it couldn't be find during initialization step"); } // fall through: render defaults skybox } else { From 0189e3aea7a08e66be47103472f8dfcf62f95012 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 3 Oct 2016 11:29:17 -0700 Subject: [PATCH 085/300] Github is borked ? --- interface/src/Application.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index e11f5159d8..ec452cb260 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -2170,7 +2170,7 @@ bool Application::event(QEvent* event) { // handle custom URL if (event->type() == QEvent::FileOpen) { - QFileOpenEvent* fileEvent = static_cast(event); + QFileOpenEvent* fileEvent = static_cast(event); QUrl url = fileEvent->url(); @@ -4365,8 +4365,7 @@ namespace render { sceneKeyLight->setAmbientSphere(defaultSkyboxAmbientTexture->getIrradiance()); sceneKeyLight->setAmbientMap(defaultSkyboxAmbientTexture); } else { - static QString repeatedMessage - = LogHandler::getInstance().addRepeatedMessageRegex( + static QString repeatedMessage = LogHandler::getInstance().addRepeatedMessageRegex( "Failed to get a valid Default Skybox Ambient Texture ? probably because it couldn't be find during initialization step"); } // fall through: render defaults skybox From 70a63417cfc71d1218de7fe1f22f09bf4a0548a4 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Mon, 3 Oct 2016 11:40:50 -0700 Subject: [PATCH 086/300] point to tribbles.js on aws For now, anyways. Just temporary until dev is complete. --- scripts/developer/tests/performance/domain-check.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/developer/tests/performance/domain-check.js b/scripts/developer/tests/performance/domain-check.js index eceffa278b..67da45e1b6 100644 --- a/scripts/developer/tests/performance/domain-check.js +++ b/scripts/developer/tests/performance/domain-check.js @@ -173,7 +173,7 @@ You would want to say 'no' (and make other preparations) if you were testing the function maybeRunTribbles(continuation) { if (Window.confirm("Run tribbles?\n\n\ At most, only one participant should say yes.")) { - Script.load('http://howard-stearns.github.io/models/scripts/tests/performance/tribbles.js'); // FIXME: replace with AWS + Script.load('http://cdn.highfidelity.com/davidkelly/production/scripts/tests/performance/tribbles.js'); // FIXME: replace with AWS Script.setTimeout(continuation, 3000); } else { continuation(); From 43c29500bf8483a5c974f03053fa77e43a3f142b Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Mon, 3 Oct 2016 12:03:23 -0700 Subject: [PATCH 087/300] ac script to provide an on-demand crowd, and an interface script to summon it --- .../tests/performance/crowd-agent.js | 95 +++++++++++++++++++ scripts/developer/tests/performance/summon.js | 94 ++++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100644 scripts/developer/tests/performance/crowd-agent.js create mode 100644 scripts/developer/tests/performance/summon.js diff --git a/scripts/developer/tests/performance/crowd-agent.js b/scripts/developer/tests/performance/crowd-agent.js new file mode 100644 index 0000000000..5df576cf99 --- /dev/null +++ b/scripts/developer/tests/performance/crowd-agent.js @@ -0,0 +1,95 @@ +"use strict"; +/*jslint vars: true, plusplus: true*/ +/*global Agent, Avatar, Script, Entities, Vec3, Quat, print*/ +// +// crowd-agent.js +// scripts/developer/tests/performance/ +// +// Created by Howard Stearns on 9/29/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +// Add this to domain-settings scripts url with n instances. It will lie dormant until +// a script like summon.js calls up to n avatars to be around you. + +var MESSAGE_CHANNEL = "io.highfidelity.summon-crowd"; + +print('crowd-agent version 1'); + +/* Observations: +- File urls for AC scripts silently fail. Use a local server (e.g., python SimpleHTTPServer) for development. +- URLs are cached regardless of server headers. Must use cache-defeating query parameters. +- JSON.stringify(Avatar) silently fails (even when Agent.isAvatar) +*/ + +function startAgent(parameters) { // Can also be used to update. + print('crowd-agent starting params', JSON.stringify(parameters), JSON.stringify(Agent)); + Agent.isAvatar = true; + if (parameters.position) { + Avatar.position = parameters.position; + } + if (parameters.orientation) { + Avatar.orientation = parameters.orientation; + } + if (parameters.skeletonModelURL) { + Avatar.skeletonModelURL = parameters.skeletonModelURL; + } + if (parameters.animationData) { + data = parameters.animationData; + Avatar.startAnimation(data.url, data.fps || 30, 1.0, (data.loopFlag === undefined) ? true : data.loopFlag, false, data.startFrame || 0, data.endFrame); + } + print('crowd-agent avatars started'); +} +function stopAgent(parameters) { + Agent.isAvatar = false; + print('crowd-agent stopped', JSON.stringify(parameters), JSON.stringify(Agent)); +} + +function messageSend(message) { + Messages.sendMessage(MESSAGE_CHANNEL, JSON.stringify(message)); +} +function messageHandler(channel, messageString, senderID) { + if (channel !== MESSAGE_CHANNEL) { + return; + } + print('crowd-agent message', channel, messageString, senderID); + if (Agent.sessionUUID === senderID) { // ignore my own + return; + } + var message = {}; + try { + message = JSON.parse(messageString); + } catch (e) { + print(e); + } + switch (message.key) { + case "HELO": + messageSend({key: 'hello'}); // Allow the coordinator to count responses and make assignments. + break; + case 'hello': // ignore responses (e.g., from other agents) + break; + case "SUMMON": + if (message.rcpt === Agent.sessionUUID) { + startAgent(message); + } + break; + case "STOP": + if (message.rcpt === Agent.sessionUUID) { + stopAgent(message); + } + break; + default: + print("crowd-agent received unrecognized message:", channel, messageString, senderID); + } +} +Messages.subscribe(MESSAGE_CHANNEL); +Messages.messageReceived.connect(messageHandler); + +Script.scriptEnding.connect(function () { + print('crowd-agent shutting down'); + Messages.messageReceived.disconnect(messageHandler); + Messages.unsubscribe(MESSAGE_CHANNEL); + print('crowd-agent unsubscribed'); +}); diff --git a/scripts/developer/tests/performance/summon.js b/scripts/developer/tests/performance/summon.js new file mode 100644 index 0000000000..cb3093ca5b --- /dev/null +++ b/scripts/developer/tests/performance/summon.js @@ -0,0 +1,94 @@ +"use strict"; +/*jslint vars: true, plusplus: true*/ +/*global Agent, Avatar, Script, Entities, Vec3, Quat, print*/ +// +// crowd-agent.js +// scripts/developer/tests/performance/ +// +// Created by Howard Stearns on 9/29/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +// See crowd-agent.js + +var version = 1; +var label = "summon"; +function debug() { + print.apply(null, [].concat.apply([label, version], [].map.call(arguments, JSON.stringify))); +} +var MINIMUM_AVATARS = 25; +var DENSITY = 0.3; // square meters per person. Some say 10 sq ft is arm's length (0.9m^2), 4.5 is crowd (0.4m^2), 2.5 is mosh pit (0.2m^2). +var spread = Math.sqrt(MINIMUM_AVATARS * DENSITY); // meters +var turnSpread = 90; // How many degrees should turn from front range over. + +function coord() { return (Math.random() * spread) - (spread / 2); } // randomly distribute a coordinate zero += spread/2. + + +var summonedAgents = []; +var MESSAGE_CHANNEL = "io.highfidelity.summon-crowd"; +function messageSend(message) { + Messages.sendMessage(MESSAGE_CHANNEL, JSON.stringify(message)); +} +function messageHandler(channel, messageString, senderID) { + if (channel !== MESSAGE_CHANNEL) { + return; + } + debug('message', channel, messageString, senderID); + if (MyAvatar.sessionUUID === senderID) { // ignore my own + return; + } + var message = {}, avatarIdentifiers; + try { + message = JSON.parse(messageString); + } catch (e) { + print(e); + } + switch (message.key) { + case "hello": + // There can be avatars we've summoned that do not yet appear in the AvatarList. + avatarIdentifiers = AvatarList.getAvatarIdentifiers().filter(function (id) { return summonedAgents.indexOf(id) === -1; }); + debug('present', avatarIdentifiers, summonedAgents); + if ((summonedAgents.length + avatarIdentifiers.length) < MINIMUM_AVATARS ) { + summonedAgents.push(senderID); + messageSend({ + key: 'SUMMON', + rcpt: senderID, + position: Vec3.sum(MyAvatar.position, {x: coord(), y: 0, z: coord()}), + orientation: Quat.fromPitchYawRollDegrees(0, Quat.safeEulerAngles(MyAvatar.orientation).y + (turnSpread * (Math.random() - 0.5)), 0)/*, + // No need to specify skeletonModelURL + //skeletonModelURL: "file:///c:/Program Files/High Fidelity Release/resources/meshes/being_of_light/being_of_light.fbx", + //skeletonModelURL: "file:///c:/Program Files/High Fidelity Release/resources/meshes/defaultAvatar_full.fst"/, + animationData: { // T-pose until we get animations working again. + "url": "file:///C:/Program Files/High Fidelity Release/resources/avatar/animations/idle.fbx", + //"url": "file:///c:/Program Files/High Fidelity Release/resources/avatar/animations/walk_fwd.fbx", + "startFrame": 0.0, + "endFrame": 300.0, + "timeScale": 1.0, + "loopFlag": true + }*/ + }); + } + break; + case "HELO": + Window.alert("Someone else is summoning avatars."); + break; + default: + print("crowd-agent received unrecognized message:", messageString); + } +} +Messages.subscribe(MESSAGE_CHANNEL); +Messages.messageReceived.connect(messageHandler); +Script.scriptEnding.connect(function () { + debug('stopping agents', summonedAgents); + summonedAgents.forEach(function (id) { messageSend({key: 'STOP', rcpt: id}); }); + debug('agents stopped'); + Script.setTimeout(function () { + Messages.messageReceived.disconnect(messageHandler); + Messages.unsubscribe(MESSAGE_CHANNEL); + debug('unsubscribed'); + }, 500); +}); + +messageSend({key: 'HELO'}); // Ask agents to report in now, before we start the tribbles. From 573d5898ccc8a010ee6a1728d105ad520d261f46 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 3 Oct 2016 13:46:55 -0700 Subject: [PATCH 088/300] Make static control packets class members --- libraries/networking/src/udt/Connection.cpp | 96 ++++++++++----------- libraries/networking/src/udt/Connection.h | 28 +++--- 2 files changed, 65 insertions(+), 59 deletions(-) diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index af70295840..dcceef0fdc 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -45,6 +45,20 @@ Connection::Connection(Socket* parentSocket, HifiSockAddr destination, std::uniq // set the initial RTT and flow window size on congestion control object _congestionControl->setRTT(_rtt); _congestionControl->setMaxCongestionWindowSize(_flowWindowSize); + + // Setup packets + static const int ACK_PACKET_PAYLOAD_BYTES = sizeof(_lastSentACK) + sizeof(_currentACKSubSequenceNumber) + + sizeof(_rtt) + sizeof(int32_t) + sizeof(int32_t) + sizeof(int32_t); + static const int LIGHT_ACK_PACKET_PAYLOAD_BYTES = sizeof(SequenceNumber); + static const int ACK2_PAYLOAD_BYTES = sizeof(SequenceNumber); + static const int NAK_PACKET_PAYLOAD_BYTES = 2 * sizeof(SequenceNumber); + static const int HANDSHAKE_ACK_PAYLOAD_BYTES = sizeof(SequenceNumber); + + _ackPacket = ControlPacket::create(ControlPacket::ACK, ACK_PACKET_PAYLOAD_BYTES); + _lightACKPacket = ControlPacket::create(ControlPacket::LightACK, LIGHT_ACK_PACKET_PAYLOAD_BYTES); + _ack2Packet = ControlPacket::create(ControlPacket::ACK2, ACK2_PAYLOAD_BYTES); + _lossReport = ControlPacket::create(ControlPacket::NAK, NAK_PACKET_PAYLOAD_BYTES); + _handshakeACK = ControlPacket::create(ControlPacket::HandshakeACK, HANDSHAKE_ACK_PAYLOAD_BYTES); } Connection::~Connection() { @@ -279,25 +293,22 @@ void Connection::sendACK(bool wasCausedBySyncTimeout) { // update the last sent ACK _lastSentACK = nextACKNumber; - - // setup the ACK packet, make it static so we can re-use it - static const int ACK_PACKET_PAYLOAD_BYTES = sizeof(_lastSentACK) + sizeof(_currentACKSubSequenceNumber) - + sizeof(_rtt) + sizeof(int32_t) + sizeof(int32_t) + sizeof(int32_t); - static auto ackPacket = ControlPacket::create(ControlPacket::ACK, ACK_PACKET_PAYLOAD_BYTES); - ackPacket->reset(); // We need to reset it every time. + + + _ackPacket->reset(); // We need to reset it every time. // pack in the ACK sub-sequence number - ackPacket->writePrimitive(++_currentACKSubSequenceNumber); + _ackPacket->writePrimitive(++_currentACKSubSequenceNumber); // pack in the ACK number - ackPacket->writePrimitive(nextACKNumber); + _ackPacket->writePrimitive(nextACKNumber); // pack in the RTT and variance - ackPacket->writePrimitive(_rtt); + _ackPacket->writePrimitive(_rtt); // pack the available buffer size, in packets // in our implementation we have no hard limit on receive buffer size, send the default value - ackPacket->writePrimitive((int32_t) udt::CONNECTION_RECEIVE_BUFFER_SIZE_PACKETS); + _ackPacket->writePrimitive((int32_t) udt::CONNECTION_RECEIVE_BUFFER_SIZE_PACKETS); if (wasCausedBySyncTimeout) { // grab the up to date packet receive speed and estimated bandwidth @@ -309,15 +320,15 @@ void Connection::sendACK(bool wasCausedBySyncTimeout) { _stats.recordEstimatedBandwidth(estimatedBandwidth); // pack in the receive speed and estimatedBandwidth - ackPacket->writePrimitive(packetReceiveSpeed); - ackPacket->writePrimitive(estimatedBandwidth); + _ackPacket->writePrimitive(packetReceiveSpeed); + _ackPacket->writePrimitive(estimatedBandwidth); } // record this as the last ACK send time lastACKSendTime = p_high_resolution_clock::now(); // have the socket send off our packet - _parentSocket->writeBasePacket(*ackPacket, _destination); + _parentSocket->writeBasePacket(*_ackPacket, _destination); Q_ASSERT_X(_sentACKs.empty() || _sentACKs.back().first + 1 == _currentACKSubSequenceNumber, "Connection::sendACK", "Adding an invalid ACK to _sentACKs"); @@ -339,35 +350,27 @@ void Connection::sendLightACK() { return; } - // create the light ACK packet, make it static so we can re-use it - static const int LIGHT_ACK_PACKET_PAYLOAD_BYTES = sizeof(SequenceNumber); - static auto lightACKPacket = ControlPacket::create(ControlPacket::LightACK, LIGHT_ACK_PACKET_PAYLOAD_BYTES); - // reset the lightACKPacket before we go to write the ACK to it - lightACKPacket->reset(); + _lightACKPacket->reset(); // pack in the ACK - lightACKPacket->writePrimitive(nextACKNumber); + _lightACKPacket->writePrimitive(nextACKNumber); // have the socket send off our packet immediately - _parentSocket->writeBasePacket(*lightACKPacket, _destination); + _parentSocket->writeBasePacket(*_lightACKPacket, _destination); _stats.record(ConnectionStats::Stats::SentLightACK); } void Connection::sendACK2(SequenceNumber currentACKSubSequenceNumber) { - // setup a static ACK2 packet we will re-use - static const int ACK2_PAYLOAD_BYTES = sizeof(SequenceNumber); - static auto ack2Packet = ControlPacket::create(ControlPacket::ACK2, ACK2_PAYLOAD_BYTES); - // reset the ACK2 Packet before writing the sub-sequence number to it - ack2Packet->reset(); + _ack2Packet->reset(); // write the sub sequence number for this ACK2 - ack2Packet->writePrimitive(currentACKSubSequenceNumber); + _ack2Packet->writePrimitive(currentACKSubSequenceNumber); // send the ACK2 packet - _parentSocket->writeBasePacket(*ack2Packet, _destination); + _parentSocket->writeBasePacket(*_ack2Packet, _destination); // update the last sent ACK2 and the last ACK2 send time _lastSentACK2 = currentACKSubSequenceNumber; @@ -376,19 +379,16 @@ void Connection::sendACK2(SequenceNumber currentACKSubSequenceNumber) { } void Connection::sendNAK(SequenceNumber sequenceNumberRecieved) { - // create the loss report packet, make it static so we can re-use it - static const int NAK_PACKET_PAYLOAD_BYTES = 2 * sizeof(SequenceNumber); - static auto lossReport = ControlPacket::create(ControlPacket::NAK, NAK_PACKET_PAYLOAD_BYTES); - lossReport->reset(); // We need to reset it every time. + _lossReport->reset(); // We need to reset it every time. // pack in the loss report - lossReport->writePrimitive(_lastReceivedSequenceNumber + 1); + _lossReport->writePrimitive(_lastReceivedSequenceNumber + 1); if (_lastReceivedSequenceNumber + 1 != sequenceNumberRecieved - 1) { - lossReport->writePrimitive(sequenceNumberRecieved - 1); + _lossReport->writePrimitive(sequenceNumberRecieved - 1); } // have the parent socket send off our packet immediately - _parentSocket->writeBasePacket(*lossReport, _destination); + _parentSocket->writeBasePacket(*_lossReport, _destination); // record our last NAK time _lastNAKTime = p_high_resolution_clock::now(); @@ -519,7 +519,7 @@ bool Connection::processReceivedSequenceNumber(SequenceNumber sequenceNumber, in return !wasDuplicate; } -void Connection::processControl(std::unique_ptr controlPacket) { +void Connection::processControl(ControlPacketPointer controlPacket) { // Simple dispatch to control packets processing methods based on their type. @@ -577,7 +577,7 @@ void Connection::processControl(std::unique_ptr controlPacket) { } } -void Connection::processACK(std::unique_ptr controlPacket) { +void Connection::processACK(ControlPacketPointer controlPacket) { // read the ACK sub-sequence number SequenceNumber currentACKSubSequenceNumber; controlPacket->readPrimitive(¤tACKSubSequenceNumber); @@ -678,7 +678,7 @@ void Connection::processACK(std::unique_ptr controlPacket) { _stats.record(ConnectionStats::Stats::ProcessedACK); } -void Connection::processLightACK(std::unique_ptr controlPacket) { +void Connection::processLightACK(ControlPacketPointer controlPacket) { // read the ACKed sequence number SequenceNumber ack; controlPacket->readPrimitive(&ack); @@ -702,7 +702,7 @@ void Connection::processLightACK(std::unique_ptr controlPacket) { _stats.record(ConnectionStats::Stats::ReceivedLightACK); } -void Connection::processACK2(std::unique_ptr controlPacket) { +void Connection::processACK2(ControlPacketPointer controlPacket) { // pull the sub sequence number from the packet SequenceNumber subSequenceNumber; controlPacket->readPrimitive(&subSequenceNumber); @@ -742,7 +742,7 @@ void Connection::processACK2(std::unique_ptr controlPacket) { _stats.record(ConnectionStats::Stats::ReceivedACK2); } -void Connection::processNAK(std::unique_ptr controlPacket) { +void Connection::processNAK(ControlPacketPointer controlPacket) { // read the loss report SequenceNumber start, end; controlPacket->readPrimitive(&start); @@ -764,7 +764,7 @@ void Connection::processNAK(std::unique_ptr controlPacket) { _stats.record(ConnectionStats::Stats::ReceivedNAK); } -void Connection::processHandshake(std::unique_ptr controlPacket) { +void Connection::processHandshake(ControlPacketPointer controlPacket) { SequenceNumber initialSequenceNumber; controlPacket->readPrimitive(&initialSequenceNumber); @@ -782,18 +782,16 @@ void Connection::processHandshake(std::unique_ptr controlPacket) _lastReceivedSequenceNumber = initialSequenceNumber - 1; _lastSentACK = initialSequenceNumber - 1; } - - // immediately respond with a handshake ACK - static auto handshakeACK = ControlPacket::create(ControlPacket::HandshakeACK, sizeof(SequenceNumber)); - handshakeACK->seek(0); - handshakeACK->writePrimitive(initialSequenceNumber); - _parentSocket->writeBasePacket(*handshakeACK, _destination); + + _handshakeACK->reset(); + _handshakeACK->writePrimitive(initialSequenceNumber); + _parentSocket->writeBasePacket(*_handshakeACK, _destination); // indicate that handshake has been received _hasReceivedHandshake = true; } -void Connection::processHandshakeACK(std::unique_ptr controlPacket) { +void Connection::processHandshakeACK(ControlPacketPointer controlPacket) { // if we've decided to clean up the send queue then this handshake ACK should be ignored, it's useless if (_sendQueue) { SequenceNumber initialSequenceNumber; @@ -807,7 +805,7 @@ void Connection::processHandshakeACK(std::unique_ptr controlPacke } } -void Connection::processTimeoutNAK(std::unique_ptr controlPacket) { +void Connection::processTimeoutNAK(ControlPacketPointer controlPacket) { // Override SendQueue's LossList with the timeout NAK list getSendQueue().overrideNAKListFromPacket(*controlPacket); @@ -817,7 +815,7 @@ void Connection::processTimeoutNAK(std::unique_ptr controlPacket) _stats.record(ConnectionStats::Stats::ReceivedTimeoutNAK); } -void Connection::processProbeTail(std::unique_ptr controlPacket) { +void Connection::processProbeTail(ControlPacketPointer controlPacket) { if (((uint32_t) _lastReceivedSequenceNumber & 0xF) == 0) { // this is the second packet in a probe set so we can estimate bandwidth // the sender sent this to us in lieu of sending new data (because they didn't have any) diff --git a/libraries/networking/src/udt/Connection.h b/libraries/networking/src/udt/Connection.h index 08a2df9b97..d6121d47b2 100644 --- a/libraries/networking/src/udt/Connection.h +++ b/libraries/networking/src/udt/Connection.h @@ -55,6 +55,7 @@ public: using SequenceNumberTimePair = std::pair; using ACKListPair = std::pair; using SentACKList = std::list; + using ControlPacketPointer = std::unique_ptr; Connection(Socket* parentSocket, HifiSockAddr destination, std::unique_ptr congestionControl); ~Connection(); @@ -66,7 +67,7 @@ public: // return indicates if this packet should be processed bool processReceivedSequenceNumber(SequenceNumber sequenceNumber, int packetSize, int payloadSize); - void processControl(std::unique_ptr controlPacket); + void processControl(ControlPacketPointer controlPacket); void queueReceivedMessagePacket(std::unique_ptr packet); @@ -96,14 +97,14 @@ private: void sendNAK(SequenceNumber sequenceNumberRecieved); void sendTimeoutNAK(); - void processACK(std::unique_ptr controlPacket); - void processLightACK(std::unique_ptr controlPacket); - void processACK2(std::unique_ptr controlPacket); - void processNAK(std::unique_ptr controlPacket); - void processTimeoutNAK(std::unique_ptr controlPacket); - void processHandshake(std::unique_ptr controlPacket); - void processHandshakeACK(std::unique_ptr controlPacket); - void processProbeTail(std::unique_ptr controlPacket); + void processACK(ControlPacketPointer controlPacket); + void processLightACK(ControlPacketPointer controlPacket); + void processACK2(ControlPacketPointer controlPacket); + void processNAK(ControlPacketPointer controlPacket); + void processTimeoutNAK(ControlPacketPointer controlPacket); + void processHandshake(ControlPacketPointer controlPacket); + void processHandshakeACK(ControlPacketPointer controlPacket); + void processProbeTail(ControlPacketPointer controlPacket); void resetReceiveState(); void resetRTT(); @@ -171,7 +172,14 @@ private: std::map _pendingReceivedMessages; int _packetsSinceACK { 0 }; // The number of packets that have been received during the current ACK interval - + + // Re-used control packets + ControlPacketPointer _ackPacket; + ControlPacketPointer _lightACKPacket; + ControlPacketPointer _ack2Packet; + ControlPacketPointer _lossReport; + ControlPacketPointer _handshakeACK; + ConnectionStats _stats; }; From 8388e1044aa78afee9ce6e7e9889975b218f5936 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Mon, 3 Oct 2016 14:09:52 -0700 Subject: [PATCH 089/300] cleanup to use script-driven cache cleaning --- .../tests/performance/domain-check.js | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/scripts/developer/tests/performance/domain-check.js b/scripts/developer/tests/performance/domain-check.js index 67da45e1b6..1a42683d92 100644 --- a/scripts/developer/tests/performance/domain-check.js +++ b/scripts/developer/tests/performance/domain-check.js @@ -25,10 +25,13 @@ function debug() { print.apply(null, [].concat.apply(['hrs fixme', version], [].map.call(arguments, JSON.stringify))); } -var emptyishPlace = 'empty'; -var cachePlaces = ['localhost', 'Welcome']; -var isInCachePlace = cachePlaces.indexOf(location.hostname) >= 0; -var defaultPlace = isInCachePlace ? 'Playa' : location.hostname; +function isNowIn(place) { // true if currently in specified place + return location.hostname.toLowerCase() === place.toLowerCase(); +} + +var cachePlaces = ['dev-Welcome', 'localhost']; // For now, list the lighter weight one first. +var isInCachePlace = cachePlaces.some(isNowIn); +var defaultPlace = isInCachePlace ? 'dev-Playa' : location.hostname; var prompt = "domain-check.js version " + version + "\n\nWhat place should we enter?"; debug(cachePlaces, isInCachePlace, defaultPlace, prompt); var entryPlace = Window.prompt(prompt, defaultPlace); @@ -114,17 +117,9 @@ function doLoad(place, continuationWithLoadTime) { // Go to place and call conti } }; - function doit() { - debug('go', place); - location.hostChanged.connect(waitForLoad); - location.handleLookupString(place); - } - if (location.placename.toLowerCase() === place.toLowerCase()) { - location.handleLookupString(emptyishPlace); - Script.setTimeout(doit, 1000); - } else { - doit(); - } + debug('go', place); + location.hostChanged.connect(waitForLoad); + location.handleLookupString(place); } var config = Render.getConfig("Stats"); @@ -144,6 +139,7 @@ function doRender(continuation) { }); } +var TELEPORT_PAUSE = 500; function maybePrepareCache(continuation) { var prepareCache = Window.confirm("Prepare cache?\n\n\ Should we start with all and only those items cached that are encountered when visiting:\n" + cachePlaces.join(', ') + "\n\ @@ -151,8 +147,6 @@ If 'yes', cache will be cleared and we will visit these two, with a turn in each You would want to say 'no' (and make other preparations) if you were testing these places."); if (prepareCache) { - location.handleLookupString(emptyishPlace); - Window.alert("Please do menu Edit->Reload Content (Clears all caches) and THEN press 'ok'."); function loadNext() { var place = cachePlaces.shift(); doLoad(place, function (prepTime) { @@ -164,9 +158,12 @@ You would want to say 'no' (and make other preparations) if you were testing the } }); } - loadNext(); + location.handleLookupString(cachePlaces[cachePlaces.length - 1]); + Menu.triggerOption("Reload Content (Clears all caches)"); + Script.setTimeout(loadNext, TELEPORT_PAUSE); } else { - continuation(); + location.handleLookupString(isNowIn(cachePlaces[0]) ? cachePlaces[1] : cachePlaces[0]); + Script.setTimeout(continuation, TELEPORT_PAUSE); } } From 3242a7884ca8584b797d9caf1818b80bd90f14f7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 4 Oct 2016 11:02:14 +1300 Subject: [PATCH 090/300] Apply fix from merge conflict to moved code --- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 49 +++++++++++---------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 164abbd671..1aa4419599 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -988,31 +988,34 @@ static bool equals(const QByteArray& byteArray, const uint8_t* ptr) { } void OffscreenQmlSurface::synthesizeKeyPress(QString key) { - auto utf8Key = key.toUtf8(); + auto eventHandler = getEventHandler(); + if (eventHandler) { + auto utf8Key = key.toUtf8(); - int scanCode = (int)utf8Key[0]; - QString keyString = key; - if (equals(utf8Key, UPWARDS_WHITE_ARROW_FROM_BAR) || equals(utf8Key, ASTERISIM) || - equals(utf8Key, (uint8_t*)PUNCTUATION_STRING) || equals(utf8Key, (uint8_t*)ALPHABET_STRING)) { - return; // ignore - } else if (equals(utf8Key, LEFT_ARROW)) { - scanCode = Qt::Key_Backspace; - keyString = "\x08"; - } else if (equals(utf8Key, RETURN_SYMBOL)) { - scanCode = Qt::Key_Return; - keyString = "\x0d"; - } else if (equals(utf8Key, LEFTWARD_WHITE_ARROW)) { - scanCode = Qt::Key_Left; - keyString = ""; - } else if (equals(utf8Key, RIGHTWARD_WHITE_ARROW)) { - scanCode = Qt::Key_Right; - keyString = ""; + int scanCode = (int)utf8Key[0]; + QString keyString = key; + if (equals(utf8Key, UPWARDS_WHITE_ARROW_FROM_BAR) || equals(utf8Key, ASTERISIM) || + equals(utf8Key, (uint8_t*)PUNCTUATION_STRING) || equals(utf8Key, (uint8_t*)ALPHABET_STRING)) { + return; // ignore + } else if (equals(utf8Key, LEFT_ARROW)) { + scanCode = Qt::Key_Backspace; + keyString = "\x08"; + } else if (equals(utf8Key, RETURN_SYMBOL)) { + scanCode = Qt::Key_Return; + keyString = "\x0d"; + } else if (equals(utf8Key, LEFTWARD_WHITE_ARROW)) { + scanCode = Qt::Key_Left; + keyString = ""; + } else if (equals(utf8Key, RIGHTWARD_WHITE_ARROW)) { + scanCode = Qt::Key_Right; + keyString = ""; + } + + QKeyEvent* pressEvent = new QKeyEvent(QEvent::KeyPress, scanCode, Qt::NoModifier, keyString); + QKeyEvent* releaseEvent = new QKeyEvent(QEvent::KeyRelease, scanCode, Qt::NoModifier, keyString); + QCoreApplication::postEvent(eventHandler, pressEvent); + QCoreApplication::postEvent(eventHandler, releaseEvent); } - - QKeyEvent* pressEvent = new QKeyEvent(QEvent::KeyPress, scanCode, Qt::NoModifier, keyString); - QKeyEvent* releaseEvent = new QKeyEvent(QEvent::KeyRelease, scanCode, Qt::NoModifier, keyString); - QCoreApplication::postEvent(getEventHandler(), pressEvent); - QCoreApplication::postEvent(getEventHandler(), releaseEvent); } void OffscreenQmlSurface::setKeyboardRaised(QObject* object, bool raised, bool numeric) { From 3d75188500d7d91a7800269a05e7a882cc91dda1 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 4 Oct 2016 11:03:41 +1300 Subject: [PATCH 091/300] Untabify --- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 1aa4419599..afdf9aa5a9 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -40,16 +40,16 @@ QString fixupHifiUrl(const QString& urlString) { - static const QString ACCESS_TOKEN_PARAMETER = "access_token"; - static const QString ALLOWED_HOST = "metaverse.highfidelity.com"; + static const QString ACCESS_TOKEN_PARAMETER = "access_token"; + static const QString ALLOWED_HOST = "metaverse.highfidelity.com"; QUrl url(urlString); - QUrlQuery query(url); - if (url.host() == ALLOWED_HOST && query.allQueryItemValues(ACCESS_TOKEN_PARAMETER).empty()) { - auto accountManager = DependencyManager::get(); - query.addQueryItem(ACCESS_TOKEN_PARAMETER, accountManager->getAccountInfo().getAccessToken().token); - url.setQuery(query.query()); - return url.toString(); - } + QUrlQuery query(url); + if (url.host() == ALLOWED_HOST && query.allQueryItemValues(ACCESS_TOKEN_PARAMETER).empty()) { + auto accountManager = DependencyManager::get(); + query.addQueryItem(ACCESS_TOKEN_PARAMETER, accountManager->getAccountInfo().getAccessToken().token); + url.setQuery(query.query()); + return url.toString(); + } return urlString; } From dafb5c5bab913ae1b1ad773fe18372ec7cb87109 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 15:11:56 -0700 Subject: [PATCH 092/300] Add processor information to launch user activity event --- interface/src/Application.cpp | 13 ++- libraries/shared/src/SharedUtil.cpp | 146 +++++++++++++++++++++++++++- libraries/shared/src/SharedUtil.h | 11 +++ 3 files changed, 165 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ec452cb260..c170e38a27 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -815,7 +815,8 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : { "gl_version", glContextData["version"] }, { "gl_vender", glContextData["vendor"] }, { "gl_sl_version", glContextData["slVersion"] }, - { "gl_renderer", glContextData["renderer"] } + { "gl_renderer", glContextData["renderer"] }, + { "ideal_thread_count", QThread::idealThreadCount() } }; auto macVersion = QSysInfo::macVersion(); if (macVersion != QSysInfo::MV_None) { @@ -825,6 +826,16 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : if (windowsVersion != QSysInfo::WV_None) { properties["os_win_version"] = QSysInfo::windowsVersion(); } + + ProcessorInfo procInfo; + if (getProcessorInfo(procInfo)) { + properties["processor_core_count"] = procInfo.numProcessorCores; + properties["logical_processor_count"] = procInfo.numLogicalProcessors; + properties["processor_l1_cache_count"] = procInfo.numProcessorCachesL1; + properties["processor_l2_cache_count"] = procInfo.numProcessorCachesL2; + properties["processor_l3_cache_count"] = procInfo.numProcessorCachesL3; + } + UserActivityLogger::getInstance().logAction("launch", properties); _connectionMonitor.init(); diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index bb5d326851..efb032ce75 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -22,11 +22,8 @@ #include -#ifdef _WIN32 -#include -#endif - #ifdef Q_OS_WIN +#include #include "CPUIdent.h" #include #endif @@ -877,3 +874,144 @@ bool getMemoryInfo(MemoryInfo& info) { return false; } + +// Largely taken from: https://msdn.microsoft.com/en-us/library/windows/desktop/ms683194(v=vs.85).aspx + +#ifdef Q_OS_WIN +using LPFN_GLPI = BOOL(WINAPI*)( + PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, + PDWORD); + +DWORD CountSetBits(ULONG_PTR bitMask) +{ + DWORD LSHIFT = sizeof(ULONG_PTR) * 8 - 1; + DWORD bitSetCount = 0; + ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT; + DWORD i; + + for (i = 0; i <= LSHIFT; ++i) + { + bitSetCount += ((bitMask & bitTest) ? 1 : 0); + bitTest /= 2; + } + + return bitSetCount; +} +#endif + +bool getProcessorInfo(ProcessorInfo& info) { + +#ifdef Q_OS_WIN + LPFN_GLPI glpi; + bool done = false; + PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL; + PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL; + DWORD returnLength = 0; + DWORD logicalProcessorCount = 0; + DWORD numaNodeCount = 0; + DWORD processorCoreCount = 0; + DWORD processorL1CacheCount = 0; + DWORD processorL2CacheCount = 0; + DWORD processorL3CacheCount = 0; + DWORD processorPackageCount = 0; + DWORD byteOffset = 0; + PCACHE_DESCRIPTOR Cache; + + glpi = (LPFN_GLPI)GetProcAddress( + GetModuleHandle(TEXT("kernel32")), + "GetLogicalProcessorInformation"); + if (nullptr == glpi) { + qDebug() << "GetLogicalProcessorInformation is not supported."; + return false; + } + + while (!done) { + DWORD rc = glpi(buffer, &returnLength); + + if (FALSE == rc) { + if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { + if (buffer) { + free(buffer); + } + + buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc( + returnLength); + + if (NULL == buffer) { + qDebug() << "Error: Allocation failure"; + return (2); + } + } else { + qDebug() << "Error " << GetLastError(); + return (3); + } + } else { + done = true; + } + } + + ptr = buffer; + + while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) { + switch (ptr->Relationship) { + case RelationNumaNode: + // Non-NUMA systems report a single record of this type. + numaNodeCount++; + break; + + case RelationProcessorCore: + processorCoreCount++; + + // A hyperthreaded core supplies more than one logical processor. + logicalProcessorCount += CountSetBits(ptr->ProcessorMask); + break; + + case RelationCache: + // Cache data is in ptr->Cache, one CACHE_DESCRIPTOR structure for each cache. + Cache = &ptr->Cache; + if (Cache->Level == 1) { + processorL1CacheCount++; + } else if (Cache->Level == 2) { + processorL2CacheCount++; + } else if (Cache->Level == 3) { + processorL3CacheCount++; + } + break; + + case RelationProcessorPackage: + // Logical processors share a physical package. + processorPackageCount++; + break; + + default: + qDebug() << "\nError: Unsupported LOGICAL_PROCESSOR_RELATIONSHIP value.\n"; + break; + } + byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); + ptr++; + } + + qDebug() << "GetLogicalProcessorInformation results:"; + qDebug() << "Number of NUMA nodes:" << numaNodeCount; + qDebug() << "Number of physical processor packages:" << processorPackageCount; + qDebug() << "Number of processor cores:" << processorCoreCount; + qDebug() << "Number of logical processors:" << logicalProcessorCount; + qDebug() << "Number of processor L1/L2/L3 caches:" + << processorL1CacheCount + << "/" << processorL2CacheCount + << "/" << processorL3CacheCount; + + info.numPhysicalProcessorPackages = processorPackageCount; + info.numProcessorCores = processorCoreCount; + info.numLogicalProcessors = logicalProcessorCount; + info.numProcessorCachesL1 = processorL1CacheCount; + info.numProcessorCachesL2 = processorL2CacheCount; + info.numProcessorCachesL3 = processorL3CacheCount; + + free(buffer); + + return true; +#endif + + return false; +} \ No newline at end of file diff --git a/libraries/shared/src/SharedUtil.h b/libraries/shared/src/SharedUtil.h index f3e5625484..863c4d6dc5 100644 --- a/libraries/shared/src/SharedUtil.h +++ b/libraries/shared/src/SharedUtil.h @@ -214,4 +214,15 @@ struct MemoryInfo { bool getMemoryInfo(MemoryInfo& info); +struct ProcessorInfo { + int32_t numPhysicalProcessorPackages; + int32_t numProcessorCores; + int32_t numLogicalProcessors; + int32_t numProcessorCachesL1; + int32_t numProcessorCachesL2; + int32_t numProcessorCachesL3; +}; + +bool getProcessorInfo(ProcessorInfo& info); + #endif // hifi_SharedUtil_h From b5eb943c1d906017045024c899b8d9309d9694de Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 15:12:14 -0700 Subject: [PATCH 093/300] Add hmd stats to stats event --- interface/src/Application.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c170e38a27..ec6eed1c05 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1134,6 +1134,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : auto displayPlugin = qApp->getActiveDisplayPlugin(); properties["fps"] = _frameCounter.rate(); + properties["target_frame_rate"] = getTargetFrameRate(); properties["present_rate"] = displayPlugin->presentRate(); properties["new_frame_present_rate"] = displayPlugin->newFramePresentRate(); properties["dropped_frame_rate"] = displayPlugin->droppedFrameRate(); @@ -1175,6 +1176,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : properties["deleted_entity_cnt"] = entityActivityTracking.deletedEntityCount; properties["edited_entity_cnt"] = entityActivityTracking.editedEntityCount; + properties["active_display_plugin"] = getActiveDisplayPlugin()->getName(); + properties["using_hmd"] = isHMDMode(); + auto hmdHeadPose = getHMDSensorPose(); properties["hmd_head_pose_changed"] = isHMDMode() && (hmdHeadPose != lastHMDHeadPose); lastHMDHeadPose = hmdHeadPose; From e213a478141197aae5218d381eabbba5d52332ce Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 15:19:03 -0700 Subject: [PATCH 094/300] Fix incorrect return values in getProcessorInfo --- libraries/shared/src/SharedUtil.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index efb032ce75..c440acdea2 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -939,11 +939,11 @@ bool getProcessorInfo(ProcessorInfo& info) { if (NULL == buffer) { qDebug() << "Error: Allocation failure"; - return (2); + return false; } } else { qDebug() << "Error " << GetLastError(); - return (3); + return false; } } else { done = true; From 0b2def6013156cc8fdf23acbfe02df63a0f42004 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 15:23:39 -0700 Subject: [PATCH 095/300] Fix style error --- libraries/shared/src/SharedUtil.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index c440acdea2..287c15e3a2 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -889,8 +889,7 @@ DWORD CountSetBits(ULONG_PTR bitMask) ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT; DWORD i; - for (i = 0; i <= LSHIFT; ++i) - { + for (i = 0; i <= LSHIFT; ++i) { bitSetCount += ((bitMask & bitTest) ? 1 : 0); bitTest /= 2; } From 327fcc970b85e7acecc88527fb6d395269a9ef16 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 3 Oct 2016 15:15:58 -0700 Subject: [PATCH 096/300] Remove frame lag from near grabbed physical objects. In the game loop, physics occurs before avatar update. Before this PR, when the avatar is moved during avatar update, near grabbed objects will not pick up this move until one frame later, when the physics is run on the next update. After this PR, near grabbed objects are adjusted to reflect any position or rotation change that occurred during the avatar update. --- interface/src/avatar/AvatarActionHold.cpp | 52 ++++++++++++++++++++++- interface/src/avatar/AvatarActionHold.h | 3 ++ interface/src/avatar/MyAvatar.cpp | 30 ++++++++++++- interface/src/avatar/MyAvatar.h | 9 ++++ 4 files changed, 91 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index 8b8f8e8c2e..5f41bf40d4 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -25,14 +25,25 @@ AvatarActionHold::AvatarActionHold(const QUuid& id, EntityItemPointer ownerEntit { _type = ACTION_TYPE_HOLD; _measuredLinearVelocities.resize(AvatarActionHold::velocitySmoothFrames); + + auto myAvatar = DependencyManager::get()->getMyAvatar(); + if (myAvatar) { + myAvatar->addHoldAction(this); + } + #if WANT_DEBUG - qDebug() << "AvatarActionHold::AvatarActionHold"; + qDebug() << "AvatarActionHold::AvatarActionHold" << (void*)this; #endif } AvatarActionHold::~AvatarActionHold() { + auto myAvatar = DependencyManager::get()->getMyAvatar(); + if (myAvatar) { + myAvatar->removeHoldAction(this); + } + #if WANT_DEBUG - qDebug() << "AvatarActionHold::~AvatarActionHold"; + qDebug() << "AvatarActionHold::~AvatarActionHold" << (void*)this; #endif } @@ -460,3 +471,40 @@ void AvatarActionHold::deserialize(QByteArray serializedArguments) { forceBodyNonStatic(); } + +void AvatarActionHold::lateAvatarUpdate(const AnimPose& prePhysicsRoomPose, const AnimPose& postAvatarUpdateRoomPose) { + auto ownerEntity = _ownerEntity.lock(); + if (!ownerEntity) { + return; + } + void* physicsInfo = ownerEntity->getPhysicsInfo(); + if (!physicsInfo) { + return; + } + ObjectMotionState* motionState = static_cast(physicsInfo); + btRigidBody* rigidBody = motionState ? motionState->getRigidBody() : nullptr; + if (!rigidBody) { + return; + } + auto avatarManager = DependencyManager::get(); + auto holdingAvatar = std::static_pointer_cast(avatarManager->getAvatarBySessionID(_holderID)); + if (!holdingAvatar || !holdingAvatar->isMyAvatar()) { + return; + } + + btTransform worldTrans = rigidBody->getWorldTransform(); + AnimPose worldBodyPose(glm::vec3(1), bulletToGLM(worldTrans.getRotation()), bulletToGLM(worldTrans.getOrigin())); + + // transform the body transform into sensor space with the prePhysics sensor-to-world matrix. + // then transform it back into world uisng the postAvatarUpdate sensor-to-world matrix. + AnimPose newWorldBodyPose = postAvatarUpdateRoomPose * prePhysicsRoomPose.inverse() * worldBodyPose; + + worldTrans.setOrigin(glmToBullet(newWorldBodyPose.trans)); + worldTrans.setRotation(glmToBullet(newWorldBodyPose.rot)); + rigidBody->setWorldTransform(worldTrans); + + bool positionSuccess; + ownerEntity->setPosition(bulletToGLM(worldTrans.getOrigin()) + ObjectMotionState::getWorldOffset(), positionSuccess, false); + bool orientationSuccess; + ownerEntity->setOrientation(bulletToGLM(worldTrans.getRotation()), orientationSuccess, false); +} diff --git a/interface/src/avatar/AvatarActionHold.h b/interface/src/avatar/AvatarActionHold.h index bfa392172d..f0b42111ed 100644 --- a/interface/src/avatar/AvatarActionHold.h +++ b/interface/src/avatar/AvatarActionHold.h @@ -15,6 +15,7 @@ #include #include +#include #include #include "avatar/MyAvatar.h" @@ -41,6 +42,8 @@ public: virtual void prepareForPhysicsSimulation() override; + void lateAvatarUpdate(const AnimPose& prePhysicsRoomPose, const AnimPose& postAvatarUpdateRoomPose); + private: void doKinematicUpdate(float deltaTimeStep); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 24dbc62318..20c4f41568 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -45,6 +45,7 @@ #include "Application.h" #include "devices/Faceshift.h" #include "AvatarManager.h" +#include "AvatarActionHold.h" #include "Menu.h" #include "MyAvatar.h" #include "Physics.h" @@ -1309,6 +1310,8 @@ void MyAvatar::prepareForPhysicsSimulation() { } else { _follow.deactivate(); } + + _prePhysicsRoomPose = AnimPose(_sensorToWorldMatrix); } void MyAvatar::harvestResultsFromPhysicsSimulation(float deltaTime) { @@ -1549,8 +1552,11 @@ void MyAvatar::postUpdate(float deltaTime) { DebugDraw::getInstance().updateMyAvatarPos(getPosition()); DebugDraw::getInstance().updateMyAvatarRot(getOrientation()); -} + AnimPose postUpdateRoomPose(_sensorToWorldMatrix); + + updateHoldActions(_prePhysicsRoomPose, postUpdateRoomPose); +} void MyAvatar::preDisplaySide(RenderArgs* renderArgs) { @@ -2257,3 +2263,25 @@ glm::vec3 MyAvatar::getAbsoluteJointTranslationInObjectFrame(int index) const { } } } + +// thread-safe +void MyAvatar::addHoldAction(AvatarActionHold* holdAction) { + std::lock_guard guard(_holdActionsMutex); + _holdActions.push_back(holdAction); +} + +// thread-safe +void MyAvatar::removeHoldAction(AvatarActionHold* holdAction) { + std::lock_guard guard(_holdActionsMutex); + auto iter = std::find(std::begin(_holdActions), std::end(_holdActions), holdAction); + if (iter != std::end(_holdActions)) { + _holdActions.erase(iter); + } +} + +void MyAvatar::updateHoldActions(const AnimPose& prePhysicsPose, const AnimPose& postUpdatePose) { + std::lock_guard guard(_holdActionsMutex); + for (auto& holdAction : _holdActions) { + holdAction->lateAvatarUpdate(prePhysicsPose, postUpdatePose); + } +} diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index c4ffc08cbc..71f185c6ed 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -26,6 +26,7 @@ #include "MyCharacterController.h" #include +class AvatarActionHold; class ModelItemID; enum DriveKeys { @@ -277,6 +278,10 @@ public: virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override; virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const override; + void addHoldAction(AvatarActionHold* holdAction); // thread-safe + void removeHoldAction(AvatarActionHold* holdAction); // thread-safe + void updateHoldActions(const AnimPose& prePhysicsPose, const AnimPose& postUpdatePose); + public slots: void increaseSize(); void decreaseSize(); @@ -488,6 +493,10 @@ private: bool _hmdLeanRecenterEnabled = true; + AnimPose _prePhysicsRoomPose; + std::mutex _holdActionsMutex; + std::vector _holdActions; + float AVATAR_MOVEMENT_ENERGY_CONSTANT { 0.001f }; float AUDIO_ENERGY_CONSTANT { 0.000001f }; float MAX_AVATAR_MOVEMENT_PER_FRAME { 30.0f }; From ca3572f991660352ebd14d467513f03902322b88 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 3 Oct 2016 14:13:10 -0700 Subject: [PATCH 097/300] Support external GL textures with proper fencing --- interface/src/ui/ApplicationOverlay.cpp | 43 ++++---- interface/src/ui/ApplicationOverlay.h | 2 +- interface/src/ui/overlays/Web3DOverlay.cpp | 22 +++-- interface/src/ui/overlays/Web3DOverlay.h | 2 +- .../src/RenderableWebEntityItem.cpp | 20 ++-- .../src/RenderableWebEntityItem.h | 4 +- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 99 ++++++++++++++++--- libraries/gl/src/gl/OffscreenQmlSurface.h | 12 ++- libraries/gpu-gl/src/gpu/gl/GLBackend.cpp | 28 ++++-- libraries/gpu-gl/src/gpu/gl/GLBackend.h | 4 +- libraries/gpu-gl/src/gpu/gl/GLTexture.cpp | 35 ++++++- libraries/gpu-gl/src/gpu/gl/GLTexture.h | 39 ++++++++ libraries/gpu-gl/src/gpu/gl41/GL41Backend.h | 1 + .../src/gpu/gl41/GL41BackendTexture.cpp | 8 +- libraries/gpu-gl/src/gpu/gl45/GL45Backend.h | 1 + .../src/gpu/gl45/GL45BackendTexture.cpp | 9 +- libraries/gpu/src/gpu/Batch.cpp | 19 ++-- libraries/gpu/src/gpu/Batch.h | 5 - libraries/gpu/src/gpu/Texture.cpp | 23 +++++ libraries/gpu/src/gpu/Texture.h | 21 +++- 20 files changed, 308 insertions(+), 89 deletions(-) diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 197fb5b58d..f4937c4459 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -40,15 +40,6 @@ ApplicationOverlay::ApplicationOverlay() auto geometryCache = DependencyManager::get(); _domainStatusBorder = geometryCache->allocateID(); _magnifierBorder = geometryCache->allocateID(); - - // Once we move UI rendering and screen rendering to different - // threads, we need to use a sync object to deteremine when - // the current UI texture is no longer being read from, and only - // then release it back to the UI for re-use - auto offscreenUi = DependencyManager::get(); - connect(offscreenUi.data(), &OffscreenUi::textureUpdated, this, [&](GLuint textureId) { - _uiTexture = textureId; - }); } ApplicationOverlay::~ApplicationOverlay() { @@ -96,18 +87,32 @@ void ApplicationOverlay::renderOverlay(RenderArgs* renderArgs) { void ApplicationOverlay::renderQmlUi(RenderArgs* renderArgs) { PROFILE_RANGE(__FUNCTION__); - if (_uiTexture) { - gpu::Batch& batch = *renderArgs->_batch; - auto geometryCache = DependencyManager::get(); - geometryCache->useSimpleDrawPipeline(batch); - batch.setProjectionTransform(mat4()); - batch.setModelTransform(Transform()); - batch.resetViewTransform(); - batch._glActiveBindTexture(GL_TEXTURE0, GL_TEXTURE_2D, _uiTexture); - - geometryCache->renderUnitQuad(batch, glm::vec4(1)); + if (!_uiTexture) { + _uiTexture = gpu::TexturePointer(gpu::Texture::createExternal2D([](uint32_t recycleTexture, void* recycleFence){ + DependencyManager::get()->releaseTexture({ recycleTexture, recycleFence }); + })); + _uiTexture->setSource(__FUNCTION__); } + // Once we move UI rendering and screen rendering to different + // threads, we need to use a sync object to deteremine when + // the current UI texture is no longer being read from, and only + // then release it back to the UI for re-use + auto offscreenUi = DependencyManager::get(); + + OffscreenQmlSurface::TextureAndFence newTextureAndFence; + bool newTextureAvailable = offscreenUi->fetchTexture(newTextureAndFence); + if (newTextureAvailable) { + _uiTexture->setExternalTexture(newTextureAndFence.first, newTextureAndFence.second); + } + auto geometryCache = DependencyManager::get(); + gpu::Batch& batch = *renderArgs->_batch; + geometryCache->useSimpleDrawPipeline(batch); + batch.setProjectionTransform(mat4()); + batch.setModelTransform(Transform()); + batch.resetViewTransform(); + batch.setResourceTexture(0, _uiTexture); + geometryCache->renderUnitQuad(batch, glm::vec4(1)); } void ApplicationOverlay::renderAudioScope(RenderArgs* renderArgs) { diff --git a/interface/src/ui/ApplicationOverlay.h b/interface/src/ui/ApplicationOverlay.h index b7a0529f92..d20b569457 100644 --- a/interface/src/ui/ApplicationOverlay.h +++ b/interface/src/ui/ApplicationOverlay.h @@ -40,13 +40,13 @@ private: float _alpha{ 1.0f }; float _trailingAudioLoudness{ 0.0f }; - uint32_t _uiTexture{ 0 }; int _domainStatusBorder; int _magnifierBorder; ivec2 _previousBorderSize{ -1 }; + gpu::TexturePointer _uiTexture; gpu::TexturePointer _overlayDepthTexture; gpu::TexturePointer _overlayColorTexture; gpu::FramebufferPointer _overlayFramebuffer; diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 46fc2dfc36..8f213e7740 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -80,9 +80,6 @@ void Web3DOverlay::render(RenderArgs* args) { _webSurface->resume(); _webSurface->getRootItem()->setProperty("url", _url); _webSurface->resize(QSize(_resolution.x, _resolution.y)); - _connection = QObject::connect(_webSurface, &OffscreenQmlSurface::textureUpdated, [&](GLuint textureId) { - _texture = textureId; - }); currentContext->makeCurrent(currentSurface); } @@ -97,14 +94,21 @@ void Web3DOverlay::render(RenderArgs* args) { transform.postScale(vec3(getDimensions(), 1.0f)); } - Q_ASSERT(args->_batch); - gpu::Batch& batch = *args->_batch; - if (_texture) { - batch._glActiveBindTexture(GL_TEXTURE0, GL_TEXTURE_2D, _texture); - } else { - batch.setResourceTexture(0, DependencyManager::get()->getWhiteTexture()); + if (!_texture) { + _texture = gpu::TexturePointer(gpu::Texture::createExternal2D([this](uint32_t recycleTexture, void* recycleFence) { + _webSurface->releaseTexture({ recycleTexture, recycleFence }); + })); + _texture->setSource(__FUNCTION__); + } + OffscreenQmlSurface::TextureAndFence newTextureAndFence; + bool newTextureAvailable = _webSurface->fetchTexture(newTextureAndFence); + if (newTextureAvailable) { + _texture->setExternalTexture(newTextureAndFence.first, newTextureAndFence.second); } + Q_ASSERT(args->_batch); + gpu::Batch& batch = *args->_batch; + batch.setResourceTexture(0, _texture); batch.setModelTransform(transform); auto geometryCache = DependencyManager::get(); if (color.a < OPAQUE_ALPHA_THRESHOLD) { diff --git a/interface/src/ui/overlays/Web3DOverlay.h b/interface/src/ui/overlays/Web3DOverlay.h index a828626715..0bb9e5e030 100644 --- a/interface/src/ui/overlays/Web3DOverlay.h +++ b/interface/src/ui/overlays/Web3DOverlay.h @@ -43,7 +43,7 @@ public: private: OffscreenQmlSurface* _webSurface{ nullptr }; QMetaObject::Connection _connection; - uint32_t _texture{ 0 }; + gpu::TexturePointer _texture; QString _url; float _dpi; vec2 _resolution{ 640, 480 }; diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index 86bce87ba2..3c339b7b7d 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -140,9 +140,6 @@ bool RenderableWebEntityItem::buildWebSurface(EntityTreeRenderer* renderer) { _webSurface->getRootItem()->setProperty("url", _sourceUrl); _webSurface->getRootContext()->setContextProperty("desktop", QVariant()); _webSurface->getRootContext()->setContextProperty("webEntity", _webEntityAPIHelper); - _connection = QObject::connect(_webSurface, &OffscreenQmlSurface::textureUpdated, [&](GLuint textureId) { - _texture = textureId; - }); // Restore the original GL context currentContext->makeCurrent(currentSurface); @@ -217,20 +214,31 @@ void RenderableWebEntityItem::render(RenderArgs* args) { // without worrying about excessive overhead. _webSurface->resize(QSize(windowSize.x, windowSize.y)); + if (!_texture) { + _texture = gpu::TexturePointer(gpu::Texture::createExternal2D([this](uint32_t recycleTexture, void* recycleFence) { + _webSurface->releaseTexture({ recycleTexture, recycleFence }); + })); + _texture->setSource(__FUNCTION__); + } + OffscreenQmlSurface::TextureAndFence newTextureAndFence; + bool newTextureAvailable = _webSurface->fetchTexture(newTextureAndFence); + if (newTextureAvailable) { + _texture->setExternalTexture(newTextureAndFence.first, newTextureAndFence.second); + } + PerformanceTimer perfTimer("RenderableWebEntityItem::render"); Q_ASSERT(getType() == EntityTypes::Web); static const glm::vec2 texMin(0.0f), texMax(1.0f), topLeft(-0.5f), bottomRight(0.5f); Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; + bool success; batch.setModelTransform(getTransformToCenter(success)); if (!success) { return; } - if (_texture) { - batch._glActiveBindTexture(GL_TEXTURE0, GL_TEXTURE_2D, _texture); - } + batch.setResourceTexture(0, _texture); float fadeRatio = _isFading ? Interpolate::calculateFadeRatio(_fadeStartTime) : 1.0f; diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index 47808c4262..ea9ddd0c12 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -80,8 +80,8 @@ private: OffscreenQmlSurface* _webSurface{ nullptr }; QMetaObject::Connection _connection; - uint32_t _texture{ 0 }; - ivec2 _lastPress{ INT_MIN }; + gpu::TexturePointer _texture; + ivec2 _lastPress { INT_MIN }; bool _pressed{ false }; QTouchEvent _lastTouchEvent { QEvent::TouchUpdate }; uint64_t _lastRenderTime{ 0 }; diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index d1c884f264..797f297488 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -34,7 +34,6 @@ #include #include "OffscreenGLCanvas.h" -#include "GLEscrow.h" #include "GLHelpers.h" #include "GLLogging.h" @@ -265,6 +264,14 @@ private: // Helper methods void setupFbo(); bool allowNewFrame(uint8_t fps); + bool fetchTexture(OffscreenQmlSurface::TextureAndFence& textureAndFence); + void releaseTexture(const OffscreenQmlSurface::TextureAndFence& textureAndFence); + + // Texture management + std::mutex _textureMutex; + GLuint _latestTexture { 0 }; + GLsync _latestTextureFence { 0 }; + std::list _returnedTextures; // Rendering members OffscreenGLCanvas _canvas; @@ -274,7 +281,6 @@ private: GLuint _fbo { 0 }; GLuint _depthStencil { 0 }; RawTextureRecycler _textures { true }; - GLTextureEscrow _escrow; uint64_t _lastRenderTime{ 0 }; uvec2 _size{ 1920, 1080 }; @@ -406,9 +412,6 @@ void OffscreenQmlRenderThread::init() { _renderControl->initialize(_canvas.getContext()); setupFbo(); - _escrow.setRecycler([this](GLuint texture){ - _textures.recycleTexture(texture); - }); } void OffscreenQmlRenderThread::cleanup() { @@ -485,27 +488,93 @@ void OffscreenQmlRenderThread::render() { _quickWindow->setRenderTarget(_fbo, QSize(_size.x, _size.y)); + // Clear out any pending textures to be returned + { + std::list returnedTextures; + { + std::unique_lock lock(_textureMutex); + returnedTextures.swap(_returnedTextures); + } + if (!returnedTextures.empty()) { + for (const auto& textureAndFence : returnedTextures) { + GLsync fence = static_cast(textureAndFence.second); + if (fence) { + glWaitSync(fence, 0, GL_TIMEOUT_IGNORED); + glDeleteSync(fence); + } + _textures.recycleTexture(textureAndFence.first); + } + } + } + try { GLuint texture = _textures.getNextTexture(); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo); glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0); - PROFILE_RANGE("qml_render->rendercontrol") - _renderControl->render(); - + PROFILE_RANGE("qml_render->rendercontrol") + _renderControl->render(); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); glBindTexture(GL_TEXTURE_2D, texture); glGenerateMipmap(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); + { + std::unique_lock lock(_textureMutex); + // If the most recent texture was unused, we can directly recycle it + if (_latestTextureFence) { + } + if (_latestTexture) { + _textures.recycleTexture(_latestTexture); + glDeleteSync(_latestTextureFence); + _latestTexture = 0; + _latestTextureFence = 0; + } + + _latestTextureFence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + _latestTexture = texture; + // Fence will be used in another thread / context, so a flush is required + glFlush(); + } + _quickWindow->resetOpenGLState(); - _escrow.submit(texture); _lastRenderTime = usecTimestampNow(); } catch (std::runtime_error& error) { qWarning() << "Failed to render QML: " << error.what(); } } +bool OffscreenQmlRenderThread::fetchTexture(OffscreenQmlSurface::TextureAndFence& textureAndFence) { + textureAndFence = { 0, 0 }; + + std::unique_lock lock(_textureMutex); + if (0 == _latestTexture) { + return false; + } + + // Ensure writes to the latest texture are complete before before returning it for reading + Q_ASSERT(0 != _latestTextureFence); + textureAndFence = { _latestTexture, _latestTextureFence }; + _latestTextureFence = 0; + _latestTexture = 0; + return true; +} + +void OffscreenQmlRenderThread::releaseTexture(const OffscreenQmlSurface::TextureAndFence& textureAndFence) { + std::unique_lock lock(_textureMutex); + _returnedTextures.push_back(textureAndFence); +} + bool OffscreenQmlRenderThread::allowNewFrame(uint8_t fps) { + // If we already have a pending texture, don't render another one + // i.e. don't render faster than the consumer context, since it wastes + // GPU cycles on producing output that will never be seen + { + std::unique_lock lock(_textureMutex); + if (0 != _latestTexture) { + return false; + } + } + auto minRenderInterval = USECS_PER_SECOND / fps; auto lastInterval = usecTimestampNow() - _lastRenderTime; return (lastInterval > minRenderInterval); @@ -726,13 +795,18 @@ void OffscreenQmlSurface::updateQuick() { // Lock the GUI size while syncing QMutexLocker locker(&(_renderer->_mutex)); _renderer->_queue.add(RENDER); + // FIXME need to find a better way to handle the render lockout than this locking of the main thread _renderer->_waitCondition.wait(&(_renderer->_mutex)); _render = false; } +} - if (_renderer->_escrow.fetchSignaledAndRelease(_currentTexture)) { - emit textureUpdated(_currentTexture); - } +bool OffscreenQmlSurface::fetchTexture(TextureAndFence& texture) { + return _renderer->fetchTexture(texture); +} + +void OffscreenQmlSurface::releaseTexture(const TextureAndFence& texture) { + _renderer->releaseTexture(texture); } QPointF OffscreenQmlSurface::mapWindowToUi(const QPointF& sourcePosition, QObject* sourceObject) { @@ -752,7 +826,6 @@ QPointF OffscreenQmlSurface::mapToVirtualScreen(const QPointF& originalPoint, QO return _mouseTranslator(originalPoint); } - /////////////////////////////////////////////////////// // // Event handling customization diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index a9a77f2941..fa2346dd2f 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -71,8 +71,17 @@ public: QPointF mapToVirtualScreen(const QPointF& originalPoint, QObject* originalWidget); bool eventFilter(QObject* originalDestination, QEvent* event) override; + using TextureAndFence = std::pair; + // Checks to see if a new texture is available. If one is, the function returns true and + // textureAndFence will be populated with the texture ID and a fence which will be signalled + // when the texture is safe to read. + // Returns false if no new texture is available + bool fetchTexture(TextureAndFence& textureAndFence); + // Release a previously acquired texture, along with a fence which indicates when reads from the + // texture have completed. + void releaseTexture(const TextureAndFence& textureAndFence); + signals: - void textureUpdated(unsigned int texture); void focusObjectChanged(QObject* newFocus); void focusTextChanged(bool focusText); @@ -100,7 +109,6 @@ private: QQmlComponent* _qmlComponent{ nullptr }; QQuickItem* _rootItem{ nullptr }; QTimer _updateTimer; - uint32_t _currentTexture{ 0 }; bool _render{ false }; bool _polish{ true }; bool _paused{ true }; diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp index f070dfe637..c082c00609 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.cpp @@ -119,8 +119,6 @@ GLBackend::CommandCall GLBackend::_commandCalls[Batch::NUM_COMMANDS] = (&::gpu::gl::GLBackend::do_startNamedCall), (&::gpu::gl::GLBackend::do_stopNamedCall), - (&::gpu::gl::GLBackend::do_glActiveBindTexture), - (&::gpu::gl::GLBackend::do_glUniform1i), (&::gpu::gl::GLBackend::do_glUniform1f), (&::gpu::gl::GLBackend::do_glUniform2f), @@ -388,14 +386,6 @@ void GLBackend::do_popProfileRange(const Batch& batch, size_t paramOffset) { // As long as we don;t use several versions of shaders we can avoid this more complex code path // #define GET_UNIFORM_LOCATION(shaderUniformLoc) _pipeline._programShader->getUniformLocation(shaderUniformLoc, isStereo()); #define GET_UNIFORM_LOCATION(shaderUniformLoc) shaderUniformLoc -void GLBackend::do_glActiveBindTexture(const Batch& batch, size_t paramOffset) { - glActiveTexture(batch._params[paramOffset + 2]._uint); - glBindTexture( - GET_UNIFORM_LOCATION(batch._params[paramOffset + 1]._uint), - batch._params[paramOffset + 0]._uint); - - (void)CHECK_GL_ERROR(); -} void GLBackend::do_glUniform1i(const Batch& batch, size_t paramOffset) { if (_pipeline._program == 0) { @@ -568,6 +558,11 @@ void GLBackend::releaseBuffer(GLuint id, Size size) const { _buffersTrash.push_back({ id, size }); } +void GLBackend::releaseExternalTexture(GLuint id, const Texture::ExternalRecycler& recycler) const { + Lock lock(_trashMutex); + _externalTexturesTrash.push_back({ id, recycler }); +} + void GLBackend::releaseTexture(GLuint id, Size size) const { Lock lock(_trashMutex); _texturesTrash.push_back({ id, size }); @@ -662,6 +657,19 @@ void GLBackend::recycle() const { } } + { + std::list> externalTexturesTrash; + { + Lock lock(_trashMutex); + std::swap(_externalTexturesTrash, externalTexturesTrash); + } + for (auto pair : externalTexturesTrash) { + auto fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + pair.second(pair.first, fence); + decrementTextureGPUCount(); + } + } + { std::list programsTrash; { diff --git a/libraries/gpu-gl/src/gpu/gl/GLBackend.h b/libraries/gpu-gl/src/gpu/gl/GLBackend.h index af4851a1b0..f99d34393c 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLBackend.h +++ b/libraries/gpu-gl/src/gpu/gl/GLBackend.h @@ -130,8 +130,6 @@ public: // TODO: As long as we have gl calls explicitely issued from interface // code, we need to be able to record and batch these calls. THe long // term strategy is to get rid of any GL calls in favor of the HIFI GPU API - virtual void do_glActiveBindTexture(const Batch& batch, size_t paramOffset) final; - virtual void do_glUniform1i(const Batch& batch, size_t paramOffset) final; virtual void do_glUniform1f(const Batch& batch, size_t paramOffset) final; virtual void do_glUniform2f(const Batch& batch, size_t paramOffset) final; @@ -170,6 +168,7 @@ public: virtual bool isTextureReady(const TexturePointer& texture); virtual void releaseBuffer(GLuint id, Size size) const; + virtual void releaseExternalTexture(GLuint id, const Texture::ExternalRecycler& recycler) const; virtual void releaseTexture(GLuint id, Size size) const; virtual void releaseFramebuffer(GLuint id) const; virtual void releaseShader(GLuint id) const; @@ -194,6 +193,7 @@ protected: mutable Mutex _trashMutex; mutable std::list> _buffersTrash; mutable std::list> _texturesTrash; + mutable std::list> _externalTexturesTrash; mutable std::list _framebuffersTrash; mutable std::list _shadersTrash; mutable std::list _programsTrash; diff --git a/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp b/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp index 56ff4166ea..b39bc58bac 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp @@ -136,6 +136,7 @@ float GLTexture::getMemoryPressure() { // Create the texture and allocate storage GLTexture::GLTexture(const std::weak_ptr& backend, const Texture& texture, GLuint id, bool transferrable) : GLObject(backend, texture, id), + _external(false), _source(texture.source()), _storageStamp(texture.getStamp()), _target(getGLTextureType(texture)), @@ -152,10 +153,38 @@ GLTexture::GLTexture(const std::weak_ptr& backend, const Texture& tex Backend::setGPUObject(texture, this); } +GLTexture::GLTexture(const std::weak_ptr& backend, const Texture& texture, GLuint id) : + GLObject(backend, texture, id), + _external(true), + _source(texture.source()), + _storageStamp(0), + _target(getGLTextureType(texture)), + _internalFormat(GL_RGBA8), + // FIXME force mips to 0? + _maxMip(texture.maxMip()), + _minMip(texture.minMip()), + _virtualSize(0), + _transferrable(false) +{ + Backend::setGPUObject(texture, this); + + // FIXME Is this necessary? + //withPreservedTexture([this] { + // syncSampler(); + // if (_gpuObject.isAutogenerateMips()) { + // generateMips(); + // } + //}); +} + GLTexture::~GLTexture() { - if (_id) { - auto backend = _backend.lock(); - if (backend) { + auto backend = _backend.lock(); + if (backend) { + if (_external) { + auto recycler = _gpuObject.getExternalRecycler(); + assert(recycler); + backend->releaseExternalTexture(_id, recycler); + } else if (_id) { backend->releaseTexture(_id, _size); } } diff --git a/libraries/gpu-gl/src/gpu/gl/GLTexture.h b/libraries/gpu-gl/src/gpu/gl/GLTexture.h index 4375d0644f..9091a63086 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLTexture.h +++ b/libraries/gpu-gl/src/gpu/gl/GLTexture.h @@ -32,6 +32,42 @@ public: template static GLTextureType* sync(GLBackend& backend, const TexturePointer& texturePointer, bool needTransfer) { const Texture& texture = *texturePointer; + + // Special case external textures + if (texture.getUsage().isExternal()) { + Texture::ExternalUpdates updates = texture.getUpdates(); + if (!updates.empty()) { + Texture::ExternalRecycler recycler = texture.getExternalRecycler(); + Q_ASSERT(recycler); + // Discard any superfluous updates + while (updates.size() > 1) { + const auto& update = updates.front(); + // Superfluous updates will never have been read, but we want to ensure the previous + // writes to them are complete before they're written again, so return them with the + // same fences they arrived with. This can happen on any thread because no GL context + // work is involved + recycler(update.first, update.second); + updates.pop_front(); + } + + // The last texture remaining is the one we'll use to create the GLTexture + const auto& update = updates.front(); + // Check for a fence, and if it exists, inject a wait into the command stream, then destroy the fence + if (update.second) { + GLsync fence = static_cast(update.second); + glWaitSync(fence, 0, GL_TIMEOUT_IGNORED); + glDeleteSync(fence); + } + + // Create the new texture object (replaces any previous texture object) + new GLTextureType(backend.shared_from_this(), texture, update.first); + } + + // Return the texture object (if any) associated with the texture, without extensive logic + // (external textures are + return Backend::getGPUObject(texture); + } + if (!texture.isDefined()) { // NO texture definition yet so let's avoid thinking return nullptr; @@ -110,6 +146,8 @@ public: ~GLTexture(); + // Is this texture generated outside the GPU library? + const bool _external; const GLuint& _texture { _id }; const std::string _source; const Stamp _storageStamp; @@ -159,6 +197,7 @@ protected: std::atomic _syncState { GLSyncState::Idle }; GLTexture(const std::weak_ptr& backend, const Texture& texture, GLuint id, bool transferrable); + GLTexture(const std::weak_ptr& backend, const Texture& texture, GLuint id); void setSyncState(GLSyncState syncState) { _syncState = syncState; } diff --git a/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h b/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h index 5d03997b44..3f1f45624a 100644 --- a/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h +++ b/libraries/gpu-gl/src/gpu/gl41/GL41Backend.h @@ -42,6 +42,7 @@ public: using Parent = GLTexture; GLuint allocate(); public: + GL41Texture(const std::weak_ptr& backend, const Texture& buffer, GLuint externalId); GL41Texture(const std::weak_ptr& backend, const Texture& buffer, bool transferrable); protected: diff --git a/libraries/gpu-gl/src/gpu/gl41/GL41BackendTexture.cpp b/libraries/gpu-gl/src/gpu/gl41/GL41BackendTexture.cpp index 3fb729711d..5594be36b6 100644 --- a/libraries/gpu-gl/src/gpu/gl41/GL41BackendTexture.cpp +++ b/libraries/gpu-gl/src/gpu/gl41/GL41BackendTexture.cpp @@ -38,7 +38,13 @@ GLTexture* GL41Backend::syncGPUObject(const TexturePointer& texture, bool transf return GL41Texture::sync(*this, texture, transfer); } -GL41Texture::GL41Texture(const std::weak_ptr& backend, const Texture& texture, bool transferrable) : GLTexture(backend, texture, allocate(), transferrable) {} +GL41Texture::GL41Texture(const std::weak_ptr& backend, const Texture& texture, GLuint externalId) + : GLTexture(backend, texture, externalId) { +} + +GL41Texture::GL41Texture(const std::weak_ptr& backend, const Texture& texture, bool transferrable) + : GLTexture(backend, texture, allocate(), transferrable) { +} void GL41Texture::generateMips() const { withPreservedTexture([&] { diff --git a/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h b/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h index f1c30b9382..059156b4a3 100644 --- a/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h +++ b/libraries/gpu-gl/src/gpu/gl45/GL45Backend.h @@ -33,6 +33,7 @@ public: static const uint32_t DEFAULT_PAGE_DIMENSION = 128; static const uint32_t DEFAULT_MAX_SPARSE_LEVEL = 0xFFFF; public: + GL45Texture(const std::weak_ptr& backend, const Texture& texture, GLuint externalId); GL45Texture(const std::weak_ptr& backend, const Texture& texture, bool transferrable); ~GL45Texture(); diff --git a/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp b/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp index 36b7b4886f..c59c945531 100644 --- a/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp +++ b/libraries/gpu-gl/src/gpu/gl45/GL45BackendTexture.cpp @@ -243,6 +243,10 @@ GLuint GL45Backend::getTextureID(const TexturePointer& texture, bool transfer) { return GL45Texture::getId(*this, texture, transfer); } +GL45Texture::GL45Texture(const std::weak_ptr& backend, const Texture& texture, GLuint externalId) + : GLTexture(backend, texture, externalId), _sparseInfo(*this), _transferState(*this) { +} + GL45Texture::GL45Texture(const std::weak_ptr& backend, const Texture& texture, bool transferrable) : GLTexture(backend, texture, allocate(texture), transferrable), _sparseInfo(*this), _transferState(*this) { @@ -252,7 +256,10 @@ GL45Texture::GL45Texture(const std::weak_ptr& backend, const Texture& } GL45Texture::~GL45Texture() { - qCDebug(gpugl45logging) << "Destroying texture " << _id << " from source " << _source.c_str(); + // External textures cycle very quickly, so don't spam the log with messages about them. + if (!_gpuObject.getUsage().isExternal()) { + qCDebug(gpugl45logging) << "Destroying texture " << _id << " from source " << _source.c_str(); + } if (_sparseInfo.sparse) { // Remove this texture from the candidate list of derezzable textures { diff --git a/libraries/gpu/src/gpu/Batch.cpp b/libraries/gpu/src/gpu/Batch.cpp index 8d3f019168..c15da61800 100644 --- a/libraries/gpu/src/gpu/Batch.cpp +++ b/libraries/gpu/src/gpu/Batch.cpp @@ -294,6 +294,11 @@ void Batch::setUniformBuffer(uint32 slot, const BufferView& view) { void Batch::setResourceTexture(uint32 slot, const TexturePointer& texture) { + if (texture && texture->getUsage().isExternal()) { + auto recycler = texture->getExternalRecycler(); + Q_ASSERT(recycler); + } + ADD_COMMAND(setResourceTexture); _params.emplace_back(_textures.cache(texture)); @@ -506,18 +511,6 @@ void Batch::popProfileRange() { #endif } -#define GL_TEXTURE0 0x84C0 - -void Batch::_glActiveBindTexture(uint32 unit, uint32 target, uint32 texture) { - // clean the cache on the texture unit we are going to use so the next call to setResourceTexture() at the same slot works fine - setResourceTexture(unit - GL_TEXTURE0, nullptr); - - ADD_COMMAND(glActiveBindTexture); - _params.emplace_back(texture); - _params.emplace_back(target); - _params.emplace_back(unit); -} - void Batch::_glUniform1i(int32 location, int32 v0) { if (location < 0) { return; @@ -680,4 +673,4 @@ void Batch::flush() { } buffer->flush(); } -} \ No newline at end of file +} diff --git a/libraries/gpu/src/gpu/Batch.h b/libraries/gpu/src/gpu/Batch.h index 8a52eef4ea..ad8155774d 100644 --- a/libraries/gpu/src/gpu/Batch.h +++ b/libraries/gpu/src/gpu/Batch.h @@ -229,9 +229,6 @@ public: // term strategy is to get rid of any GL calls in favor of the HIFI GPU API // For now, instead of calling the raw gl Call, use the equivalent call on the batch so the call is beeing recorded // THe implementation of these functions is in GLBackend.cpp - - void _glActiveBindTexture(unsigned int unit, unsigned int target, unsigned int texture); - void _glUniform1i(int location, int v0); void _glUniform1f(int location, float v0); void _glUniform2f(int location, float v0, float v1); @@ -314,8 +311,6 @@ public: // TODO: As long as we have gl calls explicitely issued from interface // code, we need to be able to record and batch these calls. THe long // term strategy is to get rid of any GL calls in favor of the HIFI GPU API - COMMAND_glActiveBindTexture, - COMMAND_glUniform1i, COMMAND_glUniform1f, COMMAND_glUniform2f, diff --git a/libraries/gpu/src/gpu/Texture.cpp b/libraries/gpu/src/gpu/Texture.cpp index 44804abebe..924f5145b9 100755 --- a/libraries/gpu/src/gpu/Texture.cpp +++ b/libraries/gpu/src/gpu/Texture.cpp @@ -238,6 +238,16 @@ bool Texture::Storage::assignMipFaceData(uint16 level, const Element& format, Si return allocated == size; } +Texture* Texture::createExternal2D(const ExternalRecycler& recycler, const Sampler& sampler) { + Texture* tex = new Texture(); + tex->_type = TEX_2D; + tex->_maxMip = 0; + tex->_sampler = sampler; + tex->setUsage(Usage::Builder().withExternal().withColor()); + tex->setExternalRecycler(recycler); + return tex; +} + Texture* Texture::create1D(const Element& texelFormat, uint16 width, const Sampler& sampler) { return create(TEX_1D, texelFormat, width, 1, 1, 1, 1, sampler); } @@ -925,3 +935,16 @@ Vec3u Texture::evalMipDimensions(uint16 level) const { return glm::max(dimensions, Vec3u(1)); } +void Texture::setExternalTexture(uint32 externalId, void* externalFence) { + Lock lock(_externalMutex); + _externalUpdates.push_back({ externalId, externalFence }); +} + +Texture::ExternalUpdates Texture::getUpdates() const { + Texture::ExternalUpdates result; + { + Lock lock(_externalMutex); + _externalUpdates.swap(result); + } + return result; +} \ No newline at end of file diff --git a/libraries/gpu/src/gpu/Texture.h b/libraries/gpu/src/gpu/Texture.h index 61d03c070c..9c3e88c67a 100755 --- a/libraries/gpu/src/gpu/Texture.h +++ b/libraries/gpu/src/gpu/Texture.h @@ -163,6 +163,10 @@ public: static void setEnableSparseTextures(bool enabled); static void setEnableIncrementalTextureTransfers(bool enabled); + using ExternalRecycler = std::function; + using ExternalIdAndFence = std::pair; + using ExternalUpdates = std::list; + class Usage { public: enum FlagBit { @@ -170,7 +174,7 @@ public: NORMAL, // Texture is a normal map ALPHA, // Texture has an alpha channel ALPHA_MASK, // Texture alpha channel is a Mask 0/1 - + EXTERNAL, NUM_FLAGS, }; typedef std::bitset Flags; @@ -196,6 +200,7 @@ public: Builder& withNormal() { _flags.set(NORMAL); return (*this); } Builder& withAlpha() { _flags.set(ALPHA); return (*this); } Builder& withAlphaMask() { _flags.set(ALPHA_MASK); return (*this); } + Builder& withExternal() { _flags.set(EXTERNAL); return (*this); } }; Usage(const Builder& builder) : Usage(builder._flags) {} @@ -204,6 +209,7 @@ public: bool isAlpha() const { return _flags[ALPHA]; } bool isAlphaMask() const { return _flags[ALPHA_MASK]; } + bool isExternal() const { return _flags[EXTERNAL]; } bool operator==(const Usage& usage) { return (_flags == usage._flags); } @@ -293,6 +299,7 @@ public: static Texture* create2D(const Element& texelFormat, uint16 width, uint16 height, const Sampler& sampler = Sampler()); static Texture* create3D(const Element& texelFormat, uint16 width, uint16 height, uint16 depth, const Sampler& sampler = Sampler()); static Texture* createCube(const Element& texelFormat, uint16 width, const Sampler& sampler = Sampler()); + static Texture* createExternal2D(const ExternalRecycler& recycler, const Sampler& sampler = Sampler()); Texture(); Texture(const Texture& buf); // deep copy of the sysmem texture @@ -458,9 +465,21 @@ public: // Only callable by the Backend void notifyMipFaceGPULoaded(uint16 level, uint8 face = 0) const { return _storage->notifyMipFaceGPULoaded(level, face); } + void setExternalTexture(uint32 externalId, void* externalFence); + void setExternalRecycler(const ExternalRecycler& recycler) { _externalRecycler = recycler; } + ExternalRecycler getExternalRecycler() const { return _externalRecycler; } + const GPUObjectPointer gpuObject {}; + ExternalUpdates getUpdates() const; + protected: + // Should only be accessed internally or by the backend sync function + mutable Mutex _externalMutex; + mutable std::list _externalUpdates; + ExternalRecycler _externalRecycler; + + // Not strictly necessary, but incredibly useful for debugging std::string _source; std::unique_ptr< Storage > _storage; From 46526a309d7fe4d9987290880170dd69d1e90f57 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 17:46:09 -0700 Subject: [PATCH 098/300] Increase audio input buffering on Windows 7 --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index d867bf8b3c..16f4c35d21 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1364,7 +1364,7 @@ int AudioClient::setOutputBufferSize(int numFrames, bool persist) { // proportional to the accelerator ratio. #ifdef Q_OS_WIN -const float AudioClient::CALLBACK_ACCELERATOR_RATIO = 1.0f; +const float AudioClient::CALLBACK_ACCELERATOR_RATIO = IsWindows8OrGreater() ? 1.0f : 0.25f; #endif #ifdef Q_OS_MAC From 8c5028158fe8a3e874f2da09e1d2825c992ffa2a Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Mon, 3 Oct 2016 16:42:50 -0700 Subject: [PATCH 099/300] Fix crash on destroying web entities and overlays --- interface/src/ui/overlays/Web3DOverlay.cpp | 12 +++++-- interface/src/ui/overlays/Web3DOverlay.h | 2 +- .../src/RenderableWebEntityItem.cpp | 33 +++++++++++-------- .../src/RenderableWebEntityItem.h | 2 +- libraries/gpu-gl/src/gpu/gl/GLTexture.cpp | 7 ++-- 5 files changed, 35 insertions(+), 21 deletions(-) diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 8f213e7740..be564a768e 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -73,7 +73,12 @@ void Web3DOverlay::render(RenderArgs* args) { QOpenGLContext * currentContext = QOpenGLContext::currentContext(); QSurface * currentSurface = currentContext->surface(); if (!_webSurface) { - _webSurface = new OffscreenQmlSurface(); + auto deleter = [](OffscreenQmlSurface* webSurface) { + AbstractViewStateInterface::instance()->postLambdaEvent([webSurface] { + webSurface->deleteLater(); + }); + }; + _webSurface = QSharedPointer(new OffscreenQmlSurface(), deleter); _webSurface->create(currentContext); _webSurface->setBaseUrl(QUrl::fromLocalFile(PathUtils::resourcesPath() + "/qml/controls/")); _webSurface->load("WebView.qml"); @@ -95,8 +100,9 @@ void Web3DOverlay::render(RenderArgs* args) { } if (!_texture) { - _texture = gpu::TexturePointer(gpu::Texture::createExternal2D([this](uint32_t recycleTexture, void* recycleFence) { - _webSurface->releaseTexture({ recycleTexture, recycleFence }); + auto webSurface = _webSurface; + _texture = gpu::TexturePointer(gpu::Texture::createExternal2D([webSurface](uint32_t recycleTexture, void* recycleFence) { + webSurface->releaseTexture({ recycleTexture, recycleFence }); })); _texture->setSource(__FUNCTION__); } diff --git a/interface/src/ui/overlays/Web3DOverlay.h b/interface/src/ui/overlays/Web3DOverlay.h index 0bb9e5e030..1e75bbbb06 100644 --- a/interface/src/ui/overlays/Web3DOverlay.h +++ b/interface/src/ui/overlays/Web3DOverlay.h @@ -41,7 +41,7 @@ public: virtual Web3DOverlay* createClone() const override; private: - OffscreenQmlSurface* _webSurface{ nullptr }; + QSharedPointer _webSurface; QMetaObject::Connection _connection; gpu::TexturePointer _texture; QString _url; diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp index 3c339b7b7d..e415062e5c 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.cpp @@ -129,7 +129,19 @@ bool RenderableWebEntityItem::buildWebSurface(EntityTreeRenderer* renderer) { // Save the original GL context, because creating a QML surface will create a new context QOpenGLContext * currentContext = QOpenGLContext::currentContext(); QSurface * currentSurface = currentContext->surface(); - _webSurface = new OffscreenQmlSurface(); + + auto deleter = [](OffscreenQmlSurface* webSurface) { + AbstractViewStateInterface::instance()->postLambdaEvent([webSurface] { + webSurface->deleteLater(); + }); + }; + _webSurface = QSharedPointer(new OffscreenQmlSurface(), deleter); + + // The lifetime of the QML surface MUST be managed by the main thread + // Additionally, we MUST use local variables copied by value, rather than + // member variables, since they would implicitly refer to a this that + // is no longer valid + _webSurface->create(currentContext); _webSurface->setBaseUrl(QUrl::fromLocalFile(PathUtils::resourcesPath() + "/qml/controls/")); _webSurface->load("WebView.qml", [&](QQmlContext* context, QObject* obj) { @@ -215,9 +227,11 @@ void RenderableWebEntityItem::render(RenderArgs* args) { _webSurface->resize(QSize(windowSize.x, windowSize.y)); if (!_texture) { - _texture = gpu::TexturePointer(gpu::Texture::createExternal2D([this](uint32_t recycleTexture, void* recycleFence) { - _webSurface->releaseTexture({ recycleTexture, recycleFence }); - })); + auto webSurface = _webSurface; + auto recycler = [webSurface] (uint32_t recycleTexture, void* recycleFence) { + webSurface->releaseTexture({ recycleTexture, recycleFence }); + }; + _texture = gpu::TexturePointer(gpu::Texture::createExternal2D(recycler)); _texture->setSource(__FUNCTION__); } OffscreenQmlSurface::TextureAndFence newTextureAndFence; @@ -352,16 +366,7 @@ void RenderableWebEntityItem::destroyWebSurface() { _mouseMoveConnection = QMetaObject::Connection(); QObject::disconnect(_hoverLeaveConnection); _hoverLeaveConnection = QMetaObject::Connection(); - - // The lifetime of the QML surface MUST be managed by the main thread - // Additionally, we MUST use local variables copied by value, rather than - // member variables, since they would implicitly refer to a this that - // is no longer valid - auto webSurface = _webSurface; - AbstractViewStateInterface::instance()->postLambdaEvent([webSurface] { - webSurface->deleteLater(); - }); - _webSurface = nullptr; + _webSurface.reset(); } } diff --git a/libraries/entities-renderer/src/RenderableWebEntityItem.h b/libraries/entities-renderer/src/RenderableWebEntityItem.h index ea9ddd0c12..b7caaae68c 100644 --- a/libraries/entities-renderer/src/RenderableWebEntityItem.h +++ b/libraries/entities-renderer/src/RenderableWebEntityItem.h @@ -78,7 +78,7 @@ private: void destroyWebSurface(); glm::vec2 getWindowSize() const; - OffscreenQmlSurface* _webSurface{ nullptr }; + QSharedPointer _webSurface; QMetaObject::Connection _connection; gpu::TexturePointer _texture; ivec2 _lastPress { INT_MIN }; diff --git a/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp b/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp index b39bc58bac..649065ab84 100644 --- a/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp +++ b/libraries/gpu-gl/src/gpu/gl/GLTexture.cpp @@ -182,8 +182,11 @@ GLTexture::~GLTexture() { if (backend) { if (_external) { auto recycler = _gpuObject.getExternalRecycler(); - assert(recycler); - backend->releaseExternalTexture(_id, recycler); + if (recycler) { + backend->releaseExternalTexture(_id, recycler); + } else { + qWarning() << "No recycler available for texture " << _id << " possible leak"; + } } else if (_id) { backend->releaseTexture(_id, _size); } From 372b6314485f4947c51fb85d0be327a850014881 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 19:59:27 -0700 Subject: [PATCH 100/300] Post-build command to use qtaudio_windows.dll for Win7, qtaudio_wasapi.dll for Win8/10, or include both for Installer --- .../PackageLibrariesForDeployment.cmake | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/cmake/macros/PackageLibrariesForDeployment.cmake b/cmake/macros/PackageLibrariesForDeployment.cmake index da0ee35769..beb5c22aa7 100644 --- a/cmake/macros/PackageLibrariesForDeployment.cmake +++ b/cmake/macros/PackageLibrariesForDeployment.cmake @@ -44,13 +44,25 @@ macro(PACKAGE_LIBRARIES_FOR_DEPLOYMENT) set(QTAUDIO_PATH $/audio) - # if present, replace qtaudio_windows.dll with qtaudio_wasapi.dll - add_custom_command( - TARGET ${TARGET_NAME} - POST_BUILD - COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windows.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windows.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.pdb ${QTAUDIO_PATH} ) - COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windowsd.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windowsd.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.pdb ${QTAUDIO_PATH} ) - ) + if (DEPLOY_PACKAGE) + # copy qtaudio_wasapi.dll alongside qtaudio_windows.dll, and let the installer resolve + add_custom_command( + TARGET ${TARGET_NAME} + POST_BUILD + COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windows.dll ( ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.pdb ${QTAUDIO_PATH} ) + COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windowsd.dll ( ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.pdb ${QTAUDIO_PATH} ) + ) + elseif (${CMAKE_SYSTEM_VERSION} VERSION_GREATER 6.2) + # replace qtaudio_windows.dll with qtaudio_wasapi.dll on Windows 8/8.1/10 + add_custom_command( + TARGET ${TARGET_NAME} + POST_BUILD + COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windows.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windows.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.pdb ${QTAUDIO_PATH} ) + COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windowsd.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windowsd.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.pdb ${QTAUDIO_PATH} ) + ) + else () + # continue using qtaudio_windows.dll on Windows 7 + endif () endif () endmacro() From eb5b03d00836284102199c0711610af7484a67b8 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 20:52:24 -0700 Subject: [PATCH 101/300] Don't pre-delete qtaudio_windows.dll in Installer --- cmake/templates/NSIS.template.in | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index a80367cee1..65e801d321 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -600,9 +600,6 @@ Section "-Core installation" Delete "$INSTDIR\version" Delete "$INSTDIR\xinput1_3.dll" - ;Delete old Qt files - Delete "$INSTDIR\audio\qtaudio_windows.dll" - ; Delete old desktop shortcuts before they were renamed during Sandbox rename Delete "$DESKTOP\@PRE_SANDBOX_INTERFACE_SHORTCUT_NAME@.lnk" Delete "$DESKTOP\@PRE_SANDBOX_CONSOLE_SHORTCUT_NAME@.lnk" From 541f7ebb05b12e8c1ced65cab3c65c65d8847828 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 21:46:55 -0700 Subject: [PATCH 102/300] Select the correct plugin in the Installer, based on Windows version --- cmake/templates/NSIS.template.in | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index 65e801d321..5b15795443 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -23,6 +23,11 @@ ;Default installation folder InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" +;-------------------------------- +;Include WinVer to get Windows version + + !include "WinVer.nsh" + ;-------------------------------- ;General ; leverage the UAC NSIS plugin to promote uninstaller to elevated privileges @@ -600,6 +605,19 @@ Section "-Core installation" Delete "$INSTDIR\version" Delete "$INSTDIR\xinput1_3.dll" + ; The installer includes two different Qt audio plugins. + ; On Windows 8 and above, only qtaudio_wasapi.dll should be installed. + ; On Windows 7 and below, only qtaudio_windows.dll should be installed. + ${If} ${AtLeastWin8} + Delete "$INSTDIR\audio\qtaudio_windows.dll" + Delete "$INSTDIR\audio\qtaudio_windows.pdb" + MessageBox MB_OK "Detected Windows 8+" + ${Else} + Delete "$INSTDIR\audio\qtaudio_wasapi.dll" + Delete "$INSTDIR\audio\qtaudio_wasapi.pdb" + MessageBox MB_OK "Detected Windows 7-" + ${EndIf} + ; Delete old desktop shortcuts before they were renamed during Sandbox rename Delete "$DESKTOP\@PRE_SANDBOX_INTERFACE_SHORTCUT_NAME@.lnk" Delete "$DESKTOP\@PRE_SANDBOX_CONSOLE_SHORTCUT_NAME@.lnk" From 40393bd8efdb368708167d4ef491cc83f2b0c541 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 22:31:43 -0700 Subject: [PATCH 103/300] remove Installer debugging code --- cmake/templates/NSIS.template.in | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index 5b15795443..568418afe1 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -611,11 +611,9 @@ Section "-Core installation" ${If} ${AtLeastWin8} Delete "$INSTDIR\audio\qtaudio_windows.dll" Delete "$INSTDIR\audio\qtaudio_windows.pdb" - MessageBox MB_OK "Detected Windows 8+" ${Else} Delete "$INSTDIR\audio\qtaudio_wasapi.dll" Delete "$INSTDIR\audio\qtaudio_wasapi.pdb" - MessageBox MB_OK "Detected Windows 7-" ${EndIf} ; Delete old desktop shortcuts before they were renamed during Sandbox rename From 6838dc0247cebc1c389a68c2be17601d0358a861 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Tue, 4 Oct 2016 09:01:43 -0700 Subject: [PATCH 104/300] Inverted the CMAKE logic, to make the version comparison more clear --- cmake/macros/PackageLibrariesForDeployment.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/macros/PackageLibrariesForDeployment.cmake b/cmake/macros/PackageLibrariesForDeployment.cmake index beb5c22aa7..d8e895b7b0 100644 --- a/cmake/macros/PackageLibrariesForDeployment.cmake +++ b/cmake/macros/PackageLibrariesForDeployment.cmake @@ -52,7 +52,9 @@ macro(PACKAGE_LIBRARIES_FOR_DEPLOYMENT) COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windows.dll ( ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.pdb ${QTAUDIO_PATH} ) COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windowsd.dll ( ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.pdb ${QTAUDIO_PATH} ) ) - elseif (${CMAKE_SYSTEM_VERSION} VERSION_GREATER 6.2) + elseif (${CMAKE_SYSTEM_VERSION} VERSION_LESS 6.2) + # continue using qtaudio_windows.dll on Windows 7 + else () # replace qtaudio_windows.dll with qtaudio_wasapi.dll on Windows 8/8.1/10 add_custom_command( TARGET ${TARGET_NAME} @@ -60,8 +62,6 @@ macro(PACKAGE_LIBRARIES_FOR_DEPLOYMENT) COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windows.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windows.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.pdb ${QTAUDIO_PATH} ) COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windowsd.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windowsd.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.pdb ${QTAUDIO_PATH} ) ) - else () - # continue using qtaudio_windows.dll on Windows 7 endif () endif () From 5ea4d48e360506019eb27b006bfad1ce5026a08d Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Tue, 4 Oct 2016 10:23:10 -0700 Subject: [PATCH 105/300] poll for ready, and include physics in definition of ready, based on #8723 --- .../tests/performance/domain-check.js | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/scripts/developer/tests/performance/domain-check.js b/scripts/developer/tests/performance/domain-check.js index 1a42683d92..f085c3f685 100644 --- a/scripts/developer/tests/performance/domain-check.js +++ b/scripts/developer/tests/performance/domain-check.js @@ -20,7 +20,7 @@ var EXPECTED_HMD_FRAMERATE = 90; var MAXIMUM_LOAD_TIME = 60; // seconds var MINIMUM_AVATARS = 25; // FIXME: not implemented yet. Requires agent scripts. Idea is to have them organize themselves to the right number. -var version = 1; +var version = 2; function debug() { print.apply(null, [].concat.apply(['hrs fixme', version], [].map.call(arguments, JSON.stringify))); } @@ -76,10 +76,17 @@ function startTwirl(targetRotation, degreesPerUpdate, interval, strafeDistance, function doLoad(place, continuationWithLoadTime) { // Go to place and call continuationWithLoadTime(loadTimeInSeconds) var start = Date.now(), timeout, onDownloadUpdate, finishedTwirl = false, loadTime; + // There are two ways to learn of changes: connect to change signals, or poll. + // Until we get reliable results, we'll poll. + var POLL_INTERVAL = 500, poll; + function setHandlers() { + //Stats.downloadsPendingChanged.connect(onDownloadUpdate); downloadsChanged, and physics... + poll = Script.setInterval(onDownloadUpdate, POLL_INTERVAL); + } function clearHandlers() { debug('clearHandlers'); - Stats.downloadsPendingChanged.disconnect(onDownloadUpdate); - Stats.downloadsChanged.disconnect(onDownloadUpdate); + //Stats.downloadsPendingChanged.disconnect(onDownloadUpdate); downloadsChanged, and physics.. + Script.clearInterval(poll); } function waitForLoad(flag) { debug('entry', place, 'initial downloads/pending', Stats.downloads, Stats.downloadsPending); @@ -96,13 +103,11 @@ function doLoad(place, continuationWithLoadTime) { // Go to place and call conti continuationWithLoadTime(loadTime); } }); - Stats.downloadsPendingChanged.connect(onDownloadUpdate); - Stats.downloadsChanged.connect(onDownloadUpdate); + setHandlers(); } function isLoading() { - // FIXME: This tells us when download are completed, but it doesn't tell us when the objects are parsed and loaded. - // We really want something like _physicsEnabled, but that isn't signalled. - return Stats.downloads || Stats.downloadsPending; + // FIXME: We should also confirm that textures have loaded. + return Stats.downloads || Stats.downloadsPending || !Window.isPhysicsEnabled(); } onDownloadUpdate = function onDownloadUpdate() { debug('update downloads/pending', Stats.downloads, Stats.downloadsPending); @@ -170,7 +175,7 @@ You would want to say 'no' (and make other preparations) if you were testing the function maybeRunTribbles(continuation) { if (Window.confirm("Run tribbles?\n\n\ At most, only one participant should say yes.")) { - Script.load('http://cdn.highfidelity.com/davidkelly/production/scripts/tests/performance/tribbles.js'); // FIXME: replace with AWS + Script.load('http://cdn.highfidelity.com/davidkelly/production/scripts/tests/performance/tribbles.js'); Script.setTimeout(continuation, 3000); } else { continuation(); From 32bac92530c91fbf8c1672b9b5f541e39cfa8531 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 17:46:09 -0700 Subject: [PATCH 106/300] Increase audio input buffering on Windows 7 --- libraries/audio-client/src/AudioClient.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index d867bf8b3c..16f4c35d21 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1364,7 +1364,7 @@ int AudioClient::setOutputBufferSize(int numFrames, bool persist) { // proportional to the accelerator ratio. #ifdef Q_OS_WIN -const float AudioClient::CALLBACK_ACCELERATOR_RATIO = 1.0f; +const float AudioClient::CALLBACK_ACCELERATOR_RATIO = IsWindows8OrGreater() ? 1.0f : 0.25f; #endif #ifdef Q_OS_MAC From 0c74aad79971a5bd8bae83102b14ecdab7ab2c2e Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 19:59:27 -0700 Subject: [PATCH 107/300] Post-build command to use qtaudio_windows.dll for Win7, qtaudio_wasapi.dll for Win8/10, or include both for Installer --- .../PackageLibrariesForDeployment.cmake | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/cmake/macros/PackageLibrariesForDeployment.cmake b/cmake/macros/PackageLibrariesForDeployment.cmake index da0ee35769..beb5c22aa7 100644 --- a/cmake/macros/PackageLibrariesForDeployment.cmake +++ b/cmake/macros/PackageLibrariesForDeployment.cmake @@ -44,13 +44,25 @@ macro(PACKAGE_LIBRARIES_FOR_DEPLOYMENT) set(QTAUDIO_PATH $/audio) - # if present, replace qtaudio_windows.dll with qtaudio_wasapi.dll - add_custom_command( - TARGET ${TARGET_NAME} - POST_BUILD - COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windows.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windows.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.pdb ${QTAUDIO_PATH} ) - COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windowsd.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windowsd.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.pdb ${QTAUDIO_PATH} ) - ) + if (DEPLOY_PACKAGE) + # copy qtaudio_wasapi.dll alongside qtaudio_windows.dll, and let the installer resolve + add_custom_command( + TARGET ${TARGET_NAME} + POST_BUILD + COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windows.dll ( ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.pdb ${QTAUDIO_PATH} ) + COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windowsd.dll ( ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.pdb ${QTAUDIO_PATH} ) + ) + elseif (${CMAKE_SYSTEM_VERSION} VERSION_GREATER 6.2) + # replace qtaudio_windows.dll with qtaudio_wasapi.dll on Windows 8/8.1/10 + add_custom_command( + TARGET ${TARGET_NAME} + POST_BUILD + COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windows.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windows.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.pdb ${QTAUDIO_PATH} ) + COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windowsd.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windowsd.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.pdb ${QTAUDIO_PATH} ) + ) + else () + # continue using qtaudio_windows.dll on Windows 7 + endif () endif () endmacro() From 92f429430265ef6123bda89560f6e70a732b4375 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 20:52:24 -0700 Subject: [PATCH 108/300] Don't pre-delete qtaudio_windows.dll in Installer --- cmake/templates/NSIS.template.in | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index a80367cee1..65e801d321 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -600,9 +600,6 @@ Section "-Core installation" Delete "$INSTDIR\version" Delete "$INSTDIR\xinput1_3.dll" - ;Delete old Qt files - Delete "$INSTDIR\audio\qtaudio_windows.dll" - ; Delete old desktop shortcuts before they were renamed during Sandbox rename Delete "$DESKTOP\@PRE_SANDBOX_INTERFACE_SHORTCUT_NAME@.lnk" Delete "$DESKTOP\@PRE_SANDBOX_CONSOLE_SHORTCUT_NAME@.lnk" From 8d3b30cef6b08eac26f15a161f40d316362ab5cb Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 21:46:55 -0700 Subject: [PATCH 109/300] Select the correct plugin in the Installer, based on Windows version --- cmake/templates/NSIS.template.in | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index 65e801d321..5b15795443 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -23,6 +23,11 @@ ;Default installation folder InstallDir "@CPACK_NSIS_INSTALL_ROOT@\@CPACK_PACKAGE_INSTALL_DIRECTORY@" +;-------------------------------- +;Include WinVer to get Windows version + + !include "WinVer.nsh" + ;-------------------------------- ;General ; leverage the UAC NSIS plugin to promote uninstaller to elevated privileges @@ -600,6 +605,19 @@ Section "-Core installation" Delete "$INSTDIR\version" Delete "$INSTDIR\xinput1_3.dll" + ; The installer includes two different Qt audio plugins. + ; On Windows 8 and above, only qtaudio_wasapi.dll should be installed. + ; On Windows 7 and below, only qtaudio_windows.dll should be installed. + ${If} ${AtLeastWin8} + Delete "$INSTDIR\audio\qtaudio_windows.dll" + Delete "$INSTDIR\audio\qtaudio_windows.pdb" + MessageBox MB_OK "Detected Windows 8+" + ${Else} + Delete "$INSTDIR\audio\qtaudio_wasapi.dll" + Delete "$INSTDIR\audio\qtaudio_wasapi.pdb" + MessageBox MB_OK "Detected Windows 7-" + ${EndIf} + ; Delete old desktop shortcuts before they were renamed during Sandbox rename Delete "$DESKTOP\@PRE_SANDBOX_INTERFACE_SHORTCUT_NAME@.lnk" Delete "$DESKTOP\@PRE_SANDBOX_CONSOLE_SHORTCUT_NAME@.lnk" From 6d25c40ac7e4df886ca770d1f3b3eae05653ca6e Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Mon, 3 Oct 2016 22:31:43 -0700 Subject: [PATCH 110/300] remove Installer debugging code --- cmake/templates/NSIS.template.in | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmake/templates/NSIS.template.in b/cmake/templates/NSIS.template.in index 5b15795443..568418afe1 100644 --- a/cmake/templates/NSIS.template.in +++ b/cmake/templates/NSIS.template.in @@ -611,11 +611,9 @@ Section "-Core installation" ${If} ${AtLeastWin8} Delete "$INSTDIR\audio\qtaudio_windows.dll" Delete "$INSTDIR\audio\qtaudio_windows.pdb" - MessageBox MB_OK "Detected Windows 8+" ${Else} Delete "$INSTDIR\audio\qtaudio_wasapi.dll" Delete "$INSTDIR\audio\qtaudio_wasapi.pdb" - MessageBox MB_OK "Detected Windows 7-" ${EndIf} ; Delete old desktop shortcuts before they were renamed during Sandbox rename From 02f15bd338c67ecac4dc7d9db3bab62f8c7197e4 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Tue, 4 Oct 2016 09:01:43 -0700 Subject: [PATCH 111/300] Inverted the CMAKE logic, to make the version comparison more clear --- cmake/macros/PackageLibrariesForDeployment.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/macros/PackageLibrariesForDeployment.cmake b/cmake/macros/PackageLibrariesForDeployment.cmake index beb5c22aa7..d8e895b7b0 100644 --- a/cmake/macros/PackageLibrariesForDeployment.cmake +++ b/cmake/macros/PackageLibrariesForDeployment.cmake @@ -52,7 +52,9 @@ macro(PACKAGE_LIBRARIES_FOR_DEPLOYMENT) COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windows.dll ( ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.pdb ${QTAUDIO_PATH} ) COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windowsd.dll ( ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.pdb ${QTAUDIO_PATH} ) ) - elseif (${CMAKE_SYSTEM_VERSION} VERSION_GREATER 6.2) + elseif (${CMAKE_SYSTEM_VERSION} VERSION_LESS 6.2) + # continue using qtaudio_windows.dll on Windows 7 + else () # replace qtaudio_windows.dll with qtaudio_wasapi.dll on Windows 8/8.1/10 add_custom_command( TARGET ${TARGET_NAME} @@ -60,8 +62,6 @@ macro(PACKAGE_LIBRARIES_FOR_DEPLOYMENT) COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windows.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windows.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapi.pdb ${QTAUDIO_PATH} ) COMMAND if exist ${QTAUDIO_PATH}/qtaudio_windowsd.dll ( ${CMAKE_COMMAND} -E remove ${QTAUDIO_PATH}/qtaudio_windowsd.dll && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.dll ${QTAUDIO_PATH} && ${CMAKE_COMMAND} -E copy ${WASAPI_DLL_PATH}/qtaudio_wasapid.pdb ${QTAUDIO_PATH} ) ) - else () - # continue using qtaudio_windows.dll on Windows 7 endif () endif () From 2e46ed3cac6bbf8144bea6c75b8b2865ee65ead0 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Mon, 3 Oct 2016 13:46:55 -0700 Subject: [PATCH 112/300] Make static control packets class members --- libraries/networking/src/udt/Connection.cpp | 96 ++++++++++----------- libraries/networking/src/udt/Connection.h | 28 +++--- 2 files changed, 65 insertions(+), 59 deletions(-) diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index af70295840..dcceef0fdc 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -45,6 +45,20 @@ Connection::Connection(Socket* parentSocket, HifiSockAddr destination, std::uniq // set the initial RTT and flow window size on congestion control object _congestionControl->setRTT(_rtt); _congestionControl->setMaxCongestionWindowSize(_flowWindowSize); + + // Setup packets + static const int ACK_PACKET_PAYLOAD_BYTES = sizeof(_lastSentACK) + sizeof(_currentACKSubSequenceNumber) + + sizeof(_rtt) + sizeof(int32_t) + sizeof(int32_t) + sizeof(int32_t); + static const int LIGHT_ACK_PACKET_PAYLOAD_BYTES = sizeof(SequenceNumber); + static const int ACK2_PAYLOAD_BYTES = sizeof(SequenceNumber); + static const int NAK_PACKET_PAYLOAD_BYTES = 2 * sizeof(SequenceNumber); + static const int HANDSHAKE_ACK_PAYLOAD_BYTES = sizeof(SequenceNumber); + + _ackPacket = ControlPacket::create(ControlPacket::ACK, ACK_PACKET_PAYLOAD_BYTES); + _lightACKPacket = ControlPacket::create(ControlPacket::LightACK, LIGHT_ACK_PACKET_PAYLOAD_BYTES); + _ack2Packet = ControlPacket::create(ControlPacket::ACK2, ACK2_PAYLOAD_BYTES); + _lossReport = ControlPacket::create(ControlPacket::NAK, NAK_PACKET_PAYLOAD_BYTES); + _handshakeACK = ControlPacket::create(ControlPacket::HandshakeACK, HANDSHAKE_ACK_PAYLOAD_BYTES); } Connection::~Connection() { @@ -279,25 +293,22 @@ void Connection::sendACK(bool wasCausedBySyncTimeout) { // update the last sent ACK _lastSentACK = nextACKNumber; - - // setup the ACK packet, make it static so we can re-use it - static const int ACK_PACKET_PAYLOAD_BYTES = sizeof(_lastSentACK) + sizeof(_currentACKSubSequenceNumber) - + sizeof(_rtt) + sizeof(int32_t) + sizeof(int32_t) + sizeof(int32_t); - static auto ackPacket = ControlPacket::create(ControlPacket::ACK, ACK_PACKET_PAYLOAD_BYTES); - ackPacket->reset(); // We need to reset it every time. + + + _ackPacket->reset(); // We need to reset it every time. // pack in the ACK sub-sequence number - ackPacket->writePrimitive(++_currentACKSubSequenceNumber); + _ackPacket->writePrimitive(++_currentACKSubSequenceNumber); // pack in the ACK number - ackPacket->writePrimitive(nextACKNumber); + _ackPacket->writePrimitive(nextACKNumber); // pack in the RTT and variance - ackPacket->writePrimitive(_rtt); + _ackPacket->writePrimitive(_rtt); // pack the available buffer size, in packets // in our implementation we have no hard limit on receive buffer size, send the default value - ackPacket->writePrimitive((int32_t) udt::CONNECTION_RECEIVE_BUFFER_SIZE_PACKETS); + _ackPacket->writePrimitive((int32_t) udt::CONNECTION_RECEIVE_BUFFER_SIZE_PACKETS); if (wasCausedBySyncTimeout) { // grab the up to date packet receive speed and estimated bandwidth @@ -309,15 +320,15 @@ void Connection::sendACK(bool wasCausedBySyncTimeout) { _stats.recordEstimatedBandwidth(estimatedBandwidth); // pack in the receive speed and estimatedBandwidth - ackPacket->writePrimitive(packetReceiveSpeed); - ackPacket->writePrimitive(estimatedBandwidth); + _ackPacket->writePrimitive(packetReceiveSpeed); + _ackPacket->writePrimitive(estimatedBandwidth); } // record this as the last ACK send time lastACKSendTime = p_high_resolution_clock::now(); // have the socket send off our packet - _parentSocket->writeBasePacket(*ackPacket, _destination); + _parentSocket->writeBasePacket(*_ackPacket, _destination); Q_ASSERT_X(_sentACKs.empty() || _sentACKs.back().first + 1 == _currentACKSubSequenceNumber, "Connection::sendACK", "Adding an invalid ACK to _sentACKs"); @@ -339,35 +350,27 @@ void Connection::sendLightACK() { return; } - // create the light ACK packet, make it static so we can re-use it - static const int LIGHT_ACK_PACKET_PAYLOAD_BYTES = sizeof(SequenceNumber); - static auto lightACKPacket = ControlPacket::create(ControlPacket::LightACK, LIGHT_ACK_PACKET_PAYLOAD_BYTES); - // reset the lightACKPacket before we go to write the ACK to it - lightACKPacket->reset(); + _lightACKPacket->reset(); // pack in the ACK - lightACKPacket->writePrimitive(nextACKNumber); + _lightACKPacket->writePrimitive(nextACKNumber); // have the socket send off our packet immediately - _parentSocket->writeBasePacket(*lightACKPacket, _destination); + _parentSocket->writeBasePacket(*_lightACKPacket, _destination); _stats.record(ConnectionStats::Stats::SentLightACK); } void Connection::sendACK2(SequenceNumber currentACKSubSequenceNumber) { - // setup a static ACK2 packet we will re-use - static const int ACK2_PAYLOAD_BYTES = sizeof(SequenceNumber); - static auto ack2Packet = ControlPacket::create(ControlPacket::ACK2, ACK2_PAYLOAD_BYTES); - // reset the ACK2 Packet before writing the sub-sequence number to it - ack2Packet->reset(); + _ack2Packet->reset(); // write the sub sequence number for this ACK2 - ack2Packet->writePrimitive(currentACKSubSequenceNumber); + _ack2Packet->writePrimitive(currentACKSubSequenceNumber); // send the ACK2 packet - _parentSocket->writeBasePacket(*ack2Packet, _destination); + _parentSocket->writeBasePacket(*_ack2Packet, _destination); // update the last sent ACK2 and the last ACK2 send time _lastSentACK2 = currentACKSubSequenceNumber; @@ -376,19 +379,16 @@ void Connection::sendACK2(SequenceNumber currentACKSubSequenceNumber) { } void Connection::sendNAK(SequenceNumber sequenceNumberRecieved) { - // create the loss report packet, make it static so we can re-use it - static const int NAK_PACKET_PAYLOAD_BYTES = 2 * sizeof(SequenceNumber); - static auto lossReport = ControlPacket::create(ControlPacket::NAK, NAK_PACKET_PAYLOAD_BYTES); - lossReport->reset(); // We need to reset it every time. + _lossReport->reset(); // We need to reset it every time. // pack in the loss report - lossReport->writePrimitive(_lastReceivedSequenceNumber + 1); + _lossReport->writePrimitive(_lastReceivedSequenceNumber + 1); if (_lastReceivedSequenceNumber + 1 != sequenceNumberRecieved - 1) { - lossReport->writePrimitive(sequenceNumberRecieved - 1); + _lossReport->writePrimitive(sequenceNumberRecieved - 1); } // have the parent socket send off our packet immediately - _parentSocket->writeBasePacket(*lossReport, _destination); + _parentSocket->writeBasePacket(*_lossReport, _destination); // record our last NAK time _lastNAKTime = p_high_resolution_clock::now(); @@ -519,7 +519,7 @@ bool Connection::processReceivedSequenceNumber(SequenceNumber sequenceNumber, in return !wasDuplicate; } -void Connection::processControl(std::unique_ptr controlPacket) { +void Connection::processControl(ControlPacketPointer controlPacket) { // Simple dispatch to control packets processing methods based on their type. @@ -577,7 +577,7 @@ void Connection::processControl(std::unique_ptr controlPacket) { } } -void Connection::processACK(std::unique_ptr controlPacket) { +void Connection::processACK(ControlPacketPointer controlPacket) { // read the ACK sub-sequence number SequenceNumber currentACKSubSequenceNumber; controlPacket->readPrimitive(¤tACKSubSequenceNumber); @@ -678,7 +678,7 @@ void Connection::processACK(std::unique_ptr controlPacket) { _stats.record(ConnectionStats::Stats::ProcessedACK); } -void Connection::processLightACK(std::unique_ptr controlPacket) { +void Connection::processLightACK(ControlPacketPointer controlPacket) { // read the ACKed sequence number SequenceNumber ack; controlPacket->readPrimitive(&ack); @@ -702,7 +702,7 @@ void Connection::processLightACK(std::unique_ptr controlPacket) { _stats.record(ConnectionStats::Stats::ReceivedLightACK); } -void Connection::processACK2(std::unique_ptr controlPacket) { +void Connection::processACK2(ControlPacketPointer controlPacket) { // pull the sub sequence number from the packet SequenceNumber subSequenceNumber; controlPacket->readPrimitive(&subSequenceNumber); @@ -742,7 +742,7 @@ void Connection::processACK2(std::unique_ptr controlPacket) { _stats.record(ConnectionStats::Stats::ReceivedACK2); } -void Connection::processNAK(std::unique_ptr controlPacket) { +void Connection::processNAK(ControlPacketPointer controlPacket) { // read the loss report SequenceNumber start, end; controlPacket->readPrimitive(&start); @@ -764,7 +764,7 @@ void Connection::processNAK(std::unique_ptr controlPacket) { _stats.record(ConnectionStats::Stats::ReceivedNAK); } -void Connection::processHandshake(std::unique_ptr controlPacket) { +void Connection::processHandshake(ControlPacketPointer controlPacket) { SequenceNumber initialSequenceNumber; controlPacket->readPrimitive(&initialSequenceNumber); @@ -782,18 +782,16 @@ void Connection::processHandshake(std::unique_ptr controlPacket) _lastReceivedSequenceNumber = initialSequenceNumber - 1; _lastSentACK = initialSequenceNumber - 1; } - - // immediately respond with a handshake ACK - static auto handshakeACK = ControlPacket::create(ControlPacket::HandshakeACK, sizeof(SequenceNumber)); - handshakeACK->seek(0); - handshakeACK->writePrimitive(initialSequenceNumber); - _parentSocket->writeBasePacket(*handshakeACK, _destination); + + _handshakeACK->reset(); + _handshakeACK->writePrimitive(initialSequenceNumber); + _parentSocket->writeBasePacket(*_handshakeACK, _destination); // indicate that handshake has been received _hasReceivedHandshake = true; } -void Connection::processHandshakeACK(std::unique_ptr controlPacket) { +void Connection::processHandshakeACK(ControlPacketPointer controlPacket) { // if we've decided to clean up the send queue then this handshake ACK should be ignored, it's useless if (_sendQueue) { SequenceNumber initialSequenceNumber; @@ -807,7 +805,7 @@ void Connection::processHandshakeACK(std::unique_ptr controlPacke } } -void Connection::processTimeoutNAK(std::unique_ptr controlPacket) { +void Connection::processTimeoutNAK(ControlPacketPointer controlPacket) { // Override SendQueue's LossList with the timeout NAK list getSendQueue().overrideNAKListFromPacket(*controlPacket); @@ -817,7 +815,7 @@ void Connection::processTimeoutNAK(std::unique_ptr controlPacket) _stats.record(ConnectionStats::Stats::ReceivedTimeoutNAK); } -void Connection::processProbeTail(std::unique_ptr controlPacket) { +void Connection::processProbeTail(ControlPacketPointer controlPacket) { if (((uint32_t) _lastReceivedSequenceNumber & 0xF) == 0) { // this is the second packet in a probe set so we can estimate bandwidth // the sender sent this to us in lieu of sending new data (because they didn't have any) diff --git a/libraries/networking/src/udt/Connection.h b/libraries/networking/src/udt/Connection.h index 08a2df9b97..d6121d47b2 100644 --- a/libraries/networking/src/udt/Connection.h +++ b/libraries/networking/src/udt/Connection.h @@ -55,6 +55,7 @@ public: using SequenceNumberTimePair = std::pair; using ACKListPair = std::pair; using SentACKList = std::list; + using ControlPacketPointer = std::unique_ptr; Connection(Socket* parentSocket, HifiSockAddr destination, std::unique_ptr congestionControl); ~Connection(); @@ -66,7 +67,7 @@ public: // return indicates if this packet should be processed bool processReceivedSequenceNumber(SequenceNumber sequenceNumber, int packetSize, int payloadSize); - void processControl(std::unique_ptr controlPacket); + void processControl(ControlPacketPointer controlPacket); void queueReceivedMessagePacket(std::unique_ptr packet); @@ -96,14 +97,14 @@ private: void sendNAK(SequenceNumber sequenceNumberRecieved); void sendTimeoutNAK(); - void processACK(std::unique_ptr controlPacket); - void processLightACK(std::unique_ptr controlPacket); - void processACK2(std::unique_ptr controlPacket); - void processNAK(std::unique_ptr controlPacket); - void processTimeoutNAK(std::unique_ptr controlPacket); - void processHandshake(std::unique_ptr controlPacket); - void processHandshakeACK(std::unique_ptr controlPacket); - void processProbeTail(std::unique_ptr controlPacket); + void processACK(ControlPacketPointer controlPacket); + void processLightACK(ControlPacketPointer controlPacket); + void processACK2(ControlPacketPointer controlPacket); + void processNAK(ControlPacketPointer controlPacket); + void processTimeoutNAK(ControlPacketPointer controlPacket); + void processHandshake(ControlPacketPointer controlPacket); + void processHandshakeACK(ControlPacketPointer controlPacket); + void processProbeTail(ControlPacketPointer controlPacket); void resetReceiveState(); void resetRTT(); @@ -171,7 +172,14 @@ private: std::map _pendingReceivedMessages; int _packetsSinceACK { 0 }; // The number of packets that have been received during the current ACK interval - + + // Re-used control packets + ControlPacketPointer _ackPacket; + ControlPacketPointer _lightACKPacket; + ControlPacketPointer _ack2Packet; + ControlPacketPointer _lossReport; + ControlPacketPointer _handshakeACK; + ConnectionStats _stats; }; From dcd425a165802880321ea23a439c1854495c1159 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Tue, 4 Oct 2016 10:56:44 -0700 Subject: [PATCH 113/300] Add an entityTree lock around the AvatarHoldAction::lateAvatarUpdate calls --- interface/src/avatar/MyAvatar.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 20c4f41568..19346e51db 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -2280,8 +2280,18 @@ void MyAvatar::removeHoldAction(AvatarActionHold* holdAction) { } void MyAvatar::updateHoldActions(const AnimPose& prePhysicsPose, const AnimPose& postUpdatePose) { - std::lock_guard guard(_holdActionsMutex); - for (auto& holdAction : _holdActions) { - holdAction->lateAvatarUpdate(prePhysicsPose, postUpdatePose); + EntityTreeRenderer* entityTreeRenderer = qApp->getEntities(); + EntityTreePointer entityTree = entityTreeRenderer ? entityTreeRenderer->getTree() : nullptr; + if (entityTree) { + // to prevent actions from adding or removing themselves from the _holdActions vector + // while we are iterating, we need to enter a critical section. + std::lock_guard guard(_holdActionsMutex); + + // lateAvatarUpdate will modify entity position & orientation, so we need an entity write lock + entityTree->withWriteLock([&] { + for (auto& holdAction : _holdActions) { + holdAction->lateAvatarUpdate(prePhysicsPose, postUpdatePose); + } + }); } } From cdd658d4dd842b0a708e6880f56544c6ee220332 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Tue, 4 Oct 2016 11:31:49 -0700 Subject: [PATCH 114/300] report results --- scripts/developer/tests/performance/summon.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/developer/tests/performance/summon.js b/scripts/developer/tests/performance/summon.js index cb3093ca5b..2eb1fbe301 100644 --- a/scripts/developer/tests/performance/summon.js +++ b/scripts/developer/tests/performance/summon.js @@ -91,4 +91,13 @@ Script.scriptEnding.connect(function () { }, 500); }); -messageSend({key: 'HELO'}); // Ask agents to report in now, before we start the tribbles. +messageSend({key: 'HELO'}); // Ask agents to report in now. +Script.setTimeout(function () { + if (0 === summonedAgents.length) { + Window.alert("No agents reported.\n\Please run " + MINIMUM_AVATARS + " instances of\n\ +http://cdn.highfidelity.com/davidkelly/production/scripts/tests/performance/crowd-agent.js\n\ +on your domain server."); + } else if (summonedAgents.length < MINIMUM_AVATARS) { + Window.alert("Only " + summonedAgents.length + " of the expected " + MINIMUM_AVATARS + " agents reported in."); + } +}, 5000); From 7261fcae4a8860a6afe5c570a1851db6caa2dddb Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Tue, 4 Oct 2016 14:35:23 -0700 Subject: [PATCH 115/300] possible fix for domain-server crash-on-exit --- libraries/shared/src/SettingInterface.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/shared/src/SettingInterface.cpp b/libraries/shared/src/SettingInterface.cpp index 95c6bc1efc..9db84055f7 100644 --- a/libraries/shared/src/SettingInterface.cpp +++ b/libraries/shared/src/SettingInterface.cpp @@ -34,7 +34,6 @@ namespace Setting { DependencyManager::destroy(); // - globalManager->deleteLater(); globalManager.reset(); // quit the settings manager thread and wait on it to make sure it's gone @@ -72,9 +71,9 @@ namespace Setting { globalManager = DependencyManager::set(); - QObject::connect(globalManager.data(), SIGNAL(destroyed()), thread, SLOT(quit())); QObject::connect(thread, SIGNAL(started()), globalManager.data(), SLOT(startTimer())); QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + QObject::connect(thread, SIGNAL(finished()), globalManager.data(), SLOT(deleteLater())); globalManager->moveToThread(thread); thread->start(); qCDebug(shared) << "Settings thread started."; From c683c82817b402bfb8c0836538b075c6f9102085 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 8 Sep 2016 14:55:51 -0700 Subject: [PATCH 116/300] Fix setting textures in model overlays --- interface/src/ui/overlays/ModelOverlay.cpp | 24 ++++++++++++---------- libraries/render-utils/src/Model.h | 2 +- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 0a89268f6b..74719aeeb6 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -123,17 +123,19 @@ void ModelOverlay::setProperties(const QVariantMap& properties) { auto texturesValue = properties["textures"]; if (texturesValue.isValid() && texturesValue.canConvert(QVariant::Map)) { QVariantMap textureMap = texturesValue.toMap(); - foreach(const QString& key, textureMap.keys()) { - - QUrl newTextureURL = textureMap[key].toUrl(); - qDebug() << "Updating texture named" << key << "to texture at URL" << newTextureURL; - - QMetaObject::invokeMethod(_model.get(), "setTextureWithNameToURL", Qt::AutoConnection, - Q_ARG(const QString&, key), - Q_ARG(const QUrl&, newTextureURL)); - - _modelTextures[key] = newTextureURL; // Keep local track of textures for getProperty() - } + QMetaObject::invokeMethod(_model.get(), "setTextures", Qt::AutoConnection, + Q_ARG(const QVariantMap&, textureMap)); +// foreach(const QString& key, textureMap.keys()) { +// +// QUrl newTextureURL = textureMap[key].toUrl(); +// qDebug() << "Updating texture named" << key << "to texture at URL" << newTextureURL; +// +// QMetaObject::invokeMethod(_model.get(), "setTextureWithNameToURL", Qt::AutoConnection, +// Q_ARG(const QString&, key), +// Q_ARG(const QUrl&, newTextureURL)); +// +// _modelTextures[key] = newTextureURL; // Keep local track of textures for getProperty() +// } } } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index bd94fb706b..0ab028f8eb 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -131,7 +131,7 @@ public: const Geometry::Pointer& getCollisionGeometry() const { return _collisionGeometry; } const QVariantMap getTextures() const { assert(isLoaded()); return _renderGeometry->getTextures(); } - void setTextures(const QVariantMap& textures); + Q_INVOKABLE void setTextures(const QVariantMap& textures); /// Provided as a convenience, will crash if !isLoaded() // And so that getGeometry() isn't chained everywhere From 93d995a5ae5bff53b087b32cfcb5d293329eed24 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 8 Sep 2016 15:59:17 -0700 Subject: [PATCH 117/300] Fix model overlay visible not working --- interface/src/ui/overlays/ModelOverlay.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 74719aeeb6..e299070dca 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -79,11 +79,10 @@ void ModelOverlay::render(RenderArgs* args) { _model->removeFromScene(scene, pendingChanges); _model->addToScene(scene, pendingChanges); } - scene->enqueuePendingChanges(pendingChanges); - if (!_visible) { - return; - } + _model->setVisibleInScene(_visible, scene); + + scene->enqueuePendingChanges(pendingChanges); } void ModelOverlay::setProperties(const QVariantMap& properties) { From 847a5cc7a1a494708dffcab640e992ed19a7b44f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Sep 2016 12:55:15 -0700 Subject: [PATCH 118/300] Remove old texture setting code in ModelOverlay --- interface/src/ui/overlays/ModelOverlay.cpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index e299070dca..694a1e1ddc 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -123,18 +123,7 @@ void ModelOverlay::setProperties(const QVariantMap& properties) { if (texturesValue.isValid() && texturesValue.canConvert(QVariant::Map)) { QVariantMap textureMap = texturesValue.toMap(); QMetaObject::invokeMethod(_model.get(), "setTextures", Qt::AutoConnection, - Q_ARG(const QVariantMap&, textureMap)); -// foreach(const QString& key, textureMap.keys()) { -// -// QUrl newTextureURL = textureMap[key].toUrl(); -// qDebug() << "Updating texture named" << key << "to texture at URL" << newTextureURL; -// -// QMetaObject::invokeMethod(_model.get(), "setTextureWithNameToURL", Qt::AutoConnection, -// Q_ARG(const QString&, key), -// Q_ARG(const QUrl&, newTextureURL)); -// -// _modelTextures[key] = newTextureURL; // Keep local track of textures for getProperty() -// } + Q_ARG(const QVariantMap&, textureMap)); } } From 289cd6ba2b25954dcebc91fbde4a4c266bcf7a82 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 9 Sep 2016 15:25:18 -0700 Subject: [PATCH 119/300] Adjust hand controller unequip rotation threshold --- scripts/system/controllers/handControllerGrab.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index 05edcdad03..892ace04eb 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -1849,7 +1849,7 @@ function MyController(hand) { z: 0 }; - var DROP_ANGLE = Math.PI / 6; + var DROP_ANGLE = Math.PI / 3; var HYSTERESIS_FACTOR = 1.1; var ROTATION_ENTER_THRESHOLD = Math.cos(DROP_ANGLE); var ROTATION_EXIT_THRESHOLD = Math.cos(DROP_ANGLE * HYSTERESIS_FACTOR); From 8343cfd68798b086bd217aaa29f74473bd9de50f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 9 Sep 2016 15:53:18 -0700 Subject: [PATCH 120/300] Add grip to unequip --- scripts/system/controllers/handControllerGrab.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index 892ace04eb..2d3aff44fc 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -1002,6 +1002,9 @@ function MyController(hand) { this.secondaryPress = function(value) { _this.rawSecondaryValue = value; + if (value > 0) { + _this.release(); + } }; this.updateSmoothedTrigger = function() { From 1fff480b73cd072cc7618f6e35c58963f5a5c337 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Sep 2016 13:23:02 -0700 Subject: [PATCH 121/300] Add timeout to AssetResourceRequest --- .../networking/src/AssetResourceRequest.cpp | 59 ++++++++++++++++++- .../networking/src/AssetResourceRequest.h | 6 ++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/libraries/networking/src/AssetResourceRequest.cpp b/libraries/networking/src/AssetResourceRequest.cpp index a8311c6146..8faf7082cd 100644 --- a/libraries/networking/src/AssetResourceRequest.cpp +++ b/libraries/networking/src/AssetResourceRequest.cpp @@ -14,6 +14,7 @@ #include "AssetClient.h" #include "AssetUtils.h" #include "MappingRequest.h" +#include AssetResourceRequest::~AssetResourceRequest() { if (_assetMappingRequest) { @@ -23,6 +24,10 @@ AssetResourceRequest::~AssetResourceRequest() { if (_assetRequest) { _assetRequest->deleteLater(); } + + if (_sendTimer) { + cleanupTimer(); + } } bool AssetResourceRequest::urlIsAssetHash() const { @@ -32,6 +37,25 @@ bool AssetResourceRequest::urlIsAssetHash() const { return hashRegex.exactMatch(_url.toString()); } +void AssetResourceRequest::setupTimer() { + Q_ASSERT(!_sendTimer); + static const int TIMEOUT_MS = 2000; + + _sendTimer = new QTimer(); + connect(this, &QObject::destroyed, _sendTimer, &QTimer::deleteLater); + connect(_sendTimer, &QTimer::timeout, this, &AssetResourceRequest::onTimeout); + + _sendTimer->setSingleShot(true); + _sendTimer->start(TIMEOUT_MS); +} + +void AssetResourceRequest::cleanupTimer() { + Q_ASSERT(_sendTimer); + disconnect(_sendTimer, 0, this, 0); + _sendTimer->deleteLater(); + _sendTimer = nullptr; +} + void AssetResourceRequest::doSend() { // We'll either have a hash or an ATP path to a file (that maps to a hash) if (urlIsAssetHash()) { @@ -58,6 +82,8 @@ void AssetResourceRequest::requestMappingForPath(const AssetPath& path) { Q_ASSERT(_state == InProgress); Q_ASSERT(request == _assetMappingRequest); + cleanupTimer(); + switch (request->getError()) { case MappingRequest::NoError: // we have no error, we should have a resulting hash - use that to send of a request for that asset @@ -93,6 +119,7 @@ void AssetResourceRequest::requestMappingForPath(const AssetPath& path) { _assetMappingRequest = nullptr; }); + setupTimer(); _assetMappingRequest->start(); } @@ -102,11 +129,15 @@ void AssetResourceRequest::requestHash(const AssetHash& hash) { auto assetClient = DependencyManager::get(); _assetRequest = assetClient->createRequest(hash); - connect(_assetRequest, &AssetRequest::progress, this, &AssetResourceRequest::progress); + connect(_assetRequest, &AssetRequest::progress, this, &AssetResourceRequest::onDownloadProgress); connect(_assetRequest, &AssetRequest::finished, this, [this](AssetRequest* req) { Q_ASSERT(_state == InProgress); Q_ASSERT(req == _assetRequest); Q_ASSERT(req->getState() == AssetRequest::Finished); + + cleanupTimer(); + + qDebug() << "Asset request finished, " << req->getHash() << "error: " << req->getError(); switch (req->getError()) { case AssetRequest::Error::NoError: @@ -134,9 +165,35 @@ void AssetResourceRequest::requestHash(const AssetHash& hash) { _assetRequest = nullptr; }); + setupTimer(); _assetRequest->start(); } void AssetResourceRequest::onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) { + Q_ASSERT(_state == InProgress); + + // We've received data, so reset the timer + _sendTimer->start(); + emit progress(bytesReceived, bytesTotal); } + +void AssetResourceRequest::onTimeout() { + if (_state == InProgress) { + qWarning() << "Asset request timed out: " << _url; + if (_assetRequest) { + disconnect(_assetRequest, 0, this, 0); + _assetRequest->deleteLater(); + _assetRequest = nullptr; + } + if (_assetMappingRequest) { + disconnect(_assetMappingRequest, 0, this, 0); + _assetMappingRequest->deleteLater(); + _assetMappingRequest = nullptr; + } + _result = Timeout; + _state = Finished; + emit finished(); + } + cleanupTimer(); +} diff --git a/libraries/networking/src/AssetResourceRequest.h b/libraries/networking/src/AssetResourceRequest.h index 6839db0628..c462fbc3f8 100644 --- a/libraries/networking/src/AssetResourceRequest.h +++ b/libraries/networking/src/AssetResourceRequest.h @@ -28,13 +28,19 @@ protected: private slots: void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal); + void onTimeout(); private: + void setupTimer(); + void cleanupTimer(); + bool urlIsAssetHash() const; void requestMappingForPath(const AssetPath& path); void requestHash(const AssetHash& hash); + QTimer* _sendTimer { nullptr }; + GetMappingRequest* _assetMappingRequest { nullptr }; AssetRequest* _assetRequest { nullptr }; }; From 3c374e8ee2ff4262ed85b9af4240a557b532413e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Sep 2016 16:21:41 -0700 Subject: [PATCH 122/300] Add retry logic to ScriptCache --- libraries/script-engine/src/ScriptCache.cpp | 66 ++++++++++++++++----- libraries/script-engine/src/ScriptCache.h | 11 +++- 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/libraries/script-engine/src/ScriptCache.cpp b/libraries/script-engine/src/ScriptCache.cpp index 91d7f36102..f8a2c02f10 100644 --- a/libraries/script-engine/src/ScriptCache.cpp +++ b/libraries/script-engine/src/ScriptCache.cpp @@ -25,6 +25,7 @@ #include "ScriptEngines.h" #include "ScriptEngineLogging.h" +#include ScriptCache::ScriptCache(QObject* parent) { // nothing to do here... @@ -133,8 +134,11 @@ void ScriptCache::getScriptContents(const QString& scriptOrURL, contentAvailable qCDebug(scriptengine) << "Found script in cache:" << url.toString(); contentAvailable(url.toString(), scriptContent, true, true); } else { - bool alreadyWaiting = _contentCallbacks.contains(url); - _contentCallbacks.insert(url, contentAvailable); + auto& scriptRequest = _activeScriptRequests[url]; + + bool alreadyWaiting = scriptRequest.scriptUsers.size() > 0; + scriptRequest.scriptUsers.push_back(contentAvailable); + lock.unlock(); if (alreadyWaiting) { @@ -152,6 +156,9 @@ void ScriptCache::getScriptContents(const QString& scriptOrURL, contentAvailable } } +static const int MAX_RETRIES = 5; +static int START_DELAY_BETWEEN_RETRIES = 200; + void ScriptCache::scriptContentAvailable() { #ifdef THREAD_DEBUGGING qCDebug(scriptengine) << "ScriptCache::scriptContentAvailable() on thread [" << QThread::currentThread() << "] expected thread [" << thread() << "]"; @@ -160,29 +167,60 @@ void ScriptCache::scriptContentAvailable() { QUrl url = req->getUrl(); QString scriptContent; - QList allCallbacks; + std::vector allCallbacks; + bool finished { false }; bool success { false }; { - Lock lock(_containerLock); - allCallbacks = _contentCallbacks.values(url); - _contentCallbacks.remove(url); Q_ASSERT(req->getState() == ResourceRequest::Finished); success = req->getResult() == ResourceRequest::Success; - if (success) { - _scriptCache[url] = scriptContent = req->getData(); - qCDebug(scriptengine) << "Done downloading script at:" << url.toString(); - } else { - // Dubious, but retained here because it matches the behavior before fixing the threading - scriptContent = _scriptCache[url]; - qCWarning(scriptengine) << "Error loading script from URL " << url; + Lock lock(_containerLock); + + if (_activeScriptRequests.contains(url)) { + auto& scriptRequest = _activeScriptRequests[url]; + + if (success) { + allCallbacks = scriptRequest.scriptUsers; + auto scriptContent = _scriptCache[url]; + + _activeScriptRequests.remove(url); + + _scriptCache[url] = scriptContent = req->getData(); + finished = true; + qCDebug(scriptengine) << "Done downloading script at:" << url.toString(); + } else { + if (scriptRequest.numRetries < MAX_RETRIES) { + ++scriptRequest.numRetries; + + qDebug() << "Script request failed: " << url; + + int timeout = exp(scriptRequest.numRetries) * START_DELAY_BETWEEN_RETRIES; + QTimer::singleShot(timeout, this, [this, url]() { + qDebug() << "Retrying script request: " << url; + + auto request = ResourceManager::createResourceRequest(nullptr, url); + Q_ASSERT(request); + + // We've already made a request, so the cache must be disabled or it wasn't there, so enabling + // it will do nothing. + request->setCacheEnabled(false); + connect(request, &ResourceRequest::finished, this, &ScriptCache::scriptContentAvailable); + request->send(); + }); + } else { + // Dubious, but retained here because it matches the behavior before fixing the threading + scriptContent = _scriptCache[url]; + finished = true; + qCWarning(scriptengine) << "Error loading script from URL " << url; + } + } } } req->deleteLater(); - if (!DependencyManager::get()->isStopped()) { + if (finished && !DependencyManager::get()->isStopped()) { foreach(contentAvailableCallback thisCallback, allCallbacks) { thisCallback(url.toString(), scriptContent, true, success); } diff --git a/libraries/script-engine/src/ScriptCache.h b/libraries/script-engine/src/ScriptCache.h index 5c0c235bd1..42feaac2ad 100644 --- a/libraries/script-engine/src/ScriptCache.h +++ b/libraries/script-engine/src/ScriptCache.h @@ -15,13 +15,19 @@ #include #include +using contentAvailableCallback = std::function; + class ScriptUser { public: virtual void scriptContentsAvailable(const QUrl& url, const QString& scriptContents) = 0; virtual void errorInLoadingScript(const QUrl& url) = 0; }; -using contentAvailableCallback = std::function; +class ScriptRequest { +public: + std::vector scriptUsers { }; + int numRetries { 0 }; +}; /// Interface for loading scripts class ScriptCache : public QObject, public Dependency { @@ -51,7 +57,8 @@ private: ScriptCache(QObject* parent = NULL); Mutex _containerLock; - QMultiMap _contentCallbacks; + QMap _activeScriptRequests; + //QMultiMap _contentCallbacks; QHash _scriptCache; QMultiMap _scriptUsers; From c6485cc50cb60866495c92b07b6c5c28853a93f8 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Sep 2016 16:56:08 -0700 Subject: [PATCH 123/300] Fix scriptcache only serving empty strings --- libraries/script-engine/src/ScriptCache.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptCache.cpp b/libraries/script-engine/src/ScriptCache.cpp index f8a2c02f10..d8d75bce64 100644 --- a/libraries/script-engine/src/ScriptCache.cpp +++ b/libraries/script-engine/src/ScriptCache.cpp @@ -182,7 +182,7 @@ void ScriptCache::scriptContentAvailable() { if (success) { allCallbacks = scriptRequest.scriptUsers; - auto scriptContent = _scriptCache[url]; + //auto scriptContent = _scriptCache[url]; _activeScriptRequests.remove(url); From ca4022814e3c81198c3d61d0b8a307b015494b01 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sun, 2 Oct 2016 21:18:13 -0700 Subject: [PATCH 124/300] Add extra logging to asset client --- libraries/networking/src/AssetClient.cpp | 6 ++++++ libraries/networking/src/AssetRequest.cpp | 6 +++++- libraries/networking/src/AssetRequest.h | 1 + libraries/script-engine/src/AssetScriptingInterface.cpp | 1 - 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp index 9583d4735d..624d98df7a 100644 --- a/libraries/networking/src/AssetClient.cpp +++ b/libraries/networking/src/AssetClient.cpp @@ -394,12 +394,14 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message auto senderNode = node.toStrongRef(); if (!senderNode) { + qCDebug(asset_client) << "Got completed asset for node that no longer exists"; return; } // Check if we have any pending requests for this node auto messageMapIt = _pendingRequests.find(senderNode); if (messageMapIt == _pendingRequests.end()) { + qCDebug(asset_client) << "Got completed asset for a node that doesn't have any pending requests"; return; } @@ -409,6 +411,7 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message // Check if we have this pending request auto requestIt = messageCallbackMap.find(messageID); if (requestIt == messageCallbackMap.end()) { + qCDebug(asset_client) << "Got completed asset for a request that doesn't exist"; return; } @@ -416,13 +419,16 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message auto& message = callbacks.message; if (!message) { + qCDebug(asset_client) << "Got completed asset for a message that doesn't exist"; return; } if (message->failed()) { + qCDebug(asset_client) << "Got failed asset"; callbacks.completeCallback(false, AssetServerError::NoError, QByteArray()); } else { + qCDebug(asset_client) << "Got asset"; callbacks.completeCallback(true, AssetServerError::NoError, message->readAll()); } diff --git a/libraries/networking/src/AssetRequest.cpp b/libraries/networking/src/AssetRequest.cpp index 4f0e812031..6f319df034 100644 --- a/libraries/networking/src/AssetRequest.cpp +++ b/libraries/networking/src/AssetRequest.cpp @@ -107,9 +107,11 @@ void AssetRequest::start() { auto assetClient = DependencyManager::get(); auto that = QPointer(this); // Used to track the request's lifetime + auto hash = _hash; _assetRequestID = assetClient->getAsset(_hash, start, end, - [this, that, start, end](bool responseReceived, AssetServerError serverError, const QByteArray& data) { + [this, that, hash, start, end](bool responseReceived, AssetServerError serverError, const QByteArray& data) { if (!that) { + qCWarning(asset_client) << "Got reply for dead asset request " << hash << "- error code" << _error; // If the request is dead, return return; } @@ -148,6 +150,8 @@ void AssetRequest::start() { if (_error != NoError) { qCWarning(asset_client) << "Got error retrieving asset" << _hash << "- error code" << _error; + } else { + qCDebug(asset_client) << "Received asset successfully: " << _hash; } _state = Finished; diff --git a/libraries/networking/src/AssetRequest.h b/libraries/networking/src/AssetRequest.h index c0bde9d8a8..0a6810b052 100644 --- a/libraries/networking/src/AssetRequest.h +++ b/libraries/networking/src/AssetRequest.h @@ -49,6 +49,7 @@ public: const State& getState() const { return _state; } const Error& getError() const { return _error; } QUrl getUrl() const { return ::getATPUrl(_hash); } + QString getHash() const { return _hash; } signals: void finished(AssetRequest* thisRequest); diff --git a/libraries/script-engine/src/AssetScriptingInterface.cpp b/libraries/script-engine/src/AssetScriptingInterface.cpp index 80cd30a8b6..32b1b5e792 100644 --- a/libraries/script-engine/src/AssetScriptingInterface.cpp +++ b/libraries/script-engine/src/AssetScriptingInterface.cpp @@ -21,7 +21,6 @@ AssetScriptingInterface::AssetScriptingInterface(QScriptEngine* engine) : _engine(engine) { - } void AssetScriptingInterface::uploadData(QString data, QScriptValue callback) { From 82aa1bafaddc711a699eaf898b39ebf5ab15da88 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 09:31:09 -0700 Subject: [PATCH 125/300] Update BatchLoader to use ScriptCache --- libraries/script-engine/src/BatchLoader.cpp | 33 ++++++++++----------- libraries/script-engine/src/ScriptCache.cpp | 1 - 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/libraries/script-engine/src/BatchLoader.cpp b/libraries/script-engine/src/BatchLoader.cpp index f3e6242216..15b3b6c853 100644 --- a/libraries/script-engine/src/BatchLoader.cpp +++ b/libraries/script-engine/src/BatchLoader.cpp @@ -13,12 +13,14 @@ #include #include +#include #include "ScriptEngineLogging.h" #include "BatchLoader.h" #include #include #include "ResourceManager.h" #include "ScriptEngines.h" +#include "ScriptCache.h" BatchLoader::BatchLoader(const QList& urls) : QObject(), @@ -38,30 +40,25 @@ void BatchLoader::start() { for (const auto& rawURL : _urls) { QUrl url = expandScriptUrl(normalizeScriptURL(rawURL)); - auto request = ResourceManager::createResourceRequest(this, url); - if (!request) { - _data.insert(url, QString()); - qCDebug(scriptengine) << "Could not load" << url; - continue; - } - connect(request, &ResourceRequest::finished, this, [=]() { - if (request->getResult() == ResourceRequest::Success) { - _data.insert(url, request->getData()); + + qCDebug(scriptengine) << "Loading script at " << url; + + QPointer self = this; + DependencyManager::get()->getScriptContents(url.toString(), [this, self](const QString& url, const QString& contents, bool isURL, bool success) { + if (!self) { + return; + } + if (isURL && success) { + _data.insert(url, contents); + qCDebug(scriptengine) << "Loaded: " << url; } else { _data.insert(url, QString()); qCDebug(scriptengine) << "Could not load" << url; } - request->deleteLater(); checkFinished(); - }); - - // If we end up being destroyed before the reply finishes, clean it up - connect(this, &QObject::destroyed, request, &QObject::deleteLater); - - qCDebug(scriptengine) << "Loading script at " << url; - - request->send(); + }, false); } + checkFinished(); } diff --git a/libraries/script-engine/src/ScriptCache.cpp b/libraries/script-engine/src/ScriptCache.cpp index d8d75bce64..e9f20b5164 100644 --- a/libraries/script-engine/src/ScriptCache.cpp +++ b/libraries/script-engine/src/ScriptCache.cpp @@ -182,7 +182,6 @@ void ScriptCache::scriptContentAvailable() { if (success) { allCallbacks = scriptRequest.scriptUsers; - //auto scriptContent = _scriptCache[url]; _activeScriptRequests.remove(url); From ae507c4609f7c81d8722221421a0e6c58ad04fda Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 22:26:10 -0700 Subject: [PATCH 126/300] Add ScriptCache to assignment clients --- assignment-client/src/AssignmentClient.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 800f00b352..3bea0ce31c 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -57,6 +57,7 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri auto scriptableAvatar = DependencyManager::set(); auto addressManager = DependencyManager::set(); auto scriptEngines = DependencyManager::set(); + DependencyManager::set(); // create a NodeList as an unassigned client, must be after addressManager auto nodeList = DependencyManager::set(NodeType::Unassigned, listenPort); From 9dfa3e4a17b40fc2b2865c6470f895782f4172db Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 08:21:40 -0700 Subject: [PATCH 127/300] Move ScriptCache from AssignmentClient to Agent --- assignment-client/src/Agent.cpp | 1 + assignment-client/src/AssignmentClient.cpp | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index c6a2a3d5e8..f4f5819361 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -62,6 +62,7 @@ Agent::Agent(ReceivedMessage& message) : DependencyManager::set(); DependencyManager::set(); DependencyManager::set(); + DependencyManager::set(); auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); diff --git a/assignment-client/src/AssignmentClient.cpp b/assignment-client/src/AssignmentClient.cpp index 3bea0ce31c..800f00b352 100644 --- a/assignment-client/src/AssignmentClient.cpp +++ b/assignment-client/src/AssignmentClient.cpp @@ -57,7 +57,6 @@ AssignmentClient::AssignmentClient(Assignment::Type requestAssignmentType, QStri auto scriptableAvatar = DependencyManager::set(); auto addressManager = DependencyManager::set(); auto scriptEngines = DependencyManager::set(); - DependencyManager::set(); // create a NodeList as an unassigned client, must be after addressManager auto nodeList = DependencyManager::set(NodeType::Unassigned, listenPort); From 392ecb0dae3e0f2c7a7bead747e85297af364cc6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 23 Sep 2016 16:41:44 -0700 Subject: [PATCH 128/300] Update interface to launch server --- interface/src/main.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 527b7f2331..3fc09636ed 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -29,6 +29,7 @@ #include "InterfaceLogging.h" #include "UserActivityLogger.h" #include "MainWindow.h" +#include #ifdef HAS_BUGSPLAT #include @@ -121,6 +122,27 @@ int main(int argc, const char* argv[]) { } } + QCommandLineParser parser; + QCommandLineOption runServer("runServer", "Whether to run the server"); + QCommandLineOption serverContentPath("serverContentPath", "Where to find server content", "serverContentPath"); + parser.addOption(runServer); + parser.addOption(serverContentPath); + parser.parse(arguments); + if (parser.isSet(runServer)) { + QString serverPath = QFileInfo(arguments[0]).path(); + serverPath += "/server-console/server-console.exe"; + //serverPath = "./server-console/server-console.exe"; + QStringList args; + if (parser.isSet(serverContentPath)) { + args << "--" << "--contentPath" << parser.value(serverContentPath); + } + qDebug() << "server path: " << serverPath << args; + qDebug() << QFileInfo(arguments[0]).path(); + qDebug() << QProcess::startDetached(serverPath, args); + + usleep(2000000); + } + QElapsedTimer startupTime; startupTime.start(); From fe6382d1b66ce3cb72c27e11c4790d9c0903264c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 23 Sep 2016 17:41:26 -0700 Subject: [PATCH 129/300] Update server content path to be relative --- interface/src/main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 3fc09636ed..7980d3de0f 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -134,7 +134,8 @@ int main(int argc, const char* argv[]) { //serverPath = "./server-console/server-console.exe"; QStringList args; if (parser.isSet(serverContentPath)) { - args << "--" << "--contentPath" << parser.value(serverContentPath); + QString serverContentPath = QFileInfo(arguments[0]).path() + "/" + parser.value(serverContentPath); + args << "--" << "--contentPath" << serverContentPath; } qDebug() << "server path: " << serverPath << args; qDebug() << QFileInfo(arguments[0]).path(); From 0aba1d3e54da35192a94eb51bf18ea1b7054726d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 26 Sep 2016 09:07:45 -0700 Subject: [PATCH 130/300] Fix server arguments causing crash on startup --- interface/src/main.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 7980d3de0f..8dd4414c6b 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -123,18 +123,18 @@ int main(int argc, const char* argv[]) { } QCommandLineParser parser; - QCommandLineOption runServer("runServer", "Whether to run the server"); - QCommandLineOption serverContentPath("serverContentPath", "Where to find server content", "serverContentPath"); - parser.addOption(runServer); - parser.addOption(serverContentPath); + QCommandLineOption runServerOption("runServer", "Whether to run the server"); + QCommandLineOption serverContentPathOption("serverContentPath", "Where to find server content", "serverContentPath"); + parser.addOption(runServerOption); + parser.addOption(serverContentPathOption); parser.parse(arguments); - if (parser.isSet(runServer)) { + if (parser.isSet(runServerOption)) { QString serverPath = QFileInfo(arguments[0]).path(); serverPath += "/server-console/server-console.exe"; //serverPath = "./server-console/server-console.exe"; QStringList args; - if (parser.isSet(serverContentPath)) { - QString serverContentPath = QFileInfo(arguments[0]).path() + "/" + parser.value(serverContentPath); + if (parser.isSet(serverContentPathOption)) { + QString serverContentPath = QFileInfo(arguments[0]).path() + "/" + parser.value(serverContentPathOption); args << "--" << "--contentPath" << serverContentPath; } qDebug() << "server path: " << serverPath << args; From 224c35d568caa23ffc1844c7fb66ee74ca2f0f6c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 09:30:25 -0700 Subject: [PATCH 131/300] Clean up launch server in main.cpp --- interface/src/main.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 8dd4414c6b..c2bc10eefc 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -129,18 +129,20 @@ int main(int argc, const char* argv[]) { parser.addOption(serverContentPathOption); parser.parse(arguments); if (parser.isSet(runServerOption)) { - QString serverPath = QFileInfo(arguments[0]).path(); - serverPath += "/server-console/server-console.exe"; - //serverPath = "./server-console/server-console.exe"; + //QString serverPath = QFileInfo(arguments[0]).path(); + QString applicationDirPath = QCoreApplication::applicationDirPath(); + QString serverPath = "/server-console/server-console.exe"; + qDebug() << "Application dir path is: " << applicationDirPath; + qDebug() << "Server path is: " << serverPath; QStringList args; if (parser.isSet(serverContentPathOption)) { QString serverContentPath = QFileInfo(arguments[0]).path() + "/" + parser.value(serverContentPathOption); args << "--" << "--contentPath" << serverContentPath; } - qDebug() << "server path: " << serverPath << args; qDebug() << QFileInfo(arguments[0]).path(); qDebug() << QProcess::startDetached(serverPath, args); + // Sleep a short amount of time to give the server a chance to start usleep(2000000); } From ff8f45d36c3fa7a96fe77ee67865d6ece6be648d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 15:45:19 -0700 Subject: [PATCH 132/300] Fix application directory path --- interface/src/main.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/interface/src/main.cpp b/interface/src/main.cpp index c2bc10eefc..3c4a3fd77a 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -129,9 +129,8 @@ int main(int argc, const char* argv[]) { parser.addOption(serverContentPathOption); parser.parse(arguments); if (parser.isSet(runServerOption)) { - //QString serverPath = QFileInfo(arguments[0]).path(); - QString applicationDirPath = QCoreApplication::applicationDirPath(); - QString serverPath = "/server-console/server-console.exe"; + QString applicationDirPath = QFileInfo(arguments[0]).path(); + QString serverPath = applicationDirPath + "/server-console/server-console.exe"; qDebug() << "Application dir path is: " << applicationDirPath; qDebug() << "Server path is: " << serverPath; QStringList args; From a52e2d8bc56bce0327a9968885a136a07b3dfe01 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sun, 2 Oct 2016 21:19:53 -0700 Subject: [PATCH 133/300] Add category to log lines --- libraries/shared/src/LogHandler.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index b67c86ecef..a0efdee2a8 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -137,9 +137,10 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont dateFormatPtr = &DATE_STRING_FORMAT_WITH_MILLISECONDS; } - QString prefixString = QString("[%1]").arg(QDateTime::currentDateTime().toString(*dateFormatPtr)); + QString prefixString = QString("[%1] [%2] [%3]").arg(QDateTime::currentDateTime().toString(*dateFormatPtr), + stringForLogType(type), context.category); - prefixString.append(QString(" [%1]").arg(stringForLogType(type))); + //prefixString.append(QString(" [%1]").arg(stringForLogType(type))); if (_shouldOutputProcessID) { prefixString.append(QString(" [%1]").arg(QCoreApplication::instance()->applicationPid())); From 2bb2aca2beac896dec09ca7255b141c2a947c287 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 16:54:37 -0700 Subject: [PATCH 134/300] Remove commented line in LogHandler --- libraries/shared/src/LogHandler.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/shared/src/LogHandler.cpp b/libraries/shared/src/LogHandler.cpp index a0efdee2a8..f003506aa7 100644 --- a/libraries/shared/src/LogHandler.cpp +++ b/libraries/shared/src/LogHandler.cpp @@ -140,8 +140,6 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont QString prefixString = QString("[%1] [%2] [%3]").arg(QDateTime::currentDateTime().toString(*dateFormatPtr), stringForLogType(type), context.category); - //prefixString.append(QString(" [%1]").arg(stringForLogType(type))); - if (_shouldOutputProcessID) { prefixString.append(QString(" [%1]").arg(QCoreApplication::instance()->applicationPid())); } From 972a611d0302a042e9c8b9b5d4bc172296722dee Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 4 Oct 2016 17:50:34 -0700 Subject: [PATCH 135/300] retain stereo on dead audio resampling --- libraries/audio-client/src/AudioClient.cpp | 6 +-- .../audio/src/MixedProcessedAudioStream.cpp | 40 +++++++++---------- .../audio/src/MixedProcessedAudioStream.h | 9 +++-- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index 16f4c35d21..d70730380f 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -1152,9 +1152,9 @@ bool AudioClient::outputLocalInjector(bool isStereo, AudioInjector* injector) { } void AudioClient::outputFormatChanged() { - int outputFormatChannelCountTimesSampleRate = _outputFormat.channelCount() * _outputFormat.sampleRate(); - _outputFrameSize = AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * outputFormatChannelCountTimesSampleRate / _desiredOutputFormat.sampleRate(); - _receivedAudioStream.outputFormatChanged(outputFormatChannelCountTimesSampleRate); + _outputFrameSize = (AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL * _outputFormat.channelCount() * _outputFormat.sampleRate()) / + _desiredOutputFormat.sampleRate(); + _receivedAudioStream.outputFormatChanged(_outputFormat.sampleRate(), _outputFormat.channelCount()); } bool AudioClient::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo) { diff --git a/libraries/audio/src/MixedProcessedAudioStream.cpp b/libraries/audio/src/MixedProcessedAudioStream.cpp index 88a1e071ec..6820a17a47 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.cpp +++ b/libraries/audio/src/MixedProcessedAudioStream.cpp @@ -17,27 +17,27 @@ static const int STEREO_FACTOR = 2; MixedProcessedAudioStream::MixedProcessedAudioStream(int numFrameSamples, int numFramesCapacity, int numStaticJitterFrames) : InboundAudioStream(numFrameSamples, numFramesCapacity, numStaticJitterFrames) {} -void MixedProcessedAudioStream::outputFormatChanged(int outputFormatChannelCountTimesSampleRate) { - _outputFormatChannelsTimesSampleRate = outputFormatChannelCountTimesSampleRate; - int deviceOutputFrameSize = networkToDeviceSamples(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO); - _ringBuffer.resizeForFrameSize(deviceOutputFrameSize); +void MixedProcessedAudioStream::outputFormatChanged(int sampleRate, int channelCount) { + _outputSampleRate = sampleRate; + _outputChannelCount = channelCount; + int deviceOutputFrameFrames = networkToDeviceFrames(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO / STEREO_FACTOR); + int deviceOutputFrameSamples = deviceOutputFrameFrames * STEREO_FACTOR; + _ringBuffer.resizeForFrameSize(deviceOutputFrameSamples); } int MixedProcessedAudioStream::writeDroppableSilentSamples(int silentSamples) { - - int deviceSilentSamplesWritten = InboundAudioStream::writeDroppableSilentSamples(networkToDeviceSamples(silentSamples)); - - emit addedSilence(deviceToNetworkSamples(deviceSilentSamplesWritten) / STEREO_FACTOR); - + int deviceSilentFrames = networkToDeviceFrames(silentSamples / STEREO_FACTOR); + int deviceSilentSamples = deviceSilentFrames * STEREO_FACTOR; + int deviceSilentSamplesWritten = InboundAudioStream::writeDroppableSilentSamples(deviceSilentSamples); + emit addedSilence(deviceToNetworkFrames(deviceSilentSamplesWritten / STEREO_FACTOR)); return deviceSilentSamplesWritten; } int MixedProcessedAudioStream::writeLastFrameRepeatedWithFade(int samples) { - - int deviceSamplesWritten = InboundAudioStream::writeLastFrameRepeatedWithFade(networkToDeviceSamples(samples)); - - emit addedLastFrameRepeatedWithFade(deviceToNetworkSamples(deviceSamplesWritten) / STEREO_FACTOR); - + int deviceFrames = networkToDeviceFrames(samples / STEREO_FACTOR); + int deviceSamples = deviceFrames * STEREO_FACTOR; + int deviceSamplesWritten = InboundAudioStream::writeLastFrameRepeatedWithFade(deviceSamples); + emit addedLastFrameRepeatedWithFade(deviceToNetworkFrames(deviceSamplesWritten / STEREO_FACTOR)); return deviceSamplesWritten; } @@ -60,12 +60,12 @@ int MixedProcessedAudioStream::parseAudioData(PacketType type, const QByteArray& return packetAfterStreamProperties.size(); } -int MixedProcessedAudioStream::networkToDeviceSamples(int networkSamples) { - return (quint64)networkSamples * (quint64)_outputFormatChannelsTimesSampleRate / (quint64)(STEREO_FACTOR - * AudioConstants::SAMPLE_RATE); +int MixedProcessedAudioStream::networkToDeviceFrames(int networkFrames) { + return ((quint64)networkFrames * _outputChannelCount * _outputSampleRate) / + (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE); } -int MixedProcessedAudioStream::deviceToNetworkSamples(int deviceSamples) { - return (quint64)deviceSamples * (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE) - / (quint64)_outputFormatChannelsTimesSampleRate; +int MixedProcessedAudioStream::deviceToNetworkFrames(int deviceFrames) { + return (quint64)deviceFrames * (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE) / + (_outputSampleRate * _outputChannelCount); } diff --git a/libraries/audio/src/MixedProcessedAudioStream.h b/libraries/audio/src/MixedProcessedAudioStream.h index f28586f484..d89ce9f7e3 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.h +++ b/libraries/audio/src/MixedProcessedAudioStream.h @@ -30,7 +30,7 @@ signals: void processSamples(const QByteArray& inputBuffer, QByteArray& outputBuffer); public: - void outputFormatChanged(int outputFormatChannelCountTimesSampleRate); + void outputFormatChanged(int sampleRate, int channelCount); protected: int writeDroppableSilentSamples(int silentSamples) override; @@ -38,11 +38,12 @@ protected: int parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties) override; private: - int networkToDeviceSamples(int networkSamples); - int deviceToNetworkSamples(int deviceSamples); + int networkToDeviceFrames(int networkFrames); + int deviceToNetworkFrames(int deviceFrames); private: - int _outputFormatChannelsTimesSampleRate; + quint64 _outputSampleRate; + quint64 _outputChannelCount; }; #endif // hifi_MixedProcessedAudioStream_h From 00fabb77b42383a31355d33938b96a0a6e114e21 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 4 Oct 2016 18:20:01 -0700 Subject: [PATCH 136/300] use proper audio frame naming --- libraries/audio/src/InboundAudioStream.cpp | 26 +++++++++---------- libraries/audio/src/InboundAudioStream.h | 8 +++--- .../audio/src/MixedProcessedAudioStream.cpp | 22 +++++++--------- .../audio/src/MixedProcessedAudioStream.h | 4 +-- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index a3fabad70f..71e8cb12ab 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -121,11 +121,11 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { packetReceivedUpdateTimingStats(); - int networkSamples; - + int networkFrames; + // parse the info after the seq number and before the audio data (the stream properties) int prePropertyPosition = message.getPosition(); - int propertyBytes = parseStreamProperties(message.getType(), message.readWithoutCopy(message.getBytesLeftToRead()), networkSamples); + int propertyBytes = parseStreamProperties(message.getType(), message.readWithoutCopy(message.getBytesLeftToRead()), networkFrames); message.seek(prePropertyPosition + propertyBytes); // handle this packet based on its arrival status. @@ -135,7 +135,7 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { // NOTE: we assume that each dropped packet contains the same number of samples // as the packet we just received. int packetsDropped = arrivalInfo._seqDiffFromExpected; - writeSamplesForDroppedPackets(packetsDropped * networkSamples); + writeFramesForDroppedPackets(packetsDropped * networkFrames); // fall through to OnTime case } @@ -143,7 +143,7 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { // Packet is on time; parse its data to the ringbuffer if (message.getType() == PacketType::SilentAudioFrame) { // FIXME - Some codecs need to know about these silent frames... and can produce better output - writeDroppableSilentSamples(networkSamples); + writeDroppableSilentFrames(networkFrames); } else { // note: PCM and no codec are identical bool selectedPCM = _selectedCodecName == "pcm" || _selectedCodecName == ""; @@ -153,7 +153,7 @@ int InboundAudioStream::parseData(ReceivedMessage& message) { parseAudioData(message.getType(), afterProperties); } else { qDebug() << "Codec mismatch: expected" << _selectedCodecName << "got" << codecInPacket << "writing silence"; - writeDroppableSilentSamples(networkSamples); + writeDroppableSilentFrames(networkFrames); // inform others of the mismatch auto sendingNode = DependencyManager::get()->nodeWithUUID(message.getSourceID()); emit mismatchedAudioCodec(sendingNode, _selectedCodecName, codecInPacket); @@ -218,9 +218,9 @@ int InboundAudioStream::parseAudioData(PacketType type, const QByteArray& packet return _ringBuffer.writeData(decodedBuffer.data(), actualSize); } -int InboundAudioStream::writeDroppableSilentSamples(int silentSamples) { +int InboundAudioStream::writeDroppableSilentFrames(int silentFrames) { if (_decoder) { - _decoder->trackLostFrames(silentSamples); + _decoder->trackLostFrames(silentFrames); } // calculate how many silent frames we should drop. @@ -228,12 +228,12 @@ int InboundAudioStream::writeDroppableSilentSamples(int silentSamples) { int desiredJitterBufferFramesPlusPadding = _desiredJitterBufferFrames + DESIRED_JITTER_BUFFER_FRAMES_PADDING; int numSilentFramesToDrop = 0; - if (silentSamples >= samplesPerFrame && _currentJitterBufferFrames > desiredJitterBufferFramesPlusPadding) { + if (silentFrames >= samplesPerFrame && _currentJitterBufferFrames > desiredJitterBufferFramesPlusPadding) { // our avg jitter buffer size exceeds its desired value, so ignore some silent // frames to get that size as close to desired as possible int numSilentFramesToDropDesired = _currentJitterBufferFrames - desiredJitterBufferFramesPlusPadding; - int numSilentFramesReceived = silentSamples / samplesPerFrame; + int numSilentFramesReceived = silentFrames / samplesPerFrame; numSilentFramesToDrop = std::min(numSilentFramesToDropDesired, numSilentFramesReceived); // dont reset _currentJitterBufferFrames here; we want to be able to drop further silent frames @@ -247,7 +247,7 @@ int InboundAudioStream::writeDroppableSilentSamples(int silentSamples) { _framesAvailableStat.reset(); } - int ret = _ringBuffer.addSilentSamples(silentSamples - numSilentFramesToDrop * samplesPerFrame); + int ret = _ringBuffer.addSilentSamples(silentFrames - numSilentFramesToDrop * samplesPerFrame); return ret; } @@ -414,8 +414,8 @@ void InboundAudioStream::packetReceivedUpdateTimingStats() { _lastPacketReceivedTime = now; } -int InboundAudioStream::writeSamplesForDroppedPackets(int networkSamples) { - return writeLastFrameRepeatedWithFade(networkSamples); +int InboundAudioStream::writeFramesForDroppedPackets(int networkFrames) { + return writeLastFrameRepeatedWithFade(networkFrames); } int InboundAudioStream::writeLastFrameRepeatedWithFade(int samples) { diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index 4c10c8c789..e72a45a01b 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -115,7 +115,7 @@ public slots: private: void packetReceivedUpdateTimingStats(); - int writeSamplesForDroppedPackets(int networkSamples); + int writeFramesForDroppedPackets(int networkFrames); void popSamplesNoCheck(int samples); void framesAvailableChanged(); @@ -134,12 +134,12 @@ protected: /// default implementation assumes packet contains raw audio samples after stream properties virtual int parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties); - /// writes silent samples to the buffer that may be dropped to reduce latency caused by the buffer - virtual int writeDroppableSilentSamples(int silentSamples); + /// writes silent frames to the buffer that may be dropped to reduce latency caused by the buffer + virtual int writeDroppableSilentFrames(int silentFrames); /// writes the last written frame repeatedly, gradually fading to silence. /// used for writing samples for dropped packets. - virtual int writeLastFrameRepeatedWithFade(int samples); + virtual int writeLastFrameRepeatedWithFade(int frames); protected: diff --git a/libraries/audio/src/MixedProcessedAudioStream.cpp b/libraries/audio/src/MixedProcessedAudioStream.cpp index 6820a17a47..ccaf35f1c4 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.cpp +++ b/libraries/audio/src/MixedProcessedAudioStream.cpp @@ -25,20 +25,18 @@ void MixedProcessedAudioStream::outputFormatChanged(int sampleRate, int channelC _ringBuffer.resizeForFrameSize(deviceOutputFrameSamples); } -int MixedProcessedAudioStream::writeDroppableSilentSamples(int silentSamples) { - int deviceSilentFrames = networkToDeviceFrames(silentSamples / STEREO_FACTOR); - int deviceSilentSamples = deviceSilentFrames * STEREO_FACTOR; - int deviceSilentSamplesWritten = InboundAudioStream::writeDroppableSilentSamples(deviceSilentSamples); - emit addedSilence(deviceToNetworkFrames(deviceSilentSamplesWritten / STEREO_FACTOR)); - return deviceSilentSamplesWritten; +int MixedProcessedAudioStream::writeDroppableSilentFrames(int silentFrames) { + int deviceSilentFrames = networkToDeviceFrames(silentFrames); + int deviceSilentFramesWritten = InboundAudioStream::writeDroppableSilentFrames(deviceSilentFrames); + emit addedSilence(deviceToNetworkFrames(deviceSilentFramesWritten)); + return deviceSilentFramesWritten; } -int MixedProcessedAudioStream::writeLastFrameRepeatedWithFade(int samples) { - int deviceFrames = networkToDeviceFrames(samples / STEREO_FACTOR); - int deviceSamples = deviceFrames * STEREO_FACTOR; - int deviceSamplesWritten = InboundAudioStream::writeLastFrameRepeatedWithFade(deviceSamples); - emit addedLastFrameRepeatedWithFade(deviceToNetworkFrames(deviceSamplesWritten / STEREO_FACTOR)); - return deviceSamplesWritten; +int MixedProcessedAudioStream::writeLastFrameRepeatedWithFade(int frames) { + int deviceFrames = networkToDeviceFrames(frames); + int deviceFramesWritten = InboundAudioStream::writeLastFrameRepeatedWithFade(deviceFrames); + emit addedLastFrameRepeatedWithFade(deviceToNetworkFrames(deviceFramesWritten)); + return deviceFramesWritten; } int MixedProcessedAudioStream::parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties) { diff --git a/libraries/audio/src/MixedProcessedAudioStream.h b/libraries/audio/src/MixedProcessedAudioStream.h index d89ce9f7e3..7071cf0e5a 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.h +++ b/libraries/audio/src/MixedProcessedAudioStream.h @@ -33,8 +33,8 @@ public: void outputFormatChanged(int sampleRate, int channelCount); protected: - int writeDroppableSilentSamples(int silentSamples) override; - int writeLastFrameRepeatedWithFade(int samples) override; + int writeDroppableSilentFrames(int silentFrames) override; + int writeLastFrameRepeatedWithFade(int frames) override; int parseAudioData(PacketType type, const QByteArray& packetAfterStreamProperties) override; private: From 05aded5c9d7d645c8ada7425d313dd0a2a48235c Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Tue, 4 Oct 2016 18:45:03 -0700 Subject: [PATCH 137/300] differentiate smaples/frames from dropped audio --- libraries/audio/src/InboundAudioStream.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 71e8cb12ab..35c90e51bd 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -224,16 +224,17 @@ int InboundAudioStream::writeDroppableSilentFrames(int silentFrames) { } // calculate how many silent frames we should drop. + int silentSamples = silentFrames * 2; int samplesPerFrame = _ringBuffer.getNumFrameSamples(); int desiredJitterBufferFramesPlusPadding = _desiredJitterBufferFrames + DESIRED_JITTER_BUFFER_FRAMES_PADDING; int numSilentFramesToDrop = 0; - if (silentFrames >= samplesPerFrame && _currentJitterBufferFrames > desiredJitterBufferFramesPlusPadding) { + if (silentSamples >= samplesPerFrame && _currentJitterBufferFrames > desiredJitterBufferFramesPlusPadding) { // our avg jitter buffer size exceeds its desired value, so ignore some silent // frames to get that size as close to desired as possible int numSilentFramesToDropDesired = _currentJitterBufferFrames - desiredJitterBufferFramesPlusPadding; - int numSilentFramesReceived = silentFrames / samplesPerFrame; + int numSilentFramesReceived = silentSamples / samplesPerFrame; numSilentFramesToDrop = std::min(numSilentFramesToDropDesired, numSilentFramesReceived); // dont reset _currentJitterBufferFrames here; we want to be able to drop further silent frames @@ -247,7 +248,7 @@ int InboundAudioStream::writeDroppableSilentFrames(int silentFrames) { _framesAvailableStat.reset(); } - int ret = _ringBuffer.addSilentSamples(silentFrames - numSilentFramesToDrop * samplesPerFrame); + int ret = _ringBuffer.addSilentSamples(silentSamples - numSilentFramesToDrop * samplesPerFrame); return ret; } @@ -418,10 +419,10 @@ int InboundAudioStream::writeFramesForDroppedPackets(int networkFrames) { return writeLastFrameRepeatedWithFade(networkFrames); } -int InboundAudioStream::writeLastFrameRepeatedWithFade(int samples) { +int InboundAudioStream::writeLastFrameRepeatedWithFade(int frames) { AudioRingBuffer::ConstIterator frameToRepeat = _ringBuffer.lastFrameWritten(); int frameSize = _ringBuffer.getNumFrameSamples(); - int samplesToWrite = samples; + int samplesToWrite = frames * 2; int indexOfRepeat = 0; do { int samplesToWriteThisIteration = std::min(samplesToWrite, frameSize); @@ -434,7 +435,7 @@ int InboundAudioStream::writeLastFrameRepeatedWithFade(int samples) { indexOfRepeat++; } while (samplesToWrite > 0); - return samples; + return frames; } AudioStreamStats InboundAudioStream::getAudioStreamStats() const { From 17c63eb722adca1d92224653351b496779083246 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 1 Sep 2016 14:56:11 -0700 Subject: [PATCH 138/300] Add the ability to ignore invisible entities in findRayIntersection --- .gitignore | 2 +- interface/src/ui/overlays/Line3DOverlay.cpp | 12 ++++++++ .../src/EntityTreeRenderer.cpp | 4 +-- .../src/EntityTreeRenderer.h | 2 +- .../entities/src/EntityScriptingInterface.cpp | 8 +++--- .../entities/src/EntityScriptingInterface.h | 4 +-- libraries/entities/src/EntityTree.cpp | 5 ++-- libraries/entities/src/EntityTree.h | 1 + libraries/entities/src/EntityTreeElement.cpp | 8 +++--- libraries/entities/src/EntityTreeElement.h | 4 +-- plugins/openvr/src/OpenVrHelpers.cpp | 2 ++ .../system/controllers/handControllerGrab.js | 28 +++++++++++++------ 12 files changed, 54 insertions(+), 26 deletions(-) diff --git a/.gitignore b/.gitignore index 4a1c1c227b..cd7fb34eaf 100644 --- a/.gitignore +++ b/.gitignore @@ -45,7 +45,7 @@ gvr-interface/libs/* # ignore files for various dev environments TAGS -*.swp +*.sw[po] # ignore node files for the console node_modules diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index c3a6c5920e..1616d4c2e2 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -124,6 +124,12 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { } properties.remove("start"); // so that Base3DOverlay doesn't respond to it + auto localStart = properties["localStart"]; + if (localStart.isValid()) { + _start = vec3FromVariant(localStart); + } + properties.remove("localStart"); // so that Base3DOverlay doesn't respond to it + auto end = properties["end"]; // if "end" property was not there, check to see if they included aliases: endPoint if (!end.isValid()) { @@ -133,6 +139,12 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { setEnd(vec3FromVariant(end)); } + auto localEnd = properties["localEnd"]; + if (localEnd.isValid()) { + _end = vec3FromVariant(localEnd); + } + properties.remove("localEnd"); // so that Base3DOverlay doesn't respond to it + auto glow = properties["glow"]; if (glow.isValid()) { setGlow(glow.toFloat()); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index 24d22fee96..f7b6b6b170 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -591,7 +591,7 @@ void EntityTreeRenderer::deleteReleasedModels() { RayToEntityIntersectionResult EntityTreeRenderer::findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, bool precisionPicking, const QVector& entityIdsToInclude, - const QVector& entityIdsToDiscard) { + const QVector& entityIdsToDiscard, bool visibleOnly) { RayToEntityIntersectionResult result; if (_tree) { EntityTreePointer entityTree = std::static_pointer_cast(_tree); @@ -599,7 +599,7 @@ RayToEntityIntersectionResult EntityTreeRenderer::findRayIntersectionWorker(cons OctreeElementPointer element; EntityItemPointer intersectedEntity = NULL; result.intersects = entityTree->findRayIntersection(ray.origin, ray.direction, element, result.distance, - result.face, result.surfaceNormal, entityIdsToInclude, entityIdsToDiscard, + result.face, result.surfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, (void**)&intersectedEntity, lockType, &result.accurate, precisionPicking); if (result.intersects && intersectedEntity) { diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index b1d875c2fb..5efa1d4a7f 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -149,7 +149,7 @@ private: QList _releasedModels; RayToEntityIntersectionResult findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, bool precisionPicking, const QVector& entityIdsToInclude = QVector(), - const QVector& entityIdsToDiscard = QVector()); + const QVector& entityIdsToDiscard = QVector(), bool visibleOnly=false); EntityItemID _currentHoverOverEntityID; EntityItemID _currentClickingOnEntityID; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index fe7fccaece..8a9ce97668 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -610,11 +610,11 @@ QVector EntityScriptingInterface::findEntitiesInFrustum(QVariantMap frust } RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersection(const PickRay& ray, bool precisionPicking, - const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard) { + const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard, bool visibleOnly) { QVector entitiesToInclude = qVectorEntityItemIDFromScriptValue(entityIdsToInclude); QVector entitiesToDiscard = qVectorEntityItemIDFromScriptValue(entityIdsToDiscard); - return findRayIntersectionWorker(ray, Octree::Lock, precisionPicking, entitiesToInclude, entitiesToDiscard); + return findRayIntersectionWorker(ray, Octree::Lock, precisionPicking, entitiesToInclude, entitiesToDiscard, visibleOnly); } // FIXME - we should remove this API and encourage all users to use findRayIntersection() instead. We've changed @@ -630,7 +630,7 @@ RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionBlock RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, - bool precisionPicking, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard) { + bool precisionPicking, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, bool visibleOnly) { RayToEntityIntersectionResult result; @@ -638,7 +638,7 @@ RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionWorke OctreeElementPointer element; EntityItemPointer intersectedEntity = NULL; result.intersects = _entityTree->findRayIntersection(ray.origin, ray.direction, element, result.distance, result.face, - result.surfaceNormal, entityIdsToInclude, entityIdsToDiscard, (void**)&intersectedEntity, lockType, &result.accurate, + result.surfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, (void**)&intersectedEntity, lockType, &result.accurate, precisionPicking); if (result.intersects && intersectedEntity) { result.entityID = intersectedEntity->getEntityItemID(); diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index d5934b1a8d..34b7d6f45b 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -143,7 +143,7 @@ public slots: /// If the scripting context has visible entities, this will determine a ray intersection, the results /// may be inaccurate if the engine is unable to access the visible entities, in which case result.accurate /// will be false. - Q_INVOKABLE RayToEntityIntersectionResult findRayIntersection(const PickRay& ray, bool precisionPicking = false, const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue()); + Q_INVOKABLE RayToEntityIntersectionResult findRayIntersection(const PickRay& ray, bool precisionPicking = false, const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue(), bool visibleOnly = false); /// If the scripting context has visible entities, this will determine a ray intersection, and will block in /// order to return an accurate result @@ -257,7 +257,7 @@ private: /// actually does the work of finding the ray intersection, can be called in locking mode or tryLock mode RayToEntityIntersectionResult findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, - bool precisionPicking, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard); + bool precisionPicking, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, bool visibleOnly = false); EntityTreePointer _entityTree; diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 89f469037e..df14c0bce5 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -549,6 +549,7 @@ public: glm::vec3& surfaceNormal; const QVector& entityIdsToInclude; const QVector& entityIdsToDiscard; + bool visibleOnly; void** intersectedObject; bool found; bool precisionPicking; @@ -561,7 +562,7 @@ bool findRayIntersectionOp(OctreeElementPointer element, void* extraData) { EntityTreeElementPointer entityTreeElementPointer = std::dynamic_pointer_cast(element); if (entityTreeElementPointer ->findRayIntersection(args->origin, args->direction, keepSearching, args->element, args->distance, args->face, args->surfaceNormal, args->entityIdsToInclude, - args->entityIdsToDiscard, args->intersectedObject, args->precisionPicking)) { + args->entityIdsToDiscard, args->visibleOnly, args->intersectedObject, args->precisionPicking)) { args->found = true; } return keepSearching; @@ -569,7 +570,7 @@ bool findRayIntersectionOp(OctreeElementPointer element, void* extraData) { bool EntityTree::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, OctreeElementPointer& element, float& distance, - BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, void** intersectedObject, + BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, bool visibleOnly, void** intersectedObject, Octree::lockType lockType, bool* accurateResult, bool precisionPicking) { RayArgs args = { origin, direction, element, distance, face, surfaceNormal, entityIdsToInclude, entityIdsToDiscard, intersectedObject, false, precisionPicking }; distance = FLT_MAX; diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 917b9333a5..434f7fcfce 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -92,6 +92,7 @@ public: OctreeElementPointer& node, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude = QVector(), const QVector& entityIdsToDiscard = QVector(), + bool visibleOnly = false, void** intersectedObject = NULL, Octree::lockType lockType = Octree::TryLock, bool* accurateResult = NULL, diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 29274d2e72..110153b08c 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -534,7 +534,7 @@ bool EntityTreeElement::bestFitBounds(const glm::vec3& minPoint, const glm::vec3 bool EntityTreeElement::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, - const QVector& entityIdsToDiscard, void** intersectedObject, bool precisionPicking) { + const QVector& entityIdsToDiscard, bool visibleOnly, void** intersectedObject, bool precisionPicking) { keepSearching = true; // assume that we will continue searching after this. @@ -559,7 +559,7 @@ bool EntityTreeElement::findRayIntersection(const glm::vec3& origin, const glm:: if (_cube.contains(origin) || distanceToElementCube < distance) { if (findDetailedRayIntersection(origin, direction, keepSearching, element, distanceToElementDetails, - face, localSurfaceNormal, entityIdsToInclude, entityIdsToDiscard, intersectedObject, precisionPicking, distanceToElementCube)) { + face, localSurfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, intersectedObject, precisionPicking, distanceToElementCube)) { if (distanceToElementDetails < distance) { distance = distanceToElementDetails; @@ -574,13 +574,13 @@ bool EntityTreeElement::findRayIntersection(const glm::vec3& origin, const glm:: bool EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, - const QVector& entityIdsToInclude, const QVector& entityIDsToDiscard, void** intersectedObject, bool precisionPicking, float distanceToElementCube) { + const QVector& entityIdsToInclude, const QVector& entityIDsToDiscard, bool visibleOnly, void** intersectedObject, bool precisionPicking, float distanceToElementCube) { // only called if we do intersect our bounding cube, but find if we actually intersect with entities... int entityNumber = 0; bool somethingIntersected = false; forEachEntity([&](EntityItemPointer entity) { - if ( (entityIdsToInclude.size() > 0 && !entityIdsToInclude.contains(entity->getID())) || (entityIDsToDiscard.size() > 0 && entityIDsToDiscard.contains(entity->getID())) ) { + if ( (visibleOnly && !entity->isVisible()) || (entityIdsToInclude.size() > 0 && !entityIdsToInclude.contains(entity->getID())) || (entityIDsToDiscard.size() > 0 && entityIDsToDiscard.contains(entity->getID())) ) { return; } diff --git a/libraries/entities/src/EntityTreeElement.h b/libraries/entities/src/EntityTreeElement.h index d92dfa52dc..2f92e45726 100644 --- a/libraries/entities/src/EntityTreeElement.h +++ b/libraries/entities/src/EntityTreeElement.h @@ -147,12 +147,12 @@ public: virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElementPointer& node, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, - const QVector& entityIdsToDiscard, + const QVector& entityIdsToDiscard, bool visibleOnly = false, void** intersectedObject = NULL, bool precisionPicking = false); virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, - const QVector& entityIdsToDiscard, + const QVector& entityIdsToDiscard, bool visibleOnly, void** intersectedObject, bool precisionPicking, float distanceToElementCube); virtual bool findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration, void** penetratedObject) const override; diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index 820476191a..c06866d2f1 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -366,6 +366,8 @@ controller::Pose openVrControllerPoseToHandPose(bool isLeftHand, const mat4& mat auto translationOffset = (isLeftHand ? leftTranslationOffset : rightTranslationOffset); auto rotationOffset = (isLeftHand ? leftRotationOffset : rightRotationOffset); + //qDebug() << "TRANSLATION OFFSET: " << isLeftHand << ", " << translationOffset.x << ", " << translationOffset.y << ", " << translationOffset.z; + glm::vec3 position = extractTranslation(mat); glm::quat rotation = glm::normalize(glm::quat_cast(mat)); diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index 05edcdad03..f11fb3129b 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -1605,7 +1605,6 @@ function MyController(hand) { }; this.distanceHoldingEnter = function() { - Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'both'); this.clearEquipHaptics(); this.grabPointSphereOff(); @@ -1869,12 +1868,12 @@ function MyController(hand) { }; this.nearGrabbingEnter = function() { - if (this.hand === 0) { - Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'left'); - } - if (this.hand === 1) { - Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'right'); - } + //if (this.hand === 0) { + //Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'left'); + //} + //if (this.hand === 1) { + //Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'right'); + //} this.grabPointSphereOff(); this.lineOff(); this.overlayLineOff(); @@ -2340,7 +2339,6 @@ function MyController(hand) { }; this.release = function() { - Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); this.turnOffVisualizations(); var noVelocity = false; @@ -2711,6 +2709,20 @@ var handleHandMessages = function(channel, message, sender) { } handToDisable = message; } + } else if (channel === 'Hifi-Grab-Disable') { + data = JSON.parse(message); + if (data.holdEnabled !== undefined) { + print("holdEnabled: ", data.holdEnabled); + holdEnabled = data.holdEnabled; + } + if (data.nearGrabEnabled !== undefined) { + print("nearGrabEnabled: ", data.nearGrabEnabled); + nearGrabEnabled = data.nearGrabEnabled; + } + if (data.farGrabEnabled !== undefined) { + print("farGrabEnabled: ", data.farGrabEnabled); + farGrabEnabled = data.farGrabEnabled; + } } else if (channel === 'Hifi-Hand-Grab') { try { data = JSON.parse(message); From b0c7e91737255b5c87218f89f746577d41360a7f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 1 Sep 2016 15:33:12 -0700 Subject: [PATCH 139/300] Disable ray picking against invisible objects in far grab and teleport --- libraries/entities/src/EntityTree.cpp | 2 +- scripts/system/controllers/handControllerGrab.js | 8 ++++---- scripts/system/controllers/teleport.js | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index df14c0bce5..2e9fdf136a 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -572,7 +572,7 @@ bool EntityTree::findRayIntersection(const glm::vec3& origin, const glm::vec3& d OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, bool visibleOnly, void** intersectedObject, Octree::lockType lockType, bool* accurateResult, bool precisionPicking) { - RayArgs args = { origin, direction, element, distance, face, surfaceNormal, entityIdsToInclude, entityIdsToDiscard, intersectedObject, false, precisionPicking }; + RayArgs args = { origin, direction, element, distance, face, surfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, intersectedObject, false, precisionPicking }; distance = FLT_MAX; bool requireLock = lockType == Octree::Lock; diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index f11fb3129b..764fd705cb 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -344,7 +344,7 @@ function entityHasActions(entityID) { } function findRayIntersection(pickRay, precise, include, exclude) { - var entities = Entities.findRayIntersection(pickRay, precise, include, exclude); + var entities = Entities.findRayIntersection(pickRay, precise, include, exclude, true); var overlays = Overlays.findRayIntersection(pickRay); if (!overlays.intersects || (entities.intersects && (entities.distance <= overlays.distance))) { return entities; @@ -1155,9 +1155,9 @@ function MyController(hand) { var intersection; if (USE_BLACKLIST === true && blacklist.length !== 0) { - intersection = findRayIntersection(pickRay, true, [], blacklist); + intersection = findRayIntersection(pickRay, true, [], blacklist, true); } else { - intersection = findRayIntersection(pickRay, true); + intersection = findRayIntersection(pickRay, true, [], [], true); } if (intersection.intersects) { @@ -2211,7 +2211,7 @@ function MyController(hand) { var now = Date.now(); if (now - this.lastPickTime > MSECS_PER_SEC / PICKS_PER_SECOND_PER_HAND) { - var intersection = findRayIntersection(pickRay, true); + var intersection = findRayIntersection(pickRay, true, [], [], true); if (intersection.accurate || intersection.overlayID) { this.lastPickTime = now; if (intersection.entityID != this.grabbedEntity) { diff --git a/scripts/system/controllers/teleport.js b/scripts/system/controllers/teleport.js index b4a8eefcd2..3cd0615d2e 100644 --- a/scripts/system/controllers/teleport.js +++ b/scripts/system/controllers/teleport.js @@ -279,7 +279,7 @@ function Teleporter() { var location = Vec3.sum(rightPickRay.origin, Vec3.multiply(rightPickRay.direction, 50)); - var rightIntersection = Entities.findRayIntersection(teleporter.rightPickRay, true, [], [this.targetEntity]); + var rightIntersection = Entities.findRayIntersection(teleporter.rightPickRay, true, [], [this.targetEntity], true); if (rightIntersection.intersects) { if (this.tooClose === true) { @@ -342,7 +342,7 @@ function Teleporter() { var location = Vec3.sum(MyAvatar.position, Vec3.multiply(leftPickRay.direction, 50)); - var leftIntersection = Entities.findRayIntersection(teleporter.leftPickRay, true, [], [this.targetEntity]); + var leftIntersection = Entities.findRayIntersection(teleporter.leftPickRay, true, [], [this.targetEntity], true); if (leftIntersection.intersects) { From da6afb605bf2cfeee45f424c50484da76ab14b47 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 13:42:16 -0700 Subject: [PATCH 140/300] Fix default findRayIntersection surfaceNormal to be in world space --- libraries/entities/src/EntityTreeElement.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 110153b08c..ca22038f03 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -638,7 +638,7 @@ bool EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, con if (localDistance < distance && entity->getType() != EntityTypes::ParticleEffect) { distance = localDistance; face = localFace; - surfaceNormal = localSurfaceNormal; + surfaceNormal = glm::vec3(rotation * glm::vec4(localSurfaceNormal, 1.0f)); *intersectedObject = (void*)entity.get(); somethingIntersected = true; } From 75265cff6e31d990cfbabb37048dac9c6c6d8915 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 13:42:52 -0700 Subject: [PATCH 141/300] Update teleport to not let you teleport into walls --- scripts/system/controllers/teleport.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/scripts/system/controllers/teleport.js b/scripts/system/controllers/teleport.js index 3cd0615d2e..e7f12720f0 100644 --- a/scripts/system/controllers/teleport.js +++ b/scripts/system/controllers/teleport.js @@ -459,7 +459,7 @@ function Teleporter() { z: intersection.intersection.z }; - this.tooClose = isTooCloseToTeleport(position); + this.tooClose = isTooCloseToTeleport(position, intersection.surfaceNormal); var towardUs = Quat.fromPitchYawRollDegrees(0, euler.y, 0); Overlays.editOverlay(this.targetOverlay, { @@ -480,7 +480,7 @@ function Teleporter() { z: intersection.intersection.z }; - this.tooClose = isTooCloseToTeleport(position); + this.tooClose = isTooCloseToTeleport(position, intersection.surfaceNormal); var towardUs = Quat.fromPitchYawRollDegrees(0, euler.y, 0); Overlays.editOverlay(this.cancelOverlay, { @@ -627,8 +627,11 @@ function isMoving() { } }; -function isTooCloseToTeleport(position) { - return Vec3.distance(MyAvatar.position, position) <= TELEPORT_CANCEL_RANGE; +function isTooCloseToTeleport(position, surfaceNormal) { + var adj = Math.sqrt(surfaceNormal.x * surfaceNormal.x + surfaceNormal.z * surfaceNormal.z); + var angleUp = Math.atan2(surfaceNormal.y, adj) * (180 / Math.PI); + //print(angleUp); + return angleUp < 80 || angleUp > 110 || Vec3.distance(MyAvatar.position, position) <= TELEPORT_CANCEL_RANGE; }; function registerMappings() { From ee5046921348683d994b9a5978dd2c8cd2958e4f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 14 Sep 2016 13:43:13 -0700 Subject: [PATCH 142/300] Add collidableOnly arg to findRayIntersection --- .../src/EntityTreeRenderer.cpp | 10 +++--- .../src/EntityTreeRenderer.h | 3 +- .../entities/src/EntityScriptingInterface.cpp | 15 ++++---- .../entities/src/EntityScriptingInterface.h | 7 ++-- libraries/entities/src/EntityTree.cpp | 33 ++++++----------- libraries/entities/src/EntityTree.h | 36 ++++++++++++++----- libraries/entities/src/EntityTreeElement.cpp | 13 ++++--- libraries/entities/src/EntityTreeElement.h | 4 +-- 8 files changed, 69 insertions(+), 52 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index f7b6b6b170..2ef2beb274 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -591,17 +591,17 @@ void EntityTreeRenderer::deleteReleasedModels() { RayToEntityIntersectionResult EntityTreeRenderer::findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, bool precisionPicking, const QVector& entityIdsToInclude, - const QVector& entityIdsToDiscard, bool visibleOnly) { + const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) { RayToEntityIntersectionResult result; if (_tree) { EntityTreePointer entityTree = std::static_pointer_cast(_tree); OctreeElementPointer element; EntityItemPointer intersectedEntity = NULL; - result.intersects = entityTree->findRayIntersection(ray.origin, ray.direction, element, result.distance, - result.face, result.surfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, - (void**)&intersectedEntity, lockType, &result.accurate, - precisionPicking); + result.intersects = entityTree->findRayIntersection(ray.origin, ray.direction, + entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly, precisionPicking, + element, result.distance, result.face, result.surfaceNormal, + (void**)&intersectedEntity, lockType, &result.accurate); if (result.intersects && intersectedEntity) { result.entityID = intersectedEntity->getEntityItemID(); result.properties = intersectedEntity->getProperties(); diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.h b/libraries/entities-renderer/src/EntityTreeRenderer.h index 5efa1d4a7f..36e52e6f46 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.h +++ b/libraries/entities-renderer/src/EntityTreeRenderer.h @@ -149,7 +149,8 @@ private: QList _releasedModels; RayToEntityIntersectionResult findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, bool precisionPicking, const QVector& entityIdsToInclude = QVector(), - const QVector& entityIdsToDiscard = QVector(), bool visibleOnly=false); + const QVector& entityIdsToDiscard = QVector(), bool visibleOnly=false, + bool collidableOnly = false); EntityItemID _currentHoverOverEntityID; EntityItemID _currentClickingOnEntityID; diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 8a9ce97668..ec48a08a74 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -610,11 +610,11 @@ QVector EntityScriptingInterface::findEntitiesInFrustum(QVariantMap frust } RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersection(const PickRay& ray, bool precisionPicking, - const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard, bool visibleOnly) { + const QScriptValue& entityIdsToInclude, const QScriptValue& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) { QVector entitiesToInclude = qVectorEntityItemIDFromScriptValue(entityIdsToInclude); QVector entitiesToDiscard = qVectorEntityItemIDFromScriptValue(entityIdsToDiscard); - return findRayIntersectionWorker(ray, Octree::Lock, precisionPicking, entitiesToInclude, entitiesToDiscard, visibleOnly); + return findRayIntersectionWorker(ray, Octree::Lock, precisionPicking, entitiesToInclude, entitiesToDiscard, visibleOnly, collidableOnly); } // FIXME - we should remove this API and encourage all users to use findRayIntersection() instead. We've changed @@ -629,17 +629,18 @@ RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionBlock } RayToEntityIntersectionResult EntityScriptingInterface::findRayIntersectionWorker(const PickRay& ray, - Octree::lockType lockType, - bool precisionPicking, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, bool visibleOnly) { + Octree::lockType lockType, bool precisionPicking, const QVector& entityIdsToInclude, + const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly) { RayToEntityIntersectionResult result; if (_entityTree) { OctreeElementPointer element; EntityItemPointer intersectedEntity = NULL; - result.intersects = _entityTree->findRayIntersection(ray.origin, ray.direction, element, result.distance, result.face, - result.surfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, (void**)&intersectedEntity, lockType, &result.accurate, - precisionPicking); + result.intersects = _entityTree->findRayIntersection(ray.origin, ray.direction, + entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly, precisionPicking, + element, result.distance, result.face, result.surfaceNormal, + (void**)&intersectedEntity, lockType, &result.accurate); if (result.intersects && intersectedEntity) { result.entityID = intersectedEntity->getEntityItemID(); result.properties = intersectedEntity->getProperties(); diff --git a/libraries/entities/src/EntityScriptingInterface.h b/libraries/entities/src/EntityScriptingInterface.h index 34b7d6f45b..3a24ff59fd 100644 --- a/libraries/entities/src/EntityScriptingInterface.h +++ b/libraries/entities/src/EntityScriptingInterface.h @@ -143,7 +143,9 @@ public slots: /// If the scripting context has visible entities, this will determine a ray intersection, the results /// may be inaccurate if the engine is unable to access the visible entities, in which case result.accurate /// will be false. - Q_INVOKABLE RayToEntityIntersectionResult findRayIntersection(const PickRay& ray, bool precisionPicking = false, const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue(), bool visibleOnly = false); + Q_INVOKABLE RayToEntityIntersectionResult findRayIntersection(const PickRay& ray, bool precisionPicking = false, + const QScriptValue& entityIdsToInclude = QScriptValue(), const QScriptValue& entityIdsToDiscard = QScriptValue(), + bool visibleOnly = false, bool collidableOnly = false); /// If the scripting context has visible entities, this will determine a ray intersection, and will block in /// order to return an accurate result @@ -257,7 +259,8 @@ private: /// actually does the work of finding the ray intersection, can be called in locking mode or tryLock mode RayToEntityIntersectionResult findRayIntersectionWorker(const PickRay& ray, Octree::lockType lockType, - bool precisionPicking, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, bool visibleOnly = false); + bool precisionPicking, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, + bool visibleOnly = false, bool collidableOnly = false); EntityTreePointer _entityTree; diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 2e9fdf136a..4cbfb4f5dc 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -538,41 +538,28 @@ bool EntityTree::findNearPointOperation(OctreeElementPointer element, void* extr // if this element doesn't contain the point, then none of its children can contain the point, so stop searching return false; } -// combines the ray cast arguments into a single object -class RayArgs { -public: - glm::vec3 origin; - glm::vec3 direction; - OctreeElementPointer& element; - float& distance; - BoxFace& face; - glm::vec3& surfaceNormal; - const QVector& entityIdsToInclude; - const QVector& entityIdsToDiscard; - bool visibleOnly; - void** intersectedObject; - bool found; - bool precisionPicking; -}; - bool findRayIntersectionOp(OctreeElementPointer element, void* extraData) { RayArgs* args = static_cast(extraData); bool keepSearching = true; EntityTreeElementPointer entityTreeElementPointer = std::dynamic_pointer_cast(element); - if (entityTreeElementPointer ->findRayIntersection(args->origin, args->direction, keepSearching, + if (entityTreeElementPointer->findRayIntersection(args->origin, args->direction, keepSearching, args->element, args->distance, args->face, args->surfaceNormal, args->entityIdsToInclude, - args->entityIdsToDiscard, args->visibleOnly, args->intersectedObject, args->precisionPicking)) { + args->entityIdsToDiscard, args->visibleOnly, args->collidableOnly, args->intersectedObject, args->precisionPicking)) { args->found = true; } return keepSearching; } bool EntityTree::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - OctreeElementPointer& element, float& distance, - BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, const QVector& entityIdsToDiscard, bool visibleOnly, void** intersectedObject, - Octree::lockType lockType, bool* accurateResult, bool precisionPicking) { - RayArgs args = { origin, direction, element, distance, face, surfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, intersectedObject, false, precisionPicking }; + QVector entityIdsToInclude, QVector entityIdsToDiscard, + bool visibleOnly, bool collidableOnly, bool precisionPicking, + OctreeElementPointer& element, float& distance, + BoxFace& face, glm::vec3& surfaceNormal, void** intersectedObject, + Octree::lockType lockType, bool* accurateResult) { + RayArgs args = { origin, direction, entityIdsToInclude, entityIdsToDiscard, + visibleOnly, collidableOnly, precisionPicking, + element, distance, face, surfaceNormal, intersectedObject, false }; distance = FLT_MAX; bool requireLock = lockType == Octree::Lock; diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 434f7fcfce..80169492f7 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -31,6 +31,29 @@ using ModelWeakPointer = std::weak_ptr; class EntitySimulation; + +// combines the ray cast arguments into a single object +class RayArgs { +public: + // Inputs + glm::vec3 origin; + glm::vec3 direction; + const QVector& entityIdsToInclude; + const QVector& entityIdsToDiscard; + bool visibleOnly; + bool collidableOnly; + bool precisionPicking; + + // Outputs + OctreeElementPointer& element; + float& distance; + BoxFace& face; + glm::vec3& surfaceNormal; + void** intersectedObject; + bool found; +}; + + class NewlyCreatedEntityHook { public: virtual void entityCreated(const EntityItem& newEntity, const SharedNodePointer& senderNode) = 0; @@ -89,14 +112,11 @@ public: const SharedNodePointer& senderNode) override; virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, - OctreeElementPointer& node, float& distance, BoxFace& face, glm::vec3& surfaceNormal, - const QVector& entityIdsToInclude = QVector(), - const QVector& entityIdsToDiscard = QVector(), - bool visibleOnly = false, - void** intersectedObject = NULL, - Octree::lockType lockType = Octree::TryLock, - bool* accurateResult = NULL, - bool precisionPicking = false); + QVector entityIdsToInclude, QVector entityIdsToDiscard, + bool visibleOnly, bool collidableOnly, bool precisionPicking, + OctreeElementPointer& node, float& distance, + BoxFace& face, glm::vec3& surfaceNormal, void** intersectedObject = NULL, + Octree::lockType lockType = Octree::TryLock, bool* accurateResult = NULL); virtual bool rootElementHasData() const override { return true; } diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index ca22038f03..629a6b37e4 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -534,7 +534,8 @@ bool EntityTreeElement::bestFitBounds(const glm::vec3& minPoint, const glm::vec3 bool EntityTreeElement::findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, - const QVector& entityIdsToDiscard, bool visibleOnly, void** intersectedObject, bool precisionPicking) { + const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly, + void** intersectedObject, bool precisionPicking) { keepSearching = true; // assume that we will continue searching after this. @@ -559,7 +560,8 @@ bool EntityTreeElement::findRayIntersection(const glm::vec3& origin, const glm:: if (_cube.contains(origin) || distanceToElementCube < distance) { if (findDetailedRayIntersection(origin, direction, keepSearching, element, distanceToElementDetails, - face, localSurfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, intersectedObject, precisionPicking, distanceToElementCube)) { + face, localSurfaceNormal, entityIdsToInclude, entityIdsToDiscard, visibleOnly, collidableOnly, + intersectedObject, precisionPicking, distanceToElementCube)) { if (distanceToElementDetails < distance) { distance = distanceToElementDetails; @@ -574,13 +576,16 @@ bool EntityTreeElement::findRayIntersection(const glm::vec3& origin, const glm:: bool EntityTreeElement::findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, - const QVector& entityIdsToInclude, const QVector& entityIDsToDiscard, bool visibleOnly, void** intersectedObject, bool precisionPicking, float distanceToElementCube) { + const QVector& entityIdsToInclude, const QVector& entityIDsToDiscard, + bool visibleOnly, bool collidableOnly, void** intersectedObject, bool precisionPicking, float distanceToElementCube) { // only called if we do intersect our bounding cube, but find if we actually intersect with entities... int entityNumber = 0; bool somethingIntersected = false; forEachEntity([&](EntityItemPointer entity) { - if ( (visibleOnly && !entity->isVisible()) || (entityIdsToInclude.size() > 0 && !entityIdsToInclude.contains(entity->getID())) || (entityIDsToDiscard.size() > 0 && entityIDsToDiscard.contains(entity->getID())) ) { + if ( (visibleOnly && !entity->isVisible()) || (collidableOnly && (entity->getCollisionless() || entity->getShapeType() == SHAPE_TYPE_NONE)) + || (entityIdsToInclude.size() > 0 && !entityIdsToInclude.contains(entity->getID())) + || (entityIDsToDiscard.size() > 0 && entityIDsToDiscard.contains(entity->getID())) ) { return; } diff --git a/libraries/entities/src/EntityTreeElement.h b/libraries/entities/src/EntityTreeElement.h index 2f92e45726..e411e8077b 100644 --- a/libraries/entities/src/EntityTreeElement.h +++ b/libraries/entities/src/EntityTreeElement.h @@ -147,12 +147,12 @@ public: virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElementPointer& node, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, - const QVector& entityIdsToDiscard, bool visibleOnly = false, + const QVector& entityIdsToDiscard, bool visibleOnly = false, bool collidableOnly = false, void** intersectedObject = NULL, bool precisionPicking = false); virtual bool findDetailedRayIntersection(const glm::vec3& origin, const glm::vec3& direction, bool& keepSearching, OctreeElementPointer& element, float& distance, BoxFace& face, glm::vec3& surfaceNormal, const QVector& entityIdsToInclude, - const QVector& entityIdsToDiscard, bool visibleOnly, + const QVector& entityIdsToDiscard, bool visibleOnly, bool collidableOnly, void** intersectedObject, bool precisionPicking, float distanceToElementCube); virtual bool findSpherePenetration(const glm::vec3& center, float radius, glm::vec3& penetration, void** penetratedObject) const override; From 813ed59f00476c48729da9b90c05719891c6d144 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Sep 2016 17:48:09 -0700 Subject: [PATCH 143/300] Update teleport to not collide with non collidable entities --- scripts/system/controllers/teleport.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/system/controllers/teleport.js b/scripts/system/controllers/teleport.js index e7f12720f0..af3f6b0800 100644 --- a/scripts/system/controllers/teleport.js +++ b/scripts/system/controllers/teleport.js @@ -279,7 +279,7 @@ function Teleporter() { var location = Vec3.sum(rightPickRay.origin, Vec3.multiply(rightPickRay.direction, 50)); - var rightIntersection = Entities.findRayIntersection(teleporter.rightPickRay, true, [], [this.targetEntity], true); + var rightIntersection = Entities.findRayIntersection(teleporter.rightPickRay, true, [], [this.targetEntity], true, true); if (rightIntersection.intersects) { if (this.tooClose === true) { @@ -342,7 +342,7 @@ function Teleporter() { var location = Vec3.sum(MyAvatar.position, Vec3.multiply(leftPickRay.direction, 50)); - var leftIntersection = Entities.findRayIntersection(teleporter.leftPickRay, true, [], [this.targetEntity], true); + var leftIntersection = Entities.findRayIntersection(teleporter.leftPickRay, true, [], [this.targetEntity], true, true); if (leftIntersection.intersects) { From a84f7749990b10c694d4c0f8115a42770816f1a4 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Sep 2016 12:52:22 -0700 Subject: [PATCH 144/300] Remove line3doverlay local start/end changed --- interface/src/ui/overlays/Line3DOverlay.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 1616d4c2e2..c3a6c5920e 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -124,12 +124,6 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { } properties.remove("start"); // so that Base3DOverlay doesn't respond to it - auto localStart = properties["localStart"]; - if (localStart.isValid()) { - _start = vec3FromVariant(localStart); - } - properties.remove("localStart"); // so that Base3DOverlay doesn't respond to it - auto end = properties["end"]; // if "end" property was not there, check to see if they included aliases: endPoint if (!end.isValid()) { @@ -139,12 +133,6 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { setEnd(vec3FromVariant(end)); } - auto localEnd = properties["localEnd"]; - if (localEnd.isValid()) { - _end = vec3FromVariant(localEnd); - } - properties.remove("localEnd"); // so that Base3DOverlay doesn't respond to it - auto glow = properties["glow"]; if (glow.isValid()) { setGlow(glow.toFloat()); From 16d535c4959f7a7cfa056f93e18c7f555cc604bd Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 09:30:14 -0700 Subject: [PATCH 145/300] Move EntityTree RayArgs back to header --- libraries/entities/src/EntityTree.cpp | 22 ++++++++++++++++++++++ libraries/entities/src/EntityTree.h | 22 ---------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 4cbfb4f5dc..ffb6ec31e2 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -29,6 +29,28 @@ static const quint64 DELETED_ENTITIES_EXTRA_USECS_TO_CONSIDER = USECS_PER_MSEC * const float EntityTree::DEFAULT_MAX_TMP_ENTITY_LIFETIME = 60 * 60; // 1 hour +// combines the ray cast arguments into a single object +class RayArgs { +public: + // Inputs + glm::vec3 origin; + glm::vec3 direction; + const QVector& entityIdsToInclude; + const QVector& entityIdsToDiscard; + bool visibleOnly; + bool collidableOnly; + bool precisionPicking; + + // Outputs + OctreeElementPointer& element; + float& distance; + BoxFace& face; + glm::vec3& surfaceNormal; + void** intersectedObject; + bool found; +}; + + EntityTree::EntityTree(bool shouldReaverage) : Octree(shouldReaverage), _fbxService(NULL), diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 80169492f7..68c8618482 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -32,28 +32,6 @@ using ModelWeakPointer = std::weak_ptr; class EntitySimulation; -// combines the ray cast arguments into a single object -class RayArgs { -public: - // Inputs - glm::vec3 origin; - glm::vec3 direction; - const QVector& entityIdsToInclude; - const QVector& entityIdsToDiscard; - bool visibleOnly; - bool collidableOnly; - bool precisionPicking; - - // Outputs - OctreeElementPointer& element; - float& distance; - BoxFace& face; - glm::vec3& surfaceNormal; - void** intersectedObject; - bool found; -}; - - class NewlyCreatedEntityHook { public: virtual void entityCreated(const EntityItem& newEntity, const SharedNodePointer& senderNode) = 0; From 53623f7583b1ef4365dd0e8f33b65e1c29683be2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Sep 2016 15:59:54 -0700 Subject: [PATCH 146/300] Make teleport.js normal rejection more lenient --- scripts/system/away.js | 21 ++++++++++++++++++++- scripts/system/controllers/teleport.js | 10 ++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/scripts/system/away.js b/scripts/system/away.js index 716fe1340e..c704da83f4 100644 --- a/scripts/system/away.js +++ b/scripts/system/away.js @@ -142,6 +142,7 @@ function ifAvatarMovedGoActive() { } // MAIN CONTROL +var isEnabled = true; var wasMuted, isAway; var wasOverlaysVisible = Menu.isOptionChecked("Overlays"); var eventMappingName = "io.highfidelity.away"; // goActive on hand controller button events, too. @@ -159,7 +160,7 @@ function safeGetHMDMounted() { var wasHmdMounted = safeGetHMDMounted(); function goAway() { - if (isAway) { + if (!isEnabled || isAway) { return; } @@ -274,6 +275,24 @@ function maybeGoAway() { } } +function setEnabled(value) { + print("setting away enabled: ", value); + if (!value) { + goActive(); + } + isEnabled = value; +} + +var CHANNEL_AWAY_ENABLE = "Hifi-Away-Enable"; +var handleMessage = function(channel, message, sender) { + print("Got away message"); + if (channel == CHANNEL_AWAY_ENABLE) { + setEnabled(message == 'enable'); + } +} +Messages.subscribe(CHANNEL_AWAY_ENABLE); +Messages.messageReceived.connect(handleMessage); + Script.update.connect(maybeMoveOverlay); Script.update.connect(maybeGoAway); diff --git a/scripts/system/controllers/teleport.js b/scripts/system/controllers/teleport.js index af3f6b0800..a0159e06a5 100644 --- a/scripts/system/controllers/teleport.js +++ b/scripts/system/controllers/teleport.js @@ -627,11 +627,17 @@ function isMoving() { } }; +// When determininig whether you can teleport to a location, the normal of the +// point that is being intersected with is looked at. If this normal is more +// than MAX_ANGLE_FROM_UP_TO_TELEPORT degrees from <0, 1, 0> (straight up), then +// you can't teleport there. +var MAX_ANGLE_FROM_UP_TO_TELEPORT = 70; function isTooCloseToTeleport(position, surfaceNormal) { var adj = Math.sqrt(surfaceNormal.x * surfaceNormal.x + surfaceNormal.z * surfaceNormal.z); var angleUp = Math.atan2(surfaceNormal.y, adj) * (180 / Math.PI); - //print(angleUp); - return angleUp < 80 || angleUp > 110 || Vec3.distance(MyAvatar.position, position) <= TELEPORT_CANCEL_RANGE; + return angleUp < (90 - MAX_ANGLE_FROM_UP_TO_TELEPORT) || + angleUp > (90 + MAX_ANGLE_FROM_UP_TO_TELEPORT) || + Vec3.distance(MyAvatar.position, position) <= TELEPORT_CANCEL_RANGE; }; function registerMappings() { From 2ef7c9a57a6d0f84987d5a8e521492e088396c7e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Sep 2016 10:49:45 -0700 Subject: [PATCH 147/300] Disable smooth movement in teleport.js --- scripts/system/controllers/teleport.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/system/controllers/teleport.js b/scripts/system/controllers/teleport.js index a0159e06a5..2abc6fe057 100644 --- a/scripts/system/controllers/teleport.js +++ b/scripts/system/controllers/teleport.js @@ -509,7 +509,9 @@ function Teleporter() { var offset = getAvatarFootOffset(); this.intersection.intersection.y += offset; this.exitTeleportMode(); - this.smoothArrival(); + // Disable smooth arrival, possibly temporarily + //this.smoothArrival(); + MyAvatar.position = _this.intersection.intersection; } }; From 1e6aba19287fa05b58460c90f3a91c84456c5eb7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 11:56:36 -0700 Subject: [PATCH 148/300] Fix teleport not removing overlay on teleport --- scripts/system/controllers/teleport.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/system/controllers/teleport.js b/scripts/system/controllers/teleport.js index 2abc6fe057..6d13b41d4f 100644 --- a/scripts/system/controllers/teleport.js +++ b/scripts/system/controllers/teleport.js @@ -512,6 +512,9 @@ function Teleporter() { // Disable smooth arrival, possibly temporarily //this.smoothArrival(); MyAvatar.position = _this.intersection.intersection; + _this.deleteTargetOverlay(); + _this.deleteCancelOverlay(); + HMD.centerUI(); } }; From d0ba53a06910727d828bce19100567aa719c03e6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 20:22:22 -0700 Subject: [PATCH 149/300] Change name of isTooCloseToTeleport to be more descriptive --- scripts/system/controllers/teleport.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/system/controllers/teleport.js b/scripts/system/controllers/teleport.js index 6d13b41d4f..2a7dbb000b 100644 --- a/scripts/system/controllers/teleport.js +++ b/scripts/system/controllers/teleport.js @@ -459,7 +459,7 @@ function Teleporter() { z: intersection.intersection.z }; - this.tooClose = isTooCloseToTeleport(position, intersection.surfaceNormal); + this.tooClose = isValidTeleportLocation(position, intersection.surfaceNormal); var towardUs = Quat.fromPitchYawRollDegrees(0, euler.y, 0); Overlays.editOverlay(this.targetOverlay, { @@ -480,7 +480,7 @@ function Teleporter() { z: intersection.intersection.z }; - this.tooClose = isTooCloseToTeleport(position, intersection.surfaceNormal); + this.tooClose = isValidTeleportLocation(position, intersection.surfaceNormal); var towardUs = Quat.fromPitchYawRollDegrees(0, euler.y, 0); Overlays.editOverlay(this.cancelOverlay, { @@ -637,7 +637,7 @@ function isMoving() { // than MAX_ANGLE_FROM_UP_TO_TELEPORT degrees from <0, 1, 0> (straight up), then // you can't teleport there. var MAX_ANGLE_FROM_UP_TO_TELEPORT = 70; -function isTooCloseToTeleport(position, surfaceNormal) { +function isValidTeleportLocation(position, surfaceNormal) { var adj = Math.sqrt(surfaceNormal.x * surfaceNormal.x + surfaceNormal.z * surfaceNormal.z); var angleUp = Math.atan2(surfaceNormal.y, adj) * (180 / Math.PI); return angleUp < (90 - MAX_ANGLE_FROM_UP_TO_TELEPORT) || From 6019581f3f618843e59a099d9c3cee0ceef5d0b7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 20:24:15 -0700 Subject: [PATCH 150/300] Remove commented log line in OpenVrHelpers --- plugins/openvr/src/OpenVrHelpers.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index c06866d2f1..820476191a 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -366,8 +366,6 @@ controller::Pose openVrControllerPoseToHandPose(bool isLeftHand, const mat4& mat auto translationOffset = (isLeftHand ? leftTranslationOffset : rightTranslationOffset); auto rotationOffset = (isLeftHand ? leftRotationOffset : rightRotationOffset); - //qDebug() << "TRANSLATION OFFSET: " << isLeftHand << ", " << translationOffset.x << ", " << translationOffset.y << ", " << translationOffset.z; - glm::vec3 position = extractTranslation(mat); glm::quat rotation = glm::normalize(glm::quat_cast(mat)); From d50689b795b3f82b7d9c15db7ae0175ceded042d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 20:25:46 -0700 Subject: [PATCH 151/300] Remove disabling of teleport in hand grab --- scripts/system/controllers/handControllerGrab.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index 764fd705cb..98da3d539b 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -1868,12 +1868,6 @@ function MyController(hand) { }; this.nearGrabbingEnter = function() { - //if (this.hand === 0) { - //Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'left'); - //} - //if (this.hand === 1) { - //Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'right'); - //} this.grabPointSphereOff(); this.lineOff(); this.overlayLineOff(); From d6aa74c22d158df955c8fad982fcb8beacc60945 Mon Sep 17 00:00:00 2001 From: Ken Cooke Date: Wed, 5 Oct 2016 11:49:09 -0700 Subject: [PATCH 152/300] Fix 16khz support and hot-unplugging audio devices --- cmake/externals/wasapi/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/externals/wasapi/CMakeLists.txt b/cmake/externals/wasapi/CMakeLists.txt index 8ec327600f..bacdb5b0b7 100644 --- a/cmake/externals/wasapi/CMakeLists.txt +++ b/cmake/externals/wasapi/CMakeLists.txt @@ -6,8 +6,8 @@ if (WIN32) include(ExternalProject) ExternalProject_Add( ${EXTERNAL_NAME} - URL http://hifi-public.s3.amazonaws.com/dependencies/qtaudio_wasapi2.zip - URL_MD5 272b27bd6c211c45c0c23d4701b63b5e + URL http://hifi-public.s3.amazonaws.com/dependencies/qtaudio_wasapi3.zip + URL_MD5 1a2433f80a788a54c70f505ff4f43ac1 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" From 5af95c6062bc80abd6ed7f5ad223c4be0fd61970 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 5 Oct 2016 11:33:12 -0700 Subject: [PATCH 153/300] store channels on audio stream --- assignment-client/src/Agent.cpp | 3 +-- libraries/audio-client/src/AudioClient.cpp | 2 +- libraries/audio/src/InboundAudioStream.cpp | 13 +++++++------ libraries/audio/src/InboundAudioStream.h | 3 ++- libraries/audio/src/MixedAudioStream.cpp | 9 +++++++-- libraries/audio/src/MixedAudioStream.h | 2 +- libraries/audio/src/MixedProcessedAudioStream.cpp | 5 +++-- libraries/audio/src/MixedProcessedAudioStream.h | 2 +- libraries/audio/src/PositionalAudioStream.cpp | 11 +++++++---- 9 files changed, 30 insertions(+), 20 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index c6a2a3d5e8..65443b0574 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -48,8 +48,7 @@ static const int RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES = 10; Agent::Agent(ReceivedMessage& message) : ThreadedAssignment(message), _entityEditSender(), - _receivedAudioStream(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO, - RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES, RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES) { + _receivedAudioStream(RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES, RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES) { DependencyManager::get()->setPacketSender(&_entityEditSender); ResourceManager::init(); diff --git a/libraries/audio-client/src/AudioClient.cpp b/libraries/audio-client/src/AudioClient.cpp index d70730380f..6fbd93e386 100644 --- a/libraries/audio-client/src/AudioClient.cpp +++ b/libraries/audio-client/src/AudioClient.cpp @@ -115,7 +115,7 @@ AudioClient::AudioClient() : _loopbackAudioOutput(NULL), _loopbackOutputDevice(NULL), _inputRingBuffer(0), - _receivedAudioStream(0, RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES), + _receivedAudioStream(RECEIVED_AUDIO_STREAM_CAPACITY_FRAMES), _isStereoInput(false), _outputStarveDetectionStartTimeMsec(0), _outputStarveDetectionCount(0), diff --git a/libraries/audio/src/InboundAudioStream.cpp b/libraries/audio/src/InboundAudioStream.cpp index 35c90e51bd..177a5ddcef 100644 --- a/libraries/audio/src/InboundAudioStream.cpp +++ b/libraries/audio/src/InboundAudioStream.cpp @@ -46,10 +46,11 @@ static const int STATS_FOR_STATS_PACKET_WINDOW_SECONDS = 30; // _currentJitterBufferFrames is updated with the time-weighted avg and the running time-weighted avg is reset. static const quint64 FRAMES_AVAILABLE_STAT_WINDOW_USECS = 10 * USECS_PER_SECOND; -InboundAudioStream::InboundAudioStream(int numFrameSamples, int numFramesCapacity, int numStaticJitterFrames) : - _ringBuffer(numFrameSamples, numFramesCapacity), - _dynamicJitterBufferEnabled(numStaticJitterFrames == -1), - _staticJitterBufferFrames(std::max(numStaticJitterFrames, DEFAULT_STATIC_JITTER_FRAMES)), +InboundAudioStream::InboundAudioStream(int numChannels, int numFrames, int numBlocks, int numStaticJitterBlocks) : + _ringBuffer(numChannels * numFrames, numBlocks), + _numChannels(numChannels), + _dynamicJitterBufferEnabled(numStaticJitterBlocks == -1), + _staticJitterBufferFrames(std::max(numStaticJitterBlocks, DEFAULT_STATIC_JITTER_FRAMES)), _desiredJitterBufferFrames(_dynamicJitterBufferEnabled ? 1 : _staticJitterBufferFrames), _incomingSequenceNumberStats(STATS_FOR_STATS_PACKET_WINDOW_SECONDS), _starveHistory(STARVE_HISTORY_CAPACITY), @@ -224,7 +225,7 @@ int InboundAudioStream::writeDroppableSilentFrames(int silentFrames) { } // calculate how many silent frames we should drop. - int silentSamples = silentFrames * 2; + int silentSamples = silentFrames * _numChannels; int samplesPerFrame = _ringBuffer.getNumFrameSamples(); int desiredJitterBufferFramesPlusPadding = _desiredJitterBufferFrames + DESIRED_JITTER_BUFFER_FRAMES_PADDING; int numSilentFramesToDrop = 0; @@ -422,7 +423,7 @@ int InboundAudioStream::writeFramesForDroppedPackets(int networkFrames) { int InboundAudioStream::writeLastFrameRepeatedWithFade(int frames) { AudioRingBuffer::ConstIterator frameToRepeat = _ringBuffer.lastFrameWritten(); int frameSize = _ringBuffer.getNumFrameSamples(); - int samplesToWrite = frames * 2; + int samplesToWrite = frames * _numChannels; int indexOfRepeat = 0; do { int samplesToWriteThisIteration = std::min(samplesToWrite, frameSize); diff --git a/libraries/audio/src/InboundAudioStream.h b/libraries/audio/src/InboundAudioStream.h index e72a45a01b..f7b79ab136 100644 --- a/libraries/audio/src/InboundAudioStream.h +++ b/libraries/audio/src/InboundAudioStream.h @@ -47,7 +47,7 @@ public: static const bool REPETITION_WITH_FADE; InboundAudioStream() = delete; - InboundAudioStream(int numFrameSamples, int numFramesCapacity, int numStaticJitterFrames = -1); + InboundAudioStream(int numChannels, int numFrames, int numBlocks, int numStaticJitterBlocks); ~InboundAudioStream(); void reset(); @@ -144,6 +144,7 @@ protected: protected: AudioRingBuffer _ringBuffer; + int _numChannels; bool _lastPopSucceeded { false }; AudioRingBuffer::ConstIterator _lastPopOutput; diff --git a/libraries/audio/src/MixedAudioStream.cpp b/libraries/audio/src/MixedAudioStream.cpp index 8a3091f596..0f28b23b24 100644 --- a/libraries/audio/src/MixedAudioStream.cpp +++ b/libraries/audio/src/MixedAudioStream.cpp @@ -11,5 +11,10 @@ #include "MixedAudioStream.h" -MixedAudioStream::MixedAudioStream(int numFrameSamples, int numFramesCapacity, int numStaticJitterFrames) : - InboundAudioStream(numFrameSamples, numFramesCapacity, numStaticJitterFrames) {} +#include "AudioConstants.h" + +static const int STEREO_FACTOR = 2; + +MixedAudioStream::MixedAudioStream(int numFramesCapacity, int numStaticJitterFrames) : + InboundAudioStream(STEREO_FACTOR, AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL, + numFramesCapacity, numStaticJitterFrames) {} diff --git a/libraries/audio/src/MixedAudioStream.h b/libraries/audio/src/MixedAudioStream.h index f86ebaef56..6f2716203e 100644 --- a/libraries/audio/src/MixedAudioStream.h +++ b/libraries/audio/src/MixedAudioStream.h @@ -16,7 +16,7 @@ class MixedAudioStream : public InboundAudioStream { public: - MixedAudioStream(int numFrameSamples, int numFramesCapacity, int numStaticJitterFrames = -1); + MixedAudioStream(int numFramesCapacity, int numStaticJitterFrames = -1); float getNextOutputFrameLoudness() const { return _ringBuffer.getNextOutputFrameLoudness(); } }; diff --git a/libraries/audio/src/MixedProcessedAudioStream.cpp b/libraries/audio/src/MixedProcessedAudioStream.cpp index ccaf35f1c4..26ae6f7928 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.cpp +++ b/libraries/audio/src/MixedProcessedAudioStream.cpp @@ -14,8 +14,9 @@ static const int STEREO_FACTOR = 2; -MixedProcessedAudioStream::MixedProcessedAudioStream(int numFrameSamples, int numFramesCapacity, int numStaticJitterFrames) - : InboundAudioStream(numFrameSamples, numFramesCapacity, numStaticJitterFrames) {} +MixedProcessedAudioStream::MixedProcessedAudioStream(int numFramesCapacity, int numStaticJitterFrames) + : InboundAudioStream(STEREO_FACTOR, AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL, + numFramesCapacity, numStaticJitterFrames) {} void MixedProcessedAudioStream::outputFormatChanged(int sampleRate, int channelCount) { _outputSampleRate = sampleRate; diff --git a/libraries/audio/src/MixedProcessedAudioStream.h b/libraries/audio/src/MixedProcessedAudioStream.h index 7071cf0e5a..d536163d2d 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.h +++ b/libraries/audio/src/MixedProcessedAudioStream.h @@ -19,7 +19,7 @@ class AudioClient; class MixedProcessedAudioStream : public InboundAudioStream { Q_OBJECT public: - MixedProcessedAudioStream(int numFrameSamples, int numFramesCapacity, int numStaticJitterFrames = -1); + MixedProcessedAudioStream(int numFramesCapacity, int numStaticJitterFrames = -1); signals: diff --git a/libraries/audio/src/PositionalAudioStream.cpp b/libraries/audio/src/PositionalAudioStream.cpp index bb14044312..92573ced6f 100644 --- a/libraries/audio/src/PositionalAudioStream.cpp +++ b/libraries/audio/src/PositionalAudioStream.cpp @@ -21,11 +21,14 @@ #include #include +static const int MONO_FACTOR = 1; +static const int STEREO_FACTOR = 2; + PositionalAudioStream::PositionalAudioStream(PositionalAudioStream::Type type, bool isStereo, int numStaticJitterFrames) : - InboundAudioStream(isStereo - ? AudioConstants::NETWORK_FRAME_SAMPLES_STEREO - : AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL, - AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY, numStaticJitterFrames), + InboundAudioStream(isStereo ? STEREO_FACTOR : MONO_FACTOR, + AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL, + AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY, + numStaticJitterFrames), _type(type), _position(0.0f, 0.0f, 0.0f), _orientation(0.0f, 0.0f, 0.0f, 0.0f), From afce8c4a458afbc17c606c7dacaba6625ae6c760 Mon Sep 17 00:00:00 2001 From: Zach Pomerantz Date: Wed, 5 Oct 2016 13:02:28 -0700 Subject: [PATCH 154/300] STEREO_FACTOR -> AudioConstants::STEREO --- interface/src/audio/AudioScope.cpp | 12 +++++------- libraries/audio/src/MixedAudioStream.cpp | 4 +--- libraries/audio/src/MixedProcessedAudioStream.cpp | 14 ++++++-------- libraries/audio/src/PositionalAudioStream.cpp | 5 +---- 4 files changed, 13 insertions(+), 22 deletions(-) diff --git a/interface/src/audio/AudioScope.cpp b/interface/src/audio/AudioScope.cpp index 1946d216ff..346fbd11f4 100644 --- a/interface/src/audio/AudioScope.cpp +++ b/interface/src/audio/AudioScope.cpp @@ -250,8 +250,6 @@ int AudioScope::addSilenceToScope(QByteArray* byteArray, int frameOffset, int si } -const int STEREO_FACTOR = 2; - void AudioScope::addStereoSilenceToScope(int silentSamplesPerChannel) { if (!_isEnabled || _isPaused) { return; @@ -265,10 +263,10 @@ void AudioScope::addStereoSamplesToScope(const QByteArray& samples) { return; } const int16_t* samplesData = reinterpret_cast(samples.data()); - int samplesPerChannel = samples.size() / sizeof(int16_t) / STEREO_FACTOR; + int samplesPerChannel = samples.size() / sizeof(int16_t) / AudioConstants::STEREO; - addBufferToScope(_scopeOutputLeft, _scopeOutputOffset, samplesData, samplesPerChannel, 0, STEREO_FACTOR); - _scopeOutputOffset = addBufferToScope(_scopeOutputRight, _scopeOutputOffset, samplesData, samplesPerChannel, 1, STEREO_FACTOR); + addBufferToScope(_scopeOutputLeft, _scopeOutputOffset, samplesData, samplesPerChannel, 0, AudioConstants::STEREO); + _scopeOutputOffset = addBufferToScope(_scopeOutputRight, _scopeOutputOffset, samplesData, samplesPerChannel, 1, AudioConstants::STEREO); _scopeLastFrame = samples.right(AudioConstants::NETWORK_FRAME_BYTES_STEREO); } @@ -282,9 +280,9 @@ void AudioScope::addLastFrameRepeatedWithFadeToScope(int samplesPerChannel) { int samplesToWriteThisIteration = std::min(samplesRemaining, (int) AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL); float fade = calculateRepeatedFrameFadeFactor(indexOfRepeat); addBufferToScope(_scopeOutputLeft, _scopeOutputOffset, lastFrameData, - samplesToWriteThisIteration, 0, STEREO_FACTOR, fade); + samplesToWriteThisIteration, 0, AudioConstants::STEREO, fade); _scopeOutputOffset = addBufferToScope(_scopeOutputRight, _scopeOutputOffset, - lastFrameData, samplesToWriteThisIteration, 1, STEREO_FACTOR, fade); + lastFrameData, samplesToWriteThisIteration, 1, AudioConstants::STEREO, fade); samplesRemaining -= samplesToWriteThisIteration; indexOfRepeat++; diff --git a/libraries/audio/src/MixedAudioStream.cpp b/libraries/audio/src/MixedAudioStream.cpp index 0f28b23b24..e9af6933b6 100644 --- a/libraries/audio/src/MixedAudioStream.cpp +++ b/libraries/audio/src/MixedAudioStream.cpp @@ -13,8 +13,6 @@ #include "AudioConstants.h" -static const int STEREO_FACTOR = 2; - MixedAudioStream::MixedAudioStream(int numFramesCapacity, int numStaticJitterFrames) : - InboundAudioStream(STEREO_FACTOR, AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL, + InboundAudioStream(AudioConstants::STEREO, AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL, numFramesCapacity, numStaticJitterFrames) {} diff --git a/libraries/audio/src/MixedProcessedAudioStream.cpp b/libraries/audio/src/MixedProcessedAudioStream.cpp index 26ae6f7928..671d3a9d60 100644 --- a/libraries/audio/src/MixedProcessedAudioStream.cpp +++ b/libraries/audio/src/MixedProcessedAudioStream.cpp @@ -12,17 +12,15 @@ #include "MixedProcessedAudioStream.h" #include "AudioLogging.h" -static const int STEREO_FACTOR = 2; - MixedProcessedAudioStream::MixedProcessedAudioStream(int numFramesCapacity, int numStaticJitterFrames) - : InboundAudioStream(STEREO_FACTOR, AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL, + : InboundAudioStream(AudioConstants::STEREO, AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL, numFramesCapacity, numStaticJitterFrames) {} void MixedProcessedAudioStream::outputFormatChanged(int sampleRate, int channelCount) { _outputSampleRate = sampleRate; _outputChannelCount = channelCount; - int deviceOutputFrameFrames = networkToDeviceFrames(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO / STEREO_FACTOR); - int deviceOutputFrameSamples = deviceOutputFrameFrames * STEREO_FACTOR; + int deviceOutputFrameFrames = networkToDeviceFrames(AudioConstants::NETWORK_FRAME_SAMPLES_STEREO / AudioConstants::STEREO); + int deviceOutputFrameSamples = deviceOutputFrameFrames * AudioConstants::STEREO; _ringBuffer.resizeForFrameSize(deviceOutputFrameSamples); } @@ -55,16 +53,16 @@ int MixedProcessedAudioStream::parseAudioData(PacketType type, const QByteArray& _ringBuffer.writeData(outputBuffer.data(), outputBuffer.size()); qCDebug(audiostream, "Wrote %d samples to buffer (%d available)", outputBuffer.size() / (int)sizeof(int16_t), getSamplesAvailable()); - + return packetAfterStreamProperties.size(); } int MixedProcessedAudioStream::networkToDeviceFrames(int networkFrames) { return ((quint64)networkFrames * _outputChannelCount * _outputSampleRate) / - (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE); + (quint64)(AudioConstants::STEREO * AudioConstants::SAMPLE_RATE); } int MixedProcessedAudioStream::deviceToNetworkFrames(int deviceFrames) { - return (quint64)deviceFrames * (quint64)(STEREO_FACTOR * AudioConstants::SAMPLE_RATE) / + return (quint64)deviceFrames * (quint64)(AudioConstants::STEREO * AudioConstants::SAMPLE_RATE) / (_outputSampleRate * _outputChannelCount); } diff --git a/libraries/audio/src/PositionalAudioStream.cpp b/libraries/audio/src/PositionalAudioStream.cpp index 92573ced6f..e7bf72c955 100644 --- a/libraries/audio/src/PositionalAudioStream.cpp +++ b/libraries/audio/src/PositionalAudioStream.cpp @@ -21,11 +21,8 @@ #include #include -static const int MONO_FACTOR = 1; -static const int STEREO_FACTOR = 2; - PositionalAudioStream::PositionalAudioStream(PositionalAudioStream::Type type, bool isStereo, int numStaticJitterFrames) : - InboundAudioStream(isStereo ? STEREO_FACTOR : MONO_FACTOR, + InboundAudioStream(isStereo ? AudioConstants::STEREO : AudioConstants::MONO, AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL, AUDIOMIXER_INBOUND_RING_BUFFER_FRAME_CAPACITY, numStaticJitterFrames), From dc7a9f253cd46895d4b751d9f0940854f8960958 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 5 Oct 2016 13:06:11 -0700 Subject: [PATCH 155/300] kill agents in avatar mixer when they stop being avatars --- assignment-client/src/Agent.cpp | 15 +++++++++++++++ libraries/avatars/src/AvatarData.cpp | 11 ++++++++--- libraries/avatars/src/AvatarData.h | 1 + 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index c6a2a3d5e8..c2dba20fb6 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -351,6 +351,21 @@ void Agent::setIsAvatar(bool isAvatar) { _avatarIdentityTimer->stop(); delete _avatarIdentityTimer; _avatarIdentityTimer = nullptr; + + // The avatar mixer never times out a connection (e.g., based on identity or data packets) + // but rather keeps avatars in its list as long as "connected". As a result, clients timeout + // when we stop sending identity, but then get woken up again by the mixer itself, which sends + // identity packets to everyone. Here we explicitly tell the mixer to kill the entry for us. + auto nodeList = DependencyManager::get(); + auto packetList = NLPacketList::create(PacketType::KillAvatar, QByteArray(), true, true); + packetList->write(getSessionUUID().toRfc4122()); + nodeList->eachMatchingNode( + [&](const SharedNodePointer& node)->bool { + return node->getType() == NodeType::AvatarMixer && node->getActiveSocket(); + }, + [&](const SharedNodePointer& node) { + nodeList->sendPacketList(std::move(packetList), *node); + }); } } } diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 413180738a..d30b69c5f8 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -976,10 +976,16 @@ void AvatarData::parseAvatarIdentityPacket(const QByteArray& data, Identity& ide packetStream >> identityOut.uuid >> identityOut.skeletonModelURL >> identityOut.attachmentData >> identityOut.displayName >> identityOut.avatarEntityData; } +static const QUrl emptyURL(""); +const QUrl& AvatarData::cannonicalSkeletonModelURL(const QUrl& emptyURL) { + // We don't put file urls on the wire, but instead convert to empty. + return _skeletonModelURL.scheme() == "file" ? emptyURL : _skeletonModelURL; +} + bool AvatarData::processAvatarIdentity(const Identity& identity) { bool hasIdentityChanged = false; - if (_firstSkeletonCheck || (identity.skeletonModelURL != _skeletonModelURL)) { + if (_firstSkeletonCheck || (identity.skeletonModelURL != cannonicalSkeletonModelURL(emptyURL))) { setSkeletonModelURL(identity.skeletonModelURL); hasIdentityChanged = true; _firstSkeletonCheck = false; @@ -1010,8 +1016,7 @@ bool AvatarData::processAvatarIdentity(const Identity& identity) { QByteArray AvatarData::identityByteArray() { QByteArray identityData; QDataStream identityStream(&identityData, QIODevice::Append); - QUrl emptyURL(""); - const QUrl& urlToSend = _skeletonModelURL.scheme() == "file" ? emptyURL : _skeletonModelURL; + const QUrl& urlToSend = cannonicalSkeletonModelURL(emptyURL); _avatarEntitiesLock.withReadLock([&] { identityStream << getSessionUUID() << urlToSend << _attachmentData << _displayName << _avatarEntityData; diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index a5314bf4a8..cb3ef0c40e 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -399,6 +399,7 @@ protected: QUrl _skeletonFBXURL; QVector _attachmentData; QString _displayName; + const QUrl& cannonicalSkeletonModelURL(const QUrl& empty); float _displayNameTargetAlpha; float _displayNameAlpha; From 7642e9fd1e29726f0062407b0c4b8876ee237c65 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 5 Oct 2016 13:06:36 -0700 Subject: [PATCH 156/300] remove cmake warning about untestable CPP file also: fix some broken unit tests --- .../src/CollisionRenderMeshCacheTests.cpp | 2 +- tests/physics/src/MeshUtil.cpp | 45 ------------------- tests/physics/src/MeshUtil.h | 34 +++++++++++++- tests/physics/src/ShapeInfoTests.cpp | 16 +++---- tests/physics/src/ShapeManagerTests.cpp | 32 ++++++------- 5 files changed, 57 insertions(+), 72 deletions(-) delete mode 100644 tests/physics/src/MeshUtil.cpp diff --git a/tests/physics/src/CollisionRenderMeshCacheTests.cpp b/tests/physics/src/CollisionRenderMeshCacheTests.cpp index 085c9a2fe3..ad5d5db0ab 100644 --- a/tests/physics/src/CollisionRenderMeshCacheTests.cpp +++ b/tests/physics/src/CollisionRenderMeshCacheTests.cpp @@ -20,7 +20,7 @@ #include #include // for MAX_HULL_POINTS -#include "MeshUtil.cpp" +#include "MeshUtil.h" QTEST_MAIN(CollisionRenderMeshCacheTests) diff --git a/tests/physics/src/MeshUtil.cpp b/tests/physics/src/MeshUtil.cpp deleted file mode 100644 index d3eb815948..0000000000 --- a/tests/physics/src/MeshUtil.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// -// MeshUtil.cpp -// tests/physics/src -// -// Created by Andrew Meadows 2016.07.14 -// Copyright 2016 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -#include "MeshUtil.h" - -#include - -// returns false if any edge has only one adjacent triangle -bool MeshUtil::isClosedManifold(const uint32_t* meshIndices, uint32_t numIndices) { - using EdgeList = std::unordered_map; - EdgeList edges; - - // count the triangles for each edge - const uint32_t TRIANGLE_STRIDE = 3; - for (uint32_t i = 0; i < numIndices; i += TRIANGLE_STRIDE) { - MeshUtil::TriangleEdge edge; - // the triangles indices are stored in sequential order - for (uint32_t j = 0; j < 3; ++j) { - edge.setIndices(meshIndices[i + j], meshIndices[i + ((j + 1) % 3)]); - - EdgeList::iterator edgeEntry = edges.find(edge); - if (edgeEntry == edges.end()) { - edges.insert(std::pair(edge, 1)); - } else { - edgeEntry->second += 1; - } - } - } - // scan for outside edge - for (auto& edgeEntry : edges) { - if (edgeEntry.second == 1) { - return false; - } - } - return true; -} - diff --git a/tests/physics/src/MeshUtil.h b/tests/physics/src/MeshUtil.h index 82d33d631b..6603ee4fae 100644 --- a/tests/physics/src/MeshUtil.h +++ b/tests/physics/src/MeshUtil.h @@ -42,8 +42,6 @@ private: uint32_t _indexB { (uint32_t)(-1) }; }; -bool isClosedManifold(const uint32_t* meshIndices, uint32_t numIndices); - } // MeshUtil namespace namespace std { @@ -55,7 +53,39 @@ namespace std { return hash()((ab * (ab + 1)) / 2 + edge.getIndexB()); } }; +} // std namesspace + +namespace MeshUtil { +bool isClosedManifold(const uint32_t* meshIndices, uint32_t numIndices) { + using EdgeList = std::unordered_map; + EdgeList edges; + + // count the triangles for each edge + const uint32_t TRIANGLE_STRIDE = 3; + for (uint32_t i = 0; i < numIndices; i += TRIANGLE_STRIDE) { + TriangleEdge edge; + // the triangles indices are stored in sequential order + for (uint32_t j = 0; j < 3; ++j) { + edge.setIndices(meshIndices[i + j], meshIndices[i + ((j + 1) % 3)]); + + EdgeList::iterator edgeEntry = edges.find(edge); + if (edgeEntry == edges.end()) { + edges.insert(std::pair(edge, 1)); + } else { + edgeEntry->second += 1; + } + } + } + // scan for outside edge + for (auto& edgeEntry : edges) { + if (edgeEntry.second == 1) { + return false; + } + } + return true; } +} // MeshUtil namespace + #endif // hifi_MeshUtil_h diff --git a/tests/physics/src/ShapeInfoTests.cpp b/tests/physics/src/ShapeInfoTests.cpp index 01f5c4e511..c6a19084a2 100644 --- a/tests/physics/src/ShapeInfoTests.cpp +++ b/tests/physics/src/ShapeInfoTests.cpp @@ -42,7 +42,7 @@ void ShapeInfoTests::testHashFunctions() { int testCount = 0; int numCollisions = 0; - + btClock timer; for (int x = 1; x < numSteps && testCount < maxTests; ++x) { float radiusX = (float)x * deltaLength; @@ -52,7 +52,7 @@ void ShapeInfoTests::testHashFunctions() { DoubleHashKey key = info.getHash(); uint32_t* hashPtr = hashes.find(key.getHash()); if (hashPtr && *hashPtr == key.getHash2()) { - std::cout << testCount << " hash collision radiusX = " << radiusX + std::cout << testCount << " hash collision radiusX = " << radiusX << " h1 = 0x" << std::hex << key.getHash() << " h2 = 0x" << std::hex << key.getHash2() << std::endl; @@ -88,7 +88,7 @@ void ShapeInfoTests::testHashFunctions() { key = info.getHash(); hashPtr = hashes.find(key.getHash()); if (hashPtr && *hashPtr == key.getHash2()) { - std::cout << testCount << " hash collision radiusX = " << radiusX << " radiusY = " << radiusY + std::cout << testCount << " hash collision radiusX = " << radiusX << " radiusY = " << radiusY << " h1 = 0x" << std::hex << key.getHash() << " h2 = 0x" << std::hex << key.getHash2() << std::endl; @@ -113,8 +113,8 @@ void ShapeInfoTests::testHashFunctions() { DoubleHashKey key = info.getHash(); hashPtr = hashes.find(key.getHash()); if (hashPtr && *hashPtr == key.getHash2()) { - std::cout << testCount << " hash collision radiusX = " << radiusX - << " radiusY = " << radiusY << " radiusZ = " << radiusZ + std::cout << testCount << " hash collision radiusX = " << radiusX + << " radiusY = " << radiusY << " radiusZ = " << radiusZ << " h1 = 0x" << std::hex << key.getHash() << " h2 = 0x" << std::hex << key.getHash2() << std::endl; @@ -148,9 +148,9 @@ void ShapeInfoTests::testBoxShape() { info.setBox(halfExtents); DoubleHashKey key = info.getHash(); - btCollisionShape* shape = ShapeFactory::createShapeFromInfo(info); + const btCollisionShape* shape = ShapeFactory::createShapeFromInfo(info); QCOMPARE(shape != nullptr, true); - + ShapeInfo otherInfo = info; DoubleHashKey otherKey = otherInfo.getHash(); QCOMPARE(key.getHash(), otherKey.getHash()); @@ -165,7 +165,7 @@ void ShapeInfoTests::testSphereShape() { info.setSphere(radius); DoubleHashKey key = info.getHash(); - btCollisionShape* shape = ShapeFactory::createShapeFromInfo(info); + const btCollisionShape* shape = ShapeFactory::createShapeFromInfo(info); QCOMPARE(shape != nullptr, true); ShapeInfo otherInfo = info; diff --git a/tests/physics/src/ShapeManagerTests.cpp b/tests/physics/src/ShapeManagerTests.cpp index 24d4a5ab35..f214601a42 100644 --- a/tests/physics/src/ShapeManagerTests.cpp +++ b/tests/physics/src/ShapeManagerTests.cpp @@ -27,14 +27,14 @@ void ShapeManagerTests::testShapeAccounting() { QCOMPARE(numReferences, 0); // create one shape and verify we get a valid pointer - btCollisionShape* shape = shapeManager.getShape(info); + const btCollisionShape* shape = shapeManager.getShape(info); QCOMPARE(shape != nullptr, true); // verify number of shapes QCOMPARE(shapeManager.getNumShapes(), 1); // reference the shape again and verify that we get the same pointer - btCollisionShape* otherShape = shapeManager.getShape(info); + const btCollisionShape* otherShape = shapeManager.getShape(info); QCOMPARE(otherShape, shape); // verify number of references @@ -84,7 +84,7 @@ void ShapeManagerTests::testShapeAccounting() { void ShapeManagerTests::addManyShapes() { ShapeManager shapeManager; - QVector shapes; + QVector shapes; int numSizes = 100; float startSize = 1.0f; @@ -96,7 +96,7 @@ void ShapeManagerTests::addManyShapes() { float s = startSize + (float)i * deltaSize; glm::vec3 scale(s, 1.23f + s, s - 0.573f); info.setBox(0.5f * scale); - btCollisionShape* shape = shapeManager.getShape(info); + const btCollisionShape* shape = shapeManager.getShape(info); shapes.push_back(shape); QCOMPARE(shape != nullptr, true); @@ -114,14 +114,14 @@ void ShapeManagerTests::addManyShapes() { // release each shape by pointer for (int i = 0; i < numShapes; ++i) { - btCollisionShape* shape = shapes[i]; + const btCollisionShape* shape = shapes[i]; bool success = shapeManager.releaseShape(shape); QCOMPARE(success, true); } // verify zero references for (int i = 0; i < numShapes; ++i) { - btCollisionShape* shape = shapes[i]; + const btCollisionShape* shape = shapes[i]; int numReferences = shapeManager.getNumReferences(shape); QCOMPARE(numReferences, 0); } @@ -133,10 +133,10 @@ void ShapeManagerTests::addBoxShape() { info.setBox(halfExtents); ShapeManager shapeManager; - btCollisionShape* shape = shapeManager.getShape(info); + const btCollisionShape* shape = shapeManager.getShape(info); ShapeInfo otherInfo = info; - btCollisionShape* otherShape = shapeManager.getShape(otherInfo); + const btCollisionShape* otherShape = shapeManager.getShape(otherInfo); QCOMPARE(shape, otherShape); } @@ -146,10 +146,10 @@ void ShapeManagerTests::addSphereShape() { info.setSphere(radius); ShapeManager shapeManager; - btCollisionShape* shape = shapeManager.getShape(info); + const btCollisionShape* shape = shapeManager.getShape(info); ShapeInfo otherInfo = info; - btCollisionShape* otherShape = shapeManager.getShape(otherInfo); + const btCollisionShape* otherShape = shapeManager.getShape(otherInfo); QCOMPARE(shape, otherShape); } @@ -161,10 +161,10 @@ void ShapeManagerTests::addCylinderShape() { info.setCylinder(radius, height); ShapeManager shapeManager; - btCollisionShape* shape = shapeManager.getShape(info); + const btCollisionShape* shape = shapeManager.getShape(info); ShapeInfo otherInfo = info; - btCollisionShape* otherShape = shapeManager.getShape(otherInfo); + const btCollisionShape* otherShape = shapeManager.getShape(otherInfo); QCOMPARE(shape, otherShape); */ } @@ -177,10 +177,10 @@ void ShapeManagerTests::addCapsuleShape() { info.setCapsule(radius, height); ShapeManager shapeManager; - btCollisionShape* shape = shapeManager.getShape(info); + const btCollisionShape* shape = shapeManager.getShape(info); ShapeInfo otherInfo = info; - btCollisionShape* otherShape = shapeManager.getShape(otherInfo); + const btCollisionShape* otherShape = shapeManager.getShape(otherInfo); QCOMPARE(shape, otherShape); */ } @@ -219,14 +219,14 @@ void ShapeManagerTests::addCompoundShape() { // create the shape ShapeManager shapeManager; - btCollisionShape* shape = shapeManager.getShape(info); + const btCollisionShape* shape = shapeManager.getShape(info); QVERIFY(shape != nullptr); // verify the shape is correct type QCOMPARE(shape->getShapeType(), (int)COMPOUND_SHAPE_PROXYTYPE); // verify the shape has correct number of children - btCompoundShape* compoundShape = static_cast(shape); + const btCompoundShape* compoundShape = static_cast(shape); QCOMPARE(compoundShape->getNumChildShapes(), numHulls); // verify manager has only one shape From e9196e8f62925d59b079f2a90c30ced02701c34e Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 5 Oct 2016 13:41:15 -0700 Subject: [PATCH 157/300] testing client to check if domain-server and ACs are running --- tools/CMakeLists.txt | 3 + tools/ac-client/CMakeLists.txt | 3 + tools/ac-client/src/ACClientApp.cpp | 272 ++++++++++++++++++++++++++++ tools/ac-client/src/ACClientApp.h | 55 ++++++ tools/ac-client/src/main.cpp | 23 +++ 5 files changed, 356 insertions(+) create mode 100644 tools/ac-client/CMakeLists.txt create mode 100644 tools/ac-client/src/ACClientApp.cpp create mode 100644 tools/ac-client/src/ACClientApp.h create mode 100644 tools/ac-client/src/main.cpp diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index a077efc335..cf0e25a757 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -10,3 +10,6 @@ set_target_properties(vhacd-util PROPERTIES FOLDER "Tools") add_subdirectory(ice-client) set_target_properties(ice-client PROPERTIES FOLDER "Tools") + +add_subdirectory(ac-client) +set_target_properties(ac-client PROPERTIES FOLDER "Tools") diff --git a/tools/ac-client/CMakeLists.txt b/tools/ac-client/CMakeLists.txt new file mode 100644 index 0000000000..9e623b02e9 --- /dev/null +++ b/tools/ac-client/CMakeLists.txt @@ -0,0 +1,3 @@ +set(TARGET_NAME ac-client) +setup_hifi_project(Core Widgets) +link_hifi_libraries(shared networking) diff --git a/tools/ac-client/src/ACClientApp.cpp b/tools/ac-client/src/ACClientApp.cpp new file mode 100644 index 0000000000..3ea2322ffd --- /dev/null +++ b/tools/ac-client/src/ACClientApp.cpp @@ -0,0 +1,272 @@ +// +// ACClientApp.cpp +// tools/ac-client/src +// +// Created by Seth Alves on 2016-10-5 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ACClientApp.h" + +ACClientApp::ACClientApp(int argc, char* argv[]) : + QCoreApplication(argc, argv) +{ + // parse command-line + QCommandLineParser parser; + parser.setApplicationDescription("High Fidelity AC client"); + parser.addHelpOption(); + + const QCommandLineOption helpOption = parser.addHelpOption(); + + const QCommandLineOption verboseOutput("v", "verbose output"); + parser.addOption(verboseOutput); + + const QCommandLineOption domainAddressOption("d", "domain-server address", "127.0.0.1"); + parser.addOption(domainAddressOption); + + const QCommandLineOption cacheSTUNOption("s", "cache stun-server response"); + parser.addOption(cacheSTUNOption); + + const QCommandLineOption listenPortOption("listenPort", "listen port", QString::number(INVALID_PORT)); + parser.addOption(listenPortOption); + + + if (!parser.parse(QCoreApplication::arguments())) { + qCritical() << parser.errorText() << endl; + parser.showHelp(); + Q_UNREACHABLE(); + } + + if (parser.isSet(helpOption)) { + parser.showHelp(); + Q_UNREACHABLE(); + } + + _verbose = parser.isSet(verboseOutput); + if (!_verbose) { + QLoggingCategory::setFilterRules("qt.network.ssl.warning=false"); + + const_cast(&networking())->setEnabled(QtDebugMsg, false); + const_cast(&networking())->setEnabled(QtInfoMsg, false); + const_cast(&networking())->setEnabled(QtWarningMsg, false); + + const_cast(&shared())->setEnabled(QtDebugMsg, false); + const_cast(&shared())->setEnabled(QtInfoMsg, false); + const_cast(&shared())->setEnabled(QtWarningMsg, false); + } + + // QString domainServerAddress = "127.0.0.1"; + // if (parser.isSet(domainAddressOption)) { + // // parse the IP and port combination for this target + // QString hostnamePortString = parser.value(domainAddressOption); + + // QHostAddress address { hostnamePortString.left(hostnamePortString.indexOf(':')) }; + // quint16 port { (quint16) hostnamePortString.mid(hostnamePortString.indexOf(':') + 1).toUInt() }; + // if (port == 0) { + // port = DEFAULT_DOMAIN_SERVER_PORT; + // } + + // if (address.isNull()) { + // qCritical() << "Could not parse an IP address and port combination from" << hostnamePortString << "-" << + // "The parsed IP was" << address.toString() << "and the parsed port was" << port; + + // QMetaObject::invokeMethod(this, "quit", Qt::QueuedConnection); + // } else { + // _iceServerAddr = HifiSockAddr(address, port); + // } + + // if (_verbose) { + // qDebug() << "domain-server Address is" << domainServerAddress << "port is" << port; + // } + // } + + QString domainServerAddress = "127.0.0.1:40103"; + if (parser.isSet(domainAddressOption)) { + domainServerAddress = parser.value(domainAddressOption); + } + + if (_verbose) { + qDebug() << "domain-server address is" << domainServerAddress; + } + + int listenPort = INVALID_PORT; + if (parser.isSet(listenPortOption)) { + listenPort = parser.value(listenPortOption).toInt(); + } + + Setting::preInit(); + DependencyManager::registerInheritance(); + // DependencyManager::registerInheritance(); + Setting::init(); + + DependencyManager::set([&]{ return QString("Mozilla/5.0 (HighFidelityACClient)"); }); + DependencyManager::set(); + DependencyManager::set(NodeType::Agent, listenPort); + + + auto nodeList = DependencyManager::get(); + + // start the nodeThread so its event loop is running + QThread* nodeThread = new QThread(this); + nodeThread->setObjectName("NodeList Thread"); + nodeThread->start(); + + // make sure the node thread is given highest priority + nodeThread->setPriority(QThread::TimeCriticalPriority); + + // setup a timer for domain-server check ins + QTimer* domainCheckInTimer = new QTimer(nodeList.data()); + connect(domainCheckInTimer, &QTimer::timeout, nodeList.data(), &NodeList::sendDomainServerCheckIn); + domainCheckInTimer->start(DOMAIN_SERVER_CHECK_IN_MSECS); + + // put the NodeList and datagram processing on the node thread + nodeList->moveToThread(nodeThread); + + + const DomainHandler& domainHandler = nodeList->getDomainHandler(); + + connect(&domainHandler, SIGNAL(hostnameChanged(const QString&)), SLOT(domainChanged(const QString&))); + // connect(&domainHandler, SIGNAL(resetting()), SLOT(resettingDomain())); + // connect(&domainHandler, SIGNAL(connectedToDomain(const QString&)), SLOT(updateWindowTitle())); + // connect(&domainHandler, SIGNAL(disconnectedFromDomain()), SLOT(updateWindowTitle())); + // connect(&domainHandler, SIGNAL(disconnectedFromDomain()), SLOT(clearDomainOctreeDetails())); + connect(&domainHandler, &DomainHandler::domainConnectionRefused, this, &ACClientApp::domainConnectionRefused); + + connect(nodeList.data(), &NodeList::nodeAdded, this, &ACClientApp::nodeAdded); + connect(nodeList.data(), &NodeList::nodeKilled, this, &ACClientApp::nodeKilled); + connect(nodeList.data(), &NodeList::nodeActivated, this, &ACClientApp::nodeActivated); + // connect(nodeList.data(), &NodeList::uuidChanged, getMyAvatar(), &MyAvatar::setSessionUUID); + // connect(nodeList.data(), &NodeList::uuidChanged, this, &ACClientApp::setSessionUUID); + // connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &ACClientApp::notifyPacketVersionMismatch); + + // // you might think we could just do this in NodeList but we only want this connection for Interface + // connect(nodeList.data(), &NodeList::limitOfSilentDomainCheckInsReached, nodeList.data(), &NodeList::reset); + + // AccountManager _accountManager = new AccountManager(std::bind(&ACClientApp::getUserAgent, qApp)); + + // setState(lookUpStunServer); + + + nodeList->addSetOfNodeTypesToNodeInterestSet(NodeSet() << NodeType::AudioMixer << NodeType::AvatarMixer + << NodeType::EntityServer << NodeType::AssetServer << NodeType::MessagesMixer); + + + // // send the identity packet for our avatar each second to our avatar mixer + // connect(&identityPacketTimer, &QTimer::timeout, getMyAvatar(), &MyAvatar::sendIdentityPacket); + // identityPacketTimer.start(AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS); + + + // DependencyManager::get()->loadSettings(domainServerAddress); + + DependencyManager::get()->handleLookupString(domainServerAddress, false); + + QTimer* doTimer = new QTimer(this); + doTimer->setSingleShot(true); + connect(doTimer, &QTimer::timeout, this, &ACClientApp::timedOut); + doTimer->start(4000); +} + +ACClientApp::~ACClientApp() { +} + + +void ACClientApp::domainConnectionRefused(const QString& reasonMessage, int reasonCodeInt, const QString& extraInfo) { + qDebug() << "domainConnectionRefused"; +} + +void ACClientApp::domainChanged(const QString& domainHostname) { + if (_verbose) { + qDebug() << "domainChanged"; + } +} + +void ACClientApp::nodeAdded(SharedNodePointer node) { + if (_verbose) { + qDebug() << "node added: " << node->getType(); + } +} + +void ACClientApp::nodeActivated(SharedNodePointer node) { + if (node->getType() == NodeType::EntityServer) { + if (_verbose) { + qDebug() << "saw EntityServer"; + } + _sawEntityServer = true; + } + else if (node->getType() == NodeType::AudioMixer) { + if (_verbose) { + qDebug() << "saw AudioMixer"; + } + _sawAudioMixer = true; + } + else if (node->getType() == NodeType::AvatarMixer) { + if (_verbose) { + qDebug() << "saw AvatarMixer"; + } + _sawAvatarMixer = true; + } + else if (node->getType() == NodeType::AssetServer) { + if (_verbose) { + qDebug() << "saw AssetServer"; + } + _sawAssetServer = true; + } + else if (node->getType() == NodeType::MessagesMixer) { + if (_verbose) { + qDebug() << "saw MessagesMixer"; + } + _sawMessagesMixer = true; + } + + if (_sawEntityServer && _sawAudioMixer && _sawAvatarMixer && _sawAssetServer && _sawMessagesMixer) { + if (_verbose) { + qDebug() << "success"; + } + finish(0); + } +} + +void ACClientApp::nodeKilled(SharedNodePointer node) { + qDebug() << "nodeKilled"; +} + +void ACClientApp::timedOut() { + if (_verbose) { + qDebug() << "timed out: " << _sawEntityServer << _sawAudioMixer << + _sawAvatarMixer << _sawAssetServer << _sawMessagesMixer; + } + finish(1); +} + +void ACClientApp::finish(int exitCode) { + auto nodeList = DependencyManager::get(); + + // send the domain a disconnect packet, force stoppage of domain-server check-ins + nodeList->getDomainHandler().disconnect(); + nodeList->setIsShuttingDown(true); + + // tell the packet receiver we're shutting down, so it can drop packets + nodeList->getPacketReceiver().setShouldDropPackets(true); + + QThread* nodeThread = DependencyManager::get()->thread(); + // remove the NodeList from the DependencyManager + DependencyManager::destroy(); + // ask the node thread to quit and wait until it is done + nodeThread->quit(); + nodeThread->wait(); + + QCoreApplication::exit(exitCode); +} diff --git a/tools/ac-client/src/ACClientApp.h b/tools/ac-client/src/ACClientApp.h new file mode 100644 index 0000000000..36de592401 --- /dev/null +++ b/tools/ac-client/src/ACClientApp.h @@ -0,0 +1,55 @@ +// +// ACClientApp.h +// tools/ac-client/src +// +// Created by Seth Alves on 2016-10-5 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + + +#ifndef hifi_ACClientApp_h +#define hifi_ACClientApp_h + +#include +#include +#include +#include +#include +#include + + +class ACClientApp : public QCoreApplication { + Q_OBJECT +public: + ACClientApp(int argc, char* argv[]); + ~ACClientApp(); + + const int stunFailureExitStatus { 1 }; + const int iceFailureExitStatus { 2 }; + const int domainPingExitStatus { 3 }; + +private slots: + void domainConnectionRefused(const QString& reasonMessage, int reasonCodeInt, const QString& extraInfo); + void domainChanged(const QString& domainHostname); + void nodeAdded(SharedNodePointer node); + void nodeActivated(SharedNodePointer node); + void nodeKilled(SharedNodePointer node); + +private: + NodeList* _nodeList; + void timedOut(); + void finish(int exitCode); + bool _verbose; + QTimer* _pingDomainTimer { nullptr }; + + bool _sawEntityServer { false }; + bool _sawAudioMixer { false }; + bool _sawAvatarMixer { false }; + bool _sawAssetServer { false }; + bool _sawMessagesMixer { false }; +}; + +#endif //hifi_ACClientApp_h diff --git a/tools/ac-client/src/main.cpp b/tools/ac-client/src/main.cpp new file mode 100644 index 0000000000..918df6413f --- /dev/null +++ b/tools/ac-client/src/main.cpp @@ -0,0 +1,23 @@ +// +// main.cpp +// tools/ice-client/src +// +// Created by Seth Alves on 2016-10-5 +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html + +#include +#include +#include +#include + +#include "ACClientApp.h" + +using namespace std; + +int main(int argc, char * argv[]) { + ACClientApp app(argc, argv); + return app.exec(); +} From afbbd398dc380bfa9b9ba41b5e9cd7f322d94dbd Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 5 Oct 2016 13:48:03 -0700 Subject: [PATCH 158/300] Remove QML threaded rendering --- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 562 +++++--------------- libraries/gl/src/gl/OffscreenQmlSurface.h | 44 +- libraries/gl/src/gl/TextureRecycler.cpp | 83 +++ libraries/gl/src/gl/TextureRecycler.h | 47 ++ 4 files changed, 291 insertions(+), 445 deletions(-) create mode 100644 libraries/gl/src/gl/TextureRecycler.cpp create mode 100644 libraries/gl/src/gl/TextureRecycler.h diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index 797f297488..bcfaaffd08 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -32,11 +32,13 @@ #include #include #include +#include #include "OffscreenGLCanvas.h" #include "GLHelpers.h" #include "GLLogging.h" - +#include "TextureRecycler.h" +#include "Context.h" QString fixupHifiUrl(const QString& urlString) { static const QString ACCESS_TOKEN_PARAMETER = "access_token"; @@ -114,257 +116,23 @@ QNetworkAccessManager* QmlNetworkAccessManagerFactory::create(QObject* parent) { Q_DECLARE_LOGGING_CATEGORY(offscreenFocus) Q_LOGGING_CATEGORY(offscreenFocus, "hifi.offscreen.focus") -static const QEvent::Type INIT = QEvent::Type(QEvent::User + 1); -static const QEvent::Type RENDER = QEvent::Type(QEvent::User + 2); -static const QEvent::Type RESIZE = QEvent::Type(QEvent::User + 3); -static const QEvent::Type STOP = QEvent::Type(QEvent::User + 4); +#if 0 +QJsonObject getGLContextData(); +QJsonObject _glData; -class RawTextureRecycler { -public: - using TexturePtr = GLuint; - RawTextureRecycler(bool useMipmaps) : _useMipmaps(useMipmaps) {} - void setSize(const uvec2& size); - void clear(); - TexturePtr getNextTexture(); - void recycleTexture(GLuint texture); - -private: - - struct TexInfo { - TexturePtr _tex { 0 }; - uvec2 _size; - bool _active { false }; - - TexInfo() {} - TexInfo(TexturePtr tex, const uvec2& size) : _tex(tex), _size(size) {} - }; - - using Map = std::map; - using Queue = std::queue; - - Map _allTextures; - Queue _readyTextures; - uvec2 _size { 1920, 1080 }; - bool _useMipmaps; -}; - - -void RawTextureRecycler::setSize(const uvec2& size) { - if (size == _size) { - return; +QJsonObject OffscreenQmlSurface::getGLContextData() { + _glMutex.lock(); + if (_glData.isEmpty()) { + _glWait.wait(&_glMutex); } - _size = size; - while (!_readyTextures.empty()) { - _readyTextures.pop(); - } - std::set toDelete; - std::for_each(_allTextures.begin(), _allTextures.end(), [&](Map::const_reference item) { - if (!item.second._active && item.second._size != _size) { - toDelete.insert(item.first); - } - }); - std::for_each(toDelete.begin(), toDelete.end(), [&](Map::key_type key) { - _allTextures.erase(key); - }); -} - -void RawTextureRecycler::clear() { - while (!_readyTextures.empty()) { - _readyTextures.pop(); - } - _allTextures.clear(); -} - -RawTextureRecycler::TexturePtr RawTextureRecycler::getNextTexture() { - if (_readyTextures.empty()) { - TexturePtr newTexture; - glGenTextures(1, &newTexture); - - glBindTexture(GL_TEXTURE_2D, newTexture); - if (_useMipmaps) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); - } else { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - } - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 8.0f); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -0.2f); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 8.0f); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, _size.x, _size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); - _allTextures[newTexture] = TexInfo { newTexture, _size }; - _readyTextures.push(newTexture); - } - - TexturePtr result = _readyTextures.front(); - _readyTextures.pop(); - auto& item = _allTextures[result]; - item._active = true; - return result; -} - -void RawTextureRecycler::recycleTexture(GLuint texture) { - Q_ASSERT(_allTextures.count(texture)); - auto& item = _allTextures[texture]; - Q_ASSERT(item._active); - item._active = false; - if (item._size != _size) { - // Buh-bye - _allTextures.erase(texture); - return; - } - - _readyTextures.push(item._tex); + _glMutex.unlock(); + return _glData; } +#endif -class OffscreenQmlRenderThread : public QThread { -public: - OffscreenQmlRenderThread(OffscreenQmlSurface* surface, QOpenGLContext* shareContext); - virtual ~OffscreenQmlRenderThread() = default; - - virtual void run() override; - virtual bool event(QEvent *e) override; - -protected: - class Queue : private QQueue { - public: - void add(QEvent::Type type); - QEvent* take(); - - private: - QMutex _mutex; - QWaitCondition _waitCondition; - bool _isWaiting{ false }; - }; - - friend class OffscreenQmlSurface; - - QJsonObject getGLContextData(); - - Queue _queue; - QMutex _mutex; - QWaitCondition _waitCondition; - std::atomic _rendering { false }; - - QJsonObject _glData; - QMutex _glMutex; - QWaitCondition _glWait; - -private: - // Event-driven methods - void init(); - void render(); - void resize(); - void cleanup(); - - // Helper methods - void setupFbo(); - bool allowNewFrame(uint8_t fps); - bool fetchTexture(OffscreenQmlSurface::TextureAndFence& textureAndFence); - void releaseTexture(const OffscreenQmlSurface::TextureAndFence& textureAndFence); - - // Texture management - std::mutex _textureMutex; - GLuint _latestTexture { 0 }; - GLsync _latestTextureFence { 0 }; - std::list _returnedTextures; - - // Rendering members - OffscreenGLCanvas _canvas; - OffscreenQmlSurface* _surface{ nullptr }; - QQuickWindow* _quickWindow{ nullptr }; - QMyQuickRenderControl* _renderControl{ nullptr }; - GLuint _fbo { 0 }; - GLuint _depthStencil { 0 }; - RawTextureRecycler _textures { true }; - - uint64_t _lastRenderTime{ 0 }; - uvec2 _size{ 1920, 1080 }; - QSize _newSize; - bool _quit{ false }; -}; - -void OffscreenQmlRenderThread::Queue::add(QEvent::Type type) { - QMutexLocker locker(&_mutex); - enqueue(new QEvent(type)); - if (_isWaiting) { - _waitCondition.wakeOne(); - } -} - -QEvent* OffscreenQmlRenderThread::Queue::take() { - QMutexLocker locker(&_mutex); - while (isEmpty()) { - _isWaiting = true; - _waitCondition.wait(&_mutex); - _isWaiting = false; - } - QEvent* e = dequeue(); - return e; -} - -OffscreenQmlRenderThread::OffscreenQmlRenderThread(OffscreenQmlSurface* surface, QOpenGLContext* shareContext) : _surface(surface) { - _canvas.setObjectName("OffscreenQmlRenderCanvas"); - qCDebug(glLogging) << "Building QML Renderer"; - if (!_canvas.create(shareContext)) { - qWarning("Failed to create OffscreenGLCanvas"); - _quit = true; - return; - }; - - _renderControl = new QMyQuickRenderControl(); - QQuickWindow::setDefaultAlphaBuffer(true); - // Create a QQuickWindow that is associated with our render control. - // This window never gets created or shown, meaning that it will never get an underlying native (platform) window. - // NOTE: Must be created on the main thread so that OffscreenQmlSurface can send it events - // NOTE: Must be created on the rendering thread or it will refuse to render, - // so we wait until after its ctor to move object/context to this thread. - _quickWindow = new QQuickWindow(_renderControl); - _quickWindow->setColor(QColor(255, 255, 255, 0)); - _quickWindow->setFlags(_quickWindow->flags() | static_cast(Qt::WA_TranslucentBackground)); - - // We can prepare, but we must wait to start() the thread until after the ctor - _renderControl->prepareThread(this); - _canvas.getContextObject()->moveToThread(this); - moveToThread(this); - - _queue.add(INIT); -} - -void OffscreenQmlRenderThread::run() { - qCDebug(glLogging) << "Starting QML Renderer thread"; - - while (!_quit) { - QEvent* e = _queue.take(); - event(e); - delete e; - } -} - -bool OffscreenQmlRenderThread::event(QEvent *e) { - switch (int(e->type())) { - case INIT: - init(); - return true; - case RENDER: - render(); - return true; - case RESIZE: - resize(); - return true; - case STOP: - cleanup(); - return true; - default: - return QObject::event(e); - } -} - -void OffscreenQmlRenderThread::setupFbo() { +void OffscreenQmlSurface::setupFbo() { + _canvas->makeCurrent(); _textures.setSize(_size); if (_depthStencil) { glDeleteRenderbuffers(1, &_depthStencil); @@ -382,41 +150,12 @@ void OffscreenQmlRenderThread::setupFbo() { glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo); glFramebufferRenderbuffer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthStencil); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + _canvas->doneCurrent(); } -QJsonObject OffscreenQmlRenderThread::getGLContextData() { - _glMutex.lock(); - if (_glData.isEmpty()) { - _glWait.wait(&_glMutex); - } - _glMutex.unlock(); - return _glData; -} - -void OffscreenQmlRenderThread::init() { - qCDebug(glLogging) << "Initializing QML Renderer"; - - if (!_canvas.makeCurrent()) { - qWarning("Failed to make context current on QML Renderer Thread"); - _quit = true; - return; - } - - _glMutex.lock(); - _glData = ::getGLContextData(); - _glMutex.unlock(); - _glWait.wakeAll(); - - connect(_renderControl, &QQuickRenderControl::renderRequested, _surface, &OffscreenQmlSurface::requestRender); - connect(_renderControl, &QQuickRenderControl::sceneChanged, _surface, &OffscreenQmlSurface::requestUpdate); - - _renderControl->initialize(_canvas.getContext()); - setupFbo(); -} - -void OffscreenQmlRenderThread::cleanup() { +void OffscreenQmlSurface::cleanup() { + _canvas->makeCurrent(); _renderControl->invalidate(); - if (_depthStencil) { glDeleteRenderbuffers(1, &_depthStencil); _depthStencil = 0; @@ -427,65 +166,17 @@ void OffscreenQmlRenderThread::cleanup() { } _textures.clear(); - - _canvas.doneCurrent(); - _canvas.getContextObject()->moveToThread(QCoreApplication::instance()->thread()); - - _quit = true; + _canvas->doneCurrent(); } -void OffscreenQmlRenderThread::resize() { - // Lock _newSize changes - { - QMutexLocker locker(&_mutex); - - // Update our members - if (_quickWindow) { - _quickWindow->setGeometry(QRect(QPoint(), _newSize)); - _quickWindow->contentItem()->setSize(_newSize); - } - - // Qt bug in 5.4 forces this check of pixel ratio, - // even though we're rendering offscreen. - qreal pixelRatio = 1.0; - if (_renderControl && _renderControl->_renderWindow) { - pixelRatio = _renderControl->_renderWindow->devicePixelRatio(); - } - - uvec2 newOffscreenSize = toGlm(_newSize * pixelRatio); - if (newOffscreenSize == _size) { - return; - } - - qCDebug(glLogging) << "Offscreen UI resizing to " << _newSize.width() << "x" << _newSize.height() << " with pixel ratio " << pixelRatio; - _size = newOffscreenSize; - } - - _textures.setSize(_size); - setupFbo(); -} - -void OffscreenQmlRenderThread::render() { - // Ensure we always release the main thread - Finally releaseMainThread([this] { - _waitCondition.wakeOne(); - }); - - if (_surface->_paused) { +void OffscreenQmlSurface::render() { + if (_paused) { return; } - _rendering = true; - Finally unmarkRenderingFlag([this] { - _rendering = false; - }); - - { - QMutexLocker locker(&_mutex); - _renderControl->sync(); - releaseMainThread.trigger(); - } + _canvas->makeCurrent(); + _renderControl->sync(); _quickWindow->setRenderTarget(_fbo, QSize(_size.x, _size.y)); // Clear out any pending textures to be returned @@ -507,70 +198,61 @@ void OffscreenQmlRenderThread::render() { } } - try { - GLuint texture = _textures.getNextTexture(); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo); - glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0); - PROFILE_RANGE("qml_render->rendercontrol") - _renderControl->render(); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - glBindTexture(GL_TEXTURE_2D, texture); - glGenerateMipmap(GL_TEXTURE_2D); - glBindTexture(GL_TEXTURE_2D, 0); + GLuint texture = _textures.getNextTexture(); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _fbo); + glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0); + PROFILE_RANGE("qml_render->rendercontrol") + _renderControl->render(); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glBindTexture(GL_TEXTURE_2D, texture); + glGenerateMipmap(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, 0); - { - std::unique_lock lock(_textureMutex); - // If the most recent texture was unused, we can directly recycle it - if (_latestTextureFence) { - } - if (_latestTexture) { - _textures.recycleTexture(_latestTexture); - glDeleteSync(_latestTextureFence); - _latestTexture = 0; - _latestTextureFence = 0; - } - - _latestTextureFence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - _latestTexture = texture; - // Fence will be used in another thread / context, so a flush is required - glFlush(); + { + std::unique_lock lock(_textureMutex); + // If the most recent texture was unused, we can directly recycle it + if (_latestTextureAndFence.first) { + _textures.recycleTexture(_latestTextureAndFence.first); + glDeleteSync(static_cast(_latestTextureAndFence.second)); + _latestTextureAndFence = { 0, 0 }; } - _quickWindow->resetOpenGLState(); - _lastRenderTime = usecTimestampNow(); - } catch (std::runtime_error& error) { - qWarning() << "Failed to render QML: " << error.what(); + _latestTextureAndFence = { texture, glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0) }; + // Fence will be used in another thread / context, so a flush is required + glFlush(); } + + _quickWindow->resetOpenGLState(); + _lastRenderTime = usecTimestampNow(); + _canvas->doneCurrent(); } -bool OffscreenQmlRenderThread::fetchTexture(OffscreenQmlSurface::TextureAndFence& textureAndFence) { +bool OffscreenQmlSurface::fetchTexture(TextureAndFence& textureAndFence) { textureAndFence = { 0, 0 }; std::unique_lock lock(_textureMutex); - if (0 == _latestTexture) { + if (0 == _latestTextureAndFence.first) { return false; } // Ensure writes to the latest texture are complete before before returning it for reading - Q_ASSERT(0 != _latestTextureFence); - textureAndFence = { _latestTexture, _latestTextureFence }; - _latestTextureFence = 0; - _latestTexture = 0; + textureAndFence = _latestTextureAndFence; + _latestTextureAndFence = { 0, 0 }; return true; } -void OffscreenQmlRenderThread::releaseTexture(const OffscreenQmlSurface::TextureAndFence& textureAndFence) { +void OffscreenQmlSurface::releaseTexture(const TextureAndFence& textureAndFence) { std::unique_lock lock(_textureMutex); _returnedTextures.push_back(textureAndFence); } -bool OffscreenQmlRenderThread::allowNewFrame(uint8_t fps) { +bool OffscreenQmlSurface::allowNewFrame(uint8_t fps) { // If we already have a pending texture, don't render another one // i.e. don't render faster than the consumer context, since it wastes // GPU cycles on producing output that will never be seen { std::unique_lock lock(_textureMutex); - if (0 != _latestTexture) { + if (0 != _latestTextureAndFence.first) { return false; } } @@ -588,33 +270,46 @@ OffscreenQmlSurface::~OffscreenQmlSurface() { QObject::disconnect(&_updateTimer); QObject::disconnect(qApp); - qCDebug(glLogging) << "Stopping QML Renderer Thread " << _renderer->currentThreadId(); - _renderer->_queue.add(STOP); - if (!_renderer->wait(MAX_SHUTDOWN_WAIT_SECS * USECS_PER_SECOND)) { - qWarning() << "Failed to shut down the QML Renderer Thread"; - } - delete _rootItem; - delete _renderer; - delete _qmlComponent; - delete _qmlEngine; + cleanup(); + + _canvas->deleteLater(); + _rootItem->deleteLater(); + _qmlComponent->deleteLater(); + _qmlEngine->deleteLater(); + _quickWindow->deleteLater(); } void OffscreenQmlSurface::onAboutToQuit() { + _paused = true; QObject::disconnect(&_updateTimer); } void OffscreenQmlSurface::create(QOpenGLContext* shareContext) { qCDebug(glLogging) << "Building QML surface"; - _renderer = new OffscreenQmlRenderThread(this, shareContext); - _renderer->moveToThread(_renderer); - _renderer->setObjectName("QML Renderer Thread"); - _renderer->start(); + _renderControl = new QMyQuickRenderControl(); - _renderer->_renderControl->_renderWindow = _proxyWindow; + QQuickWindow::setDefaultAlphaBuffer(true); - connect(_renderer->_quickWindow, &QQuickWindow::focusObjectChanged, this, &OffscreenQmlSurface::onFocusObjectChanged); + // Create a QQuickWindow that is associated with our render control. + // This window never gets created or shown, meaning that it will never get an underlying native (platform) window. + // NOTE: Must be created on the main thread so that OffscreenQmlSurface can send it events + // NOTE: Must be created on the rendering thread or it will refuse to render, + // so we wait until after its ctor to move object/context to this thread. + _quickWindow = new QQuickWindow(_renderControl); + _quickWindow->setColor(QColor(255, 255, 255, 0)); + _quickWindow->setFlags(_quickWindow->flags() | static_cast(Qt::WA_TranslucentBackground)); + + _renderControl->_renderWindow = _proxyWindow; + + _canvas = new OffscreenGLCanvas(); + if (!_canvas->create(shareContext)) { + qFatal("Failed to create OffscreenGLCanvas"); + return; + }; + + connect(_quickWindow, &QQuickWindow::focusObjectChanged, this, &OffscreenQmlSurface::onFocusObjectChanged); // Create a QML engine. _qmlEngine = new QQmlEngine; @@ -625,13 +320,25 @@ void OffscreenQmlSurface::create(QOpenGLContext* shareContext) { importList.insert(importList.begin(), PathUtils::resourcesPath()); _qmlEngine->setImportPathList(importList); if (!_qmlEngine->incubationController()) { - _qmlEngine->setIncubationController(_renderer->_quickWindow->incubationController()); + _qmlEngine->setIncubationController(_quickWindow->incubationController()); } - _qmlEngine->rootContext()->setContextProperty("GL", _renderer->getGLContextData()); + // FIXME +// _qmlEngine->rootContext()->setContextProperty("GL", _renderer->getGLContextData()); _qmlEngine->rootContext()->setContextProperty("offscreenWindow", QVariant::fromValue(getWindow())); _qmlComponent = new QQmlComponent(_qmlEngine); + + connect(_renderControl, &QQuickRenderControl::renderRequested, [this] { _render = true; }); + connect(_renderControl, &QQuickRenderControl::sceneChanged, [this] { _render = _polish = true; }); + + if (!_canvas->makeCurrent()) { + qWarning("Failed to make context current for QML Renderer"); + return; + } + _renderControl->initialize(_canvas->getContext()); + setupFbo(); + // When Quick says there is a need to render, we will not render immediately. Instead, // a timer with a small interval is used to get better performance. QObject::connect(&_updateTimer, &QTimer::timeout, this, &OffscreenQmlSurface::updateQuick); @@ -646,7 +353,7 @@ void OffscreenQmlSurface::create(QOpenGLContext* shareContext) { void OffscreenQmlSurface::resize(const QSize& newSize_, bool forceResize) { - if (!_renderer || !_renderer->_quickWindow) { + if (!_quickWindow) { return; } @@ -662,7 +369,7 @@ void OffscreenQmlSurface::resize(const QSize& newSize_, bool forceResize) { std::max(static_cast(scale * newSize.height()), 10)); } - QSize currentSize = _renderer->_quickWindow->geometry().size(); + QSize currentSize = _quickWindow->geometry().size(); if (newSize == currentSize && !forceResize) { return; } @@ -673,12 +380,26 @@ void OffscreenQmlSurface::resize(const QSize& newSize_, bool forceResize) { _rootItem->setSize(newSize); } - { - QMutexLocker locker(&(_renderer->_mutex)); - _renderer->_newSize = newSize; + // Update our members + _quickWindow->setGeometry(QRect(QPoint(), newSize)); + _quickWindow->contentItem()->setSize(newSize); + + // Qt bug in 5.4 forces this check of pixel ratio, + // even though we're rendering offscreen. + qreal pixelRatio = 1.0; + if (_renderControl && _renderControl->_renderWindow) { + pixelRatio = _renderControl->_renderWindow->devicePixelRatio(); } - _renderer->_queue.add(RESIZE); + uvec2 newOffscreenSize = toGlm(newSize * pixelRatio); + if (newOffscreenSize == _size) { + return; + } + + qCDebug(glLogging) << "Offscreen UI resizing to " << newSize.width() << "x" << newSize.height() << " with pixel ratio " << pixelRatio; + _size = newOffscreenSize; + _textures.setSize(_size); + setupFbo(); } QQuickItem* OffscreenQmlSurface::getRootItem() { @@ -710,15 +431,6 @@ void OffscreenQmlSurface::clearCache() { getRootContext()->engine()->clearComponentCache(); } -void OffscreenQmlSurface::requestUpdate() { - _polish = true; - _render = true; -} - -void OffscreenQmlSurface::requestRender() { - _render = true; -} - QObject* OffscreenQmlSurface::finishQmlLoad(std::function f) { disconnect(_qmlComponent, &QQmlComponent::statusChanged, this, 0); if (_qmlComponent->isError()) { @@ -770,8 +482,8 @@ QObject* OffscreenQmlSurface::finishQmlLoad(std::functionsetParentItem(_renderer->_quickWindow->contentItem()); - _rootItem->setSize(_renderer->_quickWindow->renderTargetSize()); + _rootItem->setParentItem(_quickWindow->contentItem()); + _rootItem->setSize(_quickWindow->renderTargetSize()); return _rootItem; } @@ -781,34 +493,22 @@ void OffscreenQmlSurface::updateQuick() { // b) already rendering a frame // c) rendering too fast // then skip this - if (!_renderer || _renderer->_rendering || !_renderer->allowNewFrame(_maxFps)) { + if (!allowNewFrame(_maxFps)) { return; } if (_polish) { - _renderer->_renderControl->polishItems(); + _renderControl->polishItems(); _polish = false; } if (_render) { PROFILE_RANGE(__FUNCTION__); - // Lock the GUI size while syncing - QMutexLocker locker(&(_renderer->_mutex)); - _renderer->_queue.add(RENDER); - // FIXME need to find a better way to handle the render lockout than this locking of the main thread - _renderer->_waitCondition.wait(&(_renderer->_mutex)); + render(); _render = false; } } -bool OffscreenQmlSurface::fetchTexture(TextureAndFence& texture) { - return _renderer->fetchTexture(texture); -} - -void OffscreenQmlSurface::releaseTexture(const TextureAndFence& texture) { - _renderer->releaseTexture(texture); -} - QPointF OffscreenQmlSurface::mapWindowToUi(const QPointF& sourcePosition, QObject* sourceObject) { vec2 sourceSize; if (dynamic_cast(sourceObject)) { @@ -818,7 +518,7 @@ QPointF OffscreenQmlSurface::mapWindowToUi(const QPointF& sourcePosition, QObjec } vec2 offscreenPosition = toGlm(sourcePosition); offscreenPosition /= sourceSize; - offscreenPosition *= vec2(toGlm(_renderer->_quickWindow->size())); + offscreenPosition *= vec2(toGlm(_quickWindow->size())); return QPointF(offscreenPosition.x, offscreenPosition.y); } @@ -832,7 +532,7 @@ QPointF OffscreenQmlSurface::mapToVirtualScreen(const QPointF& originalPoint, QO // bool OffscreenQmlSurface::filterEnabled(QObject* originalDestination, QEvent* event) const { - if (_renderer->_quickWindow == originalDestination) { + if (_quickWindow == originalDestination) { return false; } // Only intercept events while we're in an active state @@ -850,7 +550,7 @@ bool OffscreenQmlSurface::eventFilter(QObject* originalDestination, QEvent* even // Don't intercept our own events, or we enter an infinite recursion QObject* recurseTest = originalDestination; while (recurseTest) { - Q_ASSERT(recurseTest != _rootItem && recurseTest != _renderer->_quickWindow); + Q_ASSERT(recurseTest != _rootItem && recurseTest != _quickWindow); recurseTest = recurseTest->parent(); } #endif @@ -869,7 +569,7 @@ bool OffscreenQmlSurface::eventFilter(QObject* originalDestination, QEvent* even case QEvent::KeyPress: case QEvent::KeyRelease: { event->ignore(); - if (QCoreApplication::sendEvent(_renderer->_quickWindow, event)) { + if (QCoreApplication::sendEvent(_quickWindow, event)) { return event->isAccepted(); } break; @@ -883,7 +583,7 @@ bool OffscreenQmlSurface::eventFilter(QObject* originalDestination, QEvent* even wheelEvent->delta(), wheelEvent->buttons(), wheelEvent->modifiers(), wheelEvent->orientation()); mappedEvent.ignore(); - if (QCoreApplication::sendEvent(_renderer->_quickWindow, &mappedEvent)) { + if (QCoreApplication::sendEvent(_quickWindow, &mappedEvent)) { return mappedEvent.isAccepted(); } break; @@ -904,7 +604,7 @@ bool OffscreenQmlSurface::eventFilter(QObject* originalDestination, QEvent* even _qmlEngine->rootContext()->setContextProperty("lastMousePosition", transformedPos); } mappedEvent.ignore(); - if (QCoreApplication::sendEvent(_renderer->_quickWindow, &mappedEvent)) { + if (QCoreApplication::sendEvent(_quickWindow, &mappedEvent)) { return mappedEvent.isAccepted(); } break; @@ -923,7 +623,7 @@ void OffscreenQmlSurface::pause() { void OffscreenQmlSurface::resume() { _paused = false; - requestRender(); + _render = true; } bool OffscreenQmlSurface::isPaused() const { @@ -932,8 +632,8 @@ bool OffscreenQmlSurface::isPaused() const { void OffscreenQmlSurface::setProxyWindow(QWindow* window) { _proxyWindow = window; - if (_renderer && _renderer->_renderControl) { - _renderer->_renderControl->_renderWindow = window; + if (_renderControl) { + _renderControl->_renderWindow = window; } } @@ -942,11 +642,11 @@ QObject* OffscreenQmlSurface::getEventHandler() { } QQuickWindow* OffscreenQmlSurface::getWindow() { - return _renderer->_quickWindow; + return _quickWindow; } QSize OffscreenQmlSurface::size() const { - return _renderer->_quickWindow->geometry().size(); + return _quickWindow->geometry().size(); } QQmlContext* OffscreenQmlSurface::getRootContext() { diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index fa2346dd2f..7232e410ea 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -16,9 +16,11 @@ #include #include +#include "TextureRecycler.h" class QWindow; class QMyQuickRenderControl; +class OffscreenGLCanvas; class QOpenGLContext; class QQmlEngine; class QQmlContext; @@ -26,8 +28,6 @@ class QQmlComponent; class QQuickWindow; class QQuickItem; -class OffscreenQmlRenderThread; - class OffscreenQmlSurface : public QObject { Q_OBJECT Q_PROPERTY(bool focusText READ isFocusText NOTIFY focusTextChanged) @@ -86,8 +86,6 @@ signals: void focusTextChanged(bool focusText); public slots: - void requestUpdate(); - void requestRender(); void onAboutToQuit(); protected: @@ -97,24 +95,42 @@ protected: private: QObject* finishQmlLoad(std::function f); QPointF mapWindowToUi(const QPointF& sourcePosition, QObject* sourceObject); + void setupFbo(); + bool allowNewFrame(uint8_t fps); + void render(); + void resize(); + void cleanup(); private slots: void updateQuick(); void onFocusObjectChanged(QObject* newFocus); private: - friend class OffscreenQmlRenderThread; - OffscreenQmlRenderThread* _renderer{ nullptr }; - QQmlEngine* _qmlEngine{ nullptr }; - QQmlComponent* _qmlComponent{ nullptr }; - QQuickItem* _rootItem{ nullptr }; + QQuickWindow* _quickWindow { nullptr }; + QMyQuickRenderControl* _renderControl{ nullptr }; + QQmlEngine* _qmlEngine { nullptr }; + QQmlComponent* _qmlComponent { nullptr }; + QQuickItem* _rootItem { nullptr }; + OffscreenGLCanvas* _canvas { nullptr }; QTimer _updateTimer; - bool _render{ false }; - bool _polish{ true }; - bool _paused{ true }; + uint32_t _fbo { 0 }; + uint32_t _depthStencil { 0 }; + uint64_t _lastRenderTime { 0 }; + uvec2 _size { 1920, 1080 }; + TextureRecycler _textures { true }; + + // Texture management + std::mutex _textureMutex; + TextureAndFence _latestTextureAndFence { 0, 0 }; + std::list _returnedTextures; + + + bool _render { false }; + bool _polish { true }; + bool _paused { true }; bool _focusText { false }; - uint8_t _maxFps{ 60 }; - MouseTranslator _mouseTranslator{ [](const QPointF& p) { return p.toPoint(); } }; + uint8_t _maxFps { 60 }; + MouseTranslator _mouseTranslator { [](const QPointF& p) { return p.toPoint(); } }; QWindow* _proxyWindow { nullptr }; }; diff --git a/libraries/gl/src/gl/TextureRecycler.cpp b/libraries/gl/src/gl/TextureRecycler.cpp new file mode 100644 index 0000000000..4438e158c5 --- /dev/null +++ b/libraries/gl/src/gl/TextureRecycler.cpp @@ -0,0 +1,83 @@ +// +// Created by Bradley Austin Davis on 2016-10-05 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#include "TextureRecycler.h" +#include "Config.h" + +#include + + +void TextureRecycler::setSize(const uvec2& size) { + if (size == _size) { + return; + } + _size = size; + while (!_readyTextures.empty()) { + _readyTextures.pop(); + } + std::set toDelete; + std::for_each(_allTextures.begin(), _allTextures.end(), [&](Map::const_reference item) { + if (!item.second._active && item.second._size != _size) { + toDelete.insert(item.first); + } + }); + std::for_each(toDelete.begin(), toDelete.end(), [&](Map::key_type key) { + _allTextures.erase(key); + }); +} + +void TextureRecycler::clear() { + while (!_readyTextures.empty()) { + _readyTextures.pop(); + } + _allTextures.clear(); +} + +uint32_t TextureRecycler::getNextTexture() { + if (_readyTextures.empty()) { + uint32_t newTexture; + glGenTextures(1, &newTexture); + glBindTexture(GL_TEXTURE_2D, newTexture); + if (_useMipmaps) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 8.0f); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, -0.2f); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 8.0f); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, _size.x, _size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); + _allTextures.emplace(std::piecewise_construct, std::forward_as_tuple(newTexture), std::forward_as_tuple(newTexture, _size)); + _readyTextures.push(newTexture); + } + + uint32_t result = _readyTextures.front(); + _readyTextures.pop(); + auto& item = _allTextures[result]; + item._active = true; + return result; +} + +void TextureRecycler::recycleTexture(GLuint texture) { + Q_ASSERT(_allTextures.count(texture)); + auto& item = _allTextures[texture]; + Q_ASSERT(item._active); + item._active = false; + if (item._size != _size) { + // Buh-bye + _allTextures.erase(texture); + return; + } + + _readyTextures.push(item._tex); +} + diff --git a/libraries/gl/src/gl/TextureRecycler.h b/libraries/gl/src/gl/TextureRecycler.h new file mode 100644 index 0000000000..46cbcad219 --- /dev/null +++ b/libraries/gl/src/gl/TextureRecycler.h @@ -0,0 +1,47 @@ +// +// Created by Bradley Austin Davis on 2015-04-04 +// Copyright 2015 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// +#pragma once +#ifndef hifi_TextureRecycler_h +#define hifi_TextureRecycler_h + +#include +#include +#include + +#include + +class TextureRecycler { +public: + TextureRecycler(bool useMipmaps) : _useMipmaps(useMipmaps) {} + void setSize(const uvec2& size); + void clear(); + uint32_t getNextTexture(); + void recycleTexture(uint32_t texture); + +private: + + struct TexInfo { + const uint32_t _tex{ 0 }; + const uvec2 _size; + bool _active { false }; + + TexInfo() {} + TexInfo(uint32_t tex, const uvec2& size) : _tex(tex), _size(size) {} + TexInfo(const TexInfo& other) : _tex(other._tex), _size(other._size) {} + }; + + using Map = std::map; + using Queue = std::queue; + + Map _allTextures; + Queue _readyTextures; + uvec2 _size{ 1920, 1080 }; + bool _useMipmaps; +}; + +#endif From 35755ddcb1f96d6ca433b98fbb081048484a60c0 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 5 Oct 2016 13:48:54 -0700 Subject: [PATCH 159/300] cleanups --- tools/ac-client/src/ACClientApp.cpp | 43 ----------------------------- 1 file changed, 43 deletions(-) diff --git a/tools/ac-client/src/ACClientApp.cpp b/tools/ac-client/src/ACClientApp.cpp index 3ea2322ffd..0d952e8cc1 100644 --- a/tools/ac-client/src/ACClientApp.cpp +++ b/tools/ac-client/src/ACClientApp.cpp @@ -68,31 +68,6 @@ ACClientApp::ACClientApp(int argc, char* argv[]) : const_cast(&shared())->setEnabled(QtWarningMsg, false); } - // QString domainServerAddress = "127.0.0.1"; - // if (parser.isSet(domainAddressOption)) { - // // parse the IP and port combination for this target - // QString hostnamePortString = parser.value(domainAddressOption); - - // QHostAddress address { hostnamePortString.left(hostnamePortString.indexOf(':')) }; - // quint16 port { (quint16) hostnamePortString.mid(hostnamePortString.indexOf(':') + 1).toUInt() }; - // if (port == 0) { - // port = DEFAULT_DOMAIN_SERVER_PORT; - // } - - // if (address.isNull()) { - // qCritical() << "Could not parse an IP address and port combination from" << hostnamePortString << "-" << - // "The parsed IP was" << address.toString() << "and the parsed port was" << port; - - // QMetaObject::invokeMethod(this, "quit", Qt::QueuedConnection); - // } else { - // _iceServerAddr = HifiSockAddr(address, port); - // } - - // if (_verbose) { - // qDebug() << "domain-server Address is" << domainServerAddress << "port is" << port; - // } - // } - QString domainServerAddress = "127.0.0.1:40103"; if (parser.isSet(domainAddressOption)) { domainServerAddress = parser.value(domainAddressOption); @@ -109,7 +84,6 @@ ACClientApp::ACClientApp(int argc, char* argv[]) : Setting::preInit(); DependencyManager::registerInheritance(); - // DependencyManager::registerInheritance(); Setting::init(); DependencyManager::set([&]{ return QString("Mozilla/5.0 (HighFidelityACClient)"); }); @@ -135,7 +109,6 @@ ACClientApp::ACClientApp(int argc, char* argv[]) : // put the NodeList and datagram processing on the node thread nodeList->moveToThread(nodeThread); - const DomainHandler& domainHandler = nodeList->getDomainHandler(); connect(&domainHandler, SIGNAL(hostnameChanged(const QString&)), SLOT(domainChanged(const QString&))); @@ -152,25 +125,9 @@ ACClientApp::ACClientApp(int argc, char* argv[]) : // connect(nodeList.data(), &NodeList::uuidChanged, this, &ACClientApp::setSessionUUID); // connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &ACClientApp::notifyPacketVersionMismatch); - // // you might think we could just do this in NodeList but we only want this connection for Interface - // connect(nodeList.data(), &NodeList::limitOfSilentDomainCheckInsReached, nodeList.data(), &NodeList::reset); - - // AccountManager _accountManager = new AccountManager(std::bind(&ACClientApp::getUserAgent, qApp)); - - // setState(lookUpStunServer); - - nodeList->addSetOfNodeTypesToNodeInterestSet(NodeSet() << NodeType::AudioMixer << NodeType::AvatarMixer << NodeType::EntityServer << NodeType::AssetServer << NodeType::MessagesMixer); - - // // send the identity packet for our avatar each second to our avatar mixer - // connect(&identityPacketTimer, &QTimer::timeout, getMyAvatar(), &MyAvatar::sendIdentityPacket); - // identityPacketTimer.start(AVATAR_IDENTITY_PACKET_SEND_INTERVAL_MSECS); - - - // DependencyManager::get()->loadSettings(domainServerAddress); - DependencyManager::get()->handleLookupString(domainServerAddress, false); QTimer* doTimer = new QTimer(this); From 1dc52d3bf579d6d621fc9f3109427c5a566ffed2 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 5 Oct 2016 13:54:09 -0700 Subject: [PATCH 160/300] cleanups, fail if packet-version mismatch --- tools/ac-client/src/ACClientApp.cpp | 11 ++++++++--- tools/ac-client/src/ACClientApp.h | 6 +----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/tools/ac-client/src/ACClientApp.cpp b/tools/ac-client/src/ACClientApp.cpp index 0d952e8cc1..f174f50ab6 100644 --- a/tools/ac-client/src/ACClientApp.cpp +++ b/tools/ac-client/src/ACClientApp.cpp @@ -113,8 +113,6 @@ ACClientApp::ACClientApp(int argc, char* argv[]) : connect(&domainHandler, SIGNAL(hostnameChanged(const QString&)), SLOT(domainChanged(const QString&))); // connect(&domainHandler, SIGNAL(resetting()), SLOT(resettingDomain())); - // connect(&domainHandler, SIGNAL(connectedToDomain(const QString&)), SLOT(updateWindowTitle())); - // connect(&domainHandler, SIGNAL(disconnectedFromDomain()), SLOT(updateWindowTitle())); // connect(&domainHandler, SIGNAL(disconnectedFromDomain()), SLOT(clearDomainOctreeDetails())); connect(&domainHandler, &DomainHandler::domainConnectionRefused, this, &ACClientApp::domainConnectionRefused); @@ -123,7 +121,7 @@ ACClientApp::ACClientApp(int argc, char* argv[]) : connect(nodeList.data(), &NodeList::nodeActivated, this, &ACClientApp::nodeActivated); // connect(nodeList.data(), &NodeList::uuidChanged, getMyAvatar(), &MyAvatar::setSessionUUID); // connect(nodeList.data(), &NodeList::uuidChanged, this, &ACClientApp::setSessionUUID); - // connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &ACClientApp::notifyPacketVersionMismatch); + connect(nodeList.data(), &NodeList::packetVersionMismatch, this, &ACClientApp::notifyPacketVersionMismatch); nodeList->addSetOfNodeTypesToNodeInterestSet(NodeSet() << NodeType::AudioMixer << NodeType::AvatarMixer << NodeType::EntityServer << NodeType::AssetServer << NodeType::MessagesMixer); @@ -208,6 +206,13 @@ void ACClientApp::timedOut() { finish(1); } +void ACClientApp::notifyPacketVersionMismatch() { + if (_verbose) { + qDebug() << "packet version mismatch"; + } + finish(1); +} + void ACClientApp::finish(int exitCode) { auto nodeList = DependencyManager::get(); diff --git a/tools/ac-client/src/ACClientApp.h b/tools/ac-client/src/ACClientApp.h index 36de592401..f6c726dfbc 100644 --- a/tools/ac-client/src/ACClientApp.h +++ b/tools/ac-client/src/ACClientApp.h @@ -27,23 +27,19 @@ public: ACClientApp(int argc, char* argv[]); ~ACClientApp(); - const int stunFailureExitStatus { 1 }; - const int iceFailureExitStatus { 2 }; - const int domainPingExitStatus { 3 }; - private slots: void domainConnectionRefused(const QString& reasonMessage, int reasonCodeInt, const QString& extraInfo); void domainChanged(const QString& domainHostname); void nodeAdded(SharedNodePointer node); void nodeActivated(SharedNodePointer node); void nodeKilled(SharedNodePointer node); + void notifyPacketVersionMismatch(); private: NodeList* _nodeList; void timedOut(); void finish(int exitCode); bool _verbose; - QTimer* _pingDomainTimer { nullptr }; bool _sawEntityServer { false }; bool _sawAudioMixer { false }; From caf7d878416cce64f89dc3eae99fcdaddded74cd Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 5 Oct 2016 14:01:20 -0700 Subject: [PATCH 161/300] Restore GL context information to the QML context --- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 18 ++---------------- libraries/gl/src/gl/OffscreenQmlSurface.h | 4 +++- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index bcfaaffd08..29296425e7 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -116,21 +116,6 @@ QNetworkAccessManager* QmlNetworkAccessManagerFactory::create(QObject* parent) { Q_DECLARE_LOGGING_CATEGORY(offscreenFocus) Q_LOGGING_CATEGORY(offscreenFocus, "hifi.offscreen.focus") -#if 0 -QJsonObject getGLContextData(); -QJsonObject _glData; - -QJsonObject OffscreenQmlSurface::getGLContextData() { - _glMutex.lock(); - if (_glData.isEmpty()) { - _glWait.wait(&_glMutex); - } - _glMutex.unlock(); - return _glData; -} -#endif - - void OffscreenQmlSurface::setupFbo() { _canvas->makeCurrent(); _textures.setSize(_size); @@ -324,7 +309,7 @@ void OffscreenQmlSurface::create(QOpenGLContext* shareContext) { } // FIXME -// _qmlEngine->rootContext()->setContextProperty("GL", _renderer->getGLContextData()); + _qmlEngine->rootContext()->setContextProperty("GL", _glData); _qmlEngine->rootContext()->setContextProperty("offscreenWindow", QVariant::fromValue(getWindow())); _qmlComponent = new QQmlComponent(_qmlEngine); @@ -336,6 +321,7 @@ void OffscreenQmlSurface::create(QOpenGLContext* shareContext) { qWarning("Failed to make context current for QML Renderer"); return; } + _glData = ::getGLContextData(); _renderControl->initialize(_canvas->getContext()); setupFbo(); diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index 7232e410ea..74e5f60b36 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -98,8 +98,8 @@ private: void setupFbo(); bool allowNewFrame(uint8_t fps); void render(); - void resize(); void cleanup(); + QJsonObject getGLContextData(); private slots: void updateQuick(); @@ -112,6 +112,8 @@ private: QQmlComponent* _qmlComponent { nullptr }; QQuickItem* _rootItem { nullptr }; OffscreenGLCanvas* _canvas { nullptr }; + QJsonObject _glData; + QTimer _updateTimer; uint32_t _fbo { 0 }; uint32_t _depthStencil { 0 }; From 6afe5360fe3d7f417769ff4d1368817493388b1c Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 5 Oct 2016 14:36:26 -0700 Subject: [PATCH 162/300] Fixing header --- libraries/gl/src/gl/OffscreenQmlSurface.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.h b/libraries/gl/src/gl/OffscreenQmlSurface.h index 74e5f60b36..30b9b2a58a 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.h +++ b/libraries/gl/src/gl/OffscreenQmlSurface.h @@ -9,11 +9,14 @@ #ifndef hifi_OffscreenQmlSurface_h #define hifi_OffscreenQmlSurface_h -#include -#include #include #include +#include +#include +#include + + #include #include #include "TextureRecycler.h" From 86a31903851c2ee9b82933aa6ba12d7ca124e54c Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 5 Oct 2016 14:45:32 -0700 Subject: [PATCH 163/300] on failure, print names of servers that didn't connect --- tools/ac-client/src/ACClientApp.cpp | 19 +++++++++++++++++++ tools/ac-client/src/ACClientApp.h | 1 + 2 files changed, 20 insertions(+) diff --git a/tools/ac-client/src/ACClientApp.cpp b/tools/ac-client/src/ACClientApp.cpp index f174f50ab6..df0f0c56ca 100644 --- a/tools/ac-client/src/ACClientApp.cpp +++ b/tools/ac-client/src/ACClientApp.cpp @@ -213,6 +213,24 @@ void ACClientApp::notifyPacketVersionMismatch() { finish(1); } +void ACClientApp::printFailedServers() { + if (!_sawEntityServer) { + qDebug() << "EntityServer"; + } + if (!_sawAudioMixer) { + qDebug() << "AudioMixer"; + } + if (!_sawAvatarMixer) { + qDebug() << "AvatarMixer"; + } + if (!_sawAssetServer) { + qDebug() << "AssetServer"; + } + if (!_sawMessagesMixer) { + qDebug() << "MessagesMixer"; + } +} + void ACClientApp::finish(int exitCode) { auto nodeList = DependencyManager::get(); @@ -230,5 +248,6 @@ void ACClientApp::finish(int exitCode) { nodeThread->quit(); nodeThread->wait(); + printFailedServers(); QCoreApplication::exit(exitCode); } diff --git a/tools/ac-client/src/ACClientApp.h b/tools/ac-client/src/ACClientApp.h index f6c726dfbc..29d571688e 100644 --- a/tools/ac-client/src/ACClientApp.h +++ b/tools/ac-client/src/ACClientApp.h @@ -38,6 +38,7 @@ private slots: private: NodeList* _nodeList; void timedOut(); + void printFailedServers(); void finish(int exitCode); bool _verbose; From e46c15401aec77c88d746923787bd709394ef85e Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Wed, 5 Oct 2016 15:00:22 -0700 Subject: [PATCH 164/300] take care for division by zero when normalizing --- libraries/physics/src/CollisionRenderMeshCache.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/physics/src/CollisionRenderMeshCache.cpp b/libraries/physics/src/CollisionRenderMeshCache.cpp index 517e25e1c4..3a1c4d0ea4 100644 --- a/libraries/physics/src/CollisionRenderMeshCache.cpp +++ b/libraries/physics/src/CollisionRenderMeshCache.cpp @@ -90,7 +90,11 @@ bool copyShapeToMesh(const btTransform& transform, const btConvexShape* shape, avgVertex = transform * (avgVertex * (1.0f / (float)numHullVertices)); for (int i = 0; i < numHullVertices; ++i) { - btVector3 norm = (transform * hullVertices[i] - avgVertex).normalize(); + btVector3 norm = transform * hullVertices[i] - avgVertex; + btScalar normLength = norm.length(); + if (normLength > FLT_EPSILON) { + norm /= normLength; + } memcpy(tempVertices + 3 * i, norm.m_floats, SIZE_OF_VEC3); } gpu::BufferView::Size numBytes = sizeof(float) * (3 * numHullVertices); From 785d67b87a6377813d64b43c1946facac092c795 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 5 Oct 2016 15:25:45 -0700 Subject: [PATCH 165/300] remove redundant addHelpOption --- tools/ac-client/src/ACClientApp.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/ac-client/src/ACClientApp.cpp b/tools/ac-client/src/ACClientApp.cpp index df0f0c56ca..dad0a6d617 100644 --- a/tools/ac-client/src/ACClientApp.cpp +++ b/tools/ac-client/src/ACClientApp.cpp @@ -27,7 +27,6 @@ ACClientApp::ACClientApp(int argc, char* argv[]) : // parse command-line QCommandLineParser parser; parser.setApplicationDescription("High Fidelity AC client"); - parser.addHelpOption(); const QCommandLineOption helpOption = parser.addHelpOption(); From df092544371e4bb9e399e01d46fa44ca9766ca89 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 15:45:54 -0700 Subject: [PATCH 166/300] Fix EntityItemID not being converted to string in ScriptEngine --- libraries/script-engine/src/ScriptEngine.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 93d9ed2190..bcf6394362 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1307,7 +1307,7 @@ void ScriptEngine::loadEntityScript(QWeakPointer theEngine, const // so that they show up in stacktraces // // Extract the url portion of a url that has been encoded with encodeEntityIdIntoEntityUrl(...) -QString extractUrlFromEntityUrl(QString url) { +QString extractUrlFromEntityUrl(const QString& url) { auto parts = url.split(' ', QString::SkipEmptyParts); if (parts.length() > 0) { return parts[0]; @@ -1318,7 +1318,7 @@ QString extractUrlFromEntityUrl(QString url) { // Encode an entity id into an entity url // Example: http://www.example.com/some/path.js [EntityID:{9fdd355f-d226-4887-9484-44432d29520e}] -QString encodeEntityIdIntoEntityUrl(QString url, QString entityID) { +QString encodeEntityIdIntoEntityUrl(const QString& url, const QString& entityID) { return url + " [EntityID:" + entityID + "]"; } @@ -1348,7 +1348,7 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co auto scriptCache = DependencyManager::get(); bool isFileUrl = isURL && scriptOrURL.startsWith("file://"); - auto fileName = isURL ? encodeEntityIdIntoEntityUrl(scriptOrURL, entityID) : "EmbeddedEntityScript"; + auto fileName = isURL ? encodeEntityIdIntoEntityUrl(scriptOrURL, entityID.toString()) : "EmbeddedEntityScript"; QScriptProgram program(contents, fileName); if (!hasCorrectSyntax(program)) { From 0e3e2b8a9a13293d98d2dd4926bce580d93a303a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 15:50:49 -0700 Subject: [PATCH 167/300] Update date in help.html --- interface/resources/html/help.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/html/help.html b/interface/resources/html/help.html index 4956dc20ea..a9f2c18617 100644 --- a/interface/resources/html/help.html +++ b/interface/resources/html/help.html @@ -1,4 +1,4 @@ - + From 0510411ac139fb963d6ad25900b11c88296c2b24 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 5 Oct 2016 16:19:39 -0700 Subject: [PATCH 168/300] fix timer use --- tools/ice-client/src/ICEClientApp.cpp | 42 +++++++++++++-------------- tools/ice-client/src/ICEClientApp.h | 6 ++-- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/tools/ice-client/src/ICEClientApp.cpp b/tools/ice-client/src/ICEClientApp.cpp index 992014ad7d..e0a08b7fcb 100644 --- a/tools/ice-client/src/ICEClientApp.cpp +++ b/tools/ice-client/src/ICEClientApp.cpp @@ -178,16 +178,9 @@ void ICEClientApp::doSomething() { qDebug() << "sending STUN request"; } _socket->writeDatagram(stunRequestPacket, sizeof(stunRequestPacket), _stunSockAddr); - _stunResponseTimerCanceled = false; - _stunResponseTimer.singleShot(stunResponseTimeoutMilliSeconds, this, [&] { - if (_stunResponseTimerCanceled) { - return; - } - if (_verbose) { - qDebug() << "timeout waiting for stun-server response"; - } - QCoreApplication::exit(stunFailureExitStatus); - }); + _stunResponseTimer.setSingleShot(true); + connect(&_iceResponseTimer, SIGNAL(timeout()), this, SLOT(stunResponseTimeout())); + _stunResponseTimer.start(stunResponseTimeoutMilliSeconds); setState(waitForStunResponse); } else { @@ -215,16 +208,9 @@ void ICEClientApp::doSomething() { } sendPacketToIceServer(PacketType::ICEServerQuery, _iceServerAddr, _sessionUUID, peerID); - _iceResponseTimerCanceled = false; - _iceResponseTimer.singleShot(iceResponseTimeoutMilliSeconds, this, [=] { - if (_iceResponseTimerCanceled) { - return; - } - if (_verbose) { - qDebug() << "timeout waiting for ice-server response"; - } - QCoreApplication::exit(iceFailureExitStatus); - }); + _iceResponseTimer.setSingleShot(true); + connect(&_iceResponseTimer, SIGNAL(timeout()), this, SLOT(iceResponseTimeout())); + _iceResponseTimer.start(iceResponseTimeoutMilliSeconds); } else if (_state == pause0) { setState(pause1); } else if (_state == pause1) { @@ -237,6 +223,20 @@ void ICEClientApp::doSomething() { } } +void ICEClientApp::iceResponseTimeout() { + if (_verbose) { + qDebug() << "timeout waiting for ice-server response"; + } + QCoreApplication::exit(iceFailureExitStatus); +} + +void ICEClientApp::stunResponseTimeout() { + if (_verbose) { + qDebug() << "timeout waiting for stun-server response"; + } + QCoreApplication::exit(stunFailureExitStatus); +} + void ICEClientApp::sendPacketToIceServer(PacketType packetType, const HifiSockAddr& iceServerSockAddr, const QUuid& clientID, const QUuid& peerID) { std::unique_ptr icePacket = NLPacket::create(packetType); @@ -298,7 +298,6 @@ void ICEClientApp::processSTUNResponse(std::unique_ptr packet) } _stunResponseTimer.stop(); - _stunResponseTimerCanceled = true; uint16_t newPublicPort; QHostAddress newPublicAddress; @@ -331,7 +330,6 @@ void ICEClientApp::processPacket(std::unique_ptr packet) { if (nlPacket->getType() == PacketType::ICEServerPeerInformation) { // cancel the timeout timer _iceResponseTimer.stop(); - _iceResponseTimerCanceled = true; QDataStream iceResponseStream(message->getMessage()); if (!_domainServerPeerSet) { diff --git a/tools/ice-client/src/ICEClientApp.h b/tools/ice-client/src/ICEClientApp.h index 3635bc07f4..de6b6abb14 100644 --- a/tools/ice-client/src/ICEClientApp.h +++ b/tools/ice-client/src/ICEClientApp.h @@ -33,6 +33,10 @@ public: const int stunResponseTimeoutMilliSeconds { 2000 }; const int iceResponseTimeoutMilliSeconds { 2000 }; +public slots: + void iceResponseTimeout(); + void stunResponseTimeout(); + private: enum State { lookUpStunServer, // 0 @@ -83,9 +87,7 @@ private: int _state { 0 }; QTimer _stunResponseTimer; - bool _stunResponseTimerCanceled { false }; QTimer _iceResponseTimer; - bool _iceResponseTimerCanceled { false }; int _domainPingCount { 0 }; }; From f338e38bcf7eaeeae290ae721aa5d49275163c42 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Wed, 5 Oct 2016 16:25:00 -0700 Subject: [PATCH 169/300] oops --- tools/ice-client/src/ICEClientApp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/ice-client/src/ICEClientApp.cpp b/tools/ice-client/src/ICEClientApp.cpp index e0a08b7fcb..f9e7a76142 100644 --- a/tools/ice-client/src/ICEClientApp.cpp +++ b/tools/ice-client/src/ICEClientApp.cpp @@ -179,7 +179,7 @@ void ICEClientApp::doSomething() { } _socket->writeDatagram(stunRequestPacket, sizeof(stunRequestPacket), _stunSockAddr); _stunResponseTimer.setSingleShot(true); - connect(&_iceResponseTimer, SIGNAL(timeout()), this, SLOT(stunResponseTimeout())); + connect(&_stunResponseTimer, SIGNAL(timeout()), this, SLOT(stunResponseTimeout())); _stunResponseTimer.start(stunResponseTimeoutMilliSeconds); setState(waitForStunResponse); From 48092978e98d230ccc0bf7a48f5352bca9e29bf0 Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 5 Oct 2016 16:40:51 -0700 Subject: [PATCH 170/300] Fix page size usage in gpu buffers --- libraries/gpu/src/gpu/Buffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/gpu/src/gpu/Buffer.cpp b/libraries/gpu/src/gpu/Buffer.cpp index f4cd9e41ba..ff425d1f6b 100644 --- a/libraries/gpu/src/gpu/Buffer.cpp +++ b/libraries/gpu/src/gpu/Buffer.cpp @@ -42,7 +42,7 @@ Buffer::Size Buffer::getBufferGPUMemoryUsage() { } Buffer::Buffer(Size pageSize) : - _pages(pageSize) { + _renderPages(pageSize), _pages(pageSize) { _bufferCPUCount++; } From 42b0d8230c60219e5757754df5c9a20dd0ea72b6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 19:14:42 -0700 Subject: [PATCH 171/300] Move extract/encode enitty functions in ScriptEngine --- libraries/script-engine/src/ScriptEngine.cpp | 38 ++++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index bcf6394362..18d7b0ebf1 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -107,6 +107,25 @@ void inputControllerFromScriptValue(const QScriptValue &object, controller::Inpu out = qobject_cast(object.toQObject()); } +// The purpose of the following two function is to embed entity ids into entity script filenames +// so that they show up in stacktraces +// +// Extract the url portion of a url that has been encoded with encodeEntityIdIntoEntityUrl(...) +QString extractUrlFromEntityUrl(const QString& url) { + auto parts = url.split(' ', QString::SkipEmptyParts); + if (parts.length() > 0) { + return parts[0]; + } else { + return ""; + } +} + +// Encode an entity id into an entity url +// Example: http://www.example.com/some/path.js [EntityID:{9fdd355f-d226-4887-9484-44432d29520e}] +QString encodeEntityIdIntoEntityUrl(const QString& url, const QString& entityID) { + return url + " [EntityID:" + entityID + "]"; +} + static bool hasCorrectSyntax(const QScriptProgram& program) { const auto syntaxCheck = QScriptEngine::checkSyntax(program.sourceCode()); if (syntaxCheck.state() != QScriptSyntaxCheckResult::Valid) { @@ -1303,25 +1322,6 @@ void ScriptEngine::loadEntityScript(QWeakPointer theEngine, const }, forceRedownload); } -// The purpose of the following two function is to embed entity ids into entity script filenames -// so that they show up in stacktraces -// -// Extract the url portion of a url that has been encoded with encodeEntityIdIntoEntityUrl(...) -QString extractUrlFromEntityUrl(const QString& url) { - auto parts = url.split(' ', QString::SkipEmptyParts); - if (parts.length() > 0) { - return parts[0]; - } else { - return ""; - } -} - -// Encode an entity id into an entity url -// Example: http://www.example.com/some/path.js [EntityID:{9fdd355f-d226-4887-9484-44432d29520e}] -QString encodeEntityIdIntoEntityUrl(const QString& url, const QString& entityID) { - return url + " [EntityID:" + entityID + "]"; -} - // since all of these operations can be asynch we will always do the actual work in the response handler // for the download void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, const QString& scriptOrURL, const QString& contents, bool isURL, bool success) { From b70eac353b9cfcec402b7a081b31be4619fb114b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 6 Oct 2016 15:18:07 +1300 Subject: [PATCH 172/300] Enable address entry by typing without clicking in address bar --- interface/resources/qml/AddressBarDialog.qml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 1164a0f01e..437632eb98 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -185,7 +185,7 @@ Window { color: "gray"; clip: true; anchors.fill: addressLine; - visible: !addressLine.activeFocus; + visible: addressLine.text.length === 0 } TextInput { id: addressLine @@ -201,8 +201,10 @@ Window { bottomMargin: parent.inputAreaStep } font.pixelSize: hifi.fonts.pixelSize * root.scale * 0.75 - onTextChanged: filterChoicesByText() - onActiveFocusChanged: updateLocationText(focus) + onTextChanged: { + filterChoicesByText(); + updateLocationText(text.length > 0); + } } } @@ -360,9 +362,8 @@ Window { }); } - function updateLocationText(focus) { - addressLine.text = ""; - if (focus) { + function updateLocationText(visible) { + if (visible) { notice.text = "Go to a place, @user, path or network address"; notice.color = "gray"; } else { @@ -374,9 +375,9 @@ Window { } onVisibleChanged: { - focus = false; updateLocationText(false); if (visible) { + addressLine.forceActiveFocus(); fillDestinations(); } } From 7d23cd7c7c6840ba7a0270d576e4cedd0ba06725 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 6 Oct 2016 15:19:58 +1300 Subject: [PATCH 173/300] Don't show cursor until after have started entering an address --- interface/resources/qml/AddressBarDialog.qml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 437632eb98..b40ee79e84 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -64,6 +64,7 @@ Window { property int cardWidth: 200; property int cardHeight: 152; property string metaverseBase: addressBarDialog.metaverseServerUrl + "/api/v1/"; + property bool isCursorVisible: false // Override default cursor visibility. AddressBarDialog { id: addressBarDialog @@ -201,9 +202,17 @@ Window { bottomMargin: parent.inputAreaStep } font.pixelSize: hifi.fonts.pixelSize * root.scale * 0.75 + cursorVisible: false onTextChanged: { filterChoicesByText(); updateLocationText(text.length > 0); + if (!isCursorVisible && text.length > 0) { + isCursorVisible = true; + cursorVisible = true; + } + } + onActiveFocusChanged: { + cursorVisible = isCursorVisible; } } } @@ -386,6 +395,7 @@ Window { if (addressLine.text !== "") { addressBarDialog.loadAddress(addressLine.text, fromSuggestions) } + isCursorVisible = false; root.shown = false; } From 742e603fd67bffbec7c8fba54aef6d1bc7a48510 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 6 Oct 2016 15:21:08 +1300 Subject: [PATCH 174/300] Show cursor if user clicks in address bar --- interface/resources/qml/AddressBarDialog.qml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index b40ee79e84..1cfae2f207 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -214,6 +214,14 @@ Window { onActiveFocusChanged: { cursorVisible = isCursorVisible; } + MouseArea { + // If user clicks in address bar show cursor to indicate ability to enter address. + anchors.fill: parent + onClicked: { + isCursorVisible = true; + parent.cursorVisible = true; + } + } } } From bba5a7563f511c46104859f23ed124dc7b975b27 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 19:25:03 -0700 Subject: [PATCH 175/300] Remove extraneous logging --- libraries/networking/src/AssetClient.cpp | 10 ++++------ libraries/networking/src/AssetResourceRequest.cpp | 2 -- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/libraries/networking/src/AssetClient.cpp b/libraries/networking/src/AssetClient.cpp index 624d98df7a..f5e2caa60d 100644 --- a/libraries/networking/src/AssetClient.cpp +++ b/libraries/networking/src/AssetClient.cpp @@ -394,14 +394,14 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message auto senderNode = node.toStrongRef(); if (!senderNode) { - qCDebug(asset_client) << "Got completed asset for node that no longer exists"; + qCWarning(asset_client) << "Got completed asset for node that no longer exists"; return; } // Check if we have any pending requests for this node auto messageMapIt = _pendingRequests.find(senderNode); if (messageMapIt == _pendingRequests.end()) { - qCDebug(asset_client) << "Got completed asset for a node that doesn't have any pending requests"; + qCWarning(asset_client) << "Got completed asset for a node that doesn't have any pending requests"; return; } @@ -411,7 +411,7 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message // Check if we have this pending request auto requestIt = messageCallbackMap.find(messageID); if (requestIt == messageCallbackMap.end()) { - qCDebug(asset_client) << "Got completed asset for a request that doesn't exist"; + qCWarning(asset_client) << "Got completed asset for a request that doesn't exist"; return; } @@ -419,16 +419,14 @@ void AssetClient::handleCompleteCallback(const QWeakPointer& node, Message auto& message = callbacks.message; if (!message) { - qCDebug(asset_client) << "Got completed asset for a message that doesn't exist"; + qCWarning(asset_client) << "Got completed asset for a message that doesn't exist"; return; } if (message->failed()) { - qCDebug(asset_client) << "Got failed asset"; callbacks.completeCallback(false, AssetServerError::NoError, QByteArray()); } else { - qCDebug(asset_client) << "Got asset"; callbacks.completeCallback(true, AssetServerError::NoError, message->readAll()); } diff --git a/libraries/networking/src/AssetResourceRequest.cpp b/libraries/networking/src/AssetResourceRequest.cpp index 8faf7082cd..fa946d3f4f 100644 --- a/libraries/networking/src/AssetResourceRequest.cpp +++ b/libraries/networking/src/AssetResourceRequest.cpp @@ -136,8 +136,6 @@ void AssetResourceRequest::requestHash(const AssetHash& hash) { Q_ASSERT(req->getState() == AssetRequest::Finished); cleanupTimer(); - - qDebug() << "Asset request finished, " << req->getHash() << "error: " << req->getError(); switch (req->getError()) { case AssetRequest::Error::NoError: From 17a1f9b5ae35536a45ce7ace8ce9e83f1cdc1fbb Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 19:25:17 -0700 Subject: [PATCH 176/300] Make timer child of QObject instead of attaching to destroyed --- libraries/networking/src/AssetResourceRequest.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/networking/src/AssetResourceRequest.cpp b/libraries/networking/src/AssetResourceRequest.cpp index fa946d3f4f..f320f00dbb 100644 --- a/libraries/networking/src/AssetResourceRequest.cpp +++ b/libraries/networking/src/AssetResourceRequest.cpp @@ -41,8 +41,7 @@ void AssetResourceRequest::setupTimer() { Q_ASSERT(!_sendTimer); static const int TIMEOUT_MS = 2000; - _sendTimer = new QTimer(); - connect(this, &QObject::destroyed, _sendTimer, &QTimer::deleteLater); + _sendTimer = new QTimer(this); connect(_sendTimer, &QTimer::timeout, this, &AssetResourceRequest::onTimeout); _sendTimer->setSingleShot(true); From 4901f386ca8a68e81a4f3b28def9667adc0e8d01 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 19:25:41 -0700 Subject: [PATCH 177/300] Remove unused property in ScriptCache --- libraries/script-engine/src/ScriptCache.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/script-engine/src/ScriptCache.h b/libraries/script-engine/src/ScriptCache.h index 42feaac2ad..17ba5c4b0a 100644 --- a/libraries/script-engine/src/ScriptCache.h +++ b/libraries/script-engine/src/ScriptCache.h @@ -58,11 +58,10 @@ private: Mutex _containerLock; QMap _activeScriptRequests; - //QMultiMap _contentCallbacks; QHash _scriptCache; QMultiMap _scriptUsers; QSet _badScripts; }; -#endif // hifi_ScriptCache_h \ No newline at end of file +#endif // hifi_ScriptCache_h From 4171fdd2e1372bb9465d3bae465769bd45b4467e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 19:27:24 -0700 Subject: [PATCH 178/300] Remove extraneous log line from AssetRequest --- libraries/networking/src/AssetRequest.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/networking/src/AssetRequest.cpp b/libraries/networking/src/AssetRequest.cpp index 6f319df034..4449531177 100644 --- a/libraries/networking/src/AssetRequest.cpp +++ b/libraries/networking/src/AssetRequest.cpp @@ -150,8 +150,6 @@ void AssetRequest::start() { if (_error != NoError) { qCWarning(asset_client) << "Got error retrieving asset" << _hash << "- error code" << _error; - } else { - qCDebug(asset_client) << "Received asset successfully: " << _hash; } _state = Finished; From 2807f76e6838233bce7ebf46d384a6a5f7ae80c0 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 6 Oct 2016 15:49:16 +1300 Subject: [PATCH 179/300] Fix semantics of function parameter --- interface/resources/qml/AddressBarDialog.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 1cfae2f207..40438804ed 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -379,8 +379,8 @@ Window { }); } - function updateLocationText(visible) { - if (visible) { + function updateLocationText(enteringAddress) { + if (enteringAddress) { notice.text = "Go to a place, @user, path or network address"; notice.color = "gray"; } else { From a347936b6884e24574465704a9ae1723e4748422 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 6 Oct 2016 16:47:49 +1300 Subject: [PATCH 180/300] Fix location not being updated after using back and forwards buttons --- interface/resources/qml/AddressBarDialog.qml | 23 ++++++++++++++++++++ interface/src/ui/AddressBarDialog.cpp | 1 + interface/src/ui/AddressBarDialog.h | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 40438804ed..75c16da30b 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -70,11 +70,15 @@ Window { id: addressBarDialog implicitWidth: backgroundImage.width implicitHeight: backgroundImage.height + // The buttons have their button state changed on hover, so we have to manually fix them up here onBackEnabledChanged: backArrow.buttonState = addressBarDialog.backEnabled ? 1 : 0; onForwardEnabledChanged: forwardArrow.buttonState = addressBarDialog.forwardEnabled ? 1 : 0; onReceivedHifiSchemeURL: resetAfterTeleport(); + // Update location after using back and forward buttons. + onMetaverseServerUrlChanged: updateLocationTextTimer.start(); + ListModel { id: suggestions } ListView { @@ -225,6 +229,24 @@ Window { } } + Timer { + // Delay updating location text a bit to avoid flicker of content and so that connection status is valid. + id: updateLocationTextTimer + running: false + interval: 500 // ms + repeat: false + onTriggered: updateLocationText(false); + } + + Timer { + // Delay clearing address line so as to avoid flicker of "not connected" being displayed after entering an address. + id: clearAddressLineTimer + running: false + interval: 100 // ms + repeat: false + onTriggered: addressLine.text = "" + } + Window { width: 938; height: 625; @@ -403,6 +425,7 @@ Window { if (addressLine.text !== "") { addressBarDialog.loadAddress(addressLine.text, fromSuggestions) } + clearAddressLineTimer.start(); isCursorVisible = false; root.shown = false; } diff --git a/interface/src/ui/AddressBarDialog.cpp b/interface/src/ui/AddressBarDialog.cpp index 3e84c4c3c5..ac566d68c7 100644 --- a/interface/src/ui/AddressBarDialog.cpp +++ b/interface/src/ui/AddressBarDialog.cpp @@ -38,6 +38,7 @@ AddressBarDialog::AddressBarDialog(QQuickItem* parent) : OffscreenQmlDialog(pare }); _backEnabled = !(DependencyManager::get()->getBackStack().isEmpty()); _forwardEnabled = !(DependencyManager::get()->getForwardStack().isEmpty()); + connect(addressManager.data(), &AddressManager::hostChanged, this, &AddressBarDialog::metaverseServerUrlChanged); connect(DependencyManager::get().data(), &DialogsManager::setUseFeed, this, &AddressBarDialog::setUseFeed); connect(qApp, &Application::receivedHifiSchemeURL, this, &AddressBarDialog::receivedHifiSchemeURL); } diff --git a/interface/src/ui/AddressBarDialog.h b/interface/src/ui/AddressBarDialog.h index 2dad742ebb..921e808abb 100644 --- a/interface/src/ui/AddressBarDialog.h +++ b/interface/src/ui/AddressBarDialog.h @@ -37,7 +37,7 @@ signals: void forwardEnabledChanged(); void useFeedChanged(); void receivedHifiSchemeURL(const QString& url); - void metaverseServerUrlChanged(); // While it is a constant, qml will complain about not seeing a change signal. + void metaverseServerUrlChanged(); protected: void displayAddressOfflineMessage(); From 1ee931723470a6437ab4d7efd0a44605bb7896a7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 6 Oct 2016 17:00:25 +1300 Subject: [PATCH 181/300] Fix clearing address and cursor upon address bar closing --- interface/resources/qml/AddressBarDialog.qml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index 75c16da30b..de4070737e 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -244,7 +244,10 @@ Window { running: false interval: 100 // ms repeat: false - onTriggered: addressLine.text = "" + onTriggered: { + addressLine.text = ""; + isCursorVisible = false; + } } Window { @@ -425,8 +428,6 @@ Window { if (addressLine.text !== "") { addressBarDialog.loadAddress(addressLine.text, fromSuggestions) } - clearAddressLineTimer.start(); - isCursorVisible = false; root.shown = false; } @@ -435,11 +436,13 @@ Window { case Qt.Key_Escape: case Qt.Key_Back: root.shown = false + clearAddressLineTimer.start(); event.accepted = true break case Qt.Key_Enter: case Qt.Key_Return: toggleOrGo() + clearAddressLineTimer.start(); event.accepted = true break } From 246a816b804f557de57d974c9be45931590330c3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 5 Oct 2016 22:54:39 -0700 Subject: [PATCH 182/300] Update help window tabs to activate on mouse down instead of up --- interface/resources/html/help.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/resources/html/help.html b/interface/resources/html/help.html index a9f2c18617..7df428ba0c 100644 --- a/interface/resources/html/help.html +++ b/interface/resources/html/help.html @@ -62,9 +62,9 @@
- - - + + +
From e59069fe35370a326b7a3094a5575ed2e8a81705 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 6 Oct 2016 13:00:07 -0700 Subject: [PATCH 183/300] Update help window images --- interface/resources/html/help.html | 8 ++++---- .../html/img/controls-help-gamepad.jpg | Bin 173140 -> 0 bytes .../html/img/controls-help-gamepad.png | Bin 0 -> 96161 bytes .../html/img/controls-help-keyboard.jpg | Bin 139444 -> 0 bytes .../html/img/controls-help-keyboard.png | Bin 0 -> 69134 bytes .../resources/html/img/controls-help-vive.jpg | Bin 187239 -> 0 bytes .../resources/html/img/controls-help-vive.png | Bin 0 -> 102267 bytes 7 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 interface/resources/html/img/controls-help-gamepad.jpg create mode 100644 interface/resources/html/img/controls-help-gamepad.png delete mode 100644 interface/resources/html/img/controls-help-keyboard.jpg create mode 100644 interface/resources/html/img/controls-help-keyboard.png delete mode 100644 interface/resources/html/img/controls-help-vive.jpg create mode 100644 interface/resources/html/img/controls-help-vive.png diff --git a/interface/resources/html/help.html b/interface/resources/html/help.html index 7df428ba0c..055b0000f4 100644 --- a/interface/resources/html/help.html +++ b/interface/resources/html/help.html @@ -48,20 +48,20 @@
- + diff --git a/interface/resources/html/img/controls-help-gamepad.jpg b/interface/resources/html/img/controls-help-gamepad.jpg deleted file mode 100644 index 339e155f82dd924f62b8928a3b316c8aee460c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173140 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%0AgxRH&;gD*{6X3Gf)CEjHw#l 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 diff --git a/interface/resources/html/img/controls-help-gamepad.png b/interface/resources/html/img/controls-help-gamepad.png new file mode 100644 index 0000000000000000000000000000000000000000..b9c91c07e49a1b8e206863a2554b833ccb0edd6e GIT binary patch literal 96161 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

&wHv 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 literal 0 HcmV?d00001 diff --git a/interface/resources/html/img/controls-help-keyboard.jpg b/interface/resources/html/img/controls-help-keyboard.jpg deleted file mode 100644 index 7de9ae6d593517b18f0029f4d22bbce65bdbe2c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139444 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 r^NphfKGpvng+hte#N^{ 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%0DBot2t9y=> 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 literal 0 HcmV?d00001 diff --git a/interface/resources/html/img/controls-help-vive.jpg b/interface/resources/html/img/controls-help-vive.jpg deleted file mode 100644 index 6f308aebf30beedfc759fd3fe6de86285d3a6830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 187239 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

_}y8l+(;89E14Vn}J}uAyTX85npkeBSqu_^$8# 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 literal 0 HcmV?d00001 From 508950841bb46faf459b34fad8624c939fc79702 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 6 Oct 2016 13:22:59 -0700 Subject: [PATCH 184/300] Adjust the img size in help.html --- interface/resources/html/help.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/resources/html/help.html b/interface/resources/html/help.html index 055b0000f4..6cc4dab6af 100644 --- a/interface/resources/html/help.html +++ b/interface/resources/html/help.html @@ -61,7 +61,7 @@

- + From a74b8f3f24786a90354169b7ac3f5a5e80746242 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 6 Oct 2016 13:37:56 -0700 Subject: [PATCH 185/300] Update help window images --- .../html/img/controls-help-gamepad.png | Bin 96161 -> 96245 bytes .../html/img/controls-help-keyboard.png | Bin 69134 -> 69149 bytes .../resources/html/img/controls-help-vive.png | Bin 102267 -> 102581 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/interface/resources/html/img/controls-help-gamepad.png b/interface/resources/html/img/controls-help-gamepad.png index b9c91c07e49a1b8e206863a2554b833ccb0edd6e..8ffdfe9ad5dfa9207e443e7eb2238556c0f3fd75 100644 GIT binary patch delta 93037 zcmXtfby!sI^EQZzN(m^4luAiUHyDI~ED}pDA*pmX92693C8Z@7c3HYx5b0*=W$9Qt zmRMl-z4&~8@A>b!&U4LN_dPSuGiPQ__TDY*-mNmz8)V9_UP-J41HH4;?=tjUF1?ZauHdH@a2)-sG32_WKwksEZ zul7}D14JN(@p|w5;8-eZYU*Y`Y(!*ad@IlD?FaiDDF$FLa(rCZ*ckpy=z3Q$(OjjX zl2T_^SJ%IP$|@>h4Bl^koNrNxiHYfwkzDT}u2cCjoR*sUn3k6I*)Gg$5cUVCw7Z31 zDJ&Sto)l!LtEi}`uTL2xyWV`KtxH)^QPIfAC?Fu9?Vf3JA4ic-TQD)3a?~S97jq{k zCqKW2ex`>HIgTX6#np;Yjo!|#t_N!aX{~tNR$Ls--5%Ib8C8mah`zqQ4kP)s%$o~N zt1gl>w6yVYaRG-gc4JkbbGa*4;iz9^NOCzU`%Rd#vhufjP*3gGuU~ofiVbQUroT}z zdYF_;-PYID?RH>xd{1#L=n0XxG6VwA(@O%R2m1Oh7O4QA5heN_a+SL9rKKf(Q(x=d zx%%qr>NN`0V@D?^d6$KkIy$tr|DVpBm6esMDp6(?0EtddPfv4d_=G#&%--^6OwFL+ z=NG80wUdx;XJKUcKsHTWS6sXu&XxH~!a4J=i95MhJ>=qa&-vrWh0y<4z2Pz$?~<01 z!tn56KJ@MJz~CSrAnXxLg3ec|sj1geR`YX4BNCMw#dmmTAx7oR#jvK5?2^vaV*_@) zAFxN}P}`}fT=1{!L^VP|OwL!)Yvxn4j*1ObNoreu7ExH}gDHZV`mR3AdIZtY(J?h0 zM8#cG5KJ_e$bNdVi<(_@+2D?oEp0mNz1V9-bK&%m5=~8Y`>g8v&N42;HnqkMdXdNp z+@#OKh^C`(Cyc9sFDcJdC^>2a7z56---yHo+$;0moA=*q_U?(}SRHRGEuYo6YzsaZ2l z>$34QW=9)Y<~*bI@BG`PD8uB{(}3kKf&EKLwShKSRnGE-i_W!f=E8IYL_b`cIUr3P-RQ`M=er;x9Xo4O^z=hd+ z?N(14!2>uZdRw!l3~ea}Wo%tqe+E_x(=0KabbO0S>W7$4)>UsW*v_5`%ry9eRa5dl zFn?S9pjNtp)?jf5&i7^A^%vvf;&@A&+)j5l`b z&U1Q(aEr3yUh8U5caP7BjO_~N@u>UmRJkSYcoQI{WE$3CzuHALCeN}FUn3^26M4qQ zHgFY$(A&!Jp7-5C)M9FezZ!e>U(Pb7si`5v8=Lru&-$~k1hXVDGL~Uoor<1LxlXaR zpAK5q$!Y_ts`Hc%i$^pixjAtJ&J3@C??GP1Ths!)yz%XPCJnlRQ^UhgXg8^@5duUv z7byFBdcq?jMo*<1wn`d1@UdH1y2^t9Pm9Mn|8;W`MZXpIyVaA3VG0BI)Mt-u!9oWBgMxS|F;y z%-+ccBh%W#FT-*0k-lhT6ZhwWS7FA~PAv6J>|VSuVN}EuFz;y_E6|AFfM<$JNL+iD zJN31^7@mu}WmMte;Ugo6=oFOGX>P2%AEpQjgAxq(r%41`9X)!hPa>j&mh}mH3H?=0 z&*M658m(NiP)G_h*1{w!prx^a2gbRzgH9 z8T|eGot}8T<(5X4*!2kBlDgF-<8gKM35Pmtte}rsg^}iFhWs8ONK}%G_b&{Snt{~d zAE9hS&fI#qEDpySllbi+93k$%d+jRec1xYy>bX`6iomgq62NYT_k2-N(Fj9bNlDDu z|3GCfx7_tmR#tX!DE3QFOsux*p$Y$cSeIRNzCFt_Wvs=qDIvzaIHrJiwtEdJORSU2 zL<^V@#xai30;g@`XY_(hGSB$4)gvaCyns{0YTt>T5kfo}iNjT05Iq7fnxhOB6=I7vM>6O}eG(Qdz!wo|>AE+jeK=-G%oj2sf5sIH3f7PIO9 z#jR7YA+@};)TB}UUxeN?2g1X{zE$=DgM%$N3>>+vuV9M9kKTa)47CLjvW}D~?>1)w zj@;#jvUIUsm;*e&yg_Y%W-=;MLVomMYGn*X=d9uE>e&&ZE zPazWd{SSyO*(*`R5BiRETt!bX<+2moD4|y)?#Uu#@%NXIr3dfF8!xUU-w!7F9vzK+ zwBiZ^4OUN@!V6jtM*v<}bBMZg!RJQTh*lGEy+ zaw8;jUGOmga`OA0l4aZoudXfAvfOs7SD4eH8`LW}(O{ese>~ARd%CqLV$(m2_`TyL z!)1Nv6qs|5^&4C7Pw5zu3_`cuBBOH=B_bkvNkpmt?p+jRwB^63@Yq=W*sS!^Y|NF6 zpLwh68&VG!#Qe$7$%)eq$oy2EG&!8Q(yA!c##Yk4)(A04zL~3bHGgsi^0q%0Y`t`o zOY*d`%7gXp-p(u=$dH+oHOH#%uBACoyaL6)1O#aP9a8drE?uq>GnEog&FT6q{hdgi zkHE~t>IZRCL0E=j1+NMQX8trX)kcRroT{htdWcJBbDWiwzFKt~R@$7mveT~aEI+>v0=cB+x_7{i zcv_w!n1t{ADBXQfYmCt7modUO9hVsA^XKd*vuWuF>C~v{jTW1agUJ_g)A=%Eo7m_w z0w2(3*c{(J_u8v;Lp4x4c^gq>j3{-SmXLya79uV$FNYKekUbL#)*;)hK(E;vM`E)$ z$>j9(Vixr_cyVz;ie~#zIMYpn9kAct-tK#}rh2@CZf(tcuA*v_CS>`IiMPeA@bE?OHkEOmtO{Rldc} zSf%!`_g`F|Egic;(X~=l_b2XsWqgm$b-+nysY0p5;o=;j<`$#uLs|IS13zMd$%h)rHDIS$(v%VJr*>}>VmsV~DAKFKk^?X#J79f5NChBZ~p7Tfo2 zjsGn!E)ES1&147$H;nxpYCSyq>op{Ix?z&^UB-F7>Ar}<1+ZOtI`3cVCmV?KK>0CU zYa_0UXQEUwzJn!yEc#YX{=FgCP-jcy*C+0~%@)#?rm>v@3Bue2Gs2W>E*OPBF38T#HU zfevslOX>Io^zv4wFtUf4+TO8i9k*1iA)^;?@cya7;;U#ApF&Fh=zcL{8E{~w_T4i7 zbf$?+r{LWIL)6UN2jgV4?JM8k>k_qZCg7tNynV0_%>gyDo6Q@;v6PEhG(<#1ZFdF4 z#HwSnz4zw#nvOvBrF~dqVZl22i*`oA=2IqwTYG?Wo!rKuUQ^Unya`J5HIS4!PS%T;sE>qXehbfN7CO>0fFD{69rGK17x$%Xo zp9)gE71l0`c<;Vv0VpXc;cwYX5M7{uciUz#!~RS(a*}!V2uZAK0=I76B92_A4Yp>< zTKO~&ygK?0ktQPbxBqg>yr+CkDzM#l{iK~nnRNk_ehuQ~SFoj*Kw--n{UBEIKJoM-3lb|2ev>ae!FrgmGP0f&(=nBvQ@uO~PkxBJF%2Ww0Lqp%vSI$Z-bF-WV z?oQM8+^`^{j~g@1cQ!u$2cXSWkd5sPl1Lqgs`?ZUWA?+NZZ)@JL$=ABFQ;h%LC=cY zXR+?_EIzJ(l2Db&K^aFITSZhYakzbZRjOujT*|q#^VFtSBNgK<+}B&&vCS8Xf095B z9}jj9L#4>#2`4>Kv8|)D0RAY;wkkX_a_d{iqacbhr+Zr>b>%Rw1oCb4*@T;qbusW2 zQPPn>ihua6q8N7fSXJ?;>BxhtEaRV?LrZ#?{;KrwPOGWkbp8?|#NA^Z4nx97%(lVrYjR+erDH zh5=;dTIU<4&-)}U-+^WKP=9J^B5z#6b?mp>%9N-JCigkjHj?Q>NxeW3;iy_q))=yU76>7Qr2~sv&PxyJs#kCXcS{SzhFu^LnkByN+GIqN?ib2Fm zuvpK&%=ZhwPpFE4M89dBOLhxbyKQOn5racNmz0H{cvdIYpBi-Kwc*XbaIo3lyg#`L zy-v4WzT7l--#{Q7naia(VOXcO=mGu=P@8;@D7WL>^x_J~gk-zhMk7d4fG$Br-v6pFy<2&Uh$wh> zMUsVV$E|)m;|Kfmq{PIc@XemP|Ms<#U^BSE+kpMDeB0;rlr;QEwNBEW^nQD?5~~x+ zcx-%$8LEc&0WJ{H1pC+Bxq2PB-S|wH+w$jL*kH+!<=ttRuZ2^?W&H64 z^dTcbyKEXc{mV!fTxu6AV)5+wF9|8-#@y@x@sut52UZ$uY*`x*d74PsN_sHr)$ERy zjO9Oa!}k-ioxdZp+rcXKX`Yx}4>3<*L)JIcGp=E&3N`mps;R!3Z=^gmOX4S2T1x6E$eJLZA@(Hv1s*y_9Lz?hSCzp}+p({FX?2yKvLByN0$f?xs zJ(XXV@@BaI$@WNWV}+$VJ%<%)eGD?d8|#T{KAra`C4Xct_LKYRE(^OM2)Gf;m*YIj z)}wNx2J?f@SLSk}Qaa7kQC?JHUOtYzIFcT;Q{_wVH~vu*RYq^(^FNAoi6&wtoaPEy z@;LuNIehnsnrfRWDhg_7;XA{>^;n#hclrZ^SGDm+SKxmneZirR#LDaIefQ>@{Wgj+ z>4NzSY)0d3btzMXt$_&G{iIDABNpEk>a36KI_%GCIDG5)&ANx3B0Z>OIN)MqTcRQ2GPM`RNzNl-}+{yMxUe z$K2NmW%@^A18`DOQWEAQiHFD-QKPAk*cy+JaWiJqlwtlBaz0dYFKvLaYRvMP`%;d_ z+xI)QU?6z!vsjxA&%M;JOw0_nkI}D>zqYWAZT4Ou{DZr2@-t>tFhYSlM7lBW(c+x6 zLH+q!+WKI|77)-+!X0LyCy315J#}|D&B^^A1xq&`d*qs%g z_vuN9iiNedHxwkv%%82i)M#dkkwF_>_5evHi?@S|B9WbALD2kA3r`G(^R<9m6NnxdEba?R7n&As`vPJ zURJNrM(Q`~m1(`MMlMZ*4FmfW6h1k)elz_$V`MT{PTrK;5Y%b9w-WMtm3ZcA}C=)zdHM|@ag^SqttcfSHc4VV922%sNC z4ni|`;W%yICWmQZF`*Xyex>!OquoR#ZhV%t5wa-GZrWg-43_wG;=_Y^ob+(dQQ|8j zL0WGcaGJN5m{G`zyD#!oL`#E@n|rz?uyOE2LqkLE#T7@OrP-f-ABya7;rZ+m!+bu0L zG}KAvTLTfyLgWe9%+6*|HqNVGP<1I$sb9y+^)5fI2q+OhPSF_REAO?<(F7w*Uzm%P z_HS3#^}^+8JN5?b*UV}nBJL#~1s0Gp78#%hp{S+v$uHmL?cMRZl|A3SG_Sm=na|c> z>M(pkE>kEKY{%#h1Hvc&OFm@q}N5}~DFXRXRyRdcWXXH*t@<6hRW zbV3QqKUsGsieKrmvP6B2_lsBTA{R*)K){|-8>>dY^~T))?DAk~X~~0Va9{vcTPpUw zO^r-32i}#`D}nl1#MnNM2(5`sEdvx)bjA zTy~R`0WM%tLka!e_e8sMrXSbTOgw9Tkyc|i{zDTwbrTa4 z^PSmM5(V&=qodls_ZMB}fR0sxWqDPZ(`3TQs(1U9P#ZA3>i|k_^gM%4w9+LvW|WuF z?M}6tcLhZX*&Oe%9qHm8mNuWHVu*^4_h$*$jjuM>fgnh-DUGGBZh{&jF08Mw52}&I z8B2;CkbiI3T<|d&X=B{%xxO$re^?3^fBd1gxzeiuk4RprFFMyPehVRO_Ew5}B&b=0zx5xaE-y%OOMbo*_y*i> zp?2QSzAJ_qlON_(e>l#x7wyHtJQT22y);@;GP9x7fg6zZ&g;KB-)Ane5JIZ-r}o!L;F6A2e~=KvF_N z9?xf_O9d-%S?>2qYjFk+oK|VvfFhI9Qp5>=WX5P49imoENbOhA3&(lmrXx>nF3y1# z+^l}5UfO_V_0|4yP;92mI}Jg8ez~jTG0zRpdPsG3b$ZNop5<~p6?@7I{21nCm~wJP z{gm@RQB+dW`1Rry%jwYI_t2K&N&QxEszAUovW0nkkaKwfjvk;N zGQpMRG}EPd|Jooh{J_={7%ZLDTVv%;rql(S^K6qgW`~E{>i@4(aN;Y=64sHe(&4v- zs4W0xq$VYCYN}++)arYTFO@c7+bH-4CzBtrcVQp<0%{;h5_xaXpUguz+O(#nc*gjT zeK|;uV|kkFpQ4Nr752IuX-2?J`t93sI|c^Ias5}wXL6jNwb9JU$+57cqUcQj^{X!6 z{IIx~59_hJBp4*Uo;BY{Zs_O)Uu_yAB^>$Ix=94(_4*>S0n9feBrsxS3!tm zfU+m>#Q0p=q4nxy7EQpPVlQF4$&IZ4Rf&n~ENN(HJZ#N{+*Z0Z<F?DRKbLw^uMfUlWB(`TfiL_-Qi*kNZpKb9 zd(XYXT?Y=)4VPr=g|jmscY*fr8iN1B; zF#Uq%e`K9~S5#L1_xJBFC_5)-%hk!O<-e#Aotj;#Ck$t~rQ-hZFVS=(ba13~c>%}Y z457lk6q2JuK(l91L-k#Fq-)jchwx%#^neVny?BxyAG&-m9>F04$FNHo&uUk7Sup=d zlDsfp9@{8zL2jerUd-8{an3ZqoW?rrGo=0QoXU4L#| zrR?`8mv;=mj!=tN0!#_H{+AJ>qoZ4;t@z3z`6F(YP5Nt%ciK#9E%oe6O`F+^F^rVq zram7=^HkTQj3FhbWD~8IXfSVtm%pted_)ZPH5z7eHGUBX*7PvqBN>Y?eIy3# z&j^u-EK$PUlL9V=-%!b&Oj$-pN3Ssr@&nhj1{2L;9mI{_y^HdNe6(&4y?crV2!F$A z0}GNTC+MAcr|U``#^w(*5|R00*hH*`hCr<`P4NKTVj0(8Wm}GaSWpz}ub;9_-k9#~ zs-_j6*~L>@r%#`JH}jM6$54eGV5+>spLL<;48igO^Y9wf!pHEasHn(D^%vn1E9>jP z@rX+1Ngc{5xsRW_4keWVTHgZ*7u(z0ra=~#mX3?ji2poIQmvS)10>Bvnf0N(>Q4x% zSs)g9-ShZ64k`uK2Qw;d22vG(AYb2lB*y03@l<0A65xM4s%Uw5RH2+CCjY|T z^8mRyIkzbui+XKOsm62mpj!ejzLk_YIysrP23e@ev>68^5=S)YBb_@ zu_nSI>kQYj?guwsv!ys@ey+D_kix~w%ge^b#?Q|$FW;hHYD!~mZ*Nb4&oa5KdW}d<)OQ~-=_WH!hPfZ+b@u;uI*}R$+k}SKL!5xkk4m! zyuzIJnLy%tj+w^f>EP=(FNt=unJ85h6+_uS^mMHG(^oV4SyM;4Zn0snUlY9~k_S|XxPcjs88s}e6gr8AiR8vuDi#M;GRpn?t-DQv_WNl!UGihp&}l6m82 zv3Oc^?telg7p3CjY=3PT_eaQM!KnuEBpg@v|9Rq{4t^x>bG7d?F=v4pq3?1nZk5KDZQ_y-P~P60jUC z!Q#JN9(Zx$`h)m>@JQv~&dxr-|L0FFI{R9u$yGPxBoeHf035Li4YT3(%Z$3Bvwr;e zG39k-WT>OFeBkr!*|X8n(bdvaJW}6mSCGO}$sgA}!oZM%DKE~3!A5sZB)3n-t3>Zk z+2NA-)4U!yum2+Hn)n+|n+4#{kB^UYtMD^3GqX;Oj`+)SCOe{==Ery3@@0IwhyVV~ zvoyG^+S=JU3q;g9$8R~zQ!hNiWT0%%_QzH}&+fz}7<(dP(Ze$JogzdF5k}gG4(|N9}fVhtVk5(1XT`c|% zgXvNafrk%GD%=crPFqf!%`TVd%gf7oj5O245oKjRIw%*WEbbS_8wCV>k-8F>keHmD z^mJ!-P*k*nK+^sAl2LEIQJU4B@XkM8cof86NJ>mv6sNv2I@;{(3oVoixwUY1_O~YS z=AGI@j!IkS@Oy0sckj~O?zjvPm;A7~3y0^tLUC zaCNGqqr*%Ymbc|TBv;$gk{Lo3OcZ5lIlStA%`^w4# z-?>I_FV&uski=sXhD3dx&+G($TA*p%J9$nZ{avztqm}XUkYr_cHh!zLWn0Vk zHDF^i@d+A>3s|jSYf^|d(rjb3NLX*I7s%;Dkj)}&bk`>NETUa35q9l-qZUOeS$n4kjAI<#_?i@Ln$Tvg}`&^nrO zU>fW$Y98Gx?mQnbAU4^brC=t%eTBm|?$pe(1RjrARL(N)K8kybfb~jaPdDX@-@R)L`*B zuvII~C-lF023@fePY)?Em&<~sXl@~)a;AJ1^;Oez^Hl%qnYI{7$CYj^OFt}T^`pPL z$t#+Q^03BPXD6$Bh~(re0L z6HMKWjAn#-e$e#9#l^8pudT25nWdbmywMCwV?U;&qf=YtfDefRZ+kf2(LH$ZHgjF{ zwshFzg?N28HG3SQv~;%Cxzvy8;X@QuGX|0-E+)47d_EH?BO{#SX&!}Y^tQ3GDT0EM zb#Az$Tds@*y<`q`mv%psT&#YEXu?N4czAkSAtulDeL7UqoeuOG3XVgU*`8{Yh~+yx z|gfi%eu_HLVKna+!&Mrz{dV(Mdqu5f*=6pRy_I8$(T1G>=6@sZ?rK@O(+ zS?5+0)WO@qlIyH|E!hfpb&3|G3c|w8nlBIgn0IJoJpqhv~4p#eIY@LFeKIr(dEYJkuJbsAuO>fB_CHU)X_7O3{9O5kwv!+THd9Dpno?* zNU1y>hsD|k>2BvT1(he}Ub~n%qmU&f*vH zF4v(2>nsLe(X4WWM+UkXZK+$cOebk_$<@D4Dl9U3z?g_k>rc_?)zQ-8RHtB&hS-eB z9av=q;#OelO!ay5bstQ8=-ly;w)2r?Ymlp!P3Gz}>nBeZE3-!};Q8NkWPQv#;Za%Ay78avFvODGk zPG_pk_^{k+IEAS0Jq{9jRn-Cxb0_s7Xb)<|8nNs5YEPRp)Gt?3c{?y6v9;j`P#$SoA*1wTl@;n7g_-RTn^xl{R2tMLJLnYYV^f z0D@`fI+fq4MN@jd`cSRbEql~2f(|@IK{Nd@djO%a^P|$?eg{=7iyW?c(lq|XWjmSR zobP(ZVe1@)lz3PKNAjOfd=q>ICk6^`}3Es$`<--zO_hA> z9bT81t!5>tAs`eS93qb<8yiI zBmp5Hr5k1?cNiYO!ns~^IfgK~p>0OLNYLfF6%Szh4Eb;U(DB=dEP@)yeGYtDqpf3M&w( ztEbyk2=3%MpLHZQ=%rgbGmWboAJ(8*XD?UhOt7|& zP}Im0YdT*`bt#kxZPXRs$g`3)OzVHr1DV*1w-ggINbW`M z#C_yf(v~vQ6M#2QxoqYq_bSR6TL2b0+cCZK@?Qfc?>pS*OVJR2s$OIiIIS_AuIQ0s z=m;`R6oUsduU+Ky@}(sqd$qM6Rnue%_vzUTWnRtu@10-LTz_38+SyTp&CVc&=dy_6 z;*H}m7WI;bl`mj$;8{~%8Yjk%wElU*ect5GiUdelk4OEDBw&rV{$|HNfWm%Ya>8x( z6swOodW(x2=c4b0rZ$`u-JX)B>3axuczc-k_yd^Z9`iST<>u(ic*)7V1pFEi-_H(+ zD^FU|)?4?ll@2BX%B#Y)_EfpW;-w8nG^K+{6`!Wxx51H5|E-oPl2yyVE-RqICNX6M zM(QZY{fqJZzE@-5feLX|pjEo9kPP>j?XJg1UM^Yp)t%2*`G+O-sNIS~lCYq%;lx`0 zok=2@cOBVCWG$tKzL`GM`4w8^f~ZgRBW0+Yc2B*>n&EmcX)k2!xouH^{)T3Hx{`3d zCa459BpNiOCPrv~)(3m~JH%06*j7<7l#+c1zmzMlvxXUa%=Ww&czmpQ?$VPS=kz(} z9$O!dpu0}^JX7}}L!b$FBLRugEN@~zFlb30r#C;dJ~__-1rp;DrZ*jg2%L{_W6_i; z;*O~eLe5G`on(Sdzo8Q1;=N%gSsW@mtIEj8BkX%{Z*T87NeZII@vS6_Frr{fRfG;?L@`QBG&bSit6^v18jMXO)C!{63Z z?iX#nr=VZ0FwjW0==R*7G~+*-9;VFQ6|F=#;JY*glvkN$`NAZP`)A|S-3@zfx8`HM zD(Am1>&RhLHKKIpV!)Z>5>CcHhcr7fUp0vJrUFRnqiN>)!;`h>4nX4$Ta#2EWopBQ zzVXO_yx26gZwL-6^VKi!4e5ZcZ=?O>APMP-KY18_c37N!^k21 z?$bBEzJ@k>Nt(L5HA6n%bx`Xo2fju+IvH`PcKF*r$h{1Hh_Gz2-dWjBj7P7hDGshD zBmkm!eTXFx@jY5gan`K~yg1=4 zsas-1pDAl=kAn40@;R^Ph-rf4@n_3dz{P2p!TLRnpS?)1Z!%MBHUxJQ?` ztU;pL)|C3_3 zC0rPcaJtEidz88rY7Nz$b;w#$eFt`xPH%j!nqu9EJH4S%(5+U|xGRnFgP;%*vHW-1 zBqQA1+y+|l(&Tix{;{r;&-N_SPz9zHK6{BvKaxG{m0OjVi0R6i8+M?7o2rhFO=P@} zLj(0QK7ox}gwB_F+}r|7_`tvbg7C#HS~4$RsU%9>YqIZFIfU#)h~HlHy=?KcK^xpS z1w9)j#Q`q4#Szmhix1Q>mPm+$m8cD598j7BFdlnm52;zL1tWOvU!R14u`d=+i6`<0 zUd)8TS#RZ45nt%4KPsz2s+~hnus>DpRBea5Z}HxWl9w{-aKstJ3)nKFSjkBrYT>qF z((|=vVS5Q&ADI@mk7{20GECv}!}?&x zV(~fpw(kq?-MOP71@u{SQI^%ytig`B2ryBmxMQj!ClZa>(0ZzYel?lCM8|JrHE6

iue@C73# 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 JPDHLkV1h#uIL!b6 delta 92985 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%0DE;I(ij{cEuZ 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%0A3;)X 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 diff --git a/interface/resources/html/img/controls-help-keyboard.png b/interface/resources/html/img/controls-help-keyboard.png index da8969bdc0dce50ac7f0eb83ffcf2d880d045ecc..0c386b2eeeb376399293ed62a20a005038a41ae0 100644 GIT binary patch literal 69149 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 literal 69134 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 diff --git a/interface/resources/html/img/controls-help-vive.png b/interface/resources/html/img/controls-help-vive.png index 4ad0373e8247bb38d635060db1c355ffff07fd3b..310da1f7d98fa22373ad8ce34d97622739b676e3 100644 GIT binary patch literal 102581 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

  • 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 literal 102267 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

    _}y8l+(;89E14Vn}J}uAyTX85npkeBSqu_^$8# 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 From b6221a5f833ada3e37223fbe1bbd4d2a26e15cdf Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Oct 2016 09:45:34 +1300 Subject: [PATCH 186/300] Fix clearing address bar after navigating using picture card --- interface/resources/qml/AddressBarDialog.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/resources/qml/AddressBarDialog.qml b/interface/resources/qml/AddressBarDialog.qml index de4070737e..efcf14fc89 100644 --- a/interface/resources/qml/AddressBarDialog.qml +++ b/interface/resources/qml/AddressBarDialog.qml @@ -59,6 +59,7 @@ Window { } addressLine.text = targetString; toggleOrGo(true); + clearAddressLineTimer.start(); } property var allStories: []; property int cardWidth: 200; From bdff71151dab4b3c7f74ab13c832f0b4062603ad Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 7 Oct 2016 13:35:44 +1300 Subject: [PATCH 187/300] Updates from code review --- interface/resources/qml/ToolWindow.qml | 10 +++++----- .../resources/qml/controls-uit/ContentSection.qml | 2 +- libraries/gl/src/gl/OffscreenQmlSurface.cpp | 1 - 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/interface/resources/qml/ToolWindow.qml b/interface/resources/qml/ToolWindow.qml index a3a04be13e..68c8099970 100644 --- a/interface/resources/qml/ToolWindow.qml +++ b/interface/resources/qml/ToolWindow.qml @@ -56,7 +56,7 @@ ScrollingWindow { anchors.top: parent.top TabView { - id: tabView; + id: tabView width: pane.contentWidth // Pane height so that don't use Window's scrollbars otherwise tabs may be scrolled out of view. height: pane.scrollHeight @@ -69,10 +69,10 @@ ScrollingWindow { // (required for letting the C++ code access the webview) active: true enabled: false - property string originalUrl: ""; + property string originalUrl: "" WebView { - id: webView; + id: webView anchors.fill: parent enabled: false property alias eventBridgeWrapper: eventBridgeWrapper @@ -80,11 +80,11 @@ ScrollingWindow { QtObject { id: eventBridgeWrapper WebChannel.id: "eventBridgeWrapper" - property var eventBridge; + property var eventBridge } webChannel.registeredObjects: [eventBridgeWrapper] - onEnabledChanged: toolWindow.updateVisiblity(); + onEnabledChanged: toolWindow.updateVisiblity() } } } diff --git a/interface/resources/qml/controls-uit/ContentSection.qml b/interface/resources/qml/controls-uit/ContentSection.qml index 5fc86fc565..47a13e9262 100644 --- a/interface/resources/qml/controls-uit/ContentSection.qml +++ b/interface/resources/qml/controls-uit/ContentSection.qml @@ -109,7 +109,7 @@ Column { } MouseArea { - // Events are propogated so that any active control is defocussed. + // Events are propogated so that any active control is defocused. anchors.fill: parent propagateComposedEvents: true onPressed: { diff --git a/libraries/gl/src/gl/OffscreenQmlSurface.cpp b/libraries/gl/src/gl/OffscreenQmlSurface.cpp index b299421a1b..5b267ab7d5 100644 --- a/libraries/gl/src/gl/OffscreenQmlSurface.cpp +++ b/libraries/gl/src/gl/OffscreenQmlSurface.cpp @@ -581,7 +581,6 @@ bool OffscreenQmlRenderThread::allowNewFrame(uint8_t fps) { } OffscreenQmlSurface::OffscreenQmlSurface() { - // moveToThread(qApp->thread()); } static const uint64_t MAX_SHUTDOWN_WAIT_SECS = 2; From bbd7174d06dd7ad82403909718ccf889fcfb910e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 6 Oct 2016 17:37:47 -0700 Subject: [PATCH 188/300] Fix script paths not resolving correctly --- libraries/script-engine/src/ScriptEngine.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 18d7b0ebf1..f0896565a3 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -107,6 +107,7 @@ void inputControllerFromScriptValue(const QScriptValue &object, controller::Inpu out = qobject_cast(object.toQObject()); } +// FIXME Come up with a way to properly encode entity IDs in filename // The purpose of the following two function is to embed entity ids into entity script filenames // so that they show up in stacktraces // @@ -1113,9 +1114,10 @@ QUrl ScriptEngine::resolvePath(const QString& include) const { QScriptContextInfo contextInfo { currentContext()->parentContext() }; + // we apparently weren't a fully qualified url, so, let's assume we're relative // to the original URL of our script - QUrl parentURL = extractUrlFromEntityUrl(contextInfo.fileName()); + QUrl parentURL = contextInfo.fileName(); if (parentURL.isEmpty()) { if (_parentURL.isEmpty()) { parentURL = QUrl(_fileNameString); @@ -1348,7 +1350,7 @@ void ScriptEngine::entityScriptContentAvailable(const EntityItemID& entityID, co auto scriptCache = DependencyManager::get(); bool isFileUrl = isURL && scriptOrURL.startsWith("file://"); - auto fileName = isURL ? encodeEntityIdIntoEntityUrl(scriptOrURL, entityID.toString()) : "EmbeddedEntityScript"; + auto fileName = isURL ? scriptOrURL : "EmbeddedEntityScript"; QScriptProgram program(contents, fileName); if (!hasCorrectSyntax(program)) { From 6cae62f58443aade72d575cd027536e10c7cd403 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Fri, 7 Oct 2016 09:38:30 -0700 Subject: [PATCH 189/300] init the accumulator for script elapsed time --- libraries/script-engine/src/ScriptEngine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index f0896565a3..8a0de3e168 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -849,7 +849,7 @@ void ScriptEngine::run() { _lastUpdate = usecTimestampNow(); - std::chrono::microseconds totalUpdates; + std::chrono::microseconds totalUpdates(0); // TODO: Integrate this with signals/slots instead of reimplementing throttling for ScriptEngine while (!_isFinished) { From 14323a06b35c8814c1d48df6e1cb5ee365edb69d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 29 Aug 2016 10:28:27 -0700 Subject: [PATCH 190/300] Add interface to disable hand controller grab functionality --- .../system/controllers/handControllerGrab.js | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index 954093854e..2ebf7a828d 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -184,6 +184,10 @@ var STATE_FAR_TRIGGER = 5; var STATE_HOLD = 6; var STATE_ENTITY_TOUCHING = 7; +var holdEnabled = true; +var nearGrabEnabled = true; +var farGrabEnabled = true; + // "collidesWith" is specified by comma-separated list of group names // the possible group names are: static, dynamic, kinematic, myAvatar, otherAvatar var COLLIDES_WITH_WHILE_GRABBED = "dynamic,otherAvatar"; @@ -1440,7 +1444,7 @@ function MyController(hand) { var potentialEquipHotspot = this.chooseBestEquipHotspot(candidateHotSpotEntities); if (potentialEquipHotspot) { - if (this.triggerSmoothedGrab()) { + if (this.triggerSmoothedGrab() && holdEnabled) { this.grabbedHotspot = potentialEquipHotspot; this.grabbedEntity = potentialEquipHotspot.entityID; this.setState(STATE_HOLD, "equipping '" + entityPropertiesCache.getProps(this.grabbedEntity).name + "'"); @@ -1483,7 +1487,7 @@ function MyController(hand) { // potentialNearTriggerEntity = entity; } } else { - if (this.triggerSmoothedGrab()) { + if (this.triggerSmoothedGrab() && nearGrabEnabled) { var props = entityPropertiesCache.getProps(entity); var grabProps = entityPropertiesCache.getGrabProps(entity); var refCount = grabProps.refCount ? grabProps.refCount : 0; @@ -1571,7 +1575,7 @@ function MyController(hand) { // potentialFarTriggerEntity = entity; } } else if (this.entityIsDistanceGrabbable(rayPickInfo.entityID, handPosition)) { - if (this.triggerSmoothedGrab() && !isEditing()) { + if (this.triggerSmoothedGrab() && !isEditing() && farGrabEnabled) { this.grabbedEntity = entity; this.setState(STATE_DISTANCE_HOLDING, "distance hold '" + name + "'"); return; @@ -1589,7 +1593,9 @@ function MyController(hand) { equipHotspotBuddy.highlightHotspot(potentialEquipHotspot); } - this.searchIndicatorOn(rayPickInfo.searchRay); + if (farGrabEnabled) { + this.searchIndicatorOn(rayPickInfo.searchRay); + } Reticle.setVisible(false); }; @@ -2219,7 +2225,9 @@ function MyController(hand) { if (intersection.intersects) { this.intersectionDistance = Vec3.distance(pickRay.origin, intersection.intersection); } - this.searchIndicatorOn(pickRay); + if (farGrabEnabled) { + this.searchIndicatorOn(pickRay); + } } } @@ -2327,7 +2335,9 @@ function MyController(hand) { } this.intersectionDistance = intersectInfo.distance; - this.searchIndicatorOn(intersectInfo.searchRay); + if (farGrabEnabled) { + this.searchIndicatorOn(intersectInfo.searchRay); + } Reticle.setVisible(false); } else { this.setState(STATE_OFF, "grabbed entity was destroyed"); @@ -2681,6 +2691,7 @@ function update(deltaTime) { entityPropertiesCache.update(); } +Messages.subscribe('Hifi-Grab-Disable'); Messages.subscribe('Hifi-Hand-Disabler'); Messages.subscribe('Hifi-Hand-Grab'); Messages.subscribe('Hifi-Hand-RayPick-Blacklist'); From 8ba03abce6ecbffd86aa93959c65be002d1a1ee7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 31 Aug 2016 15:51:47 -0700 Subject: [PATCH 191/300] Add tutorial and vive controller script --- tutorial/entityData.js | 596 ++++++++++++++++++++++++++++++++++++++ tutorial/success.wav | Bin 0 -> 39758 bytes tutorial/success48.wav | Bin 0 -> 39758 bytes tutorial/tutorial.js | 545 +++++++++++++++++++++++++++++++++++ tutorial/viveHandsv2.js | 612 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1753 insertions(+) create mode 100644 tutorial/entityData.js create mode 100644 tutorial/success.wav create mode 100644 tutorial/success48.wav create mode 100644 tutorial/tutorial.js create mode 100644 tutorial/viveHandsv2.js diff --git a/tutorial/entityData.js b/tutorial/entityData.js new file mode 100644 index 0000000000..e0adf4f32d --- /dev/null +++ b/tutorial/entityData.js @@ -0,0 +1,596 @@ +Step1EntityData = [ + { + "clientOnly": 0, + "color": { + "blue": 255, + "green": 0, + "red": 255 + }, + "created": "2016-08-29T22:57:55Z", + "dimensions": { + "x": 0.018359377980232239, + "y": 0.018359377980232239, + "z": 0.018359377980232239 + }, + "id": "{3bb83d9c-11db-4bc1-a61b-36921370cb40}", + "name": "tutorial/box_spawn", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "collisionless": 1, + "position": { + "x": 0, + "y": 0.8, + "z": 0.7790381908416748 + }, + "queryAACube": { + "scale": 0.031799376010894775, + "x": -0.015899688005447388, + "y": 0.79706859588623047, + "z": 0.7631385326385498 + }, + "rotation": { + "w": 1, + "x": 0, + "y": 0, + "z": 0 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"tag\":\"step2\"}", + "visible": 0 + }, + { + "color": { + "blue": 181, + "green": 181, + "red": 181 + }, + "dimensions": { + "x": 0.37322089076042175, + "y": 0.8015166997909546, + "z": 0.37322089076042175 + }, + "name": "tutorial/pillar2", + //"shapeType": "simple-hull", + "position": { + "x": 0.019208565354347229, + "y": -0.1, + "z": 0.75276124477386475 + }, + "rotation": { + "w": 1, + "x": 0, + "y": 0, + "z": 0 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"tag\":\"step2\"}" + }, + { + "clientOnly": 0, + "compoundShapeURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj", + "created": "2016-08-29T22:57:55Z", + "dimensions": { + "x": 0.57461458444595337, + "y": 0.35781359672546387, + "z": 0.57461458444595337 + }, + "gravity": { + "x": 0, + "y": -5, + "z": 0 + }, + "id": "{2a8a9cb8-4501-4089-8fb8-6b1b5100db10}", + "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx", + "name": "tutorial/basket", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 0.022034257650375366, + "y": 0.47968916893005371, + "z": 0 + }, + "queryAACube": { + "scale": 0.88791579008102417, + "x": -0.42192363739013672, + "y": 0.23573127388954163, + "z": -0.44395789504051208 + }, + "rotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "shapeType": "compound", + "type": "Model", + "userData": "{\"hifiHomeKey\":{\"reset\":true},\"tag\":\"step2\"}" + }, + { + "clientOnly": 0, + "collisionless": 1, + "color": { + "blue": 255, + "green": 0, + "red": 255 + }, + "created": "2016-08-29T22:57:55Z", + "dimensions": { + "x": 0.43770244717597961, + "y": 0.33723857998847961, + "z": 0.43770244717597961 + }, + "id": "{436aec80-15e8-4fc3-bd74-f173b731a922}", + "ignoreForCollisions": 1, + "name": "tutorial/basket_collider", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 0.02785143256187439, + "y": 0.50166182518005371, + "z": 0.0017895996570587158 + }, + "queryAACube": { + "scale": 0.70490902662277222, + "x": -0.32460308074951172, + "y": 0.3492073118686676, + "z": -0.35066491365432739 + }, + "rotation": { + "w": 1, + "x": 0, + "y": 0, + "z": 0 + }, + "type": "Sphere", + "userData": "{\"tag\":\"step2\"}", + "visible": 0 + }, + { + "clientOnly": 0, + "color": { + "blue": 181, + "green": 181, + "red": 181 + }, + "created": "2016-08-29T22:57:55Z", + "dimensions": { + "x": 0.37322089076042175, + "y": 0.8015000104904175, + "z": 0.37322089076042175 + }, + "id": "{221be6c2-e0d6-4a7c-b9d4-a77e6b7d1c9a}", + "name": "tutorial/pillar1", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 0.019208565354347229, + "y": -0.1, + "z": 0.025902509689331055 + }, + "queryAACube": { + "scale": 1.1320732831954956, + "x": -0.54682809114456177, + "y": -0.5660366415977478, + "z": -0.54013413190841675 + }, + "rotation": { + "w": 1, + "x": 0, + "y": 0, + "z": 0 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"tag\":\"step2\"}" + } + ]; + +//Step1EntityData = [ +// { +// "clientOnly": 0, +// "color": { +// "blue": 255, +// "green": 0, +// "red": 255 +// }, +// "created": "2016-08-23T16:29:15Z", +// "dimensions": { +// "x": 0.018359377980232239, +// "y": 0.018359377980232239, +// "z": 0.018359377980232239 +// }, +// "id": "{387765d2-366d-4775-8e6e-ea45119cf69d}", +// visible: false, +// "name": "tutorial/box_spawn", +// "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", +// "position": { +// "x": 0.016568422317504883, +// "y": 0.6591796875, +// "z": 1.3308790922164917 +// }, +// "queryAACube": { +// "scale": 0.031799376010894775, +// "x": 0.00066873431205749512, +// "y": 0.643280029296875, +// "z": 1.3149794340133667 +// }, +// "shape": "Cube", +// "type": "Box" +// }, +// { +// "clientOnly": 0, +// "compoundShapeURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj", +// "created": "2016-08-22T21:20:11Z", +// "dimensions": { +// "x": 0.57461458444595337, +// "y": 0.35781359672546387, +// "z": 0.57461458444595337 +// }, +// "gravity": { +// "x": 0, +// "y": -5, +// "z": 0 +// }, +// "id": "{ddcb3906-3d80-4111-9171-3a73a2f4f1bb}", +// "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx", +// "name": "tutorial/basket", +// "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", +// "position": { +// "x": 0, +// "y": 0.6480712890625, +// "z": 0 +// }, +// "queryAACube": { +// "scale": 0.88791579008102417, +// "x": -0.44395789504051208, +// "y": 0.20411339402198792, +// "z": -0.44395789504051208 +// }, +// "rotation": { +// "w": 1, +// "x": -1.52587890625e-05, +// "y": -1.52587890625e-05, +// "z": -1.52587890625e-05 +// }, +// "shapeType": "compound", +// "type": "Model", +// "userData": "{\"hifiHomeKey\":{\"reset\":true}}" +// }, +// { +// "clientOnly": 0, +// "created": "2016-08-22T21:22:22Z", +// "dimensions": { +// "x": 2.4929797649383545, +// "y": 0.94968640804290771, +// "z": 1.0870213508605957 +// }, +// "id": "{e7030a2d-f573-4c4b-a0aa-ea80e9e25399}", +// "name": "tutorial/table", +// "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/table2_re-oriented.fbx", +// "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", +// "position": { +// "x": 0.018214225769042969, +// "y": 0, +// "z": 0.60948663949966431 +// }, +// "queryAACube": { +// "scale": 2.8807060718536377, +// "x": -1.4221388101577759, +// "y": -1.4403530359268188, +// "z": -0.83086639642715454 +// }, +// "rotation": { +// "w": 0.70705735683441162, +// "x": -1.52587890625e-05, +// "y": -0.70717936754226685, +// "z": -1.52587890625e-05 +// }, +// "shapeType": "static-mesh", +// "type": "Model" +// }, +// { +// visible: false, +// "clientOnly": 0, +// "collisionless": 1, +// "color": { +// "blue": 255, +// "green": 0, +// "red": 255 +// }, +// "created": "2016-08-23T18:09:44Z", +// "dimensions": { +// "x": 0.43770244717597961, +// "y": 0.33723857998847961, +// "z": 0.43770244717597961 +// }, +// "id": "{54e1d825-b552-48e4-b9c8-1c83c79a673e}", +// "ignoreForCollisions": 1, +// "name": "tutorial/basket_collider", +// "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", +// "position": { +// "x": 0.0058171749114990234, +// "y": 0.6700439453125, +// "z": 0.0017895996570587158 +// }, +// "queryAACube": { +// "scale": 0.70490902662277222, +// "x": -0.34663733839988708, +// "y": 0.31758943200111389, +// "z": -0.35066491365432739 +// }, +// "type": "Sphere" +// } +//]; + +Step1BlockData = { + "clientOnly": 0, + "color": { + "blue": 0, + "green": 0, + "red": 255 + }, + "created": "2016-08-22T22:54:07Z", + "dimensions": { + "x": 0.20000000298023224, + "y": 0.20000000298023224, + "z": 0.20000000298023224 + }, + name: "tutorial/block", + "collisionsWillMove": 1, + velocity: { + x: 0, + y: -0.2, + z: 0 + }, + "dynamic": 1, + "gravity": { + "x": 0, + "y": -10, + "z": 0 + }, + "id": "{5c7223f8-3bc5-4cb4-913c-0e93f5994ca2}", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "queryAACube": { + "scale": 0.34641015529632568, + "x": -0.17320507764816284, + "y": -0.17320507764816284, + "z": -0.17320507764816284 + }, + "rotation": { + "w": 1, + "x": -0.0001373291015625, + "y": -7.62939453125e-05, + "z": -0.0003204345703125 + }, + "shape": "Cube", + "type": "Box", + "userData": "{}", +}; + +StepGunData = [ + { + "clientOnly": 0, + "created": "2016-08-23T22:18:46Z", + "dimensions": { + "x": 2.4929797649383545, + "y": 0.94968640804290771, + "z": 1.0870213508605957 + }, + "id": "{de28363f-d1f8-4001-8e6b-1b5876699f49}", + "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/table2_re-oriented.fbx", + "name": "tutorial/table", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 0.17360222339630127, + "y": 0, + "z": 0 + }, + "queryAACube": { + "scale": 2.8807060718536377, + "x": -1.2667508125305176, + "y": -1.4403530359268188, + "z": -1.4403530359268188 + }, + "rotation": { + "w": 0.70705735683441162, + "x": -1.52587890625e-05, + "y": -0.70717936754226685, + "z": -1.52587890625e-05 + }, + "shapeType": "static-mesh", + "type": "Model", + "userData": "{\"tag\":\"step4\"}" + }, + { + "clientOnly": 0, + "compoundShapeURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj", + "created": "2016-08-23T22:18:46Z", + "dimensions": { + "x": 0.57461458444595337, + "y": 0.35781359672546387, + "z": 0.57461458444595337 + }, + "gravity": { + "x": 0, + "y": -5, + "z": 0 + }, + "id": "{51e7cf16-e624-44a8-b835-47c35c6ad5f0}", + "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx", + "name": "tutorial/basket", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 3.8134055137634277, + "y": 0.6480712890625, + "z": 0.015498995780944824 + }, + "queryAACube": { + "scale": 0.88791579008102417, + "x": 3.3694477081298828, + "y": 0.20411339402198792, + "z": -0.42845889925956726 + }, + "rotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "shapeType": "compound", + "type": "Model", + "userData": "{\"hifiHomeKey\":{\"reset\":true},\"tag\":\"step4\"}" + }, + { + "clientOnly": 0, + "collisionless": 1, + "color": { + "blue": 0, + "green": 0, + "red": 255 + }, + "created": "2016-08-23T22:20:57Z", + "dimensions": { + "x": 0.0649842768907547, + "y": 0.0649842768907547, + "z": 0.0649842768907547 + }, + "id": "{264943d2-600f-4d22-ad30-ccd57f7c4424}", + "ignoreForCollisions": 1, + "name": "tutorial/gun_spawn", + visible: false, + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 0, + "y": 0.62629544734954834, + "z": 0.028602004051208496 + }, + "queryAACube": { + "scale": 0.11255607008934021, + "x": -0.056278035044670105, + "y": 0.57001739740371704, + "z": -0.027676030993461609 + }, + "shape": "Cube", + "type": "Box" + }, + { + "clientOnly": 0, + "collisionless": 1, + "color": { + "blue": 255, + "green": 0, + "red": 255 + }, + "created": "2016-08-23T22:18:46Z", + "dimensions": { + "x": 0.43770244717597961, + "y": 0.33723857998847961, + "z": 0.43770244717597961 + }, + "id": "{a8944645-3234-484f-aed1-1a63d76aa51c}", + "ignoreForCollisions": 1, + "name": "tutorial/basket_collider", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 3.8192229270935059, + "y": 0.6700439453125, + "z": 0.017288565635681152 + }, + "queryAACube": { + "scale": 0.70490902662277222, + "x": 3.4667685031890869, + "y": 0.31758943200111389, + "z": -0.33516594767570496 + }, + "rotation": { + "w": 1, + "x": 0, + "y": 0, + "z": 0 + }, + "type": "Sphere", + "userData": "{\"tag\":\"step4\"}", + "visible": 0 + } +]; + +GunData = { + "clientOnly": 0, + "collisionsWillMove": 1, + "compoundShapeURL": "http://hifi-production.s3.amazonaws.com/tutorials/pingPongGun/Pingpong-Gun-New.obj", + "created": "2016-08-23T22:12:13Z", + "dimensions": { + "x": 0.125, + "y": 0.38749998807907104, + "z": 0.99309998750686646 + }, + "dynamic": 1, + "gravity": { + "x": 0, + "y": -5, + "z": 0 + }, + + "id": "{8d3fa3f2-8b59-4f47-8bb4-c03574239c9f}", + "modelURL": "http://hifi-production.s3.amazonaws.com/tutorials/pingPongGun/Pingpong-Gun-New.fbx", + "name": "tutorial/gun", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "queryAACube": { + "scale": 3.219977855682373, + "x": -2.5046753883361816, + "y": -1.8901374340057373, + "z": -0.68512386083602905 + }, + velocity: { + x: 0, + y: -1, + z: 0 + }, + "rotation": { + "w": 0.69534718990325928, + "x": -0.13302478194236755, + "y": -0.12684555351734161, + "z": 0.69477111101150513 + }, + "script": "http://hifi-production.s3.amazonaws.com/tutorials/entity_scripts/pingPongGun.js", + "shapeType": "compound", + "type": "Model", + "userData": "{\"grabbableKey\":{\"invertSolidWhileHeld\":true},\"wearable\":{\"joints\":{\"RightHand\":[{\"x\":0.1177130937576294,\"y\":0.12922893464565277,\"z\":0.08307232707738876},{\"x\":0.4934672713279724,\"y\":0.3605862259864807,\"z\":0.6394805908203125,\"w\":-0.4664038419723511}],\"LeftHand\":[{\"x\":0.09151676297187805,\"y\":0.13639454543590546,\"z\":0.09354984760284424},{\"x\":-0.19628101587295532,\"y\":0.6418180465698242,\"z\":0.2830369472503662,\"w\":0.6851521730422974}]}}}" +}; + +HandsAboveHeadData = [ +{ + name: "tutorial/sign", + "backgroundColor": { + "blue": 187, + "green": 242, + "red": 198 + }, + "clientOnly": 0, + "created": "2016-08-23T22:42:48Z", + "dimensions": { + "x": 0.58140444755554199, + "y": 0.38676983118057251, + "z": 0.0099999997764825821 + }, + "id": "{c0ceabcf-501e-41fe-99e9-aca47a44122f}", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "queryAACube": { + "scale": 0.69837099313735962, + "x": -0.34918549656867981, + "y": -0.34918549656867981, + "z": -0.34918549656867981 + }, + "rotation": { + "w": 0.70710676908493042, + "x": 0, + "y": -0.70710670948028564, + "z": 0 + }, + "text": "Put your hands above your head.", + "textColor": { + "blue": 0, + "green": 0, + "red": 0 + }, + "type": "Text" +} +]; diff --git a/tutorial/success.wav b/tutorial/success.wav new file mode 100644 index 0000000000000000000000000000000000000000..597e2b91b66c071fb260675d27f08c235af0a01b GIT binary patch literal 39758 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 Q0WX*d$UJ5) 0 ? entities[0] : null; +} + +// Return all entities with properties `properties` within radius `searchRadius` +findEntities = function(properties, searchRadius, filterFn) { + if (!filterFn) { + filterFn = function(properties, key, value) { + return value == properties[key]; + } + } + searchRadius = searchRadius ? searchRadius : 100000; + var entities = Entities.findEntities({ x: 0, y: 0, z: 0 }, searchRadius); + var matchedEntities = []; + var keys = Object.keys(properties); + for (var i = 0; i < entities.length; ++i) { + var match = true; + var candidateProperties = Entities.getEntityProperties(entities[i], keys); + for (var key in properties) { + if (!filterFn(properties, key, candidateProperties[key])) { + // This isn't a match, move to next entity + match = false; + break; + } + } + if (match) { + matchedEntities.push(entities[i]); + } + } + + return matchedEntities; +} +// On start tutorial... + +// Load assets +var BOX_SPAWN_NAME = "tutorial/box_spawn"; +var BASKET_COLLIDER_NAME = "tutorial/basket_collider"; +var GUN_SPAWN_NAME = "tutorial/gun_spawn"; +var GUN_AMMO_NAME = "Tutorial Ping Pong Ball" + +function spawn(entityData, transform, modifyFn) { + print("Creating: ", entityData); + if (!transform) { + transform = { + position: { x: 0, y: 0, z: 0 }, + rotation: { x: 0, y: 0, z: 0, w: 1 } + } + } + var ids = []; + for (var i = 0; i < entityData.length; ++i) { + var data = entityData[i]; + print("Creating: ", data.name); + data.position = Vec3.sum(transform.position, data.position); + data.rotation = Quat.multiply(data.rotation, transform.rotation); + if (modifyFn) { + data = modifyFn(data); + } + var id = Entities.addEntity(data); + ids.push(id); + } + return ids; +} + +function parseJSON(jsonString) { + var data; + try { + data = JSON.parse(jsonString); + } catch(e) { + data = {}; + } + return data; +} + +function spawnWithTag(entityData, transform, tag) { + function modifyFn(data) { + var userData = parseJSON(data.userData); + userData.tag = tag; + data.userData = JSON.stringify(userData); + return data; + } + return spawn(entityData, transform, modifyFn); +} + +function findEntitiesWithTag(tag) { + return findEntities({ userData: "" }, 10000, function(properties, key, value) { + data = parseJSON(value); + return data.tag == tag; + }); +} + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: DISABLE CONTROLLERS // +// // +/////////////////////////////////////////////////////////////////////////////// +var stepDisableControllers = function(name) { + this.tag = name; +} +stepDisableControllers.prototype = { + start: function(onFinish) { + Menu.setIsOptionChecked("Overlays", false); + Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'both'); + Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ + nearGrabEnabled: true, + holdEnabled: false, + farGrabEnabled: false, + })); + onFinish(); + }, + cleanup: function() { + } +}; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: Raise hands above head // +// // +/////////////////////////////////////////////////////////////////////////////// +var stepRaiseAboveHead = function(name) { + this.tag = name; +} +stepRaiseAboveHead.prototype = { + start: function(onFinish) { + var tag = this.tag; + + var defaultTransform = { + position: { + x: 0.2459, + y: 0.9011, + z: 0.7266 + }, + rotation: { + x: 0, + y: 0, + z: 0, + w: 1 + } + }; + + // Spawn content set + spawnWithTag(HandsAboveHeadData, defaultTransform, tag); + + var checkIntervalID = null; + function checkForHandsAboveHead() { + print("Checking..."); + if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { + Script.clearInterval(checkIntervalID); + this.soundInjector = Audio.playSound(successSound, { + position: defaultTransform.position, + volume: 0.7, + loop: false + }); + onFinish(); + } + } + checkIntervalID = Script.setInterval(checkForHandsAboveHead, 500); + }, + cleanup: function() { + var entityIDs = findEntitiesWithTag(this.tag); + print("entities: ", entityIDs.length); + for (var i = 0; i < entityIDs.length; ++i) { + print("Deleting: ", entityIDs[i]); + Entities.deleteEntity(entityIDs[i]); + } + } +}; + + + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: Near Grab // +// // +/////////////////////////////////////////////////////////////////////////////// +var stepNearGrab = function(name) { + this.tag = name; +} +stepNearGrab.prototype = { + start: function(onFinish) { + var tag = this.tag; + + // Spawn content set + spawnWithTag(Step1EntityData, null, tag); + + var basketColliderID = findEntity({ name: BASKET_COLLIDER_NAME }, 10000); + var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; + + function createBlock() { + var boxSpawnID = findEntity({ name: BOX_SPAWN_NAME }, 10000); + if (!boxSpawnID) { + print("Error creating block, cannot find spawn"); + return null; + } + + Step1BlockData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; + return spawnWithTag([Step1BlockData], null, tag)[0]; + } + + // Enabled grab + // Create table ? + // Create blocks and basket + var boxID = createBlock(); + print("Created", boxID); + + function onHit() { + onFinish(); + } + + // When block collides with basket start step 2 + var checkCollidesTimer = null; + function checkCollides() { + print("CHECKING..."); + if (Vec3.distance(basketPosition, Entities.getEntityProperties(boxID, 'position').position) < 0.1) { + Script.clearInterval(checkCollidesTimer); + this.soundInjector = Audio.playSound(successSound, { + position: basketPosition, + volume: 0.7, + loop: false + }); + Script.setTimeout(onHit, 1000); + } + } + checkCollidesTimer = Script.setInterval(checkCollides, 500); + + // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block + }, + cleanup: function() { + var entityIDs = findEntitiesWithTag(this.tag); + print("entities: ", entityIDs.length); + for (var i = 0; i < entityIDs.length; ++i) { + print("Deleting: ", entityIDs[i]); + Entities.deleteEntity(entityIDs[i]); + } + } +}; + + + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: Far Grab // +// // +/////////////////////////////////////////////////////////////////////////////// +var stepFarGrab = function(name) { + this.tag = name; +} +stepFarGrab.prototype = { + start: function(onFinish) { + Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ + farGrabEnabled: true, + })); + var tag = this.tag; + var transform = { + position: { x: 3, y: 0, z: 0 }, + rotation: { x: 0, y: 0, z: 0, w: 1 } + } + + // Spawn content set + spawnWithTag(Step1EntityData, transform, tag); + + var basketColliderID = findEntity({ name: BASKET_COLLIDER_NAME }, 10000); + var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; + + function createBlock() { + var boxSpawnID = findEntity({ name: BOX_SPAWN_NAME }, 10000); + if (!boxSpawnID) { + print("Error creating block, cannot find spawn"); + return null; + } + + Step1BlockData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; + return spawnWithTag([Step1BlockData], null, tag)[0]; + } + + // Enabled grab + // Create table ? + // Create blocks and basket + var boxID = createBlock(); + print("Created", boxID); + + function onHit() { + onFinish(); + } + + // When block collides with basket start step 2 + var checkCollidesTimer = null; + function checkCollides() { + print("CHECKING..."); + if (Vec3.distance(basketPosition, Entities.getEntityProperties(boxID, 'position').position) < 0.1) { + Script.clearInterval(checkCollidesTimer); + this.soundInjector = Audio.playSound(successSound, { + position: basketPosition, + volume: 0.7, + loop: false + }); + Script.setTimeout(onHit, 1000); + } + } + checkCollidesTimer = Script.setInterval(checkCollides, 500); + + // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block + }, + cleanup: function() { + var entityIDs = findEntitiesWithTag(this.tag); + print("entities: ", entityIDs.length); + for (var i = 0; i < entityIDs.length; ++i) { + print("Deleting: ", entityIDs[i]); + Entities.deleteEntity(entityIDs[i]); + } + } +}; + + + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: Equip // +// // +/////////////////////////////////////////////////////////////////////////////// +var stepEquip = function(name) { + this.tag = name; +} +stepEquip.prototype = { + start: function(onFinish) { + Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ + holdEnabled: true, + })); + + var tag = this.tag; + + var defaultTransform = { + position: { + x: 0.0, + y: 0.0, + z: 0.75 + }, + rotation: { + x: 0, + y: 0, + z: 0, + w: 1 + } + }; + + // Spawn content set + spawnWithTag(StepGunData, defaultTransform, tag); + + var basketColliderID = findEntity({ name: BASKET_COLLIDER_NAME }, 10000); + var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; + + function createGun() { + var boxSpawnID = findEntity({ name: GUN_SPAWN_NAME }, 10000); + if (!boxSpawnID) { + print("Error creating block, cannot find spawn"); + return null; + } + + GunData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; + Vec3.print("spawn", GunData.position); + print("Adding: ", JSON.stringify(GunData)); + return spawnWithTag([GunData], null, tag)[0]; + } + + // Enabled grab + // Create table ? + // Create blocks and basket + var gunID = createGun(); + print("Created", gunID); + + function onHit() { + onFinish(); + } + + // When block collides with basket start step 2 + var checkCollidesTimer = null; + function checkCollides() { + print("CHECKING..."); + var ammoIDs = findEntities({ name: GUN_AMMO_NAME }, 15); + for (var i = 0; i < ammoIDs.length; ++i) { + if (Vec3.distance(basketPosition, Entities.getEntityProperties(ammoIDs[i], 'position').position) < 0.2) { + Script.clearInterval(checkCollidesTimer); + this.soundInjector = Audio.playSound(successSound, { + position: basketPosition, + volume: 0.7, + loop: false + }); + Script.setTimeout(onHit, 1000); + } + } + } + checkCollidesTimer = Script.setInterval(checkCollides, 500); + + // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block + }, + cleanup: function() { + var entityIDs = findEntitiesWithTag(this.tag); + print("entities: ", entityIDs.length); + for (var i = 0; i < entityIDs.length; ++i) { + print("Deleting: ", entityIDs[i]); + Entities.deleteEntity(entityIDs[i]); + } + } +}; + + + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: Teleport // +// // +/////////////////////////////////////////////////////////////////////////////// +var stepTeleport = function(name) { + this.tag = name; +} +stepTeleport.prototype = { + start: function(onFinish) { + Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); + Menu.setIsOptionChecked("Overlays", false); + }, + cleanup: function() { + var entityIDs = findEntitiesWithTag(this.tag); + print("entities: ", entityIDs.length); + for (var i = 0; i < entityIDs.length; ++i) { + print("Deleting: ", entityIDs[i]); + Entities.deleteEntity(entityIDs[i]); + } + } +}; + + + + + +var STEPS; + +var currentStepNum = -1; +var currentStep = null; +function startTutorial() { + currentStepNum = -1; + currentStep = null; + STEPS = [ + new stepDisableControllers("step0"), + //new stepRaiseAboveHead("step1"), + new stepNearGrab("step2"), + new stepFarGrab("step3"), + new stepEquip("step4"), + new stepTeleport("teleport"), + ] + startNextStep(); +} + +function startNextStep() { + if (currentStep) { + //currentStep.cleanup(); + } + + ++currentStepNum; + + if (currentStepNum >= STEPS.length) { + // Done + print("DONE WITH TUTORIAL"); + } else { + print("Starting step", currentStepNum); + currentStep = STEPS[currentStepNum]; + currentStep.start(startNextStep); + startNextStep(); + } +} + +function skipTutorial() { +} + +function stopTutorial() { + if (currentStep) { + currentStep.cleanup(); + } +} + +location = "/tutorial"; +startTutorial(); + +Script.scriptEnding.connect(stopTutorial); + diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js new file mode 100644 index 0000000000..715dffe089 --- /dev/null +++ b/tutorial/viveHandsv2.js @@ -0,0 +1,612 @@ +var PARENT_ID = MyAvatar.sessionUUID; +var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"); +var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"); +var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("LeftHand"); +var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("RightHand"); + +var zeroPosition = { x: 0, y: 0, z: 0 }; +var zeroRotation = { x: 0, y: 0, z: 0, w: 1 }; + +var CONTROLLER_LENGTH_OFFSET = 0.0762; + +var naturalPosition = { + x: 0, + y: -0.034076502197422087, + z: 0.06380049744620919 +}; +var naturalPositionL = { + x: 0, + y: 0.034076502197422087, + z: 0.06380049744620919 +}; +var naturalPositionR = { + x: 0.0, + y: 0.034076502197422087, + z: 0.06380049744620919 +}; + +// THe CONTROLLER_LEFTHAND +var leftBasePosition = { + x: CONTROLLER_LENGTH_OFFSET / 2, + y: CONTROLLER_LENGTH_OFFSET * 2, + z: CONTROLLER_LENGTH_OFFSET / 2 +}; +var rightBasePosition = { + x: -CONTROLLER_LENGTH_OFFSET / 2, + y: CONTROLLER_LENGTH_OFFSET * 2, + z: CONTROLLER_LENGTH_OFFSET / 2 +}; + +var leftBasePositionVive = Vec3.sum(leftBasePosition, { x: 0.005, y: 0.03, z: 0 }); +var rightBasePositionVive = Vec3.sum(rightBasePosition, { x: -0.005, y: 0.03, z: 0 }); + +Vec3.print("left offset: ", leftBasePosition); + +var leftBaseRotation = Quat.multiply( + Quat.fromPitchYawRollDegrees(0, 0, 45), + Quat.multiply( + Quat.fromPitchYawRollDegrees(90, 0, 0), + Quat.fromPitchYawRollDegrees(0, 0, 90) + ) +); + +var rightBaseRotation = Quat.multiply( + Quat.fromPitchYawRollDegrees(0, 0, -45), + Quat.multiply( + Quat.fromPitchYawRollDegrees(90, 0, 0), + Quat.fromPitchYawRollDegrees(0, 0, -90) + ) +); + + +var touchLeftBaseRotation = Quat.multiply( + Quat.fromPitchYawRollDegrees(0, 0, 0), + Quat.multiply( + Quat.fromPitchYawRollDegrees(0, 0, -45), + Quat.multiply( + Quat.fromPitchYawRollDegrees(180, 0, 0), + Quat.fromPitchYawRollDegrees(0, -90, 0) + ) + ) +); + +var touchRightBaseRotation = Quat.multiply( + Quat.fromPitchYawRollDegrees(0, 0, 45), + Quat.multiply( + Quat.fromPitchYawRollDegrees(180, 0, 0), + Quat.fromPitchYawRollDegrees(0, 90, 0) + ) +); + +var TOUCH_CONTROLLER_CONFIGURATION = { + name: "Touch", + controllers: [ + { + modelURL: "C:/Users/Ryan/Assets/controller/touch_l_full.fbx", + jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"), + rotation: touchLeftBaseRotation, + //position: Vec3.sum(leftBasePosition, { x: 0.032, y: 0.0, z: -0.02 }), + position: Vec3.sum(leftBasePosition, { x: 0.0, y: -0.016, z: -0.02 }), + //dimensions: naturalDimensions, + }, + { + modelURL: "C:/Users/Ryan/Assets/controller/touch_r_full.fbx", + jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), + rotation: touchRightBaseRotation, + //position: rightBasePosition, + position: Vec3.sum(rightBasePosition, { x: 0.0, y: -0.016, z: -0.02 }), + //dimensions: naturalDimensions, + } + ] +} + +var TOUCH_2_CONTROLLER_CONFIGURATION = { + name: "Touch", + controllers: [ + { + modelURL: "C:/Users/Ryan/Assets/controller/oculus_touch_l.fbx", + naturalPosition: { + x: 0.016486000269651413, + y: -0.035518500953912735, + z: -0.018527504056692123 + }, + jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"), + rotation: touchLeftBaseRotation, + position: leftBasePosition, + + annotationTextRotation: Quat.fromPitchYawRollDegrees(20, -90, 0), + annotations: { + + buttonX: { + position: { + x: -0.00931, + y: 0.00212, + z: -0.01259, + }, + direction: "left", + color: { red: 100, green: 100, blue: 100 }, + }, + buttonY: { + position: { + x: -0.01617, + y: 0.00216, + z: 0.00177, + }, + direction: "left", + color: { red: 100, green: 255, blue: 100 }, + }, + bumper: { + position: { + x: 0.00678, + y: -0.02740, + z: -0.02537, + }, + direction: "left", + color: { red: 100, green: 100, blue: 255 }, + }, + trigger: { + position: { + x: -0.01275, + y: -0.01992, + z: 0.02314, + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + } + }, + }, + { + modelURL: "C:/Users/Ryan/Assets/controller/oculus_touch_r.fbx", + naturalPosition: { + x: -0.016486000269651413, + y: -0.035518500953912735, + z: -0.018527504056692123 + }, + jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), + rotation: touchRightBaseRotation, + position: rightBasePosition, + + annotationTextRotation: Quat.fromPitchYawRollDegrees(20, 90, 0), + annotations: { + + buttonA: { + position: { + x: 0.00931, + y: 0.00212, + z: -0.01259, + }, + direction: "right", + color: { red: 100, green: 100, blue: 100 }, + }, + buttonB: { + position: { + x: 0.01617, + y: 0.00216, + z: 0.00177, + }, + direction: "right", + color: { red: 100, green: 255, blue: 100 }, + }, + bumper: { + position: { + x: 0.00678, + y: -0.02740, + z: -0.02537, + }, + direction: "right", + color: { red: 100, green: 100, blue: 255 }, + }, + trigger: { + position: { + x: 0.01275, + y: -0.01992, + z: 0.02314, + }, + direction: "right", + color: { red: 255, green: 100, blue: 100 }, + } + }, + } + ] +} + + +var viveNaturalDimensions = { + x: 0.1174320001155138, + y: 0.08361100335605443, + z: 0.21942697931081057 +}; +var viveNaturalPosition = { + x: 0, + y: -0.034076502197422087, + z: 0.06380049744620919 +}; + +var VIVE_CONTROLLER_CONFIGURATION = { + name: "Vive", + controllers: [ + { + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vr_controller_vive_1_5.obj", + modelURL: "C:\\Users\\Ryan\\Assets\\controller\\vive2.fbx", + jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"), + naturalPosition: viveNaturalPosition, + rotation: leftBaseRotation, + position: Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, 0, 45), leftBasePosition), + + dimensions: viveNaturalDimensions, + + annotationTextRotation: Quat.fromPitchYawRollDegrees(20, -90, 0), + annotations: { +// red: { +// debug: true, +// position: { +// x: 0.1, +// y: 0.0, +// z: 0.0 +// }, +// direction: "right", +// color: { red: 255, green: 0, blue: 0 }, +// }, +// green: { +// debug: true, +// position: { +// x: 0.0, +// y: 0.1, +// z: 0.0 +// }, +// direction: "right", +// color: { red: 0, green: 255, blue: 0 }, +// }, +// blue: { +// debug: true, +// position: { +// x: 0.0, +// y: 0.0, +// z: 0.1 +// }, +// direction: "right", +// color: { red: 0, green: 0, blue: 255 }, +// }, +// white: { +// debug: true, +// position: { +// x: 0.0, +// y: 0.0, +// z: 0.0 +// }, +// direction: "right", +// color: { red: 255, green: 255, blue: 255 }, +// }, + + center: { + position: zeroPosition, + direction: "center", + color: { red: 100, green: 255, blue: 255 }, + }, + trigger: { + position: { + x: 0, + y: -0.023978, + z: 0.04546 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + menu: { + position: { + x: 0, + y: 0.00770, + z: 0.01979 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + grip: { + position: { + x: 0.01980, + y: -0.01561, + z: 0.08721 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + pad: { + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + steam: { + position: { + x: 0, + y: 0.00303, + z: 0.08838 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + }, + }, + { + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vr_controller_vive_1_5.obj", + modelURL: "C:\\Users\\Ryan\\Assets\\controller\\vive2.fbx", + jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), + //rotation: rightBaseRotation, + //position: rightBasePosition, + //position: Vec3.sum(Vec3.multiplyQbyV(rightBaseRotation, naturalPositionR), rightBasePositionVive), + + //rotation: zeroRotation, + //position: zeroPosition, + rotation: rightBaseRotation, + position: Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, 0, -45), rightBasePosition), + + dimensions: viveNaturalDimensions, + + naturalPosition: { + x: 0, + y: -0.034076502197422087, + z: 0.06380049744620919 + }, + //rotation: touchRightBaseRotation, + //position: rightBasePosition, + + annotationTextRotation: Quat.fromPitchYawRollDegrees(20, -90, 0), + annotations: { + + trigger: { + position: { + x: 0, + y: -0.023978, + z: 0.04546 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + menu: { + position: { + x: 0, + y: 0.00770, + z: 0.01979 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + grip: { + position: { + x: 0.01980, + y: -0.01561, + z: 0.08721 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + pad: { + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + steam: { + position: { + x: 0, + y: 0.00303, + z: 0.08838 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + } + } + ] +} + +var DEBUG = true; + +function setupController(config) { + var controllerDisplay = { + overlays: [], + annotations: { + }, + mappingName: "" + }; + for (var i = 0; i < config.controllers.length; ++i) { + var controller = config.controllers[i]; + var position = controller.position; + if (controller.naturalPosition) { + position = Vec3.sum(Vec3.multiplyQbyV( + controller.rotation, controller.naturalPosition), position); + } + var overlayID = Overlays.addOverlay("model", { + url: controller.modelURL, + dimensions: controller.dimensions, + localRotation: controller.rotation, + localPosition: position, + parentID: PARENT_ID, + parentJointIndex: controller.jointIndex, + ignoreRayIntersection: true, + }); + + controllerDisplay.overlays.push(overlayID); + + if (controller.annotations) { + for (var key in controller.annotations) { + var annotation = controller.annotations[key]; + var annotationPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, annotation.position)); + if (DEBUG) { + overlayID = Overlays.addOverlay("sphere", { + localPosition: annotationPosition, + //localPosition: Vec3.sum(controller.position, annotation.position), + //localPosition: Vec3.sum(position, annotation.position), + color: annotation.color || { red: 255, green: 100, blue: 100 }, + dimensions: { + x: 0.01, + y: 0.01, + z: 0.01 + }, + parentID: PARENT_ID, + parentJointIndex: controller.jointIndex, + }); + controllerDisplay.overlays.push(overlayID); + + controllerDisplay.annotations[key] = { + overlay: overlayID, + }; + } + + var sign = annotation.direction == "right" ? 1 : -1; + var textOffset = annotation.direction == "right" ? 0.04 : -0.01; + var textOverlayID = Overlays.addOverlay("text3d", { + text: key, + localPosition: Vec3.sum(annotationPosition, Vec3.multiplyQbyV(controller.rotation, { x: textOffset, y: 0, z: 0.0 })), + localRotation: controller.annotationTextRotation, + lineHeight: 0.01, + leftMargin: 0, + rightMargin: 0, + topMargin: 0, + bottomMargin: 0, + backgroundAlpha: 0, + dimensions: { x: 0.003, y: 0.003, z: 0.003 }, + //localPosition: Vec3.sum(controller.position, annotation.position), + //localPosition: Vec3.sum(position, annotation.position), + color: annotation.textColor || { red: 255, green: 255, blue: 255 }, + parentID: PARENT_ID, + parentJointIndex: controller.jointIndex, + }); + controllerDisplay.overlays.push(textOverlayID); + + var offset = { x: 0, y: 0, z: annotation.direction == "right" ? -0.1 : 0.1 }; + var lineOverlayID = Overlays.addOverlay("line3d", { + visible: false, + localPosition: annotationPosition, + localStart: { x: 0, y: 0, z: 0 }, + localEnd: offset, + //localPosition: Vec3.sum(controller.position, annotation.position), + //localPosition: Vec3.sum(position, annotation.position), + color: annotation.color || { red: 255, green: 100, blue: 100 }, + parentID: PARENT_ID, + parentJointIndex: controller.jointIndex, + }); + controllerDisplay.overlays.push(lineOverlayID); + } + } + } + return controllerDisplay; +} + +ControllerDisplay = function() { +}; + +function deleteControllerDisplay(controllerDisplay) { + for (var i = 0; i < controllerDisplay.overlays.length; ++i) { + Overlays.deleteOverlay(controllerDisplay.overlays[i]); + } + Controller.disableMapping(controllerDisplay.mappingName); +} + +// var triggerAnnotationOverlayID = Overlays.addOverlay("text3d", { +// text: "Trigger", +// lineHeight: 0.025, +// backgroundAlpha: 0.0, +// dimensions: { +// x: 0.2, +// y: 0.2, +// }, +// localPosition: Vec3.sum(leftBasePosition, { x: -0.09, y: -0.025, z: 0.03 }), +// localRotation: Quat.multiply(Quat.fromPitchYawRollDegrees(180, 0, 90), leftBaseRotation), +// parentID: MyAvatar.sessionUUID, +// parentJointIndex: MyAvatar.getJointIndex("LeftHand") +// }); + +// var leftOverlayID = Overlays.addOverlay("model", { +// url: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vr_controller_vive_1_5.obj", +// dimensions: naturalDimensions, +// localRotation: leftBaseRotation, +// localPosition: leftBasePosition, +// parentID: PARENT_ID, +// parentJointIndex: LEFT_JOINT_INDEX +// }); +// +// var leftTriggerOverlayID = Overlays.addOverlay("model", { +// url: "C:/Users/Ryan/Assets/controller/touch_l_trigger.fbx", +// visible: false, +// localRotation: leftBaseRotation, +// localPosition: Vec3.sum(leftBasePosition, { x: -0.05, y: -0.025, z: 0.02 }), +// parentID: PARENT_ID, +// parentJointIndex: LEFT_JOINT_INDEX +// }); + +// var rightOverlayID = Overlays.addOverlay("model", { +// url: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vr_controller_vive_1_5.obj", +// dimensions: naturalDimensions, +// localRotation: rightBaseRotation, +// localPosition: rightBasePosition, +// parentID: PARENT_ID, +// parentJointIndex: RIGHT_JOINT_INDEX +// }); +// +// var rightTriggerOverlayID = Overlays.addOverlay("model", { +// url: "C:/Users/Ryan/Assets/controller/touch_r_trigger.fbx", +// visible: false, +// localRotation: rightBaseRotation, +// localPosition: Vec3.sum(rightBasePosition, { x: 0.05, y: -0.025, z: 0.02 }), +// parentID: PARENT_ID, +// parentJointIndex: RIGHT_JOINT_INDEX +// }); +// +var overlays = [ + // leftOverlayID, + // leftTriggerOverlayID, + // triggerAnnotationOverlayID, + + // rightOverlayID, + // rightTriggerOverlayID, +]; +// +// Script.setInterval(function() { +// // var pose = MyAvatar.getLeftHandControllerPoseInWorldFrame(); +// // Overlays.editOverlay(leftOverlayID, { +// // position: pose.translation, +// // rotation: pose.rotation +// // }); +// // pose = MyAvatar.getRightHandControllerPoseInWorldFrame(); +// // Overlays.editOverlay(rightOverlayID, { +// // position: pose.translation, +// // rotation: pose.rotation +// // }); +// }, 10); + + +var MAPPING_NAME = "com.highfidelity.handControllerGrab.disable"; +var mapping = Controller.newMapping(MAPPING_NAME); +mapping.from([Controller.Standard.LT]).to(function(value) { + // print(value); + // Overlays.editOverlay(leftTriggerOverlayID, { + // localRotation: Quat.multiply(Quat.fromPitchYawRollDegrees(0, 0, value * -45), leftBaseRotation) + // }); +}); +mapping.from([Controller.Standard.RT]).to(function(value) { + // print(value); + // Overlays.editOverlay(rightTriggerOverlayID, { + // localRotation: Quat.multiply(Quat.fromPitchYawRollDegrees(0, 0, value * 45), rightBaseRotation) + // }); +}); +Controller.enableMapping(MAPPING_NAME); + +//var c = setupController(TOUCH_CONTROLLER_CONFIGURATION); +//var c = setupController(TOUCH_2_CONTROLLER_CONFIGURATION); +var c = setupController(VIVE_CONTROLLER_CONFIGURATION); +//MyAvatar.shouldRenderLocally = false; +Script.scriptEnding.connect(function() { + deleteControllerDisplay(c); + MyAvatar.shouldRenderLocally = true; + for (var i = 0; i < overlays.length; ++i) { + Overlays.deleteOverlay(overlays[i]); + } + Controller.disableMapping(MAPPING_NAME); +}); From ea71ef91b637db04ab0e9a59955b8f06b437b632 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 1 Sep 2016 09:08:18 -0700 Subject: [PATCH 192/300] Modify tutorial to adjust visiblity of tutorial entities --- tutorial/tutorial.js | 222 +++++++++++++++++++++++++++++++------------ 1 file changed, 159 insertions(+), 63 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 861ceb5545..29713d9ad5 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -1,4 +1,33 @@ + +if (!Function.prototype.bind) { + Function.prototype.bind = function(oThis) { + if (typeof this !== 'function') { + // closest thing possible to the ECMAScript 5 + // internal IsCallable function + throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); + } + + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function() {}, + fBound = function() { + return fToBind.apply(this instanceof fNOP + ? this + : oThis, + aArgs.concat(Array.prototype.slice.call(arguments))); + }; + + if (this.prototype) { + // Function.prototype doesn't have a prototype property + fNOP.prototype = this.prototype; + } + fBound.prototype = new fNOP(); + + return fBound; + }; +} Script.include("entityData.js"); + // // var FAR_GRAB_INPUTS = [ // Controller.Standard.RT @@ -89,8 +118,11 @@ findEntities = function(properties, searchRadius, filterFn) { // On start tutorial... // Load assets -var BOX_SPAWN_NAME = "tutorial/box_spawn"; -var BASKET_COLLIDER_NAME = "tutorial/basket_collider"; +var NEAR_BOX_SPAWN_NAME = "tutorial/nearGrab/box_spawn"; +var FAR_BOX_SPAWN_NAME = "tutorial/farGrab/box_spawn"; +var NEAR_BASKET_COLLIDER_NAME = "tutorial/nearGrab/basket_collider"; +var FAR_BASKET_COLLIDER_NAME = "tutorial/farGrab/basket_collider"; +var GUN_BASKET_COLLIDER_NAME = "tutorial/equip/basket_collider"; var GUN_SPAWN_NAME = "tutorial/gun_spawn"; var GUN_AMMO_NAME = "Tutorial Ping Pong Ball" @@ -113,6 +145,7 @@ function spawn(entityData, transform, modifyFn) { } var id = Entities.addEntity(data); ids.push(id); + print("data:", JSON.stringify(data)); } return ids; } @@ -132,11 +165,34 @@ function spawnWithTag(entityData, transform, tag) { var userData = parseJSON(data.userData); userData.tag = tag; data.userData = JSON.stringify(userData); + print("In modify", tag, userData, data.userData); return data; } return spawn(entityData, transform, modifyFn); } +function deleteEntitiesWithTag(tag) { + print("searching for...:", tag); + var entityIDs = findEntitiesWithTag(tag); + for (var i = 0; i < entityIDs.length; ++i) { + print("Deleteing:", entityIDs[i]); + Entities.deleteEntity(entityIDs[i]); + } +} +function editEntitiesWithTag(tag, propertiesOrFn) { + print("Editing:", tag); + var entityIDs = findEntitiesWithTag(tag); + print("Editing...", entityIDs); + for (var i = 0; i < entityIDs.length; ++i) { + print("Editing...", entityIDs[i]); + if (isFunction(propertiesOrFn)) { + Entities.editEntity(entityIDs[i], propertiesOrFn(entityIDs[i])); + } else { + Entities.editEntity(entityIDs[i], propertiesOrFn); + } + } +} + function findEntitiesWithTag(tag) { return findEntities({ userData: "" }, 10000, function(properties, key, value) { data = parseJSON(value); @@ -144,6 +200,12 @@ function findEntitiesWithTag(tag) { }); } +// From http://stackoverflow.com/questions/5999998/how-can-i-check-if-a-javascript-variable-is-function-type +function isFunction(functionToCheck) { + var getType = {}; + return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; +} + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // // @@ -176,6 +238,7 @@ stepDisableControllers.prototype = { /////////////////////////////////////////////////////////////////////////////// var stepRaiseAboveHead = function(name) { this.tag = name; + this.tempTag = name + "-temporary"; } stepRaiseAboveHead.prototype = { start: function(onFinish) { @@ -196,13 +259,17 @@ stepRaiseAboveHead.prototype = { }; // Spawn content set - spawnWithTag(HandsAboveHeadData, defaultTransform, tag); + //spawnWithTag(HandsAboveHeadData, defaultTransform, tag); + print("raise hands...", this.tag); + editEntitiesWithTag(this.tag, { visible: true }); - var checkIntervalID = null; + + this.checkIntervalID = null; function checkForHandsAboveHead() { print("Checking..."); if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { - Script.clearInterval(checkIntervalID); + Script.clearInterval(this.checkIntervalID); + this.checkIntervalID = null; this.soundInjector = Audio.playSound(successSound, { position: defaultTransform.position, volume: 0.7, @@ -211,15 +278,14 @@ stepRaiseAboveHead.prototype = { onFinish(); } } - checkIntervalID = Script.setInterval(checkForHandsAboveHead, 500); + this.checkIntervalID = Script.setInterval(checkForHandsAboveHead.bind(this), 500); }, cleanup: function() { - var entityIDs = findEntitiesWithTag(this.tag); - print("entities: ", entityIDs.length); - for (var i = 0; i < entityIDs.length; ++i) { - print("Deleting: ", entityIDs[i]); - Entities.deleteEntity(entityIDs[i]); + if (this.checkIntervalID != null) { + Script.clearInterval(this.checkIntervalID); } + editEntitiesWithTag(this.tag, { visible: false, collisionless: 1 }); + deleteEntitiesWithTag(this.tempTag); } }; @@ -233,32 +299,34 @@ stepRaiseAboveHead.prototype = { /////////////////////////////////////////////////////////////////////////////// var stepNearGrab = function(name) { this.tag = name; + this.tempTag = name + "-temporary"; } stepNearGrab.prototype = { start: function(onFinish) { var tag = this.tag; // Spawn content set - spawnWithTag(Step1EntityData, null, tag); + //spawnWithTag(Step1EntityData, null, tag); + editEntitiesWithTag(this.tag, { visible: true }); - var basketColliderID = findEntity({ name: BASKET_COLLIDER_NAME }, 10000); + var basketColliderID = findEntity({ name: NEAR_BASKET_COLLIDER_NAME }, 10000); var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; function createBlock() { - var boxSpawnID = findEntity({ name: BOX_SPAWN_NAME }, 10000); + var boxSpawnID = findEntity({ name: NEAR_BOX_SPAWN_NAME }, 10000); if (!boxSpawnID) { print("Error creating block, cannot find spawn"); return null; } Step1BlockData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; - return spawnWithTag([Step1BlockData], null, tag)[0]; + return spawnWithTag([Step1BlockData], null, this.tempTag)[0]; } // Enabled grab // Create table ? // Create blocks and basket - var boxID = createBlock(); + var boxID = createBlock.bind(this)(); print("Created", boxID); function onHit() { @@ -268,7 +336,7 @@ stepNearGrab.prototype = { // When block collides with basket start step 2 var checkCollidesTimer = null; function checkCollides() { - print("CHECKING..."); + print(this.tag, "CHECKING..."); if (Vec3.distance(basketPosition, Entities.getEntityProperties(boxID, 'position').position) < 0.1) { Script.clearInterval(checkCollidesTimer); this.soundInjector = Audio.playSound(successSound, { @@ -276,20 +344,16 @@ stepNearGrab.prototype = { volume: 0.7, loop: false }); - Script.setTimeout(onHit, 1000); + Script.setTimeout(onHit.bind(this), 1000); } } - checkCollidesTimer = Script.setInterval(checkCollides, 500); + checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, cleanup: function() { - var entityIDs = findEntitiesWithTag(this.tag); - print("entities: ", entityIDs.length); - for (var i = 0; i < entityIDs.length; ++i) { - print("Deleting: ", entityIDs[i]); - Entities.deleteEntity(entityIDs[i]); - } + editEntitiesWithTag(this.tag, { visible: false}); + deleteEntitiesWithTag(this.tempTag); } }; @@ -303,6 +367,7 @@ stepNearGrab.prototype = { /////////////////////////////////////////////////////////////////////////////// var stepFarGrab = function(name) { this.tag = name; + this.tempTag = name + "-temporary"; } stepFarGrab.prototype = { start: function(onFinish) { @@ -316,26 +381,27 @@ stepFarGrab.prototype = { } // Spawn content set - spawnWithTag(Step1EntityData, transform, tag); + //spawnWithTag(Step1EntityData, transform, tag); + editEntitiesWithTag(this.tag, { visible: true}); - var basketColliderID = findEntity({ name: BASKET_COLLIDER_NAME }, 10000); + var basketColliderID = findEntity({ name: FAR_BASKET_COLLIDER_NAME }, 10000); var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; function createBlock() { - var boxSpawnID = findEntity({ name: BOX_SPAWN_NAME }, 10000); + var boxSpawnID = findEntity({ name: FAR_BOX_SPAWN_NAME }, 10000); if (!boxSpawnID) { print("Error creating block, cannot find spawn"); return null; } Step1BlockData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; - return spawnWithTag([Step1BlockData], null, tag)[0]; + return spawnWithTag([Step1BlockData], null, this.tempTag)[0]; } // Enabled grab // Create table ? // Create blocks and basket - var boxID = createBlock(); + var boxID = createBlock.bind(this)(); print("Created", boxID); function onHit() { @@ -353,20 +419,16 @@ stepFarGrab.prototype = { volume: 0.7, loop: false }); - Script.setTimeout(onHit, 1000); + Script.setTimeout(onHit.bind(this), 1000); } } - checkCollidesTimer = Script.setInterval(checkCollides, 500); + checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, cleanup: function() { - var entityIDs = findEntitiesWithTag(this.tag); - print("entities: ", entityIDs.length); - for (var i = 0; i < entityIDs.length; ++i) { - print("Deleting: ", entityIDs[i]); - Entities.deleteEntity(entityIDs[i]); - } + editEntitiesWithTag(this.tag, { visible: false}); + deleteEntitiesWithTag(this.tempTag); } }; @@ -380,6 +442,7 @@ stepFarGrab.prototype = { /////////////////////////////////////////////////////////////////////////////// var stepEquip = function(name) { this.tag = name; + this.tempTag = name + "-temporary"; } stepEquip.prototype = { start: function(onFinish) { @@ -404,9 +467,10 @@ stepEquip.prototype = { }; // Spawn content set - spawnWithTag(StepGunData, defaultTransform, tag); + //spawnWithTag(StepGunData, defaultTransform, tag); + editEntitiesWithTag(this.tag, { visible: true}); - var basketColliderID = findEntity({ name: BASKET_COLLIDER_NAME }, 10000); + var basketColliderID = findEntity({ name: GUN_BASKET_COLLIDER_NAME }, 10000); var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; function createGun() { @@ -419,13 +483,13 @@ stepEquip.prototype = { GunData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; Vec3.print("spawn", GunData.position); print("Adding: ", JSON.stringify(GunData)); - return spawnWithTag([GunData], null, tag)[0]; + return spawnWithTag([GunData], null, this.tempTag)[0]; } // Enabled grab // Create table ? // Create blocks and basket - var gunID = createGun(); + var gunID = createGun.bind(this)(); print("Created", gunID); function onHit() { @@ -445,21 +509,17 @@ stepEquip.prototype = { volume: 0.7, loop: false }); - Script.setTimeout(onHit, 1000); + Script.setTimeout(onHit.bind(this), 1000); } } } - checkCollidesTimer = Script.setInterval(checkCollides, 500); + checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, cleanup: function() { - var entityIDs = findEntitiesWithTag(this.tag); - print("entities: ", entityIDs.length); - for (var i = 0; i < entityIDs.length; ++i) { - print("Deleting: ", entityIDs[i]); - Entities.deleteEntity(entityIDs[i]); - } + editEntitiesWithTag(this.tag, { visible: false}); + deleteEntitiesWithTag(this.tempTag); } }; @@ -473,22 +533,45 @@ stepEquip.prototype = { /////////////////////////////////////////////////////////////////////////////// var stepTeleport = function(name) { this.tag = name; + this.tempTag = name + "-temporary"; } stepTeleport.prototype = { start: function(onFinish) { Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); Menu.setIsOptionChecked("Overlays", false); + + editEntitiesWithTag(this.tag, { visible: true }); }, cleanup: function() { - var entityIDs = findEntitiesWithTag(this.tag); - print("entities: ", entityIDs.length); - for (var i = 0; i < entityIDs.length; ++i) { - print("Deleting: ", entityIDs[i]); - Entities.deleteEntity(entityIDs[i]); - } + editEntitiesWithTag(this.tag, { visible: false }); + deleteEntitiesWithTag(this.tempTag); } }; +function showEntitiesWithTag(tag) { + editEntitiesWithTag(tag, function(entityID) { + var userData = Entities.getEntityProperties(entityID, "userData").userData; + var data = parseJSON(userData); + var newProperties = { + visible: data.visible == false ? false : true, + collisionless: data.collisionless == false ? false : true, + }; + Entities.editEntity(entityID, newProperties); + }); +} +function hideEntitiesWithTag(tag) { + editEntitiesWithTag(tag, function(entityID) { + var userData = Entities.getEntityProperties(entityID, "userData").userData; + var data = parseJSON(userData); + var newProperties = { + visible: false, + collisionless: 1, + ignoreForCollisions: 1, + }; + Entities.editEntity(entityID, newProperties); + }); +} + @@ -501,11 +584,11 @@ function startTutorial() { currentStepNum = -1; currentStep = null; STEPS = [ - new stepDisableControllers("step0"), - //new stepRaiseAboveHead("step1"), - new stepNearGrab("step2"), - new stepFarGrab("step3"), - new stepEquip("step4"), + //new stepDisableControllers("step0"), + new stepRaiseAboveHead("raiseHands"), + new stepNearGrab("nearGrab"), + new stepFarGrab("farGrab"), + new stepEquip("equip"), new stepTeleport("teleport"), ] startNextStep(); @@ -513,7 +596,7 @@ function startTutorial() { function startNextStep() { if (currentStep) { - //currentStep.cleanup(); + currentStep.cleanup(); } ++currentStepNum; @@ -525,7 +608,6 @@ function startNextStep() { print("Starting step", currentStepNum); currentStep = STEPS[currentStepNum]; currentStep.start(startNextStep); - startNextStep(); } } @@ -536,6 +618,8 @@ function stopTutorial() { if (currentStep) { currentStep.cleanup(); } + currentStepNum = -1; + currentStep = null; } location = "/tutorial"; @@ -543,3 +627,15 @@ startTutorial(); Script.scriptEnding.connect(stopTutorial); + + +Controller.keyReleaseEvent.connect(function (event) { + if (event.text == ",") { + startNextStep(); + } else if (event.text == ".") { + stopTutorial(); + } else if (event.text == "r") { + stopTutorial(); + startTutorial(); + } +}); From a1280d0958ee4e707bc9cd2e6ed7a8816091e46e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 1 Sep 2016 10:54:01 -0700 Subject: [PATCH 193/300] Update vive controller model --- tutorial/viveHandsv2.js | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 715dffe089..a483af7c26 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -1,8 +1,8 @@ var PARENT_ID = MyAvatar.sessionUUID; var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"); var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"); -var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("LeftHand"); -var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("RightHand"); +//var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("LeftHand"); +//var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("RightHand"); var zeroPosition = { x: 0, y: 0, z: 0 }; var zeroRotation = { x: 0, y: 0, z: 0, w: 1 }; @@ -25,7 +25,6 @@ var naturalPositionR = { z: 0.06380049744620919 }; -// THe CONTROLLER_LEFTHAND var leftBasePosition = { x: CONTROLLER_LENGTH_OFFSET / 2, y: CONTROLLER_LENGTH_OFFSET * 2, @@ -221,13 +220,13 @@ var viveNaturalPosition = { y: -0.034076502197422087, z: 0.06380049744620919 }; +var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive2.fbx"; var VIVE_CONTROLLER_CONFIGURATION = { name: "Vive", controllers: [ { - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vr_controller_vive_1_5.obj", - modelURL: "C:\\Users\\Ryan\\Assets\\controller\\vive2.fbx", + modelURL: viveModelURL, jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"), naturalPosition: viveNaturalPosition, rotation: leftBaseRotation, @@ -331,15 +330,9 @@ var VIVE_CONTROLLER_CONFIGURATION = { }, }, { - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vr_controller_vive_1_5.obj", - modelURL: "C:\\Users\\Ryan\\Assets\\controller\\vive2.fbx", + modelURL: viveModelURL, jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), - //rotation: rightBaseRotation, - //position: rightBasePosition, - //position: Vec3.sum(Vec3.multiplyQbyV(rightBaseRotation, naturalPositionR), rightBasePositionVive), - //rotation: zeroRotation, - //position: zeroPosition, rotation: rightBaseRotation, position: Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, 0, -45), rightBasePosition), @@ -350,8 +343,6 @@ var VIVE_CONTROLLER_CONFIGURATION = { y: -0.034076502197422087, z: 0.06380049744620919 }, - //rotation: touchRightBaseRotation, - //position: rightBasePosition, annotationTextRotation: Quat.fromPitchYawRollDegrees(20, -90, 0), annotations: { From 54498a8f3fdef3b4b628ad8ee82be87e3cdebf72 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 1 Sep 2016 14:56:11 -0700 Subject: [PATCH 194/300] Add the ability to ignore invisible entities in findRayIntersection --- interface/src/ui/overlays/Line3DOverlay.cpp | 12 ++ plugins/openvr/src/OpenVrHelpers.cpp | 2 + tutorial/tutorial.js | 168 +++++++++++++++++--- tutorial/viveHandsv2.js | 2 +- 4 files changed, 160 insertions(+), 24 deletions(-) diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index c3a6c5920e..1616d4c2e2 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -124,6 +124,12 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { } properties.remove("start"); // so that Base3DOverlay doesn't respond to it + auto localStart = properties["localStart"]; + if (localStart.isValid()) { + _start = vec3FromVariant(localStart); + } + properties.remove("localStart"); // so that Base3DOverlay doesn't respond to it + auto end = properties["end"]; // if "end" property was not there, check to see if they included aliases: endPoint if (!end.isValid()) { @@ -133,6 +139,12 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { setEnd(vec3FromVariant(end)); } + auto localEnd = properties["localEnd"]; + if (localEnd.isValid()) { + _end = vec3FromVariant(localEnd); + } + properties.remove("localEnd"); // so that Base3DOverlay doesn't respond to it + auto glow = properties["glow"]; if (glow.isValid()) { setGlow(glow.toFloat()); diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index f5e36492bd..4429eb274f 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -296,6 +296,8 @@ controller::Pose openVrControllerPoseToHandPose(bool isLeftHand, const mat4& mat auto translationOffset = (isLeftHand ? leftTranslationOffset : rightTranslationOffset); auto rotationOffset = (isLeftHand ? leftRotationOffset : rightRotationOffset); + //qDebug() << "TRANSLATION OFFSET: " << isLeftHand << ", " << translationOffset.x << ", " << translationOffset.y << ", " << translationOffset.z; + glm::vec3 position = extractTranslation(mat); glm::quat rotation = glm::normalize(glm::quat_cast(mat)); diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 29713d9ad5..b6b5fdd79d 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -125,6 +125,7 @@ var FAR_BASKET_COLLIDER_NAME = "tutorial/farGrab/basket_collider"; var GUN_BASKET_COLLIDER_NAME = "tutorial/equip/basket_collider"; var GUN_SPAWN_NAME = "tutorial/gun_spawn"; var GUN_AMMO_NAME = "Tutorial Ping Pong Ball" +var TELEPORT_PAD_NAME = "tutorial/teleport/pad" function spawn(entityData, transform, modifyFn) { print("Creating: ", entityData); @@ -145,7 +146,7 @@ function spawn(entityData, transform, modifyFn) { } var id = Entities.addEntity(data); ids.push(id); - print("data:", JSON.stringify(data)); + print(id, "data:", JSON.stringify(data)); } return ids; } @@ -307,7 +308,7 @@ stepNearGrab.prototype = { // Spawn content set //spawnWithTag(Step1EntityData, null, tag); - editEntitiesWithTag(this.tag, { visible: true }); + showEntitiesWithTag(this.tag, { visible: true }); var basketColliderID = findEntity({ name: NEAR_BASKET_COLLIDER_NAME }, 10000); var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; @@ -334,11 +335,11 @@ stepNearGrab.prototype = { } // When block collides with basket start step 2 - var checkCollidesTimer = null; function checkCollides() { print(this.tag, "CHECKING..."); if (Vec3.distance(basketPosition, Entities.getEntityProperties(boxID, 'position').position) < 0.1) { - Script.clearInterval(checkCollidesTimer); + Script.clearInterval(this.checkCollidesTimer); + this.checkCollidesTimer = null; this.soundInjector = Audio.playSound(successSound, { position: basketPosition, volume: 0.7, @@ -347,12 +348,15 @@ stepNearGrab.prototype = { Script.setTimeout(onHit.bind(this), 1000); } } - checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); + this.checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, cleanup: function() { - editEntitiesWithTag(this.tag, { visible: false}); + if (this.checkCollidesTimer) { + Script.clearInterval(this.checkCollidesTimer); + } + hideEntitiesWithTag(this.tag, { visible: false}); deleteEntitiesWithTag(this.tempTag); } }; @@ -382,7 +386,7 @@ stepFarGrab.prototype = { // Spawn content set //spawnWithTag(Step1EntityData, transform, tag); - editEntitiesWithTag(this.tag, { visible: true}); + showEntitiesWithTag(this.tag); var basketColliderID = findEntity({ name: FAR_BASKET_COLLIDER_NAME }, 10000); var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; @@ -427,7 +431,7 @@ stepFarGrab.prototype = { // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, cleanup: function() { - editEntitiesWithTag(this.tag, { visible: false}); + hideEntitiesWithTag(this.tag, { visible: false}); deleteEntitiesWithTag(this.tempTag); } }; @@ -442,6 +446,8 @@ stepFarGrab.prototype = { /////////////////////////////////////////////////////////////////////////////// var stepEquip = function(name) { this.tag = name; + this.tagPart1 = name + "-part1"; + this.tagPart2 = name + "-part2"; this.tempTag = name + "-temporary"; } stepEquip.prototype = { @@ -468,7 +474,8 @@ stepEquip.prototype = { // Spawn content set //spawnWithTag(StepGunData, defaultTransform, tag); - editEntitiesWithTag(this.tag, { visible: true}); + showEntitiesWithTag(this.tag); + showEntitiesWithTag(this.tagPart1); var basketColliderID = findEntity({ name: GUN_BASKET_COLLIDER_NAME }, 10000); var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; @@ -481,6 +488,7 @@ stepEquip.prototype = { } GunData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; + GunData.rotation = Entities.getEntityProperties(boxSpawnID, 'rotation').rotation; Vec3.print("spawn", GunData.position); print("Adding: ", JSON.stringify(GunData)); return spawnWithTag([GunData], null, this.tempTag)[0]; @@ -489,21 +497,26 @@ stepEquip.prototype = { // Enabled grab // Create table ? // Create blocks and basket - var gunID = createGun.bind(this)(); - print("Created", gunID); + this.gunID = createGun.bind(this)(); + print("Created", this.gunID); + this.onFinish = onFinish; function onHit() { - onFinish(); + hideEntitiesWithTag(this.tagPart1); + showEntitiesWithTag(this.tagPart2); + print("HIT, wiating for unequip..."); + Messages.subscribe('Hifi-Object-Manipulation'); + Messages.messageReceived.connect(this.onMessage.bind(this)); } // When block collides with basket start step 2 - var checkCollidesTimer = null; function checkCollides() { - print("CHECKING..."); + print("CHECKING FOR PING PONG..."); var ammoIDs = findEntities({ name: GUN_AMMO_NAME }, 15); for (var i = 0; i < ammoIDs.length; ++i) { if (Vec3.distance(basketPosition, Entities.getEntityProperties(ammoIDs[i], 'position').position) < 0.2) { - Script.clearInterval(checkCollidesTimer); + Script.clearInterval(this.checkCollidesTimer); + this.checkCollidesTimer = null; this.soundInjector = Audio.playSound(successSound, { position: basketPosition, volume: 0.7, @@ -513,18 +526,63 @@ stepEquip.prototype = { } } } - checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); + this.checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, + onMessage: function(channel, message, sender) { + print("Got message", channel, message, sender, MyAvatar.sessionUUID); + //if (sender === MyAvatar.sessionUUID) { + var data = parseJSON(message); + print("Here", data.action, data.grabbedEntity, this.gunID); + if (data.action == 'release' && data.grabbedEntity == this.gunID) { + print("FINISHED"); + this.onFinish(); + } + //} + }, cleanup: function() { - editEntitiesWithTag(this.tag, { visible: false}); + try { + Messages.messageReceived.disconnect(this.onMessage); + } catch(e) { + print("error disconnecting"); + } + if (this.checkCollidesTimer) { + Script.clearInterval(this.checkCollidesTimer); + } + hideEntitiesWithTag(this.tagPart1); + hideEntitiesWithTag(this.tagPart2); + hideEntitiesWithTag(this.tag); deleteEntitiesWithTag(this.tempTag); } }; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: Turn Around // +// // +/////////////////////////////////////////////////////////////////////////////// +var stepTurnAround = function(name) { + this.tag = name; + this.tempTag = name + "-temporary"; +} +stepTurnAround.prototype = { + start: function(onFinish) { + showEntitiesWithTag(this.tag); + }, + cleanup: function() { + hideEntitiesWithTag(this.tag); + deleteEntitiesWithTag(this.tempTag); + } +}; + + + + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // // @@ -538,23 +596,79 @@ var stepTeleport = function(name) { stepTeleport.prototype = { start: function(onFinish) { Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); - Menu.setIsOptionChecked("Overlays", false); + Menu.setIsOptionChecked("Overlays", true); - editEntitiesWithTag(this.tag, { visible: true }); + // Wait until touching teleport pad... + var padID = findEntity({ name: TELEPORT_PAD_NAME }, 100); + print(padID); + var padProps = Entities.getEntityProperties(padID, ["position", "dimensions"]); + print(Object.keys(padProps)); + var xMin = padProps.position.x - padProps.dimensions.x / 2; + var xMax = padProps.position.x + padProps.dimensions.x / 2; + var zMin = padProps.position.z - padProps.dimensions.z / 2; + var zMax = padProps.position.z + padProps.dimensions.z / 2; + function checkCollides() { + print("Checking if on pad..."); + var pos = MyAvatar.position; + print('x', pos.x, xMin, xMax); + print('z', pos.z, zMin, zMax); + if (pos.x > xMin && pos.x < xMax && pos.z > zMin && pos.z < zMax) { + print("On pad!!"); + Script.clearInterval(this.checkCollidesTimer); + this.checkCollidesTimer = null; + onFinish(); + } + } + this.checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); + + showEntitiesWithTag(this.tag); }, cleanup: function() { - editEntitiesWithTag(this.tag, { visible: false }); + if (this.checkCollidesTimer) { + Script.clearInterval(this.checkCollidesTimer); + } + hideEntitiesWithTag(this.tag); deleteEntitiesWithTag(this.tempTag); } }; + + + + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: Finish // +// // +/////////////////////////////////////////////////////////////////////////////// +var stepFinish = function(name) { + this.tag = name; + this.tempTag = name + "-temporary"; +} +stepFinish.prototype = { + start: function(onFinish) { + showEntitiesWithTag(this.tag); + }, + cleanup: function() { + hideEntitiesWithTag(this.tag); + deleteEntitiesWithTag(this.tempTag); + } +}; + + + + + + function showEntitiesWithTag(tag) { editEntitiesWithTag(tag, function(entityID) { var userData = Entities.getEntityProperties(entityID, "userData").userData; var data = parseJSON(userData); var newProperties = { visible: data.visible == false ? false : true, - collisionless: data.collisionless == false ? false : true, + collisionless: data.visible == false ? true : false , + //collisionless: data.collisionless == true ? true : false, }; Entities.editEntity(entityID, newProperties); }); @@ -584,12 +698,14 @@ function startTutorial() { currentStepNum = -1; currentStep = null; STEPS = [ - //new stepDisableControllers("step0"), + new stepDisableControllers("step0"), new stepRaiseAboveHead("raiseHands"), new stepNearGrab("nearGrab"), new stepFarGrab("farGrab"), new stepEquip("equip"), + new stepTurnAround("turnAround"), new stepTeleport("teleport"), + new stepFinish("finish"), ] startNextStep(); } @@ -604,10 +720,14 @@ function startNextStep() { if (currentStepNum >= STEPS.length) { // Done print("DONE WITH TUTORIAL"); + currentStepNum = -1; + currentStep = null; + return false; } else { print("Starting step", currentStepNum); currentStep = STEPS[currentStepNum]; currentStep.start(startNextStep); + return true; } } @@ -631,7 +751,9 @@ Script.scriptEnding.connect(stopTutorial); Controller.keyReleaseEvent.connect(function (event) { if (event.text == ",") { - startNextStep(); + if (!startNextStep()) { + startTutorial(); + } } else if (event.text == ".") { stopTutorial(); } else if (event.text == "r") { diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index a483af7c26..986a47e398 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -1,4 +1,4 @@ -var PARENT_ID = MyAvatar.sessionUUID; +var PARENT_ID = "{00000000-0000-0000-0000-000000000001}"; var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"); var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"); //var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("LeftHand"); From de757698eaab4c7433b40fccdc71fa6cf8dc9aa9 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 1 Sep 2016 15:33:12 -0700 Subject: [PATCH 195/300] Disable ray picking against invisible objects in far grab and teleport --- tutorial/viveHandsv2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 986a47e398..a483af7c26 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -1,4 +1,4 @@ -var PARENT_ID = "{00000000-0000-0000-0000-000000000001}"; +var PARENT_ID = MyAvatar.sessionUUID; var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"); var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"); //var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("LeftHand"); From 5d9cc4782dd61897bc5ee8ec19135a8c6bb26791 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 1 Sep 2016 16:47:01 -0700 Subject: [PATCH 196/300] Fix annotations --- tutorial/tutorial.js | 20 ++++++ tutorial/viveHandsv2.js | 142 ++++++++++++++++------------------------ 2 files changed, 75 insertions(+), 87 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index b6b5fdd79d..211725a591 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -290,6 +290,12 @@ stepRaiseAboveHead.prototype = { } }; +function setControllerVisible(name, visible) { + Messages.sendLocalMessage('Controller-Display', JSON.stringify({ + name: name, + visible: visible, + })); +} /////////////////////////////////////////////////////////////////////////////// @@ -304,6 +310,7 @@ var stepNearGrab = function(name) { } stepNearGrab.prototype = { start: function(onFinish) { + setControllerVisible("trigger", true); var tag = this.tag; // Spawn content set @@ -353,6 +360,7 @@ stepNearGrab.prototype = { // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, cleanup: function() { + setControllerVisible("trigger", false); if (this.checkCollidesTimer) { Script.clearInterval(this.checkCollidesTimer); } @@ -375,6 +383,7 @@ var stepFarGrab = function(name) { } stepFarGrab.prototype = { start: function(onFinish) { + setControllerVisible("trigger", true); Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ farGrabEnabled: true, })); @@ -431,6 +440,7 @@ stepFarGrab.prototype = { // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, cleanup: function() { + setControllerVisible("trigger", false); hideEntitiesWithTag(this.tag, { visible: false}); deleteEntitiesWithTag(this.tempTag); } @@ -452,6 +462,7 @@ var stepEquip = function(name) { } stepEquip.prototype = { start: function(onFinish) { + setControllerVisible("trigger", true); Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ holdEnabled: true, })); @@ -523,6 +534,7 @@ stepEquip.prototype = { loop: false }); Script.setTimeout(onHit.bind(this), 1000); + return; } } } @@ -542,6 +554,7 @@ stepEquip.prototype = { //} }, cleanup: function() { + setControllerVisible("trigger", false); try { Messages.messageReceived.disconnect(this.onMessage); } catch(e) { @@ -595,6 +608,7 @@ var stepTeleport = function(name) { } stepTeleport.prototype = { start: function(onFinish) { + setControllerVisible("teleport", true); Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); Menu.setIsOptionChecked("Overlays", true); @@ -624,6 +638,7 @@ stepTeleport.prototype = { showEntitiesWithTag(this.tag); }, cleanup: function() { + setControllerVisible("teleport", false); if (this.checkCollidesTimer) { Script.clearInterval(this.checkCollidesTimer); } @@ -761,3 +776,8 @@ Controller.keyReleaseEvent.connect(function (event) { startTutorial(); } }); + +// Messages.sendLocalMessage('Controller-Display', JSON.stringify({ +// name: "menu", +// visible: false, +// })); diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index a483af7c26..df3392f831 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -234,7 +234,7 @@ var VIVE_CONTROLLER_CONFIGURATION = { dimensions: viveNaturalDimensions, - annotationTextRotation: Quat.fromPitchYawRollDegrees(20, -90, 0), + annotationTextRotation: Quat.fromPitchYawRollDegrees(45, -90, 0), annotations: { // red: { // debug: true, @@ -277,11 +277,12 @@ var VIVE_CONTROLLER_CONFIGURATION = { // color: { red: 255, green: 255, blue: 255 }, // }, - center: { - position: zeroPosition, - direction: "center", - color: { red: 100, green: 255, blue: 255 }, - }, + // center: { + // position: zeroPosition, + // direction: "center", + // color: { red: 100, green: 255, blue: 255 }, + // }, + trigger: { position: { x: 0, @@ -309,7 +310,8 @@ var VIVE_CONTROLLER_CONFIGURATION = { direction: "left", color: { red: 255, green: 100, blue: 100 }, }, - pad: { + teleport: { + textOffset: { x: -0.015, y: 0.004, z: -0.005 }, position: { x: 0, y: 0.00378, @@ -344,9 +346,8 @@ var VIVE_CONTROLLER_CONFIGURATION = { z: 0.06380049744620919 }, - annotationTextRotation: Quat.fromPitchYawRollDegrees(20, -90, 0), + annotationTextRotation: Quat.fromPitchYawRollDegrees(180 + 45, 90, 180), annotations: { - trigger: { position: { x: 0, @@ -374,7 +375,8 @@ var VIVE_CONTROLLER_CONFIGURATION = { direction: "left", color: { red: 255, green: 100, blue: 100 }, }, - pad: { + teleport: { + textOffset: { x: -0.015, y: 0.004, z: -0.005 }, position: { x: 0, y: 0.00378, @@ -397,7 +399,8 @@ var VIVE_CONTROLLER_CONFIGURATION = { ] } -var DEBUG = true; +var DEBUG = false; +var VISIBLE_BY_DEFAULT = false; function setupController(config) { var controllerDisplay = { @@ -445,16 +448,20 @@ function setupController(config) { }); controllerDisplay.overlays.push(overlayID); - controllerDisplay.annotations[key] = { - overlay: overlayID, - }; } + var ANNOTATION_TEXT_OFFSET = 0.1; var sign = annotation.direction == "right" ? 1 : -1; - var textOffset = annotation.direction == "right" ? 0.04 : -0.01; + var textOffset = annotation.direction == "right" ? 0.08 : 0.02; + if (annotation.textOffset) { + var pos = Vec3.sum(annotationPosition, Vec3.multiplyQbyV(controller.rotation, annotation.textOffset)); + } else { + var pos = Vec3.sum(annotationPosition, Vec3.multiplyQbyV(controller.rotation, { x: textOffset, y: 0, z: -0.005 })); + } var textOverlayID = Overlays.addOverlay("text3d", { + visible: VISIBLE_BY_DEFAULT, text: key, - localPosition: Vec3.sum(annotationPosition, Vec3.multiplyQbyV(controller.rotation, { x: textOffset, y: 0, z: 0.0 })), + localPosition: pos, localRotation: controller.annotationTextRotation, lineHeight: 0.01, leftMargin: 0, @@ -469,9 +476,16 @@ function setupController(config) { parentID: PARENT_ID, parentJointIndex: controller.jointIndex, }); - controllerDisplay.overlays.push(textOverlayID); - var offset = { x: 0, y: 0, z: annotation.direction == "right" ? -0.1 : 0.1 }; + controllerDisplay.overlays.push(textOverlayID); + if (key in controllerDisplay.annotations) { + controllerDisplay.annotations[key].push(textOverlayID); + } else { + controllerDisplay.annotations[key] = [textOverlayID]; + } + + var ANNOTATION_OFFSET = 0.5; + var offset = { x: 0, y: 0, z: annotation.direction == "right" ? -1 * ANNOTATION_OFFSET : ANNOTATION_OFFSET }; var lineOverlayID = Overlays.addOverlay("line3d", { visible: false, localPosition: annotationPosition, @@ -500,79 +514,33 @@ function deleteControllerDisplay(controllerDisplay) { Controller.disableMapping(controllerDisplay.mappingName); } -// var triggerAnnotationOverlayID = Overlays.addOverlay("text3d", { -// text: "Trigger", -// lineHeight: 0.025, -// backgroundAlpha: 0.0, -// dimensions: { -// x: 0.2, -// y: 0.2, -// }, -// localPosition: Vec3.sum(leftBasePosition, { x: -0.09, y: -0.025, z: 0.03 }), -// localRotation: Quat.multiply(Quat.fromPitchYawRollDegrees(180, 0, 90), leftBaseRotation), -// parentID: MyAvatar.sessionUUID, -// parentJointIndex: MyAvatar.getJointIndex("LeftHand") -// }); - -// var leftOverlayID = Overlays.addOverlay("model", { -// url: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vr_controller_vive_1_5.obj", -// dimensions: naturalDimensions, -// localRotation: leftBaseRotation, -// localPosition: leftBasePosition, -// parentID: PARENT_ID, -// parentJointIndex: LEFT_JOINT_INDEX -// }); -// -// var leftTriggerOverlayID = Overlays.addOverlay("model", { -// url: "C:/Users/Ryan/Assets/controller/touch_l_trigger.fbx", -// visible: false, -// localRotation: leftBaseRotation, -// localPosition: Vec3.sum(leftBasePosition, { x: -0.05, y: -0.025, z: 0.02 }), -// parentID: PARENT_ID, -// parentJointIndex: LEFT_JOINT_INDEX -// }); - -// var rightOverlayID = Overlays.addOverlay("model", { -// url: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vr_controller_vive_1_5.obj", -// dimensions: naturalDimensions, -// localRotation: rightBaseRotation, -// localPosition: rightBasePosition, -// parentID: PARENT_ID, -// parentJointIndex: RIGHT_JOINT_INDEX -// }); -// -// var rightTriggerOverlayID = Overlays.addOverlay("model", { -// url: "C:/Users/Ryan/Assets/controller/touch_r_trigger.fbx", -// visible: false, -// localRotation: rightBaseRotation, -// localPosition: Vec3.sum(rightBasePosition, { x: 0.05, y: -0.025, z: 0.02 }), -// parentID: PARENT_ID, -// parentJointIndex: RIGHT_JOINT_INDEX -// }); -// var overlays = [ - // leftOverlayID, - // leftTriggerOverlayID, - // triggerAnnotationOverlayID, - - // rightOverlayID, - // rightTriggerOverlayID, ]; -// -// Script.setInterval(function() { -// // var pose = MyAvatar.getLeftHandControllerPoseInWorldFrame(); -// // Overlays.editOverlay(leftOverlayID, { -// // position: pose.translation, -// // rotation: pose.rotation -// // }); -// // pose = MyAvatar.getRightHandControllerPoseInWorldFrame(); -// // Overlays.editOverlay(rightOverlayID, { -// // position: pose.translation, -// // rotation: pose.rotation -// // }); -// }, 10); +Messages.subscribe('Controller-Display'); +var handleMessages = function(channel, message, sender) { + print("MESSASGE>>>>", channel, message, sender); + if (sender === MyAvatar.sessionUUID) { + if (channel === 'Controller-Display') { + print('here'); + var data = JSON.parse(message); + var name = data.name; + var visible = data.visible; + //c.setDisplayAnnotation(name, visible); + if (name in c.annotations) { + print("hiding"); + for (var i = 0; i < c.annotations[name].length; ++i) { + print("hiding", i); + Overlays.editOverlay(c.annotations[name][i], { visible: visible }); + } + } + } + } +} + +Messages.messageReceived.connect(handleMessages); + var MAPPING_NAME = "com.highfidelity.handControllerGrab.disable"; var mapping = Controller.newMapping(MAPPING_NAME); mapping.from([Controller.Standard.LT]).to(function(value) { From e8a1f50aeedbf655cccd75292fd8cfb54de037ff Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 08:47:09 -0700 Subject: [PATCH 197/300] Ready for user testing v1 --- tutorial/tutorial.js | 60 +++++++++++++++++++++++++++++++++++++++-- tutorial/viveHandsv2.js | 6 ++--- 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 211725a591..bdad34e9bc 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -207,6 +207,27 @@ function isFunction(functionToCheck) { return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; } + var defaultTransform = { + position: { + x: 0.2459, + y: 0.9011, + z: 0.7266 + }, + rotation: { + x: 0, + y: 0, + z: 0, + w: 1 + } + }; +function playSuccessSound() { + this.soundInjector = Audio.playSound(successSound, { + position: defaultTransform.position, + volume: 0.7, + loop: false + }); +} + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // // @@ -488,6 +509,8 @@ stepEquip.prototype = { showEntitiesWithTag(this.tag); showEntitiesWithTag(this.tagPart1); + this.hasFinished = false; + var basketColliderID = findEntity({ name: GUN_BASKET_COLLIDER_NAME }, 10000); var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; @@ -543,13 +566,23 @@ stepEquip.prototype = { // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, onMessage: function(channel, message, sender) { + if (this.hasFinished) { + return; + } print("Got message", channel, message, sender, MyAvatar.sessionUUID); //if (sender === MyAvatar.sessionUUID) { var data = parseJSON(message); print("Here", data.action, data.grabbedEntity, this.gunID); if (data.action == 'release' && data.grabbedEntity == this.gunID) { + try { + Messages.messageReceived.disconnect(this.onMessage); + } catch(e) { + } + playSuccessSound(); print("FINISHED"); - this.onFinish(); + Script.setTimeout(this.onFinish.bind(this), 1500); + this.hasFinished = true; + //this.onFinish(); } //} }, @@ -586,8 +619,31 @@ var stepTurnAround = function(name) { stepTurnAround.prototype = { start: function(onFinish) { showEntitiesWithTag(this.tag); + var hasTurnedAround = false; + this.interval = Script.setInterval(function() { + var dir = Quat.getFront(MyAvatar.orientation); + var angle = Math.atan2(dir.z, dir.x); + var angleDegrees = ((angle / Math.PI) * 180); + print("CHECK"); + if (!hasTurnedAround) { + if (Math.abs(angleDegrees) > 100) { + hasTurnedAround = true; + print("half way there..."); + } + } else { + if (Math.abs(angleDegrees) < 30) { + Script.clearInterval(this.interval); + this.interval = null; + print("DONE"); + onFinish(); + } + } + }.bind(this), 100); }, cleanup: function() { + if (this.interval) { + Script.clearInterval(this.interval); + } hideEntitiesWithTag(this.tag); deleteEntitiesWithTag(this.tempTag); } @@ -610,7 +666,6 @@ stepTeleport.prototype = { start: function(onFinish) { setControllerVisible("teleport", true); Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); - Menu.setIsOptionChecked("Overlays", true); // Wait until touching teleport pad... var padID = findEntity({ name: TELEPORT_PAD_NAME }, 100); @@ -663,6 +718,7 @@ var stepFinish = function(name) { } stepFinish.prototype = { start: function(onFinish) { + Menu.setIsOptionChecked("Overlays", true); showEntitiesWithTag(this.tag); }, cleanup: function() { diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index df3392f831..35fb282175 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -285,7 +285,7 @@ var VIVE_CONTROLLER_CONFIGURATION = { trigger: { position: { - x: 0, + x: 0.0055, y: -0.023978, z: 0.04546 }, @@ -350,7 +350,7 @@ var VIVE_CONTROLLER_CONFIGURATION = { annotations: { trigger: { position: { - x: 0, + x: -0.075, y: -0.023978, z: 0.04546 }, @@ -400,7 +400,7 @@ var VIVE_CONTROLLER_CONFIGURATION = { } var DEBUG = false; -var VISIBLE_BY_DEFAULT = false; +var VISIBLE_BY_DEFAULT = true; function setupController(config) { var controllerDisplay = { From f4f2ec5da841bc73ef94f6c0430e0caf321fa35f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 09:01:50 -0700 Subject: [PATCH 198/300] Make adjustments to tutorial --- tutorial/tutorial.js | 36 +++++++++++++++++++++--------------- tutorial/viveHandsv2.js | 2 +- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index bdad34e9bc..ea92aa59fc 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -239,6 +239,7 @@ var stepDisableControllers = function(name) { } stepDisableControllers.prototype = { start: function(onFinish) { + editEntitiesWithTag('door', { visible: true }); Menu.setIsOptionChecked("Overlays", false); Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'both'); Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ @@ -341,22 +342,26 @@ stepNearGrab.prototype = { var basketColliderID = findEntity({ name: NEAR_BASKET_COLLIDER_NAME }, 10000); var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; + var boxSpawnID = findEntity({ name: NEAR_BOX_SPAWN_NAME }, 10000); + if (!boxSpawnID) { + print("Error creating block, cannot find spawn"); + return null; + } + var boxSpawnPosition = Entities.getEntityProperties(boxSpawnID, 'position').position; function createBlock() { - var boxSpawnID = findEntity({ name: NEAR_BOX_SPAWN_NAME }, 10000); - if (!boxSpawnID) { - print("Error creating block, cannot find spawn"); - return null; - } - - Step1BlockData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; + Step1BlockData.position = boxSpawnPosition; return spawnWithTag([Step1BlockData], null, this.tempTag)[0]; } // Enabled grab // Create table ? // Create blocks and basket - var boxID = createBlock.bind(this)(); - print("Created", boxID); + this.boxID = createBlock.bind(this)(); + print("Created", this.boxID); + + //function posChecker() { + //Vec3.distance( + //} function onHit() { onFinish(); @@ -365,7 +370,7 @@ stepNearGrab.prototype = { // When block collides with basket start step 2 function checkCollides() { print(this.tag, "CHECKING..."); - if (Vec3.distance(basketPosition, Entities.getEntityProperties(boxID, 'position').position) < 0.1) { + if (Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position) < 0.1) { Script.clearInterval(this.checkCollidesTimer); this.checkCollidesTimer = null; this.soundInjector = Audio.playSound(successSound, { @@ -435,8 +440,8 @@ stepFarGrab.prototype = { // Enabled grab // Create table ? // Create blocks and basket - var boxID = createBlock.bind(this)(); - print("Created", boxID); + this.boxID = createBlock.bind(this)(); + print("Created", this.boxID); function onHit() { onFinish(); @@ -446,7 +451,7 @@ stepFarGrab.prototype = { var checkCollidesTimer = null; function checkCollides() { print("CHECKING..."); - if (Vec3.distance(basketPosition, Entities.getEntityProperties(boxID, 'position').position) < 0.1) { + if (Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position) < 0.1) { Script.clearInterval(checkCollidesTimer); this.soundInjector = Audio.playSound(successSound, { position: basketPosition, @@ -548,7 +553,7 @@ stepEquip.prototype = { print("CHECKING FOR PING PONG..."); var ammoIDs = findEntities({ name: GUN_AMMO_NAME }, 15); for (var i = 0; i < ammoIDs.length; ++i) { - if (Vec3.distance(basketPosition, Entities.getEntityProperties(ammoIDs[i], 'position').position) < 0.2) { + if (Vec3.distance(basketPosition, Entities.getEntityProperties(ammoIDs[i], 'position').position) < 0.25) { Script.clearInterval(this.checkCollidesTimer); this.checkCollidesTimer = null; this.soundInjector = Audio.playSound(successSound, { @@ -561,7 +566,7 @@ stepEquip.prototype = { } } } - this.checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); + this.checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 100); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, @@ -718,6 +723,7 @@ var stepFinish = function(name) { } stepFinish.prototype = { start: function(onFinish) { + editEntitiesWithTag('door', { visible: false }); Menu.setIsOptionChecked("Overlays", true); showEntitiesWithTag(this.tag); }, diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 35fb282175..59725c8178 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -400,7 +400,7 @@ var VIVE_CONTROLLER_CONFIGURATION = { } var DEBUG = false; -var VISIBLE_BY_DEFAULT = true; +var VISIBLE_BY_DEFAULT = false; function setupController(config) { var controllerDisplay = { From f937b57070a0b180d31f708c668b22546a59f5ae Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 09:08:04 -0700 Subject: [PATCH 199/300] Add left/right annotations --- tutorial/tutorial.js | 6 ++++++ tutorial/viveHandsv2.js | 44 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index ea92aa59fc..ca5d365602 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -623,6 +623,9 @@ var stepTurnAround = function(name) { } stepTurnAround.prototype = { start: function(onFinish) { + setControllerVisible("left", true); + setControllerVisible("right", true); + showEntitiesWithTag(this.tag); var hasTurnedAround = false; this.interval = Script.setInterval(function() { @@ -646,6 +649,9 @@ stepTurnAround.prototype = { }.bind(this), 100); }, cleanup: function() { + setControllerVisible("left", false); + setControllerVisible("right", false); + if (this.interval) { Script.clearInterval(this.interval); } diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 59725c8178..50475e563e 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -283,6 +283,28 @@ var VIVE_CONTROLLER_CONFIGURATION = { // color: { red: 100, green: 255, blue: 255 }, // }, + left: { + textOffset: { x: -0.035, y: 0.004, z: -0.005 }, + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + right: { + textOffset: { x: 0.023, y: 0.004, z: -0.005 }, + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + + trigger: { position: { x: 0.0055, @@ -348,6 +370,28 @@ var VIVE_CONTROLLER_CONFIGURATION = { annotationTextRotation: Quat.fromPitchYawRollDegrees(180 + 45, 90, 180), annotations: { + + left: { + textOffset: { x: -0.035, y: 0.004, z: -0.005 }, + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + right: { + textOffset: { x: 0.023, y: 0.004, z: -0.005 }, + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + trigger: { position: { x: -0.075, From 0d5017b5ddb611c1c19a3c0780b099c590421a5d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 09:20:54 -0700 Subject: [PATCH 200/300] Add restartStep to tutorial --- tutorial/tutorial.js | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index ca5d365602..4d1e6164cc 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -73,6 +73,7 @@ Script.include("entityData.js"); // }); // // Controller.enableMapping(MAPPING_NAME); +//{ "from": "Standard.RY", "to": "Actions.Up", "filters": "invert"}, var BASKET_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx"; var BASKET_COLLIDER_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj"; @@ -813,6 +814,12 @@ function startNextStep() { return true; } } +function restartStep() { + if (currentStep) { + currentStep.cleanup(); + currentStep.start(startNextStep); + } +} function skipTutorial() { } @@ -828,17 +835,31 @@ function stopTutorial() { location = "/tutorial"; startTutorial(); +var DISABLE_SPIN_MAPPING = "com.highfidelity.spin.disable"; +var mapping = Controller.newMapping(DISABLE_SPIN_MAPPING); +function noop(value) { } +mapping.from([Controller.Standard.RY]).to(noop); +//mapping.from([Controller.Standard.RY]).when("Controller.Application.Grounded").to(noop); +//mapping.from([Controller.Standard.RY]).when(Controller.Application.Grounded).to(noop); + +Controller.enableMapping(DISABLE_SPIN_MAPPING); + +Script.scriptEnding.connect(function() { + Controller.disableMapping(DISABLE_SPIN_MAPPING); +}); + Script.scriptEnding.connect(stopTutorial); Controller.keyReleaseEvent.connect(function (event) { + print(event.text); if (event.text == ",") { if (!startNextStep()) { startTutorial(); } - } else if (event.text == ".") { - stopTutorial(); + } else if (event.text == "F12") { + restartStep(); } else if (event.text == "r") { stopTutorial(); startTutorial(); From a89064f96f0df2de15de7e129bc513016702e583 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 09:34:38 -0700 Subject: [PATCH 201/300] Update startTutorial to move avatar to start location --- tutorial/tutorial.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 4d1e6164cc..2ffa47523b 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -791,6 +791,7 @@ function startTutorial() { new stepTeleport("teleport"), new stepFinish("finish"), ] + location = "/tutorial"; startNextStep(); } @@ -832,7 +833,6 @@ function stopTutorial() { currentStep = null; } -location = "/tutorial"; startTutorial(); var DISABLE_SPIN_MAPPING = "com.highfidelity.spin.disable"; From eb195e2fb81bdce25362660ef68160f0f27ddade Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 09:43:24 -0700 Subject: [PATCH 202/300] Add success sound --- tutorial/tutorial.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 2ffa47523b..53b9b7c3f7 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -644,6 +644,7 @@ stepTurnAround.prototype = { Script.clearInterval(this.interval); this.interval = null; print("DONE"); + playSuccessSound(); onFinish(); } } @@ -697,6 +698,7 @@ stepTeleport.prototype = { print("On pad!!"); Script.clearInterval(this.checkCollidesTimer); this.checkCollidesTimer = null; + playSuccessSound(); onFinish(); } } From a4ffa7b23f710703425b5ab480e02b76455180b0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 12:43:56 -0700 Subject: [PATCH 203/300] Add disabling of right click menu with vive --- .../controllers/handControllerPointer.js | 2 +- tutorial/tutorial.js | 34 ++++++++++++++----- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/scripts/system/controllers/handControllerPointer.js b/scripts/system/controllers/handControllerPointer.js index ce98ed6d8e..f96e117d26 100644 --- a/scripts/system/controllers/handControllerPointer.js +++ b/scripts/system/controllers/handControllerPointer.js @@ -363,7 +363,7 @@ function makeToggleAction(hand) { // return a function(0|1) that makes the speci }; } -var clickMapping = Controller.newMapping(Script.resolvePath('') + '-click'); +var clickMapping = Controller.newMapping('handControllerPointer-click'); Script.scriptEnding.connect(clickMapping.disable); // Gather the trigger data for smoothing. diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 53b9b7c3f7..52f57a83f6 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -837,18 +837,34 @@ function stopTutorial() { startTutorial(); -var DISABLE_SPIN_MAPPING = "com.highfidelity.spin.disable"; -var mapping = Controller.newMapping(DISABLE_SPIN_MAPPING); -function noop(value) { } -mapping.from([Controller.Standard.RY]).to(noop); +var TUTORIAL_DISABLE_MAPPING = "com.highfidelity.tutorial.disable"; +var mapping = Controller.newMapping(TUTORIAL_DISABLE_MAPPING); + +function noop(value) { + print("NOOP"); +} + +mapping.from([ + Controller.Vive.LSCenter, + Controller.Vive.LeftApplicationMenu, + Controller.Standard.LeftSecondaryThumb, + Controller.Standard.LeftPrimraryThumb + ]).to(noop); +mapping.from([]).to(noop); +mapping.from([]).to(noop); + +Controller.enableMapping(TUTORIAL_DISABLE_MAPPING); + +Script.scriptEnding.connect(function() { + Controller.disableMapping(TUTORIAL_DISABLE_MAPPING); +}); +Controller.disableMapping('handControllerPointer-click'); + +//mapping.from([Controller.Standard.RY]).to(noop); + //{ "from": "Vive.LeftApplicationMenu", "to": "Standard.LeftSecondaryThumb" }, //mapping.from([Controller.Standard.RY]).when("Controller.Application.Grounded").to(noop); //mapping.from([Controller.Standard.RY]).when(Controller.Application.Grounded).to(noop); -Controller.enableMapping(DISABLE_SPIN_MAPPING); - -Script.scriptEnding.connect(function() { - Controller.disableMapping(DISABLE_SPIN_MAPPING); -}); Script.scriptEnding.connect(stopTutorial); From d3885b607d0f12a2613a35bad9681848d4855984 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 13:50:09 -0700 Subject: [PATCH 204/300] Add disabling of right-click menu in tutorial --- tutorial/tutorial.js | 68 +------------------------------------------- 1 file changed, 1 insertion(+), 67 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 52f57a83f6..15227745c1 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -1,4 +1,3 @@ - if (!Function.prototype.bind) { Function.prototype.bind = function(oThis) { if (typeof this !== 'function') { @@ -28,53 +27,6 @@ if (!Function.prototype.bind) { } Script.include("entityData.js"); -// -// var FAR_GRAB_INPUTS = [ -// Controller.Standard.RT -// Controller.Standard.RTClick -// Controller.Standard.LT -// Controller.Standard.LTClick -// ]; -// -// var TELEPORT_INPUTS = [ -// Controller.Standard.LeftPrimaryThumb -// Controller.Standard.RightPrimaryThumb -// ]; -// -// function noop(value) { } -// var FAR_GRAB_MAPPING_NAME = "com.highfidelity.farGrab.disable"; -// var farGrabMapping = Controller.newMapping(FAR_GRAB_MAPPING_NAME); -// for (var i = 0; i < FAR_GRAB_INPUTS.length; ++i) { -// mapping.from([FAR_GRAB_INPUTS[i]]).to(noop); -// } -// -// var TELEPORT_MAPPING_NAME = "com.highfidelity.teleport.disable"; -// var teleportMapping = Controller.newMapping(TELEPORT_MAPPING_NAME); -// for (var i = 0; i < FAR_GRAB_INPUTS.length; ++i) { -// mapping.from([TELEPORT_INPUTS[i]]).to(noop); -// } -// -// mapping.from([Controller.Standard.RT]).to(noop); -// mapping.from([Controller.Standard.RTClick]).to(noop); -// -// mapping.from([Controller.Standard.LT]).to(noop); -// mapping.from([Controller.Standard.LTClick]).to(noop); -// -// mapping.from([Controller.Standard.RB]).to(noop); -// mapping.from([Controller.Standard.LB]).to(noop); -// mapping.from([Controller.Standard.LeftGrip]).to(noop); -// mapping.from([Controller.Standard.RightGrip]).to(noop); -// -// mapping.from([Controller.Standard.LeftPrimaryThumb]).to(noop); -// mapping.from([Controller.Standard.RightPrimaryThumb]).to(noop); -// -// Script.scriptEnding.connect(function() { -// Controller.disableMapping(MAPPING_NAME); -// }); -// -// Controller.enableMapping(MAPPING_NAME); -//{ "from": "Standard.RY", "to": "Actions.Up", "filters": "invert"}, - var BASKET_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx"; var BASKET_COLLIDER_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj"; var successSound = SoundCache.getSound(Script.resolvePath("success48.wav")); @@ -837,26 +789,8 @@ function stopTutorial() { startTutorial(); -var TUTORIAL_DISABLE_MAPPING = "com.highfidelity.tutorial.disable"; -var mapping = Controller.newMapping(TUTORIAL_DISABLE_MAPPING); - -function noop(value) { - print("NOOP"); -} - -mapping.from([ - Controller.Vive.LSCenter, - Controller.Vive.LeftApplicationMenu, - Controller.Standard.LeftSecondaryThumb, - Controller.Standard.LeftPrimraryThumb - ]).to(noop); -mapping.from([]).to(noop); -mapping.from([]).to(noop); - -Controller.enableMapping(TUTORIAL_DISABLE_MAPPING); - Script.scriptEnding.connect(function() { - Controller.disableMapping(TUTORIAL_DISABLE_MAPPING); + Controller.enableMapping('handControllerPointer-click'); }); Controller.disableMapping('handControllerPointer-click'); From 827506e929161942e0a9e1b6d7e3a0525e974881 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 13:50:41 -0700 Subject: [PATCH 205/300] Disable 180 spin in tutorial --- .../controllers/toggleAdvancedMovementForHandControllers.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js b/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js index f5ab42cf53..21eeb68b96 100644 --- a/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js +++ b/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js @@ -54,6 +54,7 @@ function registerBasicMapping() { mappingName = 'Hifi-AdvancedMovement-Dev-' + Math.random(); basicMapping = Controller.newMapping(mappingName); basicMapping.from(Controller.Standard.LY).to(function(value) { + return; var stick = Controller.getValue(Controller.Standard.LS); if (value === 1 && Controller.Hardware.OculusTouch !== undefined) { rotate180(); @@ -70,6 +71,7 @@ function registerBasicMapping() { }); basicMapping.from(Controller.Standard.LX).to(Controller.Standard.RX); basicMapping.from(Controller.Standard.RY).to(function(value) { + return; var stick = Controller.getValue(Controller.Standard.RS); if (value === 1 && Controller.Hardware.OculusTouch !== undefined) { rotate180(); From 52120de44aec3061d12f74820ae5fad9aa6220d3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 2 Sep 2016 14:25:03 -0700 Subject: [PATCH 206/300] Disable displaying of overlays at end of tutorial --- tutorial/tutorial.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 15227745c1..4b30fa645d 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -685,10 +685,10 @@ var stepFinish = function(name) { stepFinish.prototype = { start: function(onFinish) { editEntitiesWithTag('door', { visible: false }); - Menu.setIsOptionChecked("Overlays", true); showEntitiesWithTag(this.tag); }, cleanup: function() { + //Menu.setIsOptionChecked("Overlays", true); hideEntitiesWithTag(this.tag); deleteEntitiesWithTag(this.tempTag); } From 6f457e10eb19a1985b8273a5c2b4c44b6b320d2a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 6 Sep 2016 11:21:10 -0700 Subject: [PATCH 207/300] Add trigger part to vive controller display --- tutorial/tutorial.js | 4 ---- tutorial/viveHandsv2.js | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 4b30fa645d..ed091a6526 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -724,10 +724,6 @@ function hideEntitiesWithTag(tag) { }); } - - - - var STEPS; var currentStepNum = -1; diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 50475e563e..e53de1bfc9 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -368,6 +368,20 @@ var VIVE_CONTROLLER_CONFIGURATION = { z: 0.06380049744620919 }, + parts: { + { + type: "linear", + modelURL: "", + input: Controller.Hardware.Vive.RT, + minValue: 0.0, + maxValue: 1.0, + textOffset: { x: -0.035, y: 0.004, z: -0.005 }, + minPosition: { x: -0.035, y: 0.004, z: -0.005 }, + maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, + } + + }, + annotationTextRotation: Quat.fromPitchYawRollDegrees(180 + 45, 90, 180), annotations: { From 2bbc4204b9bfda7d413f801e8be49dc94a9e6a72 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 8 Sep 2016 12:06:55 -0700 Subject: [PATCH 208/300] Add support for parts to controller display" --- tutorial/viveHandsv2.js | 175 +++++++++++++++++++++++++++++++++------- 1 file changed, 145 insertions(+), 30 deletions(-) diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index e53de1bfc9..24f17dc138 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -78,28 +78,6 @@ var touchRightBaseRotation = Quat.multiply( ); var TOUCH_CONTROLLER_CONFIGURATION = { - name: "Touch", - controllers: [ - { - modelURL: "C:/Users/Ryan/Assets/controller/touch_l_full.fbx", - jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"), - rotation: touchLeftBaseRotation, - //position: Vec3.sum(leftBasePosition, { x: 0.032, y: 0.0, z: -0.02 }), - position: Vec3.sum(leftBasePosition, { x: 0.0, y: -0.016, z: -0.02 }), - //dimensions: naturalDimensions, - }, - { - modelURL: "C:/Users/Ryan/Assets/controller/touch_r_full.fbx", - jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), - rotation: touchRightBaseRotation, - //position: rightBasePosition, - position: Vec3.sum(rightBasePosition, { x: 0.0, y: -0.016, z: -0.02 }), - //dimensions: naturalDimensions, - } - ] -} - -var TOUCH_2_CONTROLLER_CONFIGURATION = { name: "Touch", controllers: [ { @@ -221,6 +199,7 @@ var viveNaturalPosition = { z: 0.06380049744620919 }; var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive2.fbx"; +var viveModelURL = "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_body.fbx"; var VIVE_CONTROLLER_CONFIGURATION = { name: "Vive", @@ -369,17 +348,59 @@ var VIVE_CONTROLLER_CONFIGURATION = { }, parts: { - { - type: "linear", - modelURL: "", - input: Controller.Hardware.Vive.RT, + //{ + // type: "linear", + // modelURL: "", + // input: "Controller.Hardware.Vive.RT", + // minValue: 0.0, + // maxValue: 1.0, + // textOffset: { x: -0.035, y: 0.004, z: -0.005 }, + // minPosition: { x: -0.035, y: 0.004, z: -0.005 }, + // maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, + //}, + + // The touchpad type draws a dot indicating the current touch/thumb position + // and swaps in textures based on the thumb position. + touchpad: { + type: "touchpad", + modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", + visibleInput: "Vive.RSTouch", + xInput: "Vive.RX", + yInput: "Vive.RY", + naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, minValue: 0.0, maxValue: 1.0, - textOffset: { x: -0.035, y: 0.004, z: -0.005 }, minPosition: { x: -0.035, y: 0.004, z: -0.005 }, maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - } + textureName: "Tex.touchpad-blank", + areas: [ + { + textureURL: "c:%5CUsers%5CRyan%5CAssets%5Ccontroller%5Cvive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", + minX: 0, + maxX: 50, + minY: 0, + maxY: 50 + }, + { + textureURL: "...", + minX: 0, + maxX: 50, + minY: 0, + maxY: 50 + } + ] + }, + trigger: { + type: "rotational", + modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trigger.fbx", + input: Controller.Standard.RT, + naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, + minValue: 0.0, + maxValue: 1.0, + axis: { x: -1, y: 0, z: 0 }, + maxAngle: 90, + } }, annotationTextRotation: Quat.fromPitchYawRollDegrees(180 + 45, 90, 180), @@ -463,10 +484,24 @@ var VISIBLE_BY_DEFAULT = false; function setupController(config) { var controllerDisplay = { overlays: [], + partOverlays: { + }, annotations: { }, - mappingName: "" + mappingName: "mapping-display", + + hidePart: function(partName) { + Overlays.editOverlay(this.partOverlays[partName], { + visible: false + }); + }, + showPart: function(partName) { + Overlays.editOverlay(this.partOverlays[partName], { + visible: true + }); + }, }; + var mapping = Controller.newMapping(controllerDisplay.mappingName); for (var i = 0; i < config.controllers.length; ++i) { var controller = config.controllers[i]; var position = controller.position; @@ -558,7 +593,88 @@ function setupController(config) { controllerDisplay.overlays.push(lineOverlayID); } } + + function clamp(value, min, max) { + if (value < min) { + return min; + } else if (value > max) { + return max + } + return value; + } + + if (controller.parts) { + for (var partName in controller.parts) { + var part = controller.parts[partName]; + var partPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, part.naturalPosition)); + var innerRotation = controller.rotation + + Vec3.print("controller", controller.position); + Vec3.print("part", partPosition); + + var overlayID = Overlays.addOverlay("model", { + url: part.modelURL, + localPosition: partPosition, + localRotation: innerRotation, + parentID: PARENT_ID, + parentJointIndex: controller.jointIndex, + ignoreRayIntersection: true, + }); + + if (part.type == "rotational") { + var range = part.maxValue - part.minValue; + mapping.from([part.input]).peek().to(function(value) { + print(value); + + value = clamp(value, part.minValue, part.maxValue); + + var pct = (value - part.minValue) / part.maxValue; + var angle = pct * part.maxAngle; + var rotation = Quat.angleAxis(angle, part.axis); + print(value, pct, angle); + + Overlays.editOverlay(overlayID, { + localRotation: Quat.multiply(innerRotation, rotation) + }); + }); + } else if (part.type == "touchpad") { + function resolveHardware(path) { + var parts = path.split("."); + function resolveInner(base, path, i) { + print(path[i]); + if (i >= path.length) { + return base; + } + return resolveInner(base[path[i]], path, ++i); + } + return resolveInner(Controller.Hardware, parts, 0); + } + + var visibleInput = resolveHardware(part.visibleInput); + var xinput = resolveHardware(part.xInput); + var yinput = resolveHardware(part.yInput); + + print("visible:", visibleInput); + + mapping.from([visibleInput]).peek().to(function(value) { + print("visible", value); + }); + mapping.from([xinput]).peek().to(function(value) { + print("X", value); + }); + mapping.from([yinput]).peek().invert().to(function(value) { + print("Y", value); + }); + } else { + print("TYPE NOT SUPPORTED: ", part.type); + } + + controllerDisplay.overlays.push(overlayID); + controllerDisplay.partOverlays[partName] = overlayID; + } + } } + Controller.enableMapping(controllerDisplay.mappingName); return controllerDisplay; } @@ -616,7 +732,6 @@ mapping.from([Controller.Standard.RT]).to(function(value) { Controller.enableMapping(MAPPING_NAME); //var c = setupController(TOUCH_CONTROLLER_CONFIGURATION); -//var c = setupController(TOUCH_2_CONTROLLER_CONFIGURATION); var c = setupController(VIVE_CONTROLLER_CONFIGURATION); //MyAvatar.shouldRenderLocally = false; Script.scriptEnding.connect(function() { From 7d57c0631366dda59227cf4c586188a78d61369d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 8 Sep 2016 14:45:16 -0700 Subject: [PATCH 209/300] Add welcome to tutorial --- tutorial/tutorial.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index ed091a6526..b4b731b052 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -206,6 +206,25 @@ stepDisableControllers.prototype = { } }; +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: Welcome // +// // +/////////////////////////////////////////////////////////////////////////////// +var stepWelcome = function(name) { + this.tag = name; +} +stepWelcome.prototype = { + start: function(onFinish) { + Script.setTimeout(onFinish, 8000); + showEntitiesWithTag(this.tag); + }, + cleanup: function() { + hideEntitiesWithTag(this.tag); + } +}; + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // // @@ -733,6 +752,7 @@ function startTutorial() { currentStep = null; STEPS = [ new stepDisableControllers("step0"), + new stepWelcome("welcome"), new stepRaiseAboveHead("raiseHands"), new stepNearGrab("nearGrab"), new stepFarGrab("farGrab"), From 324365decaee0c08760047dbe8519107b3126922 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 8 Sep 2016 16:13:18 -0700 Subject: [PATCH 210/300] Add controller part hiding/showing depending on step --- tutorial/tutorial.js | 52 +++++++-- tutorial/viveHandsv2.js | 228 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 260 insertions(+), 20 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index b4b731b052..e6cbae11ce 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -29,7 +29,8 @@ Script.include("entityData.js"); var BASKET_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx"; var BASKET_COLLIDER_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj"; -var successSound = SoundCache.getSound(Script.resolvePath("success48.wav")); +//var successSound = SoundCache.getSound(Script.resolvePath("success48.wav")); +var successSound = SoundCache.getSound("http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Sounds/good_one.L.wav"); function beginsWithFilter(value, key) { return value.indexOf(properties[key]) == 0; @@ -200,6 +201,11 @@ stepDisableControllers.prototype = { holdEnabled: false, farGrabEnabled: false, })); + setControllerPartsVisible({ + touchpad: true, + touchpad_teleport: false, + touchpad_arrows: false + }); onFinish(); }, cleanup: function() { @@ -217,10 +223,11 @@ var stepWelcome = function(name) { } stepWelcome.prototype = { start: function(onFinish) { - Script.setTimeout(onFinish, 8000); + this.timerID = Script.setTimeout(onFinish, 8000); showEntitiesWithTag(this.tag); }, cleanup: function() { + Script.clearTimeout(this.timerID); hideEntitiesWithTag(this.tag); } }; @@ -291,6 +298,10 @@ function setControllerVisible(name, visible) { })); } +function setControllerPartsVisible(parts) { + Messages.sendLocalMessage('Controller-Display-Parts', JSON.stringify(parts)); +} + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -341,8 +352,9 @@ stepNearGrab.prototype = { // When block collides with basket start step 2 function checkCollides() { - print(this.tag, "CHECKING..."); - if (Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position) < 0.1) { + var dist = Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position); + print(this.tag, "CHECKING...", dist); + if (dist < 0.1) { Script.clearInterval(this.checkCollidesTimer); this.checkCollidesTimer = null; this.soundInjector = Audio.playSound(successSound, { @@ -423,7 +435,7 @@ stepFarGrab.prototype = { var checkCollidesTimer = null; function checkCollides() { print("CHECKING..."); - if (Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position) < 0.1) { + if (Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position) < 0.2) { Script.clearInterval(checkCollidesTimer); this.soundInjector = Audio.playSound(successSound, { position: basketPosition, @@ -598,6 +610,12 @@ stepTurnAround.prototype = { setControllerVisible("left", true); setControllerVisible("right", true); + setControllerPartsVisible({ + touchpad: false, + touchpad_teleport: false, + touchpad_arrows: true + }); + showEntitiesWithTag(this.tag); var hasTurnedAround = false; this.interval = Script.setInterval(function() { @@ -625,6 +643,12 @@ stepTurnAround.prototype = { setControllerVisible("left", false); setControllerVisible("right", false); + setControllerPartsVisible({ + touchpad: true, + touchpad_teleport: false, + touchpad_arrows: false + }); + if (this.interval) { Script.clearInterval(this.interval); } @@ -648,7 +672,14 @@ var stepTeleport = function(name) { } stepTeleport.prototype = { start: function(onFinish) { - setControllerVisible("teleport", true); + //setControllerVisible("teleport", true); + + setControllerPartsVisible({ + touchpad: false, + touchpad_teleport: true, + touchpad_arrows: false + }); + Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); // Wait until touching teleport pad... @@ -678,7 +709,14 @@ stepTeleport.prototype = { showEntitiesWithTag(this.tag); }, cleanup: function() { - setControllerVisible("teleport", false); + //setControllerVisible("teleport", false); + + setControllerPartsVisible({ + touchpad: true, + touchpad_teleport: false, + touchpad_arrows: false + }); + if (this.checkCollidesTimer) { Script.clearInterval(this.checkCollidesTimer); } diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 24f17dc138..8271fdcffe 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -213,6 +213,123 @@ var VIVE_CONTROLLER_CONFIGURATION = { dimensions: viveNaturalDimensions, + parts: { + //{ + // type: "linear", + // modelURL: "", + // input: "Controller.Hardware.Vive.RT", + // minValue: 0.0, + // maxValue: 1.0, + // textOffset: { x: -0.035, y: 0.004, z: -0.005 }, + // minPosition: { x: -0.035, y: 0.004, z: -0.005 }, + // maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, + //}, + + // The touchpad type draws a dot indicating the current touch/thumb position + // and swaps in textures based on the thumb position. + touchpad: { + type: "touchpad", + //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", + visibleInput: "Vive.RSTouch", + xInput: "Vive.RX", + yInput: "Vive.RY", + naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, + minValue: 0.0, + maxValue: 1.0, + minPosition: { x: -0.035, y: 0.004, z: -0.005 }, + maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, + textureName: "Tex.touchpad-blank", + }, + + touchpad_teleport: { + type: "touchpad", + //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", + visibleInput: "Vive.RSTouch", + xInput: "Vive.RX", + yInput: "Vive.RY", + naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, + minValue: 0.0, + maxValue: 1.0, + minPosition: { x: -0.035, y: 0.004, z: -0.005 }, + maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, + textureName: "Tex.touchpad-blank", + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport.jpg", + }, + + touchpad_arrows: { + type: "touchpad", + //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", + visibleInput: "Vive.RSTouch", + xInput: "Vive.RX", + yInput: "Vive.RY", + naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, + minValue: 0.0, + maxValue: 1.0, + minPosition: { x: -0.035, y: 0.004, z: -0.005 }, + maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, + textureName: "Tex.touchpad-blank", + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", + areas: [ + { + textureURL: "c:%5CUsers%5CRyan%5CAssets%5Ccontroller%5Cvive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", + minX: 0, + maxX: 50, + minY: 0, + maxY: 50 + }, + { + textureURL: "...", + minX: 0, + maxX: 50, + minY: 0, + maxY: 50 + } + ] + }, + + trigger: { + type: "rotational", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trigger.fbx", + input: Controller.Standard.RT, + naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, + minValue: 0.0, + maxValue: 1.0, + axis: { x: -1, y: 0, z: 0 }, + maxAngle: 90, + }, + + l_grip: { + type: "ignore", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_l_grip.fbx", + naturalPosition: {"x":-0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, + }, + + r_grip: { + type: "ignore", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_r_grip.fbx", + naturalPosition: {"x":0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, + }, + + sys_button: { + type: "ignore", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_sys_button.fbx", + naturalPosition: {"x":0,"y":0.0020399854984134436,"z":0.08825899660587311}, + }, + + button: { + type: "ignore", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} + }, + button2: { + type: "ignore", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} + }, + }, annotationTextRotation: Quat.fromPitchYawRollDegrees(45, -90, 0), annotations: { // red: { @@ -363,7 +480,8 @@ var VIVE_CONTROLLER_CONFIGURATION = { // and swaps in textures based on the thumb position. touchpad: { type: "touchpad", - modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", + //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", visibleInput: "Vive.RSTouch", xInput: "Vive.RX", yInput: "Vive.RY", @@ -373,6 +491,38 @@ var VIVE_CONTROLLER_CONFIGURATION = { minPosition: { x: -0.035, y: 0.004, z: -0.005 }, maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, textureName: "Tex.touchpad-blank", + }, + + touchpad_teleport: { + type: "touchpad", + //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", + visibleInput: "Vive.RSTouch", + xInput: "Vive.RX", + yInput: "Vive.RY", + naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, + minValue: 0.0, + maxValue: 1.0, + minPosition: { x: -0.035, y: 0.004, z: -0.005 }, + maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, + textureName: "Tex.touchpad-blank", + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport.jpg", + }, + + touchpad_arrows: { + type: "touchpad", + //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", + visibleInput: "Vive.RSTouch", + xInput: "Vive.RX", + yInput: "Vive.RY", + naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, + minValue: 0.0, + maxValue: 1.0, + minPosition: { x: -0.035, y: 0.004, z: -0.005 }, + maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, + textureName: "Tex.touchpad-blank", + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", areas: [ { textureURL: "c:%5CUsers%5CRyan%5CAssets%5Ccontroller%5Cvive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", @@ -393,14 +543,43 @@ var VIVE_CONTROLLER_CONFIGURATION = { trigger: { type: "rotational", - modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trigger.fbx", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trigger.fbx", input: Controller.Standard.RT, naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, minValue: 0.0, maxValue: 1.0, axis: { x: -1, y: 0, z: 0 }, maxAngle: 90, - } + }, + + l_grip: { + type: "ignore", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_l_grip.fbx", + naturalPosition: {"x":-0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, + }, + + r_grip: { + type: "ignore", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_r_grip.fbx", + naturalPosition: {"x":0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, + }, + + sys_button: { + type: "ignore", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_sys_button.fbx", + naturalPosition: {"x":0,"y":0.0020399854984134436,"z":0.08825899660587311}, + }, + + button: { + type: "ignore", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} + }, + button2: { + type: "ignore", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} + }, }, annotationTextRotation: Quat.fromPitchYawRollDegrees(180 + 45, 90, 180), @@ -490,15 +669,16 @@ function setupController(config) { }, mappingName: "mapping-display", - hidePart: function(partName) { - Overlays.editOverlay(this.partOverlays[partName], { - visible: false - }); - }, - showPart: function(partName) { - Overlays.editOverlay(this.partOverlays[partName], { - visible: true - }); + setPartVisible: function(partName, visible) { + print("Setting part visible", partName, visible); + if (partName in this.partOverlays) { + print("FOUND"); + for (var i = 0; i < this.partOverlays[partName].length; ++i) { + Overlays.editOverlay(this.partOverlays[partName][i], { + visible: visible + }); + } + } }, }; var mapping = Controller.newMapping(controllerDisplay.mappingName); @@ -619,6 +799,7 @@ function setupController(config) { parentID: PARENT_ID, parentJointIndex: controller.jointIndex, ignoreRayIntersection: true, + //visible: false }); if (part.type == "rotational") { @@ -665,12 +846,22 @@ function setupController(config) { mapping.from([yinput]).peek().invert().to(function(value) { print("Y", value); }); + if (part.defaultTextureURL) { + var textures = {}; + textures[part.textureName] = part.defaultTextureURL; + Overlays.editOverlay(overlayID, { + textures: textures + }); + } } else { print("TYPE NOT SUPPORTED: ", part.type); } controllerDisplay.overlays.push(overlayID); - controllerDisplay.partOverlays[partName] = overlayID; + if (!(partName in controllerDisplay.partOverlays)) { + controllerDisplay.partOverlays[partName] = []; + } + controllerDisplay.partOverlays[partName].push(overlayID); } } } @@ -709,10 +900,18 @@ var handleMessages = function(channel, message, sender) { Overlays.editOverlay(c.annotations[name][i], { visible: visible }); } } + } else if (channel === 'Controller-Display-Parts') { + print('here part'); + var data = JSON.parse(message); + for (var name in data) { + var visible = data[name]; + c.setPartVisible(name, visible); + } } } } + Messages.messageReceived.connect(handleMessages); var MAPPING_NAME = "com.highfidelity.handControllerGrab.disable"; @@ -733,6 +932,9 @@ Controller.enableMapping(MAPPING_NAME); //var c = setupController(TOUCH_CONTROLLER_CONFIGURATION); var c = setupController(VIVE_CONTROLLER_CONFIGURATION); +//c.setPartVisible("touchpad", false); +//c.setPartVisible("touchpad_teleport", false); + //MyAvatar.shouldRenderLocally = false; Script.scriptEnding.connect(function() { deleteControllerDisplay(c); From 352f0f7ea711d53a3979ced5e3ea1ba566c443ad Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 8 Sep 2016 16:22:16 -0700 Subject: [PATCH 211/300] Update controller model URL --- tutorial/tutorial.js | 2 ++ tutorial/viveHandsv2.js | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index e6cbae11ce..ee33b4428a 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -866,6 +866,8 @@ Controller.keyReleaseEvent.connect(function (event) { } } else if (event.text == "F12") { restartStep(); + } else if (event.text == "F10") { + MyAvatar.shouldRenderLocally = !MyAvatar.shouldRenderLocally; } else if (event.text == "r") { stopTutorial(); startTutorial(); diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 8271fdcffe..0cd761e034 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -199,7 +199,7 @@ var viveNaturalPosition = { z: 0.06380049744620919 }; var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive2.fbx"; -var viveModelURL = "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_body.fbx"; +var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_body.fbx", var VIVE_CONTROLLER_CONFIGURATION = { name: "Vive", @@ -935,7 +935,6 @@ var c = setupController(VIVE_CONTROLLER_CONFIGURATION); //c.setPartVisible("touchpad", false); //c.setPartVisible("touchpad_teleport", false); -//MyAvatar.shouldRenderLocally = false; Script.scriptEnding.connect(function() { deleteControllerDisplay(c); MyAvatar.shouldRenderLocally = true; From 3149bb834dd7d3901de4d1a2a8f7a3a65ea95123 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 8 Sep 2016 16:25:00 -0700 Subject: [PATCH 212/300] Fix typo in vive controller display --- tutorial/viveHandsv2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 0cd761e034..9677f6d821 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -199,7 +199,7 @@ var viveNaturalPosition = { z: 0.06380049744620919 }; var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive2.fbx"; -var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_body.fbx", +var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_body.fbx"; var VIVE_CONTROLLER_CONFIGURATION = { name: "Vive", From f8fdbe549958a7c700ccc00c73a6b3483711dbd3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 8 Sep 2016 16:41:04 -0700 Subject: [PATCH 213/300] Fix sound position --- tutorial/tutorial.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index ee33b4428a..4ea38d51a2 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -176,7 +176,7 @@ function isFunction(functionToCheck) { }; function playSuccessSound() { this.soundInjector = Audio.playSound(successSound, { - position: defaultTransform.position, + position: MyAvatar.position, volume: 0.7, loop: false }); From 170502e8a14d1bb22beb0e3b826cf51bfd691959 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 9 Sep 2016 10:28:59 -0700 Subject: [PATCH 214/300] Update controller display part implementation to only have a single layer active --- tutorial/tutorial.js | 36 +++---- tutorial/viveHandsv2.js | 208 +++++++++++++++++++--------------------- 2 files changed, 110 insertions(+), 134 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 4ea38d51a2..5262e789bf 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -201,11 +201,7 @@ stepDisableControllers.prototype = { holdEnabled: false, farGrabEnabled: false, })); - setControllerPartsVisible({ - touchpad: true, - touchpad_teleport: false, - touchpad_arrows: false - }); + setControllerPartLayer('touchpad', 'blank'); onFinish(); }, cleanup: function() { @@ -302,6 +298,12 @@ function setControllerPartsVisible(parts) { Messages.sendLocalMessage('Controller-Display-Parts', JSON.stringify(parts)); } +function setControllerPartLayer(part, layer) { + data = {}; + data[part] = layer; + Messages.sendLocalMessage('Controller-Set-Part-Layer', JSON.stringify(data)); +} + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -610,11 +612,7 @@ stepTurnAround.prototype = { setControllerVisible("left", true); setControllerVisible("right", true); - setControllerPartsVisible({ - touchpad: false, - touchpad_teleport: false, - touchpad_arrows: true - }); + setControllerPartLayer('touchpad', 'arrows'); showEntitiesWithTag(this.tag); var hasTurnedAround = false; @@ -643,11 +641,7 @@ stepTurnAround.prototype = { setControllerVisible("left", false); setControllerVisible("right", false); - setControllerPartsVisible({ - touchpad: true, - touchpad_teleport: false, - touchpad_arrows: false - }); + setControllerPartLayer('touchpad', 'blank'); if (this.interval) { Script.clearInterval(this.interval); @@ -674,11 +668,7 @@ stepTeleport.prototype = { start: function(onFinish) { //setControllerVisible("teleport", true); - setControllerPartsVisible({ - touchpad: false, - touchpad_teleport: true, - touchpad_arrows: false - }); + setControllerPartLayer('touchpad', 'teleport'); Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); @@ -711,11 +701,7 @@ stepTeleport.prototype = { cleanup: function() { //setControllerVisible("teleport", false); - setControllerPartsVisible({ - touchpad: true, - touchpad_teleport: false, - touchpad_arrows: false - }); + setControllerPartLayer('touchpad', 'blank'); if (this.checkCollidesTimer) { Script.clearInterval(this.checkCollidesTimer); diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 9677f6d821..7bbd471622 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -232,73 +232,39 @@ var VIVE_CONTROLLER_CONFIGURATION = { //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", visibleInput: "Vive.RSTouch", - xInput: "Vive.RX", - yInput: "Vive.RY", + xInput: "Vive.LX", + yInput: "Vive.LY", naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, minValue: 0.0, maxValue: 1.0, minPosition: { x: -0.035, y: 0.004, z: -0.005 }, maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, textureName: "Tex.touchpad-blank", - }, - touchpad_teleport: { - type: "touchpad", - //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", - visibleInput: "Vive.RSTouch", - xInput: "Vive.RX", - yInput: "Vive.RY", - naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, - minValue: 0.0, - maxValue: 1.0, - minPosition: { x: -0.035, y: 0.004, z: -0.005 }, - maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - textureName: "Tex.touchpad-blank", - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport.jpg", - }, - - touchpad_arrows: { - type: "touchpad", - //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", - visibleInput: "Vive.RSTouch", - xInput: "Vive.RX", - yInput: "Vive.RY", - naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, - minValue: 0.0, - maxValue: 1.0, - minPosition: { x: -0.035, y: 0.004, z: -0.005 }, - maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - textureName: "Tex.touchpad-blank", - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", - areas: [ - { - textureURL: "c:%5CUsers%5CRyan%5CAssets%5Ccontroller%5Cvive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", - minX: 0, - maxX: 50, - minY: 0, - maxY: 50 + defaultTextureLayer: "blank", + textureLayers: { + blank: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", }, - { - textureURL: "...", - minX: 0, - maxX: 50, - minY: 0, - maxY: 50 + teleport: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport.jpg", + }, + arrows: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", } - ] + } }, trigger: { type: "rotational", modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trigger.fbx", - input: Controller.Standard.RT, + input: Controller.Standard.LT, naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, + origin: { x: 0, y: -0.015, z: -0.00 }, minValue: 0.0, maxValue: 1.0, axis: { x: -1, y: 0, z: 0 }, - maxAngle: 90, + maxAngle: 25, }, l_grip: { @@ -404,9 +370,10 @@ var VIVE_CONTROLLER_CONFIGURATION = { trigger: { position: { x: 0.0055, - y: -0.023978, + y: -0.032978, z: 0.04546 }, + lineHeight: 0.013, direction: "left", color: { red: 255, green: 100, blue: 100 }, }, @@ -491,54 +458,19 @@ var VIVE_CONTROLLER_CONFIGURATION = { minPosition: { x: -0.035, y: 0.004, z: -0.005 }, maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, textureName: "Tex.touchpad-blank", - }, - touchpad_teleport: { - type: "touchpad", - //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", - visibleInput: "Vive.RSTouch", - xInput: "Vive.RX", - yInput: "Vive.RY", - naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, - minValue: 0.0, - maxValue: 1.0, - minPosition: { x: -0.035, y: 0.004, z: -0.005 }, - maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - textureName: "Tex.touchpad-blank", - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport.jpg", - }, - - touchpad_arrows: { - type: "touchpad", - //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", - visibleInput: "Vive.RSTouch", - xInput: "Vive.RX", - yInput: "Vive.RY", - naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, - minValue: 0.0, - maxValue: 1.0, - minPosition: { x: -0.035, y: 0.004, z: -0.005 }, - maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - textureName: "Tex.touchpad-blank", - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", - areas: [ - { - textureURL: "c:%5CUsers%5CRyan%5CAssets%5Ccontroller%5Cvive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", - minX: 0, - maxX: 50, - minY: 0, - maxY: 50 + defaultTextureLayer: "blank", + textureLayers: { + blank: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", }, - { - textureURL: "...", - minX: 0, - maxX: 50, - minY: 0, - maxY: 50 + teleport: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport.jpg", + }, + arrows: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", } - ] + } }, trigger: { @@ -546,10 +478,11 @@ var VIVE_CONTROLLER_CONFIGURATION = { modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trigger.fbx", input: Controller.Standard.RT, naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, + origin: { x: 0, y: -0.015, z: -0.00 }, minValue: 0.0, maxValue: 1.0, axis: { x: -1, y: 0, z: 0 }, - maxAngle: 90, + maxAngle: 25, }, l_grip: { @@ -609,9 +542,10 @@ var VIVE_CONTROLLER_CONFIGURATION = { trigger: { position: { x: -0.075, - y: -0.023978, + y: -0.032978, z: 0.04546 }, + lineHeight: 0.013, direction: "left", color: { red: 255, green: 100, blue: 100 }, }, @@ -665,6 +599,8 @@ function setupController(config) { overlays: [], partOverlays: { }, + parts: { + }, annotations: { }, mappingName: "mapping-display", @@ -680,6 +616,29 @@ function setupController(config) { } } }, + + setLayerForPart: function(partName, layerName) { + print("Setting layer...", partName, layerName); + if (partName in this.parts) { + var part = this.parts[partName]; + print("FOnd", JSON.stringify(part)); + if (layerName in part.textureLayers) { + print("got it", layerName); + var layer = part.textureLayers[layerName]; + var textures = {}; + if (layer.defaultTextureURL) { + print("default texture"); + textures[part.textureName] = layer.defaultTextureURL; + } + for (var i = 0; i < this.partOverlays[partName].length; ++i) { + print("updating", JSON.stringify(textures)); + Overlays.editOverlay(this.partOverlays[partName][i], { + textures: textures + }); + } + } + } + } }; var mapping = Controller.newMapping(controllerDisplay.mappingName); for (var i = 0; i < config.controllers.length; ++i) { @@ -736,7 +695,7 @@ function setupController(config) { text: key, localPosition: pos, localRotation: controller.annotationTextRotation, - lineHeight: 0.01, + lineHeight: annotation.lineHeight ? annotation.lineHeight : 0.01, leftMargin: 0, rightMargin: 0, topMargin: 0, @@ -792,6 +751,8 @@ function setupController(config) { Vec3.print("controller", controller.position); Vec3.print("part", partPosition); + controllerDisplay.parts[partName] = controller.parts[partName]; + var overlayID = Overlays.addOverlay("model", { url: part.modelURL, localPosition: partPosition, @@ -804,20 +765,36 @@ function setupController(config) { if (part.type == "rotational") { var range = part.maxValue - part.minValue; - mapping.from([part.input]).peek().to(function(value) { - print(value); + mapping.from([part.input]).peek().to(function(controller, overlayID, part) { + return function(value) { + //print(value); + //print(JSON.stringify(part)); - value = clamp(value, part.minValue, part.maxValue); + value = clamp(value, part.minValue, part.maxValue); - var pct = (value - part.minValue) / part.maxValue; - var angle = pct * part.maxAngle; - var rotation = Quat.angleAxis(angle, part.axis); - print(value, pct, angle); + var pct = (value - part.minValue) / part.maxValue; + var angle = pct * part.maxAngle; + var rotation = Quat.angleAxis(angle, part.axis); + print(value, pct, angle); - Overlays.editOverlay(overlayID, { - localRotation: Quat.multiply(innerRotation, rotation) - }); - }); + var offset = { x: 0, y: 0, z: 0 }; + if (part.origin) { + //print(rotation.x, rotation.y, rotation.z, rotation.w); + var offset = Vec3.multiplyQbyV(rotation, part.origin); + offset = Vec3.subtract(offset, part.origin); + Vec3.print('offset', offset); + //partPosition = Vec3.sum(partPosition, offset); + } + + var partPosition = Vec3.sum(controller.position, + Vec3.multiplyQbyV(controller.rotation, Vec3.sum(offset, part.naturalPosition))); + + Overlays.editOverlay(overlayID, { + localPosition: partPosition, + localRotation: Quat.multiply(controller.rotation, rotation) + }); + } + }(controller, overlayID, part)); } else if (part.type == "touchpad") { function resolveHardware(path) { var parts = path.split("."); @@ -907,6 +884,12 @@ var handleMessages = function(channel, message, sender) { var visible = data[name]; c.setPartVisible(name, visible); } + } else if (channel === 'Controller-Set-Part-Layer') { + var data = JSON.parse(message); + for (var name in data) { + var layer = data[name]; + c.setLayerForPart(name, layer); + } } } } @@ -934,6 +917,13 @@ Controller.enableMapping(MAPPING_NAME); var c = setupController(VIVE_CONTROLLER_CONFIGURATION); //c.setPartVisible("touchpad", false); //c.setPartVisible("touchpad_teleport", false); +//layers = ["blank", "teleport", 'arrows']; +//num = 0; +//Script.setInterval(function() { +// print('num', num); +// num = (num + 1) % layers.length; +// c.setLayerForPart("touchpad", layers[num]); +//}, 2000); Script.scriptEnding.connect(function() { deleteControllerDisplay(c); From 7bbf9bebecff06d2909626b48edf8d2d68e3aaa6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 9 Sep 2016 11:38:14 -0700 Subject: [PATCH 215/300] Tweak tutorial and controllers --- tutorial/tutorial.js | 4 ++-- tutorial/viveHandsv2.js | 28 +++++++++++++--------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 5262e789bf..2d06d06a82 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -356,7 +356,7 @@ stepNearGrab.prototype = { function checkCollides() { var dist = Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position); print(this.tag, "CHECKING...", dist); - if (dist < 0.1) { + if (dist < 0.15) { Script.clearInterval(this.checkCollidesTimer); this.checkCollidesTimer = null; this.soundInjector = Audio.playSound(successSound, { @@ -622,7 +622,7 @@ stepTurnAround.prototype = { var angleDegrees = ((angle / Math.PI) * 180); print("CHECK"); if (!hasTurnedAround) { - if (Math.abs(angleDegrees) > 100) { + if (Math.abs(angleDegrees) > 140) { hasTurnedAround = true; print("half way there..."); } diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 7bbd471622..0d99cede77 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -468,7 +468,7 @@ var VIVE_CONTROLLER_CONFIGURATION = { defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport.jpg", }, arrows: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows-active.jpg", } } }, @@ -621,17 +621,17 @@ function setupController(config) { print("Setting layer...", partName, layerName); if (partName in this.parts) { var part = this.parts[partName]; - print("FOnd", JSON.stringify(part)); + //print("FOnd", JSON.stringify(part)); if (layerName in part.textureLayers) { - print("got it", layerName); + //print("got it", layerName); var layer = part.textureLayers[layerName]; var textures = {}; if (layer.defaultTextureURL) { - print("default texture"); + //print("default texture"); textures[part.textureName] = layer.defaultTextureURL; } for (var i = 0; i < this.partOverlays[partName].length; ++i) { - print("updating", JSON.stringify(textures)); + //print("updating", JSON.stringify(textures)); Overlays.editOverlay(this.partOverlays[partName][i], { textures: textures }); @@ -748,8 +748,8 @@ function setupController(config) { var partPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, part.naturalPosition)); var innerRotation = controller.rotation - Vec3.print("controller", controller.position); - Vec3.print("part", partPosition); + //Vec3.print("controller", controller.position); + //Vec3.print("part", partPosition); controllerDisplay.parts[partName] = controller.parts[partName]; @@ -775,14 +775,14 @@ function setupController(config) { var pct = (value - part.minValue) / part.maxValue; var angle = pct * part.maxAngle; var rotation = Quat.angleAxis(angle, part.axis); - print(value, pct, angle); + //print(value, pct, angle); var offset = { x: 0, y: 0, z: 0 }; if (part.origin) { //print(rotation.x, rotation.y, rotation.z, rotation.w); var offset = Vec3.multiplyQbyV(rotation, part.origin); offset = Vec3.subtract(offset, part.origin); - Vec3.print('offset', offset); + //Vec3.print('offset', offset); //partPosition = Vec3.sum(partPosition, offset); } @@ -799,7 +799,7 @@ function setupController(config) { function resolveHardware(path) { var parts = path.split("."); function resolveInner(base, path, i) { - print(path[i]); + //print(path[i]); if (i >= path.length) { return base; } @@ -812,16 +812,14 @@ function setupController(config) { var xinput = resolveHardware(part.xInput); var yinput = resolveHardware(part.yInput); - print("visible:", visibleInput); - mapping.from([visibleInput]).peek().to(function(value) { - print("visible", value); + //print("visible", value); }); mapping.from([xinput]).peek().to(function(value) { - print("X", value); + //print("X", value); }); mapping.from([yinput]).peek().invert().to(function(value) { - print("Y", value); + //print("Y", value); }); if (part.defaultTextureURL) { var textures = {}; From dee389e204284426154f496c85af5a35d95e37da Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 9 Sep 2016 12:02:23 -0700 Subject: [PATCH 216/300] Fix tutorial sounds --- tutorial/tutorial.js | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 2d06d06a82..873fb1879d 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -175,7 +175,7 @@ function isFunction(functionToCheck) { } }; function playSuccessSound() { - this.soundInjector = Audio.playSound(successSound, { + Audio.playSound(successSound, { position: MyAvatar.position, volume: 0.7, loop: false @@ -268,11 +268,7 @@ stepRaiseAboveHead.prototype = { if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { Script.clearInterval(this.checkIntervalID); this.checkIntervalID = null; - this.soundInjector = Audio.playSound(successSound, { - position: defaultTransform.position, - volume: 0.7, - loop: false - }); + playSuccessSound(); onFinish(); } } @@ -359,11 +355,7 @@ stepNearGrab.prototype = { if (dist < 0.15) { Script.clearInterval(this.checkCollidesTimer); this.checkCollidesTimer = null; - this.soundInjector = Audio.playSound(successSound, { - position: basketPosition, - volume: 0.7, - loop: false - }); + playSuccessSound(); Script.setTimeout(onHit.bind(this), 1000); } } @@ -439,11 +431,7 @@ stepFarGrab.prototype = { print("CHECKING..."); if (Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position) < 0.2) { Script.clearInterval(checkCollidesTimer); - this.soundInjector = Audio.playSound(successSound, { - position: basketPosition, - volume: 0.7, - loop: false - }); + playSuccessSound(); Script.setTimeout(onHit.bind(this), 1000); } } @@ -542,11 +530,7 @@ stepEquip.prototype = { if (Vec3.distance(basketPosition, Entities.getEntityProperties(ammoIDs[i], 'position').position) < 0.25) { Script.clearInterval(this.checkCollidesTimer); this.checkCollidesTimer = null; - this.soundInjector = Audio.playSound(successSound, { - position: basketPosition, - volume: 0.7, - loop: false - }); + playSuccessSound(); Script.setTimeout(onHit.bind(this), 1000); return; } From b3205a651341dee56b5911fd25276e794a317c9e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 9 Sep 2016 12:47:04 -0700 Subject: [PATCH 217/300] Fix teleport overlay on controller --- tutorial/viveHandsv2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 0d99cede77..dfcf682cd2 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -247,7 +247,7 @@ var VIVE_CONTROLLER_CONFIGURATION = { defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", }, teleport: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport.jpg", + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg", }, arrows: { defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", From 3886bcaa7305e41fe8e26eb9eca6ce9f40a826db Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 9 Sep 2016 12:56:41 -0700 Subject: [PATCH 218/300] Fix teleport overlay --- tutorial/viveHandsv2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index dfcf682cd2..8f13775783 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -465,7 +465,7 @@ var VIVE_CONTROLLER_CONFIGURATION = { defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", }, teleport: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport.jpg", + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg", }, arrows: { defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows-active.jpg", From 3fb3e5cf4ce995558812112ae44d9dbc8f862feb Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 12 Sep 2016 15:07:30 -0700 Subject: [PATCH 219/300] Update controller display to cleanup properly when taking HMD off --- tutorial/controllerDisplay.js | 270 +++++++ tutorial/touchControllerConfiguration.js | 142 ++++ tutorial/viveControllerConfiguration.js | 361 +++++++++ tutorial/viveHandsv2.js | 945 ++--------------------- 4 files changed, 839 insertions(+), 879 deletions(-) create mode 100644 tutorial/controllerDisplay.js create mode 100644 tutorial/touchControllerConfiguration.js create mode 100644 tutorial/viveControllerConfiguration.js diff --git a/tutorial/controllerDisplay.js b/tutorial/controllerDisplay.js new file mode 100644 index 0000000000..ecce58e605 --- /dev/null +++ b/tutorial/controllerDisplay.js @@ -0,0 +1,270 @@ +var DEBUG = false; +var VISIBLE_BY_DEFAULT = false; +var PARENT_ID = MyAvatar.sessionUUID; + +createControllerDisplay = function(config) { + var controllerDisplay = { + overlays: [], + partOverlays: { + }, + parts: { + }, + annotations: { + }, + mappingName: "mapping-display", + + setPartVisible: function(partName, visible) { + print("Setting part visible", partName, visible); + if (partName in this.partOverlays) { + print("FOUND"); + for (var i = 0; i < this.partOverlays[partName].length; ++i) { + Overlays.editOverlay(this.partOverlays[partName][i], { + visible: visible + }); + } + } + }, + + setLayerForPart: function(partName, layerName) { + print("Setting layer...", partName, layerName); + if (partName in this.parts) { + var part = this.parts[partName]; + //print("FOnd", JSON.stringify(part)); + if (layerName in part.textureLayers) { + //print("got it", layerName); + var layer = part.textureLayers[layerName]; + var textures = {}; + if (layer.defaultTextureURL) { + //print("default texture"); + textures[part.textureName] = layer.defaultTextureURL; + } + for (var i = 0; i < this.partOverlays[partName].length; ++i) { + //print("updating", JSON.stringify(textures)); + Overlays.editOverlay(this.partOverlays[partName][i], { + textures: textures + }); + } + } + } + } + }; + var mapping = Controller.newMapping(controllerDisplay.mappingName); + for (var i = 0; i < config.controllers.length; ++i) { + var controller = config.controllers[i]; + var position = controller.position; + //position = { x: 0, y: 5, z: 5 }; + Vec3.print("position", position); + print("position", position.x, position.y, position.z); + if (controller.naturalPosition) { + position = Vec3.sum(Vec3.multiplyQbyV( + controller.rotation, controller.naturalPosition), position); + } + Vec3.print("Got controller position", position); + var overlayID = Overlays.addOverlay("model", { + url: controller.modelURL, + dimensions: controller.dimensions, + localRotation: controller.rotation, + localPosition: position, + parentID: PARENT_ID, + parentJointIndex: controller.jointIndex, + ignoreRayIntersection: true, + }); + + controllerDisplay.overlays.push(overlayID); + overlayID = null; + + if (controller.annotations) { + for (var key in controller.annotations) { + var annotation = controller.annotations[key]; + var annotationPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, annotation.position)); + if (DEBUG) { + overlayID = Overlays.addOverlay("sphere", { + localPosition: annotationPosition, + //localPosition: Vec3.sum(controller.position, annotation.position), + //localPosition: Vec3.sum(position, annotation.position), + color: annotation.color || { red: 255, green: 100, blue: 100 }, + dimensions: { + x: 0.01, + y: 0.01, + z: 0.01 + }, + parentID: PARENT_ID, + parentJointIndex: controller.jointIndex, + }); + controllerDisplay.overlays.push(overlayID); + + } + + var ANNOTATION_TEXT_OFFSET = 0.1; + var sign = annotation.direction == "right" ? 1 : -1; + var textOffset = annotation.direction == "right" ? 0.08 : 0.02; + if (annotation.textOffset) { + var pos = Vec3.sum(annotationPosition, Vec3.multiplyQbyV(controller.rotation, annotation.textOffset)); + } else { + var pos = Vec3.sum(annotationPosition, Vec3.multiplyQbyV(controller.rotation, { x: textOffset, y: 0, z: -0.005 })); + } + var textOverlayID = Overlays.addOverlay("text3d", { + visible: VISIBLE_BY_DEFAULT, + text: key, + localPosition: pos, + localRotation: controller.annotationTextRotation, + lineHeight: annotation.lineHeight ? annotation.lineHeight : 0.01, + leftMargin: 0, + rightMargin: 0, + topMargin: 0, + bottomMargin: 0, + backgroundAlpha: 0, + dimensions: { x: 0.003, y: 0.003, z: 0.003 }, + //localPosition: Vec3.sum(controller.position, annotation.position), + //localPosition: Vec3.sum(position, annotation.position), + color: annotation.textColor || { red: 255, green: 255, blue: 255 }, + parentID: PARENT_ID, + parentJointIndex: controller.jointIndex, + }); + + controllerDisplay.overlays.push(textOverlayID); + if (key in controllerDisplay.annotations) { + controllerDisplay.annotations[key].push(textOverlayID); + } else { + controllerDisplay.annotations[key] = [textOverlayID]; + } + + var ANNOTATION_OFFSET = 0.5; + var offset = { x: 0, y: 0, z: annotation.direction == "right" ? -1 * ANNOTATION_OFFSET : ANNOTATION_OFFSET }; + var lineOverlayID = Overlays.addOverlay("line3d", { + visible: false, + localPosition: annotationPosition, + localStart: { x: 0, y: 0, z: 0 }, + localEnd: offset, + //localPosition: Vec3.sum(controller.position, annotation.position), + //localPosition: Vec3.sum(position, annotation.position), + color: annotation.color || { red: 255, green: 100, blue: 100 }, + parentID: PARENT_ID, + parentJointIndex: controller.jointIndex, + }); + controllerDisplay.overlays.push(lineOverlayID); + } + } + + function clamp(value, min, max) { + if (value < min) { + return min; + } else if (value > max) { + return max + } + return value; + } + + if (controller.parts) { + for (var partName in controller.parts) { + var part = controller.parts[partName]; + var partPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, part.naturalPosition)); + var innerRotation = controller.rotation + + //Vec3.print("controller", controller.position); + //Vec3.print("part", partPosition); + + controllerDisplay.parts[partName] = controller.parts[partName]; + + var overlayID = Overlays.addOverlay("model", { + url: part.modelURL, + localPosition: partPosition, + localRotation: innerRotation, + parentID: PARENT_ID, + parentJointIndex: controller.jointIndex, + ignoreRayIntersection: true, + //visible: false + }); + + if (part.type == "rotational") { + var range = part.maxValue - part.minValue; + mapping.from([part.input]).peek().to(function(controller, overlayID, part) { + return function(value) { + //print(value); + //print(JSON.stringify(part)); + + value = clamp(value, part.minValue, part.maxValue); + + var pct = (value - part.minValue) / part.maxValue; + var angle = pct * part.maxAngle; + var rotation = Quat.angleAxis(angle, part.axis); + //print(value, pct, angle); + + var offset = { x: 0, y: 0, z: 0 }; + if (part.origin) { + //print(rotation.x, rotation.y, rotation.z, rotation.w); + var offset = Vec3.multiplyQbyV(rotation, part.origin); + offset = Vec3.subtract(offset, part.origin); + //Vec3.print('offset', offset); + //partPosition = Vec3.sum(partPosition, offset); + } + + var partPosition = Vec3.sum(controller.position, + Vec3.multiplyQbyV(controller.rotation, Vec3.sum(offset, part.naturalPosition))); + + Overlays.editOverlay(overlayID, { + localPosition: partPosition, + localRotation: Quat.multiply(controller.rotation, rotation) + }); + } + }(controller, overlayID, part)); + } else if (part.type == "touchpad") { + function resolveHardware(path) { + var parts = path.split("."); + function resolveInner(base, path, i) { + //print(path[i]); + if (i >= path.length) { + return base; + } + return resolveInner(base[path[i]], path, ++i); + } + return resolveInner(Controller.Hardware, parts, 0); + } + + var visibleInput = resolveHardware(part.visibleInput); + var xinput = resolveHardware(part.xInput); + var yinput = resolveHardware(part.yInput); + + mapping.from([visibleInput]).peek().to(function(value) { + //print("visible", value); + }); + mapping.from([xinput]).peek().to(function(value) { + //print("X", value); + }); + mapping.from([yinput]).peek().invert().to(function(value) { + //print("Y", value); + }); + if (part.defaultTextureURL) { + var textures = {}; + textures[part.textureName] = part.defaultTextureURL; + Overlays.editOverlay(overlayID, { + textures: textures + }); + } + } else if (part.type == "static") { + } else { + print("TYPE NOT SUPPORTED: ", part.type); + } + + controllerDisplay.overlays.push(overlayID); + if (!(partName in controllerDisplay.partOverlays)) { + controllerDisplay.partOverlays[partName] = []; + } + controllerDisplay.partOverlays[partName].push(overlayID); + } + } + } + Controller.enableMapping(controllerDisplay.mappingName); + return controllerDisplay; +} + +ControllerDisplay = function() { +}; + +deleteControllerDisplay = function(controllerDisplay) { + for (var i = 0; i < controllerDisplay.overlays.length; ++i) { + Overlays.deleteOverlay(controllerDisplay.overlays[i]); + } + Controller.disableMapping(controllerDisplay.mappingName); +} + diff --git a/tutorial/touchControllerConfiguration.js b/tutorial/touchControllerConfiguration.js new file mode 100644 index 0000000000..644215ce60 --- /dev/null +++ b/tutorial/touchControllerConfiguration.js @@ -0,0 +1,142 @@ +var CONTROLLER_LENGTH_OFFSET = 0.0762; +var leftBasePosition = { + x: CONTROLLER_LENGTH_OFFSET / 2, + y: CONTROLLER_LENGTH_OFFSET * 2, + z: CONTROLLER_LENGTH_OFFSET / 2 +}; +var rightBasePosition = { + x: -CONTROLLER_LENGTH_OFFSET / 2, + y: CONTROLLER_LENGTH_OFFSET * 2, + z: CONTROLLER_LENGTH_OFFSET / 2 +}; + + +var touchLeftBaseRotation = Quat.multiply( + Quat.fromPitchYawRollDegrees(0, 0, 0), + Quat.multiply( + Quat.fromPitchYawRollDegrees(0, 0, -45), + Quat.multiply( + Quat.fromPitchYawRollDegrees(180, 0, 0), + Quat.fromPitchYawRollDegrees(0, -90, 0) + ) + ) +); + +var touchRightBaseRotation = Quat.multiply( + Quat.fromPitchYawRollDegrees(0, 0, 45), + Quat.multiply( + Quat.fromPitchYawRollDegrees(180, 0, 0), + Quat.fromPitchYawRollDegrees(0, 90, 0) + ) +); + +var TOUCH_CONTROLLER_CONFIGURATION = { + name: "Touch", + controllers: [ + { + modelURL: "C:/Users/Ryan/Assets/controller/oculus_touch_l.fbx", + naturalPosition: { + x: 0.016486000269651413, + y: -0.035518500953912735, + z: -0.018527504056692123 + }, + jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"), + rotation: touchLeftBaseRotation, + position: leftBasePosition, + + annotationTextRotation: Quat.fromPitchYawRollDegrees(20, -90, 0), + annotations: { + + buttonX: { + position: { + x: -0.00931, + y: 0.00212, + z: -0.01259, + }, + direction: "left", + color: { red: 100, green: 100, blue: 100 }, + }, + buttonY: { + position: { + x: -0.01617, + y: 0.00216, + z: 0.00177, + }, + direction: "left", + color: { red: 100, green: 255, blue: 100 }, + }, + bumper: { + position: { + x: 0.00678, + y: -0.02740, + z: -0.02537, + }, + direction: "left", + color: { red: 100, green: 100, blue: 255 }, + }, + trigger: { + position: { + x: -0.01275, + y: -0.01992, + z: 0.02314, + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + } + }, + }, + { + modelURL: "C:/Users/Ryan/Assets/controller/oculus_touch_r.fbx", + naturalPosition: { + x: -0.016486000269651413, + y: -0.035518500953912735, + z: -0.018527504056692123 + }, + jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), + rotation: touchRightBaseRotation, + position: rightBasePosition, + + annotationTextRotation: Quat.fromPitchYawRollDegrees(20, 90, 0), + annotations: { + + buttonA: { + position: { + x: 0.00931, + y: 0.00212, + z: -0.01259, + }, + direction: "right", + color: { red: 100, green: 100, blue: 100 }, + }, + buttonB: { + position: { + x: 0.01617, + y: 0.00216, + z: 0.00177, + }, + direction: "right", + color: { red: 100, green: 255, blue: 100 }, + }, + bumper: { + position: { + x: 0.00678, + y: -0.02740, + z: -0.02537, + }, + direction: "right", + color: { red: 100, green: 100, blue: 255 }, + }, + trigger: { + position: { + x: 0.01275, + y: -0.01992, + z: 0.02314, + }, + direction: "right", + color: { red: 255, green: 100, blue: 100 }, + } + }, + } + ] +} + diff --git a/tutorial/viveControllerConfiguration.js b/tutorial/viveControllerConfiguration.js new file mode 100644 index 0000000000..d2f9403d8a --- /dev/null +++ b/tutorial/viveControllerConfiguration.js @@ -0,0 +1,361 @@ +var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive2.fbx"; + +var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"); +var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"); + +var leftBaseRotation = Quat.multiply( + Quat.fromPitchYawRollDegrees(0, 0, 45), + Quat.multiply( + Quat.fromPitchYawRollDegrees(90, 0, 0), + Quat.fromPitchYawRollDegrees(0, 0, 90) + ) +); + +var rightBaseRotation = Quat.multiply( + Quat.fromPitchYawRollDegrees(0, 0, -45), + Quat.multiply( + Quat.fromPitchYawRollDegrees(90, 0, 0), + Quat.fromPitchYawRollDegrees(0, 0, -90) + ) +); +var CONTROLLER_LENGTH_OFFSET = 0.0762; +var leftBasePosition = { + x: CONTROLLER_LENGTH_OFFSET / 2, + y: CONTROLLER_LENGTH_OFFSET * 2, + z: CONTROLLER_LENGTH_OFFSET / 2 +}; +var rightBasePosition = { + x: -CONTROLLER_LENGTH_OFFSET / 2, + y: CONTROLLER_LENGTH_OFFSET * 2, + z: CONTROLLER_LENGTH_OFFSET / 2 +}; + +var viveNaturalDimensions = { + x: 0.1174320001155138, + y: 0.08361100335605443, + z: 0.21942697931081057 +}; + +var viveNaturalPosition = { + x: 0, + y: -0.034076502197422087, + z: 0.06380049744620919 +}; + +var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_body.fbx"; + +VIVE_CONTROLLER_CONFIGURATION = { + name: "Vive", + controllers: [ + { + modelURL: viveModelURL, + jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"), + naturalPosition: viveNaturalPosition, + rotation: leftBaseRotation, + position: Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, 0, 45), leftBasePosition), + + dimensions: viveNaturalDimensions, + + parts: { + // The touchpad type draws a dot indicating the current touch/thumb position + // and swaps in textures based on the thumb position. + touchpad: { + type: "touchpad", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", + visibleInput: "Vive.RSTouch", + xInput: "Vive.LX", + yInput: "Vive.LY", + naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, + minValue: 0.0, + maxValue: 1.0, + minPosition: { x: -0.035, y: 0.004, z: -0.005 }, + maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, + textureName: "Tex.touchpad-blank", + + defaultTextureLayer: "blank", + textureLayers: { + blank: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", + }, + teleport: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg", + }, + arrows: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", + } + } + }, + + trigger: { + type: "rotational", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trigger.fbx", + input: Controller.Standard.LT, + naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, + origin: { x: 0, y: -0.015, z: -0.00 }, + minValue: 0.0, + maxValue: 1.0, + axis: { x: -1, y: 0, z: 0 }, + maxAngle: 20, + }, + + l_grip: { + type: "static", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_l_grip.fbx", + naturalPosition: {"x":-0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, + }, + + r_grip: { + type: "static", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_r_grip.fbx", + naturalPosition: {"x":0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, + }, + + sys_button: { + type: "static", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_sys_button.fbx", + naturalPosition: {"x":0,"y":0.0020399854984134436,"z":0.08825899660587311}, + }, + + button: { + type: "static", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} + }, + button2: { + type: "static", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} + }, + }, + annotationTextRotation: Quat.fromPitchYawRollDegrees(45, -90, 0), + annotations: { + + left: { + textOffset: { x: -0.035, y: 0.004, z: -0.005 }, + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + right: { + textOffset: { x: 0.023, y: 0.004, z: -0.005 }, + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + + + trigger: { + position: { + x: 0.0055, + y: -0.032978, + z: 0.04546 + }, + lineHeight: 0.013, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + menu: { + position: { + x: 0, + y: 0.00770, + z: 0.01979 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + grip: { + position: { + x: 0.01980, + y: -0.01561, + z: 0.08721 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + steam: { + position: { + x: 0, + y: 0.00303, + z: 0.08838 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + }, + }, + + + + + { + modelURL: viveModelURL, + jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), + + rotation: rightBaseRotation, + position: Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, 0, -45), rightBasePosition), + + dimensions: viveNaturalDimensions, + + naturalPosition: { + x: 0, + y: -0.034076502197422087, + z: 0.06380049744620919 + }, + + parts: { + + // The touchpad type draws a dot indicating the current touch/thumb position + // and swaps in textures based on the thumb position. + touchpad: { + type: "touchpad", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", + visibleInput: "Vive.RSTouch", + xInput: "Vive.RX", + yInput: "Vive.RY", + naturalPosition: { x: 0, y: 0.000979491975158453, z: 0.04872849956154823 }, + minValue: 0.0, + maxValue: 1.0, + minPosition: { x: -0.035, y: 0.004, z: -0.005 }, + maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, + textureName: "Tex.touchpad-blank", + + defaultTextureLayer: "blank", + textureLayers: { + blank: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", + }, + teleport: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg", + }, + arrows: { + defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows-active.jpg", + } + } + }, + + trigger: { + type: "rotational", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trigger.fbx", + input: Controller.Standard.RT, + naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, + origin: { x: 0, y: -0.015, z: -0.00 }, + minValue: 0.0, + maxValue: 1.0, + axis: { x: -1, y: 0, z: 0 }, + maxAngle: 25, + }, + + l_grip: { + type: "static", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_l_grip.fbx", + naturalPosition: {"x":-0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, + }, + + r_grip: { + type: "static", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_r_grip.fbx", + naturalPosition: {"x":0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, + }, + + sys_button: { + type: "static", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_sys_button.fbx", + naturalPosition: {"x":0,"y":0.0020399854984134436,"z":0.08825899660587311}, + }, + + button: { + type: "static", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} + }, + button2: { + type: "static", + modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} + }, + }, + + annotationTextRotation: Quat.fromPitchYawRollDegrees(180 + 45, 90, 180), + annotations: { + + left: { + textOffset: { x: -0.035, y: 0.004, z: -0.005 }, + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + right: { + textOffset: { x: 0.023, y: 0.004, z: -0.005 }, + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + + trigger: { + position: { + x: -0.075, + y: -0.032978, + z: 0.04546 + }, + lineHeight: 0.013, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + menu: { + position: { + x: 0, + y: 0.00770, + z: 0.01979 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + grip: { + position: { + x: 0.01980, + y: -0.01561, + z: 0.08721 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + teleport: { + textOffset: { x: -0.015, y: 0.004, z: -0.005 }, + position: { + x: 0, + y: 0.00378, + z: 0.04920 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + steam: { + position: { + x: 0, + y: 0.00303, + z: 0.08838 + }, + direction: "left", + color: { red: 255, green: 100, blue: 100 }, + }, + } + } + ] +} + diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 8f13775783..17cf0185fb 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -1,918 +1,107 @@ -var PARENT_ID = MyAvatar.sessionUUID; -var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"); -var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"); -//var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("LeftHand"); -//var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("RightHand"); +Script.include("controllerDisplay.js"); +Script.include("viveControllerConfiguration.js"); + +function debug() { + var args = Array.prototype.slice.call(arguments); + args.unshift("CONTROLLER DEBUG:"); + print.apply(this, args); +} var zeroPosition = { x: 0, y: 0, z: 0 }; var zeroRotation = { x: 0, y: 0, z: 0, w: 1 }; -var CONTROLLER_LENGTH_OFFSET = 0.0762; +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// Management of controller display // +/////////////////////////////////////////////////////////////////////////////// -var naturalPosition = { - x: 0, - y: -0.034076502197422087, - z: 0.06380049744620919 -}; -var naturalPositionL = { - x: 0, - y: 0.034076502197422087, - z: 0.06380049744620919 -}; -var naturalPositionR = { - x: 0.0, - y: 0.034076502197422087, - z: 0.06380049744620919 -}; +var controllerDisplay = null; +var activeController = null; +var controllerCheckerIntervalID = null; -var leftBasePosition = { - x: CONTROLLER_LENGTH_OFFSET / 2, - y: CONTROLLER_LENGTH_OFFSET * 2, - z: CONTROLLER_LENGTH_OFFSET / 2 -}; -var rightBasePosition = { - x: -CONTROLLER_LENGTH_OFFSET / 2, - y: CONTROLLER_LENGTH_OFFSET * 2, - z: CONTROLLER_LENGTH_OFFSET / 2 -}; - -var leftBasePositionVive = Vec3.sum(leftBasePosition, { x: 0.005, y: 0.03, z: 0 }); -var rightBasePositionVive = Vec3.sum(rightBasePosition, { x: -0.005, y: 0.03, z: 0 }); - -Vec3.print("left offset: ", leftBasePosition); - -var leftBaseRotation = Quat.multiply( - Quat.fromPitchYawRollDegrees(0, 0, 45), - Quat.multiply( - Quat.fromPitchYawRollDegrees(90, 0, 0), - Quat.fromPitchYawRollDegrees(0, 0, 90) - ) -); - -var rightBaseRotation = Quat.multiply( - Quat.fromPitchYawRollDegrees(0, 0, -45), - Quat.multiply( - Quat.fromPitchYawRollDegrees(90, 0, 0), - Quat.fromPitchYawRollDegrees(0, 0, -90) - ) -); - - -var touchLeftBaseRotation = Quat.multiply( - Quat.fromPitchYawRollDegrees(0, 0, 0), - Quat.multiply( - Quat.fromPitchYawRollDegrees(0, 0, -45), - Quat.multiply( - Quat.fromPitchYawRollDegrees(180, 0, 0), - Quat.fromPitchYawRollDegrees(0, -90, 0) - ) - ) -); - -var touchRightBaseRotation = Quat.multiply( - Quat.fromPitchYawRollDegrees(0, 0, 45), - Quat.multiply( - Quat.fromPitchYawRollDegrees(180, 0, 0), - Quat.fromPitchYawRollDegrees(0, 90, 0) - ) -); - -var TOUCH_CONTROLLER_CONFIGURATION = { - name: "Touch", - controllers: [ - { - modelURL: "C:/Users/Ryan/Assets/controller/oculus_touch_l.fbx", - naturalPosition: { - x: 0.016486000269651413, - y: -0.035518500953912735, - z: -0.018527504056692123 - }, - jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"), - rotation: touchLeftBaseRotation, - position: leftBasePosition, - - annotationTextRotation: Quat.fromPitchYawRollDegrees(20, -90, 0), - annotations: { - - buttonX: { - position: { - x: -0.00931, - y: 0.00212, - z: -0.01259, - }, - direction: "left", - color: { red: 100, green: 100, blue: 100 }, - }, - buttonY: { - position: { - x: -0.01617, - y: 0.00216, - z: 0.00177, - }, - direction: "left", - color: { red: 100, green: 255, blue: 100 }, - }, - bumper: { - position: { - x: 0.00678, - y: -0.02740, - z: -0.02537, - }, - direction: "left", - color: { red: 100, green: 100, blue: 255 }, - }, - trigger: { - position: { - x: -0.01275, - y: -0.01992, - z: 0.02314, - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - } - }, - }, - { - modelURL: "C:/Users/Ryan/Assets/controller/oculus_touch_r.fbx", - naturalPosition: { - x: -0.016486000269651413, - y: -0.035518500953912735, - z: -0.018527504056692123 - }, - jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), - rotation: touchRightBaseRotation, - position: rightBasePosition, - - annotationTextRotation: Quat.fromPitchYawRollDegrees(20, 90, 0), - annotations: { - - buttonA: { - position: { - x: 0.00931, - y: 0.00212, - z: -0.01259, - }, - direction: "right", - color: { red: 100, green: 100, blue: 100 }, - }, - buttonB: { - position: { - x: 0.01617, - y: 0.00216, - z: 0.00177, - }, - direction: "right", - color: { red: 100, green: 255, blue: 100 }, - }, - bumper: { - position: { - x: 0.00678, - y: -0.02740, - z: -0.02537, - }, - direction: "right", - color: { red: 100, green: 100, blue: 255 }, - }, - trigger: { - position: { - x: 0.01275, - y: -0.01992, - z: 0.02314, - }, - direction: "right", - color: { red: 255, green: 100, blue: 100 }, - } - }, - } - ] -} - - -var viveNaturalDimensions = { - x: 0.1174320001155138, - y: 0.08361100335605443, - z: 0.21942697931081057 -}; -var viveNaturalPosition = { - x: 0, - y: -0.034076502197422087, - z: 0.06380049744620919 -}; -var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive2.fbx"; -var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_body.fbx"; - -var VIVE_CONTROLLER_CONFIGURATION = { - name: "Vive", - controllers: [ - { - modelURL: viveModelURL, - jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"), - naturalPosition: viveNaturalPosition, - rotation: leftBaseRotation, - position: Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, 0, 45), leftBasePosition), - - dimensions: viveNaturalDimensions, - - parts: { - //{ - // type: "linear", - // modelURL: "", - // input: "Controller.Hardware.Vive.RT", - // minValue: 0.0, - // maxValue: 1.0, - // textOffset: { x: -0.035, y: 0.004, z: -0.005 }, - // minPosition: { x: -0.035, y: 0.004, z: -0.005 }, - // maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - //}, - - // The touchpad type draws a dot indicating the current touch/thumb position - // and swaps in textures based on the thumb position. - touchpad: { - type: "touchpad", - //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", - visibleInput: "Vive.RSTouch", - xInput: "Vive.LX", - yInput: "Vive.LY", - naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, - minValue: 0.0, - maxValue: 1.0, - minPosition: { x: -0.035, y: 0.004, z: -0.005 }, - maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - textureName: "Tex.touchpad-blank", - - defaultTextureLayer: "blank", - textureLayers: { - blank: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", - }, - teleport: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg", - }, - arrows: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", - } - } - }, - - trigger: { - type: "rotational", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trigger.fbx", - input: Controller.Standard.LT, - naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, - origin: { x: 0, y: -0.015, z: -0.00 }, - minValue: 0.0, - maxValue: 1.0, - axis: { x: -1, y: 0, z: 0 }, - maxAngle: 25, - }, - - l_grip: { - type: "ignore", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_l_grip.fbx", - naturalPosition: {"x":-0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, - }, - - r_grip: { - type: "ignore", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_r_grip.fbx", - naturalPosition: {"x":0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, - }, - - sys_button: { - type: "ignore", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_sys_button.fbx", - naturalPosition: {"x":0,"y":0.0020399854984134436,"z":0.08825899660587311}, - }, - - button: { - type: "ignore", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", - naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} - }, - button2: { - type: "ignore", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", - naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} - }, - }, - annotationTextRotation: Quat.fromPitchYawRollDegrees(45, -90, 0), - annotations: { -// red: { -// debug: true, -// position: { -// x: 0.1, -// y: 0.0, -// z: 0.0 -// }, -// direction: "right", -// color: { red: 255, green: 0, blue: 0 }, -// }, -// green: { -// debug: true, -// position: { -// x: 0.0, -// y: 0.1, -// z: 0.0 -// }, -// direction: "right", -// color: { red: 0, green: 255, blue: 0 }, -// }, -// blue: { -// debug: true, -// position: { -// x: 0.0, -// y: 0.0, -// z: 0.1 -// }, -// direction: "right", -// color: { red: 0, green: 0, blue: 255 }, -// }, -// white: { -// debug: true, -// position: { -// x: 0.0, -// y: 0.0, -// z: 0.0 -// }, -// direction: "right", -// color: { red: 255, green: 255, blue: 255 }, -// }, - - // center: { - // position: zeroPosition, - // direction: "center", - // color: { red: 100, green: 255, blue: 255 }, - // }, - - left: { - textOffset: { x: -0.035, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - right: { - textOffset: { x: 0.023, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - - - trigger: { - position: { - x: 0.0055, - y: -0.032978, - z: 0.04546 - }, - lineHeight: 0.013, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - menu: { - position: { - x: 0, - y: 0.00770, - z: 0.01979 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - grip: { - position: { - x: 0.01980, - y: -0.01561, - z: 0.08721 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - teleport: { - textOffset: { x: -0.015, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - steam: { - position: { - x: 0, - y: 0.00303, - z: 0.08838 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - }, - }, - { - modelURL: viveModelURL, - jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), - - rotation: rightBaseRotation, - position: Vec3.multiplyQbyV(Quat.fromPitchYawRollDegrees(0, 0, -45), rightBasePosition), - - dimensions: viveNaturalDimensions, - - naturalPosition: { - x: 0, - y: -0.034076502197422087, - z: 0.06380049744620919 - }, - - parts: { - //{ - // type: "linear", - // modelURL: "", - // input: "Controller.Hardware.Vive.RT", - // minValue: 0.0, - // maxValue: 1.0, - // textOffset: { x: -0.035, y: 0.004, z: -0.005 }, - // minPosition: { x: -0.035, y: 0.004, z: -0.005 }, - // maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - //}, - - // The touchpad type draws a dot indicating the current touch/thumb position - // and swaps in textures based on the thumb position. - touchpad: { - type: "touchpad", - //modelURL: "file:///C:\\Users\\Ryan\\Assets\\controller\\vive_trackpad.fbx", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", - visibleInput: "Vive.RSTouch", - xInput: "Vive.RX", - yInput: "Vive.RY", - naturalPosition: {"x":0,"y":0.000979491975158453,"z":0.04872849956154823}, - minValue: 0.0, - maxValue: 1.0, - minPosition: { x: -0.035, y: 0.004, z: -0.005 }, - maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - textureName: "Tex.touchpad-blank", - - defaultTextureLayer: "blank", - textureLayers: { - blank: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", - }, - teleport: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg", - }, - arrows: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows-active.jpg", - } - } - }, - - trigger: { - type: "rotational", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trigger.fbx", - input: Controller.Standard.RT, - naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, - origin: { x: 0, y: -0.015, z: -0.00 }, - minValue: 0.0, - maxValue: 1.0, - axis: { x: -1, y: 0, z: 0 }, - maxAngle: 25, - }, - - l_grip: { - type: "ignore", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_l_grip.fbx", - naturalPosition: {"x":-0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, - }, - - r_grip: { - type: "ignore", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_r_grip.fbx", - naturalPosition: {"x":0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, - }, - - sys_button: { - type: "ignore", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_sys_button.fbx", - naturalPosition: {"x":0,"y":0.0020399854984134436,"z":0.08825899660587311}, - }, - - button: { - type: "ignore", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", - naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} - }, - button2: { - type: "ignore", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", - naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} - }, - }, - - annotationTextRotation: Quat.fromPitchYawRollDegrees(180 + 45, 90, 180), - annotations: { - - left: { - textOffset: { x: -0.035, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - right: { - textOffset: { x: 0.023, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - - trigger: { - position: { - x: -0.075, - y: -0.032978, - z: 0.04546 - }, - lineHeight: 0.013, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - menu: { - position: { - x: 0, - y: 0.00770, - z: 0.01979 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - grip: { - position: { - x: 0.01980, - y: -0.01561, - z: 0.08721 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - teleport: { - textOffset: { x: -0.015, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - steam: { - position: { - x: 0, - y: 0.00303, - z: 0.08838 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, +function updateControllers() { + if (HMD.active) { + if ("Vive" in Controller.Hardware) { + if (!activeController) { + debug("Found vive!"); + activeController = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION); + } + // We've found the controllers, we no longer need to look for active controllers + if (controllerCheckerIntervalID) { + Script.clearInterval(controllerCheckerIntervalID); + controllerCheckerIntervalID = null; + } + } else { + debug("HMD active, but no controllers found"); + if (activeController) { + deleteControllerDisplay(activeController); + activeController = null; + } + if (controllerCheckerIntervalID == null) { + controllerCheckerIntervalID = Script.setInterval(updateControllers, 1000); } } - ] -} - -var DEBUG = false; -var VISIBLE_BY_DEFAULT = false; - -function setupController(config) { - var controllerDisplay = { - overlays: [], - partOverlays: { - }, - parts: { - }, - annotations: { - }, - mappingName: "mapping-display", - - setPartVisible: function(partName, visible) { - print("Setting part visible", partName, visible); - if (partName in this.partOverlays) { - print("FOUND"); - for (var i = 0; i < this.partOverlays[partName].length; ++i) { - Overlays.editOverlay(this.partOverlays[partName][i], { - visible: visible - }); - } - } - }, - - setLayerForPart: function(partName, layerName) { - print("Setting layer...", partName, layerName); - if (partName in this.parts) { - var part = this.parts[partName]; - //print("FOnd", JSON.stringify(part)); - if (layerName in part.textureLayers) { - //print("got it", layerName); - var layer = part.textureLayers[layerName]; - var textures = {}; - if (layer.defaultTextureURL) { - //print("default texture"); - textures[part.textureName] = layer.defaultTextureURL; - } - for (var i = 0; i < this.partOverlays[partName].length; ++i) { - //print("updating", JSON.stringify(textures)); - Overlays.editOverlay(this.partOverlays[partName][i], { - textures: textures - }); - } - } - } + } else { + debug("HMD inactive"); + // We aren't in HMD mode, we no longer need to look for active controllers + if (controllerCheckerIntervalID) { + debug("Clearing controller checker interval"); + Script.clearInterval(controllerCheckerIntervalID); + controllerCheckerIntervalID = null; } - }; - var mapping = Controller.newMapping(controllerDisplay.mappingName); - for (var i = 0; i < config.controllers.length; ++i) { - var controller = config.controllers[i]; - var position = controller.position; - if (controller.naturalPosition) { - position = Vec3.sum(Vec3.multiplyQbyV( - controller.rotation, controller.naturalPosition), position); - } - var overlayID = Overlays.addOverlay("model", { - url: controller.modelURL, - dimensions: controller.dimensions, - localRotation: controller.rotation, - localPosition: position, - parentID: PARENT_ID, - parentJointIndex: controller.jointIndex, - ignoreRayIntersection: true, - }); - - controllerDisplay.overlays.push(overlayID); - - if (controller.annotations) { - for (var key in controller.annotations) { - var annotation = controller.annotations[key]; - var annotationPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, annotation.position)); - if (DEBUG) { - overlayID = Overlays.addOverlay("sphere", { - localPosition: annotationPosition, - //localPosition: Vec3.sum(controller.position, annotation.position), - //localPosition: Vec3.sum(position, annotation.position), - color: annotation.color || { red: 255, green: 100, blue: 100 }, - dimensions: { - x: 0.01, - y: 0.01, - z: 0.01 - }, - parentID: PARENT_ID, - parentJointIndex: controller.jointIndex, - }); - controllerDisplay.overlays.push(overlayID); - - } - - var ANNOTATION_TEXT_OFFSET = 0.1; - var sign = annotation.direction == "right" ? 1 : -1; - var textOffset = annotation.direction == "right" ? 0.08 : 0.02; - if (annotation.textOffset) { - var pos = Vec3.sum(annotationPosition, Vec3.multiplyQbyV(controller.rotation, annotation.textOffset)); - } else { - var pos = Vec3.sum(annotationPosition, Vec3.multiplyQbyV(controller.rotation, { x: textOffset, y: 0, z: -0.005 })); - } - var textOverlayID = Overlays.addOverlay("text3d", { - visible: VISIBLE_BY_DEFAULT, - text: key, - localPosition: pos, - localRotation: controller.annotationTextRotation, - lineHeight: annotation.lineHeight ? annotation.lineHeight : 0.01, - leftMargin: 0, - rightMargin: 0, - topMargin: 0, - bottomMargin: 0, - backgroundAlpha: 0, - dimensions: { x: 0.003, y: 0.003, z: 0.003 }, - //localPosition: Vec3.sum(controller.position, annotation.position), - //localPosition: Vec3.sum(position, annotation.position), - color: annotation.textColor || { red: 255, green: 255, blue: 255 }, - parentID: PARENT_ID, - parentJointIndex: controller.jointIndex, - }); - - controllerDisplay.overlays.push(textOverlayID); - if (key in controllerDisplay.annotations) { - controllerDisplay.annotations[key].push(textOverlayID); - } else { - controllerDisplay.annotations[key] = [textOverlayID]; - } - - var ANNOTATION_OFFSET = 0.5; - var offset = { x: 0, y: 0, z: annotation.direction == "right" ? -1 * ANNOTATION_OFFSET : ANNOTATION_OFFSET }; - var lineOverlayID = Overlays.addOverlay("line3d", { - visible: false, - localPosition: annotationPosition, - localStart: { x: 0, y: 0, z: 0 }, - localEnd: offset, - //localPosition: Vec3.sum(controller.position, annotation.position), - //localPosition: Vec3.sum(position, annotation.position), - color: annotation.color || { red: 255, green: 100, blue: 100 }, - parentID: PARENT_ID, - parentJointIndex: controller.jointIndex, - }); - controllerDisplay.overlays.push(lineOverlayID); - } - } - - function clamp(value, min, max) { - if (value < min) { - return min; - } else if (value > max) { - return max - } - return value; - } - - if (controller.parts) { - for (var partName in controller.parts) { - var part = controller.parts[partName]; - var partPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, part.naturalPosition)); - var innerRotation = controller.rotation - - //Vec3.print("controller", controller.position); - //Vec3.print("part", partPosition); - - controllerDisplay.parts[partName] = controller.parts[partName]; - - var overlayID = Overlays.addOverlay("model", { - url: part.modelURL, - localPosition: partPosition, - localRotation: innerRotation, - parentID: PARENT_ID, - parentJointIndex: controller.jointIndex, - ignoreRayIntersection: true, - //visible: false - }); - - if (part.type == "rotational") { - var range = part.maxValue - part.minValue; - mapping.from([part.input]).peek().to(function(controller, overlayID, part) { - return function(value) { - //print(value); - //print(JSON.stringify(part)); - - value = clamp(value, part.minValue, part.maxValue); - - var pct = (value - part.minValue) / part.maxValue; - var angle = pct * part.maxAngle; - var rotation = Quat.angleAxis(angle, part.axis); - //print(value, pct, angle); - - var offset = { x: 0, y: 0, z: 0 }; - if (part.origin) { - //print(rotation.x, rotation.y, rotation.z, rotation.w); - var offset = Vec3.multiplyQbyV(rotation, part.origin); - offset = Vec3.subtract(offset, part.origin); - //Vec3.print('offset', offset); - //partPosition = Vec3.sum(partPosition, offset); - } - - var partPosition = Vec3.sum(controller.position, - Vec3.multiplyQbyV(controller.rotation, Vec3.sum(offset, part.naturalPosition))); - - Overlays.editOverlay(overlayID, { - localPosition: partPosition, - localRotation: Quat.multiply(controller.rotation, rotation) - }); - } - }(controller, overlayID, part)); - } else if (part.type == "touchpad") { - function resolveHardware(path) { - var parts = path.split("."); - function resolveInner(base, path, i) { - //print(path[i]); - if (i >= path.length) { - return base; - } - return resolveInner(base[path[i]], path, ++i); - } - return resolveInner(Controller.Hardware, parts, 0); - } - - var visibleInput = resolveHardware(part.visibleInput); - var xinput = resolveHardware(part.xInput); - var yinput = resolveHardware(part.yInput); - - mapping.from([visibleInput]).peek().to(function(value) { - //print("visible", value); - }); - mapping.from([xinput]).peek().to(function(value) { - //print("X", value); - }); - mapping.from([yinput]).peek().invert().to(function(value) { - //print("Y", value); - }); - if (part.defaultTextureURL) { - var textures = {}; - textures[part.textureName] = part.defaultTextureURL; - Overlays.editOverlay(overlayID, { - textures: textures - }); - } - } else { - print("TYPE NOT SUPPORTED: ", part.type); - } - - controllerDisplay.overlays.push(overlayID); - if (!(partName in controllerDisplay.partOverlays)) { - controllerDisplay.partOverlays[partName] = []; - } - controllerDisplay.partOverlays[partName].push(overlayID); - } + if (activeController) { + debug("Deleting controller"); + deleteControllerDisplay(activeController); + activeController = null; } } - Controller.enableMapping(controllerDisplay.mappingName); - return controllerDisplay; } -ControllerDisplay = function() { -}; - -function deleteControllerDisplay(controllerDisplay) { - for (var i = 0; i < controllerDisplay.overlays.length; ++i) { - Overlays.deleteOverlay(controllerDisplay.overlays[i]); - } - Controller.disableMapping(controllerDisplay.mappingName); -} - -var overlays = [ -]; +HMD.displayModeChanged.connect(updateControllers); +updateControllers(); Messages.subscribe('Controller-Display'); var handleMessages = function(channel, message, sender) { - print("MESSASGE>>>>", channel, message, sender); + if (!activeController) { + return; + } + if (sender === MyAvatar.sessionUUID) { if (channel === 'Controller-Display') { - print('here'); + debug('here'); var data = JSON.parse(message); var name = data.name; var visible = data.visible; //c.setDisplayAnnotation(name, visible); - if (name in c.annotations) { - print("hiding"); - for (var i = 0; i < c.annotations[name].length; ++i) { - print("hiding", i); - Overlays.editOverlay(c.annotations[name][i], { visible: visible }); + if (name in activeController.annotations) { + debug("hiding"); + for (var i = 0; i < activeController.annotations[name].length; ++i) { + debug("hiding", i); + Overlays.editOverlay(activeController.annotations[name][i], { visible: visible }); } } } else if (channel === 'Controller-Display-Parts') { - print('here part'); + debug('here part'); var data = JSON.parse(message); for (var name in data) { var visible = data[name]; - c.setPartVisible(name, visible); + activeController.setPartVisible(name, visible); } } else if (channel === 'Controller-Set-Part-Layer') { var data = JSON.parse(message); for (var name in data) { var layer = data[name]; - c.setLayerForPart(name, layer); + activeController.setLayerForPart(name, layer); } } } } - Messages.messageReceived.connect(handleMessages); -var MAPPING_NAME = "com.highfidelity.handControllerGrab.disable"; -var mapping = Controller.newMapping(MAPPING_NAME); -mapping.from([Controller.Standard.LT]).to(function(value) { - // print(value); - // Overlays.editOverlay(leftTriggerOverlayID, { - // localRotation: Quat.multiply(Quat.fromPitchYawRollDegrees(0, 0, value * -45), leftBaseRotation) - // }); -}); -mapping.from([Controller.Standard.RT]).to(function(value) { - // print(value); - // Overlays.editOverlay(rightTriggerOverlayID, { - // localRotation: Quat.multiply(Quat.fromPitchYawRollDegrees(0, 0, value * 45), rightBaseRotation) - // }); -}); -Controller.enableMapping(MAPPING_NAME); - //var c = setupController(TOUCH_CONTROLLER_CONFIGURATION); -var c = setupController(VIVE_CONTROLLER_CONFIGURATION); +//var c = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION); //c.setPartVisible("touchpad", false); //c.setPartVisible("touchpad_teleport", false); //layers = ["blank", "teleport", 'arrows']; @@ -922,12 +111,10 @@ var c = setupController(VIVE_CONTROLLER_CONFIGURATION); // num = (num + 1) % layers.length; // c.setLayerForPart("touchpad", layers[num]); //}, 2000); - +// Script.scriptEnding.connect(function() { - deleteControllerDisplay(c); - MyAvatar.shouldRenderLocally = true; - for (var i = 0; i < overlays.length; ++i) { - Overlays.deleteOverlay(overlays[i]); + if (activeController) { + deleteControllerDisplay(activeController); } - Controller.disableMapping(MAPPING_NAME); + //MyAvatar.shouldRenderLocally = true; }); From 92670ed0019d93a797838599baed74b9e427dcb4 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 13 Sep 2016 16:28:01 -0700 Subject: [PATCH 220/300] Update tutorial to work with fire --- tutorial/entityData.js | 2 +- tutorial/tutorial.js | 109 +++++++++++++++++++++++++++-------------- 2 files changed, 73 insertions(+), 38 deletions(-) diff --git a/tutorial/entityData.js b/tutorial/entityData.js index e0adf4f32d..55f4c65abe 100644 --- a/tutorial/entityData.js +++ b/tutorial/entityData.js @@ -362,7 +362,7 @@ Step1BlockData = { }, "shape": "Cube", "type": "Box", - "userData": "{}", + "userData": JSON.stringify({ hifiHomeKey: { reset: true } }), }; StepGunData = [ diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 873fb1879d..fdc954b9e0 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -264,11 +264,12 @@ stepRaiseAboveHead.prototype = { this.checkIntervalID = null; function checkForHandsAboveHead() { - print("Checking..."); + print("Checking for hands above head..."); if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { Script.clearInterval(this.checkIntervalID); this.checkIntervalID = null; playSuccessSound(); + location = "/tutorial"; onFinish(); } } @@ -313,12 +314,16 @@ var stepNearGrab = function(name) { } stepNearGrab.prototype = { start: function(onFinish) { + this.finished = false; + this.onFinish = onFinish; + setControllerVisible("trigger", true); var tag = this.tag; // Spawn content set //spawnWithTag(Step1EntityData, null, tag); showEntitiesWithTag(this.tag, { visible: true }); + showEntitiesWithTag('bothGrab', { visible: true }); var basketColliderID = findEntity({ name: NEAR_BASKET_COLLIDER_NAME }, 10000); var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; @@ -344,30 +349,28 @@ stepNearGrab.prototype = { //Vec3.distance( //} - function onHit() { - onFinish(); - } - - // When block collides with basket start step 2 - function checkCollides() { - var dist = Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position); - print(this.tag, "CHECKING...", dist); - if (dist < 0.15) { - Script.clearInterval(this.checkCollidesTimer); - this.checkCollidesTimer = null; - playSuccessSound(); - Script.setTimeout(onHit.bind(this), 1000); - } - } - this.checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); + Messages.subscribe("Entity-Exploded"); + Messages.messageReceived.connect(this.onMessage.bind(this)); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, - cleanup: function() { - setControllerVisible("trigger", false); - if (this.checkCollidesTimer) { - Script.clearInterval(this.checkCollidesTimer); + onMessage: function(channel, message, seneder) { + if (this.finished) { + return; } + if (channel == "Entity-Exploded") { + print("TUTORIAL: Got entity-exploded message"); + var data = parseJSON(message); + if (data.entityID == this.boxID) { + this.finished = true; + this.onFinish(); + } + } + }, + cleanup: function() { + print("cleaning up near grab"); + this.finished = true; + setControllerVisible("trigger", false); hideEntitiesWithTag(this.tag, { visible: false}); deleteEntitiesWithTag(this.tempTag); } @@ -387,6 +390,9 @@ var stepFarGrab = function(name) { } stepFarGrab.prototype = { start: function(onFinish) { + this.finished = false; + this.onFinish = onFinish; + setControllerVisible("trigger", true); Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ farGrabEnabled: true, @@ -421,27 +427,42 @@ stepFarGrab.prototype = { this.boxID = createBlock.bind(this)(); print("Created", this.boxID); - function onHit() { - onFinish(); - } + Messages.subscribe("Entity-Exploded"); + Messages.messageReceived.connect(this.onMessage.bind(this)); // When block collides with basket start step 2 - var checkCollidesTimer = null; - function checkCollides() { - print("CHECKING..."); - if (Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position) < 0.2) { - Script.clearInterval(checkCollidesTimer); - playSuccessSound(); - Script.setTimeout(onHit.bind(this), 1000); - } - } - checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); + //var checkCollidesTimer = null; + // function checkCollides() { + // print("CHECKING..."); + // if (Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position) < 0.2) { + // Script.clearInterval(checkCollidesTimer); + // playSuccessSound(); + // Script.setTimeout(onHit.bind(this), 1000); + // } + // } + // checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, + onMessage: function(channel, message, seneder) { + if (this.finished) { + return; + } + if (channel == "Entity-Exploded") { + print("TUTORIAL: Got entity-exploded message"); + var data = parseJSON(message); + if (data.entityID == this.boxID) { + this.finished = true; + this.onFinish(); + } + } + }, cleanup: function() { + //Messages.messageReceived.disconnect(this.onMessage.bind(this)); + this.finished = true; setControllerVisible("trigger", false); hideEntitiesWithTag(this.tag, { visible: false}); + hideEntitiesWithTag('bothGrab', { visible: false}); deleteEntitiesWithTag(this.tempTag); } }; @@ -524,7 +545,7 @@ stepEquip.prototype = { // When block collides with basket start step 2 function checkCollides() { - print("CHECKING FOR PING PONG..."); + //print("CHECKING FOR PING PONG..."); var ammoIDs = findEntities({ name: GUN_AMMO_NAME }, 15); for (var i = 0; i < ammoIDs.length; ++i) { if (Vec3.distance(basketPosition, Entities.getEntityProperties(ammoIDs[i], 'position').position) < 0.25) { @@ -590,6 +611,16 @@ stepEquip.prototype = { var stepTurnAround = function(name) { this.tag = name; this.tempTag = name + "-temporary"; + + + //var name = "mapping-name"; + //var mapping = Controller.newMapping(name); + //mapping.from([Controller.Actions.StepYaw]).to(function() { + // print("STEPYAW"); + //}); + //Script.scriptEnding.connect(function() { + // Controller.disableMapping(name); + //}); } stepTurnAround.prototype = { start: function(onFinish) { @@ -730,9 +761,13 @@ function showEntitiesWithTag(tag) { editEntitiesWithTag(tag, function(entityID) { var userData = Entities.getEntityProperties(entityID, "userData").userData; var data = parseJSON(userData); + var collisionless = data.visible === false ? true : false; + if (data.collidable !== undefined) { + collisionless = data.collidable === true ? false : true; + } var newProperties = { visible: data.visible == false ? false : true, - collisionless: data.visible == false ? true : false , + collisionless: collisionless, //collisionless: data.collisionless == true ? true : false, }; Entities.editEntity(entityID, newProperties); @@ -769,7 +804,7 @@ function startTutorial() { new stepTeleport("teleport"), new stepFinish("finish"), ] - location = "/tutorial"; + location = "/tutorial_begin"; startNextStep(); } From d8f7850976926207a1fa48e857c05c6d3032472a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 14 Sep 2016 09:52:19 -0700 Subject: [PATCH 221/300] Update tutorial to use new fireworks --- tutorial/entityData.js | 594 +++++++++++++++++++---------------------- tutorial/tutorial.js | 15 +- 2 files changed, 284 insertions(+), 325 deletions(-) diff --git a/tutorial/entityData.js b/tutorial/entityData.js index 55f4c65abe..cd2579f018 100644 --- a/tutorial/entityData.js +++ b/tutorial/entityData.js @@ -1,324 +1,280 @@ Step1EntityData = [ - { - "clientOnly": 0, - "color": { - "blue": 255, - "green": 0, - "red": 255 - }, - "created": "2016-08-29T22:57:55Z", - "dimensions": { - "x": 0.018359377980232239, - "y": 0.018359377980232239, - "z": 0.018359377980232239 - }, - "id": "{3bb83d9c-11db-4bc1-a61b-36921370cb40}", - "name": "tutorial/box_spawn", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "collisionless": 1, - "position": { - "x": 0, - "y": 0.8, - "z": 0.7790381908416748 - }, - "queryAACube": { - "scale": 0.031799376010894775, - "x": -0.015899688005447388, - "y": 0.79706859588623047, - "z": 0.7631385326385498 - }, - "rotation": { - "w": 1, - "x": 0, - "y": 0, - "z": 0 - }, - "shape": "Cube", - "type": "Box", - "userData": "{\"tag\":\"step2\"}", - "visible": 0 - }, - { - "color": { - "blue": 181, - "green": 181, - "red": 181 - }, - "dimensions": { - "x": 0.37322089076042175, - "y": 0.8015166997909546, - "z": 0.37322089076042175 - }, - "name": "tutorial/pillar2", - //"shapeType": "simple-hull", - "position": { - "x": 0.019208565354347229, - "y": -0.1, - "z": 0.75276124477386475 - }, - "rotation": { - "w": 1, - "x": 0, - "y": 0, - "z": 0 - }, - "shape": "Cube", - "type": "Box", - "userData": "{\"tag\":\"step2\"}" - }, - { - "clientOnly": 0, - "compoundShapeURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj", - "created": "2016-08-29T22:57:55Z", - "dimensions": { - "x": 0.57461458444595337, - "y": 0.35781359672546387, - "z": 0.57461458444595337 - }, - "gravity": { - "x": 0, - "y": -5, - "z": 0 - }, - "id": "{2a8a9cb8-4501-4089-8fb8-6b1b5100db10}", - "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx", - "name": "tutorial/basket", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "position": { - "x": 0.022034257650375366, - "y": 0.47968916893005371, - "z": 0 - }, - "queryAACube": { - "scale": 0.88791579008102417, - "x": -0.42192363739013672, - "y": 0.23573127388954163, - "z": -0.44395789504051208 - }, - "rotation": { - "w": 1, - "x": -1.52587890625e-05, - "y": -1.52587890625e-05, - "z": -1.52587890625e-05 - }, - "shapeType": "compound", - "type": "Model", - "userData": "{\"hifiHomeKey\":{\"reset\":true},\"tag\":\"step2\"}" - }, - { - "clientOnly": 0, - "collisionless": 1, - "color": { - "blue": 255, - "green": 0, - "red": 255 - }, - "created": "2016-08-29T22:57:55Z", - "dimensions": { - "x": 0.43770244717597961, - "y": 0.33723857998847961, - "z": 0.43770244717597961 - }, - "id": "{436aec80-15e8-4fc3-bd74-f173b731a922}", - "ignoreForCollisions": 1, - "name": "tutorial/basket_collider", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "position": { - "x": 0.02785143256187439, - "y": 0.50166182518005371, - "z": 0.0017895996570587158 - }, - "queryAACube": { - "scale": 0.70490902662277222, - "x": -0.32460308074951172, - "y": 0.3492073118686676, - "z": -0.35066491365432739 - }, - "rotation": { - "w": 1, - "x": 0, - "y": 0, - "z": 0 - }, - "type": "Sphere", - "userData": "{\"tag\":\"step2\"}", - "visible": 0 - }, - { - "clientOnly": 0, - "color": { - "blue": 181, - "green": 181, - "red": 181 - }, - "created": "2016-08-29T22:57:55Z", - "dimensions": { - "x": 0.37322089076042175, - "y": 0.8015000104904175, - "z": 0.37322089076042175 - }, - "id": "{221be6c2-e0d6-4a7c-b9d4-a77e6b7d1c9a}", - "name": "tutorial/pillar1", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "position": { - "x": 0.019208565354347229, - "y": -0.1, - "z": 0.025902509689331055 - }, - "queryAACube": { - "scale": 1.1320732831954956, - "x": -0.54682809114456177, - "y": -0.5660366415977478, - "z": -0.54013413190841675 - }, - "rotation": { - "w": 1, - "x": 0, - "y": 0, - "z": 0 - }, - "shape": "Cube", - "type": "Box", - "userData": "{\"tag\":\"step2\"}" - } - ]; +{ + "clientOnly": 0, + "color": { + "blue": 255, + "green": 0, + "red": 255 + }, + "created": "2016-08-29T22:57:55Z", + "dimensions": { + "x": 0.018359377980232239, + "y": 0.018359377980232239, + "z": 0.018359377980232239 + }, + "id": "{3bb83d9c-11db-4bc1-a61b-36921370cb40}", + "name": "tutorial/box_spawn", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "collisionless": 1, + "position": { + "x": 0, + "y": 0.8, + "z": 0.7790381908416748 + }, + "queryAACube": { + "scale": 0.031799376010894775, + "x": -0.015899688005447388, + "y": 0.79706859588623047, + "z": 0.7631385326385498 + }, + "rotation": { + "w": 1, + "x": 0, + "y": 0, + "z": 0 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"tag\":\"step2\"}", + "visible": 0 +}, +{ + "color": { + "blue": 181, + "green": 181, + "red": 181 + }, + "dimensions": { + "x": 0.37322089076042175, + "y": 0.8015166997909546, + "z": 0.37322089076042175 + }, + "name": "tutorial/pillar2", + //"shapeType": "simple-hull", + "position": { + "x": 0.019208565354347229, + "y": -0.1, + "z": 0.75276124477386475 + }, + "rotation": { + "w": 1, + "x": 0, + "y": 0, + "z": 0 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"tag\":\"step2\"}" +}, +{ + "clientOnly": 0, + "compoundShapeURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj", + "created": "2016-08-29T22:57:55Z", + "dimensions": { + "x": 0.57461458444595337, + "y": 0.35781359672546387, + "z": 0.57461458444595337 + }, + "gravity": { + "x": 0, + "y": -5, + "z": 0 + }, + "id": "{2a8a9cb8-4501-4089-8fb8-6b1b5100db10}", + "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx", + "name": "tutorial/basket", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 0.022034257650375366, + "y": 0.47968916893005371, + "z": 0 + }, + "queryAACube": { + "scale": 0.88791579008102417, + "x": -0.42192363739013672, + "y": 0.23573127388954163, + "z": -0.44395789504051208 + }, + "rotation": { + "w": 1, + "x": -1.52587890625e-05, + "y": -1.52587890625e-05, + "z": -1.52587890625e-05 + }, + "shapeType": "compound", + "type": "Model", + "userData": "{\"hifiHomeKey\":{\"reset\":true},\"tag\":\"step2\"}" +}, +{ + "clientOnly": 0, + "collisionless": 1, + "color": { + "blue": 255, + "green": 0, + "red": 255 + }, + "created": "2016-08-29T22:57:55Z", + "dimensions": { + "x": 0.43770244717597961, + "y": 0.33723857998847961, + "z": 0.43770244717597961 + }, + "id": "{436aec80-15e8-4fc3-bd74-f173b731a922}", + "ignoreForCollisions": 1, + "name": "tutorial/basket_collider", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 0.02785143256187439, + "y": 0.50166182518005371, + "z": 0.0017895996570587158 + }, + "queryAACube": { + "scale": 0.70490902662277222, + "x": -0.32460308074951172, + "y": 0.3492073118686676, + "z": -0.35066491365432739 + }, + "rotation": { + "w": 1, + "x": 0, + "y": 0, + "z": 0 + }, + "type": "Sphere", + "userData": "{\"tag\":\"step2\"}", + "visible": 0 +}, +{ + "clientOnly": 0, + "color": { + "blue": 181, + "green": 181, + "red": 181 + }, + "created": "2016-08-29T22:57:55Z", + "dimensions": { + "x": 0.37322089076042175, + "y": 0.8015000104904175, + "z": 0.37322089076042175 + }, + "id": "{221be6c2-e0d6-4a7c-b9d4-a77e6b7d1c9a}", + "name": "tutorial/pillar1", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 0.019208565354347229, + "y": -0.1, + "z": 0.025902509689331055 + }, + "queryAACube": { + "scale": 1.1320732831954956, + "x": -0.54682809114456177, + "y": -0.5660366415977478, + "z": -0.54013413190841675 + }, + "rotation": { + "w": 1, + "x": 0, + "y": 0, + "z": 0 + }, + "shape": "Cube", + "type": "Box", + "userData": "{\"tag\":\"step2\"}" +} +]; -//Step1EntityData = [ -// { -// "clientOnly": 0, -// "color": { -// "blue": 255, -// "green": 0, -// "red": 255 -// }, -// "created": "2016-08-23T16:29:15Z", -// "dimensions": { -// "x": 0.018359377980232239, -// "y": 0.018359377980232239, -// "z": 0.018359377980232239 -// }, -// "id": "{387765d2-366d-4775-8e6e-ea45119cf69d}", -// visible: false, -// "name": "tutorial/box_spawn", -// "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", -// "position": { -// "x": 0.016568422317504883, -// "y": 0.6591796875, -// "z": 1.3308790922164917 -// }, -// "queryAACube": { -// "scale": 0.031799376010894775, -// "x": 0.00066873431205749512, -// "y": 0.643280029296875, -// "z": 1.3149794340133667 -// }, -// "shape": "Cube", -// "type": "Box" -// }, -// { -// "clientOnly": 0, -// "compoundShapeURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj", -// "created": "2016-08-22T21:20:11Z", -// "dimensions": { -// "x": 0.57461458444595337, -// "y": 0.35781359672546387, -// "z": 0.57461458444595337 -// }, -// "gravity": { -// "x": 0, -// "y": -5, -// "z": 0 -// }, -// "id": "{ddcb3906-3d80-4111-9171-3a73a2f4f1bb}", -// "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx", -// "name": "tutorial/basket", -// "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", -// "position": { -// "x": 0, -// "y": 0.6480712890625, -// "z": 0 -// }, -// "queryAACube": { -// "scale": 0.88791579008102417, -// "x": -0.44395789504051208, -// "y": 0.20411339402198792, -// "z": -0.44395789504051208 -// }, -// "rotation": { -// "w": 1, -// "x": -1.52587890625e-05, -// "y": -1.52587890625e-05, -// "z": -1.52587890625e-05 -// }, -// "shapeType": "compound", -// "type": "Model", -// "userData": "{\"hifiHomeKey\":{\"reset\":true}}" -// }, -// { -// "clientOnly": 0, -// "created": "2016-08-22T21:22:22Z", -// "dimensions": { -// "x": 2.4929797649383545, -// "y": 0.94968640804290771, -// "z": 1.0870213508605957 -// }, -// "id": "{e7030a2d-f573-4c4b-a0aa-ea80e9e25399}", -// "name": "tutorial/table", -// "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/table2_re-oriented.fbx", -// "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", -// "position": { -// "x": 0.018214225769042969, -// "y": 0, -// "z": 0.60948663949966431 -// }, -// "queryAACube": { -// "scale": 2.8807060718536377, -// "x": -1.4221388101577759, -// "y": -1.4403530359268188, -// "z": -0.83086639642715454 -// }, -// "rotation": { -// "w": 0.70705735683441162, -// "x": -1.52587890625e-05, -// "y": -0.70717936754226685, -// "z": -1.52587890625e-05 -// }, -// "shapeType": "static-mesh", -// "type": "Model" -// }, -// { -// visible: false, -// "clientOnly": 0, -// "collisionless": 1, -// "color": { -// "blue": 255, -// "green": 0, -// "red": 255 -// }, -// "created": "2016-08-23T18:09:44Z", -// "dimensions": { -// "x": 0.43770244717597961, -// "y": 0.33723857998847961, -// "z": 0.43770244717597961 -// }, -// "id": "{54e1d825-b552-48e4-b9c8-1c83c79a673e}", -// "ignoreForCollisions": 1, -// "name": "tutorial/basket_collider", -// "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", -// "position": { -// "x": 0.0058171749114990234, -// "y": 0.6700439453125, -// "z": 0.0017895996570587158 -// }, -// "queryAACube": { -// "scale": 0.70490902662277222, -// "x": -0.34663733839988708, -// "y": 0.31758943200111389, -// "z": -0.35066491365432739 -// }, -// "type": "Sphere" -// } -//]; +birdFirework1 = { + "clientOnly": 0, + "collisionsWillMove": 1, + "created": "2016-09-13T23:05:08Z", + "dimensions": { + "x": 0.10120716691017151, + "y": 0.12002291530370712, + "z": 0.18833979964256287 + }, + "collisionsWillMove": 1, + velocity: { + x: 0, + y: -0.2, + z: 0 + }, + "dynamic": 1, + "gravity": { + "x": 0, + "y": -10, + "z": 0 + }, + "id": "{1c4061bc-b2e7-4435-bc47-3fcc39ae6624}", + "modelURL": "http://hifi-content.s3.amazonaws.com/jimi/tutorialroom/birdStatue15.fbx", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 0.11612319946289062, + "y": 0, + "z": 0.21749019622802734 + }, + "queryAACube": { + "scale": 0.24519434571266174, + "x": -0.0064739733934402466, + "y": -0.12259717285633087, + "z": 0.094893023371696472 + }, + "rotation": { + "w": -0.083054840564727783, + "x": 0.93615627288818359, + "y": 0.34154272079467773, + "z": -0.0073701143264770508 + }, + "shapeType": "simple-hull", + "type": "Model", + "userData": "{\n \"hifiHomeKey\": {\n \"reset\": true\n }\n}" +} ; + +birdFirework2 = { + "clientOnly": 0, + "collisionsWillMove": 1, + "created": "2016-09-12T22:56:48Z", + "dimensions": { + "x": 0.098819166421890259, + "y": 0.11143554747104645, + "z": 0.18833979964256287 + }, + "collisionsWillMove": 1, + velocity: { + x: 0, + y: -0.2, + z: 0 + }, + "dynamic": 1, + "gravity": { + "x": 0, + "y": -10, + "z": 0 + }, + "id": "{ba067084-8d0f-4eeb-a8a1-c6814527c1bb}", + "modelURL": "http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Models/statuebird4.fbx", + "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", + "position": { + "x": 0, + "y": 0.014694660902023315, + "z": 0 + }, + "queryAACube": { + "scale": 0.24011452496051788, + "x": -0.12005726248025894, + "y": -0.10536260157823563, + "z": -0.12005726248025894 + }, + "rotation": { + "w": 0.55410087108612061, + "x": 0.36000609397888184, + "y": -0.33641564846038818, + "z": -0.67092394828796387 + }, + "shapeType": "simple-compound", + "type": "Model", + "userData": "{\n \"hifiHomeKey\": {\n \"reset\": true\n }\n}" +}; + Step1BlockData = { "clientOnly": 0, diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index fdc954b9e0..f2450ef2d1 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -335,8 +335,9 @@ stepNearGrab.prototype = { } var boxSpawnPosition = Entities.getEntityProperties(boxSpawnID, 'position').position; function createBlock() { - Step1BlockData.position = boxSpawnPosition; - return spawnWithTag([Step1BlockData], null, this.tempTag)[0]; + //Step1BlockData.position = boxSpawnPosition; + birdFirework1.position = boxSpawnPosition; + return spawnWithTag([birdFirework1], null, this.tempTag)[0]; } // Enabled grab @@ -361,10 +362,10 @@ stepNearGrab.prototype = { if (channel == "Entity-Exploded") { print("TUTORIAL: Got entity-exploded message"); var data = parseJSON(message); - if (data.entityID == this.boxID) { + //if (data.entityID == this.boxID) { this.finished = true; this.onFinish(); - } + //} } }, cleanup: function() { @@ -393,6 +394,8 @@ stepFarGrab.prototype = { this.finished = false; this.onFinish = onFinish; + showEntitiesWithTag('bothGrab', { visible: true }); + setControllerVisible("trigger", true); Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ farGrabEnabled: true, @@ -417,8 +420,8 @@ stepFarGrab.prototype = { return null; } - Step1BlockData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; - return spawnWithTag([Step1BlockData], null, this.tempTag)[0]; + birdFirework1.position = Entities.getEntityProperties(boxSpawnID, 'position').position; + return spawnWithTag([birdFirework1], null, this.tempTag)[0]; } // Enabled grab From 4adc83da84d92d1dd792959a80a1d64a79eed726 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 14 Sep 2016 10:15:09 -0700 Subject: [PATCH 222/300] Temporarily disable begin area for tutorial --- tutorial/tutorial.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index f2450ef2d1..5153070f44 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -25,8 +25,11 @@ if (!Function.prototype.bind) { return fBound; }; } + Script.include("entityData.js"); +Script.include("viveHandsv2.js"); + var BASKET_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx"; var BASKET_COLLIDER_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj"; //var successSound = SoundCache.getSound(Script.resolvePath("success48.wav")); @@ -269,7 +272,7 @@ stepRaiseAboveHead.prototype = { Script.clearInterval(this.checkIntervalID); this.checkIntervalID = null; playSuccessSound(); - location = "/tutorial"; + //location = "/tutorial"; onFinish(); } } @@ -807,7 +810,8 @@ function startTutorial() { new stepTeleport("teleport"), new stepFinish("finish"), ] - location = "/tutorial_begin"; + //location = "/tutorial_begin"; + location = "/tutorial"; startNextStep(); } From 8d2f558ac393ecfc22ee64802f8d63476b2649c2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 14 Sep 2016 10:17:49 -0700 Subject: [PATCH 223/300] Add proper cleanup on start of tutorial --- tutorial/tutorial.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 5153070f44..ea2684fc89 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -226,7 +226,10 @@ stepWelcome.prototype = { showEntitiesWithTag(this.tag); }, cleanup: function() { - Script.clearTimeout(this.timerID); + if (this.timerID) { + Script.clearTimeout(this.timerID); + this.timerID = null; + } hideEntitiesWithTag(this.tag); } }; @@ -809,7 +812,10 @@ function startTutorial() { new stepTurnAround("turnAround"), new stepTeleport("teleport"), new stepFinish("finish"), - ] + ]; + for (var i = 0; i < STEPS.length; ++i) { + STEPS[i].cleanup(); + } //location = "/tutorial_begin"; location = "/tutorial"; startNextStep(); From 80b53a30d7e5fe8f3810f0312c428ed35f0dfc12 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 14 Sep 2016 11:13:08 -0700 Subject: [PATCH 224/300] Fix success sound for tutorial --- tutorial/tutorial.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index ea2684fc89..7724cb2edf 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -367,6 +367,7 @@ stepNearGrab.prototype = { } if (channel == "Entity-Exploded") { print("TUTORIAL: Got entity-exploded message"); + playSuccessSound(); var data = parseJSON(message); //if (data.entityID == this.boxID) { this.finished = true; @@ -459,6 +460,7 @@ stepFarGrab.prototype = { } if (channel == "Entity-Exploded") { print("TUTORIAL: Got entity-exploded message"); + playSuccessSound(); var data = parseJSON(message); if (data.entityID == this.boxID) { this.finished = true; @@ -818,6 +820,7 @@ function startTutorial() { } //location = "/tutorial_begin"; location = "/tutorial"; + MyAvatar.shouldRenderLocally = false; startNextStep(); } From 09652e24ef9188013d630ab4cabdf48a9deae975 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 14 Sep 2016 16:30:15 -0700 Subject: [PATCH 225/300] Add support for spinner to tutorial --- tutorial/tutorial.js | 86 ++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 38 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 7724cb2edf..ed73c92c5f 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -491,6 +491,9 @@ var stepEquip = function(name) { this.tagPart1 = name + "-part1"; this.tagPart2 = name + "-part2"; this.tempTag = name + "-temporary"; + this.PART1 = 0; + this.PART2 = 1; + this.COMPLETE = 2; } stepEquip.prototype = { start: function(onFinish) { @@ -520,7 +523,7 @@ stepEquip.prototype = { showEntitiesWithTag(this.tag); showEntitiesWithTag(this.tagPart1); - this.hasFinished = false; + this.currentPart = this.PART1; var basketColliderID = findEntity({ name: GUN_BASKET_COLLIDER_NAME }, 10000); var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; @@ -545,56 +548,63 @@ stepEquip.prototype = { this.gunID = createGun.bind(this)(); print("Created", this.gunID); this.onFinish = onFinish; + Messages.subscribe('Tutorial-Spinner'); + Messages.messageReceived.connect(this.onMessage.bind(this)); - function onHit() { - hideEntitiesWithTag(this.tagPart1); - showEntitiesWithTag(this.tagPart2); - print("HIT, wiating for unequip..."); - Messages.subscribe('Hifi-Object-Manipulation'); - Messages.messageReceived.connect(this.onMessage.bind(this)); - } +// function onHit() { +// } +// +// // When block collides with basket start step 2 +// function checkCollides() { +// //print("CHECKING FOR PING PONG..."); +// var ammoIDs = findEntities({ name: GUN_AMMO_NAME }, 15); +// for (var i = 0; i < ammoIDs.length; ++i) { +// if (Vec3.distance(basketPosition, Entities.getEntityProperties(ammoIDs[i], 'position').position) < 0.25) { +// Script.clearInterval(this.checkCollidesTimer); +// this.checkCollidesTimer = null; +// playSuccessSound(); +// Script.setTimeout(onHit.bind(this), 1000); +// return; +// } +// } +// } +// this.checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 100); - // When block collides with basket start step 2 - function checkCollides() { - //print("CHECKING FOR PING PONG..."); - var ammoIDs = findEntities({ name: GUN_AMMO_NAME }, 15); - for (var i = 0; i < ammoIDs.length; ++i) { - if (Vec3.distance(basketPosition, Entities.getEntityProperties(ammoIDs[i], 'position').position) < 0.25) { - Script.clearInterval(this.checkCollidesTimer); - this.checkCollidesTimer = null; - playSuccessSound(); - Script.setTimeout(onHit.bind(this), 1000); - return; - } - } - } - this.checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 100); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, onMessage: function(channel, message, sender) { - if (this.hasFinished) { + if (this.currentPart == this.COMPLETE) { return; } print("Got message", channel, message, sender, MyAvatar.sessionUUID); - //if (sender === MyAvatar.sessionUUID) { - var data = parseJSON(message); - print("Here", data.action, data.grabbedEntity, this.gunID); - if (data.action == 'release' && data.grabbedEntity == this.gunID) { - try { - Messages.messageReceived.disconnect(this.onMessage); - } catch(e) { - } - playSuccessSound(); - print("FINISHED"); - Script.setTimeout(this.onFinish.bind(this), 1500); - this.hasFinished = true; - //this.onFinish(); + if (channel == "Tutorial-Spinner") { + if (this.currentPart == this.PART1 && message == "wasLit") { + hideEntitiesWithTag(this.tagPart1); + showEntitiesWithTag(this.tagPart2); + Messages.subscribe('Hifi-Object-Manipulation'); } - //} + } else if (channel == "Hifi-Object-Manipulation") { + if (this.currentPart == this.PART2) { + var data = parseJSON(message); + print("Here", data.action, data.grabbedEntity, this.gunID); + if (data.action == 'release' && data.grabbedEntity == this.gunID) { + try { + Messages.messageReceived.disconnect(this.onMessage); + } catch(e) { + } + playSuccessSound(); + print("FINISHED"); + Script.setTimeout(this.onFinish.bind(this), 1500); + this.currentPart = this.COMPLETE; + //this.onFinish(); + } + } + } }, cleanup: function() { setControllerVisible("trigger", false); + this.currentPart = this.COMPLETE; try { Messages.messageReceived.disconnect(this.onMessage); } catch(e) { From 8663742dd09e075b86ac7238533eb2def3678bf5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Sep 2016 12:58:31 -0700 Subject: [PATCH 226/300] Add initial orientation step to tutorial --- tutorial/tutorial.js | 108 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 2 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index ed73c92c5f..56a7a76e30 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -234,6 +234,109 @@ stepWelcome.prototype = { } }; +function StayInFrontOverlay(type, properties, distance, positionOffset) { + this.currentOrientation = MyAvatar.orientation; + this.currentPosition = MyAvatar.position; + this.distance = distance; + this.positionOffset = positionOffset; + + var forward = Vec3.multiply(this.distance, Quat.getFront(this.currentOrientation)); + + properties.rotation = this.currentOrientation; + properties.position = Vec3.sum(Vec3.sum(this.currentPosition, forward), this.positionOffset); + this.overlayID = Overlays.addOverlay(type, properties); + + + this.distance = distance; + + this.boundUpdate = this.update.bind(this); + Script.update.connect(this.boundUpdate); +} +StayInFrontOverlay.prototype = { + update: function(dt) { + print("Updating..."); + var targetOrientation = MyAvatar.orientation; + var targetPosition = MyAvatar.position; + this.currentOrientation = Quat.slerp(this.currentOrientation, targetOrientation, 0.05); + this.currentPosition = Vec3.mix(this.currentPosition, targetPosition, 0.05); + + var forward = Vec3.multiply(this.distance, Quat.getFront(this.currentOrientation)); + Overlays.editOverlay(this.overlayID, { + position: Vec3.sum(Vec3.sum(this.currentPosition, forward), this.positionOffset), + rotation: this.currentOrientation, + }); + }, + destroy: function() { + Overlays.deleteOverlay(this.overlayID); + Script.update.disconnect(this.boundUpdate); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: Orient and raise hands above head // +// // +/////////////////////////////////////////////////////////////////////////////// +var stepOrient = function(name) { + this.tag = name; + this.tempTag = name + "-temporary"; +} +stepOrient.prototype = { + start: function(onFinish) { + var tag = this.tag; + + var defaultTransform = { + position: { + x: 0.2459, + y: 0.9011, + z: 0.7266 + }, + rotation: { + x: 0, + y: 0, + z: 0, + w: 1 + } + }; + + this.overlay = new StayInFrontOverlay("model", { + url: "http://hifi-content.s3.amazonaws.com/alan/dev/Prompt-Cards/raiseHands.fbx?11", + ignoreRayIntersection: true, + }, 2, { x: 0, y: 0.3, z: 0 }); + + // Spawn content set + //spawnWithTag(HandsAboveHeadData, defaultTransform, tag); + print("raise hands...", this.tag); + editEntitiesWithTag(this.tag, { visible: true }); + + + this.checkIntervalID = null; + function checkForHandsAboveHead() { + print("Checking for hands above head..."); + if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { + Script.clearInterval(this.checkIntervalID); + this.checkIntervalID = null; + playSuccessSound(); + location = "/tutorial"; + onFinish(); + } + } + this.checkIntervalID = Script.setInterval(checkForHandsAboveHead.bind(this), 500); + }, + cleanup: function() { + if (this.overlay) { + this.overlay.destroy(); + this.overlay = null; + } + if (this.checkIntervalID != null) { + Script.clearInterval(this.checkIntervalID); + } + editEntitiesWithTag(this.tag, { visible: false, collisionless: 1 }); + deleteEntitiesWithTag(this.tempTag); + } +}; + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // // @@ -816,6 +919,7 @@ function startTutorial() { currentStep = null; STEPS = [ new stepDisableControllers("step0"), + new stepOrient("orient"), new stepWelcome("welcome"), new stepRaiseAboveHead("raiseHands"), new stepNearGrab("nearGrab"), @@ -828,8 +932,8 @@ function startTutorial() { for (var i = 0; i < STEPS.length; ++i) { STEPS[i].cleanup(); } - //location = "/tutorial_begin"; - location = "/tutorial"; + location = "/tutorial_begin"; + //location = "/tutorial"; MyAvatar.shouldRenderLocally = false; startNextStep(); } From 7f91491f04e728513410dddfa7563c95e79ece73 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Sep 2016 13:11:50 -0700 Subject: [PATCH 227/300] Add entity scripts for tutorial --- tutorial/firePit/fire.js | 169 ++++++++++++++++++++++++++++++++++++ tutorial/firePit/flicker.js | 51 +++++++++++ tutorial/fuse.js | 74 ++++++++++++++++ tutorial/spinner.js | 66 ++++++++++++++ 4 files changed, 360 insertions(+) create mode 100644 tutorial/firePit/fire.js create mode 100644 tutorial/firePit/flicker.js create mode 100644 tutorial/fuse.js create mode 100644 tutorial/spinner.js diff --git a/tutorial/firePit/fire.js b/tutorial/firePit/fire.js new file mode 100644 index 0000000000..0747bc9f14 --- /dev/null +++ b/tutorial/firePit/fire.js @@ -0,0 +1,169 @@ +// this script turns an entity into an exploder -- anything that collides with it will be vaporized! +// +// + +(function() { + + var _this = this; + + function Fire() { + _this = this; + } + + var RED = { + red: 255, + green: 0, + blue: 0 + }; + + var ORANGE = { + red: 255, + green: 165, + blue: 0 + }; + + var YELLOW = { + red: 255, + green: 255, + blue: 0 + }; + + var GREEN = { + red: 0, + green: 255, + blue: 0 + }; + + var BLUE = { + red: 0, + green: 0, + blue: 255 + }; + + var INDIGO = { + red: 128, + green: 0, + blue: 128 + }; + + var VIOLET = { + red: 75, + green: 0, + blue: 130 + }; + + var colors = [RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET]; + + Fire.prototype = { + preload: function(entityID) { + this.entityID = entityID; + this.EXPLOSION_SOUND = SoundCache.getSound("atp:/firepit/fire_burst.wav"); + print("IN FIRE SCRIPT"); + }, + collisionWithEntity: function(myID, otherID, collisionInfo) { + print("FIRE SCRIPT: COLLIDED"); + var otherProps = Entities.getEntityProperties(otherID); + var data = null; + print("FIRE SCRIPT: 2 COLLIDED"); + try { + print("parsing.."); + data = JSON.parse(otherProps.userData) + print("done parsing.."); + } catch (err) { + print('ERROR GETTING USERDATA!'); + } + print("HERE"); + if (data === null || "") { + return; + } else { + if (data.hasOwnProperty('hifiHomeKey')) { + if (data.hifiHomeKey.reset === true) { + print('FLAMMABLE THING, EXPLODE IT!'); + _this.playSoundAtCurrentPosition(); + _this.explodeWithColor(); + Entities.deleteEntity(otherID) + Messages.sendMessage('Entity-Exploded', JSON.stringify({ + entityID: otherID, + })); + } + } + } + }, + explodeWithColor: function() { + print('EXPLODE!') + var myProps = Entities.getEntityProperties(this.entityID); + var color = colors[Math.floor(Math.random() * colors.length)]; + var explosionParticleProperties = { + "color": color, + "isEmitting": 1, + "maxParticles": 1000, + "lifespan": 0.25, + "emitRate": 1, + "emitSpeed": 0.1, + "speedSpread": 1, + "emitOrientation": Quat.getUp(myProps.rotation), + "emitDimensions": { + "x": 0, + "y": 0, + "z": 0 + }, + "polarStart": 0, + "polarFinish": 0, + "azimuthStart": 0, + "azimuthFinish": 0, + "emitAcceleration": { + "x": 0, + "y": 0, + "z": 0 + }, + "accelerationSpread": { + "x": 0, + "y": 0, + "z": 0 + }, + "particleRadius": 0.829, + "radiusSpread": 0, + "radiusStart": 0.361, + "radiusFinish": 0.294, + "colorSpread": { + "red": 0, + "green": 0, + "blue": 0 + }, + "colorStart": { + "red": 255, + "green": 255, + "blue": 255 + }, + "colorFinish": { + "red": 255, + "green": 255, + "blue": 255 + }, + "alpha": 1, + "alphaSpread": 0, + "alphaStart": -0.2, + "alphaFinish": 0.5, + "emitterShouldTrail": 0, + "textures": "atp:/firepit/explode.png", + "type": "ParticleEffect", + lifetime: 1, + position: myProps.position + }; + + var explosion = Entities.addEntity(explosionParticleProperties); + print('explosion is: ' + explosion) + }, + playSoundAtCurrentPosition: function() { + + var audioProperties = { + volume: 0.5, + position: Entities.getEntityProperties(this.entityID).position + }; + + Audio.playSound(this.EXPLOSION_SOUND, audioProperties); + }, + } + + return new Fire(); +}); diff --git a/tutorial/firePit/flicker.js b/tutorial/firePit/flicker.js new file mode 100644 index 0000000000..43148dabba --- /dev/null +++ b/tutorial/firePit/flicker.js @@ -0,0 +1,51 @@ +(function() { + + var MINIMUM_LIGHT_INTENSITY = 50.0; + var MAXIMUM_LIGHT_INTENSITY = 200.0; + var LIGHT_FALLOFF_RADIUS = 0.1; + var LIGHT_INTENSITY_RANDOMNESS = 0.1; + + function randFloat(low, high) { + return low + Math.random() * (high - low); + } + + var _this; + + function FlickeringFlame() { + _this = this; + } + + var totalTime = 0; + var spacer = 2; + FlickeringFlame.prototype = { + preload: function(entityID) { + this.entityID = entityID; + Script.update.connect(this.update); + }, + update: function(deltaTime) { + + totalTime += deltaTime; + if (totalTime > spacer) { + var howManyAvatars = AvatarList.getAvatarIdentifiers().length; + var intensity = (MINIMUM_LIGHT_INTENSITY + (MAXIMUM_LIGHT_INTENSITY + (Math.sin(totalTime) * MAXIMUM_LIGHT_INTENSITY))); + intensity += randFloat(-LIGHT_INTENSITY_RANDOMNESS, LIGHT_INTENSITY_RANDOMNESS); + + Entities.editEntity(_this.entityID, { + intensity: intensity + }); + + spacer = Math.random(0, 100) * (2 / howManyAvatars); + totalTime = 0; + } else { + //just keep counting + } + }, + unload: function() { + Script.update.disconnect(this.update) + } + } + + return new FlickeringFlame + + +}); \ No newline at end of file diff --git a/tutorial/fuse.js b/tutorial/fuse.js new file mode 100644 index 0000000000..d09dc11bd1 --- /dev/null +++ b/tutorial/fuse.js @@ -0,0 +1,74 @@ +(function() { + var fuseSound = SoundCache.getSound("https://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Sounds/fuse.wav"); + function getChildProperties(entityID, propertyNames) { + var childEntityIDs = Entities.getChildrenIDs(entityID); + var results = {} + for (var i = 0; i < childEntityIDs.length; ++i) { + var childEntityID = childEntityIDs[i]; + var properties = Entities.getEntityProperties(childEntityID, propertyNames); + results[childEntityID] = properties; + } + return results; + } + var Fuse = function() { + }; + Fuse.prototype = { + onLit: function() { + print("LIT", this.entityID); + Entities.editEntity(this.entityID, { + animation: { + currentFrame: 0, + //"lastFrame": 130, + running: 1, + url: "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/fuse/fuse.fbx", + loop: 0 + }, + }); + var injector = Audio.playSound(fuseSound, { + position: Entities.getEntityProperties(this.entityID, 'position').position, + volume: 0.7, + loop: true + }); + + var childrenProps = getChildProperties(this.entityID, ['type']); + for (var childEntityID in childrenProps) { + var props = childrenProps[childEntityID]; + if (props.type == "ParticleEffect") { + Entities.editEntity(childEntityID, { + emitRate: 140, + }); + } else if (props.type == "Light") { + Entities.editEntity(childEntityID, { + visible: true, + }); + } + } + + var self = this; + Script.setTimeout(function() { + print("BLOW UP"); + Entities.callEntityMethod("{dd13fcd5-616f-4749-ab28-2e1e8bc512e9}", "onLit"); + injector.stop(); + + var childrenProps = getChildProperties(self.entityID, ['type']); + for (var childEntityID in childrenProps) { + var props = childrenProps[childEntityID]; + if (props.type == "ParticleEffect") { + Entities.editEntity(childEntityID, { + emitRate: 0, + }); + } else if (props.type == "Light") { + Entities.editEntity(childEntityID, { + visible: false, + }); + } + } + + }, 4900); + }, + preload: function(entityID) { + this.entityID = entityID; + }, + }; + return new Fuse(); +}); diff --git a/tutorial/spinner.js b/tutorial/spinner.js new file mode 100644 index 0000000000..348e250bec --- /dev/null +++ b/tutorial/spinner.js @@ -0,0 +1,66 @@ +(function() { + var spinnerSound = SoundCache.getSound("http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Sounds/Pinwheel.L.wav"); + var Spinner = function() { + }; + function getChildProperties(entityID, propertyNames) { + var childEntityIDs = Entities.getChildrenIDs(entityID); + var results = {} + for (var i = 0; i < childEntityIDs.length; ++i) { + var childEntityID = childEntityIDs[i]; + var properties = Entities.getEntityProperties(childEntityID, propertyNames); + results[childEntityID] = properties; + } + return results; + } + Spinner.prototype = { + onLit: function() { + print("LIT SPINNER", this.entityID); + Entities.editEntity(this.entityID, { + "angularDamping": 0.1, + "angularVelocity": { + "x": 20.471975326538086, + "y": 0, + "z": 0 + }, + }); + var injector = Audio.playSound(spinnerSound, { + position: Entities.getEntityProperties(this.entityID, 'position').position, + volume: 0.7, + loop: true + }); + + print("HERE2"); + var childrenProps = getChildProperties(this.entityID, ['type']); + for (var childEntityID in childrenProps) { + var props = childrenProps[childEntityID]; + if (props.type == "ParticleEffect") { + Entities.editEntity(childEntityID, { + emitRate: 140, + }); + } + } + Messages.sendLocalMessage("Tutorial-Spinner", "wasLit"); + + var self = this; + Script.setTimeout(function() { + print("BLOW UP"); + injector.stop(); + + print("HERE"); + var childrenProps = getChildProperties(self.entityID, ['type']); + for (var childEntityID in childrenProps) { + var props = childrenProps[childEntityID]; + if (props.type == "ParticleEffect") { + Entities.editEntity(childEntityID, { + emitRate: 0, + }); + } + } + }, 4900); + }, + preload: function(entityID) { + this.entityID = entityID; + }, + }; + return new Spinner(); +}); From 55586ccedbef7591bc060b64983a57c67d096d68 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Sep 2016 17:32:25 -0700 Subject: [PATCH 228/300] Update controllers to include tips --- tutorial/controllerDisplay.js | 22 +++++---- tutorial/viveControllerConfiguration.js | 66 ++++++++++++++++++++++--- 2 files changed, 72 insertions(+), 16 deletions(-) diff --git a/tutorial/controllerDisplay.js b/tutorial/controllerDisplay.js index ecce58e605..85dd50ce26 100644 --- a/tutorial/controllerDisplay.js +++ b/tutorial/controllerDisplay.js @@ -1,6 +1,7 @@ var DEBUG = false; var VISIBLE_BY_DEFAULT = false; -var PARENT_ID = MyAvatar.sessionUUID; +//var PARENT_ID = MyAvatar.sessionUUID; +var PARENT_ID = "{00000000-0000-0000-0000-000000000001}"; createControllerDisplay = function(config) { var controllerDisplay = { @@ -166,7 +167,7 @@ createControllerDisplay = function(config) { controllerDisplay.parts[partName] = controller.parts[partName]; - var overlayID = Overlays.addOverlay("model", { + var properties = { url: part.modelURL, localPosition: partPosition, localRotation: innerRotation, @@ -174,7 +175,15 @@ createControllerDisplay = function(config) { parentJointIndex: controller.jointIndex, ignoreRayIntersection: true, //visible: false - }); + }; + + if (part.defaultTextureLayer) { + var textures = {}; + textures[part.textureName] = part.textureLayers[part.defaultTextureLayer].defaultTextureURL; + properties['textures'] = textures; + } + + var overlayID = Overlays.addOverlay("model", properties); if (part.type == "rotational") { var range = part.maxValue - part.minValue; @@ -234,13 +243,6 @@ createControllerDisplay = function(config) { mapping.from([yinput]).peek().invert().to(function(value) { //print("Y", value); }); - if (part.defaultTextureURL) { - var textures = {}; - textures[part.textureName] = part.defaultTextureURL; - Overlays.editOverlay(overlayID, { - textures: textures - }); - } } else if (part.type == "static") { } else { print("TYPE NOT SUPPORTED: ", part.type); diff --git a/tutorial/viveControllerConfiguration.js b/tutorial/viveControllerConfiguration.js index d2f9403d8a..be0bfe5428 100644 --- a/tutorial/viveControllerConfiguration.js +++ b/tutorial/viveControllerConfiguration.js @@ -43,6 +43,7 @@ var viveNaturalPosition = { }; var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_body.fbx"; +var viveTipsModelURL = "https://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Models/vive_tips.fbx" VIVE_CONTROLLER_CONFIGURATION = { name: "Vive", @@ -57,6 +58,33 @@ VIVE_CONTROLLER_CONFIGURATION = { dimensions: viveNaturalDimensions, parts: { + tips: { + type: "static", + modelURL: viveTipsModelURL, + naturalPosition: {"x":-0.004377640783786774,"y":-0.034371938556432724,"z":0.06769277155399323}, + + textureName: "Tex.Blank", + + defaultTextureLayer: "trigger", + textureLayers: { + blank: { + defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Blank.png", + }, + trigger: { + defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Trigger.png", + }, + arrows: { + defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Rotate.png", + }, + grip: { + defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Grip.png", + }, + teleport: { + defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Teleport.png", + }, + } + }, + // The touchpad type draws a dot indicating the current touch/thumb position // and swaps in textures based on the thumb position. touchpad: { @@ -70,10 +98,10 @@ VIVE_CONTROLLER_CONFIGURATION = { maxValue: 1.0, minPosition: { x: -0.035, y: 0.004, z: -0.005 }, maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - textureName: "Tex.touchpad-blank", + disable_textureName: "Tex.touchpad-blank", - defaultTextureLayer: "blank", - textureLayers: { + disable_defaultTextureLayer: "blank", + disable_textureLayers: { blank: { defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", }, @@ -211,6 +239,32 @@ VIVE_CONTROLLER_CONFIGURATION = { }, parts: { + tips: { + type: "static", + modelURL: viveTipsModelURL, + naturalPosition: {"x":-0.004377640783786774,"y":-0.034371938556432724,"z":0.06769277155399323}, + + textureName: "Tex.Blank", + + defaultTextureLayer: "trigger", + textureLayers: { + blank: { + defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Blank.png", + }, + trigger: { + defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Trigger.png", + }, + arrows: { + defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Rotate.png", + }, + grip: { + defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Grip.png", + }, + teleport: { + defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Teleport.png", + }, + } + }, // The touchpad type draws a dot indicating the current touch/thumb position // and swaps in textures based on the thumb position. @@ -225,10 +279,10 @@ VIVE_CONTROLLER_CONFIGURATION = { maxValue: 1.0, minPosition: { x: -0.035, y: 0.004, z: -0.005 }, maxPosition: { x: -0.035, y: 0.004, z: -0.005 }, - textureName: "Tex.touchpad-blank", + disable_textureName: "Tex.touchpad-blank", - defaultTextureLayer: "blank", - textureLayers: { + disable_defaultTextureLayer: "blank", + disable_textureLayers: { blank: { defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", }, From a6fadd2fa8fbe304a24d381df6b0ddc9a1387e91 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Sep 2016 17:32:50 -0700 Subject: [PATCH 229/300] Update fuse and add collider --- tutorial/fuse.js | 49 +++++++++++++++++++++++++++++--- tutorial/fuseCollider.js | 60 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 4 deletions(-) create mode 100644 tutorial/fuseCollider.js diff --git a/tutorial/fuse.js b/tutorial/fuse.js index d09dc11bd1..48efeb28e6 100644 --- a/tutorial/fuse.js +++ b/tutorial/fuse.js @@ -1,4 +1,38 @@ (function() { + var findEntity = function(properties, searchRadius, filterFn) { + var entities = findEntities(properties, searchRadius, filterFn); + return entities.length > 0 ? entities[0] : null; + } + + // Return all entities with properties `properties` within radius `searchRadius` + var findEntities = function(properties, searchRadius, filterFn) { + if (!filterFn) { + filterFn = function(properties, key, value) { + return value == properties[key]; + } + } + searchRadius = searchRadius ? searchRadius : 100000; + var entities = Entities.findEntities({ x: 0, y: 0, z: 0 }, searchRadius); + var matchedEntities = []; + var keys = Object.keys(properties); + for (var i = 0; i < entities.length; ++i) { + var match = true; + var candidateProperties = Entities.getEntityProperties(entities[i], keys); + for (var key in properties) { + if (!filterFn(properties, key, candidateProperties[key])) { + // This isn't a match, move to next entity + match = false; + break; + } + } + if (match) { + matchedEntities.push(entities[i]); + } + } + + return matchedEntities; + } + var fuseSound = SoundCache.getSound("https://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Sounds/fuse.wav"); function getChildProperties(entityID, propertyNames) { var childEntityIDs = Entities.getChildrenIDs(entityID); @@ -13,12 +47,18 @@ var Fuse = function() { }; Fuse.prototype = { - onLit: function() { + light: function() { print("LIT", this.entityID); + var anim = Entities.getEntityProperties(this.entityID, ['animation']).animation; + print("anim: ", anim.currentFrame, Object.keys(anim)); + + if (anim.currentFrame < 140) { + return; + } Entities.editEntity(this.entityID, { animation: { - currentFrame: 0, - //"lastFrame": 130, + currentFrame: 1, + lastFrame: 150, running: 1, url: "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/fuse/fuse.fbx", loop: 0 @@ -47,7 +87,8 @@ var self = this; Script.setTimeout(function() { print("BLOW UP"); - Entities.callEntityMethod("{dd13fcd5-616f-4749-ab28-2e1e8bc512e9}", "onLit"); + var spinnerID = findEntity({ name: "tutorial/equip/spinner" }, 20); + Entities.callEntityMethod(spinnerID, "onLit"); injector.stop(); var childrenProps = getChildProperties(self.entityID, ['type']); diff --git a/tutorial/fuseCollider.js b/tutorial/fuseCollider.js new file mode 100644 index 0000000000..dd8195d9b0 --- /dev/null +++ b/tutorial/fuseCollider.js @@ -0,0 +1,60 @@ +(function() { + var findEntity = function(properties, searchRadius, filterFn) { + var entities = findEntities(properties, searchRadius, filterFn); + return entities.length > 0 ? entities[0] : null; + } + + // Return all entities with properties `properties` within radius `searchRadius` + var findEntities = function(properties, searchRadius, filterFn) { + if (!filterFn) { + filterFn = function(properties, key, value) { + return value == properties[key]; + } + } + searchRadius = searchRadius ? searchRadius : 100000; + var entities = Entities.findEntities({ x: 0, y: 0, z: 0 }, searchRadius); + var matchedEntities = []; + var keys = Object.keys(properties); + for (var i = 0; i < entities.length; ++i) { + var match = true; + var candidateProperties = Entities.getEntityProperties(entities[i], keys); + for (var key in properties) { + if (!filterFn(properties, key, candidateProperties[key])) { + // This isn't a match, move to next entity + match = false; + break; + } + } + if (match) { + matchedEntities.push(entities[i]); + } + } + + return matchedEntities; + } + + function getChildProperties(entityID, propertyNames) { + var childEntityIDs = Entities.getChildrenIDs(entityID); + var results = {} + for (var i = 0; i < childEntityIDs.length; ++i) { + var childEntityID = childEntityIDs[i]; + var properties = Entities.getEntityProperties(childEntityID, propertyNames); + results[childEntityID] = properties; + } + return results; + } + + var Fuse = function() { + }; + Fuse.prototype = { + onLit: function() { + print("LIT", this.entityID); + var fuseID = findEntity({ name: "tutorial/equip/fuse" }, 20); + Entities.callEntityMethod(fuseID, "light"); + }, + preload: function(entityID) { + this.entityID = entityID; + }, + }; + return new Fuse(); +}); From 1975343496bb934300698abf5ca9b2e5342b09d6 Mon Sep 17 00:00:00 2001 From: Thijs Wenker Date: Thu, 15 Sep 2016 17:33:00 -0700 Subject: [PATCH 230/300] Add butane lighter --- tutorial/lighter/butaneLighter.js | 188 ++++++++++++++++++++ tutorial/lighter/createButaneLighter.js | 219 ++++++++++++++++++++++++ 2 files changed, 407 insertions(+) create mode 100644 tutorial/lighter/butaneLighter.js create mode 100644 tutorial/lighter/createButaneLighter.js diff --git a/tutorial/lighter/butaneLighter.js b/tutorial/lighter/butaneLighter.js new file mode 100644 index 0000000000..2592d8ec4a --- /dev/null +++ b/tutorial/lighter/butaneLighter.js @@ -0,0 +1,188 @@ +// +// Created by Thijs Wenker on September 14, 2016. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +(function() { + var _this; + + function getResourceURL(file) { + return 'http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/' + file; + }; + + const LIGHTER_ON_SOUND_URL = getResourceURL('Sounds/lighter_on.wav'); + const BUTANE_SOUND_URL = getResourceURL('Sounds/butane.wav'); + + // TODO: fix this in the client, changing the sound volume while a sound is playing doesn't seem to work right now + const DYNAMIC_SOUND_VOLUME = false; + const BUTANE_MIN_SOUND_VOLUME = 0.05; + + const FLAME_LENGTH = 0.05; + + const BUTANE_SOUND_SETTINGS = { + volume: 0.4, + loop: true, + playbackGap: 1000, + playbackGapRange: 1000 + }; + + const LIGHTER_ON_SOUND_SETTINGS = { + volume: 0.5, + loop: false + }; + + function RemoteLogSender(channel, identifier) { + this.channel = channel; + this.identifier = identifier; + } + + RemoteLogSender.prototype = { + channel: null, + identifier: null, + debug: function(message) { + Messages.sendLocalMessage(this.channel, JSON.stringify({ + message: '[DEBUG ' + this.identifier + '] ' + message + })); + } + }; + + var remoteLogSender = null; + + function debugPrint(message) { + if (remoteLogSender !== null) { + remoteLogSender.debug(message); + } + } + + ButaneLighter = function() { + _this = this; + _this.triggerValue = 0.0; // be sure to set this value in the constructor, otherwise it will be a shared value + _this.isFiring = false; + } + + ButaneLighter.prototype = { + entityID: null, + lighterOnSound: null, + butaneSound: null, + lighterOnSoundInjector: null, + butaneSoundInjector: null, + butaneSoundInjectorOptions: null, + lighterParticleEntity: null, + buttonBeingPressed: null, + triggerValue: null, + isFiring: null, + getLighterParticleEntity: function() { + var result = null; + Entities.getChildrenIDs(_this.entityID).forEach(function(entity) { + var name = Entities.getEntityProperties(entity, ['name']).name; + if (name === 'lighter_particle') { + result = entity; + } + }); + return result; + }, + preload: function(entityID) { + _this.entityID = entityID; + _this.lighterOnSound = SoundCache.getSound(LIGHTER_ON_SOUND_URL); + _this.butaneSound = SoundCache.getSound(BUTANE_SOUND_URL); + var properties = Entities.getEntityProperties(_this.entityID, ['userData']); + try { + var userData = JSON.parse(properties.userData); + if (userData['debug'] !== undefined && userData['debug']['sessionUUID'] === MyAvatar.sessionUUID && + userData['debug']['channel'] !== undefined) + { + remoteLogSender = new RemoteLogSender(userData['debug']['channel'], _this.entityID); + remoteLogSender.debug('Debugger initialized'); + } + } catch (e) { + //failed to detect if we have a debugger + } + debugPrint(_this.getLighterParticleEntity()); + }, + startEquip: function(entityID, args) { + _this.lighterParticleEntity = _this.getLighterParticleEntity(); + }, + continueEquip: function(entityID, args) { + _this.triggerValue = Controller.getValue(args[0] === 'left' ? Controller.Standard.LT : Controller.Standard.RT); + if (_this.triggerValue > 0.2) { + if (!_this.isFiring) { + _this.startFiring(); + } + _this.tryToIgnite(); + _this.updateButaneSound() + return; + } + _this.stopFiring(); + }, + startFiring: function() { + if (_this.isFiring) { + return; + } + _this.isFiring = true; + if (_this.lighterOnSound.downloaded) { + // We don't want to override the default volume setting, so lets clone the default SETTINGS object + var lighterOnOptions = JSON.parse(JSON.stringify(LIGHTER_ON_SOUND_SETTINGS)); + lighterOnOptions['position'] = Entities.getEntityProperties(_this.entityID, ['position']).position; + _this.lighterOnSoundInjector = Audio.playSound(_this.lighterOnSound, lighterOnOptions); + } + if (_this.butaneSound.downloaded) { + _this.butaneSoundInjectorOptions = JSON.parse(JSON.stringify(BUTANE_SOUND_SETTINGS)); + _this.butaneSoundInjectorOptions['position'] = Entities.getEntityProperties(_this.lighterParticleEntity, ['position']).position; + if (DYNAMIC_SOUND_VOLUME) { + _this.butaneSoundInjectorOptions['volume'] = BUTANE_MIN_SOUND_VOLUME; + } + _this.butaneSoundInjector = Audio.playSound(_this.butaneSound, _this.butaneSoundInjectorOptions); + } + Entities.editEntity(_this.lighterParticleEntity, {isEmitting: _this.isFiring}); + + }, + stopFiring: function() { + if (!_this.isFiring) { + return; + } + _this.isFiring = false; + Entities.editEntity(_this.lighterParticleEntity, {isEmitting: _this.isFiring}); + _this.stopButaneSound(); + }, + tryToIgnite: function() { + var flameProperties = Entities.getEntityProperties(_this.lighterParticleEntity, ['position', 'rotation']); + var pickRay = { + origin: flameProperties.position, + direction: Quat.getFront(flameProperties.rotation) + } + var intersection = Entities.findRayIntersection(pickRay, true); + if (intersection.intersects) { + debugPrint(JSON.stringify(intersection)); + } + }, + releaseEquip: function(entityID, args) { + _this.stopFiring(); + // reset trigger value; + _this.triggerValue = 0.0; + }, + updateButaneSound: function() { + if (_this.butaneSoundInjector !== null && _this.butaneSoundInjector.isPlaying()) { + _this.butaneSoundInjectorOptions = _this.butaneSoundInjector.options; + _this.butaneSoundInjectorOptions['position'] = Entities.getEntityProperties(_this.entityID, ['position']).position; + if (DYNAMIC_SOUND_VOLUME) { + _this.butaneSoundInjectorOptions['volume'] = ((BUTANE_SOUND_SETTINGS.volume - BUTANE_MIN_SOUND_VOLUME) * + _this.triggerValue) + BUTANE_MIN_SOUND_VOLUME; + } + _this.butaneSoundInjector.options = _this.butaneSoundInjectorOptions; + } + }, + stopButaneSound: function() { + if (_this.butaneSoundInjector !== null && _this.butaneSoundInjector.isPlaying()) { + _this.butaneSoundInjector.stop(); + } + _this.butaneSoundInjector = null; + }, + unload: function() { + _this.stopButaneSound(); + }, + }; + return new ButaneLighter(); +}) diff --git a/tutorial/lighter/createButaneLighter.js b/tutorial/lighter/createButaneLighter.js new file mode 100644 index 0000000000..ec305ecb05 --- /dev/null +++ b/tutorial/lighter/createButaneLighter.js @@ -0,0 +1,219 @@ +// +// Created by Thijs Wenker on September 14, 2016. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +const TEST_MODE = false; +const SCRIPT_URL = 'https://dl.dropboxusercontent.com/u/14997455/hifi/butaneLighter/butaneLighter.js?v=' + Date.now(); +//const SCRIPT_URL = Script.resolvePath("butaneLighter.js"); + +function getResourceURL(file) { + return 'http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/' + file; +}; + +//Creates an entity and returns a mixed object of the creation properties and the assigned entityID +var createEntity = function(entityProperties, parent) { + if (parent.rotation !== undefined) { + if (entityProperties.rotation !== undefined) { + entityProperties.rotation = Quat.multiply(parent.rotation, entityProperties.rotation); + } else { + entityProperties.rotation = parent.rotation; + } + } + if (parent.position !== undefined) { + var localPosition = (parent.rotation !== undefined) ? Vec3.multiplyQbyV(parent.rotation, entityProperties.position) : entityProperties.position; + entityProperties.position = Vec3.sum(localPosition, parent.position) + } + if (parent.id !== undefined) { + entityProperties.parentID = parent.id; + } + entityProperties.id = Entities.addEntity(entityProperties); + return entityProperties; +}; + +createButaneLighter = function(transform) { + var entityProperties = { + collisionsWillMove: true, + dimensions: { + x: 0.025599999353289604, + y: 0.057399999350309372, + z: 0.37419998645782471 + }, + dynamic: true, + gravity: { + x: 0, + y: -9.8, + z: 0 + }, + velocity: { + x: 0, + y: -0.01, + z: 0 + }, + modelURL: getResourceURL('Models/lighterIceCreamSandwich.fbx'), + name: 'BrutaneLighter', + shapeType: 'simple-compound', + type: 'Model', + userData: JSON.stringify({ + tag: "equip-temporary", + grabbableKey: { + invertSolidWhileHeld: true + }, + wearable: { + joints: { + RightHand: [{ + x: 0.029085848480463028, + y: 0.09807153046131134, + z: 0.03062543272972107 + }, { + x: 0.5929139256477356, + y: 0.3207578659057617, + z: 0.7151655554771423, + w: -0.18468326330184937 + }], + LeftHand: [{ + x: -0.029085848480463028, + y: 0.09807153046131134, + z: 0.03062543272972107 + }, { + x: -0.5929139256477356, + y: 0.3207578659057617, + z: 0.7151655554771423, + w: -0.18468326330184937 + }] + } + } + }), + script: SCRIPT_URL + }; + return createEntity(entityProperties, transform); +} + +function createFireParticle(butaneLighter) { + var entityProperties = { + userData: JSON.stringify({ tag: "equip-temporary" }), + accelerationSpread: { + x: 0.1, + y: 0, + z: 0.1 + }, + alpha: 0.039999999105930328, + alphaFinish: 0.039999999105930328, + alphaStart: 0.039999999105930328, + azimuthFinish: 0.039999999105930328, + azimuthStart: 0, + dimensions: { + x: 0.49194091558456421, + y: 0.49194091558456421, + z: 0.49194091558456421 + }, + emitAcceleration: { + x: 0, + y: 0, + z: 0 + }, + emitOrientation: { + w: 1, + x: -1.52587890625e-05, + y: -1.52587890625e-05, + z: -1.52587890625e-05 + }, + emitRate: 770, + emitSpeed: 0.014000000432133675, + isEmitting: false, + lifespan: 0.37000000476837158, + maxParticles: 820, + name: 'lighter_particle', + particleRadius: 0.0027000000700354576, + position: { + x: -0.00044769048690795898, + y: 0.016354814171791077, + z: 0.19217036664485931 + }, + radiusFinish: 0.0027000000700354576, + radiusSpread: 3, + radiusStart: 0.0027000000700354576, + rotation: { + w: 1, + x: -0.0001678466796875, + y: -1.52587890625e-05, + z: -1.52587890625e-05 + }, + speedSpread: 0.56999999284744263, + textures: 'atp:/textures/fire3.png', + type: 'ParticleEffect', + + + "color": { + "red": 255, + "green": 255, + "blue": 255 + }, + "isEmitting": 0, + "maxParticles": 820, + "lifespan": 0.28, + "emitRate": 1100, + "emitSpeed": 0.007, + "speedSpread": 0.5699999928474426, + "emitOrientation": { + "x": -0.0000152587890625, + "y": -0.0000152587890625, + "z": -0.0000152587890625, + "w": 1 + }, + "emitDimensions": { + "x": 0, + "y": 0, + "z": 0 + }, + "polarStart": 0, + "polarFinish": 0, + "azimuthStart": 0, + "azimuthFinish": 0.03999999910593033, + "emitAcceleration": { + "x": 0, + "y": 0, + "z": 0 + }, + "accelerationSpread": { + "x": 0, + "y": 0, + "z": 0 + }, + "particleRadius": 0.0037, + "radiusSpread": 3, + "radiusStart": 0.008, + "radiusFinish": 0.0004, + "colorSpread": { + "red": 0, + "green": 0, + "blue": 0 + }, + "colorStart": { + "red": 255, + "green": 255, + "blue": 255 + }, + "colorFinish": { + "red": 255, + "green": 255, + "blue": 255 + }, + "alpha": 0.03999999910593033, + "alphaSpread": 0, + "alphaStart": 0.141, + "alphaFinish": 0.02, + "emitterShouldTrail": 0, + "textures": "atp:/textures/fire3.png" + }; + return createEntity(entityProperties, butaneLighter); +} + +doCreateButaneLighter = function(transform) { + var butaneLighter = createButaneLighter(transform); + createFireParticle(butaneLighter); + return butaneLighter; +} From d9cec7f4c717485311528b8296c24b5cfccf1d06 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Sep 2016 17:33:45 -0700 Subject: [PATCH 231/300] Update tutorial to work with lighter and tips --- tutorial/tutorial.js | 71 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 56a7a76e30..ac6359c7fb 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -29,6 +29,7 @@ if (!Function.prototype.bind) { Script.include("entityData.js"); Script.include("viveHandsv2.js"); +Script.include("lighter/createButaneLighter.js"); var BASKET_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx"; var BASKET_COLLIDER_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj"; @@ -74,6 +75,21 @@ findEntities = function(properties, searchRadius, filterFn) { } // On start tutorial... + +function triggerHapticPulse() { + function scheduleHaptics(delay, strength, duration) { + Script.setTimeout(function() { + Controller.triggerHapticPulse(strength, duration, 0); + Controller.triggerHapticPulse(strength, duration, 1); + }, delay); + } + scheduleHaptics(0, 0.8, 100); + scheduleHaptics(300, 0.5, 100); + scheduleHaptics(600, 0.3, 100); + scheduleHaptics(900, 0.2, 100); + scheduleHaptics(1200, 0.1, 100); +} + // Load assets var NEAR_BOX_SPAWN_NAME = "tutorial/nearGrab/box_spawn"; var FAR_BOX_SPAWN_NAME = "tutorial/farGrab/box_spawn"; @@ -205,6 +221,7 @@ stepDisableControllers.prototype = { farGrabEnabled: false, })); setControllerPartLayer('touchpad', 'blank'); + setControllerPartLayer('tips', 'grip'); onFinish(); }, cleanup: function() { @@ -254,7 +271,6 @@ function StayInFrontOverlay(type, properties, distance, positionOffset) { } StayInFrontOverlay.prototype = { update: function(dt) { - print("Updating..."); var targetOrientation = MyAvatar.orientation; var targetPosition = MyAvatar.position; this.currentOrientation = Quat.slerp(this.currentOrientation, targetOrientation, 0.05); @@ -394,6 +410,7 @@ stepRaiseAboveHead.prototype = { }; function setControllerVisible(name, visible) { + return; Messages.sendLocalMessage('Controller-Display', JSON.stringify({ name: name, visible: visible, @@ -427,6 +444,7 @@ stepNearGrab.prototype = { this.onFinish = onFinish; setControllerVisible("trigger", true); + setControllerPartLayer('tips', 'trigger'); var tag = this.tag; // Spawn content set @@ -482,6 +500,7 @@ stepNearGrab.prototype = { print("cleaning up near grab"); this.finished = true; setControllerVisible("trigger", false); + setControllerPartLayer('tips', 'blank'); hideEntitiesWithTag(this.tag, { visible: false}); deleteEntitiesWithTag(this.tempTag); } @@ -507,6 +526,7 @@ stepFarGrab.prototype = { showEntitiesWithTag('bothGrab', { visible: true }); setControllerVisible("trigger", true); + setControllerPartLayer('tips', 'trigger'); Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ farGrabEnabled: true, })); @@ -575,6 +595,7 @@ stepFarGrab.prototype = { //Messages.messageReceived.disconnect(this.onMessage.bind(this)); this.finished = true; setControllerVisible("trigger", false); + setControllerPartLayer('tips', 'blank'); hideEntitiesWithTag(this.tag, { visible: false}); hideEntitiesWithTag('bothGrab', { visible: false}); deleteEntitiesWithTag(this.tempTag); @@ -601,6 +622,7 @@ var stepEquip = function(name) { stepEquip.prototype = { start: function(onFinish) { setControllerVisible("trigger", true); + setControllerPartLayer('tips', 'trigger'); Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ holdEnabled: true, })); @@ -638,17 +660,24 @@ stepEquip.prototype = { return null; } + var transform = {}; + GunData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; GunData.rotation = Entities.getEntityProperties(boxSpawnID, 'rotation').rotation; + transform.position = Entities.getEntityProperties(boxSpawnID, 'position').position; + transform.rotation = Entities.getEntityProperties(boxSpawnID, 'rotation').rotation; + this.spawnTransform = transform; Vec3.print("spawn", GunData.position); print("Adding: ", JSON.stringify(GunData)); - return spawnWithTag([GunData], null, this.tempTag)[0]; + return doCreateButaneLighter(transform).id;//spawnWithTag([GunData], null, this.tempTag)[0]; } + // Enabled grab // Create table ? // Create blocks and basket this.gunID = createGun.bind(this)(); + this.startWatchingGun(); print("Created", this.gunID); this.onFinish = onFinish; Messages.subscribe('Tutorial-Spinner'); @@ -676,6 +705,23 @@ stepEquip.prototype = { // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, + startWatchingGun: function() { + if (!this.watcherIntervalID) { + this.watcherIntervalID = Script.setInterval(function() { + var props = Entities.getEntityProperties(this.gunID, ['position']); + if (props.position.y < -0.4 + || Vec3.distance(this.spawnTransform.position, props.position) > 4) { + Entities.editEntity(this.gunID, this.spawnTransform); + } + }.bind(this), 1000); + } + }, + stopWatchingGun: function() { + if (this.watcherIntervalID) { + Script.clearInterval(this.watcherIntervalID); + this.watcherIntervalID = null; + } + }, onMessage: function(channel, message, sender) { if (this.currentPart == this.COMPLETE) { return; @@ -685,6 +731,7 @@ stepEquip.prototype = { if (this.currentPart == this.PART1 && message == "wasLit") { hideEntitiesWithTag(this.tagPart1); showEntitiesWithTag(this.tagPart2); + setControllerPartLayer('tips', 'grip'); Messages.subscribe('Hifi-Object-Manipulation'); } } else if (channel == "Hifi-Object-Manipulation") { @@ -692,6 +739,7 @@ stepEquip.prototype = { var data = parseJSON(message); print("Here", data.action, data.grabbedEntity, this.gunID); if (data.action == 'release' && data.grabbedEntity == this.gunID) { + this.stopWatchingGun(); try { Messages.messageReceived.disconnect(this.onMessage); } catch(e) { @@ -707,6 +755,8 @@ stepEquip.prototype = { }, cleanup: function() { setControllerVisible("trigger", false); + setControllerPartLayer('tips', 'blank'); + this.stopWatchingGun(); this.currentPart = this.COMPLETE; try { Messages.messageReceived.disconnect(this.onMessage); @@ -752,6 +802,7 @@ stepTurnAround.prototype = { setControllerVisible("right", true); setControllerPartLayer('touchpad', 'arrows'); + setControllerPartLayer('tips', 'arrows'); showEntitiesWithTag(this.tag); var hasTurnedAround = false; @@ -781,6 +832,7 @@ stepTurnAround.prototype = { setControllerVisible("right", false); setControllerPartLayer('touchpad', 'blank'); + setControllerPartLayer('tips', 'blank'); if (this.interval) { Script.clearInterval(this.interval); @@ -808,6 +860,7 @@ stepTeleport.prototype = { //setControllerVisible("teleport", true); setControllerPartLayer('touchpad', 'teleport'); + setControllerPartLayer('tips', 'teleport'); Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); @@ -841,6 +894,7 @@ stepTeleport.prototype = { //setControllerVisible("teleport", false); setControllerPartLayer('touchpad', 'blank'); + setControllerPartLayer('tips', 'blank'); if (this.checkCollidesTimer) { Script.clearInterval(this.checkCollidesTimer); @@ -889,9 +943,14 @@ function showEntitiesWithTag(tag) { if (data.collidable !== undefined) { collisionless = data.collidable === true ? false : true; } + if (data.soundKey) { + print("Setting sound key to true"); + data.soundKey.playing = true; + } var newProperties = { visible: data.visible == false ? false : true, collisionless: collisionless, + userData: JSON.stringify(data), //collisionless: data.collisionless == true ? true : false, }; Entities.editEntity(entityID, newProperties); @@ -901,10 +960,14 @@ function hideEntitiesWithTag(tag) { editEntitiesWithTag(tag, function(entityID) { var userData = Entities.getEntityProperties(entityID, "userData").userData; var data = parseJSON(userData); + if (data.soundKey) { + data.soundKey.playing = false; + } var newProperties = { visible: false, collisionless: 1, ignoreForCollisions: 1, + userData: JSON.stringify(data), }; Entities.editEntity(entityID, newProperties); }); @@ -932,7 +995,7 @@ function startTutorial() { for (var i = 0; i < STEPS.length; ++i) { STEPS[i].cleanup(); } - location = "/tutorial_begin"; + //location = "/tutorial_begin"; //location = "/tutorial"; MyAvatar.shouldRenderLocally = false; startNextStep(); @@ -999,7 +1062,7 @@ Controller.keyReleaseEvent.connect(function (event) { if (!startNextStep()) { startTutorial(); } - } else if (event.text == "F12") { + } else if (event.text == "F11") { restartStep(); } else if (event.text == "F10") { MyAvatar.shouldRenderLocally = !MyAvatar.shouldRenderLocally; From c84ccaaac03fa7a7944d6884373c079ad260a587 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Sep 2016 17:49:03 -0700 Subject: [PATCH 232/300] Update overlay for tutorial --- tutorial/tutorial.js | 9 +++++---- tutorial/viveControllerConfiguration.js | 2 +- unpublishedScripts/DomainContent/Home/firePit/fire.js | 3 +++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index ac6359c7fb..242608aac6 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -221,7 +221,7 @@ stepDisableControllers.prototype = { farGrabEnabled: false, })); setControllerPartLayer('touchpad', 'blank'); - setControllerPartLayer('tips', 'grip'); + setControllerPartLayer('tips', 'blank'); onFinish(); }, cleanup: function() { @@ -317,7 +317,7 @@ stepOrient.prototype = { }; this.overlay = new StayInFrontOverlay("model", { - url: "http://hifi-content.s3.amazonaws.com/alan/dev/Prompt-Cards/raiseHands.fbx?11", + url: "http://hifi-content.s3.amazonaws.com/alan/dev/Prompt-Cards/welcome.fbx?11", ignoreRayIntersection: true, }, 2, { x: 0, y: 0.3, z: 0 }); @@ -729,6 +729,7 @@ stepEquip.prototype = { print("Got message", channel, message, sender, MyAvatar.sessionUUID); if (channel == "Tutorial-Spinner") { if (this.currentPart == this.PART1 && message == "wasLit") { + this.currentPart = this.PART2; hideEntitiesWithTag(this.tagPart1); showEntitiesWithTag(this.tagPart2); setControllerPartLayer('tips', 'grip'); @@ -983,7 +984,7 @@ function startTutorial() { STEPS = [ new stepDisableControllers("step0"), new stepOrient("orient"), - new stepWelcome("welcome"), + //new stepWelcome("welcome"), new stepRaiseAboveHead("raiseHands"), new stepNearGrab("nearGrab"), new stepFarGrab("farGrab"), @@ -995,7 +996,7 @@ function startTutorial() { for (var i = 0; i < STEPS.length; ++i) { STEPS[i].cleanup(); } - //location = "/tutorial_begin"; + location = "/tutorial_begin"; //location = "/tutorial"; MyAvatar.shouldRenderLocally = false; startNextStep(); diff --git a/tutorial/viveControllerConfiguration.js b/tutorial/viveControllerConfiguration.js index be0bfe5428..3604f4a412 100644 --- a/tutorial/viveControllerConfiguration.js +++ b/tutorial/viveControllerConfiguration.js @@ -65,7 +65,7 @@ VIVE_CONTROLLER_CONFIGURATION = { textureName: "Tex.Blank", - defaultTextureLayer: "trigger", + defaultTextureLayer: "blank", textureLayers: { blank: { defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Blank.png", diff --git a/unpublishedScripts/DomainContent/Home/firePit/fire.js b/unpublishedScripts/DomainContent/Home/firePit/fire.js index b0ed9a61b6..2f73438ba9 100644 --- a/unpublishedScripts/DomainContent/Home/firePit/fire.js +++ b/unpublishedScripts/DomainContent/Home/firePit/fire.js @@ -78,6 +78,9 @@ _this.explodeWithColor(); _this.smokePuff(); Entities.deleteEntity(otherID) + Messages.sendMessage('Entity-Exploded', JSON.stringify({ + entityID: otherID, + })); } } } From c95b69452485f54f4afbca9103c536d4558ddeb6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 16 Sep 2016 09:00:13 -0700 Subject: [PATCH 233/300] Tweak tutorial to add delays between steps --- tutorial/tutorial.js | 39 +++++++++++-------- .../DomainContent/Home/firePit/fire.js | 2 +- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 242608aac6..049bb9e8a1 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -319,7 +319,7 @@ stepOrient.prototype = { this.overlay = new StayInFrontOverlay("model", { url: "http://hifi-content.s3.amazonaws.com/alan/dev/Prompt-Cards/welcome.fbx?11", ignoreRayIntersection: true, - }, 2, { x: 0, y: 0.3, z: 0 }); + }, 1.5, { x: 0, y: 0.3, z: 0 }); // Spawn content set //spawnWithTag(HandsAboveHeadData, defaultTransform, tag); @@ -387,18 +387,20 @@ stepRaiseAboveHead.prototype = { editEntitiesWithTag(this.tag, { visible: true }); - this.checkIntervalID = null; - function checkForHandsAboveHead() { - print("Checking for hands above head..."); - if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { - Script.clearInterval(this.checkIntervalID); - this.checkIntervalID = null; - playSuccessSound(); - //location = "/tutorial"; - onFinish(); + Script.setTimeout(function() { + this.checkIntervalID = null; + function checkForHandsAboveHead() { + print("Checking for hands above head..."); + if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { + Script.clearInterval(this.checkIntervalID); + this.checkIntervalID = null; + playSuccessSound(); + //location = "/tutorial"; + onFinish(); + } } - } - this.checkIntervalID = Script.setInterval(checkForHandsAboveHead.bind(this), 500); + this.checkIntervalID = Script.setInterval(checkForHandsAboveHead.bind(this), 500); + }.bind(this), 2000); }, cleanup: function() { if (this.checkIntervalID != null) { @@ -729,17 +731,20 @@ stepEquip.prototype = { print("Got message", channel, message, sender, MyAvatar.sessionUUID); if (channel == "Tutorial-Spinner") { if (this.currentPart == this.PART1 && message == "wasLit") { - this.currentPart = this.PART2; - hideEntitiesWithTag(this.tagPart1); - showEntitiesWithTag(this.tagPart2); - setControllerPartLayer('tips', 'grip'); - Messages.subscribe('Hifi-Object-Manipulation'); + Script.setTimeout(function() { + this.currentPart = this.PART2; + hideEntitiesWithTag(this.tagPart1); + showEntitiesWithTag(this.tagPart2); + setControllerPartLayer('tips', 'grip'); + Messages.subscribe('Hifi-Object-Manipulation'); + }.bind(this), 2000); } } else if (channel == "Hifi-Object-Manipulation") { if (this.currentPart == this.PART2) { var data = parseJSON(message); print("Here", data.action, data.grabbedEntity, this.gunID); if (data.action == 'release' && data.grabbedEntity == this.gunID) { + print("got release"); this.stopWatchingGun(); try { Messages.messageReceived.disconnect(this.onMessage); diff --git a/unpublishedScripts/DomainContent/Home/firePit/fire.js b/unpublishedScripts/DomainContent/Home/firePit/fire.js index 2f73438ba9..c68124d73c 100644 --- a/unpublishedScripts/DomainContent/Home/firePit/fire.js +++ b/unpublishedScripts/DomainContent/Home/firePit/fire.js @@ -165,4 +165,4 @@ } return new Fire(); -}); \ No newline at end of file +}); From 52f31addb2244f88d2dd9cb0ed7ec58633b59651 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 16 Sep 2016 11:06:07 -0700 Subject: [PATCH 234/300] Disable welcome overlay that follows you in tutorial --- tutorial/tutorial.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 049bb9e8a1..709a36ad21 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -319,6 +319,7 @@ stepOrient.prototype = { this.overlay = new StayInFrontOverlay("model", { url: "http://hifi-content.s3.amazonaws.com/alan/dev/Prompt-Cards/welcome.fbx?11", ignoreRayIntersection: true, + visible: false }, 1.5, { x: 0, y: 0.3, z: 0 }); // Spawn content set From c898b70dd7b4443fff8793e5704b1de26b28335f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 16 Sep 2016 11:11:58 -0700 Subject: [PATCH 235/300] Add more bird fireworks to tutorial --- tutorial/tutorial.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 709a36ad21..9512220f62 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -474,6 +474,8 @@ stepNearGrab.prototype = { // Create table ? // Create blocks and basket this.boxID = createBlock.bind(this)(); + this.boxID = createBlock.bind(this)(); + this.boxID = createBlock.bind(this)(); print("Created", this.boxID); //function posChecker() { @@ -561,6 +563,8 @@ stepFarGrab.prototype = { // Create table ? // Create blocks and basket this.boxID = createBlock.bind(this)(); + this.boxID = createBlock.bind(this)(); + this.boxID = createBlock.bind(this)(); print("Created", this.boxID); Messages.subscribe("Entity-Exploded"); From c411722d52f405ec5f1bc6654ec52f5c3cc34759 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 16 Sep 2016 13:34:03 -0700 Subject: [PATCH 236/300] Cleanup tutorial --- tutorial/controllerDisplay.js | 6 +- tutorial/spinner.js | 4 +- tutorial/tutorial.js | 167 +++++++++++----------------------- 3 files changed, 57 insertions(+), 120 deletions(-) diff --git a/tutorial/controllerDisplay.js b/tutorial/controllerDisplay.js index 85dd50ce26..5626c6897a 100644 --- a/tutorial/controllerDisplay.js +++ b/tutorial/controllerDisplay.js @@ -30,17 +30,13 @@ createControllerDisplay = function(config) { print("Setting layer...", partName, layerName); if (partName in this.parts) { var part = this.parts[partName]; - //print("FOnd", JSON.stringify(part)); - if (layerName in part.textureLayers) { - //print("got it", layerName); + if (part.textureLayers && layerName in part.textureLayers) { var layer = part.textureLayers[layerName]; var textures = {}; if (layer.defaultTextureURL) { - //print("default texture"); textures[part.textureName] = layer.defaultTextureURL; } for (var i = 0; i < this.partOverlays[partName].length; ++i) { - //print("updating", JSON.stringify(textures)); Overlays.editOverlay(this.partOverlays[partName][i], { textures: textures }); diff --git a/tutorial/spinner.js b/tutorial/spinner.js index 348e250bec..bf0f1274ed 100644 --- a/tutorial/spinner.js +++ b/tutorial/spinner.js @@ -25,8 +25,8 @@ }); var injector = Audio.playSound(spinnerSound, { position: Entities.getEntityProperties(this.entityID, 'position').position, - volume: 0.7, - loop: true + volume: 1.0, + loop: false }); print("HERE2"); diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 9512220f62..0671267b67 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -300,6 +300,8 @@ var stepOrient = function(name) { } stepOrient.prototype = { start: function(onFinish) { + this.active = true; + var tag = this.tag; var defaultTransform = { @@ -334,20 +336,26 @@ stepOrient.prototype = { if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { Script.clearInterval(this.checkIntervalID); this.checkIntervalID = null; - playSuccessSound(); location = "/tutorial"; + Script.setTimeout(playSuccessSound, 150); + this.active = false; onFinish(); } } this.checkIntervalID = Script.setInterval(checkForHandsAboveHead.bind(this), 500); }, cleanup: function() { + if (this.active) { + location = "/tutorial"; + this.active = false; + } if (this.overlay) { this.overlay.destroy(); this.overlay = null; } - if (this.checkIntervalID != null) { + if (this.checkIntervalID) { Script.clearInterval(this.checkIntervalID); + this.checkIntervalID = null; } editEntitiesWithTag(this.tag, { visible: false, collisionless: 1 }); deleteEntitiesWithTag(this.tempTag); @@ -383,12 +391,12 @@ stepRaiseAboveHead.prototype = { }; // Spawn content set - //spawnWithTag(HandsAboveHeadData, defaultTransform, tag); print("raise hands...", this.tag); editEntitiesWithTag(this.tag, { visible: true }); - Script.setTimeout(function() { + // Wait 2 seconds before starting to check for hands + this.waitTimeoutID = Script.setTimeout(function() { this.checkIntervalID = null; function checkForHandsAboveHead() { print("Checking for hands above head..."); @@ -396,7 +404,6 @@ stepRaiseAboveHead.prototype = { Script.clearInterval(this.checkIntervalID); this.checkIntervalID = null; playSuccessSound(); - //location = "/tutorial"; onFinish(); } } @@ -404,8 +411,13 @@ stepRaiseAboveHead.prototype = { }.bind(this), 2000); }, cleanup: function() { - if (this.checkIntervalID != null) { + if (this.checkIntervalID) { Script.clearInterval(this.checkIntervalID); + this.checkIntervalID = null + } + if (this.waitTimeoutID) { + Script.clearTimeout(this.waitTimeoutID); + this.waitTimeoutID = null; } editEntitiesWithTag(this.tag, { visible: false, collisionless: 1 }); deleteEntitiesWithTag(this.tempTag); @@ -440,6 +452,10 @@ function setControllerPartLayer(part, layer) { var stepNearGrab = function(name) { this.tag = name; this.tempTag = name + "-temporary"; + this.birdIDs = []; + + Messages.subscribe("Entity-Exploded"); + Messages.messageReceived.connect(this.onMessage.bind(this)); } stepNearGrab.prototype = { start: function(onFinish) { @@ -455,9 +471,6 @@ stepNearGrab.prototype = { showEntitiesWithTag(this.tag, { visible: true }); showEntitiesWithTag('bothGrab', { visible: true }); - var basketColliderID = findEntity({ name: NEAR_BASKET_COLLIDER_NAME }, 10000); - var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; - var boxSpawnID = findEntity({ name: NEAR_BOX_SPAWN_NAME }, 10000); if (!boxSpawnID) { print("Error creating block, cannot find spawn"); @@ -473,17 +486,10 @@ stepNearGrab.prototype = { // Enabled grab // Create table ? // Create blocks and basket - this.boxID = createBlock.bind(this)(); - this.boxID = createBlock.bind(this)(); - this.boxID = createBlock.bind(this)(); - print("Created", this.boxID); - - //function posChecker() { - //Vec3.distance( - //} - - Messages.subscribe("Entity-Exploded"); - Messages.messageReceived.connect(this.onMessage.bind(this)); + this.birdIDs = []; + this.birdIDs.push(createBlock.bind(this)()); + this.birdIDs.push(createBlock.bind(this)()); + this.birdIDs.push(createBlock.bind(this)()); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, @@ -493,12 +499,13 @@ stepNearGrab.prototype = { } if (channel == "Entity-Exploded") { print("TUTORIAL: Got entity-exploded message"); - playSuccessSound(); + var data = parseJSON(message); - //if (data.entityID == this.boxID) { + if (this.birdIDs.indexOf(data.entityID) >= 0) { + playSuccessSound(); this.finished = true; this.onFinish(); - //} + } } }, cleanup: function() { @@ -522,6 +529,11 @@ stepNearGrab.prototype = { var stepFarGrab = function(name) { this.tag = name; this.tempTag = name + "-temporary"; + this.finished = true; + this.birdIDs = []; + + Messages.subscribe("Entity-Exploded"); + Messages.messageReceived.connect(this.onMessage.bind(this)); } stepFarGrab.prototype = { start: function(onFinish) { @@ -545,9 +557,6 @@ stepFarGrab.prototype = { //spawnWithTag(Step1EntityData, transform, tag); showEntitiesWithTag(this.tag); - var basketColliderID = findEntity({ name: FAR_BASKET_COLLIDER_NAME }, 10000); - var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; - function createBlock() { var boxSpawnID = findEntity({ name: FAR_BOX_SPAWN_NAME }, 10000); if (!boxSpawnID) { @@ -559,30 +568,10 @@ stepFarGrab.prototype = { return spawnWithTag([birdFirework1], null, this.tempTag)[0]; } - // Enabled grab - // Create table ? - // Create blocks and basket - this.boxID = createBlock.bind(this)(); - this.boxID = createBlock.bind(this)(); - this.boxID = createBlock.bind(this)(); - print("Created", this.boxID); - - Messages.subscribe("Entity-Exploded"); - Messages.messageReceived.connect(this.onMessage.bind(this)); - - // When block collides with basket start step 2 - //var checkCollidesTimer = null; - // function checkCollides() { - // print("CHECKING..."); - // if (Vec3.distance(basketPosition, Entities.getEntityProperties(this.boxID, 'position').position) < 0.2) { - // Script.clearInterval(checkCollidesTimer); - // playSuccessSound(); - // Script.setTimeout(onHit.bind(this), 1000); - // } - // } - // checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 500); - - // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block + this.birdIDs = []; + this.birdIDs.push(createBlock.bind(this)()); + this.birdIDs.push(createBlock.bind(this)()); + this.birdIDs.push(createBlock.bind(this)()); }, onMessage: function(channel, message, seneder) { if (this.finished) { @@ -590,16 +579,15 @@ stepFarGrab.prototype = { } if (channel == "Entity-Exploded") { print("TUTORIAL: Got entity-exploded message"); - playSuccessSound(); var data = parseJSON(message); - if (data.entityID == this.boxID) { + if (this.birdIDs.indexOf(data.entityID) >= 0) { + playSuccessSound(); this.finished = true; this.onFinish(); } } }, cleanup: function() { - //Messages.messageReceived.disconnect(this.onMessage.bind(this)); this.finished = true; setControllerVisible("trigger", false); setControllerPartLayer('tips', 'blank'); @@ -625,6 +613,9 @@ var stepEquip = function(name) { this.PART1 = 0; this.PART2 = 1; this.COMPLETE = 2; + + Messages.subscribe('Tutorial-Spinner'); + Messages.messageReceived.connect(this.onMessage.bind(this)); } stepEquip.prototype = { start: function(onFinish) { @@ -636,30 +627,12 @@ stepEquip.prototype = { var tag = this.tag; - var defaultTransform = { - position: { - x: 0.0, - y: 0.0, - z: 0.75 - }, - rotation: { - x: 0, - y: 0, - z: 0, - w: 1 - } - }; - // Spawn content set - //spawnWithTag(StepGunData, defaultTransform, tag); showEntitiesWithTag(this.tag); showEntitiesWithTag(this.tagPart1); this.currentPart = this.PART1; - var basketColliderID = findEntity({ name: GUN_BASKET_COLLIDER_NAME }, 10000); - var basketPosition = Entities.getEntityProperties(basketColliderID, 'position').position; - function createGun() { var boxSpawnID = findEntity({ name: GUN_SPAWN_NAME }, 10000); if (!boxSpawnID) { @@ -669,14 +642,10 @@ stepEquip.prototype = { var transform = {}; - GunData.position = Entities.getEntityProperties(boxSpawnID, 'position').position; - GunData.rotation = Entities.getEntityProperties(boxSpawnID, 'rotation').rotation; transform.position = Entities.getEntityProperties(boxSpawnID, 'position').position; transform.rotation = Entities.getEntityProperties(boxSpawnID, 'rotation').rotation; this.spawnTransform = transform; - Vec3.print("spawn", GunData.position); - print("Adding: ", JSON.stringify(GunData)); - return doCreateButaneLighter(transform).id;//spawnWithTag([GunData], null, this.tempTag)[0]; + return doCreateButaneLighter(transform).id; } @@ -687,30 +656,6 @@ stepEquip.prototype = { this.startWatchingGun(); print("Created", this.gunID); this.onFinish = onFinish; - Messages.subscribe('Tutorial-Spinner'); - Messages.messageReceived.connect(this.onMessage.bind(this)); - -// function onHit() { -// } -// -// // When block collides with basket start step 2 -// function checkCollides() { -// //print("CHECKING FOR PING PONG..."); -// var ammoIDs = findEntities({ name: GUN_AMMO_NAME }, 15); -// for (var i = 0; i < ammoIDs.length; ++i) { -// if (Vec3.distance(basketPosition, Entities.getEntityProperties(ammoIDs[i], 'position').position) < 0.25) { -// Script.clearInterval(this.checkCollidesTimer); -// this.checkCollidesTimer = null; -// playSuccessSound(); -// Script.setTimeout(onHit.bind(this), 1000); -// return; -// } -// } -// } -// this.checkCollidesTimer = Script.setInterval(checkCollides.bind(this), 100); - - - // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, startWatchingGun: function() { if (!this.watcherIntervalID) { @@ -733,7 +678,9 @@ stepEquip.prototype = { if (this.currentPart == this.COMPLETE) { return; } + print("Got message", channel, message, sender, MyAvatar.sessionUUID); + if (channel == "Tutorial-Spinner") { if (this.currentPart == this.PART1 && message == "wasLit") { Script.setTimeout(function() { @@ -742,38 +689,32 @@ stepEquip.prototype = { showEntitiesWithTag(this.tagPart2); setControllerPartLayer('tips', 'grip'); Messages.subscribe('Hifi-Object-Manipulation'); - }.bind(this), 2000); + }.bind(this), 9000); } } else if (channel == "Hifi-Object-Manipulation") { if (this.currentPart == this.PART2) { var data = parseJSON(message); - print("Here", data.action, data.grabbedEntity, this.gunID); if (data.action == 'release' && data.grabbedEntity == this.gunID) { print("got release"); this.stopWatchingGun(); - try { - Messages.messageReceived.disconnect(this.onMessage); - } catch(e) { - } playSuccessSound(); - print("FINISHED"); Script.setTimeout(this.onFinish.bind(this), 1500); this.currentPart = this.COMPLETE; - //this.onFinish(); } } } }, cleanup: function() { + if (this.watcherIntervalID) { + Script.clearInterval(this.watcherIntervalID); + this.watcherIntervalID = null; + } + setControllerVisible("trigger", false); setControllerPartLayer('tips', 'blank'); this.stopWatchingGun(); this.currentPart = this.COMPLETE; - try { - Messages.messageReceived.disconnect(this.onMessage); - } catch(e) { - print("error disconnecting"); - } + if (this.checkCollidesTimer) { Script.clearInterval(this.checkCollidesTimer); } From 69e3e429f173e7853b4542a11faf2de297b835f7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 16 Sep 2016 14:32:30 -0700 Subject: [PATCH 237/300] Update particle rate and fix default vive controller labels --- tutorial/spinner.js | 2 +- tutorial/viveControllerConfiguration.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorial/spinner.js b/tutorial/spinner.js index bf0f1274ed..4d34f31890 100644 --- a/tutorial/spinner.js +++ b/tutorial/spinner.js @@ -35,7 +35,7 @@ var props = childrenProps[childEntityID]; if (props.type == "ParticleEffect") { Entities.editEntity(childEntityID, { - emitRate: 140, + emitRate: 35, }); } } diff --git a/tutorial/viveControllerConfiguration.js b/tutorial/viveControllerConfiguration.js index 3604f4a412..a33a701641 100644 --- a/tutorial/viveControllerConfiguration.js +++ b/tutorial/viveControllerConfiguration.js @@ -246,7 +246,7 @@ VIVE_CONTROLLER_CONFIGURATION = { textureName: "Tex.Blank", - defaultTextureLayer: "trigger", + defaultTextureLayer: "blank", textureLayers: { blank: { defaultTextureURL: viveTipsModelURL + "/Controller-Tips.fbm/Blank.png", From 23e2447c602842870f81d341013e940cc8171140 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 16 Sep 2016 16:02:13 -0700 Subject: [PATCH 238/300] Add position watching to near and far grab --- tutorial/entityData.js | 2 +- tutorial/tutorial.js | 51 ++++++++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 13 deletions(-) diff --git a/tutorial/entityData.js b/tutorial/entityData.js index cd2579f018..1d36293586 100644 --- a/tutorial/entityData.js +++ b/tutorial/entityData.js @@ -241,7 +241,7 @@ birdFirework2 = { "collisionsWillMove": 1, velocity: { x: 0, - y: -0.2, + y: -0.01, z: 0 }, "dynamic": 1, diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 0671267b67..9e8982bef4 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -490,6 +490,7 @@ stepNearGrab.prototype = { this.birdIDs.push(createBlock.bind(this)()); this.birdIDs.push(createBlock.bind(this)()); this.birdIDs.push(createBlock.bind(this)()); + this.positionWatcher = new PositionWatcher(this.birdIDs, boxSpawnPosition, -0.4, 4); // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, @@ -515,6 +516,10 @@ stepNearGrab.prototype = { setControllerPartLayer('tips', 'blank'); hideEntitiesWithTag(this.tag, { visible: false}); deleteEntitiesWithTag(this.tempTag); + if (this.positionWatcher) { + this.positionWatcher.destroy(); + this.positionWatcher = null; + } } }; @@ -548,23 +553,18 @@ stepFarGrab.prototype = { farGrabEnabled: true, })); var tag = this.tag; - var transform = { - position: { x: 3, y: 0, z: 0 }, - rotation: { x: 0, y: 0, z: 0, w: 1 } - } // Spawn content set - //spawnWithTag(Step1EntityData, transform, tag); showEntitiesWithTag(this.tag); + var boxSpawnID = findEntity({ name: FAR_BOX_SPAWN_NAME }, 10000); + if (!boxSpawnID) { + print("Error creating block, cannot find spawn"); + return null; + } + var boxSpawnPosition = Entities.getEntityProperties(boxSpawnID, 'position').position; function createBlock() { - var boxSpawnID = findEntity({ name: FAR_BOX_SPAWN_NAME }, 10000); - if (!boxSpawnID) { - print("Error creating block, cannot find spawn"); - return null; - } - - birdFirework1.position = Entities.getEntityProperties(boxSpawnID, 'position').position; + birdFirework1.position = boxSpawnPosition; return spawnWithTag([birdFirework1], null, this.tempTag)[0]; } @@ -572,6 +572,7 @@ stepFarGrab.prototype = { this.birdIDs.push(createBlock.bind(this)()); this.birdIDs.push(createBlock.bind(this)()); this.birdIDs.push(createBlock.bind(this)()); + this.positionWatcher = new PositionWatcher(this.birdIDs, boxSpawnPosition, -0.4, 4); }, onMessage: function(channel, message, seneder) { if (this.finished) { @@ -594,6 +595,32 @@ stepFarGrab.prototype = { hideEntitiesWithTag(this.tag, { visible: false}); hideEntitiesWithTag('bothGrab', { visible: false}); deleteEntitiesWithTag(this.tempTag); + if (this.positionWatcher) { + this.positionWatcher.destroy(); + this.positionWatcher = null; + } + } +}; + +function PositionWatcher(entityIDs, originalPosition, minY, maxDistance) { + this.watcherIntervalID = Script.setInterval(function() { + for (var i = 0; i < entityIDs.length; ++i) { + var entityID = entityIDs[i]; + var props = Entities.getEntityProperties(entityID, ['position']); + if (props.position.y < minY || Vec3.distance(originalPosition, props.position) > maxDistance) { + Entities.editEntity(entityID, { + position: originalPosition, + velocity: { x: 0, y: -0.01, z: 0 }, + angularVelocity: { x: 0, y: 0, z: 0 } + }); + } + } + }, 1000); +} + +PositionWatcher.prototype = { + destroy: function() { + Script.clearInterval(this.watcherIntervalID); } }; From 2bf13b9cf6aca2c038556f71cf46e7035411d76e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 16 Sep 2016 16:10:43 -0700 Subject: [PATCH 239/300] Fix fuse getting lit 2+ times in tutorial --- tutorial/tutorial.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 9e8982bef4..537931080d 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -710,8 +710,8 @@ stepEquip.prototype = { if (channel == "Tutorial-Spinner") { if (this.currentPart == this.PART1 && message == "wasLit") { + this.currentPart = this.PART2; Script.setTimeout(function() { - this.currentPart = this.PART2; hideEntitiesWithTag(this.tagPart1); showEntitiesWithTag(this.tagPart2); setControllerPartLayer('tips', 'grip'); @@ -724,9 +724,9 @@ stepEquip.prototype = { if (data.action == 'release' && data.grabbedEntity == this.gunID) { print("got release"); this.stopWatchingGun(); + this.currentPart = this.COMPLETE; playSuccessSound(); Script.setTimeout(this.onFinish.bind(this), 1500); - this.currentPart = this.COMPLETE; } } } From a05f68170474bef32a9d1dd5b8ed3cce808ed213 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Sep 2016 13:02:33 -0700 Subject: [PATCH 240/300] Add ownership token tot tutorial --- tutorial/ownershipToken.js | 188 +++++++++++++++++++++++++++++++++++ tutorial/tutorial.js | 197 ++++++++++++++++++++----------------- 2 files changed, 292 insertions(+), 93 deletions(-) create mode 100644 tutorial/ownershipToken.js diff --git a/tutorial/ownershipToken.js b/tutorial/ownershipToken.js new file mode 100644 index 0000000000..ae212baa84 --- /dev/null +++ b/tutorial/ownershipToken.js @@ -0,0 +1,188 @@ +if (!Function.prototype.bind) { + Function.prototype.bind = function(oThis) { + if (typeof this !== 'function') { + // closest thing possible to the ECMAScript 5 + // internal IsCallable function + throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); + } + + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function() {}, + fBound = function() { + return fToBind.apply(this instanceof fNOP + ? this + : oThis, + aArgs.concat(Array.prototype.slice.call(arguments))); + }; + + if (this.prototype) { + // Function.prototype doesn't have a prototype property + fNOP.prototype = this.prototype; + } + fBound.prototype = new fNOP(); + + return fBound; + }; +} + +function getOption(options, key, defaultValue) { + if (options.hasOwnProperty(key)) { + return options[key]; + } + return defaultValue; +} + +var TOKEN_NAME_PREFIX = "ownership_token-"; + +function getOwnershipTokenID(parentEntityID) { + var childEntityIDs = Entities.getChildrenIDs(parentEntityID); + var ownerID = null; + var ownerName = ''; + for (var i = 0; i < childEntityIDs.length; ++i) { + var childID = childEntityIDs[i]; + var properties = Entities.getEntityProperties(childID, ['name', 'userData', 'lifetime', 'age']); + var childName = properties.name; + //debug("Owner lifetime: ", properties.lifetime, properties.age); + if (properties.age > 0.5 && childName.indexOf(TOKEN_NAME_PREFIX) == 0) { + if (ownerID === null || childName < ownerName) { + ownerID = childID; + ownerName = childName; + } + } + } + return ownerID; +} + +function createOwnershipToken(name, parentEntityID) { + return Entities.addEntity({ + type: "Box", + name: TOKEN_NAME_PREFIX + name, + visible: false, + parentID: parentEntityID, + locationPosition: { x: 0, y: 0, z: 0 }, + dimensions: { x: 100, y: 100, z: 100 }, + collisionless: true, + lifetime: 5 + }); +} + +var DEBUG = true; +function debug() { + if (DEBUG) { + var args = Array.prototype.slice.call(arguments); + print.apply(this, args); + } +} + +var TOKEN_STATE_DESTROYED = -1; +var TOKEN_STATE_UNOWNED = 0; +var TOKEN_STATE_REQUESTING_OWNERSHIP = 1; +var TOKEN_STATE_OWNED = 2; + +OwnershipToken = function(name, parentEntityID, options) { + this.name = MyAvatar.sessionUUID + "-" + Math.floor(Math.random() * 10000000); + this.name = Math.floor(Math.random() * 10000000); + this.parentEntityID = parentEntityID; + + // How often to check whether the token is available if we don't currently own it + this.checkEverySeconds = getOption(options, 'checkEverySeconds', 1000); + this.updateTokenLifetimeEvery = getOption(options, 'updateTokenLifetimeEvery', 2000); + + //this.onRequestingOwnership = getOption(options, 'onRequestingOwnership', function() { }); + this.onGainedOwnership = getOption(options, 'onGainedOwnership', function() { }); + this.onLostOwnership = getOption(options, 'onLostOwnership', function() { }); + + this.ownershipTokenID = null; + this.setState(TOKEN_STATE_UNOWNED); +}; + +OwnershipToken.prototype = { + destroy: function() { + debug(this.name, "Destroying token"); + this.setState(TOKEN_STATE_DESTROYED); + }, + + setState: function(newState) { + if (this.state == newState) { + debug(this.name, "Warning: Trying to set state to the current state"); + return; + } + + if (this.updateLifetimeID) { + Script.clearInterval(this.updateLifetimeID); + this.updateLifetimeID = null; + } + + if (this.checkOwnershipAvailableID) { + Script.clearInterval(this.checkOwnershipAvailableID); + this.checkOwnershipAvailableID = null; + } + + if (this.state == TOKEN_STATE_OWNED) { + this.onLostOwnership(this); + } + + if (newState == TOKEN_STATE_UNOWNED) { + this.checkOwnershipAvailableID = Script.setInterval( + this.tryRequestingOwnership.bind(this), this.checkEverySeconds); + + } else if (newState == TOKEN_STATE_REQUESTING_OWNERSHIP) { + + } else if (newState == TOKEN_STATE_OWNED) { + this.onGainedOwnership(this); + this.updateLifetimeID = Script.setInterval( + this.updateTokenLifetime.bind(this), this.updateTokenLifetimeEvery); + } else if (newState == TOKEN_STATE_DESTROYED) { + Entities.deleteEntity(this.ownershipTokenID); + } + + debug(this.name, "Info: Switching to state:", newState); + this.state = newState; + }, + updateTokenLifetime: function() { + if (this.state != TOKEN_STATE_OWNED) { + debug(this.name, "Error: Trying to update token while it is unowned"); + return; + } + + debug(this.name, "Updating entity lifetime"); + var age = Entities.getEntityProperties(this.ownershipTokenID, 'age').age; + Entities.editEntity(this.ownershipTokenID, { + lifetime: age + 5 + }); + }, + tryRequestingOwnership: function() { + if (this.state == TOKEN_STATE_REQUESTING_OWNERSHIP || this.state == TOKEN_STATE_OWNED) { + debug(this.name, "We already have or are requesting ownership"); + return; + } + + var ownerID = getOwnershipTokenID(this.parentEntityID); + if (ownerID !== null) { + // Already owned, return + debug(this.name, "Token already owned by another client, return"); + return; + } + + this.ownershipTokenID = createOwnershipToken(this.name, this.parentEntityID); + this.setState(TOKEN_STATE_REQUESTING_OWNERSHIP); + + function checkOwnershipRequest() { + var ownerID = getOwnershipTokenID(this.parentEntityID); + if (ownerID == this.ownershipTokenID) { + debug(this.name, "Info: Obtained ownership"); + this.setState(TOKEN_STATE_OWNED); + } else { + if (ownerID === null) { + debug(this.name, "Warning: Checked ownership request and no tokens existed"); + } + debug(this.name, "Info: Lost ownership request") + this.ownershipTokenID = null; + this.setState(TOKEN_STATE_UNOWNED); + } + } + + Script.setTimeout(checkOwnershipRequest.bind(this), 2000); + }, +}; diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 537931080d..3ccb994ba3 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -30,6 +30,7 @@ Script.include("entityData.js"); Script.include("viveHandsv2.js"); Script.include("lighter/createButaneLighter.js"); +Script.include('ownershipToken.js'); var BASKET_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx"; var BASKET_COLLIDER_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj"; @@ -146,19 +147,19 @@ function spawnWithTag(entityData, transform, tag) { } function deleteEntitiesWithTag(tag) { - print("searching for...:", tag); + print("searching for...:", tag); var entityIDs = findEntitiesWithTag(tag); for (var i = 0; i < entityIDs.length; ++i) { - print("Deleteing:", entityIDs[i]); + //print("Deleteing:", entityIDs[i]); Entities.deleteEntity(entityIDs[i]); } } function editEntitiesWithTag(tag, propertiesOrFn) { - print("Editing:", tag); + //print("Editing:", tag); var entityIDs = findEntitiesWithTag(tag); - print("Editing...", entityIDs); + //print("Editing...", entityIDs); for (var i = 0; i < entityIDs.length; ++i) { - print("Editing...", entityIDs[i]); + //print("Editing...", entityIDs[i]); if (isFunction(propertiesOrFn)) { Entities.editEntity(entityIDs[i], propertiesOrFn(entityIDs[i])); } else { @@ -318,11 +319,11 @@ stepOrient.prototype = { } }; - this.overlay = new StayInFrontOverlay("model", { - url: "http://hifi-content.s3.amazonaws.com/alan/dev/Prompt-Cards/welcome.fbx?11", - ignoreRayIntersection: true, - visible: false - }, 1.5, { x: 0, y: 0.3, z: 0 }); + // this.overlay = new StayInFrontOverlay("model", { + // url: "http://hifi-content.s3.amazonaws.com/alan/dev/Prompt-Cards/welcome.fbx?11", + // ignoreRayIntersection: true, + // visible: false + // }, 1.5, { x: 0, y: 0.3, z: 0 }); // Spawn content set //spawnWithTag(HandsAboveHeadData, defaultTransform, tag); @@ -952,105 +953,115 @@ function hideEntitiesWithTag(tag) { }); } -var STEPS; -var currentStepNum = -1; -var currentStep = null; -function startTutorial() { - currentStepNum = -1; - currentStep = null; - STEPS = [ - new stepDisableControllers("step0"), - new stepOrient("orient"), - //new stepWelcome("welcome"), - new stepRaiseAboveHead("raiseHands"), - new stepNearGrab("nearGrab"), - new stepFarGrab("farGrab"), - new stepEquip("equip"), - new stepTurnAround("turnAround"), - new stepTeleport("teleport"), - new stepFinish("finish"), - ]; - for (var i = 0; i < STEPS.length; ++i) { - STEPS[i].cleanup(); - } - location = "/tutorial_begin"; - //location = "/tutorial"; - MyAvatar.shouldRenderLocally = false; - startNextStep(); -} +TutorialManager = function() { + var STEPS; -function startNextStep() { - if (currentStep) { - currentStep.cleanup(); - } + var currentStepNum = -1; + var currentStep = null; - ++currentStepNum; - - if (currentStepNum >= STEPS.length) { - // Done - print("DONE WITH TUTORIAL"); + this.startTutorial = function() { + currentStepNum = -1; + currentStep = null; + STEPS = [ + new stepDisableControllers("step0"), + new stepOrient("orient"), + //new stepWelcome("welcome"), + new stepRaiseAboveHead("raiseHands"), + new stepNearGrab("nearGrab"), + new stepFarGrab("farGrab"), + new stepEquip("equip"), + new stepTurnAround("turnAround"), + new stepTeleport("teleport"), + new stepFinish("finish"), + ]; + for (var i = 0; i < STEPS.length; ++i) { + STEPS[i].cleanup(); + } + location = "/tutorial_begin"; + //location = "/tutorial"; + MyAvatar.shouldRenderLocally = false; + this.startNextStep(); + } + + this.startNextStep = function() { + if (currentStep) { + currentStep.cleanup(); + } + + ++currentStepNum; + + if (currentStepNum >= STEPS.length) { + // Done + print("DONE WITH TUTORIAL"); + currentStepNum = -1; + currentStep = null; + return false; + } else { + print("Starting step", currentStepNum); + currentStep = STEPS[currentStepNum]; + currentStep.start(this.startNextStep); + return true; + } + }.bind(this); + this.restartStep = function() { + if (currentStep) { + currentStep.cleanup(); + currentStep.start(this.startNextStep); + } + } + + this.stopTutorial = function() { + if (currentStep) { + currentStep.cleanup(); + } currentStepNum = -1; currentStep = null; - return false; - } else { - print("Starting step", currentStepNum); - currentStep = STEPS[currentStepNum]; - currentStep.start(startNextStep); - return true; } } -function restartStep() { - if (currentStep) { - currentStep.cleanup(); - currentStep.start(startNextStep); - } -} - -function skipTutorial() { -} - -function stopTutorial() { - if (currentStep) { - currentStep.cleanup(); - } - currentStepNum = -1; - currentStep = null; -} - -startTutorial(); Script.scriptEnding.connect(function() { Controller.enableMapping('handControllerPointer-click'); }); Controller.disableMapping('handControllerPointer-click'); -//mapping.from([Controller.Standard.RY]).to(noop); - //{ "from": "Vive.LeftApplicationMenu", "to": "Standard.LeftSecondaryThumb" }, -//mapping.from([Controller.Standard.RY]).when("Controller.Application.Grounded").to(noop); -//mapping.from([Controller.Standard.RY]).when(Controller.Application.Grounded).to(noop); +// var entityID = '{be3d10a3-262a-4827-b30c-ec025c4325dc}'; +// var token = new OwnershipToken(Math.random() * 100000, entityID, { +// onGainedOwnership: function(token) { +// //Script.setTimeout(function() { token.destroy() }, 15000); +// Controller.keyReleaseEvent.connect(keyReleaseHandler); +// startTutorial(); +// }, +// onLostOwnership: function(token) { +// Controller.keyReleaseEvent.disconnect(keyReleaseHandler); +// stopTutorial(); +// } +// }); - -Script.scriptEnding.connect(stopTutorial); - - - -Controller.keyReleaseEvent.connect(function (event) { - print(event.text); - if (event.text == ",") { - if (!startNextStep()) { - startTutorial(); - } - } else if (event.text == "F11") { - restartStep(); - } else if (event.text == "F10") { - MyAvatar.shouldRenderLocally = !MyAvatar.shouldRenderLocally; - } else if (event.text == "r") { - stopTutorial(); - startTutorial(); - } +//tutorialManager = new TutorialManager(); +//tutorialManager.startTutorial(); +//Controller.keyReleaseEvent.connect(keyReleaseHandler); +Script.scriptEnding.connect(function() { + //token.destroy(); + //stopTutorial(); }); +// function keyReleaseHandler(event) { +// print(event.text); +// if (event.text == ",") { +// if (!tutorialManager.startNextStep()) { +// tutorialManager.startTutorial(); +// } +// } else if (event.text == "F11") { +// tutorialManager.restartStep(); +// } else if (event.text == "F10") { +// MyAvatar.shouldRenderLocally = !MyAvatar.shouldRenderLocally; +// } else if (event.text == "r") { +// tutorialManager.stopTutorial(); +// tutorialManager.startTutorial(); +// } +// } +// // Messages.sendLocalMessage('Controller-Display', JSON.stringify({ // name: "menu", // visible: false, From 5714535fb404f0d44fc4b16a2e7cc0fb7b091ce0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 19 Sep 2016 16:11:40 -0700 Subject: [PATCH 241/300] Disable going to /tutorial when finishing first step in tut --- tutorial/tutorial.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 3ccb994ba3..1d768fe148 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -347,7 +347,7 @@ stepOrient.prototype = { }, cleanup: function() { if (this.active) { - location = "/tutorial"; + //location = "/tutorial"; this.active = false; } if (this.overlay) { From 4efeb928e2ff62b3642e4e2bee79ad2661ab0480 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Sep 2016 08:21:44 -0700 Subject: [PATCH 242/300] Add user activity logging to tutorial --- .../UserActivityLoggerScriptingInterface.cpp | 10 +++++++++ .../UserActivityLoggerScriptingInterface.h | 1 + tutorial/tutorial.js | 22 +++++++++++++++++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/UserActivityLoggerScriptingInterface.cpp b/libraries/networking/src/UserActivityLoggerScriptingInterface.cpp index 8b22b8ff58..de3238f08d 100644 --- a/libraries/networking/src/UserActivityLoggerScriptingInterface.cpp +++ b/libraries/networking/src/UserActivityLoggerScriptingInterface.cpp @@ -24,6 +24,16 @@ void UserActivityLoggerScriptingInterface::toggledAway(bool isAway) { logAction("toggled_away", { { "is_away", isAway } }); } +void UserActivityLoggerScriptingInterface::tutorialProgress(QString stepName, int stepNumber, float secondsToComplete, float tutorialElapsedTime) { + logAction("tutorial_progress", { + { "step", stepName }, + { "stepNumber", stepNumber }, + { "secondsToComplete", secondsToComplete }, + { "tutorial_elapsed_time", tutorialElapsedTime } + }); + +} + void UserActivityLoggerScriptingInterface::logAction(QString action, QJsonObject details) { QMetaObject::invokeMethod(&UserActivityLogger::getInstance(), "logAction", Q_ARG(QString, action), diff --git a/libraries/networking/src/UserActivityLoggerScriptingInterface.h b/libraries/networking/src/UserActivityLoggerScriptingInterface.h index 9d60d666e2..bf3e20a2d7 100644 --- a/libraries/networking/src/UserActivityLoggerScriptingInterface.h +++ b/libraries/networking/src/UserActivityLoggerScriptingInterface.h @@ -23,6 +23,7 @@ public: Q_INVOKABLE void enabledEdit(); Q_INVOKABLE void openedMarketplace(); Q_INVOKABLE void toggledAway(bool isAway); + Q_INVOKABLE void tutorialProgress(QString stepName, int stepNumber, float secondsToComplete, float tutorialElapsedTime); private: void logAction(QString action, QJsonObject details = {}); diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 1d768fe148..a01d1616e0 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -210,6 +210,7 @@ function playSuccessSound() { /////////////////////////////////////////////////////////////////////////////// var stepDisableControllers = function(name) { this.tag = name; + this.shouldLog = false; } stepDisableControllers.prototype = { start: function(onFinish) { @@ -959,10 +960,15 @@ TutorialManager = function() { var currentStepNum = -1; var currentStep = null; + var startedTutorialAt = 0; + var startedLastStepAt = 0; + + var self = this; this.startTutorial = function() { currentStepNum = -1; currentStep = null; + startedTutorialAt = Date.now(); STEPS = [ new stepDisableControllers("step0"), new stepOrient("orient"), @@ -984,6 +990,17 @@ TutorialManager = function() { this.startNextStep(); } + this.onFinish = function() { + if (currentStep && currentStep.shouldLog !== false) { + var timeToFinishStep = (Date.now() - startedLastStepAt) / 1000; + var tutorialTimeElapsed = (Date.now() - startedTutorialAt) / 1000; + UserActivityLogger.tutorialProgress( + currentStep.tag, currentStepNum, timeToFinishStep, tutorialTimeElapsed); + } + + self.startNextStep(); + } + this.startNextStep = function() { if (currentStep) { currentStep.cleanup(); @@ -1000,14 +1017,15 @@ TutorialManager = function() { } else { print("Starting step", currentStepNum); currentStep = STEPS[currentStepNum]; - currentStep.start(this.startNextStep); + startedLastStepAt = Date.now(); + currentStep.start(this.onFinish); return true; } }.bind(this); this.restartStep = function() { if (currentStep) { currentStep.cleanup(); - currentStep.start(this.startNextStep); + currentStep.start(this.onFinish); } } From 03c01bb9b03a805ec5d3003f42261f4b34352622 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Sep 2016 08:34:39 -0700 Subject: [PATCH 243/300] Add exception handling to callEntityMethod calls --- libraries/script-engine/src/ScriptEngine.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index 8a0de3e168..7a4265829b 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -1533,6 +1533,7 @@ void ScriptEngine::doWithEnvironment(const EntityItemID& entityID, const QUrl& s #else operation(); #endif + hadUncaughtExceptions(*this, _fileNameString); currentEntityIdentifier = oldIdentifier; currentSandboxURL = oldSandboxURL; From 39e4ad43001e4cff208a01f812eae1bc1021f998 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Sep 2016 13:23:49 -0700 Subject: [PATCH 244/300] Cleanup controllerDisplay.js --- tutorial/controllerDisplay.js | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/tutorial/controllerDisplay.js b/tutorial/controllerDisplay.js index 5626c6897a..8a4f7a8c5d 100644 --- a/tutorial/controllerDisplay.js +++ b/tutorial/controllerDisplay.js @@ -1,6 +1,5 @@ var DEBUG = false; var VISIBLE_BY_DEFAULT = false; -//var PARENT_ID = MyAvatar.sessionUUID; var PARENT_ID = "{00000000-0000-0000-0000-000000000001}"; createControllerDisplay = function(config) { @@ -49,7 +48,6 @@ createControllerDisplay = function(config) { for (var i = 0; i < config.controllers.length; ++i) { var controller = config.controllers[i]; var position = controller.position; - //position = { x: 0, y: 5, z: 5 }; Vec3.print("position", position); print("position", position.x, position.y, position.z); if (controller.naturalPosition) { @@ -158,9 +156,6 @@ createControllerDisplay = function(config) { var partPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, part.naturalPosition)); var innerRotation = controller.rotation - //Vec3.print("controller", controller.position); - //Vec3.print("part", partPosition); - controllerDisplay.parts[partName] = controller.parts[partName]; var properties = { @@ -170,7 +165,6 @@ createControllerDisplay = function(config) { parentID: PARENT_ID, parentJointIndex: controller.jointIndex, ignoreRayIntersection: true, - //visible: false }; if (part.defaultTextureLayer) { @@ -185,23 +179,16 @@ createControllerDisplay = function(config) { var range = part.maxValue - part.minValue; mapping.from([part.input]).peek().to(function(controller, overlayID, part) { return function(value) { - //print(value); - //print(JSON.stringify(part)); - value = clamp(value, part.minValue, part.maxValue); var pct = (value - part.minValue) / part.maxValue; var angle = pct * part.maxAngle; var rotation = Quat.angleAxis(angle, part.axis); - //print(value, pct, angle); var offset = { x: 0, y: 0, z: 0 }; if (part.origin) { - //print(rotation.x, rotation.y, rotation.z, rotation.w); var offset = Vec3.multiplyQbyV(rotation, part.origin); offset = Vec3.subtract(offset, part.origin); - //Vec3.print('offset', offset); - //partPosition = Vec3.sum(partPosition, offset); } var partPosition = Vec3.sum(controller.position, @@ -230,14 +217,14 @@ createControllerDisplay = function(config) { var xinput = resolveHardware(part.xInput); var yinput = resolveHardware(part.yInput); + // TODO: Touchpad inputs are currently only working for half + // of the touchpad. When that is fixed, it would be useful + // to update these to display the current finger position. mapping.from([visibleInput]).peek().to(function(value) { - //print("visible", value); }); mapping.from([xinput]).peek().to(function(value) { - //print("X", value); }); mapping.from([yinput]).peek().invert().to(function(value) { - //print("Y", value); }); } else if (part.type == "static") { } else { From fec8049226ae9c6ec6825a71b5de3f787f9333c2 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Sep 2016 13:24:39 -0700 Subject: [PATCH 245/300] Add proper disabling to advanced movement script --- ...oggleAdvancedMovementForHandControllers.js | 16 +++++++++++ tutorial/tutorial.js | 28 ++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js b/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js index 21eeb68b96..bd31c5c42e 100644 --- a/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js +++ b/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js @@ -18,6 +18,7 @@ var mappingName, basicMapping, isChecked; var TURN_RATE = 1000; var MENU_ITEM_NAME = "Advanced Movement For Hand Controllers"; var SETTINGS_KEY = 'advancedMovementForHandControllersIsChecked'; +var isDisabled = false; var previousSetting = Settings.getValue(SETTINGS_KEY); if (previousSetting === '' || previousSetting === false || previousSetting === 'false') { previousSetting = false; @@ -146,4 +147,19 @@ HMD.displayModeChanged.connect(function(isHMDMode) { } }); + +var HIFI_ADVANCED_MOVEMENT_DISABLER_CHANNEL = 'Hifi-Advanced-Movement-Disabler'; +function handleMessage(channel, message, sender) { + if (channel == HIFI_ADVANCED_MOVEMENT_DISABLER_CHANNEL) { + if (message == 'disable') { + isDisabled = true; + } else if (message == 'enable') { + isDisabled = false; + } + } +} + +Messages.subscribe(HIFI_ADVANCED_MOVEMENT_DISABLER_CHANNEL); +Messages.messageReceived.connect(handleHandMessages); + }()); // END LOCAL_SCOPE diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index a01d1616e0..4e95bf856a 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -216,6 +216,8 @@ stepDisableControllers.prototype = { start: function(onFinish) { editEntitiesWithTag('door', { visible: true }); Menu.setIsOptionChecked("Overlays", false); + Controller.disableMapping('handControllerPointer-click'); + Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'disable'); Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'both'); Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ nearGrabEnabled: true, @@ -230,6 +232,30 @@ stepDisableControllers.prototype = { } }; +var stepEnableControllers = function(name) { + this.tag = name; + this.shouldLog = false; +} +stepEnableControllers.prototype = { + start: function(onFinish) { + editEntitiesWithTag('door', { visible: false }); + Menu.setIsOptionChecked("Overlays", true); + Controller.enableMapping('handControllerPointer-click'); + Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'enable'); + Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); + Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ + nearGrabEnabled: true, + holdEnabled: true, + farGrabEnabled: true, + })); + setControllerPartLayer('touchpad', 'blank'); + setControllerPartLayer('tips', 'blank'); + onFinish(); + }, + cleanup: function() { + } +}; + /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // // @@ -980,6 +1006,7 @@ TutorialManager = function() { new stepTurnAround("turnAround"), new stepTeleport("teleport"), new stepFinish("finish"), + new stepEnableControllers("enableControllers"), ]; for (var i = 0; i < STEPS.length; ++i) { STEPS[i].cleanup(); @@ -1041,7 +1068,6 @@ TutorialManager = function() { Script.scriptEnding.connect(function() { Controller.enableMapping('handControllerPointer-click'); }); -Controller.disableMapping('handControllerPointer-click'); // var entityID = '{be3d10a3-262a-4827-b30c-ec025c4325dc}'; // var token = new OwnershipToken(Math.random() * 100000, entityID, { From fd929a46b31404259ce4a14c9bf43b415badd26d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 20 Sep 2016 13:27:17 -0700 Subject: [PATCH 246/300] Clean up fire.js --- tutorial/firePit/fire.js | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/tutorial/firePit/fire.js b/tutorial/firePit/fire.js index 0747bc9f14..381676f1ce 100644 --- a/tutorial/firePit/fire.js +++ b/tutorial/firePit/fire.js @@ -1,6 +1,6 @@ -// this script turns an entity into an exploder -- anything that collides with it will be vaporized! -// +// Originally written by James Pollack, modified by Ryan Huffman for the tutorial // +// this script turns an entity into an exploder -- anything that collides with it will be vaporized! (function() { @@ -58,27 +58,20 @@ preload: function(entityID) { this.entityID = entityID; this.EXPLOSION_SOUND = SoundCache.getSound("atp:/firepit/fire_burst.wav"); - print("IN FIRE SCRIPT"); }, collisionWithEntity: function(myID, otherID, collisionInfo) { - print("FIRE SCRIPT: COLLIDED"); var otherProps = Entities.getEntityProperties(otherID); var data = null; - print("FIRE SCRIPT: 2 COLLIDED"); try { - print("parsing.."); data = JSON.parse(otherProps.userData) - print("done parsing.."); } catch (err) { print('ERROR GETTING USERDATA!'); } - print("HERE"); if (data === null || "") { return; } else { if (data.hasOwnProperty('hifiHomeKey')) { if (data.hifiHomeKey.reset === true) { - print('FLAMMABLE THING, EXPLODE IT!'); _this.playSoundAtCurrentPosition(); _this.explodeWithColor(); Entities.deleteEntity(otherID) @@ -90,7 +83,6 @@ } }, explodeWithColor: function() { - print('EXPLODE!') var myProps = Entities.getEntityProperties(this.entityID); var color = colors[Math.floor(Math.random() * colors.length)]; var explosionParticleProperties = { @@ -152,7 +144,6 @@ }; var explosion = Entities.addEntity(explosionParticleProperties); - print('explosion is: ' + explosion) }, playSoundAtCurrentPosition: function() { From e875981a6a25c84c7b8b9eb1f98402fdfa8b787b Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 08:51:05 -0700 Subject: [PATCH 247/300] Add tracking of tutorialComplete to tutorial --- tutorial/firePit/flicker.js | 3 ++- tutorial/tutorial.js | 25 ++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/tutorial/firePit/flicker.js b/tutorial/firePit/flicker.js index 43148dabba..f4406286c4 100644 --- a/tutorial/firePit/flicker.js +++ b/tutorial/firePit/flicker.js @@ -1,3 +1,4 @@ +// Originally written for the Home content set. Pulled into the tutorial by Ryan Huffman (function() { var MINIMUM_LIGHT_INTENSITY = 50.0; @@ -48,4 +49,4 @@ return new FlickeringFlame -}); \ No newline at end of file +}); diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 4e95bf856a..59bc88363a 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -226,6 +226,10 @@ stepDisableControllers.prototype = { })); setControllerPartLayer('touchpad', 'blank'); setControllerPartLayer('tips', 'blank'); + + hideEntitiesWithTag('finish'); + onFinish(); + onFinish(); }, cleanup: function() { @@ -929,11 +933,25 @@ stepFinish.prototype = { start: function(onFinish) { editEntitiesWithTag('door', { visible: false }); showEntitiesWithTag(this.tag); + Settings.setValue("tutorialComplete", true); + onFinish(); }, cleanup: function() { //Menu.setIsOptionChecked("Overlays", true); - hideEntitiesWithTag(this.tag); - deleteEntitiesWithTag(this.tempTag); + //hideEntitiesWithTag(this.tag); + //deleteEntitiesWithTag(this.tempTag); + } +}; + +var stepCleanupFinish = function() { + this.shouldLog = false; +} +stepCleanupFinish.prototype = { + start: function(onFinish) { + hideEntitiesWithTag('finish'); + onFinish(); + }, + cleanup: function() { } }; @@ -996,6 +1014,7 @@ TutorialManager = function() { currentStep = null; startedTutorialAt = Date.now(); STEPS = [ + //new stepCleanupFinish("finish"); new stepDisableControllers("step0"), new stepOrient("orient"), //new stepWelcome("welcome"), @@ -1011,7 +1030,7 @@ TutorialManager = function() { for (var i = 0; i < STEPS.length; ++i) { STEPS[i].cleanup(); } - location = "/tutorial_begin"; + //location = "/tutorial_begin"; //location = "/tutorial"; MyAvatar.shouldRenderLocally = false; this.startNextStep(); From e3e917b4b7d77d5e58ed7ad20ce73991c00c6573 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 09:23:45 -0700 Subject: [PATCH 248/300] Add tutorial StartZone and Zone entity scripts --- tutorial/tutorialStartZone.js | 29 ++++++++ tutorial/tutorialZone.js | 123 ++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 tutorial/tutorialStartZone.js create mode 100644 tutorial/tutorialZone.js diff --git a/tutorial/tutorialStartZone.js b/tutorial/tutorialStartZone.js new file mode 100644 index 0000000000..5f5fa47b94 --- /dev/null +++ b/tutorial/tutorialStartZone.js @@ -0,0 +1,29 @@ +(function() { + var TutorialStartZone = function() { + }; + + TutorialStartZone.prototype = { + preload: function(entityID) { + this.entityID = entityID; + }, + enterEntity: function() { + // send message to outer zone + print("ENTERED THE TUTORIAL START AREA"); + var parentID = Entities.getEntityProperties(this.entityID, 'parentID').parentID; + print("HERE", parentID); + if (parentID) { + print("HERE2"); + Entities.callEntityMethod(parentID, 'start'); + print("HERE4"); + } else { + print("HERE3"); + print("ERROR: No parent id found on tutorial start zone"); + } + }, + leaveEntity: function() { + print("EXITED THE TUTORIAL START AREA"); + } + }; + + return new TutorialStartZone(); +}); diff --git a/tutorial/tutorialZone.js b/tutorial/tutorialZone.js new file mode 100644 index 0000000000..97aa906052 --- /dev/null +++ b/tutorial/tutorialZone.js @@ -0,0 +1,123 @@ +// A user designates ownership of the tutorial by creating a child entity (token) +// of the tutorial zone. The entity should have a short lifetime (5 seconds), and +// should have it's lifetime reset every second. +// +// * When you enter the "tutorial" begin zone +// * If the tutorial is owned +// * Show a "waiting" text, and check for ownership periodically +// * If the tutorial is not owned +// * Create the ownership token, begin tutorial +// * For extra safety, to avoid races, check after 1 second to confirm that +// another user hasn't created a token. If they have, use some method to +// resolve the conflict. +// * Once the user has finished the tutorial, stop creating the token to +// release ownership. +// +// * The tutorial will expose a local message API for controlling the tutorial +// * A special script will be used to: +// * Create a key shortcut to go to the beginning of the tutorial +// * +// + +if (!Function.prototype.bind) { + Function.prototype.bind = function(oThis) { + if (typeof this !== 'function') { + // closest thing possible to the ECMAScript 5 + // internal IsCallable function + throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); + } + + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function() {}, + fBound = function() { + return fToBind.apply(this instanceof fNOP + ? this + : oThis, + aArgs.concat(Array.prototype.slice.call(arguments))); + }; + + if (this.prototype) { + // Function.prototype doesn't have a prototype property + fNOP.prototype = this.prototype; + } + fBound.prototype = new fNOP(); + + return fBound; + }; +} + +(function() { + Script.include("file:///C:/Users/Ryan/dev/hifi/tutorial/ownershipToken.js"); + Script.include("file:///C:/Users/Ryan/dev/hifi/tutorial/tutorial.js"); + + var TutorialZone = function() { + this.token = null; + }; + + TutorialZone.prototype = { + keyReleaseHandler: function(event) { + print(event.text); + if (event.text == ",") { + if (!this.tutorialManager.startNextStep()) { + this.tutorialManager.startTutorial(); + } + } else if (event.text == "F11") { + this.tutorialManager.restartStep(); + } else if (event.text == "F10") { + MyAvatar.shouldRenderLocally = !MyAvatar.shouldRenderLocally; + } else if (event.text == "r") { + this.tutorialManager.stopTutorial(); + this.tutorialManager.startTutorial(); + } + }, + preload: function(entityID) { + this.entityID = entityID; + }, + start: function() { + print("Got start"); + var self = this; + if (!this.token) { + this.token = new OwnershipToken(Math.random() * 100000, this.entityID, { + onGainedOwnership: function(token) { + print("GOT OWNERSHIP"); + if (!self.tutorialManager) { + self.tutorialManager = new TutorialManager(); + } + self.tutorialManager.startTutorial(); + print("making bound release handler"); + self.keyReleaseHandlerBound = self.keyReleaseHandler.bind(self); + print("binding"); + Controller.keyReleaseEvent.connect(self.keyReleaseHandlerBound); + print("done"); + }, + onLostOwnership: function(token) { + print("LOST OWNERSHIP"); + if (self.tutorialManager) { + print("stopping tutorial.."); + self.tutorialManager.stopTutorial(); + print("done"); + Controller.keyReleaseEvent.disconnect(self.keyReleaseHandlerBound); + } else { + print("no tutorial manager..."); + } + } + }); + } + }, + + enterEntity: function() { + print("ENTERED THE TUTORIAL AREA"); + }, + leaveEntity: function() { + print("EXITED THE TUTORIAL AREA"); + if (this.token) { + print("destroying token"); + this.token.destroy(); + this.token = null; + } + } + }; + + return new TutorialZone(); +}); From 9f53652dfb7c2f37833d465d2cf2f05e5a2f6806 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 09:29:40 -0700 Subject: [PATCH 249/300] Add routing of new users to tutorial --- interface/src/Application.cpp | 97 ++++++++++++++++++++++++++--------- 1 file changed, 73 insertions(+), 24 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index fcd6c59b63..a81084d853 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1255,6 +1255,79 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : return entityServerNode && !isPhysicsEnabled(); }); + + + // Initialize location + + auto initializeLocation = [this]() { + // Get sandbox content set version, if available + auto acDirPath = PathUtils::getRootDataDirectory() + qApp->organizationName() + "/assignment-client/"; + auto contentVersionPath = acDirPath + "content-version.txt"; + auto contentVersion = 0; + QFile contentVersionFile(contentVersionPath); + if (contentVersionFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + QString line = contentVersionFile.readAll(); + // toInt() returns 0 if the conversion fails, so we don't need to specifically check for failure + contentVersion = line.toInt(); + } + qDebug() << "Server content version: " << contentVersion; + + bool hasTutorialContent = contentVersion >= 1; + + Setting::Handle firstRun { Settings::firstRun, true }; + bool isOnVive = _displayPlugin && _displayPlugin->getName() == "OpenVR (Vive)"; + bool isFirstRun = firstRun.get(); + Setting::Handle tutorialComplete { "tutorialComplete", false }; + + bool shouldGoToTutorial = isOnVive && hasTutorialContent && !tutorialComplete.get(); + qDebug() << "Is on vive " << isOnVive << ", " << _displayPlugin->getName(); + qDebug() << "has tutorial content" << hasTutorialContent; + qDebug() << "tutorial complete" << tutorialComplete.get(); + qDebug() << "should go to tutorial " << shouldGoToTutorial; + + + + if (shouldGoToTutorial) { + DependencyManager::get()->ifLocalSandboxRunningElse([=]() { + qDebug() << "Home sandbox appears to be running, going to Home."; + //DependencyManager::get()->goToLocalSandbox("/tutorial"); + DependencyManager::get()->loadSettings("hifi://sport/tutorial"); + }, [=]() { + qDebug() << "Home sandbox does not appear to be running, going to Entry."; + showHelp(); + DependencyManager::get()->goToEntry(); + }); + } else { + + // when --url in command line, teleport to location + const QString HIFI_URL_COMMAND_LINE_KEY = "--url"; + int urlIndex = arguments().indexOf(HIFI_URL_COMMAND_LINE_KEY); + QString addressLookupString; + if (urlIndex != -1) { + addressLookupString = arguments().value(urlIndex + 1); + } + + if (firstRun.get()) { + showHelp(); + } + + if (addressLookupString.isEmpty() && firstRun.get()) { + DependencyManager::get()->ifLocalSandboxRunningElse([=]() { + qDebug() << "Home sandbox appears to be running, going to Home."; + DependencyManager::get()->goToLocalSandbox(); + }, [=]() { + qDebug() << "Home sandbox does not appear to be running, going to Entry."; + DependencyManager::get()->goToEntry(); + }); + } else { + qDebug() << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString); + DependencyManager::get()->loadSettings(addressLookupString); + } + } + }; + + initializeLocation(); + // After all of the constructor is completed, then set firstRun to false. Setting::Handle firstRun{ Settings::firstRun, true }; firstRun.set(false); @@ -3279,15 +3352,6 @@ void Application::init() { _timerStart.start(); _lastTimeUpdated.start(); - - // when --url in command line, teleport to location - const QString HIFI_URL_COMMAND_LINE_KEY = "--url"; - int urlIndex = arguments().indexOf(HIFI_URL_COMMAND_LINE_KEY); - QString addressLookupString; - if (urlIndex != -1) { - addressLookupString = arguments().value(urlIndex + 1); - } - // when +connect_lobby in command line, join steam lobby const QString STEAM_LOBBY_COMMAND_LINE_KEY = "+connect_lobby"; int lobbyIndex = arguments().indexOf(STEAM_LOBBY_COMMAND_LINE_KEY); @@ -3296,21 +3360,6 @@ void Application::init() { SteamClient::joinLobby(lobbyId); } - Setting::Handle firstRun { Settings::firstRun, true }; - if (addressLookupString.isEmpty() && firstRun.get()) { - qCDebug(interfaceapp) << "First run and no URL passed... attempting to go to Home or Entry..."; - DependencyManager::get()->ifLocalSandboxRunningElse([](){ - qCDebug(interfaceapp) << "Home sandbox appears to be running, going to Home."; - DependencyManager::get()->goToLocalSandbox(); - }, - [](){ - qCDebug(interfaceapp) << "Home sandbox does not appear to be running, going to Entry."; - DependencyManager::get()->goToEntry(); - }); - } else { - qCDebug(interfaceapp) << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString); - DependencyManager::get()->loadSettings(addressLookupString); - } qCDebug(interfaceapp) << "Loaded settings"; From 4c3cb83d4745d75621b2169a4c1b95d5dd962b8a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 09:29:58 -0700 Subject: [PATCH 250/300] Set default preferred device to vive and rift --- interface/src/Application.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a81084d853..cb25766dbb 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5392,6 +5392,8 @@ void Application::initPlugins(const QStringList& arguments) { auto preferredDisplays = parser.value(display).split(',', QString::SkipEmptyParts); qInfo() << "Setting prefered display plugins:" << preferredDisplays; PluginManager::getInstance()->setPreferredDisplayPlugins(preferredDisplays); + } else { + PluginManager::getInstance()->setPreferredDisplayPlugins({ "OpenVR (Vive)", "Oculus Rift" }); } if (parser.isSet(disableDisplays)) { From e24a01d1fec9a27d12deba2c760c1ff8281e26d6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 09:30:47 -0700 Subject: [PATCH 251/300] Add path parameter to goToSandbox --- libraries/networking/src/AddressManager.h | 2 +- libraries/shared/src/PathUtils.cpp | 14 ++++++++++++++ libraries/shared/src/PathUtils.h | 1 + libraries/shared/src/ServerPathUtils.cpp | 12 +++--------- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index 248a1ef435..0ab70854eb 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -92,7 +92,7 @@ public slots: void goBack(); void goForward(); - void goToLocalSandbox(LookupTrigger trigger = LookupTrigger::StartupFromSettings) { handleUrl(SANDBOX_HIFI_ADDRESS, trigger); } + void goToLocalSandbox(QString path = "", LookupTrigger trigger = LookupTrigger::StartupFromSettings) { handleUrl(SANDBOX_HIFI_ADDRESS + path, trigger); } void goToEntry(LookupTrigger trigger = LookupTrigger::StartupFromSettings) { handleUrl(DEFAULT_HIFI_ADDRESS, trigger); } void goToUser(const QString& username); diff --git a/libraries/shared/src/PathUtils.cpp b/libraries/shared/src/PathUtils.cpp index 954ed2d75a..016b9ccfd6 100644 --- a/libraries/shared/src/PathUtils.cpp +++ b/libraries/shared/src/PathUtils.cpp @@ -17,6 +17,7 @@ #include #include #include "PathUtils.h" +#include const QString& PathUtils::resourcesPath() { @@ -29,6 +30,19 @@ const QString& PathUtils::resourcesPath() { return staticResourcePath; } +QString PathUtils::getRootDataDirectory() { + auto dataPath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); + +#ifdef Q_OS_WIN + dataPath += "/AppData/Roaming/"; +#elif defined(Q_OS_OSX) + dataPath += "/Library/Application Support/"; +#else + dataPath += "/.local/share/"; +#endif + + return dataPath; +} QString fileNameWithoutExtension(const QString& fileName, const QVector possibleExtensions) { QString fileNameLowered = fileName.toLower(); diff --git a/libraries/shared/src/PathUtils.h b/libraries/shared/src/PathUtils.h index 9f990815ce..43464fe236 100644 --- a/libraries/shared/src/PathUtils.h +++ b/libraries/shared/src/PathUtils.h @@ -22,6 +22,7 @@ class PathUtils : public QObject, public Dependency { Q_PROPERTY(QString resources READ resourcesPath) public: static const QString& resourcesPath(); + static QString getRootDataDirectory(); }; QString fileNameWithoutExtension(const QString& fileName, const QVector possibleExtensions); diff --git a/libraries/shared/src/ServerPathUtils.cpp b/libraries/shared/src/ServerPathUtils.cpp index ca87a28610..cf52875c5f 100644 --- a/libraries/shared/src/ServerPathUtils.cpp +++ b/libraries/shared/src/ServerPathUtils.cpp @@ -15,16 +15,10 @@ #include #include -QString ServerPathUtils::getDataDirectory() { - auto dataPath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); +#include "PathUtils.h" -#ifdef Q_OS_WIN - dataPath += "/AppData/Roaming/"; -#elif defined(Q_OS_OSX) - dataPath += "/Library/Application Support/"; -#else - dataPath += "/.local/share/"; -#endif +QString ServerPathUtils::getDataDirectory() { + auto dataPath = PathUtils::getRootDataDirectory(); dataPath += qApp->organizationName() + "/" + qApp->applicationName(); From c74df965bac643794800da3daefe0b087c3417f7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 09:31:18 -0700 Subject: [PATCH 252/300] Fix misnamed function and duplicate onFinish in tutorial --- .../controllers/toggleAdvancedMovementForHandControllers.js | 2 +- tutorial/tutorial.js | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js b/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js index bd31c5c42e..b74fe52e42 100644 --- a/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js +++ b/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js @@ -160,6 +160,6 @@ function handleMessage(channel, message, sender) { } Messages.subscribe(HIFI_ADVANCED_MOVEMENT_DISABLER_CHANNEL); -Messages.messageReceived.connect(handleHandMessages); +Messages.messageReceived.connect(handleMessage); }()); // END LOCAL_SCOPE diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 59bc88363a..713b052412 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -228,7 +228,6 @@ stepDisableControllers.prototype = { setControllerPartLayer('tips', 'blank'); hideEntitiesWithTag('finish'); - onFinish(); onFinish(); }, @@ -364,7 +363,7 @@ stepOrient.prototype = { this.checkIntervalID = null; function checkForHandsAboveHead() { - print("Checking for hands above head..."); + print("Orient: Checking for hands above head..."); if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { Script.clearInterval(this.checkIntervalID); this.checkIntervalID = null; @@ -431,7 +430,7 @@ stepRaiseAboveHead.prototype = { this.waitTimeoutID = Script.setTimeout(function() { this.checkIntervalID = null; function checkForHandsAboveHead() { - print("Checking for hands above head..."); + print("Raise above head: Checking for hands above head..."); if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { Script.clearInterval(this.checkIntervalID); this.checkIntervalID = null; From e9fb11b5f98d2c8444a8bc3cda914510d4a28d63 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 10:06:46 -0700 Subject: [PATCH 253/300] Remove annotation support from ControllerDisplay --- tutorial/controllerDisplay.js | 92 ++++------------------------------- 1 file changed, 10 insertions(+), 82 deletions(-) diff --git a/tutorial/controllerDisplay.js b/tutorial/controllerDisplay.js index 8a4f7a8c5d..f66cd90703 100644 --- a/tutorial/controllerDisplay.js +++ b/tutorial/controllerDisplay.js @@ -2,6 +2,12 @@ var DEBUG = false; var VISIBLE_BY_DEFAULT = false; var PARENT_ID = "{00000000-0000-0000-0000-000000000001}"; +function debug() { + if (DEBUG) { + print.apply(self, arguments); + } +} + createControllerDisplay = function(config) { var controllerDisplay = { overlays: [], @@ -9,14 +15,11 @@ createControllerDisplay = function(config) { }, parts: { }, - annotations: { - }, mappingName: "mapping-display", setPartVisible: function(partName, visible) { - print("Setting part visible", partName, visible); if (partName in this.partOverlays) { - print("FOUND"); + debug("Setting part visible", partName, visible); for (var i = 0; i < this.partOverlays[partName].length; ++i) { Overlays.editOverlay(this.partOverlays[partName][i], { visible: visible @@ -26,8 +29,8 @@ createControllerDisplay = function(config) { }, setLayerForPart: function(partName, layerName) { - print("Setting layer...", partName, layerName); if (partName in this.parts) { + debug("Setting layer...", partName, layerName); var part = this.parts[partName]; if (part.textureLayers && layerName in part.textureLayers) { var layer = part.textureLayers[layerName]; @@ -48,13 +51,12 @@ createControllerDisplay = function(config) { for (var i = 0; i < config.controllers.length; ++i) { var controller = config.controllers[i]; var position = controller.position; - Vec3.print("position", position); - print("position", position.x, position.y, position.z); + if (controller.naturalPosition) { position = Vec3.sum(Vec3.multiplyQbyV( controller.rotation, controller.naturalPosition), position); } - Vec3.print("Got controller position", position); + var overlayID = Overlays.addOverlay("model", { url: controller.modelURL, dimensions: controller.dimensions, @@ -68,79 +70,6 @@ createControllerDisplay = function(config) { controllerDisplay.overlays.push(overlayID); overlayID = null; - if (controller.annotations) { - for (var key in controller.annotations) { - var annotation = controller.annotations[key]; - var annotationPosition = Vec3.sum(controller.position, Vec3.multiplyQbyV(controller.rotation, annotation.position)); - if (DEBUG) { - overlayID = Overlays.addOverlay("sphere", { - localPosition: annotationPosition, - //localPosition: Vec3.sum(controller.position, annotation.position), - //localPosition: Vec3.sum(position, annotation.position), - color: annotation.color || { red: 255, green: 100, blue: 100 }, - dimensions: { - x: 0.01, - y: 0.01, - z: 0.01 - }, - parentID: PARENT_ID, - parentJointIndex: controller.jointIndex, - }); - controllerDisplay.overlays.push(overlayID); - - } - - var ANNOTATION_TEXT_OFFSET = 0.1; - var sign = annotation.direction == "right" ? 1 : -1; - var textOffset = annotation.direction == "right" ? 0.08 : 0.02; - if (annotation.textOffset) { - var pos = Vec3.sum(annotationPosition, Vec3.multiplyQbyV(controller.rotation, annotation.textOffset)); - } else { - var pos = Vec3.sum(annotationPosition, Vec3.multiplyQbyV(controller.rotation, { x: textOffset, y: 0, z: -0.005 })); - } - var textOverlayID = Overlays.addOverlay("text3d", { - visible: VISIBLE_BY_DEFAULT, - text: key, - localPosition: pos, - localRotation: controller.annotationTextRotation, - lineHeight: annotation.lineHeight ? annotation.lineHeight : 0.01, - leftMargin: 0, - rightMargin: 0, - topMargin: 0, - bottomMargin: 0, - backgroundAlpha: 0, - dimensions: { x: 0.003, y: 0.003, z: 0.003 }, - //localPosition: Vec3.sum(controller.position, annotation.position), - //localPosition: Vec3.sum(position, annotation.position), - color: annotation.textColor || { red: 255, green: 255, blue: 255 }, - parentID: PARENT_ID, - parentJointIndex: controller.jointIndex, - }); - - controllerDisplay.overlays.push(textOverlayID); - if (key in controllerDisplay.annotations) { - controllerDisplay.annotations[key].push(textOverlayID); - } else { - controllerDisplay.annotations[key] = [textOverlayID]; - } - - var ANNOTATION_OFFSET = 0.5; - var offset = { x: 0, y: 0, z: annotation.direction == "right" ? -1 * ANNOTATION_OFFSET : ANNOTATION_OFFSET }; - var lineOverlayID = Overlays.addOverlay("line3d", { - visible: false, - localPosition: annotationPosition, - localStart: { x: 0, y: 0, z: 0 }, - localEnd: offset, - //localPosition: Vec3.sum(controller.position, annotation.position), - //localPosition: Vec3.sum(position, annotation.position), - color: annotation.color || { red: 255, green: 100, blue: 100 }, - parentID: PARENT_ID, - parentJointIndex: controller.jointIndex, - }); - controllerDisplay.overlays.push(lineOverlayID); - } - } - function clamp(value, min, max) { if (value < min) { return min; @@ -204,7 +133,6 @@ createControllerDisplay = function(config) { function resolveHardware(path) { var parts = path.split("."); function resolveInner(base, path, i) { - //print(path[i]); if (i >= path.length) { return base; } From a75894240344698f10d2deef45adf9b7f9b05381 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 10:11:31 -0700 Subject: [PATCH 254/300] Remove annotation data from vive controller config --- tutorial/viveControllerConfiguration.js | 136 ------------------------ 1 file changed, 136 deletions(-) diff --git a/tutorial/viveControllerConfiguration.js b/tutorial/viveControllerConfiguration.js index a33a701641..25146c7382 100644 --- a/tutorial/viveControllerConfiguration.js +++ b/tutorial/viveControllerConfiguration.js @@ -155,69 +155,6 @@ VIVE_CONTROLLER_CONFIGURATION = { naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} }, }, - annotationTextRotation: Quat.fromPitchYawRollDegrees(45, -90, 0), - annotations: { - - left: { - textOffset: { x: -0.035, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - right: { - textOffset: { x: 0.023, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - - - trigger: { - position: { - x: 0.0055, - y: -0.032978, - z: 0.04546 - }, - lineHeight: 0.013, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - menu: { - position: { - x: 0, - y: 0.00770, - z: 0.01979 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - grip: { - position: { - x: 0.01980, - y: -0.01561, - z: 0.08721 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - steam: { - position: { - x: 0, - y: 0.00303, - z: 0.08838 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - }, }, @@ -336,79 +273,6 @@ VIVE_CONTROLLER_CONFIGURATION = { naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} }, }, - - annotationTextRotation: Quat.fromPitchYawRollDegrees(180 + 45, 90, 180), - annotations: { - - left: { - textOffset: { x: -0.035, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - right: { - textOffset: { x: 0.023, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - - trigger: { - position: { - x: -0.075, - y: -0.032978, - z: 0.04546 - }, - lineHeight: 0.013, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - menu: { - position: { - x: 0, - y: 0.00770, - z: 0.01979 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - grip: { - position: { - x: 0.01980, - y: -0.01561, - z: 0.08721 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - teleport: { - textOffset: { x: -0.015, y: 0.004, z: -0.005 }, - position: { - x: 0, - y: 0.00378, - z: 0.04920 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - steam: { - position: { - x: 0, - y: 0.00303, - z: 0.08838 - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - }, - } } ] } From 1d699186a36653c385157c4fc7e7232f9d6f2775 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 10:36:10 -0700 Subject: [PATCH 255/300] Clean up tutorial scripts --- tutorial/controllerDisplay.js | 2 +- tutorial/entityData.js | 415 ----------------------- tutorial/fuse.js | 52 +-- tutorial/fuseCollider.js | 47 +-- tutorial/ownershipToken.js | 6 +- tutorial/spinner.js | 25 +- tutorial/touchControllerConfiguration.js | 10 + tutorial/tutorial.js | 212 +++++------- 8 files changed, 136 insertions(+), 633 deletions(-) diff --git a/tutorial/controllerDisplay.js b/tutorial/controllerDisplay.js index f66cd90703..0485e0bd9f 100644 --- a/tutorial/controllerDisplay.js +++ b/tutorial/controllerDisplay.js @@ -1,7 +1,7 @@ -var DEBUG = false; var VISIBLE_BY_DEFAULT = false; var PARENT_ID = "{00000000-0000-0000-0000-000000000001}"; +var DEBUG = false; function debug() { if (DEBUG) { print.apply(self, arguments); diff --git a/tutorial/entityData.js b/tutorial/entityData.js index 1d36293586..1e38079de5 100644 --- a/tutorial/entityData.js +++ b/tutorial/entityData.js @@ -1,188 +1,3 @@ -Step1EntityData = [ -{ - "clientOnly": 0, - "color": { - "blue": 255, - "green": 0, - "red": 255 - }, - "created": "2016-08-29T22:57:55Z", - "dimensions": { - "x": 0.018359377980232239, - "y": 0.018359377980232239, - "z": 0.018359377980232239 - }, - "id": "{3bb83d9c-11db-4bc1-a61b-36921370cb40}", - "name": "tutorial/box_spawn", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "collisionless": 1, - "position": { - "x": 0, - "y": 0.8, - "z": 0.7790381908416748 - }, - "queryAACube": { - "scale": 0.031799376010894775, - "x": -0.015899688005447388, - "y": 0.79706859588623047, - "z": 0.7631385326385498 - }, - "rotation": { - "w": 1, - "x": 0, - "y": 0, - "z": 0 - }, - "shape": "Cube", - "type": "Box", - "userData": "{\"tag\":\"step2\"}", - "visible": 0 -}, -{ - "color": { - "blue": 181, - "green": 181, - "red": 181 - }, - "dimensions": { - "x": 0.37322089076042175, - "y": 0.8015166997909546, - "z": 0.37322089076042175 - }, - "name": "tutorial/pillar2", - //"shapeType": "simple-hull", - "position": { - "x": 0.019208565354347229, - "y": -0.1, - "z": 0.75276124477386475 - }, - "rotation": { - "w": 1, - "x": 0, - "y": 0, - "z": 0 - }, - "shape": "Cube", - "type": "Box", - "userData": "{\"tag\":\"step2\"}" -}, -{ - "clientOnly": 0, - "compoundShapeURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj", - "created": "2016-08-29T22:57:55Z", - "dimensions": { - "x": 0.57461458444595337, - "y": 0.35781359672546387, - "z": 0.57461458444595337 - }, - "gravity": { - "x": 0, - "y": -5, - "z": 0 - }, - "id": "{2a8a9cb8-4501-4089-8fb8-6b1b5100db10}", - "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx", - "name": "tutorial/basket", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "position": { - "x": 0.022034257650375366, - "y": 0.47968916893005371, - "z": 0 - }, - "queryAACube": { - "scale": 0.88791579008102417, - "x": -0.42192363739013672, - "y": 0.23573127388954163, - "z": -0.44395789504051208 - }, - "rotation": { - "w": 1, - "x": -1.52587890625e-05, - "y": -1.52587890625e-05, - "z": -1.52587890625e-05 - }, - "shapeType": "compound", - "type": "Model", - "userData": "{\"hifiHomeKey\":{\"reset\":true},\"tag\":\"step2\"}" -}, -{ - "clientOnly": 0, - "collisionless": 1, - "color": { - "blue": 255, - "green": 0, - "red": 255 - }, - "created": "2016-08-29T22:57:55Z", - "dimensions": { - "x": 0.43770244717597961, - "y": 0.33723857998847961, - "z": 0.43770244717597961 - }, - "id": "{436aec80-15e8-4fc3-bd74-f173b731a922}", - "ignoreForCollisions": 1, - "name": "tutorial/basket_collider", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "position": { - "x": 0.02785143256187439, - "y": 0.50166182518005371, - "z": 0.0017895996570587158 - }, - "queryAACube": { - "scale": 0.70490902662277222, - "x": -0.32460308074951172, - "y": 0.3492073118686676, - "z": -0.35066491365432739 - }, - "rotation": { - "w": 1, - "x": 0, - "y": 0, - "z": 0 - }, - "type": "Sphere", - "userData": "{\"tag\":\"step2\"}", - "visible": 0 -}, -{ - "clientOnly": 0, - "color": { - "blue": 181, - "green": 181, - "red": 181 - }, - "created": "2016-08-29T22:57:55Z", - "dimensions": { - "x": 0.37322089076042175, - "y": 0.8015000104904175, - "z": 0.37322089076042175 - }, - "id": "{221be6c2-e0d6-4a7c-b9d4-a77e6b7d1c9a}", - "name": "tutorial/pillar1", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "position": { - "x": 0.019208565354347229, - "y": -0.1, - "z": 0.025902509689331055 - }, - "queryAACube": { - "scale": 1.1320732831954956, - "x": -0.54682809114456177, - "y": -0.5660366415977478, - "z": -0.54013413190841675 - }, - "rotation": { - "w": 1, - "x": 0, - "y": 0, - "z": 0 - }, - "shape": "Cube", - "type": "Box", - "userData": "{\"tag\":\"step2\"}" -} -]; - birdFirework1 = { "clientOnly": 0, "collisionsWillMove": 1, @@ -320,233 +135,3 @@ Step1BlockData = { "type": "Box", "userData": JSON.stringify({ hifiHomeKey: { reset: true } }), }; - -StepGunData = [ - { - "clientOnly": 0, - "created": "2016-08-23T22:18:46Z", - "dimensions": { - "x": 2.4929797649383545, - "y": 0.94968640804290771, - "z": 1.0870213508605957 - }, - "id": "{de28363f-d1f8-4001-8e6b-1b5876699f49}", - "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/table2_re-oriented.fbx", - "name": "tutorial/table", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "position": { - "x": 0.17360222339630127, - "y": 0, - "z": 0 - }, - "queryAACube": { - "scale": 2.8807060718536377, - "x": -1.2667508125305176, - "y": -1.4403530359268188, - "z": -1.4403530359268188 - }, - "rotation": { - "w": 0.70705735683441162, - "x": -1.52587890625e-05, - "y": -0.70717936754226685, - "z": -1.52587890625e-05 - }, - "shapeType": "static-mesh", - "type": "Model", - "userData": "{\"tag\":\"step4\"}" - }, - { - "clientOnly": 0, - "compoundShapeURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj", - "created": "2016-08-23T22:18:46Z", - "dimensions": { - "x": 0.57461458444595337, - "y": 0.35781359672546387, - "z": 0.57461458444595337 - }, - "gravity": { - "x": 0, - "y": -5, - "z": 0 - }, - "id": "{51e7cf16-e624-44a8-b835-47c35c6ad5f0}", - "modelURL": "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx", - "name": "tutorial/basket", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "position": { - "x": 3.8134055137634277, - "y": 0.6480712890625, - "z": 0.015498995780944824 - }, - "queryAACube": { - "scale": 0.88791579008102417, - "x": 3.3694477081298828, - "y": 0.20411339402198792, - "z": -0.42845889925956726 - }, - "rotation": { - "w": 1, - "x": -1.52587890625e-05, - "y": -1.52587890625e-05, - "z": -1.52587890625e-05 - }, - "shapeType": "compound", - "type": "Model", - "userData": "{\"hifiHomeKey\":{\"reset\":true},\"tag\":\"step4\"}" - }, - { - "clientOnly": 0, - "collisionless": 1, - "color": { - "blue": 0, - "green": 0, - "red": 255 - }, - "created": "2016-08-23T22:20:57Z", - "dimensions": { - "x": 0.0649842768907547, - "y": 0.0649842768907547, - "z": 0.0649842768907547 - }, - "id": "{264943d2-600f-4d22-ad30-ccd57f7c4424}", - "ignoreForCollisions": 1, - "name": "tutorial/gun_spawn", - visible: false, - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "position": { - "x": 0, - "y": 0.62629544734954834, - "z": 0.028602004051208496 - }, - "queryAACube": { - "scale": 0.11255607008934021, - "x": -0.056278035044670105, - "y": 0.57001739740371704, - "z": -0.027676030993461609 - }, - "shape": "Cube", - "type": "Box" - }, - { - "clientOnly": 0, - "collisionless": 1, - "color": { - "blue": 255, - "green": 0, - "red": 255 - }, - "created": "2016-08-23T22:18:46Z", - "dimensions": { - "x": 0.43770244717597961, - "y": 0.33723857998847961, - "z": 0.43770244717597961 - }, - "id": "{a8944645-3234-484f-aed1-1a63d76aa51c}", - "ignoreForCollisions": 1, - "name": "tutorial/basket_collider", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "position": { - "x": 3.8192229270935059, - "y": 0.6700439453125, - "z": 0.017288565635681152 - }, - "queryAACube": { - "scale": 0.70490902662277222, - "x": 3.4667685031890869, - "y": 0.31758943200111389, - "z": -0.33516594767570496 - }, - "rotation": { - "w": 1, - "x": 0, - "y": 0, - "z": 0 - }, - "type": "Sphere", - "userData": "{\"tag\":\"step4\"}", - "visible": 0 - } -]; - -GunData = { - "clientOnly": 0, - "collisionsWillMove": 1, - "compoundShapeURL": "http://hifi-production.s3.amazonaws.com/tutorials/pingPongGun/Pingpong-Gun-New.obj", - "created": "2016-08-23T22:12:13Z", - "dimensions": { - "x": 0.125, - "y": 0.38749998807907104, - "z": 0.99309998750686646 - }, - "dynamic": 1, - "gravity": { - "x": 0, - "y": -5, - "z": 0 - }, - - "id": "{8d3fa3f2-8b59-4f47-8bb4-c03574239c9f}", - "modelURL": "http://hifi-production.s3.amazonaws.com/tutorials/pingPongGun/Pingpong-Gun-New.fbx", - "name": "tutorial/gun", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "queryAACube": { - "scale": 3.219977855682373, - "x": -2.5046753883361816, - "y": -1.8901374340057373, - "z": -0.68512386083602905 - }, - velocity: { - x: 0, - y: -1, - z: 0 - }, - "rotation": { - "w": 0.69534718990325928, - "x": -0.13302478194236755, - "y": -0.12684555351734161, - "z": 0.69477111101150513 - }, - "script": "http://hifi-production.s3.amazonaws.com/tutorials/entity_scripts/pingPongGun.js", - "shapeType": "compound", - "type": "Model", - "userData": "{\"grabbableKey\":{\"invertSolidWhileHeld\":true},\"wearable\":{\"joints\":{\"RightHand\":[{\"x\":0.1177130937576294,\"y\":0.12922893464565277,\"z\":0.08307232707738876},{\"x\":0.4934672713279724,\"y\":0.3605862259864807,\"z\":0.6394805908203125,\"w\":-0.4664038419723511}],\"LeftHand\":[{\"x\":0.09151676297187805,\"y\":0.13639454543590546,\"z\":0.09354984760284424},{\"x\":-0.19628101587295532,\"y\":0.6418180465698242,\"z\":0.2830369472503662,\"w\":0.6851521730422974}]}}}" -}; - -HandsAboveHeadData = [ -{ - name: "tutorial/sign", - "backgroundColor": { - "blue": 187, - "green": 242, - "red": 198 - }, - "clientOnly": 0, - "created": "2016-08-23T22:42:48Z", - "dimensions": { - "x": 0.58140444755554199, - "y": 0.38676983118057251, - "z": 0.0099999997764825821 - }, - "id": "{c0ceabcf-501e-41fe-99e9-aca47a44122f}", - "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", - "queryAACube": { - "scale": 0.69837099313735962, - "x": -0.34918549656867981, - "y": -0.34918549656867981, - "z": -0.34918549656867981 - }, - "rotation": { - "w": 0.70710676908493042, - "x": 0, - "y": -0.70710670948028564, - "z": 0 - }, - "text": "Put your hands above your head.", - "textColor": { - "blue": 0, - "green": 0, - "red": 0 - }, - "type": "Text" -} -]; diff --git a/tutorial/fuse.js b/tutorial/fuse.js index 48efeb28e6..bd188a741f 100644 --- a/tutorial/fuse.js +++ b/tutorial/fuse.js @@ -1,36 +1,21 @@ +// +// fuse.js +// +// Created by Ryan Huffman on 9/1/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + (function() { - var findEntity = function(properties, searchRadius, filterFn) { - var entities = findEntities(properties, searchRadius, filterFn); - return entities.length > 0 ? entities[0] : null; - } + Script.include('utils.js'); - // Return all entities with properties `properties` within radius `searchRadius` - var findEntities = function(properties, searchRadius, filterFn) { - if (!filterFn) { - filterFn = function(properties, key, value) { - return value == properties[key]; - } + var DEBUG = false; + function debug() { + if (DEBUG) { + print.apply(self, arguments); } - searchRadius = searchRadius ? searchRadius : 100000; - var entities = Entities.findEntities({ x: 0, y: 0, z: 0 }, searchRadius); - var matchedEntities = []; - var keys = Object.keys(properties); - for (var i = 0; i < entities.length; ++i) { - var match = true; - var candidateProperties = Entities.getEntityProperties(entities[i], keys); - for (var key in properties) { - if (!filterFn(properties, key, candidateProperties[key])) { - // This isn't a match, move to next entity - match = false; - break; - } - } - if (match) { - matchedEntities.push(entities[i]); - } - } - - return matchedEntities; } var fuseSound = SoundCache.getSound("https://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Sounds/fuse.wav"); @@ -48,9 +33,8 @@ }; Fuse.prototype = { light: function() { - print("LIT", this.entityID); + debug("LIT", this.entityID); var anim = Entities.getEntityProperties(this.entityID, ['animation']).animation; - print("anim: ", anim.currentFrame, Object.keys(anim)); if (anim.currentFrame < 140) { return; @@ -86,8 +70,8 @@ var self = this; Script.setTimeout(function() { - print("BLOW UP"); - var spinnerID = findEntity({ name: "tutorial/equip/spinner" }, 20); + debug("BLOW UP"); + var spinnerID = Utils.findEntity({ name: "tutorial/equip/spinner" }, 20); Entities.callEntityMethod(spinnerID, "onLit"); injector.stop(); diff --git a/tutorial/fuseCollider.js b/tutorial/fuseCollider.js index dd8195d9b0..0ad5cfb371 100644 --- a/tutorial/fuseCollider.js +++ b/tutorial/fuseCollider.js @@ -1,55 +1,12 @@ (function() { - var findEntity = function(properties, searchRadius, filterFn) { - var entities = findEntities(properties, searchRadius, filterFn); - return entities.length > 0 ? entities[0] : null; - } - - // Return all entities with properties `properties` within radius `searchRadius` - var findEntities = function(properties, searchRadius, filterFn) { - if (!filterFn) { - filterFn = function(properties, key, value) { - return value == properties[key]; - } - } - searchRadius = searchRadius ? searchRadius : 100000; - var entities = Entities.findEntities({ x: 0, y: 0, z: 0 }, searchRadius); - var matchedEntities = []; - var keys = Object.keys(properties); - for (var i = 0; i < entities.length; ++i) { - var match = true; - var candidateProperties = Entities.getEntityProperties(entities[i], keys); - for (var key in properties) { - if (!filterFn(properties, key, candidateProperties[key])) { - // This isn't a match, move to next entity - match = false; - break; - } - } - if (match) { - matchedEntities.push(entities[i]); - } - } - - return matchedEntities; - } - - function getChildProperties(entityID, propertyNames) { - var childEntityIDs = Entities.getChildrenIDs(entityID); - var results = {} - for (var i = 0; i < childEntityIDs.length; ++i) { - var childEntityID = childEntityIDs[i]; - var properties = Entities.getEntityProperties(childEntityID, propertyNames); - results[childEntityID] = properties; - } - return results; - } + Script.include('utils.js'); var Fuse = function() { }; Fuse.prototype = { onLit: function() { print("LIT", this.entityID); - var fuseID = findEntity({ name: "tutorial/equip/fuse" }, 20); + var fuseID = Utils.findEntity({ name: "tutorial/equip/fuse" }, 20); Entities.callEntityMethod(fuseID, "light"); }, preload: function(entityID) { diff --git a/tutorial/ownershipToken.js b/tutorial/ownershipToken.js index ae212baa84..3cfb3f285d 100644 --- a/tutorial/ownershipToken.js +++ b/tutorial/ownershipToken.js @@ -18,7 +18,7 @@ if (!Function.prototype.bind) { if (this.prototype) { // Function.prototype doesn't have a prototype property - fNOP.prototype = this.prototype; + fNOP.prototype = this.prototype; } fBound.prototype = new fNOP(); @@ -43,8 +43,7 @@ function getOwnershipTokenID(parentEntityID) { var childID = childEntityIDs[i]; var properties = Entities.getEntityProperties(childID, ['name', 'userData', 'lifetime', 'age']); var childName = properties.name; - //debug("Owner lifetime: ", properties.lifetime, properties.age); - if (properties.age > 0.5 && childName.indexOf(TOKEN_NAME_PREFIX) == 0) { + if (childName.indexOf(TOKEN_NAME_PREFIX) == 0) { if (ownerID === null || childName < ownerName) { ownerID = childID; ownerName = childName; @@ -89,7 +88,6 @@ OwnershipToken = function(name, parentEntityID, options) { this.checkEverySeconds = getOption(options, 'checkEverySeconds', 1000); this.updateTokenLifetimeEvery = getOption(options, 'updateTokenLifetimeEvery', 2000); - //this.onRequestingOwnership = getOption(options, 'onRequestingOwnership', function() { }); this.onGainedOwnership = getOption(options, 'onGainedOwnership', function() { }); this.onLostOwnership = getOption(options, 'onLostOwnership', function() { }); diff --git a/tutorial/spinner.js b/tutorial/spinner.js index 4d34f31890..b4ff188b44 100644 --- a/tutorial/spinner.js +++ b/tutorial/spinner.js @@ -1,4 +1,21 @@ +// +// spinner.js +// +// Created by Ryan Huffman on 9/1/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + (function() { + var DEBUG = false; + function debug() { + if (DEBUG) { + print.apply(self, arguments); + } + } + var spinnerSound = SoundCache.getSound("http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Sounds/Pinwheel.L.wav"); var Spinner = function() { }; @@ -14,7 +31,7 @@ } Spinner.prototype = { onLit: function() { - print("LIT SPINNER", this.entityID); + debug("LIT SPINNER", this.entityID); Entities.editEntity(this.entityID, { "angularDamping": 0.1, "angularVelocity": { @@ -26,10 +43,9 @@ var injector = Audio.playSound(spinnerSound, { position: Entities.getEntityProperties(this.entityID, 'position').position, volume: 1.0, - loop: false + loop: false }); - print("HERE2"); var childrenProps = getChildProperties(this.entityID, ['type']); for (var childEntityID in childrenProps) { var props = childrenProps[childEntityID]; @@ -43,10 +59,9 @@ var self = this; Script.setTimeout(function() { - print("BLOW UP"); + debug("BLOW UP"); injector.stop(); - print("HERE"); var childrenProps = getChildProperties(self.entityID, ['type']); for (var childEntityID in childrenProps) { var props = childrenProps[childEntityID]; diff --git a/tutorial/touchControllerConfiguration.js b/tutorial/touchControllerConfiguration.js index 644215ce60..a63d6749ad 100644 --- a/tutorial/touchControllerConfiguration.js +++ b/tutorial/touchControllerConfiguration.js @@ -1,3 +1,13 @@ +// +// touchControllerConfiguration.js +// +// Created by Ryan Huffman on 9/1/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + var CONTROLLER_LENGTH_OFFSET = 0.0762; var leftBasePosition = { x: CONTROLLER_LENGTH_OFFSET / 2, diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 713b052412..2db6dfc8df 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -1,3 +1,18 @@ +// +// tutorial.js +// +// Created by Ryan Huffman on 9/1/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +Script.include("entityData.js"); +Script.include("viveHandsv2.js"); +Script.include("lighter/createButaneLighter.js"); +Script.include('ownershipToken.js'); + if (!Function.prototype.bind) { Function.prototype.bind = function(oThis) { if (typeof this !== 'function') { @@ -26,15 +41,31 @@ if (!Function.prototype.bind) { }; } -Script.include("entityData.js"); +var DEBUG = false; +function debug() { + if (DEBUG) { + print.apply(self, arguments); + } +} -Script.include("viveHandsv2.js"); -Script.include("lighter/createButaneLighter.js"); -Script.include('ownershipToken.js'); +var INFO = true; +function info() { + if (INFO) { + print.apply(self, arguments); + } +} var BASKET_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx"; var BASKET_COLLIDER_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj"; -//var successSound = SoundCache.getSound(Script.resolvePath("success48.wav")); + +var NEAR_BOX_SPAWN_NAME = "tutorial/nearGrab/box_spawn"; +var FAR_BOX_SPAWN_NAME = "tutorial/farGrab/box_spawn"; +var NEAR_BASKET_COLLIDER_NAME = "tutorial/nearGrab/basket_collider"; +var FAR_BASKET_COLLIDER_NAME = "tutorial/farGrab/basket_collider"; +var GUN_BASKET_COLLIDER_NAME = "tutorial/equip/basket_collider"; +var GUN_SPAWN_NAME = "tutorial/gun_spawn"; +var TELEPORT_PAD_NAME = "tutorial/teleport/pad" + var successSound = SoundCache.getSound("http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Sounds/good_one.L.wav"); function beginsWithFilter(value, key) { @@ -74,8 +105,24 @@ findEntities = function(properties, searchRadius, filterFn) { return matchedEntities; } -// On start tutorial... +function setControllerVisible(name, visible) { + return; + Messages.sendLocalMessage('Controller-Display', JSON.stringify({ + name: name, + visible: visible, + })); +} + +function setControllerPartsVisible(parts) { + Messages.sendLocalMessage('Controller-Display-Parts', JSON.stringify(parts)); +} + +function setControllerPartLayer(part, layer) { + data = {}; + data[part] = layer; + Messages.sendLocalMessage('Controller-Set-Part-Layer', JSON.stringify(data)); +} function triggerHapticPulse() { function scheduleHaptics(delay, strength, duration) { @@ -91,18 +138,8 @@ function triggerHapticPulse() { scheduleHaptics(1200, 0.1, 100); } -// Load assets -var NEAR_BOX_SPAWN_NAME = "tutorial/nearGrab/box_spawn"; -var FAR_BOX_SPAWN_NAME = "tutorial/farGrab/box_spawn"; -var NEAR_BASKET_COLLIDER_NAME = "tutorial/nearGrab/basket_collider"; -var FAR_BASKET_COLLIDER_NAME = "tutorial/farGrab/basket_collider"; -var GUN_BASKET_COLLIDER_NAME = "tutorial/equip/basket_collider"; -var GUN_SPAWN_NAME = "tutorial/gun_spawn"; -var GUN_AMMO_NAME = "Tutorial Ping Pong Ball" -var TELEPORT_PAD_NAME = "tutorial/teleport/pad" - function spawn(entityData, transform, modifyFn) { - print("Creating: ", entityData); + debug("Creating: ", entityData); if (!transform) { transform = { position: { x: 0, y: 0, z: 0 }, @@ -112,7 +149,7 @@ function spawn(entityData, transform, modifyFn) { var ids = []; for (var i = 0; i < entityData.length; ++i) { var data = entityData[i]; - print("Creating: ", data.name); + debug("Creating: ", data.name); data.position = Vec3.sum(transform.position, data.position); data.rotation = Quat.multiply(data.rotation, transform.rotation); if (modifyFn) { @@ -120,7 +157,7 @@ function spawn(entityData, transform, modifyFn) { } var id = Entities.addEntity(data); ids.push(id); - print(id, "data:", JSON.stringify(data)); + debug(id, "data:", JSON.stringify(data)); } return ids; } @@ -140,26 +177,22 @@ function spawnWithTag(entityData, transform, tag) { var userData = parseJSON(data.userData); userData.tag = tag; data.userData = JSON.stringify(userData); - print("In modify", tag, userData, data.userData); + debug("In modify", tag, userData, data.userData); return data; } return spawn(entityData, transform, modifyFn); } function deleteEntitiesWithTag(tag) { - print("searching for...:", tag); + debug("searching for...:", tag); var entityIDs = findEntitiesWithTag(tag); for (var i = 0; i < entityIDs.length; ++i) { - //print("Deleteing:", entityIDs[i]); Entities.deleteEntity(entityIDs[i]); } } function editEntitiesWithTag(tag, propertiesOrFn) { - //print("Editing:", tag); var entityIDs = findEntitiesWithTag(tag); - //print("Editing...", entityIDs); for (var i = 0; i < entityIDs.length; ++i) { - //print("Editing...", entityIDs[i]); if (isFunction(propertiesOrFn)) { Entities.editEntity(entityIDs[i], propertiesOrFn(entityIDs[i])); } else { @@ -349,21 +382,14 @@ stepOrient.prototype = { } }; - // this.overlay = new StayInFrontOverlay("model", { - // url: "http://hifi-content.s3.amazonaws.com/alan/dev/Prompt-Cards/welcome.fbx?11", - // ignoreRayIntersection: true, - // visible: false - // }, 1.5, { x: 0, y: 0.3, z: 0 }); - // Spawn content set - //spawnWithTag(HandsAboveHeadData, defaultTransform, tag); - print("raise hands...", this.tag); + debug("raise hands...", this.tag); editEntitiesWithTag(this.tag, { visible: true }); this.checkIntervalID = null; function checkForHandsAboveHead() { - print("Orient: Checking for hands above head..."); + debug("Orient: Checking for hands above head..."); if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { Script.clearInterval(this.checkIntervalID); this.checkIntervalID = null; @@ -421,16 +447,14 @@ stepRaiseAboveHead.prototype = { } }; - // Spawn content set - print("raise hands...", this.tag); + debug("raise hands...", this.tag); editEntitiesWithTag(this.tag, { visible: true }); - // Wait 2 seconds before starting to check for hands this.waitTimeoutID = Script.setTimeout(function() { this.checkIntervalID = null; function checkForHandsAboveHead() { - print("Raise above head: Checking for hands above head..."); + debug("Raise above head: Checking for hands above head..."); if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { Script.clearInterval(this.checkIntervalID); this.checkIntervalID = null; @@ -455,24 +479,6 @@ stepRaiseAboveHead.prototype = { } }; -function setControllerVisible(name, visible) { - return; - Messages.sendLocalMessage('Controller-Display', JSON.stringify({ - name: name, - visible: visible, - })); -} - -function setControllerPartsVisible(parts) { - Messages.sendLocalMessage('Controller-Display-Parts', JSON.stringify(parts)); -} - -function setControllerPartLayer(part, layer) { - data = {}; - data[part] = layer; - Messages.sendLocalMessage('Controller-Set-Part-Layer', JSON.stringify(data)); -} - /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -498,13 +504,12 @@ stepNearGrab.prototype = { var tag = this.tag; // Spawn content set - //spawnWithTag(Step1EntityData, null, tag); showEntitiesWithTag(this.tag, { visible: true }); showEntitiesWithTag('bothGrab', { visible: true }); var boxSpawnID = findEntity({ name: NEAR_BOX_SPAWN_NAME }, 10000); if (!boxSpawnID) { - print("Error creating block, cannot find spawn"); + info("Error creating block, cannot find spawn"); return null; } var boxSpawnPosition = Entities.getEntityProperties(boxSpawnID, 'position').position; @@ -530,7 +535,7 @@ stepNearGrab.prototype = { return; } if (channel == "Entity-Exploded") { - print("TUTORIAL: Got entity-exploded message"); + debug("TUTORIAL: Got entity-exploded message"); var data = parseJSON(message); if (this.birdIDs.indexOf(data.entityID) >= 0) { @@ -541,7 +546,7 @@ stepNearGrab.prototype = { } }, cleanup: function() { - print("cleaning up near grab"); + debug("cleaning up near grab"); this.finished = true; setControllerVisible("trigger", false); setControllerPartLayer('tips', 'blank'); @@ -590,7 +595,7 @@ stepFarGrab.prototype = { var boxSpawnID = findEntity({ name: FAR_BOX_SPAWN_NAME }, 10000); if (!boxSpawnID) { - print("Error creating block, cannot find spawn"); + debug("Error creating block, cannot find spawn"); return null; } var boxSpawnPosition = Entities.getEntityProperties(boxSpawnID, 'position').position; @@ -610,7 +615,7 @@ stepFarGrab.prototype = { return; } if (channel == "Entity-Exploded") { - print("TUTORIAL: Got entity-exploded message"); + debug("TUTORIAL: Got entity-exploded message"); var data = parseJSON(message); if (this.birdIDs.indexOf(data.entityID) >= 0) { playSuccessSound(); @@ -694,7 +699,7 @@ stepEquip.prototype = { function createGun() { var boxSpawnID = findEntity({ name: GUN_SPAWN_NAME }, 10000); if (!boxSpawnID) { - print("Error creating block, cannot find spawn"); + info("Error creating block, cannot find spawn"); return null; } @@ -707,12 +712,9 @@ stepEquip.prototype = { } - // Enabled grab - // Create table ? - // Create blocks and basket this.gunID = createGun.bind(this)(); this.startWatchingGun(); - print("Created", this.gunID); + debug("Created", this.gunID); this.onFinish = onFinish; }, startWatchingGun: function() { @@ -737,7 +739,7 @@ stepEquip.prototype = { return; } - print("Got message", channel, message, sender, MyAvatar.sessionUUID); + debug("Got message", channel, message, sender, MyAvatar.sessionUUID); if (channel == "Tutorial-Spinner") { if (this.currentPart == this.PART1 && message == "wasLit") { @@ -753,7 +755,7 @@ stepEquip.prototype = { if (this.currentPart == this.PART2) { var data = parseJSON(message); if (data.action == 'release' && data.grabbedEntity == this.gunID) { - print("got release"); + info("got release"); this.stopWatchingGun(); this.currentPart = this.COMPLETE; playSuccessSound(); @@ -820,17 +822,16 @@ stepTurnAround.prototype = { var dir = Quat.getFront(MyAvatar.orientation); var angle = Math.atan2(dir.z, dir.x); var angleDegrees = ((angle / Math.PI) * 180); - print("CHECK"); if (!hasTurnedAround) { if (Math.abs(angleDegrees) > 140) { hasTurnedAround = true; - print("half way there..."); + info("Half way turned around"); } } else { if (Math.abs(angleDegrees) < 30) { Script.clearInterval(this.interval); this.interval = null; - print("DONE"); + info("Turned around"); playSuccessSound(); onFinish(); } @@ -876,20 +877,21 @@ stepTeleport.prototype = { // Wait until touching teleport pad... var padID = findEntity({ name: TELEPORT_PAD_NAME }, 100); - print(padID); var padProps = Entities.getEntityProperties(padID, ["position", "dimensions"]); - print(Object.keys(padProps)); var xMin = padProps.position.x - padProps.dimensions.x / 2; var xMax = padProps.position.x + padProps.dimensions.x / 2; var zMin = padProps.position.z - padProps.dimensions.z / 2; var zMax = padProps.position.z + padProps.dimensions.z / 2; function checkCollides() { - print("Checking if on pad..."); + debug("Checking if on pad..."); + var pos = MyAvatar.position; - print('x', pos.x, xMin, xMax); - print('z', pos.z, zMin, zMax); + + debug('x', pos.x, xMin, xMax); + debug('z', pos.z, zMin, zMax); + if (pos.x > xMin && pos.x < xMax && pos.z > zMin && pos.z < zMax) { - print("On pad!!"); + debug("On teleport pad"); Script.clearInterval(this.checkCollidesTimer); this.checkCollidesTimer = null; playSuccessSound(); @@ -901,8 +903,6 @@ stepTeleport.prototype = { showEntitiesWithTag(this.tag); }, cleanup: function() { - //setControllerVisible("teleport", false); - setControllerPartLayer('touchpad', 'blank'); setControllerPartLayer('tips', 'blank'); @@ -968,7 +968,7 @@ function showEntitiesWithTag(tag) { collisionless = data.collidable === true ? false : true; } if (data.soundKey) { - print("Setting sound key to true"); + debug("Setting sound key to true"); data.soundKey.playing = true; } var newProperties = { @@ -1055,12 +1055,12 @@ TutorialManager = function() { if (currentStepNum >= STEPS.length) { // Done - print("DONE WITH TUTORIAL"); + info("DONE WITH TUTORIAL"); currentStepNum = -1; currentStep = null; return false; } else { - print("Starting step", currentStepNum); + info("Starting step", currentStepNum); currentStep = STEPS[currentStepNum]; startedLastStepAt = Date.now(); currentStep.start(this.onFinish); @@ -1082,49 +1082,3 @@ TutorialManager = function() { currentStep = null; } } - -Script.scriptEnding.connect(function() { - Controller.enableMapping('handControllerPointer-click'); -}); - -// var entityID = '{be3d10a3-262a-4827-b30c-ec025c4325dc}'; -// var token = new OwnershipToken(Math.random() * 100000, entityID, { -// onGainedOwnership: function(token) { -// //Script.setTimeout(function() { token.destroy() }, 15000); -// Controller.keyReleaseEvent.connect(keyReleaseHandler); -// startTutorial(); -// }, -// onLostOwnership: function(token) { -// Controller.keyReleaseEvent.disconnect(keyReleaseHandler); -// stopTutorial(); -// } -// }); - -//tutorialManager = new TutorialManager(); -//tutorialManager.startTutorial(); -//Controller.keyReleaseEvent.connect(keyReleaseHandler); -Script.scriptEnding.connect(function() { - //token.destroy(); - //stopTutorial(); -}); - -// function keyReleaseHandler(event) { -// print(event.text); -// if (event.text == ",") { -// if (!tutorialManager.startNextStep()) { -// tutorialManager.startTutorial(); -// } -// } else if (event.text == "F11") { -// tutorialManager.restartStep(); -// } else if (event.text == "F10") { -// MyAvatar.shouldRenderLocally = !MyAvatar.shouldRenderLocally; -// } else if (event.text == "r") { -// tutorialManager.stopTutorial(); -// tutorialManager.startTutorial(); -// } -// } -// -// Messages.sendLocalMessage('Controller-Display', JSON.stringify({ -// name: "menu", -// visible: false, -// })); From 1e0772d613c2ad87a2963cbab8fe066101d41a6f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 12:05:42 -0700 Subject: [PATCH 256/300] Remove unused variable --- interface/src/Application.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index cb25766dbb..ef5f044cf0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1276,7 +1276,6 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : Setting::Handle firstRun { Settings::firstRun, true }; bool isOnVive = _displayPlugin && _displayPlugin->getName() == "OpenVR (Vive)"; - bool isFirstRun = firstRun.get(); Setting::Handle tutorialComplete { "tutorialComplete", false }; bool shouldGoToTutorial = isOnVive && hasTutorialContent && !tutorialComplete.get(); From 2ea71f5e0b6a399630fb48742d6bbbc4bc9881aa Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 16:47:25 -0700 Subject: [PATCH 257/300] Fix cleanup of controller in tutorial --- tutorial/controllerDisplay.js | 1 + tutorial/tutorial.js | 87 +++++++++++++------- tutorial/tutorialZone.js | 4 +- tutorial/viveHandsv2.js | 144 +++++++++++++++++----------------- 4 files changed, 134 insertions(+), 102 deletions(-) diff --git a/tutorial/controllerDisplay.js b/tutorial/controllerDisplay.js index 0485e0bd9f..a85d25f562 100644 --- a/tutorial/controllerDisplay.js +++ b/tutorial/controllerDisplay.js @@ -175,6 +175,7 @@ ControllerDisplay = function() { }; deleteControllerDisplay = function(controllerDisplay) { + print("Deleting controller display"); for (var i = 0; i < controllerDisplay.overlays.length; ++i) { Overlays.deleteOverlay(controllerDisplay.overlays[i]); } diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 2db6dfc8df..68dd316360 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -44,14 +44,14 @@ if (!Function.prototype.bind) { var DEBUG = false; function debug() { if (DEBUG) { - print.apply(self, arguments); + print.apply(this, arguments); } } var INFO = true; function info() { if (INFO) { - print.apply(self, arguments); + print.apply(this, arguments); } } @@ -247,7 +247,8 @@ var stepDisableControllers = function(name) { } stepDisableControllers.prototype = { start: function(onFinish) { - editEntitiesWithTag('door', { visible: true }); + controllerDisplayManager = new ControllerDisplayManager(); + editEntitiesWithTag('door', { visible: true, collisionless: false }); Menu.setIsOptionChecked("Overlays", false); Controller.disableMapping('handControllerPointer-click'); Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'disable'); @@ -268,24 +269,39 @@ stepDisableControllers.prototype = { } }; +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: ENABLE CONTROLLERS // +// // +/////////////////////////////////////////////////////////////////////////////// +function reenableEverything() { + editEntitiesWithTag('door', { visible: false, collisionless: true }); + Menu.setIsOptionChecked("Overlays", true); + Controller.enableMapping('handControllerPointer-click'); + Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'enable'); + Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); + Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ + nearGrabEnabled: true, + holdEnabled: true, + farGrabEnabled: true, + })); + setControllerPartLayer('touchpad', 'blank'); + setControllerPartLayer('tips', 'blank'); + MyAvatar.shouldRenderLocally = true; + if (controllerDisplayManager) { + controllerDisplayManager.destroy(); + controllerDisplayManager = null; + } +} + var stepEnableControllers = function(name) { this.tag = name; this.shouldLog = false; } stepEnableControllers.prototype = { start: function(onFinish) { - editEntitiesWithTag('door', { visible: false }); - Menu.setIsOptionChecked("Overlays", true); - Controller.enableMapping('handControllerPointer-click'); - Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'enable'); - Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'none'); - Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ - nearGrabEnabled: true, - holdEnabled: true, - farGrabEnabled: true, - })); - setControllerPartLayer('touchpad', 'blank'); - setControllerPartLayer('tips', 'blank'); + reenableEverything(); onFinish(); }, cleanup: function() { @@ -433,6 +449,11 @@ stepRaiseAboveHead.prototype = { start: function(onFinish) { var tag = this.tag; + var STATE_START = 0; + var STATE_HANDS_DOWN = 1; + var STATE_HANDS_UP = 2; + this.state = STATE_START; + var defaultTransform = { position: { x: 0.2459, @@ -451,19 +472,24 @@ stepRaiseAboveHead.prototype = { editEntitiesWithTag(this.tag, { visible: true }); // Wait 2 seconds before starting to check for hands - this.waitTimeoutID = Script.setTimeout(function() { - this.checkIntervalID = null; - function checkForHandsAboveHead() { - debug("Raise above head: Checking for hands above head..."); + this.checkIntervalID = null; + function checkForHandsAboveHead() { + debug("Raise above head: Checking hands..."); + if (this.state == STATE_START) { + if (MyAvatar.getLeftPalmPosition().y < (MyAvatar.getHeadPosition().y - 0.1)) { + this.state = STATE_HANDS_DOWN; + } + } else if (this.state == STATE_HANDS_DOWN) { if (MyAvatar.getLeftPalmPosition().y > (MyAvatar.getHeadPosition().y + 0.1)) { + this.state = STATE_HANDS_UP; Script.clearInterval(this.checkIntervalID); this.checkIntervalID = null; playSuccessSound(); onFinish(); } } - this.checkIntervalID = Script.setInterval(checkForHandsAboveHead.bind(this), 500); - }.bind(this), 2000); + } + this.checkIntervalID = Script.setInterval(checkForHandsAboveHead.bind(this), 500); }, cleanup: function() { if (this.checkIntervalID) { @@ -675,7 +701,8 @@ var stepEquip = function(name) { this.tempTag = name + "-temporary"; this.PART1 = 0; this.PART2 = 1; - this.COMPLETE = 2; + this.PART3 = 2; + this.COMPLETE = 3; Messages.subscribe('Tutorial-Spinner'); Messages.messageReceived.connect(this.onMessage.bind(this)); @@ -745,6 +772,7 @@ stepEquip.prototype = { if (this.currentPart == this.PART1 && message == "wasLit") { this.currentPart = this.PART2; Script.setTimeout(function() { + this.currentPart = this.PART3; hideEntitiesWithTag(this.tagPart1); showEntitiesWithTag(this.tagPart2); setControllerPartLayer('tips', 'grip'); @@ -752,7 +780,7 @@ stepEquip.prototype = { }.bind(this), 9000); } } else if (channel == "Hifi-Object-Manipulation") { - if (this.currentPart == this.PART2) { + if (this.currentPart == this.PART3) { var data = parseJSON(message); if (data.action == 'release' && data.grabbedEntity == this.gunID) { info("got release"); @@ -930,7 +958,7 @@ var stepFinish = function(name) { } stepFinish.prototype = { start: function(onFinish) { - editEntitiesWithTag('door', { visible: false }); + editEntitiesWithTag('door', { visible: false, collisonless: true }); showEntitiesWithTag(this.tag); Settings.setValue("tutorialComplete", true); onFinish(); @@ -956,9 +984,6 @@ stepCleanupFinish.prototype = { - - - function showEntitiesWithTag(tag) { editEntitiesWithTag(tag, function(entityID) { var userData = Entities.getEntityProperties(entityID, "userData").userData; @@ -975,7 +1000,6 @@ function showEntitiesWithTag(tag) { visible: data.visible == false ? false : true, collisionless: collisionless, userData: JSON.stringify(data), - //collisionless: data.collisionless == true ? true : false, }; Entities.editEntity(entityID, newProperties); }); @@ -1029,8 +1053,6 @@ TutorialManager = function() { for (var i = 0; i < STEPS.length; ++i) { STEPS[i].cleanup(); } - //location = "/tutorial_begin"; - //location = "/tutorial"; MyAvatar.shouldRenderLocally = false; this.startNextStep(); } @@ -1078,7 +1100,12 @@ TutorialManager = function() { if (currentStep) { currentStep.cleanup(); } + reenableEverything(); currentStepNum = -1; currentStep = null; } } + + +var tutorialManager = new TutorialManager(); +tutorialManager.startTutorial(); diff --git a/tutorial/tutorialZone.js b/tutorial/tutorialZone.js index 97aa906052..63772ee75d 100644 --- a/tutorial/tutorialZone.js +++ b/tutorial/tutorialZone.js @@ -48,8 +48,8 @@ if (!Function.prototype.bind) { } (function() { - Script.include("file:///C:/Users/Ryan/dev/hifi/tutorial/ownershipToken.js"); - Script.include("file:///C:/Users/Ryan/dev/hifi/tutorial/tutorial.js"); + Script.include("ownershipToken.js"); + Script.include("tutorial.js"); var TutorialZone = function() { this.token = null; diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index 17cf0185fb..bd37e15007 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -14,91 +14,101 @@ var zeroRotation = { x: 0, y: 0, z: 0, w: 1 }; /////////////////////////////////////////////////////////////////////////////// // Management of controller display // /////////////////////////////////////////////////////////////////////////////// +ControllerDisplayManager = function() { + var controllerDisplay = null; + var activeController = null; + var controllerCheckerIntervalID = null; -var controllerDisplay = null; -var activeController = null; -var controllerCheckerIntervalID = null; - -function updateControllers() { - if (HMD.active) { - if ("Vive" in Controller.Hardware) { - if (!activeController) { - debug("Found vive!"); - activeController = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION); + function updateControllers() { + if (HMD.active) { + if ("Vive" in Controller.Hardware) { + if (!activeController) { + debug("Found vive!"); + activeController = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION); + } + // We've found the controllers, we no longer need to look for active controllers + if (controllerCheckerIntervalID) { + Script.clearInterval(controllerCheckerIntervalID); + controllerCheckerIntervalID = null; + } + } else { + debug("HMD active, but no controllers found"); + if (activeController) { + deleteControllerDisplay(activeController); + activeController = null; + } + if (controllerCheckerIntervalID == null) { + controllerCheckerIntervalID = Script.setInterval(updateControllers, 1000); + } } - // We've found the controllers, we no longer need to look for active controllers + } else { + debug("HMD inactive"); + // We aren't in HMD mode, we no longer need to look for active controllers if (controllerCheckerIntervalID) { + debug("Clearing controller checker interval"); Script.clearInterval(controllerCheckerIntervalID); controllerCheckerIntervalID = null; } - } else { - debug("HMD active, but no controllers found"); if (activeController) { + debug("Deleting controller"); deleteControllerDisplay(activeController); activeController = null; } - if (controllerCheckerIntervalID == null) { - controllerCheckerIntervalID = Script.setInterval(updateControllers, 1000); - } - } - } else { - debug("HMD inactive"); - // We aren't in HMD mode, we no longer need to look for active controllers - if (controllerCheckerIntervalID) { - debug("Clearing controller checker interval"); - Script.clearInterval(controllerCheckerIntervalID); - controllerCheckerIntervalID = null; - } - if (activeController) { - debug("Deleting controller"); - deleteControllerDisplay(activeController); - activeController = null; } } -} -HMD.displayModeChanged.connect(updateControllers); + HMD.displayModeChanged.connect(updateControllers); -updateControllers(); + updateControllers(); -Messages.subscribe('Controller-Display'); -var handleMessages = function(channel, message, sender) { - if (!activeController) { - return; - } + Messages.subscribe('Controller-Display'); + var handleMessages = function(channel, message, sender) { + if (!activeController) { + return; + } - if (sender === MyAvatar.sessionUUID) { - if (channel === 'Controller-Display') { - debug('here'); - var data = JSON.parse(message); - var name = data.name; - var visible = data.visible; - //c.setDisplayAnnotation(name, visible); - if (name in activeController.annotations) { - debug("hiding"); - for (var i = 0; i < activeController.annotations[name].length; ++i) { - debug("hiding", i); - Overlays.editOverlay(activeController.annotations[name][i], { visible: visible }); + if (sender === MyAvatar.sessionUUID) { + if (channel === 'Controller-Display') { + debug('here'); + var data = JSON.parse(message); + var name = data.name; + var visible = data.visible; + //c.setDisplayAnnotation(name, visible); + if (name in activeController.annotations) { + debug("hiding"); + for (var i = 0; i < activeController.annotations[name].length; ++i) { + debug("hiding", i); + Overlays.editOverlay(activeController.annotations[name][i], { visible: visible }); + } + } + } else if (channel === 'Controller-Display-Parts') { + debug('here part'); + var data = JSON.parse(message); + for (var name in data) { + var visible = data[name]; + activeController.setPartVisible(name, visible); + } + } else if (channel === 'Controller-Set-Part-Layer') { + var data = JSON.parse(message); + for (var name in data) { + var layer = data[name]; + activeController.setLayerForPart(name, layer); } } - } else if (channel === 'Controller-Display-Parts') { - debug('here part'); - var data = JSON.parse(message); - for (var name in data) { - var visible = data[name]; - activeController.setPartVisible(name, visible); - } - } else if (channel === 'Controller-Set-Part-Layer') { - var data = JSON.parse(message); - for (var name in data) { - var layer = data[name]; - activeController.setLayerForPart(name, layer); - } } } -} -Messages.messageReceived.connect(handleMessages); + Messages.messageReceived.connect(handleMessages); + + this.destroy = function() { + print("Destroying controller display"); + Messages.messageReceived.disconnect(handleMessages); + if (activeController) { + deleteControllerDisplay(activeController); + } + }; + +} //var c = setupController(TOUCH_CONTROLLER_CONFIGURATION); //var c = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION); @@ -112,9 +122,3 @@ Messages.messageReceived.connect(handleMessages); // c.setLayerForPart("touchpad", layers[num]); //}, 2000); // -Script.scriptEnding.connect(function() { - if (activeController) { - deleteControllerDisplay(activeController); - } - //MyAvatar.shouldRenderLocally = true; -}); From d2a1957e085adc22a44b8b5bb52ae097aa8b391f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 16:47:34 -0700 Subject: [PATCH 258/300] Remove extraneous comment --- tutorial/tutorialZone.js | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/tutorial/tutorialZone.js b/tutorial/tutorialZone.js index 63772ee75d..e1e5a76eb0 100644 --- a/tutorial/tutorialZone.js +++ b/tutorial/tutorialZone.js @@ -1,24 +1,3 @@ -// A user designates ownership of the tutorial by creating a child entity (token) -// of the tutorial zone. The entity should have a short lifetime (5 seconds), and -// should have it's lifetime reset every second. -// -// * When you enter the "tutorial" begin zone -// * If the tutorial is owned -// * Show a "waiting" text, and check for ownership periodically -// * If the tutorial is not owned -// * Create the ownership token, begin tutorial -// * For extra safety, to avoid races, check after 1 second to confirm that -// another user hasn't created a token. If they have, use some method to -// resolve the conflict. -// * Once the user has finished the tutorial, stop creating the token to -// release ownership. -// -// * The tutorial will expose a local message API for controlling the tutorial -// * A special script will be used to: -// * Create a key shortcut to go to the beginning of the tutorial -// * -// - if (!Function.prototype.bind) { Function.prototype.bind = function(oThis) { if (typeof this !== 'function') { From 9c7ea6ac7c467ca215ba5a33524e28ad0a542686 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 16:48:17 -0700 Subject: [PATCH 259/300] Update logic for going to tutorial on launch --- interface/src/Application.cpp | 37 +++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index ef5f044cf0..7a505c96c0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1275,37 +1275,46 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : bool hasTutorialContent = contentVersion >= 1; Setting::Handle firstRun { Settings::firstRun, true }; - bool isOnVive = _displayPlugin && _displayPlugin->getName() == "OpenVR (Vive)"; + bool hasVive = false; + for (auto& displayPlugin : PluginManager::getInstance()->getDisplayPlugins()) { + if (displayPlugin->getName() == "OpenVR (Vive)") { + hasVive = true; + break; + } + } Setting::Handle tutorialComplete { "tutorialComplete", false }; - bool shouldGoToTutorial = isOnVive && hasTutorialContent && !tutorialComplete.get(); - qDebug() << "Is on vive " << isOnVive << ", " << _displayPlugin->getName(); + bool shouldGoToTutorial = hasVive && hasTutorialContent && !tutorialComplete.get(); + qDebug() << "has vive: " << hasVive << ", current plugin: " << _displayPlugin->getName(); qDebug() << "has tutorial content" << hasTutorialContent; qDebug() << "tutorial complete" << tutorialComplete.get(); qDebug() << "should go to tutorial " << shouldGoToTutorial; + // when --url in command line, teleport to location + const QString HIFI_URL_COMMAND_LINE_KEY = "--url"; + int urlIndex = arguments().indexOf(HIFI_URL_COMMAND_LINE_KEY); + QString addressLookupString; + if (urlIndex != -1) { + addressLookupString = arguments().value(urlIndex + 1); + } if (shouldGoToTutorial) { DependencyManager::get()->ifLocalSandboxRunningElse([=]() { qDebug() << "Home sandbox appears to be running, going to Home."; //DependencyManager::get()->goToLocalSandbox("/tutorial"); - DependencyManager::get()->loadSettings("hifi://sport/tutorial"); + DependencyManager::get()->loadSettings("hifi://sport/tutorial_begin"); }, [=]() { qDebug() << "Home sandbox does not appear to be running, going to Entry."; showHelp(); - DependencyManager::get()->goToEntry(); + if (addressLookupString.isEmpty()) { + DependencyManager::get()->goToEntry(); + } else { + DependencyManager::get()->loadSettings(addressLookupString); + } }); } else { - // when --url in command line, teleport to location - const QString HIFI_URL_COMMAND_LINE_KEY = "--url"; - int urlIndex = arguments().indexOf(HIFI_URL_COMMAND_LINE_KEY); - QString addressLookupString; - if (urlIndex != -1) { - addressLookupString = arguments().value(urlIndex + 1); - } - if (firstRun.get()) { showHelp(); } @@ -5391,8 +5400,6 @@ void Application::initPlugins(const QStringList& arguments) { auto preferredDisplays = parser.value(display).split(',', QString::SkipEmptyParts); qInfo() << "Setting prefered display plugins:" << preferredDisplays; PluginManager::getInstance()->setPreferredDisplayPlugins(preferredDisplays); - } else { - PluginManager::getInstance()->setPreferredDisplayPlugins({ "OpenVR (Vive)", "Oculus Rift" }); } if (parser.isSet(disableDisplays)) { From 6924040d82d668a732c7b035cacde686baa0e236 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 22:54:57 -0700 Subject: [PATCH 260/300] Update tutorial http references to atp --- tutorial/entityData.js | 4 +-- tutorial/fuse.js | 4 +-- tutorial/lighter/butaneLighter.js | 15 ++++---- tutorial/lighter/createButaneLighter.js | 9 ++--- tutorial/spinner.js | 2 +- tutorial/tutorial.js | 5 +-- tutorial/viveControllerConfiguration.js | 46 ++++++++++++------------- 7 files changed, 38 insertions(+), 47 deletions(-) diff --git a/tutorial/entityData.js b/tutorial/entityData.js index 1e38079de5..76eb4d98ed 100644 --- a/tutorial/entityData.js +++ b/tutorial/entityData.js @@ -20,7 +20,7 @@ birdFirework1 = { "z": 0 }, "id": "{1c4061bc-b2e7-4435-bc47-3fcc39ae6624}", - "modelURL": "http://hifi-content.s3.amazonaws.com/jimi/tutorialroom/birdStatue15.fbx", + "modelURL": "atp:/tutorial_models/birdStatue15.fbx", "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", "position": { "x": 0.11612319946289062, @@ -66,7 +66,7 @@ birdFirework2 = { "z": 0 }, "id": "{ba067084-8d0f-4eeb-a8a1-c6814527c1bb}", - "modelURL": "http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Models/statuebird4.fbx", + "modelURL": "atp:/tutorial_models/statuebird4.fbx", "owningAvatarID": "{00000000-0000-0000-0000-000000000000}", "position": { "x": 0, diff --git a/tutorial/fuse.js b/tutorial/fuse.js index bd188a741f..842695d85c 100644 --- a/tutorial/fuse.js +++ b/tutorial/fuse.js @@ -18,7 +18,7 @@ } } - var fuseSound = SoundCache.getSound("https://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Sounds/fuse.wav"); + var fuseSound = SoundCache.getSound("atp:/tutorial_sounds/fuse.wav"); function getChildProperties(entityID, propertyNames) { var childEntityIDs = Entities.getChildrenIDs(entityID); var results = {} @@ -44,7 +44,7 @@ currentFrame: 1, lastFrame: 150, running: 1, - url: "https://hifi-content.s3.amazonaws.com/ozan/dev/anim/fuse/fuse.fbx", + url: "atp:/tutorial_models/fuse.fbx", loop: 0 }, }); diff --git a/tutorial/lighter/butaneLighter.js b/tutorial/lighter/butaneLighter.js index 2592d8ec4a..e5400c60f3 100644 --- a/tutorial/lighter/butaneLighter.js +++ b/tutorial/lighter/butaneLighter.js @@ -10,11 +10,11 @@ var _this; function getResourceURL(file) { - return 'http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/' + file; + return 'atp:/' + file; }; - const LIGHTER_ON_SOUND_URL = getResourceURL('Sounds/lighter_on.wav'); - const BUTANE_SOUND_URL = getResourceURL('Sounds/butane.wav'); + const LIGHTER_ON_SOUND_URL = getResourceURL('tutorial_sounds/lighter_on.wav'); + const BUTANE_SOUND_URL = getResourceURL('tutorial_sound/butane.wav'); // TODO: fix this in the client, changing the sound volume while a sound is playing doesn't seem to work right now const DYNAMIC_SOUND_VOLUME = false; @@ -151,11 +151,12 @@ var flameProperties = Entities.getEntityProperties(_this.lighterParticleEntity, ['position', 'rotation']); var pickRay = { origin: flameProperties.position, - direction: Quat.getFront(flameProperties.rotation) + direction: Quat.inverse(Quat.getFront(flameProperties.rotation)) } - var intersection = Entities.findRayIntersection(pickRay, true); - if (intersection.intersects) { - debugPrint(JSON.stringify(intersection)); + var intersection = Entities.findRayIntersection(pickRay, true, [], [_this.entityID, _this.lighterParticleEntity]); + if (intersection.intersects && intersection.distance <= FLAME_LENGTH && intersection.properties.script !== '') { + Entities.callEntityMethod(intersection.properties.id, 'onLit', [_this.triggerValue]); + debugPrint('Light it up! found: ' + intersection.properties.id); } }, releaseEquip: function(entityID, args) { diff --git a/tutorial/lighter/createButaneLighter.js b/tutorial/lighter/createButaneLighter.js index ec305ecb05..caf3188b14 100644 --- a/tutorial/lighter/createButaneLighter.js +++ b/tutorial/lighter/createButaneLighter.js @@ -7,12 +7,7 @@ // const TEST_MODE = false; -const SCRIPT_URL = 'https://dl.dropboxusercontent.com/u/14997455/hifi/butaneLighter/butaneLighter.js?v=' + Date.now(); -//const SCRIPT_URL = Script.resolvePath("butaneLighter.js"); - -function getResourceURL(file) { - return 'http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/' + file; -}; +const SCRIPT_URL = 'atp:/tutorial/lighter/butaneLighter.js'; //Creates an entity and returns a mixed object of the creation properties and the assigned entityID var createEntity = function(entityProperties, parent) { @@ -53,7 +48,7 @@ createButaneLighter = function(transform) { y: -0.01, z: 0 }, - modelURL: getResourceURL('Models/lighterIceCreamSandwich.fbx'), + modelURL: 'atp:/tutorial_models/lighterIceCreamSandwich.fbx', name: 'BrutaneLighter', shapeType: 'simple-compound', type: 'Model', diff --git a/tutorial/spinner.js b/tutorial/spinner.js index b4ff188b44..b50db2704e 100644 --- a/tutorial/spinner.js +++ b/tutorial/spinner.js @@ -16,7 +16,7 @@ } } - var spinnerSound = SoundCache.getSound("http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Sounds/Pinwheel.L.wav"); + var spinnerSound = SoundCache.getSound("atp:/tutorial_sounds/Pinwheel.L.wav"); var Spinner = function() { }; function getChildProperties(entityID, propertyNames) { diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 68dd316360..fd48b63978 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -55,9 +55,6 @@ function info() { } } -var BASKET_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trach-Can-3.fbx"; -var BASKET_COLLIDER_URL = "http://hifi-content.s3.amazonaws.com/alan/dev/Trash-Can-4.obj"; - var NEAR_BOX_SPAWN_NAME = "tutorial/nearGrab/box_spawn"; var FAR_BOX_SPAWN_NAME = "tutorial/farGrab/box_spawn"; var NEAR_BASKET_COLLIDER_NAME = "tutorial/nearGrab/basket_collider"; @@ -66,7 +63,7 @@ var GUN_BASKET_COLLIDER_NAME = "tutorial/equip/basket_collider"; var GUN_SPAWN_NAME = "tutorial/gun_spawn"; var TELEPORT_PAD_NAME = "tutorial/teleport/pad" -var successSound = SoundCache.getSound("http://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Sounds/good_one.L.wav"); +var successSound = SoundCache.getSound("atp:/tutorial_sounds/good_one.L.wav"); function beginsWithFilter(value, key) { return value.indexOf(properties[key]) == 0; diff --git a/tutorial/viveControllerConfiguration.js b/tutorial/viveControllerConfiguration.js index 25146c7382..edabccc3f2 100644 --- a/tutorial/viveControllerConfiguration.js +++ b/tutorial/viveControllerConfiguration.js @@ -1,5 +1,3 @@ -var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive2.fbx"; - var LEFT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"); var RIGHT_JOINT_INDEX = MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"); @@ -42,8 +40,8 @@ var viveNaturalPosition = { z: 0.06380049744620919 }; -var viveModelURL = "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_body.fbx"; -var viveTipsModelURL = "https://hifi-content.s3.amazonaws.com/DomainContent/Tutorial/Models/vive_tips.fbx" +var viveModelURL = "atp:/controller/vive_body.fbx"; +var viveTipsModelURL = "atp:/controller/vive_tips.fbx" VIVE_CONTROLLER_CONFIGURATION = { name: "Vive", @@ -89,7 +87,7 @@ VIVE_CONTROLLER_CONFIGURATION = { // and swaps in textures based on the thumb position. touchpad: { type: "touchpad", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", + modelURL: "atp:/controller/vive_trackpad.fbx", visibleInput: "Vive.RSTouch", xInput: "Vive.LX", yInput: "Vive.LY", @@ -103,20 +101,20 @@ VIVE_CONTROLLER_CONFIGURATION = { disable_defaultTextureLayer: "blank", disable_textureLayers: { blank: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", + defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", }, teleport: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg", + defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg", }, arrows: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", + defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows.jpg", } } }, trigger: { type: "rotational", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trigger.fbx", + modelURL: "atp:/controller/vive_trigger.fbx", input: Controller.Standard.LT, naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, origin: { x: 0, y: -0.015, z: -0.00 }, @@ -128,30 +126,30 @@ VIVE_CONTROLLER_CONFIGURATION = { l_grip: { type: "static", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_l_grip.fbx", + modelURL: "atp:/controller/vive_l_grip.fbx", naturalPosition: {"x":-0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, }, r_grip: { type: "static", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_r_grip.fbx", + modelURL: "atp:/controller/vive_r_grip.fbx", naturalPosition: {"x":0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, }, sys_button: { type: "static", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_sys_button.fbx", + modelURL: "atp:/controller/vive_sys_button.fbx", naturalPosition: {"x":0,"y":0.0020399854984134436,"z":0.08825899660587311}, }, button: { type: "static", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + modelURL: "atp:/controller/vive_button.fbx", naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} }, button2: { type: "static", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + modelURL: "atp:/controller/vive_button.fbx", naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} }, }, @@ -207,7 +205,7 @@ VIVE_CONTROLLER_CONFIGURATION = { // and swaps in textures based on the thumb position. touchpad: { type: "touchpad", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx", + modelURL: "atp:/controller/vive_trackpad.fbx", visibleInput: "Vive.RSTouch", xInput: "Vive.RX", yInput: "Vive.RY", @@ -221,20 +219,20 @@ VIVE_CONTROLLER_CONFIGURATION = { disable_defaultTextureLayer: "blank", disable_textureLayers: { blank: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", + defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-blank.jpg", }, teleport: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg", + defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-teleport-active-LG.jpg", }, arrows: { - defaultTextureURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows-active.jpg", + defaultTextureURL: "atp:/controller/vive_trackpad.fbx/Touchpad.fbm/touchpad-look-arrows-active.jpg", } } }, trigger: { type: "rotational", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_trigger.fbx", + modelURL: "atp:/controller/vive_trigger.fbx", input: Controller.Standard.RT, naturalPosition: {"x":0.000004500150680541992,"y":-0.027690507471561432,"z":0.04830199480056763}, origin: { x: 0, y: -0.015, z: -0.00 }, @@ -246,30 +244,30 @@ VIVE_CONTROLLER_CONFIGURATION = { l_grip: { type: "static", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_l_grip.fbx", + modelURL: "atp:/controller/vive_l_grip.fbx", naturalPosition: {"x":-0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, }, r_grip: { type: "static", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_r_grip.fbx", + modelURL: "atp:/controller/vive_r_grip.fbx", naturalPosition: {"x":0.01720449887216091,"y":-0.014324013143777847,"z":0.08714400231838226}, }, sys_button: { type: "static", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_sys_button.fbx", + modelURL: "atp:/controller/vive_sys_button.fbx", naturalPosition: {"x":0,"y":0.0020399854984134436,"z":0.08825899660587311}, }, button: { type: "static", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + modelURL: "atp:/controller/vive_button.fbx", naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} }, button2: { type: "static", - modelURL: "https://hifi-public.s3.amazonaws.com/huffman/controllers/vive_button.fbx", + modelURL: "atp:/controller/vive_button.fbx", naturalPosition: {"x":0,"y":0.005480996798723936,"z":0.019918499514460564} }, }, From 0f187dc34a4ac46ee2c773df58c67d0f98991dff Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 21 Sep 2016 23:08:02 -0700 Subject: [PATCH 261/300] 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 b8e661ffbd..4f56921b28 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.tgz"; +const HOME_CONTENT_URL = "https://hifi-public.s3.amazonaws.com/tutorial.tar.gz" function getBuildInfo() { var buildInfoPath = null; From 37096910fc7580ac74b4b809723074820ed9e1bc Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Sep 2016 08:59:45 -0700 Subject: [PATCH 262/300] Fix tutorial begin location --- interface/src/Application.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 7a505c96c0..2c562d317b 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1302,11 +1302,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : if (shouldGoToTutorial) { DependencyManager::get()->ifLocalSandboxRunningElse([=]() { qDebug() << "Home sandbox appears to be running, going to Home."; - //DependencyManager::get()->goToLocalSandbox("/tutorial"); - DependencyManager::get()->loadSettings("hifi://sport/tutorial_begin"); + DependencyManager::get()->goToLocalSandbox("/tutorial_begin"); }, [=]() { qDebug() << "Home sandbox does not appear to be running, going to Entry."; - showHelp(); + if (firstRun.get()) { + showHelp(); + } if (addressLookupString.isEmpty()) { DependencyManager::get()->goToEntry(); } else { From 95d2e2a97a2d4fe54442f541b861aa93149c99d5 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Sep 2016 09:34:04 -0700 Subject: [PATCH 263/300] Update tutorial path --- tutorial/tutorial.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index fd48b63978..701ce32269 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -1103,6 +1103,8 @@ TutorialManager = function() { } } - -var tutorialManager = new TutorialManager(); -tutorialManager.startTutorial(); +// To run the tutorial: +// +// var tutorialManager = new TutorialManager(); +// tutorialManager.startTutorial(); +// From 15e00c30a61c8120c2cee4e19d204511af1e429b Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Sep 2016 09:43:26 -0700 Subject: [PATCH 264/300] Update tutorial content version --- 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 4f56921b28..a181f4ba28 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 = "https://hifi-public.s3.amazonaws.com/tutorial.tar.gz" +const HOME_CONTENT_URL = "https://hifi-public.s3.amazonaws.com/home-tutorial-1.tar.gz"; function getBuildInfo() { var buildInfoPath = null; From 7c791755c07f4a45164b65ee5c6bd5df2278ac7f Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Sep 2016 09:59:59 -0700 Subject: [PATCH 265/300] Update home content to version 2 --- 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 a181f4ba28..f7cb9a53af 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 = "https://hifi-public.s3.amazonaws.com/home-tutorial-1.tar.gz"; +const HOME_CONTENT_URL = "https://hifi-public.s3.amazonaws.com/home-tutorial-2.tar.gz"; function getBuildInfo() { var buildInfoPath = null; From 1699299de9140afe0d244dc6ba6b36ccd9612528 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Sep 2016 12:33:53 -0700 Subject: [PATCH 266/300] Fix location that server content version is looked for --- interface/src/Application.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 2c562d317b..4e9cf57fda 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1261,8 +1261,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : auto initializeLocation = [this]() { // Get sandbox content set version, if available - auto acDirPath = PathUtils::getRootDataDirectory() + qApp->organizationName() + "/assignment-client/"; + auto acDirPath = PathUtils::getRootDataDirectory() + BuildInfo::MODIFIED_ORGANIZATION + "/assignment-client/"; auto contentVersionPath = acDirPath + "content-version.txt"; + qDebug() << "Checking " << contentVersionPath << " for content version"; auto contentVersion = 0; QFile contentVersionFile(contentVersionPath); if (contentVersionFile.open(QIODevice::ReadOnly | QIODevice::Text)) { From 66a33d020d3082724e1fecc2020c8b7633c90a52 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Sep 2016 14:17:24 -0700 Subject: [PATCH 267/300] Update content version --- 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 f7cb9a53af..51148ba91b 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 = "https://hifi-public.s3.amazonaws.com/home-tutorial-2.tar.gz"; +const HOME_CONTENT_URL = "https://hifi-public.s3.amazonaws.com/home-tutorial-3.tar.gz"; function getBuildInfo() { var buildInfoPath = null; From 216cf2b4bcff13e8fe3e6c2cf475162bd9c28a56 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Sep 2016 14:18:25 -0700 Subject: [PATCH 268/300] Update tutorial to work with HMD + Hand Controllers only --- interface/src/Application.cpp | 18 +++++----- .../src/scripting/HMDScriptingInterface.cpp | 12 ++++++- .../src/scripting/HMDScriptingInterface.h | 3 ++ .../src/input-plugins/KeyboardMouseDevice.h | 2 ++ .../src/input-plugins/TouchscreenDevice.h | 2 ++ libraries/plugins/src/plugins/InputPlugin.h | 3 +- libraries/plugins/src/plugins/PluginUtils.cpp | 35 +++++++++++++++++++ libraries/plugins/src/plugins/PluginUtils.h | 17 +++++++++ plugins/hifiNeuron/src/NeuronPlugin.h | 2 ++ plugins/hifiSdl2/src/SDL2Manager.h | 2 ++ plugins/hifiSixense/src/SixenseManager.h | 2 ++ plugins/oculus/src/OculusControllerManager.h | 2 ++ plugins/openvr/src/ViveControllerManager.h | 2 ++ tutorial/tutorialStartZone.js | 21 +++++------ tutorial/tutorialZone.js | 26 ++++++++------ 15 files changed, 116 insertions(+), 33 deletions(-) create mode 100644 libraries/plugins/src/plugins/PluginUtils.cpp create mode 100644 libraries/plugins/src/plugins/PluginUtils.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 4e9cf57fda..9cf0e841f9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -87,6 +87,7 @@ #include #include #include +#include #include #include #include @@ -1276,17 +1277,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : bool hasTutorialContent = contentVersion >= 1; Setting::Handle firstRun { Settings::firstRun, true }; - bool hasVive = false; - for (auto& displayPlugin : PluginManager::getInstance()->getDisplayPlugins()) { - if (displayPlugin->getName() == "OpenVR (Vive)") { - hasVive = true; - break; - } - } + bool hasHMDAndHandControllers = PluginUtils::isHMDAvailable() && PluginUtils::isHandControllerAvailable(); Setting::Handle tutorialComplete { "tutorialComplete", false }; - bool shouldGoToTutorial = hasVive && hasTutorialContent && !tutorialComplete.get(); - qDebug() << "has vive: " << hasVive << ", current plugin: " << _displayPlugin->getName(); + bool shouldGoToTutorial = hasHMDAndHandControllers && hasTutorialContent && !tutorialComplete.get(); + + qDebug() << "Has HMD + Hand Controllers: " << hasHMDAndHandControllers << ", current plugin: " << _displayPlugin->getName(); qDebug() << "has tutorial content" << hasTutorialContent; qDebug() << "tutorial complete" << tutorialComplete.get(); qDebug() << "should go to tutorial " << shouldGoToTutorial; @@ -1300,10 +1296,12 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : addressLookupString = arguments().value(urlIndex + 1); } + const QString TUTORIAL_PATH = "/tutorial_begin"; + if (shouldGoToTutorial) { DependencyManager::get()->ifLocalSandboxRunningElse([=]() { qDebug() << "Home sandbox appears to be running, going to Home."; - DependencyManager::get()->goToLocalSandbox("/tutorial_begin"); + DependencyManager::get()->goToLocalSandbox(TUTORIAL_PATH); }, [=]() { qDebug() << "Home sandbox does not appear to be running, going to Entry."; if (firstRun.get()) { diff --git a/interface/src/scripting/HMDScriptingInterface.cpp b/interface/src/scripting/HMDScriptingInterface.cpp index a4676428a9..2c769c37d4 100644 --- a/interface/src/scripting/HMDScriptingInterface.cpp +++ b/interface/src/scripting/HMDScriptingInterface.cpp @@ -13,10 +13,12 @@ #include +#include #include #include #include -#include +#include + #include "Application.h" HMDScriptingInterface::HMDScriptingInterface() { @@ -47,6 +49,14 @@ glm::vec2 HMDScriptingInterface::overlayToSpherical(const glm::vec2 & position) return qApp->getApplicationCompositor().overlayToSpherical(position); } +bool HMDScriptingInterface::isHMDAvailable() { + return PluginUtils::isHMDAvailable(); +} + +bool HMDScriptingInterface::isHandControllerAvailable() { + return PluginUtils::isHandControllerAvailable(); +} + QScriptValue HMDScriptingInterface::getHUDLookAtPosition2D(QScriptContext* context, QScriptEngine* engine) { glm::vec3 hudIntersection; auto instance = DependencyManager::get(); diff --git a/interface/src/scripting/HMDScriptingInterface.h b/interface/src/scripting/HMDScriptingInterface.h index 2fbdb76198..4148b1cb4a 100644 --- a/interface/src/scripting/HMDScriptingInterface.h +++ b/interface/src/scripting/HMDScriptingInterface.h @@ -38,6 +38,9 @@ public: Q_INVOKABLE QString preferredAudioInput() const; Q_INVOKABLE QString preferredAudioOutput() const; + Q_INVOKABLE bool isHMDAvailable(); + Q_INVOKABLE bool isHandControllerAvailable(); + Q_INVOKABLE bool setHandLasers(int hands, bool enabled, const glm::vec4& color, const glm::vec3& direction) const; Q_INVOKABLE void disableHandLasers(int hands) const; diff --git a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h index 2fdecf0bba..8177c9bcc0 100644 --- a/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h +++ b/libraries/input-plugins/src/input-plugins/KeyboardMouseDevice.h @@ -68,6 +68,8 @@ public: bool isSupported() const override { return true; } const QString& getName() const override { return NAME; } + bool isHandController() const override { return false; } + void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override; diff --git a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h index f89f247ce8..7bfaa23be8 100644 --- a/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h +++ b/libraries/input-plugins/src/input-plugins/TouchscreenDevice.h @@ -39,6 +39,8 @@ public: virtual bool isSupported() const override; virtual const QString& getName() const override { return NAME; } + bool isHandController() const override { return false; } + virtual void pluginFocusOutEvent() override { _inputDevice->focusOutEvent(); } virtual void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) override; diff --git a/libraries/plugins/src/plugins/InputPlugin.h b/libraries/plugins/src/plugins/InputPlugin.h index 02ae5f58d5..f68be3edf6 100644 --- a/libraries/plugins/src/plugins/InputPlugin.h +++ b/libraries/plugins/src/plugins/InputPlugin.h @@ -19,7 +19,8 @@ namespace controller { class InputPlugin : public Plugin { public: virtual void pluginFocusOutEvent() = 0; - virtual void pluginUpdate(float deltaTime, const controller::InputCalibrationData& inputCalibrationData) = 0; + + virtual bool isHandController() const = 0; }; diff --git a/libraries/plugins/src/plugins/PluginUtils.cpp b/libraries/plugins/src/plugins/PluginUtils.cpp new file mode 100644 index 0000000000..0a19071210 --- /dev/null +++ b/libraries/plugins/src/plugins/PluginUtils.cpp @@ -0,0 +1,35 @@ +// PluginUtils.cpp +// input-plugins/src/input-plugins +// +// Created by Ryan Huffman on 9/22/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#include "PluginUtils.h" + +#include "DisplayPlugin.h" +#include "InputPlugin.h" +#include "PluginManager.h" + +bool PluginUtils::isHMDAvailable() { + for (auto& displayPlugin : PluginManager::getInstance()->getDisplayPlugins()) { + if (displayPlugin->isHmd()) { + return true; + break; + } + } + return false; +} + +bool PluginUtils::isHandControllerAvailable() { + for (auto& inputPlugin : PluginManager::getInstance()->getInputPlugins()) { + if (inputPlugin->isHandController()) { + return true; + break; + } + } + return false; +}; diff --git a/libraries/plugins/src/plugins/PluginUtils.h b/libraries/plugins/src/plugins/PluginUtils.h new file mode 100644 index 0000000000..aba5364800 --- /dev/null +++ b/libraries/plugins/src/plugins/PluginUtils.h @@ -0,0 +1,17 @@ +// PluginUtils.h +// input-plugins/src/input-plugins +// +// Created by Ryan Huffman on 9/22/16. +// Copyright 2016 High Fidelity, Inc. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + +#pragma once + +class PluginUtils { +public: + static bool isHMDAvailable(); + static bool isHandControllerAvailable(); +}; \ No newline at end of file diff --git a/plugins/hifiNeuron/src/NeuronPlugin.h b/plugins/hifiNeuron/src/NeuronPlugin.h index 9ddd79c013..576deb64ae 100644 --- a/plugins/hifiNeuron/src/NeuronPlugin.h +++ b/plugins/hifiNeuron/src/NeuronPlugin.h @@ -25,6 +25,8 @@ class NeuronPlugin : public InputPlugin { public: friend void FrameDataReceivedCallback(void* context, void* sender, _BvhDataHeaderEx* header, float* data); + bool isHandController() const override { return false; } + // Plugin functions virtual bool isSupported() const override; virtual const QString& getName() const override { return NAME; } diff --git a/plugins/hifiSdl2/src/SDL2Manager.h b/plugins/hifiSdl2/src/SDL2Manager.h index a597a87aee..44b75abd2f 100644 --- a/plugins/hifiSdl2/src/SDL2Manager.h +++ b/plugins/hifiSdl2/src/SDL2Manager.h @@ -26,6 +26,8 @@ public: bool isSupported() const override; const QString& getName() const override { return NAME; } + bool isHandController() const override { return false; } + void init() override; void deinit() override; diff --git a/plugins/hifiSixense/src/SixenseManager.h b/plugins/hifiSixense/src/SixenseManager.h index 6aec9fd4ad..56d3c6bc4d 100644 --- a/plugins/hifiSixense/src/SixenseManager.h +++ b/plugins/hifiSixense/src/SixenseManager.h @@ -31,6 +31,8 @@ public: virtual const QString& getName() const override { return NAME; } virtual const QString& getID() const override { return HYDRA_ID_STRING; } + bool isHandController() const override { return true; } + virtual bool activate() override; virtual void deactivate() override; diff --git a/plugins/oculus/src/OculusControllerManager.h b/plugins/oculus/src/OculusControllerManager.h index 3c5cdeb7c6..4c236a375d 100644 --- a/plugins/oculus/src/OculusControllerManager.h +++ b/plugins/oculus/src/OculusControllerManager.h @@ -26,6 +26,8 @@ public: bool isSupported() const override; const QString& getName() const override { return NAME; } + bool isHandController() const override { return true; } + bool activate() override; void deactivate() override; diff --git a/plugins/openvr/src/ViveControllerManager.h b/plugins/openvr/src/ViveControllerManager.h index 95ff2f881a..5f34d70ba8 100644 --- a/plugins/openvr/src/ViveControllerManager.h +++ b/plugins/openvr/src/ViveControllerManager.h @@ -35,6 +35,8 @@ public: bool isSupported() const override; const QString& getName() const override { return NAME; } + bool isHandController() const override { return true; } + bool activate() override; void deactivate() override; diff --git a/tutorial/tutorialStartZone.js b/tutorial/tutorialStartZone.js index 5f5fa47b94..5adad1d00a 100644 --- a/tutorial/tutorialStartZone.js +++ b/tutorial/tutorialStartZone.js @@ -8,20 +8,21 @@ }, enterEntity: function() { // send message to outer zone - print("ENTERED THE TUTORIAL START AREA"); - var parentID = Entities.getEntityProperties(this.entityID, 'parentID').parentID; - print("HERE", parentID); - if (parentID) { - print("HERE2"); - Entities.callEntityMethod(parentID, 'start'); - print("HERE4"); + print("Entered the tutorial start area"); + if (HMD.isHMDAvailable() && HMD.isHandControllerAvailable()) { + var parentID = Entities.getEntityProperties(this.entityID, 'parentID').parentID; + if (parentID) { + Entities.callEntityMethod(parentID, 'start'); + } else { + print("ERROR: No parent id found on tutorial start zone"); + } } else { - print("HERE3"); - print("ERROR: No parent id found on tutorial start zone"); + Window.alert("To proceed with this tutorial, please connect your VR headset and hand controllers."); + location = "/"; } }, leaveEntity: function() { - print("EXITED THE TUTORIAL START AREA"); + print("Exited the tutorial start area"); } }; diff --git a/tutorial/tutorialZone.js b/tutorial/tutorialZone.js index e1e5a76eb0..e64d0f2445 100644 --- a/tutorial/tutorialZone.js +++ b/tutorial/tutorialZone.js @@ -27,8 +27,10 @@ if (!Function.prototype.bind) { } (function() { - Script.include("ownershipToken.js"); - Script.include("tutorial.js"); + var ownershipTokenPath = Script.resolvePath("ownershipToken.js"); + var tutorialPath = Script.resolvePath("tutorial.js"); + Script.include(ownershipTokenPath); + Script.include(tutorialPath); var TutorialZone = function() { this.token = null; @@ -37,17 +39,19 @@ if (!Function.prototype.bind) { TutorialZone.prototype = { keyReleaseHandler: function(event) { print(event.text); - if (event.text == ",") { - if (!this.tutorialManager.startNextStep()) { + if (event.isShifted && event.isAlt) { + if (event.text == ",") { + if (!this.tutorialManager.startNextStep()) { + this.tutorialManager.startTutorial(); + } + } else if (event.text == "F11") { + this.tutorialManager.restartStep(); + } else if (event.text == "F10") { + MyAvatar.shouldRenderLocally = !MyAvatar.shouldRenderLocally; + } else if (event.text == "r") { + this.tutorialManager.stopTutorial(); this.tutorialManager.startTutorial(); } - } else if (event.text == "F11") { - this.tutorialManager.restartStep(); - } else if (event.text == "F10") { - MyAvatar.shouldRenderLocally = !MyAvatar.shouldRenderLocally; - } else if (event.text == "r") { - this.tutorialManager.stopTutorial(); - this.tutorialManager.startTutorial(); } }, preload: function(entityID) { From f426f1cd4f0f7658771921713bb037171a718d37 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 22 Sep 2016 16:26:32 -0700 Subject: [PATCH 269/300] Update isHandController to temporarily only return true for Vive --- libraries/plugins/src/plugins/PluginUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/plugins/src/plugins/PluginUtils.cpp b/libraries/plugins/src/plugins/PluginUtils.cpp index 0a19071210..9150b89bcd 100644 --- a/libraries/plugins/src/plugins/PluginUtils.cpp +++ b/libraries/plugins/src/plugins/PluginUtils.cpp @@ -26,7 +26,7 @@ bool PluginUtils::isHMDAvailable() { bool PluginUtils::isHandControllerAvailable() { for (auto& inputPlugin : PluginManager::getInstance()->getInputPlugins()) { - if (inputPlugin->isHandController()) { + if (inputPlugin->getName() == "OpenVR") { return true; break; } From 9c6eae36a7b5be5f93ab9e320bb7f20aad7951fb Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 23 Sep 2016 09:07:26 -0700 Subject: [PATCH 270/300] Update tutorial progress keys --- .../networking/src/UserActivityLoggerScriptingInterface.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/networking/src/UserActivityLoggerScriptingInterface.cpp b/libraries/networking/src/UserActivityLoggerScriptingInterface.cpp index de3238f08d..248811b86a 100644 --- a/libraries/networking/src/UserActivityLoggerScriptingInterface.cpp +++ b/libraries/networking/src/UserActivityLoggerScriptingInterface.cpp @@ -27,9 +27,9 @@ void UserActivityLoggerScriptingInterface::toggledAway(bool isAway) { void UserActivityLoggerScriptingInterface::tutorialProgress(QString stepName, int stepNumber, float secondsToComplete, float tutorialElapsedTime) { logAction("tutorial_progress", { { "step", stepName }, - { "stepNumber", stepNumber }, - { "secondsToComplete", secondsToComplete }, - { "tutorial_elapsed_time", tutorialElapsedTime } + { "step_number", stepNumber }, + { "seconds_to_complete", secondsToComplete }, + { "tutorial_elapsed_seconds", tutorialElapsedTime } }); } From a062e6ab9a7349ec5f85470b063adae2197c1e38 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 23 Sep 2016 18:39:10 -0700 Subject: [PATCH 271/300] Revert change to make tutorial only work for Vive --- libraries/plugins/src/plugins/PluginUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/plugins/src/plugins/PluginUtils.cpp b/libraries/plugins/src/plugins/PluginUtils.cpp index 9150b89bcd..0a19071210 100644 --- a/libraries/plugins/src/plugins/PluginUtils.cpp +++ b/libraries/plugins/src/plugins/PluginUtils.cpp @@ -26,7 +26,7 @@ bool PluginUtils::isHMDAvailable() { bool PluginUtils::isHandControllerAvailable() { for (auto& inputPlugin : PluginManager::getInstance()->getInputPlugins()) { - if (inputPlugin->getName() == "OpenVR") { + if (inputPlugin->isHandController()) { return true; break; } From 8c6ba204cda73fef15a5679aa94be5c9e2583995 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Sep 2016 16:01:00 -0700 Subject: [PATCH 272/300] Update tutorial: away.js toggle, turning based on controller --- tutorial/tutorial.js | 63 +++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 701ce32269..231783716f 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -65,6 +65,13 @@ var TELEPORT_PAD_NAME = "tutorial/teleport/pad" var successSound = SoundCache.getSound("atp:/tutorial_sounds/good_one.L.wav"); + +var CHANNEL_AWAY_ENABLE = "Hifi-Away-Enable"; +function setAwayEnabled(value) { + var message = value ? 'enable' : 'disable'; + Messages.sendLocalMessage(CHANNEL_AWAY_ENABLE, message); +} + function beginsWithFilter(value, key) { return value.indexOf(properties[key]) == 0; } @@ -259,6 +266,7 @@ stepDisableControllers.prototype = { setControllerPartLayer('tips', 'blank'); hideEntitiesWithTag('finish'); + setAwayEnabled(false); onFinish(); }, @@ -290,6 +298,7 @@ function reenableEverything() { controllerDisplayManager.destroy(); controllerDisplayManager = null; } + setAwayEnabled(true); } var stepEnableControllers = function(name) { @@ -361,7 +370,10 @@ StayInFrontOverlay.prototype = { }, destroy: function() { Overlays.deleteOverlay(this.overlayID); - Script.update.disconnect(this.boundUpdate); + try { + Script.update.disconnect(this.boundUpdate); + } catch(e) { + } } }; @@ -823,15 +835,8 @@ var stepTurnAround = function(name) { this.tag = name; this.tempTag = name + "-temporary"; - - //var name = "mapping-name"; - //var mapping = Controller.newMapping(name); - //mapping.from([Controller.Actions.StepYaw]).to(function() { - // print("STEPYAW"); - //}); - //Script.scriptEnding.connect(function() { - // Controller.disableMapping(name); - //}); + this.onActionBound = this.onAction.bind(this); + this.numTimesTurnPressed = 0; } stepTurnAround.prototype = { start: function(onFinish) { @@ -842,28 +847,38 @@ stepTurnAround.prototype = { setControllerPartLayer('tips', 'arrows'); showEntitiesWithTag(this.tag); - var hasTurnedAround = false; + + this.numTimesTurnPressed = 0; + Controller.actionEvent.connect(this.onActionBound); + this.interval = Script.setInterval(function() { + var FORWARD_THRESHOLD = 30; + var REQ_NUM_TIMES_PRESSED = 6; + var dir = Quat.getFront(MyAvatar.orientation); var angle = Math.atan2(dir.z, dir.x); var angleDegrees = ((angle / Math.PI) * 180); - if (!hasTurnedAround) { - if (Math.abs(angleDegrees) > 140) { - hasTurnedAround = true; - info("Half way turned around"); - } - } else { - if (Math.abs(angleDegrees) < 30) { - Script.clearInterval(this.interval); - this.interval = null; - info("Turned around"); - playSuccessSound(); - onFinish(); - } + + if (this.numTimesTurnPressed >= REQ_NUM_TIMES_PRESSED && Math.abs(angleDegrees) < FORWARD_THRESHOLD) { + Script.clearInterval(this.interval); + this.interval = null; + playSuccessSound(); + onFinish(); } }.bind(this), 100); }, + onAction: function(action, value) { + var STEP_YAW_ACTION = 6; + if (action == STEP_YAW_ACTION && value != 0) { + this.numTimesTurnPressed += 1; + } + }, cleanup: function() { + try { + Controller.actionEvent.disconnect(this.onActionBound); + } catch (e) { + } + setControllerVisible("left", false); setControllerVisible("right", false); From 20b93a7afa611ffd3229eaa86400f4ee8ce4e07e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Sep 2016 16:38:03 -0700 Subject: [PATCH 273/300] Add redirection to entry on first turn if you don't have Vive --- interface/src/Application.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9cf0e841f9..45c14b2f88 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1277,7 +1277,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : bool hasTutorialContent = contentVersion >= 1; Setting::Handle firstRun { Settings::firstRun, true }; - bool hasHMDAndHandControllers = PluginUtils::isHMDAvailable() && PluginUtils::isHandControllerAvailable(); + bool hasHMDAndHandControllers = PluginUtils::isHMDAvailable("OpenVR (Vive)") && PluginUtils::isHandControllerAvailable(); Setting::Handle tutorialComplete { "tutorialComplete", false }; bool shouldGoToTutorial = hasHMDAndHandControllers && hasTutorialContent && !tutorialComplete.get(); @@ -1320,13 +1320,17 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : } if (addressLookupString.isEmpty() && firstRun.get()) { - DependencyManager::get()->ifLocalSandboxRunningElse([=]() { - qDebug() << "Home sandbox appears to be running, going to Home."; - DependencyManager::get()->goToLocalSandbox(); - }, [=]() { - qDebug() << "Home sandbox does not appear to be running, going to Entry."; + if (hasHMDAndHandControllers) { + DependencyManager::get()->ifLocalSandboxRunningElse([=]() { + qDebug() << "Home sandbox appears to be running, going to Home."; + DependencyManager::get()->goToLocalSandbox(); + }, [=]() { + qDebug() << "Home sandbox does not appear to be running, going to Entry."; + DependencyManager::get()->goToEntry(); + }); + } else { DependencyManager::get()->goToEntry(); - }); + } } else { qDebug() << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString); DependencyManager::get()->loadSettings(addressLookupString); From e6314a27018eae1bb43ba1d2601d0cfa7a3aeeee Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 28 Sep 2016 16:48:28 -0700 Subject: [PATCH 274/300] Add changes to isHMDAvailable to specify hmd --- libraries/plugins/src/plugins/PluginUtils.cpp | 5 +++-- libraries/plugins/src/plugins/PluginUtils.h | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/libraries/plugins/src/plugins/PluginUtils.cpp b/libraries/plugins/src/plugins/PluginUtils.cpp index 0a19071210..f689f6f8bf 100644 --- a/libraries/plugins/src/plugins/PluginUtils.cpp +++ b/libraries/plugins/src/plugins/PluginUtils.cpp @@ -14,9 +14,10 @@ #include "InputPlugin.h" #include "PluginManager.h" -bool PluginUtils::isHMDAvailable() { +bool PluginUtils::isHMDAvailable(const QString& pluginName) { for (auto& displayPlugin : PluginManager::getInstance()->getDisplayPlugins()) { - if (displayPlugin->isHmd()) { + // Temporarily only enable this for Vive + if (displayPlugin->isHmd() && (pluginName.isEmpty() || displayPlugin->getName() == pluginName)) { return true; break; } diff --git a/libraries/plugins/src/plugins/PluginUtils.h b/libraries/plugins/src/plugins/PluginUtils.h index aba5364800..727677ccd3 100644 --- a/libraries/plugins/src/plugins/PluginUtils.h +++ b/libraries/plugins/src/plugins/PluginUtils.h @@ -10,8 +10,10 @@ #pragma once +#include + class PluginUtils { public: - static bool isHMDAvailable(); + static bool isHMDAvailable(const QString& pluginName = ""); static bool isHandControllerAvailable(); -}; \ No newline at end of file +}; From 408cc1cd04620edee7e85439656c2438f1a44765 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 29 Sep 2016 08:52:10 -0700 Subject: [PATCH 275/300] Update default hifi address to dev-welcome --- libraries/networking/src/AddressManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/AddressManager.h b/libraries/networking/src/AddressManager.h index 0ab70854eb..f753bb0548 100644 --- a/libraries/networking/src/AddressManager.h +++ b/libraries/networking/src/AddressManager.h @@ -23,7 +23,7 @@ #include "AccountManager.h" const QString HIFI_URL_SCHEME = "hifi"; -const QString DEFAULT_HIFI_ADDRESS = "hifi://entry"; +const QString DEFAULT_HIFI_ADDRESS = "hifi://dev-welcome"; const QString SANDBOX_HIFI_ADDRESS = "hifi://localhost"; const QString SANDBOX_STATUS_URL = "http://localhost:60332/status"; const QString INDEX_PATH = "/"; From 7379e9a03fb74e3aca833a3e7aa09bd7c56cc3c6 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 29 Sep 2016 10:23:13 -0700 Subject: [PATCH 276/300] Update server-console content 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 51148ba91b..66d05b49dc 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 = "https://hifi-public.s3.amazonaws.com/home-tutorial-3.tar.gz"; +const HOME_CONTENT_URL = "http://cachefly.highfidelity.com/home-tutorial-4.tar.gz"; function getBuildInfo() { var buildInfoPath = null; From 3c18d082708f2f7bb33e3a26ab62be6b12f609c3 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Sep 2016 16:54:12 -0700 Subject: [PATCH 277/300] Update firepit to use Local Messages --- tutorial/firePit/fire.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/firePit/fire.js b/tutorial/firePit/fire.js index 381676f1ce..077d79a42a 100644 --- a/tutorial/firePit/fire.js +++ b/tutorial/firePit/fire.js @@ -75,7 +75,7 @@ _this.playSoundAtCurrentPosition(); _this.explodeWithColor(); Entities.deleteEntity(otherID) - Messages.sendMessage('Entity-Exploded', JSON.stringify({ + Messages.sendLocalMessage('Entity-Exploded', JSON.stringify({ entityID: otherID, })); } From 4ba637edf1eaf9a050929b767aa5febd5e17f6da Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Sep 2016 16:55:32 -0700 Subject: [PATCH 278/300] Update tutorial to use static list of entity ids --- tutorial/tutorial.js | 99 ++++++++++------------ tutorial/tutorialEntityIDs.js | 151 ++++++++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+), 54 deletions(-) create mode 100644 tutorial/tutorialEntityIDs.js diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 231783716f..884420c154 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -11,7 +11,7 @@ Script.include("entityData.js"); Script.include("viveHandsv2.js"); Script.include("lighter/createButaneLighter.js"); -Script.include('ownershipToken.js'); +Script.include("tutorialEntityIDs.js"); if (!Function.prototype.bind) { Function.prototype.bind = function(oThis) { @@ -57,9 +57,6 @@ function info() { var NEAR_BOX_SPAWN_NAME = "tutorial/nearGrab/box_spawn"; var FAR_BOX_SPAWN_NAME = "tutorial/farGrab/box_spawn"; -var NEAR_BASKET_COLLIDER_NAME = "tutorial/nearGrab/basket_collider"; -var FAR_BASKET_COLLIDER_NAME = "tutorial/farGrab/basket_collider"; -var GUN_BASKET_COLLIDER_NAME = "tutorial/equip/basket_collider"; var GUN_SPAWN_NAME = "tutorial/gun_spawn"; var TELEPORT_PAD_NAME = "tutorial/teleport/pad" @@ -218,19 +215,6 @@ function isFunction(functionToCheck) { return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; } - var defaultTransform = { - position: { - x: 0.2459, - y: 0.9011, - z: 0.7266 - }, - rotation: { - x: 0, - y: 0, - z: 0, - w: 1 - } - }; function playSuccessSound() { Audio.playSound(successSound, { position: MyAvatar.position, @@ -393,20 +377,6 @@ stepOrient.prototype = { var tag = this.tag; - var defaultTransform = { - position: { - x: 0.2459, - y: 0.9011, - z: 0.7266 - }, - rotation: { - x: 0, - y: 0, - z: 0, - w: 1 - } - }; - // Spawn content set debug("raise hands...", this.tag); editEntitiesWithTag(this.tag, { visible: true }); @@ -428,7 +398,6 @@ stepOrient.prototype = { }, cleanup: function() { if (this.active) { - //location = "/tutorial"; this.active = false; } if (this.overlay) { @@ -463,20 +432,6 @@ stepRaiseAboveHead.prototype = { var STATE_HANDS_UP = 2; this.state = STATE_START; - var defaultTransform = { - position: { - x: 0.2459, - y: 0.9011, - z: 0.7266 - }, - rotation: { - x: 0, - y: 0, - z: 0, - w: 1 - } - }; - debug("raise hands...", this.tag); editEntitiesWithTag(this.tag, { visible: true }); @@ -554,16 +509,11 @@ stepNearGrab.prototype = { return spawnWithTag([birdFirework1], null, this.tempTag)[0]; } - // Enabled grab - // Create table ? - // Create blocks and basket this.birdIDs = []; this.birdIDs.push(createBlock.bind(this)()); this.birdIDs.push(createBlock.bind(this)()); this.birdIDs.push(createBlock.bind(this)()); this.positionWatcher = new PositionWatcher(this.birdIDs, boxSpawnPosition, -0.4, 4); - - // If block gets too far away or hasn't been touched for X seconds, create a new block and destroy the old block }, onMessage: function(channel, message, seneder) { if (this.finished) { @@ -997,6 +947,29 @@ stepCleanupFinish.prototype = { function showEntitiesWithTag(tag) { + var entities = TUTORIAL_TAG_TO_ENTITY_IDS_MAP[tag]; + if (entities) { + for (entityID in entities) { + var data = entities[entityID]; + + var collisionless = data.visible === false ? true : false; + if (data.collidable !== undefined) { + collisionless = data.collidable === true ? false : true; + } + if (data.soundKey) { + data.soundKey.playing = true; + } + var newProperties = { + visible: data.visible == false ? false : true, + collisionless: collisionless, + userData: JSON.stringify(data), + }; + Entities.editEntity(entityID, newProperties); + } + } + + // Dynamic method, suppressed for now + return; editEntitiesWithTag(tag, function(entityID) { var userData = Entities.getEntityProperties(entityID, "userData").userData; var data = parseJSON(userData); @@ -1005,7 +978,6 @@ function showEntitiesWithTag(tag) { collisionless = data.collidable === true ? false : true; } if (data.soundKey) { - debug("Setting sound key to true"); data.soundKey.playing = true; } var newProperties = { @@ -1017,6 +989,26 @@ function showEntitiesWithTag(tag) { }); } function hideEntitiesWithTag(tag) { + var entities = TUTORIAL_TAG_TO_ENTITY_IDS_MAP[tag]; + if (entities) { + for (entityID in entities) { + var data = entities[entityID]; + + if (data.soundKey) { + data.soundKey.playing = false; + } + var newProperties = { + visible: false, + collisionless: 1, + ignoreForCollisions: 1, + userData: JSON.stringify(data), + }; + Entities.editEntity(entityID, newProperties); + } + } + + // Dynamic method, suppressed for now + return; editEntitiesWithTag(tag, function(entityID) { var userData = Entities.getEntityProperties(entityID, "userData").userData; var data = parseJSON(userData); @@ -1049,10 +1041,8 @@ TutorialManager = function() { currentStep = null; startedTutorialAt = Date.now(); STEPS = [ - //new stepCleanupFinish("finish"); new stepDisableControllers("step0"), new stepOrient("orient"), - //new stepWelcome("welcome"), new stepRaiseAboveHead("raiseHands"), new stepNearGrab("nearGrab"), new stepFarGrab("farGrab"), @@ -1101,6 +1091,7 @@ TutorialManager = function() { return true; } }.bind(this); + this.restartStep = function() { if (currentStep) { currentStep.cleanup(); diff --git a/tutorial/tutorialEntityIDs.js b/tutorial/tutorialEntityIDs.js new file mode 100644 index 0000000000..38bd06e5ff --- /dev/null +++ b/tutorial/tutorialEntityIDs.js @@ -0,0 +1,151 @@ +TUTORIAL_TAG_TO_ENTITY_IDS_MAP = { + "teleport": { + "{ff064b9e-7fa4-4693-a386-a67b9f92a948}": { + "tag": "teleport" + }, + "{4478f7b5-d3ac-4213-9a7b-ad8cd69575b8}": { + "tag": "teleport" + } + }, + "finish": { + "{340e05b5-88df-4b2b-b43c-756dd714d6d8}": { + "tag": "finish" + } + }, + "door": { + "{9c5b0fee-e695-4516-94cd-153371e3857b}": { + "tag": "door" + } + }, + "farGrab": { + "{70fcd96c-cd59-4f23-9ca5-a167f2f85680}": { + "visible": false, + "tag": "farGrab" + }, + "{ff7b9793-0d94-4f18-bc09-4ab589126e60}": { + "tag": "farGrab" + }, + "{fdd77d2c-af36-41c1-ba57-74b7ae79d996}": { + "tag": "farGrab" + }, + "{e11700f6-bc9a-411f-9ddc-bf265d4e3ccf}": { + "tag": "farGrab" + }, + "{95850c56-cd1c-42b9-ab6b-a163a6f2878f}": { + "tag": "farGrab" + } + }, + "nearGrab": { + "{55c861ef-60ca-4722-a6c5-9c6967966ec5}": { + "tag": "nearGrab" + }, + "{644d655b-ae66-43b1-9bab-a44b9a8ad632}": { + "tag": "nearGrab" + }, + "{88221a22-b710-4d35-852b-5257b0aa77dc}": { + "tag": "nearGrab" + }, + "{8bf0baa1-88d0-448a-a782-100d4413bd82}": { + "tag": "nearGrab" + }, + "{5cf22b9c-fb22-4854-8821-554422980b24}": { + "visible": false, + "tag": "nearGrab" + } + }, + "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" + }, + "{da5ea72e-54b6-41ac-b711-742b062b6968}": { + "tag": "equip-part1" + }, + "{c8944a13-9acb-4d77-b1ee-851845e98357}": { + "tag": "equip-part1" + }, + "{e9481c78-1a21-43f7-b54c-58f2efdf3c8f}": { + "tag": "equip-part1" + }, + "{ca3c28f3-15fc-4349-a85e-eaca0fad6434}": { + "tag": "equip-part1" + }, + "{09ddcb94-52a7-4f50-a5a2-db9db28fc519}": { + "tag": "equip-part1" + }, + "{dd13fcd5-616f-4749-ab28-2e1e8bc512e9}": { + "tag": "equip-part1" + } + }, + "equip-part2": { + "{8b92eec5-aeed-4368-bce0-432cc9ad4c51}": { + "tag": "equip-part2" + }, + "{6307cd16-dd1d-4988-a339-578178436b45}": { + "tag": "equip-part2" + } + }, + "turnAround": { + "{ce74b3ca-d1c7-4980-bd98-2d488095a39e}": { + "tag": "turnAround" + } + }, + "bothGrab": { + "{14792a6e-dc6f-4e7a-843f-4b109b06b5a4}": { + "visible": false, + "tag": "bothGrab", + "collidable": true + }, + "{215dcd14-88fc-4604-9033-cbd2a660178a}": { + "tag": "bothGrab" + }, + "{fbc2e40d-0633-45ac-b1c9-97fc8465f93b}": { + "tag": "bothGrab" + }, + "{6752dad6-109d-4dc5-aef7-dc8509468cf4}": { + "tag": "bothGrab" + }, + "{178e2c71-dff5-4231-8d28-df47fddf4709}": { + "soundKey": { + "playbackGapRange": 0, + "url": "atp:/sounds/crackling_fire.L.wav", + "volume": 0.5, + "playbackGap": 5, + "playing": false, + "loop": true + }, + "tag": "bothGrab" + }, + "{52445ac5-8730-4457-827e-6c076d2c609c}": { + "tag": "bothGrab" + } + }, + "raiseHands": { + "{7139e45d-25cf-470b-b133-c0fda0099d2b}": { + "tag": "raiseHands" + } + }, + "equip": { + "{e7897c9c-f4fa-4989-a383-28af56c2e544}": { + "visible": false, + "tag": "equip" + }, + "{9df518da-9e65-4b76-8a79-eeefdb0b7310}": { + "visible": false, + "tag": "equip" + }, + "{1a77c20e-5d9b-4b54-bf20-1416141a7ca8}": { + "tag": "equip" + } + }, + "orient": { + "{95d233ab-ed0a-46e1-b047-1c542688ef3f}": { + "tag": "orient" + } + } +} From a463a3e608d9214656b05d8524d4d103cb56d2f7 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 30 Sep 2016 16:56:53 -0700 Subject: [PATCH 279/300] Update viveHandsv2 to hide on equip --- tutorial/controllerDisplay.js | 13 +- tutorial/viveControllerConfiguration.js | 10 +- tutorial/viveHandsv2.js | 197 ++++++++++++++++++------ 3 files changed, 172 insertions(+), 48 deletions(-) diff --git a/tutorial/controllerDisplay.js b/tutorial/controllerDisplay.js index a85d25f562..3bc0e05a96 100644 --- a/tutorial/controllerDisplay.js +++ b/tutorial/controllerDisplay.js @@ -17,12 +17,23 @@ createControllerDisplay = function(config) { }, mappingName: "mapping-display", + setVisible: function(visible) { + print("CONTROLLER_DISPLAY::Setting visible", this.overlays.length); + for (var i = 0; i < this.overlays.length; ++i) { + print("i", i, this.overlays[i]); + Overlays.editOverlay(this.overlays[i], { + visible: visible + }); + } + }, + setPartVisible: function(partName, visible) { + return; if (partName in this.partOverlays) { debug("Setting part visible", partName, visible); for (var i = 0; i < this.partOverlays[partName].length; ++i) { Overlays.editOverlay(this.partOverlays[partName][i], { - visible: visible + //visible: visible }); } } diff --git a/tutorial/viveControllerConfiguration.js b/tutorial/viveControllerConfiguration.js index edabccc3f2..b8197d6cd2 100644 --- a/tutorial/viveControllerConfiguration.js +++ b/tutorial/viveControllerConfiguration.js @@ -43,7 +43,7 @@ var viveNaturalPosition = { var viveModelURL = "atp:/controller/vive_body.fbx"; var viveTipsModelURL = "atp:/controller/vive_tips.fbx" -VIVE_CONTROLLER_CONFIGURATION = { +VIVE_CONTROLLER_CONFIGURATION_LEFT = { name: "Vive", controllers: [ { @@ -154,10 +154,14 @@ VIVE_CONTROLLER_CONFIGURATION = { }, }, }, + ] +}; - +VIVE_CONTROLLER_CONFIGURATION_RIGHT = { + name: "Vive Right", + controllers: [ { modelURL: viveModelURL, jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), @@ -273,5 +277,5 @@ VIVE_CONTROLLER_CONFIGURATION = { }, } ] -} +}; diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index bd37e15007..e365a689c1 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -1,3 +1,33 @@ +if (!Function.prototype.bind) { + Function.prototype.bind = function(oThis) { + if (typeof this !== 'function') { + // closest thing possible to the ECMAScript 5 + // internal IsCallable function + throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); + } + + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function() {}, + fBound = function() { + return fToBind.apply(this instanceof fNOP + ? this + : oThis, + aArgs.concat(Array.prototype.slice.call(arguments))); + }; + + if (this.prototype) { + // Function.prototype doesn't have a prototype property + fNOP.prototype = this.prototype; + } + fBound.prototype = new fNOP(); + + return fBound; + }; +} + +Script.setTimeout(function() { print('timeout') }, 100); + Script.include("controllerDisplay.js"); Script.include("viveControllerConfiguration.js"); @@ -15,16 +45,37 @@ var zeroRotation = { x: 0, y: 0, z: 0, w: 1 }; // Management of controller display // /////////////////////////////////////////////////////////////////////////////// ControllerDisplayManager = function() { - var controllerDisplay = null; - var activeController = null; + var self = this; + var controllerLeft = null; + var controllerRight = null; var controllerCheckerIntervalID = null; + this.setLeftVisible = function(visible) { + print("settings controller display to visible"); + if (controllerLeft) { + print("doign it...", visible); + controllerLeft.setVisible(visible); + } + }; + + this.setRightVisible = function(visible) { + print("settings controller display to visible"); + if (controllerRight) { + print("doign it...", visible); + controllerRight.setVisible(visible); + } + }; + function updateControllers() { if (HMD.active) { if ("Vive" in Controller.Hardware) { - if (!activeController) { - debug("Found vive!"); - activeController = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION); + if (!controllerLeft) { + debug("Found vive left!"); + controllerLeft = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION_LEFT); + } + if (!controllerRight) { + debug("Found vive right!"); + controllerRight = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION_RIGHT); } // We've found the controllers, we no longer need to look for active controllers if (controllerCheckerIntervalID) { @@ -33,10 +84,7 @@ ControllerDisplayManager = function() { } } else { debug("HMD active, but no controllers found"); - if (activeController) { - deleteControllerDisplay(activeController); - activeController = null; - } + self.deleteControllerDisplays(); if (controllerCheckerIntervalID == null) { controllerCheckerIntervalID = Script.setInterval(updateControllers, 1000); } @@ -49,36 +97,38 @@ ControllerDisplayManager = function() { Script.clearInterval(controllerCheckerIntervalID); controllerCheckerIntervalID = null; } - if (activeController) { - debug("Deleting controller"); - deleteControllerDisplay(activeController); - activeController = null; - } + self.deleteControllerDisplays(); } } - HMD.displayModeChanged.connect(updateControllers); - - updateControllers(); - Messages.subscribe('Controller-Display'); var handleMessages = function(channel, message, sender) { - if (!activeController) { + if (!controllerLeft && !controllerRight) { return; } if (sender === MyAvatar.sessionUUID) { if (channel === 'Controller-Display') { - debug('here'); var data = JSON.parse(message); var name = data.name; var visible = data.visible; //c.setDisplayAnnotation(name, visible); - if (name in activeController.annotations) { - debug("hiding"); - for (var i = 0; i < activeController.annotations[name].length; ++i) { - debug("hiding", i); - Overlays.editOverlay(activeController.annotations[name][i], { visible: visible }); + if (controllerLeft) { + if (name in controllerLeft.annotations) { + debug("hiding"); + for (var i = 0; i < controllerLeft.annotations[name].length; ++i) { + debug("hiding", i); + Overlays.editOverlay(controllerLeft.annotations[name][i], { visible: visible }); + } + } + } + if (controllerRight) { + if (name in controllerRight.annotations) { + debug("hiding"); + for (var i = 0; i < controllerRight.annotations[name].length; ++i) { + debug("hiding", i); + Overlays.editOverlay(controllerRight.annotations[name][i], { visible: visible }); + } } } } else if (channel === 'Controller-Display-Parts') { @@ -86,39 +136,98 @@ ControllerDisplayManager = function() { var data = JSON.parse(message); for (var name in data) { var visible = data[name]; - activeController.setPartVisible(name, visible); + if (controllerLeft) { + controllerLeft.setPartVisible(name, visible); + } + if (controllerRight) { + controllerRight.setPartVisible(name, visible); + } } } else if (channel === 'Controller-Set-Part-Layer') { var data = JSON.parse(message); for (var name in data) { var layer = data[name]; - activeController.setLayerForPart(name, layer); + if (controllerLeft) { + controllerLeft.setLayerForPart(name, layer); + } + if (controllerRight) { + controllerRight.setLayerForPart(name, layer); + } } + } else if (channel == 'Hifi-Object-Manipulation') {// && sender == MyAvatar.sessionUUID) { + //print("got manip"); + var data = JSON.parse(message); + //print("post data", data); + var visible = data.action != 'equip'; + //print("Calling..."); + if (data.joint == "LeftHand") { + self.setLeftVisible(visible); + } else if (data.joint == "RightHand") { + self.setRightVisible(visible); + } } } } Messages.messageReceived.connect(handleMessages); - this.destroy = function() { - print("Destroying controller display"); - Messages.messageReceived.disconnect(handleMessages); - if (activeController) { - deleteControllerDisplay(activeController); + this.deleteControllerDisplays = function() { + if (controllerLeft) { + deleteControllerDisplay(controllerLeft); + controllerLeft = null; + } + if (controllerRight) { + deleteControllerDisplay(controllerRight); + controllerRight = null; } }; + this.destroy = function() { + print("Destroying controller display"); + Messages.messageReceived.disconnect(handleMessages); + self.deleteControllerDisplays(); + }; + + HMD.displayModeChanged.connect(updateControllers); + + updateControllers(); } -//var c = setupController(TOUCH_CONTROLLER_CONFIGURATION); -//var c = createControllerDisplay(VIVE_CONTROLLER_CONFIGURATION); -//c.setPartVisible("touchpad", false); -//c.setPartVisible("touchpad_teleport", false); -//layers = ["blank", "teleport", 'arrows']; -//num = 0; -//Script.setInterval(function() { -// print('num', num); -// num = (num + 1) % layers.length; -// c.setLayerForPart("touchpad", layers[num]); -//}, 2000); -// +/* +var controllerDisplayManager = new ControllerDisplayManager(); + +Messages.subscribe('Hifi-Object-Manipulation'); +function onMessageReceived(channel, message, sender) { + print(channel, message, sender); + if (channel == 'Hifi-Object-Manipulation') {// && sender == MyAvatar.sessionUUID) { + print("got manip"); + var data = JSON.parse(message); + print("post data", data); + var visible = data.action != 'equip'; + print("Calling..."); + if (data.joint == "LeftHand") { + controllerDisplayManager.setLeftVisible(visible); + } else if (data.joint == "RightHand") { + controllerDisplayManager.setRightVisible(visible); + } + } +} +Messages.messageReceived.connect(onMessageReceived); + +var visible = false; +print("SETTING IT UP"); +print("done"); +function toggleVis() { + print("toggling"); + visible = !visible; + controllerDisplayManager.setVisible(visible); +} +//toggleVis(); +//Script.setInterval(toggleVis, 1000); + +Script.scriptEnding.connect(function() { + print("destorying..."); + controllerDisplayManager.destroy(); + controllerDisplayManager = null; +}); +*/ From 0e5f670cceeb41d008724a57ead7abc99afc0633 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sun, 2 Oct 2016 21:53:30 -0700 Subject: [PATCH 280/300] Add extra debug to ownershipToken.js --- tutorial/ownershipToken.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tutorial/ownershipToken.js b/tutorial/ownershipToken.js index 3cfb3f285d..745eee44e4 100644 --- a/tutorial/ownershipToken.js +++ b/tutorial/ownershipToken.js @@ -108,6 +108,7 @@ OwnershipToken.prototype = { } if (this.updateLifetimeID) { + debug(this.name, "Clearing update lifetime interval"); Script.clearInterval(this.updateLifetimeID); this.updateLifetimeID = null; } From c7ead55380d2ccc49e0bd79dd9dc816ba4cc635e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Sun, 2 Oct 2016 22:14:44 -0700 Subject: [PATCH 281/300] Update default content set --- 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 66d05b49dc..04ed7b0938 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-4.tar.gz"; +const HOME_CONTENT_URL = "http://cachefly.highfidelity.com/home-tutorial-5.tar.gz"; function getBuildInfo() { var buildInfoPath = null; From 63c72eed659564aa150780ba640f62ccf8a1db29 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 09:31:30 -0700 Subject: [PATCH 282/300] Update content set for server console --- 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 04ed7b0938..7b1ece922a 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-5.tar.gz"; +const HOME_CONTENT_URL = "http://cachefly.highfidelity.com/home-tutorial-6.tar.gz"; function getBuildInfo() { var buildInfoPath = null; From 5f765e94f0f59f3159d4addb6476492e8d5197bf Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 10:33:27 -0700 Subject: [PATCH 283/300] Fix butane lighter sound url --- tutorial/lighter/butaneLighter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/lighter/butaneLighter.js b/tutorial/lighter/butaneLighter.js index e5400c60f3..574c2be6c6 100644 --- a/tutorial/lighter/butaneLighter.js +++ b/tutorial/lighter/butaneLighter.js @@ -14,7 +14,7 @@ }; const LIGHTER_ON_SOUND_URL = getResourceURL('tutorial_sounds/lighter_on.wav'); - const BUTANE_SOUND_URL = getResourceURL('tutorial_sound/butane.wav'); + const BUTANE_SOUND_URL = getResourceURL('tutorial_sounds/butane.wav'); // TODO: fix this in the client, changing the sound volume while a sound is playing doesn't seem to work right now const DYNAMIC_SOUND_VOLUME = false; From 92a7a638d4b59f00bb7f94dd2dbacc65a3c83499 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 11:23:15 -0700 Subject: [PATCH 284/300] Update content set to version 7 --- 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 7b1ece922a..ab6d900dd6 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-6.tar.gz"; +const HOME_CONTENT_URL = "http://cachefly.highfidelity.com/home-tutorial-7.tar.gz"; function getBuildInfo() { var buildInfoPath = null; From 9ddeda389ee1d123e5bb411d29215125e9f4f238 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 13:24:19 -0700 Subject: [PATCH 285/300] Update initial run logic --- interface/src/Application.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 45c14b2f88..f5b78ce8ca 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1283,10 +1283,9 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : bool shouldGoToTutorial = hasHMDAndHandControllers && hasTutorialContent && !tutorialComplete.get(); qDebug() << "Has HMD + Hand Controllers: " << hasHMDAndHandControllers << ", current plugin: " << _displayPlugin->getName(); - qDebug() << "has tutorial content" << hasTutorialContent; - qDebug() << "tutorial complete" << tutorialComplete.get(); - qDebug() << "should go to tutorial " << shouldGoToTutorial; - + qDebug() << "Has tutorial content: " << hasTutorialContent; + qDebug() << "Tutorial complete: " << tutorialComplete.get(); + qDebug() << "Should go to tutorial: " << shouldGoToTutorial; // when --url in command line, teleport to location const QString HIFI_URL_COMMAND_LINE_KEY = "--url"; @@ -1315,11 +1314,14 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : }); } else { - if (firstRun.get()) { + bool isFirstRun = firstRun.get(); + + if (isFirstRun) { showHelp(); } - if (addressLookupString.isEmpty() && firstRun.get()) { + // If this is a first run we short-circuit the address passed in + if (isFirstRun) { if (hasHMDAndHandControllers) { DependencyManager::get()->ifLocalSandboxRunningElse([=]() { qDebug() << "Home sandbox appears to be running, going to Home."; From 09d9cd8311ab697d9927fb7e7b75bec13618d00e Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 3 Oct 2016 16:03:43 -0700 Subject: [PATCH 286/300] Update content version to 8 --- 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 ab6d900dd6..017ca2e151 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-7.tar.gz"; +const HOME_CONTENT_URL = "http://cachefly.highfidelity.com/home-tutorial-8.tar.gz"; function getBuildInfo() { var buildInfoPath = null; From 504295cdcf4cfff98c844072b61a3c3af9f4d149 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 11:03:42 -0700 Subject: [PATCH 287/300] Add extra logging to tutorial zones --- tutorial/tutorialStartZone.js | 28 +++++++++++++++++++++------- tutorial/tutorialZone.js | 27 +++++++++++++++------------ 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/tutorial/tutorialStartZone.js b/tutorial/tutorialStartZone.js index 5adad1d00a..8dec47b7ac 100644 --- a/tutorial/tutorialStartZone.js +++ b/tutorial/tutorialStartZone.js @@ -1,28 +1,42 @@ (function() { var TutorialStartZone = function() { + print("TutorialStartZone | Creating"); }; TutorialStartZone.prototype = { preload: function(entityID) { + print("TutorialStartZone | Preload"); this.entityID = entityID; + this.sendStartIntervalID = null; }, enterEntity: function() { + var self = this; // send message to outer zone - print("Entered the tutorial start area"); + print("TutorialStartZone | Entered the tutorial start area"); if (HMD.isHMDAvailable() && HMD.isHandControllerAvailable()) { - var parentID = Entities.getEntityProperties(this.entityID, 'parentID').parentID; - if (parentID) { - Entities.callEntityMethod(parentID, 'start'); - } else { - print("ERROR: No parent id found on tutorial start zone"); + function sendStart() { + print("TutorialStartZone | Checking parent ID"); + var parentID = Entities.getEntityProperties(self.entityID, 'parentID').parentID; + print("TutorialStartZone | Parent ID is: ", parentID); + if (parentID) { + print("TutorialStartZone | Entered the tutorial start area"); + Entities.callEntityMethod(parentID, 'start'); + } else { + print("TutorialStartZone | ERROR: No parent id found on tutorial start zone"); + } } + this.sendStartIntervalID = Script.setInterval(sendStart, 1500); } else { + print("TutorialStartZone | User tried to go to tutorial with HMD and hand controllers, sending back to /"); Window.alert("To proceed with this tutorial, please connect your VR headset and hand controllers."); location = "/"; } }, leaveEntity: function() { - print("Exited the tutorial start area"); + print("TutorialStartZone | Exited the tutorial start area"); + if (this.sendStartIntervalID) { + Script.clearInterval(this.sendStartIntervalID); + } } }; diff --git a/tutorial/tutorialZone.js b/tutorial/tutorialZone.js index e64d0f2445..db7306a529 100644 --- a/tutorial/tutorialZone.js +++ b/tutorial/tutorialZone.js @@ -33,6 +33,7 @@ if (!Function.prototype.bind) { Script.include(tutorialPath); var TutorialZone = function() { + print("TutorialZone | Creating"); this.token = null; }; @@ -55,34 +56,36 @@ if (!Function.prototype.bind) { } }, preload: function(entityID) { + print("TutorialZone | Preload"); this.entityID = entityID; }, start: function() { - print("Got start"); + print("TutorialZone | Got start"); var self = this; if (!this.token) { + print("TutorialZone | Creating token"); this.token = new OwnershipToken(Math.random() * 100000, this.entityID, { onGainedOwnership: function(token) { - print("GOT OWNERSHIP"); + print("TutorialZone | GOT OWNERSHIP"); if (!self.tutorialManager) { self.tutorialManager = new TutorialManager(); } self.tutorialManager.startTutorial(); - print("making bound release handler"); + print("TutorialZone | making bound release handler"); self.keyReleaseHandlerBound = self.keyReleaseHandler.bind(self); - print("binding"); + print("TutorialZone | binding"); Controller.keyReleaseEvent.connect(self.keyReleaseHandlerBound); - print("done"); + print("TutorialZone | done"); }, onLostOwnership: function(token) { - print("LOST OWNERSHIP"); + print("TutorialZone | LOST OWNERSHIP"); if (self.tutorialManager) { - print("stopping tutorial.."); + print("TutorialZone | stopping tutorial.."); self.tutorialManager.stopTutorial(); - print("done"); + print("TutorialZone | done"); Controller.keyReleaseEvent.disconnect(self.keyReleaseHandlerBound); } else { - print("no tutorial manager..."); + print("TutorialZone | no tutorial manager..."); } } }); @@ -90,12 +93,12 @@ if (!Function.prototype.bind) { }, enterEntity: function() { - print("ENTERED THE TUTORIAL AREA"); + print("TutorialZone | ENTERED THE TUTORIAL AREA"); }, leaveEntity: function() { - print("EXITED THE TUTORIAL AREA"); + print("TutorialZone | EXITED THE TUTORIAL AREA"); if (this.token) { - print("destroying token"); + print("TutorialZone | Destroying token"); this.token.destroy(); this.token = null; } From 1592394d6af811b0aec006d58c65ed6ddfc68486 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 11:19:44 -0700 Subject: [PATCH 288/300] Update tutorialStartZone to send start to parent immediately --- tutorial/tutorialStartZone.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tutorial/tutorialStartZone.js b/tutorial/tutorialStartZone.js index 8dec47b7ac..5cff1a4e99 100644 --- a/tutorial/tutorialStartZone.js +++ b/tutorial/tutorialStartZone.js @@ -19,13 +19,14 @@ var parentID = Entities.getEntityProperties(self.entityID, 'parentID').parentID; print("TutorialStartZone | Parent ID is: ", parentID); if (parentID) { - print("TutorialStartZone | Entered the tutorial start area"); + print("TutorialStartZone | Sending start"); Entities.callEntityMethod(parentID, 'start'); } else { print("TutorialStartZone | ERROR: No parent id found on tutorial start zone"); } } this.sendStartIntervalID = Script.setInterval(sendStart, 1500); + sendStart(); } else { print("TutorialStartZone | User tried to go to tutorial with HMD and hand controllers, sending back to /"); Window.alert("To proceed with this tutorial, please connect your VR headset and hand controllers."); From 79ea7c40750625fd867fb705979588ae2cdda13c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 11:20:07 -0700 Subject: [PATCH 289/300] Update content set version to 9 --- 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 017ca2e151..92bb549fbb 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-8.tar.gz"; +const HOME_CONTENT_URL = "http://cachefly.highfidelity.com/home-tutorial-9.tar.gz"; function getBuildInfo() { var buildInfoPath = null; From d589812c5257c556f8cd804e2ffd37ee571c7bc0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Tue, 4 Oct 2016 21:35:55 -0700 Subject: [PATCH 290/300] Update hand controller detection --- plugins/hifiSixense/src/SixenseManager.h | 4 +++- plugins/oculus/src/OculusControllerManager.h | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/hifiSixense/src/SixenseManager.h b/plugins/hifiSixense/src/SixenseManager.h index 56d3c6bc4d..c77569474e 100644 --- a/plugins/hifiSixense/src/SixenseManager.h +++ b/plugins/hifiSixense/src/SixenseManager.h @@ -31,7 +31,9 @@ public: virtual const QString& getName() const override { return NAME; } virtual const QString& getID() const override { return HYDRA_ID_STRING; } - bool isHandController() const override { return true; } + // Sixense always seems to initialize even if the hydras are not present. Is there + // a way we can properly detect whether the hydras are present? + bool isHandController() const override { return false; } virtual bool activate() override; virtual void deactivate() override; diff --git a/plugins/oculus/src/OculusControllerManager.h b/plugins/oculus/src/OculusControllerManager.h index 4c236a375d..234acd7db2 100644 --- a/plugins/oculus/src/OculusControllerManager.h +++ b/plugins/oculus/src/OculusControllerManager.h @@ -26,7 +26,7 @@ public: bool isSupported() const override; const QString& getName() const override { return NAME; } - bool isHandController() const override { return true; } + bool isHandController() const override { return _touch != nullptr; } bool activate() override; void deactivate() override; From b839926396083762cad20be4a32e336a6d61e304 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 6 Oct 2016 13:32:47 -0700 Subject: [PATCH 291/300] Remove unnecessary lambda for location initialization on startup --- interface/src/Application.cpp | 132 +++++++++++++++++----------------- 1 file changed, 64 insertions(+), 68 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index f5b78ce8ca..388fe936c7 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1258,87 +1258,83 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : - // Initialize location + // Get sandbox content set version, if available + auto acDirPath = PathUtils::getRootDataDirectory() + BuildInfo::MODIFIED_ORGANIZATION + "/assignment-client/"; + auto contentVersionPath = acDirPath + "content-version.txt"; + qDebug() << "Checking " << contentVersionPath << " for content version"; + auto contentVersion = 0; + QFile contentVersionFile(contentVersionPath); + if (contentVersionFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + QString line = contentVersionFile.readAll(); + // toInt() returns 0 if the conversion fails, so we don't need to specifically check for failure + contentVersion = line.toInt(); + } + qDebug() << "Server content version: " << contentVersion; - auto initializeLocation = [this]() { - // Get sandbox content set version, if available - auto acDirPath = PathUtils::getRootDataDirectory() + BuildInfo::MODIFIED_ORGANIZATION + "/assignment-client/"; - auto contentVersionPath = acDirPath + "content-version.txt"; - qDebug() << "Checking " << contentVersionPath << " for content version"; - auto contentVersion = 0; - QFile contentVersionFile(contentVersionPath); - if (contentVersionFile.open(QIODevice::ReadOnly | QIODevice::Text)) { - QString line = contentVersionFile.readAll(); - // toInt() returns 0 if the conversion fails, so we don't need to specifically check for failure - contentVersion = line.toInt(); - } - qDebug() << "Server content version: " << contentVersion; + bool hasTutorialContent = contentVersion >= 1; - bool hasTutorialContent = contentVersion >= 1; + Setting::Handle firstRun { Settings::firstRun, true }; + bool hasHMDAndHandControllers = PluginUtils::isHMDAvailable("OpenVR (Vive)") && PluginUtils::isHandControllerAvailable(); + Setting::Handle tutorialComplete { "tutorialComplete", false }; - Setting::Handle firstRun { Settings::firstRun, true }; - bool hasHMDAndHandControllers = PluginUtils::isHMDAvailable("OpenVR (Vive)") && PluginUtils::isHandControllerAvailable(); - Setting::Handle tutorialComplete { "tutorialComplete", false }; + bool shouldGoToTutorial = hasHMDAndHandControllers && hasTutorialContent && !tutorialComplete.get(); - bool shouldGoToTutorial = hasHMDAndHandControllers && hasTutorialContent && !tutorialComplete.get(); + qDebug() << "Has HMD + Hand Controllers: " << hasHMDAndHandControllers << ", current plugin: " << _displayPlugin->getName(); + qDebug() << "Has tutorial content: " << hasTutorialContent; + qDebug() << "Tutorial complete: " << tutorialComplete.get(); + qDebug() << "Should go to tutorial: " << shouldGoToTutorial; - qDebug() << "Has HMD + Hand Controllers: " << hasHMDAndHandControllers << ", current plugin: " << _displayPlugin->getName(); - qDebug() << "Has tutorial content: " << hasTutorialContent; - qDebug() << "Tutorial complete: " << tutorialComplete.get(); - qDebug() << "Should go to tutorial: " << shouldGoToTutorial; + // when --url in command line, teleport to location + const QString HIFI_URL_COMMAND_LINE_KEY = "--url"; + int urlIndex = arguments().indexOf(HIFI_URL_COMMAND_LINE_KEY); + QString addressLookupString; + if (urlIndex != -1) { + addressLookupString = arguments().value(urlIndex + 1); + } - // when --url in command line, teleport to location - const QString HIFI_URL_COMMAND_LINE_KEY = "--url"; - int urlIndex = arguments().indexOf(HIFI_URL_COMMAND_LINE_KEY); - QString addressLookupString; - if (urlIndex != -1) { - addressLookupString = arguments().value(urlIndex + 1); - } + const QString TUTORIAL_PATH = "/tutorial_begin"; - const QString TUTORIAL_PATH = "/tutorial_begin"; - - if (shouldGoToTutorial) { - DependencyManager::get()->ifLocalSandboxRunningElse([=]() { - qDebug() << "Home sandbox appears to be running, going to Home."; - DependencyManager::get()->goToLocalSandbox(TUTORIAL_PATH); - }, [=]() { - qDebug() << "Home sandbox does not appear to be running, going to Entry."; - if (firstRun.get()) { - showHelp(); - } - if (addressLookupString.isEmpty()) { - DependencyManager::get()->goToEntry(); - } else { - DependencyManager::get()->loadSettings(addressLookupString); - } - }); - } else { - - bool isFirstRun = firstRun.get(); - - if (isFirstRun) { + if (shouldGoToTutorial) { + DependencyManager::get()->ifLocalSandboxRunningElse([=]() { + qDebug() << "Home sandbox appears to be running, going to Home."; + DependencyManager::get()->goToLocalSandbox(TUTORIAL_PATH); + }, [=]() { + qDebug() << "Home sandbox does not appear to be running, going to Entry."; + if (firstRun.get()) { showHelp(); } - - // If this is a first run we short-circuit the address passed in - if (isFirstRun) { - if (hasHMDAndHandControllers) { - DependencyManager::get()->ifLocalSandboxRunningElse([=]() { - qDebug() << "Home sandbox appears to be running, going to Home."; - DependencyManager::get()->goToLocalSandbox(); - }, [=]() { - qDebug() << "Home sandbox does not appear to be running, going to Entry."; - DependencyManager::get()->goToEntry(); - }); - } else { - DependencyManager::get()->goToEntry(); - } + if (addressLookupString.isEmpty()) { + DependencyManager::get()->goToEntry(); } else { - qDebug() << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString); DependencyManager::get()->loadSettings(addressLookupString); } + }); + } else { + + bool isFirstRun = firstRun.get(); + + if (isFirstRun) { + showHelp(); } - }; + + // If this is a first run we short-circuit the address passed in + if (isFirstRun) { + if (hasHMDAndHandControllers) { + DependencyManager::get()->ifLocalSandboxRunningElse([=]() { + qDebug() << "Home sandbox appears to be running, going to Home."; + DependencyManager::get()->goToLocalSandbox(); + }, [=]() { + qDebug() << "Home sandbox does not appear to be running, going to Entry."; + DependencyManager::get()->goToEntry(); + }); + } else { + DependencyManager::get()->goToEntry(); + } + } else { + qDebug() << "Not first run... going to" << qPrintable(addressLookupString.isEmpty() ? QString("previous location") : addressLookupString); + DependencyManager::get()->loadSettings(addressLookupString); + } + } initializeLocation(); From a5e3fa45c3ee2fedcfdbbf43f9ec4f751102cc45 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 6 Oct 2016 13:44:51 -0700 Subject: [PATCH 292/300] Fix advanced movement being disabled --- .../toggleAdvancedMovementForHandControllers.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js b/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js index b74fe52e42..46464dc2e1 100644 --- a/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js +++ b/scripts/system/controllers/toggleAdvancedMovementForHandControllers.js @@ -55,7 +55,9 @@ function registerBasicMapping() { mappingName = 'Hifi-AdvancedMovement-Dev-' + Math.random(); basicMapping = Controller.newMapping(mappingName); basicMapping.from(Controller.Standard.LY).to(function(value) { - return; + if (isDisabled) { + return; + } var stick = Controller.getValue(Controller.Standard.LS); if (value === 1 && Controller.Hardware.OculusTouch !== undefined) { rotate180(); @@ -72,7 +74,9 @@ function registerBasicMapping() { }); basicMapping.from(Controller.Standard.LX).to(Controller.Standard.RX); basicMapping.from(Controller.Standard.RY).to(function(value) { - return; + if (isDisabled) { + return; + } var stick = Controller.getValue(Controller.Standard.RS); if (value === 1 && Controller.Hardware.OculusTouch !== undefined) { rotate180(); From 56a5d82f4b4497ab4f85388523f9ac1a8a3dbd04 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 6 Oct 2016 13:53:21 -0700 Subject: [PATCH 293/300] Cleanup tutorial.js and remove unused code --- tutorial/tutorial.js | 91 +++++++++++++------------------------------- 1 file changed, 26 insertions(+), 65 deletions(-) diff --git a/tutorial/tutorial.js b/tutorial/tutorial.js index 884420c154..c8b3bd38c1 100644 --- a/tutorial/tutorial.js +++ b/tutorial/tutorial.js @@ -236,21 +236,7 @@ var stepDisableControllers = function(name) { stepDisableControllers.prototype = { start: function(onFinish) { controllerDisplayManager = new ControllerDisplayManager(); - editEntitiesWithTag('door', { visible: true, collisionless: false }); - Menu.setIsOptionChecked("Overlays", false); - Controller.disableMapping('handControllerPointer-click'); - Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'disable'); - Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'both'); - Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ - nearGrabEnabled: true, - holdEnabled: false, - farGrabEnabled: false, - })); - setControllerPartLayer('touchpad', 'blank'); - setControllerPartLayer('tips', 'blank'); - - hideEntitiesWithTag('finish'); - setAwayEnabled(false); + disableEverything(); onFinish(); }, @@ -258,12 +244,24 @@ stepDisableControllers.prototype = { } }; -/////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// -// // -// STEP: ENABLE CONTROLLERS // -// // -/////////////////////////////////////////////////////////////////////////////// +function disableEverything() { + editEntitiesWithTag('door', { visible: true, collisionless: false }); + Menu.setIsOptionChecked("Overlays", false); + Controller.disableMapping('handControllerPointer-click'); + Messages.sendLocalMessage('Hifi-Advanced-Movement-Disabler', 'disable'); + Messages.sendLocalMessage('Hifi-Teleport-Disabler', 'both'); + Messages.sendLocalMessage('Hifi-Grab-Disable', JSON.stringify({ + nearGrabEnabled: true, + holdEnabled: false, + farGrabEnabled: false, + })); + setControllerPartLayer('touchpad', 'blank'); + setControllerPartLayer('tips', 'blank'); + + hideEntitiesWithTag('finish'); + setAwayEnabled(false); +} + function reenableEverything() { editEntitiesWithTag('door', { visible: false, collisionless: true }); Menu.setIsOptionChecked("Overlays", true); @@ -285,6 +283,13 @@ function reenableEverything() { setAwayEnabled(true); } +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +// // +// STEP: ENABLE CONTROLLERS // +// // +/////////////////////////////////////////////////////////////////////////////// + var stepEnableControllers = function(name) { this.tag = name; this.shouldLog = false; @@ -321,45 +326,6 @@ stepWelcome.prototype = { } }; -function StayInFrontOverlay(type, properties, distance, positionOffset) { - this.currentOrientation = MyAvatar.orientation; - this.currentPosition = MyAvatar.position; - this.distance = distance; - this.positionOffset = positionOffset; - - var forward = Vec3.multiply(this.distance, Quat.getFront(this.currentOrientation)); - - properties.rotation = this.currentOrientation; - properties.position = Vec3.sum(Vec3.sum(this.currentPosition, forward), this.positionOffset); - this.overlayID = Overlays.addOverlay(type, properties); - - - this.distance = distance; - - this.boundUpdate = this.update.bind(this); - Script.update.connect(this.boundUpdate); -} -StayInFrontOverlay.prototype = { - update: function(dt) { - var targetOrientation = MyAvatar.orientation; - var targetPosition = MyAvatar.position; - this.currentOrientation = Quat.slerp(this.currentOrientation, targetOrientation, 0.05); - this.currentPosition = Vec3.mix(this.currentPosition, targetPosition, 0.05); - - var forward = Vec3.multiply(this.distance, Quat.getFront(this.currentOrientation)); - Overlays.editOverlay(this.overlayID, { - position: Vec3.sum(Vec3.sum(this.currentPosition, forward), this.positionOffset), - rotation: this.currentOrientation, - }); - }, - destroy: function() { - Overlays.deleteOverlay(this.overlayID); - try { - Script.update.disconnect(this.boundUpdate); - } catch(e) { - } - } -}; /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// @@ -858,8 +824,6 @@ var stepTeleport = function(name) { } stepTeleport.prototype = { start: function(onFinish) { - //setControllerVisible("teleport", true); - setControllerPartLayer('touchpad', 'teleport'); setControllerPartLayer('tips', 'teleport'); @@ -926,9 +890,6 @@ stepFinish.prototype = { onFinish(); }, cleanup: function() { - //Menu.setIsOptionChecked("Overlays", true); - //hideEntitiesWithTag(this.tag); - //deleteEntitiesWithTag(this.tempTag); } }; From c995e511281d4d01fc3f48ca69eb08546308fff9 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 6 Oct 2016 14:12:13 -0700 Subject: [PATCH 294/300] Fix compilation bugs in Application --- interface/src/Application.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 388fe936c7..03bb2249d4 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -1336,10 +1336,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) : } } - initializeLocation(); - // After all of the constructor is completed, then set firstRun to false. - Setting::Handle firstRun{ Settings::firstRun, true }; firstRun.set(false); } From 8526ac74a51076adda3b4793d39a321bc0e5042d Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Fri, 7 Oct 2016 13:36:49 -0700 Subject: [PATCH 295/300] Turn on forced reprojection on i5 systems --- plugins/openvr/src/OpenVrDisplayPlugin.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/openvr/src/OpenVrDisplayPlugin.cpp b/plugins/openvr/src/OpenVrDisplayPlugin.cpp index 9247ebea0b..68bb23a84d 100644 --- a/plugins/openvr/src/OpenVrDisplayPlugin.cpp +++ b/plugins/openvr/src/OpenVrDisplayPlugin.cpp @@ -39,6 +39,10 @@ const QString StandingHMDSensorMode = "Standing HMD Sensor Mode"; // this probab PoseData _nextRenderPoseData; PoseData _nextSimPoseData; +#define MIN_CORES_FOR_NORMAL_RENDER 5 +bool forceInterleavedReprojection = (QThread::idealThreadCount() < MIN_CORES_FOR_NORMAL_RENDER); + + static std::array VR_EYES { { vr::Eye_Left, vr::Eye_Right } }; bool _openVrDisplayActive { false }; // Flip y-axis since GL UV coords are backwards. @@ -399,7 +403,10 @@ bool OpenVrDisplayPlugin::internalActivate() { }); // enable async time warp - //vr::VRCompositor()->ForceInterleavedReprojectionOn(true); + if (forceInterleavedReprojection) { + vr::VRCompositor()->ForceInterleavedReprojectionOn(true); + } + // set up default sensor space such that the UI overlay will align with the front of the room. auto chaperone = vr::VRChaperone(); From 8a4cfd473597453658817dca0463813b9b96a31d Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 7 Oct 2016 13:37:52 -0700 Subject: [PATCH 296/300] Remove unreachable code in PluginUtils --- libraries/plugins/src/plugins/PluginUtils.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/plugins/src/plugins/PluginUtils.cpp b/libraries/plugins/src/plugins/PluginUtils.cpp index f689f6f8bf..bc53e8166a 100644 --- a/libraries/plugins/src/plugins/PluginUtils.cpp +++ b/libraries/plugins/src/plugins/PluginUtils.cpp @@ -19,7 +19,6 @@ bool PluginUtils::isHMDAvailable(const QString& pluginName) { // Temporarily only enable this for Vive if (displayPlugin->isHmd() && (pluginName.isEmpty() || displayPlugin->getName() == pluginName)) { return true; - break; } } return false; @@ -29,7 +28,6 @@ bool PluginUtils::isHandControllerAvailable() { for (auto& inputPlugin : PluginManager::getInstance()->getInputPlugins()) { if (inputPlugin->isHandController()) { return true; - break; } } return false; From de14fdffb7a570f5007d9b200f20ed677564c809 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 7 Oct 2016 13:38:18 -0700 Subject: [PATCH 297/300] Remove commented log line --- plugins/openvr/src/OpenVrHelpers.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index 4429eb274f..f5e36492bd 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -296,8 +296,6 @@ controller::Pose openVrControllerPoseToHandPose(bool isLeftHand, const mat4& mat auto translationOffset = (isLeftHand ? leftTranslationOffset : rightTranslationOffset); auto rotationOffset = (isLeftHand ? leftRotationOffset : rightRotationOffset); - //qDebug() << "TRANSLATION OFFSET: " << isLeftHand << ", " << translationOffset.x << ", " << translationOffset.y << ", " << translationOffset.z; - glm::vec3 position = extractTranslation(mat); glm::quat rotation = glm::normalize(glm::quat_cast(mat)); From 0f0ea5f73f867cb194e4c9754a73b83f62854460 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 7 Oct 2016 13:40:35 -0700 Subject: [PATCH 298/300] Remove dead code --- tutorial/viveHandsv2.js | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/tutorial/viveHandsv2.js b/tutorial/viveHandsv2.js index e365a689c1..890a5e1588 100644 --- a/tutorial/viveHandsv2.js +++ b/tutorial/viveHandsv2.js @@ -192,42 +192,3 @@ ControllerDisplayManager = function() { updateControllers(); } - -/* -var controllerDisplayManager = new ControllerDisplayManager(); - -Messages.subscribe('Hifi-Object-Manipulation'); -function onMessageReceived(channel, message, sender) { - print(channel, message, sender); - if (channel == 'Hifi-Object-Manipulation') {// && sender == MyAvatar.sessionUUID) { - print("got manip"); - var data = JSON.parse(message); - print("post data", data); - var visible = data.action != 'equip'; - print("Calling..."); - if (data.joint == "LeftHand") { - controllerDisplayManager.setLeftVisible(visible); - } else if (data.joint == "RightHand") { - controllerDisplayManager.setRightVisible(visible); - } - } -} -Messages.messageReceived.connect(onMessageReceived); - -var visible = false; -print("SETTING IT UP"); -print("done"); -function toggleVis() { - print("toggling"); - visible = !visible; - controllerDisplayManager.setVisible(visible); -} -//toggleVis(); -//Script.setInterval(toggleVis, 1000); - -Script.scriptEnding.connect(function() { - print("destorying..."); - controllerDisplayManager.destroy(); - controllerDisplayManager = null; -}); -*/ From abaa75245ee12640fc3ef744ad0f53c0f3b2b34a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 7 Oct 2016 13:41:23 -0700 Subject: [PATCH 299/300] Temporarily remov touch controller configuration --- tutorial/touchControllerConfiguration.js | 152 ----------------------- 1 file changed, 152 deletions(-) delete mode 100644 tutorial/touchControllerConfiguration.js diff --git a/tutorial/touchControllerConfiguration.js b/tutorial/touchControllerConfiguration.js deleted file mode 100644 index a63d6749ad..0000000000 --- a/tutorial/touchControllerConfiguration.js +++ /dev/null @@ -1,152 +0,0 @@ -// -// touchControllerConfiguration.js -// -// Created by Ryan Huffman on 9/1/16. -// Copyright 2016 High Fidelity, Inc. -// -// Distributed under the Apache License, Version 2.0. -// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -// - -var CONTROLLER_LENGTH_OFFSET = 0.0762; -var leftBasePosition = { - x: CONTROLLER_LENGTH_OFFSET / 2, - y: CONTROLLER_LENGTH_OFFSET * 2, - z: CONTROLLER_LENGTH_OFFSET / 2 -}; -var rightBasePosition = { - x: -CONTROLLER_LENGTH_OFFSET / 2, - y: CONTROLLER_LENGTH_OFFSET * 2, - z: CONTROLLER_LENGTH_OFFSET / 2 -}; - - -var touchLeftBaseRotation = Quat.multiply( - Quat.fromPitchYawRollDegrees(0, 0, 0), - Quat.multiply( - Quat.fromPitchYawRollDegrees(0, 0, -45), - Quat.multiply( - Quat.fromPitchYawRollDegrees(180, 0, 0), - Quat.fromPitchYawRollDegrees(0, -90, 0) - ) - ) -); - -var touchRightBaseRotation = Quat.multiply( - Quat.fromPitchYawRollDegrees(0, 0, 45), - Quat.multiply( - Quat.fromPitchYawRollDegrees(180, 0, 0), - Quat.fromPitchYawRollDegrees(0, 90, 0) - ) -); - -var TOUCH_CONTROLLER_CONFIGURATION = { - name: "Touch", - controllers: [ - { - modelURL: "C:/Users/Ryan/Assets/controller/oculus_touch_l.fbx", - naturalPosition: { - x: 0.016486000269651413, - y: -0.035518500953912735, - z: -0.018527504056692123 - }, - jointIndex: MyAvatar.getJointIndex("_CONTROLLER_LEFTHAND"), - rotation: touchLeftBaseRotation, - position: leftBasePosition, - - annotationTextRotation: Quat.fromPitchYawRollDegrees(20, -90, 0), - annotations: { - - buttonX: { - position: { - x: -0.00931, - y: 0.00212, - z: -0.01259, - }, - direction: "left", - color: { red: 100, green: 100, blue: 100 }, - }, - buttonY: { - position: { - x: -0.01617, - y: 0.00216, - z: 0.00177, - }, - direction: "left", - color: { red: 100, green: 255, blue: 100 }, - }, - bumper: { - position: { - x: 0.00678, - y: -0.02740, - z: -0.02537, - }, - direction: "left", - color: { red: 100, green: 100, blue: 255 }, - }, - trigger: { - position: { - x: -0.01275, - y: -0.01992, - z: 0.02314, - }, - direction: "left", - color: { red: 255, green: 100, blue: 100 }, - } - }, - }, - { - modelURL: "C:/Users/Ryan/Assets/controller/oculus_touch_r.fbx", - naturalPosition: { - x: -0.016486000269651413, - y: -0.035518500953912735, - z: -0.018527504056692123 - }, - jointIndex: MyAvatar.getJointIndex("_CONTROLLER_RIGHTHAND"), - rotation: touchRightBaseRotation, - position: rightBasePosition, - - annotationTextRotation: Quat.fromPitchYawRollDegrees(20, 90, 0), - annotations: { - - buttonA: { - position: { - x: 0.00931, - y: 0.00212, - z: -0.01259, - }, - direction: "right", - color: { red: 100, green: 100, blue: 100 }, - }, - buttonB: { - position: { - x: 0.01617, - y: 0.00216, - z: 0.00177, - }, - direction: "right", - color: { red: 100, green: 255, blue: 100 }, - }, - bumper: { - position: { - x: 0.00678, - y: -0.02740, - z: -0.02537, - }, - direction: "right", - color: { red: 100, green: 100, blue: 255 }, - }, - trigger: { - position: { - x: 0.01275, - y: -0.01992, - z: 0.02314, - }, - direction: "right", - color: { red: 255, green: 100, blue: 100 }, - } - }, - } - ] -} - From 6476dfecc6a9d781f5afb0f20ff515fa6dfb351a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 7 Oct 2016 16:06:26 -0700 Subject: [PATCH 300/300] Update help window images --- .../html/img/controls-help-gamepad.png | Bin 96245 -> 96245 bytes .../html/img/controls-help-keyboard.png | Bin 69149 -> 68885 bytes .../resources/html/img/controls-help-vive.png | Bin 102581 -> 102385 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/interface/resources/html/img/controls-help-gamepad.png b/interface/resources/html/img/controls-help-gamepad.png index 8ffdfe9ad5dfa9207e443e7eb2238556c0f3fd75..6887c88adbbbc230c16f3044698f0f508c2eaf7e 100644 GIT binary patch delta 58 zcmezRp7rZ{)(vq?Jch=OZjO#Fh8Bhvj+3*P3}6BVAc4)xm=qXUjy;sx(|n3~`zdBd G?GgY(2ooXz delta 58 zcmezRp7rZ{)(vq?JZ_GT7LKMSMizz^#*?#{40xQ)joe%ejhsOOo0l;uFtXfAx&FBM M6!Z2|%#7M407LQU0tw4jj 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

    X#ftC|?DR4$KonPulV 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

    XLGQyIKtHT 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 SySn{D9w{+-(JB!G|NjF53e}hZ

    W{N( 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 diff --git a/interface/resources/html/img/controls-help-vive.png b/interface/resources/html/img/controls-help-vive.png index 310da1f7d98fa22373ad8ce34d97622739b676e3..98b339b7e610efad8328833fdb3634dbd2a0fdb1 100644 GIT binary patch delta 96778 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 E0G*Ia_y7O^ delta 97044 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∨Um|^Q?Q6#KJrpeOXDQr5<~`#BZ%cs= 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