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