vsgCs显示谷歌全球倾斜模型-数据转换
前言
本章将在上章基础上,接着深入vsgCs中CesiumNative数据到vsg::Node的转换过程。
目录
- 1 CesiumNative多线程数据读取
- 2 CesiumNative数据转vsg::Node
1 CesiumNative多线程数据读取
上章深入讲解CesiumNative中类的关系如上图所示。
上图为多线程相关的类,核心为Cesium::AsyncSystem,其依赖与CesiumAsync::IAssetAccessor与CesiumAsync::ItaskProcessor分别用于数据的请求和任务的处理。
2 CesiumNative数据转vsg::Node
多线程读取数据后,Cesium3DTilesSelection::IPrepareRendererResources提供了8个纯虚接口将CesiumNative数据转换为vsg::Node,如下所示为8个纯虚接口。
CesiumAsync::Future<Cesium3DTilesSelection::TileLoadResultAndRenderResources>prepareInLoadThread(const CesiumAsync::AsyncSystem& asyncSystem,Cesium3DTilesSelection::TileLoadResult&& tileLoadResult,const glm::dmat4& transform,const std::any& rendererOptions) override;void* prepareInMainThread(Cesium3DTilesSelection::Tile& tile, void* pLoadThreadResult) override;void free(Cesium3DTilesSelection::Tile& tile,void* pLoadThreadResult,void* pMainThreadResult) noexcept override;void* prepareRasterInLoadThread(CesiumGltf::ImageAsset& image,const std::any& rendererOptions) override;void* prepareRasterInMainThread(CesiumRasterOverlays::RasterOverlayTile& rasterTile,void* rawLoadResult) override;void freeRaster(const CesiumRasterOverlays::RasterOverlayTile& rasterTile,void* pLoadThreadResult,void* pMainThreadResult) noexcept override;void attachRasterInMainThread(const Cesium3DTilesSelection::Tile& tile,int32_t overlayTextureCoordinateID,const CesiumRasterOverlays::RasterOverlayTile& rasterTile,void* pMainThreadRendererResources,const glm::dvec2& translation,const glm::dvec2& scale) override;void detachRasterInMainThread(const Cesium3DTilesSelection::Tile& tile,int32_t overlayTextureCoordinateID,const CesiumRasterOverlays::RasterOverlayTile& rasterTile,void* pMainThreadRendererResources) noexcept override;
函数的调用顺序如下:1)prepareInLoadThread (加载瓦片);2) prepareRasterInLoadThread (加载栅格数据,如果瓦片包含栅格数);3) prepareInMainThread (主线程处理瓦片);4) prepareRasterInMainThread (主线程处理栅格数据,如果栅格数据存在);5) attachRasterInMainThread (绑定栅格到瓦片);6)detachRasterInMainThread(如果栅格数据被移除);7) freeRaster(释放栅格);8) free (释放瓦片资源) 。
以谷歌全球倾斜模型为例,其瓦片无栅格数据,在多线程读取数据后,在线程中调用prepareInLoadThread函数中处理加载好的瓦片数据,接着在主线程中调用prepareInMainThread中处理瓦片数据,当数据过期后,在主线程中调用free函数,释放瓦片数据。
文末:本章介绍了CesiumNative中的瓦片数据到vsg::Node转换过程,包括CesiumNative多线程读取数据,以及通过重写Cesium3DTilesSelection::IPrepareRendererResources的虚接口,将加载好的瓦片数据在合适的函数中转换为vsg::Node的过程。vsgCs显示谷歌全球倾斜模型系列介绍到此,下一章将介绍如何在osg中实现对谷歌全球倾斜模型的显示,模仿vsgCs实现osgCs,并开源。