int plSharedComponents(INodeTab& nodes, INodeTab& components) { components.ZeroCount(); if (nodes.Count() == 0) return 0; plMaxNodeBase *firstNode = (plMaxNodeBase*)nodes[0]; int num = firstNode->NumAttachedComponents(); // Resize the list to it's max size to be more efficient components.SetCount(num); int i; // Put all the components on the first node into a list for (i = 0; i < num; i++) components[i] = firstNode->GetAttachedComponent(i)->GetINode(); // Delete any components that aren't on all the other nodes for (i = 1; i < nodes.Count(); i++) { plMaxNodeBase *node = (plMaxNodeBase*)nodes[i]; uint32_t count = node->NumAttachedComponents(); for (int j = components.Count()-1; j >= 0; j--) { if (!INodeHasComponent(node, (plMaxNodeBase*)components[j])) components.Delete(j, 1); } } return components.Count(); }
bool GetComponents() { fSelectedNodes.ZeroCount(); fSharedComps.ZeroCount(); Interface *ip = GetCOREInterface(); int nodeCount = ip->GetSelNodeCount(); if (nodeCount == 0) return false; // Get the components shared among the selected nodes int i; fSelectedNodes.SetCount(nodeCount); for (i = 0; i < nodeCount; i++) fSelectedNodes[i] = ip->GetSelNode(i); INodeTab sharedComps; if (plSharedComponents(fSelectedNodes, sharedComps) == 0) return false; // Put the shared components in a list fSharedComps.SetCount(sharedComps.Count()); for (i = 0; i < sharedComps.Count(); i++) fSharedComps[i] = ((plMaxNode*)sharedComps[i])->ConvertToComponent(); return true; }
void FormationBhvr::PickWhom() { int i; // first set the nodetab to equal the existing nodes to flee // so that they are selected in the dialog if (pblock->Count(follower) > 0) { INode *node; SelMaxNodes.Resize(pblock->Count(follower)); SelMaxNodes.SetCount(0); for (i=0; i<pblock->Count(follower); i++) { pblock->GetValue(follower,0,node,FOREVER,i); SelMaxNodes.Append(1,&node); } } else SelMaxNodes.ZeroCount(); // let the user pick DoHitObjInMAX.SetSingleSelect(FALSE); // allow multiple selection if (!GetCOREInterface()->DoHitByNameDialog(&DoHitObjInMAX)) return; // Set follower to the returned nodes theHold.Begin(); pblock->Resize(follower,SelMaxNodes.Count()); pblock->SetCount(follower,0); for (i=0; i<SelMaxNodes.Count(); i++) pblock->Append(follower,1,&SelMaxNodes[i]); //zero out the formation matrix that's used for saving it out. pblock->ZeroCount(follower_matrix1); pblock->ZeroCount(follower_matrix2); pblock->ZeroCount(follower_matrix3); pblock->ZeroCount(follower_matrix4); theHold.Accept(GetString(IDS_UN_WHOM)); }