예제 #1
0
        /// <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();
        }
예제 #2
0
        /// <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());
        }