From a9b30c1aef46bf4dc71a76842fd77f9bced72d2a Mon Sep 17 00:00:00 2001 From: wada Date: Tue, 26 Mar 2024 11:17:38 +0900 Subject: [PATCH] Update to Cubism 5 SDK for Unity R1 --- Assets/Live2D/Cubism/CHANGELOG.md | 30 +++++++ Assets/Live2D/Cubism/Core/CubismMoc.cs | 3 +- .../MotionFade/CubismFadeController.cs | 5 +- Assets/Live2D/Cubism/Framework/Utils.meta | 8 ++ .../Cubism/Framework/Utils/CubismMath.cs | 36 ++++++++ .../Utils/CubismMath.cs.meta} | 2 +- Assets/Live2D/Cubism/NOTICE.ja.md | 21 +++-- Assets/Live2D/Cubism/NOTICE.md | 21 +++-- Assets/Live2D/Cubism/Plugins/CHANGELOG.md | 8 ++ .../Editor/CubismWebGLPluginProcessor.cs | 89 ------------------- .../1_38_48/Live2DCubismCore.bc.meta | 32 ------- Assets/Live2D/Cubism/Plugins/README.ja.md | 1 - Assets/Live2D/Cubism/Plugins/README.md | 1 - .../Cubism/Plugins/RedistributableFiles.txt | 1 - Assets/Live2D/Cubism/README.ja.md | 26 +++--- Assets/Live2D/Cubism/README.md | 26 +++--- .../Rendering/Masking/CubismMaskTexture.cs | 79 ++++++++-------- .../Rendering/Masking/CubismMaskTile.cs | 10 +++ .../Rendering/Masking/CubismMaskTilePool.cs | 69 ++++++++++---- CHANGELOG.md | 30 +++++++ NOTICE.ja.md | 21 +++-- NOTICE.md | 21 +++-- README.ja.md | 26 +++--- README.md | 26 +++--- 24 files changed, 328 insertions(+), 264 deletions(-) create mode 100644 Assets/Live2D/Cubism/Framework/Utils.meta create mode 100644 Assets/Live2D/Cubism/Framework/Utils/CubismMath.cs rename Assets/Live2D/Cubism/{Plugins/Editor/CubismWebGLPluginProcessor.cs.meta => Framework/Utils/CubismMath.cs.meta} (83%) delete mode 100644 Assets/Live2D/Cubism/Plugins/Editor/CubismWebGLPluginProcessor.cs delete mode 100644 Assets/Live2D/Cubism/Plugins/Experimental/Emscripten/1_38_48/Live2DCubismCore.bc.meta diff --git a/Assets/Live2D/Cubism/CHANGELOG.md b/Assets/Live2D/Cubism/CHANGELOG.md index 6b5cb7b..7fdbc43 100644 --- a/Assets/Live2D/Cubism/CHANGELOG.md +++ b/Assets/Live2D/Cubism/CHANGELOG.md @@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [5-r.1] - 2024-03-26 + +### Added + +* Add `CubimMath` class in namespace `Live2D.Cubism.Framework.Utils`. +* Add function `ModF()` to compute floating-point remainder in `CubismMath` class. + +### Changed + +* Change the message to output the latest Moc version supported by the CubismCore when the `.moc3` file fails to load correctly. +* Change the version of the development project to `2021.3.36f1`. + +### Deprecated + +* The `ToIndex()` and `ReturnTiles()` functions of the `CubismMaskTilePool` class are not used. + +### Fixed + +* Fix fade calculation bug in MotionFade. +* Fix a bug in which masks were not generated correctly when using multiple render textures and displaying two or more models. +* Fix an issue where normal processing could not be performed when `CubismMaskTilePool.Subdivisions` is less than `1`. + +### Removed + +* Remove `CubismWebGLPluginProcessor.cs`. + * This change is due to the removal of Cubism Core built with `Emscripten 1.38.48`. + * See `CHANGELOG.md` in Core. + + ## [5-r.1-beta.4] - 2024-01-18 ### Added @@ -367,6 +396,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). * Fix issue where Priority value was not reset after playing motion with CubismMotionController. +[5-r.1]: https://github.com/Live2D/CubismUnityComponents/compare/5-r.1-beta.4...5-r.1 [5-r.1-beta.4]: https://github.com/Live2D/CubismUnityComponents/compare/5-r.1-beta.3...5-r.1-beta.4 [5-r.1-beta.3]: https://github.com/Live2D/CubismUnityComponents/compare/5-r.1-beta.2...5-r.1-beta.3 [5-r.1-beta.2]: https://github.com/Live2D/CubismUnityComponents/compare/5-r.1-beta.1...5-r.1-beta.2 diff --git a/Assets/Live2D/Cubism/Core/CubismMoc.cs b/Assets/Live2D/Cubism/Core/CubismMoc.cs index 8b8853f..9c86450 100644 --- a/Assets/Live2D/Cubism/Core/CubismMoc.cs +++ b/Assets/Live2D/Cubism/Core/CubismMoc.cs @@ -42,7 +42,8 @@ public static CubismMoc CreateFrom(byte[] moc3, bool shouldCheckMocConsistency = { if (shouldCheckMocConsistency && !HasMocConsistency(moc3)) { - Debug.LogError("This Moc3 is Invalid. This model generation process is aborted and prefab is not created."); + Debug.LogError("This Moc3 is Invalid. This model generation process is aborted and prefab is not created.\n" + + $"Please check Model's Moc version. This CubismCore supported latest Moc version is `{LatestVersion}`."); return null; } diff --git a/Assets/Live2D/Cubism/Framework/MotionFade/CubismFadeController.cs b/Assets/Live2D/Cubism/Framework/MotionFade/CubismFadeController.cs index 2e41d81..60b233f 100644 --- a/Assets/Live2D/Cubism/Framework/MotionFade/CubismFadeController.cs +++ b/Assets/Live2D/Cubism/Framework/MotionFade/CubismFadeController.cs @@ -176,14 +176,15 @@ public void OnLateUpdate() } var playingMotions = _fadeStates[i].GetPlayingMotions(); - for (int j = 0; j < playingMotions.Count && playingMotions.Count > 2;) + for (var j = playingMotions.Count - 2; j >= 0; --j) { var playingMotion = playingMotions[j]; if (time <= playingMotion.EndTime) { - j++; continue; } + + // If fade-in has been completed, delete the motion that has been played back. _fadeStates[i].StopAnimation(j); } } diff --git a/Assets/Live2D/Cubism/Framework/Utils.meta b/Assets/Live2D/Cubism/Framework/Utils.meta new file mode 100644 index 0000000..54865a1 --- /dev/null +++ b/Assets/Live2D/Cubism/Framework/Utils.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7d6c9b0a672ca7c46bef8feb61ab62ac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Live2D/Cubism/Framework/Utils/CubismMath.cs b/Assets/Live2D/Cubism/Framework/Utils/CubismMath.cs new file mode 100644 index 0000000..c5448e5 --- /dev/null +++ b/Assets/Live2D/Cubism/Framework/Utils/CubismMath.cs @@ -0,0 +1,36 @@ +/** + * Copyright(c) Live2D Inc. All rights reserved. + * + * Use of this source code is governed by the Live2D Open Software license + * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. + */ + + +using UnityEngine; + + +namespace Live2D.Cubism.Framework.Utils +{ + public class CubismMath : MonoBehaviour + { + /// + /// Returns the remainder of the division of two numbers. + /// If invalid dividend or divisor is passed, it returns . + /// + /// , and are not allowed. + /// and Zero is not allowed. + /// + public static float ModF(float dividend, float divisor) + { + if (!float.IsFinite(dividend) || Mathf.Approximately(divisor, 0) + || float.IsNaN(dividend) || float.IsNaN(divisor)) + { + Debug.LogWarning($"Invalid dividend or divisor. divided: {dividend}, divisor: {divisor} Mod() returns 'NaN'."); + return float.NaN; + } + + // Calculate the remainder of the division. + return dividend % divisor; + } + } +} diff --git a/Assets/Live2D/Cubism/Plugins/Editor/CubismWebGLPluginProcessor.cs.meta b/Assets/Live2D/Cubism/Framework/Utils/CubismMath.cs.meta similarity index 83% rename from Assets/Live2D/Cubism/Plugins/Editor/CubismWebGLPluginProcessor.cs.meta rename to Assets/Live2D/Cubism/Framework/Utils/CubismMath.cs.meta index b70f123..b775986 100644 --- a/Assets/Live2D/Cubism/Plugins/Editor/CubismWebGLPluginProcessor.cs.meta +++ b/Assets/Live2D/Cubism/Framework/Utils/CubismMath.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: ef3e7a3f790561247aa7352ef4da7eff +guid: 1f5ba27f39f788e43847153d3f4ea120 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/Live2D/Cubism/NOTICE.ja.md b/Assets/Live2D/Cubism/NOTICE.ja.md index d07a467..e58c123 100644 --- a/Assets/Live2D/Cubism/NOTICE.ja.md +++ b/Assets/Live2D/Cubism/NOTICE.ja.md @@ -4,18 +4,21 @@ # お知らせ -## [注意事項] Windows 11の対応状況について (2021-12-09) - -Windows 11対応につきまして、Windows 11上にて成果物の動作を確認しております。 -ただし、Windows 11を利用したビルドにつきましては動作を保証しておりません、ご了承ください。 -対応バージョンや時期につきましては今後のリリースをもってお知らせいたします。 - ## [制限事項] Windows ARM64向けの対応状況について (2024-01-18) Unity 2023.1以降にて指定可能となったWindows ARM64向けビルドにつきまして、Cubim SDK for Unityは現在対応しておりません。 対応バージョンや時期につきましては今後のリリースをもってお知らせいたします。 +## [注意事項] Apple社のPrivacy Manifest Policy対応について + +Apple社が対応を必要としているPrivacy Manifest Policyについて、本製品では指定されているAPI及びサードパーティ製品を使用しておりません。 +もし本製品で対応が必要と判断した場合、今後のアップデートにて順次対応する予定です。 +詳しくはApple社が公開しているドキュメントをご確認ください。 + +[Privacy updates for App Store submissions](https://developer.apple.com/news/?id=3d8a9yyh) + + ## [注意事項] macOS Catalina 以降での `.bundle` と `.dylib` の利用について macOS Catalina 以降で `.bundle` と `.dylib` を利用する際、公証の確認のためオンライン環境に接続している必要があります。 @@ -23,6 +26,12 @@ macOS Catalina 以降で `.bundle` と `.dylib` を利用する際、公証の 詳しくは、Apple社 公式ドキュメントをご確認ください。 * [Apple社 公式ドキュメント](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution) + + +## [制限事項] 実行中のマスク用テクスチャの `RenderTextureCount` の値操作について (2024-03-26) + +シーン実行中に `CubismMaskTexture.RenderTextureCount` を実行開始時よりも大きい値に変更すると、マスクが正常に再生成されない不具合を確認しています。 +対応バージョンや時期につきましては今後のリリースをもってお知らせいたします。 --- ©Live2D diff --git a/Assets/Live2D/Cubism/NOTICE.md b/Assets/Live2D/Cubism/NOTICE.md index 75b82f9..7c2b32f 100644 --- a/Assets/Live2D/Cubism/NOTICE.md +++ b/Assets/Live2D/Cubism/NOTICE.md @@ -4,18 +4,21 @@ # Notices -## [Caution] Support for Windows 11 (2021-12-09) - -Regarding Windows 11 compatibility, we have confirmed that the deliverables work on Windows 11. -However, please note that we do not guarantee the operation of builds using Windows 11. -Supported version will be announced with a future release. - ## [Restrictions] Support for Windows ARM64 (2024-01-18) Cubism SDK for Unity currently does not support Windows ARM64 builds for Unity 2023.1 or later. A supported version will be announced in a future release. +## [Caution] Support for Apple's Privacy Manifest Policy + +This product does not use the APIs or third-party products specified in Apple's privacy manifest policy. +This will be addressed in future updates if this product requires such support. +Please check the documentation published by Apple for details. + +[Privacy updates for App Store submissions](https://developer.apple.com/news/?id=3d8a9yyh) + + ### [Caution] About using `.bundle` and `.dylib` on macOS Catalina or later To use `.bundle` and `.dylib` on macOS Catalina or later, you need to be connected to an online environment to verify your notarization. @@ -23,6 +26,12 @@ To use `.bundle` and `.dylib` on macOS Catalina or later, you need to be connect For details, please check the official Apple documentation. * [Apple Official Documentation](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution) + + +### [Restrictions] Manipulation of `RenderTextureCount` value for mask textures during execution (2024-03-26) + +If `CubismMaskTexture.RenderTextureCount` is changed during scene execution to a value greater than that at the start of execution, the mask will not be regenerated correctly. +A supported version will be announced in a future release. --- ©Live2D diff --git a/Assets/Live2D/Cubism/Plugins/CHANGELOG.md b/Assets/Live2D/Cubism/Plugins/CHANGELOG.md index 0d7a4a1..afe4260 100644 --- a/Assets/Live2D/Cubism/Plugins/CHANGELOG.md +++ b/Assets/Live2D/Cubism/Plugins/CHANGELOG.md @@ -5,6 +5,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 2024-03-26 + +### Remove + +* [Unity] Remove built with Emscripten 1.38.48. + * Unity 2021.2 or later uses only Core under `Assets/Live2D/Cubism/Plugins/Experimental/Emscripten/latest`. + + ## 2023-09-28 ### Remove diff --git a/Assets/Live2D/Cubism/Plugins/Editor/CubismWebGLPluginProcessor.cs b/Assets/Live2D/Cubism/Plugins/Editor/CubismWebGLPluginProcessor.cs deleted file mode 100644 index 13a14cd..0000000 --- a/Assets/Live2D/Cubism/Plugins/Editor/CubismWebGLPluginProcessor.cs +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright(c) Live2D Inc. All rights reserved. - * - * Use of this source code is governed by the Live2D Open Software license - * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. - */ - - -using System.Linq; -using System.Text.RegularExpressions; -using UnityEditor; -using UnityEditor.Build; -using UnityEditor.Build.Reporting; - -public class CubismWebGLPluginProcessor : IPreprocessBuildWithReport -{ - /// - /// Execution order. - /// - public int callbackOrder - { - get { return 0; } - } - - /// - /// Enable the appropriate plugins from your Unity version before building. - /// - public void OnPreprocessBuild(BuildReport report) - { - // Skip the process if the build is not for WebGL. - if (report.summary.platform != BuildTarget.WebGL) - { - return; - } - - - // Detect the type of WebGL plugin by SDK type and SDK version in the build settings. - var targetPlugin = -#if UNITY_2021_2_OR_NEWER - CubismWebGLPlugin.Latest; -#else - CubismWebGLPlugin.Previous; -#endif - - - // Extract the Cubism WebGL plugin from the plugin. - var pluginImporters = PluginImporter.GetAllImporters() - .Where(pluginImporter => - Regex.IsMatch( - pluginImporter.assetPath, - @"^.*/Experimental/Emscripten/.*/Live2DCubismCore.bc$" - ) - ) - .ToArray(); - - - // Enable only the appropriate plugins. - foreach (var pluginImporter in pluginImporters) - { - pluginImporter.SetCompatibleWithPlatform( - BuildTarget.WebGL, - pluginImporter.assetPath.Contains(targetPlugin.DirectoryName) - ); - } - } - - - /// - /// Defines the version of the plugin for WebGL. - /// - private class CubismWebGLPlugin - { - public readonly string DirectoryName; - - public static CubismWebGLPlugin Latest - { - get { return new CubismWebGLPlugin("latest"); } - } - public static CubismWebGLPlugin Previous - { - get { return new CubismWebGLPlugin("1_38_48"); } - } - - private CubismWebGLPlugin(string directoryName) - { - DirectoryName = directoryName; - } - } -} diff --git a/Assets/Live2D/Cubism/Plugins/Experimental/Emscripten/1_38_48/Live2DCubismCore.bc.meta b/Assets/Live2D/Cubism/Plugins/Experimental/Emscripten/1_38_48/Live2DCubismCore.bc.meta deleted file mode 100644 index ba11d5b..0000000 --- a/Assets/Live2D/Cubism/Plugins/Experimental/Emscripten/1_38_48/Live2DCubismCore.bc.meta +++ /dev/null @@ -1,32 +0,0 @@ -fileFormatVersion: 2 -guid: 9c35e3292559d6a41979453248ee7621 -PluginImporter: - externalObjects: {} - serializedVersion: 2 - iconMap: {} - executionOrder: {} - defineConstraints: [] - isPreloaded: 0 - isOverridable: 0 - isExplicitlyReferenced: 0 - validateReferences: 1 - platformData: - - first: - Any: - second: - enabled: 0 - settings: {} - - first: - Editor: Editor - second: - enabled: 0 - settings: - DefaultValueInitialized: true - - first: - WebGL: WebGL - second: - enabled: 1 - settings: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Live2D/Cubism/Plugins/README.ja.md b/Assets/Live2D/Cubism/Plugins/README.ja.md index 4ed0c4c..b5ed537 100644 --- a/Assets/Live2D/Cubism/Plugins/README.ja.md +++ b/Assets/Live2D/Cubism/Plugins/README.ja.md @@ -17,7 +17,6 @@ | Android | x86 | Android/x86 | | | Android | x86_64 | Android/x86_64 | | | Emscripten | | Experimental/Emscripten/latest | bitcode(upstream LLVM wasmバックエンド) | -| Emscripten | | Experimental/Emscripten/1_38_48 | bitcode(fastcompバックエンド) | | iOS | ARM64 | iOS/xxx-iphoneos | iOSデバイス | | iOS | x86_64 | iOS/xxx-iphonesimulator | iOS Simulator | | Linux | x86_64 | Linux/x86_64 | | diff --git a/Assets/Live2D/Cubism/Plugins/README.md b/Assets/Live2D/Cubism/Plugins/README.md index 653d377..4355ac9 100644 --- a/Assets/Live2D/Cubism/Plugins/README.md +++ b/Assets/Live2D/Cubism/Plugins/README.md @@ -17,7 +17,6 @@ This folder contains platform-specific library files. | Android | x86 | Android/x86 | | | Android | x86_64 | Android/x86_64 | | | Emscripten | | Experimental/Emscripten/latest | bitcode(upstream LLVM wasm backend) | -| Emscripten | | Experimental/Emscripten/1_38_48 | bitcode(fastcomp backend) | | iOS | ARM64 | iOS/xxx-iphoneos | iOS Devices | | iOS | x86_64 | iOS/xxx-iphonesimulator | iOS Simulator | | Linux | x86_64 | Linux/x86_64 | | diff --git a/Assets/Live2D/Cubism/Plugins/RedistributableFiles.txt b/Assets/Live2D/Cubism/Plugins/RedistributableFiles.txt index 277d83b..c36d565 100644 --- a/Assets/Live2D/Cubism/Plugins/RedistributableFiles.txt +++ b/Assets/Live2D/Cubism/Plugins/RedistributableFiles.txt @@ -6,7 +6,6 @@ under the terms of the Live2D Proprietary Software License Agreement: - Android/x86/libLive2DCubismCore.so - Android/x86_64/libLive2DCubismCore.so - Experimental/Emscripten/latest/Live2DCubismCore.bc -- Experimental/Emscripten/1_38_48/Live2DCubismCore.bc - Experimental/UWP/arm/Live2DCubismCore.dll - Experimental/UWP/arm64/Live2DCubismCore.dll - Experimental/UWP/x64/Live2DCubismCore.dll diff --git a/Assets/Live2D/Cubism/README.ja.md b/Assets/Live2D/Cubism/README.ja.md index 3a074c6..2286eaf 100644 --- a/Assets/Live2D/Cubism/README.ja.md +++ b/Assets/Live2D/Cubism/README.ja.md @@ -54,18 +54,18 @@ Unity Editor拡張機能は、`./Assets/Live2D/Cubism/Editor`にあります。 | Unity | バージョン | | --- | --- | -| Latest | 2023.2.5f1 (*1) | -| LTS | 2022.3.17f1 | -| LTS | 2021.3.34f1 | +| Latest | 2023.2.14f1 (*1) | +| LTS | 2022.3.21f1 | +| LTS | 2021.3.36f1 | *1 ARMv7のAndroidは非対応です。 | ライブラリ / ツール | バージョン | | --- | --- | | Android SDK / NDK | *2 | -| Visual Studio 2022 | 17.7.7 | +| Visual Studio 2022 | 17.9.3 | | Windows SDK | 10.0.22621.0 | -| Xcode | 15.2 | +| Xcode | 15.3 | *2 Unityに組み込まれたライブラリまたは推奨ライブラリを使用してください。 @@ -84,14 +84,14 @@ https://docs.unity3d.com/ja/2018.4/Manual/CSharpCompiler.html | プラットフォーム | バージョン | | --- | --- | | Android | 14 | -| iOS | 17.2.1 | -| iPadOS | 17.2.1 | +| iOS | 17.4 | +| iPadOS | 17.4 | | Ubuntu | 20.04.6 | -| macOS | 14.2.1 | -| Windows 10 | 22H2 | -| Google Chrome | 120.0.6099.217 | -| Chrome OS 64bit (x86_64) | 120.0.6099.203 | -| Chrome OS 32bit (ARMv8) (*3) | 115.0.5790.160 | +| macOS | 14.4 | +| Windows 11 | 23H2 | +| Google Chrome | 122.0.6261.129 | +| Chrome OS 64bit (x86_64) | 122.0.6261.118 | +| Chrome OS 32bit (ARMv8) (*3) | 122.0.6261.118 | *3 Android向けAPKファイルでの動作確認です。 @@ -115,7 +115,7 @@ Coreラッパーでは、unsafeコードのブロックを許可する必要が ### フォークとプルリクエスト -修正、改善、さらには新機能をもたらすかどうかにかかわらず、プルリクエストに感謝します。ただし、ラッパーは可能な限り軽量で浅くなるように設計されているため、バグ修正とメモリ/パフォーマンスの改善のみを行う必要があることに注意してください。メインリポジトリを可能な限りクリーンに保つために、必要に応じて個人用フォークと機能ブランチを作成してください。 +修正、改善、さらには新機能をもたらすかどうかにかかわらず、プルリクエストに感謝します。メインリポジトリを可能な限りクリーンに保つために、必要に応じて個人用フォークと機能ブランチを作成してください。 ### バグ diff --git a/Assets/Live2D/Cubism/README.md b/Assets/Live2D/Cubism/README.md index f69f965..e051aaa 100644 --- a/Assets/Live2D/Cubism/README.md +++ b/Assets/Live2D/Cubism/README.md @@ -55,18 +55,18 @@ Resources like shaders and other assets are located in `./Assets/Live2D/Cubism/R | Unity | Version | | --- | --- | -| Latest | 2023.2.5f1 (*1) | -| LTS | 2022.3.17f1 | -| LTS | 2021.3.34f1 | +| Latest | 2023.2.14f1 (*1) | +| LTS | 2022.3.21f1 | +| LTS | 2021.3.36f1 | *1 ARMv7 Android is not supported. | Library / Tool | Version | | --- | --- | | Android SDK / NDK | *2 | -| Visual Studio 2022 | 17.7.7 | +| Visual Studio 2022 | 17.9.3 | | Windows SDK | 10.0.22621.0 | -| Xcode | 15.2 | +| Xcode | 15.3 | *2 Use libraries embedded with Unity or recommended. @@ -85,14 +85,14 @@ https://docs.unity3d.com/ja/2018.4/Manual/CSharpCompiler.html | Platform | Version | | --- | --- | | Android | 14 | -| iOS | 17.2.1 | -| iPadOS | 17.2.1 | +| iOS | 17.4 | +| iPadOS | 17.4 | | Ubuntu | 20.04.6 | -| macOS | 14.2.1 | -| Windows 10 | 22H2 | -| Google Chrome | 120.0.6099.217 | -| Chrome OS 64bit (x86_64) | 120.0.6099.203 | -| Chrome OS 32bit (ARMv8) (*3) | 115.0.5790.160 | +| macOS | 14.4 | +| Windows 11 | 23H2 | +| Google Chrome | 122.0.6261.129 | +| Chrome OS 64bit (x86_64) | 122.0.6261.118 | +| Chrome OS 32bit (ARMv8) (*3) | 122.0.6261.118 | *3 This is a confirmation of operation with APK files for Android. @@ -116,7 +116,7 @@ There are many ways to contribute to the project: logging bugs, submitting pull ### Forking And Pull Requests -We very much appreciate your pull requests, whether they bring fixes, improvements, or even new features. Note, however, that the wrapper is designed to be as lightweight and shallow as possible and should therefore only be subject to bug fixes and memory/performance improvements. To keep the main repository as clean as possible, create a personal fork and feature branches there as needed. +We very much appreciate your pull requests, whether they bring fixes, improvements, or even new features. To keep the main repository as clean as possible, create a personal fork and feature branches there as needed. ### Bugs diff --git a/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTexture.cs b/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTexture.cs index 51c9bb2..8e7824a 100644 --- a/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTexture.cs +++ b/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTexture.cs @@ -220,6 +220,11 @@ public RenderTexture[] RenderTextures private List Sources { get; set; } + /// + /// Command sources. + /// + private List CommandSources { get; set; } + /// /// True if instance is revived. /// @@ -233,7 +238,7 @@ private bool IsRevived /// private bool ContainsSources { - get { return Sources != null && Sources.Count > 0; } + get { return CommandSources != null && CommandSources.Count > 0; } } #region Interface For ICubismMaskSources @@ -254,34 +259,24 @@ public void AddSource(ICubismMaskTextureCommandSource source) // Make sure instance is valid. TryRevive(); - - // Initialize container if necessary. - if (Sources == null) + // Return early if empty. + if (source == null) { - Sources = new List(); + return; } - - // Return early if source already exists. - else if (Sources.FindIndex(i => i.Source == source) != -1) + if (CommandSources == null) { - return; + CommandSources = new List(); } - TilePool.UsedMaskCount += source.GetNecessaryTileCount(); - // Register source. - var item = new SourcesItem + if (CommandSources.FindIndex(i => i == source) != -1) { - Source = source, - Tiles = TilePool.AcquireTiles(source.GetNecessaryTileCount()) - }; - - - Sources.Add(item); - + return; + } + CommandSources.Add(source); - // Apply tiles to source. - source.SetTiles(item.Tiles); + ReinitializeSources(); } /// @@ -305,11 +300,10 @@ public void RemoveSource(ICubismMaskTextureCommandSource source) return; } - TilePool.UsedMaskCount -= source.GetNecessaryTileCount(); - // Return tiles and deregister source. - TilePool.ReturnTiles(Sources[itemIndex].Tiles); - Sources.RemoveAt(itemIndex); + CommandSources.RemoveAt(itemIndex); + + ReinitializeSources(); } #endregion @@ -338,23 +332,26 @@ private void ReinitializeSources() // Reallocate tiles if sources exist. if (ContainsSources) { - for (var sourceIndex = 0; sourceIndex < Sources.Count; sourceIndex++) + TilePool.UsedMaskCount = 0; + for (var i = 0; i < CommandSources.Count; i++) { - var source = Sources[sourceIndex]; - TilePool.UsedMaskCount += source.Source.GetNecessaryTileCount(); + TilePool.UsedMaskCount += CommandSources[i].GetNecessaryTileCount(); } - for (var i = 0; i < Sources.Count; ++i) - { - var source = Sources[i]; - - - source.Tiles = TilePool.AcquireTiles(source.Source.GetNecessaryTileCount()); - - source.Source.SetTiles(source.Tiles); - + TilePool.ResetTiles(); + Sources = new List(); - Sources[i] = source; + for (var i = 0; i < CommandSources.Count; i++) + { + var item = new SourcesItem + { + Source = CommandSources[i], + Tiles = TilePool.AcquireTiles(CommandSources[i].GetNecessaryTileCount()) + }; + Sources.Add(item); + + // Apply tiles to source. + CommandSources[i].SetTiles(item.Tiles); } } } @@ -374,7 +371,7 @@ private void RefreshRenderTexture() // Recreate render textures. if (_renderTextures != null) { - for (int renderTextureIndex = 0; renderTextureIndex < RenderTextures.Length; renderTextureIndex++) + for (var renderTextureIndex = 0; renderTextureIndex < RenderTextures.Length; renderTextureIndex++) { DestroyImmediate(RenderTextures[renderTextureIndex]); } @@ -395,7 +392,7 @@ private void RefreshRenderTextures() // Recreate render textures. if (_renderTextures != null) { - for (int renderTextureIndex = 0; renderTextureIndex < RenderTextures.Length; renderTextureIndex++) + for (var renderTextureIndex = 0; renderTextureIndex < RenderTextures.Length; renderTextureIndex++) { DestroyImmediate(RenderTextures[renderTextureIndex]); } @@ -403,7 +400,7 @@ private void RefreshRenderTextures() RenderTextures = new RenderTexture[RenderTextureCount]; - for (int renderTextureIndex = 0; renderTextureIndex < RenderTextureCount; renderTextureIndex++) + for (var renderTextureIndex = 0; renderTextureIndex < RenderTextureCount; renderTextureIndex++) { RenderTextures[renderTextureIndex] = new RenderTexture(Size, Size, 0, RenderTextureFormat.ARGB32); } diff --git a/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTile.cs b/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTile.cs index 654e5b7..b6e8a20 100644 --- a/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTile.cs +++ b/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTile.cs @@ -62,5 +62,15 @@ public static implicit operator Vector4(CubismMaskTile value) /// Index of RenderTextures where the tile is located. /// public int RenderTextureIndex; + + /// + /// Index of HeadOfChannels. + /// + public int HeadOfChannelsIndex; + + /// + /// Index of mask tile. + /// + public int Index; } } diff --git a/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTilePool.cs b/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTilePool.cs index 82b545c..effd253 100644 --- a/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTilePool.cs +++ b/Assets/Live2D/Cubism/Rendering/Masking/CubismMaskTilePool.cs @@ -96,9 +96,13 @@ public CubismMaskTilePool(int subdivisions, int channels, int renderTextureCount #endif Subdivisions = subdivisions; + if (Subdivisions < 1) + { + Subdivisions = 1; + Debug.LogError("`Subdivisions` must be at least 1. It will be automatically set to 1."); + } - - Slots = new bool[(int)Mathf.Pow(4, subdivisions) * ColorChannelCount]; + Slots = new bool[(int)Mathf.Pow(4, Subdivisions) * ColorChannelCount]; } else { @@ -120,7 +124,7 @@ public CubismMaskTilePool(int subdivisions, int channels, int renderTextureCount RenderTextureIndex = 0, Channel = 0, LayoutCount = 0, - LayoutCountContextIndex = 0, + LayoutContextIndex = 0, }; } @@ -188,6 +192,7 @@ public CubismMaskTile[] AcquireTiles(int count) /// Releases tiles. /// /// Tiles to release. + [Obsolete("ReturnTiles() is not used.", false)] public void ReturnTiles(CubismMaskTile[] tiles) { // Flag slots as available. @@ -198,6 +203,20 @@ public void ReturnTiles(CubismMaskTile[] tiles) } + /// + /// Reset HeadOfChannels. + /// + public void ResetTiles() + { + HeadOfChannels = new LayoutContext[0]; + LayoutContexts = new LayoutContext[UseClippingMaskMaxCount * ColorChannelCount]; + for (var i = 0; i < Slots.Length; i++) + { + Slots[i] = false; + } + } + + /// /// Converts from index to . /// @@ -217,7 +236,8 @@ private CubismMaskTile ToTile(int index) Column = 0, Row = 0, Size = 1, - RenderTextureIndex = 0 + RenderTextureIndex = 0, + HeadOfChannelsIndex = -1 }; } @@ -240,6 +260,9 @@ private CubismMaskTile ToTile(int index) // Start the calculation as the first index of that channel. if (LayoutContexts[index].LayoutCount < 1) { + var headOfChannelsIndex = (HeadOfChannels.Length == 0) + ? 0 + : HeadOfChannels.Length - 1; ; if (HeadOfChannels.Length < 1) { LayoutContexts[index].Channel = 0; @@ -255,12 +278,14 @@ private CubismMaskTile ToTile(int index) // RenderTextureIndex LayoutContexts[index].RenderTextureIndex = previousUseChannel < (ColorChannelCount - 1) - ? HeadOfChannels[HeadOfChannels.Length - 1].RenderTextureIndex : HeadOfChannels[HeadOfChannels.Length - 1].RenderTextureIndex + 1; + ? HeadOfChannels[headOfChannelsIndex].RenderTextureIndex : HeadOfChannels[headOfChannelsIndex].RenderTextureIndex + 1; } // Number of layouts in this channel. // NOTE: Number of layouts = basic masks to place on one channel + one additional channel to place extra masks. - LayoutContexts[index].LayoutCount = divCount + (LayoutContexts[index].Channel < modCount ? 1 : 0); + LayoutContexts[index].LayoutCount = divCount + (LayoutContexts[index].Channel < modCount + ? 1 + : 0); // Determine the channel that does it when reducing the number of layouts by one. // Adjust to be within the normal index range when div is 0. @@ -275,7 +300,7 @@ private CubismMaskTile ToTile(int index) : 0; } - LayoutContexts[index].LayoutCountContextIndex = 0; + LayoutContexts[index].LayoutContextIndex = 0; // Set the required number of information. for (var count = 1; count < LayoutContexts[index].LayoutCount; count++) @@ -283,7 +308,7 @@ private CubismMaskTile ToTile(int index) LayoutContexts[index + count].RenderTextureIndex = LayoutContexts[index].RenderTextureIndex; LayoutContexts[index + count].Channel = LayoutContexts[index].Channel; LayoutContexts[index + count].LayoutCount = LayoutContexts[index].LayoutCount; - LayoutContexts[index + count].LayoutCountContextIndex = count; + LayoutContexts[index + count].LayoutContextIndex = count; } Array.Resize(ref _headOfChannels, HeadOfChannels.Length + 1); @@ -301,13 +326,14 @@ private CubismMaskTile ToTile(int index) Column = 0, Row = 0, Size = 1, - RenderTextureIndex = LayoutContexts[index].RenderTextureIndex + RenderTextureIndex = LayoutContexts[index].RenderTextureIndex, + Index = index }; } else if (layoutCount <= 4) { var tilesPerRow = 2; // Rows per tile - var currentTilePosition = LayoutContexts[index].LayoutCountContextIndex; + var currentTilePosition = LayoutContexts[index].LayoutContextIndex; var tileSize = 1f / (float)tilesPerRow; var column = currentTilePosition / tilesPerRow; var rowId = currentTilePosition % tilesPerRow; @@ -318,14 +344,14 @@ private CubismMaskTile ToTile(int index) Column = column, Row = rowId, Size = tileSize, - RenderTextureIndex = LayoutContexts[index].RenderTextureIndex + RenderTextureIndex = LayoutContexts[index].RenderTextureIndex, + Index = index }; } else if (layoutCount <= layoutCountMaxValue) { var tilesPerRow = 3; // Rows per tile - - var currentTilePosition = LayoutContexts[index].LayoutCountContextIndex; + var currentTilePosition = LayoutContexts[index].LayoutContextIndex; var tileSize = 1f / (float)tilesPerRow; var column = currentTilePosition / tilesPerRow; var rowId = currentTilePosition % tilesPerRow; @@ -336,7 +362,8 @@ private CubismMaskTile ToTile(int index) Column = column, Row = rowId, Size = tileSize, - RenderTextureIndex = LayoutContexts[index].RenderTextureIndex + RenderTextureIndex = LayoutContexts[index].RenderTextureIndex, + Index = index }; } else @@ -349,7 +376,9 @@ private CubismMaskTile ToTile(int index) Column = 0, Row = 0, Size = 1f, - RenderTextureIndex = 0 + RenderTextureIndex = 0, + HeadOfChannelsIndex = 0, + Index = index }; } } @@ -358,8 +387,6 @@ private CubismMaskTile ToTile(int index) var tileCounts = (int)Mathf.Pow(4, Subdivisions - 1); var tilesPerRow = (int)Mathf.Pow(2, Subdivisions - 1); var tileSize = 1f / (float)tilesPerRow; - - var channel = index / tileCounts; var currentTilePosition = index - (channel * tileCounts); var column = currentTilePosition / tilesPerRow; @@ -370,7 +397,10 @@ private CubismMaskTile ToTile(int index) Channel = channel, Column = column, Row = rowId, - Size = tileSize + Size = tileSize, + RenderTextureIndex = -1, + HeadOfChannelsIndex = -1, + Index = index }; } } @@ -380,6 +410,7 @@ private CubismMaskTile ToTile(int index) /// /// Tile to convert. /// Tile index. + [Obsolete("ToIndex() is not used.", false)] private int ToIndex(CubismMaskTile tile) { var tilesPerRow = 0; @@ -448,7 +479,7 @@ private struct LayoutContext /// /// Index within a division. /// - public int LayoutCountContextIndex; + public int LayoutContextIndex; } } } diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b5cb7b..7fdbc43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,35 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [5-r.1] - 2024-03-26 + +### Added + +* Add `CubimMath` class in namespace `Live2D.Cubism.Framework.Utils`. +* Add function `ModF()` to compute floating-point remainder in `CubismMath` class. + +### Changed + +* Change the message to output the latest Moc version supported by the CubismCore when the `.moc3` file fails to load correctly. +* Change the version of the development project to `2021.3.36f1`. + +### Deprecated + +* The `ToIndex()` and `ReturnTiles()` functions of the `CubismMaskTilePool` class are not used. + +### Fixed + +* Fix fade calculation bug in MotionFade. +* Fix a bug in which masks were not generated correctly when using multiple render textures and displaying two or more models. +* Fix an issue where normal processing could not be performed when `CubismMaskTilePool.Subdivisions` is less than `1`. + +### Removed + +* Remove `CubismWebGLPluginProcessor.cs`. + * This change is due to the removal of Cubism Core built with `Emscripten 1.38.48`. + * See `CHANGELOG.md` in Core. + + ## [5-r.1-beta.4] - 2024-01-18 ### Added @@ -367,6 +396,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). * Fix issue where Priority value was not reset after playing motion with CubismMotionController. +[5-r.1]: https://github.com/Live2D/CubismUnityComponents/compare/5-r.1-beta.4...5-r.1 [5-r.1-beta.4]: https://github.com/Live2D/CubismUnityComponents/compare/5-r.1-beta.3...5-r.1-beta.4 [5-r.1-beta.3]: https://github.com/Live2D/CubismUnityComponents/compare/5-r.1-beta.2...5-r.1-beta.3 [5-r.1-beta.2]: https://github.com/Live2D/CubismUnityComponents/compare/5-r.1-beta.1...5-r.1-beta.2 diff --git a/NOTICE.ja.md b/NOTICE.ja.md index d07a467..e58c123 100644 --- a/NOTICE.ja.md +++ b/NOTICE.ja.md @@ -4,18 +4,21 @@ # お知らせ -## [注意事項] Windows 11の対応状況について (2021-12-09) - -Windows 11対応につきまして、Windows 11上にて成果物の動作を確認しております。 -ただし、Windows 11を利用したビルドにつきましては動作を保証しておりません、ご了承ください。 -対応バージョンや時期につきましては今後のリリースをもってお知らせいたします。 - ## [制限事項] Windows ARM64向けの対応状況について (2024-01-18) Unity 2023.1以降にて指定可能となったWindows ARM64向けビルドにつきまして、Cubim SDK for Unityは現在対応しておりません。 対応バージョンや時期につきましては今後のリリースをもってお知らせいたします。 +## [注意事項] Apple社のPrivacy Manifest Policy対応について + +Apple社が対応を必要としているPrivacy Manifest Policyについて、本製品では指定されているAPI及びサードパーティ製品を使用しておりません。 +もし本製品で対応が必要と判断した場合、今後のアップデートにて順次対応する予定です。 +詳しくはApple社が公開しているドキュメントをご確認ください。 + +[Privacy updates for App Store submissions](https://developer.apple.com/news/?id=3d8a9yyh) + + ## [注意事項] macOS Catalina 以降での `.bundle` と `.dylib` の利用について macOS Catalina 以降で `.bundle` と `.dylib` を利用する際、公証の確認のためオンライン環境に接続している必要があります。 @@ -23,6 +26,12 @@ macOS Catalina 以降で `.bundle` と `.dylib` を利用する際、公証の 詳しくは、Apple社 公式ドキュメントをご確認ください。 * [Apple社 公式ドキュメント](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution) + + +## [制限事項] 実行中のマスク用テクスチャの `RenderTextureCount` の値操作について (2024-03-26) + +シーン実行中に `CubismMaskTexture.RenderTextureCount` を実行開始時よりも大きい値に変更すると、マスクが正常に再生成されない不具合を確認しています。 +対応バージョンや時期につきましては今後のリリースをもってお知らせいたします。 --- ©Live2D diff --git a/NOTICE.md b/NOTICE.md index 75b82f9..7c2b32f 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -4,18 +4,21 @@ # Notices -## [Caution] Support for Windows 11 (2021-12-09) - -Regarding Windows 11 compatibility, we have confirmed that the deliverables work on Windows 11. -However, please note that we do not guarantee the operation of builds using Windows 11. -Supported version will be announced with a future release. - ## [Restrictions] Support for Windows ARM64 (2024-01-18) Cubism SDK for Unity currently does not support Windows ARM64 builds for Unity 2023.1 or later. A supported version will be announced in a future release. +## [Caution] Support for Apple's Privacy Manifest Policy + +This product does not use the APIs or third-party products specified in Apple's privacy manifest policy. +This will be addressed in future updates if this product requires such support. +Please check the documentation published by Apple for details. + +[Privacy updates for App Store submissions](https://developer.apple.com/news/?id=3d8a9yyh) + + ### [Caution] About using `.bundle` and `.dylib` on macOS Catalina or later To use `.bundle` and `.dylib` on macOS Catalina or later, you need to be connected to an online environment to verify your notarization. @@ -23,6 +26,12 @@ To use `.bundle` and `.dylib` on macOS Catalina or later, you need to be connect For details, please check the official Apple documentation. * [Apple Official Documentation](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution) + + +### [Restrictions] Manipulation of `RenderTextureCount` value for mask textures during execution (2024-03-26) + +If `CubismMaskTexture.RenderTextureCount` is changed during scene execution to a value greater than that at the start of execution, the mask will not be regenerated correctly. +A supported version will be announced in a future release. --- ©Live2D diff --git a/README.ja.md b/README.ja.md index 3a074c6..2286eaf 100644 --- a/README.ja.md +++ b/README.ja.md @@ -54,18 +54,18 @@ Unity Editor拡張機能は、`./Assets/Live2D/Cubism/Editor`にあります。 | Unity | バージョン | | --- | --- | -| Latest | 2023.2.5f1 (*1) | -| LTS | 2022.3.17f1 | -| LTS | 2021.3.34f1 | +| Latest | 2023.2.14f1 (*1) | +| LTS | 2022.3.21f1 | +| LTS | 2021.3.36f1 | *1 ARMv7のAndroidは非対応です。 | ライブラリ / ツール | バージョン | | --- | --- | | Android SDK / NDK | *2 | -| Visual Studio 2022 | 17.7.7 | +| Visual Studio 2022 | 17.9.3 | | Windows SDK | 10.0.22621.0 | -| Xcode | 15.2 | +| Xcode | 15.3 | *2 Unityに組み込まれたライブラリまたは推奨ライブラリを使用してください。 @@ -84,14 +84,14 @@ https://docs.unity3d.com/ja/2018.4/Manual/CSharpCompiler.html | プラットフォーム | バージョン | | --- | --- | | Android | 14 | -| iOS | 17.2.1 | -| iPadOS | 17.2.1 | +| iOS | 17.4 | +| iPadOS | 17.4 | | Ubuntu | 20.04.6 | -| macOS | 14.2.1 | -| Windows 10 | 22H2 | -| Google Chrome | 120.0.6099.217 | -| Chrome OS 64bit (x86_64) | 120.0.6099.203 | -| Chrome OS 32bit (ARMv8) (*3) | 115.0.5790.160 | +| macOS | 14.4 | +| Windows 11 | 23H2 | +| Google Chrome | 122.0.6261.129 | +| Chrome OS 64bit (x86_64) | 122.0.6261.118 | +| Chrome OS 32bit (ARMv8) (*3) | 122.0.6261.118 | *3 Android向けAPKファイルでの動作確認です。 @@ -115,7 +115,7 @@ Coreラッパーでは、unsafeコードのブロックを許可する必要が ### フォークとプルリクエスト -修正、改善、さらには新機能をもたらすかどうかにかかわらず、プルリクエストに感謝します。ただし、ラッパーは可能な限り軽量で浅くなるように設計されているため、バグ修正とメモリ/パフォーマンスの改善のみを行う必要があることに注意してください。メインリポジトリを可能な限りクリーンに保つために、必要に応じて個人用フォークと機能ブランチを作成してください。 +修正、改善、さらには新機能をもたらすかどうかにかかわらず、プルリクエストに感謝します。メインリポジトリを可能な限りクリーンに保つために、必要に応じて個人用フォークと機能ブランチを作成してください。 ### バグ diff --git a/README.md b/README.md index f69f965..e051aaa 100644 --- a/README.md +++ b/README.md @@ -55,18 +55,18 @@ Resources like shaders and other assets are located in `./Assets/Live2D/Cubism/R | Unity | Version | | --- | --- | -| Latest | 2023.2.5f1 (*1) | -| LTS | 2022.3.17f1 | -| LTS | 2021.3.34f1 | +| Latest | 2023.2.14f1 (*1) | +| LTS | 2022.3.21f1 | +| LTS | 2021.3.36f1 | *1 ARMv7 Android is not supported. | Library / Tool | Version | | --- | --- | | Android SDK / NDK | *2 | -| Visual Studio 2022 | 17.7.7 | +| Visual Studio 2022 | 17.9.3 | | Windows SDK | 10.0.22621.0 | -| Xcode | 15.2 | +| Xcode | 15.3 | *2 Use libraries embedded with Unity or recommended. @@ -85,14 +85,14 @@ https://docs.unity3d.com/ja/2018.4/Manual/CSharpCompiler.html | Platform | Version | | --- | --- | | Android | 14 | -| iOS | 17.2.1 | -| iPadOS | 17.2.1 | +| iOS | 17.4 | +| iPadOS | 17.4 | | Ubuntu | 20.04.6 | -| macOS | 14.2.1 | -| Windows 10 | 22H2 | -| Google Chrome | 120.0.6099.217 | -| Chrome OS 64bit (x86_64) | 120.0.6099.203 | -| Chrome OS 32bit (ARMv8) (*3) | 115.0.5790.160 | +| macOS | 14.4 | +| Windows 11 | 23H2 | +| Google Chrome | 122.0.6261.129 | +| Chrome OS 64bit (x86_64) | 122.0.6261.118 | +| Chrome OS 32bit (ARMv8) (*3) | 122.0.6261.118 | *3 This is a confirmation of operation with APK files for Android. @@ -116,7 +116,7 @@ There are many ways to contribute to the project: logging bugs, submitting pull ### Forking And Pull Requests -We very much appreciate your pull requests, whether they bring fixes, improvements, or even new features. Note, however, that the wrapper is designed to be as lightweight and shallow as possible and should therefore only be subject to bug fixes and memory/performance improvements. To keep the main repository as clean as possible, create a personal fork and feature branches there as needed. +We very much appreciate your pull requests, whether they bring fixes, improvements, or even new features. To keep the main repository as clean as possible, create a personal fork and feature branches there as needed. ### Bugs