Priority issues reading splines for a TagObject

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