From c0fb9dcf2e39452040a321844acf5d8b3b85b87a Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 6 Sep 2017 09:49:33 -0700 Subject: [PATCH 01/13] Fix polyline crash and flicker --- .../entities-renderer/src/RenderablePolyLineEntityItem.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 3db7fb2c30..1cecb0b036 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -126,6 +126,7 @@ void PolyLineEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& auto textures = entity->getTextures(); QString path = textures.isEmpty() ? PathUtils::resourcesPath() + "images/paintStroke.png" : textures; if (!_texture || _lastTextures != path) { + _lastTextures = path; _texture = DependencyManager::get()->getTexture(QUrl(path)); } } @@ -220,7 +221,7 @@ void PolyLineEntityRenderer::doRender(RenderArgs* args) { batch.setModelTransform(Transform{ _modelTransform }.setScale(vec3(1))); batch.setUniformBuffer(PAINTSTROKE_UNIFORM_SLOT, _uniformBuffer); - if (_texture->isLoaded()) { + if (_texture && _texture->isLoaded()) { batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, _texture->getGPUTexture()); } else { batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, nullptr); From 4c4df97c42b547689ff389eaeeef1a651862726f Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Wed, 6 Sep 2017 23:38:02 -0700 Subject: [PATCH 02/13] Fix transform of polylines with high update rates --- .../entities-renderer/src/RenderablePolyLineEntityItem.cpp | 6 +++++- .../entities-renderer/src/RenderablePolyLineEntityItem.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 1cecb0b036..50226ef8ae 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -141,6 +141,10 @@ void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPo auto normalsChanged = entity->normalsChanged(); entity->resetPolyLineChanged(); + _polylineTransform = Transform(); + _polylineTransform.setTranslation(entity->getPosition()); + _polylineTransform.setRotation(entity->getRotation()); + if (pointsChanged) { _lastPoints = entity->getLinePoints(); } @@ -218,7 +222,7 @@ void PolyLineEntityRenderer::doRender(RenderArgs* args) { Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; - batch.setModelTransform(Transform{ _modelTransform }.setScale(vec3(1))); + batch.setModelTransform(_polylineTransform); batch.setUniformBuffer(PAINTSTROKE_UNIFORM_SLOT, _uniformBuffer); if (_texture && _texture->isLoaded()) { diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index 88b5ebdb9f..b0bdcf545b 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -47,6 +47,7 @@ protected: void updateGeometry(const std::vector& vertices); static std::vector updateVertices(const QVector& points, const QVector& normals, const QVector& strokeWidths); + Transform _polylineTransform; QVector _lastPoints; QVector _lastNormals; QVector _lastStrokeWidths; From d3ac7a388c8cd53718aab05f6d4209a7fa54b4dc Mon Sep 17 00:00:00 2001 From: Brad Davis Date: Thu, 14 Sep 2017 10:48:14 -0700 Subject: [PATCH 03/13] Fix polyline rendering using default texture --- .../src/RenderablePolyLineEntityItem.cpp | 14 +++++++++----- .../src/RenderablePolyLineEntityItem.h | 1 - 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp index 50226ef8ae..8c1a6318f9 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.cpp @@ -121,15 +121,19 @@ bool PolyLineEntityRenderer::needsRenderUpdateFromTypedEntity(const TypedEntityP } void PolyLineEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& scene, Transaction& transaction, const TypedEntityPointer& entity) { + static const QUrl DEFAULT_POLYLINE_TEXTURE = QUrl(PathUtils::resourcesPath() + "images/paintStroke.png"); + QUrl entityTextures = DEFAULT_POLYLINE_TEXTURE; if (entity->texturesChanged()) { entity->resetTexturesChanged(); auto textures = entity->getTextures(); - QString path = textures.isEmpty() ? PathUtils::resourcesPath() + "images/paintStroke.png" : textures; - if (!_texture || _lastTextures != path) { - _lastTextures = path; - _texture = DependencyManager::get()->getTexture(QUrl(path)); + if (!textures.isEmpty()) { + entityTextures = QUrl(textures); } } + + if (!_texture || _texture->getURL() != entityTextures) { + _texture = DependencyManager::get()->getTexture(entityTextures); + } } void PolyLineEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) { @@ -228,7 +232,7 @@ void PolyLineEntityRenderer::doRender(RenderArgs* args) { if (_texture && _texture->isLoaded()) { batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, _texture->getGPUTexture()); } else { - batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, nullptr); + batch.setResourceTexture(PAINTSTROKE_TEXTURE_SLOT, DependencyManager::get()->getWhiteTexture()); } batch.setInputFormat(polylineFormat); diff --git a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h index b0bdcf545b..610ee53cf7 100644 --- a/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h +++ b/libraries/entities-renderer/src/RenderablePolyLineEntityItem.h @@ -55,7 +55,6 @@ protected: gpu::BufferView _uniformBuffer; uint32_t _numVertices { 0 }; bool _empty{ true }; - QString _lastTextures; NetworkTexturePointer _texture; }; From 5187ac4761b422371d4cd388e97ea952983a44b6 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 15 Sep 2017 11:23:09 -0700 Subject: [PATCH 04/13] Avatar Attachments now render correctly * moved Avatar::fixupModelsInScene off the newly created render thread back to the main thread. * updated Avatar::postUpdate to take a scene pointer, necessary for Avatar::fixupModelsInScene * updated developer/tests/avatarAttachementTest.js to account for recent changes in avatar attachment scale, commit 712aff7ad. * updated initialization of anim graph to use Model::isLoaded() instead of Model::initWhenReady() to know when the model was completely loaded. --- interface/src/Application.cpp | 2 +- interface/src/avatar/AvatarManager.cpp | 4 ++-- interface/src/avatar/AvatarManager.h | 2 +- interface/src/avatar/MyAvatar.cpp | 6 +++--- interface/src/avatar/MyAvatar.h | 2 +- .../avatars-renderer/src/avatars-renderer/Avatar.cpp | 8 +++----- libraries/avatars-renderer/src/avatars-renderer/Avatar.h | 2 +- scripts/developer/tests/avatarAttachmentTest.js | 4 ++-- 8 files changed, 14 insertions(+), 16 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3650c495f2..e6524271cf 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -5209,7 +5209,7 @@ void Application::update(float deltaTime) { } } - avatarManager->postUpdate(deltaTime); + avatarManager->postUpdate(deltaTime, getMain3DScene()); { PROFILE_RANGE_EX(app, "PreRenderLambdas", 0xffff0000, (uint64_t)0); diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index e7a83b5abc..a6d77c8d03 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -259,12 +259,12 @@ void AvatarManager::updateOtherAvatars(float deltaTime) { simulateAvatarFades(deltaTime); } -void AvatarManager::postUpdate(float deltaTime) { +void AvatarManager::postUpdate(float deltaTime, const render::ScenePointer& scene) { auto hashCopy = getHashCopy(); AvatarHash::iterator avatarIterator = hashCopy.begin(); for (avatarIterator = hashCopy.begin(); avatarIterator != hashCopy.end(); avatarIterator++) { auto avatar = std::static_pointer_cast(avatarIterator.value()); - avatar->postUpdate(deltaTime); + avatar->postUpdate(deltaTime, scene); } } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 810d419a55..cef6bd4c9c 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -55,7 +55,7 @@ public: void updateMyAvatar(float deltaTime); void updateOtherAvatars(float deltaTime); - void postUpdate(float deltaTime); + void postUpdate(float deltaTime, const render::ScenePointer& scene); void clearOtherAvatars(); void deleteAllAvatars(); diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 8592ff3d74..075e471cf5 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1814,11 +1814,11 @@ void MyAvatar::destroyAnimGraph() { _skeletonModel->getRig().destroyAnimGraph(); } -void MyAvatar::postUpdate(float deltaTime) { +void MyAvatar::postUpdate(float deltaTime, const render::ScenePointer& scene) { - Avatar::postUpdate(deltaTime); + Avatar::postUpdate(deltaTime, scene); - if (DependencyManager::get()->shouldRenderAvatars() && _skeletonModel->initWhenReady(qApp->getMain3DScene())) { + if (_skeletonModel->isLoaded() && !_skeletonModel->getRig().getAnimNode()) { initHeadBones(); _skeletonModel->setCauterizeBoneSet(_headBoneSet); _fstAnimGraphOverrideUrl = _skeletonModel->getGeometry()->getAnimGraphOverrideUrl(); diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 65dcc12e7d..ce70eaa9dc 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -196,7 +196,7 @@ public: Q_INVOKABLE void clearIKJointLimitHistory(); // thread-safe void update(float deltaTime); - virtual void postUpdate(float deltaTime) override; + virtual void postUpdate(float deltaTime, const render::ScenePointer& scene) override; void preDisplaySide(RenderArgs* renderArgs); const glm::mat4& getHMDSensorMatrix() const { return _hmdSensorMatrix; } diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index bc6bb2a0ec..fc51501161 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -553,7 +553,7 @@ void Avatar::updateRenderItem(render::Transaction& transaction) { } } -void Avatar::postUpdate(float deltaTime) { +void Avatar::postUpdate(float deltaTime, const render::ScenePointer& scene) { if (isMyAvatar() ? showMyLookAtVectors : showOtherLookAtVectors) { const float EYE_RAY_LENGTH = 10.0; @@ -577,6 +577,8 @@ void Avatar::postUpdate(float deltaTime) { DebugDraw::getInstance().drawRay(rightEyePosition, rightEyePosition + rightEyeRotation * Vectors::UNIT_Z * EYE_RAY_LENGTH, RED); } } + + fixupModelsInScene(scene); } void Avatar::render(RenderArgs* renderArgs) { @@ -648,10 +650,6 @@ void Avatar::render(RenderArgs* renderArgs) { return; } - if (!isMyAvatar()) { - fixupModelsInScene(renderArgs->_scene); - } - if (showCollisionShapes && shouldRenderHead(renderArgs) && _skeletonModel->isRenderable()) { PROFILE_RANGE_BATCH(batch, __FUNCTION__":skeletonBoundingCollisionShapes"); const float BOUNDING_SHAPE_ALPHA = 0.7f; diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h index d35d6ceba0..c262ce2009 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h @@ -98,7 +98,7 @@ public: void updateRenderItem(render::Transaction& transaction); - virtual void postUpdate(float deltaTime); + virtual void postUpdate(float deltaTime, const render::ScenePointer& scene); //setters void setIsLookAtTarget(const bool isLookAtTarget) { _isLookAtTarget = isLookAtTarget; } diff --git a/scripts/developer/tests/avatarAttachmentTest.js b/scripts/developer/tests/avatarAttachmentTest.js index f287013979..c9f2e1615b 100644 --- a/scripts/developer/tests/avatarAttachmentTest.js +++ b/scripts/developer/tests/avatarAttachmentTest.js @@ -89,9 +89,9 @@ var coatButton = new ToggleButtonBuddy(buttonPositionX, buttonPositionY, BUTTON_ var HAT_ATTACHMENT = { modelURL: "https://s3.amazonaws.com/hifi-public/tony/cowboy-hat.fbx", jointName: "Head", - translation: {"x": 0, "y": 0.2, "z": 0}, + translation: {"x": 0, "y": 0.25, "z": 0.03}, rotation: {"x": 0, "y": 0, "z": 0, "w": 1}, - scale: 1, + scale: 0.052, isSoft: false }; From a8bf4efc8b44d576e341d63dcaa8703671d606da Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 14 Sep 2017 18:36:20 -0700 Subject: [PATCH 05/13] Brining the changes just to fix the tablet issue --- interface/src/ui/overlays/Base3DOverlay.cpp | 63 ++++++++++++++++++- interface/src/ui/overlays/Base3DOverlay.h | 9 +++ interface/src/ui/overlays/Planar3DOverlay.cpp | 8 +++ interface/src/ui/overlays/Planar3DOverlay.h | 4 +- interface/src/ui/overlays/Web3DOverlay.cpp | 17 +---- 5 files changed, 84 insertions(+), 17 deletions(-) diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index c0278a6496..b450fbdc05 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -256,15 +256,74 @@ bool Base3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3 void Base3DOverlay::locationChanged(bool tellPhysics) { SpatiallyNestable::locationChanged(tellPhysics); - auto itemID = getRenderItemID(); + // Force the actual update of the render transform now that we notify for the change + // so it s captured for the time of rendering + notifyRenderTransformChange(); + + /* auto itemID = getRenderItemID(); if (render::Item::isValidID(itemID)) { render::ScenePointer scene = qApp->getMain3DScene(); render::Transaction transaction; transaction.updateItem(itemID); scene->enqueueTransaction(transaction); - } + }*/ } void Base3DOverlay::parentDeleted() { qApp->getOverlays().deleteOverlay(getOverlayID()); } + +void Base3DOverlay::update(float duration) { + if (_renderTransformDirty) { + auto self = this; + // 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(); + AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [weakSelf]() { + // do nothing, if the model has already been destroyed. + auto spatiallyNestableSelf = weakSelf.lock(); + if (!spatiallyNestableSelf) { + return; + } + auto self = std::dynamic_pointer_cast(spatiallyNestableSelf); + */ + #ifdef UpdateInMain + self->setRenderTransform(self->evalRenderTransform()); + #else + auto renderTransform = self->evalRenderTransform(); + #endif + auto itemID = self->getRenderItemID(); + if (render::Item::isValidID(itemID)) { + render::ScenePointer scene = qApp->getMain3DScene(); + render::Transaction transaction; + #ifdef UpdateInMain + transaction.updateItem(itemID); + #else + transaction.updateItem(itemID, [renderTransform](Overlay& data) { + auto overlay3D = dynamic_cast(&data); + if (overlay3D) { + auto latestTransform = overlay3D->evalRenderTransform(); + overlay3D->setRenderTransform(latestTransform);// evalRenderTransform(); + } + }); + #endif + scene->enqueueTransaction(transaction); + + } + // }); + _renderTransformDirty = false; + } +} + +void Base3DOverlay::notifyRenderTransformChange() const { + _renderTransformDirty = true; +} + +Transform Base3DOverlay::evalRenderTransform() const { + return getTransform(); +} + +void Base3DOverlay::setRenderTransform(const Transform& transform) { + _renderTransform = transform; +} \ No newline at end of file diff --git a/interface/src/ui/overlays/Base3DOverlay.h b/interface/src/ui/overlays/Base3DOverlay.h index 6377b46d7d..b2167852d4 100644 --- a/interface/src/ui/overlays/Base3DOverlay.h +++ b/interface/src/ui/overlays/Base3DOverlay.h @@ -52,6 +52,12 @@ public: virtual AABox getBounds() const override = 0; + void update(float deltatime) override; + + void notifyRenderTransformChange() const; + virtual Transform evalRenderTransform() const; + void setRenderTransform(const Transform& transform); + void setProperties(const QVariantMap& properties) override; QVariant getProperty(const QString& property) override; @@ -67,12 +73,15 @@ protected: virtual void locationChanged(bool tellPhysics = true) override; virtual void parentDeleted() override; + mutable Transform _renderTransform; + float _lineWidth; bool _isSolid; bool _isDashedLine; bool _ignoreRayIntersection; bool _drawInFront; bool _isGrabbable { false }; + mutable bool _renderTransformDirty{ true }; QString _name; }; diff --git a/interface/src/ui/overlays/Planar3DOverlay.cpp b/interface/src/ui/overlays/Planar3DOverlay.cpp index 58d72b100b..e2877e1e07 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.cpp +++ b/interface/src/ui/overlays/Planar3DOverlay.cpp @@ -66,3 +66,11 @@ bool Planar3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::ve // FIXME - face and surfaceNormal not being returned return findRayRectangleIntersection(origin, direction, getRotation(), getPosition(), getDimensions(), distance); } + +Transform Planar3DOverlay::evalRenderTransform() const { + auto transform = getTransform(); + if (glm::length2(getDimensions()) != 1.0f) { + transform.postScale(vec3(getDimensions(), 1.0f)); + } + return transform; +} \ No newline at end of file diff --git a/interface/src/ui/overlays/Planar3DOverlay.h b/interface/src/ui/overlays/Planar3DOverlay.h index 8127d4ebb9..2ed90ab4ed 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.h +++ b/interface/src/ui/overlays/Planar3DOverlay.h @@ -32,7 +32,9 @@ public: virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face, glm::vec3& surfaceNormal) override; - + + Transform evalRenderTransform() const override; + protected: glm::vec2 _dimensions; }; diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 104082dee4..fd3763624e 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -184,6 +184,7 @@ void Web3DOverlay::update(float deltatime) { // update globalPosition _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(getPosition())); } + Billboard3DOverlay::update(deltatime); } QString Web3DOverlay::pickURL() { @@ -306,19 +307,6 @@ void Web3DOverlay::render(RenderArgs* args) { vec2 halfSize = getSize() / 2.0f; vec4 color(toGlm(getColor()), getAlpha()); - Transform transform = getTransform(); - - // FIXME: applyTransformTo causes tablet overlay to detach from tablet entity. - // Perhaps rather than deleting the following code it should be run only if isFacingAvatar() is true? - /* - applyTransformTo(transform, true); - setTransform(transform); - */ - - if (glm::length2(getDimensions()) != 1.0f) { - transform.postScale(vec3(getDimensions(), 1.0f)); - } - if (!_texture) { _texture = gpu::Texture::createExternal(OffscreenQmlSurface::getDiscardLambda()); _texture->setSource(__FUNCTION__); @@ -332,7 +320,8 @@ void Web3DOverlay::render(RenderArgs* args) { Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; batch.setResourceTexture(0, _texture); - batch.setModelTransform(transform); + batch.setModelTransform(_renderTransform); + auto geometryCache = DependencyManager::get(); if (color.a < OPAQUE_ALPHA_THRESHOLD) { geometryCache->bindWebBrowserProgram(batch, true); From f82a507d09f8cdf4df45f840a219c5257cec5f69 Mon Sep 17 00:00:00 2001 From: Sam Gateau Date: Thu, 14 Sep 2017 20:33:08 -0700 Subject: [PATCH 06/13] Cleanup --- interface/src/ui/overlays/Base3DOverlay.cpp | 52 +++++---------------- interface/src/ui/overlays/Base3DOverlay.h | 5 +- interface/src/ui/overlays/Web3DOverlay.cpp | 2 +- 3 files changed, 16 insertions(+), 43 deletions(-) diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index b450fbdc05..53af2ea882 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -256,17 +256,8 @@ bool Base3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec3 void Base3DOverlay::locationChanged(bool tellPhysics) { SpatiallyNestable::locationChanged(tellPhysics); - // Force the actual update of the render transform now that we notify for the change - // so it s captured for the time of rendering + // Force the actual update of the render transform through the notify call notifyRenderTransformChange(); - - /* auto itemID = getRenderItemID(); - if (render::Item::isValidID(itemID)) { - render::ScenePointer scene = qApp->getMain3DScene(); - render::Transaction transaction; - transaction.updateItem(itemID); - scene->enqueueTransaction(transaction); - }*/ } void Base3DOverlay::parentDeleted() { @@ -274,44 +265,25 @@ void Base3DOverlay::parentDeleted() { } void Base3DOverlay::update(float duration) { + + // In Base3DOverlay, if its location or bound changed, the renderTrasnformDirty flag is true. + // then the correct transform used for rendering is computed in the update transaction and assigned. + // TODO: Fix the value to be computed in main thread now and passed by value to the render item. + // This is the simplest fix for the web overlay of the tablet for now if (_renderTransformDirty) { - auto self = this; - // 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(); - AbstractViewStateInterface::instance()->pushPostUpdateLambda(key, [weakSelf]() { - // do nothing, if the model has already been destroyed. - auto spatiallyNestableSelf = weakSelf.lock(); - if (!spatiallyNestableSelf) { - return; - } - auto self = std::dynamic_pointer_cast(spatiallyNestableSelf); - */ - #ifdef UpdateInMain - self->setRenderTransform(self->evalRenderTransform()); - #else - auto renderTransform = self->evalRenderTransform(); - #endif - auto itemID = self->getRenderItemID(); - if (render::Item::isValidID(itemID)) { + auto itemID = getRenderItemID(); + if (render::Item::isValidID(itemID)) { render::ScenePointer scene = qApp->getMain3DScene(); render::Transaction transaction; - #ifdef UpdateInMain - transaction.updateItem(itemID); - #else - transaction.updateItem(itemID, [renderTransform](Overlay& data) { + transaction.updateItem(itemID, [](Overlay& data) { auto overlay3D = dynamic_cast(&data); if (overlay3D) { auto latestTransform = overlay3D->evalRenderTransform(); - overlay3D->setRenderTransform(latestTransform);// evalRenderTransform(); + overlay3D->setRenderTransform(latestTransform); } }); - #endif - scene->enqueueTransaction(transaction); - + scene->enqueueTransaction(transaction); } - // }); _renderTransformDirty = false; } } @@ -326,4 +298,4 @@ Transform Base3DOverlay::evalRenderTransform() const { void Base3DOverlay::setRenderTransform(const Transform& transform) { _renderTransform = transform; -} \ No newline at end of file +} diff --git a/interface/src/ui/overlays/Base3DOverlay.h b/interface/src/ui/overlays/Base3DOverlay.h index b2167852d4..55b55ed16f 100644 --- a/interface/src/ui/overlays/Base3DOverlay.h +++ b/interface/src/ui/overlays/Base3DOverlay.h @@ -55,8 +55,6 @@ public: void update(float deltatime) override; void notifyRenderTransformChange() const; - virtual Transform evalRenderTransform() const; - void setRenderTransform(const Transform& transform); void setProperties(const QVariantMap& properties) override; QVariant getProperty(const QString& property) override; @@ -74,6 +72,9 @@ protected: virtual void parentDeleted() override; mutable Transform _renderTransform; + virtual Transform evalRenderTransform() const; + virtual void setRenderTransform(const Transform& transform); + const Transform& getRenderTransform() const { return _renderTransform; } float _lineWidth; bool _isSolid; diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index fd3763624e..809536add9 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -320,7 +320,7 @@ void Web3DOverlay::render(RenderArgs* args) { Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; batch.setResourceTexture(0, _texture); - batch.setModelTransform(_renderTransform); + batch.setModelTransform(getRenderTransform()); auto geometryCache = DependencyManager::get(); if (color.a < OPAQUE_ALPHA_THRESHOLD) { From fd440aeeaae6179980e559cd995ab6915ab62386 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 15 Sep 2017 11:10:25 -0700 Subject: [PATCH 07/13] addressing review comments --- interface/src/ui/overlays/Base3DOverlay.cpp | 4 ++-- interface/src/ui/overlays/Web3DOverlay.cpp | 2 +- interface/src/ui/overlays/Web3DOverlay.h | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 53af2ea882..6f55260133 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -271,11 +271,12 @@ void Base3DOverlay::update(float duration) { // TODO: Fix the value to be computed in main thread now and passed by value to the render item. // This is the simplest fix for the web overlay of the tablet for now if (_renderTransformDirty) { + _renderTransformDirty = false; auto itemID = getRenderItemID(); if (render::Item::isValidID(itemID)) { render::ScenePointer scene = qApp->getMain3DScene(); render::Transaction transaction; - transaction.updateItem(itemID, [](Overlay& data) { + transaction.updateItem(itemID, [](Overlay& data) { auto overlay3D = dynamic_cast(&data); if (overlay3D) { auto latestTransform = overlay3D->evalRenderTransform(); @@ -284,7 +285,6 @@ void Base3DOverlay::update(float duration) { }); scene->enqueueTransaction(transaction); } - _renderTransformDirty = false; } } diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 809536add9..eb8451e5c3 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -184,7 +184,7 @@ void Web3DOverlay::update(float deltatime) { // update globalPosition _webSurface->getSurfaceContext()->setContextProperty("globalPosition", vec3toVariant(getPosition())); } - Billboard3DOverlay::update(deltatime); + Parent::update(deltatime); } QString Web3DOverlay::pickURL() { diff --git a/interface/src/ui/overlays/Web3DOverlay.h b/interface/src/ui/overlays/Web3DOverlay.h index 2eae7f33da..18cac96d65 100644 --- a/interface/src/ui/overlays/Web3DOverlay.h +++ b/interface/src/ui/overlays/Web3DOverlay.h @@ -21,6 +21,8 @@ class Web3DOverlay : public Billboard3DOverlay { Q_OBJECT public: + using Parent = Billboard3DOverlay; + static const QString QML; static QString const TYPE; virtual QString getType() const override { return TYPE; } From 0e83065a6db8471cdeed35cff39294d27c97113a Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 15 Sep 2017 11:44:35 -0700 Subject: [PATCH 08/13] One more: --- interface/src/ui/overlays/Web3DOverlay.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/overlays/Web3DOverlay.h b/interface/src/ui/overlays/Web3DOverlay.h index 18cac96d65..6bd540d120 100644 --- a/interface/src/ui/overlays/Web3DOverlay.h +++ b/interface/src/ui/overlays/Web3DOverlay.h @@ -19,9 +19,9 @@ class OffscreenQmlSurface; class Web3DOverlay : public Billboard3DOverlay { Q_OBJECT + using Parent = Billboard3DOverlay; public: - using Parent = Billboard3DOverlay; static const QString QML; static QString const TYPE; From 93d6c3a1aaeb23a45a2e9bbb468287feb4fb35ee Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 15 Sep 2017 14:35:45 -0700 Subject: [PATCH 09/13] Adding more comments for future fixmes --- interface/src/ui/overlays/Circle3DOverlay.cpp | 1 + interface/src/ui/overlays/Cube3DOverlay.cpp | 1 + interface/src/ui/overlays/Grid3DOverlay.cpp | 1 + interface/src/ui/overlays/Image3DOverlay.cpp | 1 + interface/src/ui/overlays/Line3DOverlay.cpp | 1 + interface/src/ui/overlays/ModelOverlay.cpp | 1 + interface/src/ui/overlays/Rectangle3DOverlay.cpp | 1 + interface/src/ui/overlays/Shape3DOverlay.cpp | 1 + interface/src/ui/overlays/Sphere3DOverlay.cpp | 1 + interface/src/ui/overlays/Text3DOverlay.cpp | 1 + 10 files changed, 10 insertions(+) diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 242021d698..57911c0786 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -85,6 +85,7 @@ void Circle3DOverlay::render(RenderArgs* args) { } // FIXME: THe line width of _lineWidth is not supported anymore, we ll need a workaround + // FIXME Start using the _renderTransform instead of calling for Transform from here, do the custom things needed in evalRenderTransform() auto transform = getTransform(); transform.postScale(glm::vec3(getDimensions(), 1.0f)); diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index 5ab32d21fe..ca7355b86f 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -54,6 +54,7 @@ void Cube3DOverlay::render(RenderArgs* args) { glm::vec4 cubeColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); // TODO: handle registration point?? + // FIXME Start using the _renderTransform instead of calling for Transform from here, do the custom things needed in evalRenderTransform() glm::vec3 position = getPosition(); glm::vec3 dimensions = getDimensions(); glm::quat rotation = getRotation(); diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index 1c2b4c162d..3172403731 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -79,6 +79,7 @@ void Grid3DOverlay::render(RenderArgs* args) { position += glm::vec3(cameraPosition.x, 0.0f, cameraPosition.z); } + // FIXME Start using the _renderTransform instead of calling for Transform from here, do the custom things needed in evalRenderTransform() Transform transform; transform.setRotation(getRotation()); transform.setScale(glm::vec3(getDimensions(), 1.0f)); diff --git a/interface/src/ui/overlays/Image3DOverlay.cpp b/interface/src/ui/overlays/Image3DOverlay.cpp index 6949848208..c79d363811 100644 --- a/interface/src/ui/overlays/Image3DOverlay.cpp +++ b/interface/src/ui/overlays/Image3DOverlay.cpp @@ -117,6 +117,7 @@ void Image3DOverlay::render(RenderArgs* args) { xColor color = getColor(); float alpha = getAlpha(); + // FIXME Start using the _renderTransform instead of calling for Transform from here, do the custom things needed in evalRenderTransform() Transform transform = getTransform(); bool transformChanged = applyTransformTo(transform, true); // If the transform is not modified, setting the transform to diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index cc8ed8e1a8..534261c839 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -132,6 +132,7 @@ void Line3DOverlay::render(RenderArgs* args) { glm::vec4 colorv4(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); auto batch = args->_batch; if (batch) { + // FIXME Start using the _renderTransform instead of calling for Transform and start and end from here, do the custom things needed in evalRenderTransform() batch->setModelTransform(Transform()); glm::vec3 start = getStart(); glm::vec3 end = getEnd(); diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 0bed07891e..0cdcf012b8 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -281,6 +281,7 @@ ModelOverlay* ModelOverlay::createClone() const { void ModelOverlay::locationChanged(bool tellPhysics) { Base3DOverlay::locationChanged(tellPhysics); + // FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform() if (_model && _model->isActive()) { _model->setRotation(getRotation()); _model->setTranslation(getPosition()); diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index 22124a0a97..dc8badbbd1 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -66,6 +66,7 @@ void Rectangle3DOverlay::render(RenderArgs* args) { auto batch = args->_batch; if (batch) { + // FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform() Transform transform; transform.setTranslation(position); transform.setRotation(rotation); diff --git a/interface/src/ui/overlays/Shape3DOverlay.cpp b/interface/src/ui/overlays/Shape3DOverlay.cpp index df0ecba307..fc54cc19ff 100644 --- a/interface/src/ui/overlays/Shape3DOverlay.cpp +++ b/interface/src/ui/overlays/Shape3DOverlay.cpp @@ -33,6 +33,7 @@ void Shape3DOverlay::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; glm::vec4 cubeColor(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha); + // FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform() // TODO: handle registration point?? glm::vec3 position = getPosition(); glm::vec3 dimensions = getDimensions(); diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index 9309316d6e..d01da231cf 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -39,6 +39,7 @@ void Sphere3DOverlay::render(RenderArgs* args) { auto batch = args->_batch; if (batch) { + // FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform() Transform transform = getTransform(); transform.postScale(getDimensions() * SPHERE_OVERLAY_SCALE); batch->setModelTransform(transform); diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index bb8c24aa11..43a2854206 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -96,6 +96,7 @@ void Text3DOverlay::render(RenderArgs* args) { Q_ASSERT(args->_batch); auto& batch = *args->_batch; + // FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform() Transform transform = getTransform(); applyTransformTo(transform, true); setTransform(transform); From 73ad9051a42ba93f5d7f1d62ce3fae2e9144ec2f Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Mon, 18 Sep 2017 15:27:58 -0700 Subject: [PATCH 10/13] Shapes now render at the correct size. --- .../entities-renderer/src/RenderableShapeEntityItem.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp b/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp index be76504c80..8fcf2c090d 100644 --- a/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp @@ -98,15 +98,15 @@ void ShapeEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPoint } _shape = entity->getShape(); + _position = entity->getPosition(); + _dimensions = entity->getDimensions(); + _orientation = entity->getOrientation(); if (_shape == entity::Sphere) { _modelTransform.postScale(SPHERE_ENTITY_SCALE); } - - _position = entity->getPosition(); - _dimensions = entity->getDimensions(); - _orientation = entity->getOrientation(); + _modelTransform.postScale(_dimensions); } bool ShapeEntityRenderer::isTransparent() const { From 57a92adc73ad08df6e43057ab7d8b3e893975104 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Mon, 18 Sep 2017 15:39:38 -0700 Subject: [PATCH 11/13] flag node as local by sending address, not by local from packet --- domain-server/src/DomainGatekeeper.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/domain-server/src/DomainGatekeeper.cpp b/domain-server/src/DomainGatekeeper.cpp index 620d593ebc..dbbcc004ca 100644 --- a/domain-server/src/DomainGatekeeper.cpp +++ b/domain-server/src/DomainGatekeeper.cpp @@ -272,22 +272,22 @@ void DomainGatekeeper::updateNodePermissions() { userPerms.permissions |= NodePermissions::Permission::canWriteToAssetServer; userPerms.permissions |= NodePermissions::Permission::canReplaceDomainContent; } else { - // this node is an agent - const QHostAddress& addr = node->getLocalSocket().getAddress(); - bool isLocalUser = (addr == limitedNodeList->getLocalSockAddr().getAddress() || - addr == QHostAddress::LocalHost); - // at this point we don't have a sending socket for packets from this node - assume it is the active socket // or the public socket if we haven't activated a socket for the node yet HifiSockAddr connectingAddr = node->getActiveSocket() ? *node->getActiveSocket() : node->getPublicSocket(); QString hardwareAddress; QUuid machineFingerprint; + bool isLocalUser { false }; DomainServerNodeData* nodeData = static_cast(node->getLinkedData()); if (nodeData) { hardwareAddress = nodeData->getHardwareAddress(); machineFingerprint = nodeData->getMachineFingerprint(); + + auto sendingAddress = nodeData->getSendingSockAddr().getAddress(); + isLocalUser = (sendingAddress == limitedNodeList->getLocalSockAddr().getAddress() || + sendingAddress == QHostAddress::LocalHost); } userPerms = setPermissionsForUser(isLocalUser, verifiedUsername, connectingAddr.getAddress(), hardwareAddress, machineFingerprint); From 1f485ac8f80e176c209945130f45d46b56c860c9 Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 19 Sep 2017 12:05:15 -0700 Subject: [PATCH 12/13] Fix OpenSSL build instructions --- BUILD.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BUILD.md b/BUILD.md index 30302d611b..4d321146c3 100644 --- a/BUILD.md +++ b/BUILD.md @@ -2,7 +2,7 @@ - [cmake](https://cmake.org/download/): 3.9 - [Qt](https://www.qt.io/download-open-source): 5.9.1 -- [OpenSSL](https://www.openssl.org/): Use the latest available version of OpenSSL to avoid security vulnerabilities. +- [OpenSSL](https://www.openssl.org/): Use the latest available 1.0 version (**NOT** 1.1) of OpenSSL to avoid security vulnerabilities. - [VHACD](https://github.com/virneo/v-hacd)(clone this repository)(Optional) ### CMake External Project Dependencies From 4d904bd5ce7d7b1a805c2f8fbdda630afc27576f Mon Sep 17 00:00:00 2001 From: Cain Kilgore Date: Wed, 20 Sep 2017 18:43:16 +0100 Subject: [PATCH 13/13] Changed naming of avatarGrav --- libraries/physics/src/CharacterController.cpp | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/libraries/physics/src/CharacterController.cpp b/libraries/physics/src/CharacterController.cpp index 0dcc0bcbe8..6c78b46b48 100755 --- a/libraries/physics/src/CharacterController.cpp +++ b/libraries/physics/src/CharacterController.cpp @@ -21,7 +21,8 @@ const btVector3 LOCAL_UP_AXIS(0.0f, 1.0f, 0.0f); const float JUMP_SPEED = 3.5f; const float MAX_FALL_HEIGHT = 20.0f; -float DEFAULT_CHARACTER_GRAVITY = -5.0f; +const float DEFAULT_CHARACTER_GRAVITY = -5.0f; +float currentAvatarGravity = DEFAULT_CHARACTER_GRAVITY; #ifdef DEBUG_STATE_CHANGE #define SET_STATE(desiredState, reason) setState(desiredState, reason) @@ -359,7 +360,7 @@ void CharacterController::updateGravity() { if (_state == State::Hover || collisionGroup == BULLET_COLLISION_GROUP_COLLISIONLESS) { _gravity = 0.0f; } else { - _gravity = DEFAULT_CHARACTER_GRAVITY; + _gravity = currentAvatarGravity; } if (_rigidBody) { _rigidBody->setGravity(_gravity * _currentUp); @@ -368,11 +369,11 @@ void CharacterController::updateGravity() { void CharacterController::setGravity(float gravity) { - DEFAULT_CHARACTER_GRAVITY = gravity; + currentAvatarGravity = gravity; } float CharacterController::getGravity() { - return DEFAULT_CHARACTER_GRAVITY; + return currentAvatarGravity; } #ifdef DEBUG_STATE_CHANGE @@ -393,18 +394,6 @@ void CharacterController::setState(State desiredState) { } } -void CharacterController::updateGravity() { - int16_t collisionGroup = computeCollisionGroup(); - if (_state == State::Hover || collisionGroup == BULLET_COLLISION_GROUP_COLLISIONLESS) { - _gravity = 0.0f; - } else { - _gravity = DEFAULT_AVATAR_GRAVITY; - } - if (_rigidBody) { - _rigidBody->setGravity(_gravity * _currentUp); - } -} - void CharacterController::setLocalBoundingBox(const glm::vec3& minCorner, const glm::vec3& scale) { float x = scale.x; float z = scale.z;