Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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());
        }
Пример #3
0
 /// <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();
 }
Пример #4
0
		/// <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;
		}