Mass-spring system updating

On 25/02/2013 at 02:22, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   R12 
Platform:   Windows  ;   Mac OSX  ; 
Language(s) :     C++  ;

In order to perform some soft-body deformations using a deformer object, I want to use a mass-spring system applied to the vertices and edges of the polygonized mesh sent to ModifyObject().  My problem is that I definitely do not want to create the mass-spring system every time ModifyObject() is called but only initially and when there are changes to the object being deformed that might require a rebuild of the system.  Would GetDirty(DIRTYFLAGS_DATA) be enough?  What if the user edits the mesh in some way (for already polygon objects)?  What messages might I be looking for in my deformer object from its 'parent' (if any)?


On 28/02/2013 at 12:43, xxxxxxxx wrote:

No one?  I had an inkling that checking for DIRTYFLAGS_DATA in ModifyObject() wouldn't work.  It updates the system constantly because it is always dirty.  It only needs to be done if the user changes some property or the mesh - really, not just to kick in ModifyObject().

Any takers?

On 28/02/2013 at 14:01, xxxxxxxx wrote:

Alrighty, then.  After a bit of experimentation, this works the best.  I provide this to alleviate the suffering of others in the future. :)

Note: the mass-spring system is created/recreated in ModifyObject() only because I get a ready-made polygon object.

// ObjectData.CheckDirty  
void DeformerObj::CheckDirty(BaseObject* op, BaseDocument* doc)  
  if (!doc)                        return;  
  if (!op)                        return;  
  // Check Deformed object  
  BaseObject*        dop =            op->GetUp();  
  if (dop)  
      ULONG        dd =            dop->GetDirty(DIRTYFLAGS_MATRIX|DIRTYFLAGS_DATA);  
      if (dd != dDirty)  
          dDirty =    dd;  
          // A data change constitutes a need to recreate Mass-Spring System  
          needInitMassSpring =    TRUE;  
  // Check Collider object  
  BaseContainer*    bc =            op->GetDataInstance();  
  if (!bc)                        return;  
  // - Get linked object  
  BaseObject*        lop =            (BaseObject* )bc->GetLink(DEFORMER_OBJECT, doc, Obase);  
  if (!lop)                        return;  
  ULONG            dirtyness =        lop->GetDirty(DIRTYFLAGS_MATRIX|DIRTYFLAGS_DATA);  
  // - Linked object is not dirty  
  if (dirtyness == cDirty)        return;  
  // - is dirty  
  cDirty =                        dirtyness;  

On 01/03/2013 at 00:08, xxxxxxxx wrote:

Hi Robert,

Thanks for sharing the solution.