THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 26/09/2009 at 04:59, xxxxxxxx wrote:
User Information:
Cinema 4D Version:
Platform:
Language(s) :
---------
Hi everyone, I have another question.
I use a MessageData plugin to send a message to Tag plugin when the geometry needs updating.
As long as the polygon object is not under a hypernurbs this works.
However if I put it under a hypernurb the message that is sent to the Tag plugin also gets send for the generated hypernurbs.
This was not what I expected, can anyone shed some light on this behaviour?
Here are some relevant code snippets:
This is from the TagData::Execute
if (blnEnableSym&&blnSymmetryDirty)
{ if (lngAction==450000012)
{ // Slide
blnSlide=true;
}
GePrint("Send MESSAGE_UPDATE_TS_ID from execute");
SpecialEventAdd(MESSAGE_UPDATE_TS_ID, 1, 0);
}
This is from the CoreMessage of the MessageData
class TrueSymmetryMessage : public MessageData
{ public:
virtual Bool CoreMessage(LONG id, const BaseContainer& bc)
{ switch(id)
{ case MESSAGE_UPDATE_TS_ID:
LONG lngI;
if (taglist)
{ LONG tCnt = taglist->GetCount();
for(lngI=0; lngI<tCnt; lngI++)
{ BaseTag *tag = static_cast<BaseTag*>(taglist->GetIndex(lngI));
GePrint("SendMessage from MessageData " + LongToString(lngI) );
tag->Message(MESSAGE_UPDATE_TS_ID);
}
}
}
return TRUE;
}
};
And this is from TagData::Message
if (type==MESSAGE_UPDATE_TS_ID)
{
BaseTag* tag = (BaseTag* )node;
BaseObject* obj = tag->GetObject();
PolygonObject* objPoly;
objPoly=(PolygonObject* )obj;
GePrint("MESSAGE_UPDATE_TS_ID PolyCount " + LongToString(objPoly->GetPointCount()) );
if (blnSymmetryDirty)
{ if (!MaintainSymmetry(obj,bc))
{ bc->SetBool(ENABLE_SYMMETRY, false);
}
}
}
If I do a modelling command on the polygon object this is what the console tells me what is happening:
Send MESSAGE_UPDATE_TS_ID from execute
SendMessage from MessageData 0
MESSAGE_UPDATE_TS_ID PolyCount 97
SendMessage from MessageData 1
MESSAGE_UPDATE_TS_ID PolyCount 97
That the message is sent more than once from the MessageData is because the plugin get's added in the Init to the taglist.
But in the drawing pipeline the corresponding Free is not called so you end up with more than one reference in the taglist.
I would like to improve this so that there is only one reference in the taglist but that is not the problem right now.
If I put the polygon object under a hypernurb the following happens:
Send MESSAGE_UPDATE_TS_ID from execute
SendMessage from MessageData 0
MESSAGE_UPDATE_TS_ID PolyCount 96
SendMessage from MessageData 1
MESSAGE_UPDATE_TS_ID PolyCount 97
SendMessage from MessageData 2
MESSAGE_UPDATE_TS_ID PolyCount 97
SendMessage from MessageData 3
MESSAGE_UPDATE_TS_ID PolyCount 1146
The last call to the TagData::Message is done with the hypernurbs generated polygon object as far as I can tell.
I looked at the points array of this object and these points do correspond with positions on hypernurbs surface.
So long story, here is what I would like to know:
Is this behaviour by design and is there a way to safely determine when the generated object get's passed to the TagData::Message?
Cheers,
Nebu