Beispiel #1
0
    private void BakeAllAnimClip(List <AnimationState> curAnims, string path, GameObject go, float frameRate, GameObject rootBone, GPUSkinningBone[] bones)
    {
        int   curClipFrame = 0;
        float sampleTime   = 0;
        float perFrameTime = 0;
        float len          = 0;
        float s            = 1;

        for (int i = 0; i < this.animData.animClips.Count; i++)
        {
            if (!this.animData.animClips[i].clip.legacy)
            {
                Debug.LogError(string.Format("{0} is not legacy!!", this.animData.animClips[i].clip.name));
                continue;
            }
            if (this.animData.animClips[i].name.IndexOf("_all") >= 0)
            {
                continue;
            }

            //前后各加一帧
            curClipFrame += Mathf.CeilToInt(curAnims[i].clip.frameRate * curAnims[i].length * s) + 2;
        }

        len = curClipFrame / frameRate;
        int       pow1    = Mathf.NextPowerOfTwo(curClipFrame);
        int       width   = Mathf.NextPowerOfTwo(bones.Length * 3);
        Texture2D animMap = new Texture2D(width, pow1, format, false);

        animMap.wrapMode   = TextureWrapMode.Clamp;
        animMap.filterMode = FilterMode.Point;

        animMap.name = this.animData.name;
        int startFrame = 0;

        for (int i = 0; i < this.animData.animClips.Count; i++)
        {
            if (!this.animData.animClips[i].clip.legacy)
            {
                Debug.LogError(string.Format("{0} is not legacy!!", this.animData.animClips[i].clip.name));
                continue;
            }
            if (this.animData.animClips[i].name.IndexOf("_all") >= 0)
            {
                continue;
            }

            animData.AnimationPlay(curAnims[i].name);
            sampleTime = 0;
            int curClipFrame1 = Mathf.CeilToInt(curAnims[i].clip.frameRate * curAnims[i].length * s) + 2;
            perFrameTime = curAnims[i].length / (curClipFrame1 - 2);
            for (int k = startFrame; k < curClipFrame1 + startFrame - 2; k++)
            {
                if (sampleTime > curAnims[i].length)
                {
                    sampleTime = curAnims[i].length;
                }
                curAnims[i].time = sampleTime;

                this.animData.animation.Sample();
                for (int j = 0; j < bones.Length; j++)
                {
                    GPUSkinningBone currentBone = bones[j];
                    Matrix4x4       lastMat     = currentBone.bindpose;
                    while (true)
                    {
                        if (currentBone.parentBoneIndex == -1)
                        {
                            Matrix4x4 mat = Matrix4x4.TRS(currentBone.transform.localPosition, currentBone.transform.localRotation, currentBone.transform.localScale);
                            if (rootBone.transform != go.transform)
                            {
                                mat = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, go.transform.localScale) * mat;
                            }

                            lastMat = mat * lastMat;
                            break;
                        }
                        else
                        {
                            Matrix4x4 mat = Matrix4x4.TRS(currentBone.transform.localPosition, currentBone.transform.localRotation, currentBone.transform.localScale);
                            lastMat     = mat * lastMat;
                            currentBone = bones[currentBone.parentBoneIndex];
                        }
                    }

                    animMap.SetPixel(j * 3, k + 1, new Color(lastMat.m00, lastMat.m01, lastMat.m02, lastMat.m03));
                    animMap.SetPixel(j * 3 + 1, k + 1, new Color(lastMat.m10, lastMat.m11, lastMat.m12, lastMat.m13));
                    animMap.SetPixel(j * 3 + 2, k + 1, new Color(lastMat.m20, lastMat.m21, lastMat.m22, lastMat.m23));

                    if (k == startFrame)
                    {
                        animMap.SetPixel(j * 3, k, new Color(lastMat.m00, lastMat.m01, lastMat.m02, lastMat.m03));
                        animMap.SetPixel(j * 3 + 1, k, new Color(lastMat.m10, lastMat.m11, lastMat.m12, lastMat.m13));
                        animMap.SetPixel(j * 3 + 2, k, new Color(lastMat.m20, lastMat.m21, lastMat.m22, lastMat.m23));
                    }
                    else if (k == curClipFrame1 + startFrame - 3)
                    {
                        animMap.SetPixel(j * 3, k + 2, new Color(lastMat.m00, lastMat.m01, lastMat.m02, lastMat.m03));
                        animMap.SetPixel(j * 3 + 1, k + 2, new Color(lastMat.m10, lastMat.m11, lastMat.m12, lastMat.m13));
                        animMap.SetPixel(j * 3 + 2, k + 2, new Color(lastMat.m20, lastMat.m21, lastMat.m22, lastMat.m23));
                    }
                }
                sampleTime += perFrameTime;
            }

            startFrame += curClipFrame1;
        }

        animMap.Apply();
        this.bakedDataList.Add(new BakedData(animMap.name, pow1 / frameRate, animMap));
    }