@@ -712,7 +712,8 @@ CesiumAsync::Future<void> registerGltfModifier(
712
712
contentManager.getExternals ().asyncSystem ,
713
713
contentManager.getExternals ().pAssetAccessor ,
714
714
contentManager.getExternals ().pLogger ,
715
- pExternal ? pExternal->metadata : TilesetMetadata ())
715
+ pExternal ? pExternal->metadata : TilesetMetadata (),
716
+ *pRootTile)
716
717
.catchInMainThread ([&contentManager](std::exception&&) {
717
718
// Disable the failed glTF modifier.
718
719
contentManager.getExternals ().pGltfModifier .reset ();
@@ -1079,51 +1080,65 @@ void TilesetContentManager::loadTileContent(
1079
1080
if (_externals.pGltfModifier &&
1080
1081
_externals.pGltfModifier ->getCurrentVersion ().has_value () &&
1081
1082
tile.getState () == TileLoadState::Done) {
1082
- auto * renderContent = tile.getContent ().getRenderContent ();
1083
- if (renderContent &&
1084
- renderContent ->getGltfModifierState () == GltfModifier::State::Idle &&
1085
- renderContent ->getModel ().version !=
1083
+ TileRenderContent* pRenderContent = tile.getContent ().getRenderContent ();
1084
+ if (pRenderContent &&
1085
+ pRenderContent ->getGltfModifierState () == GltfModifier::State::Idle &&
1086
+ pRenderContent ->getModel ().version !=
1086
1087
_externals.pGltfModifier ->getCurrentVersion ()) {
1087
- renderContent->setGltfModifierState (GltfModifier::State::WorkerRunning);
1088
- glm::dvec4 rootTranslation = glm::dvec4 (0 ., 0 ., 0 ., 1 .);
1089
- if (this ->_pRootTile )
1090
- rootTranslation = glm::column (this ->_pRootTile ->getTransform (), 3 );
1091
- _externals.asyncSystem
1092
- .runInWorkerThread ([pGltfModifier = _externals.pGltfModifier ,
1093
- pPrepareRendererResources =
1094
- _externals.pPrepareRendererResources ,
1095
- asyncSystem = _externals.asyncSystem ,
1096
- &tile,
1097
- rendererOptions = tilesetOptions.rendererOptions ,
1098
- rootTranslation] {
1099
- // already known as being non-null
1100
- auto * renderContent = tile.getContent ().getRenderContent ();
1101
- auto & initialModel = renderContent->getModel ();
1102
- CesiumGltf::Model modifiedModel;
1103
- bool const wasModified = pGltfModifier->apply (
1104
- initialModel,
1105
- tile.getTransform (),
1106
- rootTranslation,
1107
- modifiedModel);
1108
- TileLoadResult tileLoadResult;
1109
- tileLoadResult.glTFUpAxis = [&](CesiumGltf::Model const & model) {
1110
- const auto it = model.extras .find (" gltfUpAxis" );
1111
- if (it == model.extras .end ()) {
1112
- CESIUM_ASSERT (false );
1113
- return CesiumGeometry::Axis::Y;
1114
- }
1115
- return static_cast <CesiumGeometry::Axis>(
1116
- it->second .getSafeNumberOrDefault (1 ));
1117
- }(wasModified ? modifiedModel : initialModel);
1118
- tileLoadResult.contentKind =
1119
- std::move (wasModified ? modifiedModel : initialModel);
1120
- tileLoadResult.state = TileLoadResultState::Success;
1121
- return pPrepareRendererResources->prepareInLoadThread (
1122
- asyncSystem,
1123
- std::move (tileLoadResult),
1124
- tile.getTransform (),
1125
- rendererOptions);
1088
+ pRenderContent->setGltfModifierState (GltfModifier::State::WorkerRunning);
1089
+
1090
+ const CesiumGltf::Model& previousModel = pRenderContent->getModel ();
1091
+
1092
+ this ->_externals .asyncSystem
1093
+ .runInWorkerThread ([asyncSystem = this ->_externals .asyncSystem ,
1094
+ pAssetAccessor = this ->_externals .pAssetAccessor ,
1095
+ pLogger = this ->_externals .pLogger ,
1096
+ pGltfModifier = _externals.pGltfModifier ,
1097
+ &previousModel,
1098
+ tileTransform = tile.getTransform ()] {
1099
+ return pGltfModifier->apply (GltfModifierInput{
1100
+ .asyncSystem = asyncSystem,
1101
+ .pAssetAccessor = pAssetAccessor,
1102
+ .pLogger = pLogger,
1103
+ .previousModel = previousModel,
1104
+ .tileTransform = tileTransform});
1126
1105
})
1106
+ .thenInWorkerThread (
1107
+ [asyncSystem = this ->_externals .asyncSystem ,
1108
+ &previousModel,
1109
+ pPrepareRendererResources =
1110
+ this ->_externals .pPrepareRendererResources ,
1111
+ tileTransform = tile.getTransform (),
1112
+ rendererOptions = tilesetOptions.rendererOptions ](
1113
+ std::optional<GltfModifierOutput>&& modified) {
1114
+ const CesiumGltf::Model& model =
1115
+ modified ? modified->modifiedModel : previousModel;
1116
+
1117
+ TileLoadResult tileLoadResult;
1118
+ tileLoadResult.state = TileLoadResultState::Success;
1119
+
1120
+ const auto it = model.extras .find (" gltfUpAxis" );
1121
+ if (it == model.extras .end ()) {
1122
+ CESIUM_ASSERT (false );
1123
+ tileLoadResult.glTFUpAxis = CesiumGeometry::Axis::Y;
1124
+ } else {
1125
+ tileLoadResult.glTFUpAxis = static_cast <CesiumGeometry::Axis>(
1126
+ it->second .getSafeNumberOrDefault (1 ));
1127
+ }
1128
+
1129
+ if (modified) {
1130
+ tileLoadResult.contentKind =
1131
+ std::move (modified->modifiedModel );
1132
+ } else {
1133
+ tileLoadResult.contentKind = previousModel;
1134
+ }
1135
+
1136
+ return pPrepareRendererResources->prepareInLoadThread (
1137
+ asyncSystem,
1138
+ std::move (tileLoadResult),
1139
+ tileTransform,
1140
+ rendererOptions);
1141
+ })
1127
1142
.thenInMainThread (
1128
1143
[&tile,
1129
1144
// Keep the manager alive while the glTF modification is in
@@ -1243,7 +1258,10 @@ void TilesetContentManager::loadTileContent(
1243
1258
rootTranslation = glm::column (this ->_pRootTile ->getTransform (), 3 );
1244
1259
}
1245
1260
pLoader->loadTileContent (loadInput)
1246
- .thenImmediately ([tileLoadInfo = std::move (tileLoadInfo),
1261
+ .thenImmediately ([asyncSystem = this ->_externals .asyncSystem ,
1262
+ pAssetAccessor = this ->_externals .pAssetAccessor ,
1263
+ pLogger = this ->_externals .pLogger ,
1264
+ tileLoadInfo = std::move (tileLoadInfo),
1247
1265
projections = std::move (projections),
1248
1266
rendererOptions = tilesetOptions.rendererOptions ,
1249
1267
pGltfModifier = _externals.pGltfModifier ,
@@ -1258,7 +1276,6 @@ void TilesetContentManager::loadTileContent(
1258
1276
// worker thread if the content is a render content
1259
1277
if (result.state == TileLoadResultState::Success) {
1260
1278
if (std::holds_alternative<CesiumGltf::Model>(result.contentKind )) {
1261
- auto asyncSystem = tileLoadInfo.asyncSystem ;
1262
1279
// update root translation now it has been loaded:
1263
1280
if (isLoadingRootTile)
1264
1281
rootTranslation = glm::column (tileLoadInfo.tileTransform , 3 );
@@ -1276,19 +1293,39 @@ void TilesetContentManager::loadTileContent(
1276
1293
// have been created, which is both inefficient and a cause
1277
1294
// of visual glitches (the model will appear briefly in its
1278
1295
// unmodified state before stabilizing)
1279
- auto & model =
1296
+ const CesiumGltf::Model & model =
1280
1297
std::get<CesiumGltf::Model>(result.contentKind );
1281
- pGltfModifier->apply (
1282
- model,
1283
- tileLoadInfo.tileTransform ,
1284
- rootTranslation,
1285
- model);
1298
+ return pGltfModifier
1299
+ ->apply (GltfModifierInput{
1300
+ .asyncSystem = tileLoadInfo.asyncSystem ,
1301
+ .pAssetAccessor = tileLoadInfo.pAssetAccessor ,
1302
+ .pLogger = tileLoadInfo.pLogger ,
1303
+ .previousModel = model,
1304
+ .tileTransform = tileLoadInfo.tileTransform })
1305
+ .thenInWorkerThread (
1306
+ [result = std::move (result),
1307
+ projections = std::move (projections),
1308
+ tileLoadInfo = std::move (tileLoadInfo),
1309
+ rendererOptions](
1310
+ std::optional<GltfModifierOutput>&&
1311
+ modified) mutable {
1312
+ if (modified) {
1313
+ result.contentKind =
1314
+ std::move (modified->modifiedModel );
1315
+ }
1316
+ return postProcessContentInWorkerThread (
1317
+ std::move (result),
1318
+ std::move (projections),
1319
+ std::move (tileLoadInfo),
1320
+ rendererOptions);
1321
+ });
1322
+ } else {
1323
+ return postProcessContentInWorkerThread (
1324
+ std::move (result),
1325
+ std::move (projections),
1326
+ std::move (tileLoadInfo),
1327
+ rendererOptions);
1286
1328
}
1287
- return postProcessContentInWorkerThread (
1288
- std::move (result),
1289
- std::move (projections),
1290
- std::move (tileLoadInfo),
1291
- rendererOptions);
1292
1329
});
1293
1330
}
1294
1331
}
0 commit comments