From 97c0b33975698800d3c5c66a2aa567c6931f9e51 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Mon, 8 Jan 2018 12:50:05 -0800 Subject: [PATCH] fix avatar texture loading --- .../src/avatars-renderer/SkeletonModel.cpp | 17 ++++++++++++++ .../src/avatars-renderer/SkeletonModel.h | 8 +++++-- .../src/CauterizedMeshPartPayload.cpp | 5 +--- .../render-utils/src/MeshPartPayload.cpp | 23 ++++++------------- libraries/render-utils/src/Model.h | 4 ++-- 5 files changed, 33 insertions(+), 24 deletions(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp index 04b865fa03..a13ef07cd4 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.cpp @@ -37,6 +37,16 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) : SkeletonModel::~SkeletonModel() { } +void SkeletonModel::setURL(const QUrl& url) { + _texturesLoaded = false; + Model::setURL(url); +} + +void SkeletonModel::setTextures(const QVariantMap& textures) { + _texturesLoaded = false; + Model::setTextures(textures); +} + void SkeletonModel::initJointStates() { const FBXGeometry& geometry = getFBXGeometry(); glm::mat4 modelOffset = glm::scale(_scale) * glm::translate(_offset); @@ -142,6 +152,13 @@ void SkeletonModel::simulate(float deltaTime, bool fullUpdate) { Parent::simulate(deltaTime, fullUpdate); } + // FIXME: This texture loading logic should probably live in Avatar, to mirror RenderableModelEntityItem and ModelOverlay, + // but Avatars don't get updates in the same way + if (!_texturesLoaded && getGeometry() && getGeometry()->areTexturesLoaded()) { + _texturesLoaded = true; + updateRenderItems(); + } + if (!isActive() || !_owningAvatar->isMyAvatar()) { return; // only simulate for own avatar } diff --git a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.h b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.h index 919e82825c..f911ad0c5a 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.h +++ b/libraries/avatars-renderer/src/avatars-renderer/SkeletonModel.h @@ -31,6 +31,9 @@ public: SkeletonModel(Avatar* owningAvatar, QObject* parent = nullptr); ~SkeletonModel(); + Q_INVOKABLE void setURL(const QUrl& url) override; + Q_INVOKABLE void setTextures(const QVariantMap& textures) override; + void initJointStates() override; void simulate(float deltaTime, bool fullUpdate = true) override; @@ -115,8 +118,6 @@ protected: void computeBoundingShape(); -protected: - bool getEyeModelPositions(glm::vec3& firstEyePosition, glm::vec3& secondEyePosition) const; Avatar* _owningAvatar; @@ -128,6 +129,9 @@ protected: glm::vec3 _defaultEyeModelPosition; float _headClipDistance; // Near clip distance to use if no separate head model + +private: + bool _texturesLoaded { false }; }; #endif // hifi_SkeletonModel_h diff --git a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp index 8a5b0d6bc3..9de973480a 100644 --- a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp +++ b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp @@ -46,10 +46,7 @@ void CauterizedMeshPartPayload::bindTransform(gpu::Batch& batch, const render::S } batch.setModelTransform(_cauterizedTransform); } else { - if (_clusterBuffer) { - batch.setUniformBuffer(ShapePipeline::Slot::BUFFER::SKINNING, _clusterBuffer); - } - batch.setModelTransform(_transform); + ModelMeshPartPayload::bindTransform(batch, locations, renderMode); } } diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 9d63bd78cb..c16f7f952e 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -480,23 +480,14 @@ ShapeKey ModelMeshPartPayload::getShapeKey() const { } void ModelMeshPartPayload::bindMesh(gpu::Batch& batch) { - if (!_isBlendShaped) { - batch.setIndexBuffer(gpu::UINT32, (_drawMesh->getIndexBuffer()._buffer), 0); - batch.setInputFormat((_drawMesh->getVertexFormat())); - batch.setInputStream(0, _drawMesh->getVertexStream()); + batch.setIndexBuffer(gpu::UINT32, (_drawMesh->getIndexBuffer()._buffer), 0); + batch.setInputFormat((_drawMesh->getVertexFormat())); + if (_isBlendShaped && _blendedVertexBuffer) { + batch.setInputBuffer(0, _blendedVertexBuffer, 0, sizeof(glm::vec3)); + batch.setInputBuffer(1, _blendedVertexBuffer, _drawMesh->getNumVertices() * sizeof(glm::vec3), sizeof(glm::vec3)); + batch.setInputStream(2, _drawMesh->getVertexStream().makeRangedStream(2)); } else { - batch.setIndexBuffer(gpu::UINT32, (_drawMesh->getIndexBuffer()._buffer), 0); - batch.setInputFormat((_drawMesh->getVertexFormat())); - - if (_blendedVertexBuffer) { - batch.setInputBuffer(0, _blendedVertexBuffer, 0, sizeof(glm::vec3)); - batch.setInputBuffer(1, _blendedVertexBuffer, _drawMesh->getNumVertices() * sizeof(glm::vec3), sizeof(glm::vec3)); - batch.setInputStream(2, _drawMesh->getVertexStream().makeRangedStream(2)); - } else { - batch.setIndexBuffer(gpu::UINT32, (_drawMesh->getIndexBuffer()._buffer), 0); - batch.setInputFormat((_drawMesh->getVertexFormat())); - batch.setInputStream(0, _drawMesh->getVertexStream()); - } + batch.setInputStream(0, _drawMesh->getVertexStream()); } } diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 4df7faac84..9c5b980ed1 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -78,7 +78,7 @@ public: /// Sets the URL of the model to render. // Should only be called from the model's rendering thread to avoid access violations of changed geometry. - Q_INVOKABLE void setURL(const QUrl& url); + Q_INVOKABLE virtual void setURL(const QUrl& url); const QUrl& getURL() const { return _url; } // new Scene/Engine rendering support @@ -136,7 +136,7 @@ public: const Geometry::Pointer& getCollisionGeometry() const { return _collisionGeometry; } const QVariantMap getTextures() const { assert(isLoaded()); return _renderGeometry->getTextures(); } - Q_INVOKABLE void setTextures(const QVariantMap& textures); + Q_INVOKABLE virtual void setTextures(const QVariantMap& textures); /// Provided as a convenience, will crash if !isLoaded() // And so that getGeometry() isn't chained everywhere