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
44RenderDeferredTask::RenderDeferredTask() : Task() {44RenderDeferredTask::RenderDeferredTask() : Task() {
45 _jobs.push_back(Job(PrepareDeferred()));45 _jobs.push_back(Job(PrepareDeferred()));
46 _jobs.push_back(Job(DrawBackground()));46 _jobs.push_back(Job(DrawBackground()));
47 _jobs.push_back(Job(DrawOpaque()));47 _jobs.push_back(Job(DrawOpaqueDeferred()));
48 _jobs.push_back(Job(DrawLight()));48 _jobs.push_back(Job(DrawLight()));
49 _jobs.push_back(Job(ResetGLState()));49 _jobs.push_back(Job(ResetGLState()));
50 _jobs.push_back(Job(RenderDeferred()));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
81template <> 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
81template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {159template <> void render::jobRun(const DrawTransparentDeferred& job, const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) {
82 PerformanceTimer perfTimer("DrawTransparentDeferred");160 PerformanceTimer perfTimer("DrawTransparentDeferred");
83 assert(renderContext->args);161 assert(renderContext->args);