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; }