From 83ceb5849e02bf6dbeecc7f9cf2bf7575cd54bd0 Mon Sep 17 00:00:00 2001 From: fdagenais Date: Fri, 27 Nov 2020 15:59:35 -0500 Subject: [PATCH 1/2] Fix dirtying issues in affects() methods Attributes `affects` relationships have been corrected to fix dirtying issues in Gaffer 0.58+. --- include/AtomsGaffer/AtomsCrowdGenerator.h | 7 ++ src/AtomsGaffer/AtomsCrowdClothReader.cpp | 2 + src/AtomsGaffer/AtomsCrowdGenerator.cpp | 111 ++++++++++++---------- 3 files changed, 68 insertions(+), 52 deletions(-) diff --git a/include/AtomsGaffer/AtomsCrowdGenerator.h b/include/AtomsGaffer/AtomsCrowdGenerator.h index 04b7230..b5c2819 100644 --- a/include/AtomsGaffer/AtomsCrowdGenerator.h +++ b/include/AtomsGaffer/AtomsCrowdGenerator.h @@ -81,24 +81,31 @@ class AtomsCrowdGenerator : public GafferScene::BranchCreator void hash( const Gaffer::ValuePlug *output, const Gaffer::Context *context, IECore::MurmurHash &h ) const override; void compute( Gaffer::ValuePlug *output, const Gaffer::Context *context ) const override; + bool affectsBranchBound( const Gaffer::Plug *input ) const override; void hashBranchBound( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, IECore::MurmurHash &h ) const override; Imath::Box3f computeBranchBound( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context ) const override; + bool affectsBranchTransform( const Gaffer::Plug *input ) const override; void hashBranchTransform( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, IECore::MurmurHash &h ) const override; Imath::M44f computeBranchTransform( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context ) const override; + bool affectsBranchAttributes( const Gaffer::Plug *input ) const override; void hashBranchAttributes( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, IECore::MurmurHash &h ) const override; IECore::ConstCompoundObjectPtr computeBranchAttributes( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context ) const override; + bool affectsBranchObject( const Gaffer::Plug *input ) const override; void hashBranchObject( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, IECore::MurmurHash &h ) const override; IECore::ConstObjectPtr computeBranchObject( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context ) const override; + bool affectsBranchChildNames( const Gaffer::Plug *input ) const override; void hashBranchChildNames( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, IECore::MurmurHash &h ) const override; IECore::ConstInternedStringVectorDataPtr computeBranchChildNames( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context ) const override; + bool affectsBranchSetNames( const Gaffer::Plug *input ) const override; void hashBranchSetNames( const ScenePath &parentPath, const Gaffer::Context *context, IECore::MurmurHash &h ) const override; IECore::ConstInternedStringVectorDataPtr computeBranchSetNames( const ScenePath &parentPath, const Gaffer::Context *context ) const override; + bool affectsBranchSet( const Gaffer::Plug *input ) const override; void hashBranchSet( const ScenePath &parentPath, const IECore::InternedString &setName, const Gaffer::Context *context, IECore::MurmurHash &h ) const override; IECore::ConstPathMatcherDataPtr computeBranchSet( const ScenePath &parentPath, const IECore::InternedString &setName, const Gaffer::Context *context ) const override; diff --git a/src/AtomsGaffer/AtomsCrowdClothReader.cpp b/src/AtomsGaffer/AtomsCrowdClothReader.cpp index 35d7632..e4fe431 100644 --- a/src/AtomsGaffer/AtomsCrowdClothReader.cpp +++ b/src/AtomsGaffer/AtomsCrowdClothReader.cpp @@ -97,6 +97,8 @@ const IntPlug* AtomsCrowdClothReader::refreshCountPlug() const void AtomsCrowdClothReader::affects( const Plug *input, AffectedPlugsContainer &outputs ) const { + SceneProcessor::affects(input, outputs); + if( input == inPlug()->objectPlug() || input == inPlug()->attributesPlug() || input == atomsClothFilePlug() || input == refreshCountPlug() ) { diff --git a/src/AtomsGaffer/AtomsCrowdGenerator.cpp b/src/AtomsGaffer/AtomsCrowdGenerator.cpp index 926ee41..eff7a78 100644 --- a/src/AtomsGaffer/AtomsCrowdGenerator.cpp +++ b/src/AtomsGaffer/AtomsCrowdGenerator.cpp @@ -139,62 +139,12 @@ void AtomsCrowdGenerator::affects( const Plug *input, AffectedPlugsContainer &ou if( input == inPlug()->objectPlug() || input == inPlug()->attributesPlug() || - input == variationsPlug()->childNamesPlug() + input == variationsPlug()->childNamesPlug() || + input == useInstancesPlug() ) { outputs.push_back( agentChildNamesPlug() ); } - - if( - input == namePlug() || - input == agentChildNamesPlug() || - input == variationsPlug()->childNamesPlug() - ) - { - outputs.push_back( outPlug()->childNamesPlug() ); - } - - if( - input == inPlug()->objectPlug() || - input == inPlug()->attributesPlug() || - input == namePlug() || - input == variationsPlug()->boundPlug() || - input == variationsPlug()->transformPlug() || - input == agentChildNamesPlug() || - input == boundingBoxPaddingPlug() || - input == clothCachePlug()->objectPlug() - ) - { - outputs.push_back( outPlug()->boundPlug() ); - } - - if( - input == inPlug()->objectPlug() || - input == inPlug()->attributesPlug() || - input == variationsPlug()->transformPlug() - ) - { - outputs.push_back( outPlug()->transformPlug() ); - } - - if( - input == variationsPlug()->attributesPlug() || - input == inPlug()->objectPlug() || - input == inPlug()->attributesPlug() - ) - { - outputs.push_back( outPlug()->attributesPlug() ); - } - - if( input == variationsPlug()->objectPlug() || - input == variationsPlug()->attributesPlug() || - input == inPlug()->objectPlug() || - input == inPlug()->attributesPlug() || - input == clothCachePlug()->objectPlug() - ) - { - outputs.push_back( outPlug()->objectPlug() ); - } } void AtomsCrowdGenerator::hash( const Gaffer::ValuePlug *output, const Gaffer::Context *context, MurmurHash &h ) const @@ -371,6 +321,19 @@ void AtomsCrowdGenerator::compute( Gaffer::ValuePlug *output, const Gaffer::Cont BranchCreator::compute( output, context ); } +bool AtomsCrowdGenerator::affectsBranchBound( const Gaffer::Plug *input ) const +{ + return ( input == inPlug()->objectPlug() || + input == inPlug()->attributesPlug() || + input == inPlug()->boundPlug() || + input == namePlug() || + input == variationsPlug()->boundPlug() || + input == variationsPlug()->transformPlug() || + input == agentChildNamesPlug() || + input == boundingBoxPaddingPlug() || + input == clothCachePlug()->objectPlug() ); +} + void AtomsCrowdGenerator::hashBranchBound( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, MurmurHash &h ) const { if( branchPath.size() < 4 ) @@ -518,6 +481,13 @@ Imath::Box3f AtomsCrowdGenerator::computeBranchBound( const ScenePath &parentPat } } +bool AtomsCrowdGenerator::affectsBranchTransform( const Gaffer::Plug *input ) const +{ + return ( input == inPlug()->objectPlug() || + input == inPlug()->attributesPlug() || + input == variationsPlug()->transformPlug() ); +} + void AtomsCrowdGenerator::hashBranchTransform( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, MurmurHash &h ) const { @@ -565,6 +535,13 @@ Imath::M44f AtomsCrowdGenerator::computeBranchTransform( const ScenePath &parent } } +bool AtomsCrowdGenerator::affectsBranchAttributes( const Gaffer::Plug *input ) const +{ + return ( input == variationsPlug()->attributesPlug() || + input == inPlug()->objectPlug() || + input == inPlug()->attributesPlug() ); +} + void AtomsCrowdGenerator::hashBranchAttributes( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, MurmurHash &h ) const { if( branchPath.size() < 1 ) @@ -842,6 +819,16 @@ ConstCompoundObjectPtr AtomsCrowdGenerator::computeBranchAttributes( const Scene } } +bool AtomsCrowdGenerator::affectsBranchObject( const Gaffer::Plug *input ) const +{ + return ( input == variationsPlug()->objectPlug() || + input == variationsPlug()->attributesPlug() || + input == inPlug()->objectPlug() || + input == inPlug()->attributesPlug() || + input == clothCachePlug()->objectPlug() || + input == useInstancesPlug() ); +} + void AtomsCrowdGenerator::hashBranchObject( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, MurmurHash &h ) const { if( branchPath.size() <= 4 ) @@ -1030,6 +1017,13 @@ ConstObjectPtr AtomsCrowdGenerator::computeBranchObject( const ScenePath &parent return result; } +bool AtomsCrowdGenerator::affectsBranchChildNames( const Gaffer::Plug *input ) const +{ + return ( input == namePlug() || + input == agentChildNamesPlug() || + input == variationsPlug()->childNamesPlug() ); +} + void AtomsCrowdGenerator::hashBranchChildNames( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, MurmurHash &h ) const { if( branchPath.empty() ) @@ -1128,6 +1122,11 @@ ConstInternedStringVectorDataPtr AtomsCrowdGenerator::computeBranchChildNames( c } } +bool AtomsCrowdGenerator::affectsBranchSetNames( const Gaffer::Plug *input ) const +{ + return ( input == variationsPlug()->setNamesPlug() ); +} + void AtomsCrowdGenerator::hashBranchSetNames( const ScenePath &parentPath, const Gaffer::Context *context, MurmurHash &h ) const { h = variationsPlug()->setNamesPlug()->hash(); @@ -1138,6 +1137,14 @@ ConstInternedStringVectorDataPtr AtomsCrowdGenerator::computeBranchSetNames( con return variationsPlug()->setNamesPlug()->getValue(); } +bool AtomsCrowdGenerator::affectsBranchSet( const Gaffer::Plug *input ) const +{ + return ( input == variationsPlug()->childNamesPlug() || + input == agentChildNamesPlug() || + input == variationsPlug()->setPlug() || + input == namePlug() ); +} + void AtomsCrowdGenerator::hashBranchSet( const ScenePath &parentPath, const InternedString &setName, const Gaffer::Context *context, MurmurHash &h ) const { BranchCreator::hashBranchSet( parentPath, setName, context, h ); From 4c940743a9a9592d8ea99f4a7a3340b21431f57d Mon Sep 17 00:00:00 2001 From: fdagenais Date: Thu, 3 Dec 2020 09:16:00 -0500 Subject: [PATCH 2/2] Fix AtomsCrowdGenerator hash and affects methods AtomsCrowdGenerator hash and affects methods have been updated to better match the plugs used by their respective compute methods. --- src/AtomsGaffer/AtomsCrowdGenerator.cpp | 43 +++++-------------------- 1 file changed, 8 insertions(+), 35 deletions(-) diff --git a/src/AtomsGaffer/AtomsCrowdGenerator.cpp b/src/AtomsGaffer/AtomsCrowdGenerator.cpp index eff7a78..b9674c9 100644 --- a/src/AtomsGaffer/AtomsCrowdGenerator.cpp +++ b/src/AtomsGaffer/AtomsCrowdGenerator.cpp @@ -136,12 +136,7 @@ void AtomsCrowdGenerator::affects( const Plug *input, AffectedPlugsContainer &ou { BranchCreator::affects( input, outputs ); - if( - input == inPlug()->objectPlug() || - input == inPlug()->attributesPlug() || - input == variationsPlug()->childNamesPlug() || - input == useInstancesPlug() - ) + if( input == inPlug()->objectPlug() ) { outputs.push_back( agentChildNamesPlug() ); } @@ -154,9 +149,6 @@ void AtomsCrowdGenerator::hash( const Gaffer::ValuePlug *output, const Gaffer::C if( output == agentChildNamesPlug() ) { inPlug()->objectPlug()->hash( h ); - inPlug()->attributesPlug()->hash( h ); - h.append( variationsPlug()->childNamesHash( ScenePath() ) ); - useInstancesPlug()->hash( h ); } } @@ -323,13 +315,9 @@ void AtomsCrowdGenerator::compute( Gaffer::ValuePlug *output, const Gaffer::Cont bool AtomsCrowdGenerator::affectsBranchBound( const Gaffer::Plug *input ) const { - return ( input == inPlug()->objectPlug() || - input == inPlug()->attributesPlug() || - input == inPlug()->boundPlug() || + return ( input == inPlug()->attributesPlug() || input == namePlug() || - input == variationsPlug()->boundPlug() || input == variationsPlug()->transformPlug() || - input == agentChildNamesPlug() || input == boundingBoxPaddingPlug() || input == clothCachePlug()->objectPlug() ); } @@ -348,33 +336,20 @@ void AtomsCrowdGenerator::hashBranchBound( const ScenePath &parentPath, const Sc h = hashOfTransformedChildBounds( path, outPlug() ); } - else if( branchPath.size() == 4 ) + else if( branchPath.size() >= 4 ) { // "/agents///" BranchCreator::hashBranchBound( parentPath, branchPath, context, h ); inPlug()->attributesPlug()->hash( h ); - inPlug()->objectPlug()->hash( h ); boundingBoxPaddingPlug()->hash( h ); - agentChildNamesHash( parentPath, context, h ); + clothCachePlug()->objectPlug()->hash( h ); h.append( branchPath.back() ); { AgentScope scope( context, branchPath ); variationsPlug()->transformPlug()->hash( h ); - variationsPlug()->boundPlug()->hash( h ); } } - else - { - // "/agents////..." - clothCachePlug()->objectPlug()->hash( h ); - AgentScope instanceScope( context, branchPath ); - variationsPlug()->boundPlug()->hash( h ); - boundingBoxPaddingPlug()->hash( h ); - inPlug()->boundPlug()->hash( h ); - inPlug()->attributesPlug()->hash( h ); - inPlug()->objectPlug()->hash( h ); - } } Imath::Box3f AtomsCrowdGenerator::computeBranchBound( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context ) const @@ -483,8 +458,7 @@ Imath::Box3f AtomsCrowdGenerator::computeBranchBound( const ScenePath &parentPat bool AtomsCrowdGenerator::affectsBranchTransform( const Gaffer::Plug *input ) const { - return ( input == inPlug()->objectPlug() || - input == inPlug()->attributesPlug() || + return ( input == inPlug()->attributesPlug() || input == variationsPlug()->transformPlug() ); } @@ -499,7 +473,6 @@ void AtomsCrowdGenerator::hashBranchTransform( const ScenePath &parentPath, cons else if( branchPath.size() == 4 ) { // "/agents///" - inPlug()->objectPlug()->hash( h ); inPlug()->attributesPlug()->hash( h ); h.append( branchPath[3] ); } @@ -508,8 +481,6 @@ void AtomsCrowdGenerator::hashBranchTransform( const ScenePath &parentPath, cons // "/agents////..." AgentScope scope( context, branchPath ); variationsPlug()->transformPlug()->hash( h ); - inPlug()->attributesPlug()->hash( h ); - inPlug()->objectPlug()->hash( h ); h.append( branchPath[3] ); } } @@ -544,7 +515,7 @@ bool AtomsCrowdGenerator::affectsBranchAttributes( const Gaffer::Plug *input ) c void AtomsCrowdGenerator::hashBranchAttributes( const ScenePath &parentPath, const ScenePath &branchPath, const Gaffer::Context *context, MurmurHash &h ) const { - if( branchPath.size() < 1 ) + if( branchPath.size() < 2 ) { // "/" or "/agents" h = outPlug()->attributesPlug()->defaultValue()->Object::hash(); @@ -823,6 +794,7 @@ bool AtomsCrowdGenerator::affectsBranchObject( const Gaffer::Plug *input ) const { return ( input == variationsPlug()->objectPlug() || input == variationsPlug()->attributesPlug() || + input == variationsPlug()->transformPlug() || input == inPlug()->objectPlug() || input == inPlug()->attributesPlug() || input == clothCachePlug()->objectPlug() || @@ -842,6 +814,7 @@ void AtomsCrowdGenerator::hashBranchObject( const ScenePath &parentPath, const S clothCachePlug()->objectPlug()->hash( h ); AgentScope instanceScope( context, branchPath ); variationsPlug()->objectPlug()->hash( h ); + variationsPlug()->transformPlug()->hash( h ); inPlug()->attributesPlug()->hash( h ); inPlug()->objectPlug()->hash( h ); atomsPoseHash( parentPath, branchPath, context, h );