Skip to content

Commit 5ce4be5

Browse files
authored
Merge branch 'main' into maxar-geojson-schema
2 parents 3ab3b83 + 1181d65 commit 5ce4be5

11 files changed

Lines changed: 134 additions & 55 deletions

File tree

CHANGES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
- The `AccessorView` and `AccessorWriter` constructor overloads that take raw buffer data now require an additional `normalized` argument.
1111
- The `getQuaternionAccessorView` overload that took an accessor pointer now takes an accessor reference.
1212
- Renamed `MAXAR_content_geojson` class `ExtensionMaxarContentGeoJson` to `ExtensionTilesetMaxarContentGeoJson`.
13+
- `forEachTile` and `forEachContent` now take an additional `refine` argument in the callback function.
1314

1415
##### Additions :tada:
1516

Cesium3DTiles/include/Cesium3DTiles/Tileset.h

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,19 @@ struct CESIUM3DTILES_API Tileset : public TilesetSpec {
1515

1616
/**
1717
* @brief A callback function for {@link forEachTile}.
18+
*
19+
* @param tileset The tileset.
20+
* @param tile The tile.
21+
* @param transform The tile's world transform, computed from the product of
22+
* the parent's world transform and the tile's local transform.
23+
* @param refine The tile's refine property, potentially inherited from an
24+
* ancestor tile if not set.
1825
*/
1926
typedef void ForEachTileCallback(
2027
Tileset& tileset,
2128
Tile& tile,
22-
const glm::dmat4& transform);
29+
const glm::dmat4& transform,
30+
const std::string& refine);
2331

2432
/**
2533
* @brief Apply the given callback to all tiles.
@@ -31,25 +39,33 @@ struct CESIUM3DTILES_API Tileset : public TilesetSpec {
3139
*/
3240
void forEachTile(std::function<ForEachTileCallback>&& callback);
3341

34-
/**
35-
* @brief A callback function for {@link forEachTile}.
36-
*/
42+
/** @copydoc Tileset::ForEachTileCallback */
3743
typedef void ForEachTileConstCallback(
3844
const Tileset& tileset,
3945
const Tile& tile,
40-
const glm::dmat4& transform);
46+
const glm::dmat4& transform,
47+
const std::string& refine);
4148

4249
/** @copydoc Tileset::forEachTile */
4350
void forEachTile(std::function<ForEachTileConstCallback>&& callback) const;
4451

4552
/**
4653
* @brief A callback function for {@link forEachContent}.
54+
*
55+
* @param tileset The tileset.
56+
* @param tile The tile.
57+
* @param content The content.
58+
* @param transform The tile's world transform, computed from the product of
59+
* the parent's world transform and the tile's local transform.
60+
* @param refine The tile's refine property, potentially inherited from an
61+
* ancestor tile if not set.
4762
*/
4863
typedef void ForEachContentCallback(
4964
Tileset& tileset,
5065
Tile& tile,
5166
Content& content,
52-
const glm::dmat4& transform);
67+
const glm::dmat4& transform,
68+
const std::string& refine);
5369

5470
/**
5571
* @brief Apply the given callback to all contents.
@@ -61,14 +77,13 @@ struct CESIUM3DTILES_API Tileset : public TilesetSpec {
6177
*/
6278
void forEachContent(std::function<ForEachContentCallback>&& callback);
6379

64-
/**
65-
* @brief A callback function for {@link forEachContent}.
66-
*/
80+
/** @copydoc Tileset::ForEachContentCallback */
6781
typedef void ForEachContentConstCallback(
6882
const Tileset& tileset,
6983
const Tile& tile,
7084
const Content& content,
71-
const glm::dmat4& transform);
85+
const glm::dmat4& transform,
86+
const std::string& refine);
7287

7388
/** @copydoc Tileset::forEachContent */
7489
void

Cesium3DTiles/src/Tileset.cpp

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,39 +35,57 @@ std::optional<glm::dmat4> getTileTransform(const Cesium3DTiles::Tile& tile) {
3535
template <typename TCallback>
3636
void forEachContentRecursive(
3737
const glm::dmat4& transform,
38+
const std::string& refine,
3839
const Tileset& tileset,
3940
const Tile& tile,
4041
TCallback& callback) {
4142
glm::dmat4 tileTransform =
4243
transform * getTileTransform(tile).value_or(glm::dmat4(1.0));
4344

45+
// Inherit parent's refine if not set
46+
const std::string& tileRefine = tile.refine.value_or(refine);
47+
4448
if (tile.content) {
45-
callback(tileset, tile, *tile.content, tileTransform);
49+
callback(tileset, tile, *tile.content, tileTransform, tileRefine);
4650
}
4751

4852
// 3D Tiles 1.1 multiple contents
4953
for (const Cesium3DTiles::Content& content : tile.contents) {
50-
callback(tileset, tile, content, tileTransform);
54+
callback(tileset, tile, content, tileTransform, tileRefine);
5155
}
5256

5357
for (const Cesium3DTiles::Tile& childTile : tile.children) {
54-
forEachContentRecursive(tileTransform, tileset, childTile, callback);
58+
forEachContentRecursive(
59+
tileTransform,
60+
tileRefine,
61+
tileset,
62+
childTile,
63+
callback);
5564
}
5665
}
5766

5867
template <typename TCallback>
5968
void forEachTileRecursive(
6069
const glm::dmat4& transform,
70+
const std::string& refine,
6171
const Tileset& tileset,
6272
const Tile& tile,
6373
TCallback& callback) {
6474
glm::dmat4 tileTransform =
6575
transform * getTileTransform(tile).value_or(glm::dmat4(1.0));
6676

67-
callback(tileset, tile, tileTransform);
77+
// Inherit parent's refine if not set
78+
const std::string& tileRefine = tile.refine.value_or(refine);
79+
80+
callback(tileset, tile, tileTransform, tileRefine);
6881

6982
for (const Cesium3DTiles::Tile& childTile : tile.children) {
70-
forEachTileRecursive(tileTransform, tileset, childTile, callback);
83+
forEachTileRecursive(
84+
tileTransform,
85+
tileRefine,
86+
tileset,
87+
childTile,
88+
callback);
7189
}
7290
}
7391

@@ -78,17 +96,24 @@ void Tileset::forEachTile(std::function<ForEachTileCallback>&& callback) {
7896
[&callback](
7997
const Tileset& tileset,
8098
const Tile& tile,
81-
const glm::dmat4& transform) {
99+
const glm::dmat4& transform,
100+
const std::string& refine) {
82101
callback(
83102
const_cast<Tileset&>(tileset),
84103
const_cast<Tile&>(tile),
85-
transform);
104+
transform,
105+
refine);
86106
});
87107
}
88108

89109
void Tileset::forEachTile(
90110
std::function<ForEachTileConstCallback>&& callback) const {
91-
forEachTileRecursive(glm::dmat4(1.0), *this, this->root, callback);
111+
forEachTileRecursive(
112+
glm::dmat4(1.0),
113+
Cesium3DTiles::Tile::Refine::ADD,
114+
*this,
115+
this->root,
116+
callback);
92117
}
93118

94119
void Tileset::forEachContent(std::function<ForEachContentCallback>&& callback) {
@@ -97,18 +122,25 @@ void Tileset::forEachContent(std::function<ForEachContentCallback>&& callback) {
97122
const Tileset& tileset,
98123
const Tile& tile,
99124
const Content& content,
100-
const glm::dmat4& transform) {
125+
const glm::dmat4& transform,
126+
const std::string& refine) {
101127
callback(
102128
const_cast<Tileset&>(tileset),
103129
const_cast<Tile&>(tile),
104130
const_cast<Content&>(content),
105-
transform);
131+
transform,
132+
refine);
106133
});
107134
}
108135

109136
void Tileset::forEachContent(
110137
std::function<ForEachContentConstCallback>&& callback) const {
111-
forEachContentRecursive(glm::dmat4(1.0), *this, this->root, callback);
138+
forEachContentRecursive(
139+
glm::dmat4(1.0),
140+
Cesium3DTiles::Tile::Refine::ADD,
141+
*this,
142+
this->root,
143+
callback);
112144
}
113145

114146
void Tileset::addExtensionUsed(const std::string& extensionName) {

Cesium3DTiles/test/TestTileset.cpp

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include "Cesium3DTiles/Tile.h"
2+
13
#include <Cesium3DTiles/Tileset.h>
24

35
#include <doctest/doctest.h>
@@ -20,6 +22,11 @@ TEST_CASE("forEachTile") {
2022

2123
Tile& grandchild = child0.children.emplace_back();
2224

25+
root.refine = Cesium3DTiles::Tile::Refine::ADD;
26+
child0.refine = Cesium3DTiles::Tile::Refine::REPLACE;
27+
child1.refine = std::nullopt;
28+
grandchild.refine = Cesium3DTiles::Tile::Refine::ADD;
29+
2330
glm::dmat4 rootTransform = glm::dmat4(2.0);
2431
glm::dmat4 child0Transform = glm::dmat4(3.0);
2532
glm::dmat4 child1Transform = glm::dmat4(4.0);
@@ -40,17 +47,27 @@ TEST_CASE("forEachTile") {
4047
rootTransform * child0Transform * grandchildTransform;
4148

4249
std::vector<glm::dmat4> transforms;
43-
tileset.forEachTile(
44-
[&transforms](
45-
Tileset& /* tileset */,
46-
Tile& /* tile */,
47-
const glm::dmat4& transform) { transforms.push_back(transform); });
50+
std::vector<std::string> refines;
51+
tileset.forEachTile([&transforms, &refines](
52+
Tileset& /* tileset */,
53+
Tile& /* tile */,
54+
const glm::dmat4& transform,
55+
const std::string& refine) {
56+
transforms.push_back(transform);
57+
refines.push_back(refine);
58+
});
4859

4960
REQUIRE(transforms.size() == 4);
5061
CHECK(transforms[0] == expectedRootTransform);
5162
CHECK(transforms[1] == expectedChild0Transform);
5263
CHECK(transforms[2] == expectedGrandchildTransform);
5364
CHECK(transforms[3] == expectedChild1Transform);
65+
66+
REQUIRE(refines.size() == 4);
67+
CHECK(refines[0] == Cesium3DTiles::Tile::Refine::ADD);
68+
CHECK(refines[1] == Cesium3DTiles::Tile::Refine::REPLACE);
69+
CHECK(refines[2] == Cesium3DTiles::Tile::Refine::ADD);
70+
CHECK(refines[3] == Cesium3DTiles::Tile::Refine::ADD);
5471
}
5572

5673
TEST_CASE("forEachContent") {
@@ -66,6 +83,11 @@ TEST_CASE("forEachContent") {
6683

6784
Tile& grandchild = child0.children.emplace_back();
6885

86+
root.refine = Cesium3DTiles::Tile::Refine::ADD;
87+
child0.refine = Cesium3DTiles::Tile::Refine::REPLACE;
88+
child1.refine = std::nullopt;
89+
grandchild.refine = Cesium3DTiles::Tile::Refine::ADD;
90+
6991
const Content& rootContent = root.content.emplace();
7092
const Content& child1Content = child1.content.emplace();
7193

@@ -94,13 +116,16 @@ TEST_CASE("forEachContent") {
94116
rootTransform * child0Transform * grandchildTransform;
95117

96118
std::vector<glm::dmat4> transforms;
119+
std::vector<std::string> refines;
97120
std::vector<Cesium3DTiles::Content*> contents;
98-
tileset.forEachContent([&transforms, &contents](
121+
tileset.forEachContent([&transforms, &refines, &contents](
99122
Tileset& /* tileset */,
100123
Tile& /* tile */,
101124
Content& content,
102-
const glm::dmat4& transform) {
125+
const glm::dmat4& transform,
126+
const std::string& refine) {
103127
transforms.push_back(transform);
128+
refines.push_back(refine);
104129
contents.push_back(&content);
105130
});
106131

@@ -110,6 +135,12 @@ TEST_CASE("forEachContent") {
110135
CHECK(transforms[2] == expectedGrandchildTransform);
111136
CHECK(transforms[3] == expectedChild1Transform);
112137

138+
REQUIRE(refines.size() == 4);
139+
CHECK(refines[0] == Cesium3DTiles::Tile::Refine::ADD);
140+
CHECK(refines[1] == Cesium3DTiles::Tile::Refine::ADD);
141+
CHECK(refines[2] == Cesium3DTiles::Tile::Refine::ADD);
142+
CHECK(refines[3] == Cesium3DTiles::Tile::Refine::ADD);
143+
113144
REQUIRE(contents.size() == 4);
114145
CHECK(contents[0] == &rootContent);
115146
CHECK(contents[1] == &grandchildContent0);

CesiumGltfReader/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,4 @@ target_link_libraries(CesiumGltfReader
6363
meshoptimizer::meshoptimizer
6464
modp_b64::modp_b64
6565
spz::spz
66-
WebP::webp
67-
WebP::webpdecoder
6866
)

CesiumImage/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ target_link_libraries(CesiumImage
5151
CesiumUtility
5252
PRIVATE
5353
KTX::ktx
54+
WebP::webp
55+
WebP::webpdecoder
5456
)
5557

5658
if(CESIUM_DISABLE_LIBJPEG_TURBO)
@@ -65,4 +67,4 @@ else()
6567
PRIVATE
6668
$<IF:$<TARGET_EXISTS:libjpeg-turbo::turbojpeg>,libjpeg-turbo::turbojpeg,libjpeg-turbo::turbojpeg-static>
6769
)
68-
endif()
70+
endif()

doc/diagrams/dependencies/CesiumGltfReader.mmd

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,9 @@ graph TD
1010
CesiumGltfReader[CesiumGltfReader] --> CesiumGltf[CesiumGltf]
1111
CesiumGltfReader[CesiumGltfReader] --> CesiumImage[CesiumImage]
1212
CesiumGltfReader[CesiumGltfReader] --> CesiumJsonReader[CesiumJsonReader]
13-
CesiumGltfReader[CesiumGltfReader] --> WebP_webp{{WebP::webp}}
14-
CesiumGltfReader[CesiumGltfReader] --> WebP_webpdecoder{{WebP::webpdecoder}}
1513
CesiumGltfReader[CesiumGltfReader] --> draco_draco{{draco::draco}}
16-
CesiumGltfReader[CesiumGltfReader] --> libjpeg-turbo_turbojpeg-static{{libjpeg-turbo::turbojpeg-static}}
1714
CesiumGltfReader[CesiumGltfReader] --> meshoptimizer_meshoptimizer{{meshoptimizer::meshoptimizer}}
1815
CesiumGltfReader[CesiumGltfReader] --> modp_b64_modp_b64{{modp_b64::modp_b64}}
1916
CesiumGltfReader[CesiumGltfReader] --> spz_spz{{spz::spz}}
20-
class WebP_webp,WebP_webpdecoder,draco_draco,libjpeg-turbo_turbojpeg-static,meshoptimizer_meshoptimizer,modp_b64_modp_b64,spz_spz dependencyNode
17+
class draco_draco,meshoptimizer_meshoptimizer,modp_b64_modp_b64,spz_spz dependencyNode
2118
class CesiumAsync,CesiumGltf,CesiumImage,CesiumJsonReader,CesiumGltfReader libraryNode

doc/diagrams/dependencies/CesiumImage.mmd

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@ graph TD
88
classDef libraryNode fill:#9f9,font-weight:bold,font-size:28px
99
CesiumImage[CesiumImage] --> CesiumUtility[CesiumUtility]
1010
CesiumImage[CesiumImage] --> KTX_ktx{{KTX::ktx}}
11-
class KTX_ktx dependencyNode
11+
CesiumImage[CesiumImage] --> WebP_webp{{WebP::webp}}
12+
CesiumImage[CesiumImage] --> WebP_webpdecoder{{WebP::webpdecoder}}
13+
CesiumImage[CesiumImage] --> libjpeg-turbo_turbojpeg-static{{libjpeg-turbo::turbojpeg-static}}
14+
class KTX_ktx,WebP_webp,WebP_webpdecoder,libjpeg-turbo_turbojpeg-static dependencyNode
1215
class CesiumUtility,CesiumImage libraryNode

0 commit comments

Comments
 (0)