diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml
new file mode 100644
index 000000000..f44401b2f
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yaml
@@ -0,0 +1,55 @@
+name: Report a bug
+description: Let us know so we can fix it!
+labels: ["needs triage", "bug"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for helping us improve Cesium for Unreal!
+
+ First, check if the issue already exists in the [issues](https://github.com/CesiumGS/cesium-unreal/issues) page. If it does, please leave a **comment** on the existing issue instead.
+
+ Otherwise, if you can't find a similar issue, describe what is happening using the text fields below.
+ - type: textarea
+ id: what-happened
+ attributes:
+ label: What happened?
+ description: Also tell us, what did you expect to happen?
+ validations:
+ required: true
+ - type: textarea
+ id: environment
+ attributes:
+ label: Environment
+ description: What environment are you experiencing this issue in?
+ value: |
+ Cesium for Unreal version:
+ Unreal Engine Version:
+ Operating System:
+ validations:
+ required: true
+ - type: textarea
+ id: repro
+ attributes:
+ label: Reproduction steps
+ description: "How do you trigger this bug? Please walk us through it step by step, starting from either a blank project or the Cesium for Unreal Samples. (We can triage bugs much faster when we have these steps.)"
+ value: |
+ 1.
+ 2.
+ 3.
+ ...
+ validations:
+ required: false
+ - type: textarea
+ id: evidence
+ attributes:
+ label: Supporting evidence
+ description: Providing screenshots, videos, or GIFs of the issue helps us a lot, especially for visual bugs. If there were any error messages or logs in the console, please include those too.
+ validations:
+ required: false
+ - type: markdown
+ attributes:
+ value: |
+ If you can also contribute a fix, we'd absolutely appreciate it! Fixing a bug in Cesium for Unreal often means fixing a bug for numerous applications and end users. Check out the contributor guide to get started: [CONTRIBUTING.md](https://github.com/CesiumGS/cesium-unreal/tree/main/CONTRIBUTING.md)
+
+ Let us know you're working on it, and we'd be happy to provide advice and feedback.
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 000000000..3bc02c5ad
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: true
+contact_links:
+- name: Ask a question
+ url: https://community.cesium.com/c/cesium-for-unreal/10
+ about: Please use the community forum for general questions. The Cesium team and community actively monitor it and love to see what people are working on! We reserve GitHub for confirmed bug reports and feature requests.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml
new file mode 100644
index 000000000..4baceef2d
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yaml
@@ -0,0 +1,20 @@
+name: Request a feature
+description: New ideas & improvements to Cesium for Unreal are always welcome.
+labels: ["needs triage", "enhancement"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for helping us improve Cesium for Unreal!
+
+ When suggesting an idea, give examples of the intended use case. Features that benefit the wider community are more likely to be prioritized.
+ - type: textarea
+ id: new-feature
+ attributes:
+ label: Feature
+ validations:
+ required: true
+ - type: markdown
+ attributes:
+ value: |
+ The best way to get your ideas into Cesium for Unreal is to help us! We love contributions and are always happy to be provide feedback and advice. Check out the contributor guide to get started: [CONTRIBUTING.md](https://github.com/CesiumGS/cesium-unreal/tree/main/CONTRIBUTING.md)
\ No newline at end of file
diff --git a/.github/actions/install-unreal-macos/action.yml b/.github/actions/install-unreal-macos/action.yml
index 11e21a452..d4ecd33c5 100644
--- a/.github/actions/install-unreal-macos/action.yml
+++ b/.github/actions/install-unreal-macos/action.yml
@@ -28,7 +28,7 @@ runs:
shell: bash
run: |
df -h
- unzip -q ue.zip "${{ inputs.unreal-program-name }}/Engine/*" -d $HOME -x "${{ inputs.unreal-program-name }}/Engine/Binaries/Mac/LiveLinkHub-Mac-Shipping.app/*" "${{ inputs.unreal-program-name }}/Engine/Binaries/Mac/Android/*" "${{ inputs.unreal-program-name }}/Engine/Binaries/Mac/UnrealGame.app/*" "${{ inputs.unreal-program-name }}/Engine/Binaries/Mac/UnrealGame-Mac-Shipping.app/*" "${{ inputs.unreal-program-name }}/Engine/Binaries/Mac/UnrealGame-Mac-DebugGame.app/*" "${{ inputs.unreal-program-name }}/Engine/Binaries/Mac/UnrealGame-Mac-DebugGame" "${{ inputs.unreal-program-name }}/Engine/Binaries/Mac/UnrealGame" "${{ inputs.unreal-program-name }}/Engine/Binaries/Mac/UnrealGame-Mac-Shipping" "${{ inputs.unreal-program-name }}/Engine/Binaries/Mac/*.dSYM"
+ unzip -q ue.zip "${{ inputs.unreal-program-name }}/Engine/*" -d $HOME -x $(cat "$GITHUB_WORKSPACE/.github/actions/install-unreal-macos/exclude-from-unzip.lst")
df -h
rm ue.zip
df -h
diff --git a/.github/actions/install-unreal-macos/exclude-from-unzip.lst b/.github/actions/install-unreal-macos/exclude-from-unzip.lst
new file mode 100644
index 000000000..c0660d002
--- /dev/null
+++ b/.github/actions/install-unreal-macos/exclude-from-unzip.lst
@@ -0,0 +1,36 @@
+UE_5.3/Engine/Binaries/Mac/LiveLinkHub-Mac-Shipping.app/*
+UE_5.3/Engine/Binaries/Mac/UnrealGame-Mac-DebugGame.app/*
+UE_5.3/Engine/Binaries/Mac/UnrealGame.app/*
+UE_5.3/Engine/Binaries/Mac/UnrealGame-Mac-Shipping.app/*
+UE_5.3/Engine/Binaries/Mac/Android/*
+UE_5.3/Engine/Binaries/Mac/UnrealGame-Mac-DebugGame
+UE_5.3/Engine/Binaries/Mac/UnrealGame
+UE_5.3/Engine/Binaries/Mac/UnrealGame-Mac-Shipping
+UE_5.3/Engine/Binaries/Mac/*.dSYM
+UE_5.3/Engine/Plugins/Experimental/NNERuntimeIREE/*
+UE_5.3/Engine/Plugins/Experimental/Avalanche/*
+UE_5.4/Engine/Binaries/Mac/LiveLinkHub-Mac-Shipping.app/*
+UE_5.4/Engine/Binaries/Mac/UnrealGame-Mac-DebugGame.app/*
+UE_5.4/Engine/Binaries/Mac/UnrealGame.app/*
+UE_5.4/Engine/Binaries/Mac/UnrealGame-Mac-Shipping.app/*
+UE_5.4/Engine/Binaries/Mac/Android/*
+UE_5.4/Engine/Binaries/Mac/ZenDashboard.app/*
+UE_5.4/Engine/Binaries/Mac/UnrealEditorServices.app/*
+UE_5.4/Engine/Binaries/Mac/UnrealEditor-Mac-DebugGame.app/*
+UE_5.4/Engine/Binaries/Mac/UnrealGame-Mac-DebugGame
+UE_5.4/Engine/Binaries/Mac/UnrealGame
+UE_5.4/Engine/Binaries/Mac/UnrealGame-Mac-Shipping
+UE_5.4/Engine/Binaries/ThirdParty/DotNet/6.0.302/mac-x64/*
+UE_5.4/Engine/Binaries/ThirdParty/CEF3/*
+UE_5.4/Engine/Binaries/DotNET/AutomationTool/AutomationScripts/Platforms/Windows/*
+UE_5.4/Engine/Intermediate/ScriptModules/Win.Automation.json
+UE_5.4/Engine/Binaries/DotNET/AutomationTool/AutomationScripts/Platforms/Android/*
+UE_5.4/Engine/Intermediate/ScriptModules/Android.Automation.json
+UE_5.4/Engine/Binaries/DotNET/AutomationTool/AutomationScripts/Platforms/Linux/*
+UE_5.4/Engine/Intermediate/ScriptModules/Linux.Automation.json
+UE_5.4/Engine/Binaries/DotNET/AutomationTool/AutomationScripts/Platforms/TVOS/*
+UE_5.4/Engine/Intermediate/ScriptModules/TVOS.Automation.json
+UE_5.4/Engine/Binaries/DotNET/AutomationTool/AutomationScripts/Platforms/SteamDeck/*
+UE_5.4/Engine/Intermediate/ScriptModules/SteamDeck.Automation.json
+UE_5.4/Engine/Binaries/DotNET/Android/*
+*.dSYM
diff --git a/.github/actions/vcpkg-cache/action.yml b/.github/actions/vcpkg-cache/action.yml
new file mode 100644
index 000000000..e700c4551
--- /dev/null
+++ b/.github/actions/vcpkg-cache/action.yml
@@ -0,0 +1,15 @@
+name: Configure vcpkg caching
+inputs:
+ id:
+ required: true
+ type: string
+runs:
+ using: composite
+ steps:
+ - name: Cache vcpkg artifacts
+ uses: actions/cache@v4
+ with:
+ path: ${{ runner.os == 'Windows' && '/.ezvcpkg' || '~/.ezvcpkg' }}
+ key: vcpkg-${{ inputs.id }}-${{ hashFiles('extern/vcpkg-overlays/**/vcpkg.json', 'extern/vcpkg-overlays/triplets/**/*', 'extern/*toolchain.cmake') }}-${{ hashFiles('extern/cesium-native/CMakeLists.txt', 'extern/CMakeLists.txt') }}
+ restore-keys: |
+ vcpkg-${{ inputs.id }}-${{ hashFiles('extern/vcpkg-overlays/**/vcpkg.json', 'extern/vcpkg-overlays/triplets/**/*', 'extern/*toolchain.cmake') }}-
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index b44306f74..8d12b2c60 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,5 +1,5 @@
name: Cesium for Unreal
-on: [push]
+on: [push, workflow_dispatch]
jobs:
QuickChecks:
name: "Quick Checks"
@@ -11,139 +11,31 @@ jobs:
run: |
npm install
npm run format -- --dry-run -Werror
- Windows52:
- uses: ./.github/workflows/buildWindows.yml
- secrets: inherit
- with:
- runner-label: windows-2022
- unreal-engine-version: "5.2.0"
- unreal-engine-zip: "s3://cesium-unreal-engine/5.2.1/UE_5.2.1.zip"
- unreal-program-name: "UE_5.2"
- upload-package-base-name: "CesiumForUnreal-52-windows"
- # These are specified in the Unreal Engine release notes under "IDE Version the Build farm compiles against"
- # and using them ensures we're compiling our plugin in the exact same way that Unreal Engine itself is compiled.
- cmake-generator: "Visual Studio 17 2022"
- cmake-toolchain: "version=14.34"
- cmake-platform: "x64,version=10.0.18362.0"
- visual-studio-version: "2022"
- visual-studio-components: "Microsoft.VisualStudio.Component.VC.14.34.17.4.x86.x64,Microsoft.VisualStudio.Component.Windows10SDK.18362"
- TestWindows52:
- needs: [Windows52]
- uses: ./.github/workflows/testWindows.yml
- secrets: inherit
- with:
- runner-label: windows-2022
- unreal-engine-zip: "s3://cesium-unreal-engine/5.2.1/UE_5.2.1.zip"
- unreal-program-name: "UE_5.2"
- test-package-base-name: "CesiumForUnreal-52-windows"
- Android52:
- uses: ./.github/workflows/buildAndroid.yml
- secrets: inherit
- with:
- runner-label: windows-2022
- unreal-engine-version: "5.2.0"
- unreal-engine-zip: "s3://cesium-unreal-engine/5.2.1/UE_5.2.1.zip"
- unreal-program-name: "UE_5.2"
- upload-package-base-name: "CesiumForUnreal-52-android"
- android-ndk-version: "r25b"
- Linux52:
- uses: ./.github/workflows/buildLinux.yml
- secrets: inherit
- with:
- runner-label: ubuntu-22.04
- unreal-engine-version: "5.2.0"
- unreal-engine-zip: "s3://cesium-unreal-engine/Linux_Unreal_Engine_5.2.0.zip"
- unreal-program-name: "UE_5.2"
- upload-package-base-name: "CesiumForUnreal-52-linux"
- clang-version: "v21_clang-15.0.1-centos7"
- macOS52:
- uses: ./.github/workflows/buildMac.yml
- secrets: inherit
- with:
- runner-label: macos-12
- unreal-engine-version: "5.2.0"
- unreal-engine-zip: "s3://cesium-unreal-engine/UE_52_macOS.zip"
- unreal-program-name: "UE_5.2"
- upload-package-base-name: "CesiumForUnreal-52-macos"
- xcode-version: "14.2"
- iOS52:
- uses: ./.github/workflows/buildiOS.yml
- secrets: inherit
- with:
- runner-label: macos-12
- unreal-engine-version: "5.2.0"
- unreal-engine-zip: "s3://cesium-unreal-engine/UE_52_macOS.zip"
- unreal-program-name: "UE_5.2"
- upload-package-base-name: "CesiumForUnreal-52-ios"
- xcode-version: "14.2"
- Combine52:
+ Documentation:
runs-on: ubuntu-latest
- needs: [Windows52, Linux52, Android52, MacOS52, iOS52]
steps:
+ - name: Install Doxygen
+ run: |
+ cd ~
+ wget https://github.com/doxygen/doxygen/releases/download/Release_1_12_0/doxygen-1.12.0.linux.bin.tar.gz
+ tar xzf doxygen-1.12.0.linux.bin.tar.gz
+ export PATH=$PWD/doxygen-1.12.0/bin:$PATH
+ echo "PATH=$PATH" >> "$GITHUB_ENV"
+ doxygen --version
- name: Check out repository code
uses: actions/checkout@v4
- - name: Set environment variables
- run: |
- export CESIUM_UNREAL_VERSION=$GITHUB_REF_NAME
- export BUILD_CESIUM_UNREAL_PACKAGE_NAME="CesiumForUnreal-52-${CESIUM_UNREAL_VERSION}"
- export BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME="CesiumForUnreal-52-SourceOnly-${CESIUM_UNREAL_VERSION}"
- # Make these available to subsequent steps
- echo "CESIUM_UNREAL_VERSION=$CESIUM_UNREAL_VERSION" >> $GITHUB_ENV
- echo "BUILD_CESIUM_UNREAL_PACKAGE_NAME=$BUILD_CESIUM_UNREAL_PACKAGE_NAME" >> $GITHUB_ENV
- echo "BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME=$BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME" >> $GITHUB_ENV
- - name: Download iOS build
- uses: actions/download-artifact@v4
- with:
- name: CesiumForUnreal-52-ios-${{ env.CESIUM_UNREAL_VERSION}}
- path: combine
- - name: Download macOS build
- uses: actions/download-artifact@v4
with:
- name: CesiumForUnreal-52-macos-${{ env.CESIUM_UNREAL_VERSION}}
- path: combine
- - name: Download Android build
- uses: actions/download-artifact@v4
- with:
- name: CesiumForUnreal-52-android-${{ env.CESIUM_UNREAL_VERSION}}
- path: combine
- - name: Download Linux build
- uses: actions/download-artifact@v4
- with:
- name: CesiumForUnreal-52-linux-${{ env.CESIUM_UNREAL_VERSION}}
- path: combine
- - name: Download Windows build
- uses: actions/download-artifact@v4
- with:
- name: CesiumForUnreal-52-windows-${{ env.CESIUM_UNREAL_VERSION}}
- path: combine
- - name: Publish combined package artifact
- if: ${{ success() }}
- uses: actions/upload-artifact@v4
- with:
- name: ${{ env.BUILD_CESIUM_UNREAL_PACKAGE_NAME}}
- path: combine
- - name: Publish combined package artifact for the Unreal Marketplace
+ submodules: recursive
+ - name: Generate Documentation
+ run: |
+ npm install
+ npm run doxygen
+ - name: Publish Documentation Artifact
if: ${{ success() }}
uses: actions/upload-artifact@v4
with:
- name: ${{ env.BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME}}
- path: |
- combine
- # These are built by Epic, and including them seems to confuse their process.
- !combine/CesiumForUnreal/Binaries/**/*
- !combine/CesiumForUnreal/Intermediate/**/*
- TestPackage52:
- needs: [Combine52]
- uses: ./.github/workflows/testPackageOnWindows.yml
- secrets: inherit
- with:
- runner-label: windows-2022
- unreal-engine-zip: "s3://cesium-unreal-engine/5.2.1/UE_5.2.1.zip"
- unreal-program-name: "UE_5.2"
- unreal-engine-association: "5.2"
- test-package-base-name: "CesiumForUnreal-52"
- visual-studio-version: "2022"
- visual-studio-components: "Microsoft.VisualStudio.Component.VC.14.34.17.4.x86.x64,Microsoft.VisualStudio.Component.Windows10SDK.18362"
+ name: ReferenceDocumentation
+ path: Documentation/Reference
Windows53:
uses: ./.github/workflows/buildWindows.yml
secrets: inherit
@@ -189,29 +81,19 @@ jobs:
unreal-program-name: "UE_5.3"
upload-package-base-name: "CesiumForUnreal-53-linux"
clang-version: "v22_clang-16.0.6-centos7"
- macOS53:
- uses: ./.github/workflows/buildMac.yml
- secrets: inherit
- with:
- runner-label: macos-12
- unreal-engine-version: "5.3.0"
- unreal-engine-zip: "s3://cesium-unreal-engine/5.3.0/UE_53_macOS.zip"
- unreal-program-name: "UE_5.3"
- upload-package-base-name: "CesiumForUnreal-53-macos"
- xcode-version: "14.2"
- iOS53:
- uses: ./.github/workflows/buildiOS.yml
+ Apple53:
+ uses: ./.github/workflows/buildApple.yml
secrets: inherit
with:
- runner-label: macos-12
+ runner-label: macos-14
unreal-engine-version: "5.3.0"
unreal-engine-zip: "s3://cesium-unreal-engine/5.3.0/UE_53_macOS.zip"
unreal-program-name: "UE_5.3"
- upload-package-base-name: "CesiumForUnreal-53-ios"
- xcode-version: "14.2"
+ upload-package-base-name: "CesiumForUnreal-53-apple"
+ xcode-version: "15.4"
Combine53:
runs-on: ubuntu-latest
- needs: [Windows53, Android53, Linux53, MacOS53, iOS53]
+ needs: [Windows53, Android53, Linux53, Apple53]
steps:
- name: Check out repository code
uses: actions/checkout@v4
@@ -224,15 +106,10 @@ jobs:
echo "CESIUM_UNREAL_VERSION=$CESIUM_UNREAL_VERSION" >> $GITHUB_ENV
echo "BUILD_CESIUM_UNREAL_PACKAGE_NAME=$BUILD_CESIUM_UNREAL_PACKAGE_NAME" >> $GITHUB_ENV
echo "BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME=$BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME" >> $GITHUB_ENV
- - name: Download iOS build
- uses: actions/download-artifact@v4
- with:
- name: CesiumForUnreal-53-ios-${{ env.CESIUM_UNREAL_VERSION}}
- path: combine
- - name: Download macOS build
+ - name: Download Apple build
uses: actions/download-artifact@v4
with:
- name: CesiumForUnreal-53-macos-${{ env.CESIUM_UNREAL_VERSION}}
+ name: CesiumForUnreal-53-apple-${{ env.CESIUM_UNREAL_VERSION}}
path: combine
- name: Download Android build
uses: actions/download-artifact@v4
@@ -322,29 +199,19 @@ jobs:
unreal-program-name: "UE_5.4"
upload-package-base-name: "CesiumForUnreal-54-linux"
clang-version: "v22_clang-16.0.6-centos7"
- macOS54:
- uses: ./.github/workflows/buildMac.yml
- secrets: inherit
- with:
- runner-label: macos-13
- unreal-engine-version: "5.4.0"
- unreal-engine-zip: "s3://cesium-unreal-engine/5.4.0/UE_54_macOS.zip"
- unreal-program-name: "UE_5.4"
- upload-package-base-name: "CesiumForUnreal-54-macos"
- xcode-version: "14.2"
- iOS54:
- uses: ./.github/workflows/buildiOS.yml
+ Apple54:
+ uses: ./.github/workflows/buildApple.yml
secrets: inherit
with:
- runner-label: macos-13
+ runner-label: macos-14
unreal-engine-version: "5.4.0"
unreal-engine-zip: "s3://cesium-unreal-engine/5.4.0/UE_54_macOS.zip"
unreal-program-name: "UE_5.4"
- upload-package-base-name: "CesiumForUnreal-54-ios"
- xcode-version: "14.2"
+ upload-package-base-name: "CesiumForUnreal-54-apple"
+ xcode-version: "15.4"
Combine54:
runs-on: ubuntu-latest
- needs: [Windows54, Android54, Linux54, MacOS54, iOS54]
+ needs: [Windows54, Android54, Linux54, Apple54]
steps:
- name: Check out repository code
uses: actions/checkout@v4
@@ -357,15 +224,10 @@ jobs:
echo "CESIUM_UNREAL_VERSION=$CESIUM_UNREAL_VERSION" >> $GITHUB_ENV
echo "BUILD_CESIUM_UNREAL_PACKAGE_NAME=$BUILD_CESIUM_UNREAL_PACKAGE_NAME" >> $GITHUB_ENV
echo "BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME=$BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME" >> $GITHUB_ENV
- - name: Download iOS build
- uses: actions/download-artifact@v4
- with:
- name: CesiumForUnreal-54-ios-${{ env.CESIUM_UNREAL_VERSION}}
- path: combine
- - name: Download macOS build
+ - name: Download Apple build
uses: actions/download-artifact@v4
with:
- name: CesiumForUnreal-54-macos-${{ env.CESIUM_UNREAL_VERSION}}
+ name: CesiumForUnreal-54-apple-${{ env.CESIUM_UNREAL_VERSION}}
path: combine
- name: Download Android build
uses: actions/download-artifact@v4
@@ -410,3 +272,121 @@ jobs:
test-package-base-name: "CesiumForUnreal-54"
visual-studio-version: "2022"
visual-studio-components: "Microsoft.VisualStudio.Component.VC.14.34.17.4.x86.x64,Microsoft.VisualStudio.Component.Windows10SDK.18362"
+ Windows55:
+ uses: ./.github/workflows/buildWindows.yml
+ secrets: inherit
+ with:
+ runner-label: "windows-2022"
+ unreal-engine-version: "5.5.0"
+ unreal-engine-zip: "s3://cesium-unreal-engine/5.5.0/UE_5.5.zip"
+ unreal-program-name: "UE_5.5"
+ upload-package-base-name: "CesiumForUnreal-55-windows"
+ # These are specified in the Unreal Engine release notes under "IDE Version the Build farm compiles against"
+ # and using them ensures we're compiling our plugin in the exact same way that Unreal Engine itself is compiled.
+ cmake-generator: "Visual Studio 17 2022"
+ cmake-toolchain: "version=14.38"
+ cmake-platform: "x64,version=10.0.22621.0"
+ visual-studio-version: "2022"
+ visual-studio-components: "Microsoft.VisualStudio.Component.VC.14.38.17.8.x86.x64,Microsoft.VisualStudio.Component.Windows11SDK.22621"
+ TestWindows55:
+ needs: [Windows55]
+ uses: ./.github/workflows/testWindows.yml
+ secrets: inherit
+ with:
+ runner-label: windows-2022
+ unreal-engine-zip: "s3://cesium-unreal-engine/5.5.0/UE_5.5.zip"
+ unreal-program-name: "UE_5.5"
+ test-package-base-name: "CesiumForUnreal-55-windows"
+ Android55:
+ uses: ./.github/workflows/buildAndroid.yml
+ secrets: inherit
+ with:
+ runner-label: windows-2022
+ unreal-engine-version: "5.5.0"
+ unreal-engine-zip: "s3://cesium-unreal-engine/5.5.0/UE_5.5.zip"
+ unreal-program-name: "UE_5.5"
+ upload-package-base-name: "CesiumForUnreal-55-android"
+ android-ndk-version: "r25b"
+ Linux55:
+ uses: ./.github/workflows/buildLinux.yml
+ secrets: inherit
+ with:
+ runner-label: ubuntu-22.04
+ unreal-engine-version: "5.5.0"
+ unreal-engine-zip: "s3://cesium-unreal-engine/5.5.0/Linux_Unreal_Engine_5.5.0.zip"
+ unreal-program-name: "UE_5.5"
+ upload-package-base-name: "CesiumForUnreal-55-linux"
+ clang-version: "v23_clang-18.1.0-rockylinux8"
+ Apple55:
+ uses: ./.github/workflows/buildApple.yml
+ secrets: inherit
+ with:
+ runner-label: macos-14
+ unreal-engine-version: "5.5.0"
+ unreal-engine-zip: "s3://cesium-unreal-engine/5.5.0/UE_55_macOS.zip"
+ unreal-program-name: "UE_5.5"
+ upload-package-base-name: "CesiumForUnreal-55-apple"
+ xcode-version: "15.4"
+ Combine55:
+ runs-on: ubuntu-latest
+ needs: [Windows55, Android55, Linux55, Apple55]
+ steps:
+ - name: Check out repository code
+ uses: actions/checkout@v4
+ - name: Set environment variables
+ run: |
+ export CESIUM_UNREAL_VERSION=$GITHUB_REF_NAME
+ export BUILD_CESIUM_UNREAL_PACKAGE_NAME="CesiumForUnreal-55-${CESIUM_UNREAL_VERSION}"
+ export BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME="CesiumForUnreal-55-SourceOnly-${CESIUM_UNREAL_VERSION}"
+ # Make these available to subsequent steps
+ echo "CESIUM_UNREAL_VERSION=$CESIUM_UNREAL_VERSION" >> $GITHUB_ENV
+ echo "BUILD_CESIUM_UNREAL_PACKAGE_NAME=$BUILD_CESIUM_UNREAL_PACKAGE_NAME" >> $GITHUB_ENV
+ echo "BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME=$BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME" >> $GITHUB_ENV
+ - name: Download Apple build
+ uses: actions/download-artifact@v4
+ with:
+ name: CesiumForUnreal-55-apple-${{ env.CESIUM_UNREAL_VERSION}}
+ path: combine
+ - name: Download Android build
+ uses: actions/download-artifact@v4
+ with:
+ name: CesiumForUnreal-55-android-${{ env.CESIUM_UNREAL_VERSION}}
+ path: combine
+ - name: Download Linux build
+ uses: actions/download-artifact@v4
+ with:
+ name: CesiumForUnreal-55-linux-${{ env.CESIUM_UNREAL_VERSION}}
+ path: combine
+ - name: Download Windows build
+ uses: actions/download-artifact@v4
+ with:
+ name: CesiumForUnreal-55-windows-${{ env.CESIUM_UNREAL_VERSION}}
+ path: combine
+ - name: Publish combined package artifact
+ if: ${{ success() }}
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ env.BUILD_CESIUM_UNREAL_PACKAGE_NAME}}
+ path: combine
+ - name: Publish combined package artifact for the Unreal Marketplace
+ if: ${{ success() }}
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ env.BUILD_CESIUM_UNREAL_SOURCE_ONLY_PACKAGE_NAME}}
+ path: |
+ combine
+ # These are built by Epic, and including them seems to confuse their process.
+ !combine/CesiumForUnreal/Binaries/**/*
+ !combine/CesiumForUnreal/Intermediate/**/*
+ TestPackage55:
+ needs: [Combine55]
+ uses: ./.github/workflows/testPackageOnWindows.yml
+ secrets: inherit
+ with:
+ runner-label: windows-2022
+ unreal-engine-zip: "s3://cesium-unreal-engine/5.5.0/UE_5.5.zip"
+ unreal-program-name: "UE_5.5"
+ unreal-engine-association: "5.5"
+ test-package-base-name: "CesiumForUnreal-55"
+ visual-studio-version: "2022"
+ visual-studio-components: "Microsoft.VisualStudio.Component.VC.14.38.17.8.x86.x64,Microsoft.VisualStudio.Component.Windows11SDK.22621"
diff --git a/.github/workflows/buildAndroid.yml b/.github/workflows/buildAndroid.yml
index 01f800abf..bc63ba42d 100644
--- a/.github/workflows/buildAndroid.yml
+++ b/.github/workflows/buildAndroid.yml
@@ -43,6 +43,10 @@ jobs:
uses: actions/checkout@v4
with:
submodules: recursive
+ - name: Configure vcpkg caching
+ uses: ./.github/actions/vcpkg-cache
+ with:
+ id: ${{ inputs.upload-package-base-name }}
- name: Set environment variables
run: |
$env:CESIUM_UNREAL_VERSION=$env:GITHUB_REF_NAME
@@ -52,25 +56,28 @@ jobs:
echo "BUILD_CESIUM_UNREAL_PACKAGE_NAME=${ENV:BUILD_CESIUM_UNREAL_PACKAGE_NAME}" >> $ENV:GITHUB_ENV
- name: Install nasm
uses: ilammy/setup-nasm@v1.5.1
+ - name: Install Unreal Engine
+ uses: ./.github/actions/install-unreal-windows
+ with:
+ unreal-engine-zip: ${{ inputs.unreal-engine-zip }}
+ unreal-program-name: ${{ inputs.unreal-program-name }}
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: Build cesium-native
run: |
# CMake gets confused by the Windows backslashes
$env:ANDROID_NDK_ROOT=$env:ANDROID_NDK_ROOT.replace('\', '/')
+ $env:ANDROID_NDK_HOME=$env:ANDROID_NDK_ROOT
+ $env:UNREAL_ENGINE_ROOT="D:/Program Files/Epic Games/${{ inputs.unreal-program-name }}"
+ $env:CESIUM_VCPKG_RELEASE_ONLY="TRUE"
cd extern
cmake -B build-android -S . -G Ninja -DCMAKE_TOOLCHAIN_FILE="unreal-android-toolchain.cmake" -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build-android --config Release --target install -j8
cd ..
rm -r -fo extern
- - name: Install Unreal Engine
- uses: ./.github/actions/install-unreal-windows
- with:
- unreal-engine-zip: ${{ inputs.unreal-engine-zip }}
- unreal-program-name: ${{ inputs.unreal-program-name }}
- aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
- aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: Overwrite plugin engine version
run: |
- ((Get-Content -path CesiumForUnreal.uplugin -Raw) -replace '"EngineVersion": "5.1.0"','"EngineVersion": "${{ inputs.unreal-engine-version }}"') | Set-Content -Path CesiumForUnreal.uplugin
+ ((Get-Content -path CesiumForUnreal.uplugin -Raw) -replace '"EngineVersion": "5.3.0"','"EngineVersion": "${{ inputs.unreal-engine-version }}"') | Set-Content -Path CesiumForUnreal.uplugin
- name: Customize BuildConfiguration.xml
run: |
mkdir -p "$env:USERPROFILE\AppData\Roaming\Unreal Engine\UnrealBuildTool"
@@ -92,10 +99,6 @@ jobs:
if: ${{ failure() }}
run: |
cat "C:\Users\runneradmin\AppData\Roaming\Unreal Engine\AutomationTool\Logs\D+Program+Files+Epic+Games+${{ inputs.unreal-program-name }}\UBT-UnrealGame-Android-Development.txt"
- - name: Compress debug sections
- run: |
- dir packages/CesiumForUnreal/Intermediate/Build/Android/UnrealGame/Development/CesiumRuntime/*.o | Foreach-Object { & $ENV:ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe --compress-debug-sections $_.FullName }
- dir packages/CesiumForUnreal/Intermediate/Build/Android/UnrealGame/Shipping/CesiumRuntime/*.o | Foreach-Object { & $ENV:ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/windows-x86_64/bin/llvm-objcopy.exe --compress-debug-sections $_.FullName }
- name: Publish plugin package artifact
if: ${{ success() }}
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/buildApple.yml b/.github/workflows/buildApple.yml
new file mode 100644
index 000000000..426360390
--- /dev/null
+++ b/.github/workflows/buildApple.yml
@@ -0,0 +1,148 @@
+name: Build macOS
+
+on:
+ workflow_call:
+ inputs:
+ runner-label:
+ required: true
+ type: string
+ unreal-engine-version:
+ required: true
+ type: string
+ unreal-engine-zip:
+ required: true
+ type: string
+ unreal-program-name:
+ required: true
+ type: string
+ upload-package-base-name:
+ required: true
+ type: string
+ xcode-version:
+ required: true
+ type: string
+jobs:
+ build:
+ runs-on: ${{ inputs.runner-label }}
+ steps:
+ - name: Customize BuildConfiguration.xml
+ run: |
+ mkdir -p ~/.config/Unreal\ Engine/UnrealBuildTool
+ # - We limit parallel actions because our builds use a lot more memory than UBT thinks they will.
+ # - We set the source code control Provider to None so UBT includes all files in the unity build.
+ printf '\n\n \n 2\n \n None\n\n' > ~/.config/Unreal\ Engine/UnrealBuildTool/BuildConfiguration.xml
+ # In UE 5.5, UBT apparently loads from ~/Documents instead of ~/.config
+ mkdir -p ~/Documents/Unreal\ Engine/UnrealBuildTool
+ cp ~/.config/Unreal\ Engine/UnrealBuildTool/BuildConfiguration.xml ~/Documents/Unreal\ Engine/UnrealBuildTool/BuildConfiguration.xml
+ - name: Make some more disk space
+ run: |
+ df -h
+ ls /Applications
+ brew uninstall google-chrome
+ sudo rm -rf /Users/runner/Library/Android
+ sudo rm -rf /Applications/Xcode_14.3.app
+ sudo rm -rf /Applications/Xcode_14.3.1.app
+ sudo rm -rf /Applications/Xcode_15.0.1.app
+ sudo rm -rf /Applications/Xcode_15.0.app
+ sudo rm -rf /Applications/Xcode_15.1.0.app
+ sudo rm -rf /Applications/Xcode_15.1.app
+ sudo rm -rf /Applications/Xcode_15.2.0.app
+ sudo rm -rf /Applications/Xcode_15.2.app
+ sudo rm -rf /Applications/Xcode_15.3.0.app
+ sudo rm -rf /Applications/Xcode_15.3.app
+ sudo rm -rf /Applications/Xcode_16.0.0.app
+ sudo rm -rf /Applications/Xcode_16.0.app
+ sudo rm -rf /Applications/Xcode_16.1.0.app
+ sudo rm -rf /Applications/Xcode_16.1.app
+ sudo rm -rf /Applications/Xcode_16.1_beta.app
+ sudo rm -rf /Applications/Xcode_16_beta_6.app
+ ls /Applications
+ df -h
+ - name: Set XCode version
+ uses: maxim-lobanov/setup-xcode@v1
+ with:
+ xcode-version: "${{ inputs.xcode-version }}"
+ - name: Check out repository code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - name: Configure vcpkg caching
+ uses: ./.github/actions/vcpkg-cache
+ with:
+ id: ${{ inputs.upload-package-base-name }}
+ - name: Install Unreal Engine
+ uses: ./.github/actions/install-unreal-macos
+ with:
+ unreal-engine-zip: ${{ inputs.unreal-engine-zip }}
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ unreal-program-name: ${{ inputs.unreal-program-name }}
+ - name: Set environment variables
+ run: |
+ export CESIUM_UNREAL_VERSION=$GITHUB_REF_NAME
+ export BUILD_CESIUM_UNREAL_PACKAGE_NAME="${{ inputs.upload-package-base-name }}-${CESIUM_UNREAL_VERSION}"
+ # Make these available to subsequent steps
+ echo "CESIUM_UNREAL_VERSION=${CESIUM_UNREAL_VERSION}" >> $GITHUB_ENV
+ echo "BUILD_CESIUM_UNREAL_PACKAGE_NAME=${BUILD_CESIUM_UNREAL_PACKAGE_NAME}" >> $GITHUB_ENV
+ - name: Install nasm
+ uses: ilammy/setup-nasm@v1.5.1
+ - name: Build cesium-native for macOS ARM64
+ run: |
+ export UNREAL_ENGINE_ROOT=$HOME/${{ inputs.unreal-program-name }}
+ export CESIUM_VCPKG_RELEASE_ONLY=TRUE
+ mkdir -p extern/build-arm64
+ cd extern/build-arm64
+ cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_SYSTEM_NAME=Darwin -DCMAKE_SYSTEM_PROCESSOR=arm64
+ cmake --build . -j4 --target install
+ - name: Build cesium-native for macOS x86_64
+ run: |
+ export UNREAL_ENGINE_ROOT=$HOME/${{ inputs.unreal-program-name }}
+ export CESIUM_VCPKG_RELEASE_ONLY=TRUE
+ mkdir -p extern/build-x64
+ cd extern/build-x64
+ cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DCMAKE_OSX_ARCHITECTURES=x86_64 -DCMAKE_SYSTEM_NAME=Darwin -DCMAKE_SYSTEM_PROCESSOR=x86_64
+ cmake --build . -j4 --target install
+ - name: Create universal macOS libs for cesium-native
+ run: |
+ mkdir -p ${GITHUB_WORKSPACE}/Source/ThirdParty/lib/Darwin-universal-Release
+ for f in ${GITHUB_WORKSPACE}/Source/ThirdParty/lib/Darwin-x86_64-Release/*.a
+ do
+ arm64f=${GITHUB_WORKSPACE}/Source/ThirdParty/lib/Darwin-arm64-Release/$(basename -- $f)
+ x64f=${GITHUB_WORKSPACE}/Source/ThirdParty/lib/Darwin-x86_64-Release/$(basename -- $f)
+ universalf=${GITHUB_WORKSPACE}/Source/ThirdParty/lib/Darwin-universal-Release/$(basename -- $f)
+ if diff $arm64f $x64f; then
+ # arm64 and x64 files are identical, so just copy one to the universal directory.
+ cp $arm64f $universalf
+ else
+ lipo -create -output $universalf $arm64f $x64f
+ fi
+ done
+ rm -rf ${GITHUB_WORKSPACE}/Source/ThirdParty/lib/Darwin-x86_64-Release
+ rm -rf ${GITHUB_WORKSPACE}/Source/ThirdParty/lib/Darwin-arm64-Release
+ - name: Build cesium-native for iOS
+ run: |
+ mkdir -p extern/build-ios
+ cd extern
+ export UNREAL_ENGINE_ROOT=$HOME/${{ inputs.unreal-program-name }}
+ export CESIUM_VCPKG_RELEASE_ONLY=TRUE
+ cmake -B build-ios -S . -GXcode -DCMAKE_TOOLCHAIN_FILE="unreal-ios-toolchain.cmake" -DCMAKE_BUILD_TYPE=Release
+ cmake --build build-ios -j4 --target install --config Release
+ - name: Remove extern directory
+ run: |
+ rm -rf extern
+ - name: Build plugin for macOS and iOS
+ run: |
+ sed -i '' 's/\"EngineVersion\": \"5.3.0\"/\"EngineVersion\": \"${{ inputs.unreal-engine-version }}\"/g' CesiumForUnreal.uplugin
+ export UNREAL_ENGINE_DIR=$HOME/${{ inputs.unreal-program-name }}
+ cd $UNREAL_ENGINE_DIR/Engine/Build/BatchFiles
+ ./RunUAT.sh BuildPlugin -Plugin="$GITHUB_WORKSPACE/CesiumForUnreal.uplugin" -Package="$GITHUB_WORKSPACE/packages/CesiumForUnreal" -CreateSubFolder -TargetPlatforms=Mac+iOS -Architecture_Mac=arm64+x64
+ - name: Print log
+ if: ${{ failure() }}
+ run: |
+ cat "/Users/runner/Library/Logs/Unreal Engine/LocalBuildLogs/UBT-UnrealEditor-Mac-Development.txt"
+ - name: Publish plugin package artifact
+ if: ${{ success() }}
+ uses: actions/upload-artifact@v4
+ with:
+ name: ${{ env.BUILD_CESIUM_UNREAL_PACKAGE_NAME}}
+ path: packages
diff --git a/.github/workflows/buildLinux.yml b/.github/workflows/buildLinux.yml
index 448cb2fcf..5aa1990a1 100644
--- a/.github/workflows/buildLinux.yml
+++ b/.github/workflows/buildLinux.yml
@@ -34,10 +34,12 @@ jobs:
sudo swapon --show
cat /proc/meminfo
apt list --installed
+ sudo dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -n
+ sudo snap list
- name: Removed unneeded packages to gain disk space
run: |
sudo apt update
- sudo apt remove google-chrome-stable clang-13 clang-14 clang-15 llvm-13-dev llvm-13-linker-tools llvm-13-runtime llvm-13-tools llvm-13 llvm-14-dev llvm-14-linker-tools llvm-14-runtime llvm-14-tools llvm-14 llvm-15-dev llvm-15-linker-tools llvm-15-runtime llvm-15-tools llvm-15 x11-common xserver-common aspnetcore-runtime-6.0 aspnetcore-runtime-7.0 aspnetcore-runtime-8.0 aspnetcore-targeting-pack-6.0 aspnetcore-targeting-pack-7.0 aspnetcore-targeting-pack-8.0 docker-ce-cli docker-ce dotnet-apphost-pack-6.0 dotnet-apphost-pack-7.0 dotnet-apphost-pack-8.0 dotnet-host dotnet-hostfxr-6.0 dotnet-hostfxr-7.0 dotnet-hostfxr-8.0 dotnet-runtime-6.0 dotnet-runtime-7.0 dotnet-runtime-8.0 dotnet-runtime-deps-6.0 dotnet-runtime-deps-7.0 dotnet-runtime-deps-8.0 dotnet-sdk-6.0 dotnet-sdk-7.0 dotnet-sdk-8.0 dotnet-targeting-pack-6.0 dotnet-targeting-pack-7.0 dotnet-targeting-pack-8.0 eatmydata emacsen-common firebird3.0-common-doc firebird3.0-common firefox kubectl mercurial-common mercurial microsoft-edge-stable mssql-tools mysql-client-8.0 mysql-client-core-8.0 mysql-client mysql-common mysql-server-8.0 php8.1 postgresql-14
+ sudo apt remove google-chrome-stable clang-13 clang-14 clang-15 llvm-13-dev llvm-13-linker-tools llvm-13-runtime llvm-13-tools llvm-13 llvm-14-dev llvm-14-linker-tools llvm-14-runtime llvm-14-tools llvm-14 llvm-15-dev llvm-15-linker-tools llvm-15-runtime llvm-15-tools llvm-15 x11-common xserver-common aspnetcore-runtime-6.0 aspnetcore-runtime-7.0 aspnetcore-runtime-8.0 aspnetcore-targeting-pack-6.0 aspnetcore-targeting-pack-7.0 aspnetcore-targeting-pack-8.0 docker-ce-cli docker-ce dotnet-apphost-pack-6.0 dotnet-apphost-pack-7.0 dotnet-apphost-pack-8.0 dotnet-host dotnet-hostfxr-6.0 dotnet-hostfxr-7.0 dotnet-hostfxr-8.0 dotnet-runtime-6.0 dotnet-runtime-7.0 dotnet-runtime-8.0 dotnet-runtime-deps-6.0 dotnet-runtime-deps-7.0 dotnet-runtime-deps-8.0 dotnet-sdk-6.0 dotnet-sdk-7.0 dotnet-sdk-8.0 dotnet-targeting-pack-6.0 dotnet-targeting-pack-7.0 dotnet-targeting-pack-8.0 eatmydata emacsen-common firebird3.0-common-doc firebird3.0-common firefox kubectl mercurial-common mercurial microsoft-edge-stable mssql-tools mysql-client-8.0 mysql-client-core-8.0 mysql-client mysql-common mysql-server-8.0 php8.1 postgresql-14 azure-cli microsoft-edge-stable google-cloud-cli temurin-21-jdk temurin-17-jdk temurin-11-jdk temurin-8-jdk powershell google-cloud-cli-anthoscli mysql-server-core-8.0 containerd.io libllvm15 libllvm14 libllvm13 mono-devel libclang-common-15-dev libclang-common-14-dev libclang-common-13-dev
df -h
- name: Create some space to work in /mnt
run: |
@@ -47,6 +49,10 @@ jobs:
uses: actions/checkout@v4
with:
submodules: recursive
+ - name: Configure vcpkg caching
+ uses: ./.github/actions/vcpkg-cache
+ with:
+ id: ${{ inputs.upload-package-base-name }}
- name: Install Unreal Engine
uses: ./.github/actions/install-unreal-linux
with:
@@ -63,12 +69,13 @@ jobs:
run: |
echo "CESIUM_UNREAL_VERSION=$GITHUB_REF_NAME" >> "$GITHUB_ENV"
echo "BUILD_CESIUM_UNREAL_PACKAGE_NAME=${{ inputs.upload-package-base-name }}-$GITHUB_REF_NAME" >> "$GITHUB_ENV"
- echo "UNREAL_ENGINE_DIR=/mnt/work/${{ inputs.unreal-program-name }}" >> "$GITHUB_ENV"
+ echo "UNREAL_ENGINE_ROOT=/mnt/work/${{ inputs.unreal-program-name }}" >> "$GITHUB_ENV"
echo "LINUX_MULTIARCH_ROOT=/mnt/work/${{ inputs.unreal-program-name }}/Engine/Extras/ThirdPartyNotUE/SDKs/HostLinux/Linux_x64/${{ inputs.clang-version }}/" >> "$GITHUB_ENV"
- name: Build cesium-native
run: |
export UNREAL_ENGINE_COMPILER_DIR="${LINUX_MULTIARCH_ROOT}x86_64-unknown-linux-gnu"
- export UNREAL_ENGINE_LIBCXX_DIR="${UNREAL_ENGINE_DIR}/Engine/Source/ThirdParty/Unix/LibCxx"
+ export UNREAL_ENGINE_LIBCXX_DIR="${UNREAL_ENGINE_ROOT}/Engine/Source/ThirdParty/Unix/LibCxx"
+ export CESIUM_VCPKG_RELEASE_ONLY=TRUE
cd extern
cmake -B build -S . -G Ninja -DCMAKE_TOOLCHAIN_FILE="unreal-linux-toolchain.cmake" -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release --target install -j8
@@ -90,8 +97,8 @@ jobs:
printf '\n\n \n 2\n \n None\n\n' > ~/.config/Unreal\ Engine/UnrealBuildTool/BuildConfiguration.xml
- name: Build plugin
run: |
- sed -i 's/\"EngineVersion\": \"5.1.0\"/\"EngineVersion\": \"${{ inputs.unreal-engine-version }}\"/g' CesiumForUnreal.uplugin
- cd $UNREAL_ENGINE_DIR/Engine/Build/BatchFiles
+ sed -i 's/\"EngineVersion\": \"5.3.0\"/\"EngineVersion\": \"${{ inputs.unreal-engine-version }}\"/g' CesiumForUnreal.uplugin
+ cd $UNREAL_ENGINE_ROOT/Engine/Build/BatchFiles
./RunUAT.sh BuildPlugin -Plugin="$GITHUB_WORKSPACE/CesiumForUnreal.uplugin" -Package="$GITHUB_WORKSPACE/packages/CesiumForUnreal" -CreateSubFolder -TargetPlatforms=Linux
- name: Fix RPATH
run: |
@@ -99,26 +106,6 @@ jobs:
patchelf --print-rpath libUnrealEditor-CesiumRuntime.so
export UPDATED_RPATH=`patchelf --print-rpath libUnrealEditor-CesiumRuntime.so | sed 's/${ORIGIN}[^:]*\/SunPosition\/Binaries\/Linux/${ORIGIN}\/..\/..\/..\/..\/Runtime\/SunPosition\/Binaries\/Linux/'`
patchelf --force-rpath --set-rpath "$UPDATED_RPATH" libUnrealEditor-CesiumRuntime.so
- - name: Compress debug sections
- run: |
- for f in packages/CesiumForUnreal/Binaries/Linux/*.so; do objcopy --compress-debug-sections $f; done
- for f in packages/CesiumForUnreal/Binaries/Linux/*.debug; do objcopy --compress-debug-sections $f; done
- if [ -d "packages/CesiumForUnreal/Intermediate/Build/Linux/x64" ]; then
- for f in packages/CesiumForUnreal/Intermediate/Build/Linux/x64/UnrealGame/Development/CesiumRuntime/*.o; do
- objcopy --compress-debug-sections $f
- done
- for f in packages/CesiumForUnreal/Intermediate/Build/Linux/x64/UnrealGame/Shipping/CesiumRuntime/*.o; do
- objcopy --compress-debug-sections $f
- done
- fi
- if [ -d "packages/CesiumForUnreal/Intermediate/Build/Linux/B4D820EA" ]; then
- for f in packages/CesiumForUnreal/Intermediate/Build/Linux/B4D820EA/UnrealGame/Development/CesiumRuntime/*.o; do
- objcopy --compress-debug-sections $f
- done
- for f in packages/CesiumForUnreal/Intermediate/Build/Linux/B4D820EA/UnrealGame/Shipping/CesiumRuntime/*.o; do
- objcopy --compress-debug-sections $f
- done
- fi
- name: Print disk space free
run: |
df -h
diff --git a/.github/workflows/buildMac.yml b/.github/workflows/buildMac.yml
deleted file mode 100644
index 5756e2d6f..000000000
--- a/.github/workflows/buildMac.yml
+++ /dev/null
@@ -1,102 +0,0 @@
-name: Build macOS
-
-on:
- workflow_call:
- inputs:
- runner-label:
- required: true
- type: string
- unreal-engine-version:
- required: true
- type: string
- unreal-engine-zip:
- required: true
- type: string
- unreal-program-name:
- required: true
- type: string
- upload-package-base-name:
- required: true
- type: string
- xcode-version:
- required: true
- type: string
-jobs:
- build:
- runs-on: ${{ inputs.runner-label }}
- steps:
- # - name: Install XCode ${{ inputs.xcode-version }}
- # env:
- # AWS_REGION: us-east-1
- # AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
- # AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- # run: |
- # aws s3 cp s3://cesium-unreal-engine/Xcode/Xcode_${{ inputs.xcode-version }}.xip . --no-progress
- # export ORIGINAL_DIR=$PWD
- # cd /Applications
- # xip -x $ORIGINAL_DIR/Xcode_${{ inputs.xcode-version }}.xip
- # rm $ORIGINAL_DIR/Xcode_${{ inputs.xcode-version }}.xip
- - name: Set XCode version
- uses: maxim-lobanov/setup-xcode@v1
- with:
- xcode-version: "${{ inputs.xcode-version }}"
- - name: Check out repository code
- uses: actions/checkout@v4
- with:
- submodules: recursive
- - name: Install Unreal Engine
- uses: ./.github/actions/install-unreal-macos
- with:
- unreal-engine-zip: ${{ inputs.unreal-engine-zip }}
- aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
- aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- unreal-program-name: ${{ inputs.unreal-program-name }}
- - name: Set environment variables
- run: |
- export CESIUM_UNREAL_VERSION=$GITHUB_REF_NAME
- export BUILD_CESIUM_UNREAL_PACKAGE_NAME="${{ inputs.upload-package-base-name }}-${CESIUM_UNREAL_VERSION}"
- # Make these available to subsequent steps
- echo "CESIUM_UNREAL_VERSION=${CESIUM_UNREAL_VERSION}" >> $GITHUB_ENV
- echo "BUILD_CESIUM_UNREAL_PACKAGE_NAME=${BUILD_CESIUM_UNREAL_PACKAGE_NAME}" >> $GITHUB_ENV
- - name: Install nasm
- uses: ilammy/setup-nasm@v1.5.1
- - name: Build cesium-native
- run: |
- mkdir -p extern/build
- cd extern/build
- INSTALL_LIBDIR=`cmake .. -LA | grep CMAKE_INSTALL_LIBDIR`
- INSTALL_LIBDIR=${INSTALL_LIBDIR##CMAKE_INSTALL_LIBDIR:PATH=}
- cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DCMAKE_OSX_ARCHITECTURES=arm64
- cmake --build . -j4 --target install
- mv $INSTALL_LIBDIR ${INSTALL_LIBDIR}-silicon
- cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15 -DCMAKE_OSX_ARCHITECTURES=x86_64
- cmake --build . -j4 --target install
- for f in ${INSTALL_LIBDIR}/*.a
- do
- lipo -create -output $f ${INSTALL_LIBDIR}-silicon/$(basename -- $f) $f
- done
- rm -r -f ${INSTALL_LIBDIR}-silicon
- cd ../..
- rm -rf extern
- - name: Customize BuildConfiguration.xml
- run: |
- mkdir -p ~/.config/Unreal\ Engine/UnrealBuildTool
- # - We limit parallel actions because our builds use a lot more memory than UBT thinks they will.
- # - We set the source code control Provider to None so UBT includes all files in the unity build.
- printf '\n\n \n 2\n \n None\n\n' > ~/.config/Unreal\ Engine/UnrealBuildTool/BuildConfiguration.xml
- - name: Build plugin
- run: |
- sed -i '' 's/\"EngineVersion\": \"5.1.0\"/\"EngineVersion\": \"${{ inputs.unreal-engine-version }}\"/g' CesiumForUnreal.uplugin
- export UNREAL_ENGINE_DIR=$HOME/${{ inputs.unreal-program-name }}
- cd $UNREAL_ENGINE_DIR/Engine/Build/BatchFiles
- ./RunUAT.sh BuildPlugin -Plugin="$GITHUB_WORKSPACE/CesiumForUnreal.uplugin" -Package="$GITHUB_WORKSPACE/packages/CesiumForUnreal" -CreateSubFolder -TargetPlatforms=Mac
- - name: Print log
- if: ${{ failure() }}
- run: |
- cat "/Users/runner/Library/Logs/Unreal Engine/LocalBuildLogs/UBT-UnrealEditor-Mac-Development.txt"
- - name: Publish plugin package artifact
- if: ${{ success() }}
- uses: actions/upload-artifact@v4
- with:
- name: ${{ env.BUILD_CESIUM_UNREAL_PACKAGE_NAME}}
- path: packages
diff --git a/.github/workflows/buildWindows.yml b/.github/workflows/buildWindows.yml
index fc7eb36cb..9d6383e7b 100644
--- a/.github/workflows/buildWindows.yml
+++ b/.github/workflows/buildWindows.yml
@@ -69,6 +69,10 @@ jobs:
if: ${{ inputs.extra-choco-packages }}
run: |
choco install -y ${{ inputs.extra-choco-packages }}
+ - name: Configure vcpkg caching
+ uses: ./.github/actions/vcpkg-cache
+ with:
+ id: ${{ inputs.upload-package-base-name }}
- name: Set environment variables
run: |
$env:CESIUM_UNREAL_VERSION=$env:GITHUB_REF_NAME
@@ -99,6 +103,8 @@ jobs:
- name: Build cesium-native
run: |
cd extern
+ $env:UNREAL_ENGINE_ROOT="D:/Program Files/Epic Games/${{ inputs.unreal-program-name }}"
+ $env:CESIUM_VCPKG_RELEASE_ONLY="TRUE"
$toolchainOption=If ("${{ inputs.cmake-toolchain }}") {"-T ${{ inputs.cmake-toolchain }}"} Else {""}
cmake -B build -S . -A "${{ inputs.cmake-platform }}" -G "${{ inputs.cmake-generator }}" $toolchainOption
cmake --build build --config Release --target install -j8
@@ -106,7 +112,7 @@ jobs:
rm -r -fo extern
- name: Overwrite plugin engine version
run: |
- ((Get-Content -path CesiumForUnreal.uplugin -Raw) -replace '"EngineVersion": "5.1.0"','"EngineVersion": "${{ inputs.unreal-engine-version }}"') | Set-Content -Path CesiumForUnreal.uplugin
+ ((Get-Content -path CesiumForUnreal.uplugin -Raw) -replace '"EngineVersion": "5.3.0"','"EngineVersion": "${{ inputs.unreal-engine-version }}"') | Set-Content -Path CesiumForUnreal.uplugin
- name: Customize BuildConfiguration.xml
run: |
mkdir -p "$env:USERPROFILE\AppData\Roaming\Unreal Engine\UnrealBuildTool"
diff --git a/.github/workflows/buildiOS.yml b/.github/workflows/buildiOS.yml
deleted file mode 100644
index 846d8df99..000000000
--- a/.github/workflows/buildiOS.yml
+++ /dev/null
@@ -1,93 +0,0 @@
-name: Build iOS
-
-on:
- workflow_call:
- inputs:
- runner-label:
- required: true
- type: string
- unreal-engine-version:
- required: true
- type: string
- unreal-engine-zip:
- required: true
- type: string
- unreal-program-name:
- required: true
- type: string
- upload-package-base-name:
- required: true
- type: string
- xcode-version:
- required: true
- type: string
-jobs:
- build:
- runs-on: ${{ inputs.runner-label }}
- steps:
- # - name: Install XCode ${{ inputs.xcode-version }}
- # env:
- # AWS_REGION: us-east-1
- # AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
- # AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- # run: |
- # aws s3 cp s3://cesium-unreal-engine/Xcode/Xcode_${{ inputs.xcode-version }}.xip . --no-progress
- # export ORIGINAL_DIR=$PWD
- # cd /Applications
- # xip -x $ORIGINAL_DIR/Xcode_${{ inputs.xcode-version }}.xip
- # rm $ORIGINAL_DIR/Xcode_${{ inputs.xcode-version }}.xip
- - name: Set XCode version
- uses: maxim-lobanov/setup-xcode@v1
- with:
- xcode-version: "${{ inputs.xcode-version }}"
- #"${{ inputs.xcode-version }}"
- - name: Check out repository code
- uses: actions/checkout@v4
- with:
- submodules: recursive
- - name: Set environment variables
- run: |
- export CESIUM_UNREAL_VERSION=$GITHUB_REF_NAME
- export BUILD_CESIUM_UNREAL_PACKAGE_NAME="${{ inputs.upload-package-base-name }}-${CESIUM_UNREAL_VERSION}"
- # Make these available to subsequent steps
- echo "CESIUM_UNREAL_VERSION=${CESIUM_UNREAL_VERSION}" >> $GITHUB_ENV
- echo "BUILD_CESIUM_UNREAL_PACKAGE_NAME=${BUILD_CESIUM_UNREAL_PACKAGE_NAME}" >> $GITHUB_ENV
- - name: Install nasm
- uses: ilammy/setup-nasm@v1.5.1
- - name: Install Unreal Engine
- uses: ./.github/actions/install-unreal-macos
- with:
- unreal-engine-zip: ${{ inputs.unreal-engine-zip }}
- aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
- aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- unreal-program-name: ${{ inputs.unreal-program-name }}
- - name: Build cesium-native
- run: |
- mkdir -p extern/build-ios
- cd extern
- cmake -B build-ios -S . -GXcode -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=15 -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_BUILD_TYPE=Release
- cmake --build build-ios -j4 --target install --config Release
- cd ..
- rm -rf extern
- - name: Customize BuildConfiguration.xml
- run: |
- mkdir -p ~/.config/Unreal\ Engine/UnrealBuildTool
- # - We limit parallel actions because our builds use a lot more memory than UBT thinks they will.
- # - We set the source code control Provider to None so UBT includes all files in the unity build.
- printf '\n\n \n 2\n \n None\n\n' > ~/.config/Unreal\ Engine/UnrealBuildTool/BuildConfiguration.xml
- - name: Build plugin
- run: |
- sed -i '' 's/\"EngineVersion\": \"5.1.0\"/\"EngineVersion\": \"${{ inputs.unreal-engine-version }}\"/g' CesiumForUnreal.uplugin
- export UNREAL_ENGINE_DIR=$HOME/${{ inputs.unreal-program-name }}
- cd $UNREAL_ENGINE_DIR/Engine/Build/BatchFiles
- ./RunUAT.sh BuildPlugin -Plugin="$GITHUB_WORKSPACE/CesiumForUnreal.uplugin" -Package="$GITHUB_WORKSPACE/packages/CesiumForUnreal" -CreateSubFolder -TargetPlatforms=iOS -NoHostPlatform
- - name: Print log
- if: ${{ failure() }}
- run: |
- cat "/Users/runner/Library/Logs/Unreal Engine/LocalBuildLogs/UBT-UnrealEditor-Mac-Development.txt"
- - name: Publish plugin package artifact
- if: ${{ success() }}
- uses: actions/upload-artifact@v4
- with:
- name: ${{ env.BUILD_CESIUM_UNREAL_PACKAGE_NAME}}
- path: packages
diff --git a/.github/workflows/prod.yml b/.github/workflows/prod.yml
new file mode 100644
index 000000000..f7bac494a
--- /dev/null
+++ b/.github/workflows/prod.yml
@@ -0,0 +1,42 @@
+name: prod
+on:
+ push:
+ branches:
+ - 'cesium.com'
+ - 'cesium.com-staging'
+jobs:
+ deploy-docs:
+ runs-on: ubuntu-22.04
+ env:
+ AWS_ACCESS_KEY_ID: ${{ secrets.NATIVE_ACCESS_KEY }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.NATIVE_SECRET_KEY }}
+ AWS_REGION: us-east-1
+ steps:
+ - name: Install Doxygen
+ run: |
+ cd ~
+ wget https://github.com/doxygen/doxygen/releases/download/Release_1_12_0/doxygen-1.12.0.linux.bin.tar.gz
+ tar xzf doxygen-1.12.0.linux.bin.tar.gz
+ export PATH=$PWD/doxygen-1.12.0/bin:$PATH
+ echo "PATH=$PATH" >> "$GITHUB_ENV"
+ doxygen --version
+ - name: Check out repository code
+ uses: actions/checkout@v4
+ with:
+ submodules: recursive
+ - name: Mark documentation official
+ if: ${{ github.ref_name == 'cesium.com' }}
+ run: |
+ sed -i 's/PRE-RELEASE/ /g' Documentation/Doxyfile
+ - name: Generate Documentation
+ run: |
+ npm install
+ npm run doxygen
+ - name: Deploy to cesium.com
+ if: ${{ github.ref_name == 'cesium.com' }}
+ run: |
+ aws s3 sync Documentation/Reference/html/ s3://cesium-website/cesium-unreal/ref-doc/ --cache-control "public, max-age=1800" --delete
+ - name: Deploy to cesium.com staging
+ if: ${{ github.ref_name == 'cesium.com-staging' }}
+ run: |
+ aws s3 sync Documentation/Reference/html/ s3://cesium-website/cesium-unreal/ref-doc-staging/ --cache-control "public, max-age=1800" --delete
diff --git a/.gitmodules b/.gitmodules
index ea20ad97f..cd261dd04 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -7,3 +7,6 @@
[submodule "extern/tidy-html5"]
path = extern/tidy-html5
url = https://github.com/htacg/tidy-html5
+[submodule "extern/swl-variant"]
+ path = extern/swl-variant
+ url = https://github.com/kring/swl-variant.git
diff --git a/CHANGES.md b/CHANGES.md
index 94ff056e5..2d149f067 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,11 +1,150 @@
# Change Log
-### ? - ?
+### v2.13.3 - 2025-02-12
+
+This release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.44.2 to v0.44.3. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.13.2 - 2025-02-10
+
+This release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.44.1 to v0.44.2. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.13.1 - 2025-02-03
+
+This release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.44.0 to v0.44.1. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.13.0 - 2025-02-03
+
+##### Additions :tada:
+
+- Added `CesiumUrlTemplateRasterOverlay`, allowing a raster overlay to be added using tiles requested based on a specified URL template.
+- Added `EstimateTimeZoneForLongitude` method to `ACesiumSunSky` to set a reasonable `TimeZone` value at the given longitude.
+- The "Place Georeference Origin Here" button on `ACesiumGeoreference` will now adjust the time zone of the `ACesiumSunSky` instances that reference it, based on the new origin's longitude. This improves user experience when moving the origin to locations where it would be nighttime in the current time zone.
+- Added `RequestHeaders` property to `Cesium3DTileset`, allowing per-tileset headers to be specified.
+- Added `RequestHeaders` properties to `CesiumTileMapServiceRasterOverlay`, `CesiumUrlTemplateRasterOverlay`, `CesiumWebMapServiceRasterOverlay`,
+ and `CesiumWebMapTileServiceRasterOverlay`, allowing per-raster-overlay HTTP headers to be specified.
##### Fixes :wrench:
-- Removed unnecessary alpha check when selecting translucent base materials.
+- Fixed another bug in `CesiumSubLevelSwitcherComponent` that could prevent all sub-levels from loading if a single sub-level failed to load.
+- Fixed a crash in `UCesiumIonServer` when running in a packaged build where tilesets are only created at runtime.
+- Worked around a limitation in Unreal's `FMatrix` -> `FTransform` conversion that prevented models with a small scale factor (e.g., where vertex positions are expressed in millimeters) from rendering because their scale was treated as 0.0.
+- Fixed a crash when calling `SampleHeightMostDetailed` blueprint function without a valid tileset.
+- Removed duplicate "Enable Water Mask" checkbox on `Cesium3DTileset` resulting from EditCondition flag.
+
+In addition to the above, this release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.43.0 to v0.44.0. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.12.0 - 2025-01-02
+
+##### Breaking Changes :mega:
+
+- Removed support for Unreal Engine 5.2. Unreal Engine 5.3 or later is now required.
+- Renamed `FCesiumFeatureIdAttribute::GetFeatureIDForVertex` to `FCesiumFeatureIdAttribute::GetFeatureID`.
+- Renamed `FCesiumFeatureIdAttribute::GetVertexCount` to `FCesiumFeatureIdAttribute::GetCount`.
+
+##### Additions :tada:
+
+- Added support for metadata querying and styling on instanced models.
+
+##### Fixes :wrench:
+
+- Fixed a bug in `CesiumSubLevelSwitcherComponent` that could prevent all sub-levels from loading if a single sub-level failed to load.
+
+This release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.42.0 to v0.43.0. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.11.1 - 2025-02-14
+
+This release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.42.0 to v0.42.1 in order to fix a critical bug when using Google Photorealistic 3D Tiles. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.11.0 - 2024-12-02
+
+This is the last release of Cesium for Unreal that will support Unreal Engine v5.2. Future versions will require Unreal Engine v5.3+.
+
+##### Additions :tada:
+
+- Added support for Unreal Engine 5.5.
+- Added a "From Ellipsoid" option to `Cesium3DTileset` to generate a tileset by tessellating the surface of the ellipsoid, producing a simple globe tileset without terrain features.
+
+##### Fixes :wrench:
+
+- Fixed a crash that could occur when using `SampleHeightMostDetailed` on a `Cesium3DTileset` with a raster overlay.
+- `CesiumPolygonRasterOverlay` now references `CesiumCartographicPolygon` instances using `TSoftObjectPtr`, which allows, for example, a raster overlay in the persistent level to use a polygon in a sub-level.
+- Fixed an overlay artifact bug that could occur when a `Cesium3DTileset` had three or more overlays.
+
+In addition to the above, this release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.41.0 to v0.42.0. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.10.0 - 2024-11-01
+
+##### Additions :tada:
+
+- Added `CircumscribedGroundHeight` property to `CesiumSunSky`. It defaults to 0, which is consistent with the previous behavior. It can be set to a larger value (like 40) to avoid dark splotchy artifacts when zoomed out far from the globe in certain tilesets where geometry extends very far beyond the ellipsoid in the low-detail representation, such as Google Photorealistic 3D Tiles.
+- Added a shared assets system that ensures external images referenced by different glTFs will only be loaded once per image. Previously, these images would be loaded again for each glTF that referenced them. This significantly reduces memory usage for tilesets that reuse the same textures.
+
+##### Fixes :wrench:
+
+- Fixed a bug that caused incorrect lighting for tilesets using `KHR_materials_unlit`.
+- Reduced the memory used by tiles with `KHR_materials_unlit`.
+- `CesiumGlobeAnchor` properties are no longer shown on the main `CesiumSunSky` Details panel, because it is almost never necessary to set these. They can still be set on the component's own Details panel if needed.
+- Fixed error messages in the Unreal log about uninitialized fields in `FCesiumSampleHeightResult`.
+
+In addition to the above, this release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.40.1 to v0.41.0. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.9.0 - 2024-10-01
+
+##### Additions :tada:
+
+- Added `SampleHeightMostDetailed` function to `Cesium3DTileset`, which asynchronously queries the height of a tileset at a list of positions. It is callable from both C++ and Blueprints.
+
+##### Fixes :wrench:
+
+- Drastically reduced tile mesh memory usage in UE 5.3 and 5.4 by working around a bug that causes those engine versions to add more texture coordinate sets than necessary.
+- Fixed a bug where the `scale`, `noData`, and `default` values of a property in `EXT_strutural_metadata` were not correctly passed to the tileset's material.
+
+This release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.39.0 to v0.40.1. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.8.0 - 2024-09-02
+
+##### Additions :tada:
+
+- Added universal (Intel and Apple Silicon) binaries for Unreal Engine 5.2. Unreal Engine 5.3 and 5.4 already had universal binaries.
+- Raster overlays now have `bAllowAnyoneToDestroyMe` set to true by default. This allows them to be dynamically removed and destroyed at runtime via the Blueprint `Destroy Component` function called from anywhere, including Level Blueprints. Previously, attempting to delete a raster overlay from outside the Actor would result in an error.
+
+##### Fixes :wrench:
+
+- Fixed a bug introduced in the previous release that caused instanced tilesets to render incorrectly.
+- Debug sections are no longer compressed on Linux and Android, improving compatibility.
+- Fixed a bug where calling `Refresh` on a `CesiumRasterOverlay` would cause the overlay to appear on the Cesium3DTileset, even if inactive.
+
+This release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.38.0 to v0.39.0. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.7.1 - 2024-08-01
+
+##### Fixes :wrench:
+
+- Improved collision and line tracing against tilesets by working around an overly-aggressive degenerate triangle check in the Chaos physics engine.
+- Fixed a bug that could cause a `bad_any_cast` exception when trying to access glTF extensions on non-Windows platforms. This commonly popped up when loading tilesets with metadata.
+- Fixed a bug that caused the `GetInteger64` functions on `CesiumMetadataValue`, `CesiumPropertyArray`, and `CesiumPropertyTableProperty` to always return the default value on non-Windows platforms.
+- Fixed issue with `UCesiumGlobeAnchorComponent::GetEllipsoid` that caused compilation errors on some machines.
+
+In addition to the above, this release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.37.0 to v0.38.0. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
+
+### v2.7.0 - 2024-07-01
+
+##### Additions :tada:
+
+- Cesium for Unreal now supports using non-WGS84 ellipsoids.
+ - An `CesiumEllipsoid` asset may be specified in the `Ellipsoid` field of a `CesiumGeoreference`.
+ - To create a `CesiumEllipsoid` asset, right-click in the Content Drawer and select "Data Asset" under "Miscellaneous." Choose "Cesium Ellipsoid" from the menu that appears.
+
+##### Fixes :wrench:
+
+- Fixed two problems with `CesiumCartographicRasterOverlay`:
+ - Small tiles would never be excluded, even with "Exclude Selected Tiles" enabled.
+ - Pieces of tiles would sometimes not have the raster overlay correctly applied to them. When using with clipping, this would cause bits of tiles to randomly appear inside the clipping polygon.
+- Removed an unnecessary alpha check when selecting translucent base materials.
- Fixed a crash caused by `CesiumSunSky` when no viewport is activated in the Editor.
+- Fixed build issues in Unreal 5.4.2 relating to `UStaticMesh` and `glm::toMat4`.
+
+In addition to the above, this release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.36.0 to v0.37.0. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
### v2.6.0 - 2024-06-03
@@ -101,7 +240,7 @@ In addition to the above, this release updates [cesium-native](https://github.co
##### Additions :tada:
- - Added support for multiple Cesium ion servers by creating `CesiumIonServer` data assets.
+- Added support for multiple Cesium ion servers by creating `CesiumIonServer` data assets.
In addition to the above, this release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.30.0 to v0.31.0. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
@@ -109,8 +248,8 @@ In addition to the above, this release updates [cesium-native](https://github.co
##### Additions :tada:
- - Added support for styling with property textures in `EXT_structural_metadata`.
- - Significantly improved tile download performance by adding `HttpThreadActiveFrameTimeInSeconds=0.001` to `Engine.ini`. This results in a major performance improvement for all tilesets, particularly Google Photorealistic 3D Tiles.
+- Added support for styling with property textures in `EXT_structural_metadata`.
+- Significantly improved tile download performance by adding `HttpThreadActiveFrameTimeInSeconds=0.001` to `Engine.ini`. This results in a major performance improvement for all tilesets, particularly Google Photorealistic 3D Tiles.
- Added `HttpMaxConnectionsPerServer=40` to `Engine.ini`. By default, only 16 connections are allowed, which limits the performance when downloading tiles.
##### Fixes :wrench:
@@ -130,7 +269,7 @@ This release no longer supports Unreal Engine v5.0. Unreal Engine v5.1, v5.2, or
##### Breaking Changes :mega:
- Removed `FCesiumIntegerColor`, `FCesiumFloatColor`, `UCesiumFeatureTexturePropertyBlueprintLibrary::GetIntegerColorFromTextureCoordinates` and `UCesiumFeatureTexturePropertyBlueprintLibrary::GetFloatColorFromTextureCoordinates`. Check out the [upgrade guide](Documentation/upgrade-to-2.0-guide.md) for how retrieve metadata from property textures with the new API.
-- Renamed `GetTextureCoordinateIndex` to `GetUnrealUVChannel` in both `UCesiumFeatureIdTextureBlueprintLibrary` and `UCesiumPropertyTexturePropertyBlueprintLibrary`. Contrary to what the documentation claimed, this function retrieved the index of the texture coordinate set in the *Unreal static mesh*, which is not necessarily equal to the texture coordinate set index in the *glTF primitive*. For the latter value, use `GetGltfTextureCoordinateSetIndex` instead.
+- Renamed `GetTextureCoordinateIndex` to `GetUnrealUVChannel` in both `UCesiumFeatureIdTextureBlueprintLibrary` and `UCesiumPropertyTexturePropertyBlueprintLibrary`. Contrary to what the documentation claimed, this function retrieved the index of the texture coordinate set in the _Unreal static mesh_, which is not necessarily equal to the texture coordinate set index in the _glTF primitive_. For the latter value, use `GetGltfTextureCoordinateSetIndex` instead.
- Removed the old "exclusion zones" feature, which has been deprecated since v1.11.0. Use `CesiumCartographicPolygon` or `CesiumTileExcluder` instead.
##### Additions :tada:
@@ -279,7 +418,7 @@ In addition to the above, this release updates [cesium-native](https://github.co
##### Fixes :wrench:
- Added a workaround for an apparent bug in Unreal Engine 5.1 that prevented collisions from working with Cesium3DTilesets.
-- Fixed a bug that could cause the `AGlobeAwareDefaultPawn` / `DynamicPawn` to suddenly move to a very high height for one render frame just as it arrives at its destination during a flight.
+- Fixed a bug that could cause the `AGlobeAwareDefaultPawn` / `DynamicPawn` to suddenly move to a very high height for one render frame just as it arrives at its destination during a flight.
In addition to the above, this release updates [cesium-native](https://github.com/CesiumGS/cesium-native) from v0.25.0 to v0.25.1. See the [changelog](https://github.com/CesiumGS/cesium-native/blob/main/CHANGES.md) for a complete list of changes in cesium-native.
@@ -342,7 +481,7 @@ This will be the _last_ release that supports Unreal Engine v4.27. Future versio
##### Additions :tada:
-- The `FlyToAltitudeProfileCurve`, `FlyToProgressCurve`, `FlyToMaximumAltitudeCurve`, `FlyToDuration`, and `FlyToGranularityDegrees` properties of `GlobeAwareDefaultPawn` / `DynamicPawn` may now be read and written from Blueprints.
+- The `FlyToAltitudeProfileCurve`, `FlyToProgressCurve`, `FlyToMaximumAltitudeCurve`, `FlyToDuration`, and `FlyToGranularityDegrees` properties of `GlobeAwareDefaultPawn` / `DynamicPawn` may now be read and written from Blueprints.
- Added an option on `Cesium3DTileset` to ignore the `KHR_materials_unlit` extension entirely and use normal lighting and shadows.
- Added `CreateNavCollision` property to `Cesium3DTileset`. When enabled, `CreateNavCollision` is called on the static meshes created for tiles.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index df5d6aeef..84f75e9ac 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,5 +1,11 @@
+# Contribution Guide {#contributing-unreal}
+
Thanks for contributing to Cesium for Unreal!
+
+
Here are the guidelines that we use for all contributions to this project:
- [Submitting an issue](#submitting-an-issue),
@@ -8,26 +14,28 @@ Here are the guidelines that we use for all contributions to this project:
To ensure an inclusive community, contributors and users in the Cesium community should follow the [code of conduct](./CODE_OF_CONDUCT.md).
-# Submitting an Issue
+# Submitting an Issue {#submitting-an-issue}
-If you have a question, do not submit an issue; instead, search the [Cesium community forum](https://community.cesium.com/). The forum is very active and there are years of informative archives for the Cesium platform, often with answers from the core Cesium team. If you do not find an answer to your question, start a new thread and you'll likely get a quick response.
+If you have a question, **do not submit an issue**. Instead, search the [Cesium community forum](https://community.cesium.com/) for your question. The forum is very active and there are years of informative archives for the Cesium platform, often with answers from the core Cesium team. If you do not find an answer to your question, start a new thread and you'll likely get a quick response.
-If you think you've found a bug in Cesium for Unreal, first search the [issues](https://github.com/CesiumGS/cesium-unreal/issues). If an issue already exists, please add a comment expressing your interest and any additional information. This helps us prioritize issues.
+If you think you've found a bug in Cesium for Unreal, first search the existing [issues](https://github.com/CesiumGS/cesium-unreal/issues). If an issue already exists, please add a **comment** expressing your interest and any additional information. This helps us stay organized and prioritize issues.
-If a related issue does not exist, submit a new one. Please be concise and include as much of the following information as is relevant:
+If a related issue does not exist, then you can submit a new one. Please include as much of the following information as is relevant:
-- The version of Cesium for Unreal. Did this work in a previous version?
-- Your operating system and version, Unreal Engine version, and video card. Are they all up-to-date? Is the issue specific to one of them?
-- If possible, an Unreal project (and data or IDs of Cesium ion assets that have been used) where the issue can be reproduced.
+- What version of Cesium for Unreal were you using? Do other versions have the same issue?
+- What version of Unreal Engine were you using?
+- What is your operating system and version, and your video card? Are they up-to-date? Is the issue specific to one of them?
- Can the issue be reproduced in the [Cesium for Unreal Samples](https://github.com/CesiumGS/cesium-unreal-samples)?
-- A Screenshot, video or animated .gif if appropriate. Screenshots are particularly useful for exceptions and rendering artifacts.
-- Information about whether the issue appeared in the Unreal Editor or in the play mode.
-- If the issue is about a crash of the Unreal Editor, include the stack trace that is shown together with the error message.
-- Depending on the type of the issue, it can be helpful to see the log files that have been created before encountering the unexpected behavior. The log files is stored as `Saved\Logs\cesiumunreal.log` in your project directory.
-- A link to the thread if this was discussed on the [Cesium community forum](https://community.cesium.com/) or elsewhere.
-- Ideas for how to fix or workaround the issue. Also mention if you are willing to help fix it. If so, the Cesium team can often provide guidance and the issue may get fixed more quickly with your help.
+- Does the issue occur in the Unreal Editor? In Play Mode? Both?
+- Are there any error messages in the console? Any stack traces or logs? Please include them if so. Logs are stored as `Saved\Logs\cesiumunreal.log` in your project directory.
+- Share a screenshot, video or animated `.gif` if appropriate. Screenshots are particularly useful for exceptions and rendering artifacts.
+- Link to threads on the [Cesium community forum](https://community.cesium.com/) if this was discussed on there.
+- Include step-by-step instructions for us to reproduce the issue from scratch.
+- Any ideas for how to fix or workaround the issue. Also mention if you are willing to help fix it. If so, the Cesium team can often provide guidance and the issue may get fixed more quickly with your help.
+
+**Note**: It is difficult for us to debug everyone's individual projects. We can triage issues faster when we receive steps to reproduce the issue from scratch—either from [Cesium for Unreal Samples](https://github.com/CesiumGS/cesium-unreal-samples) or from a blank project. We will only request your Unreal project and/or data as a last resort.
-# Getting Started Contributing
+# Getting Started Contributing {#getting-started-contributing}
Everyone is welcome to contribute to Cesium for Unreal!
@@ -35,20 +43,21 @@ In addition to contributing code, we appreciate many types of contributions:
- Being active on the [Cesium community forum](https://community.cesium.com/) by answering questions and providing input on Cesium's direction.
- Showcasing your Cesium for Unreal apps on [Cesium blog](https://cesium.com/blog/categories/userstories/). Contact us at hello@cesium.com.
-- Writing tutorials, creating examples, and improving the reference documentation. See the issues labeled [category - doc](https://github.com/CesiumGS/cesium-unreal/labels/category%20-%20doc).
+- Writing tutorials, creating examples, and improving the reference documentation. See the issues labeled [documentation](https://github.com/CesiumGS/cesium-unreal/labels/documentation).
- Submitting issues as [described above](#submitting-an-issue).
- Triaging issues. Browse the [issues](https://github.com/CesiumGS/cesium-unreal/issues) and comment on issues that are no longer reproducible or on issues for which you have additional information.
For ideas for Cesium for Unreal code contributions, see:
-- issues labeled [`good first issue`](https://github.com/CesiumGS/cesium-unreal/labels/good%20first%20issue) and
-- issues labeled [`type - roadmap`](https://github.com/CesiumGS/cesium-unreal/labels/type%20-%20roadmap).
+- issues labeled [`good first issue`](https://github.com/CesiumGS/cesium-unreal/labels/good%20first%20issue),
+- issues labeled [`low hanging fruit`](https://github.com/CesiumGS/cesium-unreal/labels/low%20hanging%20fruit), and
+- issues labeled [`enhancement`](https://github.com/CesiumGS/cesium-unreal/labels/enhancement).
-See the [build guide](https://github.com/CesiumGS/cesium-unreal#computer-developing-with-unreal-engine) for how to build and run Cesium for Unreal.
+See [Developer Setup](https://cesium.com/learn/cesium-unreal/ref-doc/developer-setup-unreal.html) for how to build and run Cesium for Unreal.
Always feel free to introduce yourself on the [Cesium community forum](https://community.cesium.com/) to brainstorm ideas and ask for guidance.
-# Opening a Pull Request
+# Opening a Pull Request {#opening-a-pull-request}
We love pull requests. We strive to promptly review them, provide feedback, and merge. Interest in Cesium is at an all-time high so the core team is busy. Following the tips in this guide will help your pull request get merged quickly.
@@ -56,14 +65,7 @@ We love pull requests. We strive to promptly review them, provide feedback, and
## Contributor License Agreement (CLA)
-Before we can review a pull request, we require a signed Contributor License Agreement. There is a CLA for:
-
-- [individuals](https://docs.google.com/forms/d/e/1FAIpQLScU-yvQdcdjCFHkNXwdNeEXx5Qhu45QXuWX_uF5qiLGFSEwlA/viewform) and
-- [corporations](https://docs.google.com/forms/d/e/1FAIpQLSeYEaWlBl1tQEiegfHMuqnH9VxyfgXGyIw13C2sN7Fj3J3GVA/viewform).
-
-This only needs to be completed once, and enables contributions to all of the projects under the [CesiumGS](https://github.com/CesiumGS) organization, including Cesium for Unreal. The CLA ensures you retain copyright to your contributions, and provides us the right to use, modify, and redistribute your contributions using the [Apache 2.0 License](LICENSE). If you have already signed a CLA for CesiumJS or other contributions to Cesium, you will not need to sign it again.
-
-If you have any questions, feel free to reach out to [hello@cesium.com](mailto:hello@cesium)!
+Before we can review a pull request, we require a signed Contributor License Agreement. The CLA forms can be found in our `community` repo [here](https://github.com/CesiumGS/community/tree/main/CLAs).
## Pull Request Guidelines
@@ -71,12 +73,11 @@ Our code is our lifeblood so maintaining Cesium's high code quality is important
- For an overview of our workflow see [github pull request workflows](https://cesium.com/blog/2013/10/08/github-pull-request-workflows/).
- Pull request tips
- - After you open a pull request, the friendly [cesium-concierge](https://github.com/CesiumGS/cesium-concierge) bot will comment with a short automated review. At least one human will also review your pull request.
+ - After you open a pull request, one or more Cesium teammates will review your pull request.
- If your pull request fixes an existing issue, include a link to the issue in the description (like this: [#1](https://github.com/CesiumGS/cesium-unreal/issues/1)). Likewise, if your pull request fixes an issue reported on the Cesium forum, include a link to the thread.
- If your pull request needs additional work, include a [task list](https://github.com/blog/1375%0A-task-lists-in-gfm-issues-pulls-comments).
- - Once you are done making new commits to address feedback, add a comment to the pull request such as `"this is ready"` since GitHub doesn't notify us about commits.
- - Follow the [Coding Guide](https://github.com/CesiumGS/cesium-native/blob/main/doc/style-guide.md).
- - Verify your is formatted, as described in the Coding Guide.
+ - Once you are done making new commits to address feedback, add a comment to the pull request such as `"this is ready"` so we know to take another look.
+ - Verify that your code conforms to our [Style Guide](https://cesium.com/learn/cesium-native/ref-doc/style-guide.html).
## Code of Conduct
diff --git a/CesiumForUnreal.uplugin b/CesiumForUnreal.uplugin
index 5bad3ddc9..e67e4be94 100644
--- a/CesiumForUnreal.uplugin
+++ b/CesiumForUnreal.uplugin
@@ -1,7 +1,7 @@
{
"FileVersion": 3,
- "Version": 60,
- "VersionName": "2.6.0",
+ "Version": 72,
+ "VersionName": "2.13.3",
"FriendlyName": "Cesium for Unreal",
"Description": "Unlock the 3D geospatial ecosystem in Unreal Engine with real-world 3D content and a high accuracy full-scale WGS84 globe.",
"Category": "Geospatial",
@@ -10,7 +10,7 @@
"DocsURL": "https://cesium.com/learn/unreal/",
"MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/87b0d05800a545d49bf858ef3458c4f7",
"SupportURL": "https://community.cesium.com",
- "EngineVersion": "5.2.0",
+ "EngineVersion": "5.3.0",
"CanContainContent": true,
"IsBetaVersion": false,
"IsExperimentalVersion": false,
diff --git a/Config/Engine.ini b/Config/Engine.ini
index 0387c9315..65028cd35 100644
--- a/Config/Engine.ini
+++ b/Config/Engine.ini
@@ -158,4 +158,8 @@ AspectRatioAxisConstraint=AspectRatio_MaintainXFOV
+PropertyRedirects=(OldName="CesiumWebMapTileServiceRasterOverlay.South", NewName="CesiumWebMapTileServiceRasterOverlay.RectangleSouth")
+PropertyRedirects=(OldName="CesiumWebMapTileServiceRasterOverlay.East", NewName="CesiumWebMapTileServiceRasterOverlay.RectangleEast")
+PropertyRedirects=(OldName="CesiumWebMapTileServiceRasterOverlay.North", NewName="CesiumWebMapTileServiceRasterOverlay.RectangleNorth")
-+PropertyRedirects=(OldName="CesiumWebMapTileServiceRasterOverlay.UseWebMercatorProjection", NewName="CesiumWebMapTileServiceRasterOverlay.UseWebMercatorProjection_DEPRECATED")
\ No newline at end of file
++PropertyRedirects=(OldName="CesiumWebMapTileServiceRasterOverlay.UseWebMercatorProjection", NewName="CesiumWebMapTileServiceRasterOverlay.UseWebMercatorProjection_DEPRECATED")
+
++FunctionRedirects=(OldName="CesiumFeatureIdAttributeBlueprintLibrary.GetFeatureIDForVertex", NewName="CesiumFeatureIdAttributeBlueprintLibrary.GetFeatureID")
++PropertyRedirects=(OldName="CesiumFeatureIdAttributeBlueprintLibrary.GetFeatureIDForVertex.VertexIndex", NewName="CesiumFeatureIdAttributeBlueprintLibrary.GetFeatureID.Index")
++FunctionRedirects=(OldName="CesiumFeatureIdAttributeBlueprintLibrary.GetVertexCount", NewName="CesiumFeatureIdAttributeBlueprintLibrary.GetCount")
diff --git a/Content/Materials/M_CesiumBaseMaterial.uasset b/Content/Materials/M_CesiumBaseMaterial.uasset
index a26815908..047e3a80b 100644
Binary files a/Content/Materials/M_CesiumBaseMaterial.uasset and b/Content/Materials/M_CesiumBaseMaterial.uasset differ
diff --git a/Content/Materials/MaterialFunctions/CesiumGetFeatureIdsFromInstance.uasset b/Content/Materials/MaterialFunctions/CesiumGetFeatureIdsFromInstance.uasset
new file mode 100644
index 000000000..ee69ced3f
Binary files /dev/null and b/Content/Materials/MaterialFunctions/CesiumGetFeatureIdsFromInstance.uasset differ
diff --git a/Content/WGS84.uasset b/Content/WGS84.uasset
new file mode 100644
index 000000000..40cdf8399
Binary files /dev/null and b/Content/WGS84.uasset differ
diff --git a/Documentation/Assets/mermaid.min.js b/Documentation/Assets/mermaid.min.js
new file mode 100644
index 000000000..fd60dd6f2
--- /dev/null
+++ b/Documentation/Assets/mermaid.min.js
@@ -0,0 +1,2314 @@
+"use strict";var __esbuild_esm_mermaid=(()=>{var ixe=Object.create;var Z1=Object.defineProperty;var axe=Object.getOwnPropertyDescriptor;var sxe=Object.getOwnPropertyNames;var oxe=Object.getPrototypeOf,lxe=Object.prototype.hasOwnProperty;var o=(t,e)=>Z1(t,"name",{value:e,configurable:!0});var M=(t,e)=>()=>(t&&(e=t(t=0)),e);var Ei=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),vr=(t,e)=>{for(var r in e)Z1(t,r,{get:e[r],enumerable:!0})},$b=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of sxe(e))!lxe.call(t,i)&&i!==r&&Z1(t,i,{get:()=>e[i],enumerable:!(n=axe(e,i))||n.enumerable});return t},Sr=(t,e,r)=>($b(t,e,"default"),r&&$b(r,e,"default")),Ji=(t,e,r)=>(r=t!=null?ixe(oxe(t)):{},$b(e||!t||!t.__esModule?Z1(r,"default",{value:t,enumerable:!0}):r,t)),cxe=t=>$b(Z1({},"__esModule",{value:!0}),t);var Vb=Ei((_S,LS)=>{"use strict";(function(t,e){typeof _S=="object"&&typeof LS<"u"?LS.exports=e():typeof define=="function"&&define.amd?define(e):(t=typeof globalThis<"u"?globalThis:t||self).dayjs=e()})(_S,function(){"use strict";var t=1e3,e=6e4,r=36e5,n="millisecond",i="second",a="minute",s="hour",l="day",u="week",h="month",f="quarter",d="year",p="date",m="Invalid Date",g=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,v={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:o(function(k){var R=["th","st","nd","rd"],C=k%100;return"["+k+(R[(C-20)%10]||R[C]||R[0])+"]"},"ordinal")},x=o(function(k,R,C){var O=String(k);return!O||O.length>=R?k:""+Array(R+1-O.length).join(C)+k},"m"),b={s:x,z:o(function(k){var R=-k.utcOffset(),C=Math.abs(R),O=Math.floor(C/60),N=C%60;return(R<=0?"+":"-")+x(O,2,"0")+":"+x(N,2,"0")},"z"),m:o(function k(R,C){if(R.date()1)return k(F[0])}else{var B=R.name;_[B]=R,N=B}return!O&&N&&(w=N),N||!O&&w},"t"),S=o(function(k,R){if(E(k))return k.clone();var C=typeof R=="object"?R:{};return C.date=k,C.args=arguments,new I(C)},"O"),A=b;A.l=L,A.i=E,A.w=function(k,R){return S(k,{locale:R.$L,utc:R.$u,x:R.$x,$offset:R.$offset})};var I=function(){function k(C){this.$L=L(C.locale,null,!0),this.parse(C),this.$x=this.$x||C.x||{},this[T]=!0}o(k,"M");var R=k.prototype;return R.parse=function(C){this.$d=function(O){var N=O.date,P=O.utc;if(N===null)return new Date(NaN);if(A.u(N))return new Date;if(N instanceof Date)return new Date(N);if(typeof N=="string"&&!/Z$/i.test(N)){var F=N.match(g);if(F){var B=F[2]-1||0,G=(F[7]||"0").substring(0,3);return P?new Date(Date.UTC(F[1],B,F[3]||1,F[4]||0,F[5]||0,F[6]||0,G)):new Date(F[1],B,F[3]||1,F[4]||0,F[5]||0,F[6]||0,G)}}return new Date(N)}(C),this.init()},R.init=function(){var C=this.$d;this.$y=C.getFullYear(),this.$M=C.getMonth(),this.$D=C.getDate(),this.$W=C.getDay(),this.$H=C.getHours(),this.$m=C.getMinutes(),this.$s=C.getSeconds(),this.$ms=C.getMilliseconds()},R.$utils=function(){return A},R.isValid=function(){return this.$d.toString()!==m},R.isSame=function(C,O){var N=S(C);return this.startOf(O)<=N&&N<=this.endOf(O)},R.isAfter=function(C,O){return S(C){"use strict";IF=Ji(Vb(),1),au={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},Y={trace:o((...t)=>{},"trace"),debug:o((...t)=>{},"debug"),info:o((...t)=>{},"info"),warn:o((...t)=>{},"warn"),error:o((...t)=>{},"error"),fatal:o((...t)=>{},"fatal")},J1=o(function(t="fatal"){let e=au.fatal;typeof t=="string"?t.toLowerCase()in au&&(e=au[t]):typeof t=="number"&&(e=t),Y.trace=()=>{},Y.debug=()=>{},Y.info=()=>{},Y.warn=()=>{},Y.error=()=>{},Y.fatal=()=>{},e<=au.fatal&&(Y.fatal=console.error?console.error.bind(console,Ao("FATAL"),"color: orange"):console.log.bind(console,"\x1B[35m",Ao("FATAL"))),e<=au.error&&(Y.error=console.error?console.error.bind(console,Ao("ERROR"),"color: orange"):console.log.bind(console,"\x1B[31m",Ao("ERROR"))),e<=au.warn&&(Y.warn=console.warn?console.warn.bind(console,Ao("WARN"),"color: orange"):console.log.bind(console,"\x1B[33m",Ao("WARN"))),e<=au.info&&(Y.info=console.info?console.info.bind(console,Ao("INFO"),"color: lightblue"):console.log.bind(console,"\x1B[34m",Ao("INFO"))),e<=au.debug&&(Y.debug=console.debug?console.debug.bind(console,Ao("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",Ao("DEBUG"))),e<=au.trace&&(Y.trace=console.debug?console.debug.bind(console,Ao("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1B[32m",Ao("TRACE")))},"setLogLevel"),Ao=o(t=>`%c${(0,IF.default)().format("ss.SSS")} : ${t} : `,"format")});var uxe,up,DS,OF,Ub=M(()=>{"use strict";uxe=Object.freeze({left:0,top:0,width:16,height:16}),up=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),DS=Object.freeze({...uxe,...up}),OF=Object.freeze({...DS,body:"",hidden:!1})});var hxe,PF,BF=M(()=>{"use strict";Ub();hxe=Object.freeze({width:null,height:null}),PF=Object.freeze({...hxe,...up})});var Hb,NS,Wb,FF=M(()=>{"use strict";Hb=/^[a-z0-9]+(-[a-z0-9]+)*$/,NS=o((t,e,r,n="")=>{let i=t.split(":");if(t.slice(0,1)==="@"){if(i.length<2||i.length>3)return null;n=i.shift().slice(1)}if(i.length>3||!i.length)return null;if(i.length>1){let l=i.pop(),u=i.pop(),h={provider:i.length>0?i[0]:n,prefix:u,name:l};return e&&!Wb(h)?null:h}let a=i[0],s=a.split("-");if(s.length>1){let l={provider:n,prefix:s.shift(),name:s.join("-")};return e&&!Wb(l)?null:l}if(r&&n===""){let l={provider:n,prefix:"",name:a};return e&&!Wb(l,r)?null:l}return null},"stringToIcon"),Wb=o((t,e)=>t?!!((t.provider===""||t.provider.match(Hb))&&(e&&t.prefix===""||t.prefix.match(Hb))&&t.name.match(Hb)):!1,"validateIconName")});function zF(t,e){let r={};!t.hFlip!=!e.hFlip&&(r.hFlip=!0),!t.vFlip!=!e.vFlip&&(r.vFlip=!0);let n=((t.rotate||0)+(e.rotate||0))%4;return n&&(r.rotate=n),r}var GF=M(()=>{"use strict";o(zF,"mergeIconTransformations")});function RS(t,e){let r=zF(t,e);for(let n in OF)n in up?n in t&&!(n in r)&&(r[n]=up[n]):n in e?r[n]=e[n]:n in t&&(r[n]=t[n]);return r}var $F=M(()=>{"use strict";Ub();GF();o(RS,"mergeIconData")});function VF(t,e){let r=t.icons,n=t.aliases||Object.create(null),i=Object.create(null);function a(s){if(r[s])return i[s]=[];if(!(s in i)){i[s]=null;let l=n[s]&&n[s].parent,u=l&&a(l);u&&(i[s]=[l].concat(u))}return i[s]}return o(a,"resolve"),(e||Object.keys(r).concat(Object.keys(n))).forEach(a),i}var UF=M(()=>{"use strict";o(VF,"getIconsTree")});function HF(t,e,r){let n=t.icons,i=t.aliases||Object.create(null),a={};function s(l){a=RS(n[l]||i[l],a)}return o(s,"parse"),s(e),r.forEach(s),RS(t,a)}function MS(t,e){if(t.icons[e])return HF(t,e,[]);let r=VF(t,[e])[e];return r?HF(t,e,r):null}var WF=M(()=>{"use strict";$F();UF();o(HF,"internalGetIconData");o(MS,"getIconData")});function IS(t,e,r){if(e===1)return t;if(r=r||100,typeof t=="number")return Math.ceil(t*e*r)/r;if(typeof t!="string")return t;let n=t.split(fxe);if(n===null||!n.length)return t;let i=[],a=n.shift(),s=dxe.test(a);for(;;){if(s){let l=parseFloat(a);isNaN(l)?i.push(a):i.push(Math.ceil(l*e*r)/r)}else i.push(a);if(a=n.shift(),a===void 0)return i.join("");s=!s}}var fxe,dxe,YF=M(()=>{"use strict";fxe=/(-?[0-9.]*[0-9]+[0-9.]*)/g,dxe=/^-?[0-9.]*[0-9]+[0-9.]*$/g;o(IS,"calculateSize")});function pxe(t,e="defs"){let r="",n=t.indexOf("<"+e);for(;n>=0;){let i=t.indexOf(">",n),a=t.indexOf(""+e);if(i===-1||a===-1)break;let s=t.indexOf(">",a);if(s===-1)break;r+=t.slice(i+1,a).trim(),t=t.slice(0,n).trim()+t.slice(s+1)}return{defs:r,content:t}}function mxe(t,e){return t?""+t+""+e:e}function qF(t,e,r){let n=pxe(t);return mxe(n.defs,e+n.content+r)}var XF=M(()=>{"use strict";o(pxe,"splitSVGDefs");o(mxe,"mergeDefsAndContent");o(qF,"wrapSVGContent")});function OS(t,e){let r={...DS,...t},n={...PF,...e},i={left:r.left,top:r.top,width:r.width,height:r.height},a=r.body;[r,n].forEach(y=>{let v=[],x=y.hFlip,b=y.vFlip,w=y.rotate;x?b?w+=2:(v.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),v.push("scale(-1 1)"),i.top=i.left=0):b&&(v.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),v.push("scale(1 -1)"),i.top=i.left=0);let _;switch(w<0&&(w-=Math.floor(w/4)*4),w=w%4,w){case 1:_=i.height/2+i.top,v.unshift("rotate(90 "+_.toString()+" "+_.toString()+")");break;case 2:v.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:_=i.width/2+i.left,v.unshift("rotate(-90 "+_.toString()+" "+_.toString()+")");break}w%2===1&&(i.left!==i.top&&(_=i.left,i.left=i.top,i.top=_),i.width!==i.height&&(_=i.width,i.width=i.height,i.height=_)),v.length&&(a=qF(a,'',""))});let s=n.width,l=n.height,u=i.width,h=i.height,f,d;s===null?(d=l===null?"1em":l==="auto"?h:l,f=IS(d,u/h)):(f=s==="auto"?u:s,d=l===null?IS(f,h/u):l==="auto"?h:l);let p={},m=o((y,v)=>{gxe(v)||(p[y]=v.toString())},"setAttr");m("width",f),m("height",d);let g=[i.left,i.top,u,h];return p.viewBox=g.join(" "),{attributes:p,viewBox:g,body:a}}var gxe,jF=M(()=>{"use strict";Ub();BF();YF();XF();gxe=o(t=>t==="unset"||t==="undefined"||t==="none","isUnsetKeyword");o(OS,"iconToSVG")});function PS(t,e=vxe){let r=[],n;for(;n=yxe.exec(t);)r.push(n[1]);if(!r.length)return t;let i="suffix"+(Math.random()*16777216|Date.now()).toString(16);return r.forEach(a=>{let s=typeof e=="function"?e(a):e+(xxe++).toString(),l=a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+l+')([")]|\\.[a-z])',"g"),"$1"+s+i+"$3")}),t=t.replace(new RegExp(i,"g"),""),t}var yxe,vxe,xxe,KF=M(()=>{"use strict";yxe=/\sid="(\S+)"/g,vxe="IconifyId"+Date.now().toString(16)+(Math.random()*16777216|0).toString(16),xxe=0;o(PS,"replaceIDs")});function BS(t,e){let r=t.indexOf("xlink:")===-1?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(let n in e)r+=" "+n+'="'+e[n]+'"';return'"}var QF=M(()=>{"use strict";o(BS,"iconToHTML")});var JF=Ei((Pat,ZF)=>{"use strict";var hp=1e3,fp=hp*60,dp=fp*60,jf=dp*24,bxe=jf*7,wxe=jf*365.25;ZF.exports=function(t,e){e=e||{};var r=typeof t;if(r==="string"&&t.length>0)return Txe(t);if(r==="number"&&isFinite(t))return e.long?Exe(t):kxe(t);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(t))};function Txe(t){if(t=String(t),!(t.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(t);if(e){var r=parseFloat(e[1]),n=(e[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return r*wxe;case"weeks":case"week":case"w":return r*bxe;case"days":case"day":case"d":return r*jf;case"hours":case"hour":case"hrs":case"hr":case"h":return r*dp;case"minutes":case"minute":case"mins":case"min":case"m":return r*fp;case"seconds":case"second":case"secs":case"sec":case"s":return r*hp;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}}}o(Txe,"parse");function kxe(t){var e=Math.abs(t);return e>=jf?Math.round(t/jf)+"d":e>=dp?Math.round(t/dp)+"h":e>=fp?Math.round(t/fp)+"m":e>=hp?Math.round(t/hp)+"s":t+"ms"}o(kxe,"fmtShort");function Exe(t){var e=Math.abs(t);return e>=jf?Yb(t,e,jf,"day"):e>=dp?Yb(t,e,dp,"hour"):e>=fp?Yb(t,e,fp,"minute"):e>=hp?Yb(t,e,hp,"second"):t+" ms"}o(Exe,"fmtLong");function Yb(t,e,r,n){var i=e>=r*1.5;return Math.round(t/r)+" "+n+(i?"s":"")}o(Yb,"plural")});var tz=Ei((Fat,ez)=>{"use strict";function Sxe(t){r.debug=r,r.default=r,r.coerce=u,r.disable=a,r.enable=i,r.enabled=s,r.humanize=JF(),r.destroy=h,Object.keys(t).forEach(f=>{r[f]=t[f]}),r.names=[],r.skips=[],r.formatters={};function e(f){let d=0;for(let p=0;p{if(E==="%%")return"%";_++;let S=r.formatters[L];if(typeof S=="function"){let A=v[_];E=S.call(x,A),v.splice(_,1),_--}return E}),r.formatArgs.call(x,v),(x.log||r.log).apply(x,v)}return o(y,"debug"),y.namespace=f,y.useColors=r.useColors(),y.color=r.selectColor(f),y.extend=n,y.destroy=r.destroy,Object.defineProperty(y,"enabled",{enumerable:!0,configurable:!1,get:o(()=>p!==null?p:(m!==r.namespaces&&(m=r.namespaces,g=r.enabled(f)),g),"get"),set:o(v=>{p=v},"set")}),typeof r.init=="function"&&r.init(y),y}o(r,"createDebug");function n(f,d){let p=r(this.namespace+(typeof d>"u"?":":d)+f);return p.log=this.log,p}o(n,"extend");function i(f){r.save(f),r.namespaces=f,r.names=[],r.skips=[];let d,p=(typeof f=="string"?f:"").split(/[\s,]+/),m=p.length;for(d=0;d"-"+d)].join(",");return r.enable(""),f}o(a,"disable");function s(f){if(f[f.length-1]==="*")return!0;let d,p;for(d=0,p=r.skips.length;d
+`}tablecell(e){let r=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+r+`${n}>
+`}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${e}`}br(e){return" "}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:r,tokens:n}){let i=this.parser.parseInline(n),a=WX(e);if(a===null)return i;e=a;let s='"+i+"",s}image({href:e,title:r,text:n}){let i=WX(e);if(i===null)return n;e=i;let a=`",a}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):e.text}},Cv=class{static{o(this,"_TextRenderer")}strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}},Iu=class t{static{o(this,"_Parser")}options;renderer;textRenderer;constructor(e){this.options=e||Id,this.options.renderer=this.options.renderer||new ym,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Cv}static parse(e,r){return new t(r).parse(e)}static parseInline(e,r){return new t(r).parseInline(e)}parse(e,r=!0){let n="";for(let i=0;i{let l=a[s].flat(1/0);n=n.concat(this.walkTokens(l,r))}):a.tokens&&(n=n.concat(this.walkTokens(a.tokens,r)))}}return n}use(...e){let r=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let i={...n};if(i.async=this.defaults.async||i.async||!1,n.extensions&&(n.extensions.forEach(a=>{if(!a.name)throw new Error("extension name required");if("renderer"in a){let s=r.renderers[a.name];s?r.renderers[a.name]=function(...l){let u=a.renderer.apply(this,l);return u===!1&&(u=s.apply(this,l)),u}:r.renderers[a.name]=a.renderer}if("tokenizer"in a){if(!a.level||a.level!=="block"&&a.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let s=r[a.level];s?s.unshift(a.tokenizer):r[a.level]=[a.tokenizer],a.start&&(a.level==="block"?r.startBlock?r.startBlock.push(a.start):r.startBlock=[a.start]:a.level==="inline"&&(r.startInline?r.startInline.push(a.start):r.startInline=[a.start]))}"childTokens"in a&&a.childTokens&&(r.childTokens[a.name]=a.childTokens)}),i.extensions=r),n.renderer){let a=this.defaults.renderer||new ym(this.defaults);for(let s in n.renderer){if(!(s in a))throw new Error(`renderer '${s}' does not exist`);if(["options","parser"].includes(s))continue;let l=s,u=n.renderer[l];n.useNewRenderer||(u=this.#t(u,l,a));let h=a[l];a[l]=(...f)=>{let d=u.apply(a,f);return d===!1&&(d=h.apply(a,f)),d||""}}i.renderer=a}if(n.tokenizer){let a=this.defaults.tokenizer||new gm(this.defaults);for(let s in n.tokenizer){if(!(s in a))throw new Error(`tokenizer '${s}' does not exist`);if(["options","rules","lexer"].includes(s))continue;let l=s,u=n.tokenizer[l],h=a[l];a[l]=(...f)=>{let d=u.apply(a,f);return d===!1&&(d=h.apply(a,f)),d}}i.tokenizer=a}if(n.hooks){let a=this.defaults.hooks||new mm;for(let s in n.hooks){if(!(s in a))throw new Error(`hook '${s}' does not exist`);if(s==="options")continue;let l=s,u=n.hooks[l],h=a[l];mm.passThroughHooks.has(s)?a[l]=f=>{if(this.defaults.async)return Promise.resolve(u.call(a,f)).then(p=>h.call(a,p));let d=u.call(a,f);return h.call(a,d)}:a[l]=(...f)=>{let d=u.apply(a,f);return d===!1&&(d=h.apply(a,f)),d}}i.hooks=a}if(n.walkTokens){let a=this.defaults.walkTokens,s=n.walkTokens;i.walkTokens=function(l){let u=[];return u.push(s.call(this,l)),a&&(u=u.concat(a.call(this,l))),u}}this.defaults={...this.defaults,...i}}),this}#t(e,r,n){switch(r){case"heading":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,n.parser.parseInline(i.tokens),i.depth,UCe(n.parser.parseInline(i.tokens,n.parser.textRenderer)))};case"code":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text,i.lang,!!i.escaped)};case"table":return function(i){if(!i.type||i.type!==r)return e.apply(this,arguments);let a="",s="";for(let u=0;u0&&f.tokens[0].type==="paragraph"?(f.tokens[0].text=g+" "+f.tokens[0].text,f.tokens[0].tokens&&f.tokens[0].tokens.length>0&&f.tokens[0].tokens[0].type==="text"&&(f.tokens[0].tokens[0].text=g+" "+f.tokens[0].tokens[0].text)):f.tokens.unshift({type:"text",text:g+" "}):m+=g+" "}m+=this.parser.parse(f.tokens,l),u+=this.listitem({type:"list_item",raw:m,text:m,task:p,checked:!!d,loose:l,tokens:f.tokens})}return e.call(this,u,a,s)};case"html":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text,i.block)};case"paragraph":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"escape":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text)};case"link":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.href,i.title,this.parser.parseInline(i.tokens))};case"image":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.href,i.title,i.text)};case"strong":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"em":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"codespan":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text)};case"del":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,this.parser.parseInline(i.tokens))};case"text":return function(i){return!i.type||i.type!==r?e.apply(this,arguments):e.call(this,i.text)}}return e}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,r){return Mu.lex(e,r??this.defaults)}parser(e,r){return Iu.parse(e,r??this.defaults)}#e(e,r){return(n,i)=>{let a={...i},s={...this.defaults,...a};this.defaults.async===!0&&a.async===!1&&(s.silent||console.warn("marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored."),s.async=!0);let l=this.#r(!!s.silent,!!s.async);if(typeof n>"u"||n===null)return l(new Error("marked(): input parameter is undefined or null"));if(typeof n!="string")return l(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(n)+", string expected"));if(s.hooks&&(s.hooks.options=s),s.async)return Promise.resolve(s.hooks?s.hooks.preprocess(n):n).then(u=>e(u,s)).then(u=>s.hooks?s.hooks.processAllTokens(u):u).then(u=>s.walkTokens?Promise.all(this.walkTokens(u,s.walkTokens)).then(()=>u):u).then(u=>r(u,s)).then(u=>s.hooks?s.hooks.postprocess(u):u).catch(l);try{s.hooks&&(n=s.hooks.preprocess(n));let u=e(n,s);s.hooks&&(u=s.hooks.processAllTokens(u)),s.walkTokens&&this.walkTokens(u,s.walkTokens);let h=r(u,s);return s.hooks&&(h=s.hooks.postprocess(h)),h}catch(u){return l(u)}}}#r(e,r){return n=>{if(n.message+=`
+Please report this to https://github.com/markedjs/marked.`,e){let i="