Dependence Cache flag
-
Hi,
I'm building a dependence list on a generator, I want to know if the input object parameter is changed and/or deformed. When adding the dependence using
DIRTYFLAGS_DATA | DIRTYFLAGS_CACHE
, it does exactly that but I get a dirty cache on every single screen update, the cache flag never gets cleared. If I useDIRTYFLAGS_DATA
only, I get it dirtied only once when a parameter changes, as expected.How can I clear the dependence dirty cache flag?
My code..
op->NewDependenceList(); for ( auto child = op->GetDown() ; child != nullptr ; child = child->GetNext() ) { BaseObject* dependence = nullptr; if ( ValidateChildMesh( child->GetType() ) ) { dependence = child; } if ( dependence != nullptr ) { //op->AddDependence( hh, dependence, DIRTYFLAGS_DATA ); op->AddDependence( hh, dependence, DIRTYFLAGS_DATA | DIRTYFLAGS_CACHE ); } } if ( !dirty ) { dirty = !op->CompareDependenceList(); } op->TouchDependenceList(); // Hide dependences if ( !dirty ) { auto cache = op->GetCache(hh); return cache; } // Generate....
-
Hello Roger,
I'm terribly sorry, it's again you who has to wait longer than usual for an answer. Somehow you have a knack for the more difficult questions...
In general your code is correct. Internally
AddDependence()
is mainly used without any flags.
Unfortunately the behavior of these flags and dirtiness in general currently also depends on the type and hierarchy of input objects. If you really need to improve beyond what you have already, then it will certainly involve adaption to very specific cases. Something where I can unfortunately not provide a general answer, but we'd need to discuss these cases separately.As an example Maxime elaborates a bit on the special case of the MoGraph Matrix object in this thread: Getting MoData in GVO of a ObjectData Plugin.
Cheers,
Andreas -
Hey @a_block ,
I finally got some time to try again, and I actually had two problems
First, I'm adding that object as a dependent because one of my modifiers need it, and it was sending a Join modeling command to read it as a single polygon. The command was invalidating the cache, entering a loop. Now I first clone it before join, and the cache flag remains intact.
Just looking at the CACHE dirty count of the object was not enough to detect if the deform cache was dirty, I need to look at it's cache dirty cache count. Sounds weird but works, and makes sense to me.
if ( distributionObject != nullptr ) { // Check deformed cache auto distributionObjectCache = distributionObject->GetCache( hh ); if ( distributionObjectCache != nullptr ) { auto dirtyCount = distributionObjectCache->GetDirty( DIRTYFLAGS_CACHE ); if ( distributionObjectDirtyCount_ != dirtyCount ) { dirty = true; distributionObjectDirtyCount_ = dirtyCount; } } } op->AddDependence( hh, distributionObject, DIRTYFLAGS_DATA | DIRTYFLAGS_CACHE ); }