From 6a19b0e0b6f6a9d1fca8d67712cbbd63a730ed78 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Thu, 4 Jan 2018 13:10:46 -0800 Subject: [PATCH 1/3] update render items on texture load --- interface/src/ui/overlays/ModelOverlay.cpp | 7 +++++++ interface/src/ui/overlays/ModelOverlay.h | 1 + .../src/RenderableModelEntityItem.cpp | 13 ++++++++++++- .../src/RenderableModelEntityItem.h | 3 ++- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/interface/src/ui/overlays/ModelOverlay.cpp b/interface/src/ui/overlays/ModelOverlay.cpp index 67fa94f7e5..3bd4f84cd6 100644 --- a/interface/src/ui/overlays/ModelOverlay.cpp +++ b/interface/src/ui/overlays/ModelOverlay.cpp @@ -97,6 +97,11 @@ void ModelOverlay::update(float deltatime) { _model->setLayeredInHUD(getDrawHUDLayer(), scene); } scene->enqueueTransaction(transaction); + + if (!_texturesLoaded && _model->getGeometry() && _model->getGeometry()->areTexturesLoaded()) { + _texturesLoaded = true; + _model->updateRenderItems(); + } } bool ModelOverlay::addToScene(Overlay::Pointer overlay, const render::ScenePointer& scene, render::Transaction& transaction) { @@ -170,10 +175,12 @@ void ModelOverlay::setProperties(const QVariantMap& properties) { _url = urlValue.toString(); _updateModel = true; _isLoaded = false; + _texturesLoaded = false; } auto texturesValue = properties["textures"]; if (texturesValue.isValid() && texturesValue.canConvert(QVariant::Map)) { + _texturesLoaded = false; QVariantMap textureMap = texturesValue.toMap(); QMetaObject::invokeMethod(_model.get(), "setTextures", Qt::AutoConnection, Q_ARG(const QVariantMap&, textureMap)); diff --git a/interface/src/ui/overlays/ModelOverlay.h b/interface/src/ui/overlays/ModelOverlay.h index 4f7f1e0cae..a39f762210 100644 --- a/interface/src/ui/overlays/ModelOverlay.h +++ b/interface/src/ui/overlays/ModelOverlay.h @@ -79,6 +79,7 @@ private: ModelPointer _model; QVariantMap _modelTextures; + bool _texturesLoaded { false }; render::ItemIDs _subRenderItemIDs; diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 79fe36d88f..245366cfc1 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -1080,6 +1080,10 @@ bool ModelEntityRenderer::needsRenderUpdate() const { return true; } + if (!_texturesLoaded && _model->getGeometry() && _model->getGeometry()->areTexturesLoaded()) { + return true; + } + if (model->needsReload()) { return true; } @@ -1216,6 +1220,7 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce // From here on, we are guaranteed a populated model withWriteLock([&] { if (_parsedModelURL != model->getURL()) { + _texturesLoaded = false; model->setURL(_parsedModelURL); } }); @@ -1247,6 +1252,7 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce } if (_lastTextures != entity->getTextures()) { + _texturesLoaded = false; _lastTextures = entity->getTextures(); auto newTextures = parseTexturesToMap(_lastTextures, entity->_originalTextures); if (newTextures != _currentTextures) { @@ -1301,12 +1307,17 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce } } + if (!_texturesLoaded && model->getGeometry() && model->getGeometry()->areTexturesLoaded()) { + _texturesLoaded = true; + model->updateRenderItems(); + } + // When the individual mesh parts of a model finish fading, they will mark their Model as needing updating // we will watch for that and ask the model to update it's render items if (model->getRenderItemsNeedUpdate()) { model->updateRenderItems(); } - + // The code to deal with the change of properties is now in ModelEntityItem.cpp // That is where _currentFrame and _lastAnimated were updated. if (_animating) { diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.h b/libraries/entities-renderer/src/RenderableModelEntityItem.h index 7af10b09fd..b7a339e1e1 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.h +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.h @@ -158,10 +158,11 @@ private: virtual bool isTransparent() const override { return false; } bool _hasModel { false }; - ::ModelPointer _model; + ModelPointer _model; GeometryResource::Pointer _compoundShapeResource; QString _lastTextures; QVariantMap _currentTextures; + bool _texturesLoaded { false }; AnimationPropertyGroup _renderAnimationProperties; int _lastKnownCurrentFrame { -1 }; #ifdef MODEL_ENTITY_USE_FADE_EFFECT From a9d5dda97643bc5cd859be658aba9439fcc72f29 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Thu, 4 Jan 2018 17:54:23 -0800 Subject: [PATCH 2/3] always push default haze to current frame --- libraries/render-utils/src/CauterizedMeshPartPayload.cpp | 1 - libraries/render-utils/src/DeferredLightingEffect.cpp | 4 ++-- libraries/render-utils/src/MeshPartPayload.cpp | 1 - libraries/render-utils/src/ZoneRenderer.cpp | 2 +- libraries/render/src/render/ShapePipeline.h | 2 +- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp index 396cd13508..8a5b0d6bc3 100644 --- a/libraries/render-utils/src/CauterizedMeshPartPayload.cpp +++ b/libraries/render-utils/src/CauterizedMeshPartPayload.cpp @@ -39,7 +39,6 @@ void CauterizedMeshPartPayload::updateTransformForCauterizedMesh(const Transform } void CauterizedMeshPartPayload::bindTransform(gpu::Batch& batch, const render::ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const { - // Still relying on the raw data from the model bool useCauterizedMesh = (renderMode != RenderArgs::RenderMode::SHADOW_RENDER_MODE && renderMode != RenderArgs::RenderMode::SECONDARY_CAMERA_RENDER_MODE) && _enableCauterization; if (useCauterizedMesh) { if (_cauterizedClusterBuffer) { diff --git a/libraries/render-utils/src/DeferredLightingEffect.cpp b/libraries/render-utils/src/DeferredLightingEffect.cpp index 3286531643..151fb7990d 100644 --- a/libraries/render-utils/src/DeferredLightingEffect.cpp +++ b/libraries/render-utils/src/DeferredLightingEffect.cpp @@ -71,12 +71,12 @@ enum DeferredShader_BufferSlot { SCATTERING_PARAMETERS_BUFFER_SLOT, LIGHTING_MODEL_BUFFER_SLOT = render::ShapePipeline::Slot::LIGHTING_MODEL, LIGHT_GPU_SLOT = render::ShapePipeline::Slot::LIGHT, - LIGHT_AMBIENT_SLOT, + LIGHT_AMBIENT_SLOT = render::ShapePipeline::Slot::LIGHT_AMBIENT_BUFFER, + HAZE_MODEL_BUFFER_SLOT = render::ShapePipeline::Slot::HAZE_MODEL, LIGHT_INDEX_GPU_SLOT, LIGHT_CLUSTER_GRID_FRUSTUM_GRID_SLOT, LIGHT_CLUSTER_GRID_CLUSTER_GRID_SLOT, LIGHT_CLUSTER_GRID_CLUSTER_CONTENT_SLOT, - HAZE_MODEL_BUFFER_SLOT }; static void loadLightProgram(const char* vertSource, const char* fragSource, bool lightVolume, gpu::PipelinePointer& program, LightLocationsPtr& locations); diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 2a59c7d3c5..9d63bd78cb 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -501,7 +501,6 @@ void ModelMeshPartPayload::bindMesh(gpu::Batch& batch) { } void ModelMeshPartPayload::bindTransform(gpu::Batch& batch, const ShapePipeline::LocationsPointer locations, RenderArgs::RenderMode renderMode) const { - // Still relying on the raw data from the model if (_clusterBuffer) { batch.setUniformBuffer(ShapePipeline::Slot::BUFFER::SKINNING, _clusterBuffer); } diff --git a/libraries/render-utils/src/ZoneRenderer.cpp b/libraries/render-utils/src/ZoneRenderer.cpp index 3d1fe33267..8494688f92 100644 --- a/libraries/render-utils/src/ZoneRenderer.cpp +++ b/libraries/render-utils/src/ZoneRenderer.cpp @@ -70,7 +70,7 @@ void SetupZones::run(const RenderContextPointer& context, const Inputs& inputs) lightStage->_currentFrame.pushSunLight(0); lightStage->_currentFrame.pushAmbientLight(0); - + hazeStage->_currentFrame.pushHaze(0); backgroundStage->_currentFrame.pushBackground(0); } diff --git a/libraries/render/src/render/ShapePipeline.h b/libraries/render/src/render/ShapePipeline.h index 101c060306..be77e2f95e 100644 --- a/libraries/render/src/render/ShapePipeline.h +++ b/libraries/render/src/render/ShapePipeline.h @@ -237,8 +237,8 @@ public: LIGHTING_MODEL, LIGHT, LIGHT_AMBIENT_BUFFER, + HAZE_MODEL, FADE_PARAMETERS, - HAZE_MODEL }; enum MAP { From 5cf25a20c974333857a764477acb332956d68107 Mon Sep 17 00:00:00 2001 From: Sam Gondelman Date: Thu, 4 Jan 2018 21:21:58 -0800 Subject: [PATCH 3/3] use correct model ptr --- libraries/entities-renderer/src/RenderableModelEntityItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp index 245366cfc1..c756070bc3 100644 --- a/libraries/entities-renderer/src/RenderableModelEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableModelEntityItem.cpp @@ -1080,7 +1080,7 @@ bool ModelEntityRenderer::needsRenderUpdate() const { return true; } - if (!_texturesLoaded && _model->getGeometry() && _model->getGeometry()->areTexturesLoaded()) { + if (!_texturesLoaded && model->getGeometry() && model->getGeometry()->areTexturesLoaded()) { return true; }