From fd8868f609874680b0254f75cad4a7165e9e5f2e Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 19 Sep 2017 17:30:20 -0700 Subject: [PATCH 1/8] Moving the render transform evaualtion in game loop for Models --- .../src/EntityTreeRenderer.cpp | 2 +- libraries/render-utils/src/Model.cpp | 64 +++---------------- libraries/render-utils/src/Model.h | 1 - 3 files changed, 9 insertions(+), 58 deletions(-) diff --git a/libraries/entities-renderer/src/EntityTreeRenderer.cpp b/libraries/entities-renderer/src/EntityTreeRenderer.cpp index e8ad163964..2aa9c20704 100644 --- a/libraries/entities-renderer/src/EntityTreeRenderer.cpp +++ b/libraries/entities-renderer/src/EntityTreeRenderer.cpp @@ -1026,4 +1026,4 @@ void EntityTreeRenderer::onEntityChanged(const EntityItemID& id) { _changedEntitiesGuard.withWriteLock([&] { _changedEntities.insert(id); }); -} +} \ No newline at end of file diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index 42bb91ce94..1f45647c0d 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -233,18 +233,20 @@ void Model::updateRenderItems() { // We need to update them here so we can correctly update the bounding box. self->updateClusterMatrices(); + Transform modelTransform = self->getTransform(); + Transform physicsTransform = modelTransform; + modelTransform.setScale(glm::vec3(1.0f)); + uint32_t deleteGeometryCounter = self->_deleteGeometryCounter; render::Transaction transaction; foreach (auto itemID, self->_modelMeshRenderItemsMap.keys()) { - transaction.updateItem(itemID, [deleteGeometryCounter](ModelMeshPartPayload& data) { + 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) { - Transform modelTransform = model->getTransform(); - modelTransform.setScale(glm::vec3(1.0f)); - + const Model::MeshState& state = model->getMeshState(data._meshIndex); Transform renderTransform = modelTransform; if (state.clusterMatrices.size() == 1) { @@ -259,11 +261,10 @@ void Model::updateRenderItems() { // collision mesh does not share the same unit scale as the FBX file's mesh: only apply offset Transform collisionMeshOffset; collisionMeshOffset.setIdentity(); - Transform modelTransform = self->getTransform(); foreach(auto itemID, self->_collisionRenderItemsMap.keys()) { - transaction.updateItem(itemID, [modelTransform, collisionMeshOffset](MeshPartPayload& data) { + transaction.updateItem(itemID, [physicsTransform, collisionMeshOffset](MeshPartPayload& data) { // update the model transform for this render item. - data.updateTransform(modelTransform, collisionMeshOffset); + data.updateTransform(physicsTransform, collisionMeshOffset); }); } @@ -1311,55 +1312,6 @@ bool Model::isRenderable() const { return !_meshStates.isEmpty() || (isLoaded() && _renderGeometry->getMeshes().empty()); } -bool Model::initWhenReady(const render::ScenePointer& scene) { - // NOTE: this only called by SkeletonModel - if (_addedToScene || !isRenderable()) { - return false; - } - - createRenderItemSet(); - - render::Transaction transaction; - - bool addedTransaction = false; - if (_collisionGeometry) { - foreach (auto renderItem, _collisionRenderItems) { - auto item = scene->allocateID(); - auto renderPayload = std::make_shared(renderItem); - _collisionRenderItemsMap.insert(item, renderPayload); - transaction.resetItem(item, renderPayload); - } - addedTransaction = !_collisionRenderItems.empty(); - } else { - bool hasTransparent = false; - size_t verticesCount = 0; - foreach (auto renderItem, _modelMeshRenderItems) { - auto item = scene->allocateID(); - auto renderPayload = std::make_shared(renderItem); - - hasTransparent = hasTransparent || renderItem.get()->getShapeKey().isTranslucent(); - verticesCount += renderItem.get()->getVerticesCount(); - _modelMeshRenderItemsMap.insert(item, renderPayload); - transaction.resetItem(item, renderPayload); - } - addedTransaction = !_modelMeshRenderItemsMap.empty(); - _renderInfoVertexCount = verticesCount; - _renderInfoDrawCalls = _modelMeshRenderItemsMap.count(); - _renderInfoHasTransparent = hasTransparent; - } - _addedToScene = addedTransaction; - if (addedTransaction) { - scene->enqueueTransaction(transaction); - // NOTE: updateRender items enqueues identical transaction (using a lambda) - // so it looks like we're doing double work here, but I don't want to remove the call - // for fear there is some side effect we'll miss. -- Andrew 2016.07.21 - // TODO: figure out if we really need this call to updateRenderItems() or not. - updateRenderItems(); - } - - return true; -} - class CollisionRenderGeometry : public Geometry { public: CollisionRenderGeometry(model::MeshPointer mesh) { diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 63aeacf80c..87ee754b93 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -87,7 +87,6 @@ public: bool needsFixupInScene() const; bool needsReload() const { return _needsReload; } - bool initWhenReady(const render::ScenePointer& scene); bool addToScene(const render::ScenePointer& scene, render::Transaction& transaction) { auto getters = render::Item::Status::Getters(0); From d112ffd8d657a259ed85a7096812cfb8eca40d7b Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 20 Sep 2017 18:06:49 -0700 Subject: [PATCH 2/8] Moving all the 3D overlay transform evaluation out of the render thread to the game loop, need to do something for the line3d --- interface/src/ui/overlays/Base3DOverlay.cpp | 11 ++++---- interface/src/ui/overlays/Base3DOverlay.h | 2 +- .../src/ui/overlays/Billboard3DOverlay.cpp | 11 ++++++++ .../src/ui/overlays/Billboard3DOverlay.h | 2 ++ interface/src/ui/overlays/Circle3DOverlay.cpp | 4 +++ interface/src/ui/overlays/Circle3DOverlay.h | 2 ++ interface/src/ui/overlays/Cube3DOverlay.cpp | 27 +++++++++++-------- interface/src/ui/overlays/Cube3DOverlay.h | 3 +++ interface/src/ui/overlays/Grid3DOverlay.cpp | 12 ++++++--- interface/src/ui/overlays/Grid3DOverlay.h | 3 +++ interface/src/ui/overlays/Image3DOverlay.cpp | 18 +++++-------- interface/src/ui/overlays/Image3DOverlay.h | 4 +++ interface/src/ui/overlays/Line3DOverlay.cpp | 4 +++ interface/src/ui/overlays/Line3DOverlay.h | 3 +++ interface/src/ui/overlays/ModelOverlay.cpp | 9 ++++--- interface/src/ui/overlays/ModelOverlay.h | 2 ++ interface/src/ui/overlays/Planar3DOverlay.cpp | 2 +- interface/src/ui/overlays/Planar3DOverlay.h | 4 +-- .../src/ui/overlays/Rectangle3DOverlay.cpp | 5 ++++ .../src/ui/overlays/Rectangle3DOverlay.h | 4 +++ interface/src/ui/overlays/Shape3DOverlay.cpp | 26 +++++++++--------- interface/src/ui/overlays/Shape3DOverlay.h | 3 +++ interface/src/ui/overlays/Sphere3DOverlay.cpp | 20 +++++++++----- interface/src/ui/overlays/Sphere3DOverlay.h | 3 +++ interface/src/ui/overlays/Text3DOverlay.cpp | 10 ++++--- interface/src/ui/overlays/Text3DOverlay.h | 4 +++ interface/src/ui/overlays/Volume3DOverlay.cpp | 8 ++++++ interface/src/ui/overlays/Volume3DOverlay.h | 3 +++ 28 files changed, 146 insertions(+), 63 deletions(-) diff --git a/interface/src/ui/overlays/Base3DOverlay.cpp b/interface/src/ui/overlays/Base3DOverlay.cpp index 6f55260133..9afab80243 100644 --- a/interface/src/ui/overlays/Base3DOverlay.cpp +++ b/interface/src/ui/overlays/Base3DOverlay.cpp @@ -268,18 +268,17 @@ 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) { - _renderTransformDirty = false; auto itemID = getRenderItemID(); if (render::Item::isValidID(itemID)) { + _renderTransformDirty = false; + // Capture the render transform value in game loop before + auto latestTransform = evalRenderTransform(); render::ScenePointer scene = qApp->getMain3DScene(); render::Transaction transaction; - transaction.updateItem(itemID, [](Overlay& data) { + transaction.updateItem(itemID, [latestTransform](Overlay& data) { auto overlay3D = dynamic_cast(&data); if (overlay3D) { - auto latestTransform = overlay3D->evalRenderTransform(); overlay3D->setRenderTransform(latestTransform); } }); @@ -292,7 +291,7 @@ void Base3DOverlay::notifyRenderTransformChange() const { _renderTransformDirty = true; } -Transform Base3DOverlay::evalRenderTransform() const { +Transform Base3DOverlay::evalRenderTransform() { return getTransform(); } diff --git a/interface/src/ui/overlays/Base3DOverlay.h b/interface/src/ui/overlays/Base3DOverlay.h index 55b55ed16f..93a973e60a 100644 --- a/interface/src/ui/overlays/Base3DOverlay.h +++ b/interface/src/ui/overlays/Base3DOverlay.h @@ -72,7 +72,7 @@ protected: virtual void parentDeleted() override; mutable Transform _renderTransform; - virtual Transform evalRenderTransform() const; + virtual Transform evalRenderTransform(); virtual void setRenderTransform(const Transform& transform); const Transform& getRenderTransform() const { return _renderTransform; } diff --git a/interface/src/ui/overlays/Billboard3DOverlay.cpp b/interface/src/ui/overlays/Billboard3DOverlay.cpp index f5668caa71..960f0de095 100644 --- a/interface/src/ui/overlays/Billboard3DOverlay.cpp +++ b/interface/src/ui/overlays/Billboard3DOverlay.cpp @@ -45,3 +45,14 @@ bool Billboard3DOverlay::applyTransformTo(Transform& transform, bool force) { } return transformChanged; } + +Transform Billboard3DOverlay::evalRenderTransform() { + Transform transform = getTransform(); + bool transformChanged = applyTransformTo(transform, true); + // If the transform is not modified, setting the transform to + // itself will cause drift over time due to floating point errors. + if (transformChanged) { + setTransform(transform); + } + return transform; +} \ No newline at end of file diff --git a/interface/src/ui/overlays/Billboard3DOverlay.h b/interface/src/ui/overlays/Billboard3DOverlay.h index d429537b5b..6b3aa40451 100644 --- a/interface/src/ui/overlays/Billboard3DOverlay.h +++ b/interface/src/ui/overlays/Billboard3DOverlay.h @@ -28,6 +28,8 @@ public: protected: virtual bool applyTransformTo(Transform& transform, bool force = false) override; + + Transform evalRenderTransform() override; }; #endif // hifi_Billboard3DOverlay_h diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 57911c0786..b3e4cba5d9 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -438,3 +438,7 @@ bool Circle3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::ve Circle3DOverlay* Circle3DOverlay::createClone() const { return new Circle3DOverlay(this); } + +Transform Circle3DOverlay::evalRenderTransform() { + return getTransform(); +} diff --git a/interface/src/ui/overlays/Circle3DOverlay.h b/interface/src/ui/overlays/Circle3DOverlay.h index 11c9c9710f..e41c308d9d 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.h +++ b/interface/src/ui/overlays/Circle3DOverlay.h @@ -88,6 +88,8 @@ protected: int _minorTicksVerticesID { 0 }; bool _dirty { true }; + + Transform evalRenderTransform() override; }; diff --git a/interface/src/ui/overlays/Cube3DOverlay.cpp b/interface/src/ui/overlays/Cube3DOverlay.cpp index ca7355b86f..0ac9dba34b 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.cpp +++ b/interface/src/ui/overlays/Cube3DOverlay.cpp @@ -53,18 +53,11 @@ void Cube3DOverlay::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); - // 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(); + auto batch = args->_batch; - if (batch) { - Transform transform; - transform.setTranslation(position); - transform.setRotation(rotation); + Transform transform = getRenderTransform(); auto geometryCache = DependencyManager::get(); auto shapePipeline = args->_shapePipeline; if (!shapePipeline) { @@ -72,12 +65,12 @@ void Cube3DOverlay::render(RenderArgs* args) { } if (_isSolid) { - transform.setScale(dimensions); batch->setModelTransform(transform); geometryCache->renderSolidCubeInstance(args, *batch, cubeColor, shapePipeline); } else { geometryCache->bindSimpleProgram(*batch, false, false, false, true, true); if (getIsDashedLine()) { + auto dimensions = transform.getScale(); transform.setScale(1.0f); batch->setModelTransform(transform); @@ -108,7 +101,6 @@ void Cube3DOverlay::render(RenderArgs* args) { geometryCache->renderDashedLine(*batch, bottomRightFar, topRightFar, cubeColor, _geometryIds[11]); } else { - transform.setScale(dimensions); batch->setModelTransform(transform); geometryCache->renderWireCubeInstance(args, *batch, cubeColor, shapePipeline); } @@ -149,3 +141,16 @@ QVariant Cube3DOverlay::getProperty(const QString& property) { return Volume3DOverlay::getProperty(property); } + +Transform Cube3DOverlay::evalRenderTransform() { + // TODO: handle registration point?? + glm::vec3 position = getPosition(); + glm::vec3 dimensions = getDimensions(); + glm::quat rotation = getRotation(); + + Transform transform; + transform.setScale(dimensions); + transform.setTranslation(position); + transform.setRotation(rotation); + return transform; +} diff --git a/interface/src/ui/overlays/Cube3DOverlay.h b/interface/src/ui/overlays/Cube3DOverlay.h index 9289af4de5..e7b58ad911 100644 --- a/interface/src/ui/overlays/Cube3DOverlay.h +++ b/interface/src/ui/overlays/Cube3DOverlay.h @@ -36,6 +36,9 @@ public: void setProperties(const QVariantMap& properties) override; QVariant getProperty(const QString& property) override; +protected: + Transform evalRenderTransform() override; + private: float _borderSize; // edges on a cube diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp index 3172403731..ca275368cb 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.cpp +++ b/interface/src/ui/overlays/Grid3DOverlay.cpp @@ -79,10 +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)); + Transform transform = getRenderTransform(); transform.setTranslation(position); batch->setModelTransform(transform); const float MINOR_GRID_EDGE = 0.0025f; @@ -146,3 +143,10 @@ void Grid3DOverlay::updateGrid() { _minorGridRowDivisions = getDimensions().x / _minorGridEvery; _minorGridColDivisions = getDimensions().y / _minorGridEvery; } + +Transform Grid3DOverlay::evalRenderTransform() { + Transform transform; + transform.setRotation(getRotation()); + transform.setScale(glm::vec3(getDimensions(), 1.0f)); + return transform; +} diff --git a/interface/src/ui/overlays/Grid3DOverlay.h b/interface/src/ui/overlays/Grid3DOverlay.h index 0d042af6ca..5a67b21e07 100644 --- a/interface/src/ui/overlays/Grid3DOverlay.h +++ b/interface/src/ui/overlays/Grid3DOverlay.h @@ -37,6 +37,9 @@ public: // Grids are UI tools, and may not be intersected (pickable) virtual bool findRayIntersection(const glm::vec3&, const glm::vec3&, float&, BoxFace&, glm::vec3&) override { return false; } +protected: + Transform evalRenderTransform() override; + private: void updateGrid(); diff --git a/interface/src/ui/overlays/Image3DOverlay.cpp b/interface/src/ui/overlays/Image3DOverlay.cpp index c79d363811..22beb2be20 100644 --- a/interface/src/ui/overlays/Image3DOverlay.cpp +++ b/interface/src/ui/overlays/Image3DOverlay.cpp @@ -116,18 +116,8 @@ void Image3DOverlay::render(RenderArgs* args) { const float MAX_COLOR = 255.0f; 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 - // itself will cause drift over time due to floating point errors. - if (transformChanged) { - setTransform(transform); - } - transform.postScale(glm::vec3(getDimensions(), 1.0f)); - batch->setModelTransform(transform); + batch->setModelTransform(getRenderTransform()); batch->setResourceTexture(0, _texture->getGPUTexture()); DependencyManager::get()->renderQuad( @@ -249,3 +239,9 @@ bool Image3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::vec Image3DOverlay* Image3DOverlay::createClone() const { return new Image3DOverlay(this); } + +Transform Image3DOverlay::evalRenderTransform() { + auto transform = Parent::evalRenderTransform(); + transform.postScale(glm::vec3(getDimensions(), 1.0f)); + return transform; +} diff --git a/interface/src/ui/overlays/Image3DOverlay.h b/interface/src/ui/overlays/Image3DOverlay.h index 4f813e7368..aa802a82a9 100644 --- a/interface/src/ui/overlays/Image3DOverlay.h +++ b/interface/src/ui/overlays/Image3DOverlay.h @@ -19,6 +19,7 @@ class Image3DOverlay : public Billboard3DOverlay { Q_OBJECT + using Parent = Billboard3DOverlay; public: static QString const TYPE; @@ -46,6 +47,9 @@ public: virtual Image3DOverlay* createClone() const override; +protected: + Transform evalRenderTransform() override; + private: QString _url; NetworkTexturePointer _texture; diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 534261c839..3bee13269b 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -268,3 +268,7 @@ QVariant Line3DOverlay::getProperty(const QString& property) { Line3DOverlay* Line3DOverlay::createClone() const { return new Line3DOverlay(this); } + +Transform Line3DOverlay::evalRenderTransform() { + return getTransform(); +} diff --git a/interface/src/ui/overlays/Line3DOverlay.h b/interface/src/ui/overlays/Line3DOverlay.h index 9abc2f1a8d..7e8be48cd6 100644 --- a/interface/src/ui/overlays/Line3DOverlay.h +++ b/interface/src/ui/overlays/Line3DOverlay.h @@ -56,6 +56,9 @@ public: QUuid getEndParentID() const { return _endParentID; } quint16 getEndJointIndex() const { return _endParentJointIndex; } +protected: + Transform evalRenderTransform() override; + private: QUuid _endParentID; quint16 _endParentJointIndex { INVALID_JOINT_INDEX }; diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index e2a7df7ae6..cc55165004 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -46,10 +46,7 @@ void ModelOverlay::update(float deltatime) { if (_updateModel) { _updateModel = false; _model->setSnapModelToCenter(true); - Transform transform = getTransform(); -#ifndef USE_SN_SCALE - transform.setScale(1.0f); // disable inherited scale -#endif + Transform transform = evalRenderTransform(); if (_scaleToFit) { _model->setScaleToFit(true, transform.getScale() * getDimensions()); } else { @@ -282,6 +279,10 @@ ModelOverlay* ModelOverlay::createClone() const { return new ModelOverlay(this); } +Transform ModelOverlay::evalRenderTransform() { + return getTransform(); +} + void ModelOverlay::locationChanged(bool tellPhysics) { Base3DOverlay::locationChanged(tellPhysics); diff --git a/interface/src/ui/overlays/ModelOverlay.h b/interface/src/ui/overlays/ModelOverlay.h index 59548dfe62..8d8429b29e 100644 --- a/interface/src/ui/overlays/ModelOverlay.h +++ b/interface/src/ui/overlays/ModelOverlay.h @@ -46,6 +46,8 @@ public: float getLoadPriority() const { return _loadPriority; } protected: + Transform evalRenderTransform() override; + // helper to extract metadata from our Model's rigged joints template using mapFunction = std::function; template diff --git a/interface/src/ui/overlays/Planar3DOverlay.cpp b/interface/src/ui/overlays/Planar3DOverlay.cpp index e865714e58..cfcea542e3 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.cpp +++ b/interface/src/ui/overlays/Planar3DOverlay.cpp @@ -67,7 +67,7 @@ bool Planar3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::ve return findRayRectangleIntersection(origin, direction, getRotation(), getPosition(), getDimensions(), distance); } -Transform Planar3DOverlay::evalRenderTransform() const { +Transform Planar3DOverlay::evalRenderTransform() { auto transform = getTransform(); transform.setScale(1.0f); // ignore inherited scale factor from parents if (glm::length2(getDimensions()) != 1.0f) { diff --git a/interface/src/ui/overlays/Planar3DOverlay.h b/interface/src/ui/overlays/Planar3DOverlay.h index 2ed90ab4ed..7cf4e0221d 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.h +++ b/interface/src/ui/overlays/Planar3DOverlay.h @@ -33,10 +33,10 @@ 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; + + Transform evalRenderTransform() override; }; diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.cpp b/interface/src/ui/overlays/Rectangle3DOverlay.cpp index dc8badbbd1..47d47b76a5 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.cpp +++ b/interface/src/ui/overlays/Rectangle3DOverlay.cpp @@ -124,3 +124,8 @@ void Rectangle3DOverlay::setProperties(const QVariantMap& properties) { Rectangle3DOverlay* Rectangle3DOverlay::createClone() const { return new Rectangle3DOverlay(this); } + +Transform Rectangle3DOverlay::evalRenderTransform() { + return getTransform(); +} + diff --git a/interface/src/ui/overlays/Rectangle3DOverlay.h b/interface/src/ui/overlays/Rectangle3DOverlay.h index a0c342a25b..a26ed524fc 100644 --- a/interface/src/ui/overlays/Rectangle3DOverlay.h +++ b/interface/src/ui/overlays/Rectangle3DOverlay.h @@ -28,6 +28,10 @@ public: void setProperties(const QVariantMap& properties) override; virtual Rectangle3DOverlay* createClone() const override; + +protected: + Transform evalRenderTransform() override; + private: int _geometryCacheID; std::array _rectGeometryIds; diff --git a/interface/src/ui/overlays/Shape3DOverlay.cpp b/interface/src/ui/overlays/Shape3DOverlay.cpp index fc54cc19ff..2c1df478f6 100644 --- a/interface/src/ui/overlays/Shape3DOverlay.cpp +++ b/interface/src/ui/overlays/Shape3DOverlay.cpp @@ -33,26 +33,15 @@ 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(); - glm::quat rotation = getRotation(); - auto batch = args->_batch; - if (batch) { - Transform transform; - transform.setTranslation(position); - transform.setRotation(rotation); auto geometryCache = DependencyManager::get(); auto shapePipeline = args->_shapePipeline; if (!shapePipeline) { shapePipeline = _isSolid ? geometryCache->getOpaqueShapePipeline() : geometryCache->getWireShapePipeline(); } - transform.setScale(dimensions); - batch->setModelTransform(transform); + batch->setModelTransform(getRenderTransform()); if (_isSolid) { geometryCache->renderSolidShapeInstance(args, *batch, _shape, cubeColor, shapePipeline); } else { @@ -129,3 +118,16 @@ QVariant Shape3DOverlay::getProperty(const QString& property) { return Volume3DOverlay::getProperty(property); } + +Transform Shape3DOverlay::evalRenderTransform() { + // TODO: handle registration point?? + glm::vec3 position = getPosition(); + glm::vec3 dimensions = getDimensions(); + glm::quat rotation = getRotation(); + + Transform transform; + transform.setScale(dimensions); + transform.setTranslation(position); + transform.setRotation(rotation); + return transform; +} diff --git a/interface/src/ui/overlays/Shape3DOverlay.h b/interface/src/ui/overlays/Shape3DOverlay.h index 2361001721..e9e26e3c94 100644 --- a/interface/src/ui/overlays/Shape3DOverlay.h +++ b/interface/src/ui/overlays/Shape3DOverlay.h @@ -37,6 +37,9 @@ public: void setProperties(const QVariantMap& properties) override; QVariant getProperty(const QString& property) override; +protected: + Transform evalRenderTransform() override; + private: float _borderSize; GeometryCache::Shape _shape { GeometryCache::Hexagon }; diff --git a/interface/src/ui/overlays/Sphere3DOverlay.cpp b/interface/src/ui/overlays/Sphere3DOverlay.cpp index 83dc4b0e2b..d4c04976f5 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.cpp +++ b/interface/src/ui/overlays/Sphere3DOverlay.cpp @@ -39,13 +39,8 @@ 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(); -#ifndef USE_SN_SCALE - transform.setScale(1.0f); // ignore inherited scale from SpatiallyNestable -#endif - transform.postScale(getDimensions() * SPHERE_OVERLAY_SCALE); - batch->setModelTransform(transform); + + batch->setModelTransform(getRenderTransform()); auto geometryCache = DependencyManager::get(); auto shapePipeline = args->_shapePipeline; @@ -75,3 +70,14 @@ const render::ShapeKey Sphere3DOverlay::getShapeKey() { Sphere3DOverlay* Sphere3DOverlay::createClone() const { return new Sphere3DOverlay(this); } + +Transform Sphere3DOverlay::evalRenderTransform() { + // FIXME Start using the _renderTransform instead of calling for Transform and Dimensions from here, do the custom things needed in evalRenderTransform() + Transform transform = getTransform(); +#ifndef USE_SN_SCALE + transform.setScale(1.0f); // ignore inherited scale from SpatiallyNestable +#endif + transform.postScale(getDimensions() * SPHERE_OVERLAY_SCALE); + + return transform; +} diff --git a/interface/src/ui/overlays/Sphere3DOverlay.h b/interface/src/ui/overlays/Sphere3DOverlay.h index 991b2ab51e..ebe6dc8d83 100644 --- a/interface/src/ui/overlays/Sphere3DOverlay.h +++ b/interface/src/ui/overlays/Sphere3DOverlay.h @@ -27,6 +27,9 @@ public: virtual const render::ShapeKey getShapeKey() override; virtual Sphere3DOverlay* createClone() const override; + +protected: + Transform evalRenderTransform() override; }; diff --git a/interface/src/ui/overlays/Text3DOverlay.cpp b/interface/src/ui/overlays/Text3DOverlay.cpp index 43a2854206..5813258d94 100644 --- a/interface/src/ui/overlays/Text3DOverlay.cpp +++ b/interface/src/ui/overlays/Text3DOverlay.cpp @@ -96,10 +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); + auto transform = getRenderTransform(); batch.setModelTransform(transform); const float MAX_COLOR = 255.0f; @@ -249,3 +246,8 @@ bool Text3DOverlay::findRayIntersection(const glm::vec3 &origin, const glm::vec3 setTransform(transform); return Billboard3DOverlay::findRayIntersection(origin, direction, distance, face, surfaceNormal); } + +Transform Text3DOverlay::evalRenderTransform() { + return Parent::evalRenderTransform(); +} + diff --git a/interface/src/ui/overlays/Text3DOverlay.h b/interface/src/ui/overlays/Text3DOverlay.h index e7b09c9040..69b503eb48 100644 --- a/interface/src/ui/overlays/Text3DOverlay.h +++ b/interface/src/ui/overlays/Text3DOverlay.h @@ -19,6 +19,7 @@ class TextRenderer3D; class Text3DOverlay : public Billboard3DOverlay { Q_OBJECT + using Parent = Billboard3DOverlay; public: static QString const TYPE; @@ -63,6 +64,9 @@ public: virtual Text3DOverlay* createClone() const override; +protected: + Transform evalRenderTransform() override; + private: TextRenderer3D* _textRenderer = nullptr; diff --git a/interface/src/ui/overlays/Volume3DOverlay.cpp b/interface/src/ui/overlays/Volume3DOverlay.cpp index 5e3e4ccee7..c42f5ef4d3 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.cpp +++ b/interface/src/ui/overlays/Volume3DOverlay.cpp @@ -69,3 +69,11 @@ bool Volume3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::ve // and testing intersection there. return _localBoundingBox.findRayIntersection(overlayFrameOrigin, overlayFrameDirection, distance, face, surfaceNormal); } + +Transform Volume3DOverlay::evalRenderTransform() { + Transform transform = getTransform(); +#ifndef USE_SN_SCALE + transform.setScale(1.0f); // ignore any inherited scale from SpatiallyNestable +#endif + return transform; +} diff --git a/interface/src/ui/overlays/Volume3DOverlay.h b/interface/src/ui/overlays/Volume3DOverlay.h index 04b694b2f8..53eeae6de0 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.h +++ b/interface/src/ui/overlays/Volume3DOverlay.h @@ -15,6 +15,7 @@ class Volume3DOverlay : public Base3DOverlay { Q_OBJECT + using Parent = Base3DOverlay; public: Volume3DOverlay() {} @@ -35,6 +36,8 @@ public: protected: // Centered local bounding box AABox _localBoundingBox{ vec3(0.0f), 1.0f }; + + Transform evalRenderTransform() override; }; From 7103864b3705931e4bd71ba85c4b8c55526635d2 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 21 Sep 2017 12:23:53 -0700 Subject: [PATCH 3/8] Also rendering the line3D overlay with start and end captured in game loop --- interface/src/ui/overlays/Line3DOverlay.cpp | 9 +++++---- interface/src/ui/overlays/Line3DOverlay.h | 5 +++++ 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index 3bee13269b..d8a83fad49 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -132,10 +132,9 @@ 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(); + glm::vec3 start = _renderStart; + glm::vec3 end = _renderEnd; auto geometryCache = DependencyManager::get(); if (getIsDashedLine()) { @@ -270,5 +269,7 @@ Line3DOverlay* Line3DOverlay::createClone() const { } Transform Line3DOverlay::evalRenderTransform() { - return getTransform(); + _renderStart = getStart(); + _renderEnd = getEnd(); + return Parent::evalRenderTransform(); } diff --git a/interface/src/ui/overlays/Line3DOverlay.h b/interface/src/ui/overlays/Line3DOverlay.h index 7e8be48cd6..d1c6aa6183 100644 --- a/interface/src/ui/overlays/Line3DOverlay.h +++ b/interface/src/ui/overlays/Line3DOverlay.h @@ -15,6 +15,7 @@ class Line3DOverlay : public Base3DOverlay { Q_OBJECT + using Parent = Base3DOverlay; public: static QString const TYPE; @@ -72,6 +73,10 @@ private: float _glow { 0.0 }; float _glowWidth { 0.0 }; int _geometryCacheID; + + // Similar to the _renderTransform, we capture the start and end pos for render loop in game loop + glm::vec3 _renderStart; + glm::vec3 _renderEnd; }; #endif // hifi_Line3DOverlay_h From 454e167d93aee556bdcc8c69e6a6c1b65e8bc452 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 21 Sep 2017 12:58:56 -0700 Subject: [PATCH 4/8] notifying a render transform / bound change when the dimension property change --- interface/src/ui/overlays/Planar3DOverlay.cpp | 5 +++++ interface/src/ui/overlays/Planar3DOverlay.h | 4 ++-- interface/src/ui/overlays/Volume3DOverlay.cpp | 5 +++++ interface/src/ui/overlays/Volume3DOverlay.h | 4 ++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/interface/src/ui/overlays/Planar3DOverlay.cpp b/interface/src/ui/overlays/Planar3DOverlay.cpp index cfcea542e3..ac3fe66ddc 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.cpp +++ b/interface/src/ui/overlays/Planar3DOverlay.cpp @@ -35,6 +35,11 @@ AABox Planar3DOverlay::getBounds() const { return AABox(extents); } +void Planar3DOverlay::setDimensions(const glm::vec2& value) { + _dimensions = value; + notifyRenderTransformChange(); +} + void Planar3DOverlay::setProperties(const QVariantMap& properties) { Base3DOverlay::setProperties(properties); diff --git a/interface/src/ui/overlays/Planar3DOverlay.h b/interface/src/ui/overlays/Planar3DOverlay.h index 7cf4e0221d..1360cccfc2 100644 --- a/interface/src/ui/overlays/Planar3DOverlay.h +++ b/interface/src/ui/overlays/Planar3DOverlay.h @@ -24,8 +24,8 @@ public: virtual glm::vec2 getSize() const { return _dimensions; }; glm::vec2 getDimensions() const { return _dimensions; } - void setDimensions(float value) { _dimensions = glm::vec2(value); } - void setDimensions(const glm::vec2& value) { _dimensions = value; } + void setDimensions(float value) { setDimensions(glm::vec2(value)); } + void setDimensions(const glm::vec2& value); void setProperties(const QVariantMap& properties) override; QVariant getProperty(const QString& property) override; diff --git a/interface/src/ui/overlays/Volume3DOverlay.cpp b/interface/src/ui/overlays/Volume3DOverlay.cpp index c42f5ef4d3..2eeadbe7b3 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.cpp +++ b/interface/src/ui/overlays/Volume3DOverlay.cpp @@ -26,6 +26,11 @@ AABox Volume3DOverlay::getBounds() const { return AABox(extents); } +void Volume3DOverlay::setDimensions(const glm::vec3& value) { + _localBoundingBox.setBox(-value / 2.0f, value); + notifyRenderTransformChange(); +} + void Volume3DOverlay::setProperties(const QVariantMap& properties) { Base3DOverlay::setProperties(properties); diff --git a/interface/src/ui/overlays/Volume3DOverlay.h b/interface/src/ui/overlays/Volume3DOverlay.h index 53eeae6de0..bde8c71aef 100644 --- a/interface/src/ui/overlays/Volume3DOverlay.h +++ b/interface/src/ui/overlays/Volume3DOverlay.h @@ -24,8 +24,8 @@ public: virtual AABox getBounds() const override; const glm::vec3& getDimensions() const { return _localBoundingBox.getDimensions(); } - void setDimensions(float value) { _localBoundingBox.setBox(glm::vec3(-value / 2.0f), value); } - void setDimensions(const glm::vec3& value) { _localBoundingBox.setBox(-value / 2.0f, value); } + void setDimensions(float value) { setDimensions(glm::vec3(value)); } + void setDimensions(const glm::vec3& value); void setProperties(const QVariantMap& properties) override; QVariant getProperty(const QString& property) override; From 2d369a458647fd18b716ff474bcc608c75feec76 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 21 Sep 2017 16:20:13 -0700 Subject: [PATCH 5/8] fixing the image3D updating its renderTransform from it s update() call --- interface/src/ui/overlays/Image3DOverlay.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/src/ui/overlays/Image3DOverlay.cpp b/interface/src/ui/overlays/Image3DOverlay.cpp index 22beb2be20..998cc312eb 100644 --- a/interface/src/ui/overlays/Image3DOverlay.cpp +++ b/interface/src/ui/overlays/Image3DOverlay.cpp @@ -58,6 +58,7 @@ void Image3DOverlay::update(float deltatime) { setTransform(transform); } #endif + Parent::update(deltatime); } void Image3DOverlay::render(RenderArgs* args) { From 219d63784b7f6820a898b3b5b1852e4b54e40dba Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 22 Sep 2017 10:39:51 -0700 Subject: [PATCH 6/8] REmoving the extra variables in Linear3D and just use the _renderTRansform --- interface/src/ui/overlays/Line3DOverlay.cpp | 23 ++++++++++++++++----- interface/src/ui/overlays/Line3DOverlay.h | 4 ---- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/interface/src/ui/overlays/Line3DOverlay.cpp b/interface/src/ui/overlays/Line3DOverlay.cpp index d8a83fad49..87021cf852 100644 --- a/interface/src/ui/overlays/Line3DOverlay.cpp +++ b/interface/src/ui/overlays/Line3DOverlay.cpp @@ -133,8 +133,9 @@ void Line3DOverlay::render(RenderArgs* args) { auto batch = args->_batch; if (batch) { batch->setModelTransform(Transform()); - glm::vec3 start = _renderStart; - glm::vec3 end = _renderEnd; + auto& renderTransform = getRenderTransform(); + glm::vec3 start = renderTransform.getTranslation(); + glm::vec3 end = renderTransform.transform(vec3(0.0, 0.0, -1.0)); auto geometryCache = DependencyManager::get(); if (getIsDashedLine()) { @@ -269,7 +270,19 @@ Line3DOverlay* Line3DOverlay::createClone() const { } Transform Line3DOverlay::evalRenderTransform() { - _renderStart = getStart(); - _renderEnd = getEnd(); - return Parent::evalRenderTransform(); + // Capture start and endin the renderTransform: + // start is the origin + // end is at the tip of the front axis aka -Z + Transform transform; + transform.setTranslation( getStart()); + auto endPos = getEnd(); + + auto vec = endPos - transform.getTranslation(); + auto scale = glm::length(vec); + auto dir = vec / scale; + auto orientation = glm::rotation(glm::vec3(0,0,-1), dir); + transform.setRotation(orientation); + transform.setScale(scale); + + return transform; } diff --git a/interface/src/ui/overlays/Line3DOverlay.h b/interface/src/ui/overlays/Line3DOverlay.h index d1c6aa6183..bcb65b1f1e 100644 --- a/interface/src/ui/overlays/Line3DOverlay.h +++ b/interface/src/ui/overlays/Line3DOverlay.h @@ -73,10 +73,6 @@ private: float _glow { 0.0 }; float _glowWidth { 0.0 }; int _geometryCacheID; - - // Similar to the _renderTransform, we capture the start and end pos for render loop in game loop - glm::vec3 _renderStart; - glm::vec3 _renderEnd; }; #endif // hifi_Line3DOverlay_h From b424505f6560248fb99c1b358863b0ed7bf75229 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 22 Sep 2017 10:48:56 -0700 Subject: [PATCH 7/8] FIxing the case of the Circle3D --- interface/src/ui/overlays/Circle3DOverlay.cpp | 11 +---------- interface/src/ui/overlays/Circle3DOverlay.h | 2 -- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index b3e4cba5d9..4e51844d21 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -84,12 +84,7 @@ void Circle3DOverlay::render(RenderArgs* args) { batch.setPipeline(args->_shapePipeline->pipeline); } - // 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)); - batch.setModelTransform(transform); + batch.setModelTransform(getRenderTransform()); // for our overlay, is solid means we draw a ring between the inner and outer radius of the circle, otherwise // we just draw a line... @@ -438,7 +433,3 @@ bool Circle3DOverlay::findRayIntersection(const glm::vec3& origin, const glm::ve Circle3DOverlay* Circle3DOverlay::createClone() const { return new Circle3DOverlay(this); } - -Transform Circle3DOverlay::evalRenderTransform() { - return getTransform(); -} diff --git a/interface/src/ui/overlays/Circle3DOverlay.h b/interface/src/ui/overlays/Circle3DOverlay.h index e41c308d9d..11c9c9710f 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.h +++ b/interface/src/ui/overlays/Circle3DOverlay.h @@ -88,8 +88,6 @@ protected: int _minorTicksVerticesID { 0 }; bool _dirty { true }; - - Transform evalRenderTransform() override; }; From badb45c921999a96e3303a4bda8d3b646142c28b Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 26 Sep 2017 15:20:45 -0700 Subject: [PATCH 8/8] fixing the web surface now getting scaled when the table t is grabbed is fixed --- interface/src/ui/overlays/Web3DOverlay.cpp | 15 +++++++++++++-- interface/src/ui/overlays/Web3DOverlay.h | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/overlays/Web3DOverlay.cpp b/interface/src/ui/overlays/Web3DOverlay.cpp index 0807d1c117..a3f470aa62 100644 --- a/interface/src/ui/overlays/Web3DOverlay.cpp +++ b/interface/src/ui/overlays/Web3DOverlay.cpp @@ -302,7 +302,6 @@ void Web3DOverlay::render(RenderArgs* args) { emit resizeWebSurface(); } - vec2 halfSize = getSize() / 2.0f; vec4 color(toGlm(getColor()), getAlpha()); if (!_texture) { @@ -318,8 +317,11 @@ void Web3DOverlay::render(RenderArgs* args) { Q_ASSERT(args->_batch); gpu::Batch& batch = *args->_batch; batch.setResourceTexture(0, _texture); + auto renderTransform = getRenderTransform(); - batch.setModelTransform(getRenderTransform()); + auto size = renderTransform.getScale(); + renderTransform.setScale(1.0f); + batch.setModelTransform(renderTransform); auto geometryCache = DependencyManager::get(); if (color.a < OPAQUE_ALPHA_THRESHOLD) { @@ -327,10 +329,19 @@ void Web3DOverlay::render(RenderArgs* args) { } else { geometryCache->bindWebBrowserProgram(batch); } + + vec2 halfSize = vec2(size.x, size.y) / 2.0f; geometryCache->renderQuad(batch, halfSize * -1.0f, halfSize, vec2(0), vec2(1), color, _geometryId); batch.setResourceTexture(0, nullptr); // restore default white color after me } +Transform Web3DOverlay::evalRenderTransform() { + Transform transform = Parent::evalRenderTransform(); + transform.setScale(1.0f); + transform.postScale(glm::vec3(getSize(), 1.0f)); + return transform; +} + const render::ShapeKey Web3DOverlay::getShapeKey() { auto builder = render::ShapeKey::Builder().withoutCullFace().withDepthBias().withOwnPipeline(); if (isTransparent()) { diff --git a/interface/src/ui/overlays/Web3DOverlay.h b/interface/src/ui/overlays/Web3DOverlay.h index 6bd540d120..6afccaf3fc 100644 --- a/interface/src/ui/overlays/Web3DOverlay.h +++ b/interface/src/ui/overlays/Web3DOverlay.h @@ -78,6 +78,9 @@ signals: void requestWebSurface(); void releaseWebSurface(); +protected: + Transform evalRenderTransform() override; + private: InputMode _inputMode { Touch }; QSharedPointer _webSurface;