|
10 | 10 | #include <Cesium3DTilesSelection/EllipsoidTilesetLoader.h> |
11 | 11 | #include <Cesium3DTilesSelection/Tileset.h> |
12 | 12 | #include <CesiumGeospatial/GlobeTransforms.h> |
| 13 | +#include <CesiumImage/Ktx2TranscodeTargets.h> |
13 | 14 | #include <CesiumIonClient/Connection.h> |
14 | 15 | #include <CesiumRasterOverlays/IonRasterOverlay.h> |
15 | 16 |
|
@@ -580,54 +581,10 @@ void Cesium3DTilesetImpl::DestroyTileset( |
580 | 581 | this->_destroyTilesetOnNextUpdate = false; |
581 | 582 | } |
582 | 583 |
|
583 | | -void Cesium3DTilesetImpl::LoadTileset( |
584 | | - const DotNet::CesiumForUnity::Cesium3DTileset& tileset) { |
585 | | - TilesetOptions options{}; |
586 | | - options.rendererOptions = std::make_any<CreateModelOptions>(tileset); |
587 | | - options.maximumScreenSpaceError = tileset.maximumScreenSpaceError(); |
588 | | - options.preloadAncestors = tileset.preloadAncestors(); |
589 | | - options.preloadSiblings = tileset.preloadSiblings(); |
590 | | - options.forbidHoles = tileset.forbidHoles(); |
591 | | - options.maximumSimultaneousTileLoads = tileset.maximumSimultaneousTileLoads(); |
592 | | - options.maximumCachedBytes = tileset.maximumCachedBytes(); |
593 | | - options.loadingDescendantLimit = tileset.loadingDescendantLimit(); |
594 | | - options.enableFrustumCulling = tileset.enableFrustumCulling(); |
595 | | - options.enableFogCulling = tileset.enableFogCulling(); |
596 | | - options.enforceCulledScreenSpaceError = |
597 | | - tileset.enforceCulledScreenSpaceError(); |
598 | | - options.culledScreenSpaceError = tileset.culledScreenSpaceError(); |
599 | | - // options.enableLodTransitionPeriod = tileset.useLodTransitions(); |
600 | | - // options.lodTransitionLength = tileset.lodTransitionLength(); |
601 | | - options.showCreditsOnScreen = tileset.showCreditsOnScreen(); |
602 | | - options.loadErrorCallback = |
603 | | - [tileset](const TilesetLoadFailureDetails& details) { |
604 | | - int typeValue = (int)details.type; |
605 | | - CesiumForUnity::Cesium3DTilesetLoadFailureDetails unityDetails( |
606 | | - tileset, |
607 | | - CesiumForUnity::Cesium3DTilesetLoadType(typeValue), |
608 | | - details.statusCode, |
609 | | - System::String(details.message)); |
610 | | - |
611 | | - CesiumForUnity::Cesium3DTileset::BroadcastCesium3DTilesetLoadFailure( |
612 | | - unityDetails); |
613 | | - }; |
614 | | - |
615 | | - // Generous per-frame time limits for loading / unloading on main thread. |
616 | | - options.mainThreadLoadingTimeLimit = 5.0; |
617 | | - options.tileCacheUnloadTimeLimit = 5.0; |
618 | | - |
619 | | - DotNet::CesiumForUnity::CesiumGeoreference georeferenceComponent = |
620 | | - tileset.gameObject() |
621 | | - .GetComponentInParent<DotNet::CesiumForUnity::CesiumGeoreference>(); |
622 | | - if (georeferenceComponent != nullptr) { |
623 | | - options.ellipsoid = |
624 | | - georeferenceComponent.ellipsoid().NativeImplementation().GetEllipsoid(); |
625 | | - } |
626 | | - |
627 | | - TilesetContentOptions contentOptions{}; |
628 | | - contentOptions.generateMissingNormalsSmooth = tileset.generateSmoothNormals(); |
629 | | - |
630 | | - CesiumGltf::SupportedGpuCompressedPixelFormats supportedFormats; |
| 584 | +namespace { |
| 585 | +CesiumImage::SupportedGpuCompressedPixelFormats |
| 586 | +getSupportedGpuCompressedPixelFormats() { |
| 587 | + CesiumImage::SupportedGpuCompressedPixelFormats supportedFormats; |
631 | 588 | supportedFormats.ETC2_RGBA = UnityEngine::SystemInfo::IsFormatSupported( |
632 | 589 | DotNet::UnityEngine::Experimental::Rendering::GraphicsFormat:: |
633 | 590 | RGBA_ETC2_SRGB, |
@@ -681,12 +638,69 @@ void Cesium3DTilesetImpl::LoadTileset( |
681 | 638 | DotNet::UnityEngine::Experimental::Rendering::GraphicsFormat:: |
682 | 639 | RG_EAC_UNorm, |
683 | 640 | DotNet::UnityEngine::Experimental::Rendering::FormatUsage::Sample); |
| 641 | + return supportedFormats; |
| 642 | +} |
| 643 | +} // namespace |
| 644 | + |
| 645 | +void Cesium3DTilesetImpl::LoadTileset( |
| 646 | + const DotNet::CesiumForUnity::Cesium3DTileset& tileset) { |
| 647 | + TilesetOptions options{}; |
| 648 | + options.rendererOptions = std::make_any<CreateModelOptions>(tileset); |
| 649 | + options.maximumScreenSpaceError = tileset.maximumScreenSpaceError(); |
| 650 | + options.preloadAncestors = tileset.preloadAncestors(); |
| 651 | + options.preloadSiblings = tileset.preloadSiblings(); |
| 652 | + options.forbidHoles = tileset.forbidHoles(); |
| 653 | + options.maximumSimultaneousTileLoads = tileset.maximumSimultaneousTileLoads(); |
| 654 | + options.maximumCachedBytes = tileset.maximumCachedBytes(); |
| 655 | + options.loadingDescendantLimit = tileset.loadingDescendantLimit(); |
| 656 | + options.enableFrustumCulling = tileset.enableFrustumCulling(); |
| 657 | + options.enableFogCulling = tileset.enableFogCulling(); |
| 658 | + options.enforceCulledScreenSpaceError = |
| 659 | + tileset.enforceCulledScreenSpaceError(); |
| 660 | + options.culledScreenSpaceError = tileset.culledScreenSpaceError(); |
| 661 | + // options.enableLodTransitionPeriod = tileset.useLodTransitions(); |
| 662 | + // options.lodTransitionLength = tileset.lodTransitionLength(); |
| 663 | + options.showCreditsOnScreen = tileset.showCreditsOnScreen(); |
| 664 | + options.loadErrorCallback = |
| 665 | + [tileset](const TilesetLoadFailureDetails& details) { |
| 666 | + int typeValue = (int)details.type; |
| 667 | + CesiumForUnity::Cesium3DTilesetLoadFailureDetails unityDetails( |
| 668 | + tileset, |
| 669 | + CesiumForUnity::Cesium3DTilesetLoadType(typeValue), |
| 670 | + details.statusCode, |
| 671 | + System::String(details.message)); |
| 672 | + |
| 673 | + CesiumForUnity::Cesium3DTileset::BroadcastCesium3DTilesetLoadFailure( |
| 674 | + unityDetails); |
| 675 | + }; |
| 676 | + |
| 677 | + // Generous per-frame time limits for loading / unloading on main thread. |
| 678 | + options.mainThreadLoadingTimeLimit = 5.0; |
| 679 | + options.tileCacheUnloadTimeLimit = 5.0; |
684 | 680 |
|
685 | | - contentOptions.ktx2TranscodeTargets = |
686 | | - CesiumGltf::Ktx2TranscodeTargets(supportedFormats, false); |
| 681 | + DotNet::CesiumForUnity::CesiumGeoreference georeferenceComponent = |
| 682 | + tileset.gameObject() |
| 683 | + .GetComponentInParent<DotNet::CesiumForUnity::CesiumGeoreference>(); |
| 684 | + if (georeferenceComponent != nullptr) { |
| 685 | + options.ellipsoid = |
| 686 | + georeferenceComponent.ellipsoid().NativeImplementation().GetEllipsoid(); |
| 687 | + } |
687 | 688 |
|
| 689 | + TilesetContentOptions contentOptions{}; |
| 690 | + contentOptions.generateMissingNormalsSmooth = tileset.generateSmoothNormals(); |
| 691 | + contentOptions.ktx2TranscodeTargets = CesiumImage::Ktx2TranscodeTargets( |
| 692 | + getSupportedGpuCompressedPixelFormats(), |
| 693 | + false); |
688 | 694 | contentOptions.applyTextureTransform = false; |
689 | 695 |
|
| 696 | + // Although Unity provides MeshTopology.LineStrip, it crashes when given an |
| 697 | + // index buffer with a primitive restart constant. Therefore, ensure all |
| 698 | + // primitive modes are converted before they are processed by Unity. |
| 699 | + contentOptions.primitiveModeOptions.convertLineLoop = true; |
| 700 | + contentOptions.primitiveModeOptions.convertLineStrip = true; |
| 701 | + contentOptions.primitiveModeOptions.convertTriangleFan = true; |
| 702 | + contentOptions.primitiveModeOptions.convertTriangleStrip = true; |
| 703 | + |
690 | 704 | options.contentOptions = contentOptions; |
691 | 705 |
|
692 | 706 | CesiumForUnity::CesiumCameraManager cameraManager = |
|
0 commit comments