From 1e30e148763d8236f0d8b68e5e8f4986701dff94 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sun, 29 Oct 2017 20:49:49 -0700 Subject: [PATCH 01/44] Exploring the metalicaness and gltf2 shading --- libraries/render-utils/src/DeferredBuffer.slh | 22 +++++++++---------- .../render-utils/src/DeferredBufferRead.slh | 7 +++++- libraries/render-utils/src/LightingModel.slh | 2 +- libraries/render-utils/src/forward_model.slf | 10 +++++---- .../src/forward_model_translucent.slf | 10 +++++---- .../render-utils/src/model_translucent.slf | 11 ++++++---- .../src/model_translucent_fade.slf | 10 +++++---- .../render-utils/src/overlay3D_model.slf | 10 +++++---- .../src/overlay3D_model_translucent.slf | 10 +++++---- 9 files changed, 55 insertions(+), 37 deletions(-) diff --git a/libraries/render-utils/src/DeferredBuffer.slh b/libraries/render-utils/src/DeferredBuffer.slh index a13c2ec5d1..5f6ef62559 100644 --- a/libraries/render-utils/src/DeferredBuffer.slh +++ b/libraries/render-utils/src/DeferredBuffer.slh @@ -15,18 +15,18 @@ // Unpack the metallic-mode value const float FRAG_PACK_SHADED_NON_METALLIC = 0.0; -const float FRAG_PACK_SHADED_METALLIC = 0.1; +const float FRAG_PACK_SHADED_METALLIC = 0.5; const float FRAG_PACK_SHADED_RANGE_INV = 1.0 / (FRAG_PACK_SHADED_METALLIC - FRAG_PACK_SHADED_NON_METALLIC); -const float FRAG_PACK_LIGHTMAPPED_NON_METALLIC = 0.2; -const float FRAG_PACK_LIGHTMAPPED_METALLIC = 0.3; -const float FRAG_PACK_LIGHTMAPPED_RANGE_INV = 1.0 / (FRAG_PACK_LIGHTMAPPED_METALLIC - FRAG_PACK_LIGHTMAPPED_NON_METALLIC); - -const float FRAG_PACK_SCATTERING_NON_METALLIC = 0.4; -const float FRAG_PACK_SCATTERING_METALLIC = 0.5; +const float FRAG_PACK_SCATTERING_NON_METALLIC = 0.501; +const float FRAG_PACK_SCATTERING_METALLIC = 0.6; const float FRAG_PACK_SCATTERING_RANGE_INV = 1.0 / (FRAG_PACK_SCATTERING_METALLIC - FRAG_PACK_SCATTERING_NON_METALLIC); -const float FRAG_PACK_UNLIT = 0.6; +const float FRAG_PACK_LIGHTMAPPED_NON_METALLIC = 0.601; +const float FRAG_PACK_LIGHTMAPPED_METALLIC = 0.99; +const float FRAG_PACK_LIGHTMAPPED_RANGE_INV = 1.0 / (FRAG_PACK_LIGHTMAPPED_METALLIC - FRAG_PACK_LIGHTMAPPED_NON_METALLIC); + +const float FRAG_PACK_UNLIT = 1.0; const int FRAG_MODE_UNLIT = 0; const int FRAG_MODE_SHADED = 1; @@ -37,12 +37,12 @@ void unpackModeMetallic(float rawValue, out int mode, out float metallic) { if (rawValue <= FRAG_PACK_SHADED_METALLIC) { mode = FRAG_MODE_SHADED; metallic = clamp((rawValue - FRAG_PACK_SHADED_NON_METALLIC) * FRAG_PACK_SHADED_RANGE_INV, 0.0, 1.0); - } else if (rawValue <= FRAG_PACK_LIGHTMAPPED_METALLIC) { - mode = FRAG_MODE_LIGHTMAPPED; - metallic = clamp((rawValue - FRAG_PACK_LIGHTMAPPED_NON_METALLIC) * FRAG_PACK_LIGHTMAPPED_RANGE_INV, 0.0, 1.0); } else if (rawValue <= FRAG_PACK_SCATTERING_METALLIC) { mode = FRAG_MODE_SCATTERING; metallic = clamp((rawValue - FRAG_PACK_SCATTERING_NON_METALLIC) * FRAG_PACK_SCATTERING_RANGE_INV, 0.0, 1.0); + } else if (rawValue <= FRAG_PACK_LIGHTMAPPED_METALLIC) { + mode = FRAG_MODE_LIGHTMAPPED; + metallic = clamp((rawValue - FRAG_PACK_LIGHTMAPPED_NON_METALLIC) * FRAG_PACK_LIGHTMAPPED_RANGE_INV, 0.0, 1.0); } else if (rawValue >= FRAG_PACK_UNLIT) { mode = FRAG_MODE_UNLIT; metallic = 0.0; diff --git a/libraries/render-utils/src/DeferredBufferRead.slh b/libraries/render-utils/src/DeferredBufferRead.slh index fbca241bb9..4f46f1d7da 100644 --- a/libraries/render-utils/src/DeferredBufferRead.slh +++ b/libraries/render-utils/src/DeferredBufferRead.slh @@ -73,13 +73,15 @@ DeferredFragment unpackDeferredFragmentNoPosition(vec2 texcoord) { frag.scattering = specularVal.x; } + /* if (frag.metallic <= 0.5) { frag.metallic = 0.0; frag.fresnel = vec3(0.03); // Default Di-electric fresnel value } else { frag.fresnel = vec3(diffuseVal.xyz); frag.metallic = 1.0; - } + }*/ + frag.fresnel = mix(vec3(0.03), diffuseVal.xyz, frag.metallic); return frag; } @@ -107,6 +109,7 @@ DeferredFragment unpackDeferredFragmentNoPositionNoAmbient(vec2 texcoord) { frag.obscurance = 1.0; + /* if (frag.metallic <= 0.5) { frag.metallic = 0.0; frag.fresnel = vec3(0.03); // Default Di-electric fresnel value @@ -114,6 +117,8 @@ DeferredFragment unpackDeferredFragmentNoPositionNoAmbient(vec2 texcoord) { frag.fresnel = vec3(diffuseVal.xyz); frag.metallic = 1.0; } + */ + frag.fresnel = mix(vec3(0.03), diffuseVal.xyz, frag.metallic); return frag; } diff --git a/libraries/render-utils/src/LightingModel.slh b/libraries/render-utils/src/LightingModel.slh index 521c4894dc..d37788c018 100644 --- a/libraries/render-utils/src/LightingModel.slh +++ b/libraries/render-utils/src/LightingModel.slh @@ -135,7 +135,7 @@ float specularDistributionGloss(float gloss2, vec3 normal, vec3 halfDir) { float ndoth = clamp(dot(halfDir, normal), 0.0, 1.0); // float gloss2 = pow(0.001 + roughness, 4); float denom = (ndoth * ndoth*(gloss2 - 1.0) + 1.0); - float power = gloss2 / (3.14159 * denom * denom); + float power = gloss2 * gloss2 / (3.14159 * denom * denom); return power; } ; diff --git a/libraries/render-utils/src/forward_model_translucent.slf b/libraries/render-utils/src/forward_model_translucent.slf index 52e8ce50e7..af618775eb 100644 --- a/libraries/render-utils/src/forward_model_translucent.slf +++ b/libraries/render-utils/src/forward_model_translucent.slf @@ -50,13 +50,15 @@ void main(void) { <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; float metallic = getMaterialMetallic(mat); - vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } + */ + vec3 fresnel = mix(vec3(0.03), albedo, metallic); vec3 emissive = getMaterialEmissive(mat); <$evalMaterialEmissive(emissiveTex, emissive, matKey, emissive)$>; diff --git a/libraries/render-utils/src/model_translucent.slf b/libraries/render-utils/src/model_translucent.slf index 6cf99a68ef..8a0f9c76a9 100644 --- a/libraries/render-utils/src/model_translucent.slf +++ b/libraries/render-utils/src/model_translucent.slf @@ -50,13 +50,16 @@ void main(void) { <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; float metallic = getMaterialMetallic(mat); - vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } + */ + vec3 fresnel = mix(vec3(0.03), albedo, metallic); + vec3 emissive = getMaterialEmissive(mat); <$evalMaterialEmissive(emissiveTex, emissive, matKey, emissive)$>; diff --git a/libraries/render-utils/src/model_translucent_fade.slf b/libraries/render-utils/src/model_translucent_fade.slf index c46b396ebc..375e59acae 100644 --- a/libraries/render-utils/src/model_translucent_fade.slf +++ b/libraries/render-utils/src/model_translucent_fade.slf @@ -60,13 +60,15 @@ void main(void) { <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; float metallic = getMaterialMetallic(mat); - vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } + */ + vec3 fresnel = mix(vec3(0.03), albedo, metallic); vec3 emissive = getMaterialEmissive(mat); <$evalMaterialEmissive(emissiveTex, emissive, matKey, emissive)$>; diff --git a/libraries/render-utils/src/overlay3D_model.slf b/libraries/render-utils/src/overlay3D_model.slf index bb0d84a513..ab7427b175 100644 --- a/libraries/render-utils/src/overlay3D_model.slf +++ b/libraries/render-utils/src/overlay3D_model.slf @@ -46,13 +46,15 @@ void main(void) { albedo *= _color; float metallic = getMaterialMetallic(mat); - vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } + */ + vec3 fresnel = mix(vec3(0.03), albedo, metallic); float roughness = getMaterialRoughness(mat); <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; diff --git a/libraries/render-utils/src/overlay3D_model_translucent.slf b/libraries/render-utils/src/overlay3D_model_translucent.slf index 748eea329c..831ea157ed 100644 --- a/libraries/render-utils/src/overlay3D_model_translucent.slf +++ b/libraries/render-utils/src/overlay3D_model_translucent.slf @@ -44,13 +44,15 @@ void main(void) { albedo *= _color; float metallic = getMaterialMetallic(mat); - vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } + */ + vec3 fresnel = mix(vec3(0.03), albedo, metallic); float roughness = getMaterialRoughness(mat); <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; From 328fc29bc595faa62ef1ae69604d6fabebca7ece Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 1 Nov 2017 17:01:19 +1300 Subject: [PATCH 02/44] Fix serverScripts not being able to see entities in parent/child tree --- .../src/entities/EntityTreeSendThread.cpp | 14 +++++++++----- .../src/entities/EntityTreeSendThread.h | 3 ++- libraries/entities/src/DiffTraversal.cpp | 5 +++-- libraries/entities/src/DiffTraversal.h | 3 ++- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/assignment-client/src/entities/EntityTreeSendThread.cpp b/assignment-client/src/entities/EntityTreeSendThread.cpp index 03014bae6a..e96a9dc667 100644 --- a/assignment-client/src/entities/EntityTreeSendThread.cpp +++ b/assignment-client/src/entities/EntityTreeSendThread.cpp @@ -96,7 +96,7 @@ void EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O nodeData->copyCurrentViewFrustum(viewFrustum); EntityTreeElementPointer root = std::dynamic_pointer_cast(_myServer->getOctree()->getRoot()); int32_t lodLevelOffset = nodeData->getBoundaryLevelAdjust() + (viewFrustumChanged ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST); - startNewTraversal(viewFrustum, root, lodLevelOffset, nodeData->getUsesFrustum()); + startNewTraversal(viewFrustum, root, lodLevelOffset, nodeData->getUsesFrustum(), isFullScene); // When the viewFrustum changed the sort order may be incorrect, so we re-sort // and also use the opportunity to cull anything no longer in view @@ -175,7 +175,7 @@ bool EntityTreeSendThread::addAncestorsToExtraFlaggedEntities(const QUuid& filte return parentWasNew || ancestorsWereNew; } - // since we didn't have a parent niether of our parents or ancestors could be new additions + // since we didn't have a parent, neither of our parents or ancestors could be new additions return false; } @@ -204,8 +204,10 @@ bool EntityTreeSendThread::addDescendantsToExtraFlaggedEntities(const QUuid& fil return hasNewChild || hasNewDescendants; } -void EntityTreeSendThread::startNewTraversal(const ViewFrustum& view, EntityTreeElementPointer root, int32_t lodLevelOffset, bool usesViewFrustum) { - DiffTraversal::Type type = _traversal.prepareNewTraversal(view, root, lodLevelOffset, usesViewFrustum); +void EntityTreeSendThread::startNewTraversal(const ViewFrustum& view, EntityTreeElementPointer root, int32_t lodLevelOffset, + bool usesViewFrustum, bool isFullScene) { + + DiffTraversal::Type type = _traversal.prepareNewTraversal(view, root, lodLevelOffset, usesViewFrustum, isFullScene); // there are three types of traversal: // // (1) FirstTime = at login --> find everything in view @@ -423,12 +425,14 @@ bool EntityTreeSendThread::traverseTreeAndBuildNextPacketPayload(EncodeBitstream uint64_t sendTime = usecTimestampNow(); auto nodeData = static_cast(params.nodeData); nodeData->stats.encodeStarted(); + auto entityNodeData = static_cast(_node.toStrongRef()->getLinkedData()); while(!_sendQueue.empty()) { PrioritizedEntity queuedItem = _sendQueue.top(); EntityItemPointer entity = queuedItem.getEntity(); if (entity) { // Only send entities that match the jsonFilters, but keep track of everything we've tried to send so we don't try to send it again - if (entity->matchesJSONFilters(jsonFilters)) { + if (entity->matchesJSONFilters(jsonFilters) || entityNodeData->isEntityFlaggedAsExtra(entity->getID())) { + entityNodeData->insertSentFilteredEntity(entity->getID()); OctreeElement::AppendState appendEntityState = entity->appendEntityData(&_packetData, params, _extraEncodeData); if (appendEntityState != OctreeElement::COMPLETED) { diff --git a/assignment-client/src/entities/EntityTreeSendThread.h b/assignment-client/src/entities/EntityTreeSendThread.h index 49901491ff..1781de9890 100644 --- a/assignment-client/src/entities/EntityTreeSendThread.h +++ b/assignment-client/src/entities/EntityTreeSendThread.h @@ -38,7 +38,8 @@ private: bool addAncestorsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData); bool addDescendantsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData); - void startNewTraversal(const ViewFrustum& viewFrustum, EntityTreeElementPointer root, int32_t lodLevelOffset, bool usesViewFrustum); + void startNewTraversal(const ViewFrustum& viewFrustum, EntityTreeElementPointer root, int32_t lodLevelOffset, + bool usesViewFrustum, bool isFullScene); bool traverseTreeAndBuildNextPacketPayload(EncodeBitstreamParams& params, const QJsonObject& jsonFilters) override; void preDistributionProcessing() override; diff --git a/libraries/entities/src/DiffTraversal.cpp b/libraries/entities/src/DiffTraversal.cpp index 2f9423daa3..9b16ee90bf 100644 --- a/libraries/entities/src/DiffTraversal.cpp +++ b/libraries/entities/src/DiffTraversal.cpp @@ -142,7 +142,8 @@ DiffTraversal::DiffTraversal() { _path.reserve(MIN_PATH_DEPTH); } -DiffTraversal::Type DiffTraversal::prepareNewTraversal(const ViewFrustum& viewFrustum, EntityTreeElementPointer root, int32_t lodLevelOffset, bool usesViewFrustum) { +DiffTraversal::Type DiffTraversal::prepareNewTraversal(const ViewFrustum& viewFrustum, EntityTreeElementPointer root, + int32_t lodLevelOffset, bool usesViewFrustum, bool isFullScene) { assert(root); // there are three types of traversal: // @@ -163,7 +164,7 @@ DiffTraversal::Type DiffTraversal::prepareNewTraversal(const ViewFrustum& viewFr Type type; // If usesViewFrustum changes, treat it as a First traversal - if (_completedView.startTime == 0 || _currentView.usesViewFrustum != _completedView.usesViewFrustum) { + if (_completedView.startTime == 0 || _currentView.usesViewFrustum != _completedView.usesViewFrustum || isFullScene) { type = Type::First; _currentView.viewFrustum = viewFrustum; _currentView.lodScaleFactor = lodScaleFactor; diff --git a/libraries/entities/src/DiffTraversal.h b/libraries/entities/src/DiffTraversal.h index c26e48ae5f..becf322fd5 100644 --- a/libraries/entities/src/DiffTraversal.h +++ b/libraries/entities/src/DiffTraversal.h @@ -57,7 +57,8 @@ public: DiffTraversal(); - Type prepareNewTraversal(const ViewFrustum& viewFrustum, EntityTreeElementPointer root, int32_t lodLevelOffset, bool usesViewFrustum); + Type prepareNewTraversal(const ViewFrustum& viewFrustum, EntityTreeElementPointer root, int32_t lodLevelOffset, + bool usesViewFrustum, bool isFullScene); const ViewFrustum& getCurrentView() const { return _currentView.viewFrustum; } const ViewFrustum& getCompletedView() const { return _completedView.viewFrustum; } From da63e85699c62271145962f7a1b1d95ab87a70f4 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 1 Nov 2017 09:17:04 -0700 Subject: [PATCH 03/44] Bug 8270 fixed --- libraries/animation/src/AnimClip.h | 1 + libraries/animation/src/Rig.cpp | 21 +++++++++++++++++++ libraries/animation/src/Rig.h | 2 ++ .../src/avatars-renderer/Avatar.cpp | 12 +++++++++++ .../src/avatars-renderer/Avatar.h | 3 +++ 5 files changed, 39 insertions(+) diff --git a/libraries/animation/src/AnimClip.h b/libraries/animation/src/AnimClip.h index c7e7ebf3ee..7121cff356 100644 --- a/libraries/animation/src/AnimClip.h +++ b/libraries/animation/src/AnimClip.h @@ -54,6 +54,7 @@ public: void setMirrorFlag(bool mirrorFlag) { _mirrorFlag = mirrorFlag; } void loadURL(const QString& url); + const QString& getURL() { return _url; } protected: virtual void setCurrentFrameInternal(float frame) override; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 0f2bce5ca4..8293cb91f4 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -144,6 +144,27 @@ QStringList Rig::getAnimationRoles() const { } } +QVector> Rig::getAnimationClips() const { + QVector> list; + if (_animNode) { + _animNode->traverse([&](AnimNode::Pointer node) { + // only report clip nodes as valid roles. + auto clipNode = std::dynamic_pointer_cast(node); + if (clipNode) { + // filter out the userAnims, they are for internal use only. + if (!clipNode->getID().startsWith("userAnim")) { + list.append(clipNode); + } + } + return true; + }); + return list; + } + else { + return list; + } +} + void Rig::overrideRoleAnimation(const QString& role, const QString& url, float fps, bool loop, float firstFrame, float lastFrame) { if (_animNode) { AnimNode::Pointer node = _animNode->findByName(role); diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 18d49c5f1e..9290b41513 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -21,6 +21,7 @@ #include #include +#include "AnimClip.h" #include "AnimNode.h" #include "AnimNodeLoader.h" #include "SimpleMovingAverage.h" @@ -107,6 +108,7 @@ public: QStringList getAnimationRoles() const; void overrideRoleAnimation(const QString& role, const QString& url, float fps, bool loop, float firstFrame, float lastFrame); void restoreRoleAnimation(const QString& role); + QVector> getAnimationClips() const; void initJointStates(const FBXGeometry& geometry, const glm::mat4& modelOffset); void reset(const FBXGeometry& geometry); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 142e57c9e5..0d2e730a1a 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -139,6 +139,7 @@ Avatar::~Avatar() { void Avatar::init() { getHead()->init(); _skeletonModel->init(); + connect(&_skeletonModel->getRig(), &Rig::onLoadComplete, this, &Avatar::restoreAnimations); _initialized = true; } @@ -198,6 +199,16 @@ void Avatar::setTargetScale(float targetScale) { } } +void Avatar::restoreAnimations() { + for (int i = 0; i < _animationCache.size(); i++) { + auto clip = _animationCache[i]; + const float REFERENCE_FRAMES_PER_SECOND = 30.0f; + float fps = REFERENCE_FRAMES_PER_SECOND / clip->getTimeScale(); + qDebug() << clip->getID() << " " << clip->getURL() << " " << fps << " " << clip->getLoopFlag() << " " << clip->getStartFrame() << " " << clip->getEndFrame(); + _skeletonModel->getRig().overrideRoleAnimation(clip->getID(), clip->getURL(), fps, clip->getLoopFlag(), clip->getStartFrame(), clip->getEndFrame()); + } +} + void Avatar::updateAvatarEntities() { PerformanceTimer perfTimer("attachments"); // - if queueEditEntityMessage sees clientOnly flag it does _myAvatar->updateAvatarEntity() @@ -1177,6 +1188,7 @@ void Avatar::scaleVectorRelativeToPosition(glm::vec3 &positionToScale) const { } void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { + _animationCache = _skeletonModel->getRig().getAnimationClips(); AvatarData::setSkeletonModelURL(skeletonModelURL); if (QThread::currentThread() == thread()) { _skeletonModel->setURL(_skeletonModelURL); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index a5ec307c50..09e1451aa9 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -274,6 +274,7 @@ public slots: glm::vec3 getRightPalmPosition() const; glm::quat getRightPalmRotation() const; + void restoreAnimations(); void setModelURLFinished(bool success); protected: @@ -377,6 +378,8 @@ private: float _displayNameTargetAlpha { 1.0f }; float _displayNameAlpha { 1.0f }; + + QVector> _animationCache; }; #endif // hifi_Avatar_h From 76e06a62143c24f510d8474c960ecda323ef7194 Mon Sep 17 00:00:00 2001 From: howard-stearns Date: Wed, 1 Nov 2017 15:28:28 -0700 Subject: [PATCH 04/44] Update to stable-v-staging metaverse switching, to handle marketplace injection. --- scripts/system/html/js/marketplacesInject.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/system/html/js/marketplacesInject.js b/scripts/system/html/js/marketplacesInject.js index 4b127baef8..dc0c610ace 100644 --- a/scripts/system/html/js/marketplacesInject.js +++ b/scripts/system/html/js/marketplacesInject.js @@ -89,7 +89,7 @@ window.location = "https://clara.io/library?gameCheck=true&public=true"; }); $('#exploreHifiMarketplace').on('click', function () { - window.location = "http://www.highfidelity.com/marketplace"; + window.location = metaverseServerURL + "/marketplace"; }); } @@ -612,9 +612,9 @@ var HIFI_ITEM_PAGE = 3; var pageType = DIRECTORY; - if (location.href.indexOf("highfidelity.com/") !== -1) { pageType = HIFI; } + if (location.href.indexOf(metaverseServerURL + "/") !== -1) { pageType = HIFI; } if (location.href.indexOf("clara.io/") !== -1) { pageType = CLARA; } - if (location.href.indexOf("highfidelity.com/marketplace/items/") !== -1) { pageType = HIFI_ITEM_PAGE; } + if (location.href.indexOf(metaverseServerURL + "/marketplace/items/") !== -1) { pageType = HIFI_ITEM_PAGE; } injectCommonCode(pageType === DIRECTORY); switch (pageType) { From 67552d2b7de3ae8ec71db3bb3563d77a2b82da5d Mon Sep 17 00:00:00 2001 From: Nissim Hadar Date: Wed, 1 Nov 2017 17:39:37 -0700 Subject: [PATCH 05/44] Change stencil mask used with Haze. --- libraries/render-utils/src/DrawHaze.cpp | 2 +- libraries/render-utils/src/StencilMaskPass.cpp | 5 +++++ libraries/render-utils/src/StencilMaskPass.h | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/DrawHaze.cpp b/libraries/render-utils/src/DrawHaze.cpp index 7cf07d8f33..dba35cbb3c 100644 --- a/libraries/render-utils/src/DrawHaze.cpp +++ b/libraries/render-utils/src/DrawHaze.cpp @@ -140,7 +140,7 @@ void DrawHaze::run(const render::RenderContextPointer& renderContext, const Inpu gpu::StatePointer state = gpu::StatePointer(new gpu::State()); // Mask out haze on the tablet - PrepareStencil::testNoAA(*state); + PrepareStencil::testMaskNoAA(*state); gpu::Shader::BindingSet slotBindings; slotBindings.insert(gpu::Shader::Binding(std::string("hazeBuffer"), HazeEffect_ParamsSlot)); diff --git a/libraries/render-utils/src/StencilMaskPass.cpp b/libraries/render-utils/src/StencilMaskPass.cpp index 0e0d8b56b3..f9305d8268 100644 --- a/libraries/render-utils/src/StencilMaskPass.cpp +++ b/libraries/render-utils/src/StencilMaskPass.cpp @@ -128,6 +128,11 @@ void PrepareStencil::testNoAA(gpu::State& state) { gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP)); } +void PrepareStencil::testMaskNoAA(gpu::State& state) { + state.setStencilTest(true, 0x00, gpu::State::StencilTest(0, STENCIL_MASK | STENCIL_NO_AA, gpu::EQUAL, + gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP)); +} + // Pass if this area WAS marked as BACKGROUND // (see: model/src/Skybox.cpp, procedural/src/ProceduralSkybox.cpp) void PrepareStencil::testBackground(gpu::State& state) { diff --git a/libraries/render-utils/src/StencilMaskPass.h b/libraries/render-utils/src/StencilMaskPass.h index ddbf4a7ac0..18ec104ff5 100644 --- a/libraries/render-utils/src/StencilMaskPass.h +++ b/libraries/render-utils/src/StencilMaskPass.h @@ -49,8 +49,9 @@ public: static void drawMask(gpu::State& state); static void drawBackground(gpu::State& state); - static void testNoAA(gpu::State& state); static void testMask(gpu::State& state); + static void testNoAA(gpu::State& state); + static void testMaskNoAA(gpu::State& state); static void testBackground(gpu::State& state); static void testShape(gpu::State& state); static void testMaskDrawShape(gpu::State& state); From 455f2ad2776d50d84c83ac5e1f92ccd271e39ca9 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 1 Nov 2017 18:14:36 -0700 Subject: [PATCH 06/44] trying to change the root transorm update --- libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 142e57c9e5..f9f2fd868a 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -728,8 +728,9 @@ void Avatar::simulateAttachments(float deltaTime) { glm::quat jointRotation; if (attachment.isSoft) { // soft attachments do not have transform offsets - model->setTranslation(getPosition()); - model->setRotation(getOrientation() * Quaternions::Y_180); + // model->setTranslation(getPosition()); + // model->setRotation(getOrientation() * Quaternions::Y_180); + model->setTransformNoUpdateRenderItems(Transform(getOrientation() * Quaternions::Y_180, glm::vec3(1.0), getPosition()); model->simulate(deltaTime); } else { if (_skeletonModel->getJointPositionInWorldFrame(jointIndex, jointPosition) && From 6a2dc38fdd402e42b648a74b2254387f85ae1665 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 1 Nov 2017 19:38:37 -0700 Subject: [PATCH 07/44] restoring previous roles --- libraries/animation/src/Rig.cpp | 30 +++++-------------- libraries/animation/src/Rig.h | 17 +++++++++-- .../src/avatars-renderer/Avatar.cpp | 12 -------- .../src/avatars-renderer/Avatar.h | 4 +-- 4 files changed, 24 insertions(+), 39 deletions(-) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 8293cb91f4..e16afc65c2 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -144,27 +144,6 @@ QStringList Rig::getAnimationRoles() const { } } -QVector> Rig::getAnimationClips() const { - QVector> list; - if (_animNode) { - _animNode->traverse([&](AnimNode::Pointer node) { - // only report clip nodes as valid roles. - auto clipNode = std::dynamic_pointer_cast(node); - if (clipNode) { - // filter out the userAnims, they are for internal use only. - if (!clipNode->getID().startsWith("userAnim")) { - list.append(clipNode); - } - } - return true; - }); - return list; - } - else { - return list; - } -} - void Rig::overrideRoleAnimation(const QString& role, const QString& url, float fps, bool loop, float firstFrame, float lastFrame) { if (_animNode) { AnimNode::Pointer node = _animNode->findByName(role); @@ -173,6 +152,7 @@ void Rig::overrideRoleAnimation(const QString& role, const QString& url, float f const float REFERENCE_FRAMES_PER_SECOND = 30.0f; float timeScale = fps / REFERENCE_FRAMES_PER_SECOND; auto clipNode = std::make_shared(role, url, firstFrame, lastFrame, timeScale, loop, false); + _roleAnimState[role] = { role, url, fps, loop, firstFrame, lastFrame }; AnimNode::Pointer parent = node->getParent(); parent->replaceChild(node, clipNode); } else { @@ -1659,8 +1639,14 @@ void Rig::initAnimGraph(const QUrl& url) { _userAnimState = { UserAnimState::None, "", 30.0f, false, 0.0f, 0.0f }; overrideAnimation(origState.url, origState.fps, origState.loop, origState.firstFrame, origState.lastFrame); } + // restore the role animations we had before reset. + for (auto ite = _roleAnimState.begin(); ite != _roleAnimState.end(); ite++) { + auto role = ite->first; + auto roleState = _roleAnimState[role]; + overrideRoleAnimation(roleState.role, roleState.url, roleState.fps, roleState.loop, roleState.firstFrame, roleState.lastFrame); + } _animLoading = false; - + emit onLoadComplete(); }); connect(_animLoader.get(), &AnimNodeLoader::error, [url](int error, QString str) { diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 9290b41513..a63d5eb0a5 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -21,7 +21,6 @@ #include #include -#include "AnimClip.h" #include "AnimNode.h" #include "AnimNodeLoader.h" #include "SimpleMovingAverage.h" @@ -108,7 +107,7 @@ public: QStringList getAnimationRoles() const; void overrideRoleAnimation(const QString& role, const QString& url, float fps, bool loop, float firstFrame, float lastFrame); void restoreRoleAnimation(const QString& role); - QVector> getAnimationClips() const; + //QVector> getAnimationClips() const; void initJointStates(const FBXGeometry& geometry, const glm::mat4& modelOffset); void reset(const FBXGeometry& geometry); @@ -337,8 +336,22 @@ protected: float firstFrame; float lastFrame; }; + + struct RoleAnimState { + RoleAnimState() {} + RoleAnimState(const QString& roleId, const QString& urlIn, float fpsIn, bool loopIn, float firstFrameIn, float lastFrameIn) : + role(roleId), url(urlIn), fps(fpsIn), loop(loopIn), firstFrame(firstFrameIn), lastFrame(lastFrameIn) {} + + QString role; + QString url; + float fps; + bool loop; + float firstFrame; + float lastFrame; + }; UserAnimState _userAnimState; + std::map _roleAnimState; float _leftHandOverlayAlpha { 0.0f }; float _rightHandOverlayAlpha { 0.0f }; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 0d2e730a1a..142e57c9e5 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -139,7 +139,6 @@ Avatar::~Avatar() { void Avatar::init() { getHead()->init(); _skeletonModel->init(); - connect(&_skeletonModel->getRig(), &Rig::onLoadComplete, this, &Avatar::restoreAnimations); _initialized = true; } @@ -199,16 +198,6 @@ void Avatar::setTargetScale(float targetScale) { } } -void Avatar::restoreAnimations() { - for (int i = 0; i < _animationCache.size(); i++) { - auto clip = _animationCache[i]; - const float REFERENCE_FRAMES_PER_SECOND = 30.0f; - float fps = REFERENCE_FRAMES_PER_SECOND / clip->getTimeScale(); - qDebug() << clip->getID() << " " << clip->getURL() << " " << fps << " " << clip->getLoopFlag() << " " << clip->getStartFrame() << " " << clip->getEndFrame(); - _skeletonModel->getRig().overrideRoleAnimation(clip->getID(), clip->getURL(), fps, clip->getLoopFlag(), clip->getStartFrame(), clip->getEndFrame()); - } -} - void Avatar::updateAvatarEntities() { PerformanceTimer perfTimer("attachments"); // - if queueEditEntityMessage sees clientOnly flag it does _myAvatar->updateAvatarEntity() @@ -1188,7 +1177,6 @@ void Avatar::scaleVectorRelativeToPosition(glm::vec3 &positionToScale) const { } void Avatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { - _animationCache = _skeletonModel->getRig().getAnimationClips(); AvatarData::setSkeletonModelURL(skeletonModelURL); if (QThread::currentThread() == thread()) { _skeletonModel->setURL(_skeletonModelURL); diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index 09e1451aa9..a06ba0fb82 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -274,7 +274,7 @@ public slots: glm::vec3 getRightPalmPosition() const; glm::quat getRightPalmRotation() const; - void restoreAnimations(); + //void restoreAnimations(); void setModelURLFinished(bool success); protected: @@ -378,8 +378,6 @@ private: float _displayNameTargetAlpha { 1.0f }; float _displayNameAlpha { 1.0f }; - - QVector> _animationCache; }; #endif // hifi_Avatar_h From e201e82ec26aa0ce28b63a1bf36b6c0828e9e6fd Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 1 Nov 2017 19:45:56 -0700 Subject: [PATCH 08/44] formatting --- libraries/animation/src/AnimClip.h | 1 - libraries/animation/src/Rig.cpp | 2 +- libraries/avatars-renderer/src/avatars-renderer/Avatar.h | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/animation/src/AnimClip.h b/libraries/animation/src/AnimClip.h index 7121cff356..c7e7ebf3ee 100644 --- a/libraries/animation/src/AnimClip.h +++ b/libraries/animation/src/AnimClip.h @@ -54,7 +54,6 @@ public: void setMirrorFlag(bool mirrorFlag) { _mirrorFlag = mirrorFlag; } void loadURL(const QString& url); - const QString& getURL() { return _url; } protected: virtual void setCurrentFrameInternal(float frame) override; diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index e16afc65c2..9df12de540 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -1646,7 +1646,7 @@ void Rig::initAnimGraph(const QUrl& url) { overrideRoleAnimation(roleState.role, roleState.url, roleState.fps, roleState.loop, roleState.firstFrame, roleState.lastFrame); } _animLoading = false; - + emit onLoadComplete(); }); connect(_animLoader.get(), &AnimNodeLoader::error, [url](int error, QString str) { diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index a06ba0fb82..a5ec307c50 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -274,7 +274,6 @@ public slots: glm::vec3 getRightPalmPosition() const; glm::quat getRightPalmRotation() const; - //void restoreAnimations(); void setModelURLFinished(bool success); protected: From 9e0e1ab5a54c85f3721a629aee5e2e9e67e3dae4 Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Wed, 1 Nov 2017 19:56:16 -0700 Subject: [PATCH 09/44] erase comment --- libraries/animation/src/Rig.h | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index a63d5eb0a5..8ca701ec2d 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -107,7 +107,6 @@ public: QStringList getAnimationRoles() const; void overrideRoleAnimation(const QString& role, const QString& url, float fps, bool loop, float firstFrame, float lastFrame); void restoreRoleAnimation(const QString& role); - //QVector> getAnimationClips() const; void initJointStates(const FBXGeometry& geometry, const glm::mat4& modelOffset); void reset(const FBXGeometry& geometry); From 2e6c849b63f55f453c08a9da64271dfcbbc1857c Mon Sep 17 00:00:00 2001 From: Nissim Hadar Date: Wed, 1 Nov 2017 20:31:44 -0700 Subject: [PATCH 10/44] Added comment. --- libraries/render-utils/src/StencilMaskPass.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/render-utils/src/StencilMaskPass.cpp b/libraries/render-utils/src/StencilMaskPass.cpp index f9305d8268..79833795e9 100644 --- a/libraries/render-utils/src/StencilMaskPass.cpp +++ b/libraries/render-utils/src/StencilMaskPass.cpp @@ -128,6 +128,7 @@ void PrepareStencil::testNoAA(gpu::State& state) { gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP)); } +// Pass if this area has been marked as MASK or NO_AA void PrepareStencil::testMaskNoAA(gpu::State& state) { state.setStencilTest(true, 0x00, gpu::State::StencilTest(0, STENCIL_MASK | STENCIL_NO_AA, gpu::EQUAL, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP)); From 56510abd1ebadf399ffb58a5aec1dba6622b1fcd Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 2 Nov 2017 03:45:27 -0700 Subject: [PATCH 11/44] Trying to set the ClusterBuffer in the render loop instead of the game loop --- .../src/avatars-renderer/Avatar.cpp | 3 +- .../src/CauterizedMeshPartPayload.cpp | 27 +++++++++- .../src/CauterizedMeshPartPayload.h | 2 + .../render-utils/src/CauterizedModel.cpp | 49 ++++++++++++++----- .../render-utils/src/MeshPartPayload.cpp | 17 ++++++- libraries/render-utils/src/MeshPartPayload.h | 1 + libraries/render-utils/src/Model.cpp | 35 +++++++++---- .../render-utils/src/SoftAttachmentModel.cpp | 4 +- 8 files changed, 112 insertions(+), 26 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index f9f2fd868a..bbd0110c11 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -730,8 +730,9 @@ void Avatar::simulateAttachments(float deltaTime) { // soft attachments do not have transform offsets // model->setTranslation(getPosition()); // model->setRotation(getOrientation() * Quaternions::Y_180); - model->setTransformNoUpdateRenderItems(Transform(getOrientation() * Quaternions::Y_180, glm::vec3(1.0), getPosition()); + model->setTransformNoUpdateRenderItems(Transform(getOrientation() * Quaternions::Y_180, glm::vec3(1.0), getPosition())); model->simulate(deltaTime); + model->updateRenderItems(); } else { if (_skeletonModel->getJointPositionInWorldFrame(jointIndex, jointPosition) && _skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRotation)) { diff --git a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp index 07628904f1..068eb03378 100644 --- a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp +++ b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp @@ -20,11 +20,36 @@ using namespace render; CauterizedMeshPartPayload::CauterizedMeshPartPayload(ModelPointer model, int meshIndex, int partIndex, int shapeIndex, const Transform& transform, const Transform& offsetTransform) : ModelMeshPartPayload(model, meshIndex, partIndex, shapeIndex, transform, offsetTransform) {} +void CauterizedMeshPartPayload::updateClusterBuffer(const QVector& clusterMatrices, const QVector& cauterizedClusterMatrices) { + + // Once computed the cluster matrices, update the buffer(s) + if (clusterMatrices.size() > 1) { + if (!_clusterBuffer) { + _clusterBuffer = std::make_shared(clusterMatrices.size() * sizeof(glm::mat4), + (const gpu::Byte*) clusterMatrices.constData()); + } else { + _clusterBuffer->setSubData(0, clusterMatrices.size() * sizeof(glm::mat4), + (const gpu::Byte*) clusterMatrices.constData()); + } + } + + if (cauterizedClusterMatrices.size() > 1) { + if (!_cauterizedClusterBuffer) { + _cauterizedClusterBuffer = std::make_shared(cauterizedClusterMatrices.size() * sizeof(glm::mat4), + (const gpu::Byte*) cauterizedClusterMatrices.constData()); + } + else { + _cauterizedClusterBuffer->setSubData(0, clusterMatrices.size() * sizeof(glm::mat4), + (const gpu::Byte*) clusterMatrices.constData()); + } + } +} + void CauterizedMeshPartPayload::updateTransformForCauterizedMesh( const Transform& renderTransform, const gpu::BufferPointer& buffer) { _cauterizedTransform = renderTransform; - _cauterizedClusterBuffer = buffer; + // _cauterizedClusterBuffer = buffer; } void CauterizedMeshPartPayload::bindTransform(gpu::Batch& batch, const render::ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const { diff --git a/libraries/render-utils/src/CauterizedMeshPartPayload.h b/libraries/render-utils/src/CauterizedMeshPartPayload.h index 5e3135ea84..4bd20461eb 100644 --- a/libraries/render-utils/src/CauterizedMeshPartPayload.h +++ b/libraries/render-utils/src/CauterizedMeshPartPayload.h @@ -15,6 +15,8 @@ class CauterizedMeshPartPayload : public ModelMeshPartPayload { public: CauterizedMeshPartPayload(ModelPointer model, int meshIndex, int partIndex, int shapeIndex, const Transform& transform, const Transform& offsetTransform); + void updateClusterBuffer(const QVector& clusterMatrices, const QVector& cauterizedClusterMatrices); + void updateTransformForCauterizedMesh(const Transform& renderTransform, const gpu::BufferPointer& buffer); void bindTransform(gpu::Batch& batch, const render::ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const override; diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 47ada457a0..28993dd4f0 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -111,6 +111,7 @@ void CauterizedModel::updateClusterMatrices() { glm_mat4u_mul(jointMatrix, cluster.inverseBindMatrix, state.clusterMatrices[j]); } + /* // Once computed the cluster matrices, update the buffer(s) if (mesh.clusters.size() > 1) { if (!state.clusterBuffer) { @@ -121,6 +122,7 @@ void CauterizedModel::updateClusterMatrices() { (const gpu::Byte*) state.clusterMatrices.constData()); } } + */ } // as an optimization, don't build cautrizedClusterMatrices if the boneSet is empty. @@ -143,7 +145,7 @@ void CauterizedModel::updateClusterMatrices() { } glm_mat4u_mul(jointMatrix, cluster.inverseBindMatrix, state.clusterMatrices[j]); } - +/* if (!_cauterizeBoneSet.empty() && (state.clusterMatrices.size() > 1)) { if (!state.clusterBuffer) { state.clusterBuffer = @@ -153,7 +155,7 @@ void CauterizedModel::updateClusterMatrices() { state.clusterBuffer->setSubData(0, state.clusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) state.clusterMatrices.constData()); } - } + }*/ } } @@ -181,7 +183,7 @@ void CauterizedModel::updateRenderItems() { // queue up this work for later processing, at the end of update and just before rendering. // the application will ensure only the last lambda is actually invoked. void* key = (void*)this; - std::weak_ptr weakSelf = shared_from_this(); + std::weak_ptr weakSelf = std::dynamic_pointer_cast(shared_from_this()); AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [weakSelf, scale]() { // do nothing, if the model has already been destroyed. auto self = weakSelf.lock(); @@ -203,33 +205,58 @@ void CauterizedModel::updateRenderItems() { uint32_t deleteGeometryCounter = self->getGeometryCounter(); + if (!self->isLoaded()) { + return; + } render::Transaction transaction; QList keys = self->getRenderItems().keys(); + int meshIndex{ 0 }; foreach (auto itemID, keys) { - transaction.updateItem(itemID, [modelTransform, deleteGeometryCounter](CauterizedMeshPartPayload& data) { - ModelPointer model = data._model.lock(); - if (model && model->isLoaded()) { + const Model::MeshState& state = self->getMeshState(meshIndex); + auto clusterMatrices(state.clusterMatrices); + const Model::MeshState& cState = self->getCauterizeMeshState(meshIndex); + auto clusterMatricesCauterized(cState.clusterMatrices); + + transaction.updateItem(itemID, [modelTransform, deleteGeometryCounter, clusterMatrices, clusterMatricesCauterized](CauterizedMeshPartPayload& data) { + // ModelPointer model = data._model.lock(); + // if (model && model->isLoaded()) { // Ensure the model geometry was not reset between frames - if (deleteGeometryCounter == model->getGeometryCounter()) { + // if (deleteGeometryCounter == model->getGeometryCounter()) { + data.updateClusterBuffer(clusterMatrices, clusterMatricesCauterized); + // this stuff identical to what happens in regular Model - const Model::MeshState& state = model->getMeshState(data._meshIndex); + /*const Model::MeshState& state = model->getMeshState(data._meshIndex); Transform renderTransform = modelTransform; if (state.clusterMatrices.size() == 1) { renderTransform = modelTransform.worldTransform(Transform(state.clusterMatrices[0])); } data.updateTransformForSkinnedMesh(renderTransform, modelTransform, state.clusterBuffer); + */ + Transform renderTransform = modelTransform; + if (clusterMatrices.size() == 1) { + renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); + } + data.updateTransformForSkinnedMesh(renderTransform, modelTransform, nullptr); + // this stuff for cauterized mesh - CauterizedModel* cModel = static_cast(model.get()); + /*CauterizedModel* cModel = static_cast(model.get()); const Model::MeshState& cState = cModel->getCauterizeMeshState(data._meshIndex); renderTransform = modelTransform; if (cState.clusterMatrices.size() == 1) { renderTransform = modelTransform.worldTransform(Transform(cState.clusterMatrices[0])); } data.updateTransformForCauterizedMesh(renderTransform, cState.clusterBuffer); - } - } + */ + renderTransform = modelTransform; + if (clusterMatricesCauterized.size() == 1) { + renderTransform = modelTransform.worldTransform(Transform(clusterMatricesCauterized[0])); + } + data.updateTransformForCauterizedMesh(renderTransform, nullptr); + // } + // } }); + meshIndex++; } scene->enqueueTransaction(transaction); diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 8b65c9f7ce..abb0d299e1 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -367,12 +367,27 @@ void ModelMeshPartPayload::notifyLocationChanged() { } + +void ModelMeshPartPayload::updateClusterBuffer(const QVector& clusterMatrices) { + // Once computed the cluster matrices, update the buffer(s) + if (clusterMatrices.size() > 1) { + if (!_clusterBuffer) { + _clusterBuffer = std::make_shared(clusterMatrices.size() * sizeof(glm::mat4), + (const gpu::Byte*) clusterMatrices.constData()); + } + else { + _clusterBuffer->setSubData(0, clusterMatrices.size() * sizeof(glm::mat4), + (const gpu::Byte*) clusterMatrices.constData()); + } + } +} + void ModelMeshPartPayload::updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform, const gpu::BufferPointer& buffer) { _transform = renderTransform; _worldBound = _adjustedLocalBound; _worldBound.transform(boundTransform); - _clusterBuffer = buffer; + // _clusterBuffer = buffer; } ItemKey ModelMeshPartPayload::getKey() const { diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 99c14510b5..0e8464f873 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -87,6 +87,7 @@ public: typedef Payload::DataPointer Pointer; void notifyLocationChanged() override; + void updateClusterBuffer(const QVector& clusterMatrices); void updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform, const gpu::BufferPointer& buffer); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 97f62a3ce0..cbb27f0498 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -240,22 +240,37 @@ void Model::updateRenderItems() { uint32_t deleteGeometryCounter = self->_deleteGeometryCounter; render::Transaction transaction; + int meshIndex{ 0 }; foreach (auto itemID, self->_modelMeshRenderItemsMap.keys()) { - transaction.updateItem(itemID, [deleteGeometryCounter, modelTransform](ModelMeshPartPayload& data) { - ModelPointer model = data._model.lock(); - if (model && model->isLoaded()) { - // Ensure the model geometry was not reset between frames - if (deleteGeometryCounter == model->_deleteGeometryCounter) { + const Model::MeshState& state = self->getMeshState(meshIndex); + auto clusterMatrices(state.clusterMatrices); - const Model::MeshState& state = model->getMeshState(data._meshIndex); + transaction.updateItem(itemID, [deleteGeometryCounter, modelTransform, clusterMatrices](ModelMeshPartPayload& data) { + // ModelPointer model = data._model.lock(); + // if (model && model->isLoaded()) { + // Ensure the model geometry was not reset between frames + // if (deleteGeometryCounter == model->_deleteGeometryCounter) { + + /*const Model::MeshState& state = model->getMeshState(data._meshIndex); Transform renderTransform = modelTransform; if (state.clusterMatrices.size() == 1) { renderTransform = modelTransform.worldTransform(Transform(state.clusterMatrices[0])); } data.updateTransformForSkinnedMesh(renderTransform, modelTransform, state.clusterBuffer); - } - } + */ + + data.updateClusterBuffer(clusterMatrices); + + Transform renderTransform = modelTransform; + if (clusterMatrices.size() == 1) { + renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); + } + data.updateTransformForSkinnedMesh(renderTransform, modelTransform, nullptr); + + // } + // } }); + meshIndex++; } Transform collisionMeshOffset; @@ -1136,7 +1151,7 @@ void Model::updateClusterMatrices() { glm_mat4u_mul(jointMatrix, cluster.inverseBindMatrix, state.clusterMatrices[j]); } - // Once computed the cluster matrices, update the buffer(s) + /* // Once computed the cluster matrices, update the buffer(s) if (mesh.clusters.size() > 1) { if (!state.clusterBuffer) { state.clusterBuffer = std::make_shared(state.clusterMatrices.size() * sizeof(glm::mat4), @@ -1145,7 +1160,7 @@ void Model::updateClusterMatrices() { state.clusterBuffer->setSubData(0, state.clusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) state.clusterMatrices.constData()); } - } + }*/ } // post the blender if we're not currently waiting for one to finish diff --git a/libraries/render-utils/src/SoftAttachmentModel.cpp b/libraries/render-utils/src/SoftAttachmentModel.cpp index 63b18d49b8..975d099ac3 100644 --- a/libraries/render-utils/src/SoftAttachmentModel.cpp +++ b/libraries/render-utils/src/SoftAttachmentModel.cpp @@ -62,7 +62,7 @@ void SoftAttachmentModel::updateClusterMatrices() { } // Once computed the cluster matrices, update the buffer(s) - if (mesh.clusters.size() > 1) { + /* if (mesh.clusters.size() > 1) { if (!state.clusterBuffer) { state.clusterBuffer = std::make_shared(state.clusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) state.clusterMatrices.constData()); @@ -70,7 +70,7 @@ void SoftAttachmentModel::updateClusterMatrices() { state.clusterBuffer->setSubData(0, state.clusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) state.clusterMatrices.constData()); } - } + }*/ } // post the blender if we're not currently waiting for one to finish From 81509b3e92e4a13b3129a97a6ef71e5fcc15869e Mon Sep 17 00:00:00 2001 From: luiscuenca Date: Thu, 2 Nov 2017 10:34:57 -0700 Subject: [PATCH 12/44] coding standard --- libraries/animation/src/Rig.cpp | 7 +++---- libraries/animation/src/Rig.h | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/libraries/animation/src/Rig.cpp b/libraries/animation/src/Rig.cpp index 9df12de540..acf7bf81d8 100644 --- a/libraries/animation/src/Rig.cpp +++ b/libraries/animation/src/Rig.cpp @@ -152,7 +152,7 @@ void Rig::overrideRoleAnimation(const QString& role, const QString& url, float f const float REFERENCE_FRAMES_PER_SECOND = 30.0f; float timeScale = fps / REFERENCE_FRAMES_PER_SECOND; auto clipNode = std::make_shared(role, url, firstFrame, lastFrame, timeScale, loop, false); - _roleAnimState[role] = { role, url, fps, loop, firstFrame, lastFrame }; + _roleAnimStates[role] = { role, url, fps, loop, firstFrame, lastFrame }; AnimNode::Pointer parent = node->getParent(); parent->replaceChild(node, clipNode); } else { @@ -1640,9 +1640,8 @@ void Rig::initAnimGraph(const QUrl& url) { overrideAnimation(origState.url, origState.fps, origState.loop, origState.firstFrame, origState.lastFrame); } // restore the role animations we had before reset. - for (auto ite = _roleAnimState.begin(); ite != _roleAnimState.end(); ite++) { - auto role = ite->first; - auto roleState = _roleAnimState[role]; + for (auto& roleAnimState : _roleAnimStates) { + auto roleState = roleAnimState.second; overrideRoleAnimation(roleState.role, roleState.url, roleState.fps, roleState.loop, roleState.firstFrame, roleState.lastFrame); } _animLoading = false; diff --git a/libraries/animation/src/Rig.h b/libraries/animation/src/Rig.h index 8ca701ec2d..e9cc444bd4 100644 --- a/libraries/animation/src/Rig.h +++ b/libraries/animation/src/Rig.h @@ -350,7 +350,7 @@ protected: }; UserAnimState _userAnimState; - std::map _roleAnimState; + std::map _roleAnimStates; float _leftHandOverlayAlpha { 0.0f }; float _rightHandOverlayAlpha { 0.0f }; From d8191e3bd2122f8e45f1ce70d2c4fce98a9f5503 Mon Sep 17 00:00:00 2001 From: Nissim Hadar Date: Thu, 2 Nov 2017 12:45:18 -0700 Subject: [PATCH 13/44] Fixed Mask test. --- libraries/render-utils/src/DrawHaze.cpp | 2 +- libraries/render-utils/src/StencilMaskPass.cpp | 10 ++-------- libraries/render-utils/src/StencilMaskPass.h | 1 - 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/libraries/render-utils/src/DrawHaze.cpp b/libraries/render-utils/src/DrawHaze.cpp index dba35cbb3c..f694a93033 100644 --- a/libraries/render-utils/src/DrawHaze.cpp +++ b/libraries/render-utils/src/DrawHaze.cpp @@ -140,7 +140,7 @@ void DrawHaze::run(const render::RenderContextPointer& renderContext, const Inpu gpu::StatePointer state = gpu::StatePointer(new gpu::State()); // Mask out haze on the tablet - PrepareStencil::testMaskNoAA(*state); + PrepareStencil::testMask(*state); gpu::Shader::BindingSet slotBindings; slotBindings.insert(gpu::Shader::Binding(std::string("hazeBuffer"), HazeEffect_ParamsSlot)); diff --git a/libraries/render-utils/src/StencilMaskPass.cpp b/libraries/render-utils/src/StencilMaskPass.cpp index 79833795e9..f71111b64e 100644 --- a/libraries/render-utils/src/StencilMaskPass.cpp +++ b/libraries/render-utils/src/StencilMaskPass.cpp @@ -116,9 +116,9 @@ void PrepareStencil::drawBackground(gpu::State& state) { gpu::State::STENCIL_OP_REPLACE, gpu::State::STENCIL_OP_REPLACE, gpu::State::STENCIL_OP_KEEP)); } -// Pass if this area has NOT been marked as MASK +// Pass if this area has NOT been marked as MASK or anything containing MASK void PrepareStencil::testMask(gpu::State& state) { - state.setStencilTest(true, 0x00, gpu::State::StencilTest(STENCIL_MASK, 0xFF, gpu::NOT_EQUAL, + state.setStencilTest(true, 0x00, gpu::State::StencilTest(STENCIL_MASK, STENCIL_MASK, gpu::NOT_EQUAL, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP)); } @@ -128,12 +128,6 @@ void PrepareStencil::testNoAA(gpu::State& state) { gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP)); } -// Pass if this area has been marked as MASK or NO_AA -void PrepareStencil::testMaskNoAA(gpu::State& state) { - state.setStencilTest(true, 0x00, gpu::State::StencilTest(0, STENCIL_MASK | STENCIL_NO_AA, gpu::EQUAL, - gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP, gpu::State::STENCIL_OP_KEEP)); -} - // Pass if this area WAS marked as BACKGROUND // (see: model/src/Skybox.cpp, procedural/src/ProceduralSkybox.cpp) void PrepareStencil::testBackground(gpu::State& state) { diff --git a/libraries/render-utils/src/StencilMaskPass.h b/libraries/render-utils/src/StencilMaskPass.h index 18ec104ff5..fc258b607a 100644 --- a/libraries/render-utils/src/StencilMaskPass.h +++ b/libraries/render-utils/src/StencilMaskPass.h @@ -51,7 +51,6 @@ public: static void drawBackground(gpu::State& state); static void testMask(gpu::State& state); static void testNoAA(gpu::State& state); - static void testMaskNoAA(gpu::State& state); static void testBackground(gpu::State& state); static void testShape(gpu::State& state); static void testMaskDrawShape(gpu::State& state); From 83bfa1c5f26805291bdd60bdf61ea07d1f3307b1 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 2 Nov 2017 17:57:46 -0700 Subject: [PATCH 14/44] Progressing on the cluster updates --- .../render-utils/src/CauterizedModel.cpp | 3 +- libraries/render-utils/src/Model.cpp | 58 ++++++++++--------- libraries/render-utils/src/Model.h | 1 - 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 28993dd4f0..71f161038c 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -211,7 +211,8 @@ void CauterizedModel::updateRenderItems() { render::Transaction transaction; QList keys = self->getRenderItems().keys(); int meshIndex{ 0 }; - foreach (auto itemID, keys) { + //foreach (auto itemID, keys) { + for (auto itemID : self->_modelMeshRenderItemIDs) { const Model::MeshState& state = self->getMeshState(meshIndex); auto clusterMatrices(state.clusterMatrices); const Model::MeshState& cState = self->getCauterizeMeshState(meshIndex); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index cbb27f0498..b999283fad 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -218,6 +218,10 @@ void Model::updateRenderItems() { _needsUpdateClusterMatrices = true; _renderItemsNeedUpdate = false; + if (_modelMeshRenderItemIDs.size() != _meshStates.size()) { + return; + } + // queue up this work for later processing, at the end of update and just before rendering. // the application will ensure only the last lambda is actually invoked. void* key = (void*)this; @@ -240,37 +244,39 @@ void Model::updateRenderItems() { uint32_t deleteGeometryCounter = self->_deleteGeometryCounter; render::Transaction transaction; - int meshIndex{ 0 }; foreach (auto itemID, self->_modelMeshRenderItemsMap.keys()) { - const Model::MeshState& state = self->getMeshState(meshIndex); - auto clusterMatrices(state.clusterMatrices); + // for (auto itemID : self->_modelMeshRenderItemIDs) { + if (self && self->isLoaded()) { + int meshIndex = std::dynamic_pointer_cast(self->_modelMeshRenderItemsMap[itemID])->_meshIndex; + const Model::MeshState& state = self->getMeshState(meshIndex); + auto clusterMatrices(state.clusterMatrices); - transaction.updateItem(itemID, [deleteGeometryCounter, modelTransform, clusterMatrices](ModelMeshPartPayload& data) { - // ModelPointer model = data._model.lock(); - // if (model && model->isLoaded()) { - // Ensure the model geometry was not reset between frames - // if (deleteGeometryCounter == model->_deleteGeometryCounter) { + transaction.updateItem(itemID, [deleteGeometryCounter, modelTransform, clusterMatrices](ModelMeshPartPayload& data) { + // ModelPointer model = data._model.lock(); + // if (model && model->isLoaded()) { + // Ensure the model geometry was not reset between frames + // if (deleteGeometryCounter == model->_deleteGeometryCounter) { - /*const Model::MeshState& state = model->getMeshState(data._meshIndex); - Transform renderTransform = modelTransform; - if (state.clusterMatrices.size() == 1) { - renderTransform = modelTransform.worldTransform(Transform(state.clusterMatrices[0])); - } - data.updateTransformForSkinnedMesh(renderTransform, modelTransform, state.clusterBuffer); - */ - - data.updateClusterBuffer(clusterMatrices); + /*const Model::MeshState& state = model->getMeshState(data._meshIndex); + Transform renderTransform = modelTransform; + if (state.clusterMatrices.size() == 1) { + renderTransform = modelTransform.worldTransform(Transform(state.clusterMatrices[0])); + } + data.updateTransformForSkinnedMesh(renderTransform, modelTransform, state.clusterBuffer); + */ - Transform renderTransform = modelTransform; - if (clusterMatrices.size() == 1) { - renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); - } - data.updateTransformForSkinnedMesh(renderTransform, modelTransform, nullptr); + data.updateClusterBuffer(clusterMatrices); - // } - // } - }); - meshIndex++; + Transform renderTransform = modelTransform; + if (clusterMatrices.size() == 1) { + renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); + } + data.updateTransformForSkinnedMesh(renderTransform, modelTransform, nullptr); + + // } + // } + }); + } } Transform collisionMeshOffset; diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 8bce976b4e..2854f1b1b0 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -387,7 +387,6 @@ protected: QVector> _modelMeshRenderItems; QMap _modelMeshRenderItemsMap; - render::ItemIDs _modelMeshRenderItemIDs; bool _addedToScene { false }; // has been added to scene From d33c75865eb24af29ccb1dccf01cacf332debb90 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 2 Nov 2017 18:11:13 -0700 Subject: [PATCH 15/44] Removing unecessary test --- libraries/render-utils/src/Model.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index b999283fad..1f53ed731a 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -218,9 +218,6 @@ void Model::updateRenderItems() { _needsUpdateClusterMatrices = true; _renderItemsNeedUpdate = false; - if (_modelMeshRenderItemIDs.size() != _meshStates.size()) { - return; - } // queue up this work for later processing, at the end of update and just before rendering. // the application will ensure only the last lambda is actually invoked. From f097d66721f971b8c71c9eeda4b1c9e1da977f8a Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 2 Nov 2017 19:49:01 -0700 Subject: [PATCH 16/44] YEp it s working --- libraries/render-utils/src/CauterizedModel.cpp | 8 +++++++- libraries/render-utils/src/Model.cpp | 11 +++++++++-- libraries/render-utils/src/Model.h | 2 ++ 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 71f161038c..01e6a830eb 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -57,6 +57,7 @@ void CauterizedModel::createVisibleRenderItemSet() { Q_ASSERT(_modelMeshRenderItems.isEmpty()); _modelMeshRenderItems.clear(); + _modelMeshRenderItemShapes.clear(); Transform transform; transform.setTranslation(_translation); @@ -80,6 +81,7 @@ void CauterizedModel::createVisibleRenderItemSet() { for (int partIndex = 0; partIndex < numParts; partIndex++) { auto ptr = std::make_shared(shared_from_this(), i, partIndex, shapeID, transform, offset); _modelMeshRenderItems << std::static_pointer_cast(ptr); + _modelMeshRenderItemShapes.emplace_back(ShapeInfo{ (int)i }); shapeID++; } } @@ -212,7 +214,11 @@ void CauterizedModel::updateRenderItems() { QList keys = self->getRenderItems().keys(); int meshIndex{ 0 }; //foreach (auto itemID, keys) { - for (auto itemID : self->_modelMeshRenderItemIDs) { + // for (auto itemID : self->_modelMeshRenderItemIDs) { + for (int i = 0; i < self->_modelMeshRenderItemIDs.size(); i++) { + auto itemID = self->_modelMeshRenderItemIDs[i]; + auto meshIndex = self->_modelMeshRenderItemShapes[i].meshIndex; + const Model::MeshState& state = self->getMeshState(meshIndex); auto clusterMatrices(state.clusterMatrices); const Model::MeshState& cState = self->getCauterizeMeshState(meshIndex); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 1f53ed731a..9b337b3662 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -241,10 +241,14 @@ void Model::updateRenderItems() { uint32_t deleteGeometryCounter = self->_deleteGeometryCounter; render::Transaction transaction; - foreach (auto itemID, self->_modelMeshRenderItemsMap.keys()) { + // foreach (auto itemID, self->_modelMeshRenderItemsMap.keys()) { // for (auto itemID : self->_modelMeshRenderItemIDs) { + for (int i = 0; i < self->_modelMeshRenderItemIDs.size(); i++) { + auto itemID = self->_modelMeshRenderItemIDs[i]; + auto meshIndex = self->_modelMeshRenderItemShapes[i].meshIndex; if (self && self->isLoaded()) { - int meshIndex = std::dynamic_pointer_cast(self->_modelMeshRenderItemsMap[itemID])->_meshIndex; + //int meshIndex = std::dynamic_pointer_cast(self->_modelMeshRenderItemsMap[itemID])->_meshIndex; + // int meshIndex = std::dynamic_pointer_cast(self->_modelMeshRenderItemsMap[itemID])->_meshIndex; const Model::MeshState& state = self->getMeshState(meshIndex); auto clusterMatrices(state.clusterMatrices); @@ -704,6 +708,7 @@ void Model::removeFromScene(const render::ScenePointer& scene, render::Transacti _modelMeshRenderItemIDs.clear(); _modelMeshRenderItemsMap.clear(); _modelMeshRenderItems.clear(); + _modelMeshRenderItemShapes.clear(); foreach(auto item, _collisionRenderItemsMap.keys()) { transaction.removeItem(item); @@ -1282,6 +1287,7 @@ void Model::createVisibleRenderItemSet() { Q_ASSERT(_modelMeshRenderItems.isEmpty()); _modelMeshRenderItems.clear(); + _modelMeshRenderItemShapes.clear(); Transform transform; transform.setTranslation(_translation); @@ -1304,6 +1310,7 @@ void Model::createVisibleRenderItemSet() { int numParts = (int)mesh->getNumParts(); for (int partIndex = 0; partIndex < numParts; partIndex++) { _modelMeshRenderItems << std::make_shared(shared_from_this(), i, partIndex, shapeID, transform, offset); + _modelMeshRenderItemShapes.emplace_back(ShapeInfo{ (int)i }); shapeID++; } } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 2854f1b1b0..aed647e714 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -388,6 +388,8 @@ protected: QVector> _modelMeshRenderItems; QMap _modelMeshRenderItemsMap; render::ItemIDs _modelMeshRenderItemIDs; + using ShapeInfo = struct { int meshIndex; }; + std::vector _modelMeshRenderItemShapes; bool _addedToScene { false }; // has been added to scene bool _needsFixupInScene { true }; // needs to be removed/re-added to scene From 421aacd8ebb96e0125fa3837cce6c26263fef030 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 2 Nov 2017 22:45:19 -0700 Subject: [PATCH 17/44] Yes --- .../render-utils/src/CauterizedModel.cpp | 63 +++++-------------- libraries/render-utils/src/Model.cpp | 20 ------ .../render-utils/src/SoftAttachmentModel.cpp | 11 ---- 3 files changed, 16 insertions(+), 78 deletions(-) diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 01e6a830eb..b2cf5093d5 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -186,7 +186,7 @@ void CauterizedModel::updateRenderItems() { // the application will ensure only the last lambda is actually invoked. void* key = (void*)this; std::weak_ptr weakSelf = std::dynamic_pointer_cast(shared_from_this()); - AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [weakSelf, scale]() { + AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [weakSelf]() { // do nothing, if the model has already been destroyed. auto self = weakSelf.lock(); if (!self) { @@ -202,19 +202,12 @@ void CauterizedModel::updateRenderItems() { modelTransform.setTranslation(self->getTranslation()); modelTransform.setRotation(self->getRotation()); - Transform scaledModelTransform(modelTransform); - scaledModelTransform.setScale(scale); - - uint32_t deleteGeometryCounter = self->getGeometryCounter(); - - if (!self->isLoaded()) { + /* if (!self->isLoaded()) { return; - } + }*/ render::Transaction transaction; QList keys = self->getRenderItems().keys(); int meshIndex{ 0 }; - //foreach (auto itemID, keys) { - // for (auto itemID : self->_modelMeshRenderItemIDs) { for (int i = 0; i < self->_modelMeshRenderItemIDs.size(); i++) { auto itemID = self->_modelMeshRenderItemIDs[i]; auto meshIndex = self->_modelMeshRenderItemShapes[i].meshIndex; @@ -224,46 +217,22 @@ void CauterizedModel::updateRenderItems() { const Model::MeshState& cState = self->getCauterizeMeshState(meshIndex); auto clusterMatricesCauterized(cState.clusterMatrices); - transaction.updateItem(itemID, [modelTransform, deleteGeometryCounter, clusterMatrices, clusterMatricesCauterized](CauterizedMeshPartPayload& data) { - // ModelPointer model = data._model.lock(); - // if (model && model->isLoaded()) { - // Ensure the model geometry was not reset between frames - // if (deleteGeometryCounter == model->getGeometryCounter()) { - data.updateClusterBuffer(clusterMatrices, clusterMatricesCauterized); + transaction.updateItem(itemID, + [modelTransform, clusterMatrices, clusterMatricesCauterized](CauterizedMeshPartPayload& data) { + data.updateClusterBuffer(clusterMatrices, clusterMatricesCauterized); - // this stuff identical to what happens in regular Model - /*const Model::MeshState& state = model->getMeshState(data._meshIndex); - Transform renderTransform = modelTransform; - if (state.clusterMatrices.size() == 1) { - renderTransform = modelTransform.worldTransform(Transform(state.clusterMatrices[0])); - } - data.updateTransformForSkinnedMesh(renderTransform, modelTransform, state.clusterBuffer); - */ - Transform renderTransform = modelTransform; - if (clusterMatrices.size() == 1) { - renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); - } - data.updateTransformForSkinnedMesh(renderTransform, modelTransform, nullptr); + Transform renderTransform = modelTransform; + if (clusterMatrices.size() == 1) { + renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); + } + data.updateTransformForSkinnedMesh(renderTransform, modelTransform, nullptr); - - // this stuff for cauterized mesh - /*CauterizedModel* cModel = static_cast(model.get()); - const Model::MeshState& cState = cModel->getCauterizeMeshState(data._meshIndex); - renderTransform = modelTransform; - if (cState.clusterMatrices.size() == 1) { - renderTransform = modelTransform.worldTransform(Transform(cState.clusterMatrices[0])); - } - data.updateTransformForCauterizedMesh(renderTransform, cState.clusterBuffer); - */ - renderTransform = modelTransform; - if (clusterMatricesCauterized.size() == 1) { - renderTransform = modelTransform.worldTransform(Transform(clusterMatricesCauterized[0])); - } - data.updateTransformForCauterizedMesh(renderTransform, nullptr); - // } - // } + renderTransform = modelTransform; + if (clusterMatricesCauterized.size() == 1) { + renderTransform = modelTransform.worldTransform(Transform(clusterMatricesCauterized[0])); + } + data.updateTransformForCauterizedMesh(renderTransform, nullptr); }); - meshIndex++; } scene->enqueueTransaction(transaction); diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 9b337b3662..4add6fb5ba 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -241,31 +241,14 @@ void Model::updateRenderItems() { uint32_t deleteGeometryCounter = self->_deleteGeometryCounter; render::Transaction transaction; - // foreach (auto itemID, self->_modelMeshRenderItemsMap.keys()) { - // for (auto itemID : self->_modelMeshRenderItemIDs) { for (int i = 0; i < self->_modelMeshRenderItemIDs.size(); i++) { auto itemID = self->_modelMeshRenderItemIDs[i]; auto meshIndex = self->_modelMeshRenderItemShapes[i].meshIndex; if (self && self->isLoaded()) { - //int meshIndex = std::dynamic_pointer_cast(self->_modelMeshRenderItemsMap[itemID])->_meshIndex; - // int meshIndex = std::dynamic_pointer_cast(self->_modelMeshRenderItemsMap[itemID])->_meshIndex; const Model::MeshState& state = self->getMeshState(meshIndex); auto clusterMatrices(state.clusterMatrices); transaction.updateItem(itemID, [deleteGeometryCounter, modelTransform, clusterMatrices](ModelMeshPartPayload& data) { - // ModelPointer model = data._model.lock(); - // if (model && model->isLoaded()) { - // Ensure the model geometry was not reset between frames - // if (deleteGeometryCounter == model->_deleteGeometryCounter) { - - /*const Model::MeshState& state = model->getMeshState(data._meshIndex); - Transform renderTransform = modelTransform; - if (state.clusterMatrices.size() == 1) { - renderTransform = modelTransform.worldTransform(Transform(state.clusterMatrices[0])); - } - data.updateTransformForSkinnedMesh(renderTransform, modelTransform, state.clusterBuffer); - */ - data.updateClusterBuffer(clusterMatrices); Transform renderTransform = modelTransform; @@ -273,9 +256,6 @@ void Model::updateRenderItems() { renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); } data.updateTransformForSkinnedMesh(renderTransform, modelTransform, nullptr); - - // } - // } }); } } diff --git a/libraries/render-utils/src/SoftAttachmentModel.cpp b/libraries/render-utils/src/SoftAttachmentModel.cpp index 975d099ac3..f364e9c037 100644 --- a/libraries/render-utils/src/SoftAttachmentModel.cpp +++ b/libraries/render-utils/src/SoftAttachmentModel.cpp @@ -60,17 +60,6 @@ void SoftAttachmentModel::updateClusterMatrices() { } glm_mat4u_mul(jointMatrix, cluster.inverseBindMatrix, state.clusterMatrices[j]); } - - // Once computed the cluster matrices, update the buffer(s) - /* if (mesh.clusters.size() > 1) { - if (!state.clusterBuffer) { - state.clusterBuffer = std::make_shared(state.clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) state.clusterMatrices.constData()); - } else { - state.clusterBuffer->setSubData(0, state.clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) state.clusterMatrices.constData()); - } - }*/ } // post the blender if we're not currently waiting for one to finish From c11f46a8d3fdf01ad5d5b78bb5db8b7978360b98 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 2 Nov 2017 23:35:18 -0700 Subject: [PATCH 18/44] cleaning more code --- .../src/CauterizedMeshPartPayload.cpp | 15 ++++----- .../src/CauterizedMeshPartPayload.h | 4 +-- .../render-utils/src/CauterizedModel.cpp | 31 ++----------------- .../render-utils/src/MeshPartPayload.cpp | 15 ++++----- libraries/render-utils/src/MeshPartPayload.h | 8 ++--- libraries/render-utils/src/Model.cpp | 17 ++-------- libraries/render-utils/src/Model.h | 5 ++- 7 files changed, 24 insertions(+), 71 deletions(-) diff --git a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp index 068eb03378..a54a072b75 100644 --- a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp +++ b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp @@ -20,36 +20,33 @@ using namespace render; CauterizedMeshPartPayload::CauterizedMeshPartPayload(ModelPointer model, int meshIndex, int partIndex, int shapeIndex, const Transform& transform, const Transform& offsetTransform) : ModelMeshPartPayload(model, meshIndex, partIndex, shapeIndex, transform, offsetTransform) {} -void CauterizedMeshPartPayload::updateClusterBuffer(const QVector& clusterMatrices, const QVector& cauterizedClusterMatrices) { +void CauterizedMeshPartPayload::updateClusterBuffer(const std::vector& clusterMatrices, const std::vector& cauterizedClusterMatrices) { // Once computed the cluster matrices, update the buffer(s) if (clusterMatrices.size() > 1) { if (!_clusterBuffer) { _clusterBuffer = std::make_shared(clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) clusterMatrices.constData()); + (const gpu::Byte*) clusterMatrices.data()); } else { _clusterBuffer->setSubData(0, clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) clusterMatrices.constData()); + (const gpu::Byte*) clusterMatrices.data()); } } if (cauterizedClusterMatrices.size() > 1) { if (!_cauterizedClusterBuffer) { _cauterizedClusterBuffer = std::make_shared(cauterizedClusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) cauterizedClusterMatrices.constData()); + (const gpu::Byte*) cauterizedClusterMatrices.data()); } else { _cauterizedClusterBuffer->setSubData(0, clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) clusterMatrices.constData()); + (const gpu::Byte*) clusterMatrices.data()); } } } -void CauterizedMeshPartPayload::updateTransformForCauterizedMesh( - const Transform& renderTransform, - const gpu::BufferPointer& buffer) { +void CauterizedMeshPartPayload::updateTransformForCauterizedMesh(const Transform& renderTransform) { _cauterizedTransform = renderTransform; - // _cauterizedClusterBuffer = buffer; } void CauterizedMeshPartPayload::bindTransform(gpu::Batch& batch, const render::ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const { diff --git a/libraries/render-utils/src/CauterizedMeshPartPayload.h b/libraries/render-utils/src/CauterizedMeshPartPayload.h index 4bd20461eb..1c98f5abf3 100644 --- a/libraries/render-utils/src/CauterizedMeshPartPayload.h +++ b/libraries/render-utils/src/CauterizedMeshPartPayload.h @@ -15,9 +15,9 @@ class CauterizedMeshPartPayload : public ModelMeshPartPayload { public: CauterizedMeshPartPayload(ModelPointer model, int meshIndex, int partIndex, int shapeIndex, const Transform& transform, const Transform& offsetTransform); - void updateClusterBuffer(const QVector& clusterMatrices, const QVector& cauterizedClusterMatrices); + void updateClusterBuffer(const std::vector& clusterMatrices, const std::vector& cauterizedClusterMatrices); - void updateTransformForCauterizedMesh(const Transform& renderTransform, const gpu::BufferPointer& buffer); + void updateTransformForCauterizedMesh(const Transform& renderTransform); void bindTransform(gpu::Batch& batch, const render::ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const override; diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index b2cf5093d5..776de727b4 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -112,19 +112,6 @@ void CauterizedModel::updateClusterMatrices() { auto jointMatrix = _rig.getJointTransform(cluster.jointIndex); glm_mat4u_mul(jointMatrix, cluster.inverseBindMatrix, state.clusterMatrices[j]); } - - /* - // Once computed the cluster matrices, update the buffer(s) - if (mesh.clusters.size() > 1) { - if (!state.clusterBuffer) { - state.clusterBuffer = std::make_shared(state.clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) state.clusterMatrices.constData()); - } else { - state.clusterBuffer->setSubData(0, state.clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) state.clusterMatrices.constData()); - } - } - */ } // as an optimization, don't build cautrizedClusterMatrices if the boneSet is empty. @@ -147,17 +134,6 @@ void CauterizedModel::updateClusterMatrices() { } glm_mat4u_mul(jointMatrix, cluster.inverseBindMatrix, state.clusterMatrices[j]); } -/* - if (!_cauterizeBoneSet.empty() && (state.clusterMatrices.size() > 1)) { - if (!state.clusterBuffer) { - state.clusterBuffer = - std::make_shared(state.clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) state.clusterMatrices.constData()); - } else { - state.clusterBuffer->setSubData(0, state.clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) state.clusterMatrices.constData()); - } - }*/ } } @@ -202,9 +178,6 @@ void CauterizedModel::updateRenderItems() { modelTransform.setTranslation(self->getTranslation()); modelTransform.setRotation(self->getRotation()); - /* if (!self->isLoaded()) { - return; - }*/ render::Transaction transaction; QList keys = self->getRenderItems().keys(); int meshIndex{ 0 }; @@ -225,13 +198,13 @@ void CauterizedModel::updateRenderItems() { if (clusterMatrices.size() == 1) { renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); } - data.updateTransformForSkinnedMesh(renderTransform, modelTransform, nullptr); + data.updateTransformForSkinnedMesh(renderTransform, modelTransform); renderTransform = modelTransform; if (clusterMatricesCauterized.size() == 1) { renderTransform = modelTransform.worldTransform(Transform(clusterMatricesCauterized[0])); } - data.updateTransformForCauterizedMesh(renderTransform, nullptr); + data.updateTransformForCauterizedMesh(renderTransform); }); } diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index abb0d299e1..5426ed0ea6 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -337,7 +337,7 @@ ModelMeshPartPayload::ModelMeshPartPayload(ModelPointer model, int meshIndex, in if (state.clusterMatrices.size() == 1) { renderTransform = transform.worldTransform(Transform(state.clusterMatrices[0])); } - updateTransformForSkinnedMesh(renderTransform, transform, state.clusterBuffer); + updateTransformForSkinnedMesh(renderTransform, transform); initCache(); } @@ -368,26 +368,24 @@ void ModelMeshPartPayload::notifyLocationChanged() { } -void ModelMeshPartPayload::updateClusterBuffer(const QVector& clusterMatrices) { +void ModelMeshPartPayload::updateClusterBuffer(const std::vector& clusterMatrices) { // Once computed the cluster matrices, update the buffer(s) if (clusterMatrices.size() > 1) { if (!_clusterBuffer) { _clusterBuffer = std::make_shared(clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) clusterMatrices.constData()); + (const gpu::Byte*) clusterMatrices.data()); } else { _clusterBuffer->setSubData(0, clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) clusterMatrices.constData()); + (const gpu::Byte*) clusterMatrices.data()); } } } -void ModelMeshPartPayload::updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform, - const gpu::BufferPointer& buffer) { +void ModelMeshPartPayload::updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform) { _transform = renderTransform; _worldBound = _adjustedLocalBound; _worldBound.transform(boundTransform); - // _clusterBuffer = buffer; } ItemKey ModelMeshPartPayload::getKey() const { @@ -431,7 +429,6 @@ int ModelMeshPartPayload::getLayer() const { } ShapeKey ModelMeshPartPayload::getShapeKey() const { - // guard against partially loaded meshes ModelPointer model = _model.lock(); if (!model || !model->isLoaded() || !model->getGeometry()) { @@ -597,7 +594,7 @@ void ModelMeshPartPayload::render(RenderArgs* args) { args->_details._trianglesRendered += _drawPart._numIndices / INDICES_PER_TRIANGLE; } -void ModelMeshPartPayload::computeAdjustedLocalBound(const QVector& clusterMatrices) { +void ModelMeshPartPayload::computeAdjustedLocalBound(const std::vector& clusterMatrices) { _adjustedLocalBound = _localBound; if (clusterMatrices.size() > 0) { _adjustedLocalBound.transform(clusterMatrices[0]); diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 0e8464f873..971c6fe90b 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -87,10 +87,8 @@ public: typedef Payload::DataPointer Pointer; void notifyLocationChanged() override; - void updateClusterBuffer(const QVector& clusterMatrices); - void updateTransformForSkinnedMesh(const Transform& renderTransform, - const Transform& boundTransform, - const gpu::BufferPointer& buffer); + void updateClusterBuffer(const std::vector& clusterMatrices); + void updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform); // Render Item interface render::ItemKey getKey() const override; @@ -104,7 +102,7 @@ public: void initCache(); - void computeAdjustedLocalBound(const QVector& clusterMatrices); + void computeAdjustedLocalBound(const std::vector& clusterMatrices); gpu::BufferPointer _clusterBuffer; ModelWeakPointer _model; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 4add6fb5ba..79b968ffb7 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -255,7 +255,7 @@ void Model::updateRenderItems() { if (clusterMatrices.size() == 1) { renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); } - data.updateTransformForSkinnedMesh(renderTransform, modelTransform, nullptr); + data.updateTransformForSkinnedMesh(renderTransform, modelTransform); }); } } @@ -313,7 +313,7 @@ bool Model::updateGeometry() { foreach (const FBXMesh& mesh, fbxGeometry.meshes) { MeshState state; state.clusterMatrices.resize(mesh.clusters.size()); - _meshStates.append(state); + _meshStates.push_back(state); // Note: we add empty buffers for meshes that lack blendshapes so we can access the buffers by index // later in ModelMeshPayload, however the vast majority of meshes will not have them. @@ -1138,17 +1138,6 @@ void Model::updateClusterMatrices() { auto jointMatrix = _rig.getJointTransform(cluster.jointIndex); glm_mat4u_mul(jointMatrix, cluster.inverseBindMatrix, state.clusterMatrices[j]); } - - /* // Once computed the cluster matrices, update the buffer(s) - if (mesh.clusters.size() > 1) { - if (!state.clusterBuffer) { - state.clusterBuffer = std::make_shared(state.clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) state.clusterMatrices.constData()); - } else { - state.clusterBuffer->setSubData(0, state.clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) state.clusterMatrices.constData()); - } - }*/ } // post the blender if we're not currently waiting for one to finish @@ -1332,7 +1321,7 @@ void Model::createCollisionRenderItemSet() { } bool Model::isRenderable() const { - return !_meshStates.isEmpty() || (isLoaded() && _renderGeometry->getMeshes().empty()); + return !_meshStates.empty() || (isLoaded() && _renderGeometry->getMeshes().empty()); } class CollisionRenderGeometry : public Geometry { diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 58ed143062..c537a928b3 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -246,8 +246,7 @@ public: class MeshState { public: - QVector clusterMatrices; - gpu::BufferPointer clusterBuffer; + std::vector clusterMatrices; }; const MeshState& getMeshState(int index) { return _meshStates.at(index); } @@ -317,7 +316,7 @@ protected: bool _snappedToRegistrationPoint; /// are we currently snapped to a registration point glm::vec3 _registrationPoint = glm::vec3(0.5f); /// the point in model space our center is snapped to - QVector _meshStates; + std::vector _meshStates; virtual void initJointStates(); From 390f5b53caeaab609bddebefc0eb8a54de6ea9d5 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 2 Nov 2017 23:55:44 -0700 Subject: [PATCH 19/44] cleaning more code --- .../render-utils/src/CauterizedModel.cpp | 37 ++++++++----------- libraries/render-utils/src/Model.cpp | 28 ++++++-------- 2 files changed, 27 insertions(+), 38 deletions(-) diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 776de727b4..2105806134 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -165,7 +165,7 @@ void CauterizedModel::updateRenderItems() { AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [weakSelf]() { // do nothing, if the model has already been destroyed. auto self = weakSelf.lock(); - if (!self) { + if (!self || !self->isLoaded()) { return; } @@ -179,32 +179,27 @@ void CauterizedModel::updateRenderItems() { modelTransform.setRotation(self->getRotation()); render::Transaction transaction; - QList keys = self->getRenderItems().keys(); - int meshIndex{ 0 }; for (int i = 0; i < self->_modelMeshRenderItemIDs.size(); i++) { + auto itemID = self->_modelMeshRenderItemIDs[i]; auto meshIndex = self->_modelMeshRenderItemShapes[i].meshIndex; + auto clusterMatrices(self->getMeshState(meshIndex).clusterMatrices); + auto clusterMatricesCauterized(self->getCauterizeMeshState(meshIndex).clusterMatrices); - const Model::MeshState& state = self->getMeshState(meshIndex); - auto clusterMatrices(state.clusterMatrices); - const Model::MeshState& cState = self->getCauterizeMeshState(meshIndex); - auto clusterMatricesCauterized(cState.clusterMatrices); + transaction.updateItem(itemID, [modelTransform, clusterMatrices, clusterMatricesCauterized](CauterizedMeshPartPayload& data) { + data.updateClusterBuffer(clusterMatrices, clusterMatricesCauterized); - transaction.updateItem(itemID, - [modelTransform, clusterMatrices, clusterMatricesCauterized](CauterizedMeshPartPayload& data) { - data.updateClusterBuffer(clusterMatrices, clusterMatricesCauterized); + Transform renderTransform = modelTransform; + if (clusterMatrices.size() == 1) { + renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); + } + data.updateTransformForSkinnedMesh(renderTransform, modelTransform); - Transform renderTransform = modelTransform; - if (clusterMatrices.size() == 1) { - renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); - } - data.updateTransformForSkinnedMesh(renderTransform, modelTransform); - - renderTransform = modelTransform; - if (clusterMatricesCauterized.size() == 1) { - renderTransform = modelTransform.worldTransform(Transform(clusterMatricesCauterized[0])); - } - data.updateTransformForCauterizedMesh(renderTransform); + renderTransform = modelTransform; + if (clusterMatricesCauterized.size() == 1) { + renderTransform = modelTransform.worldTransform(Transform(clusterMatricesCauterized[0])); + } + data.updateTransformForCauterizedMesh(renderTransform); }); } diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 79b968ffb7..f27aa284be 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -218,7 +218,6 @@ void Model::updateRenderItems() { _needsUpdateClusterMatrices = true; _renderItemsNeedUpdate = false; - // queue up this work for later processing, at the end of update and just before rendering. // the application will ensure only the last lambda is actually invoked. void* key = (void*)this; @@ -227,7 +226,7 @@ void Model::updateRenderItems() { // do nothing, if the model has already been destroyed. auto self = weakSelf.lock(); - if (!self) { + if (!self || !self->isLoaded()) { return; } @@ -238,26 +237,21 @@ void Model::updateRenderItems() { Transform modelTransform = self->getTransform(); modelTransform.setScale(glm::vec3(1.0f)); - uint32_t deleteGeometryCounter = self->_deleteGeometryCounter; - render::Transaction transaction; for (int i = 0; i < self->_modelMeshRenderItemIDs.size(); i++) { + auto itemID = self->_modelMeshRenderItemIDs[i]; auto meshIndex = self->_modelMeshRenderItemShapes[i].meshIndex; - if (self && self->isLoaded()) { - const Model::MeshState& state = self->getMeshState(meshIndex); - auto clusterMatrices(state.clusterMatrices); + auto clusterMatrices(self->getMeshState(meshIndex).clusterMatrices); - transaction.updateItem(itemID, [deleteGeometryCounter, modelTransform, clusterMatrices](ModelMeshPartPayload& data) { - data.updateClusterBuffer(clusterMatrices); - - Transform renderTransform = modelTransform; - if (clusterMatrices.size() == 1) { - renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); - } - data.updateTransformForSkinnedMesh(renderTransform, modelTransform); - }); - } + transaction.updateItem(itemID, [modelTransform, clusterMatrices](ModelMeshPartPayload& data) { + data.updateClusterBuffer(clusterMatrices); + Transform renderTransform = modelTransform; + if (clusterMatrices.size() == 1) { + renderTransform = modelTransform.worldTransform(Transform(clusterMatrices[0])); + } + data.updateTransformForSkinnedMesh(renderTransform, modelTransform); + }); } Transform collisionMeshOffset; From 053052a95db484cb48a55a4584d6c939bbb8b2e2 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 3 Nov 2017 13:28:20 -0700 Subject: [PATCH 20/44] removing warnings --- libraries/render-utils/src/CauterizedModel.cpp | 6 +++--- libraries/render-utils/src/MeshPartPayload.cpp | 2 +- libraries/render-utils/src/Model.cpp | 6 +++--- libraries/render-utils/src/SoftAttachmentModel.cpp | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index 2105806134..30121a232d 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -48,7 +48,7 @@ void CauterizedModel::createVisibleRenderItemSet() { const auto& meshes = _renderGeometry->getMeshes(); // all of our mesh vectors must match in size - if ((int)meshes.size() != _meshStates.size()) { + if (meshes.size() != _meshStates.size()) { qCDebug(renderutils) << "WARNING!!!! Mesh Sizes don't match! We will not segregate mesh groups yet."; return; } @@ -104,7 +104,7 @@ void CauterizedModel::updateClusterMatrices() { _needsUpdateClusterMatrices = false; const FBXGeometry& geometry = getFBXGeometry(); - for (int i = 0; i < _meshStates.size(); i++) { + for (int i = 0; i < (int)_meshStates.size(); i++) { Model::MeshState& state = _meshStates[i]; const FBXMesh& mesh = geometry.meshes.at(i); for (int j = 0; j < mesh.clusters.size(); j++) { @@ -179,7 +179,7 @@ void CauterizedModel::updateRenderItems() { modelTransform.setRotation(self->getRotation()); render::Transaction transaction; - for (int i = 0; i < self->_modelMeshRenderItemIDs.size(); i++) { + for (int i = 0; i < (int)self->_modelMeshRenderItemIDs.size(); i++) { auto itemID = self->_modelMeshRenderItemIDs[i]; auto meshIndex = self->_modelMeshRenderItemShapes[i].meshIndex; diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 5426ed0ea6..1ea3e1a705 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -598,7 +598,7 @@ void ModelMeshPartPayload::computeAdjustedLocalBound(const std::vector 0) { _adjustedLocalBound.transform(clusterMatrices[0]); - for (int i = 1; i < clusterMatrices.size(); ++i) { + for (int i = 1; i < (int)clusterMatrices.size(); ++i) { AABox clusterBound = _localBound; clusterBound.transform(clusterMatrices[i]); _adjustedLocalBound += clusterBound; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index f27aa284be..428fcc7a54 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -238,7 +238,7 @@ void Model::updateRenderItems() { modelTransform.setScale(glm::vec3(1.0f)); render::Transaction transaction; - for (int i = 0; i < self->_modelMeshRenderItemIDs.size(); i++) { + for (int i = 0; i < (int) self->_modelMeshRenderItemIDs.size(); i++) { auto itemID = self->_modelMeshRenderItemIDs[i]; auto meshIndex = self->_modelMeshRenderItemShapes[i].meshIndex; @@ -1124,7 +1124,7 @@ void Model::updateClusterMatrices() { } _needsUpdateClusterMatrices = false; const FBXGeometry& geometry = getFBXGeometry(); - for (int i = 0; i < _meshStates.size(); i++) { + for (int i = 0; i < (int) _meshStates.size(); i++) { MeshState& state = _meshStates[i]; const FBXMesh& mesh = geometry.meshes.at(i); for (int j = 0; j < mesh.clusters.size(); j++) { @@ -1241,7 +1241,7 @@ void Model::createVisibleRenderItemSet() { const auto& meshes = _renderGeometry->getMeshes(); // all of our mesh vectors must match in size - if ((int)meshes.size() != _meshStates.size()) { + if (meshes.size() != _meshStates.size()) { qCDebug(renderutils) << "WARNING!!!! Mesh Sizes don't match! We will not segregate mesh groups yet."; return; } diff --git a/libraries/render-utils/src/SoftAttachmentModel.cpp b/libraries/render-utils/src/SoftAttachmentModel.cpp index f364e9c037..63991f9422 100644 --- a/libraries/render-utils/src/SoftAttachmentModel.cpp +++ b/libraries/render-utils/src/SoftAttachmentModel.cpp @@ -43,7 +43,7 @@ void SoftAttachmentModel::updateClusterMatrices() { const FBXGeometry& geometry = getFBXGeometry(); - for (int i = 0; i < _meshStates.size(); i++) { + for (int i = 0; i < (int) _meshStates.size(); i++) { MeshState& state = _meshStates[i]; const FBXMesh& mesh = geometry.meshes.at(i); From 539cf35f30970c031ea0ccc48aa8cadf206b2fd3 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Fri, 3 Nov 2017 17:14:27 -0700 Subject: [PATCH 21/44] saving work --- interface/src/raypick/LaserPointer.cpp | 2 +- interface/src/raypick/LaserPointer.h | 2 +- .../controllerModules/farActionGrabEntity.js | 44 ++++++++++++++++++- .../libraries/controllerDispatcherUtils.js | 29 ++++++++++++ 4 files changed, 74 insertions(+), 3 deletions(-) diff --git a/interface/src/raypick/LaserPointer.cpp b/interface/src/raypick/LaserPointer.cpp index 75b43a251b..9da8ff34ac 100644 --- a/interface/src/raypick/LaserPointer.cpp +++ b/interface/src/raypick/LaserPointer.cpp @@ -233,7 +233,7 @@ void LaserPointer::setLaserLength(const float laserLength) { }); } -void LaserPointer::setLockEndUUID(QUuid objectID, const bool isOverlay) { +void LaserPointer::setLockEndUUID(QUuid objectID, const bool isOverlay, const glm::mat4& offset) { withWriteLock([&] { _objectLockEnd = std::pair(objectID, isOverlay); }); diff --git a/interface/src/raypick/LaserPointer.h b/interface/src/raypick/LaserPointer.h index f2350c7199..a80f9d447d 100644 --- a/interface/src/raypick/LaserPointer.h +++ b/interface/src/raypick/LaserPointer.h @@ -74,7 +74,7 @@ public: void setPrecisionPicking(const bool precisionPicking); void setLaserLength(const float laserLength); - void setLockEndUUID(QUuid objectID, const bool isOverlay); + void setLockEndUUID(QUuid objectID, const bool isOverlay, const glm::mat4& offset = glm::mat4()); void setIgnoreItems(const QVector& ignoreItems) const; void setIncludeItems(const QVector& includeItems) const; diff --git a/scripts/system/controllers/controllerModules/farActionGrabEntity.js b/scripts/system/controllers/controllerModules/farActionGrabEntity.js index e34855d521..e63d7c7c35 100644 --- a/scripts/system/controllers/controllerModules/farActionGrabEntity.js +++ b/scripts/system/controllers/controllerModules/farActionGrabEntity.js @@ -19,6 +19,7 @@ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); Script.include("/~/system/libraries/controllers.js"); +Script.include("/~/system/libraries/Xform.hs"); (function() { var PICK_WITH_HAND_RAY = true; @@ -113,10 +114,42 @@ Script.include("/~/system/libraries/controllers.js"); ]; var MARGIN = 25; + + function TargetObject(entityID) { + this.entityID = entityID; + this.entityProps = null; + this.parentID = null; + this.parentProps = []; + this.childrenProps = []; + this.parentsCollisionStatus = []; + this.childrenCollisionStatus = []; + this.madeDynamic = null; + this.parentEntityProps = null; + + this.makeDynamic = function() { + }; + + this.saveCollisionStatus = function() { + }; + + this.restoreEntitiesProperties = function() { + }; + + this.getTargetEntity = function() { + var parentPropsLength = this.parentProps.length; + if (parentPropsLength !== 0) { + return this.parentProps[parentPropsLength].id; + } + return this.entityID; + }; + } + function FarActionGrabEntity(hand) { this.hand = hand; this.grabbedThingID = null; + this.targetObject = null; this.actionID = null; // action this script created... + this.entityToLockOnto = null; this.entityWithContextOverlay = false; this.contextOverlayTimer = false; this.previousCollisionStatus = false; @@ -158,7 +191,8 @@ Script.include("/~/system/libraries/controllers.js"); LaserPointers.enableLaserPointer(laserPointerID); LaserPointers.setRenderState(laserPointerID, mode); if (this.distanceHolding || this.distanceRotating) { - LaserPointers.setLockEndUUID(laserPointerID, this.grabbedThingID, this.grabbedIsOverlay); + // calculate offset + LaserPointers.setLockEndUUID(laserPointerID, this.entityToLockOnto, this.grabbedIsOverlay); } else { LaserPointers.setLockEndUUID(laserPointerID, null, false); } @@ -351,6 +385,7 @@ Script.include("/~/system/libraries/controllers.js"); } this.actionID = null; this.grabbedThingID = null; + this.entityToLockOnto = null; }; this.updateRecommendedArea = function() { @@ -497,17 +532,24 @@ Script.include("/~/system/libraries/controllers.js"); if (rayPickInfo.type === RayPick.INTERSECTED_ENTITY) { if (controllerData.triggerClicks[this.hand]) { var entityID = rayPickInfo.objectID; + this.entityToLockOnto = entityID; var targetProps = Entities.getEntityProperties(entityID, [ "dynamic", "shapeType", "position", "rotation", "dimensions", "density", "userData", "locked", "type" ]); + this.targetObject = new TargetObject(entityID); if (entityID !== this.entityWithContextOverlay) { this.destroyContextOverlay(); } if (entityIsGrabbable(targetProps)) { + var groupRootProps = findGroupParent(controllerData, targetProps); + if (entityIsGrabbable(groupRootProps)) { + targetProps = groupRootProps; + entityID = targetProps.id; + } if (!entityIsDistanceGrabbable(targetProps)) { targetProps.dynamic = true; this.previousCollisionStatus = targetProps.collisionless; diff --git a/scripts/system/libraries/controllerDispatcherUtils.js b/scripts/system/libraries/controllerDispatcherUtils.js index cd3f1a711f..148530c5ec 100644 --- a/scripts/system/libraries/controllerDispatcherUtils.js +++ b/scripts/system/libraries/controllerDispatcherUtils.js @@ -35,12 +35,14 @@ propsArePhysical:true, controllerDispatcherPluginsNeedSort:true, projectOntoXYPlane:true, + getChildrenProps:true, projectOntoEntityXYPlane:true, projectOntoOverlayXYPlane:true, entityHasActions:true, ensureDynamic:true, findGroupParent:true, BUMPER_ON_VALUE:true, + getEntityParents:true, findHandChildEntities:true, TEAR_AWAY_DISTANCE:true, TEAR_AWAY_COUNT:true, @@ -306,6 +308,33 @@ findGroupParent = function (controllerData, targetProps) { return targetProps; }; +getChildrenProps = function(entityID) { + var childrenProps = []; + var childrenIDs = Entities.getChildrenIDs(entityID); + for (var index = 0; index < childrenIDs.length; index++) { + var childProps = Entities.getEntityProperties(childrenIDs[index]); + childrenProps.push(childProps); + } + return childrenProps; +}; + +getEntityParents = function(targetProps) { + var parentProperties = []; + while (targetProps.parentID && + targetProps.parentID !== Uuid.NULL && + Entities.getNestableType(targetProps.parentID) == "entity") { + var parentProps = Entities.getEntityProperties(targetProps.parentID, DISPATCHER_PROPERTIES); + if (!parentProps) { + break; + } + parentProps.id = targetProps.parentID; + targetProps = parentProps; + parentProperties.push(parentProps); + } + + return parentProperties; +}; + findHandChildEntities = function(hand) { // find children of avatar's hand joint From 4a5f52155c8d60a0e7e52a56805691a01ab7c8f5 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 5 Nov 2017 14:33:30 +1300 Subject: [PATCH 22/44] Pin node pointer --- assignment-client/src/entities/EntityTreeSendThread.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/assignment-client/src/entities/EntityTreeSendThread.cpp b/assignment-client/src/entities/EntityTreeSendThread.cpp index e96a9dc667..f5f8450de7 100644 --- a/assignment-client/src/entities/EntityTreeSendThread.cpp +++ b/assignment-client/src/entities/EntityTreeSendThread.cpp @@ -425,7 +425,8 @@ bool EntityTreeSendThread::traverseTreeAndBuildNextPacketPayload(EncodeBitstream uint64_t sendTime = usecTimestampNow(); auto nodeData = static_cast(params.nodeData); nodeData->stats.encodeStarted(); - auto entityNodeData = static_cast(_node.toStrongRef()->getLinkedData()); + auto entityNode = _node.toStrongRef(); + auto entityNodeData = static_cast(entityNode->getLinkedData()); while(!_sendQueue.empty()) { PrioritizedEntity queuedItem = _sendQueue.top(); EntityItemPointer entity = queuedItem.getEntity(); From a76b7855b5d29b887af4784fc538d33a0365272c Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 5 Nov 2017 15:03:43 +1300 Subject: [PATCH 23/44] Record only explicitly filtered-in entities for flagging extras --- assignment-client/src/entities/EntityTreeSendThread.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/entities/EntityTreeSendThread.cpp b/assignment-client/src/entities/EntityTreeSendThread.cpp index f5f8450de7..a259dacecd 100644 --- a/assignment-client/src/entities/EntityTreeSendThread.cpp +++ b/assignment-client/src/entities/EntityTreeSendThread.cpp @@ -432,8 +432,12 @@ bool EntityTreeSendThread::traverseTreeAndBuildNextPacketPayload(EncodeBitstream EntityItemPointer entity = queuedItem.getEntity(); if (entity) { // Only send entities that match the jsonFilters, but keep track of everything we've tried to send so we don't try to send it again - if (entity->matchesJSONFilters(jsonFilters) || entityNodeData->isEntityFlaggedAsExtra(entity->getID())) { - entityNodeData->insertSentFilteredEntity(entity->getID()); + bool entityMatchesFilters = entity->matchesJSONFilters(jsonFilters); + if (entityMatchesFilters || entityNodeData->isEntityFlaggedAsExtra(entity->getID())) { + if (!jsonFilters.isEmpty() && entityMatchesFilters) { + // Record explicitly filtered-in entity so that extra entities can be flagged. + entityNodeData->insertSentFilteredEntity(entity->getID()); + } OctreeElement::AppendState appendEntityState = entity->appendEntityData(&_packetData, params, _extraEncodeData); if (appendEntityState != OctreeElement::COMPLETED) { From 05275afb4fe034461354cf1f8e0ebd3ba70969a6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 5 Nov 2017 15:48:02 +1300 Subject: [PATCH 24/44] Resending full scene is not necessary after all --- assignment-client/src/entities/EntityTreeSendThread.cpp | 6 +++--- assignment-client/src/entities/EntityTreeSendThread.h | 2 +- libraries/entities/src/DiffTraversal.cpp | 4 ++-- libraries/entities/src/DiffTraversal.h | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/assignment-client/src/entities/EntityTreeSendThread.cpp b/assignment-client/src/entities/EntityTreeSendThread.cpp index a259dacecd..11e4d533fb 100644 --- a/assignment-client/src/entities/EntityTreeSendThread.cpp +++ b/assignment-client/src/entities/EntityTreeSendThread.cpp @@ -96,7 +96,7 @@ void EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O nodeData->copyCurrentViewFrustum(viewFrustum); EntityTreeElementPointer root = std::dynamic_pointer_cast(_myServer->getOctree()->getRoot()); int32_t lodLevelOffset = nodeData->getBoundaryLevelAdjust() + (viewFrustumChanged ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST); - startNewTraversal(viewFrustum, root, lodLevelOffset, nodeData->getUsesFrustum(), isFullScene); + startNewTraversal(viewFrustum, root, lodLevelOffset, nodeData->getUsesFrustum()); // When the viewFrustum changed the sort order may be incorrect, so we re-sort // and also use the opportunity to cull anything no longer in view @@ -205,9 +205,9 @@ bool EntityTreeSendThread::addDescendantsToExtraFlaggedEntities(const QUuid& fil } void EntityTreeSendThread::startNewTraversal(const ViewFrustum& view, EntityTreeElementPointer root, int32_t lodLevelOffset, - bool usesViewFrustum, bool isFullScene) { + bool usesViewFrustum) { - DiffTraversal::Type type = _traversal.prepareNewTraversal(view, root, lodLevelOffset, usesViewFrustum, isFullScene); + DiffTraversal::Type type = _traversal.prepareNewTraversal(view, root, lodLevelOffset, usesViewFrustum); // there are three types of traversal: // // (1) FirstTime = at login --> find everything in view diff --git a/assignment-client/src/entities/EntityTreeSendThread.h b/assignment-client/src/entities/EntityTreeSendThread.h index 1781de9890..a96a18494d 100644 --- a/assignment-client/src/entities/EntityTreeSendThread.h +++ b/assignment-client/src/entities/EntityTreeSendThread.h @@ -39,7 +39,7 @@ private: bool addDescendantsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData); void startNewTraversal(const ViewFrustum& viewFrustum, EntityTreeElementPointer root, int32_t lodLevelOffset, - bool usesViewFrustum, bool isFullScene); + bool usesViewFrustum); bool traverseTreeAndBuildNextPacketPayload(EncodeBitstreamParams& params, const QJsonObject& jsonFilters) override; void preDistributionProcessing() override; diff --git a/libraries/entities/src/DiffTraversal.cpp b/libraries/entities/src/DiffTraversal.cpp index 9b16ee90bf..764c420197 100644 --- a/libraries/entities/src/DiffTraversal.cpp +++ b/libraries/entities/src/DiffTraversal.cpp @@ -143,7 +143,7 @@ DiffTraversal::DiffTraversal() { } DiffTraversal::Type DiffTraversal::prepareNewTraversal(const ViewFrustum& viewFrustum, EntityTreeElementPointer root, - int32_t lodLevelOffset, bool usesViewFrustum, bool isFullScene) { + int32_t lodLevelOffset, bool usesViewFrustum) { assert(root); // there are three types of traversal: // @@ -164,7 +164,7 @@ DiffTraversal::Type DiffTraversal::prepareNewTraversal(const ViewFrustum& viewFr Type type; // If usesViewFrustum changes, treat it as a First traversal - if (_completedView.startTime == 0 || _currentView.usesViewFrustum != _completedView.usesViewFrustum || isFullScene) { + if (_completedView.startTime == 0 || _currentView.usesViewFrustum != _completedView.usesViewFrustum) { type = Type::First; _currentView.viewFrustum = viewFrustum; _currentView.lodScaleFactor = lodScaleFactor; diff --git a/libraries/entities/src/DiffTraversal.h b/libraries/entities/src/DiffTraversal.h index becf322fd5..eb7168356e 100644 --- a/libraries/entities/src/DiffTraversal.h +++ b/libraries/entities/src/DiffTraversal.h @@ -58,7 +58,7 @@ public: DiffTraversal(); Type prepareNewTraversal(const ViewFrustum& viewFrustum, EntityTreeElementPointer root, int32_t lodLevelOffset, - bool usesViewFrustum, bool isFullScene); + bool usesViewFrustum); const ViewFrustum& getCurrentView() const { return _currentView.viewFrustum; } const ViewFrustum& getCompletedView() const { return _completedView.viewFrustum; } From 45e5d91b9dcc2cc035b25965d2e16869c39b6c7b Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Sat, 4 Nov 2017 20:49:55 -0700 Subject: [PATCH 25/44] Change the sub renderItemIDs list of the Model entity in its meta through a transaction instead of going through the pointer to the model --- .../entities-renderer/src/RenderableEntityItem.cpp | 8 ++++++++ .../entities-renderer/src/RenderableEntityItem.h | 4 ++++ .../src/RenderableModelEntityItem.cpp | 13 ++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderableEntityItem.cpp b/libraries/entities-renderer/src/RenderableEntityItem.cpp index f9e88b430f..9e4d832037 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableEntityItem.cpp @@ -295,6 +295,14 @@ void EntityRenderer::updateInScene(const ScenePointer& scene, Transaction& trans }); } +void EntityRenderer::clearSubRenderItemIDs() { + _subRenderItemIDs.clear(); +} + +void EntityRenderer::setSubRenderItemIDs(const render::ItemIDs& ids) { + _subRenderItemIDs = ids; +} + // // Internal methods // diff --git a/libraries/entities-renderer/src/RenderableEntityItem.h b/libraries/entities-renderer/src/RenderableEntityItem.h index d770e7c7aa..ed636ebf73 100644 --- a/libraries/entities-renderer/src/RenderableEntityItem.h +++ b/libraries/entities-renderer/src/RenderableEntityItem.h @@ -49,6 +49,9 @@ public: virtual bool addToScene(const ScenePointer& scene, Transaction& transaction) final; virtual void removeFromScene(const ScenePointer& scene, Transaction& transaction); + void clearSubRenderItemIDs(); + void setSubRenderItemIDs(const render::ItemIDs& ids); + protected: virtual bool needsRenderUpdateFromEntity() const final { return needsRenderUpdateFromEntity(_entity); } virtual void onAddToScene(const EntityItemPointer& entity); @@ -113,6 +116,7 @@ protected: SharedSoundPointer _collisionSound; QUuid _changeHandlerId; ItemID _renderItemID{ Item::INVALID_ITEM_ID }; + ItemIDs _subRenderItemIDs; quint64 _fadeStartTime{ usecTimestampNow() }; bool _isFading{ _entitiesShouldFadeFunction() }; bool _prevIsTransparent { false }; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 03380ad321..d09db97cc3 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -953,7 +953,8 @@ ItemKey ModelEntityRenderer::getKey() { uint32_t ModelEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) { if (_model) { - auto metaSubItems = _model->fetchRenderItemIDs(); + // auto metaSubItems = _model->fetchRenderItemIDs(); + auto metaSubItems = _subRenderItemIDs; subItems.insert(subItems.end(), metaSubItems.begin(), metaSubItems.end()); return (uint32_t)metaSubItems.size(); } @@ -1202,6 +1203,10 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce if ((bool)model) { model->removeFromScene(scene, transaction); withWriteLock([&] { _model.reset(); }); + transaction.updateItem(getRenderItemID(), [](PayloadProxyInterface& data) { + auto re = static_cast(&data); + re->clearSubRenderItemIDs(); + }); } return; } @@ -1297,6 +1302,12 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce render::Item::Status::Getters statusGetters; makeStatusGetters(entity, statusGetters); model->addToScene(scene, transaction, statusGetters); + + auto newRenderItemIDs{ model->fetchRenderItemIDs() }; + transaction.updateItem(getRenderItemID(), [newRenderItemIDs](PayloadProxyInterface& data) { + auto re = static_cast(&data); + re->setSubRenderItemIDs(newRenderItemIDs); + }); } } From 9db0dd6fea01773b03f83fc65c6766b8da9952e2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sun, 5 Nov 2017 20:38:37 +1300 Subject: [PATCH 26/44] Fix Asset Browser's "Copy URL" context menu --- interface/resources/qml/hifi/AssetServer.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/resources/qml/hifi/AssetServer.qml b/interface/resources/qml/hifi/AssetServer.qml index 5358ad1adc..37c3c2adab 100644 --- a/interface/resources/qml/hifi/AssetServer.qml +++ b/interface/resources/qml/hifi/AssetServer.qml @@ -16,10 +16,10 @@ import Qt.labs.settings 1.0 import "../styles-uit" import "../controls-uit" as HifiControls -import "../windows" +import "../windows" as Windows import "../dialogs" -ScrollingWindow { +Windows.ScrollingWindow { id: root objectName: "AssetServer" title: "Asset Browser" From e2ca3c6de04e6662f83ff80f550871220bd8afb8 Mon Sep 17 00:00:00 2001 From: Midnight Date: Sun, 5 Nov 2017 13:39:26 -0700 Subject: [PATCH 27/44] Fix lib file path Changed the include to what should be the correct file path. it does not exist in the controllers folder. --- scripts/system/libraries/cloneEntityUtils.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/system/libraries/cloneEntityUtils.js b/scripts/system/libraries/cloneEntityUtils.js index 777504b16d..63b161eb80 100644 --- a/scripts/system/libraries/cloneEntityUtils.js +++ b/scripts/system/libraries/cloneEntityUtils.js @@ -8,8 +8,7 @@ /* global entityIsCloneable:true, getGrabbableData:true, cloneEntity:true, propsAreCloneDynamic:true, Script, propsAreCloneDynamic:true, Entities*/ -Script.include("/~/system/controllers/controllerDispatcherUtils.js"); - +Script.include("/~/system/libraries/controllerDispatcherUtils.js"); // Object assign polyfill if (typeof Object.assign !== 'function') { From 0d900d7871ea681bd700a9db083a55913e8ee53b Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 6 Nov 2017 09:12:02 -0800 Subject: [PATCH 28/44] code style and comment --- .../entities-renderer/src/RenderableModelEntityItem.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index d09db97cc3..6b30d2a7e8 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -953,7 +953,6 @@ ItemKey ModelEntityRenderer::getKey() { uint32_t ModelEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) { if (_model) { - // auto metaSubItems = _model->fetchRenderItemIDs(); auto metaSubItems = _subRenderItemIDs; subItems.insert(subItems.end(), metaSubItems.begin(), metaSubItems.end()); return (uint32_t)metaSubItems.size(); @@ -1204,8 +1203,8 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce model->removeFromScene(scene, transaction); withWriteLock([&] { _model.reset(); }); transaction.updateItem(getRenderItemID(), [](PayloadProxyInterface& data) { - auto re = static_cast(&data); - re->clearSubRenderItemIDs(); + auto entityRenderer = static_cast(&data); + entityRenderer->clearSubRenderItemIDs(); }); } return; @@ -1305,8 +1304,8 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce auto newRenderItemIDs{ model->fetchRenderItemIDs() }; transaction.updateItem(getRenderItemID(), [newRenderItemIDs](PayloadProxyInterface& data) { - auto re = static_cast(&data); - re->setSubRenderItemIDs(newRenderItemIDs); + auto entityRenderer = static_cast(&data); + entityRenderer->setSubRenderItemIDs(newRenderItemIDs); }); } } From d878fac62c0a962f9b1161956af0f9d483a5be7a Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 6 Nov 2017 11:25:02 -0800 Subject: [PATCH 29/44] REverse changes --- .../src/RenderableModelEntityItem.cpp | 9 ++++---- libraries/render-utils/src/DeferredBuffer.slh | 22 +++++++++---------- .../render-utils/src/DeferredBufferRead.slh | 7 +++++- libraries/render-utils/src/LightingModel.slh | 2 +- libraries/render-utils/src/forward_model.slf | 10 +++++---- .../src/forward_model_translucent.slf | 10 +++++---- .../render-utils/src/model_translucent.slf | 11 ++++++---- .../src/model_translucent_fade.slf | 10 +++++---- .../render-utils/src/overlay3D_model.slf | 10 +++++---- .../src/overlay3D_model_translucent.slf | 10 +++++---- 10 files changed, 59 insertions(+), 42 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index d09db97cc3..6b30d2a7e8 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -953,7 +953,6 @@ ItemKey ModelEntityRenderer::getKey() { uint32_t ModelEntityRenderer::metaFetchMetaSubItems(ItemIDs& subItems) { if (_model) { - // auto metaSubItems = _model->fetchRenderItemIDs(); auto metaSubItems = _subRenderItemIDs; subItems.insert(subItems.end(), metaSubItems.begin(), metaSubItems.end()); return (uint32_t)metaSubItems.size(); @@ -1204,8 +1203,8 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce model->removeFromScene(scene, transaction); withWriteLock([&] { _model.reset(); }); transaction.updateItem(getRenderItemID(), [](PayloadProxyInterface& data) { - auto re = static_cast(&data); - re->clearSubRenderItemIDs(); + auto entityRenderer = static_cast(&data); + entityRenderer->clearSubRenderItemIDs(); }); } return; @@ -1305,8 +1304,8 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce auto newRenderItemIDs{ model->fetchRenderItemIDs() }; transaction.updateItem(getRenderItemID(), [newRenderItemIDs](PayloadProxyInterface& data) { - auto re = static_cast(&data); - re->setSubRenderItemIDs(newRenderItemIDs); + auto entityRenderer = static_cast(&data); + entityRenderer->setSubRenderItemIDs(newRenderItemIDs); }); } } diff --git a/libraries/render-utils/src/DeferredBuffer.slh b/libraries/render-utils/src/DeferredBuffer.slh index a13c2ec5d1..5f6ef62559 100644 --- a/libraries/render-utils/src/DeferredBuffer.slh +++ b/libraries/render-utils/src/DeferredBuffer.slh @@ -15,18 +15,18 @@ // Unpack the metallic-mode value const float FRAG_PACK_SHADED_NON_METALLIC = 0.0; -const float FRAG_PACK_SHADED_METALLIC = 0.1; +const float FRAG_PACK_SHADED_METALLIC = 0.5; const float FRAG_PACK_SHADED_RANGE_INV = 1.0 / (FRAG_PACK_SHADED_METALLIC - FRAG_PACK_SHADED_NON_METALLIC); -const float FRAG_PACK_LIGHTMAPPED_NON_METALLIC = 0.2; -const float FRAG_PACK_LIGHTMAPPED_METALLIC = 0.3; -const float FRAG_PACK_LIGHTMAPPED_RANGE_INV = 1.0 / (FRAG_PACK_LIGHTMAPPED_METALLIC - FRAG_PACK_LIGHTMAPPED_NON_METALLIC); - -const float FRAG_PACK_SCATTERING_NON_METALLIC = 0.4; -const float FRAG_PACK_SCATTERING_METALLIC = 0.5; +const float FRAG_PACK_SCATTERING_NON_METALLIC = 0.501; +const float FRAG_PACK_SCATTERING_METALLIC = 0.6; const float FRAG_PACK_SCATTERING_RANGE_INV = 1.0 / (FRAG_PACK_SCATTERING_METALLIC - FRAG_PACK_SCATTERING_NON_METALLIC); -const float FRAG_PACK_UNLIT = 0.6; +const float FRAG_PACK_LIGHTMAPPED_NON_METALLIC = 0.601; +const float FRAG_PACK_LIGHTMAPPED_METALLIC = 0.99; +const float FRAG_PACK_LIGHTMAPPED_RANGE_INV = 1.0 / (FRAG_PACK_LIGHTMAPPED_METALLIC - FRAG_PACK_LIGHTMAPPED_NON_METALLIC); + +const float FRAG_PACK_UNLIT = 1.0; const int FRAG_MODE_UNLIT = 0; const int FRAG_MODE_SHADED = 1; @@ -37,12 +37,12 @@ void unpackModeMetallic(float rawValue, out int mode, out float metallic) { if (rawValue <= FRAG_PACK_SHADED_METALLIC) { mode = FRAG_MODE_SHADED; metallic = clamp((rawValue - FRAG_PACK_SHADED_NON_METALLIC) * FRAG_PACK_SHADED_RANGE_INV, 0.0, 1.0); - } else if (rawValue <= FRAG_PACK_LIGHTMAPPED_METALLIC) { - mode = FRAG_MODE_LIGHTMAPPED; - metallic = clamp((rawValue - FRAG_PACK_LIGHTMAPPED_NON_METALLIC) * FRAG_PACK_LIGHTMAPPED_RANGE_INV, 0.0, 1.0); } else if (rawValue <= FRAG_PACK_SCATTERING_METALLIC) { mode = FRAG_MODE_SCATTERING; metallic = clamp((rawValue - FRAG_PACK_SCATTERING_NON_METALLIC) * FRAG_PACK_SCATTERING_RANGE_INV, 0.0, 1.0); + } else if (rawValue <= FRAG_PACK_LIGHTMAPPED_METALLIC) { + mode = FRAG_MODE_LIGHTMAPPED; + metallic = clamp((rawValue - FRAG_PACK_LIGHTMAPPED_NON_METALLIC) * FRAG_PACK_LIGHTMAPPED_RANGE_INV, 0.0, 1.0); } else if (rawValue >= FRAG_PACK_UNLIT) { mode = FRAG_MODE_UNLIT; metallic = 0.0; diff --git a/libraries/render-utils/src/DeferredBufferRead.slh b/libraries/render-utils/src/DeferredBufferRead.slh index fbca241bb9..4f46f1d7da 100644 --- a/libraries/render-utils/src/DeferredBufferRead.slh +++ b/libraries/render-utils/src/DeferredBufferRead.slh @@ -73,13 +73,15 @@ DeferredFragment unpackDeferredFragmentNoPosition(vec2 texcoord) { frag.scattering = specularVal.x; } + /* if (frag.metallic <= 0.5) { frag.metallic = 0.0; frag.fresnel = vec3(0.03); // Default Di-electric fresnel value } else { frag.fresnel = vec3(diffuseVal.xyz); frag.metallic = 1.0; - } + }*/ + frag.fresnel = mix(vec3(0.03), diffuseVal.xyz, frag.metallic); return frag; } @@ -107,6 +109,7 @@ DeferredFragment unpackDeferredFragmentNoPositionNoAmbient(vec2 texcoord) { frag.obscurance = 1.0; + /* if (frag.metallic <= 0.5) { frag.metallic = 0.0; frag.fresnel = vec3(0.03); // Default Di-electric fresnel value @@ -114,6 +117,8 @@ DeferredFragment unpackDeferredFragmentNoPositionNoAmbient(vec2 texcoord) { frag.fresnel = vec3(diffuseVal.xyz); frag.metallic = 1.0; } + */ + frag.fresnel = mix(vec3(0.03), diffuseVal.xyz, frag.metallic); return frag; } diff --git a/libraries/render-utils/src/LightingModel.slh b/libraries/render-utils/src/LightingModel.slh index 521c4894dc..d37788c018 100644 --- a/libraries/render-utils/src/LightingModel.slh +++ b/libraries/render-utils/src/LightingModel.slh @@ -135,7 +135,7 @@ float specularDistributionGloss(float gloss2, vec3 normal, vec3 halfDir) { float ndoth = clamp(dot(halfDir, normal), 0.0, 1.0); // float gloss2 = pow(0.001 + roughness, 4); float denom = (ndoth * ndoth*(gloss2 - 1.0) + 1.0); - float power = gloss2 / (3.14159 * denom * denom); + float power = gloss2 * gloss2 / (3.14159 * denom * denom); return power; } ; diff --git a/libraries/render-utils/src/forward_model_translucent.slf b/libraries/render-utils/src/forward_model_translucent.slf index 52e8ce50e7..af618775eb 100644 --- a/libraries/render-utils/src/forward_model_translucent.slf +++ b/libraries/render-utils/src/forward_model_translucent.slf @@ -50,13 +50,15 @@ void main(void) { <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; float metallic = getMaterialMetallic(mat); - vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } + */ + vec3 fresnel = mix(vec3(0.03), albedo, metallic); vec3 emissive = getMaterialEmissive(mat); <$evalMaterialEmissive(emissiveTex, emissive, matKey, emissive)$>; diff --git a/libraries/render-utils/src/model_translucent.slf b/libraries/render-utils/src/model_translucent.slf index 6cf99a68ef..8a0f9c76a9 100644 --- a/libraries/render-utils/src/model_translucent.slf +++ b/libraries/render-utils/src/model_translucent.slf @@ -50,13 +50,16 @@ void main(void) { <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; float metallic = getMaterialMetallic(mat); - vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } + */ + vec3 fresnel = mix(vec3(0.03), albedo, metallic); + vec3 emissive = getMaterialEmissive(mat); <$evalMaterialEmissive(emissiveTex, emissive, matKey, emissive)$>; diff --git a/libraries/render-utils/src/model_translucent_fade.slf b/libraries/render-utils/src/model_translucent_fade.slf index c46b396ebc..375e59acae 100644 --- a/libraries/render-utils/src/model_translucent_fade.slf +++ b/libraries/render-utils/src/model_translucent_fade.slf @@ -60,13 +60,15 @@ void main(void) { <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; float metallic = getMaterialMetallic(mat); - vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } + */ + vec3 fresnel = mix(vec3(0.03), albedo, metallic); vec3 emissive = getMaterialEmissive(mat); <$evalMaterialEmissive(emissiveTex, emissive, matKey, emissive)$>; diff --git a/libraries/render-utils/src/overlay3D_model.slf b/libraries/render-utils/src/overlay3D_model.slf index bb0d84a513..ab7427b175 100644 --- a/libraries/render-utils/src/overlay3D_model.slf +++ b/libraries/render-utils/src/overlay3D_model.slf @@ -46,13 +46,15 @@ void main(void) { albedo *= _color; float metallic = getMaterialMetallic(mat); - vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } + */ + vec3 fresnel = mix(vec3(0.03), albedo, metallic); float roughness = getMaterialRoughness(mat); <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; diff --git a/libraries/render-utils/src/overlay3D_model_translucent.slf b/libraries/render-utils/src/overlay3D_model_translucent.slf index 748eea329c..831ea157ed 100644 --- a/libraries/render-utils/src/overlay3D_model_translucent.slf +++ b/libraries/render-utils/src/overlay3D_model_translucent.slf @@ -44,13 +44,15 @@ void main(void) { albedo *= _color; float metallic = getMaterialMetallic(mat); - vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } + */ + vec3 fresnel = mix(vec3(0.03), albedo, metallic); float roughness = getMaterialRoughness(mat); <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; From 9652902911af2e11879b9d5947a6ffe04fa42b0c Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 6 Nov 2017 12:43:22 -0800 Subject: [PATCH 30/44] Removing the changes that i introduced by mistake from another branch :(((( --- libraries/render-utils/src/DeferredBuffer.slh | 18 +++++++++--------- .../render-utils/src/DeferredBufferRead.slh | 7 +------ libraries/render-utils/src/LightingModel.slh | 2 +- libraries/render-utils/src/forward_model.slf | 10 ++++------ .../src/forward_model_translucent.slf | 10 ++++------ .../render-utils/src/model_translucent.slf | 10 ++++------ .../src/model_translucent_fade.slf | 10 ++++------ libraries/render-utils/src/overlay3D_model.slf | 10 ++++------ .../src/overlay3D_model_translucent.slf | 10 ++++------ 9 files changed, 35 insertions(+), 52 deletions(-) diff --git a/libraries/render-utils/src/DeferredBuffer.slh b/libraries/render-utils/src/DeferredBuffer.slh index 5f6ef62559..93d8c720a7 100644 --- a/libraries/render-utils/src/DeferredBuffer.slh +++ b/libraries/render-utils/src/DeferredBuffer.slh @@ -15,18 +15,18 @@ // Unpack the metallic-mode value const float FRAG_PACK_SHADED_NON_METALLIC = 0.0; -const float FRAG_PACK_SHADED_METALLIC = 0.5; +const float FRAG_PACK_SHADED_METALLIC = 0.1; const float FRAG_PACK_SHADED_RANGE_INV = 1.0 / (FRAG_PACK_SHADED_METALLIC - FRAG_PACK_SHADED_NON_METALLIC); -const float FRAG_PACK_SCATTERING_NON_METALLIC = 0.501; -const float FRAG_PACK_SCATTERING_METALLIC = 0.6; +const float FRAG_PACK_SCATTERING_NON_METALLIC = 0.2; +const float FRAG_PACK_SCATTERING_METALLIC = 0.3; const float FRAG_PACK_SCATTERING_RANGE_INV = 1.0 / (FRAG_PACK_SCATTERING_METALLIC - FRAG_PACK_SCATTERING_NON_METALLIC); -const float FRAG_PACK_LIGHTMAPPED_NON_METALLIC = 0.601; -const float FRAG_PACK_LIGHTMAPPED_METALLIC = 0.99; +const float FRAG_PACK_LIGHTMAPPED_NON_METALLIC = 0.4; +const float FRAG_PACK_LIGHTMAPPED_METALLIC = 0.5; const float FRAG_PACK_LIGHTMAPPED_RANGE_INV = 1.0 / (FRAG_PACK_LIGHTMAPPED_METALLIC - FRAG_PACK_LIGHTMAPPED_NON_METALLIC); -const float FRAG_PACK_UNLIT = 1.0; +const float FRAG_PACK_UNLIT = 0.6; const int FRAG_MODE_UNLIT = 0; const int FRAG_MODE_SHADED = 1; @@ -37,12 +37,12 @@ void unpackModeMetallic(float rawValue, out int mode, out float metallic) { if (rawValue <= FRAG_PACK_SHADED_METALLIC) { mode = FRAG_MODE_SHADED; metallic = clamp((rawValue - FRAG_PACK_SHADED_NON_METALLIC) * FRAG_PACK_SHADED_RANGE_INV, 0.0, 1.0); - } else if (rawValue <= FRAG_PACK_SCATTERING_METALLIC) { - mode = FRAG_MODE_SCATTERING; - metallic = clamp((rawValue - FRAG_PACK_SCATTERING_NON_METALLIC) * FRAG_PACK_SCATTERING_RANGE_INV, 0.0, 1.0); } else if (rawValue <= FRAG_PACK_LIGHTMAPPED_METALLIC) { mode = FRAG_MODE_LIGHTMAPPED; metallic = clamp((rawValue - FRAG_PACK_LIGHTMAPPED_NON_METALLIC) * FRAG_PACK_LIGHTMAPPED_RANGE_INV, 0.0, 1.0); + } else if (rawValue <= FRAG_PACK_SCATTERING_METALLIC) { + mode = FRAG_MODE_SCATTERING; + metallic = clamp((rawValue - FRAG_PACK_SCATTERING_NON_METALLIC) * FRAG_PACK_SCATTERING_RANGE_INV, 0.0, 1.0); } else if (rawValue >= FRAG_PACK_UNLIT) { mode = FRAG_MODE_UNLIT; metallic = 0.0; diff --git a/libraries/render-utils/src/DeferredBufferRead.slh b/libraries/render-utils/src/DeferredBufferRead.slh index 4f46f1d7da..fbca241bb9 100644 --- a/libraries/render-utils/src/DeferredBufferRead.slh +++ b/libraries/render-utils/src/DeferredBufferRead.slh @@ -73,15 +73,13 @@ DeferredFragment unpackDeferredFragmentNoPosition(vec2 texcoord) { frag.scattering = specularVal.x; } - /* if (frag.metallic <= 0.5) { frag.metallic = 0.0; frag.fresnel = vec3(0.03); // Default Di-electric fresnel value } else { frag.fresnel = vec3(diffuseVal.xyz); frag.metallic = 1.0; - }*/ - frag.fresnel = mix(vec3(0.03), diffuseVal.xyz, frag.metallic); + } return frag; } @@ -109,7 +107,6 @@ DeferredFragment unpackDeferredFragmentNoPositionNoAmbient(vec2 texcoord) { frag.obscurance = 1.0; - /* if (frag.metallic <= 0.5) { frag.metallic = 0.0; frag.fresnel = vec3(0.03); // Default Di-electric fresnel value @@ -117,8 +114,6 @@ DeferredFragment unpackDeferredFragmentNoPositionNoAmbient(vec2 texcoord) { frag.fresnel = vec3(diffuseVal.xyz); frag.metallic = 1.0; } - */ - frag.fresnel = mix(vec3(0.03), diffuseVal.xyz, frag.metallic); return frag; } diff --git a/libraries/render-utils/src/LightingModel.slh b/libraries/render-utils/src/LightingModel.slh index d37788c018..521c4894dc 100644 --- a/libraries/render-utils/src/LightingModel.slh +++ b/libraries/render-utils/src/LightingModel.slh @@ -135,7 +135,7 @@ float specularDistributionGloss(float gloss2, vec3 normal, vec3 halfDir) { float ndoth = clamp(dot(halfDir, normal), 0.0, 1.0); // float gloss2 = pow(0.001 + roughness, 4); float denom = (ndoth * ndoth*(gloss2 - 1.0) + 1.0); - float power = gloss2 * gloss2 / (3.14159 * denom * denom); + float power = gloss2 / (3.14159 * denom * denom); return power; } ; diff --git a/libraries/render-utils/src/forward_model_translucent.slf b/libraries/render-utils/src/forward_model_translucent.slf index af618775eb..52e8ce50e7 100644 --- a/libraries/render-utils/src/forward_model_translucent.slf +++ b/libraries/render-utils/src/forward_model_translucent.slf @@ -50,15 +50,13 @@ void main(void) { <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; float metallic = getMaterialMetallic(mat); - /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } - */ - vec3 fresnel = mix(vec3(0.03), albedo, metallic); vec3 emissive = getMaterialEmissive(mat); <$evalMaterialEmissive(emissiveTex, emissive, matKey, emissive)$>; diff --git a/libraries/render-utils/src/model_translucent.slf b/libraries/render-utils/src/model_translucent.slf index 8a0f9c76a9..d69e7a0bf3 100644 --- a/libraries/render-utils/src/model_translucent.slf +++ b/libraries/render-utils/src/model_translucent.slf @@ -50,15 +50,13 @@ void main(void) { <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; float metallic = getMaterialMetallic(mat); - /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } - */ - vec3 fresnel = mix(vec3(0.03), albedo, metallic); vec3 emissive = getMaterialEmissive(mat); diff --git a/libraries/render-utils/src/model_translucent_fade.slf b/libraries/render-utils/src/model_translucent_fade.slf index 375e59acae..c46b396ebc 100644 --- a/libraries/render-utils/src/model_translucent_fade.slf +++ b/libraries/render-utils/src/model_translucent_fade.slf @@ -60,15 +60,13 @@ void main(void) { <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; float metallic = getMaterialMetallic(mat); - /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } - */ - vec3 fresnel = mix(vec3(0.03), albedo, metallic); vec3 emissive = getMaterialEmissive(mat); <$evalMaterialEmissive(emissiveTex, emissive, matKey, emissive)$>; diff --git a/libraries/render-utils/src/overlay3D_model.slf b/libraries/render-utils/src/overlay3D_model.slf index ab7427b175..bb0d84a513 100644 --- a/libraries/render-utils/src/overlay3D_model.slf +++ b/libraries/render-utils/src/overlay3D_model.slf @@ -46,15 +46,13 @@ void main(void) { albedo *= _color; float metallic = getMaterialMetallic(mat); - /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } - */ - vec3 fresnel = mix(vec3(0.03), albedo, metallic); float roughness = getMaterialRoughness(mat); <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; diff --git a/libraries/render-utils/src/overlay3D_model_translucent.slf b/libraries/render-utils/src/overlay3D_model_translucent.slf index 831ea157ed..748eea329c 100644 --- a/libraries/render-utils/src/overlay3D_model_translucent.slf +++ b/libraries/render-utils/src/overlay3D_model_translucent.slf @@ -44,15 +44,13 @@ void main(void) { albedo *= _color; float metallic = getMaterialMetallic(mat); - /* vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value + vec3 fresnel = vec3(0.03); // Default Di-electric fresnel value if (metallic <= 0.5) { - metallic = 0.0; + metallic = 0.0; } else { - fresnel = albedo; - metallic = 1.0; + fresnel = albedo; + metallic = 1.0; } - */ - vec3 fresnel = mix(vec3(0.03), albedo, metallic); float roughness = getMaterialRoughness(mat); <$evalMaterialRoughness(roughnessTex, roughness, matKey, roughness)$>; From dfa4afc7f6410df9a18c6a5242dbae4a3d469795 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 6 Nov 2017 12:47:34 -0800 Subject: [PATCH 31/44] and again, clean up --- libraries/render-utils/src/DeferredBuffer.slh | 12 ++++++------ libraries/render-utils/src/model_translucent.slf | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/libraries/render-utils/src/DeferredBuffer.slh b/libraries/render-utils/src/DeferredBuffer.slh index 93d8c720a7..a13c2ec5d1 100644 --- a/libraries/render-utils/src/DeferredBuffer.slh +++ b/libraries/render-utils/src/DeferredBuffer.slh @@ -18,14 +18,14 @@ const float FRAG_PACK_SHADED_NON_METALLIC = 0.0; const float FRAG_PACK_SHADED_METALLIC = 0.1; const float FRAG_PACK_SHADED_RANGE_INV = 1.0 / (FRAG_PACK_SHADED_METALLIC - FRAG_PACK_SHADED_NON_METALLIC); -const float FRAG_PACK_SCATTERING_NON_METALLIC = 0.2; -const float FRAG_PACK_SCATTERING_METALLIC = 0.3; -const float FRAG_PACK_SCATTERING_RANGE_INV = 1.0 / (FRAG_PACK_SCATTERING_METALLIC - FRAG_PACK_SCATTERING_NON_METALLIC); - -const float FRAG_PACK_LIGHTMAPPED_NON_METALLIC = 0.4; -const float FRAG_PACK_LIGHTMAPPED_METALLIC = 0.5; +const float FRAG_PACK_LIGHTMAPPED_NON_METALLIC = 0.2; +const float FRAG_PACK_LIGHTMAPPED_METALLIC = 0.3; const float FRAG_PACK_LIGHTMAPPED_RANGE_INV = 1.0 / (FRAG_PACK_LIGHTMAPPED_METALLIC - FRAG_PACK_LIGHTMAPPED_NON_METALLIC); +const float FRAG_PACK_SCATTERING_NON_METALLIC = 0.4; +const float FRAG_PACK_SCATTERING_METALLIC = 0.5; +const float FRAG_PACK_SCATTERING_RANGE_INV = 1.0 / (FRAG_PACK_SCATTERING_METALLIC - FRAG_PACK_SCATTERING_NON_METALLIC); + const float FRAG_PACK_UNLIT = 0.6; const int FRAG_MODE_UNLIT = 0; diff --git a/libraries/render-utils/src/model_translucent.slf b/libraries/render-utils/src/model_translucent.slf index d69e7a0bf3..6cf99a68ef 100644 --- a/libraries/render-utils/src/model_translucent.slf +++ b/libraries/render-utils/src/model_translucent.slf @@ -58,7 +58,6 @@ void main(void) { metallic = 1.0; } - vec3 emissive = getMaterialEmissive(mat); <$evalMaterialEmissive(emissiveTex, emissive, matKey, emissive)$>; From bb21c52783dba74bae3a32eff1266306c8a0f5c8 Mon Sep 17 00:00:00 2001 From: Zach Fox Date: Mon, 6 Nov 2017 15:12:01 -0800 Subject: [PATCH 32/44] Fix crash when logging out while Passphrase screen visible --- interface/src/commerce/QmlCommerce.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/commerce/QmlCommerce.cpp b/interface/src/commerce/QmlCommerce.cpp index 9d07ddb4ab..f29e46d843 100644 --- a/interface/src/commerce/QmlCommerce.cpp +++ b/interface/src/commerce/QmlCommerce.cpp @@ -33,7 +33,7 @@ QmlCommerce::QmlCommerce(QQuickItem* parent) : OffscreenQmlDialog(parent) { connect(ledger.data(), &Ledger::updateCertificateStatus, this, &QmlCommerce::updateCertificateStatus); auto accountManager = DependencyManager::get(); - connect(accountManager.data(), &AccountManager::usernameChanged, [&]() { + connect(accountManager.data(), &AccountManager::usernameChanged, this, [&]() { setPassphrase(""); }); } From 3b15897b123e40d6faa1dab4edb46bc36f77fd04 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 6 Nov 2017 15:21:20 -0800 Subject: [PATCH 33/44] fixed farGrab parent grabbing and laser LockEndUUID --- interface/src/raypick/LaserPointer.cpp | 11 +- interface/src/raypick/LaserPointer.h | 3 +- interface/src/raypick/LaserPointerManager.cpp | 4 +- interface/src/raypick/LaserPointerManager.h | 2 +- .../raypick/LaserPointerScriptingInterface.h | 2 +- .../controllerModules/farActionGrabEntity.js | 107 +++++++++++------- .../libraries/controllerDispatcherUtils.js | 10 -- 7 files changed, 78 insertions(+), 61 deletions(-) diff --git a/interface/src/raypick/LaserPointer.cpp b/interface/src/raypick/LaserPointer.cpp index 9da8ff34ac..0d691911c8 100644 --- a/interface/src/raypick/LaserPointer.cpp +++ b/interface/src/raypick/LaserPointer.cpp @@ -25,7 +25,7 @@ LaserPointer::LaserPointer(const QVariant& rayProps, const RenderStateMap& rende _distanceScaleEnd(distanceScaleEnd), _rayPickUID(DependencyManager::get()->createRayPick(rayProps)) { - + _offsetMat = glm::mat4(); for (auto& state : _renderStates) { if (!enabled || state.first != _currentRenderState) { @@ -134,8 +134,10 @@ void LaserPointer::updateRenderState(const RenderState& renderState, const Inter registrationPoint = glm::vec3(0.5f); } else { EntityItemProperties props = DependencyManager::get()->getEntityProperties(_objectLockEnd.first); - pos = props.getPosition(); - rot = props.getRotation(); + glm::mat4 entityMat = createMatFromQuatAndPos(props.getRotation(), props.getPosition()); + glm::mat4 finalPosAndRotMat = entityMat * _offsetMat; + pos = extractTranslation(finalPosAndRotMat); + rot = glmExtractRotation(finalPosAndRotMat); dim = props.getDimensions(); registrationPoint = props.getRegistrationPoint(); } @@ -233,9 +235,10 @@ void LaserPointer::setLaserLength(const float laserLength) { }); } -void LaserPointer::setLockEndUUID(QUuid objectID, const bool isOverlay, const glm::mat4& offset) { +void LaserPointer::setLockEndUUID(QUuid objectID, const bool isOverlay, const glm::mat4& offsetMat) { withWriteLock([&] { _objectLockEnd = std::pair(objectID, isOverlay); + _offsetMat = offsetMat; }); } diff --git a/interface/src/raypick/LaserPointer.h b/interface/src/raypick/LaserPointer.h index a80f9d447d..40a7d93356 100644 --- a/interface/src/raypick/LaserPointer.h +++ b/interface/src/raypick/LaserPointer.h @@ -74,7 +74,7 @@ public: void setPrecisionPicking(const bool precisionPicking); void setLaserLength(const float laserLength); - void setLockEndUUID(QUuid objectID, const bool isOverlay, const glm::mat4& offset = glm::mat4()); + void setLockEndUUID(QUuid objectID, const bool isOverlay, const glm::mat4& offsetMat = glm::mat4()); void setIgnoreItems(const QVector& ignoreItems) const; void setIncludeItems(const QVector& includeItems) const; @@ -91,6 +91,7 @@ private: bool _centerEndY; bool _lockEnd; bool _distanceScaleEnd; + glm::mat4 _offsetMat; std::pair _objectLockEnd { std::pair(QUuid(), false)}; const QUuid _rayPickUID; diff --git a/interface/src/raypick/LaserPointerManager.cpp b/interface/src/raypick/LaserPointerManager.cpp index 9d58cc2587..45420d1488 100644 --- a/interface/src/raypick/LaserPointerManager.cpp +++ b/interface/src/raypick/LaserPointerManager.cpp @@ -113,9 +113,9 @@ void LaserPointerManager::setIncludeItems(const QUuid& uid, const QVector } } -void LaserPointerManager::setLockEndUUID(const QUuid& uid, const QUuid& objectID, const bool isOverlay) const { +void LaserPointerManager::setLockEndUUID(const QUuid& uid, const QUuid& objectID, const bool isOverlay, const glm::mat4& offsetMat) const { auto laserPointer = find(uid); if (laserPointer) { - laserPointer->setLockEndUUID(objectID, isOverlay); + laserPointer->setLockEndUUID(objectID, isOverlay, offsetMat); } } diff --git a/interface/src/raypick/LaserPointerManager.h b/interface/src/raypick/LaserPointerManager.h index e302318483..25089a291a 100644 --- a/interface/src/raypick/LaserPointerManager.h +++ b/interface/src/raypick/LaserPointerManager.h @@ -39,7 +39,7 @@ public: void setIgnoreItems(const QUuid& uid, const QVector& ignoreEntities) const; void setIncludeItems(const QUuid& uid, const QVector& includeEntities) const; - void setLockEndUUID(const QUuid& uid, const QUuid& objectID, const bool isOverlay) const; + void setLockEndUUID(const QUuid& uid, const QUuid& objectID, const bool isOverlay, const glm::mat4& offsetMat = glm::mat4()) const; void update(); diff --git a/interface/src/raypick/LaserPointerScriptingInterface.h b/interface/src/raypick/LaserPointerScriptingInterface.h index 19262e6e5d..986c53e24f 100644 --- a/interface/src/raypick/LaserPointerScriptingInterface.h +++ b/interface/src/raypick/LaserPointerScriptingInterface.h @@ -35,7 +35,7 @@ public slots: Q_INVOKABLE void setIgnoreItems(const QUuid& uid, const QScriptValue& ignoreEntities) const; Q_INVOKABLE void setIncludeItems(const QUuid& uid, const QScriptValue& includeEntities) const; - Q_INVOKABLE void setLockEndUUID(const QUuid& uid, const QUuid& objectID, bool isOverlay) const { qApp->getLaserPointerManager().setLockEndUUID(uid, objectID, isOverlay); } + Q_INVOKABLE void setLockEndUUID(const QUuid& uid, const QUuid& objectID, bool isOverlay, const glm::mat4& offsetMat = glm::mat4()) const { qApp->getLaserPointerManager().setLockEndUUID(uid, objectID, isOverlay, offsetMat); } private: static RenderState buildRenderState(const QVariantMap& propMap); diff --git a/scripts/system/controllers/controllerModules/farActionGrabEntity.js b/scripts/system/controllers/controllerModules/farActionGrabEntity.js index e63d7c7c35..7d9a6dc1b5 100644 --- a/scripts/system/controllers/controllerModules/farActionGrabEntity.js +++ b/scripts/system/controllers/controllerModules/farActionGrabEntity.js @@ -13,13 +13,13 @@ makeDispatcherModuleParameters, MSECS_PER_SEC, HAPTIC_PULSE_STRENGTH, HAPTIC_PULSE_DURATION, PICK_MAX_DISTANCE, COLORS_GRAB_SEARCHING_HALF_SQUEEZE, COLORS_GRAB_SEARCHING_FULL_SQUEEZE, COLORS_GRAB_DISTANCE_HOLD, DEFAULT_SEARCH_SPHERE_DISTANCE, TRIGGER_OFF_VALUE, TRIGGER_ON_VALUE, ZERO_VEC, ensureDynamic, - getControllerWorldLocation, projectOntoEntityXYPlane, ContextOverlay, HMD, Reticle, Overlays, isPointingAtUI + getControllerWorldLocation, projectOntoEntityXYPlane, ContextOverlay, HMD, Reticle, Overlays, isPointingAtUI, Xform, getEntityParents */ Script.include("/~/system/libraries/controllerDispatcherUtils.js"); Script.include("/~/system/libraries/controllers.js"); -Script.include("/~/system/libraries/Xform.hs"); +Script.include("/~/system/libraries/Xform.js"); (function() { var PICK_WITH_HAND_RAY = true; @@ -115,32 +115,53 @@ Script.include("/~/system/libraries/Xform.hs"); var MARGIN = 25; - function TargetObject(entityID) { + function TargetObject(entityID, entityProps) { this.entityID = entityID; - this.entityProps = null; - this.parentID = null; - this.parentProps = []; - this.childrenProps = []; - this.parentsCollisionStatus = []; - this.childrenCollisionStatus = []; + this.entityProps = entityProps; + this.targetEntityID = null; + this.targetEntityProps = null; + this.previousCollisionStatus = null; this.madeDynamic = null; - this.parentEntityProps = null; this.makeDynamic = function() { + if (this.targetEntityID) { + var newProps = { + dynamic: true, + collisionless: true + }; + this.previousCollisionStatus = this.targetEntityProps.collisionless; + Entities.editEntity(this.targetEntityID, newProps); + this.madeDynamic = true; + } }; - this.saveCollisionStatus = function() { - }; - - this.restoreEntitiesProperties = function() { + this.restoreTargetEntityOriginalProps = function() { + if (this.madeDynamic) { + var props = {}; + props.dynamic = false; + props.collisionless = this.previousCollisionStatus; + var zeroVector = {x: 0, y: 0, z:0}; + props.localVelocity = zeroVector; + props.localRotation = zeroVector; + Entities.editEntity(this.targetEntityID, props); + } }; this.getTargetEntity = function() { var parentPropsLength = this.parentProps.length; if (parentPropsLength !== 0) { - return this.parentProps[parentPropsLength].id; + var targetEntity = { + id: this.parentProps[parentPropsLength - 1].id, + props: this.parentProps[parentPropsLength - 1]}; + this.targetEntityID = targetEntity.id; + this.targetEntityProps = targetEntity.props; + return targetEntity; } - return this.entityID; + this.targetEntityID = this.entityID; + this.targetEntityProps = this.entityProps; + return { + id: this.entityID, + props: this.entityProps}; }; } @@ -153,11 +174,11 @@ Script.include("/~/system/libraries/Xform.hs"); this.entityWithContextOverlay = false; this.contextOverlayTimer = false; this.previousCollisionStatus = false; + this.locked = false; this.reticleMinX = MARGIN; this.reticleMaxX; this.reticleMinY = MARGIN; this.reticleMaxY; - this.madeDynamic = false; var ACTION_TTL = 15; // seconds @@ -191,10 +212,25 @@ Script.include("/~/system/libraries/Xform.hs"); LaserPointers.enableLaserPointer(laserPointerID); LaserPointers.setRenderState(laserPointerID, mode); if (this.distanceHolding || this.distanceRotating) { - // calculate offset - LaserPointers.setLockEndUUID(laserPointerID, this.entityToLockOnto, this.grabbedIsOverlay); + if (!this.locked) { + // calculate offset + var targetProps = Entities.getEntityProperties(this.targetObject.entityID, [ + "position", + "rotation" + ]); + var zeroVector = { x: 0, y: 0, z:0, w: 0 }; + var intersection = controllerData.rayPicks[this.hand].intersection; + var intersectionMat = new Xform(zeroVector, intersection); + var modelMat = new Xform(targetProps.rotation, targetProps.position); + var modelMatInv = modelMat.inv(); + var xformMat = Xform.mul(modelMatInv, intersectionMat); + var offsetMat = Mat4.createFromRotAndTrans(xformMat.rot, xformMat.pos); + LaserPointers.setLockEndUUID(laserPointerID, this.targetObject.entityID, this.grabbedIsOverlay, offsetMat); + this.locked = true; + } } else { LaserPointers.setLockEndUUID(laserPointerID, null, false); + this.locked = false; } }; @@ -373,22 +409,15 @@ Script.include("/~/system/libraries/Xform.hs"); var args = [this.hand === RIGHT_HAND ? "right" : "left", MyAvatar.sessionUUID]; Entities.callEntityMethod(this.grabbedThingID, "releaseGrab", args); - - if (this.madeDynamic) { - var props = {}; - props.dynamic = false; - props.collisionless = this.previousCollisionStatus; - props.localVelocity = {x: 0, y: 0, z: 0}; - props.localRotation = {x: 0, y: 0, z: 0}; - Entities.editEntity(this.grabbedThingID, props); - this.madeDynamic = false; + if (this.targetObject) { + this.targetObject.restoreTargetEntityOriginalProps(); } this.actionID = null; this.grabbedThingID = null; - this.entityToLockOnto = null; + this.targetObject = null; }; - this.updateRecommendedArea = function() { + this.updateRecommendedArea = function() { var dims = Controller.getViewportDimensions(); this.reticleMaxX = dims.x - MARGIN; this.reticleMaxY = dims.y - MARGIN; @@ -532,30 +561,24 @@ Script.include("/~/system/libraries/Xform.hs"); if (rayPickInfo.type === RayPick.INTERSECTED_ENTITY) { if (controllerData.triggerClicks[this.hand]) { var entityID = rayPickInfo.objectID; - this.entityToLockOnto = entityID; var targetProps = Entities.getEntityProperties(entityID, [ "dynamic", "shapeType", "position", "rotation", "dimensions", "density", "userData", "locked", "type" ]); - this.targetObject = new TargetObject(entityID); + this.targetObject = new TargetObject(entityID, targetProps); + this.targetObject.parentProps = getEntityParents(targetProps); if (entityID !== this.entityWithContextOverlay) { this.destroyContextOverlay(); } + var targetEntity = this.targetObject.getTargetEntity(); + entityID = targetEntity.id; + targetProps = targetEntity.props; if (entityIsGrabbable(targetProps)) { - var groupRootProps = findGroupParent(controllerData, targetProps); - if (entityIsGrabbable(groupRootProps)) { - targetProps = groupRootProps; - entityID = targetProps.id; - } if (!entityIsDistanceGrabbable(targetProps)) { - targetProps.dynamic = true; - this.previousCollisionStatus = targetProps.collisionless; - targetProps.collisionless = true; - Entities.editEntity(entityID, targetProps); - this.madeDynamic = true; + this.targetObject.makeDynamic(); } if (!this.distanceRotating) { diff --git a/scripts/system/libraries/controllerDispatcherUtils.js b/scripts/system/libraries/controllerDispatcherUtils.js index 148530c5ec..fb6de0e683 100644 --- a/scripts/system/libraries/controllerDispatcherUtils.js +++ b/scripts/system/libraries/controllerDispatcherUtils.js @@ -308,16 +308,6 @@ findGroupParent = function (controllerData, targetProps) { return targetProps; }; -getChildrenProps = function(entityID) { - var childrenProps = []; - var childrenIDs = Entities.getChildrenIDs(entityID); - for (var index = 0; index < childrenIDs.length; index++) { - var childProps = Entities.getEntityProperties(childrenIDs[index]); - childrenProps.push(childProps); - } - return childrenProps; -}; - getEntityParents = function(targetProps) { var parentProperties = []; while (targetProps.parentID && From 41c6261b74d0d591a908fa31f255e07354eef803 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 6 Nov 2017 16:04:33 -0800 Subject: [PATCH 34/44] LaserPointer: made _objectLockEnd into a struct --- interface/src/raypick/LaserPointer.cpp | 23 ++++++++++++----------- interface/src/raypick/LaserPointer.h | 8 +++++++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/interface/src/raypick/LaserPointer.cpp b/interface/src/raypick/LaserPointer.cpp index 0d691911c8..f3d74d18a5 100644 --- a/interface/src/raypick/LaserPointer.cpp +++ b/interface/src/raypick/LaserPointer.cpp @@ -119,23 +119,23 @@ void LaserPointer::updateRenderState(const RenderState& renderState, const Inter qApp->getOverlays().editOverlay(renderState.getStartID(), startProps); } glm::vec3 endVec; - if (((defaultState || !_lockEnd) && _objectLockEnd.first.isNull()) || type == IntersectionType::HUD) { + if (((defaultState || !_lockEnd) && _lockEndObject.id.isNull()) || type == IntersectionType::HUD) { endVec = pickRay.origin + pickRay.direction * distance; } else { - if (!_objectLockEnd.first.isNull()) { + if (!_lockEndObject.id.isNull()) { glm::vec3 pos; glm::quat rot; glm::vec3 dim; glm::vec3 registrationPoint; - if (_objectLockEnd.second) { - pos = vec3FromVariant(qApp->getOverlays().getProperty(_objectLockEnd.first, "position").value); - rot = quatFromVariant(qApp->getOverlays().getProperty(_objectLockEnd.first, "rotation").value); - dim = vec3FromVariant(qApp->getOverlays().getProperty(_objectLockEnd.first, "dimensions").value); + if (_lockEndObject.isOverlay) { + pos = vec3FromVariant(qApp->getOverlays().getProperty(_lockEndObject.id, "position").value); + rot = quatFromVariant(qApp->getOverlays().getProperty(_lockEndObject.id, "rotation").value); + dim = vec3FromVariant(qApp->getOverlays().getProperty(_lockEndObject.id, "dimensions").value); registrationPoint = glm::vec3(0.5f); } else { - EntityItemProperties props = DependencyManager::get()->getEntityProperties(_objectLockEnd.first); + EntityItemProperties props = DependencyManager::get()->getEntityProperties(_lockEndObject.id); glm::mat4 entityMat = createMatFromQuatAndPos(props.getRotation(), props.getPosition()); - glm::mat4 finalPosAndRotMat = entityMat * _offsetMat; + glm::mat4 finalPosAndRotMat = entityMat * _lockEndObject.offsetMat; pos = extractTranslation(finalPosAndRotMat); rot = glmExtractRotation(finalPosAndRotMat); dim = props.getDimensions(); @@ -211,7 +211,7 @@ void LaserPointer::update() { withReadLock([&] { RayPickResult prevRayPickResult = qApp->getRayPickManager().getPrevRayPickResult(_rayPickUID); if (_renderingEnabled && !_currentRenderState.empty() && _renderStates.find(_currentRenderState) != _renderStates.end() && - (prevRayPickResult.type != IntersectionType::NONE || _laserLength > 0.0f || !_objectLockEnd.first.isNull())) { + (prevRayPickResult.type != IntersectionType::NONE || _laserLength > 0.0f || !_lockEndObject.id.isNull())) { float distance = _laserLength > 0.0f ? _laserLength : prevRayPickResult.distance; updateRenderState(_renderStates[_currentRenderState], prevRayPickResult.type, distance, prevRayPickResult.objectID, prevRayPickResult.searchRay, false); disableRenderState(_defaultRenderStates[_currentRenderState].second); @@ -237,8 +237,9 @@ void LaserPointer::setLaserLength(const float laserLength) { void LaserPointer::setLockEndUUID(QUuid objectID, const bool isOverlay, const glm::mat4& offsetMat) { withWriteLock([&] { - _objectLockEnd = std::pair(objectID, isOverlay); - _offsetMat = offsetMat; + _lockEndObject.id = objectID; + _lockEndObject.isOverlay; + _lockEndObject.offsetMat = offsetMat; }); } diff --git a/interface/src/raypick/LaserPointer.h b/interface/src/raypick/LaserPointer.h index 40a7d93356..2171698cc5 100644 --- a/interface/src/raypick/LaserPointer.h +++ b/interface/src/raypick/LaserPointer.h @@ -21,6 +21,12 @@ class RayPickResult; +struct LockEndObject { + QUuid id {QUuid()}; + bool isOverlay {false}; + glm::mat4 offsetMat {glm::mat4()}; +}; + class RenderState { public: @@ -91,8 +97,8 @@ private: bool _centerEndY; bool _lockEnd; bool _distanceScaleEnd; + LockEndObject _lockEndObject; glm::mat4 _offsetMat; - std::pair _objectLockEnd { std::pair(QUuid(), false)}; const QUuid _rayPickUID; From 646e5455ac8c4eee8454da1c3fa498196e50e67c Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 6 Nov 2017 16:05:44 -0800 Subject: [PATCH 35/44] forgot to remove unused variable --- interface/src/raypick/LaserPointer.h | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/src/raypick/LaserPointer.h b/interface/src/raypick/LaserPointer.h index 2171698cc5..32ef189d76 100644 --- a/interface/src/raypick/LaserPointer.h +++ b/interface/src/raypick/LaserPointer.h @@ -98,7 +98,6 @@ private: bool _lockEnd; bool _distanceScaleEnd; LockEndObject _lockEndObject; - glm::mat4 _offsetMat; const QUuid _rayPickUID; From 067ed2ffe064126065852ec83cd56306421e206d Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 6 Nov 2017 16:09:31 -0800 Subject: [PATCH 36/44] apply coding standard --- interface/src/raypick/LaserPointer.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/src/raypick/LaserPointer.h b/interface/src/raypick/LaserPointer.h index 32ef189d76..896752a96e 100644 --- a/interface/src/raypick/LaserPointer.h +++ b/interface/src/raypick/LaserPointer.h @@ -22,9 +22,9 @@ class RayPickResult; struct LockEndObject { - QUuid id {QUuid()}; - bool isOverlay {false}; - glm::mat4 offsetMat {glm::mat4()}; + QUuid id { QUuid() }; + bool isOverlay { false }; + glm::mat4 offsetMat { glm::mat4() }; }; class RenderState { From c9d67f762bbcd1db95b73faf7f624fd3c8eacd39 Mon Sep 17 00:00:00 2001 From: Dante Ruiz Date: Mon, 6 Nov 2017 16:20:16 -0800 Subject: [PATCH 37/44] made requested changes --- interface/src/raypick/LaserPointer.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/src/raypick/LaserPointer.cpp b/interface/src/raypick/LaserPointer.cpp index f3d74d18a5..32dd74279b 100644 --- a/interface/src/raypick/LaserPointer.cpp +++ b/interface/src/raypick/LaserPointer.cpp @@ -25,7 +25,6 @@ LaserPointer::LaserPointer(const QVariant& rayProps, const RenderStateMap& rende _distanceScaleEnd(distanceScaleEnd), _rayPickUID(DependencyManager::get()->createRayPick(rayProps)) { - _offsetMat = glm::mat4(); for (auto& state : _renderStates) { if (!enabled || state.first != _currentRenderState) { @@ -238,7 +237,7 @@ void LaserPointer::setLaserLength(const float laserLength) { void LaserPointer::setLockEndUUID(QUuid objectID, const bool isOverlay, const glm::mat4& offsetMat) { withWriteLock([&] { _lockEndObject.id = objectID; - _lockEndObject.isOverlay; + _lockEndObject.isOverlay = isOverlay; _lockEndObject.offsetMat = offsetMat; }); } From 60319e8d53a3605dc5cefc0f70e275357eacf364 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 7 Nov 2017 13:35:31 +1300 Subject: [PATCH 38/44] Don't move or rotate entities if Alt or Meta keys are pressed --- scripts/system/controllers/grab.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/system/controllers/grab.js b/scripts/system/controllers/grab.js index a1846e7ad7..eaa15ee3b1 100644 --- a/scripts/system/controllers/grab.js +++ b/scripts/system/controllers/grab.js @@ -315,6 +315,10 @@ Grabber.prototype.pressEvent = function(event) { return; } + if (event.isAlt || event.isMeta) { + return; + } + if (Overlays.getOverlayAtPoint(Reticle.position) > 0) { // the mouse is pointing at an overlay; don't look for entities underneath the overlay. return; From f665bf384b30ca82feacf9978c0126ad592266b4 Mon Sep 17 00:00:00 2001 From: samcake Date: Mon, 6 Nov 2017 17:02:10 -0800 Subject: [PATCH 39/44] merge with upstream, and clean code --- libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index bbd0110c11..d2dc116e15 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -728,21 +728,19 @@ void Avatar::simulateAttachments(float deltaTime) { glm::quat jointRotation; if (attachment.isSoft) { // soft attachments do not have transform offsets - // model->setTranslation(getPosition()); - // model->setRotation(getOrientation() * Quaternions::Y_180); model->setTransformNoUpdateRenderItems(Transform(getOrientation() * Quaternions::Y_180, glm::vec3(1.0), getPosition())); model->simulate(deltaTime); model->updateRenderItems(); } else { if (_skeletonModel->getJointPositionInWorldFrame(jointIndex, jointPosition) && _skeletonModel->getJointRotationInWorldFrame(jointIndex, jointRotation)) { - model->setTranslation(jointPosition + jointRotation * attachment.translation * getModelScale()); - model->setRotation(jointRotation * attachment.rotation); + model->setTransformNoUpdateRenderItems(Transform(jointRotation * attachment.rotation, glm::vec3(1.0), jointPosition + jointRotation * attachment.translation * getModelScale())); float scale = getModelScale() * attachment.scale; model->setScaleToFit(true, model->getNaturalDimensions() * scale, true); // hack to force rescale model->setSnapModelToCenter(false); // hack to force resnap model->setSnapModelToCenter(true); model->simulate(deltaTime); + model->updateRenderItems(); } } } From fadbf09cdd659569b4f8df988a9e23a48571c111 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 7 Nov 2017 18:10:10 +1300 Subject: [PATCH 40/44] Avoid potentially slow entity list refresh upon deleting entities --- scripts/system/edit.js | 13 +++++++++++-- scripts/system/html/js/entityList.js | 7 ++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/scripts/system/edit.js b/scripts/system/edit.js index e76a02b6f5..ba84ffd716 100644 --- a/scripts/system/edit.js +++ b/scripts/system/edit.js @@ -1333,7 +1333,7 @@ function sortSelectedEntities(selected) { return sortedEntities; } -function recursiveDelete(entities, childrenList) { +function recursiveDelete(entities, childrenList, deletedIDs) { var entitiesLength = entities.length; for (var i = 0; i < entitiesLength; i++) { var entityID = entities[i]; @@ -1346,6 +1346,7 @@ function recursiveDelete(entities, childrenList) { properties: initialProperties, children: grandchildrenList }); + deletedIDs.push(entityID); Entities.deleteEntity(entityID); } } @@ -1413,6 +1414,8 @@ function parentSelectedEntities() { } function deleteSelectedEntities() { if (SelectionManager.hasSelection()) { + var deletedIDs = []; + selectedParticleEntityID = null; particleExplorerTool.destroyWebView(); SelectionManager.saveProperties(); @@ -1423,16 +1426,22 @@ function deleteSelectedEntities() { var initialProperties = SelectionManager.savedProperties[entityID]; var children = Entities.getChildrenIDs(entityID); var childList = []; - recursiveDelete(children, childList); + recursiveDelete(children, childList, deletedIDs); savedProperties.push({ entityID: entityID, properties: initialProperties, children: childList }); + deletedIDs.push(entityID); Entities.deleteEntity(entityID); } SelectionManager.clearSelections(); pushCommandForSelections([], savedProperties); + + entityListTool.webView.emitScriptEvent(JSON.stringify({ + type: "deleted", + ids: deletedIDs + })); } } diff --git a/scripts/system/html/js/entityList.js b/scripts/system/html/js/entityList.js index ea79750154..7b25e66c67 100644 --- a/scripts/system/html/js/entityList.js +++ b/scripts/system/html/js/entityList.js @@ -286,7 +286,6 @@ function loaded() { } elDelete.onclick = function() { EventBridge.emitWebEvent(JSON.stringify({ type: 'delete' })); - refreshEntities(); } document.addEventListener("keydown", function (keyDownEvent) { @@ -362,6 +361,12 @@ function loaded() { updateSelectedEntities(data.selectedIDs); resize(); } + } else if (data.type === "deleted") { + for (i = 0, length = data.ids.length; i < length; i++) { + delete entities[data.ids[i]]; + entityList.remove("id", data.ids[i]); + } + refreshFooter(); } }); setTimeout(refreshEntities, 1000); From 6481e0f713169e51205855ff64688b32b86b019e Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 7 Nov 2017 12:52:23 -0800 Subject: [PATCH 41/44] Address cauterized cluster matrices issue --- libraries/render-utils/src/CauterizedMeshPartPayload.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp index a54a072b75..a5d782098d 100644 --- a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp +++ b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp @@ -39,8 +39,8 @@ void CauterizedMeshPartPayload::updateClusterBuffer(const std::vector (const gpu::Byte*) cauterizedClusterMatrices.data()); } else { - _cauterizedClusterBuffer->setSubData(0, clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) clusterMatrices.data()); + _cauterizedClusterBuffer->setSubData(0, cauterizedClusterMatrices.size() * sizeof(glm::mat4), + (const gpu::Byte*) cauterizedClusterMatrices.data()); } } } From 0718763ed1d8ff076e13ca8de8460236bd365d80 Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 7 Nov 2017 17:31:15 -0800 Subject: [PATCH 42/44] Adjust syntax --- libraries/render-utils/src/CauterizedMeshPartPayload.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp index a5d782098d..983832e9c8 100644 --- a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp +++ b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp @@ -37,8 +37,7 @@ void CauterizedMeshPartPayload::updateClusterBuffer(const std::vector if (!_cauterizedClusterBuffer) { _cauterizedClusterBuffer = std::make_shared(cauterizedClusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) cauterizedClusterMatrices.data()); - } - else { + } else { _cauterizedClusterBuffer->setSubData(0, cauterizedClusterMatrices.size() * sizeof(glm::mat4), (const gpu::Byte*) cauterizedClusterMatrices.data()); } From af1180255ead9d31ea88e9c23ee313f5fe339429 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 8 Nov 2017 11:45:40 -0800 Subject: [PATCH 43/44] fixes from code review --- .../render-utils/src/CauterizedMeshPartPayload.cpp | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp index 983832e9c8..3bb2aa2ef9 100644 --- a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp +++ b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp @@ -21,17 +21,7 @@ CauterizedMeshPartPayload::CauterizedMeshPartPayload(ModelPointer model, int mes : ModelMeshPartPayload(model, meshIndex, partIndex, shapeIndex, transform, offsetTransform) {} void CauterizedMeshPartPayload::updateClusterBuffer(const std::vector& clusterMatrices, const std::vector& cauterizedClusterMatrices) { - - // Once computed the cluster matrices, update the buffer(s) - if (clusterMatrices.size() > 1) { - if (!_clusterBuffer) { - _clusterBuffer = std::make_shared(clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) clusterMatrices.data()); - } else { - _clusterBuffer->setSubData(0, clusterMatrices.size() * sizeof(glm::mat4), - (const gpu::Byte*) clusterMatrices.data()); - } - } + ModelMeshPartPayload::updateClusterBuffer(clusterMatrices); if (cauterizedClusterMatrices.size() > 1) { if (!_cauterizedClusterBuffer) { From 6685b74c2a9e73a6e7a19e52e02842ee5cd50fd9 Mon Sep 17 00:00:00 2001 From: vladest Date: Wed, 8 Nov 2017 21:23:50 +0100 Subject: [PATCH 44/44] Remove checking of empty model url and add sanity for checking modelUrl field existing --- libraries/avatars/src/AvatarData.cpp | 8 +++++--- libraries/avatars/src/AvatarData.h | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index 877bcd9353..bd313ac133 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -2223,11 +2223,13 @@ glm::vec3 variantToVec3(const QVariant& var) { return result; } -void AttachmentData::fromVariant(const QVariant& variant) { +bool AttachmentData::fromVariant(const QVariant& variant) { + bool isValid = false; auto map = variant.toMap(); if (map.contains("modelUrl")) { auto urlString = map["modelUrl"].toString(); modelURL = urlString; + isValid = true; } if (map.contains("jointName")) { jointName = map["jointName"].toString(); @@ -2244,6 +2246,7 @@ void AttachmentData::fromVariant(const QVariant& variant) { if (map.contains("soft")) { isSoft = map["soft"].toBool(); } + return isValid; } QVariantList AvatarData::getAttachmentsVariant() const { @@ -2259,8 +2262,7 @@ void AvatarData::setAttachmentsVariant(const QVariantList& variant) { newAttachments.reserve(variant.size()); for (const auto& attachmentVar : variant) { AttachmentData attachment; - attachment.fromVariant(attachmentVar); - if (!attachment.modelURL.isEmpty()) { + if (attachment.fromVariant(attachmentVar)) { newAttachments.append(attachment); } } diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 89fe270af1..fcfeaf7741 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -903,7 +903,7 @@ public: void fromJson(const QJsonObject& json); QVariant toVariant() const; - void fromVariant(const QVariant& variant); + bool fromVariant(const QVariant& variant); }; QDataStream& operator<<(QDataStream& out, const AttachmentData& attachment);