@@ -82,9 +82,6 @@ namespace {
8282 // 範囲の境界上にある地物を取り逃さないように、範囲を少し広げます。
8383 auto extents = MeshExtractor::extendExtents (extents_before_adjust, 1 .2f );
8484
85- std::map<unsigned , Node*> grid_nodes; // グリッドIDとグリッドノードのマップ
86-
87- // rootNode として LODノード を作ります。
8885 for (unsigned lod = options.min_lod ; lod <= options.max_lod ; lod++) {
8986
9087 // 3D都市モデルをグリッドに分け、グリッドごとにメッシュをマージします。
@@ -95,18 +92,33 @@ namespace {
9592 // model -> GRIDノード -> LODノード -> ノード
9693 for (auto & [grid_id, mesh] : result) {
9794
98- if (grid_nodes.find (grid_id) == grid_nodes.end ()) {
95+ const auto & grid_name = " GRID_" + std::to_string (grid_id);
96+ const auto & lod_name = " LOD" + std::to_string (lod);
97+
98+ const auto grid_index = out_model.getRootNodeIndexByName (grid_name);
99+ auto node = Node (" LOD" + std::to_string (lod), std::move (mesh));
100+
101+ if (grid_index == -1 ) {
99102 // 存在しない場合 新しいグリッドノードとLODノードを作成
100- auto grid_node = Node (" GRID_" + std::to_string (grid_id));
101- auto & new_grid_node = out_model.addNode (std::move (grid_node));
102- grid_nodes[grid_id] = &new_grid_node; // 新しいグリッドノードを保存
103- }
104-
105- auto outer_it = grid_nodes.find (grid_id);
106- if (outer_it != grid_nodes.end ()) {
107- Node* grid_node = outer_it->second ;
108- auto node = Node (" LOD" + std::to_string (lod), std::move (mesh));
109- grid_node->addChildNode (std::move (node));
103+ auto grid_node = Node (grid_name);
104+ auto & new_grid_node = out_model.addNode (std::move (grid_node));
105+ auto lod_node = Node (lod_name);
106+ lod_node.addChildNode (std::move (node));
107+ new_grid_node.addChildNode (std::move (lod_node));
108+ }
109+ else {
110+ auto & grid_node = out_model.getRootNodeAt (grid_index);
111+ const auto lod_index = grid_node.getChildIndexByName (lod_name);
112+ if (lod_index == -1 ) {
113+ // LODノードが存在しない場合、新しいLODノードを作成
114+ auto lod_node = Node (lod_name);
115+ lod_node.addChildNode (std::move (node));
116+ grid_node.addChildNode (std::move (lod_node));
117+ }
118+ else {
119+ // 既存のLODノードにノードを追加
120+ grid_node.getChildAt (lod_index).addChildNode (std::move (node));
121+ }
110122 }
111123 }
112124 }
@@ -123,7 +135,6 @@ namespace {
123135 }
124136
125137 }
126- grid_nodes.clear (); // グリッドノードのマップをクリア
127138
128139 out_model.eraseEmptyNodes ();
129140 out_model.assignNodeHierarchy ();
0 commit comments