From efba6bb5246d56de989f55e827a6bcb96e8cc6ef Mon Sep 17 00:00:00 2001 From: samcake Date: Tue, 27 Feb 2018 09:11:14 -0800 Subject: [PATCH 01/12] Adding a counter for the other parts of the gameloop --- interface/src/ui/Stats.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index 80f57bfe0e..bbc8de5987 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -482,7 +482,7 @@ void Stats::updateStats(bool force) { float dt = (float)itr.value().getMovingAverage() / (float)USECS_PER_MSEC; _gameUpdateStats = QString("/idle/update = %1 ms").arg(dt); - QVector categories = { "devices", "physics", "otherAvatars", "MyAvatar", "misc" }; + QVector categories = { "devices", "physics", "otherAvatars", "MyAvatar", "pickManager", "postUpdateLambdas", "misc" }; for (int32_t j = 0; j < categories.size(); ++j) { QString recordKey = "/idle/update/" + categories[j]; itr = allRecords.find(recordKey); From 00f3682bbee19058d6f39caa2d1390d36694362f Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Tue, 27 Feb 2018 14:09:31 -0800 Subject: [PATCH 02/12] NOT WORKING YET. --- .../render-utils/src/RenderPipelines.cpp | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/libraries/render-utils/src/RenderPipelines.cpp b/libraries/render-utils/src/RenderPipelines.cpp index 3fedae1778..6e3d3c85e7 100644 --- a/libraries/render-utils/src/RenderPipelines.cpp +++ b/libraries/render-utils/src/RenderPipelines.cpp @@ -490,7 +490,7 @@ void initDeferredPipelines(render::ShapePlumber& plumber, const render::ShapePip // Same thing but with Fade on addPipeline( Key::Builder().withMaterial().withSkinned().withDualQuatSkinned().withTranslucent().withFade(), - skinModelFadeVertex, modelTranslucentFadePixel, batchSetter, itemSetter); + skinModelFadeDualQuatVertex, modelTranslucentFadePixel, batchSetter, itemSetter); addPipeline( Key::Builder().withMaterial().withSkinned().withDualQuatSkinned().withTranslucent().withTangents().withFade(), skinModelNormalMapFadeDualQuatVertex, modelTranslucentNormalMapFadePixel, batchSetter, itemSetter); @@ -521,10 +521,15 @@ void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::Ba // Vertex shaders auto modelVertex = model_vert::getShader(); auto modelNormalMapVertex = model_normal_map_vert::getShader(); + auto skinModelVertex = skin_model_vert::getShader(); auto skinModelNormalMapVertex = skin_model_normal_map_vert::getShader(); auto skinModelNormalMapFadeVertex = skin_model_normal_map_fade_vert::getShader(); + auto skinModelDualQuatVertex = skin_model_dq_vert::getShader(); + auto skinModelNormalMapDualQuatVertex = skin_model_normal_map_dq_vert::getShader(); + auto skinModelNormalMapFadeDualQuatVertex = skin_model_normal_map_fade_dq_vert::getShader(); + // Pixel shaders auto modelPixel = forward_model_frag::getShader(); auto modelUnlitPixel = forward_model_unlit_frag::getShader(); @@ -568,6 +573,22 @@ void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::Ba Key::Builder().withMaterial().withSkinned().withTangents().withFade(), skinModelNormalMapFadeVertex, modelNormalMapFadePixel, batchSetter, itemSetter, nullptr, nullptr); + // Dual Quaternion + addPipeline( + Key::Builder().withMaterial().withSkinned(), + skinModelDualQuatVertex, modelPixel, nullptr, nullptr); + addPipeline( + Key::Builder().withMaterial().withSkinned().withTangents(), + skinModelNormalMapDualQuatVertex, modelNormalMapPixel, nullptr, nullptr); + addPipeline( + Key::Builder().withMaterial().withSkinned(), + skinModelDualQuatVertex, modelSpecularMapPixel, nullptr, nullptr); + addPipeline( + Key::Builder().withMaterial().withSkinned().withTangents().withSpecular(), + skinModelNormalMapDualQuatVertex, modelNormalSpecularMapPixel, nullptr, nullptr); + addPipeline( + Key::Builder().withMaterial().withSkinned().withTangents().withFade(), + skinModelNormalMapFadeDualQuatVertex, modelNormalMapFadePixel, batchSetter, itemSetter, nullptr, nullptr); } void addPlumberPipeline(ShapePlumber& plumber, From f52f146db5f70832d4ce6fb8c16beff7bcfc4012 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Tue, 27 Feb 2018 16:28:46 -0800 Subject: [PATCH 03/12] WIP. --- .../render-utils/src/RenderPipelines.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/libraries/render-utils/src/RenderPipelines.cpp b/libraries/render-utils/src/RenderPipelines.cpp index 6e3d3c85e7..6264d82187 100644 --- a/libraries/render-utils/src/RenderPipelines.cpp +++ b/libraries/render-utils/src/RenderPipelines.cpp @@ -515,13 +515,22 @@ void initDeferredPipelines(render::ShapePlumber& plumber, const render::ShapePip addPipeline( Key::Builder().withSkinned().withDepthOnly().withFade(), skinModelShadowFadeVertex, modelShadowFadePixel, batchSetter, itemSetter); + + // Now repeat for dual quaternion + // Depth-only + addPipeline( + Key::Builder().withSkinned().withDepthOnly().withDualQuatSkinned(), + skinModelShadowDualQuatVertex, modelShadowPixel, nullptr, nullptr); + // Same thing but with Fade on + addPipeline( + Key::Builder().withSkinned().withDepthOnly().withFade().withDualQuatSkinned(), + skinModelShadowDualQuatVertex, modelShadowFadePixel, batchSetter, itemSetter); } void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::BatchSetter& batchSetter, const render::ShapePipeline::ItemSetter& itemSetter) { // Vertex shaders auto modelVertex = model_vert::getShader(); auto modelNormalMapVertex = model_normal_map_vert::getShader(); - auto skinModelVertex = skin_model_vert::getShader(); auto skinModelNormalMapVertex = skin_model_normal_map_vert::getShader(); auto skinModelNormalMapFadeVertex = skin_model_normal_map_fade_vert::getShader(); @@ -575,19 +584,19 @@ void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::Ba // Dual Quaternion addPipeline( - Key::Builder().withMaterial().withSkinned(), + Key::Builder().withMaterial().withSkinned().withDualQuatSkinned(), skinModelDualQuatVertex, modelPixel, nullptr, nullptr); addPipeline( - Key::Builder().withMaterial().withSkinned().withTangents(), + Key::Builder().withMaterial().withSkinned().withTangents().withDualQuatSkinned(), skinModelNormalMapDualQuatVertex, modelNormalMapPixel, nullptr, nullptr); addPipeline( Key::Builder().withMaterial().withSkinned(), skinModelDualQuatVertex, modelSpecularMapPixel, nullptr, nullptr); addPipeline( - Key::Builder().withMaterial().withSkinned().withTangents().withSpecular(), + Key::Builder().withMaterial().withSkinned().withTangents().withSpecular().withDualQuatSkinned(), skinModelNormalMapDualQuatVertex, modelNormalSpecularMapPixel, nullptr, nullptr); addPipeline( - Key::Builder().withMaterial().withSkinned().withTangents().withFade(), + Key::Builder().withMaterial().withSkinned().withTangents().withFade().withDualQuatSkinned(), skinModelNormalMapFadeDualQuatVertex, modelNormalMapFadePixel, batchSetter, itemSetter, nullptr, nullptr); } From b8fd640ddf1653c6efb0cb38d7d0a0ef2c17c536 Mon Sep 17 00:00:00 2001 From: Elisa Lupin-Jimenez Date: Tue, 27 Feb 2018 16:44:45 -0800 Subject: [PATCH 04/12] fixed log spam undefined error --- scripts/system/libraries/entitySelectionTool.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 8a07ff0d20..a419e9d49c 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -1322,8 +1322,9 @@ SelectionDisplay = (function() { isActiveTool(handleScaleRTFCube) || isActiveTool(handleStretchXSphere) || isActiveTool(handleStretchYSphere) || isActiveTool(handleStretchZSphere)); - var showOutlineForZone = (SelectionManager.selections.length === 1 && - SelectionManager.savedProperties[SelectionManager.selections[0]].type === "Zone"); + var showOutlineForZone = (SelectionManager.selections.length === 1 && + typeof SelectionManager.savedProperties[SelectionManager.selections[0]] !== "undefined" && + SelectionManager.savedProperties[SelectionManager.selections[0]].type === "Zone"); that.setHandleScaleEdgeVisible(showOutlineForZone || (!isActiveTool(handleRotatePitchRing) && !isActiveTool(handleRotateYawRing) && !isActiveTool(handleRotateRollRing))); From 7cae04883e85a747e6472049515a07b0093cc473 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Tue, 27 Feb 2018 17:19:02 -0800 Subject: [PATCH 05/12] WIP. --- libraries/render-utils/src/RenderPipelines.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libraries/render-utils/src/RenderPipelines.cpp b/libraries/render-utils/src/RenderPipelines.cpp index 6264d82187..6ad86dfd37 100644 --- a/libraries/render-utils/src/RenderPipelines.cpp +++ b/libraries/render-utils/src/RenderPipelines.cpp @@ -718,6 +718,17 @@ void initZPassPipelines(ShapePlumber& shapePlumber, gpu::StatePointer state) { shapePlumber.addPipeline( ShapeKey::Filter::Builder().withSkinned().withFade(), skinFadeProgram, state); + + //Added for dual quaternions + auto skinDualQuatVertex = skin_model_shadow_dq_vert::getShader(); + gpu::ShaderPointer skinFadeDualQuatProgram = gpu::Shader::createProgram(skinFadeVertex, skinFadePixel); + shapePlumber.addPipeline( + ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withFade(), + skinDualQuatVertex, state); + + shapePlumber.addPipeline( + ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withoutFade(), + skinDualQuatVertex, state); } #include "RenderPipelines.h" From 5764a21c4a7da429db29e510501cb528deb0ea03 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 28 Feb 2018 08:12:48 -0800 Subject: [PATCH 06/12] WIP. --- libraries/render-utils/src/RenderPipelines.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/libraries/render-utils/src/RenderPipelines.cpp b/libraries/render-utils/src/RenderPipelines.cpp index 6ad86dfd37..14e1993239 100644 --- a/libraries/render-utils/src/RenderPipelines.cpp +++ b/libraries/render-utils/src/RenderPipelines.cpp @@ -720,15 +720,11 @@ void initZPassPipelines(ShapePlumber& shapePlumber, gpu::StatePointer state) { skinFadeProgram, state); //Added for dual quaternions - auto skinDualQuatVertex = skin_model_shadow_dq_vert::getShader(); - gpu::ShaderPointer skinFadeDualQuatProgram = gpu::Shader::createProgram(skinFadeVertex, skinFadePixel); + auto skinModelDualQuatVertex = skin_model_shadow_dq_vert::getShader(); + gpu::ShaderPointer skinModelDualQuatProgram = gpu::Shader::createProgram(skinModelDualQuatVertex, skinPixel); shapePlumber.addPipeline( - ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withFade(), - skinDualQuatVertex, state); - - shapePlumber.addPipeline( - ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withoutFade(), - skinDualQuatVertex, state); + ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned(), + skinModelDualQuatProgram, state); } #include "RenderPipelines.h" From faad930e352ecb28b5223457cb421a5487b778b8 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 28 Feb 2018 08:44:01 -0800 Subject: [PATCH 07/12] WIP. --- .../render-utils/src/RenderPipelines.cpp | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/libraries/render-utils/src/RenderPipelines.cpp b/libraries/render-utils/src/RenderPipelines.cpp index 14e1993239..1d3bd00940 100644 --- a/libraries/render-utils/src/RenderPipelines.cpp +++ b/libraries/render-utils/src/RenderPipelines.cpp @@ -100,6 +100,7 @@ #include "model_shadow_vert.h" #include "skin_model_shadow_vert.h" #include "skin_model_shadow_dq_vert.h" +#include "skin_model_shadow_fade_dq_vert.h" #include "model_shadow_frag.h" #include "skin_model_shadow_frag.h" @@ -217,6 +218,7 @@ void initDeferredPipelines(render::ShapePlumber& plumber, const render::ShapePip auto skinModelDualQuatVertex = skin_model_dq_vert::getShader(); auto skinModelNormalMapDualQuatVertex = skin_model_normal_map_dq_vert::getShader(); auto skinModelShadowDualQuatVertex = skin_model_shadow_dq_vert::getShader(); + auto skinModelShadowFadeDualQuatVertex = skin_model_shadow_fade_dq_vert::getShader(); auto skinModelFadeDualQuatVertex = skin_model_fade_dq_vert::getShader(); auto skinModelNormalMapFadeDualQuatVertex = skin_model_normal_map_fade_dq_vert::getShader(); auto skinModelTranslucentDualQuatVertex = skinModelFadeDualQuatVertex; // We use the same because it ouputs world position per vertex @@ -519,12 +521,12 @@ void initDeferredPipelines(render::ShapePlumber& plumber, const render::ShapePip // Now repeat for dual quaternion // Depth-only addPipeline( - Key::Builder().withSkinned().withDepthOnly().withDualQuatSkinned(), + Key::Builder().withSkinned().withDualQuatSkinned().withDepthOnly(), skinModelShadowDualQuatVertex, modelShadowPixel, nullptr, nullptr); // Same thing but with Fade on addPipeline( - Key::Builder().withSkinned().withDepthOnly().withFade().withDualQuatSkinned(), - skinModelShadowDualQuatVertex, modelShadowFadePixel, batchSetter, itemSetter); + Key::Builder().withSkinned().withDualQuatSkinned().withDepthOnly().withFade(), + skinModelShadowFadeDualQuatVertex, modelShadowFadePixel, batchSetter, itemSetter); } void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::BatchSetter& batchSetter, const render::ShapePipeline::ItemSetter& itemSetter) { @@ -720,11 +722,17 @@ void initZPassPipelines(ShapePlumber& shapePlumber, gpu::StatePointer state) { skinFadeProgram, state); //Added for dual quaternions - auto skinModelDualQuatVertex = skin_model_shadow_dq_vert::getShader(); - gpu::ShaderPointer skinModelDualQuatProgram = gpu::Shader::createProgram(skinModelDualQuatVertex, skinPixel); + auto skinModelShadowDualQuatVertex = skin_model_shadow_dq_vert::getShader(); + gpu::ShaderPointer skinModelDualQuatProgram = gpu::Shader::createProgram(skinModelShadowDualQuatVertex, skinPixel); shapePlumber.addPipeline( - ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned(), + ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withoutFade(), skinModelDualQuatProgram, state); + + auto skinModelShadowFadeDualQuatVertex = skin_model_shadow_fade_dq_vert::getShader(); + gpu::ShaderPointer skinModelShadowDualQuatProgram = gpu::Shader::createProgram(skinModelShadowFadeDualQuatVertex, skinPixel); + shapePlumber.addPipeline( + ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withFade(), + skinModelShadowDualQuatProgram, state); } #include "RenderPipelines.h" From 9e5ed7b905bc95d5e8a17686e6f9cfea31cf3117 Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 28 Feb 2018 10:48:35 -0800 Subject: [PATCH 08/12] Add more timing stats in explanded mode --- interface/resources/qml/Stats.qml | 6 +++++- interface/src/ui/Stats.cpp | 29 +++++++++++++++++++++++++++++ interface/src/ui/Stats.h | 2 ++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index 4626d9bcda..a12bd4b2c0 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -257,7 +257,11 @@ Item { id: octreeCol spacing: 4; x: 4; y: 4; StatText { - text: "Engine: " + root.engineFrameTime.toFixed(1) + " ms" + text: "Render Engine: " + root.engineFrameTime.toFixed(1) + " ms" + } + StatText { + visible: root.expanded + text: root.renderEngineStats } StatText { text: "Batch: " + root.batchFrameTime.toFixed(1) + " ms" diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index bbc8de5987..ff42ed09e7 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -502,10 +502,39 @@ void Stats::updateStats(bool force) { _gameUpdateStats = ""; emit gameUpdateStatsChanged(); } + + itr = allRecords.find("/paintGL/display/EngineRun/Engine"); + std::priority_queue renderEngineStats; + if (itr != allRecords.end()) { + float dt = (float)itr.value().getMovingAverage() / (float)USECS_PER_MSEC; + _renderEngineStats = QString("/render = %1 ms").arg(dt); + + QVector categories = { "RenderMainView", "SecondaryCameraJob", "UpdateScene"}; + for (int32_t j = 0; j < categories.size(); ++j) { + QString recordKey = "/paintGL/display/EngineRun/Engine/" + categories[j]; + itr = allRecords.find(recordKey); + if (itr != allRecords.end()) { + float dt = (float)itr.value().getMovingAverage() / (float)USECS_PER_MSEC; + QString message = QString("\n %1 = %2").arg(categories[j]).arg(dt); + renderEngineStats.push(SortableStat(message, dt)); + } + } + while (!renderEngineStats.empty()) { + SortableStat stat = renderEngineStats.top(); + _renderEngineStats += stat.message; + renderEngineStats.pop(); + } + emit renderEngineStatsChanged(); + } else if (_renderEngineStats != "") { + _renderEngineStats = ""; + emit renderEngineStatsChanged(); + } } else if (_showGameUpdateStats) { _showGameUpdateStats = false; _gameUpdateStats = ""; + _renderEngineStats = ""; emit gameUpdateStatsChanged(); + emit renderEngineStatsChanged(); } } diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index af3189f20b..e5fc0beaf6 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -106,6 +106,7 @@ class Stats : public QQuickItem { STATS_PROPERTY(QString, lodStatus, QString()) STATS_PROPERTY(QString, timingStats, QString()) STATS_PROPERTY(QString, gameUpdateStats, QString()) + STATS_PROPERTY(QString, renderEngineStats, QString()) STATS_PROPERTY(int, serverElements, 0) STATS_PROPERTY(int, serverInternal, 0) STATS_PROPERTY(int, serverLeaves, 0) @@ -239,6 +240,7 @@ signals: void localLeavesChanged(); void timingStatsChanged(); void gameUpdateStatsChanged(); + void renderEngineStatsChanged(); void glContextSwapchainMemoryChanged(); void qmlTextureMemoryChanged(); void texturePendingTransfersChanged(); From 5d7e6651a761b0f96db5b9f81cb8f9cc437a3596 Mon Sep 17 00:00:00 2001 From: NissimHadar Date: Wed, 28 Feb 2018 11:05:02 -0800 Subject: [PATCH 09/12] Use correct pixel shader. --- libraries/render-utils/src/RenderPipelines.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/render-utils/src/RenderPipelines.cpp b/libraries/render-utils/src/RenderPipelines.cpp index 1d3bd00940..2ae59ec59e 100644 --- a/libraries/render-utils/src/RenderPipelines.cpp +++ b/libraries/render-utils/src/RenderPipelines.cpp @@ -723,16 +723,16 @@ void initZPassPipelines(ShapePlumber& shapePlumber, gpu::StatePointer state) { //Added for dual quaternions auto skinModelShadowDualQuatVertex = skin_model_shadow_dq_vert::getShader(); - gpu::ShaderPointer skinModelDualQuatProgram = gpu::Shader::createProgram(skinModelShadowDualQuatVertex, skinPixel); + gpu::ShaderPointer skinModelShadowDualQuatProgram = gpu::Shader::createProgram(skinModelShadowDualQuatVertex, skinPixel); shapePlumber.addPipeline( ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withoutFade(), - skinModelDualQuatProgram, state); + skinModelShadowDualQuatProgram, state); auto skinModelShadowFadeDualQuatVertex = skin_model_shadow_fade_dq_vert::getShader(); - gpu::ShaderPointer skinModelShadowDualQuatProgram = gpu::Shader::createProgram(skinModelShadowFadeDualQuatVertex, skinPixel); + gpu::ShaderPointer skinModelShadowFadeDualQuatProgram = gpu::Shader::createProgram(skinModelShadowFadeDualQuatVertex, skinFadePixel); shapePlumber.addPipeline( ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withFade(), - skinModelShadowDualQuatProgram, state); + skinModelShadowFadeDualQuatProgram, state); } #include "RenderPipelines.h" From a7542d5b9084954d8ee5556e68962ce74fb0173e Mon Sep 17 00:00:00 2001 From: samcake Date: Wed, 28 Feb 2018 17:46:22 -0800 Subject: [PATCH 10/12] fixing the shadow --- libraries/render-utils/src/RenderPipelines.cpp | 17 +++++++++++++++-- libraries/render-utils/src/RenderShadowTask.cpp | 15 ++++++++++++++- .../src/skin_model_normal_map_fade_dq.slv | 2 ++ libraries/render/src/render/ShapePipeline.h | 6 ++++-- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/libraries/render-utils/src/RenderPipelines.cpp b/libraries/render-utils/src/RenderPipelines.cpp index 3fedae1778..1c2535e0aa 100644 --- a/libraries/render-utils/src/RenderPipelines.cpp +++ b/libraries/render-utils/src/RenderPipelines.cpp @@ -672,7 +672,7 @@ void initZPassPipelines(ShapePlumber& shapePlumber, gpu::StatePointer state) { auto skinPixel = skin_model_shadow_frag::getShader(); gpu::ShaderPointer skinProgram = gpu::Shader::createProgram(skinVertex, skinPixel); shapePlumber.addPipeline( - ShapeKey::Filter::Builder().withSkinned().withoutFade(), + ShapeKey::Filter::Builder().withSkinned().withoutDualQuatSkinned().withoutFade(), skinProgram, state); auto modelFadeVertex = model_shadow_fade_vert::getShader(); @@ -686,8 +686,21 @@ void initZPassPipelines(ShapePlumber& shapePlumber, gpu::StatePointer state) { auto skinFadePixel = skin_model_shadow_fade_frag::getShader(); gpu::ShaderPointer skinFadeProgram = gpu::Shader::createProgram(skinFadeVertex, skinFadePixel); shapePlumber.addPipeline( - ShapeKey::Filter::Builder().withSkinned().withFade(), + ShapeKey::Filter::Builder().withSkinned().withoutDualQuatSkinned().withFade(), skinFadeProgram, state); + + //Added for dual quaternions + auto skinModelShadowDualQuatVertex = skin_model_shadow_dq_vert::getShader(); + gpu::ShaderPointer skinModelShadowDualQuatProgram = gpu::Shader::createProgram(skinModelShadowDualQuatVertex, skinPixel); + shapePlumber.addPipeline( + ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withoutFade(), + skinModelShadowDualQuatProgram, state); +/* + auto skinModelShadowFadeDualQuatVertex = skin_model_shadow_fade_dq_vert::getShader(); + gpu::ShaderPointer skinModelShadowFadeDualQuatProgram = gpu::Shader::createProgram(skinModelShadowFadeDualQuatVertex, skinFadePixel); + shapePlumber.addPipeline( + ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withFade(), + skinModelShadowFadeDualQuatProgram, state);*/ } #include "RenderPipelines.h" diff --git a/libraries/render-utils/src/RenderShadowTask.cpp b/libraries/render-utils/src/RenderShadowTask.cpp index e8963c2e4e..b5a329cc91 100644 --- a/libraries/render-utils/src/RenderShadowTask.cpp +++ b/libraries/render-utils/src/RenderShadowTask.cpp @@ -163,8 +163,10 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, con auto shadowPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder); auto shadowSkinnedPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder.withSkinned()); + auto shadowSkinnedDQPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder.withSkinned().withDualQuatSkinned()); std::vector skinnedShapeKeys{}; + std::vector skinnedDQShapeKeys{}; std::vector ownPipelineShapeKeys{}; // Iterate through all inShapes and render the unskinned @@ -172,7 +174,11 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, con batch.setPipeline(shadowPipeline->pipeline); for (auto items : inShapes) { if (items.first.isSkinned()) { - skinnedShapeKeys.push_back(items.first); + if (items.first.isDualQuatSkinned()) { + skinnedDQShapeKeys.push_back(items.first); + } else { + skinnedShapeKeys.push_back(items.first); + } } else if (!items.first.hasOwnPipeline()) { renderItems(renderContext, items.second); } else { @@ -187,6 +193,13 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, con renderItems(renderContext, inShapes.at(key)); } + // Reiterate to render the DQ skinned + args->_shapePipeline = shadowSkinnedDQPipeline; + batch.setPipeline(shadowSkinnedDQPipeline->pipeline); + for (const auto& key : skinnedDQShapeKeys) { + renderItems(renderContext, inShapes.at(key)); + } + // Finally render the items with their own pipeline last to prevent them from breaking the // render state. This is probably a temporary code as there is probably something better // to do in the render call of objects that have their own pipeline. diff --git a/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv b/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv index 02b3742f6f..d6e07575b1 100644 --- a/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv +++ b/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv @@ -30,6 +30,7 @@ out vec3 _normal; out vec3 _tangent; out vec3 _color; out float _alpha; +out vec4 _worldPosition; void main(void) { vec4 position = vec4(0.0, 0.0, 0.0, 0.0); @@ -53,6 +54,7 @@ void main(void) { TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); <$transformModelToEyeAndClipPos(cam, obj, position, _position, gl_Position)$> + <$transformModelToWorldPos(obj, position, _worldPosition)$> <$transformModelToWorldDir(cam, obj, interpolatedNormal.xyz, interpolatedNormal.xyz)$> <$transformModelToWorldDir(cam, obj, interpolatedTangent.xyz, interpolatedTangent.xyz)$> diff --git a/libraries/render/src/render/ShapePipeline.h b/libraries/render/src/render/ShapePipeline.h index f175bab99a..e0e675ce83 100644 --- a/libraries/render/src/render/ShapePipeline.h +++ b/libraries/render/src/render/ShapePipeline.h @@ -135,8 +135,8 @@ public: Builder& withSkinned() { _flags.set(SKINNED); _mask.set(SKINNED); return (*this); } Builder& withoutSkinned() { _flags.reset(SKINNED); _mask.set(SKINNED); return (*this); } - Builder& withDualQuatSkinned() { _flags.set(DUAL_QUAT_SKINNED); _mask.set(SKINNED); return (*this); } - Builder& withoutDualQuatSkinned() { _flags.reset(DUAL_QUAT_SKINNED); _mask.set(SKINNED); return (*this); } + Builder& withDualQuatSkinned() { _flags.set(DUAL_QUAT_SKINNED); _mask.set(DUAL_QUAT_SKINNED); return (*this); } + Builder& withoutDualQuatSkinned() { _flags.reset(DUAL_QUAT_SKINNED); _mask.set(DUAL_QUAT_SKINNED); return (*this); } Builder& withDepthOnly() { _flags.set(DEPTH_ONLY); _mask.set(DEPTH_ONLY); return (*this); } Builder& withoutDepthOnly() { _flags.reset(DEPTH_ONLY); _mask.set(DEPTH_ONLY); return (*this); } @@ -176,6 +176,7 @@ public: bool isUnlit() const { return _flags[UNLIT]; } bool isTranslucent() const { return _flags[TRANSLUCENT]; } bool isSkinned() const { return _flags[SKINNED]; } + bool isDualQuatSkinned() const { return _flags[DUAL_QUAT_SKINNED]; } bool isDepthOnly() const { return _flags[DEPTH_ONLY]; } bool isDepthBiased() const { return _flags[DEPTH_BIAS]; } bool isWireframe() const { return _flags[WIREFRAME]; } @@ -216,6 +217,7 @@ inline QDebug operator<<(QDebug debug, const ShapeKey& key) { << "isUnlit:" << key.isUnlit() << "isTranslucent:" << key.isTranslucent() << "isSkinned:" << key.isSkinned() + << "isDualQuatSkinned:" << key.isDualQuatSkinned() << "isDepthOnly:" << key.isDepthOnly() << "isDepthBiased:" << key.isDepthBiased() << "isWireframe:" << key.isWireframe() From 9f9214e808df300810b2eb7b610262caa137656e Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 1 Mar 2018 09:33:48 -0800 Subject: [PATCH 11/12] getting back the RC65 version for a few files --- interface/resources/qml/Stats.qml | 6 +--- interface/src/ui/Stats.cpp | 31 +------------------ interface/src/ui/Stats.h | 2 -- .../system/libraries/entitySelectionTool.js | 5 ++- 4 files changed, 4 insertions(+), 40 deletions(-) diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index a12bd4b2c0..4626d9bcda 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -257,11 +257,7 @@ Item { id: octreeCol spacing: 4; x: 4; y: 4; StatText { - text: "Render Engine: " + root.engineFrameTime.toFixed(1) + " ms" - } - StatText { - visible: root.expanded - text: root.renderEngineStats + text: "Engine: " + root.engineFrameTime.toFixed(1) + " ms" } StatText { text: "Batch: " + root.batchFrameTime.toFixed(1) + " ms" diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index ff42ed09e7..80f57bfe0e 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -482,7 +482,7 @@ void Stats::updateStats(bool force) { float dt = (float)itr.value().getMovingAverage() / (float)USECS_PER_MSEC; _gameUpdateStats = QString("/idle/update = %1 ms").arg(dt); - QVector categories = { "devices", "physics", "otherAvatars", "MyAvatar", "pickManager", "postUpdateLambdas", "misc" }; + QVector categories = { "devices", "physics", "otherAvatars", "MyAvatar", "misc" }; for (int32_t j = 0; j < categories.size(); ++j) { QString recordKey = "/idle/update/" + categories[j]; itr = allRecords.find(recordKey); @@ -502,39 +502,10 @@ void Stats::updateStats(bool force) { _gameUpdateStats = ""; emit gameUpdateStatsChanged(); } - - itr = allRecords.find("/paintGL/display/EngineRun/Engine"); - std::priority_queue renderEngineStats; - if (itr != allRecords.end()) { - float dt = (float)itr.value().getMovingAverage() / (float)USECS_PER_MSEC; - _renderEngineStats = QString("/render = %1 ms").arg(dt); - - QVector categories = { "RenderMainView", "SecondaryCameraJob", "UpdateScene"}; - for (int32_t j = 0; j < categories.size(); ++j) { - QString recordKey = "/paintGL/display/EngineRun/Engine/" + categories[j]; - itr = allRecords.find(recordKey); - if (itr != allRecords.end()) { - float dt = (float)itr.value().getMovingAverage() / (float)USECS_PER_MSEC; - QString message = QString("\n %1 = %2").arg(categories[j]).arg(dt); - renderEngineStats.push(SortableStat(message, dt)); - } - } - while (!renderEngineStats.empty()) { - SortableStat stat = renderEngineStats.top(); - _renderEngineStats += stat.message; - renderEngineStats.pop(); - } - emit renderEngineStatsChanged(); - } else if (_renderEngineStats != "") { - _renderEngineStats = ""; - emit renderEngineStatsChanged(); - } } else if (_showGameUpdateStats) { _showGameUpdateStats = false; _gameUpdateStats = ""; - _renderEngineStats = ""; emit gameUpdateStatsChanged(); - emit renderEngineStatsChanged(); } } diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index e5fc0beaf6..af3189f20b 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -106,7 +106,6 @@ class Stats : public QQuickItem { STATS_PROPERTY(QString, lodStatus, QString()) STATS_PROPERTY(QString, timingStats, QString()) STATS_PROPERTY(QString, gameUpdateStats, QString()) - STATS_PROPERTY(QString, renderEngineStats, QString()) STATS_PROPERTY(int, serverElements, 0) STATS_PROPERTY(int, serverInternal, 0) STATS_PROPERTY(int, serverLeaves, 0) @@ -240,7 +239,6 @@ signals: void localLeavesChanged(); void timingStatsChanged(); void gameUpdateStatsChanged(); - void renderEngineStatsChanged(); void glContextSwapchainMemoryChanged(); void qmlTextureMemoryChanged(); void texturePendingTransfersChanged(); diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index a419e9d49c..8a07ff0d20 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -1322,9 +1322,8 @@ SelectionDisplay = (function() { isActiveTool(handleScaleRTFCube) || isActiveTool(handleStretchXSphere) || isActiveTool(handleStretchYSphere) || isActiveTool(handleStretchZSphere)); - var showOutlineForZone = (SelectionManager.selections.length === 1 && - typeof SelectionManager.savedProperties[SelectionManager.selections[0]] !== "undefined" && - SelectionManager.savedProperties[SelectionManager.selections[0]].type === "Zone"); + var showOutlineForZone = (SelectionManager.selections.length === 1 && + SelectionManager.savedProperties[SelectionManager.selections[0]].type === "Zone"); that.setHandleScaleEdgeVisible(showOutlineForZone || (!isActiveTool(handleRotatePitchRing) && !isActiveTool(handleRotateYawRing) && !isActiveTool(handleRotateRollRing))); From 5440f62860ae8ca02943e1f9d27f5b80f99b6963 Mon Sep 17 00:00:00 2001 From: samcake Date: Thu, 1 Mar 2018 10:46:47 -0800 Subject: [PATCH 12/12] fixing a bad key /pipeline pair --- libraries/render-utils/src/RenderPipelines.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/render-utils/src/RenderPipelines.cpp b/libraries/render-utils/src/RenderPipelines.cpp index b3a1d40257..84a144e6db 100644 --- a/libraries/render-utils/src/RenderPipelines.cpp +++ b/libraries/render-utils/src/RenderPipelines.cpp @@ -592,8 +592,8 @@ void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::Ba Key::Builder().withMaterial().withSkinned().withTangents().withDualQuatSkinned(), skinModelNormalMapDualQuatVertex, modelNormalMapPixel, nullptr, nullptr); addPipeline( - Key::Builder().withMaterial().withSkinned(), - skinModelDualQuatVertex, modelSpecularMapPixel, nullptr, nullptr); + Key::Builder().withMaterial().withSkinned().withSpecular().withDualQuatSkinned(), + skinModelDualQuatVertex, modelSpecularMapPixel, nullptr, nullptr); addPipeline( Key::Builder().withMaterial().withSkinned().withTangents().withSpecular().withDualQuatSkinned(), skinModelNormalMapDualQuatVertex, modelNormalSpecularMapPixel, nullptr, nullptr);