From f56e95225311528b8786d66da33714ecce9b16d2 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 18 Aug 2017 14:21:46 -0700 Subject: [PATCH 1/2] properly update image3d render item --- interface/src/ui/overlays/Image3DOverlay.cpp | 17 +++++++++++++++++ interface/src/ui/overlays/Image3DOverlay.h | 1 + 2 files changed, 18 insertions(+) diff --git a/interface/src/ui/overlays/Image3DOverlay.cpp b/interface/src/ui/overlays/Image3DOverlay.cpp index 7dfee2c491..38f1517222 100644 --- a/interface/src/ui/overlays/Image3DOverlay.cpp +++ b/interface/src/ui/overlays/Image3DOverlay.cpp @@ -19,6 +19,7 @@ #include "GeometryUtil.h" +#include "Application.h" QString const Image3DOverlay::TYPE = "image3d"; @@ -58,12 +59,28 @@ void Image3DOverlay::render(RenderArgs* args) { if (!_isLoaded) { _isLoaded = true; _texture = DependencyManager::get()->getTexture(_url); + _textureIsLoaded = false; } if (!_visible || !getParentVisible() || !_texture || !_texture->isLoaded()) { return; } + // Once the texture has loaded, check if we need to update the render item because of transparency + if (!_textureIsLoaded && _texture && _texture->getGPUTexture()) { + _textureIsLoaded = true; + if (_texture->getGPUTexture()->getUsage().isAlpha()) { + auto itemID = getRenderItemID(); + setAlpha(0.5f); + if (render::Item::isValidID(itemID)) { + render::ScenePointer scene = qApp->getMain3DScene(); + render::Transaction transaction; + transaction.updateItem(itemID); + scene->enqueueTransaction(transaction); + } + } + } + Q_ASSERT(args->_batch); gpu::Batch* batch = args->_batch; diff --git a/interface/src/ui/overlays/Image3DOverlay.h b/interface/src/ui/overlays/Image3DOverlay.h index 2e5f74749c..2f4a666058 100644 --- a/interface/src/ui/overlays/Image3DOverlay.h +++ b/interface/src/ui/overlays/Image3DOverlay.h @@ -47,6 +47,7 @@ public: private: QString _url; + bool _textureIsLoaded; NetworkTexturePointer _texture; bool _emissive { false }; From 3a80c6cbe24c2c03c6a8750ba30202c3fd480565 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Mon, 21 Aug 2017 18:09:25 -0700 Subject: [PATCH 2/2] fix alpha issues, pipeline issue, clamping issue --- interface/src/ui/overlays/Circle3DOverlay.cpp | 2 +- interface/src/ui/overlays/Cube3DOverlay.cpp | 2 +- interface/src/ui/overlays/Image3DOverlay.cpp | 17 +++++++++-------- interface/src/ui/overlays/Image3DOverlay.h | 4 +++- interface/src/ui/overlays/Line3DOverlay.cpp | 15 ++++++++++++--- interface/src/ui/overlays/Line3DOverlay.h | 1 + interface/src/ui/overlays/Overlay.h | 1 + interface/src/ui/overlays/OverlaysPayload.cpp | 2 +- .../src/ui/overlays/Rectangle3DOverlay.cpp | 2 +- interface/src/ui/overlays/Shape3DOverlay.cpp | 2 +- interface/src/ui/overlays/Sphere3DOverlay.cpp | 2 +- interface/src/ui/overlays/Text3DOverlay.cpp | 2 +- interface/src/ui/overlays/Web3DOverlay.cpp | 4 ++-- 13 files changed, 35 insertions(+), 21 deletions(-) diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 52a3d7a929..242021d698 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -264,7 +264,7 @@ void Circle3DOverlay::render(RenderArgs* args) { const render::ShapeKey Circle3DOverlay::getShapeKey() { auto builder = render::ShapeKey::Builder().withoutCullFace().withUnlit(); - if (getAlpha() != 1.0f) { + if (isTransparent()) { builder.withTranslucent(); } if (!getIsSolid() || shouldDrawHUDLayer()) { diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index 31cbe5e822..5ab32d21fe 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -117,7 +117,7 @@ void Cube3DOverlay::render(RenderArgs* args) { const render::ShapeKey Cube3DOverlay::getShapeKey() { auto builder = render::ShapeKey::Builder(); - if (getAlpha() != 1.0f) { + if (isTransparent()) { builder.withTranslucent(); } if (!getIsSolid() || shouldDrawHUDLayer()) { diff --git a/interface/src/ui/overlays/Image3DOverlay.cpp b/interface/src/ui/overlays/Image3DOverlay.cpp index e6e4e43881..76a82d0268 100644 --- a/interface/src/ui/overlays/Image3DOverlay.cpp +++ b/interface/src/ui/overlays/Image3DOverlay.cpp @@ -19,7 +19,7 @@ #include "GeometryUtil.h" -#include "Application.h" +#include "AbstractViewStateInterface.h" QString const Image3DOverlay::TYPE = "image3d"; @@ -69,11 +69,12 @@ void Image3DOverlay::render(RenderArgs* args) { // Once the texture has loaded, check if we need to update the render item because of transparency if (!_textureIsLoaded && _texture && _texture->getGPUTexture()) { _textureIsLoaded = true; - if (_texture->getGPUTexture()->getUsage().isAlpha()) { + bool prevAlphaTexture = _alphaTexture; + _alphaTexture = _texture->getGPUTexture()->getUsage().isAlpha(); + if (_alphaTexture != prevAlphaTexture) { auto itemID = getRenderItemID(); - setAlpha(0.5f); if (render::Item::isValidID(itemID)) { - render::ScenePointer scene = qApp->getMain3DScene(); + render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); render::Transaction transaction; transaction.updateItem(itemID); scene->enqueueTransaction(transaction); @@ -109,9 +110,9 @@ void Image3DOverlay::render(RenderArgs* args) { glm::vec2 topLeft(-x, -y); glm::vec2 bottomRight(x, y); - glm::vec2 texCoordTopLeft(fromImage.x() / imageWidth, fromImage.y() / imageHeight); - glm::vec2 texCoordBottomRight((fromImage.x() + fromImage.width()) / imageWidth, - (fromImage.y() + fromImage.height()) / imageHeight); + glm::vec2 texCoordTopLeft((fromImage.x() + 0.5f) / imageWidth, (fromImage.y() + 0.5f) / imageHeight); + glm::vec2 texCoordBottomRight((fromImage.x() + fromImage.width() - 0.5f) / imageWidth, + (fromImage.y() + fromImage.height() - 0.5f) / imageHeight); const float MAX_COLOR = 255.0f; xColor color = getColor(); @@ -143,7 +144,7 @@ const render::ShapeKey Image3DOverlay::getShapeKey() { if (_emissive || shouldDrawHUDLayer()) { builder.withUnlit(); } - if (getAlpha() != 1.0f) { + if (isTransparent()) { builder.withTranslucent(); } return builder.build(); diff --git a/interface/src/ui/overlays/Image3DOverlay.h b/interface/src/ui/overlays/Image3DOverlay.h index 2f4a666058..4f813e7368 100644 --- a/interface/src/ui/overlays/Image3DOverlay.h +++ b/interface/src/ui/overlays/Image3DOverlay.h @@ -39,6 +39,7 @@ public: void setProperties(const QVariantMap& properties) override; QVariant getProperty(const QString& property) override; + bool isTransparent() override { return Base3DOverlay::isTransparent() || _alphaTexture; } virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, float& distance, BoxFace& face, glm::vec3& surfaceNormal) override; @@ -47,8 +48,9 @@ public: private: QString _url; - bool _textureIsLoaded; NetworkTexturePointer _texture; + bool _textureIsLoaded { false }; + bool _alphaTexture { false }; bool _emissive { false }; QRect _fromImage; // where from in the image to sample diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index d8fe0e6bb8..cc8ed8e1a8 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -13,6 +13,7 @@ #include #include +#include "AbstractViewStateInterface.h" QString const Line3DOverlay::TYPE = "line3d"; @@ -149,7 +150,7 @@ void Line3DOverlay::render(RenderArgs* args) { const render::ShapeKey Line3DOverlay::getShapeKey() { auto builder = render::ShapeKey::Builder().withOwnPipeline(); - if (getAlpha() != 1.0f || _glow > 0.0f) { + if (isTransparent()) { builder.withTranslucent(); } return builder.build(); @@ -222,9 +223,17 @@ void Line3DOverlay::setProperties(const QVariantMap& originalProperties) { auto glow = properties["glow"]; if (glow.isValid()) { + float prevGlow = _glow; setGlow(glow.toFloat()); - if (_glow > 0.0f) { - _alpha = 0.5f; + // Update our payload key if necessary to handle transparency + if ((prevGlow <= 0.0f && _glow > 0.0f) || (prevGlow > 0.0f && _glow <= 0.0f)) { + auto itemID = getRenderItemID(); + if (render::Item::isValidID(itemID)) { + render::ScenePointer scene = AbstractViewStateInterface::instance()->getMain3DScene(); + render::Transaction transaction; + transaction.updateItem(itemID); + scene->enqueueTransaction(transaction); + } } } diff --git a/interface/src/ui/overlays/Line3DOverlay.h b/interface/src/ui/overlays/Line3DOverlay.h index c9ceac55a9..9abc2f1a8d 100644 --- a/interface/src/ui/overlays/Line3DOverlay.h +++ b/interface/src/ui/overlays/Line3DOverlay.h @@ -45,6 +45,7 @@ public: void setProperties(const QVariantMap& properties) override; QVariant getProperty(const QString& property) override; + bool isTransparent() override { return Base3DOverlay::isTransparent() || _glow > 0.0f; } virtual Line3DOverlay* createClone() const override; diff --git a/interface/src/ui/overlays/Overlay.h b/interface/src/ui/overlays/Overlay.h index a9774eea06..db2979b4d5 100644 --- a/interface/src/ui/overlays/Overlay.h +++ b/interface/src/ui/overlays/Overlay.h @@ -59,6 +59,7 @@ public: bool isLoaded() { return _isLoaded; } bool getVisible() const { return _visible; } bool shouldDrawHUDLayer() const { return _drawHUDLayer; } + virtual bool isTransparent() { return getAlphaPulse() != 0.0f || getAlpha() != 1.0f; }; xColor getColor(); float getAlpha(); Anchor getAnchor() const { return _anchor; } diff --git a/interface/src/ui/overlays/OverlaysPayload.cpp b/interface/src/ui/overlays/OverlaysPayload.cpp index 8b7100205a..f2684a4368 100644 --- a/interface/src/ui/overlays/OverlaysPayload.cpp +++ b/interface/src/ui/overlays/OverlaysPayload.cpp @@ -37,7 +37,7 @@ namespace render { if (std::static_pointer_cast(overlay)->getDrawInFront()) { builder.withLayered(); } - if (overlay->getAlphaPulse() != 0.0f || overlay->getAlpha() != 1.0f) { + if (overlay->isTransparent()) { builder.withTransparent(); } } else { diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index f981fe1462..22124a0a97 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -110,7 +110,7 @@ void Rectangle3DOverlay::render(RenderArgs* args) { const render::ShapeKey Rectangle3DOverlay::getShapeKey() { auto builder = render::ShapeKey::Builder().withOwnPipeline(); - if (getAlpha() != 1.0f) { + if (isTransparent()) { builder.withTranslucent(); } return builder.build(); diff --git a/interface/src/ui/overlays/Shape3DOverlay.cpp b/interface/src/ui/overlays/Shape3DOverlay.cpp index 7126f7bde4..df0ecba307 100644 --- a/interface/src/ui/overlays/Shape3DOverlay.cpp +++ b/interface/src/ui/overlays/Shape3DOverlay.cpp @@ -62,7 +62,7 @@ void Shape3DOverlay::render(RenderArgs* args) { const render::ShapeKey Shape3DOverlay::getShapeKey() { auto builder = render::ShapeKey::Builder(); - if (getAlpha() != 1.0f) { + if (isTransparent()) { builder.withTranslucent(); } if (!getIsSolid() || shouldDrawHUDLayer()) { diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index ee3f9b9784..9309316d6e 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -59,7 +59,7 @@ void Sphere3DOverlay::render(RenderArgs* args) { const render::ShapeKey Sphere3DOverlay::getShapeKey() { auto builder = render::ShapeKey::Builder(); - if (getAlpha() != 1.0f) { + if (isTransparent()) { builder.withTranslucent(); } if (!getIsSolid() || shouldDrawHUDLayer()) { diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index 4b110b8099..bb8c24aa11 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -143,7 +143,7 @@ void Text3DOverlay::render(RenderArgs* args) { const render::ShapeKey Text3DOverlay::getShapeKey() { auto builder = render::ShapeKey::Builder(); - if (getAlpha() != 1.0f) { + if (isTransparent()) { builder.withTranslucent(); } return builder.build(); diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 40af679a13..5acb4d2ceb 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -318,8 +318,8 @@ void Web3DOverlay::render(RenderArgs* args) { } const render::ShapeKey Web3DOverlay::getShapeKey() { - auto builder = render::ShapeKey::Builder().withoutCullFace().withDepthBias(); - if (getAlpha() != 1.0f) { + auto builder = render::ShapeKey::Builder().withoutCullFace().withDepthBias().withOwnPipeline(); + if (isTransparent()) { builder.withTranslucent(); } return builder.build();