public void AddMesh(ModelMeshPartContent mmpc)
        {
            //  build a look-up table for channel in to channel out
            VertexElement[]  ves       = mmpc.GetVertexDeclaration();
            int[]            dstOffset = new int[ves.Length];
            ReadConversion[] converter = new ReadConversion[ves.Length];
            int stride = 0;

            for (int i = 0, n = ves.Length; i != n; ++i)
            {
                dstOffset[i] = MatchComponent(ves[i], out converter[i], ref stride);
            }
            object colorValue;

            if (!mmpc.Material.OpaqueData.TryGetValue("Diffuse", out colorValue) ||
                colorValue == null || !(colorValue is Color))
            {
                materialColor_ = Color.White;
            }
            else
            {
                materialColor_ = (Color)colorValue;
            }
            //  walk the primitives and build triangle data
            for (int i = 0, n = mmpc.PrimitiveCount; i != n; ++i)
            {
                //  walk vertex declaration
                for (int q = 0, m = ves.Length; q != m; ++q)
                {
                    if (dstOffset[q] >= 0)
                    {
                        int ix, bytePos;

                        ix               = indexBufferData_[0 + i * 3 + mmpc.StartIndex];
                        bytePos          = ix * stride + mmpc.BaseVertex + ves[q].Offset;
                        v0[dstOffset[q]] = converter[q](vertexBufferData_, bytePos);

                        ix               = indexBufferData_[1 + i * 3 + mmpc.StartIndex];
                        bytePos          = ix * stride + mmpc.BaseVertex + ves[q].Offset;
                        v1[dstOffset[q]] = converter[q](vertexBufferData_, bytePos);

                        ix               = indexBufferData_[2 + i * 3 + mmpc.StartIndex];
                        bytePos          = ix * stride + mmpc.BaseVertex + ves[q].Offset;
                        v2[dstOffset[q]] = converter[q](vertexBufferData_, bytePos);
                    }
                }
                //  add triangle
                AddTriangle();
            }
        }
        int MatchComponent(VertexElement ve, out ReadConversion converter, ref int stride)
        {
            if (ve.Stream != 0)
            {
                throw new System.FormatException("MultiPieceBuilder cannot use input meshes with multiple streams.");
            }
            int end = ve.Offset + GetFormatSize(ve.VertexElementFormat);

            if (end > stride)
            {
                stride = end;
            }
            converter = null;
            for (int i = 0, n = dataChannels.Count; i != n; ++i)
            {
                if (dataChannels[i].VertexElementUsage == ve.VertexElementUsage &&
                    dataChannels[i].UsageIndex == ve.UsageIndex)
                {
                    switch (ve.VertexElementFormat)
                    {
                    case VertexElementFormat.Color:
                        switch (dataChannels[i].VertexElementFormat)
                        {
                        case VertexElementFormat.Color:
                            converter = new ReadConversion(ReadColorFromColor);
                            return(i);

                        case VertexElementFormat.Vector3:
                            converter = new ReadConversion(ReadColorFromVector3);
                            return(1);

                        case VertexElementFormat.Vector4:
                            converter = new ReadConversion(ReadColorFromVector4);
                            return(i);
                        }
                        break;

                    case VertexElementFormat.Vector2:
                        if (dataChannels[i].VertexElementFormat == VertexElementFormat.Vector2)
                        {
                            converter = new ReadConversion(ReadVector2FromVector2);
                            return(i);
                        }
                        break;

                    case VertexElementFormat.Vector3:
                        if (dataChannels[i].VertexElementFormat == VertexElementFormat.Vector3)
                        {
                            converter = new ReadConversion(ReadVector3FromVector3);
                            return(i);
                        }
                        break;
                    }
                    throw new System.InvalidOperationException(
                              String.Format("Can't map {0} to {1} for vertex element format.",
                                            ve.VertexElementFormat, dataChannels[i].VertexElementFormat));
                }
            }
            return(-1);
        }