diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d056d6b824..cf543ca25b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -83,7 +83,7 @@ jobs: STAMP="" echo "prerelease=false" >> $GITHUB_OUTPUT echo "itchchannelname=release" >> $GITHUB_OUTPUT - echo "fastlanelane=release" >> $GITHUB_OUTPUT + echo "fastlanelane=beta" >> $GITHUB_OUTPUT else # This is the first 7 characters of the commit; we do it this way rather than via rev-parse to avoid an 'if' conditional depending on whether it's a PR or push. (unlike git describe, git rev-parse doesn't default to the current HEAD) @@ -571,15 +571,14 @@ jobs: # Some platforms share a cache; it's not a 1:1 mapping of either targetPlatform or vrsdk, so we have a distinct variable for which cache to use key: Library_${{ matrix.cache }}_${{ env.UNITY_VERSION }} - createdmg: - name: Create and Notarize DMG - needs: [configuration, build] + signmacos: + name: Sign the MacOS .app + needs: [build] if: | github.event_name == 'push' && github.repository == 'icosa-foundation/open-brush' && (github.ref == 'refs/heads/main' || contains(github.ref, 'refs/tags/v')) - - runs-on: macos-latest # the ovr-platform-util tool is only available for Mac and Windows + runs-on: macos-latest steps: - name: Checkout repository uses: actions/checkout@v4 @@ -639,11 +638,46 @@ jobs: codesign --deep --force --verify --verbose --timestamp --options runtime --entitlements ../Support/macos/OpenBrush.entitlements --sign "Developer ID Application: Icosa Gallery Ltd (${{ vars.APPLE_TEAM_ID }})" $FILENAME/Contents/Plugins/UsdCs.bundle codesign --deep --force --verify --verbose --timestamp --options runtime --entitlements ../Support/macos/OpenBrush.entitlements --sign "Developer ID Application: Icosa Gallery Ltd (${{ vars.APPLE_TEAM_ID }})" $FILENAME/Contents/Plugins/lib_burst_generated.bundle codesign --deep --force --verify --verbose --timestamp --options runtime --entitlements ../Support/macos/OpenBrush.entitlements --sign "Developer ID Application: Icosa Gallery Ltd (${{ vars.APPLE_TEAM_ID }})" $FILENAME + cd - + + tar -c -v -z -f OpenBrush.tgz StandaloneOSX + - name: Upload signed app + uses: actions/upload-artifact@v4 + with: + name: MacOS Monoscopic (signed) + path: | + OpenBrush.tgz + + createdmg: + name: Create and Notarize DMG + needs: [signmacos] + if: | + github.event_name == 'push' && + github.repository == 'icosa-foundation/open-brush' && + (github.ref == 'refs/heads/main' || contains(github.ref, 'refs/tags/v')) + + runs-on: macos-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + lfs: true # We don't use LFS, but it adds no time, and leave it here in case we do at some point later + sparse-checkout: | + Support/macos + + - name: Download Build Artifacts + uses: actions/download-artifact@v4 + with: + name: MacOS Monoscopic (signed) + path: build_macos_monoscopic - name: Create a notarized DMG env: VERSION: ${{ needs.configuration.outputs.version }} run: | + tar xvfz build_macos_monoscopic/*tgz + export FILENAME=$(basename $(readlink -f StandaloneOSX/OpenBrush*.app)) mkdir dist @@ -857,7 +891,7 @@ jobs: publish_steam: name: Publish Steam Release - needs: [configuration, build] + needs: [build, signmacos] if: | github.event_name == 'push' && github.repository == 'icosa-foundation/open-brush' && @@ -883,19 +917,29 @@ jobs: with: name: Windows OpenXR path: build_windows_openxr + - name: Download Build Artifacts (MacOS Monoscopic Signed) + uses: actions/download-artifact@v4 + with: + name: MacOS Monoscopic (signed) + path: build_macos_monoscopic - name: Upload Build run: | + cd build_macos_monoscopic + tar xvfz OpenBrush.tgz + cd - pip install -U jinjanator - jinjanate Support/steam/app.vdf.j2 > build_windows_openxr/app.vdf - jinjanate Support/steam/main_depot.vdf.j2 > build_windows_openxr/main_depot.vdf + jinjanate Support/steam/app.vdf.j2 > app.vdf + jinjanate Support/steam/main_depot.win.vdf.j2 > build_windows_openxr/main_depot.vdf + jinjanate Support/steam/main_depot.mac.vdf.j2 > build_macos_monoscopic/main_depot.vdf jinjanate Support/steam/installscript_win.vdf.j2 > build_windows_openxr/installscript_win.vdf - steamcmd +login $STEAM_USERNAME +run_app_build $(pwd)/build_windows_openxr/app.vdf +quit + steamcmd +login $STEAM_USERNAME +run_app_build $(pwd)/app.vdf +quit env: STEAM_USERNAME: ${{ vars.STEAM_USERNAME }} STEAM_PASSWORD: ${{ secrets.STEAM_PASSWORD }} VERSION: ${{ needs.configuration.outputs.version }} OPEN_BRUSH_APP_ID: ${{ vars.STEAM_APP_ID }} OPEN_BRUSH_WINDOWS_DEPOT_ID: ${{ vars.STEAM_WINDOWS_DEPOT_ID }} + OPEN_BRUSH_MAC_DEPOT_ID: ${{ vars.STEAM_MAC_DEPOT_ID }} OPEN_BRUSH_EXECUTABLE: ${{ needs.configuration.outputs.basename}}.exe CHANNEL: beta - name: Update steam login secret @@ -1051,10 +1095,10 @@ jobs: if [ "$PRERELEASE" == "false" ] then - ./ovr-platform-util upload-quest-build --app-id ${OCULUS_QUEST_APP_ID} --app-secret ${OCULUS_QUEST_APP_SECRET} --apk OpenBrush_Quest_$VERSION.apk --channel LIVE:quest2+ --debug_symbols_dir ./arm64-v8a/ --debug-symbols-pattern '*.so' + ./ovr-platform-util upload-quest-build --app-id ${OCULUS_QUEST_APP_ID} --app-secret ${OCULUS_QUEST_APP_SECRET} --apk OpenBrush_Quest_$VERSION.apk --channel LIVE:quest2+ --debug_symbols_dir ./arm64-v8a/ --debug-symbols-pattern '*.so' --age-group MIXED_AGES else CHANGELOG="${RAW_CHANGELOG}" - ./ovr-platform-util upload-quest-build --app-id ${OCULUS_QUEST_APP_ID} --app-secret ${OCULUS_QUEST_APP_SECRET} --apk OpenBrush_Quest_$VERSION.apk --channel Beta:quest2+ --debug_symbols_dir ./arm64-v8a/ --debug-symbols-pattern '*.so' --notes "${CHANGELOG}" + ./ovr-platform-util upload-quest-build --app-id ${OCULUS_QUEST_APP_ID} --app-secret ${OCULUS_QUEST_APP_SECRET} --apk OpenBrush_Quest_$VERSION.apk --channel Beta:quest2+ --debug_symbols_dir ./arm64-v8a/ --debug-symbols-pattern '*.so' --notes "${CHANGELOG}" --age-group MIXED_AGES fi publish_oculus_quest1: @@ -1091,10 +1135,10 @@ jobs: if [ "$PRERELEASE" == "false" ] then - ./ovr-platform-util upload-quest-build --app-id ${OCULUS_QUEST_APP_ID} --app-secret ${OCULUS_QUEST_APP_SECRET} --apk OpenBrush_Quest1_$VERSION.apk --channel LIVE:quest1only --debug_symbols_dir ./arm64-v8a/ --debug-symbols-pattern '*.so' + ./ovr-platform-util upload-quest-build --app-id ${OCULUS_QUEST_APP_ID} --app-secret ${OCULUS_QUEST_APP_SECRET} --apk OpenBrush_Quest1_$VERSION.apk --channel LIVE:quest1only --debug_symbols_dir ./arm64-v8a/ --debug-symbols-pattern '*.so' --age-group MIXED_AGES else CHANGELOG="${RAW_CHANGELOG}" - ./ovr-platform-util upload-quest-build --app-id ${OCULUS_QUEST_APP_ID} --app-secret ${OCULUS_QUEST_APP_SECRET} --apk OpenBrush_Quest1_$VERSION.apk --channel Beta:quest1only --debug_symbols_dir ./arm64-v8a/ --debug-symbols-pattern '*.so' --notes "${CHANGELOG}" + ./ovr-platform-util upload-quest-build --app-id ${OCULUS_QUEST_APP_ID} --app-secret ${OCULUS_QUEST_APP_SECRET} --apk OpenBrush_Quest1_$VERSION.apk --channel Beta:quest1only --debug_symbols_dir ./arm64-v8a/ --debug-symbols-pattern '*.so' --notes "${CHANGELOG}" --age-group MIXED_AGES fi publish_oculus_rift: diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 347a3f53a0..355c221699 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v5.0.0 + - uses: actions/setup-python@v5.1.0 with: python-version: '3.12' - uses: actions/setup-dotnet@v4.0.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 22b25d3941..506bf6203a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,11 +1,11 @@ --- repos: - repo: https://github.com/adrienverge/yamllint.git - rev: v1.34.0 + rev: v1.35.1 hooks: - id: yamllint - repo: https://github.com/psf/black - rev: 24.2.0 + rev: 24.3.0 hooks: - id: black files: ^Support/ @@ -16,7 +16,7 @@ repos: - id: flake8 files: ^Support/ - repo: https://github.com/PyCQA/pylint.git - rev: v3.0.3 + rev: v3.1.0 hooks: - id: pylint name: pylint diff --git a/Assets/Scenes/Main.unity b/Assets/Scenes/Main.unity index 6985aa3495..c8dd94e366 100644 --- a/Assets/Scenes/Main.unity +++ b/Assets/Scenes/Main.unity @@ -10149,7 +10149,9 @@ MonoBehaviour: m_EditorClassIdentifier: m_GlobalNoiseTexture: {fileID: 2800000, guid: 13d389131c327b94f84fbac121bf6f8f, type: 3} - m_DefaultBrush: {fileID: 11400000, guid: eb608f68fb3036b47be357a021ed7618, type: 2} + m_DefaultBrush: {fileID: 11400000, guid: b802f6ef146800b4bb78e9c705622cad, type: 2} + m_ZapboxDefaultBrush: {fileID: 11400000, guid: eb608f68fb3036b47be357a021ed7618, + type: 2} m_BlocksMaterials: - brushDescriptor: {fileID: 11400000, guid: 0e87b49c65463a343a448a556d7d6c3e, type: 2} - brushDescriptor: {fileID: 11400000, guid: d6c87eafa4cdba042933c1b4f6da46f7, type: 2} diff --git a/Assets/Scripts/BrushCatalog.cs b/Assets/Scripts/BrushCatalog.cs index f712d6b7f7..8964206fe8 100644 --- a/Assets/Scripts/BrushCatalog.cs +++ b/Assets/Scripts/BrushCatalog.cs @@ -60,6 +60,7 @@ public static void UnitTestTearDown(GameObject container) public Texture2D m_GlobalNoiseTexture; [SerializeField] private Brush m_DefaultBrush; + [SerializeField] private Brush m_ZapboxDefaultBrush; private bool m_IsLoading; private Dictionary m_GuidToBrush; private HashSet m_AllBrushes; @@ -82,7 +83,14 @@ public Brush GetBrush(Guid guid) } public Brush DefaultBrush { - get { return m_DefaultBrush; } + get + { +#if ZAPBOX_SUPPORTED + // TODO:Mikesky - Fix brush transparency! + return m_ZapboxDefaultBrush; +#endif + return m_DefaultBrush; + } } public IEnumerable AllBrushes { diff --git a/Assets/Textures/Trademarked/logowatermark.png b/Assets/Textures/Trademarked/logowatermark.png index 4daebd1cb4..b7728f415f 100644 Binary files a/Assets/Textures/Trademarked/logowatermark.png and b/Assets/Textures/Trademarked/logowatermark.png differ diff --git a/Assets/Textures/Trademarked/logowatermarklabs.png b/Assets/Textures/Trademarked/logowatermarklabs.png index 4daebd1cb4..b7728f415f 100644 Binary files a/Assets/Textures/Trademarked/logowatermarklabs.png and b/Assets/Textures/Trademarked/logowatermarklabs.png differ diff --git a/Support/Python/tbdata/printing.py b/Support/Python/tbdata/printing.py index b02feca04f..5b75a455fe 100644 --- a/Support/Python/tbdata/printing.py +++ b/Support/Python/tbdata/printing.py @@ -249,8 +249,7 @@ def calculate_pos_error(cp0, cp1, middle_cps): t = (cp._dist - cp0._dist) / strip_length pos_interpolated = t * cp0._pos + (1 - t) * cp1._pos pos_error = np.linalg.norm((pos_interpolated - cp._pos)) - if pos_error > max_pos_error: - max_pos_error = pos_error + max_pos_error = max(max_pos_error, pos_error) return max_pos_error diff --git a/Support/bin/analyze_refgraph.py b/Support/bin/analyze_refgraph.py index c18a8a6bfb..d1d20da910 100755 --- a/Support/bin/analyze_refgraph.py +++ b/Support/bin/analyze_refgraph.py @@ -114,8 +114,7 @@ def iter_desired_guids(): except LookupError as e: print(e) continue - for guid in guids: - yield guid + yield from guids for guid in iter_desired_guids(): name = rg.guid_to_name.get(guid, guid) diff --git a/Support/steam/app.vdf.j2 b/Support/steam/app.vdf.j2 index 30feefa970..28ccf6527d 100644 --- a/Support/steam/app.vdf.j2 +++ b/Support/steam/app.vdf.j2 @@ -2,13 +2,14 @@ { "appid" "{{ OPEN_BRUSH_APP_ID }}" "Desc" "{{ VERSION }}" - "buildoutput" "../build_output/{{ CHANNEL }}" // Path for steamcmd logs + "buildoutput" "build_output/{{ CHANNEL }}" // Path for steamcmd logs "contentroot" "." // This file will be copied into the root of the release "setlive" "{{ CHANNEL }}" "preview" "0" // For local testing, set this to 1 "local" "" // Not relevant; this is for a custom CDN "depots" { - "{{ OPEN_BRUSH_WINDOWS_DEPOT_ID }}" main_depot.vdf + "{{ OPEN_BRUSH_WINDOWS_DEPOT_ID }}" build_windows_openxr/main_depot.vdf + "{{ OPEN_BRUSH_MAC_DEPOT_ID }}" build_macos_monoscopic/main_depot.vdf } } diff --git a/Support/steam/main_depot.mac.vdf.j2 b/Support/steam/main_depot.mac.vdf.j2 new file mode 100644 index 0000000000..c31997ab80 --- /dev/null +++ b/Support/steam/main_depot.mac.vdf.j2 @@ -0,0 +1,25 @@ +"DepotBuildConfig" +{ + // # Set your assigned depot ID here + "DepotID" "{{ OPEN_BRUSH_MAC_DEPOT_ID }}" + + "ContentRoot" "build_macos_monoscopic/StandaloneOSX" + + "FileMapping" + { + // Include all files in the build output directory (ContentRoot) + "LocalPath" "*" + + // Destination is the main install directory + "DepotPath" "." + + // If LocalPath contains wildcards, setting this means that all + // matching files within subdirectories of LocalPath will also + // be included. + "recursive" "1" + } + + // but exclude all symbol files + "FileExclusion" "*.pdb" + "FileExclusion" "build_log.txt" +} diff --git a/Support/steam/main_depot.vdf.j2 b/Support/steam/main_depot.win.vdf.j2 similarity index 92% rename from Support/steam/main_depot.vdf.j2 rename to Support/steam/main_depot.win.vdf.j2 index 13ef3826bc..924c8c9113 100644 --- a/Support/steam/main_depot.vdf.j2 +++ b/Support/steam/main_depot.win.vdf.j2 @@ -3,7 +3,7 @@ // # Set your assigned depot ID here "DepotID" "{{ OPEN_BRUSH_WINDOWS_DEPOT_ID }}" - "ContentRoot" "StandaloneWindows64" + "ContentRoot" "build_windows_openxr/StandaloneWindows64" "FileMapping" {