12
12
#include < Cesium3DTilesReader/BoundingVolumeReader.h>
13
13
#include < Cesium3DTilesReader/ContentReader.h>
14
14
#include < Cesium3DTilesReader/ExtensionContent3dTilesContentVoxelsReader.h>
15
- #include < Cesium3DTilesReader/GroupMetadataReader.h>
16
- #include < Cesium3DTilesReader/MetadataEntityReader.h>
17
- #include < Cesium3DTilesReader/SchemaReader.h>
15
+ #include < Cesium3DTilesReader/TilesetReader.h>
18
16
#include < Cesium3DTilesSelection/BoundingVolume.h>
19
17
#include < Cesium3DTilesSelection/Tile.h>
20
18
#include < Cesium3DTilesSelection/TileContent.h>
24
22
#include < Cesium3DTilesSelection/TilesetContentLoader.h>
25
23
#include < Cesium3DTilesSelection/TilesetContentLoaderResult.h>
26
24
#include < Cesium3DTilesSelection/TilesetExternals.h>
25
+ #include < Cesium3DTilesSelection/TilesetMetadata.h>
27
26
#include < CesiumAsync/AsyncSystem.h>
28
27
#include < CesiumAsync/HttpHeaders.h>
29
28
#include < CesiumAsync/IAssetAccessor.h>
60
59
#include < cstddef>
61
60
#include < cstdint>
62
61
#include < cstring>
62
+ #include < iterator>
63
63
#include < memory>
64
64
#include < optional>
65
65
#include < span>
@@ -710,41 +710,55 @@ TilesetContentLoaderResult<TilesetJsonLoader> parseTilesetJson(
710
710
ErrorList{}};
711
711
}
712
712
713
- void parseTilesetMetadata (
713
+ void removeRootPropertyAndParseTilesetMetadata (
714
+ const std::shared_ptr<spdlog::logger>& pLogger,
714
715
const std::string& baseUrl,
715
- const rapidjson::Document& tilesetJson,
716
+ rapidjson::Document& & tilesetJson,
716
717
TileExternalContent& externalContent) {
717
- auto schemaIt = tilesetJson.FindMember (" schema" );
718
- if (schemaIt != tilesetJson.MemberEnd ()) {
719
- Cesium3DTilesReader::SchemaReader schemaReader;
720
- auto schemaResult = schemaReader.readFromJson (schemaIt->value );
721
- if (schemaResult.value ) {
722
- externalContent.metadata .schema = std::move (*schemaResult.value );
723
- }
724
- }
725
-
726
- auto schemaUriIt = tilesetJson.FindMember (" schemaUri" );
727
- if (schemaUriIt != tilesetJson.MemberEnd () && schemaUriIt->value .IsString ()) {
728
- externalContent.metadata .schemaUri =
729
- CesiumUtility::Uri::resolve (baseUrl, schemaUriIt->value .GetString ());
730
- }
731
-
732
- const auto metadataIt = tilesetJson.FindMember (" metadata" );
733
- if (metadataIt != tilesetJson.MemberEnd ()) {
734
- Cesium3DTilesReader::MetadataEntityReader metadataReader;
735
- auto metadataResult = metadataReader.readFromJson (metadataIt->value );
736
- if (metadataResult.value ) {
737
- externalContent.metadata .metadata = std::move (*metadataResult.value );
738
- }
718
+ // Remove the root tile from the RapidJSON document. Parsing the complete tile
719
+ // tree will take too long, and we don't need it.
720
+ tilesetJson.RemoveMember (" root" );
721
+
722
+ Cesium3DTilesReader::TilesetReader tilesetReader;
723
+ auto tilesetResult = tilesetReader.readFromJson (tilesetJson);
724
+
725
+ if (!tilesetResult.errors .empty () || !tilesetResult.warnings .empty ()) {
726
+ ErrorList errorList;
727
+ errorList.warnings .resize (
728
+ tilesetResult.errors .size () + tilesetResult.warnings .size ());
729
+ std::copy (
730
+ std::make_move_iterator (tilesetResult.errors .begin ()),
731
+ std::make_move_iterator (tilesetResult.errors .end ()),
732
+ errorList.warnings .begin ());
733
+ std::copy (
734
+ std::make_move_iterator (tilesetResult.warnings .begin ()),
735
+ std::make_move_iterator (tilesetResult.warnings .end ()),
736
+ errorList.warnings .begin () + std::vector<std::string>::difference_type (
737
+ tilesetResult.errors .size ()));
738
+ errorList.logWarning (pLogger, " Could not parse metadata from tileset.json" );
739
739
}
740
740
741
- const auto groupsIt = tilesetJson.FindMember (" groups" );
742
- if (groupsIt != tilesetJson.MemberEnd ()) {
743
- Cesium3DTilesReader::GroupMetadataReader groupMetadataReader;
744
- auto groupsResult = groupMetadataReader.readArrayFromJson (groupsIt->value );
745
- if (groupsResult.value ) {
746
- externalContent.metadata .groups = std::move (*groupsResult.value );
741
+ if (tilesetResult.value ) {
742
+ Cesium3DTiles::Tileset& tileset = *tilesetResult.value ;
743
+ Cesium3DTilesSelection::TilesetMetadata& metadata =
744
+ externalContent.metadata ;
745
+
746
+ metadata.asset = std::move (tileset.asset );
747
+ metadata.extensions = std::move (tileset.extensions );
748
+ metadata.extensionsRequired = std::move (tileset.extensionsRequired );
749
+ metadata.extensionsUsed = std::move (tileset.extensionsUsed );
750
+ metadata.extras = std::move (tileset.extras );
751
+ metadata.geometricError = tileset.geometricError ;
752
+ metadata.groups = std::move (tileset.groups );
753
+ metadata.metadata = std::move (tileset.metadata );
754
+ metadata.properties = std::move (tileset.properties );
755
+ metadata.schema = std::move (tileset.schema );
756
+ if (tileset.schemaUri ) {
757
+ metadata.schemaUri =
758
+ CesiumUtility::Uri::resolve (baseUrl, *tileset.schemaUri );
747
759
}
760
+ metadata.statistics = std::move (tileset.statistics );
761
+ metadata.unknownProperties = std::move (tileset.unknownProperties );
748
762
}
749
763
}
750
764
@@ -792,9 +806,10 @@ TileLoadResult parseExternalTilesetInWorkerThread(
792
806
ellipsoid);
793
807
794
808
// Populate the root tile with metadata
795
- parseTilesetMetadata (
809
+ removeRootPropertyAndParseTilesetMetadata (
810
+ pLogger,
796
811
tileUrl,
797
- tilesetJson,
812
+ std::move ( tilesetJson) ,
798
813
externalContentInitializer.externalContent );
799
814
800
815
// check and log any errors
@@ -893,7 +908,7 @@ TilesetJsonLoader::createLoader(
893
908
pLogger,
894
909
pCompletedRequest->url (),
895
910
pCompletedRequest->headers (),
896
- tilesetJson,
911
+ std::move ( tilesetJson) ,
897
912
ellipsoid);
898
913
});
899
914
}
@@ -905,7 +920,7 @@ TilesetJsonLoader::createLoader(
905
920
const std::shared_ptr<spdlog::logger>& pLogger,
906
921
const std::string& tilesetJsonUrl,
907
922
const CesiumAsync::HttpHeaders& requestHeaders,
908
- const rapidjson::Document& tilesetJson,
923
+ rapidjson::Document& & tilesetJson,
909
924
const CesiumGeospatial::Ellipsoid& ellipsoid) {
910
925
TilesetContentLoaderResult<TilesetJsonLoader> result = parseTilesetJson (
911
926
pLogger,
@@ -963,7 +978,11 @@ TilesetJsonLoader::createLoader(
963
978
result.pRootTile ->getContent ().getExternalContent ();
964
979
CESIUM_ASSERT (pExternal);
965
980
if (pExternal) {
966
- parseTilesetMetadata (tilesetJsonUrl, tilesetJson, *pExternal);
981
+ removeRootPropertyAndParseTilesetMetadata (
982
+ pLogger,
983
+ tilesetJsonUrl,
984
+ std::move (tilesetJson),
985
+ *pExternal);
967
986
}
968
987
969
988
return asyncSystem.createResolvedFuture (std::move (result))
0 commit comments