Showing the changes to libraries/render-utils/src/RenderDeferredTask.cpp (1 of 12 files). Show all
Unified · Split
| @@ -44,7 +44,7 @@ template <> void render::jobRun(const ResolveDeferred& job, const SceneContextPo · 43 unmodified lines | ||
| 44 | 44 | RenderDeferredTask::RenderDeferredTask() : Task() { |
| 45 | 45 | _jobs.push_back(Job(PrepareDeferred())); |
| 46 | 46 | _jobs.push_back(Job(DrawBackground())); |
| 47 | − _jobs.push_back(Job(DrawOpaque())); | |
| 47 | + _jobs.push_back(Job(DrawOpaqueDeferred())); | |
| 48 | 48 | _jobs.push_back(Job(DrawLight())); |
| 49 | 49 | _jobs.push_back(Job(ResetGLState())); |
| 50 | 50 | _jobs.push_back(Job(RenderDeferred())); |
| @@ -78,6 +78,84 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend · 27 unmodified lines | ||
| 78 | 78 | |
| 79 | 79 | |
| 80 | 80 | |
| 81 | +template <> void render::jobRun(const DrawOpaqueDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { | |
| 82 | + PerformanceTimer perfTimer("DrawOpaqueDeferred"); | |
| 83 | + assert(renderContext->args); | |
| 84 | + assert(renderContext->args->_viewFrustum); | |
| 85 | + | |
| 86 | + // render opaques | |
| 87 | + auto& scene = sceneContext->_scene; | |
| 88 | + auto& items = scene->getMasterBucket().at(ItemFilter::Builder::opaqueShape()); | |
| 89 | + auto& renderDetails = renderContext->args->_details; | |
| 90 | + | |
| 91 | + ItemIDsBounds inItems; | |
| 92 | + inItems.reserve(items.size()); | |
| 93 | + for (auto id : items) { | |
| 94 | + inItems.emplace_back(ItemIDAndBounds(id)); | |
| 95 | + } | |
| 96 | + ItemIDsBounds& renderedItems = inItems; | |
| 97 | + | |
| 98 | + renderContext->_numFeedOpaqueItems = renderedItems.size(); | |
| 99 | + | |
| 100 | + ItemIDsBounds culledItems; | |
| 101 | + culledItems.reserve(inItems.size()); | |
| 102 | + if (renderContext->_cullOpaque) { | |
| 103 | + renderDetails.pointTo(RenderDetails::OPAQUE_ITEM); | |
| 104 | + cullItems(sceneContext, renderContext, renderedItems, culledItems); | |
| 105 | + renderDetails.pointTo(RenderDetails::OTHER_ITEM); | |
| 106 | + renderedItems = culledItems; | |
| 107 | + } | |
| 108 | + | |
| 109 | + renderContext->_numDrawnOpaqueItems = renderedItems.size(); | |
| 110 | + | |
| 111 | + | |
| 112 | + ItemIDsBounds sortedItems; | |
| 113 | + sortedItems.reserve(culledItems.size()); | |
| 114 | + if (renderContext->_sortOpaque) { | |
| 115 | + depthSortItems(sceneContext, renderContext, true, renderedItems, sortedItems); // Sort Front to back opaque items! | |
| 116 | + renderedItems = sortedItems; | |
| 117 | + } | |
| 118 | + | |
| 119 | + // ItemIDsBounds sortedItems; | |
| 120 | + ItemMaterialBucketMap stateSortedItems; | |
| 121 | + stateSortedItems.allocateStandardMaterialBuckets(); | |
| 122 | + if (true) { | |
| 123 | + for (auto& itemIDAndBound : renderedItems) { | |
| 124 | + stateSortedItems.insert(itemIDAndBound.id, scene->getItem(itemIDAndBound.id).getMaterialKey()); | |
| 125 | + } | |
| 126 | + } | |
| 127 | + | |
| 128 | + | |
| 129 | + if (renderContext->_renderOpaque) { | |
| 130 | + RenderArgs* args = renderContext->args; | |
| 131 | + gpu::Batch batch; | |
| 132 | + args->_batch = &batch; | |
| 133 | + | |
| 134 | + glm::mat4 projMat; | |
| 135 | + Transform viewMat; | |
| 136 | + args->_viewFrustum->evalProjectionMatrix(projMat); | |
| 137 | + args->_viewFrustum->evalViewTransform(viewMat); | |
| 138 | + batch.setProjectionTransform(projMat); | |
| 139 | + batch.setViewTransform(viewMat); | |
| 140 | + | |
| 141 | + renderContext->args->_renderMode = RenderArgs::NORMAL_RENDER_MODE; | |
| 142 | + { | |
| 143 | + GLenum buffers[3]; | |
| 144 | + int bufferCount = 0; | |
| 145 | + buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; | |
| 146 | + buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; | |
| 147 | + buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; | |
| 148 | + batch._glDrawBuffers(bufferCount, buffers); | |
| 149 | + } | |
| 150 | + | |
| 151 | + renderItems(sceneContext, renderContext, renderedItems, renderContext->_maxDrawnOpaqueItems); | |
| 152 | + | |
| 153 | + args->_context->render((*args->_batch)); | |
| 154 | + args->_batch = nullptr; | |
| 155 | + } | |
| 156 | +} | |
| 157 | + | |
| 158 | + | |
| 81 | 159 | template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { |
| 82 | 160 | PerformanceTimer perfTimer("DrawTransparentDeferred"); |
| 83 | 161 | assert(renderContext->args); |