Skip to content

Commit 53bc773

Browse files
committed
Skip particle passes in Ogre2DepthCamera if there are no particles in the scene (#971)
Signed-off-by: Ian Chen <[email protected]>
1 parent c4de834 commit 53bc773

File tree

1 file changed

+67
-37
lines changed

1 file changed

+67
-37
lines changed

ogre2/src/Ogre2DepthCamera.cc

+67-37
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
#include <Compositor/Pass/PassScene/OgreCompositorPassSceneDef.h>
6060
#include <OgreDepthBuffer.h>
6161
#include <OgreImage2.h>
62+
#include <OgreParticleSystemManager.h>
6263
#include <OgreRoot.h>
6364
#include <OgreSceneManager.h>
6465
#include <OgreTechnique.h>
@@ -183,9 +184,11 @@ class gz::rendering::Ogre2DepthCameraPrivate
183184
/// improvement.
184185
public: const uint8_t kDepthExecutionMask = 0xEF;
185186

186-
/// \brief Pointer to the color target in the workspace
187-
public: Ogre::CompositorTargetDef *colorTarget{nullptr};
187+
/// \brief Pointer to the color target definition in the workspace
188+
public: Ogre::CompositorTargetDef *colorTargetDef{nullptr};
188189

190+
/// \brief Pointer to the particle target definition in the workspace
191+
public: Ogre::CompositorTargetDef *particleTargetDef{nullptr};
189192
};
190193

191194
using namespace gz;
@@ -351,7 +354,8 @@ void Ogre2DepthCamera::Destroy()
351354
{
352355
ogreCompMgr->removeWorkspace(
353356
this->dataPtr->ogreCompositorWorkspace);
354-
this->dataPtr->colorTarget = nullptr;
357+
this->dataPtr->colorTargetDef = nullptr;
358+
this->dataPtr->particleTargetDef = nullptr;
355359
}
356360

357361
if (this->dataPtr->depthMaterial)
@@ -735,25 +739,25 @@ void Ogre2DepthCamera::CreateDepthTexture()
735739
rtvParticleTexture->depthAttachment.textureName = "particleDepthTexture";
736740

737741
baseNodeDef->setNumTargetPass(4);
738-
Ogre::CompositorTargetDef *colorTargetDef =
742+
this->dataPtr->colorTargetDef =
739743
baseNodeDef->addTargetPass("colorTexture");
740744

741745
if (validBackground)
742-
colorTargetDef->setNumPasses(4);
746+
this->dataPtr->colorTargetDef->setNumPasses(4);
743747
else
744-
colorTargetDef->setNumPasses(3);
748+
this->dataPtr->colorTargetDef->setNumPasses(3);
745749
{
746750
// clear pass
747-
Ogre::CompositorPassSceneDef *passClear =
748-
static_cast<Ogre::CompositorPassSceneDef *>(
749-
colorTargetDef->addPass(Ogre::PASS_CLEAR));
751+
Ogre::CompositorPassClearDef *passClear =
752+
static_cast<Ogre::CompositorPassClearDef *>(
753+
this->dataPtr->colorTargetDef->addPass(Ogre::PASS_CLEAR));
750754
passClear->mExecutionMask = this->dataPtr->kDepthExecutionMask;
751755

752756
// scene pass - opaque
753757
{
754758
Ogre::CompositorPassSceneDef *passScene =
755759
static_cast<Ogre::CompositorPassSceneDef *>(
756-
colorTargetDef->addPass(Ogre::PASS_SCENE));
760+
this->dataPtr->colorTargetDef->addPass(Ogre::PASS_SCENE));
757761
passScene->mShadowNode = this->dataPtr->kShadowNodeName;
758762
passScene->setVisibilityMask(IGN_VISIBILITY_ALL);
759763
passScene->mIncludeOverlays = false;
@@ -781,7 +785,7 @@ void Ogre2DepthCamera::CreateDepthTexture()
781785
// quad pass
782786
Ogre::CompositorPassQuadDef *passQuad =
783787
static_cast<Ogre::CompositorPassQuadDef *>(
784-
colorTargetDef->addPass(Ogre::PASS_QUAD));
788+
this->dataPtr->colorTargetDef->addPass(Ogre::PASS_QUAD));
785789
passQuad->mMaterialName = this->dataPtr->kSkyboxMaterialName + "_"
786790
+ this->Name();
787791
passQuad->mFrustumCorners =
@@ -793,7 +797,7 @@ void Ogre2DepthCamera::CreateDepthTexture()
793797
{
794798
Ogre::CompositorPassSceneDef *passScene =
795799
static_cast<Ogre::CompositorPassSceneDef *>(
796-
colorTargetDef->addPass(Ogre::PASS_SCENE));
800+
this->dataPtr->colorTargetDef->addPass(Ogre::PASS_SCENE));
797801
passScene->setVisibilityMask(IGN_VISIBILITY_ALL);
798802
// todo(anyone) PbsMaterialsShadowNode is hardcoded.
799803
// Although this may be just fine
@@ -823,20 +827,29 @@ void Ogre2DepthCamera::CreateDepthTexture()
823827
passScene->setLightVisibilityMask(0x0);
824828
}
825829

826-
Ogre::CompositorTargetDef *particleTargetDef =
830+
// Ogre::CompositorTargetDef *particleTargetDef =
831+
this->dataPtr->particleTargetDef =
827832
baseNodeDef->addTargetPass("particleTexture");
828-
particleTargetDef->setNumPasses(1);
833+
this->dataPtr->particleTargetDef->setNumPasses(2);
829834
{
835+
// clear pass
836+
Ogre::CompositorPassClearDef *passClear =
837+
static_cast<Ogre::CompositorPassClearDef *>(
838+
this->dataPtr->particleTargetDef->addPass(Ogre::PASS_CLEAR));
839+
passClear->setAllClearColours(Ogre::ColourValue::Black);
840+
passClear->mExecutionMask = this->dataPtr->kDepthExecutionMask;
841+
830842
// scene pass
831843
Ogre::CompositorPassSceneDef *passScene =
832844
static_cast<Ogre::CompositorPassSceneDef *>(
833-
particleTargetDef->addPass(Ogre::PASS_SCENE));
845+
this->dataPtr->particleTargetDef->addPass(Ogre::PASS_SCENE));
834846
passScene->setAllLoadActions(Ogre::LoadAction::Clear);
835847
passScene->setAllClearColours(Ogre::ColourValue::Black);
836848
passScene->setVisibilityMask(
837849
Ogre2ParticleEmitter::kParticleVisibilityFlags);
838850
passScene->mEnableForwardPlus = false;
839851
passScene->setLightVisibilityMask(0x0);
852+
passScene->mExecutionMask = ~this->dataPtr->kDepthExecutionMask;
840853
}
841854

842855
// rt0 target - converts depth to xyz
@@ -1058,32 +1071,49 @@ void Ogre2DepthCamera::PreRender()
10581071
if (!this->dataPtr->ogreCompositorWorkspace)
10591072
this->CreateWorkspaceInstance();
10601073

1061-
if (!this->dataPtr->colorTarget)
1074+
1075+
// Disable color target (set to clear pass) if there are no rgb point cloud
1076+
// connections
1077+
if (this->dataPtr->colorTargetDef)
10621078
{
1063-
auto engine = Ogre2RenderEngine::Instance();
1064-
auto ogreRoot = engine->OgreRoot();
1065-
Ogre::CompositorManager2 *ogreCompMgr = ogreRoot->getCompositorManager2();
1066-
Ogre::CompositorNodeDef *nodeDef =
1067-
ogreCompMgr->getNodeDefinitionNonConst(
1068-
this->dataPtr->ogreCompositorBaseNodeDef);
1069-
this->dataPtr->colorTarget = nodeDef->getTargetPass(0);
1079+
Ogre::CompositorPassDefVec &colorPasses =
1080+
this->dataPtr->colorTargetDef->getCompositorPassesNonConst();
1081+
IGN_ASSERT(colorPasses.size() > 2u,
1082+
"Ogre2DepthCamera color target should contain more than 2 passes");
1083+
IGN_ASSERT(colorPasses[0]->getType() == Ogre::PASS_CLEAR,
1084+
"Ogre2DepthCamera color target should start with a clear pass");
1085+
colorPasses[0]->mExecutionMask =
1086+
(this->dataPtr->newRgbPointCloud.ConnectionCount() > 0u) ?
1087+
~this->dataPtr->kDepthExecutionMask :this->dataPtr->kDepthExecutionMask;
1088+
for (unsigned int i = 1; i < colorPasses.size(); ++i)
1089+
{
1090+
colorPasses[i]->mExecutionMask =
1091+
(this->dataPtr->newRgbPointCloud.ConnectionCount() > 0u) ?
1092+
this->dataPtr->kDepthExecutionMask :
1093+
~this->dataPtr->kDepthExecutionMask;
1094+
}
10701095
}
10711096

1072-
Ogre::CompositorPassDefVec &colorPasses =
1073-
this->dataPtr->colorTarget->getCompositorPassesNonConst();
1074-
IGN_ASSERT(colorPasses.size() > 2u,
1075-
"Ogre2DepthCamera color target should contain more than 2 passes");
1076-
IGN_ASSERT(colorPasses[0]->getType() == Ogre::PASS_CLEAR,
1077-
"Ogre2DepthCamera color target should start with a clear pass");
1078-
colorPasses[0]->mExecutionMask =
1079-
(this->dataPtr->newRgbPointCloud.ConnectionCount() > 0u) ?
1080-
~this->dataPtr->kDepthExecutionMask :this->dataPtr->kDepthExecutionMask;
1081-
for (unsigned int i = 1; i < colorPasses.size(); ++i)
1097+
// Disable particle target (set to clear pass) if there are no particles
1098+
if (this->dataPtr->particleTargetDef)
10821099
{
1083-
colorPasses[i]->mExecutionMask =
1084-
(this->dataPtr->newRgbPointCloud.ConnectionCount() > 0u) ?
1085-
this->dataPtr->kDepthExecutionMask :
1086-
~this->dataPtr->kDepthExecutionMask;
1100+
bool hasParticles =
1101+
this->scene->OgreSceneManager()->getMovableObjectIterator(
1102+
Ogre::ParticleSystemFactory::FACTORY_TYPE_NAME).hasMoreElements();
1103+
Ogre::CompositorPassDefVec &particlePasses =
1104+
this->dataPtr->particleTargetDef->getCompositorPassesNonConst();
1105+
IGN_ASSERT(particlePasses.size() == 2u,
1106+
"Ogre2DepthCamera particle target should 2 passes");
1107+
IGN_ASSERT(particlePasses[0]->getType() == Ogre::PASS_CLEAR,
1108+
"Ogre2DepthCamera particle target should start with a clear pass");
1109+
IGN_ASSERT(particlePasses[1]->getType() == Ogre::PASS_SCENE,
1110+
"Ogre2DepthCamera particle target should end with a scene pass");
1111+
particlePasses[0]->mExecutionMask =
1112+
(hasParticles) ? ~this->dataPtr->kDepthExecutionMask :
1113+
this->dataPtr->kDepthExecutionMask;
1114+
particlePasses[1]->mExecutionMask =
1115+
(hasParticles) ? this->dataPtr->kDepthExecutionMask :
1116+
~this->dataPtr->kDepthExecutionMask;
10871117
}
10881118

10891119
// update depth camera render passes

0 commit comments

Comments
 (0)