/// <summary> /// 各パーツメッシュの持つインデックスをすべて結合し、ひとつの配列にして返す。 /// その際各メッシュの頂点数は、次のインデックスのベースとなる。 /// また、マテリアル別のサブメッシュも、ひとつに統合される。 /// </summary> public static int[][] ToIndicesArray ( IEnumerable <Vector3[]> vertices_PerMesh, IEnumerable <IEnumerable <int[]> > indices_PerSubmeshPerMesh, IEnumerable <Matrix4x4> mtPart_PerMesh ) { var mts = mtPart_PerMesh; var qBaseVtxs = PerMesh.QueryBaseVertex(vertices_PerMesh); var qIndex = from xyz_ in (indices_PerSubmeshPerMesh, mts, qBaseVtxs).Zip() select(idxss: xyz_.x, mt: xyz_.y, baseVtx: xyz_.z) into srcPerMesh from idxs in srcPerMesh.idxss from index in IndexUtility.ReverseEvery3_IfMinusScale(idxs, srcPerMesh.mt) select srcPerMesh.baseVtx + index; return(new int[][] { qIndex.ToArray() }); //return Enumerable.Repeat( qIndex, 1 ).ToArrayRecursive2(); }
/// <summary> /// 各パーツメッシュの持つインデックスを結合し、最終的なサブメッシュごとの配列にして返す。 /// その際各メッシュの頂点数は、次のインデックスのベースとなる。 /// </summary> public static int[][] ToIndicesArray ( IEnumerable <Vector3[]> vertices_PerMesh, IEnumerable <IEnumerable <int[]> > indices_PerSubmeshPerMesh, IEnumerable <Matrix4x4> mtPart_PerMesh, IEnumerable <Material[]> materials_PerMesh, IEnumerable <Material> materialsCombined ) { var qDstMatHashes = from mat in materialsCombined select mat.GetHashCode(); var qSrcMatHashes = materials_PerMesh.To(PerSubMeshPerMesh.QueryMaterialHash); var idxsss = indices_PerSubmeshPerMesh; var mts = mtPart_PerMesh; var qBaseVtxs = PerMesh.QueryBaseVertex(vertices_PerMesh); var qPerMesh = (idxsss, qSrcMatHashes, mts, qBaseVtxs) .Zip((x, y, z, w) => (idxss: x, hashes: y, mt: z, baseVtx: w)); var qSrcMatGroups = from src in qPerMesh from perSub in (src.idxss, src.hashes).Zip((x, y) => (idxs: x, hash: y, src.mt, src.baseVtx)) group perSub by perSub.hash ; var qIdxsPerDstMat = from dstHash in qDstMatHashes join srcs in qSrcMatGroups on dstHash equals srcs.Key select from src in srcs from idx in src.idxs.ReverseEvery3_IfMinusScale(src.mt) select src.baseVtx + idx; return(qIdxsPerDstMat.ToArrayRecursive2()); }