/// <summary> /// 1マテリアルの頂点数が1メッシュで表現出来ないので分割する /// </summary> /// <returns>メッシュ作成情報のマテリアルパック</returns> /// <param name='creation_infos'>メッシュ作成情報のマテリアルパック</param> private List <MeshCreationInfo.Pack> SplitSubMesh(MeshCreationInfo.Pack pack) { var result = new List <MeshCreationInfo.Pack>(); //1メッシュに収まらないなら var plane_end = (uint)pack.plane_indices.Length; uint plane_start = 0; while (plane_start < plane_end) { //まだ面が有るなら uint plane_count = 0; uint vertex_count = 0; while (true) { //現在の頂点数から考えると、余裕分の1/3迄の数の面は安定して入る //はみ出て欲しいから更に1面(3頂点)を足す plane_count += (c_max_vertex_count_in_mesh - vertex_count) / 3 * 3 + 3; vertex_count = (uint)pack.plane_indices.Skip((int)plane_start) //面頂点インデックス取り出し(先頭) .Take((int)plane_count) //面頂点インデックス取り出し(末尾) .Distinct() //重複削除 .Count(); //個数取得 if (c_max_vertex_count_in_mesh <= vertex_count) { //1メッシュを超えているなら //此処でのメッシュ超えは必ずc_max_vertex_count_in_meshぎりぎりで有り、1面(3頂点)を1つ取れば収まる様になっている plane_count -= 3; break; } if (plane_end <= plane_start + plane_count) { //面の最後なら break; } } //分離分を戻り値の追加 var result_pack = new MeshCreationInfo.Pack(); ; result_pack.material_index = pack.material_index; result_pack.plane_indices = pack.plane_indices.Skip((int)plane_start) //面頂点インデックス取り出し(先頭) .Take((int)plane_count) //面頂点インデックス取り出し(末尾) .ToArray(); result_pack.vertices = result_pack.plane_indices.Distinct() //重複削除 .ToArray(); result.Add(result_pack); //開始点を後ろに plane_start += plane_count; } return(result); }
/// <summary> /// 全マテリアルをメッシュ作成情報のマテリアルパックとして返す /// </summary> /// <returns>メッシュ作成情報のマテリアルパック</returns> private MeshCreationInfo.Pack[] CreateMeshCreationInfoPacks() { uint plane_start = 0; //マテリアル単位のMeshCreationInfo.Packを作成する return(Enumerable.Range(0, format_.material_list.material.Length) .Select(x => { var pack = new MeshCreationInfo.Pack(); pack.material_index = (uint)x; var plane_count = format_.material_list.material[x].face_vert_count; pack.plane_indices = format_.face_vertex_list.face_vert_index.Skip((int)plane_start) .Take((int)plane_count) .ToArray(); pack.vertices = pack.plane_indices.Distinct() //重複削除 .ToArray(); plane_start += plane_count; return pack; }) .ToArray()); }
/// <summary> /// 全マテリアルをメッシュ作成情報のマテリアルパックとして返す /// </summary> /// <returns>メッシュ作成情報のマテリアルパック</returns> MeshCreationInfo.Pack[] CreateMeshCreationInfoPacks() { uint plane_start = 0; //マテリアル単位のMeshCreationInfo.Packを作成する return Enumerable.Range(0, format_.material_list.material.Length) .Select(x=>{ MeshCreationInfo.Pack pack = new MeshCreationInfo.Pack(); pack.material_index = (uint)x; pack.plane_count = format_.material_list.material[x].face_vert_count; pack.plane_start = plane_start; plane_start += pack.plane_count; pack.vertices = format_.face_vertex_list.face_vert_index.Skip((int)pack.plane_start) .Take((int)pack.plane_count) //面頂点インデックス取り出し .Distinct() //重複削除 .ToArray(); return pack; }) .ToArray(); }
/// <summary> /// 1マテリアルの頂点数が1メッシュで表現出来ないので分割する /// </summary> /// <returns>メッシュ作成情報のマテリアルパック</returns> /// <param name='creation_infos'>メッシュ作成情報のマテリアルパック</param> List<MeshCreationInfo.Pack> SplitSubMesh(MeshCreationInfo.Pack pack) { List<MeshCreationInfo.Pack> result = new List<MeshCreationInfo.Pack>(); //1メッシュに収まらないなら uint plane_end = (uint)pack.plane_indices.Length; uint plane_start = 0; while (plane_start < plane_end) { //まだ面が有るなら uint plane_count = 0; uint vertex_count = 0; while (true) { //現在の頂点数から考えると、余裕分の1/3迄の数の面は安定して入る //はみ出て欲しいから更に1面(3頂点)を足す plane_count += (c_max_vertex_count_in_mesh - vertex_count) / 3 * 3 + 3; vertex_count = (uint)pack.plane_indices.Skip((int)plane_start) //面頂点インデックス取り出し(先頭) .Take((int)plane_count) //面頂点インデックス取り出し(末尾) .Distinct() //重複削除 .Count(); //個数取得 if (c_max_vertex_count_in_mesh <= vertex_count) { //1メッシュを超えているなら //此処でのメッシュ超えは必ずc_max_vertex_count_in_meshぎりぎりで有り、1面(3頂点)を1つ取れば収まる様になっている plane_count -= 3; break; } if (plane_end <= (plane_start + plane_count)) { //面の最後なら break; } } //分離分を戻り値の追加 MeshCreationInfo.Pack result_pack = new MeshCreationInfo.Pack();; result_pack.material_index = pack.material_index; result_pack.plane_indices = pack.plane_indices.Skip((int)plane_start) //面頂点インデックス取り出し(先頭) .Take((int)plane_count) //面頂点インデックス取り出し(末尾) .ToArray(); result_pack.vertices = result_pack.plane_indices.Distinct() //重複削除 .ToArray(); result.Add(result_pack); //開始点を後ろに plane_start += plane_count; } return result; }