History

Merge pull request #7697 from samcake/orange

Introduce a simple state sort for drawing opaque items

Brad Hefta-Gaub committed 10 years ago

Commit 5d550192 parents d16750c 9087de29 files · +155 −12Browse files

Showing the changes to libraries/render-utils/src/RenderDeferredTask.cpp (1 of 9 files). Show all

Unified · Split

libraries/render-utils/src/RenderDeferredTask.cpp+33−1
@@ -96,7 +96,7 @@ RenderDeferredTask::RenderDeferredTask(CullFunctor cullFunctor) { · 95 unmodified lines
96 addJob<PrepareDeferred>("PrepareDeferred");96 addJob<PrepareDeferred>("PrepareDeferred");
97 97
98 // Render opaque objects in DeferredBuffer98 // Render opaque objects in DeferredBuffer
99 addJob<DrawDeferred>("DrawOpaqueDeferred", opaques, shapePlumber);99 addJob<DrawStateSortDeferred>("DrawOpaqueDeferred", opaques, shapePlumber);
100 100
101 // Once opaque is all rendered create stencil background101 // Once opaque is all rendered create stencil background
102 addJob<DrawStencilDeferred>("DrawOpaqueStencil");102 addJob<DrawStencilDeferred>("DrawOpaqueStencil");
@@ -200,6 +200,38 @@ void DrawDeferred::run(const SceneContextPointer& sceneContext, const RenderCont · 97 unmodified lines
200 config->setNumDrawn((int)inItems.size());200 config->setNumDrawn((int)inItems.size());
201}201}
202 202
203void DrawStateSortDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext, const ItemBounds& inItems) {
204 assert(renderContext->args);
205 assert(renderContext->args->_viewFrustum);
206
207 auto config = std::static_pointer_cast<Config>(renderContext->jobConfig);
208
209 RenderArgs* args = renderContext->args;
210
211 gpu::doInBatch(args->_context, [&](gpu::Batch& batch) {
212 args->_batch = &batch;
213 batch.setViewportTransform(args->_viewport);
214 batch.setStateScissorRect(args->_viewport);
215
216 glm::mat4 projMat;
217 Transform viewMat;
218 args->_viewFrustum->evalProjectionMatrix(projMat);
219 args->_viewFrustum->evalViewTransform(viewMat);
220
221 batch.setProjectionTransform(projMat);
222 batch.setViewTransform(viewMat);
223
224 if (_stateSort) {
225 renderStateSortShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn);
226 } else {
227 renderShapes(sceneContext, renderContext, _shapePlumber, inItems, _maxDrawn);
228 }
229 args->_batch = nullptr;
230 });
231
232 config->setNumDrawn((int)inItems.size());
233}
234
203DrawOverlay3D::DrawOverlay3D(bool opaque) :235DrawOverlay3D::DrawOverlay3D(bool opaque) :
204 _shapePlumber(std::make_shared<ShapePlumber>()),236 _shapePlumber(std::make_shared<ShapePlumber>()),
205 _opaquePass(opaque) {237 _opaquePass(opaque) {