@@ -129,7 +129,7 @@ namespace plateau::polygonMesh {
129129 }
130130 }
131131
132- void Mesh::addSubMesh (const std::string& texture_path, size_t sub_mesh_start_index, size_t sub_mesh_end_index) {
132+ void Mesh::addSubMesh (const std::string& texture_path, std::shared_ptr< const citygml::Material> material, size_t sub_mesh_start_index, size_t sub_mesh_end_index) {
133133 // テクスチャが異なる場合は追加します。
134134 // TODO テクスチャありのポリゴン と なしのポリゴン が交互にマージされることで、テクスチャなしのサブメッシュが大量に生成されるので描画負荷に改善の余地ありです。
135135 // テクスチャなしのサブメッシュは1つにまとめたいところです。テクスチャなしのポリゴンを連続してマージすることで1つにまとまるはずです。
@@ -141,11 +141,20 @@ namespace plateau::polygonMesh {
141141 } else {
142142 auto & last_texture_path = sub_meshes_.rbegin ()->getTexturePath ();
143143 is_different_tex = texture_path != last_texture_path;
144+
145+ // 前と同じマテリアルかどうか判定します。
146+ if (!is_different_tex) {
147+ auto last_material = sub_meshes_.rbegin ()->getMaterial ();
148+ if (material != nullptr && last_material != nullptr )
149+ is_different_tex = material->getId () != last_material->getId ();
150+ else if ((material == nullptr && last_material != nullptr ) || (material != nullptr && last_material == nullptr ))
151+ is_different_tex = true ;
152+ }
144153 }
145154
146155 if (is_different_tex) {
147156 // テクスチャが違うなら、サブメッシュを追加します。
148- SubMesh::addSubMesh (sub_mesh_start_index, sub_mesh_end_index, texture_path, sub_meshes_);
157+ SubMesh::addSubMesh (sub_mesh_start_index, sub_mesh_end_index, texture_path, material, sub_meshes_);
149158 } else {
150159 // テクスチャが同じなら、最後のサブメッシュの範囲を延長して新しい部分の終わりに合わせます。
151160 extendLastSubMesh (sub_mesh_end_index);
@@ -154,7 +163,7 @@ namespace plateau::polygonMesh {
154163
155164 void Mesh::extendLastSubMesh (size_t sub_mesh_end_index) {
156165 if (sub_meshes_.empty ()) {
157- sub_meshes_.emplace_back (0 , sub_mesh_end_index, " " );
166+ sub_meshes_.emplace_back (0 , sub_mesh_end_index, " " , nullptr );
158167 } else {
159168 sub_meshes_.at (sub_meshes_.size () - 1 ).setEndIndex (sub_mesh_end_index);
160169 }
0 commit comments