| 119 | } |
| 120 | |
| 121 | void RenderQueue::Draw() |
| 122 | { |
| 123 | #if defined(DEATH_DEBUG) && defined(NCINE_PROFILING) |
| 124 | static char debugString[128]; |
| 125 | #endif |
| 126 | const bool batchingEnabled = theApplication().GetRenderingSettings().batchingEnabled; |
| 127 | SmallVectorImpl<RenderCommand*>* opaques = batchingEnabled ? &opaqueBatchedQueue_ : &opaqueQueue_; |
| 128 | SmallVectorImpl<RenderCommand*>* transparents = batchingEnabled ? &transparentBatchedQueue_ : &transparentQueue_; |
| 129 | |
| 130 | #if defined(DEATH_DEBUG) && defined(NCINE_PROFILING) |
| 131 | std::uint32_t commandIndex = 0; |
| 132 | #endif |
| 133 | // Rendering opaque nodes front to back |
| 134 | for (RenderCommand* opaqueRenderCommand : *opaques) { |
| 135 | TracyGpuZone("Opaque"); |
| 136 | #if defined(DEATH_DEBUG) && defined(NCINE_PROFILING) |
| 137 | const std::int32_t numInstances = opaqueRenderCommand->GetInstanceCount(); |
| 138 | const std::int32_t batchSize = opaqueRenderCommand->GetBatchSize(); |
| 139 | const std::uint16_t layer = opaqueRenderCommand->GetLayer(); |
| 140 | const std::uint16_t visitOrder = opaqueRenderCommand->GetVisitOrder(); |
| 141 | |
| 142 | std::size_t length; |
| 143 | if (numInstances > 0) { |
| 144 | length = formatInto(debugString, "Opaque {} ({} {} on layer {}, visit order {}, sort key 0x{:x})", |
| 145 | commandIndex, numInstances, commandTypeString(*opaqueRenderCommand), layer, visitOrder, opaqueRenderCommand->GetMaterialSortKey()); |
| 146 | } else if (batchSize > 0) { |
| 147 | length = formatInto(debugString, "Opaque {} ({} {} on layer {}, visit order {}, sort key 0x{:x})", |
| 148 | commandIndex, batchSize, commandTypeString(*opaqueRenderCommand), layer, visitOrder, opaqueRenderCommand->GetMaterialSortKey()); |
| 149 | } else { |
| 150 | length = formatInto(debugString, "Opaque {} ({} {} layer {}, visit order {}, sort key 0x{:x})", |
| 151 | commandIndex, commandTypeString(*opaqueRenderCommand), layer, visitOrder, opaqueRenderCommand->GetMaterialSortKey()); |
| 152 | } |
| 153 | GLDebug::ScopedGroup scoped({ debugString, length }); |
| 154 | commandIndex++; |
| 155 | #endif |
| 156 | |
| 157 | #if defined(NCINE_PROFILING) |
| 158 | RenderStatistics::GatherStatistics(*opaqueRenderCommand); |
| 159 | #endif |
| 160 | opaqueRenderCommand->CommitCameraTransformation(); |
| 161 | opaqueRenderCommand->Issue(); |
| 162 | } |
| 163 | |
| 164 | GLBlending::Enable(); |
| 165 | GLDepthTest::DisableDepthMask(); |
| 166 | // Rendering transparent nodes back to front |
| 167 | for (RenderCommand* transparentRenderCommand : *transparents) { |
| 168 | TracyGpuZone("Transparent"); |
| 169 | #if defined(DEATH_DEBUG) && defined(NCINE_PROFILING) |
| 170 | const std::int32_t numInstances = transparentRenderCommand->GetInstanceCount(); |
| 171 | const std::int32_t batchSize = transparentRenderCommand->GetBatchSize(); |
| 172 | const std::uint16_t layer = transparentRenderCommand->GetLayer(); |
| 173 | const std::uint16_t visitOrder = transparentRenderCommand->GetVisitOrder(); |
| 174 | |
| 175 | std::size_t length; |
| 176 | if (numInstances > 0) { |
| 177 | length = formatInto(debugString, "Transparent {} ({} {} on layer {}, visit order {}, sort key 0x{:x})", |
| 178 | commandIndex, numInstances, commandTypeString(*transparentRenderCommand), layer, visitOrder, transparentRenderCommand->GetMaterialSortKey()); |
nothing calls this directly
no test coverage detected