From 3316be4deabd44aeafd6eca94c10bd27623591df Mon Sep 17 00:00:00 2001 From: Olivier Prat Date: Tue, 18 Jul 2017 17:01:17 +0200 Subject: [PATCH] Working fade parameters through instanced draw calls --- .../src/RenderableShapeEntityItem.cpp | 2 +- libraries/gpu/src/gpu/Inputs.slh | 3 +++ libraries/render-utils/src/Fade.slh | 10 +++------- libraries/render-utils/src/GeometryCache.cpp | 6 +++--- libraries/render-utils/src/MeshPartPayload.cpp | 18 ------------------ libraries/render/src/render/Args.h | 3 ++- libraries/render/src/render/DrawTask.cpp | 14 ++++++++++---- 7 files changed, 22 insertions(+), 34 deletions(-) diff --git a/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp b/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp index 4424d3aa17..0ccbb387f7 100644 --- a/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp +++ b/libraries/entities-renderer/src/RenderableShapeEntityItem.cpp @@ -157,7 +157,7 @@ void RenderableShapeEntityItem::render(RenderArgs* args) { } else { // FIXME, support instanced multi-shape rendering using multidraw indirect auto geometryCache = DependencyManager::get(); - auto shapeKey = render::ShapeKey(args->_globalShapeKey); + auto shapeKey = render::ShapeKey(args->_itemShapeKey); assert(args->_shapePipeline != nullptr); diff --git a/libraries/gpu/src/gpu/Inputs.slh b/libraries/gpu/src/gpu/Inputs.slh index 843d1059f2..109762136e 100644 --- a/libraries/gpu/src/gpu/Inputs.slh +++ b/libraries/gpu/src/gpu/Inputs.slh @@ -18,4 +18,7 @@ layout(location = 4) in vec4 inTangent; layout(location = 5) in ivec4 inSkinClusterIndex; layout(location = 6) in vec4 inSkinClusterWeight; layout(location = 7) in vec4 inTexCoord1; +layout(location = 8) in vec4 inTexCoord2; +layout(location = 9) in vec4 inTexCoord3; +layout(location = 10) in vec4 inTexCoord4; <@endif@> diff --git a/libraries/render-utils/src/Fade.slh b/libraries/render-utils/src/Fade.slh index 6b801d0746..e4c2407448 100644 --- a/libraries/render-utils/src/Fade.slh +++ b/libraries/render-utils/src/Fade.slh @@ -155,19 +155,15 @@ in vec4 _fadeData3; <@endfunc@> <@func declareFadeVertexInstanced()@> -in vec4 _texCoord2; -in vec4 _texCoord3; -in vec4 _texCoord4; - out vec4 _fadeData1; out vec4 _fadeData2; out vec4 _fadeData3; <@endfunc@> <@func passThroughFadeObjectParams()@> - _fadeData1 = _texCoord2; - _fadeData2 = _texCoord3; - _fadeData3 = _texCoord4; + _fadeData1 = inTexCoord2; + _fadeData2 = inTexCoord3; + _fadeData3 = inTexCoord4; <@endfunc@> <@endif@> \ No newline at end of file diff --git a/libraries/render-utils/src/GeometryCache.cpp b/libraries/render-utils/src/GeometryCache.cpp index 7a68baa978..34557e7b75 100644 --- a/libraries/render-utils/src/GeometryCache.cpp +++ b/libraries/render-utils/src/GeometryCache.cpp @@ -60,7 +60,7 @@ static const int VERTICES_PER_TRIANGLE = 3; static const gpu::Element POSITION_ELEMENT { gpu::VEC3, gpu::FLOAT, gpu::XYZ }; static const gpu::Element NORMAL_ELEMENT { gpu::VEC3, gpu::FLOAT, gpu::XYZ }; static const gpu::Element COLOR_ELEMENT { gpu::VEC4, gpu::NUINT8, gpu::RGBA }; -static const gpu::Element TEXCOORD4_ELEMENT { gpu::VEC4, gpu::HALF, gpu::XYZW }; +static const gpu::Element TEXCOORD4_ELEMENT { gpu::VEC4, gpu::FLOAT, gpu::XYZW }; static gpu::Stream::FormatPointer SOLID_STREAM_FORMAT; static gpu::Stream::FormatPointer INSTANCED_SOLID_STREAM_FORMAT; @@ -620,7 +620,7 @@ void GeometryCache::renderWireShapeInstances(gpu::Batch& batch, Shape shape, siz } void setupBatchFadeInstance(gpu::Batch& batch, gpu::BufferPointer colorBuffer, - gpu::BufferPointer& fadeBuffer1, gpu::BufferPointer& fadeBuffer2, gpu::BufferPointer& fadeBuffer3) { + gpu::BufferPointer fadeBuffer1, gpu::BufferPointer fadeBuffer2, gpu::BufferPointer fadeBuffer3) { gpu::BufferView colorView(colorBuffer, COLOR_ELEMENT); gpu::BufferView texCoord2View(fadeBuffer1, TEXCOORD4_ELEMENT); gpu::BufferView texCoord3View(fadeBuffer2, TEXCOORD4_ELEMENT); @@ -2102,7 +2102,7 @@ void renderFadeInstances(RenderArgs* args, gpu::Batch& batch, const glm::vec4& c const glm::vec3& fadeNoiseOffset, const glm::vec3& fadeBaseOffset, const glm::vec3& fadeBaseInvSize, bool isWire, const render::ShapePipelinePointer& pipeline, GeometryCache::Shape shape) { // Add pipeline to name - std::string instanceName = (isWire ? "wire_fade_shapes_" : "solid_fade_shapes_") + std::to_string(shape) + "_" + std::to_string(std::hash()(pipeline)); + std::string instanceName = (isWire ? "wire_shapes_" : "solid_shapes_") + std::to_string(shape) + "_" + std::to_string(std::hash()(pipeline)); // Add color to named buffer { diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index b837702582..517fe97dba 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -532,13 +532,6 @@ void ModelMeshPartPayload::render(RenderArgs* args) { if (_state == WAITING_TO_START) { if (model->isLoaded()) { - /* // FIXME as far as I can tell this is the ONLY reason render-util depends on entities. - if (EntityItem::getEntitiesShouldFadeFunction()()) { - _fadeStartTime = usecTimestampNow(); - _fadeState = STATE_IN_PROGRESS; - } else { - _fadeState = STATE_COMPLETE; - }*/ _state = STARTED; model->setRenderItemsNeedUpdate(); } else { @@ -570,17 +563,6 @@ void ModelMeshPartPayload::render(RenderArgs* args) { // apply material properties bindMaterial(batch, locations, args->_enableTexturing); - /* if (args->_enableFade) { - // Apply fade effect - if (!FadeRenderJob::bindPerItem(batch, args, _transform.getTranslation(), _fadeStartTime)) { - _fadeState = STATE_COMPLETE; - } - }*/ - /* else { - // TODO : very ugly way to update the fade state. Need to improve this with global fade manager. - _fadeState = STATE_COMPLETE; - }*/ - args->_details._materialSwitches++; // Draw! diff --git a/libraries/render/src/render/Args.h b/libraries/render/src/render/Args.h index 4810437518..1e4b626b89 100644 --- a/libraries/render/src/render/Args.h +++ b/libraries/render/src/render/Args.h @@ -115,7 +115,8 @@ namespace render { DebugFlags _debugFlags { RENDER_DEBUG_NONE }; gpu::Batch* _batch = nullptr; - uint32_t _globalShapeKey { 0 }; + uint32_t _globalShapeKey{ 0 }; + uint32_t _itemShapeKey{ 0 }; bool _enableTexturing { true }; bool _enableFade{ false }; diff --git a/libraries/render/src/render/DrawTask.cpp b/libraries/render/src/render/DrawTask.cpp index a3175ffdec..8372231597 100755 --- a/libraries/render/src/render/DrawTask.cpp +++ b/libraries/render/src/render/DrawTask.cpp @@ -42,6 +42,7 @@ void render::renderItems(const RenderContextPointer& renderContext, const ItemBo void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, const Item& item, const ShapeKey& globalKey) { assert(item.getKey().isShape()); auto key = item.getShapeKey() | globalKey; + args->_itemShapeKey = key._flags.to_ulong(); if (key.isValid() && !key.hasOwnPipeline()) { args->_shapePipeline = shapeContext->pickPipeline(args, key); if (args->_shapePipeline) { @@ -54,6 +55,7 @@ void renderShape(RenderArgs* args, const ShapePlumberPointer& shapeContext, cons } else { qCDebug(renderlogging) << "Item could not be rendered with invalid key" << key; } + args->_itemShapeKey = 0; } void render::renderShapes(const RenderContextPointer& renderContext, @@ -85,10 +87,10 @@ void render::renderStateSortShapes(const RenderContextPointer& renderContext, using SortedShapes = std::unordered_map, render::ShapeKey::Hash, render::ShapeKey::KeyEqual>; SortedPipelines sortedPipelines; SortedShapes sortedShapes; - std::vector ownPipelineBucket; + std::vector< std::tuple > ownPipelineBucket; for (auto i = 0; i < numItemsToDraw; ++i) { - auto item = scene->getItem(inItems[i].id); + auto& item = scene->getItem(inItems[i].id); { assert(item.getKey().isShape()); @@ -100,7 +102,7 @@ void render::renderStateSortShapes(const RenderContextPointer& renderContext, } bucket.push_back(item); } else if (key.hasOwnPipeline()) { - ownPipelineBucket.push_back(item); + ownPipelineBucket.push_back( std::make_tuple(item, key) ); } else { qCDebug(renderlogging) << "Item could not be rendered with invalid key" << key; } @@ -114,15 +116,19 @@ void render::renderStateSortShapes(const RenderContextPointer& renderContext, if (!args->_shapePipeline) { continue; } + args->_itemShapeKey = pipelineKey._flags.to_ulong(); for (auto& item : bucket) { args->_shapePipeline->prepareShapeItem(args, pipelineKey, item); item.render(args); } } args->_shapePipeline = nullptr; - for (auto& item : ownPipelineBucket) { + for (auto& itemAndKey : ownPipelineBucket) { + auto& item = std::get<0>(itemAndKey); + args->_itemShapeKey = std::get<1>(itemAndKey)._flags.to_ulong(); item.render(args); } + args->_itemShapeKey = 0; } void DrawLight::run(const RenderContextPointer& renderContext, const ItemBounds& inLights) {