History

first take on the materialKey

Sam Gateau committed 11 years ago

Commit 7de4c2e1 parent 3fb5e4712 files · +344 −80Browse files

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

Unified · Split

libraries/render-utils/src/RenderDeferredTask.cpp+79−1
@@ -44,7 +44,7 @@ template <> void render::jobRun(const ResolveDeferred& job, const SceneContextPo · 43 unmodified lines
4444 RenderDeferredTask::RenderDeferredTask() : Task() {
4545 _jobs.push_back(Job(PrepareDeferred()));
4646 _jobs.push_back(Job(DrawBackground()));
47− _jobs.push_back(Job(DrawOpaque()));
47+ _jobs.push_back(Job(DrawOpaqueDeferred()));
4848 _jobs.push_back(Job(DrawLight()));
4949 _jobs.push_back(Job(ResetGLState()));
5050 _jobs.push_back(Job(RenderDeferred()));
@@ -78,6 +78,84 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend · 27 unmodified lines
7878
7979
8080
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+
81159 template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
82160 PerformanceTimer perfTimer("DrawTransparentDeferred");
83161 assert(renderContext->args);