Free and Alloc called several times



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

    On 06/05/2008 at 04:33, xxxxxxxx wrote:

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

    ---------
    Hi, a general question: is it usual for a tag plugin that alloc is called several times? Everytime I send a message by clicking in the attribute manager the alloc function is called, though it is not used anywhere in the code.

    Additionally when activating e.g. a checkbox in the attribute manager and I do an undo call, the view isn't refreshed until the tag is deactivated and activated again.

    Any ideas?



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

    On 13/05/2008 at 03:52, xxxxxxxx wrote:

    Really no idea? Every time I drag a slider or activate a checkbox "alloc tag" is called. This leads to some serious problems with undoing. Some help would be fantastic... Thx



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

    On 13/05/2008 at 06:06, xxxxxxxx wrote:

    Can you post some source code because I can not really follow you here?

    cheers,
    Matthias



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

    On 13/05/2008 at 06:19, xxxxxxxx wrote:

    The Alloc and Free-Functions:

    > <code>
    >
    >           static NodeData *Alloc(void) { GePrint ("Alloc MoCap");return gNew MoCap;}
    >
    >           virtual void Free(GeListNode *node){SetBackIDs(node); GePrint ("Free MoCap");
    > </code>

    The Message-Function. Everytime I hit the "Add Bone"-button and Undo afterwards, the Attribute Manager doesn't refresh until I select and deselect. Also, the Free-method is called...

    > <code>
    > Bool MoCap::Message (GeListNode *node, LONG type, void *data)
    > {
    >      BaseDocument *doc=node->GetDocument();
    >      BaseTag          *tag = (BaseTag* )node;     //Mocap Tag
    >      BaseContainer *bc = tag->GetDataInstance();
    >      switch (type)
    >      {
    > //...
    >                if (dc->id[0].id==ADD_BONE_BUTTON)
    >                {
    >                     GePrint ("Add bone button");
    >                     long jointCount = bc->GetLong (DESC_COUNTER)+1;
    >                     doc->StartUndo();
    >                     doc->AddUndo(UNDO_CHANGE, tag);
    >                     bc->SetLong (DESC_COUNTER, jointCount);
    >                     bc->SetLink (JOINTS + jointCount - 1, NULL);
    >                     bc->SetLink(JOINT_PARENTS + jointCount - 1, NULL);
    >                     doc->EndUndo();
    >                     EventAdd();
    >                     break;
    >                }
    >               
    >                if (dc->id[0].id==REMOVE_BONE_BUTTON)
    >                {
    >                     GePrint ("Remove Bone button");
    >                     doc->StartUndo();
    >                     if (bc->GetLong (DESC_COUNTER) >0){
    >                          long jointCount = bc->GetLong (DESC_COUNTER)-1;
    >                          bc->SetLong (DESC_COUNTER, jointCount);
    >                          doc->AddUndo(UNDO_CHANGE, tag);
    >                     }
    >                     doc->EndUndo();
    >                     EventAdd();
    >                     break;
    >                }
    >
    > //...
    >
    >      return TRUE;
    > }
    > </code>

    Apparently, while undoing the first tag instance is deleted. As previously posted, Cinema generates new instances when doing something in the Attribute Manager. but why?

    Thx



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

    On 13/05/2008 at 09:14, xxxxxxxx wrote:

    So, here's the entire code though I don't think anyone wants to read this whole stuff.

    > <code>
    >
    >
    > #include "c4d.h"
    > #include "c4d_symbols.h"
    > #include "c4d_gui.h"
    > #include "tmoCap.h"
    > #include <string.h>
    > #include <stdio.h>
    > #include <stdlib.h>
    > #include <iostream>
    > #include <sstream>
    > #include <vector>
    > #include <lib_ca.h>
    > using namespace std;
    > using std::cout;
    >
    >
    >
    > #include "lib_description.h"
    > #include "customgui_priority.h"
    >
    >
    >
    >
    >
    > class MoCap : public TagData
    > {
    >      public:
    >
    >           static int instance;
    >
    >           virtual Bool Init(GeListNode *node);
    >
    >           virtual Bool SetAllIDs (BaseDocument *doc);
    >
    >           virtual LONG Execute(PluginTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, LONG flags);
    >
    >      //     virtual string longToStr (long l);
    >           
    >           virtual String boolToStr (bool b);
    >
    >           virtual Bool GetDDescription(GeListNode* node, Description* description, LONG& flags);
    >
    >           virtual Bool activeChildren (BaseTag *tag);
    >
    >           virtual Bool Message (GeListNode *node, LONG type, void *data);
    >           
    >           virtual LONG NumberOfChildren(BaseObject *obj);
    >
    >           virtual Vector CalcMiddle (BaseTag *tag, BaseTime time);
    >
    >           virtual Bool generateObject(BaseTag *tag);
    >
    >           virtual Bool generateJoint (BaseTag *tag);
    >
    >           virtual BaseObject * FindParent (BaseLink *parentLink);
    >
    >           virtual Vector SetChildCoordinates (CAJointObject *JointObject, Vector PosJoint);
    >
    >           virtual void SetBackIDs(GeListNode *node);
    >
    >           static NodeData *Alloc(void) { GePrint ("Alloc MoCap");return gNew MoCap;}
    >
    >           virtual void Free(GeListNode *node){SetBackIDs(node); GePrint ("Free MoCap");}
    >
    >
    >           
    >      private:
    >
    >           long counter;
    >
    >           long uniqueIP;
    >
    >           vector <BaseObject*>children;
    >
    >           BaseObject *jointOrigin;
    >
    > };
    >
    > int MoCap::instance = 0;
    >
    > Bool MoCap::Init(GeListNode *node)
    > {
    >      GePrint ("Init");
    >      BaseDocument *doc = GetActiveDocument();
    >      BaseTag                    *tag = (BaseTag* )node;     //initialisierter Tag
    >      BaseContainer *data = tag->GetDataInstance();     //zugehöriger Container
    >
    >      GeData d;
    >      if (node->GetParameter(DescLevel(EXPRESSION_PRIORITY),d,0))
    >      {
    >           PriorityData *pd = (PriorityData* )d.GetCustomDataType(CUSTOMGUI_PRIORITY_DATA);
    >           if (pd) pd->SetPriorityValue(PRIORITYVALUE_CAMERADEPENDENT,GeData(TRUE));
    >           node->SetParameter(DescLevel(EXPRESSION_PRIORITY),d,0);
    >      }
    >      data->SetBool(USE_CHECKBOX, TRUE);
    >      data->SetLong (DESC_COUNTER, 0);
    >      data->SetBool (DESC_NO_ORIGIN, TRUE);
    >      data->SetLong(DESC_INSTANCE, instance);
    >
    >      instance++;
    >
    >      Bool result = SetAllIDs (doc);
    >
    >      jointOrigin = NULL;
    >      uniqueIP = 0;
    >      return TRUE;
    > }
    >
    > Bool MoCap::SetAllIDs (BaseDocument *doc){
    >      BaseObject * op = doc->GetFirstObject();
    >
    >      if (op == NULL)
    >           return FALSE;
    >
    >      BaseContainer *opContainer = op->GetDataInstance();
    >      opContainer->SetLong (DESC_JOINT_ID, 0);
    >      BaseObject *current;
    >      Bool used;
    >
    >      while (op!= NULL){
    >           current = op->GetDown();
    >           if (current == NULL)
    >                current = op->GetNext();
    >           if (current == NULL)
    >                break;
    >           opContainer = current->GetDataInstance();
    >           used = opContainer->GetBool (DESC_USED);
    >           if (!used)
    >                opContainer->SetLong (DESC_JOINT_ID, 0);
    >           op = current;
    >           }
    >      return TRUE;
    > }
    >
    > Bool MoCap::GetDDescription(GeListNode* node, Description* description, LONG& flags){     
    >      
    >      if (!description->LoadDescription(node->GetType())) return FALSE;
    >      
    >      BaseTag                    *tag = (BaseTag* )node;     //initialisierter Tag
    >      BaseContainer *data = tag->GetDataInstance();     //zugehöriger Container
    >      BaseDocument *doc=node->GetDocument();
    >
    >      BaseContainer locked = GetCustomDataTypeDefault(DTYPE_BOOL);
    >      locked.SetString(DESC_NAME, "SPECIAL Locked");
    >      locked.SetBool (DESC_DEFAULT, TRUE);
    >
    >      if(!description->SetParameter(DescLevel(USE_CHECKBOX, DTYPE_BOOL, 0), locked, DescLevel(MAIN_GROUP))) return TRUE;
    >
    >      BaseContainer count = GetCustomDataTypeDefault(DTYPE_LONG);
    >      count.SetString(DESC_NAME, "Count");
    >      if (!description->SetParameter(DescLevel(NUMBER_OF_CHILDREN, DTYPE_LONG, 0), count, DescLevel(MAIN_GROUP))) return TRUE;
    >
    >      BaseContainer trackers = GetCustomDataTypeDefault(DTYPE_GROUP);
    >      trackers.SetString(DESC_NAME, "Trackers");
    >      if (!description->SetParameter(DescLevel(TRACKER_TYPE_GROUP, DTYPE_GROUP, 0), trackers, DescLevel(MAIN_GROUP))) return TRUE;
    >
    >
    >      long i;
    >      bool mergeable;
    >      Real mergeValue;
    >
    >      BaseObject *currentObject = (BaseObject* ) node;
    >      BaseContainer *currentContainer = currentObject->GetDataInstance();
    >
    >      BaseContainer currentLayout = GetCustomDataTypeDefault (DTYPE_GROUP);
    >      BaseContainer firstColumn = GetCustomDataTypeDefault (DTYPE_GROUP);
    >      BaseContainer secondColumn = GetCustomDataTypeDefault (DTYPE_GROUP);
    >      BaseContainer thirdColumn = GetCustomDataTypeDefault (DTYPE_GROUP);
    >
    >      BaseContainer box = GetCustomDataTypeDefault(DTYPE_BOOL);
    >      BaseContainer slider = GetCustomDataTypeDefault(DTYPE_REAL);
    >      BaseContainer boxNames = GetCustomDataTypeDefault(DTYPE_STATICTEXT);
    >
    >      slider.SetLong (DESC_CUSTOMGUI,CUSTOMGUI_REALSLIDER);
    >      slider.SetReal (DESC_MIN, 0.0);
    >      slider.SetReal (DESC_MAX, 1.0);
    >      slider.SetReal (DESC_STEP, 0.01);
    >      slider.SetLong(DESC_UNIT,DESC_UNIT_PERCENT);
    >      slider.SetLong(DESC_ANIMATE,DESC_ANIMATE_ON);
    >      slider.SetBool (DESC_ALIGNLEFT, TRUE);
    >
    >
    >      box.SetBool(DESC_DEFAULT, FALSE);
    >
    >      currentLayout.SetBool(DESC_LAYOUTGROUP, TRUE);
    >      currentLayout.SetLong(DESC_COLUMNS, 3);
    >
    >      for (i = 0; i<counter; i++){
    >
    >           currentObject = children _;
    >
    >           if (currentObject->GetType() == Onull){
    >                currentContainer = currentObject->GetDataInstance();
    >
    >
    >                if(!description->SetParameter(DescLevel(ROW_GROUPS + i, DTYPE_GROUP, 0), currentLayout, DescLevel(TRACKER_TYPE_GROUP))) return TRUE;
    >               
    >                if(!description->SetParameter(DescLevel(FIRST_COLUMN_GROUPS + i, DTYPE_GROUP, 0), firstColumn, DescLevel(ROW_GROUPS + i))) return TRUE;
    >                if(!description->SetParameter(DescLevel(ENABLE_BOXES + i, DTYPE_BOOL, 0), box, DescLevel(FIRST_COLUMN_GROUPS + i))) return TRUE;
    >
    >                mergeable = currentContainer->GetBool(DESC_MERGEABLE);
    >                data->SetBool(ENABLE_BOXES + i, mergeable);
    >
    >                if(!description->SetParameter(DescLevel(SECOND_COLUMN_GROUPS + i, DTYPE_GROUP, 0), secondColumn, DescLevel(ROW_GROUPS + i))) return TRUE;
    >                if(!description->SetParameter(DescLevel(WEIGHT_SLIDERS + i, CUSTOMGUI_REALSLIDER, 0), slider, DescLevel(SECOND_COLUMN_GROUPS + i))) return TRUE;
    >           
    >                mergeValue = currentContainer->GetReal(DESC_MERGE_VALUE);
    >                data->SetReal (WEIGHT_SLIDERS + i, mergeValue);
    >           
    >                String aktName = currentObject->GetName();
    >                boxNames.SetString (DESC_NAME, aktName);
    >
    >                if(!description->SetParameter(DescLevel(THIRD_COLUMN_GROUPS + i, DTYPE_GROUP, 0), thirdColumn, DescLevel(ROW_GROUPS + i))) return TRUE;
    >                if(!description->SetParameter(DescLevel(BOX_NAMES + i, DTYPE_STATICTEXT, 0), boxNames, DescLevel(THIRD_COLUMN_GROUPS + i))) return TRUE;
    >
    >           }
    >      }
    >
    >      if (counter > 0){
    >
    >           BaseTime endOfDoc = doc->GetMaxTime();
    >           long docFps = doc->GetFps();
    >           long frames = endOfDoc.GetFrame(docFps);
    >
    >           BaseContainer start = GetCustomDataTypeDefault(DTYPE_LONG);
    >           start.SetString(DESC_NAME, "Start");
    >           start.SetLong (DESC_MIN, 0);
    >           start.SetLong (DESC_MAX, frames);
    >           if (!description->SetParameter(DescLevel(KEY_START, DTYPE_LONG, 0), start, DescLevel(TRACKER_TYPE_GROUP))) return TRUE;
    >
    >           BaseContainer ende = GetCustomDataTypeDefault(DTYPE_LONG);
    >           ende.SetString(DESC_NAME, "Ende");
    >           ende.SetLong (DESC_MIN, 0);
    >           ende.SetLong (DESC_MAX, frames);
    >           if (!description->SetParameter(DescLevel(KEY_ENDE, DTYPE_LONG, 0), ende, DescLevel(TRACKER_TYPE_GROUP))) return TRUE;
    >
    >           BaseContainer apply = GetCustomDataTypeDefault(DTYPE_BUTTON);
    >           apply.SetString (DESC_NAME, "Apply");
    >           apply.SetData(DESC_CUSTOMGUI, CUSTOMGUI_BUTTON);
    >           if (!description->SetParameter(DescLevel(APPLY_BUTTON, DTYPE_BUTTON, 0), apply, DescLevel(TRACKER_TYPE_GROUP))) return TRUE;
    >      }
    >
    >      if (counter > 0){
    >
    >           BaseContainer boneConnections = GetCustomDataTypeDefault(DTYPE_GROUP);
    >           boneConnections.SetString(DESC_NAME, "Bone Connections");
    >           if (!description->SetParameter(DescLevel(BONE_TYPE_GROUP, DTYPE_GROUP, 0), boneConnections, DescLevel(MAIN_GROUP))) return TRUE;
    >
    >
    >           BaseContainer jointLink = GetCustomDataTypeDefault(DTYPE_GROUP);
    >           jointLink.SetLong (DESC_COLUMNS, 2);
    >
    >           BaseContainer joint = GetCustomDataTypeDefault(DTYPE_BASELISTLINK);
    >           joint.SetString (DESC_NAME, "Joint");
    >
    >           BaseContainer jointParent = GetCustomDataTypeDefault(DTYPE_BASELISTLINK);
    >           jointParent.SetString (DESC_NAME, "Parent");
    >
    >           long jointCount = data->GetLong (DESC_COUNTER);
    >           
    >           for (long i = 0; i<jointCount; i++){
    >                if (!description->SetParameter(DescLevel(BONE_ROW_GROUPS + i, DTYPE_GROUP, 0), jointLink, DescLevel(BONE_TYPE_GROUP))) return TRUE;
    >                if (!description->SetParameter(DescLevel(JOINTS + i, DTYPE_BUTTON, 0), joint, DescLevel(BONE_ROW_GROUPS + i))) return TRUE;
    >                if (!description->SetParameter(DescLevel(JOINT_PARENTS + i, DTYPE_BUTTON, 0), jointParent, DescLevel(BONE_ROW_GROUPS + i))) return TRUE;
    >           }
    >           
    >           BaseContainer addBone = GetCustomDataTypeDefault(DTYPE_BUTTON);
    >           addBone.SetString (DESC_NAME, "Add Joint");
    >           addBone.SetData(DESC_CUSTOMGUI, CUSTOMGUI_BUTTON);
    >           if (!description->SetParameter(DescLevel(ADD_BONE_BUTTON, DTYPE_BUTTON, 0), addBone, DescLevel(BONE_TYPE_GROUP))) return TRUE;
    >           
    >           BaseContainer addChild = GetCustomDataTypeDefault(DTYPE_BUTTON);
    >           addChild.SetString (DESC_NAME, "Remove Joint");
    >           addChild.SetData(DESC_CUSTOMGUI, CUSTOMGUI_BUTTON);
    >           if (!description->SetParameter(DescLevel(REMOVE_BONE_BUTTON, DTYPE_BUTTON, 0), addChild, DescLevel(BONE_TYPE_GROUP))) return TRUE;
    >           
    >           BaseContainer genBone = GetCustomDataTypeDefault(DTYPE_BUTTON);
    >           genBone.SetString (DESC_NAME, "Generate");
    >           genBone.SetData(DESC_CUSTOMGUI, CUSTOMGUI_BUTTON);
    >           if (!description->SetParameter(DescLevel(GENERATE_BONE_BUTTON, DTYPE_BUTTON, 0), genBone, DescLevel(BONE_TYPE_GROUP))) return TRUE;
    >
    >      }
    >
    >
    >      flags |= DESCFLAGS_DESC_LOADED;
    >
    >      return TRUE;
    > }
    >
    >
    >
    >
    > LONG MoCap::Execute(PluginTag *tag, BaseDocument *doc, BaseObject *op, BaseThread *bt, LONG priority, LONG flags)
    > {
    >      
    >      BaseContainer *data = tag->GetDataInstance();     //zugehöriger Container
    >
    >      children.clear();
    >      counter = NumberOfChildren (op);
    >
    >
    >
    >      data->SetReal (6004, counter);
    >      return EXECUTION_RESULT_OK;
    > }
    >
    > LONG MoCap::NumberOfChildren(BaseObject *obj){
    >
    >      BaseObject *current = NULL;
    >      current = obj->GetDown();
    >
    >      long trackers = 0;
    >      
    >      while (current != NULL)
    >      {
    >           if (current->GetType() ==Onull){
    >                trackers ++;
    >                children.push_back (current);
    >           }
    >           current = current->GetNext();
    >      }
    >
    >
    >      return trackers;
    >
    > }
    >
    > Bool MoCap::generateObject (BaseTag *tag){
    >
    >      BaseDocument *doc=tag->GetDocument();
    >      doc->StartUndo();
    >      GePrint ("StartUndo");
    >      BaseObject *parent = tag->GetObject();
    >      BaseContainer *data = tag->GetDataInstance();
    >      BaseObject *newObject = BaseObject::Alloc (Onull);
    >
    >      Real difference;
    >      Real start_value = data->GetLong (KEY_START);
    >      Real end_value = data->GetLong (KEY_ENDE);
    >      if (start_value > end_value)
    >           return FALSE;
    >      difference = end_value - start_value +1;
    >
    >      newObject->InsertUnderLast (parent);
    >      doc->AddUndo(UNDO_NEW, newObject);
    >
    >      CKey *keyX;
    >      CKey *keyY;
    >      CKey *keyZ;
    >      Vector result;
    >      BaseTime time;
    >      long frameRate = doc->GetFps();
    >
    >      CTrack *trackX = CTrack::Alloc(newObject,DescID(DescLevel(ID_BASEOBJECT_POSITION,DTYPE_VECTOR,0),DescLevel(VECTOR_X,DTYPE_REAL,0)));
    >      if (!trackX ) return FALSE;
    >      CTrack *trackY = CTrack::Alloc(newObject,DescID(DescLevel(ID_BASEOBJECT_POSITION,DTYPE_VECTOR,0),DescLevel(VECTOR_Y,DTYPE_REAL,0)));
    >      if (!trackY ) return FALSE;
    >      CTrack *trackZ = CTrack::Alloc(newObject,DescID(DescLevel(ID_BASEOBJECT_POSITION,DTYPE_VECTOR,0),DescLevel(VECTOR_Z,DTYPE_REAL,0)));
    >      if (!trackZ ) return FALSE;
    >      newObject->InsertTrackSorted(trackX);
    >      newObject->InsertTrackSorted(trackY);
    >      newObject->InsertTrackSorted(trackZ);
    >
    >      for (long i = 0; i<difference; i++){
    >           time = BaseTime (start_value, frameRate);
    >           result = CalcMiddle (tag, time);
    >           newObject->SetPos(result);
    >
    >           keyX = trackX->GetCurve()->AddKey(time);
    >           if (!keyX) return FALSE;
    >           keyX->SetValue(trackX->GetCurve(),result.x);
    >
    >           keyY = trackY->GetCurve()->AddKey(time);
    >           if (!keyY) return FALSE;
    >           keyY->SetValue(trackY->GetCurve(),result.y);
    >
    >           keyZ = trackZ->GetCurve()->AddKey(time);
    >           if (!keyZ) return FALSE;
    >           keyZ->SetValue(trackZ->GetCurve(),result.z);
    >           start_value++;
    >      }
    >      //doc->EndUndo();
    >
    >      return TRUE;
    > }
    >
    > Bool MoCap::generateJoint(BaseTag *tag){
    >
    >      GePrint ("Generate Joint");
    >
    >      BaseDocument *doc=tag->GetDocument();
    >      doc->StartUndo();
    >      GePrint ("StartUndo");
    >      BaseContainer *data = tag->GetDataInstance();
    >      BaseObject *object = tag->GetObject();
    >      Real inst = data->GetLong (DESC_INSTANCE);    
    >      
    >      GePrint ("instance:");
    >      GePrint (RealToString(inst));
    >
    >      BaseObject *parent = NULL;
    >
    >      Bool noOrigin = data->GetBool (DESC_NO_ORIGIN);
    >
    >      if(noOrigin){
    >
    >           GePrint ("No Origin");
    >           BaseObject *origin = BaseObject::Alloc(Onull);
    >           origin->SetName ("Joint Hierarchy");
    >           jointOrigin = origin;
    >           doc->InsertObject (jointOrigin, NULL, NULL);
    >
    >           doc->AddUndo(UNDO_NEW, origin);
    >
    >           BaseTag *oTag = PluginTag::Alloc(10005);
    >
    >           BaseContainer *originContainer = oTag->GetDataInstance();
    >           originContainer->SetBool (DESC_ORIGIN, TRUE);
    >           originContainer->SetLink (DESC_TAGLINK, tag);
    >           origin->InsertTag(oTag);
    >
    >           data->SetBool (DESC_NO_ORIGIN, FALSE);
    >      }
    >
    >
    >      long jointCount = data->GetLong (DESC_COUNTER);
    >           
    >      BaseTime time;
    >
    >      BaseObject *tracker;
    >      BaseContainer *trackerContainer;
    >
    >      BaseLink *jointLink = NULL;
    >      BaseLink *parentLink = NULL;
    >
    >      for (long i = 0; i < jointCount; i++){
    >           jointLink = data->GetBaseLink (JOINTS + i);
    >           parentLink = data->GetBaseLink (JOINT_PARENTS + i);
    >      
    >      
    >           if (jointLink->GetLink(doc)!= NULL){
    >                GePrint ("GotBaseLink");
    >
    >                tracker = (BaseObject * )jointLink->GetLink (doc);
    >                if (parentLink != NULL)
    >                     parent = (BaseObject * )parentLink->GetLink (doc);
    >                trackerContainer = tracker->GetDataInstance();
    >
    >                Bool used = trackerContainer->GetBool (DESC_USED);
    >               
    >                if (!used){
    >               
    >                     uniqueIP++;
    >
    >                     CAJointObject *jointObject = CAJointObject::Alloc ();
    >                     doc->AddUndo(UNDO_NEW, jointObject);
    >
    >                     String name = tracker->GetName();
    >                     jointObject->SetName(name);
    >
    >                     GePrint ("name");
    >                     GePrint (name);
    >
    >                     BaseContainer *jointContainer = jointObject->GetDataInstance();
    >                     jointContainer->SetLong (DESC_JOINT_ID, uniqueIP);
    >                     jointContainer->SetBool (DESC_USED, TRUE);
    >
    >                     trackerContainer->SetLong (DESC_JOINT_ID, uniqueIP);
    >                     trackerContainer->SetBool (DESC_USED, TRUE);
    >
    >
    >                     BaseTag *jTag = PluginTag::Alloc(10005);
    >
    >                     BaseContainer *tagContainer = jTag->GetDataInstance();
    >                     tagContainer->SetLink (DESC_COUNTERPART, tracker);
    >                     tagContainer->SetBool (DESC_ORIGIN, FALSE);
    >                     jointObject->InsertTag(jTag);
    >
    >
    >                     if (parentLink->GetLink(doc) != NULL){
    >                          parent = FindParent (parentLink);
    >                          if (parent != NULL){
    >                              BaseContainer *parentContainer = parent->GetDataInstance();
    >                              Bool equal = (parentContainer->GetLong (DESC_JOINT_ID) == trackerContainer->GetLong (DESC_JOINT_ID));
    >                              if (!equal){
    >                                    jointObject->InsertUnderLast (parent);
    >                                    GePrint ("parent != NULL");
    >                              }
    >                              else
    >                              {
    >                                    jointObject->InsertUnderLast (jointOrigin);
    >                                    GePrint ("parent == NULL");
    >                              }
    >                          }
    >                          else{
    >                              jointObject->InsertUnderLast (jointOrigin);
    >                              GePrint ("AfterInsertUnderLast");
    >                          }
    >                     }
    >                     else {
    >                          jointObject->InsertUnderLast (jointOrigin);
    >                     }
    >
    >
    >                     BaseTime endOfDoc = doc->GetMaxTime();
    >                     long docFps = doc->GetFps();
    >                     long frames = endOfDoc.GetFrame(docFps);
    >               
    >                     Vector PosJoint;     
    >                     CKey *keyX;
    >                     CKey *keyY;
    >                     CKey *keyZ;
    >
    >                     CTrack *trackX = CTrack::Alloc(jointObject,DescID(DescLevel(ID_BASEOBJECT_POSITION,DTYPE_VECTOR,0),DescLevel(VECTOR_X,DTYPE_REAL,0)));
    >                     if (!trackX ) return FALSE;
    >                     CTrack *trackY = CTrack::Alloc(jointObject,DescID(DescLevel(ID_BASEOBJECT_POSITION,DTYPE_VECTOR,0),DescLevel(VECTOR_Y,DTYPE_REAL,0)));
    >                     if (!trackY ) return FALSE;
    >                     CTrack *trackZ = CTrack::Alloc(jointObject,DescID(DescLevel(ID_BASEOBJECT_POSITION,DTYPE_VECTOR,0),DescLevel(VECTOR_Z,DTYPE_REAL,0)));
    >                     if (!trackZ ) return FALSE;
    >                     jointObject->InsertTrackSorted(trackX);
    >                     jointObject->InsertTrackSorted(trackY);
    >                     jointObject->InsertTrackSorted(trackZ);
    >
    >                     for (long i = 0; i<frames; i++){
    >                          time = BaseTime (i, docFps);
    >                          doc->SetTime (time);
    >                          doc->AnimateDocument (NULL, FALSE, TRUE);
    >                          EventAdd();
    >                          PosJoint = tracker->GetPos();
    >
    >                          jointObject->SetPos(PosJoint);
    >                          if (parent != NULL)
    >                              PosJoint = SetChildCoordinates (jointObject, PosJoint);
    >
    >                          keyX = trackX->GetCurve()->AddKey(time);
    >                          if (!keyX) return FALSE;
    >                          keyX->SetValue(trackX->GetCurve(),PosJoint.x);
    >
    >                          keyY = trackY->GetCurve()->AddKey(time);
    >                          if (!keyY) return FALSE;
    >                          keyY->SetValue(trackY->GetCurve(),PosJoint.y);
    >
    >                          keyZ = trackZ->GetCurve()->AddKey(time);
    >                          if (!keyZ) return FALSE;
    >                          keyZ->SetValue(trackZ->GetCurve(),PosJoint.z);
    >                     }
    >                }
    >           }
    >      }
    >      data->SetLong (DESC_COUNTER, 0);
    >      //doc->EndUndo();
    >      return TRUE;
    > }
    >
    >
    > BaseObject * MoCap::FindParent (BaseLink *parentLink){
    >      GePrint ("FindParent");
    >      BaseDocument *doc = GetActiveDocument();
    >      if (parentLink->GetLink(doc) == NULL){
    >           return NULL;
    >      }
    >      BaseObject *obj = (BaseObject * )parentLink->GetLink(doc);
    >      BaseContainer *objContainer = obj->GetDataInstance();
    >      long objID = objContainer->GetLong (DESC_JOINT_ID);
    >      long currID = 0;
    >      GePrint (obj->GetName());
    >      bool found = FALSE;
    >
    >      GePrint ("Origin:");
    >      if (jointOrigin ==NULL)
    >           GePrint ("NULL");
    >      BaseObject *current = jointOrigin->GetDown();
    >      GePrint ("JointOrigin->GetDown");
    >      BaseObject *next = current;
    >      BaseObject *up = current;
    >      BaseContainer *currContainer;
    >
    >      while (next != NULL){
    >           current = next;
    >           up = next;
    >           currContainer = current->GetDataInstance();
    >           currID = currContainer->GetLong (DESC_JOINT_ID);
    >           next = current->GetDown();
    >           if (next ==NULL)
    >                next = current->GetNext();
    >           if (next ==NULL){
    >                while (up != jointOrigin && next == NULL){
    >                     up = up->GetUp();
    >                     next = up->GetNext();
    >                }
    >                if (up == jointOrigin){
    >                     GePrint ("up == jointOrigin");
    >                     next = NULL;
    >                }
    >           }
    >           if (currID == objID){
    >                GePrint ("found");
    >                found = TRUE;
    >                break;
    >           }
    >      }
    >
    >      if (found)
    >           return current;
    >      else
    >           return NULL;
    > }
    >
    > Vector MoCap::SetChildCoordinates (CAJointObject *JointObject, Vector PosJoint){
    >      BaseObject *parObject = JointObject->GetUp();
    >      while (parObject != jointOrigin){
    >           PosJoint = PosJoint - parObject->GetPos();
    >           parObject = parObject->GetUp();
    >      }
    >      return PosJoint;
    > }
    >
    > Bool MoCap::Message (GeListNode *node, LONG type, void *data)
    > {
    >      BaseDocument *doc=node->GetDocument();
    >      BaseTag          *tag = (BaseTag* )node;     //Mocap Tag
    >      BaseContainer *bc = tag->GetDataInstance();
    >      switch (type)
    >      {
    >           case MSG_DESCRIPTION_COMMAND:
    >           {
    >                DescriptionCommand *dc = (DescriptionCommand* ) data;
    >                if (dc->id[0].id==APPLY_BUTTON)
    >                {
    >                     BaseObject *parent = tag->GetObject();
    >                     if (activeChildren (tag)){
    >                          Bool result = generateObject (tag);
    >                          }
    >                     //EventAdd();
    >                     break;
    >                     }
    >
    >                if (dc->id[0].id==ADD_BONE_BUTTON)
    >                {
    >                     long jointCount = bc->GetLong (DESC_COUNTER)+1;
    >                     //doc->StartUndo();
    >                     GePrint ("StartUndo");
    >                     //doc->AddUndo(UNDO_CHANGE, doc);
    >                     bc->SetLong (DESC_COUNTER, jointCount);
    >                     bc->SetLink (JOINTS + jointCount - 1, NULL);
    >                     bc->SetLink(JOINT_PARENTS + jointCount - 1, NULL);
    >                     GePrint ("Added Bone");
    >                     //doc->EndUndo();
    >                     //EventAdd();
    >                     break;
    >                }
    >               
    >                if (dc->id[0].id==REMOVE_BONE_BUTTON)
    >                {
    >                     //doc->StartUndo();
    >                     GePrint ("StartUndo");
    >                     if (bc->GetLong (DESC_COUNTER) >0){
    >                          long jointCount = bc->GetLong (DESC_COUNTER)-1;
    >                          bc->SetLong (DESC_COUNTER, jointCount);
    >                          //doc->AddUndo(UNDO_CHANGE, tag);
    >                     }
    >                     //doc->EndUndo();
    >                     //EventAdd();
    >                     break;
    >                }
    >
    >                if (dc->id[0].id==GENERATE_BONE_BUTTON)
    >                {
    >                     Bool result = generateJoint (tag);
    >                     //EventAdd();
    >                     break;
    >                }
    >
    >                }
    >           case MSG_DESCRIPTION_CHECKUPDATE:
    >                {
    >                     GePrint ("Check Update");
    >                     DescriptionCheckUpdate *dch = (DescriptionCheckUpdate* ) data;
    >                     DescID descID = *(dch->descid);
    >                     LONG paramID = descID[0].id;
    >
    >                     if (tag)
    >                     {
    >                          Bool enabled;
    >                          Real weight;
    >                          BaseObject *current = NULL;
    >                          BaseContainer *currentContainer;
    >                          current = (BaseObject* ) children[0];
    >                          long i=0;
    >                          bool changed = FALSE;
    >
    >                          while (current != NULL && !changed){
    >                              if (current->GetType() == Onull){
    >                                    currentContainer = current->GetDataInstance();
    >                                    enabled = bc->GetBool(ENABLE_BOXES + i);
    >                                    weight = bc->GetReal(WEIGHT_SLIDERS + i);
    >                                    Bool mergeable = currentContainer->GetBool (DESC_MERGEABLE);
    >                                    Real mergeValue = currentContainer->GetReal (DESC_MERGE_VALUE);
    >
    >                                    if (mergeable != enabled || mergeValue != weight){
    >                                         //doc->StartUndo();
    >                                         //GePrint ("StartUndo");
    >                                        doc->AddUndo(UNDO_CHANGE,current);
    >                                         currentContainer->SetBool (DESC_MERGEABLE, enabled);
    >                                         currentContainer->SetReal (DESC_MERGE_VALUE, weight);
    >                                         changed = TRUE;
    >                                         //doc->EndUndo();
    >                                    }
    >                              }
    >                              current = current->GetNext();
    >                              i++;
    >                          }
    >                     }
    >                     //EventAdd();
    >                     break;
    >                }
    >           case MSG_DESCRIPTION_USERINTERACTION_END:
    >                {
    >                     //GePrint ("End Undo");
    >                     //doc->EndUndo();
    >                     break;
    >                }
    >      }
    >
    >      return TRUE;
    > }
    >
    >
    > /*
    > string MoCap::longToStr (long l)
    > {
    >      ostringstream oss;
    >      oss << l;
    >      string str (oss.str());
    >      return str;
    > }
    > */
    >
    > String MoCap::boolToStr (bool b)
    > {
    >      String s;
    >      if (b==TRUE)
    >           s = "TRUE";
    >      else
    >           s = "FALSE";
    >      return s;
    > }
    >
    >
    > Bool MoCap::activeChildren (BaseTag *tag){
    >      bool activeChild = FALSE;
    >      for (long i = 0; i<counter; i++){
    >           if (tag->GetDataInstance()->GetBool(ENABLE_BOXES + i))
    >                activeChild = TRUE;
    >      }
    >      return activeChild;
    > }
    >
    >
    >
    > Vector MoCap::CalcMiddle (BaseTag *tag, BaseTime time){
    >
    >      BaseDocument *doc=GetActiveDocument();
    >      doc->SetTime (time);
    >      doc->AnimateDocument (NULL, FALSE, TRUE);
    >      EventAdd();
    >      Vector middle (0.0, 0.0, 0.0);
    >      BaseObject *current = NULL;
    >      BaseObject *parent = tag->GetObject();
    >      current = parent->GetDown();
    >      BaseContainer * data = tag->GetDataInstance();
    >
    >      bool active = FALSE;
    >      long i = 0;
    >      Real weighter = 0;
    >      
    >      while (current != NULL)
    >      {
    >           active = data->GetBool(ENABLE_BOXES + i);
    >           if (active)
    >           {
    >                Vector pos = current->GetPos();
    >                Real weight = data->GetReal(WEIGHT_SLIDERS + i);
    >
    >                middle.x += pos.x * weight;
    >                middle.y += pos.y * weight;
    >                middle.z += pos.z * weight;
    >
    >                weighter += weight;
    >           }
    >           current = current->GetNext();
    >           i++;
    >      }
    >
    >      if (weighter == 0)
    >           return NULL;
    >      else
    >      {
    >           middle /= weighter;
    >           return middle;
    >      }
    > }
    >
    >
    >
    >
    >
    > void MoCap::SetBackIDs (GeListNode *node){
    >
    >      GePrint ("SetBackIDs");
    >
    >      BaseTag *tag = (BaseTag * ) node;
    >      BaseContainer *data = tag->GetDataInstance();
    >      Real inst = data->GetLong (DESC_INSTANCE);    
    >      
    >      GePrint ("FreeInstance:");
    >      GePrint (RealToString(inst));
    >
    >      BaseObject *obj = tag->GetObject();
    >
    >      if (obj != NULL){
    >           GePrint ("obj!=NULL");
    >
    >           BaseObject *op = obj->GetDown();
    >           BaseObject *current;
    >           BaseContainer *opContainer = op->GetDataInstance();
    >
    >           while (op!= NULL){
    >                opContainer = op->GetDataInstance();
    >                opContainer->SetBool (DESC_USED, FALSE);
    >                opContainer->SetLong (DESC_JOINT_ID, 0);
    >                current = op->GetDown();
    >                if (current == NULL)
    >                     current = op->GetNext();
    >                if (current == NULL)
    >                     current = op->GetUp()->GetNext();
    >                op = current;
    >           }
    >      }
    > }
    >
    > // be sure to use a unique ID obtained from www.plugincafe.com
    > #define ID_MOCAP     10004
    >
    > Bool RegisterMoCap(void)
    > {
    >      // decide by name if the plugin shall be registered - just for user convenience
    >      String name=GeLoadString(IDS_MOCAPTAG); if (!name.Content()) return TRUE;
    >      return RegisterTagPlugin(ID_MOCAP,name,TAG_EXPRESSION|TAG_VISIBLE,MoCap::Alloc,"Tmocap","mocap.tif",0);
    > }
    >
    > </code>

    The most important thing to me is the repeated call of the alloc and free-methods, because I don't get why they are called and how I should place the undo-commands to avoid the confusing results. A simple answer to this would be a big help.

    Thx

    J.



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

    On 14/05/2008 at 02:48, xxxxxxxx wrote:

    What you seeing here is Cinema's undo/redo system at work. It has to create instances when you change something in the AM and free them if you are undoing things.

    cheers,
    Matthias



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

    On 14/05/2008 at 07:09, xxxxxxxx wrote:

    OK, I'm sorry for the confusion:) This is the first time I try to understand the undo behaviour and I still didn't really succeed. Somewhere I read that Attribute Manager items like checkboxes are handled automatically and that causes a lot of trouble. Before the Message-method is called, it creates an instance (for the undo call?), and it doesn't work properly with Message() :

    > \> \> Bool MoCap::Message (GeListNode \*node, LONG type, void \*data) \> { \>      BaseDocument \*doc=node->GetDocument(); \>      BaseTag          \*tag = (BaseTag\* )node;      \>      BaseContainer \*bc = tag->GetDataInstance(); \> \>      switch (type) \>      { \>           case MSG_DESCRIPTION_INITUNDO: \>           { \>                GePrint ("MSG_DESCRIPTION_INITUNDO"); \>                StopAllThreads(); \>                doc->StartUndo(); \>                break; \>           } \>           case MSG_DESCRIPTION_COMMAND: \>           { \>                DescriptionCommand \*dc = (DescriptionCommand\* ) data; \>                if (dc->id[0].id==APPLY_BUTTON) \>                { \>                     GePrint ("StartUndo"); \>                     BaseObject \*parent = tag->GetObject(); \>                     if (activeChildren (tag)){ \>                          Bool result = generateObject (tag); \>                          } \>                     break; \>                     } \> \>                if (dc->id[0].id==ADD_BONE_BUTTON) \>                { \>                     long jointCount = bc->GetLong (DESC_COUNTER)+1; \>                     GePrint ("StartUndo"); \>                     doc->AddUndo(UNDO_CHANGE_SMALL, tag); \>                     GePrint ("AddUndo"); \>                     bc->SetLong (DESC_COUNTER, jointCount); \>                     bc->SetLink (JOINTS + jointCount - 1, NULL); \>                     bc->SetLink(JOINT_PARENTS + jointCount - 1, NULL); \>                     GePrint ("Added Bone"); \>                     break; \>                } \>                \>                if (dc->id[0].id==REMOVE_BONE_BUTTON) \>                { \>                     GePrint ("StartUndo"); \>                     if (bc->GetLong (DESC_COUNTER) >0){ \>                          long jointCount = bc->GetLong (DESC_COUNTER)-1; \>                          doc->AddUndo(UNDO_CHANGE_SMALL, tag); \>                          bc->SetLong (DESC_COUNTER, jointCount); \>                     } \>                     break; \>                } \> \>                if (dc->id[0].id==GENERATE_BONE_BUTTON) \>                { \>                     GePrint ("StartUndo"); \>                     Bool result = generateJoint (tag); \>                     break; \>                } \> \>                } \>           case MSG_DESCRIPTION_CHECKUPDATE: \>                { \>                     GePrint ("Check Update"); \>                     DescriptionCheckUpdate \*dch = (DescriptionCheckUpdate\* ) data; \>                     DescID descID = \*(dch->descid); \>                     LONG paramID = descID[0].id; \> \>                     if (tag) \>                     { \>                          Bool enabled; \>                          Real weight; \>                          Real start, end; \>                          BaseObject \*current = NULL; \>                          BaseContainer \*currentContainer; \>                          current = (BaseObject\* ) children[0]; \>                          long i=0; \>                          bool changed = FALSE; \> \>                          while (current != NULL && !changed){ \>                              if (current->GetType() == Onull){ \>                                    currentContainer = current->GetDataInstance(); \>                                    enabled = bc->GetBool(ENABLE_BOXES + i); \>                                    weight = bc->GetReal(WEIGHT_SLIDERS + i); \>                                    Bool mergeable = currentContainer->GetBool (DESC_MERGEABLE); \>                                    Real mergeValue = currentContainer->GetReal (DESC_MERGE_VALUE); \> \>                                    if (mergeable != enabled || mergeValue != weight){ \>                                         GePrint ("if"); \>                \>                                        doc->AddUndo(UNDO_CHANGE_NOCHILDS,tag); \>                                        doc->AddUndo(UNDO_CHANGE_SMALL,current); \>                                         currentContainer->SetBool (DESC_MERGEABLE, enabled); \>                                         currentContainer->SetReal (DESC_MERGE_VALUE, weight); \>                                         changed = TRUE; \>                                          \>                                    } \>                              } \>                              current = current->GetNext(); \>                              i++; \>                          } \>                     } \>                     break; \>                } \>           case MSG_DESCRIPTION_USERINTERACTION_END: \>                { \>                     GePrint ("End Undo"); \>                     doc->EndUndo(); \>                     break; \>                } \>      } \> \>      return TRUE; \> } \> \>

    The buttons "Add bone" and "Remove Bone" work properly with undo, but in all other cases the original instance of the tag gets deleted. I assume I do not work correctly in case MSG_DESCRIPTION_CHECKUPDATE. Does anyone see the problem?

    Thx


Log in to reply