Showing the changes to libraries/render-utils/src/RenderDeferredTask.cpp (1 of 452 files). Show all
Unified · Split
| @@ -1,3 +1,4 @@ | ||
| 1 | + | |
| 1 | 2 | // |
| 2 | 3 | // RenderDeferredTask.cpp |
| 3 | 4 | // render-utils/src/ |
| @@ -10,23 +11,44 @@ · 6 unmodified lines | ||
| 10 | 11 | // |
| 11 | 12 | #include "RenderDeferredTask.h" |
| 12 | 13 | |
| 13 | −#include "gpu/Batch.h" | |
| 14 | −#include "gpu/Context.h" | |
| 14 | +#include <PerfStat.h> | |
| 15 | +#include <RenderArgs.h> | |
| 16 | +#include <ViewFrustum.h> | |
| 17 | +#include <gpu/Context.h> | |
| 18 | + | |
| 19 | +#include "FramebufferCache.h" | |
| 15 | 20 | #include "DeferredLightingEffect.h" |
| 16 | −#include "ViewFrustum.h" | |
| 17 | −#include "RenderArgs.h" | |
| 18 | 21 | #include "TextureCache.h" |
| 19 | 22 | #include "HitEffect.h" |
| 20 | 23 | |
| 21 | 24 | #include "render/DrawStatus.h" |
| 22 | − | |
| 23 | −#include <PerfStat.h> | |
| 25 | +#include "AmbientOcclusionEffect.h" | |
| 24 | 26 | |
| 25 | 27 | #include "overlay3D_vert.h" |
| 26 | 28 | #include "overlay3D_frag.h" |
| 27 | 29 | |
| 28 | 30 | using namespace render; |
| 29 | 31 | |
| 32 | +void SetupDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { | |
| 33 | + RenderArgs* args = renderContext->args; | |
| 34 | + | |
| 35 | + auto primaryFbo = DependencyManager::get<FramebufferCache>()->getPrimaryFramebufferDepthColor(); | |
| 36 | + | |
| 37 | + gpu::Batch batch; | |
| 38 | + batch.setFramebuffer(nullptr); | |
| 39 | + batch.setFramebuffer(primaryFbo); | |
| 40 | + | |
| 41 | + batch.setViewportTransform(args->_viewport); | |
| 42 | + batch.setStateScissorRect(args->_viewport); | |
| 43 | + | |
| 44 | + batch.clearFramebuffer( | |
| 45 | + gpu::Framebuffer::BUFFER_COLOR0 | | |
| 46 | + gpu::Framebuffer::BUFFER_DEPTH, | |
| 47 | + vec4(vec3(0), 1), 1.0, 0.0, true); | |
| 48 | + | |
| 49 | + args->_context->render(batch); | |
| 50 | +} | |
| 51 | + | |
| 30 | 52 | void PrepareDeferred::run(const SceneContextPointer& sceneContext, const RenderContextPointer& renderContext) { |
| 31 | 53 | DependencyManager::get<DeferredLightingEffect>()->prepare(renderContext->args); |
| 32 | 54 | } |
| @@ -41,6 +63,7 @@ void ResolveDeferred::run(const SceneContextPointer& sceneContext, const RenderC · 8 unmodified lines | ||
| 41 | 63 | } |
| 42 | 64 | |
| 43 | 65 | RenderDeferredTask::RenderDeferredTask() : Task() { |
| 66 | + _jobs.push_back(Job(new SetupDeferred::JobModel("SetupFramebuffer"))); | |
| 44 | 67 | _jobs.push_back(Job(new DrawBackground::JobModel("DrawBackground"))); |
| 45 | 68 | |
| 46 | 69 | _jobs.push_back(Job(new PrepareDeferred::JobModel("PrepareDeferred"))); |
| @@ -57,9 +80,13 @@ RenderDeferredTask::RenderDeferredTask() : Task() { · 10 unmodified lines | ||
| 57 | 80 | _jobs.push_back(Job(new DrawOpaqueDeferred::JobModel("DrawOpaqueDeferred", _jobs.back().getOutput()))); |
| 58 | 81 | |
| 59 | 82 | _jobs.push_back(Job(new DrawLight::JobModel("DrawLight"))); |
| 60 | − _jobs.push_back(Job(new ResetGLState::JobModel())); | |
| 61 | 83 | _jobs.push_back(Job(new RenderDeferred::JobModel("RenderDeferred"))); |
| 62 | 84 | _jobs.push_back(Job(new ResolveDeferred::JobModel("ResolveDeferred"))); |
| 85 | + _jobs.push_back(Job(new AmbientOcclusion::JobModel("AmbientOcclusion"))); | |
| 86 | + | |
| 87 | + _jobs.back().setEnabled(false); | |
| 88 | + _occlusionJobIndex = _jobs.size() - 1; | |
| 89 | + | |
| 63 | 90 | _jobs.push_back(Job(new FetchItems::JobModel("FetchTransparent", |
| 64 | 91 | FetchItems( |
| 65 | 92 | ItemFilter::Builder::transparentShape().withoutLayered(), |
| @@ -73,17 +100,22 @@ RenderDeferredTask::RenderDeferredTask() : Task() { · 7 unmodified lines | ||
| 73 | 100 | _jobs.push_back(Job(new DrawTransparentDeferred::JobModel("TransparentDeferred", _jobs.back().getOutput()))); |
| 74 | 101 | |
| 75 | 102 | _jobs.push_back(Job(new render::DrawStatus::JobModel("DrawStatus", renderedOpaques))); |
| 103 | + | |
| 104 | + | |
| 76 | 105 | _jobs.back().setEnabled(false); |
| 77 | 106 | _drawStatusJobIndex = _jobs.size() - 1; |
| 78 | 107 | |
| 79 | 108 | _jobs.push_back(Job(new DrawOverlay3D::JobModel("DrawOverlay3D"))); |
| 80 | − _jobs.push_back(Job(new ResetGLState::JobModel())); | |
| 81 | − | |
| 109 | + | |
| 110 | + _jobs.push_back(Job(new HitEffect::JobModel("HitEffect"))); | |
| 111 | + _jobs.back().setEnabled(false); | |
| 112 | + _drawHitEffectJobIndex = _jobs.size() -1; | |
| 113 | + | |
| 82 | 114 | |
| 83 | 115 | // Give ourselves 3 frmaes of timer queries |
| 84 | − _timerQueries.push_back(gpu::QueryPointer(new gpu::Query())); | |
| 85 | − _timerQueries.push_back(gpu::QueryPointer(new gpu::Query())); | |
| 86 | − _timerQueries.push_back(gpu::QueryPointer(new gpu::Query())); | |
| 116 | + _timerQueries.push_back(std::make_shared<gpu::Query>()); | |
| 117 | + _timerQueries.push_back(std::make_shared<gpu::Query>()); | |
| 118 | + _timerQueries.push_back(std::make_shared<gpu::Query>()); | |
| 87 | 119 | _currentTimerQueryIndex = 0; |
| 88 | 120 | } |
| 89 | 121 | |
| @@ -105,6 +137,13 @@ void RenderDeferredTask::run(const SceneContextPointer& sceneContext, const Rend · 15 unmodified lines | ||
| 105 | 137 | |
| 106 | 138 | // Make sure we turn the displayItemStatus on/off |
| 107 | 139 | setDrawItemStatus(renderContext->_drawItemStatus); |
| 140 | + | |
| 141 | + //Make sure we display hit effect on screen, as desired from a script | |
| 142 | + setDrawHitEffect(renderContext->_drawHitEffect); | |
| 143 | + | |
| 144 | + | |
| 145 | + // TODO: turn on/off AO through menu item | |
| 146 | + setOcclusionStatus(renderContext->_occlusionStatus); | |
| 108 | 147 | |
| 109 | 148 | renderContext->args->_context->syncCache(); |
| 110 | 149 | |
| @@ -135,21 +174,12 @@ void DrawOpaqueDeferred::run(const SceneContextPointer& sceneContext, const Rend · 24 unmodified lines | ||
| 135 | 174 | batch.setViewTransform(viewMat); |
| 136 | 175 | |
| 137 | 176 | { |
| 138 | − GLenum buffers[3]; | |
| 139 | − int bufferCount = 0; | |
| 140 | − buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; | |
| 141 | − buffers[bufferCount++] = GL_COLOR_ATTACHMENT1; | |
| 142 | − buffers[bufferCount++] = GL_COLOR_ATTACHMENT2; | |
| 143 | − batch._glDrawBuffers(bufferCount, buffers); | |
| 144 | 177 | const float OPAQUE_ALPHA_THRESHOLD = 0.5f; |
| 145 | 178 | args->_alphaThreshold = OPAQUE_ALPHA_THRESHOLD; |
| 146 | 179 | } |
| 147 | 180 | |
| 148 | 181 | renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOpaqueItems); |
| 149 | 182 | |
| 150 | − // Before rendering the batch make sure we re in sync with gl state | |
| 151 | − args->_context->syncCache(); | |
| 152 | − renderContext->args->_context->syncCache(); | |
| 153 | 183 | args->_context->render((*args->_batch)); |
| 154 | 184 | args->_batch = nullptr; |
| 155 | 185 | } |
| @@ -173,21 +203,15 @@ void DrawTransparentDeferred::run(const SceneContextPointer& sceneContext, const · 17 unmodified lines | ||
| 173 | 203 | } |
| 174 | 204 | batch.setProjectionTransform(projMat); |
| 175 | 205 | batch.setViewTransform(viewMat); |
| 176 | − const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; | |
| 177 | 206 | |
| 178 | 207 | { |
| 179 | − GLenum buffers[3]; | |
| 180 | − int bufferCount = 0; | |
| 181 | − buffers[bufferCount++] = GL_COLOR_ATTACHMENT0; | |
| 182 | − batch._glDrawBuffers(bufferCount, buffers); | |
| 208 | + const float TRANSPARENT_ALPHA_THRESHOLD = 0.0f; | |
| 183 | 209 | args->_alphaThreshold = TRANSPARENT_ALPHA_THRESHOLD; |
| 184 | 210 | } |
| 185 | 211 | |
| 186 | 212 | |
| 187 | 213 | renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnTransparentItems); |
| 188 | − | |
| 189 | − // Before rendering the batch make sure we re in sync with gl state | |
| 190 | − args->_context->syncCache(); | |
| 214 | + | |
| 191 | 215 | args->_context->render((*args->_batch)); |
| 192 | 216 | args->_batch = nullptr; |
| 193 | 217 | } |
| @@ -198,8 +222,8 @@ const gpu::PipelinePointer& DrawOverlay3D::getOpaquePipeline() { · 4 unmodified lines | ||
| 198 | 222 | auto vs = gpu::ShaderPointer(gpu::Shader::createVertex(std::string(overlay3D_vert))); |
| 199 | 223 | auto ps = gpu::ShaderPointer(gpu::Shader::createPixel(std::string(overlay3D_frag))); |
| 200 | 224 | auto program = gpu::ShaderPointer(gpu::Shader::createProgram(vs, ps)); |
| 201 | − | |
| 202 | − auto state = gpu::StatePointer(new gpu::State()); | |
| 225 | + | |
| 226 | + auto state = std::make_shared<gpu::State>(); | |
| 203 | 227 | state->setDepthTest(true, true, gpu::LESS_EQUAL); |
| 204 | 228 | |
| 205 | 229 | _opaquePipeline.reset(gpu::Pipeline::create(program, state)); |
| @@ -241,17 +265,17 @@ void DrawOverlay3D::run(const SceneContextPointer& sceneContext, const RenderCon · 35 unmodified lines | ||
| 241 | 265 | } |
| 242 | 266 | batch.setProjectionTransform(projMat); |
| 243 | 267 | batch.setViewTransform(viewMat); |
| 268 | + batch.setViewportTransform(args->_viewport); | |
| 269 | + batch.setStateScissorRect(args->_viewport); | |
| 244 | 270 | |
| 245 | 271 | batch.setPipeline(getOpaquePipeline()); |
| 246 | 272 | batch.setResourceTexture(0, args->_whiteTexture); |
| 247 | 273 | |
| 248 | 274 | if (!inItems.empty()) { |
| 249 | − batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0); | |
| 275 | + batch.clearFramebuffer(gpu::Framebuffer::BUFFER_DEPTH, glm::vec4(), 1.f, 0, true); | |
| 250 | 276 | renderItems(sceneContext, renderContext, inItems, renderContext->_maxDrawnOverlay3DItems); |
| 251 | 277 | } |
| 252 | 278 | |
| 253 | − // Before rendering the batch make sure we re in sync with gl state | |
| 254 | − args->_context->syncCache(); | |
| 255 | 279 | args->_context->render((*args->_batch)); |
| 256 | 280 | args->_batch = nullptr; |
| 257 | 281 | args->_whiteTexture.reset(); |