History

Shadows are completely working with settings on both pipeline

sam gateau committed 7 years ago

Commit 237fb4d1 parent 5a6f30b18 files · +284 −96Browse files

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

Unified · Split

libraries/render-utils/src/RenderShadowTask.cpp+19−15
@@ -59,11 +59,14 @@ void RenderShadowTask::build(JobModel& task, const render::Varying& input, rende · 58 unmodified lines
59 // FIXME: calling this here before the zones/lights are drawn during the deferred/forward passes means we're actually using the frames from the previous draw59 // FIXME: calling this here before the zones/lights are drawn during the deferred/forward passes means we're actually using the frames from the previous draw
60 // Fetch the current frame stacks from all the stages60 // Fetch the current frame stacks from all the stages
61 // Starting with the Light Frame genreated in previous tasks61 // Starting with the Light Frame genreated in previous tasks
62 const auto& lightFrame = input;62
63 const auto& lightFrame = input.getN<Input>(0);
64
65 const auto& lightingModel = input.getN<Input>(1);
63 66
64 const auto setupOutput = task.addJob<RenderShadowSetup>("ShadowSetup", lightFrame);67 const auto setupOutput = task.addJob<RenderShadowSetup>("ShadowSetup", input);
65 const auto queryResolution = setupOutput.getN<RenderShadowSetup::Outputs>(1);68 const auto queryResolution = setupOutput.getN<RenderShadowSetup::Output>(1);
66 const auto shadowFrame = setupOutput.getN<RenderShadowSetup::Outputs>(3);69 const auto shadowFrame = setupOutput.getN<RenderShadowSetup::Output>(3);
67 // Fetch and cull the items from the scene70 // Fetch and cull the items from the scene
68 71
69 static const auto shadowCasterReceiverFilter = ItemFilter::Builder::visibleWorldItems().withTypeShape().withOpaque().withoutLayered().withTagBits(tagBits, tagMask);72 static const auto shadowCasterReceiverFilter = ItemFilter::Builder::visibleWorldItems().withTypeShape().withOpaque().withoutLayered().withTagBits(tagBits, tagMask);
@@ -75,7 +78,7 @@ void RenderShadowTask::build(JobModel& task, const render::Varying& input, rende · 5 unmodified lines
75 78
76 // Cull objects that are not visible in camera view. Hopefully the cull functor only performs LOD culling, not79 // Cull objects that are not visible in camera view. Hopefully the cull functor only performs LOD culling, not
77 // frustum culling or this will make shadow casters out of the camera frustum disappear.80 // frustum culling or this will make shadow casters out of the camera frustum disappear.
78 const auto cameraFrustum = setupOutput.getN<RenderShadowSetup::Outputs>(2);81 const auto cameraFrustum = setupOutput.getN<RenderShadowSetup::Output>(2);
79 const auto applyFunctorInputs = ApplyCullFunctorOnItemBounds::Inputs(shadowItems, cameraFrustum).asVarying();82 const auto applyFunctorInputs = ApplyCullFunctorOnItemBounds::Inputs(shadowItems, cameraFrustum).asVarying();
80 const auto culledShadowItems = task.addJob<ApplyCullFunctorOnItemBounds>("ShadowCullCamera", applyFunctorInputs, cameraCullFunctor);83 const auto culledShadowItems = task.addJob<ApplyCullFunctorOnItemBounds>("ShadowCullCamera", applyFunctorInputs, cameraCullFunctor);
81 84
@@ -122,7 +125,7 @@ void RenderShadowTask::build(JobModel& task, const render::Varying& input, rende · 40 unmodified lines
122 task.addJob<RenderShadowTeardown>("ShadowTeardown", setupOutput);125 task.addJob<RenderShadowTeardown>("ShadowTeardown", setupOutput);
123 126
124 127
125 output = Output(cascadeSceneBBoxes, setupOutput.getN<RenderShadowSetup::Outputs>(3));128 output = Output(cascadeSceneBBoxes, setupOutput.getN<RenderShadowSetup::Output>(3));
126 129
127}130}
128 131
@@ -341,12 +344,19 @@ void RenderShadowSetup::setSlopeBias(int cascadeIndex, float value) { · 212 unmodified lines
341 _bias[cascadeIndex]._slope = value * value * value * 0.01f;344 _bias[cascadeIndex]._slope = value * value * value * 0.01f;
342}345}
343 346
344void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, const Inputs& input, Outputs& output) {347void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, const Input& input, Output& output) {
345 // Abort all jobs if not casting shadows348 // Abort all jobs if not casting shadows
346 auto lightStage = renderContext->_scene->getStage<LightStage>();349 auto lightStage = renderContext->_scene->getStage<LightStage>();
347 auto lightFrame = *input;
348 assert(lightStage);350 assert(lightStage);
349 if (!lightStage->getCurrentKeyLight(lightFrame) || !lightStage->getCurrentKeyLight(lightFrame)->getCastShadows()) {351
352 const auto lightFrame = *input.get0();
353 const auto lightingModel = input.get1();
354
355 // Clear previous shadow frame always
356 _shadowFrameCache->_objects.clear();
357 output.edit3() = _shadowFrameCache;
358
359 if (!lightingModel->isShadowEnabled() || !lightStage->getCurrentKeyLight(lightFrame) || !lightStage->getCurrentKeyLight(lightFrame)->getCastShadows()) {
350 renderContext->taskFlow.abortTask();360 renderContext->taskFlow.abortTask();
351 return;361 return;
352 }362 }
@@ -360,16 +370,12 @@ void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, c · 7 unmodified lines
360 *_cameraFrustum = args->getViewFrustum();370 *_cameraFrustum = args->getViewFrustum();
361 output.edit2() = _cameraFrustum;371 output.edit2() = _cameraFrustum;
362 372
363 // Clear previous shadow frame
364 if (!_globalShadowObject) {373 if (!_globalShadowObject) {
365 _globalShadowObject = std::make_shared<LightStage::Shadow>(graphics::LightPointer(), 100.f, 4);374 _globalShadowObject = std::make_shared<LightStage::Shadow>(graphics::LightPointer(), 100.f, 4);
366 }375 }
367 _shadowFrameCache->_objects.clear();
368 376
369 const auto theGlobalLight = lightStage->getCurrentKeyLight(lightFrame);377 const auto theGlobalLight = lightStage->getCurrentKeyLight(lightFrame);
370 if (theGlobalLight && theGlobalLight->getCastShadows()) {378 if (theGlobalLight && theGlobalLight->getCastShadows()) {
371 //const auto theGlobalShadow = lightStage->getCurrentKeyShadow(lightFrame);
372 //if (theGlobalShadow) {
373 _globalShadowObject->setLight(theGlobalLight);379 _globalShadowObject->setLight(theGlobalLight);
374 _globalShadowObject->setKeylightFrustum(args->getViewFrustum(), SHADOW_FRUSTUM_NEAR, SHADOW_FRUSTUM_FAR);380 _globalShadowObject->setKeylightFrustum(args->getViewFrustum(), SHADOW_FRUSTUM_NEAR, SHADOW_FRUSTUM_FAR);
375 381
@@ -435,8 +441,6 @@ void RenderShadowSetup::run(const render::RenderContextPointer& renderContext, c · 59 unmodified lines
435 queryResolution.x = int(queryResolution.x * _coarseShadowFrustum->getWidth() / firstCascadeFrustum->getWidth());441 queryResolution.x = int(queryResolution.x * _coarseShadowFrustum->getWidth() / firstCascadeFrustum->getWidth());
436 queryResolution.y = int(queryResolution.y * _coarseShadowFrustum->getHeight() / firstCascadeFrustum->getHeight());442 queryResolution.y = int(queryResolution.y * _coarseShadowFrustum->getHeight() / firstCascadeFrustum->getHeight());
437 output.edit1() = queryResolution;443 output.edit1() = queryResolution;
438
439 output.edit3() = _shadowFrameCache;
440 }444 }
441}445}
442 446

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t