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; }
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(); }
INodeTab GR2ImportImpl::ImportSkeleton(Skeleton& skel) { Point3 zAxis(0,0,1); INodeTab nodes; nodes.SetCount(int(skel.Bones.size())); float scale = 1.0f; for (size_t i=0, n=skel.Bones.size(); i<n; ++i) { Bone& bone = skel.Bones[i]; INode *node = o->gi->GetINodeByName(bone.Name.c_str()); if (node != NULL) { nodes[i] = node; continue; } Point3 pp(0.0f,0.0f,0.0f); Matrix3 tm = GetWorldTransform(skel, i); Point3 p = tm.GetTrans(); Quat q = tm; if (bone.ParentIndex >= 0) { Matrix3 m3 = GetWorldTransform(skel, bone.ParentIndex); pp = m3.GetTrans(); //pp = skel.Bones[bone.ParentIndex].Transform.Origin; } node = CreateBone(bone.Name.c_str(), p, pp, zAxis); node->SetUserPropInt("GR2BoneIndex", int(i)); nodes[i] = node; //OutputDebugString(FormatText("GR2BoneIndex: %d %s\n", i, bone.Name.c_str())); PosRotScaleNode(node, p, q, scale, PosRotScale(prsPos|prsRot)); if (bone.ParentIndex >= 0) { if (INode *pn = nodes[bone.ParentIndex]) pn->AttachChild(node, 1); } } return nodes; }
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)); }
BOOL SWrapPickOperand::Pick(IObjParam *ip,ViewExp *vpt) { INode *node = vpt->GetClosestHit(); assert(node); INodeTab nodes; nodes.SetCount(1);nodes[0]=node; ip->FlashNodes(&nodes); if (po->custnode) po->ReplaceReference(CUSTNODE,node,TRUE); else po->MakeRefByID(FOREVER,CUSTNODE,node); po->custname = TSTR(node->GetName()); // Automatically check show result and do one update po->cmValid.SetEmpty(); po->pmapParam->Invalidate(); po->ShowName(); po->NotifyDependents(FOREVER, PART_ALL, REFMSG_CHANGE); if (po->creating) { theCreateSWrapObjectMode.JumpStart(ip,po); ip->SetCommandMode(&theCreateSWrapObjectMode); ip->RedrawViews(ip->GetTime()); return FALSE; } else { return TRUE; } }