Showing the changes to libraries/render-utils/src/HighlightEffect.cpp (1 of 43 files). Show all
Unified · Split
| @@ -37,6 +37,8 @@ namespace gr { · 36 unmodified lines | |||
| 37 | 37 | ||
| 38 | #define OUTLINE_STENCIL_MASK 1 | 38 | #define OUTLINE_STENCIL_MASK 1 |
| 39 | 39 | ||
| 40 | extern void initZPassPipelines(ShapePlumber& plumber, gpu::StatePointer state); | ||
| 41 | |||
| 40 | HighlightRessources::HighlightRessources() { | 42 | HighlightRessources::HighlightRessources() { |
| 41 | } | 43 | } |
| 42 | 44 | ||
| @@ -180,6 +182,7 @@ void DrawHighlightMask::run(const render::RenderContextPointer& renderContext, c · 137 unmodified lines | |||
| 180 | 182 | ||
| 181 | auto maskPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder); | 183 | auto maskPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder); |
| 182 | auto maskSkinnedPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder.withSkinned()); | 184 | auto maskSkinnedPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder.withSkinned()); |
| 185 | auto maskSkinnedDQPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder.withSkinned().withDualQuatSkinned()); | ||
| 183 | 186 | ||
| 184 | // Setup camera, projection and viewport for all items | 187 | // Setup camera, projection and viewport for all items |
| 185 | batch.setViewportTransform(args->_viewport); | 188 | batch.setViewportTransform(args->_viewport); |
| @@ -187,14 +190,17 @@ void DrawHighlightMask::run(const render::RenderContextPointer& renderContext, c · 1 unmodified line | |||
| 187 | batch.setProjectionJitter(jitter.x, jitter.y); | 190 | batch.setProjectionJitter(jitter.x, jitter.y); |
| 188 | batch.setViewTransform(viewMat); | 191 | batch.setViewTransform(viewMat); |
| 189 | 192 | ||
| 190 | std::vector<ShapeKey> skinnedShapeKeys{}; | 193 | std::vector<ShapeKey> skinnedShapeKeys; |
| 194 | std::vector<ShapeKey> skinnedDQShapeKeys; | ||
| 191 | 195 | ||
| 192 | // Iterate through all inShapes and render the unskinned | 196 | // Iterate through all inShapes and render the unskinned |
| 193 | args->_shapePipeline = maskPipeline; | 197 | args->_shapePipeline = maskPipeline; |
| 194 | batch.setPipeline(maskPipeline->pipeline); | 198 | batch.setPipeline(maskPipeline->pipeline); |
| 195 | for (const auto& items : inShapes) { | 199 | for (const auto& items : inShapes) { |
| 196 | itemBounds.insert(itemBounds.end(), items.second.begin(), items.second.end()); | 200 | itemBounds.insert(itemBounds.end(), items.second.begin(), items.second.end()); |
| 197 | if (items.first.isSkinned()) { | 201 | if (items.first.isSkinned() && items.first.isDualQuatSkinned()) { |
| 202 | skinnedDQShapeKeys.push_back(items.first); | ||
| 203 | } else if (items.first.isSkinned()) { | ||
| 198 | skinnedShapeKeys.push_back(items.first); | 204 | skinnedShapeKeys.push_back(items.first); |
| 199 | } else { | 205 | } else { |
| 200 | renderItems(renderContext, items.second); | 206 | renderItems(renderContext, items.second); |
| @@ -202,10 +208,21 @@ void DrawHighlightMask::run(const render::RenderContextPointer& renderContext, c · 1 unmodified line | |||
| 202 | } | 208 | } |
| 203 | 209 | ||
| 204 | // Reiterate to render the skinned | 210 | // Reiterate to render the skinned |
| 205 | args->_shapePipeline = maskSkinnedPipeline; | 211 | if (skinnedShapeKeys.size() > 0) { |
| 206 | batch.setPipeline(maskSkinnedPipeline->pipeline); | 212 | args->_shapePipeline = maskSkinnedPipeline; |
| 207 | for (const auto& key : skinnedShapeKeys) { | 213 | batch.setPipeline(maskSkinnedPipeline->pipeline); |
| 208 | renderItems(renderContext, inShapes.at(key)); | 214 | for (const auto& key : skinnedShapeKeys) { |
| 215 | renderItems(renderContext, inShapes.at(key)); | ||
| 216 | } | ||
| 217 | } | ||
| 218 | |||
| 219 | // Reiterate to render the DQ skinned | ||
| 220 | if (skinnedDQShapeKeys.size() > 0) { | ||
| 221 | args->_shapePipeline = maskSkinnedDQPipeline; | ||
| 222 | batch.setPipeline(maskSkinnedDQPipeline->pipeline); | ||
| 223 | for (const auto& key : skinnedDQShapeKeys) { | ||
| 224 | renderItems(renderContext, inShapes.at(key)); | ||
| 225 | } | ||
| 209 | } | 226 | } |
| 210 | 227 | ||
| 211 | args->_shapePipeline = nullptr; | 228 | args->_shapePipeline = nullptr; |
| @@ -488,7 +505,7 @@ void DrawHighlightTask::build(JobModel& task, const render::Varying& inputs, ren · 276 unmodified lines | |||
| 488 | state->setDepthTest(true, true, gpu::LESS_EQUAL); | 505 | state->setDepthTest(true, true, gpu::LESS_EQUAL); |
| 489 | state->setColorWriteMask(false, false, false, false); | 506 | state->setColorWriteMask(false, false, false, false); |
| 490 | 507 | ||
| 491 | initMaskPipelines(*shapePlumber, state); | 508 | initZPassPipelines(*shapePlumber, state); |
| 492 | } | 509 | } |
| 493 | auto sharedParameters = std::make_shared<HighlightSharedParameters>(); | 510 | auto sharedParameters = std::make_shared<HighlightSharedParameters>(); |
| 494 | 511 | ||
| @@ -550,14 +567,3 @@ const render::Varying DrawHighlightTask::addSelectItemJobs(JobModel& task, const · 55 unmodified lines | |||
| 550 | return task.addJob<SelectItems>("TransparentSelection", selectItemInput); | 567 | return task.addJob<SelectItems>("TransparentSelection", selectItemInput); |
| 551 | } | 568 | } |
| 552 | 569 | ||
| 553 | void DrawHighlightTask::initMaskPipelines(render::ShapePlumber& shapePlumber, gpu::StatePointer state) { | ||
| 554 | gpu::ShaderPointer modelProgram = gpu::Shader::createProgram(shader::render_utils::program::model_shadow); | ||
| 555 | shapePlumber.addPipeline( | ||
| 556 | ShapeKey::Filter::Builder().withoutSkinned(), | ||
| 557 | modelProgram, state); | ||
| 558 | |||
| 559 | gpu::ShaderPointer deformedProgram = gpu::Shader::createProgram(shader::render_utils::program::deformed_model_shadow); | ||
| 560 | shapePlumber.addPipeline( | ||
| 561 | ShapeKey::Filter::Builder().withSkinned(), | ||
| 562 | deformedProgram, state); | ||
| 563 | } | ||