internal BlendShape[] GetBlendShapes(Mesh m, int gameObjectID, GameObject gameObject)
 {
     if (MeshBakerUtility.GetMajorVersion() > 5 ||
         (MeshBakerUtility.GetMajorVersion() == 5 && MeshBakerUtility.GetMinorVersion() >= 3))
     {
         MeshChannels mc;
         if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
         {
             mc = new MeshChannels();
             meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
         }
         if (mc.blendShapes == null)
         {
             BlendShape[] shapes   = new BlendShape[m.blendShapeCount];
             int          arrayLen = m.vertexCount;
             for (int i = 0; i < shapes.Length; i++)
             {
                 BlendShape shape = shapes[i] = new BlendShape();
                 shape.frames        = new MBBlendShapeFrame[MeshBakerUtility.GetBlendShapeFrameCount(m, i)];
                 shape.name          = m.GetBlendShapeName(i);
                 shape.indexInSource = i;
                 shape.gameObjectID  = gameObjectID;
                 shape.gameObject    = gameObject;
                 for (int j = 0; j < shape.frames.Length; j++)
                 {
                     MBBlendShapeFrame frame = shape.frames[j] = new MBBlendShapeFrame();
                     frame.frameWeight = MeshBakerUtility.GetBlendShapeFrameWeight(m, i, j);
                     frame.vertices    = new Vector3[arrayLen];
                     frame.normals     = new Vector3[arrayLen];
                     frame.tangents    = new Vector3[arrayLen];
                     MeshBakerUtility.GetBlendShapeFrameVertices(m, i, j, frame.vertices, frame.normals, frame.tangents);
                 }
             }
             mc.blendShapes = shapes;
             return(mc.blendShapes);
         }
         else
         { //copy cached blend shapes assigning a different gameObjectID
             BlendShape[] shapes = new BlendShape[mc.blendShapes.Length];
             for (int i = 0; i < shapes.Length; i++)
             {
                 shapes[i]               = new BlendShape();
                 shapes[i].name          = mc.blendShapes[i].name;
                 shapes[i].indexInSource = mc.blendShapes[i].indexInSource;
                 shapes[i].frames        = mc.blendShapes[i].frames;
                 shapes[i].gameObjectID  = gameObjectID;
                 shapes[i].gameObject    = gameObject;
             }
             return(shapes);
         }
     }
     else
     {
         return(new BlendShape[0]);
     }
 }
        internal Vector2[] GetUv0Raw(Mesh m)
        {
            MeshChannels mc;

            if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
            {
                mc = new MeshChannels();
                meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
            }
            if (mc.uv0raw == null)
            {
                mc.uv0raw = _getMeshUVs(m);
            }
            return(mc.uv0raw);
        }
        internal Vector4[] GetTangents(Mesh m)
        {
            MeshChannels mc;

            if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
            {
                mc = new MeshChannels();
                meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
            }
            if (mc.tangents == null)
            {
                mc.tangents = _getMeshTangents(m);
            }
            return(mc.tangents);
        }
        internal Vector3[] GetNormals(Mesh m)
        {
            MeshChannels mc;

            if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
            {
                mc = new MeshChannels();
                meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
            }
            if (mc.normals == null)
            {
                mc.normals = _getMeshNormals(m);
            }
            return(mc.normals);
        }
        internal Vector3[] GetVertices(Mesh m)
        {
            MeshChannels mc;

            if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
            {
                mc = new MeshChannels();
                meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
            }
            if (mc.vertices == null)
            {
                mc.vertices = m.vertices;
            }
            return(mc.vertices);
        }
        internal int[] GetTriangles(Mesh m)
        {
            MeshChannels mc;

            if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
            {
                mc = new MeshChannels();
                meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
            }
            if (mc.triangles == null)
            {
                mc.triangles = m.triangles;
            }
            return(mc.triangles);
        }
        internal Color[] GetColors(Mesh m)
        {
            MeshChannels mc;

            if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
            {
                mc = new MeshChannels();
                meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
            }
            if (mc.colors == null)
            {
                mc.colors = _getMeshColors(m);
            }
            return(mc.colors);
        }
        internal Vector2[] GetUv4(Mesh m)
        {
            MeshChannels mc;

            if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
            {
                mc = new MeshChannels();
                meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
            }
            if (mc.uv4 == null)
            {
                mc.uv4 = MeshBakerUtility.GetMeshUV3orUV4(m, false);
            }
            return(mc.uv4);
        }
        internal BoneWeight[] GetBoneWeights(Renderer r, int numVertsInMeshBeingAdded)
        {
            MeshChannels mc;
            Mesh         m = MeshBakerUtility.GetMesh(r.gameObject);

            if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
            {
                mc = new MeshChannels();
                meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
            }
            if (mc.boneWeights == null)
            {
                mc.boneWeights = _getBoneWeights(r, numVertsInMeshBeingAdded);
            }
            return(mc.boneWeights);
        }
        internal Matrix4x4[] GetBindposes(Renderer r)
        {
            MeshChannels mc;
            Mesh         m = MeshBakerUtility.GetMesh(r.gameObject);

            if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
            {
                mc = new MeshChannels();
                meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
            }
            if (mc.bindPoses == null)
            {
                mc.bindPoses = _getBindPoses(r);
            }
            return(mc.bindPoses);
        }
        internal Vector2[] GetUv0Modified(Mesh m)
        {
            MeshChannels mc;

            if (!meshIDToMeshChannels.TryGetValue(m.GetInstanceID(), out mc))
            {
                mc = new MeshChannels();
                meshIDToMeshChannels.Add(m.GetInstanceID(), mc);
            }
            if (mc.uv0modified == null)
            {
                //todo
                mc.uv0modified = null;
            }
            return(mc.uv0modified);
        }
        /// <summary>
        /// 构建预制体
        /// </summary>
        /// <param name="mom"></param>
        /// <param name="so"></param>
        public static void RebuildPrefab(MeshBakerCommon mom, ref SerializedObject so)
        {
            GameObject prefabRoot = mom.resultPrefab;
            GameObject rootGO     = (GameObject)PrefabUtility.InstantiatePrefab(prefabRoot);

            SceneBakerUtilityInEditor.UnpackPrefabInstance(rootGO, ref so);

            //remove all renderer childeren of rootGO
            Renderer[] rs = rootGO.GetComponentsInChildren <Renderer>();
            for (int i = 0; i < rs.Length; i++)
            {
                if (rs[i] != null && rs[i].transform.parent == rootGO.transform)
                {
                    MeshBakerUtility.Destroy(rs[i].gameObject);
                }
            }

            if (mom is MeshCombinerEntrance)
            {
                MeshCombinerEntrance entrance = (MeshCombinerEntrance)mom;
                MeshCombineHandler   mbs      = (MeshCombineHandler)entrance.meshCombiner;
                MeshCombineHandler.BuildPrefabHierarchy(mbs, rootGO, mbs.GetMesh());
            }
            ////else if (mom is MB3_MultiMeshBaker)
            ////{
            ////    MB3_MultiMeshBaker mmb = (MB3_MultiMeshBaker)mom;
            ////    MB3_MultiMeshCombiner mbs = (MB3_MultiMeshCombiner)mmb.meshCombiner;
            ////    for (int i = 0; i < mbs.meshCombiners.Count; i++)
            ////    {
            ////        MB3_MeshCombinerSingle.BuildPrefabHierarchy(mbs.meshCombiners[i].combinedMesh, rootGO, mbs.meshCombiners[i].combinedMesh.GetMesh(), true);
            ////    }
            ////}
            else
            {
                Debug.LogError("MeshCombiner合并器类型错误");
            }

            //保存预制体
            string prefabPth = AssetDatabase.GetAssetPath(prefabRoot);

            SceneBakerUtilityInEditor.ReplacePrefab(rootGO, prefabPth, ReplacePrefabOption.connectToPrefab);
            if (mom.meshCombiner.renderType != RendererType.skinnedMeshRenderer)
            {
                // For Skinned meshes, leave the prefab instance in the scene so source game objects can moved into the prefab.
                UnityEditor.Editor.DestroyImmediate(rootGO);
            }
        }
 public MeshChannelsCache(MeshCombineHandler mcs)
 {
     mc = mcs;
 }