From 559ac6786d14b3c406d6baa17bf86b79b795ca78 Mon Sep 17 00:00:00 2001 From: "Anthony J. Thibault" Date: Fri, 8 Sep 2017 11:44:06 -0700 Subject: [PATCH 1/2] Fix MyAvatar getting stuck in T-pose on loading Before this change, there was a race condition between the main thread calling Model::initWhenReady, and the render thread calling Avatar::fixupModelsInScene(). They both would end up setting the Model::_addedToScene flag. This race caused Model::initWhenReady() to never return true, which resulted in the MyAvatar class never initializing the animation system. --- libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 7f4ebf39e1..bc6bb2a0ec 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -648,7 +648,9 @@ void Avatar::render(RenderArgs* renderArgs) { return; } - fixupModelsInScene(renderArgs->_scene); + if (!isMyAvatar()) { + fixupModelsInScene(renderArgs->_scene); + } if (showCollisionShapes && shouldRenderHead(renderArgs) && _skeletonModel->isRenderable()) { PROFILE_RANGE_BATCH(batch, __FUNCTION__":skeletonBoundingCollisionShapes"); From 967d3f69d3dfa7ff54faedf358f761bc75eb33f2 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 8 Sep 2017 14:13:58 -0700 Subject: [PATCH 2/2] suppress repeated 'item could not be rendered' messages --- libraries/render/src/render/DrawTask.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index 8372231597..710507bd79 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -9,6 +9,8 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include + #include "DrawTask.h" #include "Logging.h" @@ -48,12 +50,14 @@ void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, cons if (args->_shapePipeline) { args->_shapePipeline->prepareShapeItem(args, key, item); item.render(args); - } + } args->_shapePipeline = nullptr; } else if (key.hasOwnPipeline()) { item.render(args); } else { qCDebug(renderlogging) << "Item could not be rendered with invalid key" << key; + static QString repeatedCouldNotBeRendered = LogHandler::getInstance().addRepeatedMessageRegex( + "Item could not be rendered with invalid key.*"); } args->_itemShapeKey = 0; } @@ -62,7 +66,7 @@ void render::renderShapes(const RenderContextPointer& renderContext, const ShapePlumberPointer& shapeContext, const ItemBounds& inItems, int maxDrawnItems, const ShapeKey& globalKey) { auto& scene = renderContext->_scene; RenderArgs* args = renderContext->args; - + int numItemsToDraw = (int)inItems.size(); if (maxDrawnItems != -1) { numItemsToDraw = glm::min(numItemsToDraw, maxDrawnItems); @@ -104,6 +108,8 @@ void render::renderStateSortShapes(const RenderContextPointer& renderContext, } else if (key.hasOwnPipeline()) { ownPipelineBucket.push_back( std::make_tuple(item, key) ); } else { + static QString repeatedCouldNotBeRendered = LogHandler::getInstance().addRepeatedMessageRegex( + "Item could not be rendered with invalid key.*"); qCDebug(renderlogging) << "Item could not be rendered with invalid key" << key; } } @@ -113,7 +119,7 @@ void render::renderStateSortShapes(const RenderContextPointer& renderContext, for (auto& pipelineKey : sortedPipelines) { auto& bucket = sortedShapes[pipelineKey]; args->_shapePipeline = shapeContext->pickPipeline(args, pipelineKey); - if (!args->_shapePipeline) { + if (!args->_shapePipeline) { continue; } args->_itemShapeKey = pipelineKey._flags.to_ulong(); @@ -182,7 +188,7 @@ void DrawBounds::run(const RenderContextPointer& renderContext, if (!_drawBuffer) { _drawBuffer = std::make_shared(sizeOfItemBound); } - + _drawBuffer->setData(numItems * sizeOfItemBound, (const gpu::Byte*) items.data()); gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {