コード例 #1
0
ファイル: Puppet.cs プロジェクト: tranorrepository/vixen
        public Skeleton ConnectBody(Engine simroot)
        {
            if (simroot == null)
            {
                return(null);
            }
            try
            {
                string filebase = Path.GetFileNameWithoutExtension(filename).ToLower() + ".";
                animSkel = (Skeleton)simroot.Find(filebase + animRig + ".skeleton", Group.FIND_DESCEND | Group.FIND_EXACT);

                if (usehavok)
                {
                    Physics physroot = Physics.Get();
                    Engine  skelmapper;

                    BodyPoser = (Skeleton)simroot.Find(filebase + havokRig + ".skeleton", Group.FIND_DESCEND | Group.FIND_EXACT);
                    if ((PhysicsOptions != null))
                    {
                        if (PhysicsOptions.Contains("ynamic"))
                        {
                            physicsOpts |= RagDoll.DYNAMIC;
                        }
                        if (PhysicsOptions.Contains("ower"))
                        {
                            physicsOpts |= RagDoll.POWERED;
                        }
                        BodyPoser.SetBoneOptions(0, Skeleton.BONE_ANIMATE);
                    }
                    else
                    {
                        if (BodyPoser.GetBoneName(0).StartsWith("Proxy"))
                        {
                            BodyPoser.SetBoneOptions(BodyPoser.GetBoneIndex("Proxy_RightWrist"), Skeleton.BONE_LOCK_ROTATION);
                            BodyPoser.SetBoneOptions(BodyPoser.GetBoneIndex("Proxy_RightAnkle"), Skeleton.BONE_LOCK_ROTATION);
                            BodyPoser.SetBoneOptions(BodyPoser.GetBoneIndex("Proxy_LeftWrist"), Skeleton.BONE_LOCK_ROTATION);
                            BodyPoser.SetBoneOptions(BodyPoser.GetBoneIndex("Proxy_LeftAnkle"), Skeleton.BONE_LOCK_ROTATION);
                        }
                    }
                    BodyPoser.Control |= physicsOpts;
                    BodyPoser.Active   = false;
                    skelmapper         = (Engine)BodyPoser.Find(".mapper", Group.FIND_END | Group.FIND_CHILD);
                    if (skelmapper != null)
                    {
                        skelmapper.Active = true;
                    }
                    if (physroot != null)
                    {
                        bodySim = (Engine)physroot.Find(filebase + "cloth", Group.FIND_DESCEND | Group.FIND_EXACT);
                    }
                    if (bodySim == null)
                    {
                        bodySim = (Engine)physroot.Find(".skin", Group.FIND_DESCEND | Group.FIND_END);
                    }
                    if (physicsOpts != 0)
                    {
                        physroot.Active = true;
                    }
                    bodySkeleton = (Model)bodyModel.Find(havokRig, Group.FIND_DESCEND | Group.FIND_END);
                    if (bodySkeleton != null)
                    {
                        bodySkeleton.Active = false;
                        RightHand           = (Model)bodySkeleton.Find("RightWrist", Group.FIND_DESCEND | Group.FIND_END);
                        LeftHand            = (Model)bodySkeleton.Find("LeftWrist", Group.FIND_DESCEND | Group.FIND_END);
                        Head = (Model)bodySkeleton.Find("Head", Group.FIND_DESCEND | Group.FIND_END);
                    }
                }
                else
                {
                    bodySim   = (Engine)simroot.Find(".skin", Group.FIND_DESCEND | Group.FIND_END);
                    BodyPoser = animSkel;
                }
                Show();
            }
            catch (Exception)
            {
                // do nothing, simulation tree does not have SCAPESkin and BodyPoser
            }
            return(BodyPoser);
        }