예제 #1
0
    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;
    }
예제 #2
0
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();
}
예제 #3
0
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;
}
예제 #4
0
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));
}
예제 #5
0
파일: surfwrap.cpp 프로젝트: 2asoft/xray
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;
		}
	}