Cesium for Unreal 2.13.2 Crash with Custom Tiles

Hi,

We’re creating our own tiles on self hosted from an IFC dataset and it appears that when these tiles are added to our scene in Unreal 5.5.3, after a few moments when the tiles come into view, the application crashes with the following error.

Any insights on how to address this would be most appreciated.

Assertion failed: (Index >= 0) & (Index < ArrayNum) [File:D:\Program Files\Epic Games\UE_5.5\Engine\Source\Runtime\Core\Public\Containers\Array.h] [Line: 783] 
Array index out of bounds: 42432 into an array of size 3831


UnrealEditor_CesiumRuntime!Chaos::FTriangleMeshImplicitObject::FTriangleMeshImplicitObject<unsigned short>() [D:\Program Files\Epic Games\UE_5.5\Engine\Source\Runtime\Experimental\Chaos\Public\Chaos\TriangleMeshImplicitObject.h:523]
UnrealEditor_CesiumRuntime!BuildChaosTriangleMeshes<unsigned short>() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\CesiumGltfComponent.cpp:3663]
UnrealEditor_CesiumRuntime!loadPrimitive<CesiumGltf::AccessorView<unsigned short> >() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\CesiumGltfComponent.cpp:1742]
UnrealEditor_CesiumRuntime!loadIndexedPrimitive() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\CesiumGltfComponent.cpp:1793]
UnrealEditor_CesiumRuntime!loadPrimitive() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\CesiumGltfComponent.cpp:1863]
UnrealEditor_CesiumRuntime!loadMesh() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\CesiumGltfComponent.cpp:1893]
UnrealEditor_CesiumRuntime!loadNode() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\CesiumGltfComponent.cpp:2140]
UnrealEditor_CesiumRuntime!`loadModelAnyThreadPart'::`2'::<lambda_1>::operator()() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\CesiumGltfComponent.cpp:2325]
UnrealEditor_CesiumRuntime!async::detail::task_func<CesiumAsync::CesiumImpl::ImmediateScheduler<CesiumAsync::CesiumImpl::TaskScheduler>,async::detail::continuation_exec_func<CesiumAsync::CesiumImpl::ImmediateScheduler<CesiumAsync::CesiumImpl::TaskScheduler>,() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\async++\task_base.h:398]
UnrealEditor_CesiumRuntime!CesiumAsync::CesiumImpl::ImmediateScheduler<CesiumAsync::CesiumImpl::TaskScheduler>::schedule() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\CesiumAsync\Impl\ImmediateScheduler.h:26]
UnrealEditor_CesiumRuntime!async::detail::task_base::run_continuation<CesiumAsync::CesiumImpl::ImmediateScheduler<CesiumAsync::CesiumImpl::TaskScheduler> >() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\async++\task_base.h:101]
UnrealEditor_CesiumRuntime!async::detail::basic_task<void>::then_internal<CesiumAsync::CesiumImpl::ImmediateScheduler<CesiumAsync::CesiumImpl::TaskScheduler>,`loadModelAnyThreadPart'::`2'::<lambda_1>,async::task<void> >() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\async++\task.h:81]
UnrealEditor_CesiumRuntime!loadModelAnyThreadPart() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\CesiumGltfComponent.cpp:2303]
UnrealEditor_CesiumRuntime!UCesiumGltfComponent::CreateOffGameThread() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\CesiumGltfComponent.cpp:3293]
UnrealEditor_CesiumRuntime!UnrealPrepareRendererResources::prepareInLoadThread() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\UnrealPrepareRendererResources.cpp:49]
UnrealEditor_CesiumRuntime!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,CesiumUtility::JsonValue,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char()
UnrealEditor_CesiumRuntime!Cesium3DTilesSelection::RasterizedPolygonsTileExcluder::shouldExclude()
UnrealEditor_CesiumRuntime!CesiumAsync::CesiumImpl::ImmediateScheduler<CesiumAsync::CesiumImpl::TaskScheduler>::schedule() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\CesiumAsync\Impl\ImmediateScheduler.h:26]
UnrealEditor_CesiumRuntime!async::detail::task_base::run_continuation<CesiumAsync::CesiumImpl::ImmediateScheduler<CesiumAsync::CesiumImpl::TaskScheduler> >() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\async++\task_base.h:101]
UnrealEditor_CesiumRuntime!async::detail::task_base::add_continuation<CesiumAsync::CesiumImpl::ImmediateScheduler<CesiumAsync::CesiumImpl::TaskScheduler> >()
UnrealEditor_CesiumRuntime!async::task<void>::then<async::detail::inline_scheduler_impl,async::detail::unwrapped_func<async::detail::fake_void,async::task<void> > >()
UnrealEditor_CesiumRuntime!Cesium3DTilesSelection::TilesetContentManager::notifyTileUnloading()
UnrealEditor_CesiumRuntime!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,CesiumUtility::JsonValue,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char()
UnrealEditor_CesiumRuntime!Cesium3DTilesSelection::RasterizedPolygonsTileExcluder::shouldExclude()
UnrealEditor_CesiumRuntime!CesiumAsync::CesiumImpl::ImmediateScheduler<CesiumAsync::CesiumImpl::TaskScheduler>::schedule() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\CesiumAsync\Impl\ImmediateScheduler.h:26]
UnrealEditor_CesiumRuntime!Cesium3DTilesSelection::TilesetContentManager::propagateTilesetContentLoaderResult<Cesium3DTilesSelection::TilesetContentLoader>()
UnrealEditor_CesiumRuntime!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,CesiumUtility::JsonValue,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char()
UnrealEditor_CesiumRuntime!Cesium3DTilesSelection::RasterizedPolygonsTileExcluder::shouldExclude()
UnrealEditor_CesiumRuntime!async::detail::task_base::run_continuation<async::detail::inline_scheduler_impl>() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\async++\task_base.h:101]
UnrealEditor_CesiumRuntime!Cesium3DTilesSelection::RasterizedPolygonsTileExcluder::shouldExclude()
UnrealEditor_CesiumRuntime!async::detail::task_base::run_continuations() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\async++\task_base.h:113]
UnrealEditor_CesiumRuntime!async::detail::unwrapped_func<Cesium3DTilesSelection::TileLoadResult,async::task<Cesium3DTilesSelection::TileLoadResult> >::operator()()
UnrealEditor_CesiumRuntime!async::detail::task_func<async::detail::inline_scheduler_impl,async::detail::continuation_exec_func<async::detail::inline_scheduler_impl,async::task<Cesium3DTilesSelection::TileLoadResult>,async::detail::fake_void,async::detail::un()
UnrealEditor_CesiumRuntime!async::detail::task_base::run_continuation<async::detail::inline_scheduler_impl>() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\async++\task_base.h:101]
UnrealEditor_CesiumRuntime!async::detail::task_base::add_continuation<async::detail::inline_scheduler_impl>() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\ThirdParty\include\async++\task_base.h:134]
UnrealEditor_CesiumRuntime!std::uninitialized_fill<std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<std::pair<unsigned __int64 const ,Cesium3DTilesContent::SubtreeAvailability> > > > * __ptr64,std::_List_unchecked_iterator<std::_List_val<()
UnrealEditor_CesiumRuntime!std::_Variant_destroy_layer_<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,CesiumGeometry::QuadtreeTileID,CesiumGeometry::OctreeTileID,CesiumGeometry::UpsampledQuadtreeNode>::~_Variant_destroy_layer_<std::bas()
UnrealEditor_CesiumRuntime!CesiumAsync::CesiumImpl::ImmediateScheduler<CesiumAsync::CesiumImpl::TaskScheduler>::SchedulerScope::~SchedulerScope()
UnrealEditor_CesiumRuntime!`UnrealTaskProcessor::startTask'::`2'::<lambda_1>::operator()() [D:\a\cesium-unreal\cesium-unreal\packages\CesiumForUnreal\HostProject\Plugins\CesiumForUnreal\Source\CesiumRuntime\Private\UnrealTaskProcessor.cpp:10]
UnrealEditor_Core
UnrealEditor_Core
UnrealEditor_Core
UnrealEditor_Core
UnrealEditor_Core
UnrealEditor_Core
UnrealEditor_Core
UnrealEditor_Core
UnrealEditor_Core
UnrealEditor_Core
kernel32
ntdll

@dagillespie Thanks for the question! I’m sorry to hear you’re experiencing issues with your tileset. Would you mind running some of the tiles in question through the glTF Validator? It’s available as a command-line tool if you want to make the process quicker. This will help us identify if the issues in question are a result of something that’s not quite right in the tile, or if it’s something that’s not quite right in Cesium for Unreal.

@azrogers - thanks for the quick follow up. I ran this through the Cesium tiles validator (which uses gltfValidator) and encountered a few errors, summarised below and full log attached.

For additional context, this is a tile from a city 3D model originally in DWG which has been imported into Rhino an exported as an IFC file (as the model is in EPSG:27700).

I could also export this as GLTF however I’m assuming that the geometry issue could be based upon the source data and my understanding is that GLTF uploads, given they only allow lat/long specification of origin, don’t get conformed to a WSG84 reprojection from their cartesian grid ref (hence taking it through IFC)

Related post - Rest API - Specifying ESPG/WKID for 3D Model Upload - Cesium ion - Cesium Community

"date": "2025-02-13T11:40:35.517Z",
  "numErrors": 2,
  "numWarnings": 0,
  "numInfos": 34,

....

    {
      "type": "BOUNDING_VOLUMES_INCONSISTENT",
      "path": "/root/content/boundingVolume",
      "message": "The content bounding volume is not contained in the tile bounding volume: box [-28.15152937174028,-597.2883535316214,-23.260475829243546,368.5418779960738,0,0,0,538.4639651714824,0,0,0,14.205693318974241] is not within box [-27.317575035184746,-587.1338695622981,-0.06964932475229446,419.2970262035916,0,0,0,581.6234087138437,0,0,0,38.15078246174378]",
      "severity": "ERROR"
    },

...

    {
      "type": "INTERNAL_ERROR",
      "path": "",
      "message": "Internal error while traversing tileset: Error: Malformed buffer data: -3",
      "severity": "ERROR"
    }

validation.json.zip (2.1 KB)

FYI - I’ve just tested the same data exported as GLTF, tiled on Ion and pulled back down through validator and this data passed. In this case, the containing folder was .b3dm rather than glb that was produced from the IFC tiling process, however grid positioning is a pain with GLTF.

Will also test another IFC exporter we have to see if it works any better.

So for whataver reason, the IFC data we are getting out from our IFC exporters is causing the tiler to produce GLTF data errors. The IFC files exported have been tested using IFC4 and IFC2x3 - each with the same error about bounding box.

GLTF is fine however my coordinate system is messed up as I can’t upload with a grid reference.

Is there any way to fix the tileset once on ion or address the problem with 3D tile tools?

Hi @dagillespie,
Just to give you an update, the team responsible for the IFC tiler is investigating. We’ll let you know when we hear more.

1 Like

Awesome - many thanks for confirming - that’s most appreciated.

Hi @dagillespie - the malformed buffer issue should be fixed now. A new version of the design tiler was published to https://ion.cesium.com/ and should be available in self-hosted soon.

Also in case it’s relevant the design tiler now supports OBJ input, in addition to IFC and glTF.

Just make sure to select Architecture, Engineering, or Construction model (BIM/CAD) in the UI or BIM_CAD in the REST API so that it’s running the design tiler.

1 Like

That’s awesome many thanks - looking forward to pushing this release onto our self hosted instance soon!