Beispiel #1
0
 public GPUAnimationState(SkinningData skinningData, string clipName)
 {
     _skinningData = skinningData;
     foreach (var clip in _skinningData.clipInfos)
     {
         if (clip.name == clipName)
         {
             _clipInfo = clip;
             break;
         }
     }
     Init();
 }
Beispiel #2
0
 public GPUAnimationState(SkinningData skinningData, int clipIdx)
 {
     _skinningData = skinningData;
     _clipInfo     = _skinningData.clipInfos[clipIdx];
     Init();
 }
Beispiel #3
0
        void Update()
        {
            if (dstWeaponT == null)
            {
                return;
            }

            //SharedData.time = SharedData.crossFadeTime + 1f / 60;
            //return;

            if (trDatas == null || trDatas.Length == 0)
            {
                InitBones();
            }

            BakedClipInfo clipInfo = SharedData.skinningData.clipInfos[0];

            frameInfo.x = SharedData.crossFadeIdx;
            frameInfo.y = clipInfo.frameCount;
            frameInfo.z = clipInfo.frameRate * (_lastTime % clipInfo.duration);
            _lastTime   = SharedData.time;

            int byteOffset = _pixelPerFrame * 8 * SharedData.crossFadeIdx;

            byte[] buff = SharedData.skinningData.bakedBoneDatas;
            for (int i = 0; i < trDatas.Length; i++)
            {
                Vector4[] rows = new Vector4[4];

                for (int j = 0; j < 3; j++) // 3 pixel per bone
                {
                    Vector4 row = new Vector4();
                    row.x       = ReadFloat(buff, byteOffset);
                    byteOffset += 2;
                    row.y       = ReadFloat(buff, byteOffset);
                    byteOffset += 2;
                    row.z       = ReadFloat(buff, byteOffset);
                    byteOffset += 2;
                    row.w       = ReadFloat(buff, byteOffset);
                    byteOffset += 2;

                    rows[j] = row;
                }
                rows[3] = new Vector4(0, 0, 0, 1);

                Matrix4x4 mat = new Matrix4x4();
                mat.SetRow(0, rows[0]);
                mat.SetRow(1, rows[1]);
                mat.SetRow(2, rows[2]);
                mat.SetRow(3, rows[3]);
                mat *= trDatas[i].bindPoseInv;

                if (i == 0 && SharedData.frameIdx == 2)
                {
                    Vector3    posA, scaleA;
                    Quaternion rotateA;
                    Matrix4x4Helper.Decompose(trDatas[i].bindPoseInv, out scaleA, out rotateA, out posA);
                    posA.x += 1;
                }

                Vector3    pos, scale;
                Quaternion rotate;
                Matrix4x4Helper.Decompose(mat, out scale, out rotate, out pos);

                trDatas[i].dstPos    = pos;
                trDatas[i].dstRotate = rotate.eulerAngles;

                trDatas[i].srcPos    = trDatas[i].oriT.position - new Vector3(0.5f, 0, 0);
                trDatas[i].srcRotate = trDatas[i].oriT.rotation.eulerAngles;
            }
        }