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