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)?

    Thanks,



  • 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;  
              op->SetDirty(DIRTYFLAGS_DATA);  
              // A data change constitutes a need to recreate Mass-Spring System  
              needInitMassSpring =    TRUE;  
              return;  
          }  
      }  
      
      // 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;  
      op->SetDirty(DIRTYFLAGS_DATA);  
    }
    


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

    Hi Robert,

    Thanks for sharing the solution.


Log in to reply