Retrieving several Inport Data?
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 07/01/2003 at 07:08, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 8.012
Platform: Windows ;
Language(s) : C++ ; XPRESSO ;---------
Hi,
I tried to get the inport data of my plugin node but I can only retrieve the data of the first port. The second one is NULL. I tried two ways:GvPort* ipt = bn->GetInPort(1); GeData iptdata = GvGetPortGeData(bn, ipt, run); Vector pos = iptdata.GetVector(); GvPort* inport = vinport->GetPort(); GeData inportdata = GvGetPortGeData(bn, inport, run); Vector normale = inportdata.GetVector();
the second one does give me the data of the first inport correctly. The first one doesn´t give me the data, though the port is correct and I can also get the name of the port. How can I get the data of several ports then?
Thanks
Samir -
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 08/01/2003 at 02:32, xxxxxxxx wrote:
The ports must be calculated correctly. The easiest way is to always use the convenience functions for value tables. Please refer to this example: (And just add more ports to input_ids.)
static LONG input_ids[] = { INPORT_LINK, 0 }; // Use this for the input ports! enum { INPORT_LINK_INDEX }; class Node: public GvOperatorData { // Defines super INSTANCEOF(Node, GvOperatorData) public: virtual Bool iCreateOperator(GvNode *bn) { BaseContainer* data = bn->GetOpContainerInstance(); if (!data) return FALSE; data->SetLong(STEPS, 3); return SUPER::iCreateOperator(bn); } Bool InitCalculation(GvNode *bn, GvCalc *c, GvRun *r) { return GvBuildInValuesTable(bn, ports, c, r, input_ids); } void FreeCalculation(GvNode *bn, GvCalc *c) { GvFreeValuesTable(bn, ports); } Bool Calculate(GvNode *bn, GvPort *port, GvRun *run, GvCalc *calc) { if (!port) return FALSE; BaseContainer *data = bn->GetOpContainerInstance(); if (!data) return FALSE; LONG steps = data->GetLong(STEPS); LONG mode = data->GetLong(MODE_ID); GvValue* vinport = ports.in_values[INPORT_LINK_INDEX]; if (!vinport) return FALSE; if (!vinport->Calculate(bn, GV_PORT_INPUT, run, calc, 0)) return FALSE; GvPort* inport = vinport->GetPort(); GeData inportdata = GvGetPortGeData(bn, inport, run); BaseDocument* doc = bn->GetNodeMaster()->GetDocument(); if (!doc) return FALSE; BaseLink* link = inportdata.GetBaseLink(); if (!link) return FALSE; BaseList2D* list = link->GetLink(doc); if (!list) return FALSE; switch(port->GetMainID()) { case OUTPORT_LINK: { BaseObject* obj = static_cast<BaseObject*>(list); for (LONG i = 0; list && i < steps; ++i) { switch(mode) { case GETDOWN: obj = obj->GetDown(); break; case GETUP: obj = obj->GetUp(); break; case GETPRED: obj = obj->GetPred(); break; case GETNEXT: obj = obj->GetNext(); break; } } AutoAlloc<BaseLink> bl; if (!bl) return FALSE; bl->SetLink(obj); return GvSetPortGeData(GeData(bl), bn, port, run); } } return FALSE; } static NodeData* Alloc(void) { return gNew Node; } private: GvValuesInfo ports; };
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 08/01/2003 at 02:41, xxxxxxxx wrote:
The ports must be calculated correctly. The easiest way is to always use the convenience functions for value tables. Please refer to this example: (And just add more ports to input_ids.)
static LONG input_ids[] = { INPORT_LINK, 0 }; // Use this for the input ports! enum { INPORT_LINK_INDEX };
Hi, I am already doing this. static LONG input_ids[] = { NORMAL,0,LEAVECOUNT,1}; // Use this for the input ports! enum { INPORT_LINK_INDEX }; and then the same procedure as shown in your example above. here is some code then in my calculate method
Bool Calculate(GvNode *bn, GvPort *port, GvRun *run, GvCalc *calc) { if (!port) return FALSE; BaseContainer *data = bn->GetOpContainerInstance(); if (!data) return FALSE; LONG offsetseed = data->GetLong(OFFSET_SEED); LONG offset = data->GetLong(OFFSET); Random rnd; rnd.Init(offsetseed); GvValue* vinport = ports.in_values[INPORT_LINK_INDEX]; if (!vinport) return FALSE; if (!vinport->Calculate(bn, GV_PORT_INPUT_OR_GEDATA, run, calc, 0)) return FALSE; /*LONG portcnt = bn->GetInPortCount(); GvPort* ipt = bn->GetInPort(1); GeData iptdata = GvGetPortGeData(bn, ipt, run); Vector pos = iptdata.GetVector(); */ GvPort* inport = vinport->GetPort(); GeData inportdata = GvGetPortGeData(bn, inport, run); Vector normale = inportdata.GetVector(); [...]
The problem is that I cannot get the second port with vinport->GetPort(). This only returns the first inport. GetPort() should take a SubID parameter for the inport afaik but that doesn´t work either. Am I missing something? :\
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 10/01/2003 at 02:03, xxxxxxxx wrote:
Any conclusions yet?
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 11/01/2003 at 07:03, xxxxxxxx wrote:
Uhm, input_ids is supposed to be zero terminated. So you should have:
static LONG input_ids[] = { NORMAL,LEAVECOUNT,0}; enum { INPORT_NORMAL_INDEX, INPORT_LEAVECOUNT_INDEX };
Then you repeat the whole ports.in_values part for each port.
-
THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 11/01/2003 at 07:46, xxxxxxxx wrote:
oh, ok. Works just fine now.
Thanks
P.s.: Mikael works at the weekend?