Merge pull request #12106 from SamGondelman/overlayFix

Fix avatar texture loading
This commit is contained in:
John Conklin II 2018-01-08 14:01:15 -08:00 committed by GitHub
commit fab28e7d44
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 33 additions and 24 deletions

View file

@ -37,6 +37,16 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) :
SkeletonModel::~SkeletonModel() { 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() { void SkeletonModel::initJointStates() {
const FBXGeometry& geometry = getFBXGeometry(); const FBXGeometry& geometry = getFBXGeometry();
glm::mat4 modelOffset = glm::scale(_scale) * glm::translate(_offset); glm::mat4 modelOffset = glm::scale(_scale) * glm::translate(_offset);
@ -142,6 +152,13 @@ void SkeletonModel::simulate(float deltaTime, bool fullUpdate) {
Parent::simulate(deltaTime, 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()) { if (!isActive() || !_owningAvatar->isMyAvatar()) {
return; // only simulate for own avatar return; // only simulate for own avatar
} }

View file

@ -31,6 +31,9 @@ public:
SkeletonModel(Avatar* owningAvatar, QObject* parent = nullptr); SkeletonModel(Avatar* owningAvatar, QObject* parent = nullptr);
~SkeletonModel(); ~SkeletonModel();
Q_INVOKABLE void setURL(const QUrl& url) override;
Q_INVOKABLE void setTextures(const QVariantMap& textures) override;
void initJointStates() override; void initJointStates() override;
void simulate(float deltaTime, bool fullUpdate = true) override; void simulate(float deltaTime, bool fullUpdate = true) override;
@ -115,8 +118,6 @@ protected:
void computeBoundingShape(); void computeBoundingShape();
protected:
bool getEyeModelPositions(glm::vec3& firstEyePosition, glm::vec3& secondEyePosition) const; bool getEyeModelPositions(glm::vec3& firstEyePosition, glm::vec3& secondEyePosition) const;
Avatar* _owningAvatar; Avatar* _owningAvatar;
@ -128,6 +129,9 @@ protected:
glm::vec3 _defaultEyeModelPosition; glm::vec3 _defaultEyeModelPosition;
float _headClipDistance; // Near clip distance to use if no separate head model float _headClipDistance; // Near clip distance to use if no separate head model
private:
bool _texturesLoaded { false };
}; };
#endif // hifi_SkeletonModel_h #endif // hifi_SkeletonModel_h

View file

@ -46,10 +46,7 @@ void CauterizedMeshPartPayload::bindTransform(gpu::Batch& batch, const render::S
} }
batch.setModelTransform(_cauterizedTransform); batch.setModelTransform(_cauterizedTransform);
} else { } else {
if (_clusterBuffer) { ModelMeshPartPayload::bindTransform(batch, locations, renderMode);
batch.setUniformBuffer(ShapePipeline::Slot::BUFFER::SKINNING, _clusterBuffer);
}
batch.setModelTransform(_transform);
} }
} }

View file

@ -480,25 +480,16 @@ ShapeKey ModelMeshPartPayload::getShapeKey() const {
} }
void ModelMeshPartPayload::bindMesh(gpu::Batch& batch) { void ModelMeshPartPayload::bindMesh(gpu::Batch& batch) {
if (!_isBlendShaped) {
batch.setIndexBuffer(gpu::UINT32, (_drawMesh->getIndexBuffer()._buffer), 0); batch.setIndexBuffer(gpu::UINT32, (_drawMesh->getIndexBuffer()._buffer), 0);
batch.setInputFormat((_drawMesh->getVertexFormat())); batch.setInputFormat((_drawMesh->getVertexFormat()));
batch.setInputStream(0, _drawMesh->getVertexStream()); if (_isBlendShaped && _blendedVertexBuffer) {
} 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(0, _blendedVertexBuffer, 0, sizeof(glm::vec3));
batch.setInputBuffer(1, _blendedVertexBuffer, _drawMesh->getNumVertices() * sizeof(glm::vec3), sizeof(glm::vec3)); batch.setInputBuffer(1, _blendedVertexBuffer, _drawMesh->getNumVertices() * sizeof(glm::vec3), sizeof(glm::vec3));
batch.setInputStream(2, _drawMesh->getVertexStream().makeRangedStream(2)); batch.setInputStream(2, _drawMesh->getVertexStream().makeRangedStream(2));
} else { } else {
batch.setIndexBuffer(gpu::UINT32, (_drawMesh->getIndexBuffer()._buffer), 0);
batch.setInputFormat((_drawMesh->getVertexFormat()));
batch.setInputStream(0, _drawMesh->getVertexStream()); batch.setInputStream(0, _drawMesh->getVertexStream());
} }
} }
}
void ModelMeshPartPayload::bindTransform(gpu::Batch& batch, const ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const { void ModelMeshPartPayload::bindTransform(gpu::Batch& batch, const ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const {
if (_clusterBuffer) { if (_clusterBuffer) {

View file

@ -78,7 +78,7 @@ public:
/// Sets the URL of the model to render. /// 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. // 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; } const QUrl& getURL() const { return _url; }
// new Scene/Engine rendering support // new Scene/Engine rendering support
@ -136,7 +136,7 @@ public:
const Geometry::Pointer& getCollisionGeometry() const { return _collisionGeometry; } const Geometry::Pointer& getCollisionGeometry() const { return _collisionGeometry; }
const QVariantMap getTextures() const { assert(isLoaded()); return _renderGeometry->getTextures(); } 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() /// Provided as a convenience, will crash if !isLoaded()
// And so that getGeometry() isn't chained everywhere // And so that getGeometry() isn't chained everywhere