internal MBBlendShape[] GetBlendShapes(Mesh m, int gameObjectID, GameObject gameObject) { if (MBVersion.GetMajorVersion() > 5 || (MBVersion.GetMajorVersion() == 5 && MBVersion.GetMinorVersion() >= 3)) { MeshChannels mc; if (!meshID2MeshChannels.TryGetValue(m.GetInstanceID(), out mc)) { mc = new MeshChannels(); meshID2MeshChannels.Add(m.GetInstanceID(), mc); } if (mc.blendShapes == null) { MBBlendShape[] shapes = new MBBlendShape[m.blendShapeCount]; int arrayLen = m.vertexCount; for (int i = 0; i < shapes.Length; i++) { MBBlendShape shape = shapes[i] = new MBBlendShape(); shape.frames = new MBBlendShapeFrame[MBVersion.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 = MBVersion.GetBlendShapeFrameWeight(m, i, j); frame.vertices = new Vector3[arrayLen]; frame.normals = new Vector3[arrayLen]; frame.tangents = new Vector3[arrayLen]; MBVersion.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 MBBlendShape[] shapes = new MBBlendShape[mc.blendShapes.Length]; for (int i = 0; i < shapes.Length; i++) { shapes[i] = new MBBlendShape(); 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 MBBlendShape[0]); } }
/// <summary> /// Get the blend shapes from the source mesh /// </summary> public static MBBlendShape[] GetBlendShapes(Mesh m, int gameObjectID, GameObject gameObject, Dictionary <int, MeshChannels> meshID2MeshChannels) { if (MBVersion.GetMajorVersion() > 5 || (MBVersion.GetMajorVersion() == 5 && MBVersion.GetMinorVersion() >= 3)) { MeshChannels mc; if (!meshID2MeshChannels.TryGetValue(m.GetInstanceID(), out mc)) { mc = new MeshChannels(); meshID2MeshChannels.Add(m.GetInstanceID(), mc); } if (mc.blendShapes == null) { MBBlendShape[] shapes = new MBBlendShape[m.blendShapeCount]; int arrayLen = m.vertexCount; for (int shapeIdx = 0; shapeIdx < shapes.Length; shapeIdx++) { MBBlendShape shape = shapes[shapeIdx] = new MBBlendShape(); shape.frames = new MBBlendShapeFrame[MBVersion.GetBlendShapeFrameCount(m, shapeIdx)]; shape.name = m.GetBlendShapeName(shapeIdx); shape.indexInSource = shapeIdx; shape.gameObjectID = gameObjectID; shape.gameObject = gameObject; for (int frameIdx = 0; frameIdx < shape.frames.Length; frameIdx++) { MBBlendShapeFrame frame = shape.frames[frameIdx] = new MBBlendShapeFrame(); frame.frameWeight = MBVersion.GetBlendShapeFrameWeight(m, shapeIdx, frameIdx); frame.vertices = new Vector3[arrayLen]; frame.normals = new Vector3[arrayLen]; frame.tangents = new Vector3[arrayLen]; MBVersion.GetBlendShapeFrameVertices(m, shapeIdx, frameIdx, frame.vertices, frame.normals, frame.tangents); } } mc.blendShapes = shapes; return(mc.blendShapes); } else { //copy cached blend shapes from same mesh assiged to a different gameObjectID MBBlendShape[] shapes = new MBBlendShape[mc.blendShapes.Length]; for (int i = 0; i < shapes.Length; i++) { shapes[i] = new MBBlendShape(); 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 MBBlendShape[0]); } }