Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    Priority issues reading splines for a TagObject

    Scheduled Pinned Locked Moved SDK Help
    1 Posts 0 Posters 161 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 26/07/2011 at 16:07, xxxxxxxx wrote:

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

      ---------
      Hi again,
      I'm working on a Spline IK system. Over all it works fine, but there's a one-frame lag with the splines it's reading. So far, the only way it calculates correctly is if I set the priority of my tag to  Generator.

      Here's the code I'm using:

        
      #define ID_GSPLINEIK 1027376  
      #include "c4d.h"  
      #include "c4d_symbols.h"  
      #include "customgui_splinecontrol.h"//for spline thingies, range-mapped stuff  
      #include "c4d_customdatatype.h"  
      #include "lib_splinehelp.h"  
        
      #include "ogsplineik.h"  
        
      class GSplineIK : public TagData{  
        
      public:  
      virtual LONG			Execute				(PluginTag* tag, BaseDocument* doc, BaseObject* op, BaseThread* bt, LONG priority, LONG flags);  
      virtual Bool			Message				(GeListNode *node, LONG type, void *t_data);  
      virtual Bool			GetDEnabling		(GeListNode *node, const DescID &id, const GeData &t_data, LONG flags, const BaseContainer *itemdesc);  
        
      static NodeData		*Alloc				(void)	{ return gNew GSplineIK; }  
      };  
      //////////////////////////////////////////////////////////  
      LONG GSplineIK::Execute(PluginTag* tag, BaseDocument* doc, BaseObject* op, BaseThread* bt, LONG priority, LONG flags){  
      BaseContainer	*data		= tag->GetDataInstance();  
      BaseObject		*rail		= data->GetObjectLink(SPLIK_RAIL, doc),  
      *spl		= data->GetObjectLink(SPLIK_SPLINE, doc);  
        
      if (!spl) return EXECUTION_RESULT_OK;//don't run without a spline  
        
        LONG i,  
      j,  
      jointcount	= 0,  
      splseg = data->GetLong(SPLIK_SPLINESEG),  
      railseg = data->GetLong(SPLIK_RAILSEG);  
        
      spl->Message(MSG_POINTS_CHANGED);//doesn't seem to help...  
      SplineObject*	splobj = spl->GetRealSpline();  
      splobj->InitLength(splseg);//used to get dimensions of spline  
        
      BaseObject		*temp		= (BaseObject* )data->GetLink(SPLIK_TIP, doc),  
      *tempnext;  
        
      AtomArray		*list		= AtomArray::Alloc();  
        
      while(temp != NULL){// get a list of objects in the chain  
      jointcount ++;  
      list->Append(temp);  
      if(temp == op) break;  
      temp = temp->GetUp();  
      }  
        
      if(jointcount < 2){// don't calculate unless there's at least two objects in the chain  
      list->Free(list);  
      return EXECUTION_RESULT_OK;  
      }  
        
        Matrix joint1Mg,  
      joint2Mg,  
      jointupMg,  
      railMg;  
        
        Vector jointrot;  
        
      Real			*bonelen,  
      start,  
      end,  
      splinelen = splobj->GetLength();  
        
      SplineHelp	*railh = SplineHelp::Alloc();//used to get matrixes/vectors from spline  
      railh->InitSpline(rail, 0.0, FALSE, TRUE, FALSE, FALSE);//rail spline  
        
      SplineHelp	*splh = SplineHelp::Alloc();  
      if(rail != NULL){//use rail spline if it exists, ignore if it doesn't  
      splh->InitSpline(spl, 0.0, rail, TRUE, FALSE, FALSE);  
      }else{  
      splh->InitSpline(spl);  
      }  
        
      if(data->GetLong(SPLIK_LENGTHMODE) == SPLIK_USEPERCENT){  
        start	= data->GetReal(SPLIK_PERCENTOFF),
        end		= data->GetReal(SPLIK_PERCENTLEN);  
      }else{  
      if(splinelen > 0.0){//catch division by zero  
      start	= data->GetReal(SPLIK_METEROFF)/splinelen;  
      end		= data->GetReal(SPLIK_METERLEN)/splinelen;  
      }else{  
      start	= 0.0;  
      end		= 1.0;  
      }  
      }  
        
      temp = (BaseObject* )list->GetIndex(jointcount - 1);//GET HIGHEST ITEM FROM CHAIN  
      temp->SetMg(splh->GetMatrix(start + 0.0/(jointcount - 1), splseg, TRUE, TRUE));//GET MATRIX FOR CALCULATIONS  
        
      ///////////////////////////////////////////////////////////////  
      //  
        // matrix calculations here, change coordinates of hierarchy  
      //  
      ///////////////////////////////////////////////////////////////  
        
      railh->Free(railh);  
      splh->Free(splh);  
      list->Free(list);  
      splobj->FreeLength();  
      return EXECUTION_RESULT_OK;  
      }  
      //////////////////////////////////////////////////////////  
      Bool GSplineIK::Message(GeListNode *node, LONG type, void *t_data){  
      if(type == MSG_DESCRIPTION_CHECKDRAGANDDROP){  
      DescriptionCheckDragAndDrop *dcu = static_cast<DescriptionCheckDragAndDrop*>(t_data);  
      switch (dcu->id[0].id){  
      case SPLIK_SPLINE:  
      case SPLIK_RAIL:  
      dcu->result = dcu->element->GetInfo() & OBJECT_ISSPLINE;  
      return TRUE;  
      }  
      }  
      return TRUE;  
      }  
      //////////////////////////////////////////////////////////  
      Bool GSplineIK::GetDEnabling(GeListNode *node, const DescID &id,const GeData &t_data,LONG flags,const BaseContainer *itemdesc)  
      {  
      itemdesc; flags; t_data;  
        
      BaseContainer &data = *((BaseObject* )node)->GetDataInstance();  
      switch (id[0].id){  
      case SPLIK_PERCENTOFF:	return (data.GetLong(SPLIK_LENGTHMODE) == SPLIK_USEPERCENT);  
      case SPLIK_PERCENTLEN:	return (data.GetLong(SPLIK_LENGTHMODE) == SPLIK_USEPERCENT);  
      case SPLIK_METEROFF:	return (data.GetLong(SPLIK_LENGTHMODE) == SPLIK_USEMETER);  
      case SPLIK_METERLEN:	return (data.GetLong(SPLIK_LENGTHMODE) == SPLIK_USEMETER); }  
        
      return TRUE;  
      }  
      //////////////////////////////////////////////////////////  
        
      Bool RegisterGSplineIK(void){  
      return RegisterTagPlugin(ID_GSPLINEIK,"GRig SplineIK",  
      TAG_EXPRESSION|TAG_VISIBLE|TAG_MULTIPLE,  
      GSplineIK::Alloc,"Ogsplineik",  
      "gsplineik_icon.tif", 0);  
      }
      

      This is my first time using SplineHelp Class and I'm guessing it might be causing the issue, though I can't be sure.
      Has anyone experienced something similar to my problem?
      regards,
      -gene

      1 Reply Last reply Reply Quote 0
      • First post
        Last post