Esempio n. 1
0
 /// <summary>
 ///     初期化
 /// </summary>
 /// <param name="skinning">スキニングに利用するインターフェース</param>
 public void Initialize(ModelData model, IMorphManager morph, ISkinningProvider skinning, IBufferManager bufferManager)
 {
     skinningProvider = skinning;
     motionTimer      = new Stopwatch();
     motionTimer.Start();
     this.morphManager   = morph;
     SubscribedMotionMap = new List <KeyValuePair <string, IMotionProvider> >();
 }
Esempio n. 2
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="bones"></param>
        /// <param name="index"></param>
        /// <param name="layer"></param>
        /// <param name="skinning"></param>
        public PMXBone(List <BoneData> bones, int index, int layer, ISkinningProvider skinning)
        {
            this.skinning = skinning;
            BoneData me = bones[index]; //このボーン

            skinning.Bone[index] = this;
            BoneIndex            = index;
            Position             = me.Position;
            BoneName             = me.BoneName;

            isLocalAxis  = me.isLocalAxis;
            PhysicsOrder = me.transformAfterPhysics ? PhysicsOrder.After : PhysicsOrder.Before;
            Layer        = layer;
            if (isLocalAxis)
            {
                DefaultLocalX = me.DimentionXDirectionVector;
                DefaultLocalY = Vector3.Cross(me.DimentionZDirectionVector, DefaultLocalX);
                DefaultLocalZ = Vector3.Cross(DefaultLocalX, DefaultLocalY);
            }
            if (me.isIK) //IKボーンの場合
            {
                skinning.IkBone.Add(this);
                isIK            = true;
                RotationLimited = me.IKLimitedRadian;
                targetBoneIndex = me.IKTargetBoneIndex;
                Iterator        = me.IKLoopNumber;
                foreach (IkLinkData ikLink in me.ikLinks)
                {
                    ikLinks.Add(new IkLink(skinning, ikLink));
                }
            }
            isRotateProvided = me.isRotateProvided;
            isMoveProvided   = me.isMoveProvided;
            if (me.ProvidedParentBoneIndex == -1)
            {
                isRotateProvided = isMoveProvided = false;
            }
            if (isMoveProvided || isRotateProvided)
            {
                ProvideParentBone = me.ProvidedParentBoneIndex;
                ProvidedRatio     = me.ProvidedRatio;
            }
            else
            {
                ProvideParentBone = -1;
            }
            for (int i = 0; i < bones.Count; i++)
            {
                BoneData bone = bones[i];
                if (bone.ParentBoneIndex == index)
                {
                    PMXBone child = new PMXBone(bones, i, layer + 1, skinning);
                    AddChild(child);
                }
            }
        }
Esempio n. 3
0
 public BoneMorphProvider(PMXModel model)
 {
     this.skinningProvider = model.Skinning;
     foreach (MorphData morphData in model.Model.MorphList.Morphes)
     {
         if (morphData.type == MorphType.Bone)
         {
             this.MorphList.Add(morphData.MorphName, new BoneMorphData(morphData));
         }
     }
 }
Esempio n. 4
0
        public IkLink(ISkinningProvider skinning, MMDFileParser.PMXModelParser.IkLinkData linkData)
        {
            this.skinning = skinning;
            this.index    = linkData.LinkBoneIndex;
            Vector3 maxVec = linkData.MinimumRadian;
            Vector3 minVec = linkData.MaximumRadian;

            //min and max load correctly
            this.minRot = new Vector3(Math.Min(maxVec.X, minVec.X), Math.Min(maxVec.Y, minVec.Y),
                                      Math.Min(maxVec.Z, minVec.Z));
            this.maxRot = new Vector3(Math.Max(maxVec.X, minVec.X), Math.Max(maxVec.Y, minVec.Y),
                                      Math.Max(maxVec.Z, minVec.Z));
            this.maxRot    = Vector3.Clamp(this.maxRot, CGHelper.EularMinimum, CGHelper.EularMaximum);
            this.minRot    = Vector3.Clamp(this.minRot, CGHelper.EularMinimum, CGHelper.EularMaximum);
            this.isLimited = linkData.isRotateLimited;
        }