Skip to content

Commit 69f1c86

Browse files
committed
Model/Node側のメソッドでchild node 有無判定( Mapを使わない )
1 parent c15deec commit 69f1c86

File tree

5 files changed

+51
-15
lines changed

5 files changed

+51
-15
lines changed

include/plateau/polygon_mesh/model.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ namespace plateau::polygonMesh {
4040

4141
Node& getRootNodeAt(size_t index);
4242
const Node& getRootNodeAt(size_t index) const;
43+
const int getRootNodeIndexByName(const std::string name) const;
4344

4445
/// 各ノードのペアレント、ルートを設定します。
4546
void assignNodeHierarchy();

include/plateau/polygon_mesh/node.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ namespace plateau::polygonMesh {
5454
Node& getChildAt(unsigned int index);
5555
const Node& getChildAt(unsigned int index) const;
5656

57+
const int getChildIndexByName(const std::string name) const;
58+
5759
/// Parent Node設定
5860
void setParentNode(Node* node);
5961
const Node& getParentNode() const; //Model.assignNodeHierarchyを呼ぶことで取得可能になります。

src/polygon_mesh/model.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ namespace plateau::polygonMesh {
3434
return root_nodes_.at(index);
3535
}
3636

37+
const int Model::getRootNodeIndexByName(const std::string name) const {
38+
int num_children = getRootNodeCount();
39+
for (int i = 0; i < num_children; ++i) {
40+
auto& child_node = getRootNodeAt(i);
41+
if (child_node.getName() == name) {
42+
return i;
43+
}
44+
}
45+
return -1;
46+
}
47+
3748
void Model::eraseEmptyNodes() {
3849
auto new_end = std::remove_if(root_nodes_.begin(), root_nodes_.end(), [](Node& node) {
3950
node.eraseEmptyChildren();

src/polygon_mesh/node.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,17 @@ namespace plateau::polygonMesh {
121121
return child_nodes_.at(index);
122122
}
123123

124+
const int Node::getChildIndexByName(const std::string name) const {
125+
int num_children = getChildCount();
126+
for (int i = 0; i < num_children; ++i) {
127+
auto& child_node = getChildAt(i);
128+
if (child_node.getName() == name) {
129+
return i;
130+
}
131+
}
132+
return -1;
133+
}
134+
124135
void Node::eraseEmptyChildren() {
125136
const auto new_end = std::remove_if(child_nodes_.begin(), child_nodes_.end(), [](Node& child) {
126137
child.eraseEmptyChildren();

src/polygon_mesh/tile_extractor.cpp

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)