From 07b9e8df06ee056c9a81588542717b38efa226f8 Mon Sep 17 00:00:00 2001 From: wada Date: Thu, 17 Aug 2023 11:04:25 +0900 Subject: [PATCH] Update to Cubism 5 SDK for Native R1 beta1 --- .editorconfig | 3 + .gitignore | 1 + CHANGELOG.md | 19 + Core/CHANGELOG.md | 20 + Framework | 2 +- LICENSE.md | 1 + NOTICE.ja.md | 6 + NOTICE.md | 6 + README.ja.md | 32 +- README.md | 32 +- Samples/Cocos2d-x/Demo/CMakeLists.txt | 4 + Samples/Cocos2d-x/Demo/Classes/LAppDefine.cpp | 12 - Samples/Cocos2d-x/Demo/Classes/LAppDefine.hpp | 3 - .../Demo/Classes/LAppLive2DManager.cpp | 135 ++- .../Demo/Classes/LAppLive2DManager.hpp | 20 +- .../Classes/LAppLive2DManagerInternal.cpp | 208 +++++ .../Demo/Classes/LAppLive2DManagerInternal.h | 16 + Samples/Cocos2d-x/Demo/Classes/LAppModel.cpp | 6 +- Samples/Cocos2d-x/Demo/Classes/LAppModel.hpp | 5 +- .../src/CubismDirectXRenderer.cpp | 4 +- .../src/CubismDirectXView.cpp | 12 +- .../src/CubismDirectXView.hpp | 5 +- .../src/CubismUserModelExtend.cpp | 4 +- .../src/CubismUserModelExtend.hpp | 4 +- .../Demo/proj.d3d11.cmake/src/LAppDefine.cpp | 12 - .../Demo/proj.d3d11.cmake/src/LAppDefine.hpp | 3 - .../proj.d3d11.cmake/src/LAppDelegate.cpp | 2 +- .../src/LAppLive2DManager.cpp | 78 +- .../src/LAppLive2DManager.hpp | 30 +- .../Demo/proj.d3d11.cmake/src/LAppModel.cpp | 4 +- .../Demo/proj.d3d11.cmake/src/LAppModel.hpp | 7 +- .../Demo/proj.d3d11.cmake/src/LAppView.cpp | 12 +- .../Demo/proj.d3d11.cmake/src/LAppView.hpp | 4 +- Samples/D3D11/README.ja.md | 2 +- Samples/D3D11/README.md | 2 +- .../thirdParty/scripts/setup_msvc2019.bat | 2 +- .../proj.d3d9.cmake/src/CubismDirectXView.cpp | 14 +- .../proj.d3d9.cmake/src/CubismDirectXView.hpp | 5 +- .../src/CubismUserModelExtend.cpp | 6 +- .../src/CubismUserModelExtend.hpp | 4 +- .../Demo/proj.d3d9.cmake/src/LAppDefine.cpp | 12 - .../Demo/proj.d3d9.cmake/src/LAppDefine.hpp | 3 - .../proj.d3d9.cmake/src/LAppLive2DManager.cpp | 76 +- .../proj.d3d9.cmake/src/LAppLive2DManager.hpp | 32 +- .../Demo/proj.d3d9.cmake/src/LAppModel.cpp | 6 +- .../Demo/proj.d3d9.cmake/src/LAppModel.hpp | 7 +- .../Demo/proj.d3d9.cmake/src/LAppView.cpp | 10 +- .../Demo/proj.d3d9.cmake/src/LAppView.hpp | 2 +- .../Demo/proj.ios.cmake/src/LAppDefine.h | 3 - .../Demo/proj.ios.cmake/src/LAppDefine.mm | 12 - .../proj.ios.cmake/src/LAppLive2DManager.h | 10 +- .../proj.ios.cmake/src/LAppLive2DManager.mm | 75 +- .../Metal/Demo/proj.ios.cmake/src/LAppModel.h | 4 +- .../Demo/proj.ios.cmake/src/LAppModel.mm | 38 +- Samples/Metal/README.ja.md | 4 +- Samples/Metal/README.md | 4 +- .../Full/app/src/main/cpp/JniBridgeC.cpp | 23 +- .../Full/app/src/main/cpp/JniBridgeC.hpp | 10 +- .../Full/app/src/main/cpp/LAppDefine.cpp | 12 - .../Full/app/src/main/cpp/LAppDefine.hpp | 3 - .../app/src/main/cpp/LAppLive2DManager.cpp | 49 +- .../app/src/main/cpp/LAppLive2DManager.hpp | 9 + .../Full/app/src/main/cpp/LAppModel.cpp | 4 +- .../Full/app/src/main/cpp/LAppModel.hpp | 7 +- .../Full/app/src/main/cpp/LAppView.cpp | 8 +- .../Full/app/src/main/cpp/LAppView.hpp | 2 +- .../java/com/live2d/demo/JniBridgeJava.java | 9 + .../Minimum/app/src/main/cpp/LAppDefine.cpp | 3 +- .../app/src/main/cpp/LAppMinimumModel.cpp | 2 +- .../app/src/main/cpp/LAppMinimumModel.hpp | 7 +- .../app/src/main/cpp/LAppMinimumView.cpp | 8 +- .../app/src/main/cpp/LAppMinimumView.hpp | 2 +- .../Demo/proj.ios.cmake/src/LAppDefine.h | 3 - .../Demo/proj.ios.cmake/src/LAppDefine.mm | 12 - .../proj.ios.cmake/src/LAppLive2DManager.h | 9 + .../proj.ios.cmake/src/LAppLive2DManager.mm | 66 +- .../Demo/proj.ios.cmake/src/LAppModel.h | 4 +- .../Demo/proj.ios.cmake/src/LAppModel.mm | 4 +- .../Demo/proj.ios.cmake/src/ViewController.h | 2 +- .../Demo/proj.ios.cmake/src/ViewController.mm | 12 +- .../proj.ios.cmake/src/minimum/MinLAppModel.h | 4 +- .../src/minimum/MinLAppModel.mm | 4 +- .../src/minimum/MinViewController.h | 2 +- .../src/minimum/MinViewController.mm | 12 +- .../Demo/proj.linux.cmake/src/LAppDefine.cpp | 12 - .../Demo/proj.linux.cmake/src/LAppDefine.hpp | 3 - .../src/LAppLive2DManager.cpp | 88 +- .../src/LAppLive2DManager.hpp | 26 +- .../Demo/proj.linux.cmake/src/LAppModel.cpp | 4 +- .../Demo/proj.linux.cmake/src/LAppModel.hpp | 7 +- .../Demo/proj.linux.cmake/src/LAppView.cpp | 8 +- .../Demo/proj.linux.cmake/src/LAppView.hpp | 2 +- .../Demo/proj.mac.cmake/src/LAppDefine.cpp | 12 - .../Demo/proj.mac.cmake/src/LAppDefine.hpp | 3 - .../proj.mac.cmake/src/LAppLive2DManager.cpp | 90 +- .../proj.mac.cmake/src/LAppLive2DManager.hpp | 20 + .../Demo/proj.mac.cmake/src/LAppModel.cpp | 4 +- .../Demo/proj.mac.cmake/src/LAppModel.hpp | 7 +- .../Demo/proj.mac.cmake/src/LAppView.cpp | 8 +- .../Demo/proj.mac.cmake/src/LAppView.hpp | 2 +- .../Demo/proj.win.cmake/src/LAppDefine.cpp | 12 - .../Demo/proj.win.cmake/src/LAppDefine.hpp | 3 - .../proj.win.cmake/src/LAppLive2DManager.cpp | 74 +- .../proj.win.cmake/src/LAppLive2DManager.hpp | 26 +- .../Demo/proj.win.cmake/src/LAppModel.cpp | 4 +- .../Demo/proj.win.cmake/src/LAppModel.hpp | 7 +- .../Demo/proj.win.cmake/src/LAppView.cpp | 8 +- .../Demo/proj.win.cmake/src/LAppView.hpp | 2 +- Samples/OpenGL/README.ja.md | 2 +- Samples/OpenGL/README.md | 2 +- .../OpenGL/thirdParty/scripts/setup_ios_cmake | 2 +- .../Resources/Wanko/Wanko.1024/texture_00.png | Bin 0 -> 566299 bytes Samples/Resources/Wanko/Wanko.cdi3.json | 261 ++++++ Samples/Resources/Wanko/Wanko.moc3 | Bin 0 -> 107456 bytes Samples/Resources/Wanko/Wanko.model3.json | 55 ++ Samples/Resources/Wanko/Wanko.physics3.json | 373 ++++++++ .../Wanko/motions/idle_01.motion3.json | 699 ++++++++++++++ .../Wanko/motions/idle_02.motion3.json | 818 +++++++++++++++++ .../Wanko/motions/idle_03.motion3.json | 783 ++++++++++++++++ .../Wanko/motions/idle_04.motion3.json | 636 +++++++++++++ .../Wanko/motions/shake_01.motion3.json | 748 +++++++++++++++ .../Wanko/motions/shake_02.motion3.json | 867 ++++++++++++++++++ .../Wanko/motions/touch_01.motion3.json | 594 ++++++++++++ .../Wanko/motions/touch_02.motion3.json | 699 ++++++++++++++ .../Wanko/motions/touch_03.motion3.json | 643 +++++++++++++ .../Wanko/motions/touch_04.motion3.json | 615 +++++++++++++ .../Wanko/motions/touch_05.motion3.json | 510 +++++++++++ .../Wanko/motions/touch_06.motion3.json | 720 +++++++++++++++ Samples/Vulkan/.editorconfig | 2 + .../Vulkan/Demo/proj.win.cmake/CMakeLists.txt | 175 ++++ .../proj.win.cmake/scripts/_msvc_common.bat | 108 +++ .../proj.win.cmake/scripts/nmake_msvc2019.bat | 19 + .../proj.win.cmake/scripts/nmake_msvc2022.bat | 19 + .../proj.win.cmake/scripts/proj_msvc2019.bat | 19 + .../proj.win.cmake/scripts/proj_msvc2022.bat | 19 + .../Demo/proj.win.cmake/src/CMakeLists.txt | 30 + .../Demo/proj.win.cmake/src/LAppAllocator.cpp | 54 ++ .../Demo/proj.win.cmake/src/LAppAllocator.hpp | 52 ++ .../Demo/proj.win.cmake/src/LAppDefine.cpp | 65 ++ .../Demo/proj.win.cmake/src/LAppDefine.hpp | 63 ++ .../Demo/proj.win.cmake/src/LAppDelegate.cpp | 292 ++++++ .../Demo/proj.win.cmake/src/LAppDelegate.hpp | 151 +++ .../proj.win.cmake/src/LAppLive2DManager.cpp | 297 ++++++ .../proj.win.cmake/src/LAppLive2DManager.hpp | 131 +++ .../Demo/proj.win.cmake/src/LAppModel.cpp | 667 ++++++++++++++ .../Demo/proj.win.cmake/src/LAppModel.hpp | 199 ++++ .../Demo/proj.win.cmake/src/LAppPal.cpp | 93 ++ .../Demo/proj.win.cmake/src/LAppPal.hpp | 77 ++ .../Demo/proj.win.cmake/src/LAppSprite.cpp | 269 ++++++ .../Demo/proj.win.cmake/src/LAppSprite.hpp | 183 ++++ .../proj.win.cmake/src/LAppTextureManager.cpp | 323 +++++++ .../proj.win.cmake/src/LAppTextureManager.hpp | 150 +++ .../Demo/proj.win.cmake/src/LAppView.cpp | 691 ++++++++++++++ .../Demo/proj.win.cmake/src/LAppView.hpp | 234 +++++ .../proj.win.cmake/src/LAppWavFileHandler.cpp | 233 +++++ .../proj.win.cmake/src/LAppWavFileHandler.hpp | 188 ++++ .../proj.win.cmake/src/SwapchainManager.cpp | 270 ++++++ .../proj.win.cmake/src/SwapchainManager.hpp | 164 ++++ .../Demo/proj.win.cmake/src/TouchManager.cpp | 97 ++ .../Demo/proj.win.cmake/src/TouchManager.hpp | 102 +++ .../Demo/proj.win.cmake/src/VulkanManager.cpp | 527 +++++++++++ .../Demo/proj.win.cmake/src/VulkanManager.hpp | 262 ++++++ .../Vulkan/Demo/proj.win.cmake/src/main.cpp | 22 + Samples/Vulkan/README.md | 73 ++ Samples/Vulkan/Shaders/CMakeLists.txt | 30 + Samples/Vulkan/Shaders/src/FragSprite.frag | 19 + Samples/Vulkan/Shaders/src/VertSprite.vert | 14 + Samples/Vulkan/Shaders/src/common.glsl | 10 + 168 files changed, 16733 insertions(+), 456 deletions(-) create mode 100644 Samples/Cocos2d-x/Demo/Classes/LAppLive2DManagerInternal.cpp create mode 100644 Samples/Cocos2d-x/Demo/Classes/LAppLive2DManagerInternal.h create mode 100644 Samples/Resources/Wanko/Wanko.1024/texture_00.png create mode 100644 Samples/Resources/Wanko/Wanko.cdi3.json create mode 100644 Samples/Resources/Wanko/Wanko.moc3 create mode 100644 Samples/Resources/Wanko/Wanko.model3.json create mode 100644 Samples/Resources/Wanko/Wanko.physics3.json create mode 100644 Samples/Resources/Wanko/motions/idle_01.motion3.json create mode 100644 Samples/Resources/Wanko/motions/idle_02.motion3.json create mode 100644 Samples/Resources/Wanko/motions/idle_03.motion3.json create mode 100644 Samples/Resources/Wanko/motions/idle_04.motion3.json create mode 100644 Samples/Resources/Wanko/motions/shake_01.motion3.json create mode 100644 Samples/Resources/Wanko/motions/shake_02.motion3.json create mode 100644 Samples/Resources/Wanko/motions/touch_01.motion3.json create mode 100644 Samples/Resources/Wanko/motions/touch_02.motion3.json create mode 100644 Samples/Resources/Wanko/motions/touch_03.motion3.json create mode 100644 Samples/Resources/Wanko/motions/touch_04.motion3.json create mode 100644 Samples/Resources/Wanko/motions/touch_05.motion3.json create mode 100644 Samples/Resources/Wanko/motions/touch_06.motion3.json create mode 100644 Samples/Vulkan/.editorconfig create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/CMakeLists.txt create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/scripts/_msvc_common.bat create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/scripts/nmake_msvc2019.bat create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/scripts/nmake_msvc2022.bat create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/scripts/proj_msvc2019.bat create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/scripts/proj_msvc2022.bat create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/CMakeLists.txt create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppAllocator.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppAllocator.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppDefine.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppDefine.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppDelegate.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppDelegate.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppLive2DManager.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppLive2DManager.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppModel.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppModel.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppPal.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppPal.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppSprite.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppSprite.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppTextureManager.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppTextureManager.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppView.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppView.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppWavFileHandler.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/LAppWavFileHandler.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/SwapchainManager.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/SwapchainManager.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/TouchManager.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/TouchManager.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/VulkanManager.cpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/VulkanManager.hpp create mode 100644 Samples/Vulkan/Demo/proj.win.cmake/src/main.cpp create mode 100644 Samples/Vulkan/README.md create mode 100644 Samples/Vulkan/Shaders/CMakeLists.txt create mode 100644 Samples/Vulkan/Shaders/src/FragSprite.frag create mode 100644 Samples/Vulkan/Shaders/src/VertSprite.vert create mode 100644 Samples/Vulkan/Shaders/src/common.glsl diff --git a/.editorconfig b/.editorconfig index ebecac79..8b68d775 100644 --- a/.editorconfig +++ b/.editorconfig @@ -22,3 +22,6 @@ end_of_line = crlf [*.bat] charset = unset + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index 2946fc0a..2958703e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ !/Samples/**/thirdParty/scripts/* !/Samples/OpenGL/thirdParty/stb/* !/Samples/Metal/thirdParty/stb/* +!/Samples/Vulkan/thirdParty/stb/* # Other files /build/ .vs/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f2559a7..03989b29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,24 @@ 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-beta.1] - 2023-08-17 + +### Added + +* Add Wankoromochi as a model bundled with SDK. +* Add the sample for Vulkan API in Windows. + +### Changed + +* Update third-party libraries. +* Offscreen drawing-related terminology has been unified with "OffscreenSurface". +* Adjusted to automatically search and use models in the Resource folder. + +### Fixed + +* Fix a bug that premultiplied alpha not works correctly when `PREMULTIPLIED_ALPHA_ENABLE` is not defined in Metal. + + ## [4-r.7] - 2023-05-25 ### Added @@ -305,6 +323,7 @@ See [Core Changelog] for details. * What was `Package.json` is currently being changed to`cubism-info.yml`. +[5-r.1-beta.1]: https://github.com/Live2D/CubismNativeSamples/compare/4-r.7...5-r.1-beta.1 [4-r.7]: https://github.com/Live2D/CubismNativeSamples/compare/4-r.6.2...4-r.7 [4-r.6.2]: https://github.com/Live2D/CubismNativeSamples/compare/4-r.6.1...4-r.6.2 [4-r.6.1]: https://github.com/Live2D/CubismNativeSamples/compare/4-r.6...4-r.6.1 diff --git a/Core/CHANGELOG.md b/Core/CHANGELOG.md index fc5b1774..3ca60c49 100644 --- a/Core/CHANGELOG.md +++ b/Core/CHANGELOG.md @@ -4,6 +4,26 @@ 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/). + +## 2023-08-17 + +### Added + +* Enhance Blend Shape features. + * Please see [here](https://docs.live2d.com/en/cubism-editor-manual/blend-shape/). + +### Changed + +* Upgrade Core version to 05.00.0000. + + +## 2023-05-09 + +### Changed + +* Change the GCC version of the library for Linux from 6.5.0 to 8.3.0. + + ## 2023-03-16 ### Fixed diff --git a/Framework b/Framework index 3ad80ca2..34abc7dd 160000 --- a/Framework +++ b/Framework @@ -1 +1 @@ -Subproject commit 3ad80ca2bc5e4b058aea150e309a5aec5e62a9f2 +Subproject commit 34abc7dda3fd92fc3590eb739046ff8eaa105fbe diff --git a/LICENSE.md b/LICENSE.md index a23ae856..a89a0c0e 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -55,6 +55,7 @@ Samples/Resources/Mao Samples/Resources/Mark Samples/Resources/Natori Samples/Resources/Rice +Samples/Resources/Wanko ``` If you use these models, you must agree to the terms of a contract set [here](https://docs.live2d.com/cubism-editor-manual/sample-model/) for each model. diff --git a/NOTICE.ja.md b/NOTICE.ja.md index 08d20df1..a711c6bd 100644 --- a/NOTICE.ja.md +++ b/NOTICE.ja.md @@ -4,6 +4,12 @@ # お知らせ +## [注意事項] iOSにおけるMetalとOpenGLの描画差異について (2023-08-17) + +以前から発生していたMetalとOpenGLの描画差異について、macOSでの描画差異はCubism 5 SDK for Native R1 Beta1 (5-r.1-beta.1)にて解消いたしました。 +iOSでの描画差異は今後のアップデートにて対応する予定です。 + + ## [注意事項] Cocos2d-xセットアップのエラーについて (2022-03-15) Cocos2d-xサンプルプロジェクトのセットアップ時に実行するsetup-cocos2dバッチにおいてエラーが発生いたします。 diff --git a/NOTICE.md b/NOTICE.md index e2539415..ab9881c0 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -4,6 +4,12 @@ # Notices +## [Caution] Differences between Metal and OpenGL rendering on iOS (2023-08-17) + +The rendering differences between Metal and OpenGL that have been occurring for some time have been resolved in Cubism 5 SDK for Native R1 Beta1 (5-r.1-beta.1) for macOS. +The rendering difference on iOS will be addressed in a future update. + + ## [Caution] About Cocos2d-x setup error (2022-03-15) An error occurs in the setup-cocos2d batch that is executed when setting up the Cocos2d-x sample project. diff --git a/README.ja.md b/README.ja.md index f5ad4f39..29289dd8 100644 --- a/README.ja.md +++ b/README.ja.md @@ -6,7 +6,7 @@ # Cubism Native Samples -Live2D Cubism 4 Editor で出力したモデルを表示するアプリケーションのサンプル実装です。 +Live2D Cubism Editor で出力したモデルを表示するアプリケーションのサンプル実装です。 Cubism Native Framework および Live2D Cubism Core と組み合わせて使用します。 @@ -21,6 +21,13 @@ Cubism Native Framework および Live2D Cubism Core と組み合わせて使用 本 SDK を使用する前に [お知らせ](NOTICE.ja.md)をご確認ください。 +## Cubism 5新機能や過去バージョンとの互換性について + +本 SDK はCubism 5に対応した製品です。 +Cubism 5 Editorに搭載された新機能のSDK対応については [こちら](https://docs.live2d.com/cubism-sdk-manual/cubism-5-new-functions/)をご確認ください。 +過去バージョンのCubism SDKとの互換性については [こちら](https://docs.live2d.com/cubism-sdk-manual/compatibility-with-cubism-5/)をご確認ください。 + + ## ディレクトリ構成 ``` @@ -33,6 +40,7 @@ Cubism Native Framework および Live2D Cubism Core と組み合わせて使用 ├─ D3D11 # DirectX 11 のサンプルプロジェクトが含まれるディレクトリ ├─ Metal # Metal のサンプルプロジェクトが含まれるディレクトリ ├─ OpenGL # OpenGL のサンプルプロジェクトが含まれるディレクトリ + ├─ Vulkan # Vulkan のサンプルプロジェクトが含まれるディレクトリ └─ Resources # モデルのファイルや画像などのリソースが含まれるディレクトリ ``` @@ -99,21 +107,21 @@ Demo | 開発ツール | バージョン | | --- | --- | -| Android Studio | Flamingo 2022.2.1 Patch 1 | -| CMake | 3.26.3 | +| Android Studio | Giraffe 2022.3.1 | +| CMake | 3.27.1 | | Visual Studio 2013 | Update 5 | | Visual Studio 2015 | Update 3 | -| Visual Studio 2017 | 15.9.54 | -| Visual Studio 2019 | 16.11.26 | -| Visual Studio 2022 | 17.5.5 | -| XCode | 14.3 | +| Visual Studio 2017 | 15.9.56 | +| Visual Studio 2019 | 16.11.29 | +| Visual Studio 2022 | 17.7.0 | +| XCode | 14.3.1 | ### Android | Android SDK tools | バージョン | | --- | --- | | Android NDK | 25.2.9519653 | -| Android SDK | 33.0.2 | +| Android SDK | 34.0.0 | | CMake | 3.22.1 | ### Linux @@ -125,7 +133,7 @@ Demo | Red Hat | CentOS Stream 8 *1 | `centos:latest` | 8.5.0 | | Red Hat | CentOS Stream 9 | - | 11.3.1 | | Debian | Ubuntu 18.04 | `ubuntu:18.04` | 7.5.0 | -| Debian | Ubuntu 22.04.2 | `ubuntu:22.04.2` | 11.3.0 | +| Debian | Ubuntu 22.04.3 | `ubuntu:22.04.3` | 11.3.0 | *1 CentOS 8はサポートしておりません @@ -143,8 +151,8 @@ Demo | プラットフォーム | バージョン | | --- | --- | -| iOS / iPadOS | 16.4.1 | -| macOS | 13.3 | +| iOS / iPadOS | 16.6 | +| macOS | 13.5 | | Windows 10 | 22H2 | | Windows 11 | 22H2 | @@ -162,7 +170,7 @@ Demo | Red Hat | Amazon Linux | 2 | | Red Hat | CentOS Stream | 8 | | Red Hat | CentOS Stream | 9 | -| Debian | Ubuntu | 22.04.2 | +| Debian | Ubuntu | 22.04.3 | ## プロジェクトへの貢献 diff --git a/README.md b/README.md index 03cddf6e..90ea06ed 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ # Cubism Native Samples -This is a sample implementation of an application that displays models output by Live2D Cubism 4 Editor. +This is a sample implementation of an application that displays models output by Live2D Cubism Editor. It is used in conjunction with Cubism Native Framework and Live2D Cubism Core. @@ -21,6 +21,13 @@ Please check the [license](LICENSE.md) before using this SDK. Please check the [notices](NOTICE.md) before using this SDK. +## Compatibility with Cubism 5 new features and previous Cubism SDK versions + +This SDK is compatible with Cubism 5. +For SDK compatibility with new features in Cubism 5 Editor, please refer to [here](https://docs.live2d.com/en/cubism-sdk-manual/cubism-5-new-functions/). +For compatibility with previous versions of Cubism SDK, please refer to [here](https://docs.live2d.com/en/cubism-sdk-manual/compatibility-with-cubism-5/). + + ## Directory structure ``` @@ -33,6 +40,7 @@ Please check the [notices](NOTICE.md) before using this SDK. ├─ D3D11 # Directory containing the DirectX 11 sample project ├─ Metal # Directory containing the Metal sample project ├─ OpenGL # Directory containing the OpenGL sample project + ├─ Vulkan # Directory containing the Vulkan sample project └─ Resources # Directory containing resources such as model files and images ``` @@ -98,21 +106,21 @@ Please refer to [CHANGELOG.md](CHANGELOG.md) for the changelog of this repositor | Development Tool | Version | | --- | --- | -| Android Studio | Flamingo 2022.2.1 Patch 1 | -| CMake | 3.26.3 | +| Android Studio | Giraffe 2022.3.1 | +| CMake | 3.27.1 | | Visual Studio 2013 | Update 5 | | Visual Studio 2015 | Update 3 | -| Visual Studio 2017 | 15.9.54 | -| Visual Studio 2019 | 16.11.26 | -| Visual Studio 2022 | 17.5.5 | -| XCode | 14.3 | +| Visual Studio 2017 | 15.9.56 | +| Visual Studio 2019 | 16.11.29 | +| Visual Studio 2022 | 17.7.0 | +| XCode | 14.3.1 | ### Android | Android SDK tools | Version | | --- | --- | | Android NDK | 25.2.9519653 | -| Android SDK | 33.0.2 | +| Android SDK | 34.0.0 | | CMake | 3.22.1 | ### Linux @@ -124,7 +132,7 @@ Please refer to [CHANGELOG.md](CHANGELOG.md) for the changelog of this repositor | Red Hat | CentOS Stream 8 *1 | `centos:latest` | 8.5.0 | | Red Hat | CentOS Stream 9 | - | 11.3.1 | | Debian | Ubuntu 18.04 | `ubuntu:18.04` | 7.5.0 | -| Debian | Ubuntu 22.04.1 | `ubuntu:22.04.1` | 11.3.0 | +| Debian | Ubuntu 22.04.3 | `ubuntu:22.04.3` | 11.3.0 | *1 CentOS 8 is not supported @@ -142,8 +150,8 @@ Please refer to [CHANGELOG.md](CHANGELOG.md) for the changelog of this repositor | Platform | Version | | --- | --- | -| iOS / iPadOS | 16.4.1 | -| macOS | 13.3 | +| iOS / iPadOS | 16.6 | +| macOS | 13.5 | | Windows 10 | 22H2 | | Windows 11 | 22H2 | @@ -161,7 +169,7 @@ Please refer to [CHANGELOG.md](CHANGELOG.md) for the changelog of this repositor | Red Hat | Amazon Linux | 2 | | Red Hat | CentOS Stream | 8 | | Red Hat | CentOS Stream | 9 | -| Debian | Ubuntu | 22.04.1 | +| Debian | Ubuntu | 22.04.3 | ## Contributing diff --git a/Samples/Cocos2d-x/Demo/CMakeLists.txt b/Samples/Cocos2d-x/Demo/CMakeLists.txt index c42671ab..2152daae 100644 --- a/Samples/Cocos2d-x/Demo/CMakeLists.txt +++ b/Samples/Cocos2d-x/Demo/CMakeLists.txt @@ -68,6 +68,7 @@ list(APPEND GAME_SOURCE ${CLASSES_PATH}/LAppView.cpp ${CLASSES_PATH}/SampleScene.cpp ${CLASSES_PATH}/TouchManager.cpp + ${CLASSES_PATH}/LAppLive2DManagerInternal.cpp ) list(APPEND GAME_HEADER @@ -82,6 +83,7 @@ list(APPEND GAME_HEADER ${CLASSES_PATH}/LAppView.hpp ${CLASSES_PATH}/SampleScene.h ${CLASSES_PATH}/TouchManager.h + ${CLASSES_PATH}/LAppLive2DManagerInternal.h ) # Add Cubism Core as static library. @@ -248,6 +250,7 @@ if(APPLE) set_target_properties(${APP_NAME} PROPERTIES RESOURCE "${APP_UI_RES}") if(MACOSX) set_xcode_property(${APP_NAME} INFOPLIST_FILE "${COCOS2DX_ROOT_PATH}/templates/cpp-template-default/proj.ios_mac/mac/Info.plist") + target_compile_definitions(${APP_NAME} PRIVATE CSM_TARGET_MACOSX) target_compile_definitions(Framework PUBLIC CSM_TARGET_MAC_GL) set(COCOS_GLFW3 ${COCOS2DX_ROOT_PATH}/external/glfw3) target_include_directories(Framework PUBLIC ${COCOS_GLFW3}/include/Mac) @@ -262,6 +265,7 @@ if(APPLE) set_xcode_property(${APP_NAME} TARGETED_DEVICE_FAMILY "1,2") set_xcode_property(${APP_NAME} ONLY_ACTIVE_ARCH "NO") set_xcode_property(${APP_NAME} ARCHS "arm64") + target_compile_definitions(${APP_NAME} PRIVATE CSM_TARGET_IOS) target_compile_definitions(Framework PUBLIC CSM_TARGET_IPHONE_ES2) target_include_directories(Framework PUBLIC ${COCOS2DX_ROOT_PATH}/cocos) endif() diff --git a/Samples/Cocos2d-x/Demo/Classes/LAppDefine.cpp b/Samples/Cocos2d-x/Demo/Classes/LAppDefine.cpp index d1ba80c3..07e23eb5 100644 --- a/Samples/Cocos2d-x/Demo/Classes/LAppDefine.cpp +++ b/Samples/Cocos2d-x/Demo/Classes/LAppDefine.cpp @@ -31,18 +31,6 @@ namespace LAppDefine { const csmChar* BackImageName = "back_class_normal.png"; // モデル定義------------------------------------------ - // モデルを配置したディレクトリ名の配列 - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと - const csmChar* ModelDir[] = { - "Haru", - "Hiyori", - "Mark", - "Natori", - "Rice", - "Mao" - }; - const csmInt32 ModelDirSize = sizeof(ModelDir) / sizeof(const csmChar*); - // 外部定義ファイル(json)と合わせる const csmChar* MotionGroupIdle = "Idle"; // アイドリング const csmChar* MotionGroupTapBody = "TapBody"; // 体をタップしたとき diff --git a/Samples/Cocos2d-x/Demo/Classes/LAppDefine.hpp b/Samples/Cocos2d-x/Demo/Classes/LAppDefine.hpp index 2777d883..79b0d791 100644 --- a/Samples/Cocos2d-x/Demo/Classes/LAppDefine.hpp +++ b/Samples/Cocos2d-x/Demo/Classes/LAppDefine.hpp @@ -34,9 +34,6 @@ namespace LAppDefine { extern const csmChar* BackImageName; ///< 背景画像ファイル // モデル定義-------------------------------------------- - extern const csmChar* ModelDir[]; ///< モデルを配置したディレクトリ名の配列. ディレクトリ名とmodel3.jsonの名前を一致させておく. - extern const csmInt32 ModelDirSize; ///< モデルディレクトリ配列のサイズ - // 外部定義ファイル(json)と合わせる extern const csmChar* MotionGroupIdle; ///< アイドリング時に再生するモーションのリスト extern const csmChar* MotionGroupTapBody; ///< 体をタップした時に再生するモーションのリスト diff --git a/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManager.cpp b/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManager.cpp index 8e99cc40..677205b9 100644 --- a/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManager.cpp +++ b/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManager.cpp @@ -5,22 +5,32 @@ * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. */ -//Cubism #include "SampleScene.h" +#include + +//cocos2d-x +#include "base/CCDirector.h" +#include "renderer/backend/Device.h" + +//Cubism #include "LAppLive2DManager.hpp" #include "LAppPal.hpp" #include "LAppDefine.hpp" #include "LAppView.hpp" #include "LAppSprite.hpp" -#include + +#if defined(_WIN32) +#include +#elif defined(CSM_TARGET_IOS) || defined(CSM_TARGET_MACOSX) || defined(__ANDROID__) +#include "LAppLive2DManagerInternal.h" +#else +#include +#endif + #ifdef CSM_TARGET_ANDROID_ES2 #include #endif -//cocos2d -#include "base/CCDirector.h" -#include "renderer/backend/Device.h" - using namespace Csm; using namespace LAppDefine; @@ -33,6 +43,12 @@ namespace { { LAppPal::PrintLog("Motion Finished: %x", self); } + + int CompareCsmString(const void* a, const void* b) + { + return strcmp(reinterpret_cast(a)->GetRawString(), + reinterpret_cast(b)->GetRawString()); + } } LAppLive2DManager* LAppLive2DManager::GetInstance() @@ -68,6 +84,7 @@ LAppLive2DManager::LAppLive2DManager() CubismFramework::Initialize(); CreateShader(); + SetUpModel(); int width = static_cast(cocos2d::Director::getInstance()->getOpenGLView()->getFrameSize().width); int height = static_cast(cocos2d::Director::getInstance()->getOpenGLView()->getFrameSize().height); @@ -78,7 +95,7 @@ LAppLive2DManager::LAppLive2DManager() _viewMatrix = new CubismMatrix44(); // 使用するターゲット - _renderBuffer = new Csm::Rendering::CubismOffscreenFrame_Cocos2dx; + _renderBuffer = new Csm::Rendering::CubismOffscreenSurface_Cocos2dx; if (_renderBuffer) {// 描画ターゲット作成 @@ -89,7 +106,7 @@ LAppLive2DManager::LAppLive2DManager() #endif // モデル描画キャンバス - _renderBuffer->CreateOffscreenFrame(static_cast(width), static_cast(height)); + _renderBuffer->CreateOffscreenSurface(static_cast(width), static_cast(height)); } #ifdef CSM_TARGET_ANDROID_ES2 @@ -106,7 +123,7 @@ LAppLive2DManager::~LAppLive2DManager() { if (_renderBuffer) { - _renderBuffer->DestroyOffscreenFrame(); + _renderBuffer->DestroyOffscreenSurface(); delete _renderBuffer; _renderBuffer = NULL; } @@ -158,7 +175,6 @@ void LAppLive2DManager::SetViewMatrix(Csm::CubismMatrix44* matrix) _viewMatrix = matrix; } - void LAppLive2DManager::OnDrag(csmFloat32 x, csmFloat32 y) const { for (csmUint32 i = 0; i < _models.GetSize(); i++) @@ -270,7 +286,7 @@ void LAppLive2DManager::OnUpdate(Csm::Rendering::CubismCommandBuffer_Cocos2dx* c void LAppLive2DManager::NextScene() { - csmInt32 no = (_sceneIndex + 1) % ModelDirSize; + csmInt32 no = (_sceneIndex + 1) % GetModelDirSize(); ChangeScene(no); } @@ -282,14 +298,17 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) // ModelDir[]に保持したディレクトリ名から // model3.jsonのパスを決定する. // ディレクトリ名とmodel3.jsonの名前を一致させておくこと. - std::string dir = ModelDir[index]; - dir += "/"; - std::string modelJsonName = ModelDir[index]; + const csmString& model = _modelDir[index]; + + csmString dir(model);; + dir.Append(1, '/'); + + csmString modelJsonName(model); modelJsonName += ".model3.json"; ReleaseAllModel(); _models.PushBack(new LAppModel()); - _models[0]->LoadAssets(dir.c_str(), modelJsonName.c_str()); + _models[0]->LoadAssets(dir.GetRawString(), modelJsonName.GetRawString()); /* * モデル半透明表示を行うサンプルを提示する。 @@ -311,7 +330,7 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) #if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) // モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす _models.PushBack(new LAppModel()); - _models[1]->LoadAssets(dir.c_str(), modelJsonName.c_str()); + _models[1]->LoadAssets(dir.GetRawString(), modelJsonName.GetRawString()); _models[1]->GetModelMatrix()->TranslateX(0.2f); #endif @@ -362,6 +381,90 @@ void LAppLive2DManager::CreateShader() } +void LAppLive2DManager::SetUpModel() +{ + _modelDir.Clear(); + + // ResourcesPathの中にあるフォルダ名を全てクロールし、モデルが存在するフォルダを定義する。 + // フォルダはあるが同名の.model3.jsonが見つからなかった場合はリストに含めない。 +#if defined(CSM_TARGET_IOS) || defined(CSM_TARGET_MACOSX) || defined(__ANDROID__) + LAppLive2DManagerInternal::SetUpModel(_modelDir); +#else + const csmString resourcePath(FileUtils::getInstance()->getDefaultResourceRootPath().c_str()); +#if defined(_WIN32) + struct _finddata_t fdata; + csmString crawlPath(resourcePath); + crawlPath += "*.*"; + + intptr_t fh = _findfirst(crawlPath.GetRawString(), &fdata); + if (fh == -1) return; + + while (_findnext(fh, &fdata) == 0) + { + if ((fdata.attrib & _A_SUBDIR) && strcmp(fdata.name, "..") != 0) + { + // フォルダと同名の.model3.jsonがあるか探索する + csmString modelName(fdata.name); + csmString model3jsonPath(resourcePath); + model3jsonPath += modelName; + model3jsonPath.Append(1, '/'); + model3jsonPath += modelName; + model3jsonPath += ".model3.json"; + + struct _finddata_t fdata2; + if (_findfirst(model3jsonPath.GetRawString(), &fdata2) != -1) + { + _modelDir.PushBack(csmString(fdata.name)); + } + } + } +#else + DIR* pDir = opendir(resourcePath.GetRawString()); + if (pDir == NULL) return; + + struct dirent* dirent; + while ((dirent = readdir(pDir)) != NULL) + { + if ((dirent->d_type & DT_DIR) && strcmp(dirent->d_name, "..") != 0) + { + // フォルダと同名の.model3.jsonがあるか探索する + csmString modelName(dirent->d_name); + csmString modelPath(resourcePath); + modelPath += modelName; + modelPath.Append(1, '/'); + + csmString model3jsonName(modelName); + model3jsonName += ".model3.json"; + + DIR* pDir2 = opendir(modelPath.GetRawString()); + + struct dirent* dirent2; + while ((dirent2 = readdir(pDir2)) != NULL) + { + if (strcmp(dirent2->d_name, model3jsonName.GetRawString()) == 0) + { + _modelDir.PushBack(csmString(dirent->d_name)); + } + } + closedir(pDir2); + } + } + closedir(pDir); +#endif +#endif + qsort(_modelDir.GetPtr(), _modelDir.GetSize(), sizeof(csmString), CompareCsmString); +} + +Csm::csmVector LAppLive2DManager::GetModelDir() const +{ + return _modelDir; +} + +Csm::csmInt32 LAppLive2DManager::GetModelDirSize() const +{ + return _modelDir.GetSize(); +} + void LAppLive2DManager::SetRenderTargetClearColor(float r, float g, float b) { _clearColor[0] = r; diff --git a/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManager.hpp b/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManager.hpp index 35ca5fff..754ae7de 100644 --- a/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManager.hpp +++ b/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManager.hpp @@ -141,15 +141,31 @@ class LAppLive2DManager */ void CreateShader(); - Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 + /** + * @brief Resources フォルダにあるモデルフォルダ名をセットする + */ + void SetUpModel(); + + /** + * @brief Resources フォルダにあるモデルフォルダ名を取得する + */ + Csm::csmVector GetModelDir() const; + + /** + * @brief Resources フォルダにあるモデルフォルダのサイズを取得する + */ + Csm::csmInt32 GetModelDirSize() const; + + Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 Csm::csmVector _models; ///< モデルインスタンスのコンテナ Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 // レンダリング先を別ターゲットにする方式の場合に使用 SelectTarget _renderTarget; ///< レンダリング先の選択肢 LAppSprite* _sprite; ///< テクスチャの単純描画クラス - Csm::Rendering::CubismOffscreenFrame_Cocos2dx* _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + Csm::Rendering::CubismOffscreenSurface_Cocos2dx* _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング float _clearColor[4]; ///< レンダリングターゲットのクリアカラー cocos2d::backend::Program* _program; + Csm::csmVector _modelDir; ///< モデルディレクトリ名のコンテナ }; diff --git a/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManagerInternal.cpp b/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManagerInternal.cpp new file mode 100644 index 00000000..24524235 --- /dev/null +++ b/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManagerInternal.cpp @@ -0,0 +1,208 @@ +/** + * 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. + */ + +#include "LAppLive2DManagerInternal.h" +#if defined(CSM_TARGET_IOS) || defined(CSM_TARGET_MACOSX) +#include +#elif defined(__ANDROID__) +#include +#include +#include "platform/android/jni/JniHelper.h" +#endif + + +namespace +{ +#if defined(CSM_TARGET_IOS) || defined(CSM_TARGET_MACOSX) +inline Csm::csmString GetPath(CFURLRef url) +{ + CFStringRef cfstr = CFURLCopyFileSystemPath(url, CFURLPathStyle::kCFURLPOSIXPathStyle); + CFIndex size = CFStringGetLength(cfstr) * 4 + 1; // Length * UTF-16 Max Character size + null-terminated-byte + char* buf = new char[size]; + CFStringGetCString(cfstr, buf, size, CFStringBuiltInEncodings::kCFStringEncodingUTF8); + Csm::csmString result(buf); + delete[] buf; + return result; +} +#elif defined(__ANDROID__) +// jobject, jstring +template +class ScopedJObject { +public: + ScopedJObject(JNIEnv* env, T ptr); + ScopedJObject(const ScopedJObject&) = delete; + ScopedJObject(ScopedJObject&& move) = default; + ScopedJObject& operator= (const ScopedJObject&) = delete; + ScopedJObject& operator= (ScopedJObject&&) = default; + ~ScopedJObject(); + inline JNIEnv* env() + { + return _env; + } + inline const T& get() + { + return _ptr; + } + inline void reset(T ptr = nullptr) + { + if (_ptr != nullptr) + { + _env->DeleteLocalRef(_ptr); + } + _ptr = ptr; + } +private: + JNIEnv* _env; + T _ptr = nullptr; +}; + +class JniContext; +class JniAssetManager; + +template +ScopedJObject::ScopedJObject(JNIEnv* env, T ptr) + : _env(env) + , _ptr(ptr) +{ +} +template +ScopedJObject::~ScopedJObject() +{ + if (_ptr != nullptr) + { + _env->DeleteLocalRef(_ptr); + } +} + +class JniContext +{ +public: + JniContext() = delete; + JniContext(const JniContext&) = delete; + JniContext(JniContext&&) = default; + JniContext& operator= (const JniContext&) = delete; + JniContext& operator= (JniContext&&) = default; + JniAssetManager getAssets(); + static JniContext GetContext(JNIEnv* env); + +private: + JniContext(JNIEnv* env, jobject obj); + + ScopedJObject obj; + jmethodID method_getAssets; +}; + +class JniAssetManager +{ +public: + JniAssetManager() = delete; + JniAssetManager(JNIEnv* env, jobject assetManager); + JniAssetManager(const JniAssetManager&) = delete; + JniAssetManager(JniAssetManager&&) = default; + JniAssetManager& operator= (const JniAssetManager&) = delete; + JniAssetManager& operator= (JniAssetManager&&) = default; + + jobjectArray list(jstring path); + Csm::csmVector list(const char* path); + +private: + ScopedJObject obj; + jmethodID method_list; +}; + +JniContext::JniContext(JNIEnv* env, jobject context) + : obj(env, context) + , method_getAssets(env->GetMethodID(env->GetObjectClass(context), "getAssets", "()Landroid/content/res/AssetManager;")) +{ +} + +JniAssetManager JniContext::getAssets() +{ + return JniAssetManager(obj.env(), obj.env()->CallObjectMethod(obj.get(), method_getAssets)); +} + +JniContext JniContext::GetContext(JNIEnv* env) +{ + cocos2d::JniMethodInfo getContext; + cocos2d::JniHelper::getStaticMethodInfo(getContext, "org/cocos2dx/lib/Cocos2dxActivity", "getContext", "()Landroid/content/Context;"); + return JniContext(env, env->CallStaticObjectMethod(getContext.classID, getContext.methodID)); +} + +JniAssetManager::JniAssetManager(JNIEnv* env, jobject assetManager) + : obj(env, assetManager) + , method_list(env->GetMethodID(env->GetObjectClass(assetManager), u8"list", u8"(Ljava/lang/String;)[Ljava/lang/String;")) +{ +} + +Csm::csmVector JniAssetManager::list(const char* path) +{ + JNIEnv* env = obj.env(); + ScopedJObject jstr(env, env->NewStringUTF(path)); + jobjectArray files = (jobjectArray)env->CallObjectMethod(obj.get(), method_list, jstr.get()); + int length = env->GetArrayLength(files); + Csm::csmVector list(length); + for (int i = 0; i < length; i++) + { + ScopedJObject jstr(env, reinterpret_cast(env->GetObjectArrayElement(files, i))); + const char* jchars = env->GetStringUTFChars(jstr.get(), nullptr); + list.PushBack(Csm::csmString(jchars)); + env->ReleaseStringUTFChars(jstr.get(), jchars); + } + return list; +} +#endif +} +namespace LAppLive2DManagerInternal { +#if defined(CSM_TARGET_IOS) || defined(CSM_TARGET_MACOSX) +void SetUpModel(Csm::csmVector& dst) +{ + CFBundleRef mainBundle = CFBundleGetMainBundle(); + CFURLRef rootUrl = CFBundleCopyResourcesDirectoryURL(mainBundle); +#if defined(CSM_TARGET_MACOSX) + rootUrl = CFURLCopyAbsoluteURL(rootUrl); +#endif + Csm::csmString rootPath(GetPath(rootUrl)); + rootPath.Append(1, '/'); + { + CFArrayRef arr = CFBundleCreateBundlesFromDirectory(NULL, rootUrl, NULL); + CFIndex count = CFArrayGetCount(arr); + for (CFIndex i = 0; i < count; i++) + { + CFBundleRef item = (CFBundleRef)CFArrayGetValueAtIndex(arr, i); + CFURLRef itemDirUrl = CFBundleCopyResourcesDirectoryURL(item); + CFArrayRef model3json = CFBundleCopyResourceURLsOfType(item, CFSTR(".model3.json"), NULL); + if (CFArrayGetCount(model3json) == 1) + { + Csm::csmString itemDirPath(GetPath(itemDirUrl)); + dst.PushBack(Csm::csmString(itemDirPath.GetRawString() + rootPath.GetLength())); + } + } + } +} +#elif defined(__ANDROID__) +void SetUpModel(Csm::csmVector& dst) +{ + JniContext cxtObj = JniContext::GetContext(cocos2d::JniHelper::getEnv()); + JniAssetManager assetManager = cxtObj.getAssets(); + Csm::csmVector root = assetManager.list(""); + for (int i = 0; i < root.GetSize(); i++) + { + Csm::csmVector files = assetManager.list(root[i].GetRawString()); + Csm::csmString target(root[i]); + target += ".model3.json"; + for (int j = 0; j < files.GetSize(); j++) + { + if (target == files[j]) + { + dst.PushBack(root[i]); + break; + } + } + } +} +#endif +} diff --git a/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManagerInternal.h b/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManagerInternal.h new file mode 100644 index 00000000..4287f4d1 --- /dev/null +++ b/Samples/Cocos2d-x/Demo/Classes/LAppLive2DManagerInternal.h @@ -0,0 +1,16 @@ +/** + * 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. + */ + +#pragma once +#if defined(CSM_TARGET_IOS) || defined(CSM_TARGET_MACOSX) || defined(__ANDROID__) +#include +#include +namespace LAppLive2DManagerInternal +{ + void SetUpModel(Csm::csmVector& dst); +} +#endif diff --git a/Samples/Cocos2d-x/Demo/Classes/LAppModel.cpp b/Samples/Cocos2d-x/Demo/Classes/LAppModel.cpp index d9b295ff..bad52b36 100644 --- a/Samples/Cocos2d-x/Demo/Classes/LAppModel.cpp +++ b/Samples/Cocos2d-x/Demo/Classes/LAppModel.cpp @@ -84,7 +84,7 @@ LAppModel::LAppModel() _clearColor[2] = 1.0f; _clearColor[3] = 0.0f; - _renderBuffer = new Csm::Rendering::CubismOffscreenFrame_Cocos2dx; + _renderBuffer = new Csm::Rendering::CubismOffscreenSurface_Cocos2dx; _groupCommand.init(0.0); } @@ -99,7 +99,7 @@ LAppModel::~LAppModel() _renderSprite->removeFromParentAndCleanup(true); _renderSprite = NULL; } - _renderBuffer->DestroyOffscreenFrame(); + _renderBuffer->DestroyOffscreenSurface(); delete _renderBuffer; ReleaseMotions(); @@ -815,7 +815,7 @@ void LAppModel::MakeRenderingTarget() ); // レンダリングバッファの描画先をそのテクスチャにする - _renderBuffer->CreateOffscreenFrame(frameW, frameH, _renderSprite); + _renderBuffer->CreateOffscreenSurface(frameW, frameH, _renderSprite); } } diff --git a/Samples/Cocos2d-x/Demo/Classes/LAppModel.hpp b/Samples/Cocos2d-x/Demo/Classes/LAppModel.hpp index 15ea8e3a..46d32349 100644 --- a/Samples/Cocos2d-x/Demo/Classes/LAppModel.hpp +++ b/Samples/Cocos2d-x/Demo/Classes/LAppModel.hpp @@ -210,12 +210,9 @@ class LAppModel : public Csm::CubismUserModel const Csm::CubismId* _idParamEyeBallX; ///< パラメータID: ParamEyeBallX const Csm::CubismId* _idParamEyeBallY; ///< パラメータID: ParamEyeBallXY - Csm::Rendering::CubismOffscreenFrame_Cocos2dx* _renderBuffer; ///< モードによってはCubismOffscreenFrameのテクスチャを描画 + Csm::Rendering::CubismOffscreenSurface_Cocos2dx* _renderBuffer; ///< モードによってはCubismOffscreenSurfaceのテクスチャを描画 cocos2d::RenderTexture* _renderSprite; ///< _renderBufferを描画するスプライト float _clearColor[4]; ///< _renderBufferをクリアする際の色 Csm::csmVector _loadedTextures; cocos2d::GroupCommand _groupCommand; }; - - - diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXRenderer.cpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXRenderer.cpp index 314602a8..0e9ea49d 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXRenderer.cpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXRenderer.cpp @@ -497,10 +497,10 @@ void CubismDirectXRenderer::ResizeDevice(CubismUserModel* userModel) // パラメータ、スプライトサイズなど再設定 CubismDirectXView::GetInstance()->Initialize(); CubismDirectXView::GetInstance()->ResizeSprite(); - CubismDirectXView::GetInstance()->DestroyOffscreenFrame(); + CubismDirectXView::GetInstance()->DestroyOffscreenSurface(); } - static_cast(userModel)->GetRenderBuffer().DestroyOffscreenFrame(); + static_cast(userModel)->GetRenderBuffer().DestroyOffscreenSurface(); // 通常に戻る _deviceStep = DeviceStep_None; diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXView.cpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXView.cpp index b7f34f94..cc8690ee 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXView.cpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXView.cpp @@ -42,7 +42,7 @@ CubismDirectXView::CubismDirectXView() CubismDirectXView::~CubismDirectXView() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); delete _renderSprite; delete _deviceToScreen; @@ -143,7 +143,7 @@ float CubismDirectXView::TransformScreenY(float deviceY) const void CubismDirectXView::PreModelDraw(CubismUserModelExtend& refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_D3D11* useTarget = nullptr; + Csm::Rendering::CubismOffscreenSurface_D3D11* useTarget = nullptr; if (_renderTarget != SelectTarget_None) { @@ -159,7 +159,7 @@ void CubismDirectXView::PreModelDraw(CubismUserModelExtend& refModel) if (_windowWidth != 0 && _windowHeight != 0) { // モデル描画キャンバス - useTarget->CreateOffscreenFrame(CubismDirectXRenderer::GetInstance()->GetD3dDevice(), + useTarget->CreateOffscreenSurface(CubismDirectXRenderer::GetInstance()->GetD3dDevice(), static_cast(_windowWidth), static_cast(_windowHeight)); } } @@ -173,7 +173,7 @@ void CubismDirectXView::PreModelDraw(CubismUserModelExtend& refModel) void CubismDirectXView::PostModelDraw(CubismUserModelExtend& refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_D3D11* useTarget = nullptr; + Csm::Rendering::CubismOffscreenSurface_D3D11* useTarget = nullptr; if (_renderTarget != SelectTarget_None) { @@ -224,7 +224,7 @@ void CubismDirectXView::SetRenderTargetClearColor(float r, float g, float b) _clearColor[2] = b; } -void CubismDirectXView::DestroyOffscreenFrame() +void CubismDirectXView::DestroyOffscreenSurface() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); } diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXView.hpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXView.hpp index 439e827a..5c1db4a7 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXView.hpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismDirectXView.hpp @@ -131,7 +131,7 @@ class CubismDirectXView /** * @brief 内部レンダリングバッファの破棄 */ - void DestroyOffscreenFrame(); + void DestroyOffscreenSurface(); private: MouseActionManager* _mouseActionManager; ///< マウスアクションマネージャー @@ -141,8 +141,7 @@ class CubismDirectXView // レンダリング先を別ターゲットにする方式の場合に使用 CubismSprite* _renderSprite; ///< モードによっては_renderBufferのテクスチャを描画 - Csm::Rendering::CubismOffscreenFrame_D3D11 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + Csm::Rendering::CubismOffscreenSurface_D3D11 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング SelectTarget _renderTarget; ///< レンダリング先の選択肢 float _clearColor[4]; ///< レンダリングターゲットのクリアカラー }; - diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismUserModelExtend.cpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismUserModelExtend.cpp index 43f1ca51..0db9d8b4 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismUserModelExtend.cpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismUserModelExtend.cpp @@ -68,7 +68,7 @@ CubismUserModelExtend::CubismUserModelExtend(const std::string modelDirectoryNam CubismUserModelExtend::~CubismUserModelExtend() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); // モデルの設定データの解放 ReleaseModelSetting(); @@ -505,7 +505,7 @@ void CubismUserModelExtend::ModelOnUpdate() Draw(projection); ///< 参照渡しなのでprojectionは変質する } -Csm::Rendering::CubismOffscreenFrame_D3D11& CubismUserModelExtend::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_D3D11& CubismUserModelExtend::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismUserModelExtend.hpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismUserModelExtend.hpp index d9b52fc0..8a64d9b6 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismUserModelExtend.hpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/CubismUserModelExtend.hpp @@ -52,7 +52,7 @@ class CubismUserModelExtend : /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_D3D11& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_D3D11& GetRenderBuffer(); private: /** @@ -143,5 +143,5 @@ class CubismUserModelExtend : Csm::csmVector _bindTextureId; ///< テクスチャID - Csm::Rendering::CubismOffscreenFrame_D3D11 _renderBuffer; ///< フレームバッファ以外の描画先 + Csm::Rendering::CubismOffscreenSurface_D3D11 _renderBuffer; ///< フレームバッファ以外の描画先 }; diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDefine.cpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDefine.cpp index 901b7e27..2ca324cc 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDefine.cpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDefine.cpp @@ -38,18 +38,6 @@ namespace LAppDefine { const csmChar* PowerImageName = "close.png"; // モデル定義------------------------------------------ - // モデルを配置したディレクトリ名の配列 - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと - const csmChar* ModelDir[] = { - "Haru", - "Hiyori", - "Mark", - "Natori", - "Rice", - "Mao" - }; - const csmInt32 ModelDirSize = sizeof(ModelDir) / sizeof(const csmChar*); - // 外部定義ファイル(json)と合わせる const csmChar* MotionGroupIdle = "Idle"; // アイドリング const csmChar* MotionGroupTapBody = "TapBody"; // 体をタップしたとき diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDefine.hpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDefine.hpp index 037216b5..63740b16 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDefine.hpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDefine.hpp @@ -36,9 +36,6 @@ namespace LAppDefine { extern const csmChar* PowerImageName; ///< 終了ボタン画像ファイル // モデル定義-------------------------------------------- - extern const csmChar* ModelDir[]; ///< モデルを配置したディレクトリ名の配列. ディレクトリ名とmodel3.jsonの名前を一致させておく. - extern const csmInt32 ModelDirSize; ///< モデルディレクトリ配列のサイズ - // 外部定義ファイル(json)と合わせる extern const csmChar* MotionGroupIdle; ///< アイドリング時に再生するモーションのリスト extern const csmChar* MotionGroupTapBody; ///< 体をタップした時に再生するモーションのリスト diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDelegate.cpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDelegate.cpp index e461f7ec..ae1b89cd 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDelegate.cpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppDelegate.cpp @@ -770,7 +770,7 @@ void LAppDelegate::ResizeDevice() // パラメータ、スプライトサイズなど再設定 _view->Initialize(); _view->ResizeSprite(); - _view->DestroyOffscreenFrame(); + _view->DestroyOffscreenSurface(); } // マネージャにサイズ変更通知 diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppLive2DManager.cpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppLive2DManager.cpp index 9e932408..76ae364d 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppLive2DManager.cpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppLive2DManager.cpp @@ -7,7 +7,10 @@ #include "LAppLive2DManager.hpp" -#include +#include +#include +#include +#include #include #include "LAppPal.hpp" #include "LAppDefine.hpp" @@ -17,7 +20,6 @@ using namespace Csm; using namespace LAppDefine; -using namespace std; namespace { LAppLive2DManager* s_instance = NULL; @@ -26,6 +28,12 @@ namespace { { LAppPal::PrintLog("Motion Finished: %x", self); } + + int CompareCsmString(const void* a, const void* b) + { + return strcmp(reinterpret_cast(a)->GetRawString(), + reinterpret_cast(b)->GetRawString()); + } } LAppLive2DManager* LAppLive2DManager::GetInstance() @@ -53,6 +61,7 @@ LAppLive2DManager::LAppLive2DManager() , _sceneIndex(0) { _viewMatrix = new CubismMatrix44(); + SetUpModel(); ChangeScene(_sceneIndex); } @@ -92,6 +101,50 @@ void LAppLive2DManager::ReleaseAllModel() _models.Clear(); } +void LAppLive2DManager::SetUpModel() +{ + // ResourcesPathの中にあるフォルダ名を全てクロールし、モデルが存在するフォルダを定義する。 + // フォルダはあるが同名の.model3.jsonが見つからなかった場合はリストに含めない。 + csmString crawlPath(ResourcesPath); + crawlPath += "*.*"; + + struct _finddata_t fdata; + intptr_t fh = _findfirst(crawlPath.GetRawString(), &fdata); + if (fh == -1) return; + + _modelDir.Clear(); + + while (_findnext(fh, &fdata) == 0) + { + if ((fdata.attrib & _A_SUBDIR) && strcmp(fdata.name, "..") != 0) + { + // フォルダと同名の.model3.jsonがあるか探索する + csmString model3jsonPath(ResourcesPath); + model3jsonPath += fdata.name; + model3jsonPath.Append(1, '/'); + model3jsonPath += fdata.name; + model3jsonPath += ".model3.json"; + + struct _finddata_t fdata2; + if (_findfirst(model3jsonPath.GetRawString(), &fdata2) != -1) + { + _modelDir.PushBack(csmString(fdata.name)); + } + } + } + qsort(_modelDir.GetPtr(), _modelDir.GetSize(), sizeof(csmString), CompareCsmString); +} + +csmVector LAppLive2DManager::GetModelDir() const +{ + return _modelDir; +} + +csmInt32 LAppLive2DManager::GetModelDirSize() const +{ + return _modelDir.GetSize(); +} + LAppModel* LAppLive2DManager::GetModel(csmUint32 no) const { if (no < _models.GetSize()) @@ -197,7 +250,7 @@ void LAppLive2DManager::OnUpdate() const void LAppLive2DManager::NextScene() { - csmInt32 no = (_sceneIndex + 1) % ModelDirSize; + csmInt32 no = (_sceneIndex + 1) % GetModelDirSize(); ChangeScene(no); } @@ -209,17 +262,20 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) LAppPal::PrintLog("[APP]model index: %d", _sceneIndex); } - // ModelDir[]に保持したディレクトリ名から // model3.jsonのパスを決定する. - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと. - std::string model = ModelDir[index]; - std::string modelPath = ResourcesPath + model + "/"; - std::string modelJsonName = ModelDir[index]; + // ディレクトリ名とmodel3.jsonの名前を一致していることが条件 + const csmString& model = _modelDir[index]; + + csmString modelPath(ResourcesPath); + modelPath += model; + modelPath.Append(1, '/'); + + csmString modelJsonName(model); modelJsonName += ".model3.json"; ReleaseAllModel(); _models.PushBack(new LAppModel()); - _models[0]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[0]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); /* * モデル半透明表示を行うサンプルを提示する。 @@ -241,7 +297,7 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) #if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) // モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす _models.PushBack(new LAppModel()); - _models[1]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[1]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); _models[1]->GetModelMatrix()->TranslateX(0.2f); #endif @@ -283,7 +339,7 @@ void LAppLive2DManager::ResizedWindow() const csmUint32 modelCount = _models.GetSize(); for (csmUint32 i = 0; i < modelCount; ++i) { - _models[i]->GetRenderBuffer().DestroyOffscreenFrame(); + _models[i]->GetRenderBuffer().DestroyOffscreenSurface(); } } diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppLive2DManager.hpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppLive2DManager.hpp index 7194e19c..9532e725 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppLive2DManager.hpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppLive2DManager.hpp @@ -54,6 +54,24 @@ class LAppLive2DManager */ static void ReleaseInstance(); + /** + * @brief Resources フォルダにあるモデルフォルダ名をセットする + * + */ + void SetUpModel(); + + /** + * @brief Resources フォルダにあるモデルフォルダ名を取得する + * + */ + Csm::csmVector GetModelDir() const; + + /** + * @brief Resources フォルダにあるモデルフォルダのサイズを取得する + * + */ + Csm::csmInt32 GetModelDirSize() const; + /** * @brief 現在のシーンで保持しているモデルを返す * @@ -134,11 +152,13 @@ class LAppLive2DManager */ virtual ~LAppLive2DManager(); - Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 - Csm::csmVector _models; ///< モデルインスタンスのコンテナ - Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 + Csm::csmVector _models; ///< モデルインスタンスのコンテナ + Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + + Csm::csmVector _modelDir; ///< モデルディレクトリ名のコンテナ - Csm::csmVector _releaseModel; ///< 解放予定モデルインスタンスのコンテナ + Csm::csmVector _releaseModel; ///< 解放予定モデルインスタンスのコンテナ - Csm::csmMap _releaseModels; ///< モデルインスタンスのコンテナ(解放予約、解放カウント) + Csm::csmMap _releaseModels; ///< モデルインスタンスのコンテナ(解放予約、解放カウント) }; diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppModel.cpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppModel.cpp index 0ae80471..23b506ec 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppModel.cpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppModel.cpp @@ -71,7 +71,7 @@ LAppModel::LAppModel() LAppModel::~LAppModel() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); ReleaseMotions(); ReleaseExpressions(); @@ -665,7 +665,7 @@ void LAppModel::MotionEventFired(const csmString& eventValue) } -Csm::Rendering::CubismOffscreenFrame_D3D11& LAppModel::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_D3D11& LAppModel::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppModel.hpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppModel.hpp index d12f6cd9..e366d78e 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppModel.hpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppModel.hpp @@ -120,7 +120,7 @@ class LAppModel : public Csm::CubismUserModel /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_D3D11& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_D3D11& GetRenderBuffer(); /** * @brief .moc3ファイルの整合性をチェックする @@ -205,8 +205,5 @@ class LAppModel : public Csm::CubismUserModel bool _deleteModel; ///< 実体消滅予定フラグ Drawを呼ばない - Csm::Rendering::CubismOffscreenFrame_D3D11 _renderBuffer; ///< フレームバッファ以外の描画先 + Csm::Rendering::CubismOffscreenSurface_D3D11 _renderBuffer; ///< フレームバッファ以外の描画先 }; - - - diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppView.cpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppView.cpp index 5c3b8c10..45d4ac19 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppView.cpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppView.cpp @@ -44,7 +44,7 @@ LAppView::LAppView(): LAppView::~LAppView() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); delete _renderSprite; delete _viewMatrix; @@ -346,7 +346,7 @@ float LAppView::TransformScreenY(float deviceY) const void LAppView::PreModelDraw(LAppModel& refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_D3D11* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_D3D11* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 @@ -362,7 +362,7 @@ void LAppView::PreModelDraw(LAppModel& refModel) if (width != 0 && height != 0) { // モデル描画キャンバス - useTarget->CreateOffscreenFrame(LAppDelegate::GetInstance()->GetD3dDevice(), + useTarget->CreateOffscreenSurface(LAppDelegate::GetInstance()->GetD3dDevice(), static_cast(width), static_cast(height)); } } @@ -376,7 +376,7 @@ void LAppView::PreModelDraw(LAppModel& refModel) void LAppView::PostModelDraw(LAppModel& refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_D3D11* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_D3D11* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 @@ -412,9 +412,9 @@ void LAppView::SetRenderTargetClearColor(float r, float g, float b) _clearColor[2] = b; } -void LAppView::DestroyOffscreenFrame() +void LAppView::DestroyOffscreenSurface() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); } float LAppView::GetSpriteAlpha(int assign) const diff --git a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppView.hpp b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppView.hpp index 95aae25c..553e46e4 100644 --- a/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppView.hpp +++ b/Samples/D3D11/Demo/proj.d3d11.cmake/src/LAppView.hpp @@ -154,7 +154,7 @@ class LAppView /** * @brief 内部レンダリングバッファの破棄 */ - void DestroyOffscreenFrame(); + void DestroyOffscreenSurface(); private: TouchManager* _touchManager; ///< タッチマネージャー @@ -167,7 +167,7 @@ class LAppView // レンダリング先を別ターゲットにする方式の場合に使用 LAppSprite* _renderSprite; ///< モードによっては_renderBufferのテクスチャを描画 - Csm::Rendering::CubismOffscreenFrame_D3D11 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + Csm::Rendering::CubismOffscreenSurface_D3D11 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング SelectTarget _renderTarget; ///< レンダリング先の選択肢 float _clearColor[4]; ///< レンダリングターゲットのクリアカラー }; diff --git a/Samples/D3D11/README.ja.md b/Samples/D3D11/README.ja.md index 294cc496..a05610f0 100644 --- a/Samples/D3D11/README.ja.md +++ b/Samples/D3D11/README.ja.md @@ -14,7 +14,7 @@ DirectX 11 で実装したアプリケーションのサンプル実装です。 | [DirectXTK] | 2013 | April 23, 2018 | | [DirectXTK] | 2015 | December 17, 2019 | | [DirectXTK] | 2017 | March 24, 2022 | -| [DirectXTK] | 2019 / 2022 | April 28, 2023 | +| [DirectXTK] | 2019 / 2022 | June 13, 2023 | その他の開発環境・動作確認環境はトップディレクトリにある [README.md](/README.ja.md) を参照してください。 diff --git a/Samples/D3D11/README.md b/Samples/D3D11/README.md index ca4552b0..a2ea2aae 100644 --- a/Samples/D3D11/README.md +++ b/Samples/D3D11/README.md @@ -14,7 +14,7 @@ This is a sample implementation of an application implemented with DirectX 11. | [DirectXTK] | 2013 | April 23, 2018 | | [DirectXTK] | 2015 | December 17, 2019 | | [DirectXTK] | 2017 | March 24, 2022 | -| [DirectXTK] | 2019 / 2022 | April 28, 2023 | +| [DirectXTK] | 2019 / 2022 | June 13, 2023 | For other development environments and operation environments, see [README.md](/README.md) in the top directory. diff --git a/Samples/D3D11/thirdParty/scripts/setup_msvc2019.bat b/Samples/D3D11/thirdParty/scripts/setup_msvc2019.bat index d6bf499d..3ff36db5 100644 --- a/Samples/D3D11/thirdParty/scripts/setup_msvc2019.bat +++ b/Samples/D3D11/thirdParty/scripts/setup_msvc2019.bat @@ -2,7 +2,7 @@ setlocal -set XTK_VERSION=apr2023 +set XTK_VERSION=jun2023 set SCRIPT_PATH=%~dp0 diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismDirectXView.cpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismDirectXView.cpp index 1ac00791..c9551b86 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismDirectXView.cpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismDirectXView.cpp @@ -42,7 +42,7 @@ CubismDirectXView::CubismDirectXView() CubismDirectXView::~CubismDirectXView() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); delete _renderSprite; delete _deviceToScreen; @@ -149,7 +149,7 @@ float CubismDirectXView::TransformScreenY(float deviceY) const void CubismDirectXView::PreModelDraw(CubismUserModelExtend& refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_D3D9* useTarget = nullptr; + Csm::Rendering::CubismOffscreenSurface_D3D9* useTarget = nullptr; if (_renderTarget != SelectTarget_None) { @@ -165,7 +165,7 @@ void CubismDirectXView::PreModelDraw(CubismUserModelExtend& refModel) if (_windowWidth != 0 && _windowHeight != 0) { // モデル描画キャンバス - useTarget->CreateOffscreenFrame(CubismDirectXRenderer::GetInstance()->_device, + useTarget->CreateOffscreenSurface(CubismDirectXRenderer::GetInstance()->_device, static_cast(_windowWidth), static_cast(_windowHeight)); } } @@ -182,7 +182,7 @@ void CubismDirectXView::PostModelDraw(CubismUserModelExtend& refModel) {// 別のレンダリングターゲットへ向けて描画する場合 // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_D3D9* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_D3D9* useTarget = NULL; // 使用するターゲット useTarget = (_renderTarget == SelectTarget_ViewFrameBuffer) ? &_renderBuffer : &refModel.GetRenderBuffer(); @@ -231,9 +231,9 @@ void CubismDirectXView::SetRenderTargetClearColor(float r, float g, float b) _clearColor[2] = b; } -void CubismDirectXView::DestroyOffscreenFrame() +void CubismDirectXView::DestroyOffscreenSurface() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); } void CubismDirectXView::OnDeviceLost() @@ -242,5 +242,5 @@ void CubismDirectXView::OnDeviceLost() ReleaseSprite(); // レンダリングターゲット開放 - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); } diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismDirectXView.hpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismDirectXView.hpp index 450c1a95..8d32c5b1 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismDirectXView.hpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismDirectXView.hpp @@ -131,7 +131,7 @@ class CubismDirectXView /** * @brief 内部レンダリングバッファの破棄 */ - void DestroyOffscreenFrame(); + void DestroyOffscreenSurface(); /** * @brief デバイスロストの際の処理 @@ -146,8 +146,7 @@ class CubismDirectXView // レンダリング先を別ターゲットにする方式の場合に使用 CubismSprite* _renderSprite; ///< モードによっては_renderBufferのテクスチャを描画 - Csm::Rendering::CubismOffscreenFrame_D3D9 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + Csm::Rendering::CubismOffscreenSurface_D3D9 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング SelectTarget _renderTarget; ///< レンダリング先の選択肢 float _clearColor[4]; ///< レンダリングターゲットのクリアカラー }; - diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismUserModelExtend.cpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismUserModelExtend.cpp index 4c5c4a5b..5ced0994 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismUserModelExtend.cpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismUserModelExtend.cpp @@ -64,7 +64,7 @@ CubismUserModelExtend::CubismUserModelExtend(const std::string modelDirectoryNam CubismUserModelExtend::~CubismUserModelExtend() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); // モデルの設定データの解放 ReleaseModelSetting(); @@ -475,7 +475,7 @@ void CubismUserModelExtend::ReloadRenderer() void CubismUserModelExtend::OnDeviceLost() { // レンダリングバッファ破棄 - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); // レンダラー破棄 DeleteRenderer(); @@ -519,7 +519,7 @@ void CubismUserModelExtend::ModelOnUpdate() Draw(projection); ///< 参照渡しなのでprojectionは変質する } -Csm::Rendering::CubismOffscreenFrame_D3D9& CubismUserModelExtend::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_D3D9& CubismUserModelExtend::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismUserModelExtend.hpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismUserModelExtend.hpp index 85aaf83b..92da8c7a 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismUserModelExtend.hpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/CubismUserModelExtend.hpp @@ -63,7 +63,7 @@ class CubismUserModelExtend : /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_D3D9& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_D3D9& GetRenderBuffer(); private: /** @@ -154,5 +154,5 @@ class CubismUserModelExtend : Csm::csmVector _bindTextureId; ///< テクスチャID - Csm::Rendering::CubismOffscreenFrame_D3D9 _renderBuffer; ///< フレームバッファ以外の描画先 + Csm::Rendering::CubismOffscreenSurface_D3D9 _renderBuffer; ///< フレームバッファ以外の描画先 }; diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppDefine.cpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppDefine.cpp index 901b7e27..2ca324cc 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppDefine.cpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppDefine.cpp @@ -38,18 +38,6 @@ namespace LAppDefine { const csmChar* PowerImageName = "close.png"; // モデル定義------------------------------------------ - // モデルを配置したディレクトリ名の配列 - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと - const csmChar* ModelDir[] = { - "Haru", - "Hiyori", - "Mark", - "Natori", - "Rice", - "Mao" - }; - const csmInt32 ModelDirSize = sizeof(ModelDir) / sizeof(const csmChar*); - // 外部定義ファイル(json)と合わせる const csmChar* MotionGroupIdle = "Idle"; // アイドリング const csmChar* MotionGroupTapBody = "TapBody"; // 体をタップしたとき diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppDefine.hpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppDefine.hpp index 38063675..6bf1bb8f 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppDefine.hpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppDefine.hpp @@ -36,9 +36,6 @@ namespace LAppDefine { extern const csmChar* PowerImageName; ///< 終了ボタン画像ファイル // モデル定義-------------------------------------------- - extern const csmChar* ModelDir[]; ///< モデルを配置したディレクトリ名の配列. ディレクトリ名とmodel3.jsonの名前を一致させておく. - extern const csmInt32 ModelDirSize; ///< モデルディレクトリ配列のサイズ - // 外部定義ファイル(json)と合わせる extern const csmChar* MotionGroupIdle; ///< アイドリング時に再生するモーションのリスト extern const csmChar* MotionGroupTapBody; ///< 体をタップした時に再生するモーションのリスト diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppLive2DManager.cpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppLive2DManager.cpp index a76dcb9d..7f4ff26a 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppLive2DManager.cpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppLive2DManager.cpp @@ -7,7 +7,10 @@ #include "LAppLive2DManager.hpp" -#include +#include +#include +#include +#include #include #include "LAppPal.hpp" #include "LAppDefine.hpp" @@ -17,7 +20,6 @@ using namespace Csm; using namespace LAppDefine; -using namespace std; namespace { LAppLive2DManager* s_instance = NULL; @@ -26,6 +28,12 @@ namespace { { LAppPal::PrintLog("Motion Finished: %x", self); } + + int CompareCsmString(const void* a, const void* b) + { + return strcmp(reinterpret_cast(a)->GetRawString(), + reinterpret_cast(b)->GetRawString()); + } } LAppLive2DManager* LAppLive2DManager::GetInstance() @@ -53,6 +61,7 @@ LAppLive2DManager::LAppLive2DManager() , _sceneIndex(0) { _viewMatrix = new CubismMatrix44(); + SetUpModel(); ChangeScene(_sceneIndex); } @@ -92,6 +101,50 @@ void LAppLive2DManager::ReleaseAllModel() _models.Clear(); } +void LAppLive2DManager::SetUpModel() +{ + // ResourcesPathの中にあるフォルダ名を全てクロールし、モデルが存在するフォルダを定義する。 + // フォルダはあるが同名の.model3.jsonが見つからなかった場合はリストに含めない。 + csmString crawlPath(ResourcesPath); + crawlPath += "*.*"; + + struct _finddata_t fdata; + intptr_t fh = _findfirst(crawlPath.GetRawString(), &fdata); + if (fh == -1) return; + + _modelDir.Clear(); + + while (_findnext(fh, &fdata) == 0) + { + if ((fdata.attrib & _A_SUBDIR) && strcmp(fdata.name, "..") != 0) + { + // フォルダと同名の.model3.jsonがあるか探索する + csmString model3jsonPath(ResourcesPath); + model3jsonPath += fdata.name; + model3jsonPath.Append(1, '/'); + model3jsonPath += fdata.name; + model3jsonPath += ".model3.json"; + + struct _finddata_t fdata2; + if (_findfirst(model3jsonPath.GetRawString(), &fdata2) != -1) + { + _modelDir.PushBack(csmString(fdata.name)); + } + } + } + qsort(_modelDir.GetPtr(), _modelDir.GetSize(), sizeof(csmString), CompareCsmString); +} + +csmVector LAppLive2DManager::GetModelDir() const +{ + return _modelDir; +} + +csmInt32 LAppLive2DManager::GetModelDirSize() const +{ + return _modelDir.GetSize(); +} + LAppModel* LAppLive2DManager::GetModel(csmUint32 no) const { if (no < _models.GetSize()) @@ -196,7 +249,7 @@ void LAppLive2DManager::OnUpdate() const void LAppLive2DManager::NextScene() { - csmInt32 no = (_sceneIndex + 1) % ModelDirSize; + csmInt32 no = (_sceneIndex + 1) % GetModelDirSize(); ChangeScene(no); } @@ -208,17 +261,20 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) LAppPal::PrintLog("[APP]model index: %d", _sceneIndex); } - // ModelDir[]に保持したディレクトリ名から // model3.jsonのパスを決定する. - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと. - std::string model = ModelDir[index]; - std::string modelPath = ResourcesPath + model + "/"; - std::string modelJsonName = ModelDir[index]; + // ディレクトリ名とmodel3.jsonの名前を一致していることが条件 + const csmString& model = _modelDir[index]; + + csmString modelPath(ResourcesPath); + modelPath += model; + modelPath.Append(1, '/'); + + csmString modelJsonName(model); modelJsonName += ".model3.json"; ReleaseAllModel(); _models.PushBack(new LAppModel()); - _models[0]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[0]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); /* * モデル半透明表示を行うサンプルを提示する。 @@ -240,7 +296,7 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) #if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) // モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす _models.PushBack(new LAppModel()); - _models[1]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[1]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); _models[1]->GetModelMatrix()->TranslateX(0.2f); #endif diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppLive2DManager.hpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppLive2DManager.hpp index f7db752c..43beff58 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppLive2DManager.hpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppLive2DManager.hpp @@ -13,6 +13,7 @@ #include #include #include +#include class LAppModel; @@ -55,6 +56,24 @@ class LAppLive2DManager */ static void ReleaseInstance(); + /** + * @brief Resources フォルダにあるモデルフォルダ名をセットする + * + */ + void SetUpModel(); + + /** + * @brief Resources フォルダにあるモデルフォルダ名を取得する + * + */ + Csm::csmVector GetModelDir() const; + + /** + * @brief Resources フォルダにあるモデルフォルダのサイズを取得する + * + */ + Csm::csmInt32 GetModelDirSize() const; + /** * @brief 現在のシーンで保持しているモデルを返す * @@ -141,10 +160,13 @@ class LAppLive2DManager */ virtual ~LAppLive2DManager(); - Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 - Csm::csmVector _models; ///< モデルインスタンスのコンテナ - Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 + Csm::csmVector _models; ///< モデルインスタンスのコンテナ + Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + + Csm::csmVector _modelDir; ///< モデルディレクトリ名のコンテナ + + Csm::csmVector _releaseModel; ///< 解放予定モデルインスタンスのコンテナ - Csm::csmVector _releaseModel; ///< 解放予定モデルインスタンスのコンテナ - Csm::csmMap _releaseModels; ///< モデルインスタンスのコンテナ(解放予約、解放カウント) + Csm::csmMap _releaseModels; ///< モデルインスタンスのコンテナ(解放予約、解放カウント) }; diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppModel.cpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppModel.cpp index 072e8af9..26061ecf 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppModel.cpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppModel.cpp @@ -71,7 +71,7 @@ LAppModel::LAppModel() LAppModel::~LAppModel() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); ReleaseMotions(); ReleaseExpressions(); @@ -675,7 +675,7 @@ void LAppModel::MotionEventFired(const csmString& eventValue) CubismLogInfo("%s is fired on LAppModel!!", eventValue.GetRawString()); } -Csm::Rendering::CubismOffscreenFrame_D3D9& LAppModel::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_D3D9& LAppModel::GetRenderBuffer() { return _renderBuffer; } @@ -683,7 +683,7 @@ Csm::Rendering::CubismOffscreenFrame_D3D9& LAppModel::GetRenderBuffer() void LAppModel::OnDeviceLost() { // レンダリングバッファ破棄 - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); // レンダラー破棄 DeleteRenderer(); diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppModel.hpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppModel.hpp index 878ebbb9..24e969c9 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppModel.hpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppModel.hpp @@ -119,7 +119,7 @@ class LAppModel : public Csm::CubismUserModel /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_D3D9& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_D3D9& GetRenderBuffer(); /** * @brief デバイスロスト時に呼ばれる @@ -209,8 +209,5 @@ class LAppModel : public Csm::CubismUserModel bool _deleteModel; ///< 実体消滅予定フラグ Drawを呼ばない - Csm::Rendering::CubismOffscreenFrame_D3D9 _renderBuffer; ///< フレームバッファ以外の描画先 + Csm::Rendering::CubismOffscreenSurface_D3D9 _renderBuffer; ///< フレームバッファ以外の描画先 }; - - - diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppView.cpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppView.cpp index 2c7a088f..3be8e7c6 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppView.cpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppView.cpp @@ -44,7 +44,7 @@ LAppView::LAppView(): LAppView::~LAppView() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); delete _renderSprite; delete _viewMatrix; @@ -220,7 +220,7 @@ void LAppView::OnDeviceLost() ReleaseSprite(); // レンダリングターゲット開放 - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); } void LAppView::OnTouchesBegan(float px, float py) const @@ -299,7 +299,7 @@ void LAppView::PreModelDraw(LAppModel &refModel) {// 別のレンダリングターゲットへ向けて描画する場合 // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_D3D9* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_D3D9* useTarget = NULL; // 使用するターゲット useTarget = (_renderTarget == SelectTarget_ViewFrameBuffer) ? &_renderBuffer : &refModel.GetRenderBuffer(); @@ -312,7 +312,7 @@ void LAppView::PreModelDraw(LAppModel &refModel) if (width != 0 && height != 0) { // モデル描画キャンバス - useTarget->CreateOffscreenFrame(LAppDelegate::GetInstance()->GetD3dDevice(), + useTarget->CreateOffscreenSurface(LAppDelegate::GetInstance()->GetD3dDevice(), static_cast(width), static_cast(height)); } } @@ -329,7 +329,7 @@ void LAppView::PostModelDraw(LAppModel &refModel) {// 別のレンダリングターゲットへ向けて描画する場合 // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_D3D9* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_D3D9* useTarget = NULL; // 使用するターゲット useTarget = (_renderTarget == SelectTarget_ViewFrameBuffer) ? &_renderBuffer : &refModel.GetRenderBuffer(); diff --git a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppView.hpp b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppView.hpp index b3f9da85..360d2453 100644 --- a/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppView.hpp +++ b/Samples/D3D9/Demo/proj.d3d9.cmake/src/LAppView.hpp @@ -182,7 +182,7 @@ class LAppView // レンダリング先を別ターゲットにする方式の場合に使用 LAppSprite* _renderSprite; ///< モードによっては_renderBufferのテクスチャを描画 - Csm::Rendering::CubismOffscreenFrame_D3D9 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + Csm::Rendering::CubismOffscreenSurface_D3D9 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング SelectTarget _renderTarget; ///< レンダリング先の選択肢 float _clearColor[4]; ///< レンダリングターゲットのクリアカラー diff --git a/Samples/Metal/Demo/proj.ios.cmake/src/LAppDefine.h b/Samples/Metal/Demo/proj.ios.cmake/src/LAppDefine.h index 9d982a50..ceef8019 100644 --- a/Samples/Metal/Demo/proj.ios.cmake/src/LAppDefine.h +++ b/Samples/Metal/Demo/proj.ios.cmake/src/LAppDefine.h @@ -39,9 +39,6 @@ namespace LAppDefine { extern const csmChar* PowerImageName; ///< 終了ボタン画像ファイル // モデル定義-------------------------------------------- - extern const csmChar* ModelDir[]; ///< モデルを配置したディレクトリ名の配列. ディレクトリ名とmodel3.jsonの名前を一致させておく. - extern const csmInt32 ModelDirSize; ///< モデルディレクトリ配列のサイズ - // 外部定義ファイル(json)と合わせる extern const csmChar* MotionGroupIdle; ///< アイドリング時に再生するモーションのリスト extern const csmChar* MotionGroupTapBody; ///< 体をタップした時に再生するモーションのリスト diff --git a/Samples/Metal/Demo/proj.ios.cmake/src/LAppDefine.mm b/Samples/Metal/Demo/proj.ios.cmake/src/LAppDefine.mm index a55d9711..5cb2a2a1 100644 --- a/Samples/Metal/Demo/proj.ios.cmake/src/LAppDefine.mm +++ b/Samples/Metal/Demo/proj.ios.cmake/src/LAppDefine.mm @@ -42,18 +42,6 @@ const csmChar* PowerImageName = "close.png"; // モデル定義------------------------------------------ - // モデルを配置したディレクトリ名の配列 - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと - const csmChar* ModelDir[] = { - "Haru", - "Hiyori", - "Mark", - "Natori", - "Rice", - "Mao" - }; - const csmInt32 ModelDirSize = sizeof(ModelDir) / sizeof(const csmChar*); - // 外部定義ファイル(json)と合わせる const csmChar* MotionGroupIdle = "Idle"; // アイドリング const csmChar* MotionGroupTapBody = "TapBody"; // 体をタップしたとき diff --git a/Samples/Metal/Demo/proj.ios.cmake/src/LAppLive2DManager.h b/Samples/Metal/Demo/proj.ios.cmake/src/LAppLive2DManager.h index affe41c7..d8aeceac 100644 --- a/Samples/Metal/Demo/proj.ios.cmake/src/LAppLive2DManager.h +++ b/Samples/Metal/Demo/proj.ios.cmake/src/LAppLive2DManager.h @@ -11,6 +11,7 @@ #import #import #import +#import #import "LAppModel.h" #import "LAppSprite.h" @@ -27,13 +28,15 @@ typedef NS_ENUM(NSUInteger, SelectTarget) @property (nonatomic) Csm::csmVector models; //モデルインスタンスのコンテナ @property (nonatomic) Csm::csmInt32 sceneIndex; //表示するシーンのインデックス値 @property (nonatomic) SelectTarget renderTarget; -@property (nonatomic) Csm::Rendering::CubismOffscreenFrame_Metal* renderBuffer; +@property (nonatomic) Csm::Rendering::CubismOffscreenSurface_Metal* renderBuffer; @property (nonatomic) LAppSprite* sprite; @property (nonatomic) MTLRenderPassDescriptor* renderPassDescriptor; @property (nonatomic) float clearColorR; @property (nonatomic) float clearColorG; @property (nonatomic) float clearColorB; +@property (nonatomic) Csm::csmVector modelDir; ///< モデルディレクトリ名のコンテナ + /** * @brief クラスのインスタンスを返す。 * インスタンスが生成されていない場合は内部でインスタンスを生成する。 @@ -58,6 +61,11 @@ typedef NS_ENUM(NSUInteger, SelectTarget) */ - (void)releaseAllModel; +/** + * @brief Resources フォルダにあるモデルフォルダ名をセットする + */ +- (void)setUpModel; + /** * @brief 画面をドラッグしたときの処理 * diff --git a/Samples/Metal/Demo/proj.ios.cmake/src/LAppLive2DManager.mm b/Samples/Metal/Demo/proj.ios.cmake/src/LAppLive2DManager.mm index 7808ac61..740c8f25 100644 --- a/Samples/Metal/Demo/proj.ios.cmake/src/LAppLive2DManager.mm +++ b/Samples/Metal/Demo/proj.ios.cmake/src/LAppLive2DManager.mm @@ -6,6 +6,8 @@ */ #import "LAppLive2DManager.h" +#import +#import #import #import "AppDelegate.h" #import "ViewController.h" @@ -30,6 +32,23 @@ void FinishedMotion(Csm::ACubismMotion* self) LAppPal::PrintLog("Motion Finished: %x", self); } +int CompareCsmString(const void* a, const void* b) +{ + return strcmp(reinterpret_cast(a)->GetRawString(), + reinterpret_cast(b)->GetRawString()); +} + +Csm::csmString GetPath(CFURLRef url) +{ + CFStringRef cfstr = CFURLCopyFileSystemPath(url, CFURLPathStyle::kCFURLPOSIXPathStyle); + CFIndex size = CFStringGetLength(cfstr) * 4 + 1; // Length * UTF-16 Max Character size + null-terminated-byte + char* buf = new char[size]; + CFStringGetCString(cfstr, buf, size, CFStringBuiltInEncodings::kCFStringEncodingUTF8); + Csm::csmString result(buf); + delete[] buf; + return result; +} + + (LAppLive2DManager*)getInstance { @synchronized(self) @@ -69,6 +88,8 @@ - (id)init _renderPassDescriptor.depthAttachment.storeAction = MTLStoreActionDontCare; _renderPassDescriptor.depthAttachment.clearDepth = 1.0; + [self setUpModel]; + [self changeScene:_sceneIndex]; } return self; @@ -78,7 +99,7 @@ - (void)dealloc { if (_renderBuffer) { - _renderBuffer->DestroyOffscreenFrame(); + _renderBuffer->DestroyOffscreenSurface(); delete _renderBuffer; _renderBuffer = NULL; } @@ -109,6 +130,30 @@ - (void)releaseAllModel _models.Clear(); } +- (void)setUpModel +{ + _modelDir.Clear(); + + NSBundle* bundle = [NSBundle mainBundle]; + NSString* resPath = [NSString stringWithUTF8String:LAppDefine::ResourcesPath]; + NSArray* resArr = [bundle pathsForResourcesOfType:NULL inDirectory:resPath]; + NSUInteger cnt = [resArr count]; + + for (NSUInteger i = 0; i < cnt; i++) + { + NSString* modelName = [[resArr objectAtIndex:i] lastPathComponent]; + NSMutableString* modelDirPath = [NSMutableString stringWithString:resPath]; + [modelDirPath appendString:@"/"]; + [modelDirPath appendString:modelName]; + NSArray* model3json = [bundle pathsForResourcesOfType:@".model3.json" inDirectory:modelDirPath]; + if ([model3json count] == 1) + { + _modelDir.PushBack(Csm::csmString([modelName UTF8String])); + } + } + qsort(_modelDir.GetPtr(), _modelDir.GetSize(), sizeof(Csm::csmString), CompareCsmString); +} + - (LAppModel*)getModel:(Csm::csmUint32)no { if (no < _models.GetSize()) @@ -176,10 +221,10 @@ - (void)onUpdate:(id )commandBuffer currentDrawable:(idSetMTLPixelFormat(MTLPixelFormatBGRA8Unorm); _renderBuffer->SetClearColor(0.0, 0.0, 0.0, 0.0); - _renderBuffer->CreateOffscreenFrame(width, height, nil); + _renderBuffer->CreateOffscreenSurface(width, height, nil); if (_renderTarget == SelectTarget_ViewFrameBuffer) { @@ -229,13 +274,13 @@ - (void)onUpdate:(id )commandBuffer currentDrawable:(idGetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_Metal& useTarget = model->GetRenderBuffer(); if (!useTarget.IsValid()) {// 描画ターゲット内部未作成の場合はここで作成 // モデル描画キャンバス useTarget.SetMTLPixelFormat(MTLPixelFormatBGRA8Unorm); - useTarget.CreateOffscreenFrame(static_cast(width), static_cast(height)); + useTarget.CreateOffscreenSurface(static_cast(width), static_cast(height)); } _renderPassDescriptor.colorAttachments[0].texture = useTarget.GetColorBuffer(); _renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear; @@ -274,7 +319,7 @@ - (void)onUpdate:(id )commandBuffer currentDrawable:(id renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; - Csm::Rendering::CubismOffscreenFrame_Metal& useTarget = model->GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_Metal& useTarget = model->GetRenderBuffer(); LAppSprite* depthSprite = [[LAppSprite alloc] initWithMyVar:width * 0.5f Y:height * 0.5f Width:width Height:height Texture:useTarget.GetColorBuffer()]; float a = i < 1 ? 1.0f : model->GetOpacity(); // 片方のみ不透明度を取得できるようにする [depthSprite SetColor:1.0f g:1.0f b:1.0f a:a]; @@ -287,7 +332,7 @@ - (void)onUpdate:(id )commandBuffer currentDrawable:(idLoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[0]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); /* * モデル半透明表示を行うサンプルを提示する。 @@ -331,7 +379,7 @@ - (void)changeScene:(Csm::csmInt32)index; #if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) // モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす _models.PushBack(new LAppModel()); - _models[1]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[1]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); _models[1]->GetModelMatrix()->TranslateX(0.2f); #endif @@ -371,4 +419,3 @@ - (void)SetRenderTargetClearColor:(float)r g:(float)g b:(float)b _clearColorB = b; } @end - diff --git a/Samples/Metal/Demo/proj.ios.cmake/src/LAppModel.h b/Samples/Metal/Demo/proj.ios.cmake/src/LAppModel.h index f62e6208..d698e90d 100644 --- a/Samples/Metal/Demo/proj.ios.cmake/src/LAppModel.h +++ b/Samples/Metal/Demo/proj.ios.cmake/src/LAppModel.h @@ -111,7 +111,7 @@ class LAppModel : public Csm::CubismUserModel /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_Metal& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_Metal& GetRenderBuffer(); /** * @brief .moc3ファイルの整合性をチェックする @@ -190,7 +190,7 @@ class LAppModel : public Csm::CubismUserModel const Csm::CubismId* _idParamEyeBallX; ///< パラメータID: ParamEyeBallX const Csm::CubismId* _idParamEyeBallY; ///< パラメータID: ParamEyeBallXY - Live2D::Cubism::Framework::Rendering::CubismOffscreenFrame_Metal _renderBuffer; + Live2D::Cubism::Framework::Rendering::CubismOffscreenSurface_Metal _renderBuffer; }; #endif /* LAppModel_h */ diff --git a/Samples/Metal/Demo/proj.ios.cmake/src/LAppModel.mm b/Samples/Metal/Demo/proj.ios.cmake/src/LAppModel.mm index be98409f..67f08fa7 100644 --- a/Samples/Metal/Demo/proj.ios.cmake/src/LAppModel.mm +++ b/Samples/Metal/Demo/proj.ios.cmake/src/LAppModel.mm @@ -71,7 +71,7 @@ void DeleteBuffer(csmByte* buffer, const csmChar* path = "") LAppModel::~LAppModel() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); ReleaseMotions(); ReleaseExpressions(); @@ -623,24 +623,30 @@ void DeleteBuffer(csmByte* buffer, const csmChar* path = "") void LAppModel::SetupTextures() { for (csmInt32 modelTextureNumber = 0; modelTextureNumber < _modelSetting->GetTextureCount(); modelTextureNumber++) + { + // テクスチャ名が空文字だった場合はロード・バインド処理をスキップ + if (!strcmp(_modelSetting->GetTextureFileName(modelTextureNumber), "")) { - // テクスチャ名が空文字だった場合はロード・バインド処理をスキップ - if (!strcmp(_modelSetting->GetTextureFileName(modelTextureNumber), "")) - { - continue; - } + continue; + } - //Metalテクスチャにテクスチャをロードする - csmString texturePath = _modelSetting->GetTextureFileName(modelTextureNumber); - texturePath = _modelHomeDir + texturePath; + //Metalテクスチャにテクスチャをロードする + csmString texturePath = _modelSetting->GetTextureFileName(modelTextureNumber); + texturePath = _modelHomeDir + texturePath; - AppDelegate *delegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; - TextureInfo* texture = [[delegate getTextureManager] createTextureFromPngFile:texturePath.GetRawString()]; - id mtlTextueNumber = texture->id; + AppDelegate *delegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; + TextureInfo* texture = [[delegate getTextureManager] createTextureFromPngFile:texturePath.GetRawString()]; + id mtlTextueNumber = texture->id; - //Metal - GetRenderer()->BindTexture(modelTextureNumber, mtlTextueNumber); - } + //Metal + GetRenderer()->BindTexture(modelTextureNumber, mtlTextueNumber); + } + +#ifdef PREMULTIPLIED_ALPHA_ENABLE + GetRenderer()->IsPremultipliedAlpha(true); +#else + GetRenderer()->IsPremultipliedAlpha(false); +#endif } void LAppModel::MotionEventFired(const csmString& eventValue) @@ -648,7 +654,7 @@ void DeleteBuffer(csmByte* buffer, const csmChar* path = "") CubismLogInfo("%s is fired on LAppModel!!", eventValue.GetRawString()); } -Csm::Rendering::CubismOffscreenFrame_Metal& LAppModel::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_Metal& LAppModel::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/Metal/README.ja.md b/Samples/Metal/README.ja.md index b50d7117..a329bf96 100644 --- a/Samples/Metal/README.ja.md +++ b/Samples/Metal/README.ja.md @@ -12,7 +12,7 @@ Metal で実装したアプリケーションのサンプル実装です。 | サードパーティ | バージョン | | --- | --- | -| [ios-cmake] | 4.3.0 | +| [ios-cmake] | 4.4.0 | | [stb_image.h] | 2.28 | その他の開発環境・動作確認環境はトップディレクトリにある [README.md](/README.ja.md) を参照してください。 @@ -52,7 +52,7 @@ iOS もしくは Mac Catalyst用の CMake プロジェクトです。 Mac Catalyst用ビルド時は下記の手順を行なってください。 -1. XCode の `Project設定 - TARGETS - Demo - General - Deployment Info` の `macOS` のチェックボックスをオンにしてください。 +1. XCode の `Project設定 - TARGETS - Demo - General - Supported Destinations` の `+` を押下し、`Mac > Mac Catalyst` を選択し、モーダルビューの`Enable`を押下してください。 2. XCode の `Project設定 - TARGETS - Demo` および `Framework` の `Build Settings - Architectures - Architectures` の記載を実行環境に合わせて変更してください。 3. XCode の `Project設定 - TARGETS - Demo` および `Framework` の `Build Settings - Architectures - Base SDK` を `iOS` に変更してください。 もしくはApple公式Tutorialsを参考ください。 diff --git a/Samples/Metal/README.md b/Samples/Metal/README.md index dfd3f154..8025831a 100644 --- a/Samples/Metal/README.md +++ b/Samples/Metal/README.md @@ -12,7 +12,7 @@ There are restrictions. Please check [NOTICE.md](/NOTICE.md) in the top director | Third Party | Version | | --- | --- | -| [ios-cmake] | 4.3.0 | +| [ios-cmake] | 4.4.0 | | [stb_image.h] | 2.28 | For other development environments and operation environments, see [README.md](/README.md) in the top directory. @@ -52,7 +52,7 @@ You can choose between iOS and Mac Catalyst when running the script. Follow the steps below when building for Mac Catalyst. -1. Check the box for `macOS` in XCode's `Project Settings - TARGETS - Demo - General - Deployment Info`. +1. In XCode, under `Project Settings - TARGETS - Demo - General - Supported Destinations`, press `+`, select `Mac > Mac Catalyst` and press `Enable` in the modal view. 2. Change the description of XCode's `Project Settings - TARGETS - Demo` and `Framework`'s `Build Settings - Architectures - Architectures` according to the execution environment. 3. Change XCode's `Project Settings - TARGETS - Demo` and `Framework`'s `Build Settings - Architectures - Base SDK` to `iOS`, or refer to the Apple official tutorials. [turning-on-mac-catalyst]: https://developer.apple.com/tutorials/mac-catalyst/turning-on-mac-catalyst diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/JniBridgeC.cpp b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/JniBridgeC.cpp index bbf082c4..75233ba7 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/JniBridgeC.cpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/JniBridgeC.cpp @@ -5,8 +5,9 @@ * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. */ -#include #include "JniBridgeC.hpp" +#include +#include #include "LAppDelegate.hpp" #include "LAppPal.hpp" @@ -14,6 +15,7 @@ using namespace Csm; static JavaVM* g_JVM; // JavaVM is valid for all threads, so just save it globally static jclass g_JniBridgeJavaClass; +static jmethodID g_GetAssetsMethodId; static jmethodID g_LoadFileMethodId; static jmethodID g_MoveTaskToBackMethodId; @@ -37,6 +39,7 @@ jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) jclass clazz = env->FindClass("com/live2d/demo/JniBridgeJava"); g_JniBridgeJavaClass = reinterpret_cast(env->NewGlobalRef(clazz)); + g_GetAssetsMethodId = env->GetStaticMethodID(g_JniBridgeJavaClass, "GetAssetList", "(Ljava/lang/String;)[Ljava/lang/String;"); g_LoadFileMethodId = env->GetStaticMethodID(g_JniBridgeJavaClass, "LoadFile", "(Ljava/lang/String;)[B"); g_MoveTaskToBackMethodId = env->GetStaticMethodID(g_JniBridgeJavaClass, "MoveTaskToBack", "()V"); @@ -49,6 +52,23 @@ void JNICALL JNI_OnUnload(JavaVM *vm, void *reserved) env->DeleteGlobalRef(g_JniBridgeJavaClass); } +Csm::csmVectorJniBridgeC::GetAssetList(const Csm::csmString& path) +{ + JNIEnv *env = GetEnv(); + jobjectArray obj = reinterpret_cast(env->CallStaticObjectMethod(g_JniBridgeJavaClass, g_GetAssetsMethodId, env->NewStringUTF(path.GetRawString()))); + unsigned int size = static_cast(env->GetArrayLength(obj)); + Csm::csmVector list(size); + for (unsigned int i = 0; i < size; i++) + { + jstring jstr = reinterpret_cast(env->GetObjectArrayElement(obj, i)); + const char* chars = env->GetStringUTFChars(jstr, nullptr); + list.PushBack(Csm::csmString(chars)); + env->ReleaseStringUTFChars(jstr, chars); + env->DeleteLocalRef(jstr); + } + return list; +} + char* JniBridgeC::LoadFileAsBytesFromJava(const char* filePath, unsigned int* outSize) { JNIEnv *env = GetEnv(); @@ -133,4 +153,3 @@ extern "C" LAppDelegate::GetInstance()->OnTouchMoved(pointX, pointY); } } - diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/JniBridgeC.hpp b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/JniBridgeC.hpp index d75e99a5..ef312006 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/JniBridgeC.hpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/JniBridgeC.hpp @@ -5,7 +5,9 @@ * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. */ - #pragma once +#pragma once +#include +#include /** * @brief Jni Bridge Class @@ -13,6 +15,11 @@ class JniBridgeC { public: + /** + * @brief Assets 取得 + */ + static Csm::csmVector GetAssetList(const Csm::csmString& path); + /** * @brief Javaからファイル読み込み */ @@ -22,4 +29,5 @@ class JniBridgeC * @brief アプリをバックグラウンドに移動 */ static void MoveTaskToBack(); + }; diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppDefine.cpp b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppDefine.cpp index 465e9ec4..ac352ea6 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppDefine.cpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppDefine.cpp @@ -38,18 +38,6 @@ namespace LAppDefine { const csmChar* PowerImageName = "close.png"; // モデル定義------------------------------------------ - // モデルを配置したディレクトリ名の配列 - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと - const csmChar* ModelDir[] = { - "Haru", - "Hiyori", - "Mark", - "Natori", - "Rice", - "Mao" - }; - const csmInt32 ModelDirSize = sizeof(ModelDir) / sizeof(const csmChar*); - // 外部定義ファイル(json)と合わせる const csmChar* MotionGroupIdle = "Idle"; // アイドリング const csmChar* MotionGroupTapBody = "TapBody"; // 体をタップしたとき diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppDefine.hpp b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppDefine.hpp index cfc214c6..c8b7eb61 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppDefine.hpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppDefine.hpp @@ -37,9 +37,6 @@ namespace LAppDefine { extern const csmChar* PowerImageName; ///< 終了ボタン画像ファイル // モデル定義-------------------------------------------- - extern const csmChar* ModelDir[]; ///< モデルを配置したディレクトリ名の配列. ディレクトリ名とmodel3.jsonの名前を一致させておく. - extern const csmInt32 ModelDirSize; ///< モデルディレクトリ配列のサイズ - // 外部定義ファイル(json)と合わせる extern const csmChar* MotionGroupIdle; ///< アイドリング時に再生するモーションのリスト extern const csmChar* MotionGroupTapBody; ///< 体をタップした時に再生するモーションのリスト diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppLive2DManager.cpp b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppLive2DManager.cpp index 3aabf97c..0f8a48e4 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppLive2DManager.cpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppLive2DManager.cpp @@ -6,7 +6,8 @@ */ #include "LAppLive2DManager.hpp" -#include +#include +#include #include #include #include "LAppPal.hpp" @@ -14,10 +15,10 @@ #include "LAppDelegate.hpp" #include "LAppModel.hpp" #include "LAppView.hpp" +#include "JniBridgeC.hpp" using namespace Csm; using namespace LAppDefine; -using namespace std; namespace { LAppLive2DManager* s_instance = NULL; @@ -26,6 +27,12 @@ namespace { { LAppPal::PrintLog("Motion Finished: %x", self); } + + int CompareCsmString(const void* a, const void* b) + { + return strcmp(reinterpret_cast(a)->GetRawString(), + reinterpret_cast(b)->GetRawString()); + } } LAppLive2DManager* LAppLive2DManager::GetInstance() @@ -53,6 +60,7 @@ LAppLive2DManager::LAppLive2DManager() , _sceneIndex(0) { _viewMatrix = new CubismMatrix44(); + SetUpModel(); ChangeScene(_sceneIndex); } @@ -72,6 +80,28 @@ void LAppLive2DManager::ReleaseAllModel() _models.Clear(); } +void LAppLive2DManager::SetUpModel() +{ + const char MODEL3_JSON[] = u8".model3.json"; + _modelDir.Clear(); + Csm::csmVector root = JniBridgeC::GetAssetList(""); + for (size_t i = 0; i < root.GetSize(); i++) + { + Csm::csmString target(root[i]); + target.Append(MODEL3_JSON, sizeof(MODEL3_JSON) - 1); + Csm::csmVector sub = JniBridgeC::GetAssetList(root[i].GetRawString()); + for (size_t j = 0; j < sub.GetSize(); j++) + { + if (target == sub[j]) + { + _modelDir.PushBack(root[i]); + break; + } + } + } + qsort(_modelDir.GetPtr(), _modelDir.GetSize(), sizeof(csmString), CompareCsmString); +} + LAppModel* LAppLive2DManager::GetModel(csmUint32 no) const { if (no < _models.GetSize()) @@ -167,7 +197,7 @@ void LAppLive2DManager::OnUpdate() const void LAppLive2DManager::NextScene() { - csmInt32 no = (_sceneIndex + 1) % ModelDirSize; + csmInt32 no = (_sceneIndex + 1) % _modelDir.GetSize(); ChangeScene(no); } @@ -179,17 +209,16 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) LAppPal::PrintLog("[APP]model index: %d", _sceneIndex); } - // ModelDir[]に保持したディレクトリ名から // model3.jsonのパスを決定する. - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと. - std::string model = ModelDir[index]; - std::string modelPath = ResourcesPath + model + "/"; - std::string modelJsonName = ModelDir[index]; + // ディレクトリ名とmodel3.jsonの名前を一致していることが条件 + csmString modelPath(ResourcesPath); + modelPath += _modelDir[index] + "/"; + csmString modelJsonName(_modelDir[index]); modelJsonName += ".model3.json"; ReleaseAllModel(); _models.PushBack(new LAppModel()); - _models[0]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[0]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); /* * モデル半透明表示を行うサンプルを提示する。 @@ -211,7 +240,7 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) #if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) // モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす _models.PushBack(new LAppModel()); - _models[1]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[1]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); _models[1]->GetModelMatrix()->TranslateX(0.2f); #endif diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppLive2DManager.hpp b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppLive2DManager.hpp index e8010bd7..b6921446 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppLive2DManager.hpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppLive2DManager.hpp @@ -10,6 +10,7 @@ #include #include #include +#include class LAppModel; @@ -36,6 +37,12 @@ class LAppLive2DManager */ static void ReleaseInstance(); + /** + * @brief Resources フォルダにあるモデルフォルダ名をセットする + * + */ + void SetUpModel(); + /** * @brief 現在のシーンで保持しているモデルを返す * @@ -115,4 +122,6 @@ class LAppLive2DManager Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 Csm::csmVector _models; ///< モデルインスタンスのコンテナ Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + + Csm::csmVector _modelDir; ///< モデルディレクトリ名のコンテナ }; diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppModel.cpp b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppModel.cpp index a241235e..a5f9697d 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppModel.cpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppModel.cpp @@ -65,7 +65,7 @@ LAppModel::LAppModel() LAppModel::~LAppModel() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); ReleaseMotions(); ReleaseExpressions(); @@ -636,7 +636,7 @@ void LAppModel::MotionEventFired(const csmString& eventValue) CubismLogInfo("%s is fired on LAppModel!!", eventValue.GetRawString()); } -Csm::Rendering::CubismOffscreenFrame_OpenGLES2& LAppModel::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_OpenGLES2& LAppModel::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppModel.hpp b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppModel.hpp index 68c42788..036cf30a 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppModel.hpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppModel.hpp @@ -110,7 +110,7 @@ class LAppModel : public Csm::CubismUserModel /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_OpenGLES2& GetRenderBuffer(); protected: /** @@ -181,8 +181,5 @@ class LAppModel : public Csm::CubismUserModel const Csm::CubismId* _idParamEyeBallX; ///< パラメータID: ParamEyeBallX const Csm::CubismId* _idParamEyeBallY; ///< パラメータID: ParamEyeBallXY - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 }; - - - diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppView.cpp b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppView.cpp index 391b9c52..e5af235e 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppView.cpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppView.cpp @@ -51,7 +51,7 @@ LAppView::LAppView(): LAppView::~LAppView() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); delete _renderSprite; delete _viewMatrix; @@ -296,7 +296,7 @@ float LAppView::TransformScreenY(float deviceY) const void LAppView::PreModelDraw(LAppModel &refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 @@ -310,7 +310,7 @@ void LAppView::PreModelDraw(LAppModel &refModel) int height = LAppDelegate::GetInstance()->GetWindowHeight(); // モデル描画キャンバス - useTarget->CreateOffscreenFrame(static_cast(width), static_cast(height)); + useTarget->CreateOffscreenSurface(static_cast(width), static_cast(height)); } // レンダリング開始 @@ -322,7 +322,7 @@ void LAppView::PreModelDraw(LAppModel &refModel) void LAppView::PostModelDraw(LAppModel &refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppView.hpp b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppView.hpp index 6fe09da9..db0f8abd 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppView.hpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/cpp/LAppView.hpp @@ -158,7 +158,7 @@ class LAppView // レンダリング先を別ターゲットにする方式の場合に使用 LAppSprite* _renderSprite; ///< モードによっては_renderBufferのテクスチャを描画 - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング SelectTarget _renderTarget; ///< レンダリング先の選択肢 float _clearColor[4]; ///< レンダリングターゲットのクリアカラー }; diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/java/com/live2d/demo/JniBridgeJava.java b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/java/com/live2d/demo/JniBridgeJava.java index 20ded6b5..90df49e4 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/java/com/live2d/demo/JniBridgeJava.java +++ b/Samples/OpenGL/Demo/proj.android.cmake/Full/app/src/main/java/com/live2d/demo/JniBridgeJava.java @@ -55,6 +55,15 @@ public static void SetActivityInstance(Activity activity) { _activityInstance = activity; } + public static String[] GetAssetList(String dirPath) { + try { + return _context.getAssets().list(dirPath); + } catch (IOException e) { + e.printStackTrace(); + return new String[0]; + } + } + public static byte[] LoadFile(String filePath) { InputStream fileData = null; try { diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppDefine.cpp b/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppDefine.cpp index 465e9ec4..9fad5af1 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppDefine.cpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppDefine.cpp @@ -46,7 +46,8 @@ namespace LAppDefine { "Mark", "Natori", "Rice", - "Mao" + "Mao", + "Wanko" }; const csmInt32 ModelDirSize = sizeof(ModelDir) / sizeof(const csmChar*); diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumModel.cpp b/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumModel.cpp index 0fe1287d..5bb9c28c 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumModel.cpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumModel.cpp @@ -493,7 +493,7 @@ void LAppMinimumModel::MotionEventFired(const csmString& eventValue) CubismLogInfo("%s is fired on LAppMinimumModel!!", eventValue.GetRawString()); } -Csm::Rendering::CubismOffscreenFrame_OpenGLES2 &LAppMinimumModel::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_OpenGLES2 &LAppMinimumModel::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumModel.hpp b/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumModel.hpp index 1f12ddbe..97211c3b 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumModel.hpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumModel.hpp @@ -103,7 +103,7 @@ class LAppMinimumModel : public Csm::CubismUserModel /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_OpenGLES2& GetRenderBuffer(); private: /** @@ -156,8 +156,5 @@ class LAppMinimumModel : public Csm::CubismUserModel const Csm::CubismId* _idParamEyeBallX; ///< パラメータID: ParamEyeBallX const Csm::CubismId* _idParamEyeBallY; ///< パラメータID: ParamEyeBallXY - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 }; - - - diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumView.cpp b/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumView.cpp index 8e84164d..a22ec51c 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumView.cpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumView.cpp @@ -48,7 +48,7 @@ LAppMinimumView::LAppMinimumView(): LAppMinimumView::~LAppMinimumView() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); delete _renderSprite; delete _viewMatrix; @@ -209,7 +209,7 @@ float LAppMinimumView::TransformScreenY(float deviceY) const void LAppMinimumView::PreModelDraw(LAppMinimumModel &refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = nullptr; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = nullptr; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 @@ -223,7 +223,7 @@ void LAppMinimumView::PreModelDraw(LAppMinimumModel &refModel) int height = LAppMinimumDelegate::GetInstance()->GetWindowHeight(); // モデル描画キャンバス - useTarget->CreateOffscreenFrame(static_cast(width), static_cast(height)); + useTarget->CreateOffscreenSurface(static_cast(width), static_cast(height)); } // レンダリング開始 @@ -235,7 +235,7 @@ void LAppMinimumView::PreModelDraw(LAppMinimumModel &refModel) void LAppMinimumView::PostModelDraw(LAppMinimumModel &refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = nullptr; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = nullptr; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 diff --git a/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumView.hpp b/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumView.hpp index c10cc1ed..d3d7d522 100644 --- a/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumView.hpp +++ b/Samples/OpenGL/Demo/proj.android.cmake/Minimum/app/src/main/cpp/LAppMinimumView.hpp @@ -154,7 +154,7 @@ class LAppMinimumView // レンダリング先を別ターゲットにする方式の場合に使用 LAppSprite* _renderSprite; ///< モードによっては_renderBufferのテクスチャを描画 - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング SelectTarget _renderTarget; ///< レンダリング先の選択肢 float _clearColor[4]; ///< レンダリングターゲットのクリアカラー }; diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppDefine.h b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppDefine.h index 35a912f8..5395f688 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppDefine.h +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppDefine.h @@ -39,9 +39,6 @@ namespace LAppDefine { extern const csmChar* PowerImageName; ///< 終了ボタン画像ファイル // モデル定義-------------------------------------------- - extern const csmChar* ModelDir[]; ///< モデルを配置したディレクトリ名の配列. ディレクトリ名とmodel3.jsonの名前を一致させておく. - extern const csmInt32 ModelDirSize; ///< モデルディレクトリ配列のサイズ - // 外部定義ファイル(json)と合わせる extern const csmChar* MotionGroupIdle; ///< アイドリング時に再生するモーションのリスト extern const csmChar* MotionGroupTapBody; ///< 体をタップした時に再生するモーションのリスト diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppDefine.mm b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppDefine.mm index 520da543..3d77f2b3 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppDefine.mm +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppDefine.mm @@ -38,18 +38,6 @@ const csmChar* PowerImageName = "close.png"; // モデル定義------------------------------------------ - // モデルを配置したディレクトリ名の配列 - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと - const csmChar* ModelDir[] = { - "Haru", - "Hiyori", - "Mark", - "Natori", - "Rice", - "Mao" - }; - const csmInt32 ModelDirSize = sizeof(ModelDir) / sizeof(const csmChar*); - // 外部定義ファイル(json)と合わせる const csmChar* MotionGroupIdle = "Idle"; // アイドリング const csmChar* MotionGroupTapBody = "TapBody"; // 体をタップしたとき diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppLive2DManager.h b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppLive2DManager.h index db579bad..90f2d831 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppLive2DManager.h +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppLive2DManager.h @@ -9,8 +9,10 @@ #define LAppLive2DManager_h #import +#import #import #import +#import #import "LAppModel.h" @interface LAppLive2DManager : NSObject @@ -19,6 +21,8 @@ @property (nonatomic) Csm::csmVector models; //モデルインスタンスのコンテナ @property (nonatomic) Csm::csmInt32 sceneIndex; //表示するシーンのインデックス値 +@property (nonatomic) Csm::csmVector modelDir; ///< モデルディレクトリ名のコンテナ + /** * @brief クラスのインスタンスを返す。 * インスタンスが生成されていない場合は内部でインスタンスを生成する。 @@ -43,6 +47,11 @@ */ - (void)releaseAllModel; +/** + * @brief Resources フォルダにあるモデルフォルダ名をセットする + */ +- (void)setUpModel; + /** * @brief 画面をドラッグしたときの処理 * diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppLive2DManager.mm b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppLive2DManager.mm index 47e43cd6..c1a2737d 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppLive2DManager.mm +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppLive2DManager.mm @@ -5,9 +5,10 @@ * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. */ -#import -#import #import "LAppLive2DManager.h" +#import +#import +#import #import "AppDelegate.h" #import "ViewController.h" #import "LAppModel.h" @@ -24,12 +25,28 @@ @implementation LAppLive2DManager static LAppLive2DManager* s_instance = nil; - void FinishedMotion(Csm::ACubismMotion* self) { LAppPal::PrintLog("Motion Finished: %x", self); } +int CompareCsmString(const void* a, const void* b) +{ + return strcmp(reinterpret_cast(a)->GetRawString(), + reinterpret_cast(b)->GetRawString()); +} + +Csm::csmString GetPath(CFURLRef url) +{ + CFStringRef cfstr = CFURLCopyFileSystemPath(url, CFURLPathStyle::kCFURLPOSIXPathStyle); + CFIndex size = CFStringGetLength(cfstr) * 4 + 1; // Length * UTF-16 Max Character size + null-terminated-byte + char* buf = new char[size]; + CFStringGetCString(cfstr, buf, size, CFStringBuiltInEncodings::kCFStringEncodingUTF8); + Csm::csmString result(buf); + delete[] buf; + return result; +} + + (LAppLive2DManager*)getInstance { @synchronized(self) @@ -59,6 +76,8 @@ - (id)init _viewMatrix = new Csm::CubismMatrix44(); + [self setUpModel]; + [self changeScene:_sceneIndex]; } return self; @@ -79,6 +98,30 @@ - (void)releaseAllModel _models.Clear(); } +- (void)setUpModel +{ + _modelDir.Clear(); + + NSBundle* bundle = [NSBundle mainBundle]; + NSString* resPath = [NSString stringWithUTF8String:LAppDefine::ResourcesPath]; + NSArray* resArr = [bundle pathsForResourcesOfType:NULL inDirectory:resPath]; + NSUInteger cnt = [resArr count]; + + for (NSUInteger i = 0; i < cnt; i++) + { + NSString* modelName = [[resArr objectAtIndex:i] lastPathComponent]; + NSMutableString* modelDirPath = [NSMutableString stringWithString:resPath]; + [modelDirPath appendString:@"/"]; + [modelDirPath appendString:modelName]; + NSArray* model3json = [bundle pathsForResourcesOfType:@".model3.json" inDirectory:modelDirPath]; + if ([model3json count] == 1) + { + _modelDir.PushBack(Csm::csmString([modelName UTF8String])); + } + } + qsort(_modelDir.GetPtr(), _modelDir.GetSize(), sizeof(Csm::csmString), CompareCsmString); +} + - (LAppModel*)getModel:(Csm::csmUint32)no { if (no < _models.GetSize()) @@ -174,7 +217,7 @@ - (void)onUpdate; - (void)nextScene; { - Csm::csmInt32 no = (_sceneIndex + 1) % LAppDefine::ModelDirSize; + Csm::csmInt32 no = (_sceneIndex + 1) % _modelDir.GetSize(); [self changeScene:no]; } @@ -186,17 +229,20 @@ - (void)changeScene:(Csm::csmInt32)index; LAppPal::PrintLog("[APP]model index: %d", _sceneIndex); } - // ModelDir[]に保持したディレクトリ名から // model3.jsonのパスを決定する. // ディレクトリ名とmodel3.jsonの名前を一致させておくこと. - std::string model = LAppDefine::ModelDir[index]; - std::string modelPath = LAppDefine::ResourcesPath + model + "/"; - std::string modelJsonName = LAppDefine::ModelDir[index]; + const Csm::csmString& model = _modelDir[index]; + + Csm::csmString modelPath(LAppDefine::ResourcesPath); + modelPath += model; + modelPath.Append(1, '/'); + + Csm::csmString modelJsonName(model); modelJsonName += ".model3.json"; [self releaseAllModel]; _models.PushBack(new LAppModel()); - _models[0]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[0]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); /* * モデル半透明表示を行うサンプルを提示する。 @@ -218,7 +264,7 @@ - (void)changeScene:(Csm::csmInt32)index; #if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) // モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす _models.PushBack(new LAppModel()); - _models[1]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[1]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); _models[1]->GetModelMatrix()->TranslateX(0.2f); #endif diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppModel.h b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppModel.h index 2f83a03b..780d625e 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppModel.h +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppModel.h @@ -111,7 +111,7 @@ class LAppModel : public Csm::CubismUserModel /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_OpenGLES2& GetRenderBuffer(); protected: /** @@ -182,7 +182,7 @@ class LAppModel : public Csm::CubismUserModel const Csm::CubismId* _idParamEyeBallX; ///< パラメータID: ParamEyeBallX const Csm::CubismId* _idParamEyeBallY; ///< パラメータID: ParamEyeBallXY - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; }; #endif /* LAppModel_h */ diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppModel.mm b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppModel.mm index 9e6e8499..3e5a8851 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppModel.mm +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/LAppModel.mm @@ -66,7 +66,7 @@ void DeleteBuffer(csmByte* buffer, const csmChar* path = "") LAppModel::~LAppModel() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); ReleaseMotions(); ReleaseExpressions(); @@ -630,7 +630,7 @@ void DeleteBuffer(csmByte* buffer, const csmChar* path = "") CubismLogInfo("%s is fired on LAppModel!!", eventValue.GetRawString()); } -Csm::Rendering::CubismOffscreenFrame_OpenGLES2& LAppModel::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_OpenGLES2& LAppModel::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/ViewController.h b/Samples/OpenGL/Demo/proj.ios.cmake/src/ViewController.h index 7b421a83..6f935705 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/ViewController.h +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/ViewController.h @@ -26,7 +26,7 @@ typedef NS_ENUM(NSUInteger, SelectTarget) @property (nonatomic) GLuint programId; @property (nonatomic) bool anotherTarget; -@property (nonatomic) Csm::Rendering::CubismOffscreenFrame_OpenGLES2 renderBuffer; +@property (nonatomic) Csm::Rendering::CubismOffscreenSurface_OpenGLES2 renderBuffer; @property (nonatomic) float spriteColorR; @property (nonatomic) float spriteColorG; diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/ViewController.mm b/Samples/OpenGL/Demo/proj.ios.cmake/src/ViewController.mm index d5627d29..139a9e31 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/ViewController.mm +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/ViewController.mm @@ -45,7 +45,7 @@ @implementation ViewController - (void)releaseView { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); _renderSprite = nil; _gear = nil; @@ -194,7 +194,7 @@ - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect if (model) { - Csm::Rendering::CubismOffscreenFrame_OpenGLES2& useTarget = model->GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_OpenGLES2& useTarget = model->GetRenderBuffer(); GLuint id = useTarget.GetColorBuffer(); [_renderSprite renderImmidiate:_vertexBufferId fragmentBufferID:_fragmentBufferId TextureId:id uvArray:uvVertex]; } @@ -340,7 +340,7 @@ - (float)transformTapY:(float)deviceY - (void)PreModelDraw:(LAppModel&)refModel { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 @@ -358,11 +358,11 @@ - (void)PreModelDraw:(LAppModel&)refModel // PadとPhoneで縦横を変えている if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { - useTarget->CreateOffscreenFrame(height, width); + useTarget->CreateOffscreenSurface(height, width); } else { - useTarget->CreateOffscreenFrame(width, height); + useTarget->CreateOffscreenSurface(width, height); } } @@ -375,7 +375,7 @@ - (void)PreModelDraw:(LAppModel&)refModel - (void)PostModelDraw:(LAppModel&)refModel { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinLAppModel.h b/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinLAppModel.h index 82e0201f..e9b35442 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinLAppModel.h +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinLAppModel.h @@ -86,7 +86,7 @@ class MinLAppModel : public Csm::CubismUserModel /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_OpenGLES2& GetRenderBuffer(); /** * @brief model3.jsonからモデルを生成する。
@@ -153,7 +153,7 @@ class MinLAppModel : public Csm::CubismUserModel const Csm::CubismId* _idParamEyeBallX; ///< パラメータID: ParamEyeBallX const Csm::CubismId* _idParamEyeBallY; ///< パラメータID: ParamEyeBallXY - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; }; #endif /* MinLAppModel_h */ diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinLAppModel.mm b/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinLAppModel.mm index 32cc57a2..f6276857 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinLAppModel.mm +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinLAppModel.mm @@ -68,7 +68,7 @@ void DeleteBuffer(csmByte* buffer, const csmChar* path = "") MinLAppModel::~MinLAppModel() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); ReleaseMotions(); ReleaseExpressions(); @@ -466,7 +466,7 @@ void DeleteBuffer(csmByte* buffer, const csmChar* path = "") CubismLogInfo("%s is fired on MinLAppModel!!", eventValue.GetRawString()); } -Csm::Rendering::CubismOffscreenFrame_OpenGLES2& MinLAppModel::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_OpenGLES2& MinLAppModel::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinViewController.h b/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinViewController.h index 4dc631e3..f1203f54 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinViewController.h +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinViewController.h @@ -26,7 +26,7 @@ typedef NS_ENUM(NSUInteger, SelectTarget) @property (nonatomic) GLuint programId; @property (nonatomic) bool anotherTarget; -@property (nonatomic) Csm::Rendering::CubismOffscreenFrame_OpenGLES2 renderBuffer; +@property (nonatomic) Csm::Rendering::CubismOffscreenSurface_OpenGLES2 renderBuffer; @property (nonatomic) float spriteColorR; @property (nonatomic) float spriteColorG; diff --git a/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinViewController.mm b/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinViewController.mm index 9b931419..4b96a8b4 100644 --- a/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinViewController.mm +++ b/Samples/OpenGL/Demo/proj.ios.cmake/src/minimum/MinViewController.mm @@ -42,7 +42,7 @@ @implementation MinViewController - (void)releaseView { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); _renderSprite = nil; @@ -177,7 +177,7 @@ - (void)glkView:(GLKView *)view drawInRect:(CGRect)rect MinLAppModel* model = [Live2DManager getModel]; if (model) { - Csm::Rendering::CubismOffscreenFrame_OpenGLES2& useTarget = model->GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_OpenGLES2& useTarget = model->GetRenderBuffer(); GLuint id = useTarget.GetColorBuffer(); [_renderSprite renderImmidiate:_vertexBufferId fragmentBufferID:_fragmentBufferId TextureId:id uvArray:uvVertex]; } @@ -285,7 +285,7 @@ - (float)transformTapY:(float)deviceY - (void)PreModelDraw:(MinLAppModel&)refModel { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 @@ -303,11 +303,11 @@ - (void)PreModelDraw:(MinLAppModel&)refModel // PadとPhoneで縦横を変えている if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { - useTarget->CreateOffscreenFrame(height, width); + useTarget->CreateOffscreenSurface(height, width); } else { - useTarget->CreateOffscreenFrame(width, height); + useTarget->CreateOffscreenSurface(width, height); } } @@ -320,7 +320,7 @@ - (void)PreModelDraw:(MinLAppModel&)refModel - (void)PostModelDraw:(MinLAppModel&)refModel { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 diff --git a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppDefine.cpp b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppDefine.cpp index 7eec0695..20008c42 100644 --- a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppDefine.cpp +++ b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppDefine.cpp @@ -38,18 +38,6 @@ namespace LAppDefine { const csmChar* PowerImageName = "close.png"; // モデル定義------------------------------------------ - // モデルを配置したディレクトリ名の配列 - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと - const csmChar* ModelDir[] = { - "Haru", - "Hiyori", - "Mark", - "Natori", - "Rice", - "Mao" - }; - const csmInt32 ModelDirSize = sizeof(ModelDir) / sizeof(const csmChar*); - // 外部定義ファイル(json)と合わせる const csmChar* MotionGroupIdle = "Idle"; // アイドリング const csmChar* MotionGroupTapBody = "TapBody"; // 体をタップしたとき diff --git a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppDefine.hpp b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppDefine.hpp index 0e8e545e..8641224a 100644 --- a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppDefine.hpp +++ b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppDefine.hpp @@ -37,9 +37,6 @@ namespace LAppDefine { extern const csmChar* PowerImageName; ///< 終了ボタン画像ファイル // モデル定義-------------------------------------------- - extern const csmChar* ModelDir[]; ///< モデルを配置したディレクトリ名の配列. ディレクトリ名とmodel3.jsonの名前を一致させておく. - extern const csmInt32 ModelDirSize; ///< モデルディレクトリ配列のサイズ - // 外部定義ファイル(json)と合わせる extern const csmChar* MotionGroupIdle; ///< アイドリング時に再生するモーションのリスト extern const csmChar* MotionGroupTapBody; ///< 体をタップした時に再生するモーションのリスト diff --git a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppLive2DManager.cpp b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppLive2DManager.cpp index 66cebe42..f982c33a 100644 --- a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppLive2DManager.cpp +++ b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppLive2DManager.cpp @@ -6,7 +6,13 @@ */ #include "LAppLive2DManager.hpp" -#include +#include +#include +#include +#include +#include +#include +#include #include #include #include @@ -19,7 +25,6 @@ using namespace Csm; using namespace LAppDefine; -using namespace std; namespace { LAppLive2DManager* s_instance = NULL; @@ -28,6 +33,12 @@ namespace { { LAppPal::PrintLog("Motion Finished: %x", self); } + + int CompareCsmString(const void* a, const void* b) + { + return strcmp(reinterpret_cast(a)->GetRawString(), + reinterpret_cast(b)->GetRawString()); + } } LAppLive2DManager* LAppLive2DManager::GetInstance() @@ -55,6 +66,7 @@ LAppLive2DManager::LAppLive2DManager() , _sceneIndex(0) { _viewMatrix = new CubismMatrix44(); + SetUpModel(); ChangeScene(_sceneIndex); } @@ -74,6 +86,60 @@ void LAppLive2DManager::ReleaseAllModel() _models.Clear(); } +void LAppLive2DManager::SetUpModel() +{ + // ResourcesPathの中にあるフォルダ名を全てクロールし、モデルが存在するフォルダを定義する。 + // フォルダはあるが同名の.model3.jsonが見つからなかった場合はリストに含めない。 + struct dirent *dirent; + csmString crawlPath(LAppDelegate::GetInstance()->GetRootDirectory().c_str()); + crawlPath += ResourcesPath; + + DIR *pDir = opendir(crawlPath.GetRawString()); + if (pDir == NULL) return; + + _modelDir.Clear(); + + while ((dirent = readdir(pDir)) != NULL) + { + if ((dirent->d_type & DT_DIR) && strcmp(dirent->d_name, "..") != 0) + { + // フォルダと同名の.model3.jsonがあるか探索する + struct dirent *dirent2; + + csmString modelName(dirent->d_name); + + csmString modelPath(crawlPath); + modelPath += modelName; + modelPath.Append(1, '/'); + + csmString model3jsonName(modelName); + model3jsonName += ".model3.json"; + + DIR *pDir2 = opendir(modelPath.GetRawString()); + while ((dirent2 = readdir(pDir2)) != NULL) + { + if (strcmp(dirent2->d_name, model3jsonName.GetRawString()) == 0) + { + _modelDir.PushBack(csmString(dirent->d_name)); + } + } + closedir(pDir2); + } + } + closedir(pDir); + qsort(_modelDir.GetPtr(), _modelDir.GetSize(), sizeof(csmString), CompareCsmString); +} + +csmVector LAppLive2DManager::GetModelDir() const +{ + return _modelDir; +} + +csmInt32 LAppLive2DManager::GetModelDirSize() const +{ + return _modelDir.GetSize(); +} + LAppModel* LAppLive2DManager::GetModel(csmUint32 no) const { if (no < _models.GetSize()) @@ -167,7 +233,7 @@ void LAppLive2DManager::OnUpdate() const void LAppLive2DManager::NextScene() { - csmInt32 no = (_sceneIndex + 1) % ModelDirSize; + csmInt32 no = (_sceneIndex + 1) % GetModelDirSize(); ChangeScene(no); } @@ -182,14 +248,20 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) // ModelDir[]に保持したディレクトリ名から // model3.jsonのパスを決定する. // ディレクトリ名とmodel3.jsonの名前を一致させておくこと. - std::string model = ModelDir[index]; - std::string modelPath = LAppDelegate::GetInstance()->GetRootDirectory() + ResourcesPath + model + "/"; - std::string modelJsonName = ModelDir[index]; + const csmString& model = _modelDir[index]; + LAppPal::PrintLog("[APP]_modelDir: %s", model.GetRawString()); + + csmString modelPath(LAppDelegate::GetInstance()->GetRootDirectory().c_str()); + modelPath += ResourcesPath; + modelPath += model; + modelPath.Append(1, '/'); + + csmString modelJsonName(model); modelJsonName += ".model3.json"; ReleaseAllModel(); _models.PushBack(new LAppModel()); - _models[0]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[0]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); /* * モデル半透明表示を行うサンプルを提示する。 @@ -211,7 +283,7 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) #if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) // モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす _models.PushBack(new LAppModel()); - _models[1]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[1]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); _models[1]->GetModelMatrix()->TranslateX(0.2f); #endif diff --git a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppLive2DManager.hpp b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppLive2DManager.hpp index 5c5e6cd0..6502fc99 100644 --- a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppLive2DManager.hpp +++ b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppLive2DManager.hpp @@ -35,6 +35,24 @@ class LAppLive2DManager */ static void ReleaseInstance(); + /** + * @brief Resources フォルダにあるモデルフォルダ名をセットする + * + */ + void SetUpModel(); + + /** + * @brief Resources フォルダにあるモデルフォルダ名を取得する + * + */ + Csm::csmVector GetModelDir() const; + + /** + * @brief Resources フォルダにあるモデルフォルダのサイズを取得する + * + */ + Csm::csmInt32 GetModelDirSize() const; + /** * @brief 現在のシーンで保持しているモデルを返す * @@ -105,7 +123,9 @@ class LAppLive2DManager */ virtual ~LAppLive2DManager(); - Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 - Csm::csmVector _models; ///< モデルインスタンスのコンテナ - Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 + Csm::csmVector _models; ///< モデルインスタンスのコンテナ + Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + + Csm::csmVector _modelDir; ///< モデルディレクトリ名のコンテナ }; diff --git a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppModel.cpp b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppModel.cpp index 43b1ad77..ce008031 100644 --- a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppModel.cpp +++ b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppModel.cpp @@ -65,7 +65,7 @@ LAppModel::LAppModel() LAppModel::~LAppModel() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); ReleaseMotions(); ReleaseExpressions(); @@ -643,7 +643,7 @@ void LAppModel::MotionEventFired(const csmString& eventValue) CubismLogInfo("%s is fired on LAppModel!!", eventValue.GetRawString()); } -Csm::Rendering::CubismOffscreenFrame_OpenGLES2& LAppModel::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_OpenGLES2& LAppModel::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppModel.hpp b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppModel.hpp index 5b663652..46f72277 100644 --- a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppModel.hpp +++ b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppModel.hpp @@ -112,7 +112,7 @@ class LAppModel : public Csm::CubismUserModel /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_OpenGLES2& GetRenderBuffer(); protected: /** @@ -185,8 +185,5 @@ class LAppModel : public Csm::CubismUserModel LAppWavFileHandler _wavFileHandler; ///< wavファイルハンドラ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 }; - - - diff --git a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppView.cpp b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppView.cpp index a66eee78..c15bebf3 100644 --- a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppView.cpp +++ b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppView.cpp @@ -47,7 +47,7 @@ LAppView::LAppView(): LAppView::~LAppView() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); delete _renderSprite; delete _viewMatrix; @@ -258,7 +258,7 @@ float LAppView::TransformScreenY(float deviceY) const void LAppView::PreModelDraw(LAppModel &refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 @@ -274,7 +274,7 @@ void LAppView::PreModelDraw(LAppModel &refModel) if(bufWidth!=0 && bufHeight!=0) { // モデル描画キャンバス - useTarget->CreateOffscreenFrame(static_cast(bufWidth), static_cast(bufHeight)); + useTarget->CreateOffscreenSurface(static_cast(bufWidth), static_cast(bufHeight)); } } @@ -287,7 +287,7 @@ void LAppView::PreModelDraw(LAppModel &refModel) void LAppView::PostModelDraw(LAppModel &refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 diff --git a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppView.hpp b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppView.hpp index 0068e702..c8cc61aa 100644 --- a/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppView.hpp +++ b/Samples/OpenGL/Demo/proj.linux.cmake/src/LAppView.hpp @@ -157,7 +157,7 @@ class LAppView // レンダリング先を別ターゲットにする方式の場合に使用 LAppSprite* _renderSprite; ///< モードによっては_renderBufferのテクスチャを描画 - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング SelectTarget _renderTarget; ///< レンダリング先の選択肢 float _clearColor[4]; ///< レンダリングターゲットのクリアカラー }; diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppDefine.cpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppDefine.cpp index 7eec0695..20008c42 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppDefine.cpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppDefine.cpp @@ -38,18 +38,6 @@ namespace LAppDefine { const csmChar* PowerImageName = "close.png"; // モデル定義------------------------------------------ - // モデルを配置したディレクトリ名の配列 - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと - const csmChar* ModelDir[] = { - "Haru", - "Hiyori", - "Mark", - "Natori", - "Rice", - "Mao" - }; - const csmInt32 ModelDirSize = sizeof(ModelDir) / sizeof(const csmChar*); - // 外部定義ファイル(json)と合わせる const csmChar* MotionGroupIdle = "Idle"; // アイドリング const csmChar* MotionGroupTapBody = "TapBody"; // 体をタップしたとき diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppDefine.hpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppDefine.hpp index 0e8e545e..8641224a 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppDefine.hpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppDefine.hpp @@ -37,9 +37,6 @@ namespace LAppDefine { extern const csmChar* PowerImageName; ///< 終了ボタン画像ファイル // モデル定義-------------------------------------------- - extern const csmChar* ModelDir[]; ///< モデルを配置したディレクトリ名の配列. ディレクトリ名とmodel3.jsonの名前を一致させておく. - extern const csmInt32 ModelDirSize; ///< モデルディレクトリ配列のサイズ - // 外部定義ファイル(json)と合わせる extern const csmChar* MotionGroupIdle; ///< アイドリング時に再生するモーションのリスト extern const csmChar* MotionGroupTapBody; ///< 体をタップした時に再生するモーションのリスト diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppLive2DManager.cpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppLive2DManager.cpp index b158eb7a..3ba5cae1 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppLive2DManager.cpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppLive2DManager.cpp @@ -6,7 +6,14 @@ */ #include "LAppLive2DManager.hpp" -#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include @@ -19,7 +26,6 @@ using namespace Csm; using namespace LAppDefine; -using namespace std; namespace { LAppLive2DManager* s_instance = NULL; @@ -28,6 +34,12 @@ namespace { { LAppPal::PrintLog("Motion Finished: %x", self); } + + int CompareCsmString(const void* a, const void* b) + { + return strcmp(reinterpret_cast(a)->GetRawString(), + reinterpret_cast(b)->GetRawString()); + } } LAppLive2DManager* LAppLive2DManager::GetInstance() @@ -55,6 +67,7 @@ LAppLive2DManager::LAppLive2DManager() , _sceneIndex(0) { _viewMatrix = new CubismMatrix44(); + SetUpModel(); ChangeScene(_sceneIndex); } @@ -84,6 +97,61 @@ LAppModel* LAppLive2DManager::GetModel(csmUint32 no) const return NULL; } +void LAppLive2DManager::SetUpModel() +{ + // ResourcesPathの中にあるフォルダ名を全てクロールし、モデルが存在するフォルダを定義する。 + // フォルダはあるが同名の.model3.jsonが見つからなかった場合はリストに含めない。 + struct dirent *dirent; + + csmString crawlPath(LAppDelegate::GetInstance()->GetRootDirectory().c_str()); + crawlPath += ResourcesPath; + + DIR *pDir = opendir(crawlPath.GetRawString()); + if (pDir == NULL) return; + + _modelDir.Clear(); + + while ((dirent = readdir(pDir)) != NULL) + { + if ((dirent->d_type & DT_DIR) && strcmp(dirent->d_name, "..") != 0) + { + // フォルダと同名の.model3.jsonがあるか探索する + struct dirent *dirent2; + + csmString modelName(dirent->d_name); + + csmString modelPath(crawlPath); + modelPath += modelName; + modelPath.Append(1, '/'); + + csmString model3jsonName(modelName); + model3jsonName += ".model3.json"; + + DIR *pDir2 = opendir(modelPath.GetRawString()); + while ((dirent2 = readdir(pDir2)) != NULL) + { + if (strcmp(dirent2->d_name, model3jsonName.GetRawString()) == 0) + { + _modelDir.PushBack(csmString(dirent->d_name)); + } + } + closedir(pDir2); + } + } + closedir(pDir); + qsort(_modelDir.GetPtr(), _modelDir.GetSize(), sizeof(csmString), CompareCsmString); +} + +csmVector LAppLive2DManager::GetModelDir() const +{ + return _modelDir; +} + +csmInt32 LAppLive2DManager::GetModelDirSize() const +{ + return _modelDir.GetSize(); +} + void LAppLive2DManager::OnDrag(csmFloat32 x, csmFloat32 y) const { for (csmUint32 i = 0; i < _models.GetSize(); i++) @@ -167,7 +235,7 @@ void LAppLive2DManager::OnUpdate() const void LAppLive2DManager::NextScene() { - csmInt32 no = (_sceneIndex + 1) % ModelDirSize; + csmInt32 no = (_sceneIndex + 1) % _modelDir.GetSize(); ChangeScene(no); } @@ -179,17 +247,21 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) LAppPal::PrintLog("[APP]model index: %d", _sceneIndex); } - // ModelDir[]に保持したディレクトリ名から // model3.jsonのパスを決定する. // ディレクトリ名とmodel3.jsonの名前を一致させておくこと. - std::string model = ModelDir[index]; - std::string modelPath = LAppDelegate::GetInstance()->GetRootDirectory() + ResourcesPath + model + "/"; - std::string modelJsonName = ModelDir[index]; + const csmString& model = _modelDir[index]; + + csmString modelPath(LAppDelegate::GetInstance()->GetRootDirectory().c_str()); + modelPath += ResourcesPath; + modelPath += model; + modelPath.Append(1, '/'); + + csmString modelJsonName(model); modelJsonName += ".model3.json"; ReleaseAllModel(); _models.PushBack(new LAppModel()); - _models[0]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[0]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); /* * モデル半透明表示を行うサンプルを提示する。 @@ -211,7 +283,7 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) #if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) // モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす _models.PushBack(new LAppModel()); - _models[1]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[1]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); _models[1]->GetModelMatrix()->TranslateX(0.2f); #endif diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppLive2DManager.hpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppLive2DManager.hpp index 5c5e6cd0..ee59b120 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppLive2DManager.hpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppLive2DManager.hpp @@ -49,6 +49,24 @@ class LAppLive2DManager */ void ReleaseAllModel(); + /** + * @brief Resフォルダにあるモデルフォルダ名をセットする + * + */ + void SetUpModel(); + + /** + * @brief Resフォルダにあるモデルフォルダ名を取得する + * + */ + Csm::csmVector GetModelDir() const; + + /** + * @brief Resフォルダにあるモデルフォルダのサイズを取得する + * + */ + Csm::csmInt32 GetModelDirSize() const; + /** * @brief 画面をドラッグしたときの処理 * @@ -108,4 +126,6 @@ class LAppLive2DManager Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 Csm::csmVector _models; ///< モデルインスタンスのコンテナ Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + + Csm::csmVector _modelDir; ///< モデルディレクトリ名のコンテナ }; diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppModel.cpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppModel.cpp index 43b1ad77..ce008031 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppModel.cpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppModel.cpp @@ -65,7 +65,7 @@ LAppModel::LAppModel() LAppModel::~LAppModel() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); ReleaseMotions(); ReleaseExpressions(); @@ -643,7 +643,7 @@ void LAppModel::MotionEventFired(const csmString& eventValue) CubismLogInfo("%s is fired on LAppModel!!", eventValue.GetRawString()); } -Csm::Rendering::CubismOffscreenFrame_OpenGLES2& LAppModel::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_OpenGLES2& LAppModel::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppModel.hpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppModel.hpp index 5b663652..46f72277 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppModel.hpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppModel.hpp @@ -112,7 +112,7 @@ class LAppModel : public Csm::CubismUserModel /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_OpenGLES2& GetRenderBuffer(); protected: /** @@ -185,8 +185,5 @@ class LAppModel : public Csm::CubismUserModel LAppWavFileHandler _wavFileHandler; ///< wavファイルハンドラ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 }; - - - diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.cpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.cpp index 7e8cfa93..848bfa98 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.cpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.cpp @@ -47,7 +47,7 @@ LAppView::LAppView(): LAppView::~LAppView() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); delete _renderSprite; delete _viewMatrix; @@ -258,7 +258,7 @@ float LAppView::TransformScreenY(float deviceY) const void LAppView::PreModelDraw(LAppModel &refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 @@ -274,7 +274,7 @@ void LAppView::PreModelDraw(LAppModel &refModel) if(bufWidth!=0 && bufHeight!=0) { // モデル描画キャンバス - useTarget->CreateOffscreenFrame(static_cast(bufWidth), static_cast(bufHeight)); + useTarget->CreateOffscreenSurface(static_cast(bufWidth), static_cast(bufHeight)); } } @@ -287,7 +287,7 @@ void LAppView::PreModelDraw(LAppModel &refModel) void LAppView::PostModelDraw(LAppModel &refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.hpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.hpp index 0068e702..c8cc61aa 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.hpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.hpp @@ -157,7 +157,7 @@ class LAppView // レンダリング先を別ターゲットにする方式の場合に使用 LAppSprite* _renderSprite; ///< モードによっては_renderBufferのテクスチャを描画 - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング SelectTarget _renderTarget; ///< レンダリング先の選択肢 float _clearColor[4]; ///< レンダリングターゲットのクリアカラー }; diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppDefine.cpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppDefine.cpp index 901b7e27..2ca324cc 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppDefine.cpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppDefine.cpp @@ -38,18 +38,6 @@ namespace LAppDefine { const csmChar* PowerImageName = "close.png"; // モデル定義------------------------------------------ - // モデルを配置したディレクトリ名の配列 - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと - const csmChar* ModelDir[] = { - "Haru", - "Hiyori", - "Mark", - "Natori", - "Rice", - "Mao" - }; - const csmInt32 ModelDirSize = sizeof(ModelDir) / sizeof(const csmChar*); - // 外部定義ファイル(json)と合わせる const csmChar* MotionGroupIdle = "Idle"; // アイドリング const csmChar* MotionGroupTapBody = "TapBody"; // 体をタップしたとき diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppDefine.hpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppDefine.hpp index b8f7b230..4a6a063b 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppDefine.hpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppDefine.hpp @@ -36,9 +36,6 @@ namespace LAppDefine { extern const csmChar* PowerImageName; ///< 終了ボタン画像ファイル // モデル定義-------------------------------------------- - extern const csmChar* ModelDir[]; ///< モデルを配置したディレクトリ名の配列. ディレクトリ名とmodel3.jsonの名前を一致させておく. - extern const csmInt32 ModelDirSize; ///< モデルディレクトリ配列のサイズ - // 外部定義ファイル(json)と合わせる extern const csmChar* MotionGroupIdle; ///< アイドリング時に再生するモーションのリスト extern const csmChar* MotionGroupTapBody; ///< 体をタップした時に再生するモーションのリスト diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppLive2DManager.cpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppLive2DManager.cpp index a2dde1b4..1fe40a63 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppLive2DManager.cpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppLive2DManager.cpp @@ -6,7 +6,9 @@ */ #include "LAppLive2DManager.hpp" -#include +#include +#include +#include #include #include #include @@ -27,6 +29,12 @@ namespace { { LAppPal::PrintLog("Motion Finished: %x", self); } + + int CompareCsmString(const void* a, const void* b) + { + return strcmp(reinterpret_cast(a)->GetRawString(), + reinterpret_cast(b)->GetRawString()); + } } LAppLive2DManager* LAppLive2DManager::GetInstance() @@ -54,6 +62,7 @@ LAppLive2DManager::LAppLive2DManager() , _sceneIndex(0) { _viewMatrix = new CubismMatrix44(); + SetUpModel(); ChangeScene(_sceneIndex); } @@ -73,6 +82,50 @@ void LAppLive2DManager::ReleaseAllModel() _models.Clear(); } +void LAppLive2DManager::SetUpModel() +{ + // ResourcesPathの中にあるフォルダ名を全てクロールし、モデルが存在するフォルダを定義する。 + // フォルダはあるが同名の.model3.jsonが見つからなかった場合はリストに含めない。 + csmString crawlPath(ResourcesPath); + crawlPath += "*.*"; + + struct _finddata_t fdata; + intptr_t fh = _findfirst(crawlPath.GetRawString(), &fdata); + if (fh == -1) return; + + _modelDir.Clear(); + + while (_findnext(fh, &fdata) == 0) + { + if ((fdata.attrib & _A_SUBDIR) && strcmp(fdata.name, "..") != 0) + { + // フォルダと同名の.model3.jsonがあるか探索する + csmString model3jsonPath(ResourcesPath); + model3jsonPath += fdata.name; + model3jsonPath.Append(1, '/'); + model3jsonPath += fdata.name; + model3jsonPath += ".model3.json"; + + struct _finddata_t fdata2; + if (_findfirst(model3jsonPath.GetRawString(), &fdata2) != -1) + { + _modelDir.PushBack(csmString(fdata.name)); + } + } + } + qsort(_modelDir.GetPtr(), _modelDir.GetSize(), sizeof(csmString), CompareCsmString); +} + +csmVector LAppLive2DManager::GetModelDir() const +{ + return _modelDir; +} + +csmInt32 LAppLive2DManager::GetModelDirSize() const +{ + return _modelDir.GetSize(); +} + LAppModel* LAppLive2DManager::GetModel(csmUint32 no) const { if (no < _models.GetSize()) @@ -168,7 +221,7 @@ void LAppLive2DManager::OnUpdate() const void LAppLive2DManager::NextScene() { - csmInt32 no = (_sceneIndex + 1) % ModelDirSize; + csmInt32 no = (_sceneIndex + 1) % GetModelDirSize(); ChangeScene(no); } @@ -180,17 +233,20 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) LAppPal::PrintLog("[APP]model index: %d", _sceneIndex); } - // ModelDir[]に保持したディレクトリ名から // model3.jsonのパスを決定する. - // ディレクトリ名とmodel3.jsonの名前を一致させておくこと. - std::string model = ModelDir[index]; - std::string modelPath = ResourcesPath + model + "/"; - std::string modelJsonName = ModelDir[index]; + // ディレクトリ名とmodel3.jsonの名前を一致していることが条件 + const csmString& model = _modelDir[index]; + + csmString modelPath(ResourcesPath); + modelPath += model; + modelPath.Append(1, '/'); + + csmString modelJsonName(model); modelJsonName += ".model3.json"; ReleaseAllModel(); _models.PushBack(new LAppModel()); - _models[0]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[0]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); /* * モデル半透明表示を行うサンプルを提示する。 @@ -212,7 +268,7 @@ void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) #if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) // モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす _models.PushBack(new LAppModel()); - _models[1]->LoadAssets(modelPath.c_str(), modelJsonName.c_str()); + _models[1]->LoadAssets(modelPath.GetRawString(), modelJsonName.GetRawString()); _models[1]->GetModelMatrix()->TranslateX(0.2f); #endif diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppLive2DManager.hpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppLive2DManager.hpp index 4043cdb1..15e32100 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppLive2DManager.hpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppLive2DManager.hpp @@ -36,6 +36,24 @@ class LAppLive2DManager */ static void ReleaseInstance(); + /** + * @brief Resources フォルダにあるモデルフォルダ名をセットする + * + */ + void SetUpModel(); + + /** + * @brief Resources フォルダにあるモデルフォルダ名を取得する + * + */ + Csm::csmVector GetModelDir() const; + + /** + * @brief Resources フォルダにあるモデルフォルダのサイズを取得する + * + */ + Csm::csmInt32 GetModelDirSize() const; + /** * @brief 現在のシーンで保持しているモデルを返す * @@ -106,7 +124,9 @@ class LAppLive2DManager */ virtual ~LAppLive2DManager(); - Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 - Csm::csmVector _models; ///< モデルインスタンスのコンテナ - Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 + Csm::csmVector _models; ///< モデルインスタンスのコンテナ + Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + + Csm::csmVector _modelDir; ///< モデルディレクトリ名のコンテナ }; diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppModel.cpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppModel.cpp index 9bd14cc4..55510406 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppModel.cpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppModel.cpp @@ -70,7 +70,7 @@ LAppModel::LAppModel() LAppModel::~LAppModel() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); ReleaseMotions(); ReleaseExpressions(); @@ -647,7 +647,7 @@ void LAppModel::MotionEventFired(const csmString& eventValue) CubismLogInfo("%s is fired on LAppModel!!", eventValue.GetRawString()); } -Csm::Rendering::CubismOffscreenFrame_OpenGLES2& LAppModel::GetRenderBuffer() +Csm::Rendering::CubismOffscreenSurface_OpenGLES2& LAppModel::GetRenderBuffer() { return _renderBuffer; } diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppModel.hpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppModel.hpp index 4b024ee8..9c8a70b1 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppModel.hpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppModel.hpp @@ -112,7 +112,7 @@ class LAppModel : public Csm::CubismUserModel /** * @brief 別ターゲットに描画する際に使用するバッファの取得 */ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2& GetRenderBuffer(); + Csm::Rendering::CubismOffscreenSurface_OpenGLES2& GetRenderBuffer(); /** * @brief .moc3ファイルの整合性をチェックする @@ -193,8 +193,5 @@ class LAppModel : public Csm::CubismUserModel LAppWavFileHandler _wavFileHandler; ///< wavファイルハンドラ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< フレームバッファ以外の描画先 }; - - - diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.cpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.cpp index e3ac10c7..d0b945a5 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.cpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.cpp @@ -45,7 +45,7 @@ LAppView::LAppView(): LAppView::~LAppView() { - _renderBuffer.DestroyOffscreenFrame(); + _renderBuffer.DestroyOffscreenSurface(); delete _renderSprite; delete _viewMatrix; delete _deviceToScreen; @@ -253,7 +253,7 @@ float LAppView::TransformScreenY(float deviceY) const void LAppView::PreModelDraw(LAppModel& refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 @@ -268,7 +268,7 @@ void LAppView::PreModelDraw(LAppModel& refModel) if (width != 0 && height != 0) { // モデル描画キャンバス - useTarget->CreateOffscreenFrame(static_cast(width), static_cast(height)); + useTarget->CreateOffscreenSurface(static_cast(width), static_cast(height)); } } @@ -281,7 +281,7 @@ void LAppView::PreModelDraw(LAppModel& refModel) void LAppView::PostModelDraw(LAppModel& refModel) { // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ - Csm::Rendering::CubismOffscreenFrame_OpenGLES2* useTarget = NULL; + Csm::Rendering::CubismOffscreenSurface_OpenGLES2* useTarget = NULL; if (_renderTarget != SelectTarget_None) {// 別のレンダリングターゲットへ向けて描画する場合 diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.hpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.hpp index 273683ff..3d8751db 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.hpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.hpp @@ -157,7 +157,7 @@ class LAppView // レンダリング先を別ターゲットにする方式の場合に使用 LAppSprite* _renderSprite; ///< モードによっては_renderBufferのテクスチャを描画 - Csm::Rendering::CubismOffscreenFrame_OpenGLES2 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + Csm::Rendering::CubismOffscreenSurface_OpenGLES2 _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング SelectTarget _renderTarget; ///< レンダリング先の選択肢 float _clearColor[4]; ///< レンダリングターゲットのクリアカラー }; diff --git a/Samples/OpenGL/README.ja.md b/Samples/OpenGL/README.ja.md index 84915df4..2cdcd67a 100644 --- a/Samples/OpenGL/README.ja.md +++ b/Samples/OpenGL/README.ja.md @@ -13,7 +13,7 @@ OpenGL で実装したアプリケーションのサンプル実装です。 | --- | --- | | [GLEW] | 2.2.0 | | [GLFW] | 3.3.8 | -| [ios-cmake] | 4.3.0 | +| [ios-cmake] | 4.4.0 | | [stb_image.h] | 2.28 | その他の開発環境・動作確認環境はトップディレクトリにある [README.md](/README.ja.md) を参照してください。 diff --git a/Samples/OpenGL/README.md b/Samples/OpenGL/README.md index ccd0a320..76b825ac 100644 --- a/Samples/OpenGL/README.md +++ b/Samples/OpenGL/README.md @@ -13,7 +13,7 @@ This is a sample implementation of an application implemented with OpenGL. | --- | --- | | [GLEW] | 2.2.0 | | [GLFW] | 3.3.8 | -| [ios-cmake] | 4.3.0 | +| [ios-cmake] | 4.4.0 | | [stb_image.h] | 2.28 | For other development environments and operation environments, see [README.md](/README.md) in the top directory. diff --git a/Samples/OpenGL/thirdParty/scripts/setup_ios_cmake b/Samples/OpenGL/thirdParty/scripts/setup_ios_cmake index 58dac88d..458e8f51 100644 --- a/Samples/OpenGL/thirdParty/scripts/setup_ios_cmake +++ b/Samples/OpenGL/thirdParty/scripts/setup_ios_cmake @@ -2,7 +2,7 @@ set -ue -IOS_CMAKE_VERSION=4.3.0 +IOS_CMAKE_VERSION=4.4.0 SCRIPT_PATH=$(cd $(dirname $0) && pwd) diff --git a/Samples/Resources/Wanko/Wanko.1024/texture_00.png b/Samples/Resources/Wanko/Wanko.1024/texture_00.png new file mode 100644 index 0000000000000000000000000000000000000000..09ee2826197d4a9dd9cf6a7ba32e3e328a79f25d GIT binary patch literal 566299 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�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

Qs#!$b;m zbkyVvgr?}Z zNaK~V5+oh{kEbh!Z6uRu9qRJYrmz2d0c*+OEEepoBQ0Nc%-3}`E6;ZYCT!Hdk~gBf zzrRLX+k2Oz6zs7$b@~y0l==^}6In=;5AZk{Qil2gC#7>tEs71nsh>_=4#8TNlan@` zZ~d2gmI<_CER9(}p`QG^bB(1juMSv^uk!q2@-U$~*CeOLhdNi=cPb{sS==;9f=Fu$ ztWT}#gLM1b2FrginI?r_=v#n`9$H1x9}=W1za0@|ITlNI2Y<^|Up_YI{V)_Gyi)nM zls)SBi|eq6P2k?h8a@>w4%}n_?@p>%ws(|U;UQSdu_W@T>jkYj_&8)PacO2Kcz>(elLrxbyu#4%NljJe zS<7QUf7zZ%N?7;dj6eK}BZ3FVJVwi%M1@Bbwcz#O9VT5Jhxs9RloO?9eorlpvuF_A zkQ~L&i0iG4Wic_k5ekXOS6gyrfb(v&?u~VC7!(^`qMpTP_j;-vlrncn7wXXd&*lr<_&^$>S0O% z_Z`#wQ&QK@^X_+m*qAHId~Uj@S!A6aobn4k6{gD*E`i)gZcQ0A?W@CzKR{q%?Hc<= zfELP64~-oEbzgY@moN*~*@KCsgJ>RS*Z5EF00=B!tQzJDGKI&ym^iF75!~)flLFRG zq6s1`ukbf_J>q_&JO^`sI;lZ}*zt*vY#(=j`b0eM7vK^*>KisQUU%=gdv)jmDS5p` zndz9c8m{iUOju{bGe`dajO`-G&KqhNo|w7mqAWxoW7K?wq4M6)Cm`oI=Gk3{EmA~2 z5|4Gb;F&Zk+)Pwqa$32~NeBpOw|D10!Y@@EqFesHwN)sv@`RFIBU`VN^`Vsb#NzKF zc9r|DB70Hoq8LP z%5#QEO8l(A^*Ocv!vQh_c86obT>vSP#guUT90Gm@*=rHtEAjLd*cFlw|vL|3piz+YL<4f|NQNo(Hu=(1Af1H_7*;KA)LH@xJcS+Gol zZA~_Tsm%rKF5KTspocADcXFlTrl3zw!olNhmgA!9rpB;0Db>5WmhXuT48_p)U)*oMW*a}AuNs$2s2TLc1}~Pe)z!R z8I0DIMOoFe)fUMV83H#)f0U}(K(#@Aav;kf`ik+aJIDZqZP9Vmyvah2M$Ae7oPMn-ziI=AHZ&Z=lS)T9BczHX?W7o?k+a&~`kvz(V%=r*6rzzt5 zUD8~|v4OKuZE|8d6?%TYPns{zP|qn^zN)dt?`8!aW5TAn`rki$NS_n#BwKyy(mEUQ zenSpuB9BiEg?=F8Qw68v%eUL$F^v=#W8PzX=i}QY-Q=0~VNR6Z>kOnD!@_kw9=U;M zBgz=o8z)x61M%NmQ)*c^DuS*YtxY}O${bzNi}Ji65k@V(^7%)_kCoW^Tf$~czCi*c z1KzD)Ebq_R>5`AFb=%^kTmN@XxaAdDL+d}lk}sYivCS%a`E-Uj_^#0Mc zZh+sY3komc)m?F?BSk)crdZh(K#&W7iQ_J`5)^p|HVpz}F*YoLl%8e^R7?+L9?)(j}Ss$lCi3u*5? z8fXG#)(yP$wTidzbH;P>s!IJo;)D)v^ZtJB)ysSv3GZo{RG<}71MZ7)#{EREoe^rm z+i)d!>vj;1Fq5tCtl3UL%JRqH%e4`-kOgg}zV=_9w2VDCqmua1(>a7s42)QAJ(quH z^V|eJz7UgC3=1Kj)OzUB$;+SJrDSg@`WA~uFnogC=CZ4ubnN zl2EkSJBD<)f-WTQq~&6G!eo1OewC)OV|yJ zb)3-DrvPjwYFcTHhsY3=KPsll{q)XEM{ATR^KhT%qrw^%D#Sd_-|J)TSa|-z7GDdD zQo*`|N(|H2NRrB?q48%ovxcYdC_P3&-xDuBQOSF&P8R^TfygOwAk2M{9mFX|W}7qm zq?=if44%&%Ub{^54i#dAuh7WN_&Po)Y!`!uh;2!mOM~5)y6UPG?yd?*|5y0f>J-he zXz!ebZEo-<ykmBemUKx=0b|bDE+ED{~{+l&|LE z!b!m=78VDFPn?LTtb6AFBsXYCH!|?R@oYVx*80-x`T>UWNK!1k^^I3x5O2;->pRl6 zyZapvwcy=)Ug2-e{lPC$wTkN~69Y}FP@){;a%5njwQHY)wSu>HPFf^sTg+stu72{M zs&V|D3?U!RNVfD3GdSw`Yl!pT?;a)8(D&^Q%TMS&E`fA;A#eK+<79kjssJCC80!dS z#w=o4Yrr!~9f76c`vUTkg>Mn}+3zv?28Uwf9!TnQMk5HW9dJkEv0dMWDIw=*xZ9BM zy^*@(qU76V%q$=lf6dAv&H{vs0Hy^L))27$0YcER>b#_hZMYLm}*tUMn%F4mzyN zFs_4ij^&OkB~6Z{@;B6#G_M5O7MHcgN&b;}Ug43lK4KRR?@{9nKYzffKyQx>jm7cV z6t&5bR>vS`-dr1fGZk<(hQAS+=2)f;Yyq*U(&1aS1*k%9|ihc-CQNK9uNaV zUz``cKESkkIBlu!k=jZ=0&4+Kcbt|f&)Q|1FbP{a6Zquo(AAz-kR=7vL)Upn!FAOk z-rCpXsnT#;s~^AI3jCtw^Dg(jyZxT#HCD`Xu2Hk+CWL1*>+?F`DN>dv{`QbX5Gw(> z7AbY<-m^`W4|H68C|SljxPrKal$U~U#^#;wE5`LSDH8&`_Qoama7T2umeeD>iS0Q* zAyzhQBq!l;(37W>o{S@%&CZ4MEmL}KoDx|pOMfDC(Gcrbh4BWhr-AlH>s&zbkHd9} zJb*BvK1iAK)~iq!M25coxrZN$HnCl^9;o&Y*fmidrhPMo)wQ@c8 z-|gBu&SuPuI(x76x#AO-`hOp_m%K;o+r*)s7EkCFmeiJ(me!Vfgt&(U zPs~w6WS(6-_QC(v+T0i?P?bs5Mhxo%PbP4mM5%GUff3nhbETL6WO%#NnA^0;6)*5S zf?Cj1QJ_ls{P$-JL|y0|RcT{dY(1^N{p0oHJ;7E?n6!37W*!*LLz!P~>oF)ps9_I- z7ZI42JGa80oUq)q{F3$PSupEWDv<@z{ATLJK3CXA#K0Jg@~3yQ-4@qYKa0QQL7^V( z{fPfH0G-(6RiCV23=q^-|0_ReoN0Y7`gF&`Nj)c^4}jQ4TA2&o6RQJVluuxp&Xag5 zE1X3x{{qaGr}`_L$xveWmF-evyX}tF!`pvW3AIX&83@(Gx&T}+0Kh~PjhbORp7Ak^ z!Wmy-C1ac~ull5Fk#U+(!7|Z;VFthz>rmy0OAfpoy$r~>Hfk|#gS@nP8=8DRrtkmy zPa!XXw4Nh}@?2}WTpIk^hTdmHN|$-RqcV12JhUiA<(SKIE(O`xX+8K>HfKC|DYM&#?1IaZ%2i});iAylC!ac_Z>z!uIz zO1EMIUe<^cHGrVT1UoZo#7EF&t%LR}g>IW35mSc$OjS{#>x4iTckq^jh0yfePi^UJ z$H!=|pAZ|6QUYW5yJlc34Sy$pPp0KahZoeSvPhjBa41XEA7q?x(Y~riJ`9Qcl+x%$;1Qz32 z`c8^IMEo=D?9!L(nj$m3Xl-a>!VC)q5H27{w^)sKCod~)ZF=2ft8gT~v?W%jSQ9TH zK&j*BV`mjX!ga#j!UxbU1N@k=cLb#X;4Naap{N~f=-}z1Et?Rxw`*T3+%JowO1{g0 zGTMm!WXw4YsL^?LB7XE7-nXTK zJ?|A^Uv54yivh0?An8xTp8u_eT^yS?z_NuOJLrLbZq;n&+%P-)G-9Ov%H(Y+DJieE zgBXTNfQt@}6`)IpX&ArQN&Ba9ANpxNQc)nEckw`!6Y8IVZ}bP_Z#NY{g{NkjnIc&kqFQ`bqHE6}pI#mM{Hp0tE`z^Sv!6SX8|M_yY8^ zM=~QsR#|6>2vKPHI3{^(EitGh1G0!Yj5oZJfPXiKQ`y(a#Bct0q(^!)>IFNhpx3*0IUsgJg02I_LRQ+a})obZBnAu zc9g}bj47o`n=rxzZ;qGhO-RJEG6B^cvL~Z;bOp?A;>))t^p-GQT8z|-(CkzEDA}x& zu|Yn+S^R96<}>gCnrp4v#tXL?3xYHy?qb{Rhd5ftpX^;Dc0dzAUV}Tm^w#SHS7_Rm zcrV=@V$C@&_QD_K&%KG$0X_`T|mcyM(^p5CXq&^s3KP3s*_}H4Ac9wP! zUlc-ewox%#@i$dXKO%U^W>|s8SHMHWx9{-Ed=$9vew%ikB-tKKtytL1~AFj1gG>w7y(4^eMx_^yjDNu{> z()nladR-{H_xfwo%?{yH_6F^J?&sbo5Q-EdBFKqeGOHnqpcomHi{pN6Gzxxfs4hN> ztU?mXyiY3&AkV;_R<$3ie+g5U72WUnu2ZEklh$i1Bz_db({ZID<&fJV(qc0tV^^bg98$=z+l-?YFH{OT<%Hke9$ zO_hD_oO&0(*(Ea24dc-Knl0zPMi()aS~#0k#`w~c=eNBK318TeT*|q9>o(VYV0)Z< zA~e`1XiYKnihrx~L8P3CF^)aSUeF-ZhNW-aC`^~(i<0KyH^)Sz`cQby28b`qDAUE% zLd#}~LH8TigwuM0Jdkp6CEn<3bI(9+3Vu1;aeG8I3&_Gqrj~nRE#ZKJErQprb|j0t z?F)1X05wPepb=H6F^K?%*bjp|@2Il8lVA4@d$~|7$EP_cR?vY=$VYh~1d5{)t4>fc z*<4V3u;P2@z*c0N6(IaE0WeM97xUSAGbEW1&eVUKR&i^*%&d!+Kq$F?q(Cy>0Tq!Ym-!HGh(BurN% zV{&d^eeKJISoa<@K401Rw=F20TWRI!2k@77G0jOt3JpkQ+fi;3dkAfY&J_8Soz9B5 zo>}cc{o;Jw@DC`Ba zpiag;X<94sVypoD!DG{*Rb8~p!2C9iLuMLtF6*dc!xrwD_5!YxCVmF0`hk}WKO}n6 zwod_mS62!iWr7PF_JQk5X)ZtU!DeWO&vsED?fC8Pn?K$(G9ZBl8yT;KUlH}5&*DlsKe*GsR!&L&G{wIO$^e9KG_%F$9`>$W;PG6a zZU_fSSHP0BN*8Pp^w6po>=DYBP(8#d*;wTjZlS}Z&q^mzj{zZojX9qmX*BH-7*hOT z&-Q|6keh2o*ZcNUtTwT07b~20FO^S1W_Q*0p(lq4t~K}IU0Gs_N!Qe}AK+gkL}wM< zqsqLfeWq7$Fvg&fC$GUI>3$G?Dv_~QtQGT#1w`H1d7ix9Xnn>%=mvT_9#N&wnX`@T zLcm%zT^gWs*LcZ99}x%R?=v_5jymp8ONC+vIzzfo<}8 zOsm9d{F$+rA-_y@2;Oj%_zM2~`BMusTQ~u|&RCco(iH0j2OqAwf< zur@#er&-`6pWK+#4cWeXyO0l@`UV=7RoYwrssymcpMesJp{lJ3Rp@C=3O&t;34Bdp z2XDf-K{PN3=LJ}R?!tSBLg$uWvkttZ5P#*}C>*l?FrrdAS+W^!$HKOSOO8GCtBa^T zGhs(96vsc2w|Qnkt}vs+z+&-*<~>?clXt7H6nvM-1b-q*ZmE^CPa0S<^X}qP(xG^M z1UsVfK@ZZPoD0CA65uB{@{5k&6Z*Piw9PK}*~DPMjW4BX7BhBG8A7kz)_@2%%?v@szdod@IJw7 zMBRNK#|>8m;Hp3o4&Rp&*BKp<}`5ICk8dd>_LBT77PwzUeA zJ0Nt!_|Uh{2xaakqB5aFhq&&sdQM;#vZO(F7DxE810KYmd7JkD+i~8*fS$i># zvY?BO?`9=Zb2aPrm=1=0 zZA_=M%d#oOpdoiL|5Q`)gq{aSx(FH_s~hj97g3*aSC?1yfJfnwH~8SmxNL;Ze=cQI zv3_44g#bmi6IZ{#>0CFQ|Fa5eQA?3Qz@dKyBbs&Un}FNh;FGe8N^AQyDU3{6D6NZl zW{1cQJULMWFJPVtYl9V5twCC8KgZCg94O8Y)l z$dnGKx{G-DAUJFM1$y+u9#O!F=G9^X$hXy>wf3+ie7OFGa-%9AR=ABmAAd)(R&L7s z2EY!29i^n~#zTnh-FAOE4qua3z84>Dk&%uMyCRb|d$@_HE;^@tvCSZPpyT7KpmxTh z@voYwGyhoOL(pUm(K2~a(4hv&*)oF5pZxNJ@gr+X<>2b<#37K7*+u*e5jo+v+N8X< z&VpdXCfA2qs^{IUxJiy*&WP3K6NoWA|HBq#0iEY<%dbY;$Qwlu8vWNOLYB*|^i(ZS zJQTcZt`n->s0yKRd4=BFj0swG1>w{`E6H*a8nL**-*6s#E<97cK_ViN<1!ilfEOEM zNb_uvi@f;H$LDRg)aP?PWx1bKj-~c#KNXFm@>6IYcjmKlUf?rssHHJ7Ss-g9=t)2j z>@S;3qJaqTLI6-o$NGI(t#G9s&A$O@AqbwAJA7=vSBUTDYzV)?xSRBvF(G3I;Jb2K zKDbcUEpwSTLOXBVlV5xU^o{~gL2%21LvJtI&a;oYA$1Zno6Af1k36~%S(!0spl#jnHo{#vK3j|}r|+^KQkfrRDX+?@g4%dYKN`}g4rQu2#K z_k3WmpUs-TFc>pPeZvkTcJ}QjuiH7+qvtsu@m&9ztZW&!_H_=|vCk0w+6YB{-omZX z1CK+2Pv}`6yg(5*(8{F>pR{)xog1dPe97{2V;n4ihB~(5zdyvAxGGG@rk4PTtH9(I z-0`ejpzC-rWKDiNME#kwNx1p1yQEviCFQ#oZ8UirXY!zrI!wtj%L-m$277tDMqe-D zj>qSB1CfOHp^^jLTm=F<-$#Fb4BnQVV90#phi_zX+{EwT!jpgRNlOi?GKSs8!}VS# z-Kk;6+#y#U@LqeCC;>io(u70zmKqwCp1cT+j{=5miX^iUoc$Q#5P^r4Y48Bo#dgImNEiKf+<17V9mwR$1aapkoXwj60uhb)IL|wIvlUwLyO?QzJXWyxFm}J}@!sz_y_g@y0x640 z*#a;2Dy$L9x&kgk$6S6(j=4fUL~6|Bg@1Nwy{)4e`|rdqX%lWcI?UPohh!be;W8j( zKqd*Cr)E6G1=3+ZfwWq4Zh>x$Hp7zx0n{}f^xU|*r(%1B>ann&bz=wf%jqbvMo7u+ zvyvx@XNlKl+Auip8Js9^dL#&Pg{E<;+pFU46SR+)IS2!^v~tk0CjNCz1I|Ah}-vQCxB@gQ=gGYmWYRK$zXlgb91+U0Lrq#wMb2z9)Na{LyEzs8}@+OQw7 z<~uwf`=||FPy+J)SH}ELGt9w*4fWz&Dyj2;bZmjX z#@9<|KKSxcbXIx5oAFO}=4*9xw|$Sm266DG32N7|02Y+UqI+`tW)kc9iPbwU!Sc?bgW;1uc8^Wdgnw`K zzYcAapTxrPCUpEz1Ed#FDQhW-GH>236uf7K1Vz-ZMn(wD_U3Z{4z*otVDS*%W4&Q; z`6P#@2-7Z&Y2=IK5j3L#hsSKYfMu>b%+Pnw?rH4iEg#lH(_!&{X&GZy?v z-cP8aQv(Eoo9WGwufs3kv@hiaz5t0#X9fIZ%v(q&;o?TXt|4vVsNeXPvD!+;*>6tB(}jE6q}fmIJm&d!F*-bN)@nsMXRm#2jg=Kf z?RVK~5zT!82yl`I%Ps?#qh~RR-FOADvp1yC|MN=u_f%0>6ismm2xB;B<>Q{c*J}xXl0Iws(Kb#~->nC}dR+3t^h)T7tGx@|!6)HZO+R zu+O*G;?pz>O5}eIOUUphkMCd(0iS$wn`)@lMA#p_IZ?1d!3Nws?WyS+0AZGv?)+RXFIj1q#ztPg%pmGh6Gg}Nv^P2w# zyjr$Ebq~t=$lv>$T~%;<<+p-5s|X+%09u!KT6|NR^bxV;xZWnbc$#!?@z+E9udPxV z3fy;ywlj>XN|E|WN3gS*i$l`fDE1V$qWw`g_-PKH+=6+gXB^9T**BcWIcZ%TK zo_{OOuxcv{mQ{zpIIsV5e4uip=5se=ZY+hNW3hvGypFY&12VO_39xTqy4Pf6zH+QM zzQjsA4paN1UIgC{Uimz zWkF5Tu<#|6_VzUgUa1#ODxJLpg@?Tuw(*WzeE0R4MOgkh<p8AtlSv~0oH8-A25w8 zLCPTjTr*?_m2Vk}OdwwYZ~@Ok1XKH0p<}pW8cv(xaFRDx>=w`qu-t%VZc0z;>dfYn zZ=q2qPIXkZ=1=x|iogQh(-Vi_Qtp$&o@0~ocF2ekieEfKq-&kvhE+g890p?SE=on* zD)HvVzNCk$AF@kHiY}t!Or@|bF-e?M(uqg_KJhi0UjcwoJshB_&G`9z1TrFLW$CZs zKQb%RKT{tdR9#_QC|W^awW8JrDW{&(=1?mEBb=aX1`-2B8v7NyjO5I&U~95U2E@3^ zo6QeQGD?AKE<35z1A6ge5mRi%j71Q*5pZ!-0C?JiL&IXbYo>dQ8xUqB=x7Zq80O{5 ztu_+jY6(s`)=+7DLQ{&h(MBmgHR;3RU-_?5zX$|^XG!|&*EZx#mPI6pVsoVP{t7TU zd1$bUICH^HpE1fC7~kp8tS)%|1>CYnxF+8~XXmqH zwd3EkH98@|Uy0{zsP$BU?I*CJKoDNr&=&07Si{^0_HJgKIP~Bjk9#MZavD8Fq&H@C zo=uwHz2d~DmsMJ;$AL@7lYiPb-TD`44!8;Q zS^oF@d8N6g|NeQW1o^mDlU%_B9CQ*d=Kp{)M)0Z-nF*!fL||h_JN<>#X#)OKdIb3~ zanljM3rLq;|L`qr6bv^GQ zv+(`$8q$sbnerb!jac-xeE#hRc0%a>1-;5D6|o=PcyQ}+q~`_h`@#RHKKJ4mT0G}~ zh%WQ&albXFC}5G8NbMQA!MIMbWkTG4Rjio}2=`~zAOjC3!ll>4nA|M9J?OPY0L~Nk z?hGYw=-f7EgF`X#&7JciP7X`3Y|pWg*S4X3c&*Os6b)t-z>)%X={Pvqt5On$rm2Ym zIWFiZa5@_UX0-??U~=}whr%2^O?W5UVUlakcA%lpV*}5FjmtYOWa1&k19KL5&9LwS zqa99M%0Oo0HkYp`jBTdk_Lu1C8O6Emgs|o7^}8H-Tm&p|X0YY~BVzzy8oYMnnhxXP zxr^e2b_qhy*u7`a!661)xh|#RmOU$qRSsm}0T^KlyaAgDFi z;!Tdfa?#2rT;EijSd({$&IkO&$fS&dbEc4F+kc|u2{&etf1NP?NB6Dm;RJEArwMTC zLVk!cLYtn*I^uJ_HtFar-qKwTH7vHB%VAS>4?llBN3yT;t;CUntPJSBXZxx2 z$r{@_xvVgX(RLO@VLie54;~UvMFbsHS_#B4lcth+FnYt?jXGyoa-GRpDN%CKILYKE z^-fZ7S<~x=B12yu?QjyTn*(#+y7BlP+2!}p$IDQuYt9E#FP6IpIasn4vTvio>_I^K zPXrnrfi}NE_r5@Is+WJ5AkC|KHD54W2AzE+VtTr3O%abd&1}ZUK5UH;FoCzIAqc^f zS=>Blxj=&G4D@h*KdeBI;22=EvG)B@7vkA4<(YmB3(9l5lN6&Xc@SLafOKLJn(33h zd{b{-E;|G5Qcg$fh!3o-eJc7I?9@sGE?~)p$b|@Kk}&bRvFlrk88rz598UQhye**p`yMrSJ zPFk%<*L?&a^x=wr;0qh^8o)Oa%!&dVUR6sMxoq*o(IONwK>@VAV<%i-0w&Ml2AYSf z*}INx6r#R=OI#3W?n@4^053tHhXfHHr1`>FnSuX+(wQEcMs(Q$k(4;UehSZIr?MIp zZWJr}$WO(lP9n>1^xLGuzi+>p$ z_;9BSUa%CwWrS$D1DAJR+JLL2 zh)u4C;GSxBnOHVEkmF|Z2LR4ayVRY0O_Z$>o`7V34briYK+a#56@-S`_lVz$coNTR zp|Kx-Rc#th@=oYc42%n)n7)(h3n!c2SeLC8y-}Eficb`dhcB6t>|q?MI$OV)ys{W4 zdDTW3h#0Le>QBApl!xFlfM?XQ;hA^gq_Z#{_m_dmi5M&?>N(_O#dnpQ%KwwuC2&1cZF|HGODeI}a3lOs{J%8zuYDK`sWw(P-nH7m{{Sdv znNK@2@%H1X{e+`DHaPr>maiZjHA)ABBW6=-M?t$bLF?}NuZz-WSrPnXBKQ7_ZFRUA z1yjk7qJC>lNDQ5=h)^kK2QAbdMpWOG`5yZN-+9uHewkRFNb}oRLrxP(n5?%~VNO6? zLxN2;D{WP$7CxZb%7w^>SrL%fkOHpBHh+9r!Imf(JxACSBpk3H)>^v``n*vDTA`#?$lpvUbgke<(B|RXYR~}^9%hx!y`J*u zj%Sp}*(kO{;ptbZxU-Uk|4g;!?5#5qnRH-H-)Fhe?AKHBj|P3ju?d%BruVnt){rwJ zZt#(#{{_@X1nh$T{@B08D8Sd2+>-_uO6*`gxI@%ZM84-LWv?s~s}ffoc6v6k+RI`R zv}8c&4j_SF3gFFEK?1o4YmJslIRjkAyvNj~u&u{IC{Ue60^WZ#?}q|+Z-`6=U4bx9 zpxpy^=Nq2g<-PT!UI1yL(3skYDsyk}uhqH_mJBftP>ud3UVfz?lAP=B&V0J~)}fAM z`Y-&i{WUvL@>T)-VDbGlNjxdalgnikn*jw_f`jrb|L=t#3;&s^Gcu^cngA=UhAFL~ z5&Ir;hP<->?3OL0NvL2e^23tcbufX-v%snprFw?&(mY?9)X%Q!j0MH&WFHc$4wro5 zHd1a43cQR^U4?IPi=`q^qd%k;mcm``*bG=#;putH=dGS58xWL~xPf*%#Xy{`7vAH` z?j+Z?@;r&mqwDaH^}x#zx|S^={+~4b_Gx2LvEM&uTpR54F@okD#8afSpr!5V;$tL} zf6k!pP(AM6I~bjw83=$34tCNI3Y8&_Hs=7YO8{t1^dk;v^4zP+qN)Z&g;v*Cm3*8`T^rX+&CcZCO{hcaYh&onIgVuZX zj5nwse;QKKXYOo&CjQ5){4dO^IsHkdjr~pY|Iv;DVy!=3ZF|0-Uh<9EtFv3*q|^4BRKh#@hftY0`yP zC7uZ0^o|8c2&h^}pyuCzY%KP^D46HXPNxqUL+4FlAuB{+8>zSy*Y!|-q{0XE!qSiQ z@irCz`0!7L#mR>%)ds+gU*c*vRWI#Md(sojVKQc)%@+m~UM2BUfvZ+McK9HNTVUZt z>5k#ZJBFNbH)bUDz5aS`w2pr$fN|yGS$(VR>*;Wr9hhI%P3p4;>CV#FOFQ)(S;<{h zG)Vye(Yf;9r8bEGCuv^S#R6AHORABY0BO!^-nuOOi=|`2mJR#|mwqh}PVh1>AlD64 z-$T;C+=ijDk9#42RM&#uSD+E>|4qOZ%b`Jtt37`kAKtgFbV+zR`K?_UgKEYT746*heCTSMP;e2+&S%ax&!-WyD=#Y_cKu>n?`V5`Aik-odgn;p;z{VTKops3efLT7K^<>hiF6ZP3N&amCC zTVX!YRE!%9lR3c(>#)@1I-k!kF6~y7a!Iu{KD8X4#KO%&h#+v5?u^L5YD99T;2tFx%&%PfdlK)(_v4y32 z6OZ{hXT```ogH9ZV@UdP{|g7n9?W)1$kt|1H~>WLw;cX%>%aPG2e#P|WxQ9%nx8vK z0YJWt$PQ8jSjVl9jn552pdGG}v{&CLIBhTeVLS;J?@sYyy#PSAmm(ov0qhDQw4?|} z(UmqRDkDJpthkZRuN4pvDTd5MZOg z<;WU0Ne1hmxwTPGAU%Ejs`nOjo+f+}K`<-RJv+A1CO#yoQ_1%-tJJ$XZY|Ki2dq=$X*oDUPFTI1V4%><(ayf55PPV)M3KxilDdV%aGbm+5;tt`)&cVUI` z2imSdE5H)=JP`d4K>!oz;{r}4NZ_|K0hhW5f8gW)o#{O*aH-`4+1rpeaB7BSVGd(K z>3v{#YEkk(CO4__h333yJ|_$|-)#5smLsKrlWH5I?H&aed08b(f_VtQM529Xqy>HO z=2crktY#R`;CNnmi5-F$?v%jQhr8VHpeCX3SO{9+M8i0OuyQl3iKb(jpiKVNRUeip zq)?jm>WdH?K&@CH%n=9_+|alrMJg5~-BHSRk;V$5vmu9SK)5ofc=awXB}QPGE%N_py7G7^zwdvaF=OA? zBAFH?5g{VWpp}ZqS}~O^Yh}$gPf1iti$aSb3dt@cnUQQELYBlJkuAG0W1ipD=llEL z>*daQ&OOWfyx-^gtuoxJWhzI;1LFHC@#%fO%;w77Yq{gtkMN%YMQ>;u!9BLO_ zGda|)2PtUwwal+Nk^pc+p2{7QZF6Q>K-X<+>&t%MLk&1o=aiIWE7?D3rbHcUEDwAB zIxKWc1>3h9Vx549hH&>Mp4dqm_2L69$7m8D=DQP?g#+~)@i8}D039N>zcJXlK0JZ> ze7PSQBD3Za%0IAJjCo`fLq%Ua0>(TWC!3X}Kc-K<{M)`o(84in+4&+r^kpwGGXr); z*(HWsm@=^CxZe`~i6w=A5srUGKB!$8H7nx9hr(-zA5MDA0bWE%mJV(Byz1eM$?)MW z@1p5{>(g>%bei)3Ko9ukY{lK5nZ=vjSBbiSds;%kF9WCwVTIWsFOI#>8h2P8W@(Vt zjb$`zfR^;*2f{j!-bYYdONdRCtzuDy4n>=!_m5t;CXhO??AR5R{GCzqceG*UqJZG4Np+Zw&%V($IJFp83Y{SE*w`2&wYyHnf2W{Gc7o1n{i5U3scg4sYeX2_ zv-n6Wc+V|VePv-7W7TMM5nx~oxa~#NiG1_dR{(Inzv3@Z*qrDj(Ql7~^MJhu_7c2T zGyeetx>Imiq@3+Dng$i8Kzdqjr?Q=Yg*xxH6y_N zL@&;|ZwOLg1c@S=G9*XDjT5vt?we;r@}i+4jKohUo{QU^R{uJS;Z?ohC%|Y{!g>t~ z5DSEr)P(UV`*mRJ%rE~B!X%j?qV(AC*Rc$Pm}Z-aUFC-+Wvt{V@FmwBYhHckG^Ly1 zu47%h0rEHmqX$g6&ME0U_-o01(dkpH;G}cqNmyKzz6Sm8&A-4x`C6a~t0L-&BxrYD z%0hwaoWIkQ@|2kC)B3;_UvIJ@Ggk=T#u%^ycOL=xHZC7{ql{ELb`pTQ5Vq50^^W7I z4&?Z6*xhdWou)V@ePhT`J$J|IReta$ zTs~9=0sGUQj~%Xz?Ffka&*D}N(~lcz2o66?3jO2#g%`XsyzI8a)~&5iVeh73m;8X{ z$}TN@QKO3_u+-uPb3E>vAn%R?Txc8?V0GrX2#5N zFwOs+{kad@R4=S)Qw{>w$CVihuI5uN1m!yUtn)Je=(cC%K-A1e)kiQ*<{;?M&L>#w zLBQC!R8G_02@*IPbX4LHeLGb1mh6mzKbMur?MYgQiiC8s}g%?K>cNn3U z^0S=fRy+>SIKdFCjyWz*M=V(|i+Y^{OCgreteUEnU-Nk{Pwih_Wtzy=N7I(04vP%V z;3~H;4YZ>^+%K)4U%JIM^t+wYH- zjJN%5x4Apz)LN}=VFl=o-5o$RHMxTmBx!R1Yi{yUOp60Gx)Yd;XixVrSL`2Fwj z%T1fc3>+!48*q?v)Ke2%u^_<;uKi|7nEt%tw)fe|k6kQgi}V{vARqxS=EISPLr+|t z8JK(d&i-BTbRuSVk|)~tQ&{>q=7e!iu5O2f5+?SmLwVtJ6LYl1 z0EcuO2vv|BY0>!-SaxRdc3fFf*w~SN!L_ii!(M5BIL5*0Vt^7BOQdN8p;LeF%&vw@m1 zYRw6vqRLu0caS#GgG0|fjO}Q+>Y;v#iJ*+-)&u_?R{x9kCcxxQ3iATDt{uF->-O?rVby!|5kUZw#-4al!@J2J?SK6}K1|JD5BA2&uioKA za!8e)C2O3DJr^WMpIo@f5HxHGrn~!sgZPmNS}!jN@||$t9BVt|06U2Q$eMh%8o#hW zIWY&zSG`k1^rY`A26B?6c9jq(F zp#>F~#Ud55w};mvi2#s?-5DOFu^9W*Bo@xMO&wZl_7En`q<&OvFA!qAy-&1n8fbVe zPBPZhwcpMaQKiRf2#Ei2{&7t^O@Gn#BIjBxm;1{IONYgG={PUyr>l{4H|i^=8s0n# zT#yGfqIi%DJNLd*E-Zn8hB1@SKbNKPUF#)403bikMkKJLVD_EkmQ1~DFP4nv{)_BQ zq_;F7MPX85Ca8lqqZ_tWRYX$0D2TB}z@u)8ncXs_Qf&cJ5Fsf%Zsqnb=rYx8iV6X2 zWg28I1spxnSOH7_uL~3hdqT@+q0oXwpEFydJ7&V;j$Hh$is?uFY+HQ5tY3)A!oKHo zJVVy*X02tc?wjz-RRcLapq1y(_~`z1A`54K(j4Yf(}uXtul2vVc~=V}!O|*50Q5=e z%0z38pt0-Vc;d96Dt2zpi|67>NU{K;@epofu>+{5EJ*g0M7>#auO_f)0kEzOA*CoW zr!prn6&EaQ3{K8l!YTQoD>P*gy@G{U@J#H!0CC^r1HSv6>=(}(Z0O;VKYx}Nu|C9t z{E-x6yQy?ev4BPT%F7nqrzjJP@dUI9dN=HvV-c-NV( zacH8D6;Fg@J-gv*^XO@ghQw331iCUe*#*&X;nqr%N1g$IUkEqwtiiDrk8y?Dq=G>Ba%GC=Os|ti`EO zbc;YF)pDSo#()&B4C?F~Dc&~#8ILt4FtO)=lwz_-dok}QH>S183f2J#sQ&x8bRzZ< zK;w&J--jAR%Vuj{?)lifIclN;zL__9Nc@Lr@eAx zC7g6HW5cyeH?J|Hk4C+IFz|XS{q!1oli9TOrw<<}v+%W3>kR-TzY9h()`b2%-aJc< zLmv1-^@(vVZtz3`A6=S(%Rq2r7dR9e*gvVU7E=^$cp)Lg`V_l%Y?OAEz5PYSIRdGA zo>E`LR&ft4$7;n6PSFIB!^@a;=G#tPWxi11>~rgjj`JsP)x?bR=`T(`3#pL={if3q zv=#YM9IR08-jt(^dyM5X{ofOS&zo4zR(T+N@W_tn*3Vp(YX@%J-!;+0&*8NA2{u^E zxxh`!SBJ|A92c9Z7K~F3%tpHH9xuX91DLDe>omD>LmQmAfUX1}zp+L7by>MYyAJmH zZc60QrOww#P1@{)!EQFe5(@BqWD@SJVkrVxn>BVqnDh$UX<}+H5zjP01^N9`w%`q* z?&Y^}D0zo|VD}ksvo6}9utgsV$DuW6*nO$ljPfRFX#hTC2L|7KmlL2S-i^Esi1J+K zI%6EZ@b;;uDuQ3Vp(1=eDM@LbWOf9`GG+8l@%tQf(+U{ z#@ysS9N8ODfW7%=c6=k{$};7^sDb9fryp$-6|k}V!j|$Zz?ObGK0C=eeQ5<6n)ho5 z^-sClyrCcYqKMA*xfcWY*vCNz36<%Sx3b#qo_@*psFmsGhRIQ98~bm`-wdiPrSys4 zJ}#nUMbO@qCaX<=9I+v-5d3qEMko1x#p|=hAbDJGiDkLvsL3JNm{+@SAb|d(nKvO( zq*)o-d0k5iASHx=dyp$~uzI$S(lbGG;%A>X3B$VDT}Md<=N3OKO>IhqQJZ#oiE7ik zndzgj$d(Z%ooh+xTCsa>yjRFx!v4A-Z-@ryXVPy50HWAP`&Ti|t1>XX{LWZv*g~=J zJ>=S+HYf=Aw|7l>AHCkUXI&>3VzQ~|;B`Y3rf79JP6h2ZcyT={9;nLgB#dtubk*V( zYNS-X29h6H#uB8Er&tXDTwLQuC-W2>ZRFxo*PmdjEl_OZ@ihCyb1Hb-%|h!>oSX zX1@5`8J*cH7dh50p9Fm7HYT`l{q}**$~>4Ef5;}o%2;)R9&@o?G$4K|lEMljHk;2;xFB%y@RB;ZRSI3`p}4 z?_ejHaOaEYge%g2`=?ug10ba*emjT*LhC4e#QHNa73l zF_k$Wg=fb=XCo$_35e>z>DbE&TFJRts7cx;KV?%)ZZkMgz+S_mc?i_}#nP6A0lqQL zdNV^{hm;x$F8-WT-Up^5avcc60K&X?K43*F9bcY1PxUP4QZgA8ZclZ}Z7*wa5WncH ziu9Ez%DRq@@4O0DMT^$rZ=(rS%)s0ZLHCHB4P6RF07*>d%+j;=-IfsT$vDEq#?`Q- zvJs?R28CzN~ zoqQjda4#IHzxNuLJmf_)FsIP(UqI>dQ%6G7T0r>1jT!;piSKVsSHE`BUTpl}_~X|$ z@aLPrHOf7HWGkcqSy#ulUchsT;Q?9m^R10NifB3gnL&vcAUnBoB1+VKOQ$>X6R#q3 zLhhMt3@!)k!hbO$YkTT~P9zN`P>g`}kiPhrN5dgy1 zXfB?yvslrK>hk7ucFC3BVh%u)I*Re3nKg?AV>+&)o)J(ZAXAA zJNca!`;IMA`mRG0T?U}Wp0phhWrnHz97V_3Dv#LX-4y@Zzn4Ef&X77LGB6@|b?v`M zzSFbT5#YmpCbyXp=_HN)rvPVMOXP+31s(X@K6aH1ooB63IQ@gkFo2T6L1S+O*bz!2 zbC8op;=mJfAjtV#{M+DV@_Zx(sbk5sF!_^+#(5d^cJtXRApy@JiUB_d{w)!7=~nrp zc2N?jJRmc0<`p8OW_G*)Xy?b$cFh*=W;Mfc$s(}^mrC0($Qd8 zv`rEpu@?GINd!UL9sSCZl9*ZS_pSY52rqYG7B0_j`){XbkpWNsIF8Vcxc!j?>D26J zRn7O?nk5ouhew${O5pbs36RX#eh$Jh?*!2NCbn4}q^(`3!rZD+9@ttp8D#TLdw;uu ziOe;NZ=zeLgmq{yG@SKZvJ=3Op?3Yi;<}i8t!^B;(Qvh?*@y7IBY&!*oSZw9ewqW_ z8ZLWm+sCP`fViHoO?&5fkjlEFu<|;{E%Wllj0%;|;(umK!6R+0N8sAA?%<|x-T)}N za1>SLk$Q5ON7>m)k2666j}ibaFFY_8oi*VzJwP}af_F7L0kG6yKdJotwGX@Iyh4Ms zlV6z1*|}!1HiHXJ*be-3%Izx^UK{7b)GD4SDw&*zvl8i(OMhR9{diss$oUz4fwf-! z__chsD~Z`)IrjKrY*s1(U8O>0Ot=Ms#F;HvhZH&d#;uvTh5MJYoF?|j1JRo6lUNG% zC>ADrHsp-=*L?SM+BD6GT{6U z40is9<r(hjjx%7Pn@3Og^8<_@%M=5JxGym#Z;IlsC2Xv##Oht zf@`Y>foGbx_esX=vvtXLJqZ^tup>1g-Q9U&9|v$c19eqT#K4d=WVsh&UjX?!4%CPM z+Xn1T3~f2>hNBullUCC~vIhR5#moo$d!almR}DbCvIC!BQSN5yNi7a;d00si2lo^K z4jD3EM~(e{#!XAvs-5dknbHdAAcz< z9sNKPRn5k&i;i>()%OZak>8gmx3Zx3KdZu54a^pvN}i3Fuc&Rgr}X>wAgvVh3PeGeQef zCj+mXYT#<&OeBG90pj{!QbM1)CIh6tpSPLM5MoeN_9AQL?Cs}16`6e(m*vM!m`aqK z0uIvVC2n;g>mm6og1>Fk|_+En^?E$0NR> zWVWl#tN{fUW;|p*aP$}U5U$5?nKcE;w(Q(2b5D-xGiNlgZQQE6N?b>WSEA*z#c)Lu z=;@P|`Tgvr&~JZ?m|q`#7)urE6FR<@N`Ic~?D5GmSXtRK_7#@eSs*$;SE#OXPo^#R zf~kJH%2EqV0&CF2&nz(i2(6X``5D-yeO4b%NO^aD=riYOxkkP1KF4RDJ`(!0S` zYZ#~S;Nfl+X^*zXV^rZ!@fHSS@x}^bBQ1xn(>E>sI2)L<+Ev*A#a~Ob|9QaLyoq{- z@;vy*X9sA}08e3#%sA1Hxw%NYiYPZQ{D%0 zR$DbvDg&9T9d6)WBoEumhkaYM_Ully*BTv0krQ{zd+k2OA8o_3V47}cT2;-*TEcJs z1##=-T1D6G4?BliBm6bmezpmAvCSouyNc37gCbWxQRR?-!S((OLyM7-6g16Sq7M4( zRU+>m+i|viJ7EX@cf=+XesEtag1H*T3A&V&gAZBHvThln1b~?H^tWDAX~!HN#{X${ zAv>qiTq|u$az?53?bu~NK0lqsPFj6!(D@4!1oS0;NH(?yw>*IIFvX~K1rq?O2N@l3 zkptqyFv#zA)X#x%iO5QkYqkE3DlYk+m9N zJ#D31d2B~iuHQZma-hXL)d+wqcV0f28CNnQ!^;VzvzrEAJXr38_ywI`5<$Dt9)aif z62!(T#<)vAStb#Cx0FPP=nZzE6b~EN?5vuy_K(9(F|kQN>JtQqp-u&tjhoJV_{sz| zid_EtxELHBI=|Za;ON@u=}^ymSM~MIU(pzqj2D_5#2t}lm&;m`g1eA0M{3Z9(`Z=v ztp%+&o%sQk=^VHhtAl}DW zZ}$ZSYc!(1Q=G^rm#c98G(5>TB?a7i9m0hZutaG}?F7x=-|@pEu&WUB22edukp~HR z0O+jJxIw~YkZgspe2-2mr$Q+eaa(`IBATUCuq+M9#1Geseus zs}H0;-#p_y%n+_n_5KV^JS>OvBXZkDQ*z%nGXlb>>7#^$>xgvEV-@ckX#}wM3-a5Y z8`Pb0cJQk727N^NLq5oPqA3EKFJH{V+DdrB%ua67lc- z6)ICIZ4=fOQ>ex;IR71)OD9t*9PE~%3Mp;HU-X&Q*??>BQ8b?#fz#U{ zdwX&;0yKE>kVliTQiOF2A$}X!BhzJ`@vAC0aOBjCmIEIA%EAuH9|F_OJk_)~LH0w9 z6WqiLRbU?igzuXGF9G8FZ=-4<-$l4GDOY*X#82L`f)k&D+tQww^>tjOdjp)XaFa}| z-aOZyk{y}b&Lm)43E;;8M9jc##V^#s@g>aG$A-JEQj0 zdmk!`pZ42`&qy~)cKE4M6g$HOb#I*EDe0`v5+wQY4-WKM!vy7v*D^G`n-#EMrWpDN zC=~M~*aJWAi^mL`S7IA}2`7tfoImm)u{8@=e7|C71z->wc@a!5$vFdXkh-Up6g+g+ ze&+j}NQm&t0)OnHOrDI)l2eT{8?P*joGYQHGwXwhv7DGMeG^|fsNU2Cae3*1A1**(`8wcYcw z)DwyJWgL+&4O7Ddg{6f(CicjG0btl-OV{)%1Z3k{ToENd33?0>tXqYYf?Kh3MQ`D> z)0zi6EyVE#E?4u`1j&MPQ<_X4O>7a+ZQcNdgkj+J67tzqf#G@(9h|GM|3lYO$o=&= z@u4qW-=0~Ed#-55eKI+J0if?ckE$_es;pmA!iGft7oD2*7t(?kFKjPk;O>!qYFt&t zYIE~>H8B%zf&D2^paIBGv_>^M#p9;7#%Bmr3GK5vL1+fw|pUJnoxSL@oH}I|LbDbCtY452!?%V_)CIA9C{`t5v*LSRUjJ8(Ft3;_nqDa20Z=o~zs8$K zuVmnaO==8Oes30r7sd7jArE~7%m3j_f#d@S+A|e@i~oG~862Na&PET7y_-Br9Sz}V@ zZ}!+jAxz}-T1|JT=617ws>4!u+Zh{>_H)2-+oP6q>fo^Azgf-jOJ4GR)kKOca5^xR zw8Y9*#tT0c!TEIs)3w#vO?<%R{12JcFrIICKCNnsZ^SXmnR_WumZ>RURcw|qs%1B& z;^ZlcCtJ(_>3iS`DF>?S(t)|aFobQi;6BHxlaSFrF8?K>f zjRTuK@mw>RU(!U$a2O51$4muC(W-X`R3Wo1zQ)6zzQbVNv_3IETGrYhyh;o6uT6q|E_*4>MgDA9>c#(piYVW!#wAG_J4`eZGsXB#P8pS^#1 zF1NmfOP>Ngc~}k#r0LoaF+aOF4p%REz9bbJ{$jq9X4ou*3tc-)r2ti%C+qPE0+3EQ z&m0-oz_wUHp|L=+8`PR3=qFwEZ2|d@hN*^W^2v})twf${PBm2G1%n^oTktZ^r#DRS zWIfKLgirtdpBWv(FTD@0?y?&rZyqeh^`8jMY1(QVcQZ->fA~Pe@3cOLeibHNJ_sl8P(+dm$(;Dsn;O@pJrvRN~_-T*4@3V~T*;J*~9k&}DJB z#tYSg3rHAcK#Eapv#a98GHF! zGY-T|f~0*emIPHA5xfR2nq2fR{UNW7IL;XrTv2b2G+T$pDU$jIvHp^) z_7{{l!-AO$(d4_60WN-F+dQGvJX#KXxZ2!tC9eKPK8zXvWlR6_gIXNAv)0%BRgW_P{iy%^R^g!&Kg|#j zrPh1)Ull)RPav)+4a2HI|5|hJaKq@~hwzg@C}JH5+JKVYW$gIs%0G0#$5MdzG&g9m zfVm>$ip0~uj7|tz;Bf5%K(`nWZQ!e%=1c$m_0c)tr5>47x~6FU>J7rL^`_smS3 zCaIjr4N+Z_+Rbw7OfClM;Lug6EE;WO*MG5+AI!Sz3`hfAE%BeRa(}jETW^ppds378 zPVP+kx|lVbBs4Qw!7Z(k6;A{eWOk5dHsI?NCGReR^VV8zTV^`;Jp)255Q4tl$IM@*FfxX+R58NY6NmJNn4eUo z&G*K&BcyGWQ|j$ajI|2Mg;pBOcpixU`|7`WL5VULUB~=*QS0vvoIW!Q3)pEm^4?9! z=gZz#x~-*Z4+(TAp8(!Pj}SvE^iF}ii*Td}UK_&)G2eIK!8=YwUUe9%C*U}x_XGAe z3fpakkl<8X9lvgmA*wc)>x^khh@WGBsQZp<$rM@^fSESBKpdori4^d*L^Ovy+g14V zado@nD$DwRSw_W+k>j907S7#IQYsHq_(F9DK<(n5Hs#b*F`oZ!jy)ld7fx}qdC_+j zB36K}O_HpZ_uQQ&g9G+9g{vEJmVJrC6iq#eh5a#08JFD%lTKWD5PB{FM zLe2BtapsG3BjXuv>5029eg+5A|5>VJL!*K8eccaBtoSWJ_^C&H$T$9g+5}2l=Ya{` zHb(R^)czvCGlvV5x^qmI;=o%@>>U)ov_b{Yw5H~YM|5`y4i%~I{3>(>2P|$0BBCN1 z#5uM*Am{CS!5*xcy7phLTdHMHEmith7xp~r|A9j({PLyhH_mDp!ZXzIV@9kR5k$1A<;y zpzdJCGAi=RCun$Z*pzgL19jt;f21mTNDJZr1jS~ut}ur^TY2b1k^Ns-UUW^eR#}?Z z-hQ%N5D4FXmY?5~0s33WvDfdOs@U+~ITWO3phz|@{)0$pg%c!bT?Kq<8}d>SH2pk* zQ>KxUx(N*`w8pt6x$-z^&R^`4Y+=N%p{E_eSTz za)Xz9eGp>V%jfA5WSbu~Q?I2kx0D-HU;wulPK!WH3U z4MPAV-|&(OAZ8xM$msGH)caK@c0lt21pUngD&cRzXiWuSlok|b{eQu&5RuxhzZ<8s#ot3YKY94 z#l@Kd;xQsgW2kDx>)WoP&ZBoS;JTjwwd`y4@7s&4gXbn-krellt@rY}!Q-2kidYnd zP04rkHk;(yBF#itED<8Xi%uuDsW4H+KkU_*5^9YCSvU!VSOk&I0w8uDAa)60JEt(Y zY?#emL0tHAEe=p1LL%qLK1vL|a99*lXC;T(^crR`G>fEsY*z_nq zY!Qw^%DJdQKTT8Jv+;F%Ms?8+92jmsA2C8em$~2v)B*j^R;hLbx*K6D9M2^2jOWod z3oq zrWt^*5v$4a3A{S58}_{E-g>_GLd1R!?Huy2_lSFaQi zRk@^JvbSgo6Jr^e_6*1LMXeoMm|uk_k5x;x;bW%{EJQ3_TY2s-^*xpXv6vA9UGD#x z^b59~5amYH7`Y`|$cpZoUXXB2i53I*S;F$mO5y+QD^S22*2Bj{sj-;MK zAb}7R4EtZPGM#x^$?BY8?5U*&s$$8BE(?X~sz3R>*y98cFwEcwm#qr1C!U>%Nz#)! zn0BpYR!Ng8QJ|f*W!;Kv`q{)o>mv_DTnam2C4~7@@vuL~ zef*OXkontv{>2V`s}X0b2q@olfraXr-e&CYB3}HG5+M5 zppyKIq5hCuGH5#X^xLlDQ^(mED;>ve3Ec3U+WD*RT)&xWQtXe(2bKK7-m6_=?>r*k zc+W8F06-mm29`OXpI-mo82HsR?fJ5nB1au*M`(&3hvRWaZ!T_gwIAvzm|J968#m=$ zK}Y~aHC5RX-IQ8`pLkF*&i z*irq8>R_^9>aMx|JZ3j}j(PKK)a&Ne$=o(F&svuz&tB|G{WpSf<)A->QZv@cYpa2? zE4LhN_HYYFt+8Iw;a+}W-T}T>CFi!GuUhly&&u6soU`nxt%xFdA@-8^d0{3(oa`!*n|9b8*gA@FIdODdw69g>{sfIW( zsMLGn*shGxy@AsDjyVDOy+ul|^rsu%!x#rs@ln<&JLFrF@#-Ih6cgs0_f&6ZZ&gJb z0AVKUDh7n!i-NQk3M7X`xC9w?;a<&$&LIb(#1a{KkxzrsWZ!=-x|E0 zS^1PL!tl#)2oF@`|09IyHFm*6FcVTx_N^7<6E6OBpI;P-8m;dB*EM9HfZd)v7BEaZ z`oNW_q87V{7guCt3KI0Y#DRM_xcB_#a&9*^^#j+BN5=4=BxZj?wLRhSyIR_5LaQiU z`I_su7(lxAIQ3PX{p*AP!zP6R|D{kxyPuasW=0IOKge*wg?5lF9^3mqAhV=*T6W=+ zRYR{2h%OWos_A+gv0Kd%hQh?Xu^l`9;R5z1+7`2p9Jm;hBy)#}mFCkjO@ulfe(dR} z9|c{b!UGLQ8pR5jJ9Cl_Jcb{Jd;>D@=;g3qY#!O%*yl1gg-80kHTX(DxJ$r%r-7g+ zHOfUDPs_dbf44eM9~+f|YZJ~4dB5Q!uAvmCYM$=vGxsT-weWA7z3u_--Mtj}GIhY& zug*Q@r7*F#DaHT8e+Lu7)!i1Z$m_`A6fQenE!8Xa{e>u9Bhug$jB(T7_;ACbqE3}8 z4&X*wq!f-%P$pjkbtq{3hL9W@*o@txc17hySF6KY80#|Y9)wLFbw}X{-!uz%xLUh? zJJ;YSKF}t+VRAQIG{^k2;#0+%S_`C;DXoRjE=@9kBou?y4}3dx!ui-`~R%IiG?)sxff2uy%Po^eLxD znt(`l)EU-LDpHWpU9imwWMDr4F!KULHJ>4Z3+znGL(=vJy=`4;>$K~R;LYk^ZdVXc zFmz`>9W}J5}~H(oXQeV*s*8wGJ$Nt zGj%v{&hc>d$0<04KXxNqlv{Y@g#ADZS=>}GRXqGDOGm!YjdVBJD$Bakmj@4$yC22t zKJjd%rHDjcadkMyyEIABG1@L$)$_po8rX%x0HK->tOxt z{4SDo)zvKGn+jLv@^)pgKHFx2G1FtS{rp6Zef$qE*JtI-?C1L!no#e7gSo@)ebCCK z0^D>Egv@#uF)VCvC3a|=NcWawM=2X<#SgM~UOKk^+={@QobybNQm>#YiCifvXOdnS z0V^Mkz&&XDfljku8vv@g;oc^(*FrTkw%3*{glNi-yE@<_4)XS}w|U)dx2zuI1?4vk zT*Sxqu3R-dSq#w1+?NjXJLKY6%|{4m+FQ_~B++#8Qpl^pANwuN2DXMc%1($H{YYwGvUC&{UzY)$wYgU1yUL;A%(%=AxENliCdH#mRMYH7aMk|T z8$j@ZgVmdXy?7IZRcF}-_MxnF?~T!s zoa*`0uTu76nJN2+Vg~SmN}6m}a+Sf&=4Sr=MvzPWNILu++Y*m&x%y@)#@&NsK$`$l z&d}%2{GUg^fh$k|q_O#mxn}FzZQIp^G^KG$cz&=1aC3|@m}V|x(IMY>fWyb!Fls|X z<38W62{AwxLZ&_B!`~-|3MVQ1zR?e!8G0*;?sfI#u!Tzwew+@-)$@6k~sOIgfT+apK|9r0Wbb>64Gatp$y6rVk8mvLlqlqj}WBwWZ*K z*x{NzfK;3>%uS+`wn-XZIB?Zf0u~>ISuG9Zhf~#3T{*mSj!?+5*4;SUz8~Sm4-I!M z8O!6~A9)C|eOX#i;&AdYHV$Xq-^nK}TAST+Bd?|7a6_BVMAMO=q{i68H!``wx$jD- zlSUDqN(=DqZt^mj44?cJ&-nisG2Y{CWu`qyj0b4%&4q0peiqDyKXCc4rY75G+-K_J zNKTy5DS|^yE{!1*Gk0i!;o7PL$s&7*rhUf`X$M(DA1JzY@BobHCuM~X%U^l06q@$6 z5E=fQY;1~yU325H<D(a7NuR{4Y@9pV# z++oLAK-YNqMAnt>sU~*}B;NUL3v$${>_t`5+urVaFQ-SYpNFtk&1pDbSsMUk59UyR zy!kh;+zA>w5Yd6o*53Vs^nS<%VnGncRsB-&Z5Q@Jz#IN>uWhOz$qGid?2`h?OGSwF zwYhtw*U`1H%~|=cMmTVdpE9aWBhO3(M?a}@Oob$>SW?S)LYfdT3)hPahc@XmCo*e(r`!f|F2&OHqE(^%JpZT7%;~p z#{tPlW=V>@%Ecx2V|QYZlMvj`8=%B0+W=cc=&er*kd#Jz%-41U42Cl1-K|Ip6ySs+RWKai9+@e=A0TveL?XT?WvH8sa5INjoPi>xzL+H$u{q|)XaPYrAGY=Uw|oq53-;5mXXP-jCL$H zvn04$faJ~SXNVJS1M>r(XyFC9@t{MKxC@$Sq!S0LxL&4TgAWPoO}lqBMT-}FnB3!c z0JypS#Z-kcs!e@F(~()~t&<`sx-Pw7d0;;EdK#PS-Q$BO5-z$S@Ks^ynK(V2nU1@% za3M^zk(u6Ag%F;vSrx!j+q2_p%}ZdMMKkOwdqa#@kA? z<*^y*ttW5QC09O?e(`v&`B$RXExW&=HzoPQ&Vb(?b7PyAxyps(kBPmuhz<|g4AxJL zB@|wo+KuC{J3Kenqz~G;TQ*hB-1J*<@IVlQ<#=W^FmJ{KNhRC)l2R;QD=>;RE)PCI z`G6yydsG>3z|CB~{a+AANZ!$voPh4Ltk%hntGA> z>WRA(f?tw5xH_19v3JH#vQ*3QZBYt)X{JLT9L290iF&u@24|@0FNt2r^Y;dhQC0)S z#O2!WAMV65b%(@uZ90e+ZRNY0PmB$J^04Z^GsANsbueojA@QyY6m3X4B1iI@Twg5zNAp+pDG{t=GwFw3Lh<755L*vg-`#u7k()OP-j8%`?+R-b z@7%lB`-toPtYrdgDeQ0BV?vn%QE zcvLv{-Y!e>i@osd?Wwm@9CW!`OOevw*|9Oz;aa!&?T3txhemEFU1_>7^ki>Ii9-4t`EqF5Jgo!DpC>;62Qi4 zmbbXedcc1atW)R)l4ZWuy(YlTOVajdF@N@hV?uxZeNfAMUwD0QR2*gR4Eg?)s6LAs zoz^hB@Nm8aCjt`c9T^AOcP8I+FXG_m7PluU@h>mwjlQbr^FJfI39DBE+dv+<@{*N-Z>~UpM#Cl%v!7DC9Jz)ZXVAB)^m$-aDTto;s1^8IdaR zOEKV9=Ei+b2J=%yseF%C_MZHGDaErSJ9Y_NRM_B`qI!Xco4abT(AK|f4{h2_;TY2Y zV#iNu26HMY_%VTgjc~hSV~-}sv^#9#|vQvDW@90w2dK~GDA@cJe|Edj803V;`+Ml@J z*|E*!n)ON5Q1axiZx3|rUkdnudQz(lsi5n%M1#t}>{rc5;38eOAKcg||1&*gJFRd; z&Mb;mqRhDg--@ZDTaK`LwqRD?y}xsh>w18q&xI*@%|}FL%glL%nHLIVk6AvsKfVdB zbg~LJVqZxpISm9QD!pzyNwo%51k!3i)JNnhFWApdyxp8ZWqN;7d2=mtG{vtFY%HC8 zd{UkC-xoHkp|BT(lMF72caQpLe_38$(LNvbp=k7_|IPsy3Q~Sn7&8M*?ryFPoEy|H z#+?plnf=}PTrc?W3q1tXFy3zZHkyiiVnZO_;ckij zgf3kubv&5RokKCxb1B~!+x_)V7*}pS#|Vb+uT-q}^H!YkF~vt)4jNo+U5(#$=GM8? zYks>W7awZZ`{SY&%z5X;x))UBOJ?Sd4bkv-HwoQyk2IFQ_|ySDG*pmsm_+rtU;`)x z;^MN+hYrQnakS9jBx21u8e zFvd}H7whC4^*M~J7mC$m*D~a&dvv;rLGo%h>| zjl8`z8e(;8^tE(7>xjJ(={1okq`Nyg3oZ*F70O~cF2HH!nc8N|D;jwokF)Kl3M@<0 z8)O*ag$KCT9ey}aeq_tpoPi^Hx~(kE82zSdZ>jhx|D!sN>q4DxGM2eY*^F-QQwp9F z{TlZvLS|T0qyIy^$CNi$hE8Tn%JRZHt)W03dz9%~)(gmeHI$WKO-g+Kl85G4tXyp% zBTw2)4t{)a!T+_fXQ__;{Ff*n%tx%lgZVHGbK{*cE5fbkl1W->2ou;3+W>e+OL5nYV?G(s@&1HJ(rE5;G+l0H%M2GQ`7p3 z6PMZ5b|sp()o?SIc8v`E(nB6tl(#Fd#%)#_#6Jhj$o=;R%MZ-WVp6jY-Zc`jyyPtj zW5ucc-L8wR0jMUCy-TkRAxXUmA2_v}R?06~>6rGEkmokLeAA3Up(Y{)Frb>%q~un7 zD%nNb5FcxP^%Ezp9eHeO`D7d^;Cj0)gZTm8~NhAveWBu>fGC1!}T|mx;Dbcax z56{F8-yVK;u6y*=H6Q}6;pDNrI-|3tRHL)~N=L`{?|f~obbY9Vh<&>OT8uW_Q>y-U zYuSHq?YCYLT(A-G_pukoLaq|3=Xz<;lyWUmEax62@aan~X8*pBV~?EP*2wdXMYC+A z-?JN*u8#hpxeXr`-{+&ydgHT#&e2yxlrM)FC7Z)9owWVMh$2XL%ew2H-90jL>F|J7 z+)632-n)%e2JY?bK9MrG-||O*cpjws-c-lg9UC$j>NK6o*z~A*&qjxlSAI?4tYB?m zZ_pWz2HaZF=NJ>qpvXCv1Ra0jnXp}C@%BleAUAOAM^OF8pCJb9rJ(I;v~0IfHdUyj zL>{c`wwjU(c_#IEJr0QAjKUursDWuQd@FF`3phD6ps?I|=fUX=`p+~6aOKwAwt^tH zMCmOpgaccN8(XgBxN6Axv<6~VSyiiUXmpg^MLCOXC$F=dwrz@Ah*unb<|kQY+m7{z zQY^Ul?l?!!q+d{Fp5Jy==^L$yA9JfxSlTyZ4OsWCApeqgHKoMU=F>$`v_um-q#XMefx1cd(#?<%kVXLk$|Fe`>E?y1>bA-CM8cCu?{Ny0KisoopOw8->l;1$=;i=;sw#4~n4ZNv?ERNYap7HI$Pl0**PyoGP+WODq*pNn1?@NnJuF~4I#oMOG7(x5z; zNv(7{g@CneCAz2bNIlzeLjC=)Lm4Q^)|VcGvPcD?es>~4A&8?RREyUWrn8Cur7{`C zbDl*7A~J)I;{ixV>19O`%hJbm zPUin>V>A){_mFeg+43gDlB|})i;l{7QLz9CzP}d(C`$)szs9|t)GTQaWtC?7&Uw20Vp-Yhwpca~` zB;;#TK4PSq(WngNPTJIxFacfqvSWWH)L-?H50UCs=*;~HJl*T6$mq@_0G2SxZsomF zy7RXR%C9Sl9T!sQU++}_B9(Lp`!wsg%SIWt9v`ZptdF7!2bL@NSuT0u1GMvXl0aNb z@vaoSkM3&Cxx-h242bROWQI!X$E1)wxm}C0RF3{@`F^HiG9CSZxP6t;*&$33^>-^<@;^-C;9%X6A2V0 zB}~aLw?=3BWZqGaKLjBl-O9ePIaBX4q5(GU5x{1r4-A;ACFf*-%??O zS;(j$OMB5Cm|@A^u#J$kY#^u3P=Al+Z>;&3w@P9RM2EkZvPnt(ayw^IHyJQH3}Z+q z86<1nRrabEn2ux-5>~_9(M~y5$)K2H_cx%Yr%N1j_a-H3QRmO($1k~C0`!}t_whWH zjVoV=d>w{Wpxv^a?b2R7VRFB2q+rOlN3sw;gu}4B=PzE2$@4C>cCq@3ECp!(?!f7M zwvZ?GnGi#bKgB9g@G7*-Vw^Z;dmR_?b6lPo{a6mfPgJ3`IT1Bi$DDT4Zr93D7r38c z|9_XNUS zLF-*)W?9M=Bf^!&8+w1?%7!XiIqG^!+F-snpRgwvwZ3M2o#+c_A-LUD>?8)Uq@gus zU+;-cE(wF!!RK^sM?4$y_UkKahuVRFsfp&+b7S=|STo(dp#eHmol;!qJvXpZz;zO` z&1qI}sLOm#%*<%LqTlv1HyZ%0-4i*p14$ZPbZlr=kwh8XUFziR_m{DAj9~$}OjU$N z0Ml!zW5|(~1nNPa%R(=n(1}%-4f`;lmI40G`#*SP!Qbgh2YFVVu|6PakC^UMzy9{b z1TJuOeB2CpP7qfUg9>70t2Oad*=L;<7DgaQYhh`m?Lt>zzQb0*F^o z{g#y(sf=-MNuwP&m@U448xPusZ7OP>5e>3b6+;P$Ht?{ntoOWxKn1?$P*+7U4b=^6 z)qifX#V^DKKAxd3jmZi)2Eu=DQuXvhkH`-~*Z`lPmE#__s`YmnZ6eC0X+X!`LVPFBmVIwNP3^5J4KKT60k<*d3^)U&ZP-aV5~7V*o1= zGOZ};`cY^o7jQnB2)nu07_P53Xp~s+x%6NI8>RR_e#Gusy1E`{-~wD&(b#kijpN%D z%9y^E40bY%^YJ2x8>1dL)zz!{tN-`D_&562P26aU{NjAou}{+K5?-ID&FOC-qey$ z*uky+uz?v;kkO#<7>5tLNx3X!jCvi_sOA-r3I^EFub>l&ln)p~7FNOtYtzb5{vA*wh~3+~#U+_~EQm=3pp zH@DS;-w3y#g$Hw8ptZq(ECV;uX_I3~m*j4*;!64MSc|@Z2wjoT3>qMOdmf-J3a6u9n~90tC~$O2UOw zCfh3s{J`)Mgo6Tz9kzS0RR^9y4Mx{GDZ4Vwwf4Y2#2;Og0ylF;(7{N%-d*&;uX~al zjKvgPa|U)E-(mXVvj19HYl`0iWc1*QT^x2gO*X3WzYIhKFTPqHxI*u3UzhRl|4dr) zdxly+J32;@Pn~7MpRO&n?7L@CooWll&V|(lA zBPj5uJH^eEQ=}C4#cZu74pFK>>wzc5k|N5(^1Awaj$noM)_<>+W@1Z?xuDNc!)?<+ zuQr?WK#*L+r{>MR8a?UafMzuPtrgncT6+pG9+m_bHl3j-s>=( z0dCJVRRGXW^V!m0{C%&1CrhB5+hS`tHiDX}~FkM-iLQ&k(^c&-e?tC_*wypWV;x#iHZTa)UVPnXQ&^7+<2{Gm`Anv4{T+ICb}Wi#L{q&3My~O5=Lq)e zS#Q>@R?OaG^~H0+-JBQU7+R3~Mg6I4WH&qDPhar|uE1bCh>ot{~Pr;y*ad~Zqeft)}O`{ie%-lgWR)2v-y2D+gRqk$rhG8i9OO*@`aBX?X&#pYu8qAYmp60j)(>an)NADn?%BO8_}vH z?9=Z47a=2^PGqllln@Wje;uPhOzlJZ{#v;!(U4n@E4bg)!BI?ys}}2{L5B9T#A1;b zxK9>O;|Zonoc`6FV!~=aM@atra6~(%t)51UCHNlL?kIs32$+#2<#ltm4xkgx124;^ zG--D1(pRckq-d6;Vs&iJlLq?lM;}W_4U2o;4?#p~D#q<;O!zF0BSutp*_mr`z)O#2 z*>@l>`|PO+xjtc zUXY|Rt=^*Qj~%&r z-PAzu>N6uV9a8Xu>InL<9$>n7RSO-To)65eTiq2tkS?vAU+M;uPZyqI?`weneq2{oU}dvCMOs6HO`J$Mee9rn>x|4uW^8Hbm_=BEB<`NWtM)Eox3S8 znPd`6k?KZkdFAt=zf(-T#Q}F9l?A(z61P1uz8+L^t_(GtGWgCRjG?HWGm!S9l}{lL zPRLdhG+K5Gxu=4(|G8yb?lym(GP&z+9=+!V)%--C7bw3g3W|vaboOSgc_qF3Pn=I>X!ZW8QAMl@&_D(*47g80l{-jz+8bVM|`^W{_sQrCP-c z`<;4Vp=SYBNW))kF4*+UtybZA5~V|4Rv|8xls=?mRJ60vqW9j!S@tuC^b~xxwo+ksc>eNiNrLr3UB0hmO{93~?TMg}~hPYmUT)ynh;=wuk{7n`$y zuT?(r#JZBa-mw7pC_7R9GCbg1ffsPknz?^xOiYmF#)!8*^DIEV5dk_zObdG5i-hvj z8MJ}I`rCDS%mtJ~!!a1km1#6SaPqR-u-wcEOS}dsS|-~w7Puw^m zi6MP^>fa_(73I=b#2PJKT@L?sF2y?buYQ6xZvo~5e(R+!>&Cr@pyB-s5T zm_OX?g@{uA2(ZfQTt5jMYc8M2{fkGbL57|&NNighUBZxH$ut^yP`nBPz9@^_cj*VL_hA9h}c zEQ(2bGNxsvc|ewr)aMG-u80!3c(FsdD=(x}%&?3O?$3INe+yefg;=p!eEarD`(>#! zy>TTle3jL$swSo4@-Cm`pIaP|?tUM#XEZxp(o*n8NeghRpjML{1~bJqCLi3Y>Sh3} zF`ms5&Z3C=Vc$i)Z#F811It&k(d}O_?aq-QJ%UI(5Ab|NS9DR6ox^nMzj+Y*bTE<5 zmgPUXR3{+$5i~OL7V|_k911+EyJ8#XfIqXZyH)8zZWj%>7P?Zht?%2HO7V0NSpT%wJcl zN&dwNr%?dgsFVS7l=bskAWO{Kq~DhXw;b zN!(dFfu`48X0E$p@mHPQ0VO#ZA>p{QXAvYu-|>8U*fX4%xR%|T7< zE_2tQ@(XJT0Qg{16wV_&B6gBZPs+!{vCcICliHpKhyjCsfpwVyIu4>T#fb6^d0uHf zOvD?0FMY?PYb*|}Dxw{Td@JjQ=|vS4q@idlHuG_4aj{PQXV|oTUY(+Ntp*{MZ@Zvp z4L=rm#Zc`vU86XIR*PtXwmy>~SpgLxh@K3oHH20V`bG@Jf?6pw=7(KfJUo&6mdH~! zKl5(3Ut_q)h-bE;YE^o%F?Yqzbfql6V-fmCe1Y{A)62)aSd;?`5g8Mh<1;YMm}i;I z=aR8oxjJN-M%NMtF&2f8X|Ioy^wn(-LlpYA7aL3r&p28lVu9cOF11=%eEKyCx3(#J zZtQ5~2hoqNu~k`n(3n3IPb7p93`X5~c%TUx!hGbkoO>KMR{nyaRHfXi<$wye;Nc}bteNqX;2DUlO#Q2CxsW3PGPXZ+?IWT}jPxf9<~zplh{EFREI z4tH;2uQPhY{qy4lXX*X>qLMT-ZPUs~UiGN~dj0Ul$S2;$c=@!M(~IX?>%0|z;nNoL zsokR`Gd0%AwzcrANKng^$5-U>I&4QzjH}04*0nwC3f}MV`%8vaTrrK=i&ZCE` zaQ*B-$Fzf#lc0?f4>h``qYhkc%@O&SZ5vfpvA@=oQW{-tr zj700tbd>>WLn8BAc_r(|fMN)qb~-OY>J6oW*$Vx2V0#)QA|E9vtnq~ReYODKB_U_c z&Iar;r5;W!miD78=G8Z3U`u|3s}<$zT>KE}4SD(+#Li$kHUrPV+kwlk>8~>1q|XWa zG`;1r+!V5I{$+nZ!(Dr5&C}KV6&lPV+l<>vLf#XwXa{u_QwF(ouqeD`?;&jKBEjB` z0jc*c+Vf%GnFT0xB&`Sy%RlgET+TFIy|!s`Xd}bFN_{&l`t?OUwu>ygVX5nliDs&Y zkc~UJ+wpBn(x&@TIt;@rmngxUUyO9J`!vZ!ryxVZU5B6hwZ_mel7TeT-kU2Zmu83v zK<&#)n&p1xZZrssId*}{If~{1%)ia(Lr zoWI=a@#QfMthxGj`giu*so51E7j>sm<0_(5Ku*S_f^Wv`_a{RTio#19ZS8Z@*Z#HXpW_^dG)z4f z5}Ui}yGmeKlQx$86TbITBz0w_&gRl)nFrJl($$!J(<`ucA|m#3V88%zOI;1`?< z=G8AiBIUS&PX^vhU5P3JIG(|^fA>G=YCd&LrN&tn`qXE7_r+|4Y2Xp%lh*#eC31Ee zyjOXtXgenK211=((L=kCZl`tlb@3s%(yL(bLCNxijb(6uxA!S5H5JXudz(Uveyk_N z6!4@r#PYBX;+^0sd-t+-zGK0DIC8MVGu^K1b^6@t;0(h)WHkhhmvm+<{DjGhY*jf4 zdajLC{d*L@;)s=^8&l-__(SS%sAXDoLAh0|BTtP}cTFT<@yS6Fi52O*;!OWmwApTE z9#h6rxRo53s`Cv8IrYN~#0y(Fh=8j~huy2=F-2p!Rvz5MtXA2vXp z6idNzI4l#>V5zouF2Y=Q);a#O)y_rD6c8|OlU*zPCeo|qpW`d2-B{%L-7m9YH_n7% z3zLHx#q`9LuVH3A!7*F#@sbz!A$?lUF9NR<6)%ayRN6F{dShV?rAa zDK%ZWIR1nTG>C@q)QEe2wF@mSy+MQKIGa7J;9^c+PjhA{VkPlV;vS`gorG%WrIV}j zy~q0|OsISy@jWYk<2ZJOkTNu56SU=?j%QS^{{+IVjcxJoh4`E)csL4f;{T6h^?Ffb zfG(+HY|}W_(dTpHR2rt{^#u<HdXuSs}G*M&im6)En{x+w@0e+ zJo6q2g<^J}DO8|Cl;B+s76lMA8LcQVn2FP`E1aG73k>cyXkHh4#q$k6`b`rkTyj6{ zg!CwCfi&;YzCl(;G>?x5WaZcHnHDn|RICKh^?__XMLB0v$ALorM!ZfL`R)B+M#y)n zhNJ(Haw-^XUuK~R(|Ea1j#ee%F1-o(oKnv@_B4^@Oykc^k)kqS046;XI-Qt|!U6VP ztM3Dn8vSd|AK{t1ydhh6R@W)|k5GdF?m;7@B!f1f^x=<%ESw?2Dvhm5pjT9kP^7A@ zkSVM5@VgBV4;3BJ8>ePUfTrP9G(sTY!A5T@Pmg@&djj=-zlcu3DEa zJ|GInVRaJtKRU5!J$|d8QlIduX%W>|)jWNaPEHU=j_@ElOh#+G{hO)ca$3#GwxJW!BO;=1T(m*rA5G%->-e!fuJ0Taca`-+o(|foMXtNzD;$ z?P1L&{s+2f2{zQ%h4m)&y+vkpy1PgfyWVI;WcP&Ur-KTe=Hj>cU*6~0tUw}<>?(pu zxlbf8`P4mKPsE(#SD55eT%tz0VSTFM$qPu?1Od#V{?4OM9x?Bg?b`Qdd60RGLn8VL z>RvEn2wtLE?wjYQs-kAu%Le#{V9Q(uS{UZkx>IZeE=T119J`g<=;Vef@G1mI@+I}` zB!1NYQ3dk!E&-P|{y6B-Me96OmCOE0wkiLB$Kl`E%`a$OdF1Nf<8Rf{ z;+Q&~McXU0@xDXgktc$z&mxkrOw=W|*vj~?<>(}4yvC16Q8S5%u6BZgveWH8p_D{G za1q{vW_SvRB&3}56|*5*&i-8w_VvdvV5NQo^yhCnoO@LKJX1I1ALi*YCr2jR*xrlb zeF7E6&Z>#~Bxr>LvWN27x3CxEpOG!@R%*=UJ*`?n#0DUT8w=0-0*YAUs#MpZ3i!bfL9BXukYF7+Z62)o%2&$-vyj5NwDTpZ4d-b%W# zFyDI3pWip*e`p$??yOr;I``EmB+~4F)ztBaZ36^Ix;TwV=@GTHfKigR`!{mB>LB zH*gXSYcv7CdkZIlggrk`da`n1v_8>&Y!z*4jeOYcIVvb)U-Hm8N1j0bVou&K2FZAR z{@Wgc8qiG|lZ2Qpcw@ywYSZzo41ZyD>hll$))Ao{%XwG)PM*j3_0B#6AWRCGN))Zl z11a2EmTCUWyr#RZJae?drp7>R5INKSOp@Wh4*^}WnrdfS4w)qOQ{8%UHEX98$1NwzvH8&U9Q zTSOao@LkdlY}BS}lfPxt{M5QSr!ngiO1gs6643dg*}Wo#H*htGaaGMbQsIRa4lTe4 zT3Z21?z&qSEseQyd%cFGu!nBu4`;SaeKU$y_HJiO&~H&n{hNa+y2R zK-gW12R(o3YxTdiGjlmWW~R17TE3*tc$GE$RKD-sev<}CAEbct$cS6w!PHp*Ouzr+ z{=JM+{j?au)r@G+}x}K7jXNvlNk&{62f0^!So+Zen z(3-!RFK0ZA9K3zdKmy{u#ar{}T3n$`IOtgF^7pvX>GWLZGRB|-w&}Ce z(D!$VsEg*@q*wkw+K3C!wM2#36v7}taB@BG#T~K-76`Gc!9%;mYpFm3$JY?kHq**nT`zx8{|ouN_)2L6 zP;*fXL#7QpMmoP~-}cWdeJJ9SEX$M^VFHr0Qt2Syu_D}apyz?MzE(uJNQHO9t$q_W zxmlWGm@0i93%swM7AosG)?c%{s~&5bCmfYPf-$f{wMMgyC13WOaod@htwFQ^AH_ zdA(Wg56vC6VYf>-RDgi+9PfdA z#knx(BMUzn-<;v}LngN`_%|GmAQjIxqtFOOChPjThhLbVTDmtBavwGzLYbdfh0KK0}gEpDk8y*UB+> zS+8_)G~LYf`%l;_ioJS*c^#Ac`mAO)B%VEVfW5re9S4maGzjxV&|GEDi<_X=p&6G) zBvIv9Tvn_!o026@@RQNT3|%Pnb_iY`+jSa^kIRTW68Q7K zJbIw844|TYo?^^>QkDd43-jj~-OYFUN8iJ-8Zlpd)z#s&{i41N@0zgX9K$UYwWQo% zs>z?#NyH$AqZn5iqspk^)zM9;_3Q5w0Fb|@i5e!R#q!xUU=I@G{!zXyQO5>SLEjDP*2Subt&bbvxkwTj>9L#G z0_9EqBFwZYdUdjb+U{*OciE1Q(I>-8X!bBA1N5HPbqt5X&;&ic6EDWOy8L$y@0C?c zM$Nh(n8c>bB!{NBZpW=3CfhrqhE|Wizq?%HX;ggMQ$>S+r}CfJF(H%x=bhXQ=hunT zzLpiKkhzO$k_lRAUh>m?pi`e=LsNYL_BuLWoeWBgzOkw~PboxW#!uIm3(5e!RW9c3 zX*VAWAB6~cur8Yk(!xH;6Qc1FT|g6?U!wB!#2?A$$v%*mn2oBX<=*Mw`d%?TtwB@r zCd?yon{S@>tI8k0r}#Iz{NQ2l@hF@*hvgqg5VcN7zz=_HhXsuAWe3XNBt^&!3%(4So3(Yn8S(oe+>GmN==2 zZ=c6EooY+--|g{c-}DK-xfekE&AkV5hUBxuh=qFkxNKo}lvznvk?l<2{udQ^j2*`h zCw|y>;a)%X{6xk>+2y&NAIza^8x(xPV<}QyQ+cP+05GjeZa?h%Pl=$zDuq;g#CqvE zZv=5cRuy9ua{D4QnTp)#_o7VvmH0cp=-aHh&man-Q)gTeiPt;2V1>&3@_wm54#>W_ z(z`IOtGMf!PVbYlX|L;x6Nye{QHI*6Gv87;f@r`V(STEYV%YW+@iZ-JZLiRs?rdLL z@QsvbDkG$8%WKJU-S=f>Uwx9xhi^E-ykK>8Xr^i@!!+)%NX3vXvL4S{P2xR_;2BO| zfvcvKuo(N6wVEFrBYgM9&;pLQJ?~ob+H27;f`O%ynLJ|SzAFeJWLoo*eTX zAv5Yd1}M@ei$|zG?vv2f1S#+DD9+sEJLizI{%#}W3I99w^twHc-*xJRj2KpdyE{&Z-_VxBz=f$-sv#*X#xguY<3Wt2<#e;zdFQ8OU(@uym8XyszVg$^4V&GYl31YMWL-q4n zF+)kf$d0zui(dxvey=f;-#badkeMI8oM5qW6_R}7u$Xd~iYGLKc}2d8$LWhIcI*o< zDsOjogIGj+hfU3d;R-#Ki$rxSG7c#khX1ITwEsOUOA4unTbJx~+)Md@Y;s&T3EA$x z>dQlvHKPiuF=No^W+G}y$6BYE&~5}kwK^`4jFy7Q{=U6*iN?$~o-9oMEB{t`I0t$J z4M=bYUGK-ab7TL(B;!8wfli2s*1D zSzz1t{`sH}-F~HGX>Gl76dZIuz8C{TUp7Z-5_!}1f`n4$$K|igS(*NsQF_kXIc&o! zH}jdnq=<$jC*S`pn86PLd#5j-GjFe@r`=cZ98gZh_x^$N4xLRhcphKmC_J)L;+~C- z_SKFJ^*wRY>Ju>CSofV8zP_18T<`XtA*{$F*W;piw53IM;YLcl98QuBgenPD&4QP5q}==&|NKNIkqdWvXRL@G*yO9eYQLHx5e4bTpJH>#WdCb}!Y(q`df z=Q>(=?_92C=qh?4f3U50Dkgr>%YIQO_d|KX@yEYT@>hXHJl%k=_piK&!CRtL2u27a zj3GFwnY`wjeCho^wjq3}#`+k$?@e;ifi^44{c%b13)g9ylwzZ_vW-G;SJreicnE#S z4AYFpmRQ&mpk3Ah#QDve<^3=In(_b!91V8Il(JvBDgVcK~D}(EyqiOV z4a)XDYc;=HH_=Vl5Ge>hmJ9#JuTXJ#eZ=tdvmc7C9;{gFy4#P_%P&xwY6_^Ot&HTC zufe3Cg7G1s)ud@{pgtjI>b0KqhZcRgIacs_`2-(poAUzX*SI_zT1vTI^S#Naz}TG8 zk+Hu3ZTmF4r~2|IrzfhT<_&I{`UpTW1j?M9E{**iJ@ye{{Y#+iP5U`>qykMLn2W;K!uFPQWyT6 zC1hkn)yTV>@%VE#(NLfCYpT^l@3@m(DoXfQsN0za;&snH)O4E?PV60fG9p5F(jNQf z`ew%=$l?;e(=$seP}t9Ls^I22Y~a;)SXx_6uP5|Qr*iMDu$WdVWSv5mCS5)m}kxD7rn01oU>i zgZyH%jFq>Tso}8k@arcIbXd#-nBq7n!r|@n>ol-}FgZrv+K5>Tyg1d9(UcA41V+v(IWn{`!Aspj?=n_TSnl;K3)uNrt&LrQQ`Fbt4ZYKuaU(lcU zTY#bj_epv%mg)p~{r&aszL3KERG-u1k18DMT)z5-Ny&R3RVuMI z2~9rrneQAuzGD%>1OlH>re6Olec_!*gh|PplTyL)3;-d3I5mpaCIr+cr62>(BjzoK z_r@~6%qT3kD7Q;cO{x?p^%1cx?Fgt}XKIeAje(uH0JDS#fOOurw_|%2vb@`W;}$b) z=FF+41t%VpCVw!YKfG4>AELG0pd^QS-eYQoz&4Zc`m+$04?z+6cg}&Vg)!dZI26?t z(t-HsyKl91KaarYP;^T$PuKm_(&8znq=g#z|ZCHMh7T|Fd5F5c+Qr-w`q~U@VN=TANyO6;fv*8lBgbBHNt5> zciS?_lt0DX=ii0_cd6joI39gp%sgeFWX6{KX08D%T98zHfrzsGkTbKP;LS%0idHvH zQ_(sBDl9B4rNHs~5WF0gg{jA>#wt<`lk_3d^d3rbR@h8%ck+2t%L?p*CwG#(lBsV@ z{=$Q>DZ`?qm{29nol^=$UyY`sb$c4Rbb{Izr#~&^v)=My1C?$dn}`&U=a;vA4XYuI zqXz1XGeMPLV6HYIuR`8;JKux<;mLk9j+K%v=$>bqxq!zFyq!qjycX7i_9K^B)&%PB zO(!_XF@|pWM0)8+NQdz9F14q6hA2FvN3*SW5 z-7cvqbef!bcW(JTYr58q1#bOuEq@G(W7FV5fdV!cs+lr)aW+0c6r~? zRFMe#%{KqdYj4kh7r0u(jN)?++|KwQWm_3NaNJ0x`(Ur#@a}9-J3uP_3;Sg<1T$l& z!}n^}pjKZ4P<=EKJd3E7u~L!=McdmM zvzXq8tS8d$6Eco#!}{6y^aRfJs3bonDg1lZGTEtD%;*9(VXIw<$F}B#?3H&-3&B4k ziNtIHj4~rwyj#i>sI?S+_;WT9f+39MK)SI9@5fzPRr&FOx0Q0{|!661cIK& z8!A$k$2JTrF{z`7Yzi&3ZuK=uKIG!J$-ar(@ZBu}@dhas;minS>S6Lh2sDW4ob43{ zw;tV}Qkb5Q3Vp;Q1uH~~ zRfL`xPovcJ){>~ap9wGLIP?lGdCgBZ+}K#_8jV~dhurqnt|Ib)AZ6juYhee)&;&ISXRP@Vj@_VM693H<34EtVPyd0(`>e~Ol)~&8T!oHD0GEM5umfi zaW%7yv<7uH3dZK=TEu#M5vQDZvc?viA^nQi-%5ge@%LLEwFWFT4iIAtY-r!V@b6)3 zKz*M~aX*~y)qz*ummD_I%e^8%^3ilYW;kSYK7dTPRA+DcCQODk>KyC(0;iAfKy$dK zXVOV;UA*twv8caWkNxn*RpIuqqGzYV;L~(Y5BV8w5o@yjgiUpojx? zF?zy3@&^k_O}Xdol!h-z+AY#%CyWIxb_0tQr|Gd`hNAs4LM@URX93$+y^28|uk!$z zMB)^Z<>vO=SN@%q;W zw8nC^G$5(yspaJ#+^5=A>?szBJ;^yp@xRscyX(peMH+&ben*t(IzPfz3+DO^!H-+G zxGB27YD<;<#?^d^pgj9qF~JpXymqGyFim0*sTgD*OB=PGM#6W0GX-hAL>rZ~&y+?i z_ysc&EuSA$J4?4nN}mkYX| zn5WqWb$>el+Ajunc;ay=vjMt)NQyxQO% zZi=nc2Nu73Wljc5qI3+fsnu3W%_b|$(RaDSkp92M#nLVtvWSy+7_PE6u;EJ?{52fLgR!y$em}dCXg;X(A;STATr6PIS2{M-5psH*opA=Y@aOo;~Hj66L4v0p2 zdOWLy^ug1$SQTH0t2KA=_l z7iQHZAl{jZ575ZL4DwGFDII;fLpg3ADOt4_u#+rsZRBUXNWKh(X3fb~@M0KE;-k%Ur@FV|nc5La^gyS3XL{mR+gl7@&L$g$eBqvaOYW%jz`C*-&SJF$0ogVgWAM zcu3B05(Q=GwE%e}Lr|g3pA_vvBHHGk>}<`M+pF{<?8t&Z2PRc`*X}hp5h6L%aud_hJr>hX4aXXZEWecP6;J zR_Tz|WmV)hWjys7T>DEpJxGv4L#n}sy!BPJ<-Gw;TzQ#hBe4Gc&C*3a=T%3h3BE^N z2(vw#UOlE@slIWd?g95ut5VV)3+{>?Z$uRm&SWF?>`$J;{NmpshYxI3=P2Ue`j>>0DDnKhzn9jP}StMij!Yod-wkKHzlTg5YY~_c z;S*0mzc;CQ{d?E_w3_LF0yip$GOW{<+c_B$L5-I>8}?yXWoTRZ<~#m`F>lF3aqi?S zKLAsvzcwR`%i0ud{u5xiV<5qQzAzcVfS0phr#}jIdovUF(xr?!FO6OwX3{MgrUTHMH5P3O9@|e8mQgCteqgZ%F8bp3Y3w8g25>W4B zqsLyAA{WE|(*Wwmcf4LQ3$VTEVC+1bMXw6Mw8;JwjC;|-FPbLc1M~LnVwd}@`I>s` z$M7T&NguVB-m}v!7_aMtUPVI&KNF6I2L0`(E2$2>9}!- z25odf;dspX`yPfWcd0?+WKhs{?uTqBGq@xf(vG#wEZbn^Q>eV)KoL#y3Eo)bT24dJ zXBQjXMng@#u;lBTHAUBgW5r2sHpMa!NeOHP)a)oK0a?TqdNqJVZ@{Nd94XVR1GZxq z5BT{FKEtrfC4;#kg+`HYrE}vxIV;-iyJNh45CJ~J2Ic!S!vEC#7+<1KL8dloNU0rfWuTQJAyI?2Owf(MV{O>h?oOp>w##_XUh`L zwPi%c)BL?s=xz}N6$$BX6x`?#3F-LJAt8*e z#k>EzFZ;0L*l}#nb>CN<=XIWs^X7>nMZB~+Z}lIvabye4jWS($3R#gCSdVr8+@q!@ zVN1WPH%fBXj!YwEerRSQK5rDu9&_*0$cIXI8fMTZ_uDBrW-dO6lDh)hlLxm^cbpIu z{mxmpR-87_+VI0=cW^4#tE~eX-9*^4?dC^h`3Imo`!c$)yXQL=YrNXQEY`xiF2L)! zZ@(FkNf6|NQo%GZJaGl&6Y1Rf6h5R2a0g5gY;^0|DP4q_K@Z4$$l#)b0u&kKC!Ebw z>#%Jqx=2)C(7w76w;kp2My`h1enGVQ$BE~}y2(T#_jF^1USyq!4urH?g6+DzY~g84`XxE{P=&+9D@ z=@4o6N_3@%D++Ene4=;XVo*?!l?I{VP41zj-!fc5nk&&Sll*+1$)(JOVfKx<+T`bx z?KrmdDoESpY;Ihi)SrF`FV%tfOmruGeCOXMj{c;9 z-CS^N3nn%u3b0Qz-$k_NNuSsuzsVjJeG5 z;~4W)X;D!u;`z(oWy>x9fQ8WSDzl)PQQmyC?eBwtm)V}xU-)u_(1215wX-Im8wc=K z8xZ-fSqDudo+aID5uwS&1`E!qcl8?z20lf;gA%9PyV)Mh%>J71X(2x$F(Lg0#s65- zuYw)d-JpP81e3-Ir+eP&)l^2E*JvCdte+_n$;@?}y&bnZ@DhdLO}L*Z-1Qmt5V>Up zqUz|eP1||VGYzx~Tcp4AOf)6ay$v^qAUB@)k-`5!Y6jg&bTy-YWeg2D$683<)o;m1Ia~O9v8-oD-b#{@2V1hdX*)UUEWI0->B(NR zm_go!KaBscBKfI%rftO~=$(Us_H1*_J`TE>i}EPDkY%ItP9jpw`VW4Zyf%QAFC@Q` zec3Kx`H+`D|6uR#e{PW{!MDM1rmFFA+-q(Iv)vJ*)Ls)&f|^wSjn$ZDhXz8^ zMIDcQ^wc|r8(+!q(&qFMK&ct^?DoFHL{Zqb(GM#c9IcoaQ+MPXX)jA?Ibo(o{o5pz zK`DvNnfkpdzx*)6+s21E#H^iDe}u`YKRzVp?bv_E4{kL}OkkP>W!g?xshjuSryVTv zK>kYCkzn~GsbUV$`CA8(VYtD=ri!ubOrk2*%uQY%KHxUh=m3g}`L=-x{2t_Fw^NPP zOI=C74!z~BZQSPip0VE%1|^I7seAE`ig$;(U#Oq!=nN`^0*zi!;NL&Il%XDBTK0c^5Ack{KX#}8;*{ySg`-a7-qIH> zEx-{w_;aMPN1Qc|#&GC}!s~Fc^g~P~sXabglO;LB8FDV46H( zw@J~}1{3O<03T(W%s{lFA;of~36w3d`GYO8*@F?2Qyc5AW2vyHE(<22DaD50{v%oZ zWIEdN+Q4Y7>5{kYb!t?zn@e;W+A6ay8JQt74R6J|-7r6q6GYS(ysoyO>+%z&ilbnI5Xi%)mR^$n zGEEnEvwK{oJR&5Jn}REZK6Xq&v=<;rSaOKsORt}hh~Cj<>0CN?0A=&fjSBo356rsp z?3N>pfh@|l>4#k*#y$U6Xx%&ZLFRw%w|)~>9$qv9kJp=wUa;_i>D~wASSA0lp@oNf z`WpJ>{F0x2XBC;eWWqw1%+R@%)7zZF%akrhpbE7ou*JZ5=cgI}95e!+7f;czD}B7i zjaUJ*W(L4Rr5|vAiG9&{oy!EIeFRK<3C19R%dN_@@1rxiV^`UXg{cj5YfNcaLksCS zJoIzzpEJpOazPVq4_~WPLZJ@Qdx~`FkcZG^fy`w(rBI9x>YPd$}q zPWm1G*9iMEtkxT<^-fFJy!U0fIb`{wtIgy__hNodL{r5yEjv+K5}zI->RiF|MV=R) z(7+z~PFlO(<+I4%*pI3Ao$qvC{<%@l&=a>qXLWo>8pM;hILczOT-(+CtHALhl$mxT z1RC+u?mLxkn!!_Irvb65!@-I9MqUF8%0XfoJ%#!_;Yr*t1~{XdnG?F_ANH+s&OzGv zA4DMa{B}PkmZ=d?rFS})@4cm4_;T0f7H-p&b1Aaw0PX)?q~}p0(WfV){=6j(x4#`THO#{EEg4W zVT+^)YSyx-{V=e9DNQ7DsZJXQ?+3@wAr5mcxeRWn{$}Q_#=V7?G-uqPr%gZ9*wud!MAygyG*U5%d+UyBE4z0xACw_KB>KlX&Xy7s*udgDpX?yhu0mMGly@!615 z^3624(L#rY^XBvGFZ`SXvS$gq6G?t2s=M!!eF{@wy_%YPUhTDE>_~QZLVA&b{5bW( z&PmI{@#ZCJYEX-~J4_|!M*;;SMZn^&>o78wtUyWNl^X%YXMsz000aNMRdWHBm%PUN zPFgZE>TG=o*EhMcY_+eKL{*`J^gQxAcP?cSA3On6h8x(QV~6gt+3$$^6`4{N&*=1X zQ}Z8tJ3msX_xL+D_WA^FWzBD1Z+EBOhYj!{gVGGQ4jLQ=a-_@r;Rng@D(4LB!a{C^ zR9^>1h@!G0wfY+PH0i&7Ne#3v#keGy`!@tLr8_Yv%;;z=77wP7BK_K&T1jcu5^MLU zbPC5lm*9gxo3^49$=@>yg3(_b$vxHUP^LV16-}PYB}seoaLzXw$_|F6lzXMWBJNdz zYWmX21KUW$_`j~Nf7z_deba36X^uf8{99uy#yglx{FzADMxtp=u%p->?il*F#gS=` zcZh>3&^0moUcE4Sf0ps)o8KP+l|!sTTiZPm>V(M2^yscNi5oRFo7Mf?W{3H5_J8nRVCk3)EduU~KTz?MhxoNv>9Ekw1Tn05BSI!?h8EwiTu|v9a9#yC7FpZBIvH z47+Eo&u4j#={LMUgbGRiM=1Ow;BbZz*q=~?uOpI1f5D9ZEG-2epiBU|9+Du{dLF>S zquu8M{As2U3$!)pB4%&& zm3XzFCSH$8;H_1=V3O(aM({W4o3M0X`2jlIR27gI)r{1TpA|zfp9Oly4TJ!F)#9rf z;vX{gSUvmB*K1|_>HVtOlH4-+vLd&>a|!R7XKVM;I6zZ|E-MP9beHC$9x474S*y&a zn#vXj%o{hl#RgBu#9i7Z*b3ZzG{sauz8w8ZebXkcSecX0)+k{qlR<(Zgp(nJ?}EBE z?xj~kzBS`7aa=wCFDd@2lpc33Q5T}cYzjwMIhj3^b-FU0WLw>OS5cOUrI;hR;3TMf zT3y{OI|*S=4Uwm=^ZT=Z5P3ZywkK?3#yh|*!ywaD6!HAup%42iiw*~t*_Y9KiB1n+ zS?fT9)QzbG;w5BM0cj0jnFcTdVm=gJzZC>dSStv5ctq`$VRAhZ0{C&rS(&!uxV;O5 zJ=#qN?pW$Vc+V`4_>q|s$?{FPBPp`bShE$fACkjv)9)~6=gV8(&0FF( zLApxI!?WXt`}3{;*557#@y7#4dTOUf4fsk$dkq(d13%}AZ0^IiUN!~y=Xdm{@U$v; z=c?St)u{O*DxoXm2Pkrc@x9tw%1G0$rT-+U13yGfai2#A9llxZX$v;qv zG)RSF8nX?{FffpM^)GcDWx;a|?!S$GylxK)3&hkVF=&2dJTnpKTFj=NvCO|wae#&%7U1J54&7;xRE*x51Q<%2oO^TEU!`S|pTC`tQ?@8#a3IpZH&g1u$n z$Wo-AjS$l(LH86j4 zZOW_25Oyzo=H+)&J%fUa&Yzh$C@jdo5UL2lWf*gFsDNR(lk}mz_4FX+uI;sRL$t)W z@R#uyslSRYd!5WtE56HbCrU33?e1`IZPi9<0#{#*$7;zC_cwxxXOI;Rl<1n?ejqnS zDG(nQWcr?OdE)kye90fFz3it&X(#*e=Z^s%j0YkHd$1FSWfVAfkbuPej`YuE5Uv=O z@A|{RDE_Oy<48leLR>G@2G6IYR6#?Nc!XZ@P4w}9BF6DO2+HwMjU&lghLT7%C5hfj zi0<<1>&kn_==&KGor2}os6)_=aHEf}xAZr&U^kU1j)i!Ix)$H9vt>b5ToXbwqsf8IFUZ!7j>2toHr5QI zf>`z^&y8@*=bQ&u9N!sjf9yNI(5d>;jK^}B`%b8LAfYIK0@r3&&N zQcMSTfMm^=-AF?;PcYkOP=c<0?MUp%VI}po9c!s$`^=qHT&LC~Lvo|H+|U{Kt(If0 zypa-OA3B7&gMea#fnMNJAh)ns@kxpRLDoT%p5_E1j7vnnW7;X@-Zku|XvVAUEzKk)s1|AFLwHdcoc;1uL| z0zwv%RSe0X|A^lc=XYkew@jjFViHD&oC8WT)|AmvCS7^-H+-BEXp) zSAW`XA$pk`9UH=_;=nr1-{pa%T+s@zGQ`gDQ{^92CY!}GG3E;A-;v&H`AE(Effqdx#AwVB8-@vqUIRH z=s}KQe1Of*7!H8xk1!O7c$a|I>7r(&0A%PT0A5zOz#(lj!T1zLwwdGj5iMO$G;!5y zyIGR>@qS?g8H_O>`uIH-b#%UG7qP_Fr>jwNB$a~jWgyF8mW(1lD$Ad*ia)iOsr?nu zYwX^^?x zw>8t)e>53M0ch@wxZ^TY2uU^9cOCSrC_Xs5FaP(*0H5i~?qKtU`OHkUT@3RPQRx*x- zpVtrRNDTZarOm_lje|Jn7g#38sMeaFmY5BV=Yw;u$Q^M@nP|}q zxzt3b&rw^OeOEIx%1bh35_Mwg@tqJ(gba0mCaHt-tObPz#6Pb*jH3)jXvIoCHB#Tc zmOIpZcos~#67LX!dce*8Xq^_Ur^b%b;g1~hn9AY!>d938A(BzX;uWGoy7#HaB(AKy z^3Yr^>wPlW-kg3&^cg?j^`aegmi7hJvII!L=c*#etLHeK!=ptM6dMvp#-*eBAwNnd z1q=IB7)4%kWC#Xq5pNw!u15M%iB^Oc4SgM_VK~(DBW_Lw{6RKU#y&67kZ4)c)C6Oi4tmsGgFHC^jBG?x!<@i47YnZ;UMFPUFO@=IBw;z4pmIQtFr4GgjT3}if zi7x%3IB}=$t6S17bI9dea-G=inYZuvx)(Lu^XIs7mml6)*f*5p==$~j71)1UQDqDg zDj?h7qU7*IUuHq+HAma&gp&_;IYjB*QQ;8T#(4GSN!R&OSN-`S$jdTz>%HPy-Lnv% z*~uK70uGXF!~JVszfskAsEQ&Ecz;0ev$`?x(jbnQ6(fPi6|q{~HI@@6f}C{I(@DDn zU(7$qV=|qCvjF(aYqDL`dn{2``S&{(f5rP$2Sv|60&q#BX{+mu%@@eEsPWf&1;(?$ z<7K!LJ%^{H6Cb*xiBd_ag_7n*WoTE|&I(3Ek&z_H;90m6f{UilH6db6R;TOG(rH;K z7FZ|CQlwavia4#dBW4K{W zT@(Ej5@P9y1P(7%Uah~n0O|dv*r`8xDwk|>%h8qPR(`PQ_mJB+T)hylszW6reOW3UblYG{UANfaiGJ0BUpj?`CT5ccKdin89wfb3rwq4`GHZ?mQ9m| zR{Fl-%QIwxJz!U=UMa$Jo+cW1H|v4CoGY!l=FPMa%7(%T+%2bs{IGsCdIZEq`>Oz+ zj4@5&0nZ0IO4gh&d9Lt3hp^K*w%}CJvW5qoD#Kp!sGjGOZHc+31}Nk63>`Y$0*a@O z+W_0zlY0b!-^lNVa>ohyd*qWtOUf ziUqus8G+zIdx~EYDI~nr!Csc2bm@^xuCD;ecM4zi|Wy3rXj=(>4iaG zWo9cd!r6qG?0t?uS)R%h{{?P+tFgWMZEz^6QBKz}zBvZmj3P~HX57`JR-$&uX`1_tSe^PlPbI6UbVw8XMDf9f< z9cOC+Fg!I|qkMIS!^69AoIo+n*gi`k{#OI|>Vx`{hUjbpi;0g+bfmqy!3v@itGiKC zKS6OVnnqOUQey?44lXbA@DV0`L}Emf@)~{o3)zzrPP@ipC464(*e~*-A)!V-j%OB1 zGH*FPWhti82MCdADw7D%0Az;>VNke6XKm|RUa%v3+rkv^R*|Wr(Ph@B2kp$3;T`@# zfW(iqh9t>0iLK3@B3wEYu$w-2_Bxw?#ok7|?#&q=Va-D~vFhN^Qs4}js!Q`X-ZDu*!Uk6|3eZ#cLLpA3-Vn?5)?C~Co@sU&I zGw9h#aK%jDoQzYB2XT*AU@R(+XjWOnSae`oXs$|(#~Rb=h1%5e)>muR0ul2*%wizJ z?c0{Qf6lg5_v<}wEOi&3N1#;QJs=S0RoQOltV8W4>WCBt&y z$wtn*M!Yl(c9wgn@3kSj2_NM+RX>+S3O|Y5ftlh5u5u&Rb0J_eoO#_2!Nx$a z8XuiXP>RLD+P+IAU8XY-$_3_!@X5}(vxGZadV@35Vu9AfmjuEHMcs`b`kf_ktc_1>62~px z4_{4r^4!4i=W(WE*&e3UBf1}YBPH7^L?`r;`R`RvcP*a% z-g*dCB0W;lxO|oRNli6`djFFmNss}ql^&t6YS_NyHf_86a);rb25*e%Ri*M~7C${& zr%GfK813(KB1Wqx7*5J%!uqU$X~P-ek`BnlQ95CJzYssC-G->fBv79))&l{2z^FSq z!!p1^)QsROC}SU($2ov_(gG|Ggp=s^gaMBSNRhma2`94Dr7K``jk1#JClxSF@)>%i zR&Ad;YhrK?qDyT*3`t!pz*93N#Un+!d| z8w*G4WXy>df@5l~4Z3WR$ryp|NK&cb_ljic~EYvRGpK@7S#o?TZ zq1?vbG2>=H)`rmCK_{MO~-^azq9i-h%5xIgd}A^TP&8s+9H z8nv}9qRp@E>~dSXs8~$9P*Ch?Jp;4;0F74te}(R@epQW>nKHI3#eHLIaU&?BhgDH* zT8#KgA#9FBwuly02yG6j+_Nj$2KTGm+4O3!5s}fouW$KG_KDoW{5*ZitQNJOUpi>~ zR4rCYvVcY}_13w>p}2hmc&Xfja?*I5(1yx?FllI%w^I)9tSsr7w)hs`Ij=&%TCJ=VIQi@CH3FIQm>h@RWXjW&W{% z^KuZM@%nq#m}LBsa}7w+VZSn=v#jUxi5J;XN)6JIq3JmGKh!?v zQS@Aca%jJp=DHggp;gm`5c>1>k(H2(k8%>_c$j1gGXJcdho=mr3MZK7vgcVoow)@mUSrjRgXP< zpOP*DC=j@`gVGmbP{imQbu~I$sEtG=5({*i=Fwu?=a0#>fJ@~1QaD+3QYwM$W!4y; zYXHGBP~omuD+5C3dYUu{+`1xrqA#^_eM+(cdL=LPmo;df4NmcW~PL>?e9@zWGqm zC1t5-n|tSUTBLgs!2oJw`ALScfWLV$nBptr3Uuq-j!SvO#HR`R+FKY@q^OPz=k#!w zYWge$LbGQIxuvlzUecvHV_{|G8^Mr`5@hJ7JLbI7@gxfik*3-Kb`L<09qxlInUqRzx*cVcY2egt>%)W2|W5;3SNGXAa_PZM8OydudH zdJQV#4%Q?S57Mpj;~QJ{=J2+~o3M`n4?Sq+FPj)Eg}bMV#BXC^s%HDOvzbKyK(82V zPKLD{+=MYtv0K!m-vt>_&oJQDSO)WBsJXdM#sI}Mxk_r&m7d&D4~^!#`fP3C{>p<1 zWKH7Fi3jR3;2LE2471&Ko#-SBb`KA;=@NCdDfD%%b5hn7cw@b^@60D4a!2#y%^KVb zn153n#hG~_tgpp_TK;wHs`j!4>HF@TGS=Q$?s!ozXgijWEDIhIM=C>U9XMG@2^C$cC5ttT}V+dWkC)_^0UH5eN z4(fV3Ij7iKnDwxB`bIvCtJ+S83#!$p_hBt_qpV}eBvMwMe`({Px<9KmRzn)^KBWWl z!=3P1P@bDO)(U+58378iS8D_<&O3(!wTt&tLoi2YemK3s2@#DdzSE$j>YeKc= z@>X*n4eeZR#*R~_v@k`;)^kjtHXm_W3v-|o$$V~Qa4!wffPKXL0#y9VzB7=vbB7=uj-ztxE-Icd$leJY~ z+DFiPgnTGm9T5VdczqP|AS!|A@6#WftbN2-Eb>iSTtMg*+{Pv8^HdK0^#TPtJ8Ya3 znUq#$!Pyynn&VV7Md)hV=+f=rH94+524Z|P*<*jBYB?eb#MKwZRN1_V@9t{-o-T6QMUxxGdz0G ztRcqr-d~FM#$4Qy1GG_~eiuht1Yd-hlRRTqZmcT1)0SZ_@}o3>3` z;+}(z?mq9DR-qigZ^S;eNO2_E1ycJ+rCpelSvY8YVOCiF`N}VkSz*(PIQocm2o7bQ zTF-VMtZ2S^ z3*5m2VEG=_PZNaZ3ANZ()a^&Xv6h(J$2dECmOWzHwQ%Zq@$ZyCxWxdJ^h9WE>q6M* zB$@$hXv%TP?a9#frQQJqA3Y+xb8TYf=Y!`MrAD!P0>F%%@PF$Nx=(5iFED~^HwT2} zzCFGBM;Gvc=kNe2jP{!9ED6;^(U!j@TLL@8E%2-Ln8m#Nm~lhc=ZEY_aiG5#Vc0`R zH(b7q-VcwJ?`a=Yify>&KO_JYcv;(Mq2;>gSCJfV^8vIL;4y!q+*rZ+Rga5G;(l+B z1n}6-;3IJ$;~itlw5krH7jfGo$X`d|Pq~Qe0P|{*Tyg|cL!)D0 z8zeErx|S0ZaobCGnVg~()TIeyVwj&$zJ%Ym^RvJJnE<~YoZe`d6z+? z(1);mOG&!r77cYqgSh50I^~wdKdI1Yv3iFwv;bSKN9a^{%0slvkBP|8s&JtmnWzPQ zI4E+CyPf90On>QfiV%DfJw@RoFwwG4qS^AaVVVh%`Kz$)=U~Mr8?Trg>w;uR!j zNuzV$>E5$aOt19^JGyCDdH|~YmG7o#{ey?5>tyB1gI;52hx77?qq~iS5w~eV?Lg_} zeIE7WK!F;<*xyl{f_*c-X~6sX1|z^WFpVRNMbN#vmp4hg-B^mR&MRpqxwH4?U<#IU zgmHJ%vu6!u`8bx0qFK5ZFDCn3n>_O4pS~KK{GBag4rg8CtoXOZUbM~X{^Z=tJ7yQw z@Ag-5D1M~fj4_9)#siPBTtEP3zDfj7|i4=Lv#C+qA zcDbrQc{t(fh3AH3frnB?PY_dMe(Oz+_pSq4gtTaBi?>%y1rC0t{H^}o+@UORw(I+! zg?+e0q=EomVFtOS$a}doWJbjZ(S>~VF?~jK_2`ao;SOPlC4>{fC)QZPf4bNM%~eFP zAf>mWA847ym?@2b_ermXE$~1AO?v!qfNe=bEwiY)bi_d*C5 z-IBh0Mx1z#TDith#Q_<0B+Frr7TNddeRghM7AF7#_=E(W&E@N}Z@-e#DK4T zA7~s9vIkNk{7j%F}wNgU)t;0qTijT zCNJKwBrk)UGl^$7gYeJ4<~!d*A_5=U4lz;wi$Yi>jW zAKgc{eeSyovlYN6g128p@we2m0I4U2ymhdwm8{3DZr(_qsG0?2!FUw3nY~k2jg>r# zstN?kq}^EU=w>-zQ_)J^kv?hARFbZz!N@&Bg4 zx-a${+0$x}^~pQZK~LM=_X+d;^KtrlYkeITYAG##rBbfx)4!&bHuo(X~=|o%zuhQWwt849M_$?uTejQb5>ah zvmCJY--RKKvkZi%@e-S@$h%j*)skmwxsp3Hxssbgxe8ZvNHy0~bJlxH<;gi~W4*tR zJPKTYOd83yXP4ZxwIS*uNxDYqut#Q|=dMj@jdbm@eD{)xCwbFWEx$>YtQA~7lHXcB zR@er!H&t77H&&Z=HbsrOn@aWl(+B+^Bhc>LPki$)P@m?s@3%qFe>A_%FXn!Fz5E-3 zo_@n%H+}n7&jzFD>B?llziPbf9(~&7z#uFEibzW`JwF(d?l`{dYLV&|ouPYW&R^=* z4a<#z^=b3rTet;Npf$|qovs3S0ic52J!+CT(OE|z=@)x(3Z?|RuHeJ^?OXn;dZe_% z-CejOB}wp%E+i&&Uc$(y+_D0%6In*+4e|L*%(<0YU^Jh=aRQdVYEK(Tu~je(z8SrF zM-uY)x+|j>Up!0r21bJ!0D%HvOScYirOF&(Aig~mC3x;}rx8e9y$M95FqU{&H3h$W zwW?bhkatWd^l1W4ZJqq*t+vZNMqVk{bd|0|&B*=-pG`CN{oI>cJa^J1UxH@jiVH2d zO%73BXL3qyZ)rLHYtEd-E(NX9`>$3bLW%s5=;yu3$amo+()G2VqQG7IC={1#v%f<} zigt_Zf=`Rrl$`%n5~?#>(KeF*T6uX_>SxN$lA!NA#r)Uj9qG*r&~%Rn7`9Gix83iq zl0c);uBF_A!;n57!dcmLUi*TRnUJEA2?C=e@X!AZ*H1k@WHbb^xnIzvn$aee#=Dj& z0GO~jGG+8yXsTY{QM8&gYQYyMZeymu{rw?y@LvSJvNwF#MdLIV3^c#h!3##rT_gjNdvX%RU(5IOaqJ2UdPY}o(H0%y?^y@z}bk5~T3lKQgDWYT~31jQ6 z{t={$d6Q3vp1N%T%e{Yv?DfX2l$6^pNmW?@ywmdfcqDoC#r2&^wRQJPIYu3 z>+kR%TQ;D#!|h;vlf8nf|35wj4a|RAU!pj7r_g~qH1*fH%7QBRjq#Ddt3DlWnX$ND z3z}g)FrqG&lhuDO05tby4wt-A+hgN@t$upu|ARIbWqu(U`IV-MXnukti1zSgJi@#5 zU-VD_uP_>3fTN*zyv=n^Kz&(zvC0iT%5jctE(+j><=@;?O9F)eWKX=|^GB>KE0R&U z{E0p4Iq)2$L?_}L@v&^3_=WBG_a_I@1&m4^TbgzaXU)E8NreRH=i+C8W2BwHS;8o7 zD1RpZtgskDKvM?J1kr_N^&WI_Kc@>^;C}=_Yu-fM=ijlk?EoFXH*IGQZpMtja#3Uq zcW%XNbfQ0Mf=UD7qLdA0aFs((huz?;%(Op#x*CAZub9K zRd)@)E?;rqvb{LzqFtG< z$@FJ3X8!`Y%HKrv72(s_cD7RK5UlzObR#NChi_+J$K7hPUOewlIiz9+9=!GyH)_xB zePQWe_oiJ7XY!(q&xx_2V-dd(LEh8&o2!eTCURrgmn+uoG_@G^szQHTr`{1rKL7&yCF z=is47QczD2mimvNG)7AZCtg;-n#3M)pT_P#sG(%EBJEka^fGG%C@A<5$KPQY9%d+? z7Fbiq?`Fjj6T05?uFpgDJ43@w9e8?PvQJ>g!K@DC z{ksl*+-hbK7ZDO@nMUU$`c;+w?1Qkn%Kokb-{q18kvGzODN7ER;$r)arHIXAX$9=#jqf~Ct}Ak6%P zw|Cc8-gH+ItK?Z0;RIZKB+9~RMcGgMA=XawO^6LFtC}cItyV!msT>*dtV*R3c;u|1 zS#E#1c>zou!7~&y!l;ealcA-6IfT+-`<_w_t$^VMO%Dnm4?NK!26tnr`XF+t%{Ud(pX(l`viT?)5p=S0m$8l; zal!Qyi}kx;;$A!GOYS(lPrd?K#T7)ater18S%L&0*b{zz$otQrqwNI)SPOo!k&9Ja+Q$gqFf3t|Y zSIHZ}Nz^w{_8=bn>AJhUa%72rTDJS@rx+CL6;)DMRQqi*Ufe67vR{MC?w$%Cp}djw zZ&+so4e*xia6V#Wt(v~#>(`7cy z;*(bce2#dO)Pe=bsjk_3!tjO5j%Zz_sA=-gAV({Jf@+9#wA+dv^Ny2i5n0$4cF!$f z--ch&k+WYDw9k^FM5gKRwOE3bVULEX>w!6!s@)gR`G>;Je2_ub2iM54QXyXV$A5IB ztbVxk|Fzucu42AAYm^pHr)5k(k%mnI%`R5Uv!MzWM(Yu0b($>BgTBg#thMD66jt#Z zHL(iP0)O_wz{}Qrd!lx#}14F(8bp$V4fDy z+YU;j{kE^_%?auLrv%AjhJE-dLaeHp=MXi(mAnq4@g~m5yX8Nyfx_7A6C80kIpU~s z_BuQao-3UR&jbUGEb4UN&DFKX&}Hk|K`FB<{X7qtRq7tO7lFkVN8|wU0YhC|(=)%C zZVM0;Qvi6nW}5;tBgmtYwHGvs*3LgV{CFxf`K&~C?YL|5SnR=iRa5ze>dR>9?4ge4 z;5Vj~^Hpjy830d6X7pBZmx|#%O4yyS5WK+z8N86t#~ot-^`CLEvm!ERrxJZa!ZFiM zV*8!o-4gQ0J!`)@`u6K@(oKB1q-J;eiYqhKTg`scUd+Ol8$GOgHat2OLM;j6@m^1?cN!nUM+G8gquWpcSr#vENK*`Xcb=o%2oj!{+tR+Sf+a z#D8%eJY&4@@JOlwv{!E6mf^PvxQn_@dMkjC9Kag3?EvxQp@kj6DD{GhAFnA!FzVg3f;>5NF`WEA1MHEXm$=m ze~wbp8DL1$xI=Lc(+|DZGAr_>(W8+{qZ5&VaI`I!+xwKcbMSj8=Bd7dsu|JHVqLiN z#ybihmn2SC*E#zK-${GFWjpxSrMldZs|OUlEMVVXHP!V=GTy(5QhgrcpHld^r*A}7 z|L(KbJE38>$XCvw+DC~#T4nSs#W~AUj~G?6pNCH$bJj2n;0^dLGj4OJ|5+lv%%npM zD)D;i9HCl~{jh_1;Uj~|>(?60FkL+T`+bzwlf$K_{nxnLXGfP43C<6XJc z1CNJt)-Fk5T1+RxN)UIGWpD?PYC4_>d|mmvt4Ezx`H#x)hLP&5o#U|^FQQX9w+w%w zx=B8O&;=|6pa4Rlw+5TQWeA{`x>ZdHL`I^=ZJZq)C@7W?!d@Y)V78)=PM7B}+%Bm; zZPn;m*@#yzVlold5eo}-Nx+g<4&mC~{N|U;x$2YsN50t*kmncpV@P3RT+1*2Lpp!p z+b%2Oicjxj+k4(hL+pQ`vbSuc3uZ~EqMFb(3rrT$Z8sF8?7(7n!4ySPA5NTe-%z4x z?JhoDxv_g@<5dUj%6+Uz>CvUmg-aWcMRz{c#<6_7_?6=Oi~?|8EA0-yNz8o1x)OkQ zx%NR*DQx>t1TGMHUi6j|q6>7g6LaJ>4{z@DYiMghwquYZk>&>+>&7j9*X!i~f zJeZI^4|$GCnScfR$6yV)J1DN1`IlP+{w8}80(;kjw~sy+7?3Aob0WJDO+YLi-PA2K zeu{2WRf#VN#IfP3M=<%ebTAM;9OX&2NJhs%a;C$8m3AaZg|(6itisJxpk#c?^eRD- zHM1GCyEgA?>eN_2Ol)?R%g z;IG_AIkGvo@-H7^VVMSH|CRQ&UG=82kDcaq0ncnEQ5qpv=<{9&ZoWw)=W#2sObhc_ zH7rCJtM?zFw4hh>Py3s1liL%gxg+&tq!E)O5}tcY46ZmunIpq?f(Z_xcKse5((Y8%Lk-F=h+2tiK5??#D)Vs&J5VElNEja&#&dxff@0@+h84$tQh@9uw! z^1T-(41hb9n-N6E^*on~C?Nr?)RmCBcREbg{L+#^Hr?yB(=iL3XXxu1;0Ut5$!%I> z3UN&{q?TQ^pR3u(TZ%nTqkI*ek_{>+4Sv3MQ@( z{Qh2CJj(eH3rPO3U1{28I;E*poidC{ct}(+Ho3LNWJ=UOYP1v-3E3fZzcx-b9yqkW zD$~?&Ue6u<^5U-IsuYOR`t6iU2dM1JxBznMrIK6&OH#raR07bzEHQPQNl^mh_t$gH zPjzZ3VW<$cR|eirV1SYQdkv0UT?1eQ^}d8^z(*<2N1!O*^N#oG3#o8PfKp6=9?(;w zCk$Uz(CJctwFW*=(D9N*P=K`DgpV{AMl_GY>A3j!WcYdL>68zH$kmcRUwmo`Jj&y& zo%~FjL&pyBwYRy?Rq>1s`f&HN1_ig#a`(L87Aomg;$e}R; zBn^6>Ad($=aDGf@SzVn4&l)vu<_n#SQ%1n{shpXwNj_IEucYBrol(GB-j4{8X^`RS zm9_)e6VA6}`w_x9sk=TBQReNVy^2uY&SVIoar0Sfs-GDyyT}nV4I$FOChZp32v?o^zk#I6ai8U7cM zHc%js1(Z}y7e6$XP$(q;PA>e?N!Z-EzB5no%)8T`I;)A}!1= zg+cbAcQpXIewagyf~aTic=+thwW=8|S5>!a`}_$LNV1z2<_B1q>h5Vtr*WIQ8SN~% zdT}dK08=Tzaud%@g>vT8qO6DbuO*V|f(<~4<>^viQzIqHhCMnH7Jaa0=oXNxleykm zHf`HhsBx_pZ~);?pe1aG`mdGhte}TEF{iA#zr?TkRE&P~o7;te`pym_6CW;xHXpVJ zTy_L5XG9-_zs*I&MdCSU+8Nbwe+y(o)Rtf&9Aqv^!)7?bAE)W|e~qOL2^Yq;QTkn) z00TtTto%_Ok)%CAihOA-{tJX*D=kia@~Sb8EN36T$dO=ZP{@NG1xb)%D}S%76DpkW z0iwWi=xaAGq4H1l3cw)1_Oz=QNO(@I3?w~a<4*PA!#lcsDZAFh$M!Q0gX_iRKp_%qYoLQ zK=VLB|Fx2I5~bKH@iwLhIX{|lI{D>;glA!)JWP9CuW8jXIc+7up1!mZzpFxP#xkhb z>2`N0NbDu5%Afn$oBkh3U;WV3`~H14Mt37QV1#riA~}%m4gpCCNhO6hY?P#=0tx~u zf|PU$j#9t?lT8B5 zKMu)Sy$Z9Dkz3|ES{_dYeFm1V>0I^?{1Rw9n2&?0d7rS0U%Aygf3nuZ`S+Tm3bm7v zYWsL+X#`kD^io(D;71k6;z7G3lrSHDuo~o?x&jLrE{RiNblw8xETZZoq`zjGr=1{(B9mTL3bWv`#H^ItLs7+_9Q`fY3b zs=)@hhZljsZQSrgl(CP84trQ?cxl48N%tBq}NGXDdd80}!2f2aoq%PAmU%>GzFPff~9ha44 z1<#M4tW2zUVhDfdU8+7(>8#(cFFy47V9*|LWEZjWN!fM$E2~8NLDK#w>PO}f5uy2` zKVC|VFTl;}I_%rCjD8Ko`Nv!SXeX{|jjas-gWl}^gUKy$_c^@f!SFmo&sv%M`ZNwb zc*(c=X?OJX1WF3pPUQV7uD)d*RxGFD42}&iUzR{aEAh-V4i@ zj?C0o^XA^l((5JE#57R*!d`tjCZFwE^&4eubeTcDM3I@|S51Hj5Ing`6a(MJ4G_T^ z%L3=Eb&Y!W5Fo>ZkCFHCmf`z<)S5^{Ujlm8k%OX@glHtooiCt97xPiFl9O8>N&pWz zk?a)AWLn|Kpa;YNtZ-z3d}(_)6zO5+vc9pnRL7!pcz6a&b*-plXytE>q;_c%;Zx{5 z<`|-_FTM?Z?~eT?qmIzD!;qzaBciKFtF!T zan7MKWql{3Vp#+=WkdA2lTro+7Bl}H3GMqq!Yv~*Nn?xPa(R#wo2|)2={@n%S+Siy zE4gQL^+8`F^?H4O2~j=XY&WmHqgvN4ccuDCSMU&iU+z<&d~Wto#Y^mEh#>A}KTWuY z19nq_dLhdvR{2p)PwAOqY>2 z?E9@_Dh9wJ3Y2DBf-}|2tVUxNfJ&nG0j7C%R1$n$g^JP;B|(4KdZR&Hg2PI$<*g9T zUipzwszGd_JVzI}-=4~HsWLM?%#yWr*!0Stn`b8ty8bU_fL zhdZu-Fe(CQ^>RC*3Tk(#o0_9t*nHW4_rHS9eUcev;9&vShyg{UjDo;0?U=XuiAC8j zDHc*79}a!?{;f0=0_b2-Q)d3md9@dP zqu2-m-mAE`Vmx*%fwn3nJG&!IDG2!(T~|2ne{gO*-J1{MwuJ7;sb648A~s$}xh!FU zbcvyaJS*{Y?#P}|>ho7*94c_i@*7q~ot}L|xo1*E`2IBdh2z=H4a3a6xvsx6hj)_H zaD@55KP4K`uw_fzSP814%v4Z6ZyP*ecdozASQ33i8MCPtzyIlC)A>>9Lc~Qvz`W%3 zi)A7w7QdVs+ET74vNt{x-e1M01=PNQo?VygC1U8d#4(Zcu-kkX25d8jtkCsv;ZfS{ zgqiVpL8W?>;NZXzsDl6}_AytEeS{GNfbG4hT<_E{&Mges4&o~MhxdP>$Cg9}?g<9L4 z{s;ErKrkfh2Zjq$s+*O;_)H1L8O2W)B742GIy=slq0YhiXYLLq|6Rn;vtnzze7n@)T?*!8J0pN*i6!urZZY(104j$Bv3V<#zz zJ6#UB{q`IplFa3EfCwu`?AljHQJwEOBVb`LPXw zHk233*3ZeJgw{c#$~ONw$jb~$>4De8a9+?^aNZt7CGQ%xea=$P`{z6qMd*(M6TYf5 zf;Zduo$?YB_$UcXh^u{p!~Bf@9W3z|kr8UD6IY`-pk?KmGf}>rPz9a|72m^SKKBl* zuaIc~?YzU_i5{Wu`5gF>0!U{8J}~csY1vrm#snBTkrCSS{0-o;>H{AC=u=1pepvz0 z>Ig8pfEnEZp~2frp(h|cd*B;@fm;6H5^XvEaWwirR9g}yKxAgk>M}8+FhHSVzUpNf z`Ps4o(U44*O;AL<|De;EmvJJJ{rL5>u=@yioi=iat<{9@ZO zu>t)W<ScuD-;>4_6RO#$wF#AmUm7>WQE{I&ZC$X8Qig<9e3EfJG!->npB-oH@wK`{CH|Dt*17*tY6MQjgyGNobYa zit&K&#Zw$XC9gY-d`o|`sZkmyzz;x%J(KY#JU+{}3bq~XyTw}xTV8q6u(`%>3 z&tgUiVNjJ66nN36711$9Db23v;^QM%v zW$4l3Tyrki%6}NhKCI3Rocm9&sfFLqfaG~>VKp<)~5Ha!Uz3QeMXF2NS)h1VJ=@p>C&YYh%5d%{Z^;$)A;g z5+8^3Q_H!y8OwfuaN1+-{-l>k74?wV{zw`O_{4j!{mdldI7Qdx!f>=dZ)3mjlfT1C z|C;WL?qZ!?Cn^yp#REJJN3*}Ik3&UoHSDzBXS(JiNqukG)y_b~-f5 z_U{Z(G9McL7D)Q>|E#)xZoRMhZw8gNr01R-Uk5@+A5rKzL3=BK&x@H9D!CkEwG?K< zvhS%**XCl|7RN2Vwfo)B~ z@vc#!N`8ZbK6M63wa@?5zZ0WXSnH%r`IP+Bh(<4wwmC0Y1N~Z{S(1vBE3VD(iLurt zqt)TEgb=8A`HmRA_gwGqs1|P2>W@0}A9|a!QIm6@E}y_Nln1zMGN7h+e!C-3di?|X z^i9ywXkgNS`Z9FKyV;p7JBGHaxIFgOL#JZ@gqs~~cG{8v0!Xk1X=~0(guseF5hr~7 zIUqUdj(RnLJPNc9@`}qjBT!GGigA2um-}<_>EKQVZah@u3iEDS&;bxwGU5g_wLo)K+vz9r7W zZUn#~Z+Z>Pj+gyDmP>z#G7&UpJ1LAngUZ)0!l{XCwn6<- zyATE4vsrXPUJBj+cZ`v%#j!ta?zN;LvjRl#lF zV%sBP8f$pr1s<7Cfa37<&j7kX&^8vP7d%)=?2$0GUU@!7$7=LfQGOD1sxy^82Q8tu5rE4 zdq`0t(jrk`b(`sECqVn*1s$wf!fG6pr_pIQc8~z z96>A(A+fR4RPWMmC5N2WLW9%!nL8o+Bl z@G&ghOPgn@Y5&B}K6UdTl*CPN2_;w?u_!#iHjSJ~o!R82n0M-^Cuv}AJBv6fC0X9- zZvT6{*@R2Re^OEN(S${_#SPKk5izcD8H$ZQpWT5^Z1w!@l$d$C-0Kwj!U&k@)k4z< zL;ddjPkBXo!RGja0X<)+En6ywAoF{s2s?kt)Kw&gFFLP~`!$-3x-Z5I(E}(%z{+}E zrt|PG#RRG0n1olDe+yMtH~u6%GClqG<|JhooB%OTv+)dnmTg4)sOGZ{#>Gr1?Vh66 z7L9niV#~l5tD8Bfn_cl`F+TvypxtFED)8IQUgg>9^6jgp6exmi z%wL8(WMcg z#RylF%1VPs9lx8U!+zDbj^K&ZA>96_vaUE;{`m~NXflSuX}%dIP4jh>Sldc(jEnFQ zc>ZD{dxw!ZeCS4dw3J&q=IR1FhViCk-`-)_lY zvD;ER-~1*mJ$x1zcr}G;_Eb_=?VrJv92^t62g?^Ny)5%@H2g%}wK-weMsvCs8P#|U zoljB%FTKOy8t*G!#Tr+?Zy2OM`v({O;l2^=?%}g^&jY+g0jN-94T*n)aM%pW0R@0e z>=wYSeZ;d%#H-Mk$D|OfOwO^SU>8jis1lb+VAdhwrO%*x=8{*|sVE?*sk0mFJd_b8!TV$cxMKNOk`(a0j`*eiIDO*m30XI#b3 z`Z=kuFFBGt2OP0^!2TY+xX$1$70;7=T5jP@%(SUnj+Z|{oiL_n^@VA`rhQ3m!pIYOD z5dsw`dQ-R(89p29P2F1Qoc*CI*-Gus-bOtWi}Gc6qwlo^q8P9AjE;iq&z{-EeU>!?6eKm6kC#c2F<3`q)Zj$5$i`>!*x^AM50 z(mo}_VmNK4k0^);VXw~sf)c+zCe4$go=sp$Koaur?_{4Bx<-Fuox*l94Xd{R62mJ* zf$#rr4q|MC@o#*-9mq%Y{?jfLa#Rs?PYKK3`3P`+RbUsC<-fupXzGnBx=UF@oTH*0VjXCno9Gtc3}u_7ku@@9fv8md zrZx;1hPW^j8&!9AY7KZk?1$U8v{Wsf*xdm8oykQ&0Z!OYl-8poq42DAlN*gTfDYl6 zQevSVeQ%}j>)XFoIY0_aC)Rq`VTXJxUgY{8K0Z88z)Pi1B6R39st*jkq^LKHU-CBl ziZmb*2Xor>yOa4VqB(?pyLaF()#$@N6(vT;(;-CLF&+%MGn^NhE%pUjb%;2-9Mk{w@DhcG%uh5~1tZ=CU5mhT|B^CIk^>z41kC{lU6^mlLV$g^QBs>8= z_DT`nNh%;hZ#L#)D+yyXiOtYK%um|aSBWuCO|PuAJxl6<(NSRE0D)XHPtO(;cQQ5~ z&1B5zz^9SH*O)2vxEUJsS*XfPpx1FLBhc$pS7}0`*>GGV?I$&LxI&xqZYiw61lII}Zqp?e^_C#R~kUVCh$b-djr9A?VOC zJ#81YWXZrr=uzTGSF$J|S09-nWdX$h9x0?WRv9>5_4@EuD$Ui@pNts@Tk#6_suhKn zHHD%5zf)$7I6$iqnn+gb!|?(JxLdB-1dPS(K4o&5G|@GmD#0`Vw-S#c&mrt-ou|RlP_L1fl}Dpu1W&uz0dOxwQUnLR zKuKDEmH@@cIcD3DR6tn+$^&1q1imBru6g485*LWxI(XPwLl6mf#$(>4ZDYJaj9MQ7 zWjt_>`7ore(F`5~J>CK1nGC?D?hN6x7~y}w`|HG9`~}mIG!Hnq2ln|N;*8vHoJYyZ zO}LNatOBi{%l`7COd+E6iM4q*XA+i(-c+ooJ@9ha<7Dsh>~2$chB0|oD)2HZ9%z$p z5i1pu*I#+Pt)7Eok9(^6mJ(tU+B{kr4S?axB`5OOvHs`%4lc`6#`zK{j%S;`GL52J z5^l+t;g}R+vH+Ye&^JX&5BIanfIziUtEj z&2I&b=jaB7nzTYy7B|qpgT-PW~sO*8Y zo#l9xFZ~CejKndfLp}^DfnyqU9 z&&dm-Vx+}B`Fkm~3ww-bxQ$m2-IISV!hkO&Qgiv^kuJsA6N$B5^VxN4EJc%UiVAjpm?x6MZ~--mUN%e)&7(^s>d-Cp@0D1 z!yxG5x2Kus|CQ_&C-6U(uioZ3%+EsUbH%<{VhQ$10rYhe#ba|(+fkl^P)5CkuZK7H zgHAktnddMD6e}=hg#7JZ*F!ul{TS72q<@6UUu9&(Nd{DRPP*GFMDBI^+HoZsw~^MV zXPg%euy8i~W*Pu&>C1f+jGsO9o_&arR;g4Ev9~7omH0Z@-ulrL94S6hrmc8F%*;Cf zDscX-?C1X^%DAs4h0dtouM4A1)}p+E^sra235sYm!10Y}Dw`yUjF8KaMA|d~kFinvL_wU!pAe-z` zU81^xkqVI!yGYwnUxgsG$z!r`b?8U`jVJ%eWjK=yXy)BC<8P-Fi~A6V*RVp0ER`VX z67aRG{8~l(EFT+h_!`S4`el5VDNOG~S zu>po0@d*%CuNLe}`qgx=4w_o%hrxS}XIX$*yl*X%Ksnj$X)uK1{NPhhJAG=vSV`j$ zk5GT^aQQ9g_Sam^GQPI9yob%XfZ5BT);9jv%Qkrw%30X`fxSh)-KCDqWo74?lz~@b zU^gS+ZSYm95oDj6WdR;R7+Q%Q$xu3bd`tQ{MmPs#$(YV=&fO@{1IZx#JD3zwuwe=0 zX717-23;pnsw%nVv~ytPrF07cl;r3At8-*J2`cwTg8hSpP-{HKgatt0!E7i%jQ1#q zB~SuHqlUXl9f5is)u1f^5WSG1fa7c;5cEz9;Hb>po}4kt*KV1RWN@DfmQDuPwKJ82 zAwfsdLWd`8);AK*!}3Ei5qk~;lX_J#%)-PtCA5LLZ-(_VN6my%DRKLi*Tr4};JH$? z)rr;(`xbC7`~mx_FW4ngl9(4lzR(sS^&1GGqJeYx_vKXesV`u!C!>;4q?%K`oBL7K6)JI#e~ra z0_?-b!-rFyG+%A2{yjYF@SD??`siu!u5p>cYgzp{Y&VkmlXEmD_gD4$pCMrz`}n+q z7fvl@Im&NkC#m8abFp8B-B-Hb>c-FxfVubPn0Y6icMARHbRnW!K_N&&r7H}yE(|Y#C41%m$t@JXCE(rq!b&8DDVAuaWq9^+J zH2^r%;AL(0Iyt4$bw24YT6CVyCUorNRm44CX$R+6MAFSlk<4%^7mU_vuN5_Nv9o?g z5%v3F{7U@myg2*~rb9pe1gB&e4?zHN;Kkt(AzaaG|Amt*aGYc}P%QCjD2Yp`wQ%#t z<4zI$R@%944tURsh}rDro4ot&Q3-0{7|%QAl1fDSmhSdK&}Ar7T1w!B9&X&#_U53; z0G$As%%gYNw&oSi6{~rr2b3=18`oXvF%;Rm@^73|eJMYD9)a5_-peMLyMDiCMMmv`iTE(%8{VLP!rb7)|G0x+Yh4i1FJGzq9o`Lo+0}~79kn9aa=C)#`xv~P zXGw{aur@ZSu9$V_VxYCh4C>h4wNx~-6F0np&3dDeCRh0BrbjL(_onaL*a_cJyV%_3 z{Gs)#CeK`TaOG@J{sM#siT5mW21)E|H(yZogKuKy=MP@6v(s^CJxc>-=wyDb$WT0o zkSu#Z;OT-uw-L% zVVuuUjKy<|1!L$l_te3=p}a1We50ASxENSj0!!^C?Mymd=bc9D>4ykQk$D3c_B$8C z^&T<1qsw=qP7H^5AIwV&)VXPw*dAXW=5s>c(=f~7Lwxj&Tfd(QJbsb+F)H!y8p#B2 zrt4!p!r4=$$RTxMLLm1xLi!;DxC5O1DS*}oKBEBsjZY_sfm;usIluVwmp+2(Kr`{F zU+s}7o-i-k<*`E{ZHhlL+X1(~u5W|6U6;%Kgi%toGL_`I4*X*JYe(}@N!4Y^jZ@R- zxaDy|$?MBZDWd$H;Scx~1{i}FO#-Vf&_s~_ya2phEeQf7*1JLK|0o&Z)*!JiS&kam zJtznv>U8%%=~Q&Q%JD1F7J|-X7MDfMe$jc{?FnG8JGrmDhmxIT*f-4w70)pzLgEXvoEJ zzukI2EpRhxmgAd_?WY@ad4f;F*A3TRC9719_?NG%Lw9}&-=YG-LMjQEsjRidrMow6 zq&kyvS52cCx<@D=h`eWEwIQT01~k<J>3(kP1LXX3vPd1!O50l5ghtA?7C{GuIu` zp|D0wco_Mtf~rxgX=c{6m#F}slS&~K&^}28Jp1jeqO58`3F)H^DxM;hN$g}=Dr7Yd zgY*RJFeN>=Mf^?bG@THLrBF3wqD(OB$^Dh96=ww1;3J`Gc+_>@ir-#Y0ND`ZL2Q;g zn+waTq}7;wfNuKJ_EcQxSqlJ*SgD`Qe=!3iHJ_$M}%4#Q>!_lTD0> z6tinY-I3ORH5u-8INugs_6yxzG6AV7FxmKy)5OwpH2~CYgwF7NM31fMsUrx@N6ugF z5UlJ-z-5RBYDCzyRF(EvcJxQnvG^Gj485HBbfur98&z=ka0t2O? zNAw9q`2a2QsNoWI2VzLT2y35!kBs-#b1sDbYIroHxn>8${m66f7cU?nNITFrc^e}D ztc#`)hb!qnVJP~goS&v82MgKL31NDJ5%)~lh^{rai?j_NHFE=%nxwM+QL5e8HZi(Wri z;KQ7d$yExJ4bmRlH2LwSTuGHbdWjfP7rgwjz(4-G0r+mg-1lQ_H8%JgZT?3i)ge$( zmsbR&3H_i_Ih$)bjCxBw^)^U-=F874^@9m-X-O4JGWIN8+a)C3e-|4MpP!LOa9}z2 zzNQS4w2sO-fd0p?D=gQx5OgJgY=Pb|IX z6q$>weDM8mVR%+%>YI-dQM@=dI@Opbd8*;;QOrWS|l9SrAKZ0L?PV zZql(A-|1?9M>D$~!Iy&5kG*uJUwk3u#i`o>PrtZWV_g;@`#+X@wN=~B-*%7m2p@I% zRM+`RsF`BS@q?02AlnU~J9WPl{IL2P&%~Um`2)l4v%z}I$(>go>s;p0A7^8&evjneSoNZ+7;5*jYigBnr8ly`nS3LV$Fb^W@ zyvm8}+*KE$_9yW&m~@TKlhygdRold)|Stj8e;U<)UHaB5&~%d zXP$jB7sGvWcTw`*JPiI|tL5DPRv-9*=BlQ_bJpVlO#zCNa?YgmHu+#BfVS~cBv`Gx zXi<>xyr71gB=TPMo6nvm-eYt*P2g8Sv=IW`8$ zb`)&?$5|xTV#IcVLF496a#Bw7rYReOv+kdC^%67+Bu~`!kI)$`u1OS^Mc>UFsNcbV)eRbpVWs^EQ2+!>Py zC<@)3k|kq3n>`hy&q66T;qx1}F`Y-5f51ZV#b@X8h#JtLx~usTbFFpf@$Y5B=K&A! zD2+;j^5c``;XW`3$JYif+owMV9Ut*9_}37YX%axT5E9@5qc%_lZm**>2n}1P7rt-? zFjw@#*+n@!9t=>GYn>O_fQUFE;e5dk%JNUc>kg-KNjH$6nE%W~Er@0&-w9el8+g*q| z4n!$$Ut70zj@Bj|4U4R|_&W@_w=E$@e0_xvOD#uz@$658zC=&$yZVa$Ri4uQi#{eD zQ6^@}{z%7tymk?&1L?W%iTXI(I(z?3eoHAyk8Ae!Vpw~vbt>J6;p3WZ9?B!Wd>#vj zAxUEidVR~(_3^j-y3)|%`0xIl#tN#(>xW1}_+LAW!qT?l$jYpd*H}y z668FQDyu*H7uNW$DaCDmg6(KixI$_zRA=#ZLgef4xhLpw8#{K@wX@?*dFmxgi&?IwL|n}7{}VMHod0A%^PbTSDR3@Di9`MC ze9L5wQdK?Cg>uZDS=<%`+b5ZU5KU(0>WA)we9@P+8_&RgGJPohE~E+>40 z;37xk*fw$HCP~3!zF|A{Hra!ZFj-7E=G71*s&jOA;!1~0M!%e= z-t*-vaqPLOCw<0-xQ~ImB84SUsS8m*SUo-$*{|pSSR4AcavxEi ziE}>z7u%Pom5j*s*(>eO#72uQiO))knUxFh>%b zi$n%dW3px5zJY5h4ryH;F=ZKkk$?ZVE0wQYen|U}df~sX75TV(Me787I)!cuwrJQ% zpj-OOv@tGycV(u9e6Kll2yRYB!vRIUA%*`gJ(ZZNPRtWOAM-wHk2ils*>MA2(PMJ; z_$rhM%>=X4zIso*aBc(0`i8lT=(E7l7h0`?7bU;+TEi4_^SuU!$hSt_RB;bhF-Yr4 z+uSQsFV81)j6I3yG8-TSQWP!cPlB|C{(zWu09sr?C?rAry1jBa4Di1h67+^Mb>`() zx>xIRzi0EZ)|Id$@wdLPLLfQAm#(~UHMv=Jsi)NZ!`WF>_f?1f^}2ZZC)@laZB0i9 zcYi?qaNmY+`%pyDA4I>|t&qLzed_;YEq-$Ql{N38O*jj{VUY}o@gpCS1VQT*p^?du z>*ziR=|@$vjn_^DZccB{Pat-xFu5cufCIUTpN zItjiLJF24q1aQ(%iKV4PNQD9D#GVbu_&Q&L`e}ZAjJ>524?r&gAZO?8V{-=5Us?`8 z*VM#%NnpcWLw@=CKV-t^i{Bk##1)}ufvLk{Vc&%gFd=B?M9<7{k!Jt^8qn9$u-aFV zONeSkXvu6#nl9usUf}zd*3HCSfv+c`%?8NfNQz!XW6PC-e zk=Gj*mKw1)K6I(-%n^X|8jaaXiG;a>KY3^Uj*kc9xBjaVRK zp{@-7e+YlR0oZJK16mD9GV6FXzvZc``yBK$Lx$Fm)NP780JH`=+u*KtMJ`Z2l^q`I zI35!PUywE>Ia068@O$w~ixiFbGI53Rq;$SNC01tydCDC+&rmmOqVK}Y9Dy2IG#R9r z)4BtAY2}J;nYgS?hpBuSQfJcmNiB)?2p%2UEh70C3tK4)ML0^6K(?K%DBi&bugkRV z_fVa5@|$diV0+-VoHFxM%lMwGJ)L}PRAE~+=?FyJPcX#*rA&|s69Do1&jQeHOaY

;1$ipfu-KDX1|xs7qM0>g=K+;k&M7Wr{Tiw>qM~gip-R+^w$V%2rm9WZT!z+;WD03AFW1fj-6FW_c_x#C(baqw*Kxr96$Hb7}D za8H>hzB~){lMTJL^`DLSNOR`bR?H4tdc9H_V4?cho4>=wA|1Dxy3u?@m^M}W0~)Aj z&D*y6!EZ@B>y13%HT6sv6_Ky{roS~NAjeuf$^tN<2A&-;_(-1q`};(L-Kgg$PZ$kn z{D3nB&;T%eD@`lrlYf$D$yln+4G641dgPOp0|twH7QIjpchid8T~bCpn!NCm_7@L| zd3Am8ZOfSPoFU$0^S$f(^wtkS=><&c?qbU;+`hTWm&0)k{^>%@#V=ElydiLE$1d(n z#s*yWrN6!T1vkRC^4O@Bm~xqX*kkB-cylNhLh=O2Vq%07P6E!t?GH5t=VwR z>4LuBW}4jGcSs}P?XFRu!3XG%rq&sD$IJ7NS zC;+I?BVYSDJWuLUv9L+RL#oDYL2Y71b$`S*XtoLTY^#%js%m!Dc4&KfO#Xr>6Usf z2|1ldqA20S6or_d`XC(c*!rw!dXC0dn!T3A-9gj$b&?T}%>eQG7Z4*0`GrY)4`kT` z!8ra+dCBDADQ3a{JlqPG3AL?g+@3yUIUJ2E0nVq=SK>jh%Y$CLFaYZ=(f=Zc4r?yqR`G`ghY7ZZN~|{T67_vCW|t`8;Ip^+Pyw zIY$0ss{*C|AQ{9E4zE969hs*qQtCXyG^lwzANz{&LsfV8D2T8H;W&b&RyAbz;!=Ph zDZ{;>jI+T*S(l!khXR00!I&K!bT1P2Df*_RuJwTX;@B;^09IetUP1~q8@#0k;(;|k zCgAS&&%5AevreOsLaJXzCV%1lV76o~*U*x@aCs$>z?L4n*(UO5|K&7uWdcx30iOe8 z$gxJeu!yQETI{;;(fkPIjR7-Ck^ytyL52%dt&U07YYAI0JH*YJb)WBWTkj(IlT8R; zjX5o(WH&vG;u!P$#9)s!x?r~scDFl7QIJ!|#33iK6Y?nOz{t#yNU93{@_ zc@3?=eUc-TFOf7sY*|3Ck?^5gWJg1LpB01wmlNk1A_75dF(ZzEo(Yuf>Au{{^%9PK z5hlF$J6>_z1ZycHV8+r8BYfg$O z$ul(RuC8vVH6}gfeFf3$*}9P~kZ)9?7jQR1tz+%z{yKrHPLQi4GJSWsg=>8+ zd|9Xj_cwf!y4tt(ddF^B&71{vIdp^tm7F?waJidPwz3Q|6t3 zmN46uo^D4;b1xgE^qbllLt%Q!(u9&6g6rq?XWNhDd?#e&n!-4Ir1OX&fUTNm>LT>w zj-;b4ZVw**JewzJEz!BZQ_5Cyv*Je}&)BRLK6m7>|C8Y`%I6UL{+?IBnEYP_aDY1= zHDovOC#F@k-gkP2TmE#;gj>#319zKV1}oiN(ia&T&`ducG{aFVdVeJA=uI!a24a6bH4U z9oAVU+duY=P1IPlqjDq-5#~Tkl#Xn@T}P!0I&;$Y(C0ib{L3&C^UfAfeA{DkdUl3D zcNS})_l;^rl-*i9+#_JKEPTeK=)G4@*B6^iP1t~E+ZZ@_%yF@Apn+q@H;Pzkq6MJu z??PDEdmgKh14Ms21H4t_dun+A304r|Q*tJYBs@=Thikrw1nG0SsE$f%uT)q>`XZk` zzycTlY#MfX^gV5}^) zWB##yKRE+HXL8hj&FL7n-*$!LHBj%HV0wq}lax3!TY4<`o}g_ zL|84;7TlL^$eoY7SocI_Sl}@lBku;lQ-NwXqDUPiElXzgr?zt*u;FA_K6@Q(d&w_)Vz ztv17*k_Z|w{Fiv4g7FK>TSv?%oXxD@uQey*@6J_!xGQD!451 z{1pfJKV;)Dk%Dj4y~xw&nV>1B|7iZp73v1-RaHJV}aqW1=+n#-*W#eb=LpUkfb zLqu-_{q_vl^@r<|cC@o&X8H=P>F~lgEgqITc1M@rIT#M@)3d6p!M;n=|2dL48o>LJ zt0e{$38AND2@#zr~qi@zpTDRSsE^IN=8Fl3ByK1YZ$zEU**oZ6IEv$~NqXYlitR_Ayc zWbv)MixoI?e6?u)+S1H?#1+0qLClq+2{sR>$VCIuD&I<5BhBbppucFiaGf_k`u-b-p1250VflZqy38pD*9+T?cx;{e<)kgQ|w=47gO^-4CbJ<7ADH9i>Ey^a$)8pKU%ELS<+Y@_nknZ`j+Srzq=5Ni9QnV9^Qimmzo~mgCi=M zTy8R=9k$828rFKMGj|RjgOTWV<<8DCgf`YWy?b**+$p9Whh?EuuqSBFgMN?X}Nu>AL;z)=acUH)(2A zEk%LM6uGvNkQvWZ!`z5`)AM_KWv>GqT7CTP>>ZL%7AIZJedZ<7T1DcNUYUYWMxZC{ zbZVsEeSK?T45i4Ers}upB0jWtF5a;-f=S|y{!Qxu)!IxV0=J0*!dK^GQ&TQRni}jE z(8LgpQN9w%ak*4^GX0~Bd2moc~p-k0$#i@ zLHGF~7;}%K(R1PH5p7|e8+@6hSN`QE&nZnk!CC0>n#v4c4&U$ybcrINI^6m$>$hq$ z%P`Dj_SCw;mWRS>+K9u?ukIh+D!3^|^j)=)3bJul=pbw#ldPSvLi-qka{~=ien2Yy zmO0})ZM19=Stbb%(X20S!U__j>Y|zOJ~Y^b$&^e)w2!7Yz!Lrv%p`2Ir%~5 zZrW4Q4fGBfiA$MakT6!T7P9!=6%24fmV>aY!X6x)1%gVxl-HYe;E+W)l;gt`@g~?U zXWH->LnVH;%HDAlZkoeE#*^!4%Gn#7>42`}f7jrT++m%|uf|)AL1xu&?bPU}&Q={vVS_>h3A7ks(ypJJC9IzHdV5}u(ZW*;0PG9rCgY$PXiA|m3As6fX zs2!2I)t2@HRnNzDZX_RBU*tw)C>=VKfd^%>uhlP@eK^MtxG#&p%fAPk1~z5igR@dp z?u$46yh)qt*3#by>&)HF(dwC3IRQ-$y}BRAoHxMF?U01cHu;;hcjqAXNuyR}t>=|~ z-{9W++Gj#P^97$a&Aq6Wt8-J^Pbo;YS&FOtF10j>@?K(SNGtBb<*1QBddYDb?tI+^ zPQWZ`D8hl!n4J2Dg+W&aMph5*NG!EK{G@9&V6NVrt82X^#fF1^o@qyg@e6Fcy@W22 zM=cYGmma4%WPZKIf1bYm;k*&u=5>{y_BGT(_Ly1e(nx}}(T)wm@_}Yl&qpjMp0_^9 zIMY#N$lsR)E(ua_&oid-)QqyR1vMxZK}yHnBu&7Mxs&Fp487?q)WHTsu}R%8BffK+ z*iCC?b!AUI-#+=?z~%kMf-c|5UA1n)g)A4-irp$szDv7nwTmy!n>_52+{4&gsmV&j zJ`XX;%q9(gG`gBm2&SE0!nzt%j{w+|neyv<5Xr&aoH2X=4apy+adnUyGbbE;r4;Fn z$g1r@IE%PI!n8`1!u6OP(>>U{2F9$kEt5~cG{poYg_Qlvs<}p@DaZEy`1h#8g@Kj z{Kp;Rww1dUe_wK2a`M;q& z#J;vlB+?CCjJgD&?XJL}$EIVd*wj}J=5BJ0HT?mm$|2WP$0O69#iyMgXO@c zS)Nf!QAuG!%if6xFH1|gEGQF#`6Oli>upN+X%)MJ#rJ9O?t)rz#I4$xi|EMh@8iWj z8h5_kS-LUi@>FfRnv}~w+L-T4VQ`8*R?N}+C3%iKV|v)(HOcbRN|C@5?+k8~%hep5 zsNhUg00oi+>sFvL=fI8xv(TUR!l7p_4AE zC+h{ja zC{dxUPZ5k>Wtk-OP-QjsT1HWe|2d6BPuVpo(2n(?C>Y-Zrt?w%QQcA5+ zDcuwY&cWpUEE|E)^3>^9FOe@NwOf|k^}!Kr;5RUHpnLqczhAzc%nck9rwtZ{>+?@6 z!h&lA3jQ!(kG|@K4N}Pq+S;P=`$z?JVlQd#73_xGjx2m!|Al?68FrZxa@F1MCuWm| zCdLjwO9V!ivB*KvI)+`YItX|?VrcSspy_Z5eC61_K9J|Zbbc+_w`bD@dE4!r>lhpi z278@Ha{$?(FV0XnG;+|9%7{QP$IXLTxQE6GSktGJ;`*KS=iI=Vd;0I;`15X7 ziO2!697g6(jaoXZU!AgyrJMt(i2he1F4dL*yV64j812ZG)vkU4OEg`^i# zB^0-2pQ#dN?PAEpOd46$YJ6kV5l zUInU&vQq3DmDy~L>GJ>WVHyKLGm2pgn3eQDDM_-cQ~z-)PTm-M^!>&Yv5LoGYxh#t zt_O^THsAk@_UlVeA8;2aI)7xLZTP~|3Y3SF+PiXrQAuMxO`ZKH)Ao-|$|YZC3of_d zOg|iGbgBYDr@3oK3gELxh9=(!qG8wWK zvaC~g%DC~LRKmvE(;>#tB@i#<0#{x%Z?R1!VsE)PZDD7 zE7FAG@C7k!Vy5`sXK~ubFC*(>;L0&&1VI1ESeP9$8p)Isec}G+PgG=COo0@tZFuCH zwTuwvSDyoehkiyX+-@wW3>>4UkU~;w8XUphPXE`o4cOplWR+ z4ve04_;?NM>bv2w4#Vcs;A{sDibH(6d5V>XUFxKQM6K63ma3F(0Qa=0No-W=EePwN)#ltu4#!p2l z3flYDrWRYCK+3?6Yc^ZnhbW2fAJ7smAPLyG@Qa%}0^|T&^)U!OkbimMu(NfWa|4EYCys4w3PFEAzLS&lvAN)zZOd?#iS;6^DV6 z5D_aBQhl<{Y#-Vr<=+3H?^;bL`aW%DVWu)6s_}#1k0M`*fjRz0fE|g+E|k`9mn_9B9E=e4Zi=lX8+ha zy4#e>eSk`Kbfuf_k@Mf_#o)nUha@x}K2NS>1je;Z6_hX(H%S!f3&iEva4IJOt}hV< zHv}GaG|6frG7A(W5M26+LHeh^XhaG(#dZ=VtH;ujd)e}U=dtLcd=Ism)A42U2$*i%S~tJiV~K|+oP#2b;C`jRt=wDy;I}4d;VS54aW+X3%bQ`emwB)SqVSEy|kW>@xc3hJXW+$DwEym z;J=l7$Wxzt#nmu&c3Cpl=3IK8HcR zzezLs|EDx+K!-_zN*)dP4==U-)! zS7k~CXv%|KNowA~eZCj+co+J;CU89+W1uVVWZ8~Aa85rCY|P%XS=bh6p}>;iN$}gU z3uShgW4d0hD1p*+WByS)RmJY-Lu)wCOr*NNinxxlI0B zl*Gb{f*jz?e)u#XE)8A=hpbOQLBo{A5&)*YbBqzkaNgBjLKVSZ{I?C+0{S`H* zsnq0|DL+FKPo>QxBI!^(^;_re)>~T^;KD;V2@3v&{F%dKx20_|=IW?}@Y7A76e;wb z8ZLDKQ6|1)gkPGcO~E}zWp`0JNv7|SSnu)0b;sQsBZ1!qB1HDFL+?JuXcvCl#f&`R z+jLpj_)9}CtX)~oF+sT2jdN*7MOR#0dXGVgH%YJ#o92uhgmR-l>xEbU7#fw8YyJTpx|f zx1^3Svnl0&SlN!jX}gePyw|Tedv|c{^{3#*;I)^G;V=)LP(SQKKJwaFNB6+ul`6ua zucEzgnX3De!BF4Ii#FRq$+yR=AT>jQ&|IP-qxo+d8t7P{1&pzjkmNU~^*9UL{*Rda zo>F;(N2b9uhwT$jD6M$%*>Kb3hsR zW3(OmnN-8iO0jdBqJPB2t{9tM(4cv?EZc6<*Urp|q}u*54AEI%)cfR4l4<+1do>5e z>!HVq$RQk+u+vM-x>W_kmKf2&#I?n%hrB+1&mV!B+n6RDdp**sl)h>kM>fr!NI1WW zNc4pflT!yGwtT@dZTAndu~D)+7lH?wu<-^d&kUBBcf>-^r;kq9d3p_!D2oTccF4KM z)_)aiGxkvS;6T+8X5!%x;0dO!;{9n;*CNr75GqWAd)ebEYWk%Nicn#?OXAuivw(p+ ztS1P)rk${CIf^R92ZHnpBDnX+Y4UJLeRMl;{^c!jOKHX0m?2nP1$!)XNbkFrNz(Ou z5U>Z)Nb<=Ddc%kqc@|OB83crWC&}#*2%8rVo@!$rE0)vtL4=s2J|B2K+X|I!D4;-e zoXR1!8XFlGeDiBxU9$#`=67hzYF0F7Nm+YD^Fd={!)(U|jcfNi-v^m(S{-C#0376( zRcsHmy^r5julKtnh0dMY|KQEVQ}@aZNaZylGbVmh@1snMn_$nNKR;56L&l`<)4I8= z(|--6J-B#RSngv=lP$JwzgMSGyOKs@S-g__9~o_dS<2OhS4z|dCEnMD?0f6Dk^09_ z;^vk5Cp5*6R_k zoWjnw-t+A_BLA!YlW^|P_qzs}corI*f*F0@CXqT*1ntFfl2e`-emUk<+>;EnpGqB? zZFxhR{S?s+p)hp#so09@s$o|EnrczD{L~>pME!X!*9-_$ym29Kz2~Lq?cS>>&w%2G zuSzyE1NMDB7;U1f&kyVafZ01gAwnGrIg(kRXQPvE6A`HAeoZ6`&mp!A5n`VV_<}MU zWGcvEBDw)7_GOm0peF~By#JQ?yO(!{`+ASNRfl0cEaCSDPUS0s=PovFT~ED2rIN}2 z?N4l6cUi4q=w?~zi|DUB(t>8=fx#(Ks-~qww&2M<`p+xGtBQk-Q;%Q7v>CG?Fc7r0 zA&d;tN2DadLbE17RtsjrRl6P^abR+f?CwApL{q9`^QZ;{_y%sR1O&+o0#)p?0fENV zyk?IFH%eW=m4oI2p!_=$Fb!0H` zEkrqWPsETYk@!Ao^So)#r$w#jlJKhv-7j#0Z_G7E>4MSA4_po$;tR_YsAzcNaOnd% z>Y_5=NYPL_Uh#wcmqYAPKEaK&vZSA{2iy-?hHh`r9g# z9Eog#QqJhXZ#ACLHJ69WXI7mjt`D-!EjZ^LXN;R)D5-62YbQ|-#$&Eeu6h>El)2J3 zmp&QQ<)4VHi~f#&Ec>JOrYC$mCu--y-S@Q5mBaQTSxVk5?rYmGhV@YO=SGkG_u;Zw zyfoj64u`viab~A&VtxFKS1Qw@yfH0Rq7B^@XlG&gSl~lkK1eV;eCfz%SCbP0n6h=x8;4l}$fMt!%zk^oB#PNxPL_05GNQa%<4a~5mnf>;7vs~?8#2`!UGQ#;A4HX8X%0`~=)4jeGO_82! z39)App%3;|IymGxW|FRb)EWOkiU}hZ{WBgWT=l}-Vw%3(7UI)c$q*@dq-=lK&cZlt z9zL+~+t4t)Sndq)JPM$Uq+XJ%>W)M^{GS5Xs7*%;JbjG~HNErn)G8r;`)xE$5lw_x z!B+E6t`8xRmFkkfhNs~EQ4oZte2$3&K~d?t0DVyhH|>NZ;Ybk?e2NABGrC8fcqqzv z{+EtqKK%mDX4T*k3-ke6XV98=yKf>TS)v7g6S~fj&mjF3E`auQM!n||18{D{k3<2( z&10_oJV;ZjCLqETTKMLT%S()x!G}y0jWF#D!H}_7%_sZQV`w3$f^0lE7kFgnxvM!t z=?e~$;T4zXY`tz0ZJHyrYPM)h3`J^L4XBIXerug9c(Z8eX?$Pn)t_xv#bho2@YR!Z zUv^L1MwF-|(F!}!5woKVZ!}R4ixuTL{|qFn^JFX$)Q&t^e|t&zg!3tFZC?dLHa!%7 z2bZ?5@A(vetK;?!NJNnjhtA0t+HsPkWB6RbaFgv92tAg12S5_`-foTeX=%Z~Y;}3_ zmJE?9*rCA-=yaWru46&kw5 zF^XfjvCH8;Z&xd7OzmaT?}{eAuY+IxnXNR-C{0J~Zdb@`tB4UUjT6fF!a!VY+q|4W zoTz+8E-adT?CZp7M$>NXZ}_RmV^B=At1qq>{0#f*hE) zs8rN|H{JRSeXE*4>4*}71vgzM{aCZfQvi!6FU7HNXWmU$!X%`g{D88(jCz%?N8J4u zZd*Mrqk$F%R*(SkI8e1Xmn8zZ|5fV^;dR5ANoAbX-(`B_1lSh(^1fTV^k@=IO`e4=w#1bt!o-N5cHaFKWSM8nEZTN}@_R)K zDJVP$)lnF|Esc;2T@Qud`HM~;aQdsV!KC={`^_|tjdknz2Y4V-dVbZ!?VxO@^HEcg zCSQyh8-`CA5N1xE0mK0{9dLvd9REL@cN7R=!!|oCLC-i-kGsWWQd-foPp($6T#xYt zI|*8jfn$r>20dkRh4H#w!e7HJuvTmFfYB)i4|Bg1gM!2P)#Wga=^*09?;V=1_!D$_d5NN$2)2JxDQRl0Ub2=bMWW| z(&hu~7b?Q9qxew3Y(3ZmDJ97?#X*w8DT-I|mPEU51wvsERYExJvEUV>qGz34kH_-5VRSHYnAJM7(eCtl%$0BuQn@eoZ(;%^ zqh4flNs$xv-P*+Un9clwW%LIQbE{~ImLo8`)Eo4uYAJtK9=XT}>DLI~MmW<`X?7^e zL*kL0ggv9MIN({FDdqh5c2?@?qJ#7xy4<@wiND=}URxqwXrjKs!veQUD%VafwxDfm zTpm1&Wfo~g+HQ<#8nC$_f#|mL5>Q$FIzI2^Q`da1)uN`giL;VU62s43?ia>KzIeQ_ z-_C6El}ho6oxJVD6P%DQ=F$F(0U-MzIc*&x_H;J6N_)-T#Vav9 zSuO<*3+@Oa=sH@rTIk(DtcVg%*KMKD%IFOG(W``SX2$Q>O~tN159^j;1qWZk5tq>B zy9j1~eK-i^S@dcIu6K;shbGE~fJ6aEK79bwi=fX2fhgi?zO{Jl?55B{rl~rbf+_am z1^d92pJ<8|0%4?pW>yLo(hJTu2kqzS))$aIc?SC}6ET(xfTjukL^LbRrT}~w;2b1Y zG?@Vp3?fJzxY!tcQtx+iocivS>bqU@m;C0JzxNG% z{(S$@k@Jb_RqrN7oaRmdLgMp|Bi}9_R~OdUbb7hg?UgYWH)wGF`}br`^9jW6CEIT3 z$Z*w@+kN}S4bwrwz)ihhVG}_pp_W}EY$3?)v3(jkx?5IbFVEiWgxT%lf6ucm8K@5A zNDnry9oR9IB=Fko-q)P7a(dzxv^)de`WapkwoS$cBYGxp1)zSv|9$wYC&=)`2U^t; zeos%S{3_~8fie(gNmPc6g?WgUp#20RA_TQ83NG+ML%8%R4k!(KM^s#p_=Z~#doSOp ztl{s_I$ipyZtmvQChtjZ=Wj#f4+yKgoU(jrj;U%3_-hw*>^3Cg6aF5;A5Tz7JujQ# zAuGBuT*GqJplBbZCMF?=wj^kiNphzIJ-V+6{jomkZH*ZXEt&ovG0c=g-~Y8gX?(PK;VP%!7xhxpVpXi1#O_A@<05AXckhKnPgQP>cfD~gy-Dx;Gv{M9l@wRDLV3_ZL^ z!?XVz%r)gV+~#XrZ-RWE7J9}h_Z?0yjx9?8f zCBMF+-rJX3|A{+(C!O9DePG`iQQ*r7>31`atAr}Oj=3Hj;x{!8Dqkn#8KFf8P~uNM zh(+WX0|=*((a{h7Tk``#OvsBhx|sYg;sEKp+t9&+2sO0LvaHL#(fR*3&69h2r#g(= z)8{q5pk5PP6Y}(i8-V*st-nhI+hsLeJ8Mj&`W>1PZ}utYv1e*T>kbQ>448wN$2ajx zv}LPXqGxtHsm=~w*)GzNe0=9%RXR|R-6?V9Bbm(j2Ec930=NWR+xsh3o;*WCv1}kMs}KXB+`!iAVdwyuC>H>1 zU)7n3is-Y7pHMH4gN)xQACsFRxIGJEik}=K{s`gIf^J$)dm;Q*#>-uD+$_s08wdEI zVkVPz^sqfFcyq%Ee%MT>_hnf;(^*8=v<|aB1-1^23n#fP; zbIo0xa}%4|ACHO!^wCZ(_Pu++hYB^>-U^;`XM;%gK*$4O_=FXGKkE4jgWLbEHJQ=5vp`#5 z`I*{*bAnh#OL;hzj`Nw9hS4Rj!3j>lgi6)~S$Lu@r%eqCk*;fsGbIK9`ZT&g%0gHq zQgfFPf0t&XKurjsdPqDMEl_gP<*le_X8H?TwnlN0%9|YE>g?V8>sT4Rv^@GiME)u5 zu@_gJ)=f7^hWY4>^4*Gn(%=8p&-uYqh=Qwz?!yfR>_8l-tW7S4@hDJjC62iVgYVNW>${c%83D(G^-wYe6` zre0ier0fWAhAK*YqgpFbDRj%jB*{>EMXJfLgR!)46OQ}$bTx?1^fSvI?|B)|N8q3D zWX8#kz!~YOPyGMUr=cm9X{_%<*2mzoCDRLQT!oSE9&)2T2V1KP>`zc-3%q!tao}{~ zxlm=uC>fV$JFw(Aw?Sld3(f9ywR)Kn1Zrxngb)8iyL`T)pPJF1W; zQQ;#+xwF5oF>|J`F%Nmnb7Fn8E>6GebZx(jGurdWV2pe^lBuGQA`yjO!KQ;*2@O0$j@%UOEkdC|nr|CBDTe9l45xS*St*#tp1nnENJ z{z`xq($+H%8)izI9~PQY(Uq^p6E%3#e}dfRanRQYn(behJz-K!u0^fK;)!veFT9Mq z;q$al`6gpnG`i|)Nqq5oOv0ps&Xd?nUdgkvc@|TqF)3bVZ{`j0@`FHDoaew2#+1(pjMhH7Q7|!|a;I;<^blA}t5ShU#R0IDN z5u^wMSDs>Czn+OpqV@`tj^>QVx#4^Vfcnvpm`eKbz`j+EpH20s(Ec;?e~|?S;{3!~Ks1J4*93rMJn;_J zat6J4J@&9{4FV4WUfoBdbgk8DFlGF#&%naMW>sgp)O67@Idu*}y?js*_E{$fRtdSQskZ>1!!F9wHyAGI=2V)$tI^x90nt}Z#k(PtJ$bZ`G>vv{)pi?)@PhZ7U0 zq>O`7U;0np4!OT!@7kph`n%d;>tkwa0GLVPJqo;pK^<#c;|_5PC3No5Y&M<&T)}5lK>)D(lzBtPM7|kR zQ_%%O^G~~K9J>9}^#yikEzLg}=6cWU>ii@wU3OHUDy))C{+Rb3t2y1?Jd_y99}rpI zltKE{7qk_je7tTAw|?h`YvC9<(VxY(Bo(7$+m}I#;LEj^Ak2yf zsa7^>ID#K7-)TRbunEsrr6IcA7Gt?p?lC(5YT&a%;1M@Nml6a|a6i(@5EMoa)e4_f z2A)h5Oe7klf_Gx3FmA1V1M$ppq%%tOF&z%X07{oVYvyliN~7#xCS-!+qSx9IW?@J}RYsM){)*;PhHCBa()Y|LQGf(Oua*hUflLM{fMOe*M@}$$!5cpF<#f;=WD0D;?8gMASW-aR9g=B-gvA-!;ugWhuWu4%)Pgqrk` z_;+)X4b8_069;}UUW62IQTZhBtO0M@in?nj$~$-Sl`Lpa*c(|A`gh?Yfn_#JGa6@D zo-O>L;wQ)ldVI^^5-d2z*a}7-{v{Noi$*T(2y8d78HY;|4Qf49moqV2lPIUBN>OB%aWoZ&TNRDh+#&HI!YBL(8)}+3I1%P?kB)>muOkq~En@y6tViQ|lEMuH_INkpq}L8N zc1bD2?~W|g_f?U$n@o&B{+Z;@pSBI%9N-V(wtAF~TNIO!Xg(Vriezp4gyG#CvBM1u zegrxxfzHtA#_h_u`*x@GMuG&s=XR*+U1RZsm+qj{Jqef5lxI8D#cLNW?{(#gX8y9i zgnR^K{;~?l`gQHp{a-ig%tM-I_)!H74agqvT;6v+vZ5)%4+2gm5+XJ0HXoMtVFTZP z7gqJ0eoO!ZuFR)bB{p4(D%*~?p)}tdGOncCcE>1+*JS>&v&2y1H#S45F9Byu0 z6q8}KSNH=zF<_AkbK^4&k|_Rs+@|~4($`(s{DIlk|G4$|0y&+=Kb89ZcdLi{{h@qA zvoW>2eU~*-xsNgWZ^MI$>o775y$0xHI;ma(LpTQ`cB{+ZHN1XLNylGYHOoNs^$5b< z610=@DCr227eJZn=Dga=4n1dxO&+7VP&6jvSRgcI z@Cgza43F6u2xW@*?zCjBhf=7A1NJta3xNoz z?Sm@#aFdq30wLdeN(OOZ`PjiGO?_79Q0mW zB*?H}1Uj#q<=ayh?6ZD5;7q9f`Acu-(gx`7Eyan)JP{jqnpo>rjJABuEEA*5p!}OK zicm~9ybGXBk^&fbVFFSSkl ziw!Ef#6InS+9!qyla;4Cy}&|m$S2H=eJ0z|hwT{;OLk#F*1ifO;CuoXOPx1F zw#Hr?hYuRWEtTcpUfJt>%#E54zB^Bnvs7L)JN%0Kw!bZVB3c?2Jtl{3HR{SW>$xt+ zo#0lfyj^d*VLjcwc;S8i+8)iYAM=<9~+=z1gg@gf?@xxa# z`7~N}k#k{wu?plepciP!o@eGy;3ay zN~Es{QIQM77XTClDep@-&Tkd57VX_vMXo5@Q`MmB@kuu@Ujnk_P`?8)(?@|e2NGdr zkD$VW5F#W!!X6~^Rf{q_Bq&I!b8jbUvdC_Js2Gf6Y%quGIzM|D{Qhk!Xd3Rbv>=L* zCzF`WgjR$+Uy|M&P8`3sNe}$pGBfXY*X#oQ`LT4Pyo3v07~Wr@{RiqC-c&Qf-a04= z%sb*&_HH^%60KJeo`bL%yqa$gMvQPk9I%j=eo2F@71FycxWra5our1V11y3FHq`x$ z#dc2easq;p6+gW)&x8cK@PQ{H&2f;aMF6!N5z2hax441}Mh3L6kVpxhkkAMsW83d8 z!>))pI(ZT0#pkJd1~lZP0H^IUB9L%1j_?UiS~k1{JGGNI_W^3_2>B=Dop=k-aelp7H*4$7`;}w^m)+ z<+1q2M&EtOTc@^pG~X8w!XeS?WOgd)Lbd(&y41V#Nab*=l0?!H6g{6{VOirEdw>t9wNKuqHTPYqEL|^Kp;3r ztBBu&0U*%2R6as3RralmY35%)tNWqe8)8XeUWYuJam&5vNwywAX5vdtq+H}+khbBZ zGSt=jFB}I-K)ud@E(sEguLx2$+4#I(whm%2@ZKP^8Nmzpw+-dm$v@Dl8P7lapBKw5{9^;atNqDR(BpU7 zUyR*_e*97f^5HK=j{oKSnW2kmq-tgXh!c7oX^CyvuT17(f%A+7ba;p?KCi|?}S`lVEL4#U&>p0_WXdL|Y`fT5lfd166 zWjA9l@yk)pEWkh+9roo@vy?--2jb|$p2;DpKYFolw@h}$lzR>YdhoE0ya^v9&kn>x z^tEh_*udz$8cYvrS&UM@eE7|&Klj}y-wll*78p^<(EDQtO9Z8Wz}DFD@*~@KXkvnE z3>+MxrZC=h7wcyD6b(&DYV6>4d~nA??KJkj+LrmNZI&Wu03maiUZ1owFkw9YcJUV) zis$pMpBHYDaqXCUqW9XwSOC#s4$fG1{0=<-8O4o;-f$p_qACucI4kxAxBN+lz~~iz zt$*a+!qTgy!#vPk990?AvQ#b;PJp|3A{8KRtXe$5L4Z=yi-56RtoqdenHi<=o~9~P z2{EArm!E@jjKYAoh9-4lmI#e5zQmzp_p?7qKI*FFbjSyKY^$0>CzNx4^S1x(ga1VY z-29lq_;T@gMF+;kG_h_MiL@QgI|hEAk_PLc0LzDh{)5vz>97z&eWorcGOc>}pV9_U z`V1D5H~(iKF-3U_2?B+9F#S{+@;Nu9kFEblg#KlF2GUK%zyb6Gnkr!o{Fxi}{oU7w zV*J-`{`b)9O+Mr#c`!G~wH^Vtej-r9&IBs~$w~m8O?!>WbcvJi-Yj_pEP0gkf*NH= zc5IU5Mm5a;$riLq=3_khp@AfBVOC&*XbnB?D0s!nL-At)`Y#!%i)(^2G%3-T?RvqZ zB&OkP9uDVv%6q!H)gYppNX0mP(WO_wj9Ej8n7vI5Q!r{8>+K<;8pOu}E+`-5<#RxG z@nZdNR3(Xhj@Umnm2XPl9KNjo>j4V~K6Lp35Xs{-884w--yIcZeN^mQC5aVM4LZvL z1_uWRl#{6Bjw}@ouPLrbU(3p$x%&oBM<<1UEo#X!{TuV~`Ej9hk}3G5*mD1uvB04p zQET<+#qnO0>5iDuIPYpFJ33@*wP_{X_8MF?_WS6Da3p!Jf>B>=Ytgirv2895X3&B| zDkP^MVt^24dPGGF6_4Z6OVCf0R@1O7rDK;4GY5=+Gfk(FhwxPcuEtY&pTw<|e&`r0 zOc;&~r*+G_iKCg&^OA5wel`E?hX*$dMZ5_c>7>vTMY<;H+e@mh@KqAa4HKQ!if$C4 zpKgHz+k5?43Hi7J zZK3@iMX{iWiNFbY0>R24 zaoJE~=lR1OWGt~q2olLY`1|HOgY=4eW5bJXJ-AmP0F+~c-W>qCOvR-~GNK&GA6Kl7+v~&G(bfGZg1{Zgn;dvG`9j6UFeDNW~+$@5XFT)(vsUjXzfCU?h3_3QfO#uC7+v6ol%jf-(>6Z)1x} za|9X81@f4JhgYFDZr~9P0f07tpoKgJ3MCBtN8b9U!%>khp&Xje%q_0LA9-CvPgv^K z=F3k#&$(Y9uSHy^dw<-&B=2T{oqXv2$B?(ve?dC3qF4l%9q{nj%{H@}t7$Qwb?%p6 z&asueg6D_7iR?T_LA8FOz!_Pq4Vb{oMc9irB@mYT97;Dt^gL_?dK#hwG#=4<{8BF& z6d-vioRt2bh)$dM7mxIDs`(Qf55IZ%%W^eezF9eN>aPkSD>U~%?@)Dj!eJr>1I*xx zSW7I$5iv&C$f2o<0YH&TT_5v~ ztQ(BLr;Exv4gEqNy&2keR?NPORu|wuafu6C`iNDnIdVgg#kO9yzOm!#zTrtMvp6EHVoG0 zUvv@v%U=GlvistY(lRnuzDQuHym9vM=;69Je{omyIxTj|KxAW@IBUBbSjrQyXaF_Q zP{KXtf&h#&Vh9;fhIaZh<Ttr%6u^A?{h zzBiDM446xl71@~`x@KsWZuc$W$+)7FWfl@m>1x*?wVq1r)I2DdwTw7w8M$KwG|cHx zFsE2EYy5KBFz4@73Me?mu;xWvvL1!JK$V6p03bic1KpRA)W#zs;W50VYD87eLX?5K zXQ=GjLyr{@q>m{B17;`H`2Pu_wwTj@hy3%?{zU?w+4sE)N;mBkqkcc48_vB9nSciA zlb})t5l68Xa3gG6kOM*GAlEe8xf!PoSWzE-e^z$Iuw)m>^V&%g0H>zkuBRik_94f3 zIB6aZwuHAHwH~k8S~eWrylBzBOAn$P(s*NuRQ1a&;PBb)ejZOw^G#`#9NNZab!qpU zI`t7Yg?1MrKd;`C9%K7<9trvkp3-o-hs2C~-}^BeLWze^pS-%D=)!gsl#fBYC(_6aXXPa?7FR!8a zo?Bh(R@j-P&y4&bsmn3~JJYu-*6Du;^>e}dcD?SlMMdvnOGoE6?-GieT;PQB-MeXR zx1xj-ur79N6S{c?CpK+A~1p~pqP zi0}D0_8&)TLR%5A@ew=G0XsWAQU8=}+J=t*Ny{B7psVcOJRES|I7u-AkIb^jTl=Ps zKO?X9*z2dCneo07qwXS7-?Vuv%WgaNWSo${`w!pujD~U?0b!|R73|)}Kr`U9O%Fm} zDY+in?@3#Lq-|M#K?0#-BWS_|omk zuqJAl#0~Cg@Bi?Oh%?6KYTt_w{l`f0ewa!tR3ekdw3ap29e0+}7EpX*%i6vjfiR;vAUZYe&$pHC-G##58^+$}w zQ9n`(QKvze&@B=#i$N+X@?v79UYP*+oDB-Dg9*EPL0|$^-&EFf{K|JuM9oodcNQGN zOgo`!Sv+k&q1_R>HuB3R*>ZhmZ(sofm{*ch&rb@y0wPd!589W+(w}i{N#TBE4LbX3LejT13rHgEMuK>3w%z|Je5f zH5;`3Dojowlwle;WS%m0{YFaLeZ)D-PG~2kOj+Wh6NeQvL_U-vJ%0q6SRJ0OemfKH zO%=Vgc#Ow0w?FiTeS(-8n|32;x2jwC^p3-G>Cy4mwdQhv6r0ZLr^5l#=Xwp^%kVHA zFhQUCpb6c~c@1BY6NFf>dKFuGP>oFrB369VG6vS)fKw?4l>svEATzx;YDazVcY< z3v|=2Ebbyk>O#vVn*G7o#WEl0eTf zRSL?}vww03Ox)d%gbN~!9_6bZmKz8CiDjQxMP~gtA;NJKlJbG9J!DB|Z?Nog;2||! zA>;>qTnvMez;pvyc#pfI3GT$m9U1kJJMFef(oOpOKZ?d1uBN*|Wu1QYAxlLfnNf;L*^(j|WXoQ% zj(NZH`CY$%=bCG-xn`dCJokOhx$m={eo-~;252id)g;zB#1MNX2ogJTJ#A`{2LBH2 z2#ibZ^FL}SdNBgIJ7bE@LAuA9@2%gs{e-B3qc9)3ih!%C2krsPHfnm>aZ)5UsX?`{Pt{a z^Y5E6gPH`US2eJ3xclA{mxG>z=lQuX|Ds3LVaihGllX5Bb5f{vX!oSUSN}}b-+I0` zX$T&fH-nA~6-EEqUv9qfbe@XPb-r9S0*fL*R%A3OApY+a=R9j^5We6oI2{rG;G4wy z6&7xMH8hiMP5(MUKTh;bnu$<3bI>VP0KU>gYyc_| za+~uudT?ydP6jJK;U+8NK;4Kes3QjySQ~;tX~GCBueU{CCcZ5#16O1PiMv!=dhfW) zxik)`;?#NQ`6!MKbor<#TD_)oXNTjV!DaNuy^EBxYY=7a2>b556(ITHq<+2NJF<@d zUBAu$w%|nkq28)z-dPjEquKrNfx>l8OsmlU0l~?j*Zh3IK;1XevqrVf>rwMw+5U-L zc)dhpLp!6Nwz0ihAR0kPiFrc&>!(-xDtIT&C+Dw&F>>z5ae5?(XjU$K95zHpB>77y|~F2)<)Qc z?bsOYChD&ib2GFJz0h)f)D2_m*s?Z|T>2eeYfC&4Xhn3H+bsqO{Cf*}S|o zw%_0$YU*=QKpJ#@*bIA-L9sTiXgOIHC>>GE78es{5Q_z;#Gw})gbREi3$UCASi~38 zJ?{87v&Q#)A}|=IuRW>x|E{w>41Ev5;}`i`J>DK%TF-3t^?h)UPa5G=5p8xQZInBR zRg4p>gU+;xTJ?`}Nm@y0zSSx8982}zqOZLm1CV4GK~;_h+ddS%k+F}=-E;mYmj{@GSX zG4dh@yWX+;K`y3NCA!I5Yu^%AMZ;KXKVMf(Xf|nz>_gjsr*F&#uSKtRp6Se-xXa1h zo?iJuB;!k`nSHIcHe|E9lY73840F27-jodHl2=+>W%gU{bIJELd^x7b*cAWX&jCka zV4&dr@T5p7oN<^$0n=i%2OpNf9!jbJMhrwn)HNf7h1Annud(|#wtzm^(Pe4tb10z0cfSEA6^Nf+MF5gxK27oe7MgnHKyDz*x%7Y$>0p2rX z9deH{Fr&!SlSq50R|-gjD;S`D7(6805Mv-$%MczAqK_?><^yW~m4|V`vH&d!1c)+X z7zh$O3o{@|pCqwIv3+eC)#ZY{)`q24Zikb8Ml5uZTr&@^jHd$5=BW@) zhf7ya7u22)J<3g4cW^)62y3`lQ*ykc$aIP>?Y-1*I~5ji6|~Z_3H_UQKpHCC;$+H* zS!Zz_C6Ic+8(KY$u*<7GYzYRG04we6a%4x-koib#s_MYl_uKuMR}Tyvf21e@$Ge83 z+(-7rloFjrhU1>k+-|$iNHjnYJUSmE2=eWZ5fnFY+MW;FAx^x^3(Uan6S!w41S5u^ zyqkRF1g9cqLMs<@>UJWB$nu1VqKdPM2idZ z?SG_s3Iv8CWTMVJZ>)-UYvkq{wOs=ZVvh31rM>{F$uaZ5h8*_ZDYe)7XTKaYo>l%1 zp6(e@+&ePTF7QfYv11O7|tPm#$$IgSh`9`P6;Io<|f zm}D=|8`wP#{gyrh2Dk{J7IdBhBq3cs<}6$}Z0o7QRd-@lSl*h}w*4`d+B8=d5>f^z2bu z*kk8(I$C7p1VyqIh_?{W(jWeis;RMu)OFGQe-6zz-!CmFl-crr8c^p3ljBgUuS4GO zHukkQ<>WD z^O+I=C)+P&6e00hg7M!+GbGSw5oYuRvBoR1U>(6J3Gvi`7vdDDOT2_?#Bp@EyJlpN*r4kN<#$3L6O-T76<7k_;)B~Hu77{1nA zejMq4>fu$UaD}lkPbSLoTlnzO+?6jsZBM-9?yH5I>)$05@4qOruzVC4w~0BD>?8e` z@?rnv$5tN+pe}PUgJhWXM$X;isU73a{`aFhfh=u9wxuaX{f$2wuMXi4@9}Vfm-h56 z#ryq-%E(K4*a6*RX;7aBiX2Zw5N_bpK%pEb-JJ6|R=emYGj$2I-YCOR z;2r+&4>J$|KR;DaQOR&g8XIR9T#~YYY1_~A%aIhhO&#ll%iaDy_-*lbjrivL;=o5K zEZVO68G6TA@kQ$rb1xIY9YPU`xxwsCt3YjzJvs1&81AfGO^9%5SL&+5)B#ImbLeW~ zY~+BY8q_>BQMIu1#Qj{36(I87)6tLoD;JyuCkM1C|Mk0jusASvfI~KRO1{StyR%wXJ7cs!BG~~ND>

e#_#?dr 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 z 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 z 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 z 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�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 z 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 literal 0 HcmV?d00001 diff --git a/Samples/Resources/Wanko/Wanko.cdi3.json b/Samples/Resources/Wanko/Wanko.cdi3.json new file mode 100644 index 00000000..5411d287 --- /dev/null +++ b/Samples/Resources/Wanko/Wanko.cdi3.json @@ -0,0 +1,261 @@ +{ + "Version": 3, + "Parameters": [ + { + "Id": "PARAM_ANGLE_X", + "GroupId": "", + "Name": "角度 X" + }, + { + "Id": "PARAM_ANGLE_Y", + "GroupId": "", + "Name": "角度 Y" + }, + { + "Id": "PARAM_ANGLE_Z", + "GroupId": "", + "Name": "角度 Z" + }, + { + "Id": "PARAM_EYE_L_OPEN", + "GroupId": "", + "Name": "左眼 開閉" + }, + { + "Id": "PARAM_EYE_R_OPEN", + "GroupId": "", + "Name": "右眼 開閉" + }, + { + "Id": "PARAM_MOUTH_FORM", + "GroupId": "", + "Name": "口 変形" + }, + { + "Id": "PARAM_MOUTH_OPEN_Y", + "GroupId": "", + "Name": "口 開閉" + }, + { + "Id": "PARAM_TERE", + "GroupId": "", + "Name": "照れ" + }, + { + "Id": "PARAM_BODY_ANGLE_X", + "GroupId": "", + "Name": "体の回転 X" + }, + { + "Id": "PARAM_BODY_ANGLE_Z", + "GroupId": "", + "Name": "体の回転 Z" + }, + { + "Id": "PARAM_BODY_ANGLE_Y", + "GroupId": "", + "Name": "体の回転 Y" + }, + { + "Id": "PARAM_BREATH", + "GroupId": "", + "Name": "呼吸" + }, + { + "Id": "PARAM_BOWL_LID", + "GroupId": "", + "Name": "お椀 ふた" + }, + { + "Id": "PARAM_YUGE_01", + "GroupId": "", + "Name": "湯気" + }, + { + "Id": "PARAM_YUGE_02", + "GroupId": "", + "Name": "湯気" + }, + { + "Id": "PARAM_EFFECT", + "GroupId": "", + "Name": "エフェクト" + }, + { + "Id": "PARAM_EAR_L", + "GroupId": "", + "Name": "左耳" + }, + { + "Id": "PARAM_EAR_R", + "GroupId": "", + "Name": "右耳" + }, + { + "Id": "PARAM_HAND_L", + "GroupId": "", + "Name": "左手" + }, + { + "Id": "PARAM_HAND_R", + "GroupId": "", + "Name": "右手" + }, + { + "Id": "PARAM_SWING", + "GroupId": "", + "Name": "揺れ" + }, + { + "Id": "PARAM_BOWL_SWING", + "GroupId": "", + "Name": "揺れ お椀" + }, + { + "Id": "PARAM_FACE_01", + "GroupId": "", + "Name": "どや キリッ" + }, + { + "Id": "PARAM_BASE_X", + "GroupId": "", + "Name": "全体の左右" + }, + { + "Id": "PARAM_BASE_Y", + "GroupId": "", + "Name": "全体の上下" + } + ], + "ParameterGroups": [], + "Parts": [ + { + "Id": "PARTS_01_SKETCH", + "Name": "[ 下絵 ]" + }, + { + "Id": "PARTS_01_BACKGROUND", + "Name": "背景" + }, + { + "Id": "PARTS_01_BOWL", + "Name": "お椀" + }, + { + "Id": "PARTS_01_BODY", + "Name": "体" + }, + { + "Id": "PARTS_01_EAR_001", + "Name": "耳" + }, + { + "Id": "PARTS_01_NOSE_001", + "Name": "鼻" + }, + { + "Id": "PARTS_01_MOUTH_001", + "Name": "口" + }, + { + "Id": "PARTS_01_BROW_001", + "Name": "まゆ毛" + }, + { + "Id": "PARTS_01_EYE_BALL_001", + "Name": "目玉" + }, + { + "Id": "PARTS_01_EYE_001", + "Name": "目" + }, + { + "Id": "PARTS_01_FACE_001", + "Name": "顔" + }, + { + "Id": "PARTS_01_HOHO", + "Name": "頬" + }, + { + "Id": "PARTS_01_EFFECT", + "Name": "エフェクト" + }, + { + "Id": "PARTS_01_ITEM_16", + "Name": "蕎麦6杯目" + }, + { + "Id": "PARTS_01_ITEM_15", + "Name": "ベニテングタケ" + }, + { + "Id": "PARTS_01_ITEM_14", + "Name": "蕎麦5杯目" + }, + { + "Id": "PARTS_01_ITEM_13", + "Name": "しいたけ" + }, + { + "Id": "PARTS_01_ITEM_12", + "Name": "みかん" + }, + { + "Id": "PARTS_01_ITEM_11", + "Name": "蕎麦4杯目" + }, + { + "Id": "PARTS_01_ITEM_10", + "Name": "王冠" + }, + { + "Id": "PARTS_01_ITEM_09", + "Name": "まゆげ" + }, + { + "Id": "PARTS_01_ITEM_08", + "Name": "蕎麦3杯目" + }, + { + "Id": "PARTS_01_ITEM_07", + "Name": "アフロ" + }, + { + "Id": "PARTS_01_ITEM_06", + "Name": "リボン" + }, + { + "Id": "PARTS_01_ITEM_05", + "Name": "蕎麦2杯目" + }, + { + "Id": "PARTS_01_ITEM_04", + "Name": "星" + }, + { + "Id": "PARTS_01_ITEM_03", + "Name": "ひげ" + }, + { + "Id": "PARTS_01_ITEM_02", + "Name": "蕎麦1杯目" + }, + { + "Id": "PARTS_01_ITEM_01", + "Name": "たんぽぽ" + }, + { + "Id": "PARTS_01_CORE_ITEM", + "Name": "コア アイテム" + }, + { + "Id": "PARTS_01_CORE", + "Name": "コア" + }, + { + "Id": "ROUGH", + "Name": "ラフ" + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/Wanko.moc3 b/Samples/Resources/Wanko/Wanko.moc3 new file mode 100644 index 0000000000000000000000000000000000000000..b68661061e986f5080133a7e313d7883c4850e36 GIT binary patch literal 107456 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 literal 0 HcmV?d00001 diff --git a/Samples/Resources/Wanko/Wanko.model3.json b/Samples/Resources/Wanko/Wanko.model3.json new file mode 100644 index 00000000..95ffeebb --- /dev/null +++ b/Samples/Resources/Wanko/Wanko.model3.json @@ -0,0 +1,55 @@ +{ + "Version": 3, + "FileReferences": { + "Moc": "Wanko.moc3", + "Textures": [ + "Wanko.1024/texture_00.png" + ], + "Physics": "Wanko.physics3.json", + "DisplayInfo": "Wanko.cdi3.json", + "Motions": { + "Idle": [ + { + "File": "motions/idle_01.motion3.json" + }, + { + "File": "motions/idle_03.motion3.json" + }, + { + "File": "motions/idle_04.motion3.json" + } + ], + "TapBody": [ + { + "File": "motions/touch_02.motion3.json" + }, + { + "File": "motions/touch_04.motion3.json" + } + ] + } + }, + "Groups": [ + { + "Target": "Parameter", + "Name": "EyeBlink", + "Ids": [ + "PARAM_EYE_L_OPEN", + "PARAM_EYE_R_OPEN" + ] + }, + { + "Target": "Parameter", + "Name": "LipSync", + "Ids": [ + "PARAM_MOUTH_OPEN_Y" + ] + } + ], + "HitAreas": [ + { + "Id": "HitArea", + "Name": "Body" + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/Wanko.physics3.json b/Samples/Resources/Wanko/Wanko.physics3.json new file mode 100644 index 00000000..604bbfb6 --- /dev/null +++ b/Samples/Resources/Wanko/Wanko.physics3.json @@ -0,0 +1,373 @@ +{ + "Version": 3, + "Meta": { + "PhysicsSettingCount": 4, + "TotalInputCount": 14, + "TotalOutputCount": 4, + "VertexCount": 8, + "EffectiveForces": { + "Gravity": { + "X": 0, + "Y": -1 + }, + "Wind": { + "X": 0, + "Y": 0 + } + }, + "PhysicsDictionary": [ + { + "Id": "PhysicsSetting1", + "Name": "お椀揺れ" + }, + { + "Id": "PhysicsSetting2", + "Name": "揺れ" + }, + { + "Id": "PhysicsSetting3", + "Name": "右耳" + }, + { + "Id": "PhysicsSetting4", + "Name": "左耳" + } + ] + }, + "PhysicsSettings": [ + { + "Id": "PhysicsSetting1", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X" + }, + "Weight": 100, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z" + }, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING" + }, + "VertexIndex": 1, + "Scale": 1, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 3 + }, + "Mobility": 0.8, + "Delay": 0.9, + "Acceleration": 1.5, + "Radius": 3 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + }, + { + "Id": "PhysicsSetting2", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y" + }, + "Weight": 100, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z" + }, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "PARAM_SWING" + }, + "VertexIndex": 1, + "Scale": 1, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 5 + }, + "Mobility": 0.85, + "Delay": 0.9, + "Acceleration": 1, + "Radius": 5 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + }, + { + "Id": "PhysicsSetting3", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X" + }, + "Weight": 50, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y" + }, + "Weight": 20, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z" + }, + "Weight": 60, + "Type": "Angle", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X" + }, + "Weight": 30, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z" + }, + "Weight": 40, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "PARAM_EAR_R" + }, + "VertexIndex": 1, + "Scale": 1.5, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 5.5 + }, + "Mobility": 0.95, + "Delay": 0.9, + "Acceleration": 1.5, + "Radius": 5.5 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + }, + { + "Id": "PhysicsSetting4", + "Input": [ + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X" + }, + "Weight": 50, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y" + }, + "Weight": 20, + "Type": "X", + "Reflect": true + }, + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z" + }, + "Weight": 60, + "Type": "Angle", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X" + }, + "Weight": 30, + "Type": "X", + "Reflect": false + }, + { + "Source": { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z" + }, + "Weight": 40, + "Type": "Angle", + "Reflect": false + } + ], + "Output": [ + { + "Destination": { + "Target": "Parameter", + "Id": "PARAM_EAR_L" + }, + "VertexIndex": 1, + "Scale": 1.5, + "Weight": 100, + "Type": "Angle", + "Reflect": false + } + ], + "Vertices": [ + { + "Position": { + "X": 0, + "Y": 0 + }, + "Mobility": 1, + "Delay": 1, + "Acceleration": 1, + "Radius": 0 + }, + { + "Position": { + "X": 0, + "Y": 5.5 + }, + "Mobility": 0.95, + "Delay": 0.9, + "Acceleration": 1.5, + "Radius": 5.5 + } + ], + "Normalization": { + "Position": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + }, + "Angle": { + "Minimum": -10, + "Default": 0, + "Maximum": 10 + } + } + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/idle_01.motion3.json b/Samples/Resources/Wanko/motions/idle_01.motion3.json new file mode 100644 index 00000000..86982bf1 --- /dev/null +++ b/Samples/Resources/Wanko/motions/idle_01.motion3.json @@ -0,0 +1,699 @@ +{ + "Version": 3, + "Meta": { + "Duration": 5.967, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 85, + "TotalPointCount": 233, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + -1, + 1, + 0.222, + -1, + 0.444, + 0, + 0.667, + 0, + 1, + 0.911, + 0, + 1.156, + -1, + 1.4, + -1, + 1, + 1.622, + -1, + 1.844, + 0, + 2.067, + 0, + 1, + 2.322, + 0, + 2.578, + -1, + 2.833, + -1, + 1, + 3.067, + -1, + 3.3, + 0, + 3.533, + 0, + 1, + 3.844, + 0, + 4.156, + -1, + 4.467, + -1, + 1, + 4.656, + -1, + 4.844, + 0, + 5.033, + 0, + 1, + 5.333, + 0, + 5.633, + -1, + 5.933, + -1, + 0, + 5.967, + -1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 14, + 1, + 0.222, + 14, + 0.444, + -8, + 0.667, + -8, + 1, + 0.911, + -8, + 1.156, + 14, + 1.4, + 14, + 1, + 1.622, + 14, + 1.844, + -13, + 2.067, + -13, + 1, + 2.322, + -13, + 2.578, + 14, + 2.833, + 14, + 1, + 3.067, + 14, + 3.3, + -8, + 3.533, + -8, + 1, + 3.844, + -8, + 4.156, + 14, + 4.467, + 14, + 1, + 4.656, + 14, + 4.844, + -13, + 5.033, + -13, + 1, + 5.333, + -13, + 5.633, + 14, + 5.933, + 14, + 0, + 5.967, + 14 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + -10, + 1, + 0.467, + -10, + 0.933, + 13, + 1.4, + 13, + 1, + 1.878, + 13, + 2.356, + -10, + 2.833, + -10, + 1, + 3.378, + -10, + 3.922, + 13, + 4.467, + 13, + 1, + 4.956, + 13, + 5.444, + -10, + 5.933, + -10, + 0, + 5.967, + -10 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 1, + 1, + 0.622, + 1, + 1.244, + 1, + 1.867, + 1, + 1, + 1.922, + 1, + 1.978, + 0, + 2.033, + 0, + 1, + 2.133, + 0, + 2.233, + 1, + 2.333, + 1, + 1, + 3.533, + 1, + 4.733, + 1, + 5.933, + 1, + 0, + 5.967, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 1, + 1, + 0.622, + 1, + 1.244, + 1, + 1.867, + 1, + 1, + 1.922, + 1, + 1.978, + 0, + 2.033, + 0, + 1, + 2.133, + 0, + 2.233, + 1, + 2.333, + 1, + 1, + 3.533, + 1, + 4.733, + 1, + 5.933, + 1, + 0, + 5.967, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 1, + 1, + 0.622, + 1, + 1.244, + 1, + 1.867, + 1, + 1, + 1.922, + 1, + 1.978, + 0, + 2.033, + 0, + 1, + 2.133, + 0, + 2.233, + 1, + 2.333, + 1, + 1, + 3.044, + 1, + 3.756, + 1, + 4.467, + 1, + 1, + 4.656, + 1, + 4.844, + 0, + 5.033, + 0, + 1, + 5.333, + 0, + 5.633, + 1, + 5.933, + 1, + 0, + 5.967, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + -2, + 1, + 0.467, + -2, + 0.933, + 2, + 1.4, + 2, + 1, + 1.878, + 2, + 2.356, + -2, + 2.833, + -2, + 1, + 3.378, + -2, + 3.922, + 4, + 4.467, + 4, + 1, + 4.956, + 4, + 5.444, + -2, + 5.933, + -2, + 0, + 5.967, + -2 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + -5, + 1, + 0.467, + -5, + 0.933, + 6, + 1.4, + 6, + 1, + 1.878, + 6, + 2.356, + -5, + 2.833, + -5, + 1, + 3.378, + -5, + 3.922, + 6, + 4.467, + 6, + 1, + 4.956, + 6, + 5.444, + -5, + 5.933, + -5, + 0, + 5.967, + -5 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 1.978, + 0, + 3.956, + 0, + 5.933, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 1.978, + 0, + 3.956, + 0, + 5.933, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 1.978, + 50, + 3.956, + 50, + 5.933, + 50, + 0, + 5.967, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 1.978, + 0, + 3.956, + 0, + 5.933, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 1.978, + 0, + 3.956, + 0, + 5.933, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 1.978, + 0, + 3.956, + 0, + 5.933, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 0.267, + 0, + 0.533, + 0, + 0.8, + 0, + 1, + 0.867, + 0, + 0.933, + 0.82, + 1, + 0.82, + 1, + 1.056, + 0.82, + 1.111, + -0.72, + 1.167, + -0.72, + 1, + 1.222, + -0.72, + 1.278, + 0.23, + 1.333, + 0.23, + 1, + 1.356, + 0.23, + 1.378, + 0, + 1.4, + 0, + 1, + 2.156, + 0, + 2.911, + 0, + 3.667, + 0, + 1, + 3.722, + 0, + 3.778, + 0.82, + 3.833, + 0.82, + 1, + 3.889, + 0.82, + 3.944, + -0.72, + 4, + -0.72, + 1, + 4.056, + -0.72, + 4.111, + 0.23, + 4.167, + 0.23, + 1, + 4.2, + 0.23, + 4.233, + 0, + 4.267, + 0, + 1, + 4.822, + 0, + 5.378, + 0, + 5.933, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 1.978, + 0, + 3.956, + 0, + 5.933, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 1.978, + 0, + 3.956, + 0, + 5.933, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 1.978, + 0, + 3.956, + 0, + 5.933, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 1.978, + 0, + 3.956, + 0, + 5.933, + 0, + 0, + 5.967, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 5.967, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/idle_02.motion3.json b/Samples/Resources/Wanko/motions/idle_02.motion3.json new file mode 100644 index 00000000..3493c371 --- /dev/null +++ b/Samples/Resources/Wanko/motions/idle_02.motion3.json @@ -0,0 +1,818 @@ +{ + "Version": 3, + "Meta": { + "Duration": 6.933, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 102, + "TotalPointCount": 284, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.3, + 0, + 0.6, + 0, + 0.9, + 0, + 1, + 1.167, + 0, + 1.433, + -2, + 1.7, + -2, + 1, + 1.889, + -2, + 2.078, + -2, + 2.267, + -2, + 1, + 2.633, + -2, + 3, + 0, + 3.367, + 0, + 1, + 3.567, + 0, + 3.767, + 0, + 3.967, + 0, + 1, + 4.322, + 0, + 4.678, + 0, + 5.033, + 0, + 1, + 5.156, + 0, + 5.278, + 0, + 5.4, + 0, + 1, + 5.9, + 0, + 6.4, + 0, + 6.9, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.3, + 0, + 0.6, + 0, + 0.9, + 0, + 1, + 1.167, + 0, + 1.433, + 15, + 1.7, + 15, + 1, + 1.889, + 15, + 2.078, + 15, + 2.267, + 15, + 1, + 2.633, + 15, + 3, + 0, + 3.367, + 0, + 1, + 3.567, + 0, + 3.767, + 0, + 3.967, + 0, + 1, + 4.322, + 0, + 4.678, + 0, + 5.033, + 0, + 1, + 5.078, + 0, + 5.122, + 11, + 5.167, + 11, + 1, + 5.244, + 11, + 5.322, + 0, + 5.4, + 0, + 1, + 5.9, + 0, + 6.4, + 0, + 6.9, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.3, + 0, + 0.6, + 0, + 0.9, + 0, + 1, + 1.167, + 0, + 1.433, + 23, + 1.7, + 23, + 1, + 1.889, + 23, + 2.078, + 23, + 2.267, + 23, + 1, + 2.633, + 23, + 3, + -7, + 3.367, + -7, + 1, + 3.567, + -7, + 3.767, + 0, + 3.967, + 0, + 1, + 4.322, + 0, + 4.678, + 0, + 5.033, + 0, + 1, + 5.656, + 0, + 6.278, + 0, + 6.9, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 1, + 1, + 0.444, + 1, + 0.889, + 1, + 1.333, + 1, + 1, + 1.367, + 1, + 1.4, + 0, + 1.433, + 0, + 1, + 1.5, + 0, + 1.567, + 1, + 1.633, + 1, + 1, + 2.856, + 1, + 4.078, + 1, + 5.3, + 1, + 1, + 5.333, + 1, + 5.367, + 0, + 5.4, + 0, + 1, + 5.467, + 0, + 5.533, + 1, + 5.6, + 1, + 0, + 6.933, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 1, + 1, + 0.444, + 1, + 0.889, + 1, + 1.333, + 1, + 1, + 1.367, + 1, + 1.4, + 0, + 1.433, + 0, + 1, + 1.5, + 0, + 1.567, + 1, + 1.633, + 1, + 1, + 2.856, + 1, + 4.078, + 1, + 5.3, + 1, + 1, + 5.333, + 1, + 5.367, + 0, + 5.4, + 0, + 1, + 5.467, + 0, + 5.533, + 1, + 5.6, + 1, + 0, + 6.933, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 1, + 1, + 0.978, + 1, + 1.956, + 1, + 2.933, + 1, + 1, + 3.078, + 1, + 3.222, + 0, + 3.367, + 0, + 1, + 3.8, + 0, + 4.233, + 0, + 4.667, + 0, + 1, + 4.789, + 0, + 4.911, + 0, + 5.033, + 0, + 1, + 5.111, + 0, + 5.189, + 1, + 5.267, + 1, + 1, + 5.4, + 1, + 5.533, + 0, + 5.667, + 0, + 1, + 5.911, + 0, + 6.156, + 0, + 6.4, + 0, + 1, + 6.567, + 0, + 6.733, + 1, + 6.9, + 1, + 0, + 6.933, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.3, + 0, + 0.6, + 0, + 0.9, + 0, + 1, + 2.278, + 0, + 3.656, + 0, + 5.033, + 0, + 1, + 5.656, + 0, + 6.278, + 0, + 6.9, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.3, + 0, + 0.6, + 0, + 0.9, + 0, + 1, + 1.167, + 0, + 1.433, + 10, + 1.7, + 10, + 1, + 1.889, + 10, + 2.078, + 10, + 2.267, + 10, + 1, + 2.833, + 10, + 3.4, + 0, + 3.967, + 0, + 1, + 4.322, + 0, + 4.678, + 0, + 5.033, + 0, + 1, + 5.656, + 0, + 6.278, + 0, + 6.9, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 2, + 0.333, + 2, + 1, + 0.522, + 2, + 0.711, + 0, + 0.9, + 0, + 1, + 1.011, + 0, + 1.122, + 8, + 1.233, + 8, + 1, + 1.389, + 8, + 1.544, + 0, + 1.7, + 0, + 1, + 1.889, + 0, + 2.078, + 0, + 2.267, + 0, + 1, + 2.489, + 0, + 2.711, + 3, + 2.933, + 3, + 1, + 3.078, + 3, + 3.222, + 0, + 3.367, + 0, + 1, + 3.567, + 0, + 3.767, + 0, + 3.967, + 0, + 1, + 4.2, + 0, + 4.433, + 2, + 4.667, + 2, + 1, + 4.789, + 2, + 4.911, + 0, + 5.033, + 0, + 1, + 5.078, + 0, + 5.122, + 8, + 5.167, + 8, + 1, + 5.244, + 8, + 5.322, + -2, + 5.4, + -2, + 1, + 5.456, + -2, + 5.511, + 1, + 5.567, + 1, + 1, + 5.6, + 1, + 5.633, + 0, + 5.667, + 0, + 1, + 5.789, + 0, + 5.911, + 0, + 6.033, + 0, + 1, + 6.156, + 0, + 6.278, + 3, + 6.4, + 3, + 1, + 6.567, + 3, + 6.733, + 0, + 6.9, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 0, + 6.933, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 1.656, + 0, + 3.311, + 0, + 4.967, + 0, + 1, + 5.011, + 0, + 5.056, + -0.57, + 5.1, + -0.57, + 1, + 5.167, + -0.57, + 5.233, + 0.55, + 5.3, + 0.55, + 1, + 5.367, + 0.55, + 5.433, + -0.24, + 5.5, + -0.24, + 1, + 5.556, + -0.24, + 5.611, + 0, + 5.667, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 1.656, + 0, + 3.311, + 0, + 4.967, + 0, + 1, + 5.011, + 0, + 5.056, + 0.5, + 5.1, + 0.5, + 1, + 5.167, + 0.5, + 5.233, + -0.64, + 5.3, + -0.64, + 1, + 5.367, + -0.64, + 5.433, + 0.18, + 5.5, + 0.18, + 1, + 5.556, + 0.18, + 5.611, + 0, + 5.667, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 0, + 6.933, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 6.933, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/idle_03.motion3.json b/Samples/Resources/Wanko/motions/idle_03.motion3.json new file mode 100644 index 00000000..db190987 --- /dev/null +++ b/Samples/Resources/Wanko/motions/idle_03.motion3.json @@ -0,0 +1,783 @@ +{ + "Version": 3, + "Meta": { + "Duration": 6.7, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 97, + "TotalPointCount": 269, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.378, + 0, + 0.756, + -14, + 1.133, + -14, + 1, + 1.344, + -14, + 1.556, + -14, + 1.767, + -14, + 1, + 2.189, + -14, + 2.611, + -14, + 3.033, + -14, + 1, + 3.8, + -14, + 4.567, + -14, + 5.333, + -14, + 1, + 5.678, + -14, + 6.022, + 0, + 6.367, + 0, + 1, + 6.467, + 0, + 6.567, + 0, + 6.667, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.378, + 0, + 0.756, + 16, + 1.133, + 16, + 1, + 1.344, + 16, + 1.556, + 16, + 1.767, + 16, + 1, + 2.956, + 16, + 4.144, + 16, + 5.333, + 16, + 1, + 5.678, + 16, + 6.022, + 0, + 6.367, + 0, + 1, + 6.467, + 0, + 6.567, + 0, + 6.667, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.378, + 0, + 0.756, + 0, + 1.133, + 0, + 1, + 1.344, + 0, + 1.556, + 0, + 1.767, + 0, + 1, + 2.956, + 0, + 4.144, + 0, + 5.333, + 0, + 1, + 5.678, + 0, + 6.022, + 0, + 6.367, + 0, + 1, + 6.467, + 0, + 6.567, + 0, + 6.667, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 1, + 1, + 0.478, + 1, + 0.956, + 1, + 1.433, + 1, + 1, + 1.544, + 1, + 1.656, + 0, + 1.767, + 0, + 1, + 2.022, + 0, + 2.278, + 0, + 2.533, + 0, + 1, + 2.689, + 0, + 2.844, + 0, + 3, + 0, + 1, + 3.111, + 0, + 3.222, + 1, + 3.333, + 1, + 1, + 4, + 1, + 4.667, + 1, + 5.333, + 1, + 1, + 5.456, + 1, + 5.578, + 1, + 5.7, + 1, + 1, + 5.733, + 1, + 5.767, + 0, + 5.8, + 0, + 1, + 5.867, + 0, + 5.933, + 1, + 6, + 1, + 0, + 6.7, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 1, + 1, + 0.478, + 1, + 0.956, + 1, + 1.433, + 1, + 1, + 1.544, + 1, + 1.656, + 0, + 1.767, + 0, + 1, + 2.022, + 0, + 2.278, + 0, + 2.533, + 0, + 1, + 2.689, + 0, + 2.844, + 0, + 3, + 0, + 1, + 3.111, + 0, + 3.222, + 1, + 3.333, + 1, + 1, + 4, + 1, + 4.667, + 1, + 5.333, + 1, + 1, + 5.456, + 1, + 5.578, + 1, + 5.7, + 1, + 1, + 5.733, + 1, + 5.767, + 0, + 5.8, + 0, + 1, + 5.867, + 0, + 5.933, + 1, + 6, + 1, + 0, + 6.7, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 0, + 1, + 1.422, + 0, + 2.844, + 0, + 4.267, + 0, + 1, + 4.378, + 0, + 4.489, + 0.6, + 4.6, + 0.6, + 1, + 4.733, + 0.6, + 4.867, + 0, + 5, + 0, + 1, + 5.456, + 0, + 5.911, + 0, + 6.367, + 0, + 1, + 6.467, + 0, + 6.567, + 0, + 6.667, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.378, + 0, + 0.756, + -9, + 1.133, + -9, + 1, + 2.533, + -9, + 3.933, + -9, + 5.333, + -9, + 1, + 5.678, + -9, + 6.022, + 0, + 6.367, + 0, + 1, + 6.467, + 0, + 6.567, + 0, + 6.667, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.622, + 0, + 0.878, + -2, + 1.133, + -2, + 1, + 2.533, + -2, + 3.933, + 0, + 5.333, + 0, + 1, + 5.678, + 0, + 6.022, + 0, + 6.367, + 0, + 1, + 6.467, + 0, + 6.567, + 0, + 6.667, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 4, + 0.367, + 4, + 1, + 0.511, + 4, + 0.656, + -1, + 0.8, + -1, + 1, + 0.856, + -1, + 0.911, + 1, + 0.967, + 1, + 1, + 1.044, + 1, + 1.122, + 0, + 1.2, + 0, + 1, + 1.389, + 0, + 1.578, + 0, + 1.767, + 0, + 1, + 1.8, + 0, + 1.833, + 2, + 1.867, + 2, + 1, + 1.911, + 2, + 1.956, + 0, + 2, + 0, + 1, + 2.044, + 0, + 2.089, + 1, + 2.133, + 1, + 1, + 2.178, + 1, + 2.222, + 0, + 2.267, + 0, + 1, + 2.622, + 0, + 2.978, + 0, + 3.333, + 0, + 1, + 3.511, + 0, + 3.689, + 0, + 3.867, + 0, + 1, + 4, + 0, + 4.133, + -1, + 4.267, + -1, + 1, + 4.411, + -1, + 4.556, + 2, + 4.7, + 2, + 1, + 4.911, + 2, + 5.122, + 1.884, + 5.333, + 0, + 1, + 5.489, + -1.388, + 5.644, + -5, + 5.8, + -5, + 1, + 5.989, + -5, + 6.178, + 0, + 6.367, + 0, + 1, + 6.467, + 0, + 6.567, + 0, + 6.667, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 1.778, + 0, + 3.556, + 0, + 5.333, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 1.778, + 50, + 3.556, + 50, + 5.333, + 50, + 0, + 6.7, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 1.778, + 0, + 3.556, + 0, + 5.333, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 1.778, + 0, + 3.556, + 0, + 5.333, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 1.778, + 0, + 3.556, + 0, + 5.333, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 1.778, + 0, + 3.556, + 0, + 5.333, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 1.778, + 0, + 3.556, + 0, + 5.333, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 1.778, + 0, + 3.556, + 0, + 5.333, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 1.778, + 0, + 3.556, + 0, + 5.333, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 1.778, + 0, + 3.556, + 0, + 5.333, + 0, + 0, + 6.7, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 6.7, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/idle_04.motion3.json b/Samples/Resources/Wanko/motions/idle_04.motion3.json new file mode 100644 index 00000000..b54e5a5a --- /dev/null +++ b/Samples/Resources/Wanko/motions/idle_04.motion3.json @@ -0,0 +1,636 @@ +{ + "Version": 3, + "Meta": { + "Duration": 10.367, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 76, + "TotalPointCount": 206, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 2.533, + 0, + 5.067, + -1, + 7.6, + -1, + 1, + 8.511, + -1, + 9.422, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.333, + 0, + 0.667, + 12, + 1, + 12, + 1, + 1.6, + 12, + 2.2, + -1.589, + 2.8, + -1.589, + 1, + 3.178, + -1.589, + 3.556, + 12, + 3.933, + 12, + 1, + 4.656, + 12, + 5.378, + -1.589, + 6.1, + -1.589, + 1, + 6.489, + -1.589, + 6.878, + 13.71, + 7.267, + 13.71, + 1, + 7.378, + 13.71, + 7.489, + -23, + 7.6, + -23, + 1, + 7.678, + -23, + 7.756, + -7.683, + 7.833, + -7.683, + 1, + 7.933, + -7.683, + 8.033, + -10.837, + 8.133, + -10.837, + 1, + 8.867, + -10.837, + 9.6, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + -8, + 1, + 0.333, + -8, + 0.667, + 9, + 1, + 9, + 1, + 1.6, + 9, + 2.2, + -11, + 2.8, + -11, + 1, + 3.178, + -11, + 3.556, + 9, + 3.933, + 9, + 1, + 4.656, + 9, + 5.378, + -11, + 6.1, + -11, + 1, + 6.489, + -11, + 6.878, + 5, + 7.267, + 5, + 1, + 7.378, + 5, + 7.489, + -9, + 7.6, + -9, + 1, + 7.678, + -9, + 7.756, + -1, + 7.833, + -1, + 1, + 7.933, + -1, + 8.033, + -7, + 8.133, + -7, + 1, + 8.478, + -7, + 8.822, + 2, + 9.167, + 2, + 1, + 9.556, + 2, + 9.944, + -8, + 10.333, + -8, + 0, + 10.367, + -8 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 0, + 1, + 0.333, + 0, + 0.667, + 0.42, + 1, + 0.42, + 1, + 1.6, + 0.42, + 2.2, + 0, + 2.8, + 0, + 1, + 3.178, + 0, + 3.556, + 0.42, + 3.933, + 0.42, + 1, + 4.656, + 0.42, + 5.378, + 0, + 6.1, + 0, + 1, + 6.489, + 0, + 6.878, + 0.35, + 7.267, + 0.35, + 1, + 7.6, + 0.35, + 7.933, + 0, + 8.267, + 0, + 1, + 8.567, + 0, + 8.867, + 0.34, + 9.167, + 0.34, + 1, + 9.556, + 0.34, + 9.944, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 2.422, + 0, + 4.844, + 0, + 7.267, + 0, + 1, + 7.378, + 0, + 7.489, + -6, + 7.6, + -6, + 1, + 7.778, + -6, + 7.956, + -6, + 8.133, + -6, + 1, + 8.867, + -6, + 9.6, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 0.333, + 0, + 0.667, + 0.64, + 1, + 0.64, + 1, + 1.6, + 0.64, + 2.2, + 0, + 2.8, + 0, + 1, + 3.178, + 0, + 3.556, + 0.73, + 3.933, + 0.73, + 1, + 4.656, + 0.73, + 5.378, + 0, + 6.1, + 0, + 1, + 6.489, + 0, + 6.878, + 0.73, + 7.267, + 0.73, + 1, + 7.556, + 0.73, + 7.844, + 0, + 8.133, + 0, + 1, + 8.478, + 0, + 8.822, + 0.39, + 9.167, + 0.39, + 1, + 9.556, + 0.39, + 9.944, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 3.444, + 50, + 6.889, + 50, + 10.333, + 50, + 0, + 10.367, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 3.444, + 0, + 6.889, + 0, + 10.333, + 0, + 0, + 10.367, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 10.367, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/shake_01.motion3.json b/Samples/Resources/Wanko/motions/shake_01.motion3.json new file mode 100644 index 00000000..a2055bb1 --- /dev/null +++ b/Samples/Resources/Wanko/motions/shake_01.motion3.json @@ -0,0 +1,748 @@ +{ + "Version": 3, + "Meta": { + "Duration": 2.5, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 92, + "TotalPointCount": 254, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + -9, + 1, + 0.044, + -9, + 0.089, + -7.426, + 0.133, + 0, + 1, + 0.2, + 11.14, + 0.267, + 20, + 0.333, + 20, + 1, + 0.456, + 20, + 0.578, + -18, + 0.7, + -18, + 1, + 0.822, + -18, + 0.944, + 16, + 1.067, + 16, + 1, + 1.178, + 16, + 1.289, + -8, + 1.4, + -8, + 1, + 1.489, + -8, + 1.578, + 0, + 1.667, + 0, + 1, + 1.933, + 0, + 2.2, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 14, + 1, + 0.044, + 14, + 0.089, + 30, + 0.133, + 30, + 1, + 0.2, + 30, + 0.267, + 30, + 0.333, + 30, + 1, + 0.456, + 30, + 0.578, + 23.223, + 0.7, + 13, + 1, + 0.822, + 2.777, + 0.944, + -1, + 1.067, + -1, + 1, + 1.178, + -1, + 1.289, + 3, + 1.4, + 3, + 1, + 1.489, + 3, + 1.578, + 0, + 1.667, + 0, + 1, + 1.933, + 0, + 2.2, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.133, + 0, + 0.267, + 30, + 0.4, + 30, + 1, + 0.522, + 30, + 0.644, + -25, + 0.767, + -25, + 1, + 0.889, + -25, + 1.011, + 26, + 1.133, + 26, + 1, + 1.222, + 26, + 1.311, + -10, + 1.4, + -10, + 1, + 1.544, + -10, + 1.689, + 0, + 1.833, + 0, + 1, + 2.044, + 0, + 2.256, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.378, + 0, + 0.756, + 0, + 1.133, + 0, + 1, + 1.311, + 0, + 1.489, + 1, + 1.667, + 1, + 1, + 1.933, + 1, + 2.2, + 1, + 2.467, + 1, + 0, + 2.5, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.378, + 0, + 0.756, + 0, + 1.133, + 0, + 1, + 1.311, + 0, + 1.489, + 1, + 1.667, + 1, + 1, + 1.933, + 1, + 2.2, + 1, + 2.467, + 1, + 0, + 2.5, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 1, + 1, + 0.822, + 1, + 1.644, + 1, + 2.467, + 1, + 0, + 2.5, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 4, + 0.333, + 4, + 1, + 0.456, + 4, + 0.578, + -4, + 0.7, + -4, + 1, + 0.822, + -4, + 0.944, + 3, + 1.067, + 3, + 1, + 1.178, + 3, + 1.289, + -1, + 1.4, + -1, + 1, + 1.489, + -1, + 1.578, + 0, + 1.667, + 0, + 1, + 1.767, + 0, + 1.867, + 0, + 1.967, + 0, + 1, + 2.133, + 0, + 2.3, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.133, + 0, + 0.267, + 10, + 0.4, + 10, + 1, + 0.522, + 10, + 0.644, + -10, + 0.767, + -10, + 1, + 0.889, + -10, + 1.011, + 5, + 1.133, + 5, + 1, + 1.222, + 5, + 1.311, + -3, + 1.4, + -3, + 1, + 1.511, + -3, + 1.622, + 1, + 1.733, + 1, + 1, + 1.978, + 1, + 2.222, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.578, + 0, + 1.156, + 0, + 1.733, + 0, + 1, + 1.978, + 0, + 2.222, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 0.822, + 0, + 1.644, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 0.822, + 50, + 1.644, + 50, + 2.467, + 50, + 0, + 2.5, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 0.822, + 0, + 1.644, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 0.822, + 0, + 1.644, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 0.822, + 0, + 1.644, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 0.044, + 0, + 0.089, + -1, + 0.133, + -1, + 1, + 0.222, + -1, + 0.311, + 1, + 0.4, + 1, + 1, + 0.511, + 1, + 0.622, + -1, + 0.733, + -1, + 1, + 0.811, + -1, + 0.889, + 1, + 0.967, + 1, + 1, + 1.067, + 1, + 1.167, + -1, + 1.267, + -1, + 1, + 1.367, + -1, + 1.467, + 1, + 1.567, + 1, + 1, + 1.667, + 1, + 1.767, + -0.35, + 1.867, + -0.35, + 1, + 1.922, + -0.35, + 1.978, + 0.08, + 2.033, + 0.08, + 1, + 2.1, + 0.08, + 2.167, + -0.08, + 2.233, + -0.08, + 1, + 2.311, + -0.08, + 2.389, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 0.044, + 0, + 0.089, + -0.96, + 0.133, + -0.96, + 1, + 0.222, + -0.96, + 0.311, + 1, + 0.4, + 1, + 1, + 0.511, + 1, + 0.622, + -1, + 0.733, + -1, + 1, + 0.811, + -1, + 0.889, + 1, + 0.967, + 1, + 1, + 1.067, + 1, + 1.167, + -1, + 1.267, + -1, + 1, + 1.367, + -1, + 1.467, + 1, + 1.567, + 1, + 1, + 1.667, + 1, + 1.767, + -0.32, + 1.867, + -0.32, + 1, + 1.922, + -0.32, + 1.978, + 0.07, + 2.033, + 0.07, + 1, + 2.1, + 0.07, + 2.167, + -0.08, + 2.233, + -0.08, + 1, + 2.311, + -0.08, + 2.389, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 0.822, + 0, + 1.644, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 0.822, + 0, + 1.644, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 0.822, + 0, + 1.644, + 0, + 2.467, + 0, + 0, + 2.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 2.5, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/shake_02.motion3.json b/Samples/Resources/Wanko/motions/shake_02.motion3.json new file mode 100644 index 00000000..a850a888 --- /dev/null +++ b/Samples/Resources/Wanko/motions/shake_02.motion3.json @@ -0,0 +1,867 @@ +{ + "Version": 3, + "Meta": { + "Duration": 2.533, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 109, + "TotalPointCount": 305, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.411, + 0, + 0.489, + 0, + 0.567, + 0, + 1, + 0.656, + 0, + 0.744, + 0, + 0.833, + 0, + 1, + 1.389, + 0, + 1.944, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 30, + 1, + 0.111, + 30, + 0.222, + 30, + 0.333, + 30, + 1, + 0.411, + 30, + 0.489, + 30, + 0.567, + 30, + 1, + 0.656, + 30, + 0.744, + 30, + 0.833, + 30, + 1, + 1.389, + 30, + 1.944, + 30, + 2.5, + 30, + 0, + 2.533, + 30 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.033, + 0, + 0.067, + -30, + 0.1, + -30, + 1, + 0.211, + -30, + 0.322, + 30, + 0.433, + 30, + 1, + 0.511, + 30, + 0.589, + -11, + 0.667, + -11, + 1, + 0.756, + -11, + 0.844, + 30, + 0.933, + 30, + 1, + 1.011, + 30, + 1.089, + -14, + 1.167, + -14, + 1, + 1.256, + -14, + 1.344, + 9, + 1.433, + 9, + 1, + 1.522, + 9, + 1.611, + -4, + 1.7, + -4, + 1, + 1.8, + -4, + 1.9, + 0, + 2, + 0, + 1, + 2.167, + 0, + 2.333, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.189, + 0, + 0.378, + 0, + 0.567, + 0, + 1, + 0.844, + 0, + 1.122, + 0, + 1.4, + 0, + 1, + 1.456, + 0, + 1.511, + 1, + 1.567, + 1, + 1, + 1.878, + 1, + 2.189, + 1, + 2.5, + 1, + 0, + 2.533, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.189, + 0, + 0.378, + 0, + 0.567, + 0, + 1, + 0.844, + 0, + 1.122, + 0, + 1.4, + 0, + 1, + 1.456, + 0, + 1.511, + 1, + 1.567, + 1, + 1, + 1.878, + 1, + 2.189, + 1, + 2.5, + 1, + 0, + 2.533, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 0, + 1, + 0.189, + 0, + 0.378, + 0, + 0.567, + 0, + 1, + 0.811, + 0, + 1.056, + 0, + 1.3, + 0, + 1, + 1.333, + 0, + 1.367, + 1, + 1.4, + 1, + 1, + 1.444, + 1, + 1.489, + 0, + 1.533, + 0, + 1, + 1.856, + 0, + 2.178, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.189, + 0, + 0.378, + 0, + 0.567, + 0, + 1, + 1.211, + 0, + 1.856, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + -10, + 1, + 0.111, + -10, + 0.222, + 10, + 0.333, + 10, + 1, + 0.411, + 10, + 0.489, + -10, + 0.567, + -10, + 1, + 0.656, + -10, + 0.744, + 10, + 0.833, + 10, + 1, + 0.956, + 10, + 1.078, + -3, + 1.2, + -3, + 1, + 1.333, + -3, + 1.467, + -3, + 1.6, + -3, + 1, + 1.722, + -3, + 1.844, + 0, + 1.967, + 0, + 1, + 2.144, + 0, + 2.322, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 10, + 1, + 0.067, + 10, + 0.133, + -2, + 0.2, + -2, + 1, + 0.244, + -2, + 0.289, + -2.18, + 0.333, + 0, + 1, + 0.411, + 3.815, + 0.489, + 10, + 0.567, + 10, + 1, + 0.622, + 10, + 0.678, + -2, + 0.733, + -2, + 1, + 0.767, + -2, + 0.8, + -1.988, + 0.833, + 0, + 1, + 0.922, + 5.303, + 1.011, + 10, + 1.1, + 10, + 1, + 1.167, + 10, + 1.233, + -2, + 1.3, + -2, + 1, + 1.333, + -2, + 1.367, + 2, + 1.4, + 2, + 1, + 1.444, + 2, + 1.489, + 0, + 1.533, + 0, + 1, + 1.856, + 0, + 2.178, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 0.833, + 0, + 1.667, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 0.833, + 50, + 1.667, + 50, + 2.5, + 50, + 0, + 2.533, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 0.833, + 0, + 1.667, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 0.833, + 0, + 1.667, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 0.833, + 0, + 1.667, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 0.044, + 0, + 0.089, + 0.65, + 0.133, + 0.65, + 1, + 0.211, + 0.65, + 0.289, + -0.76, + 0.367, + -0.76, + 1, + 0.467, + -0.76, + 0.567, + 1, + 0.667, + 1, + 1, + 0.778, + 1, + 0.889, + -1, + 1, + -1, + 1, + 1.089, + -1, + 1.178, + 1, + 1.267, + 1, + 1, + 1.333, + 1, + 1.4, + 0, + 1.467, + 0, + 1, + 1.522, + 0, + 1.578, + 1, + 1.633, + 1, + 1, + 1.711, + 1, + 1.789, + -0.96, + 1.867, + -0.96, + 1, + 1.922, + -0.96, + 1.978, + 0.17, + 2.033, + 0.17, + 1, + 2.1, + 0.17, + 2.167, + 0, + 2.233, + 0, + 1, + 2.322, + 0, + 2.411, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 0.044, + 0, + 0.089, + 0.81, + 0.133, + 0.81, + 1, + 0.211, + 0.81, + 0.289, + -1, + 0.367, + -1, + 1, + 0.467, + -1, + 0.567, + 1, + 0.667, + 1, + 1, + 0.778, + 1, + 0.889, + -1, + 1, + -1, + 1, + 1.089, + -1, + 1.178, + 1, + 1.267, + 1, + 1, + 1.333, + 1, + 1.4, + 0.721, + 1.467, + 0, + 1, + 1.522, + -0.601, + 1.578, + -1, + 1.633, + -1, + 1, + 1.711, + -1, + 1.789, + 1, + 1.867, + 1, + 1, + 1.922, + 1, + 1.978, + -0.16, + 2.033, + -0.16, + 1, + 2.1, + -0.16, + 2.167, + 0, + 2.233, + 0, + 1, + 2.322, + 0, + 2.411, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 0.189, + 0, + 0.378, + 0, + 0.567, + 0, + 1, + 0.822, + 0, + 1.078, + 0, + 1.333, + 0, + 1, + 1.378, + 0, + 1.422, + 1, + 1.467, + 1, + 1, + 1.5, + 1, + 1.533, + 0, + 1.567, + 0, + 1, + 1.878, + 0, + 2.189, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 0.189, + 0, + 0.378, + 0, + 0.567, + 0, + 1, + 0.822, + 0, + 1.078, + 0, + 1.333, + 0, + 1, + 1.378, + 0, + 1.422, + 1, + 1.467, + 1, + 1, + 1.5, + 1, + 1.533, + 0, + 1.567, + 0, + 1, + 1.878, + 0, + 2.189, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 0.833, + 0, + 1.667, + 0, + 2.5, + 0, + 0, + 2.533, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 2.533, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/touch_01.motion3.json b/Samples/Resources/Wanko/motions/touch_01.motion3.json new file mode 100644 index 00000000..5f0ab46e --- /dev/null +++ b/Samples/Resources/Wanko/motions/touch_01.motion3.json @@ -0,0 +1,594 @@ +{ + "Version": 3, + "Meta": { + "Duration": 2, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 70, + "TotalPointCount": 188, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.622, + 0, + 0.878, + 0, + 1.133, + 0, + 1, + 1.411, + 0, + 1.689, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.422, + 0, + 0.478, + 30, + 0.533, + 30, + 1, + 0.633, + 30, + 0.733, + 0, + 0.833, + 0, + 1, + 0.933, + 0, + 1.033, + 0, + 1.133, + 0, + 1, + 1.411, + 0, + 1.689, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.522, + 0, + 0.678, + 30, + 0.833, + 30, + 1, + 0.933, + 30, + 1.033, + 30, + 1.133, + 30, + 1, + 1.411, + 30, + 1.689, + 30, + 1.967, + 30, + 0, + 2, + 30 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 1, + 1, + 0.656, + 1, + 1.311, + 1, + 1.967, + 1, + 0, + 2, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 1, + 1, + 0.656, + 1, + 1.311, + 1, + 1.967, + 1, + 0, + 2, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 1, + 1, + 0.656, + 1, + 1.311, + 1, + 1.967, + 1, + 0, + 2, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.522, + 0, + 0.678, + 2, + 0.833, + 2, + 1, + 0.933, + 2, + 1.033, + 2, + 1.133, + 2, + 1, + 1.411, + 2, + 1.689, + 2, + 1.967, + 2, + 0, + 2, + 2 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.378, + 0, + 0.756, + 0, + 1.133, + 0, + 1, + 1.411, + 0, + 1.689, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.422, + 0, + 0.478, + 6, + 0.533, + 6, + 1, + 0.633, + 6, + 0.733, + 0, + 0.833, + 0, + 1, + 0.933, + 0, + 1.033, + 0, + 1.133, + 0, + 1, + 1.411, + 0, + 1.689, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 0.656, + 50, + 1.311, + 50, + 1.967, + 50, + 0, + 2, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.444, + 0, + 0.522, + 1, + 0.6, + 1, + 1, + 0.667, + 1, + 0.733, + -1, + 0.8, + -1, + 1, + 0.856, + -1, + 0.911, + 0.31, + 0.967, + 0.31, + 1, + 1.022, + 0.31, + 1.078, + -0.2, + 1.133, + -0.2, + 1, + 1.2, + -0.2, + 1.267, + 0, + 1.333, + 0, + 1, + 1.544, + 0, + 1.756, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.444, + 0, + 0.522, + -1, + 0.6, + -1, + 1, + 0.667, + -1, + 0.733, + 1, + 0.8, + 1, + 1, + 0.856, + 1, + 0.911, + -0.34, + 0.967, + -0.34, + 1, + 1.022, + -0.34, + 1.078, + 0.16, + 1.133, + 0.16, + 1, + 1.2, + 0.16, + 1.267, + 0, + 1.333, + 0, + 1, + 1.544, + 0, + 1.756, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/touch_02.motion3.json b/Samples/Resources/Wanko/motions/touch_02.motion3.json new file mode 100644 index 00000000..06b11f9a --- /dev/null +++ b/Samples/Resources/Wanko/motions/touch_02.motion3.json @@ -0,0 +1,699 @@ +{ + "Version": 3, + "Meta": { + "Duration": 2, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 85, + "TotalPointCount": 233, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.389, + 0, + 0.444, + 0, + 0.5, + 0, + 1, + 0.589, + 0, + 0.678, + 0, + 0.767, + 0, + 1, + 0.878, + 0, + 0.989, + 0, + 1.1, + 0, + 1, + 1.389, + 0, + 1.678, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.389, + 0, + 0.444, + 25, + 0.5, + 25, + 1, + 0.589, + 25, + 0.678, + 0, + 0.767, + 0, + 1, + 0.878, + 0, + 0.989, + 0, + 1.1, + 0, + 1, + 1.389, + 0, + 1.678, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.389, + 0, + 0.444, + 7, + 0.5, + 7, + 1, + 0.589, + 7, + 0.678, + 0, + 0.767, + 0, + 1, + 0.878, + 0, + 0.989, + 0, + 1.1, + 0, + 1, + 1.389, + 0, + 1.678, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.589, + 0, + 0.844, + 0, + 1.1, + 0, + 1, + 1.389, + 0, + 1.678, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.589, + 0, + 0.844, + 0, + 1.1, + 0, + 1, + 1.389, + 0, + 1.678, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.389, + 0, + 0.444, + 7, + 0.5, + 7, + 1, + 0.589, + 7, + 0.678, + -3, + 0.767, + -3, + 1, + 0.833, + -3, + 0.9, + 1, + 0.967, + 1, + 1, + 1.011, + 1, + 1.056, + -1, + 1.1, + -1, + 1, + 1.178, + -1, + 1.256, + 0, + 1.333, + 0, + 1, + 1.544, + 0, + 1.756, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.389, + 0, + 0.444, + 8, + 0.5, + 8, + 1, + 0.589, + 8, + 0.678, + -3, + 0.767, + -3, + 1, + 0.833, + -3, + 0.9, + 1, + 0.967, + 1, + 1, + 1.011, + 1, + 1.056, + -1, + 1.1, + -1, + 1, + 1.178, + -1, + 1.256, + 0, + 1.333, + 0, + 1, + 1.544, + 0, + 1.756, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 0.656, + 50, + 1.311, + 50, + 1.967, + 50, + 0, + 2, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.422, + 0, + 0.511, + 1, + 0.6, + 1, + 1, + 0.678, + 1, + 0.756, + -1, + 0.833, + -1, + 1, + 0.911, + -1, + 0.989, + 0.67, + 1.067, + 0.67, + 1, + 1.122, + 0.67, + 1.178, + -0.48, + 1.233, + -0.48, + 1, + 1.3, + -0.48, + 1.367, + 0, + 1.433, + 0, + 1, + 1.611, + 0, + 1.789, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.422, + 0, + 0.511, + -1, + 0.6, + -1, + 1, + 0.678, + -1, + 0.756, + 1, + 0.833, + 1, + 1, + 0.911, + 1, + 0.989, + -0.53, + 1.067, + -0.53, + 1, + 1.122, + -0.53, + 1.178, + 0.47, + 1.233, + 0.47, + 1, + 1.3, + 0.47, + 1.367, + 0, + 1.433, + 0, + 1, + 1.611, + 0, + 1.789, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.589, + 0, + 0.844, + 0, + 1.1, + 0, + 1, + 1.389, + 0, + 1.678, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.589, + 0, + 0.844, + 0, + 1.1, + 0, + 1, + 1.389, + 0, + 1.678, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/touch_03.motion3.json b/Samples/Resources/Wanko/motions/touch_03.motion3.json new file mode 100644 index 00000000..cdfb4c50 --- /dev/null +++ b/Samples/Resources/Wanko/motions/touch_03.motion3.json @@ -0,0 +1,643 @@ +{ + "Version": 3, + "Meta": { + "Duration": 2, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 77, + "TotalPointCount": 209, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + -3, + 1, + 0.133, + -3, + 0.267, + -3, + 0.4, + -3, + 1, + 0.467, + -3, + 0.533, + 17, + 0.6, + 17, + 1, + 0.656, + 17, + 0.711, + -22, + 0.767, + -22, + 1, + 0.833, + -22, + 0.9, + 9, + 0.967, + 9, + 1, + 1.033, + 9, + 1.1, + 0, + 1.167, + 0, + 1, + 1.433, + 0, + 1.7, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 15, + 1, + 0.133, + 15, + 0.267, + 15, + 0.4, + 15, + 1, + 0.467, + 15, + 0.533, + 17, + 0.6, + 17, + 1, + 0.789, + 17, + 0.978, + 0, + 1.167, + 0, + 1, + 1.433, + 0, + 1.7, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.133, + 0, + 0.267, + 0, + 0.4, + 0, + 1, + 0.922, + 0, + 1.444, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.133, + 0, + 0.267, + 0, + 0.4, + 0, + 1, + 0.922, + 0, + 1.444, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 1, + 1, + 0.656, + 1, + 1.311, + 1, + 1.967, + 1, + 0, + 2, + 1 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.133, + 0, + 0.267, + 0, + 0.4, + 0, + 1, + 0.467, + 0, + 0.533, + -3, + 0.6, + -3, + 1, + 0.656, + -3, + 0.711, + 2, + 0.767, + 2, + 1, + 0.833, + 2, + 0.9, + -1, + 0.967, + -1, + 1, + 1.033, + -1, + 1.1, + 0, + 1.167, + 0, + 1, + 1.433, + 0, + 1.7, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.133, + 0, + 0.267, + 0, + 0.4, + 0, + 1, + 0.467, + 0, + 0.533, + 7, + 0.6, + 7, + 1, + 0.656, + 7, + 0.711, + -2, + 0.767, + -2, + 1, + 0.833, + -2, + 0.9, + 1, + 0.967, + 1, + 1, + 1.033, + 1, + 1.1, + 0, + 1.167, + 0, + 1, + 1.433, + 0, + 1.7, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.133, + 0, + 0.267, + 0, + 0.4, + 0, + 1, + 0.656, + 0, + 0.911, + -3, + 1.167, + -3, + 1, + 1.433, + -3, + 1.7, + -3, + 1.967, + -3, + 0, + 2, + -3 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 0.656, + 50, + 1.311, + 50, + 1.967, + 50, + 0, + 2, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 0.189, + 0, + 0.378, + 0, + 0.567, + 0, + 1, + 0.611, + 0, + 0.656, + 1, + 0.7, + 1, + 1, + 0.767, + 1, + 0.833, + -0.94, + 0.9, + -0.94, + 1, + 0.956, + -0.94, + 1.011, + 0.49, + 1.067, + 0.49, + 1, + 1.144, + 0.49, + 1.222, + -0.4, + 1.3, + -0.4, + 1, + 1.367, + -0.4, + 1.433, + 0, + 1.5, + 0, + 1, + 1.656, + 0, + 1.811, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 0.189, + 0, + 0.378, + 0, + 0.567, + 0, + 1, + 0.611, + 0, + 0.656, + -1, + 0.7, + -1, + 1, + 0.767, + -1, + 0.833, + 1, + 0.9, + 1, + 1, + 0.956, + 1, + 1.011, + -0.43, + 1.067, + -0.43, + 1, + 1.144, + -0.43, + 1.222, + 0.34, + 1.3, + 0.34, + 1, + 1.367, + 0.34, + 1.433, + 0, + 1.5, + 0, + 1, + 1.656, + 0, + 1.811, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 0.133, + 0, + 0.267, + 0, + 0.4, + 0, + 1, + 0.922, + 0, + 1.444, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 0.133, + 0, + 0.267, + 0, + 0.4, + 0, + 1, + 0.922, + 0, + 1.444, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/touch_04.motion3.json b/Samples/Resources/Wanko/motions/touch_04.motion3.json new file mode 100644 index 00000000..e2b7725f --- /dev/null +++ b/Samples/Resources/Wanko/motions/touch_04.motion3.json @@ -0,0 +1,615 @@ +{ + "Version": 3, + "Meta": { + "Duration": 2, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 73, + "TotalPointCount": 197, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.144, + 0, + 0.289, + 0, + 0.433, + 0, + 1, + 0.5, + 0, + 0.567, + 0, + 0.633, + 0, + 1, + 0.844, + 0, + 1.056, + 0, + 1.267, + 0, + 1, + 1.5, + 0, + 1.733, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.144, + 0, + 0.289, + 0, + 0.433, + 0, + 1, + 0.5, + 0, + 0.567, + -11, + 0.633, + -11, + 1, + 0.733, + -11, + 0.833, + 10, + 0.933, + 10, + 1, + 1.044, + 10, + 1.156, + 0, + 1.267, + 0, + 1, + 1.5, + 0, + 1.733, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.144, + 0, + 0.289, + 0, + 0.433, + 0, + 1, + 0.711, + 0, + 0.989, + 0, + 1.267, + 0, + 1, + 1.5, + 0, + 1.733, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.144, + 0, + 0.289, + 0, + 0.433, + 0, + 1, + 0.711, + 0, + 0.989, + 0, + 1.267, + 0, + 1, + 1.5, + 0, + 1.733, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 0, + 1, + 0.144, + 0, + 0.289, + 0, + 0.433, + 0, + 1, + 0.6, + 0, + 0.767, + 0, + 0.933, + 0, + 1, + 1.044, + 0, + 1.156, + 0, + 1.267, + 0, + 1, + 1.5, + 0, + 1.733, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.144, + 0, + 0.289, + 0, + 0.433, + 0, + 1, + 0.5, + 0, + 0.567, + -6, + 0.633, + -6, + 1, + 0.733, + -6, + 0.833, + 4, + 0.933, + 4, + 1, + 1.044, + 4, + 1.156, + 0, + 1.267, + 0, + 1, + 1.5, + 0, + 1.733, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 0.656, + 50, + 1.311, + 50, + 1.967, + 50, + 0, + 2, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.444, + 0, + 0.522, + 1, + 0.6, + 1, + 1, + 0.678, + 1, + 0.756, + -1, + 0.833, + -1, + 1, + 0.911, + -1, + 0.989, + 0.8, + 1.067, + 0.8, + 1, + 1.122, + 0.8, + 1.178, + -0.13, + 1.233, + -0.13, + 1, + 1.289, + -0.13, + 1.344, + 0, + 1.4, + 0, + 1, + 1.589, + 0, + 1.778, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 0.122, + 0, + 0.244, + 0, + 0.367, + 0, + 1, + 0.444, + 0, + 0.522, + -1, + 0.6, + -1, + 1, + 0.678, + -1, + 0.756, + 1, + 0.833, + 1, + 1, + 0.911, + 1, + 0.989, + -0.81, + 1.067, + -0.81, + 1, + 1.122, + -0.81, + 1.178, + 0.11, + 1.233, + 0.11, + 1, + 1.289, + 0.11, + 1.344, + 0, + 1.4, + 0, + 1, + 1.589, + 0, + 1.778, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 0.211, + 0, + 0.422, + 0, + 0.633, + 0, + 1, + 1.078, + 0, + 1.522, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 0.211, + 0, + 0.422, + 0, + 0.633, + 0, + 1, + 1.078, + 0, + 1.522, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 0.656, + 0, + 1.311, + 0, + 1.967, + 0, + 0, + 2, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 2, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/touch_05.motion3.json b/Samples/Resources/Wanko/motions/touch_05.motion3.json new file mode 100644 index 00000000..6e714e0b --- /dev/null +++ b/Samples/Resources/Wanko/motions/touch_05.motion3.json @@ -0,0 +1,510 @@ +{ + "Version": 3, + "Meta": { + "Duration": 1.5, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 58, + "TotalPointCount": 152, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.067, + 0, + 0.133, + 0, + 0.2, + 0, + 1, + 0.4, + 0, + 0.6, + 0, + 0.8, + 0, + 1, + 1.022, + 0, + 1.244, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + -11, + 1, + 0.067, + -11, + 0.133, + -11, + 0.2, + -11, + 1, + 0.3, + -11, + 0.4, + 10, + 0.5, + 10, + 1, + 0.6, + 10, + 0.7, + 0, + 0.8, + 0, + 1, + 1.022, + 0, + 1.244, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.489, + 0, + 0.978, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.067, + 0, + 0.133, + 0, + 0.2, + 0, + 1, + 0.4, + 0, + 0.6, + 0, + 0.8, + 0, + 1, + 1.022, + 0, + 1.244, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.067, + 0, + 0.133, + 0, + 0.2, + 0, + 1, + 0.4, + 0, + 0.6, + 0, + 0.8, + 0, + 1, + 1.022, + 0, + 1.244, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 0, + 1, + 0.067, + 0, + 0.133, + 0, + 0.2, + 0, + 1, + 0.3, + 0, + 0.4, + 0, + 0.5, + 0, + 1, + 0.6, + 0, + 0.7, + 0, + 0.8, + 0, + 1, + 1.022, + 0, + 1.244, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.489, + 0, + 0.978, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.489, + 0, + 0.978, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.067, + 0, + 0.133, + 0, + 0.2, + 0, + 1, + 0.3, + 0, + 0.4, + 4, + 0.5, + 4, + 1, + 0.6, + 4, + 0.7, + 0, + 0.8, + 0, + 1, + 1.022, + 0, + 1.244, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 0.489, + 0, + 0.978, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 0.489, + 50, + 0.978, + 50, + 1.467, + 50, + 0, + 1.5, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 0.489, + 0, + 0.978, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 0.489, + 0, + 0.978, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 0.489, + 0, + 0.978, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 0.489, + 0, + 0.978, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 0.489, + 0, + 0.978, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 0.067, + 0, + 0.133, + 0, + 0.2, + 0, + 1, + 0.622, + 0, + 1.044, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 0.067, + 0, + 0.133, + 0, + 0.2, + 0, + 1, + 0.622, + 0, + 1.044, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 0.489, + 0, + 0.978, + 0, + 1.467, + 0, + 0, + 1.5, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 1.5, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Resources/Wanko/motions/touch_06.motion3.json b/Samples/Resources/Wanko/motions/touch_06.motion3.json new file mode 100644 index 00000000..3d890c2e --- /dev/null +++ b/Samples/Resources/Wanko/motions/touch_06.motion3.json @@ -0,0 +1,720 @@ +{ + "Version": 3, + "Meta": { + "Duration": 1.867, + "Fps": 30.0, + "Loop": true, + "AreBeziersRestricted": true, + "CurveCount": 22, + "TotalSegmentCount": 88, + "TotalPointCount": 242, + "UserDataCount": 0, + "TotalUserDataSize": 0 + }, + "Curves": [ + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.456, + 0, + 0.578, + 3, + 0.7, + 3, + 1, + 0.778, + 3, + 0.856, + -2, + 0.933, + -2, + 1, + 1.233, + -2, + 1.533, + -2, + 1.833, + -2, + 0, + 1.867, + -2 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.378, + 0, + 0.422, + 18, + 0.467, + 18, + 1, + 0.544, + 18, + 0.622, + -30, + 0.7, + -30, + 1, + 0.778, + -30, + 0.856, + -13, + 0.933, + -13, + 1, + 1.011, + -13, + 1.089, + -30, + 1.167, + -30, + 1, + 1.389, + -30, + 1.611, + -30, + 1.833, + -30, + 0, + 1.867, + -30 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.456, + 0, + 0.578, + -7.716, + 0.7, + -17, + 1, + 0.778, + -22.908, + 0.856, + -24, + 0.933, + -24, + 1, + 1.233, + -24, + 1.533, + -24, + 1.833, + -24, + 0, + 1.867, + -24 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_L_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.456, + 0, + 0.578, + 0, + 0.7, + 0, + 1, + 0.778, + 0, + 0.856, + 0, + 0.933, + 0, + 1, + 1.233, + 0, + 1.533, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EYE_R_OPEN", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.456, + 0, + 0.578, + 0, + 0.7, + 0, + 1, + 0.778, + 0, + 0.856, + 0, + 0.933, + 0, + 1, + 1.233, + 0, + 1.533, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_MOUTH_OPEN_Y", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.456, + 0, + 0.578, + 0, + 0.7, + 0, + 1, + 0.778, + 0, + 0.856, + 0, + 0.933, + 0, + 1, + 1.233, + 0, + 1.533, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_X", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.611, + 0, + 0.889, + -6, + 1.167, + -6, + 1, + 1.389, + -6, + 1.611, + -6, + 1.833, + -6, + 0, + 1.867, + -6 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Z", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.456, + 0, + 0.578, + -2, + 0.7, + -2, + 1, + 0.778, + -2, + 0.856, + -2, + 0.933, + -2, + 1, + 1.233, + -2, + 1.533, + -2, + 1.833, + -2, + 0, + 1.867, + -2 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BODY_ANGLE_Y", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.378, + 0, + 0.422, + 3, + 0.467, + 3, + 1, + 0.544, + 3, + 0.622, + -6, + 0.7, + -6, + 1, + 0.778, + -6, + 0.856, + -6, + 0.933, + -6, + 1, + 1.233, + -6, + 1.533, + -6, + 1.833, + -6, + 0, + 1.867, + -6 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BREATH", + "Segments": [ + 0, + 0, + 1, + 0.611, + 0, + 1.222, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_LID", + "Segments": [ + 0, + 50, + 1, + 0.611, + 50, + 1.222, + 50, + 1.833, + 50, + 0, + 1.867, + 50 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_01", + "Segments": [ + 0, + 0, + 1, + 0.611, + 0, + 1.222, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_YUGE_02", + "Segments": [ + 0, + 0, + 1, + 0.611, + 0, + 1.222, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EFFECT", + "Segments": [ + 0, + 0, + 1, + 0.611, + 0, + 1.222, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_L", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.389, + 0, + 0.444, + -1, + 0.5, + -1, + 1, + 0.556, + -1, + 0.611, + 1, + 0.667, + 1, + 1, + 0.733, + 1, + 0.8, + -0.95, + 0.867, + -0.95, + 1, + 0.922, + -0.95, + 0.978, + 0.45, + 1.033, + 0.45, + 1, + 1.089, + 0.45, + 1.144, + -0.17, + 1.2, + -0.17, + 1, + 1.267, + -0.17, + 1.333, + 0, + 1.4, + 0, + 1, + 1.544, + 0, + 1.689, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_EAR_R", + "Segments": [ + 0, + 0, + 1, + 0.111, + 0, + 0.222, + 0, + 0.333, + 0, + 1, + 0.389, + 0, + 0.444, + 1, + 0.5, + 1, + 1, + 0.556, + 1, + 0.611, + -1, + 0.667, + -1, + 1, + 0.733, + -1, + 0.8, + 1, + 0.867, + 1, + 1, + 0.922, + 1, + 0.978, + -0.39, + 1.033, + -0.39, + 1, + 1.089, + -0.39, + 1.144, + 0.13, + 1.2, + 0.13, + 1, + 1.267, + 0.13, + 1.333, + 0, + 1.4, + 0, + 1, + 1.544, + 0, + 1.689, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_L", + "Segments": [ + 0, + 0, + 1, + 0.233, + 0, + 0.467, + 0, + 0.7, + 0, + 1, + 0.778, + 0, + 0.856, + 0, + 0.933, + 0, + 1, + 1.233, + 0, + 1.533, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_HAND_R", + "Segments": [ + 0, + 0, + 1, + 0.233, + 0, + 0.467, + 0, + 0.7, + 0, + 1, + 0.778, + 0, + 0.856, + 0, + 0.933, + 0, + 1, + 1.233, + 0, + 1.533, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_SWING", + "Segments": [ + 0, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BOWL_SWING", + "Segments": [ + 0, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_FACE_01", + "Segments": [ + 0, + 0, + 1, + 0.611, + 0, + 1.222, + 0, + 1.833, + 0, + 0, + 1.867, + 0 + ] + }, + { + "Target": "Parameter", + "Id": "PARAM_BASE_X", + "Segments": [ + 0, + 0, + 0, + 1.867, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/Samples/Vulkan/.editorconfig b/Samples/Vulkan/.editorconfig new file mode 100644 index 00000000..9dec06a3 --- /dev/null +++ b/Samples/Vulkan/.editorconfig @@ -0,0 +1,2 @@ +[/Demo/proj.win.cmake/src/**/*.{cpp,hpp}] +charset = utf-8-bom diff --git a/Samples/Vulkan/Demo/proj.win.cmake/CMakeLists.txt b/Samples/Vulkan/Demo/proj.win.cmake/CMakeLists.txt new file mode 100644 index 00000000..6bce0ace --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/CMakeLists.txt @@ -0,0 +1,175 @@ +# find_package does not find Vulkan unless the version of cmake is 3.7 or higher. +cmake_minimum_required(VERSION 3.17) + +option( + CORE_CRL_MD + "Use Cubism Core that is multithread-specific and DLL-specific version" + OFF +) + +# Set app name. +set(APP_NAME Demo) +# Set directory paths. +set(SDK_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../..) +set(CORE_PATH ${SDK_ROOT_PATH}/Core) +set(FRAMEWORK_PATH ${SDK_ROOT_PATH}/Framework) +set(THIRD_PARTY_PATH ${SDK_ROOT_PATH}/Samples/Vulkan/thirdParty) +set(STB_PATH ${THIRD_PARTY_PATH}/stb) +set(GLFW_PATH ${THIRD_PARTY_PATH}/glfw) +set(RES_PATH ${SDK_ROOT_PATH}/Samples/Resources) +set(SAMPLE_SHADER_PATH ${SDK_ROOT_PATH}/Samples/Vulkan/Shaders) +set(FRAMEWORK_SHADER_PATH ${FRAMEWORK_PATH}/src/Rendering/Vulkan/Shaders) + +# Set project. +project(${APP_NAME}) + +# Set Visual Studio startup project. +set_property(DIRECTORY PROPERTY VS_STARTUP_PROJECT ${APP_NAME}) + +# Define output directory. +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin/${APP_NAME}) +# Set configuration (Release and Debug only). +set(CMAKE_CONFIGURATION_TYPES Debug Release + CACHE STRING "Configurations" FORCE +) +# Suppress generation of ZERO_CHECK project. +set(CMAKE_SUPPRESS_REGENERATION ON) + +# Surpress GLFW process. +set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE) +set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE) +set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE) +set(GLFW_INSTALL OFF CACHE BOOL "" FORCE) +set(BUILD_UTILS OFF CACHE BOOL "" FORCE) + +# Specify version of compiler. +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# Detect architecture. +if(CMAKE_EXE_LINKER_FLAGS STREQUAL "/machine:x64") + set(ARCH x86_64) +elseif(CMAKE_EXE_LINKER_FLAGS STREQUAL "/machine:X86") + set(ARCH x86) +else() + message(FATAL_ERROR "[${APP_NAME}] Invalid linker flag ${CMAKE_EXE_LINKER_FLAGS}.") +endif() +# Detect compiler. +if(MSVC_VERSION MATCHES 1800) + # Visual Studio 2013 + set(COMPILER 120) +elseif(MSVC_VERSION MATCHES 1900) + # Visual Studio 2015 + set(COMPILER 140) +elseif(MSVC_VERSION GREATER_EQUAL 1910 AND MSVC_VERSION LESS 1920) + # Visual Studio 2017 + set(COMPILER 141) +elseif(MSVC_VERSION GREATER_EQUAL 1920 AND MSVC_VERSION LESS 1930) + # Visual Studio 2019 + set(COMPILER 142) +elseif(MSVC_VERSION GREATER_EQUAL 1930 AND MSVC_VERSION LESS 1940) + # Visual Studio 2022 + set(COMPILER 143) +elseif(MSVC) + message(FATAL_ERROR "[${APP_NAME}] Unsupported Visual C++ compiler used.") +else() + message(FATAL_ERROR "[${APP_NAME}] Unsupported compiler used.") +endif() +# Detect core crt. +if(CORE_CRL_MD) + set(CRT MD) +else() + set(CRT MT) +endif() + +# Add Cubism Core. +# Import as static library. +add_library(Live2DCubismCore STATIC IMPORTED) +# Find library path. +set(CORE_LIB_SUFFIX ${CORE_PATH}/lib/windows/${ARCH}/${COMPILER}) +set_target_properties(Live2DCubismCore + PROPERTIES + IMPORTED_LOCATION_DEBUG + ${CORE_LIB_SUFFIX}/Live2DCubismCore_${CRT}d.lib + IMPORTED_LOCATION_RELEASE + ${CORE_LIB_SUFFIX}/Live2DCubismCore_${CRT}.lib + INTERFACE_INCLUDE_DIRECTORIES ${CORE_PATH}/include +) + +# Add GLFW. +add_subdirectory(${GLFW_PATH} ${CMAKE_CURRENT_BINARY_DIR}/glfw) + +# Specify Cubism Framework rendering. +set(FRAMEWORK_SOURCE Vulkan) +# Add Cubism Native Framework. +add_subdirectory(${FRAMEWORK_PATH} ${CMAKE_CURRENT_BINARY_DIR}/Framework) +# Add include path of GLEW to framework. +# Link libraries to framework. +target_link_libraries(Framework Live2DCubismCore) + +# Find vulkan libraries. +find_package(Vulkan REQUIRED) + +# Make executable app. +add_executable(${APP_NAME}) +# Add source files. +add_subdirectory(src) +# Add shader files. +add_subdirectory(${SAMPLE_SHADER_PATH} ${CMAKE_CURRENT_BINARY_DIR}/SampleShaders) +add_subdirectory(${FRAMEWORK_SHADER_PATH} ${CMAKE_CURRENT_BINARY_DIR}/FrameworkShaders) +add_dependencies(${APP_NAME} SampleShaders) +add_dependencies(${APP_NAME} FrameworkShaders) + +# Link libraries to app. +target_link_libraries(${APP_NAME} + Framework + glfw + ${Vulkan_LIBRARIES} + # Solve the MSVCRT confliction. + debug -NODEFAULTLIB:libcmtd.lib + optimized -NODEFAULTLIB:libcmt.lib +) +# Specify include directories. +target_include_directories(${APP_NAME} PRIVATE ${STB_PATH}) +target_include_directories(${APP_NAME} PRIVATE ${Vulkan_INCLUDE_DIRS}) + +# Link libraries to framework. +target_include_directories(Framework PUBLIC ${Vulkan_INCLUDE_DIRS}) +# Link libraries to framework. +target_link_libraries(Framework Live2DCubismCore ${Vulkan_LIBRARIES}) + +# Build in multi-process. +target_compile_options(${APP_NAME} PRIVATE /MP) + +# Copy resource directory to build directory. +add_custom_command( + TARGET ${APP_NAME} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory ${RES_PATH} $/Resources + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/SampleShaders/compiledShaders $/SampleShaders + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/FrameworkShaders/compiledShaders $/FrameworkShaders +) + +# Set project properties. +set_target_properties(${APP_NAME} PROPERTIES + VS_DEBUGGER_WORKING_DIRECTORY + ${CMAKE_CURRENT_BINARY_DIR}/bin/${APP_NAME}/${CMAKE_CFG_INTDIR} +) + +# You can change target that renderer draws by enabling following definition. +# +# * USE_RENDER_TARGET +# Renderer draws to target of LAppView. +# * USE_MODEL_RENDER_TARGET +# Renderer draws to target of each LAppModel. +# * default +# Renderer draws to default main framebuffer. +# +# INFO: USE_RENDER_TARGET has higher priority than USE_MODEL_RENDER_TARGET. +# +# target_compile_definitions(${APP_NAME} +# PRIVATE +# USE_RENDER_TARGET +# USE_MODEL_RENDER_TARGET +# ) diff --git a/Samples/Vulkan/Demo/proj.win.cmake/scripts/_msvc_common.bat b/Samples/Vulkan/Demo/proj.win.cmake/scripts/_msvc_common.bat new file mode 100644 index 00000000..a1fb6f50 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/scripts/_msvc_common.bat @@ -0,0 +1,108 @@ +@echo off + +setlocal +set VARIABLE_EXISTS=TRUE +if "%MSVC_VERSION%" equ "" set VARIABLE_EXISTS=FALSE +if "%MSVC_NUMBER%" equ "" set VARIABLE_EXISTS=FALSE +if "%VCVARSALL%" equ "" set VARIABLE_EXISTS=FALSE +if "%GENERATOR%" equ "" set VARIABLE_EXISTS=FALSE +if "%VARIABLE_EXISTS%" equ "FALSE" ( + echo [CubismNativeSamples] Invalid batch call. + exit /b 1 +) +endlocal + +cd %~dp0 + +rem ============== +rem Dialog Options +rem ============== + +rem Architecture selection +echo. +echo Select which architecture to use. +echo ************************************************** +echo 1. x86 (Win32) +echo 2. x64 (Win64) +echo. +choice /c:12 /n /m ">" +set SELECTED=%errorlevel% +if "%SELECTED%" equ "1" ( + set ARCHITECTURE=x86 + set CMAKE_A_OPTION=Win32 +) else if "%SELECTED%" equ "2" ( + set ARCHITECTURE=x64 + set CMAKE_A_OPTION=x64 +) else ( + echo [CubismNativeSamples] Invalid option. + exit /b 1 +) + +rem Core C Runtime selection +echo. +echo Select which cubism core c runtime library to use +echo ************************************************** +echo 1. use the multithread-specific and DLL-specific version of the run-time library (MD) +echo 2. use the multithread, static version of the run-time library (MT) +echo. +choice /c:12 /n /m ">" +set SELECTED=%errorlevel% +if "%SELECTED%" equ "1" ( + set CORE_CRL_MD=ON +) else if "%SELECTED%" equ "2" ( + set CORE_CRL_MD=OFF +) else ( + echo [CubismNativeSamples] Invalid option. + exit /b 1 +) + +rem ======== +rem Validate +rem ======== + +rem Make sure toolchain exists. +if not exist "%VCVARSALL%" ( + echo [CubismNativeSamples] Visual C++ Compiler %MSVC_VERSION% not found. + exit /b 1 +) + +rem ===== +rem Build +rem ===== + +rem Execute build. +echo Building %ARCHITECTURE% with Visual C++ Compiler %MSVC_VERSION%... + +rem Initialize Visual Studio toolchain. +call "%VCVARSALL%" %ARCHITECTURE% +if %errorlevel% neq 0 exit /b %errorlevel% + +rem Build for native development. +if "%CORE_CRL_MD%" equ "ON" ( + set CORE_CRL=md +) else ( + set CORE_CRL=mt +) + +set BUILD_PATH=..\build\%GENERATOR%_msvc%MSVC_VERSION%_%ARCHITECTURE%_%CORE_CRL% + +if "%GENERATOR%" equ "nmake" ( + cmake -S .. -B "%BUILD_PATH%" ^ + -G "NMake Makefiles" ^ + -D CMAKE_BUILD_TYPE="Release" ^ + -D CORE_CRL_MD=%CORE_CRL_MD% + if %errorlevel% neq 0 exit /b %errorlevel% + cd "%BUILD_PATH%" && nmake + if %errorlevel% neq 0 exit /b %errorlevel% +) else if "%GENERATOR%" equ "proj" ( + cmake -S .. -B "%BUILD_PATH%" ^ + -G "Visual Studio %MSVC_NUMBER% %MSVC_VERSION%" ^ + -A %CMAKE_A_OPTION% ^ + -D CORE_CRL_MD=%CORE_CRL_MD% + if %errorlevel% neq 0 exit /b %errorlevel% +) else ( + echo [CubismNativeSamples] Invalid option. + goto :error +) + +exit /b 0 diff --git a/Samples/Vulkan/Demo/proj.win.cmake/scripts/nmake_msvc2019.bat b/Samples/Vulkan/Demo/proj.win.cmake/scripts/nmake_msvc2019.bat new file mode 100644 index 00000000..e9975573 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/scripts/nmake_msvc2019.bat @@ -0,0 +1,19 @@ +@echo off + +setlocal + +set SCRIPT_PATH=%~dp0 +set MSVC_VERSION=2019 +set MSVC_NUMBER=16 +set VSWHERE=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe +set /a _MSVC_RANGE_S=MSVC_NUMBER +set /a _MSVC_RANGE_E=MSVC_NUMBER+1 +for /f "usebackq tokens=*" %%i in (`"%VSWHERE%" -legacy -version [%_MSVC_RANGE_S%^,%_MSVC_RANGE_E%^) -property installationPath`) do ( + set VCVARSALL=%%i\VC\Auxiliary\Build\vcvarsall.bat +) +set GENERATOR=nmake + +call "%SCRIPT_PATH%_msvc_common.bat" +if %errorlevel% neq 0 pause & exit /b %errorlevel% + +pause & exit /b 0 diff --git a/Samples/Vulkan/Demo/proj.win.cmake/scripts/nmake_msvc2022.bat b/Samples/Vulkan/Demo/proj.win.cmake/scripts/nmake_msvc2022.bat new file mode 100644 index 00000000..bc6e1282 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/scripts/nmake_msvc2022.bat @@ -0,0 +1,19 @@ +@echo off + +setlocal + +set SCRIPT_PATH=%~dp0 +set MSVC_VERSION=2022 +set MSVC_NUMBER=17 +set VSWHERE=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe +set /a _MSVC_RANGE_S=MSVC_NUMBER +set /a _MSVC_RANGE_E=MSVC_NUMBER+1 +for /f "usebackq tokens=*" %%i in (`"%VSWHERE%" -legacy -version [%_MSVC_RANGE_S%^,%_MSVC_RANGE_E%^) -property installationPath`) do ( + set VCVARSALL=%%i\VC\Auxiliary\Build\vcvarsall.bat +) +set GENERATOR=nmake + +call "%SCRIPT_PATH%_msvc_common.bat" +if %errorlevel% neq 0 pause & exit /b %errorlevel% + +pause & exit /b 0 diff --git a/Samples/Vulkan/Demo/proj.win.cmake/scripts/proj_msvc2019.bat b/Samples/Vulkan/Demo/proj.win.cmake/scripts/proj_msvc2019.bat new file mode 100644 index 00000000..f54d52c4 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/scripts/proj_msvc2019.bat @@ -0,0 +1,19 @@ +@echo off + +setlocal + +set SCRIPT_PATH=%~dp0 +set MSVC_VERSION=2019 +set MSVC_NUMBER=16 +set VSWHERE=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe +set /a _MSVC_RANGE_S=MSVC_NUMBER +set /a _MSVC_RANGE_E=MSVC_NUMBER+1 +for /f "usebackq tokens=*" %%i in (`"%VSWHERE%" -legacy -version [%_MSVC_RANGE_S%^,%_MSVC_RANGE_E%^) -property installationPath`) do ( + set VCVARSALL=%%i\VC\Auxiliary\Build\vcvarsall.bat +) +set GENERATOR=proj + +call "%SCRIPT_PATH%_msvc_common.bat" +if %errorlevel% neq 0 pause & exit /b %errorlevel% + +pause & exit /b 0 diff --git a/Samples/Vulkan/Demo/proj.win.cmake/scripts/proj_msvc2022.bat b/Samples/Vulkan/Demo/proj.win.cmake/scripts/proj_msvc2022.bat new file mode 100644 index 00000000..01031f47 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/scripts/proj_msvc2022.bat @@ -0,0 +1,19 @@ +@echo off + +setlocal + +set SCRIPT_PATH=%~dp0 +set MSVC_VERSION=2022 +set MSVC_NUMBER=17 +set VSWHERE=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe +set /a _MSVC_RANGE_S=MSVC_NUMBER +set /a _MSVC_RANGE_E=MSVC_NUMBER+1 +for /f "usebackq tokens=*" %%i in (`"%VSWHERE%" -legacy -version [%_MSVC_RANGE_S%^,%_MSVC_RANGE_E%^) -property installationPath`) do ( + set VCVARSALL=%%i\VC\Auxiliary\Build\vcvarsall.bat +) +set GENERATOR=proj + +call "%SCRIPT_PATH%_msvc_common.bat" +if %errorlevel% neq 0 pause & exit /b %errorlevel% + +pause & exit /b 0 diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/CMakeLists.txt b/Samples/Vulkan/Demo/proj.win.cmake/src/CMakeLists.txt new file mode 100644 index 00000000..1c58b248 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/CMakeLists.txt @@ -0,0 +1,30 @@ +target_sources(${APP_NAME} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/LAppAllocator.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppAllocator.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppDefine.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppDefine.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppDelegate.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppDelegate.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppWavFileHandler.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppWavFileHandler.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppLive2DManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppLive2DManager.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppModel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppModel.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppPal.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppPal.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppSprite.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppSprite.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppTextureManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppTextureManager.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/LAppView.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/TouchManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/TouchManager.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/VulkanManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/VulkanManager.hpp + ${CMAKE_CURRENT_SOURCE_DIR}/SwapchainManager.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/SwapchainManager.hpp +) diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppAllocator.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppAllocator.cpp new file mode 100644 index 00000000..c9222356 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppAllocator.cpp @@ -0,0 +1,54 @@ +/** + * 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. + */ + +#include "LAppAllocator.hpp" + +using namespace Csm; + +void* LAppAllocator::Allocate(const csmSizeType size) +{ + return malloc(size); +} + +void LAppAllocator::Deallocate(void* memory) +{ + free(memory); +} + +void* LAppAllocator::AllocateAligned(const csmSizeType size, const csmUint32 alignment) +{ + size_t offset, shift, alignedAddress; + void* allocation; + void** preamble; + + offset = alignment - 1 + sizeof(void*); + + allocation = Allocate(size + static_cast(offset)); + + alignedAddress = reinterpret_cast(allocation) + sizeof(void*); + + shift = alignedAddress % alignment; + + if (shift) + { + alignedAddress += (alignment - shift); + } + + preamble = reinterpret_cast(alignedAddress); + preamble[-1] = allocation; + + return reinterpret_cast(alignedAddress); +} + +void LAppAllocator::DeallocateAligned(void* alignedMemory) +{ + void** preamble; + + preamble = static_cast(alignedMemory); + + Deallocate(preamble[-1]); +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppAllocator.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppAllocator.hpp new file mode 100644 index 00000000..7c7ef4e2 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppAllocator.hpp @@ -0,0 +1,52 @@ +/** + * 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. + */ + +#pragma once + +#include +#include + +/** +* @brief メモリアロケーションを実装するクラス。 +* +* メモリ確保・解放処理のインターフェースの実装。 +* フレームワークから呼び出される。 +* +*/ +class LAppAllocator : public Csm::ICubismAllocator +{ + /** + * @brief メモリ領域を割り当てる。 + * + * @param[in] size 割り当てたいサイズ。 + * @return 指定したメモリ領域 + */ + void* Allocate(const Csm::csmSizeType size); + + /** + * @brief メモリ領域を解放する + * + * @param[in] memory 解放するメモリ。 + */ + void Deallocate(void* memory); + + /** + * @brief + * + * @param[in] size 割り当てたいサイズ。 + * @param[in] alignment 割り当てたいサイズ。 + * @return alignedAddress + */ + void* AllocateAligned(const Csm::csmSizeType size, const Csm::csmUint32 alignment); + + /** + * @brief + * + * @param[in] alignedMemory 解放するメモリ。 + */ + void DeallocateAligned(void* alignedMemory); +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDefine.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDefine.cpp new file mode 100644 index 00000000..155b9ebe --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDefine.cpp @@ -0,0 +1,65 @@ +/** + * 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. + */ + +#include "LAppDefine.hpp" +#include + +namespace LAppDefine { + +using namespace Csm; + +// 画面 +const csmFloat32 ViewScale = 1.0f; +const csmFloat32 ViewMaxScale = 2.0f; +const csmFloat32 ViewMinScale = 0.8f; + +const csmFloat32 ViewLogicalLeft = -1.0f; +const csmFloat32 ViewLogicalRight = 1.0f; +const csmFloat32 ViewLogicalBottom = -1.0f; +const csmFloat32 ViewLogicalTop = -1.0f; + +const csmFloat32 ViewLogicalMaxLeft = -2.0f; +const csmFloat32 ViewLogicalMaxRight = 2.0f; +const csmFloat32 ViewLogicalMaxBottom = -2.0f; +const csmFloat32 ViewLogicalMaxTop = 2.0f; + +// 相対パス +const csmChar* ResourcesPath = "Resources/"; + +// モデルの後ろにある背景の画像ファイル +const csmChar* BackImageName = "back_class_normal.png"; +// 歯車 +const csmChar* GearImageName = "icon_gear.png"; +// 終了ボタン +const csmChar* PowerImageName = "close.png"; + +// モデル定義------------------------------------------ +// 外部定義ファイル(json)と合わせる +const csmChar* MotionGroupIdle = "Idle"; // アイドリング +const csmChar* MotionGroupTapBody = "TapBody"; // 体をタップしたとき + +// 外部定義ファイル(json)と合わせる +const csmChar* HitAreaNameHead = "Head"; +const csmChar* HitAreaNameBody = "Body"; + +// モーションの優先度定数 +const csmInt32 PriorityNone = 0; +const csmInt32 PriorityIdle = 1; +const csmInt32 PriorityNormal = 2; +const csmInt32 PriorityForce = 3; + +// デバッグ用ログの表示オプション +const csmBool DebugLogEnable = true; +const csmBool DebugTouchLogEnable = false; + +// Frameworkから出力するログのレベル設定 +const CubismFramework::Option::LogLevel CubismLoggingLevel = CubismFramework::Option::LogLevel_Verbose; + +// デフォルトのレンダーターゲットサイズ +const csmInt32 RenderTargetWidth = 1900; +const csmInt32 RenderTargetHeight = 1000; +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDefine.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDefine.hpp new file mode 100644 index 00000000..50c428fb --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDefine.hpp @@ -0,0 +1,63 @@ +/** + * 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. + */ +#pragma once + +#include + +/** +* @brief Sample Appで使用する定数 +* +*/ +namespace LAppDefine { + +using namespace Csm; + +extern const csmFloat32 ViewScale; ///< 拡大縮小率 +extern const csmFloat32 ViewMaxScale; ///< 拡大縮小率の最大値 +extern const csmFloat32 ViewMinScale; ///< 拡大縮小率の最小値 + +extern const csmFloat32 ViewLogicalLeft; ///< 論理的なビュー座標系の左端の値 +extern const csmFloat32 ViewLogicalRight; ///< 論理的なビュー座標系の右端の値 +extern const csmFloat32 ViewLogicalBottom; ///< 論理的なビュー座標系の下端の値 +extern const csmFloat32 ViewLogicalTop; ///< 論理的なビュー座標系の上端の値 + +extern const csmFloat32 ViewLogicalMaxLeft; ///< 論理的なビュー座標系の左端の最大値 +extern const csmFloat32 ViewLogicalMaxRight; ///< 論理的なビュー座標系の右端の最大値 +extern const csmFloat32 ViewLogicalMaxBottom; ///< 論理的なビュー座標系の下端の最大値 +extern const csmFloat32 ViewLogicalMaxTop; ///< 論理的なビュー座標系の上端の最大値 + +extern const csmChar* ResourcesPath; ///< 素材パス +extern const csmChar* BackImageName; ///< 背景画像ファイル +extern const csmChar* GearImageName; ///< 歯車画像ファイル +extern const csmChar* PowerImageName; ///< 終了ボタン画像ファイル + +// モデル定義-------------------------------------------- +// 外部定義ファイル(json)と合わせる +extern const csmChar* MotionGroupIdle; ///< アイドリング時に再生するモーションのリスト +extern const csmChar* MotionGroupTapBody; ///< 体をタップした時に再生するモーションのリスト + +// 外部定義ファイル(json)と合わせる +extern const csmChar* HitAreaNameHead; ///< 当たり判定の[Head]タグ +extern const csmChar* HitAreaNameBody; ///< 当たり判定の[Body]タグ + +// モーションの優先度定数 +extern const csmInt32 PriorityNone; ///< モーションの優先度定数: 0 +extern const csmInt32 PriorityIdle; ///< モーションの優先度定数: 1 +extern const csmInt32 PriorityNormal; ///< モーションの優先度定数: 2 +extern const csmInt32 PriorityForce; ///< モーションの優先度定数: 3 + +// デバッグ用ログの表示 +extern const csmBool DebugLogEnable; ///< デバッグ用ログ表示の有効・無効 +extern const csmBool DebugTouchLogEnable; ///< タッチ処理のデバッグ用ログ表示の有効・無効 + +// Frameworkから出力するログのレベル設定 +extern const CubismFramework::Option::LogLevel CubismLoggingLevel; + +// デフォルトのレンダーターゲットサイズ +extern const csmInt32 RenderTargetWidth; +extern const csmInt32 RenderTargetHeight; +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDelegate.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDelegate.cpp new file mode 100644 index 00000000..bb356317 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDelegate.cpp @@ -0,0 +1,292 @@ +/** + * 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. + */ + +#include "LAppDelegate.hpp" +#include +#define GLFW_INCLUDE_VULKAN +#include +#include +#include "LAppLive2DManager.hpp" +#include "LAppView.hpp" +#include "LAppPal.hpp" +#include "LAppDefine.hpp" +#include "LAppTextureManager.hpp" + +using namespace Csm; +using namespace std; +using namespace LAppDefine; + +namespace { +LAppDelegate* s_instance = NULL; +VulkanManager* s_vulkanManager = NULL; +} + +LAppDelegate* LAppDelegate::GetInstance() +{ + if (s_instance == NULL) + { + s_instance = new LAppDelegate(); + } + + return s_instance; +} + +void LAppDelegate::ReleaseInstance() +{ + if (s_instance != NULL) + { + delete s_instance; + } + + s_instance = NULL; +} + +bool LAppDelegate::Initialize() +{ + if (DebugLogEnable) + { + LAppPal::PrintLog("START"); + } + + // GLFWの初期化 + if (glfwInit() == GL_FALSE) + { + if (DebugLogEnable) + { + LAppPal::PrintLog("Can't initilize GLFW"); + } + return GL_FALSE; + } + + // Windowの生成_ + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + window = glfwCreateWindow(RenderTargetWidth, RenderTargetHeight, "SAMPLE", NULL, NULL); + s_vulkanManager = new VulkanManager(window); + + if (window == NULL) + { + if (DebugLogEnable) + { + LAppPal::PrintLog("Can't create GLFW window."); + } + glfwTerminate(); + return GL_FALSE; + } + + glfwSetWindowUserPointer(window, this); + + // Windowのコンテキストをカレントに設定 + glfwMakeContextCurrent(window); + glfwSwapInterval(1); + + //コールバック関数の登録 + glfwSetMouseButtonCallback(window, EventHandler::OnMouseCallBack); + glfwSetCursorPosCallback(window, EventHandler::OnMouseCallBack); + glfwSetFramebufferSizeCallback(window, s_vulkanManager->framebufferResizeCallback); + + // ウィンドウサイズ記憶 + int width, height; + glfwGetWindowSize(window, &width, &height); + _windowWidth = width; + _windowHeight = height; + + //setup cubism + _cubismOption.LogFunction = LAppPal::PrintMessage; + _cubismOption.LoggingLevel = LAppDefine::CubismLoggingLevel; + Csm::CubismFramework::StartUp(&_cubismAllocator, &_cubismOption); + + // vulkanデバイスの作成 + s_vulkanManager->Initialize(); + SwapchainManager* swapchainManager = s_vulkanManager->GetSwapchainManager(); + // レンダラにvulkanManagerの変数を渡す + Live2D::Cubism::Framework::Rendering::CubismRenderer_Vulkan::InitializeConstantSettings( + s_vulkanManager->GetDevice(), s_vulkanManager->GetPhysicalDevice(), + s_vulkanManager->GetCommandPool(), s_vulkanManager->GetGraphicQueue(), + swapchainManager->GetExtent(), swapchainManager->GetSwapchainImageFormat(), + s_vulkanManager->GetImageFormat(), + s_vulkanManager->GetSwapchainImage(), s_vulkanManager->GetSwapchainImageView(), + s_vulkanManager->GetDepthFormat() + ); + + _textureManager = new LAppTextureManager(); + + //AppViewの初期化 + _view->Initialize(); + + // Cubism SDK の初期化 + InitializeCubism(); + + return GL_TRUE; +} + +void LAppDelegate::Release() +{ + // Windowの削除 + glfwDestroyWindow(window); + glfwTerminate(); + + // リソースを解放 + LAppLive2DManager::ReleaseInstance(); + + delete _view; + delete _textureManager; + _view = NULL; + _textureManager = NULL; + + //Cubism SDK の解放 + CubismFramework::Dispose(); + + s_vulkanManager->Destroy(); +} + +bool LAppDelegate::RecreateSwapchain() +{ + int width = 0, height = 0; + if (s_vulkanManager->GetIsWindowSizeChanged()) + { + glfwGetFramebufferSize(window, &width, &height); + while (width == 0 || height == 0) + { + glfwGetFramebufferSize(window, &width, &height); + glfwWaitEvents(); + } + + s_vulkanManager->RecreateSwapchain(); + Live2D::Cubism::Framework::Rendering::CubismRenderer_Vulkan::UpdateSwapchainVariable( + s_vulkanManager->GetSwapchainManager()->GetExtent(), + s_vulkanManager->GetSwapchainImage(), + s_vulkanManager->GetSwapchainImageView() + ); + + // AppViewの初期化 + _view->Initialize(); + // スプライトサイズを再設定 + _view->ResizeSprite(width, height); + // オフスクリーンを再作成する + _view->DestroyOffscreenSurface(); + // サイズを保存しておく + _windowWidth = width; + _windowHeight = height; + s_vulkanManager->SetIsWindowSizeChanged(false); + return true; + } + return false; +} + +void LAppDelegate::Run() +{ + //メインループ + while (glfwWindowShouldClose(window) == GL_FALSE && !_isEnd) + { + //Poll for and process events + glfwPollEvents(); + + // 時間更新 + LAppPal::UpdateTime(); + s_vulkanManager->UpdateDrawFrame(); + + if (RecreateSwapchain()) + { + continue; + } + + _view->Render(); + s_vulkanManager->PostDraw(); + RecreateSwapchain(); + } + + Release(); + + LAppDelegate::ReleaseInstance(); +} + +LAppDelegate::LAppDelegate(): + _cubismOption() + , _captured(false) + , _mouseX(0.0f) + , _mouseY(0.0f) + , _isEnd(false) + , _windowWidth(0) + , _windowHeight(0) + , _textureManager() + , window() +{ + _view = new LAppView(); +} + +LAppDelegate::~LAppDelegate() +{} + +void LAppDelegate::InitializeCubism() +{ + //Initialize cubism + CubismFramework::Initialize(); + + //load model + LAppLive2DManager::GetInstance(); + + //アイコン + _view->InitializeSprite(); + + //default proj + CubismMatrix44 projection; + + LAppPal::UpdateTime(); +} + +void LAppDelegate::OnMouseCallBack(GLFWwindow* window, int button, int action, int modify) +{ + if (_view == NULL) + { + return; + } + if (GLFW_MOUSE_BUTTON_LEFT != button) + { + return; + } + + if (GLFW_PRESS == action) + { + _captured = true; + _view->OnTouchesBegan(_mouseX, _mouseY); + } + else if (GLFW_RELEASE == action) + { + if (_captured) + { + _captured = false; + _view->OnTouchesEnded(_mouseX, _mouseY); + } + } +} + +void LAppDelegate::OnMouseCallBack(GLFWwindow* window, double x, double y) +{ + _mouseX = static_cast(x); + _mouseY = static_cast(y); + + if (!_captured) + { + return; + } + if (_view == NULL) + { + return; + } + + _view->OnTouchesMoved(_mouseX, _mouseY); +} + +GLFWwindow* LAppDelegate::GetWindow() +{ + return window; +} + +VulkanManager* LAppDelegate::GetVulkanManager() +{ + return s_vulkanManager; +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDelegate.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDelegate.hpp new file mode 100644 index 00000000..ed7d04e7 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppDelegate.hpp @@ -0,0 +1,151 @@ +/** + * 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. + */ + +#pragma once + +#define GLFW_INCLUDE_VULKAN +#include +#include "LAppAllocator.hpp" +#include "VulkanManager.hpp" + +class LAppView; +class LAppTextureManager; + +/** +* @brief アプリケーションクラス。 +* Cubism SDK の管理を行う。 +*/ +class LAppDelegate +{ +public: + /** + * @brief クラスのインスタンス(シングルトン)を返す。
+ * インスタンスが生成されていない場合は内部でインスタンを生成する。 + * + * @return クラスのインスタンス + */ + static LAppDelegate* GetInstance(); + + /** + * @brief クラスのインスタンス(シングルトン)を解放する。 + * + */ + static void ReleaseInstance(); + + /** + * @brief APPに必要なものを初期化する。 + */ + bool Initialize(); + + /** + * @brief 解放する。 + */ + void Release(); + + + bool RecreateSwapchain(); + + /** + * @brief 実行処理。 + */ + void Run(); + + /** + * @brief Vulkan用 glfwSetMouseButtonCallback用関数。 + * @param[in] window コールバックを呼んだWindow情報 + * @param[in] button ボタン種類 + * @param[in] action 実行結果 + * @param[in] modify + */ + void OnMouseCallBack(GLFWwindow* window, int button, int action, int modify); + + /** + * @brief OpenGL用 glfwSetCursorPosCallback用関数。 + * + * @param[in] window コールバックを呼んだWindow情報 + * @param[in] x x座標 + * @param[in] y x座標 + */ + void OnMouseCallBack(GLFWwindow* window, double x, double y); + + /** + * @brief シェーダーを登録する。 + */ + //uint32_t CreateShader(); + + /** + * @brief Window情報を取得する。 + */ + GLFWwindow* GetWindow(); + + /** + * @brief View情報を取得する。 + */ + LAppView* GetView() { return _view; } + + /** + * @brief アプリケーションを終了するかどうか。 + */ + bool GetIsEnd() { return _isEnd; } + + /** + * @brief アプリケーションを終了する。 + */ + void AppEnd() { _isEnd = true; } + + LAppTextureManager* GetTextureManager() { return _textureManager; } + VulkanManager* GetVulkanManager(); + +private: + /** + * @brief コンストラクタ + */ + LAppDelegate(); + + /** + * @brief デストラクタ + */ + ~LAppDelegate(); + + /** + * @brief Cubism SDK の初期化 + */ + void InitializeCubism(); + + GLFWwindow* window; + LAppAllocator _cubismAllocator; ///< Cubism SDK Allocator + Csm::CubismFramework::Option _cubismOption; ///< Cubism SDK Option + LAppView* _view; ///< View情報 + bool _captured; ///< クリックしているか + float _mouseX; ///< マウスX座標 + float _mouseY; ///< マウスY座標 + bool _isEnd; ///< APP終了しているか + LAppTextureManager* _textureManager; ///< テクスチャマネージャー + + int _windowWidth; ///< Initialize関数で設定したウィンドウ幅 + int _windowHeight; ///< Initialize関数で設定したウィンドウ高さ +}; + +class EventHandler +{ +public: + /** + * @brief glfwSetMouseButtonCallback用コールバック関数。 + */ + static void OnMouseCallBack(GLFWwindow* window, int button, int action, int modify) + { + LAppDelegate::GetInstance()->OnMouseCallBack(window, button, action, modify); + } + + /** + * @brief glfwSetCursorPosCallback用コールバック関数。 + */ + static void OnMouseCallBack(GLFWwindow* window, double x, double y) + { + LAppDelegate::GetInstance()->OnMouseCallBack(window, x, y); + } +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppLive2DManager.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppLive2DManager.cpp new file mode 100644 index 00000000..2ec9037b --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppLive2DManager.cpp @@ -0,0 +1,297 @@ +/** + * 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. + */ + +#include "LAppLive2DManager.hpp" +#include +#include +#include +#include +#include +#include "LAppPal.hpp" +#include "LAppDefine.hpp" +#include "LAppDelegate.hpp" +#include "LAppModel.hpp" +#include "LAppView.hpp" + +using namespace Csm; +using namespace LAppDefine; + +namespace { +LAppLive2DManager* s_instance = NULL; + +void FinishedMotion(ACubismMotion* self) +{ + LAppPal::PrintLog("Motion Finished: %x", self); +} + +int CompareCsmString(const void* a, const void* b) +{ + return strcmp(reinterpret_cast(a)->GetRawString(), + reinterpret_cast(b)->GetRawString()); +} +} + +LAppLive2DManager* LAppLive2DManager::GetInstance() +{ + if (s_instance == NULL) + { + s_instance = new LAppLive2DManager(); + } + + return s_instance; +} + +void LAppLive2DManager::ReleaseInstance() +{ + if (s_instance != NULL) + { + delete s_instance; + } + + s_instance = NULL; +} + +LAppLive2DManager::LAppLive2DManager() + : _viewMatrix(NULL) + , _sceneIndex(0) +{ + _viewMatrix = new CubismMatrix44(); + SetUpModel(); + + ChangeScene(_sceneIndex); +} + +LAppLive2DManager::~LAppLive2DManager() +{ + ReleaseAllModel(); +} + +void LAppLive2DManager::ReleaseAllModel() +{ + for (csmUint32 i = 0; i < _models.GetSize(); i++) + { + delete _models[i]; + } + + _models.Clear(); +} + +void LAppLive2DManager::SetUpModel() +{ + // ResourcesPathの中にあるフォルダ名を全てクロールし、モデルが存在するフォルダを定義する。 + // フォルダはあるが同名の.model3.jsonが見つからなかった場合はリストに含めない。 + csmString crawlPath(ResourcesPath); + crawlPath += "*.*"; + + struct _finddata_t fdata; + intptr_t fh = _findfirst(crawlPath.GetRawString(), &fdata); + if (fh == -1) return; + + _modelDir.Clear(); + + while (_findnext(fh, &fdata) == 0) + { + if ((fdata.attrib & _A_SUBDIR) && strcmp(fdata.name, "..") != 0) + { + // フォルダと同名の.model3.jsonがあるか探索する + csmString model3jsonPath(ResourcesPath); + model3jsonPath += fdata.name; + model3jsonPath.Append(1, '/'); + model3jsonPath += fdata.name; + model3jsonPath += ".model3.json"; + + struct _finddata_t fdata2; + if (_findfirst(model3jsonPath.GetRawString(), &fdata2) != -1) + { + _modelDir.PushBack(csmString(fdata.name)); + } + } + } + qsort(_modelDir.GetPtr(), _modelDir.GetSize(), sizeof(csmString), CompareCsmString); +} + +csmVector LAppLive2DManager::GetModelDir() const +{ + return _modelDir; +} + +csmInt32 LAppLive2DManager::GetModelDirSize() const +{ + return _modelDir.GetSize(); +} + +LAppModel* LAppLive2DManager::GetModel(csmUint32 no) const +{ + if (no < _models.GetSize()) + { + return _models[no]; + } + + return NULL; +} + +void LAppLive2DManager::OnDrag(csmFloat32 x, csmFloat32 y) const +{ + for (csmUint32 i = 0; i < _models.GetSize(); i++) + { + LAppModel* model = GetModel(i); + + model->SetDragging(x, y); + } +} + +void LAppLive2DManager::OnTap(csmFloat32 x, csmFloat32 y) +{ + if (DebugLogEnable) + { + LAppPal::PrintLog("[APP]tap point: {x:%.2f y:%.2f}", x, y); + } + + for (csmUint32 i = 0; i < _models.GetSize(); i++) + { + if (_models[i]->HitTest(HitAreaNameHead, x, y)) + { + if (DebugLogEnable) + { + LAppPal::PrintLog("[APP]hit area: [%s]", HitAreaNameHead); + } + _models[i]->SetRandomExpression(); + } + else if (_models[i]->HitTest(HitAreaNameBody, x, y)) + { + if (DebugLogEnable) + { + LAppPal::PrintLog("[APP]hit area: [%s]", HitAreaNameBody); + } + _models[i]->StartRandomMotion(MotionGroupTapBody, PriorityNormal, FinishedMotion); + } + } +} + +void LAppLive2DManager::OnUpdate() const +{ + int width, height; + glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &width, &height); + + VulkanManager* vulkanManager = LAppDelegate::GetInstance()->GetVulkanManager(); + Rendering::CubismRenderer_Vulkan::UpdateRendererSettings(vulkanManager->GetSwapchainImage(), vulkanManager->GetSwapchainImageView()); + + csmUint32 modelCount = _models.GetSize(); + for (csmUint32 i = 0; i < modelCount; ++i) + { + CubismMatrix44 projection; + LAppModel* model = GetModel(i); + + if (model->GetModel() == NULL) + { + LAppPal::PrintLog("Failed to model->GetModel()."); + continue; + } + + if (model->GetModel()->GetCanvasWidth() > 1.0f && width < height) + { + // 横に長いモデルを縦長ウィンドウに表示する際モデルの横サイズでscaleを算出する + model->GetModelMatrix()->SetWidth(2.0f); + projection.Scale(1.0f, static_cast(width) / static_cast(height)); + } + else + { + projection.Scale(static_cast(height) / static_cast(width), 1.0f); + } + + // 必要があればここで乗算 + if (_viewMatrix != NULL) + { + projection.MultiplyByMatrix(_viewMatrix); + } + + LAppDelegate::GetInstance()->GetView()->PreModelDraw(*model); + model->Update(); + model->Draw(projection); ///< 参照渡しなのでprojectionは変質する + LAppDelegate::GetInstance()->GetView()->PostModelDraw(*model, i); + } +} + +void LAppLive2DManager::NextScene() +{ + csmInt32 no = (_sceneIndex + 1) % GetModelDirSize(); + ChangeScene(no); +} + +void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) +{ + _sceneIndex = index; + if (DebugLogEnable) + { + LAppPal::PrintLog("[APP]model index: %d", _sceneIndex); + } + + // model3.jsonのパスを決定する. + // ディレクトリ名とmodel3.jsonの名前を一致していることが条件 + const csmString& model = _modelDir[index]; + + csmString modelPath(ResourcesPath); + modelPath += model; + modelPath.Append(1, '/'); + + csmString modelJsonName(model); + modelJsonName += ".model3.json"; + + VulkanManager* vulkanManager = LAppDelegate::GetInstance()->GetVulkanManager(); + vkDeviceWaitIdle(vulkanManager->GetDevice()); + + ReleaseAllModel(); + _models.PushBack(new LAppModel()); +#if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) + Csm::Rendering::CubismRenderer_Vulkan::EnableChangeRenderTarget(); +#endif + + _models[0]->LoadAssets(vulkanManager->GetDevice(), vulkanManager->GetImageFormat(), modelPath.GetRawString(), + modelJsonName.GetRawString()); + + /* + * モデル半透明表示を行うサンプルを提示する。 + * ここでUSE_RENDER_TARGET、USE_MODEL_RENDER_TARGETが定義されている場合 + * 別のレンダリングターゲットにモデルを描画し、描画結果をテクスチャとして別のスプライトに張り付ける。 + */ +#if defined(USE_RENDER_TARGET) + // LAppViewの持つターゲットに描画を行う場合、こちらを選択 + LAppView::SelectTarget useRenderTarget = LAppView::SelectTarget_ViewFrameBuffer; +#elif defined(USE_MODEL_RENDER_TARGET) + // 各LAppModelの持つターゲットに描画を行う場合、こちらを選択 + LAppView::SelectTarget useRenderTarget = LAppView::SelectTarget_ModelFrameBuffer; +#else + // デフォルトのメインフレームバッファへレンダリングする(通常) + LAppView::SelectTarget useRenderTarget = LAppView::SelectTarget_None; +#endif + +#if defined(USE_RENDER_TARGET) || defined(USE_MODEL_RENDER_TARGET) + // モデル個別にαを付けるサンプルとして、もう1体モデルを作成し、少し位置をずらす + _models.PushBack(new LAppModel()); + _models[1]->LoadAssets(LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice(), vulkanManager->GetImageFormat(), modelPath.GetRawString(), modelJsonName.GetRawString()); + _models[1]->GetModelMatrix()->TranslateX(0.2f); +#endif + + LAppDelegate::GetInstance()->GetView()->SwitchRenderingTarget(useRenderTarget); + + // 別レンダリング先を選択した際の背景クリア色 + float clearColor[3] = {1.0f, 1.0f, 1.0f}; + LAppDelegate::GetInstance()->GetView()->SetRenderTargetClearColor(clearColor[0], clearColor[1], clearColor[2]); +} + +csmUint32 LAppLive2DManager::GetModelNum() const +{ + return _models.GetSize(); +} + +void LAppLive2DManager::SetViewMatrix(CubismMatrix44* m) +{ + for (int i = 0; i < 16; i++) + { + _viewMatrix->GetArray()[i] = m->GetArray()[i]; + } +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppLive2DManager.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppLive2DManager.hpp new file mode 100644 index 00000000..9fb915da --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppLive2DManager.hpp @@ -0,0 +1,131 @@ +/** + * 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. + */ + +#pragma once + +#include +#include +#include +#include "VulkanManager.hpp" + +class LAppModel; + +/** +* @brief サンプルアプリケーションにおいてCubismModelを管理するクラス
+* モデル生成と破棄、タップイベントの処理、モデル切り替えを行う。 +* +*/ +class LAppLive2DManager +{ +public: + /** + * @brief クラスのインスタンス(シングルトン)を返す。
+ * インスタンスが生成されていない場合は内部でインスタンを生成する。 + * + * @return クラスのインスタンス + */ + static LAppLive2DManager* GetInstance(); + + /** + * @brief クラスのインスタンス(シングルトン)を解放する。 + * + */ + static void ReleaseInstance(); + + /** + * @brief Resフォルダにあるモデルフォルダ名をセットする + * + */ + void SetUpModel(); + + /** + * @brief Resフォルダにあるモデルフォルダ名を取得する + * + */ + Csm::csmVector GetModelDir() const; + + /** + * @brief Resフォルダにあるモデルフォルダのサイズを取得する + * + */ + Csm::csmInt32 GetModelDirSize() const; + + /** + * @brief 現在のシーンで保持しているモデルを返す + * + * @param[in] no モデルリストのインデックス値 + * @return モデルのインスタンスを返す。インデックス値が範囲外の場合はNULLを返す。 + */ + LAppModel* GetModel(Csm::csmUint32 no) const; + + /** + * @brief 現在のシーンで保持しているすべてのモデルを解放する + * + */ + void ReleaseAllModel(); + + /** + * @brief 画面をドラッグしたときの処理 + * + * @param[in] x 画面のX座標 + * @param[in] y 画面のY座標 + */ + void OnDrag(Csm::csmFloat32 x, Csm::csmFloat32 y) const; + + /** + * @brief 画面をタップしたときの処理 + * + * @param[in] x 画面のX座標 + * @param[in] y 画面のY座標 + */ + void OnTap(Csm::csmFloat32 x, Csm::csmFloat32 y); + + /** + * @brief 画面を更新するときの処理、モデルの更新処理および描画処理を行う + */ + void OnUpdate() const; + + /** + * @brief 次のシーンに切り替える
+ * サンプルアプリケーションではモデルセットの切り替えを行う。 + */ + void NextScene(); + + /** + * @brief シーンを切り替える
+ * サンプルアプリケーションではモデルセットの切り替えを行う。 + */ + void ChangeScene(Csm::csmInt32 index); + + /** + * @brief モデル個数を得る + * @return 所持モデル個数 + */ + Csm::csmUint32 GetModelNum() const; + + /** + * @brief viewMatrixをセットする + */ + void SetViewMatrix(Live2D::Cubism::Framework::CubismMatrix44* m); + +private: + /** + * @brief コンストラクタ + */ + LAppLive2DManager(); + + /** + * @brief デストラクタ + */ + virtual ~LAppLive2DManager(); + + Csm::CubismMatrix44* _viewMatrix; ///< モデル描画に用いるView行列 + Csm::csmVector _models; ///< モデルインスタンスのコンテナ + Csm::csmInt32 _sceneIndex; ///< 表示するシーンのインデックス値 + + Csm::csmVector _modelDir; ///< モデルディレクトリ名のコンテナ +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppModel.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppModel.cpp new file mode 100644 index 00000000..e358f553 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppModel.cpp @@ -0,0 +1,667 @@ +/** + * 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. + */ + +#include "LAppModel.hpp" +#include +#include +#include +#include +#include +#include +#include +#include +#include "LAppDefine.hpp" +#include "LAppPal.hpp" +#include "LAppTextureManager.hpp" +#include "LAppDelegate.hpp" + +using namespace Live2D::Cubism::Framework; +using namespace Live2D::Cubism::Framework::DefaultParameterId; +using namespace LAppDefine; + +namespace { +csmByte* CreateBuffer(const csmChar* path, csmSizeInt* size) +{ + if (DebugLogEnable) + { + LAppPal::PrintLog("[APP]create buffer: %s ", path); + } + return LAppPal::LoadFileAsBytes(path, size); +} + +void DeleteBuffer(csmByte* buffer, const csmChar* path = "") +{ + if (DebugLogEnable) + { + LAppPal::PrintLog("[APP]delete buffer: %s", path); + } + LAppPal::ReleaseBytes(buffer); +} +} + +LAppModel::LAppModel() + : CubismUserModel() + , _modelSetting(NULL) + , _userTimeSeconds(0.0f) +{ + if (DebugLogEnable) + { + _debugMode = true; + } + + _idParamAngleX = CubismFramework::GetIdManager()->GetId(ParamAngleX); + _idParamAngleY = CubismFramework::GetIdManager()->GetId(ParamAngleY); + _idParamAngleZ = CubismFramework::GetIdManager()->GetId(ParamAngleZ); + _idParamBodyAngleX = CubismFramework::GetIdManager()->GetId(ParamBodyAngleX); + _idParamEyeBallX = CubismFramework::GetIdManager()->GetId(ParamEyeBallX); + _idParamEyeBallY = CubismFramework::GetIdManager()->GetId(ParamEyeBallY); +} + +LAppModel::~LAppModel() +{ + _renderBuffer.DestroyOffscreenSurface(LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice()); + + ReleaseMotions(); + ReleaseExpressions(); + + for (csmInt32 i = 0; i < _modelSetting->GetMotionGroupCount(); i++) + { + const csmChar* group = _modelSetting->GetMotionGroupName(i); + ReleaseMotionGroup(group); + } + + // テクスチャの開放 + for (csmUint32 i = 0; i < _bindTextureId.GetSize(); i++) + { + LAppDelegate::GetInstance()->GetTextureManager()->ReleaseTexture(_bindTextureId[i]); + } + _bindTextureId.Clear(); + delete(_modelSetting); +} + +void LAppModel::LoadAssets(VkDevice device, VkFormat imageFormat, const csmChar* dir, const csmChar* fileName) +{ + _modelHomeDir = dir; + + if (_debugMode) + { + LAppPal::PrintLog("[APP]load model setting: %s", fileName); + } + + csmSizeInt size; + const csmString path = csmString(dir) + fileName; + + csmByte* buffer = CreateBuffer(path.GetRawString(), &size); + ICubismModelSetting* setting = new CubismModelSettingJson(buffer, size); + DeleteBuffer(buffer, path.GetRawString()); + + SetupModel(setting); + + if (_model == NULL) + { + LAppPal::PrintLog("Failed to LoadAssets()."); + return; + } + + CreateRenderer(); + + SetupTextures(device, imageFormat); +} + +void LAppModel::SetupModel(ICubismModelSetting* setting) +{ + _updating = true; + _initialized = false; + _modelSetting = setting; + + csmByte* buffer; + csmSizeInt size; + + //Cubism Model + if (strcmp(_modelSetting->GetModelFileName(), "") != 0) + { + csmString path = _modelSetting->GetModelFileName(); + path = _modelHomeDir + path; + + if (_debugMode) + { + LAppPal::PrintLog("[APP]create model: %s", setting->GetModelFileName()); + } + + buffer = CreateBuffer(path.GetRawString(), &size); + LoadModel(buffer, size); + DeleteBuffer(buffer, path.GetRawString()); + } + + //Expression + if (_modelSetting->GetExpressionCount() > 0) + { + const csmInt32 count = _modelSetting->GetExpressionCount(); + for (csmInt32 i = 0; i < count; i++) + { + csmString name = _modelSetting->GetExpressionName(i); + csmString path = _modelSetting->GetExpressionFileName(i); + path = _modelHomeDir + path; + + buffer = CreateBuffer(path.GetRawString(), &size); + ACubismMotion* motion = LoadExpression(buffer, size, name.GetRawString()); + + if (_expressions[name] != NULL) + { + ACubismMotion::Delete(_expressions[name]); + _expressions[name] = NULL; + } + _expressions[name] = motion; + + DeleteBuffer(buffer, path.GetRawString()); + } + } + + //Physics + if (strcmp(_modelSetting->GetPhysicsFileName(), "") != 0) + { + csmString path = _modelSetting->GetPhysicsFileName(); + path = _modelHomeDir + path; + + buffer = CreateBuffer(path.GetRawString(), &size); + LoadPhysics(buffer, size); + DeleteBuffer(buffer, path.GetRawString()); + } + + //Pose + if (strcmp(_modelSetting->GetPoseFileName(), "") != 0) + { + csmString path = _modelSetting->GetPoseFileName(); + path = _modelHomeDir + path; + + buffer = CreateBuffer(path.GetRawString(), &size); + LoadPose(buffer, size); + DeleteBuffer(buffer, path.GetRawString()); + } + + //EyeBlink + if (_modelSetting->GetEyeBlinkParameterCount() > 0) + { + _eyeBlink = CubismEyeBlink::Create(_modelSetting); + } + + //Breath + { + _breath = CubismBreath::Create(); + + csmVector breathParameters; + + breathParameters.PushBack(CubismBreath::BreathParameterData(_idParamAngleX, 0.0f, 15.0f, 6.5345f, 0.5f)); + breathParameters.PushBack(CubismBreath::BreathParameterData(_idParamAngleY, 0.0f, 8.0f, 3.5345f, 0.5f)); + breathParameters.PushBack(CubismBreath::BreathParameterData(_idParamAngleZ, 0.0f, 10.0f, 5.5345f, 0.5f)); + breathParameters.PushBack(CubismBreath::BreathParameterData(_idParamBodyAngleX, 0.0f, 4.0f, 15.5345f, 0.5f)); + breathParameters.PushBack( + CubismBreath::BreathParameterData(CubismFramework::GetIdManager()->GetId(ParamBreath), 0.5f, 0.5f, 3.2345f, + 0.5f)); + + _breath->SetParameters(breathParameters); + } + + //UserData + if (strcmp(_modelSetting->GetUserDataFile(), "") != 0) + { + csmString path = _modelSetting->GetUserDataFile(); + path = _modelHomeDir + path; + buffer = CreateBuffer(path.GetRawString(), &size); + LoadUserData(buffer, size); + DeleteBuffer(buffer, path.GetRawString()); + } + + // EyeBlinkIds + { + csmInt32 eyeBlinkIdCount = _modelSetting->GetEyeBlinkParameterCount(); + for (csmInt32 i = 0; i < eyeBlinkIdCount; ++i) + { + _eyeBlinkIds.PushBack(_modelSetting->GetEyeBlinkParameterId(i)); + } + } + + // LipSyncIds + { + csmInt32 lipSyncIdCount = _modelSetting->GetLipSyncParameterCount(); + for (csmInt32 i = 0; i < lipSyncIdCount; ++i) + { + _lipSyncIds.PushBack(_modelSetting->GetLipSyncParameterId(i)); + } + } + + if (_modelSetting == NULL || _modelMatrix == NULL) + { + LAppPal::PrintLog("Failed to SetupModel()."); + return; + } + + //Layout + csmMap layout; + _modelSetting->GetLayoutMap(layout); + _modelMatrix->SetupFromLayout(layout); + + _model->SaveParameters(); + + for (csmInt32 i = 0; i < _modelSetting->GetMotionGroupCount(); i++) + { + const csmChar* group = _modelSetting->GetMotionGroupName(i); + PreloadMotionGroup(group); + } + + _motionManager->StopAllMotions(); + + _updating = false; + _initialized = true; +} + +void LAppModel::PreloadMotionGroup(const csmChar* group) +{ + const csmInt32 count = _modelSetting->GetMotionCount(group); + + for (csmInt32 i = 0; i < count; i++) + { + //ex) idle_0 + csmString name = Utils::CubismString::GetFormatedString("%s_%d", group, i); + csmString path = _modelSetting->GetMotionFileName(group, i); + path = _modelHomeDir + path; + + if (_debugMode) + { + LAppPal::PrintLog("[APP]load motion: %s => [%s_%d] ", path.GetRawString(), group, i); + } + + csmByte* buffer; + csmSizeInt size; + buffer = CreateBuffer(path.GetRawString(), &size); + CubismMotion* tmpMotion = static_cast(LoadMotion(buffer, size, name.GetRawString())); + + csmFloat32 fadeTime = _modelSetting->GetMotionFadeInTimeValue(group, i); + if (fadeTime >= 0.0f) + { + tmpMotion->SetFadeInTime(fadeTime); + } + + fadeTime = _modelSetting->GetMotionFadeOutTimeValue(group, i); + if (fadeTime >= 0.0f) + { + tmpMotion->SetFadeOutTime(fadeTime); + } + tmpMotion->SetEffectIds(_eyeBlinkIds, _lipSyncIds); + + if (_motions[name] != NULL) + { + ACubismMotion::Delete(_motions[name]); + } + _motions[name] = tmpMotion; + + DeleteBuffer(buffer, path.GetRawString()); + } +} + +void LAppModel::ReleaseMotionGroup(const csmChar* group) const +{ + const csmInt32 count = _modelSetting->GetMotionCount(group); + for (csmInt32 i = 0; i < count; i++) + { + csmString voice = _modelSetting->GetMotionSoundFileName(group, i); + if (strcmp(voice.GetRawString(), "") != 0) + { + csmString path = voice; + path = _modelHomeDir + path; + } + } +} + +/** +* @brief すべてのモーションデータの解放 +* +* すべてのモーションデータを解放する。 +*/ +void LAppModel::ReleaseMotions() +{ + for (csmMap::const_iterator iter = _motions.Begin(); iter != _motions.End(); ++iter) + { + ACubismMotion::Delete(iter->Second); + } + + _motions.Clear(); +} + +/** +* @brief すべての表情データの解放 +* +* すべての表情データを解放する。 +*/ +void LAppModel::ReleaseExpressions() +{ + for (csmMap::const_iterator iter = _expressions.Begin(); iter != _expressions.End(); ++ + iter) + { + ACubismMotion::Delete(iter->Second); + } + + _expressions.Clear(); +} + +void LAppModel::Update() +{ + const csmFloat32 deltaTimeSeconds = LAppPal::GetDeltaTime(); + _userTimeSeconds += deltaTimeSeconds; + + _dragManager->Update(deltaTimeSeconds); + _dragX = _dragManager->GetX(); + _dragY = _dragManager->GetY(); + + // モーションによるパラメータ更新の有無 + csmBool motionUpdated = false; + + //----------------------------------------------------------------- + _model->LoadParameters(); // 前回セーブされた状態をロード + if (_motionManager->IsFinished()) + { + // モーションの再生がない場合、待機モーションの中からランダムで再生する + StartRandomMotion(MotionGroupIdle, PriorityIdle); + } + else + { + motionUpdated = _motionManager->UpdateMotion(_model, deltaTimeSeconds); // モーションを更新 + } + _model->SaveParameters(); // 状態を保存 + //----------------------------------------------------------------- + + // 不透明度 + _opacity = _model->GetModelOpacity(); + + // まばたき + if (!motionUpdated) + { + if (_eyeBlink != NULL) + { + // メインモーションの更新がないとき + _eyeBlink->UpdateParameters(_model, deltaTimeSeconds); // 目パチ + } + } + + if (_expressionManager != NULL) + { + _expressionManager->UpdateMotion(_model, deltaTimeSeconds); // 表情でパラメータ更新(相対変化) + } + + //ドラッグによる変化 + //ドラッグによる顔の向きの調整 + _model->AddParameterValue(_idParamAngleX, _dragX * 30); // -30から30の値を加える + _model->AddParameterValue(_idParamAngleY, _dragY * 30); + _model->AddParameterValue(_idParamAngleZ, _dragX * _dragY * -30); + + //ドラッグによる体の向きの調整 + _model->AddParameterValue(_idParamBodyAngleX, _dragX * 10); // -10から10の値を加える + + //ドラッグによる目の向きの調整 + _model->AddParameterValue(_idParamEyeBallX, _dragX); // -1から1の値を加える + _model->AddParameterValue(_idParamEyeBallY, _dragY); + + // 呼吸など + if (_breath != NULL) + { + _breath->UpdateParameters(_model, deltaTimeSeconds); + } + + // 物理演算の設定 + if (_physics != NULL) + { + _physics->Evaluate(_model, deltaTimeSeconds); + } + + // リップシンクの設定 + if (_lipSync) + { + // リアルタイムでリップシンクを行う場合、システムから音量を取得して0〜1の範囲で値を入力します。 + csmFloat32 value = 0.0f; + + // 状態更新/RMS値取得 + _wavFileHandler.Update(deltaTimeSeconds); + value = _wavFileHandler.GetRms(); + + for (csmUint32 i = 0; i < _lipSyncIds.GetSize(); ++i) + { + _model->AddParameterValue(_lipSyncIds[i], value, 0.8f); + } + } + + // ポーズの設定 + if (_pose != NULL) + { + _pose->UpdateParameters(_model, deltaTimeSeconds); + } + + _model->Update(); +} + +CubismMotionQueueEntryHandle LAppModel::StartMotion(const csmChar* group, csmInt32 no, csmInt32 priority, + ACubismMotion::FinishedMotionCallback onFinishedMotionHandler) +{ + if (priority == PriorityForce) + { + _motionManager->SetReservePriority(priority); + } + else if (!_motionManager->ReserveMotion(priority)) + { + if (_debugMode) + { + LAppPal::PrintLog("[APP]can't start motion."); + } + return InvalidMotionQueueEntryHandleValue; + } + + const csmString fileName = _modelSetting->GetMotionFileName(group, no); + + //ex) idle_0 + csmString name = Utils::CubismString::GetFormatedString("%s_%d", group, no); + CubismMotion* motion = static_cast(_motions[name.GetRawString()]); + csmBool autoDelete = false; + + if (motion == NULL) + { + csmString path = fileName; + path = _modelHomeDir + path; + + csmByte* buffer; + csmSizeInt size; + buffer = CreateBuffer(path.GetRawString(), &size); + motion = static_cast(LoadMotion(buffer, size, NULL, onFinishedMotionHandler)); + csmFloat32 fadeTime = _modelSetting->GetMotionFadeInTimeValue(group, no); + if (fadeTime >= 0.0f) + { + motion->SetFadeInTime(fadeTime); + } + + fadeTime = _modelSetting->GetMotionFadeOutTimeValue(group, no); + if (fadeTime >= 0.0f) + { + motion->SetFadeOutTime(fadeTime); + } + motion->SetEffectIds(_eyeBlinkIds, _lipSyncIds); + autoDelete = true; // 終了時にメモリから削除 + + DeleteBuffer(buffer, path.GetRawString()); + } + else + { + motion->SetFinishedMotionHandler(onFinishedMotionHandler); + } + + //voice + csmString voice = _modelSetting->GetMotionSoundFileName(group, no); + if (strcmp(voice.GetRawString(), "") != 0) + { + csmString path = voice; + path = _modelHomeDir + path; + _wavFileHandler.Start(path); + } + + if (_debugMode) + { + LAppPal::PrintLog("[APP]start motion: [%s_%d]", group, no); + } + return _motionManager->StartMotionPriority(motion, autoDelete, priority); +} + +CubismMotionQueueEntryHandle LAppModel::StartRandomMotion(const csmChar* group, csmInt32 priority, + ACubismMotion::FinishedMotionCallback onFinishedMotionHandler) +{ + if (_modelSetting->GetMotionCount(group) == 0) + { + return InvalidMotionQueueEntryHandleValue; + } + + csmInt32 no = rand() % _modelSetting->GetMotionCount(group); + + return StartMotion(group, no, priority, onFinishedMotionHandler); +} + +void LAppModel::DoDraw() +{ + if (_model == NULL) + { + return; + } + + GetRenderer()->DrawModel(); +} + +void LAppModel::Draw(CubismMatrix44& matrix) +{ + if (_model == NULL) + { + return; + } + + matrix.MultiplyByMatrix(_modelMatrix); + + GetRenderer()->SetMvpMatrix(&matrix); + DoDraw(); +} + +csmBool LAppModel::HitTest(const csmChar* hitAreaName, csmFloat32 x, csmFloat32 y) +{ + // 透明時は当たり判定なし。 + if (_opacity < 1) + { + return false; + } + const csmInt32 count = _modelSetting->GetHitAreasCount(); + for (csmInt32 i = 0; i < count; i++) + { + if (strcmp(_modelSetting->GetHitAreaName(i), hitAreaName) == 0) + { + const CubismIdHandle drawID = _modelSetting->GetHitAreaId(i); + return IsHit(drawID, x, y); + } + } + return false; // 存在しない場合はfalse +} + +void LAppModel::SetExpression(const csmChar* expressionID) +{ + ACubismMotion* motion = _expressions[expressionID]; + if (_debugMode) + { + LAppPal::PrintLog("[APP]expression: [%s]", expressionID); + } + + if (motion != NULL) + { + _expressionManager->StartMotionPriority(motion, false, PriorityForce); + } + else + { + if (_debugMode) LAppPal::PrintLog("[APP]expression[%s] is null ", expressionID); + } +} + +void LAppModel::SetRandomExpression() +{ + if (_expressions.GetSize() == 0) + { + return; + } + + csmInt32 no = rand() % _expressions.GetSize(); + csmMap::const_iterator map_ite; + csmInt32 i = 0; + for (map_ite = _expressions.Begin(); map_ite != _expressions.End(); map_ite++) + { + if (i == no) + { + csmString name = (*map_ite).First; + SetExpression(name.GetRawString()); + return; + } + i++; + } +} + +void LAppModel::ReloadRenderer(VkDevice device, VkFormat surfaceFormat) +{ + DeleteRenderer(); + + CreateRenderer(); + + SetupTextures(device, surfaceFormat); +} + +void LAppModel::SetupTextures(VkDevice device, VkFormat surfaceFormat) +{ + _bindTextureId.Clear(); + + for (csmInt32 modelTextureNumber = 0; modelTextureNumber < _modelSetting->GetTextureCount(); modelTextureNumber++) + { + // テクスチャ名が空文字だった場合はロード・バインド処理をスキップ + if (strcmp(_modelSetting->GetTextureFileName(modelTextureNumber), "") == 0) + { + continue; + } + + //OpenGLのテクスチャユニットにテクスチャをロードする + csmString texturePath = _modelSetting->GetTextureFileName(modelTextureNumber); + texturePath = _modelHomeDir + texturePath; + + LAppTextureManager::TextureInfo* texture = LAppDelegate::GetInstance()->GetTextureManager()-> + CreateTextureFromPngFile( + texturePath.GetRawString(), surfaceFormat, VK_IMAGE_TILING_OPTIMAL, + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + + if (texture) + { + const csmUint32 textureManageId = texture->id; + CubismImageVulkan image; + if (LAppDelegate::GetInstance()->GetTextureManager()->GetTexture(textureManageId, image)) + { + GetRenderer()->BindTexture(image); + _bindTextureId.PushBack(textureManageId); + } + } + } + +#ifdef PREMULTIPLIED_ALPHA_ENABLE + GetRenderer()->IsPremultipliedAlpha(true); +#else + GetRenderer()->IsPremultipliedAlpha(false); +#endif +} + +void LAppModel::MotionEventFired(const csmString& eventValue) +{ + CubismLogInfo("%s is fired on LAppModel!!", eventValue.GetRawString()); +} + +Csm::Rendering::CubismOffscreenSurface_Vulkan& LAppModel::GetRenderBuffer() +{ + return _renderBuffer; +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppModel.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppModel.hpp new file mode 100644 index 00000000..e20f52d9 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppModel.hpp @@ -0,0 +1,199 @@ +/** + * 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. + */ + +#pragma once + +#include +#include +#include +#include +#include +#include "LAppWavFileHandler.hpp" + +/** + * @brief ユーザーが実際に使用するモデルの実装クラス
+ * モデル生成、機能コンポーネント生成、更新処理とレンダリングの呼び出しを行う。 + * + */ +class LAppModel : public Csm::CubismUserModel +{ +public: + /** + * @brief コンストラクタ + */ + LAppModel(); + + /** + * @brief デストラクタ + * + */ + virtual ~LAppModel(); + + /** + * @brief model3.jsonが置かれたディレクトリとファイルパスからモデルを生成する + * + * @param[in] device デバイス + * @param[in] dir ディレクトリ名 + * @param[in] fileName アセット名 + */ + void LoadAssets(VkDevice device, VkFormat imageFormat, const Csm::csmChar* dir, const Csm::csmChar* fileName); + + /** + * @brief レンダラを再構築する + * + * @param[in] device デバイス + */ + void ReloadRenderer(VkDevice device, VkFormat surfaceFormat); + + /** + * @brief モデルの更新処理。モデルのパラメータから描画状態を決定する。 + * + */ + void Update(); + + /** + * @brief モデルを描画する処理。モデルを描画する空間のView-Projection行列を渡す。 + * + * @param[in] IsWindowSizeChanged ウィンドウサイズが変更されたか + * @param[in] matrix View-Projection行列 + */ + void Draw(Csm::CubismMatrix44& matrix); + + /** + * @brief 引数で指定したモーションの再生を開始する。 + * + * @param[in] group モーショングループ名 + * @param[in] no グループ内の番号 + * @param[in] priority 優先度 + * @param[in] onFinishedMotionHandler モーション再生終了時に呼び出されるコールバック関数。NULLの場合、呼び出されない。 + * @return 開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」 + */ + Csm::CubismMotionQueueEntryHandle StartMotion(const Csm::csmChar* group, Csm::csmInt32 no, Csm::csmInt32 priority, + Csm::ACubismMotion::FinishedMotionCallback onFinishedMotionHandler = + NULL); + + /** + * @brief ランダムに選ばれたモーションの再生を開始する。 + * + * @param[in] group モーショングループ名 + * @param[in] priority 優先度 + * @param[in] onFinishedMotionHandler モーション再生終了時に呼び出されるコールバック関数。NULLの場合、呼び出されない。 + * @return 開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」 + */ + Csm::CubismMotionQueueEntryHandle StartRandomMotion(const Csm::csmChar* group, Csm::csmInt32 priority, + Csm::ACubismMotion::FinishedMotionCallback + onFinishedMotionHandler = NULL); + + /** + * @brief 引数で指定した表情モーションをセットする + * + * @param expressionID 表情モーションのID + */ + void SetExpression(const Csm::csmChar* expressionID); + + /** + * @brief ランダムに選ばれた表情モーションをセットする + * + */ + void SetRandomExpression(); + + /** + * @brief イベントの発火を受け取る + * + */ + virtual void MotionEventFired(const Live2D::Cubism::Framework::csmString& eventValue); + + /** + * @brief 当たり判定テスト。
+ * 指定IDの頂点リストから矩形を計算し、座標が矩形範囲内か判定する。 + * + * @param[in] hitAreaName 当たり判定をテストする対象のID + * @param[in] x 判定を行うX座標 + * @param[in] y 判定を行うY座標 + */ + virtual Csm::csmBool HitTest(const Csm::csmChar* hitAreaName, Csm::csmFloat32 x, Csm::csmFloat32 y); + + /** + * @brief 別ターゲットに描画する際に使用するバッファの取得 + */ + Csm::Rendering::CubismOffscreenSurface_Vulkan& GetRenderBuffer(); + +protected: + /** + * @brief モデルを描画する処理。モデルを描画する空間のView-Projection行列を渡す。 + * + */ + void DoDraw(); + +private: + /** + * @brief model3.jsonからモデルを生成する。
+ * model3.jsonの記述に従ってモデル生成、モーション、物理演算などのコンポーネント生成を行う。 + * + * @param[in] setting ICubismModelSettingのインスタンス + * + */ + void SetupModel(Csm::ICubismModelSetting* setting); + + /** + * @brief OpenGLのテクスチャユニットにテクスチャをロードする + * + * @param[in] device デバイス + */ + void SetupTextures(VkDevice device, VkFormat surfaceFormat); + + /** + * @brief モーションデータをグループ名から一括でロードする。
+ * モーションデータの名前は内部でModelSettingから取得する。 + * + * @param[in] group モーションデータのグループ名 + */ + void PreloadMotionGroup(const Csm::csmChar* group); + + /** + * @brief モーションデータをグループ名から一括で解放する。
+ * モーションデータの名前は内部でModelSettingから取得する。 + * + * @param[in] group モーションデータのグループ名 + */ + void ReleaseMotionGroup(const Csm::csmChar* group) const; + + /** + * @brief すべてのモーションデータの解放 + * + * すべてのモーションデータを解放する。 + */ + void ReleaseMotions(); + + /** + * @brief すべての表情データの解放 + * + * すべての表情データを解放する。 + */ + void ReleaseExpressions(); + + Csm::ICubismModelSetting* _modelSetting; ///< モデルセッティング情報 + Csm::csmString _modelHomeDir; ///< モデルセッティングが置かれたディレクトリ + Csm::csmFloat32 _userTimeSeconds; ///< デルタ時間の積算値[秒] + Csm::csmVector _eyeBlinkIds; ///< モデルに設定されたまばたき機能用パラメータID + Csm::csmVector _lipSyncIds; ///< モデルに設定されたリップシンク機能用パラメータID + Csm::csmMap _motions; ///< 読み込まれているモーションのリスト + Csm::csmMap _expressions; ///< 読み込まれている表情のリスト + Csm::csmVector _hitArea; + Csm::csmVector _userArea; + const Csm::CubismId* _idParamAngleX; ///< パラメータID: ParamAngleX + const Csm::CubismId* _idParamAngleY; ///< パラメータID: ParamAngleX + const Csm::CubismId* _idParamAngleZ; ///< パラメータID: ParamAngleX + const Csm::CubismId* _idParamBodyAngleX; ///< パラメータID: ParamBodyAngleX + const Csm::CubismId* _idParamEyeBallX; ///< パラメータID: ParamEyeBallX + const Csm::CubismId* _idParamEyeBallY; ///< パラメータID: ParamEyeBallXY + + LAppWavFileHandler _wavFileHandler; ///< wavファイルハンドラ + + Csm::Rendering::CubismOffscreenSurface_Vulkan _renderBuffer; ///< フレームバッファ以外の描画先 + Csm::csmVector _bindTextureId; ///< テクスチャID +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppPal.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppPal.cpp new file mode 100644 index 00000000..4fc4ceca --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppPal.cpp @@ -0,0 +1,93 @@ +/** + * 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. + */ + +#include "LAppPal.hpp" +#include +#include +#include +#include +#include +#include +#include +#include "LAppDefine.hpp" + +using std::endl; +using namespace Csm; +using namespace std; +using namespace LAppDefine; + +double LAppPal::s_currentFrame = 0.0; +double LAppPal::s_lastFrame = 0.0; +double LAppPal::s_deltaTime = 0.0; + +csmByte* LAppPal::LoadFileAsBytes(const string filePath, csmSizeInt* outSize) +{ + //filePath;// + const char* path = filePath.c_str(); + + int size = 0; + struct stat statBuf; + if (stat(path, &statBuf) == 0) + { + size = statBuf.st_size; + } + + std::fstream file; + char* buf = new char[size]; + + file.open(path, std::ios::in | std::ios::binary); + if (!file.is_open()) + { + if (DebugLogEnable) + { + PrintLog("file open error"); + } + return NULL; + } + file.read(buf, size); + file.close(); + + *outSize = size; + return reinterpret_cast(buf); +} + +void LAppPal::ReleaseBytes(csmByte* byteData) +{ + delete[] byteData; +} + +csmFloat32 LAppPal::GetDeltaTime() +{ + return static_cast(s_deltaTime); +} + +void LAppPal::UpdateTime() +{ + s_currentFrame = glfwGetTime(); + s_deltaTime = s_currentFrame - s_lastFrame; + s_lastFrame = s_currentFrame; +} + +void LAppPal::PrintLog(const csmChar* format, ...) +{ + va_list args; + csmChar buf[256]; + va_start(args, format); + vsnprintf_s(buf, sizeof(buf), format, args); // 標準出力でレンダリング +#ifdef CSM_DEBUG_MEMORY_LEAKING +// メモリリークチェック時は大量の標準出力がはしり重いのでprintfを利用する + std::printf(buf); +#else + std::cerr << buf << std::endl; +#endif + va_end(args); +} + +void LAppPal::PrintMessage(const csmChar* message) +{ + PrintLog("%s", message); +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppPal.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppPal.hpp new file mode 100644 index 00000000..dcf7cd87 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppPal.hpp @@ -0,0 +1,77 @@ +/** + * 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. + */ + +#pragma once + +#include +#include + +/** +* @brief プラットフォーム依存機能を抽象化する Cubism Platform Abstraction Layer. +* +* ファイル読み込みや時刻取得等のプラットフォームに依存する関数をまとめる +* +*/ +class LAppPal +{ +public: + /** + * @brief ファイルをバイトデータとして読み込む + * + * ファイルをバイトデータとして読み込む + * + * @param[in] filePath 読み込み対象ファイルのパス + * @param[out] outSize ファイルサイズ + * @return バイトデータ + */ + static Csm::csmByte* LoadFileAsBytes(const std::string filePath, Csm::csmSizeInt* outSize); + + /** + * @brief バイトデータを解放する + * + * バイトデータを解放する + * + * @param[in] byteData 解放したいバイトデータ + */ + static void ReleaseBytes(Csm::csmByte* byteData); + + /** + * @biref デルタ時間(前回フレームとの差分)を取得する + * + * @return デルタ時間[ms] + * + */ + static Csm::csmFloat32 GetDeltaTime(); + + static void UpdateTime(); + + /** + * @brief ログを出力する + * + * ログを出力する + * + * @param[in] format 書式付文字列 + * @param[in] ... (可変長引数)文字列 + * + */ + static void PrintLog(const Csm::csmChar* format, ...); + + /** + * @brief メッセージを出力する + * + * メッセージを出力する + * + * @param[in] message 文字列 + * + */ + static void PrintMessage(const Csm::csmChar* message); + +private: + static double s_currentFrame; + static double s_lastFrame; + static double s_deltaTime; +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppSprite.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppSprite.cpp new file mode 100644 index 00000000..d968557c --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppSprite.cpp @@ -0,0 +1,269 @@ +/** + * 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. + */ + +#include "LAppSprite.hpp" +#include "LAppTextureManager.hpp" +#include "LAppDelegate.hpp" + +using namespace Csm; + +LAppSprite::LAppSprite( + VkDevice device, VkPhysicalDevice physicalDevice, + float x, float y, float width, float height, + Csm::csmUint32 textureId, VkDescriptorSetLayout descriptorSetLayout) + : _rect() +{ + _rect.left = (x - width * 0.5f); + _rect.right = (x + width * 0.5f); + _rect.up = (y - height * 0.5f); + _rect.down = (y + height * 0.5f); + _textureId = textureId; + + _spriteColor[0] = 1.0f; + _spriteColor[1] = 1.0f; + _spriteColor[2] = 1.0f; + _spriteColor[3] = 1.0f; + + if (_vertexBuffer.GetBuffer() == VK_NULL_HANDLE) + { + VkDeviceSize bufferSize = sizeof(SpriteVertex) * VertexNum; // 総長 構造体サイズ*個数 + _stagingBuffer.CreateBuffer(device, physicalDevice, bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + _stagingBuffer.Map(device, bufferSize); + _vertexBuffer.CreateBuffer(device, physicalDevice, bufferSize, + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + } + + if (_indexBuffer.GetBuffer() == VK_NULL_HANDLE) + { + uint16_t idx[IndexNum] = { + 0, 1, 2, + 1, 3, 2 + }; + + uint64_t bufferSize = sizeof(uint16_t) * IndexNum; + + CubismBufferVulkan stagingBuffer; + stagingBuffer.CreateBuffer(device, physicalDevice, bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + stagingBuffer.Map(device, bufferSize); + stagingBuffer.MemCpy(idx, bufferSize); + stagingBuffer.UnMap(device); + + _indexBuffer.CreateBuffer(device, physicalDevice, bufferSize, + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + + VkCommandBuffer commandBuffer = LAppDelegate::GetInstance()->GetVulkanManager()->BeginSingleTimeCommands(); + VkBufferCopy copyRegion{}; + copyRegion.size = bufferSize; + vkCmdCopyBuffer(commandBuffer, stagingBuffer.GetBuffer(), _indexBuffer.GetBuffer(), 1, ©Region); + LAppDelegate::GetInstance()->GetVulkanManager()->SubmitCommand(commandBuffer); + + stagingBuffer.Destroy(device); + } + + if (_uniformBuffer.GetBuffer() == VK_NULL_HANDLE) + { + _uniformBuffer.CreateBuffer(device, physicalDevice, sizeof(SpriteUBO), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + _uniformBuffer.Map(device, VK_WHOLE_SIZE); + } + + VkDescriptorPoolSize poolSizes[2]{}; + poolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + poolSizes[0].descriptorCount = 1; + poolSizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + poolSizes[1].descriptorCount = 1; + + VkDescriptorPoolCreateInfo poolInfo{}; + poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + poolInfo.poolSizeCount = 2; + poolInfo.pPoolSizes = poolSizes; + poolInfo.maxSets = 1; + + if (vkCreateDescriptorPool(device, &poolInfo, nullptr, &_descriptorPool) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to create descriptor pool!"); + } + + CreateDescriptorSet(device, descriptorSetLayout); + if (textureId != 0) + { + CubismImageVulkan image; + LAppDelegate::GetInstance()->GetTextureManager()->GetTexture(_textureId, image); + SetDescriptorUpdated(false); + UpdateDescriptorSet(device, image.GetView(), image.GetSampler()); + } +} + +LAppSprite::~LAppSprite() +{ + LAppDelegate::GetInstance()->GetTextureManager()->ReleaseTexture(_textureId); + VkDevice device = LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice(); + _vertexBuffer.Destroy(device); + _stagingBuffer.Destroy(device); + _indexBuffer.Destroy(device); + _uniformBuffer.Destroy(device); + vkDestroyDescriptorPool(device, _descriptorPool, nullptr); +} + +void LAppSprite::CreateDescriptorSet(VkDevice device, VkDescriptorSetLayout descriptorSetLayout) +{ + VkDescriptorSetAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + allocInfo.descriptorPool = _descriptorPool; + allocInfo.descriptorSetCount = 1; + allocInfo.pSetLayouts = &descriptorSetLayout; + if (vkAllocateDescriptorSets(device, &allocInfo, &_descriptorSet) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to allocate descriptor sets!"); + } +} + +void LAppSprite::UpdateData() const +{ + // 画面サイズを取得する + int maxWidth, maxHeight; + glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &maxWidth, &maxHeight); + + if (maxWidth == 0 || maxHeight == 0) + { + return; // この際は描画できず + } + + SpriteVertex vtx[VertexNum] = { + {0.0f, 0.0f, 0.0f, 0.0f}, + {0.5f, 0.0f, 1.0f, 0.0f}, + {0.0f, 0.5f, 0.0f, 1.0f}, + {0.5f, 0.5f, 1.0f, 1.0f}, + }; + + vtx[0].x = (_rect.left - maxWidth * 0.5f) / (maxWidth * 0.5f); + vtx[0].y = (_rect.down - maxHeight * 0.5f) / (maxHeight * 0.5f); + vtx[1].x = (_rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f); + vtx[1].y = (_rect.down - maxHeight * 0.5f) / (maxHeight * 0.5f); + vtx[2].x = (_rect.left - maxWidth * 0.5f) / (maxWidth * 0.5f); + vtx[2].y = (_rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f); + vtx[3].x = (_rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f); + vtx[3].y = (_rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f); + + SpriteVertex vertex; + csmVector vertices; + for (SpriteVertex vt : vtx) + { + vertex.x = vt.x; + vertex.y = vt.y; + vertex.u = vt.u; + vertex.v = vt.v; + vertices.PushBack(vertex); + } + + VkCommandBuffer commandBuffer = LAppDelegate::GetInstance()->GetVulkanManager()->BeginSingleTimeCommands(); + csmUint32 bufferSize = sizeof(SpriteVertex) * vertices.GetSize(); + + _stagingBuffer.MemCpy(vertices.GetPtr(), bufferSize); + + VkBufferCopy copyRegion{}; + copyRegion.size = bufferSize; + vkCmdCopyBuffer(commandBuffer, _stagingBuffer.GetBuffer(), _vertexBuffer.GetBuffer(), 1, ©Region); + + LAppDelegate::GetInstance()->GetVulkanManager()->SubmitCommand(commandBuffer); + + //ユニフォームバッファ設定 + SpriteUBO _ubo; + _ubo.spriteColor[0] = _spriteColor[0]; + _ubo.spriteColor[1] = _spriteColor[1]; + _ubo.spriteColor[2] = _spriteColor[2]; + _ubo.spriteColor[3] = _spriteColor[3]; + _uniformBuffer.MemCpy(&_ubo, sizeof(SpriteUBO)); +} + +void LAppSprite::UpdateDescriptorSet(VkDevice device, VkImageView view, VkSampler sampler) +{ + if (!isDescriptorUpdated) + { + csmVector descriptorWrites; + descriptorWrites.Resize(2); + + VkDescriptorBufferInfo uniformBufferInfo{}; + uniformBufferInfo.buffer = _uniformBuffer.GetBuffer(); + uniformBufferInfo.offset = 0; + uniformBufferInfo.range = VK_WHOLE_SIZE; + + descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + descriptorWrites[0].dstSet = _descriptorSet; + descriptorWrites[0].dstBinding = 0; + descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + descriptorWrites[0].descriptorCount = 1; + descriptorWrites[0].pBufferInfo = &uniformBufferInfo; + + VkDescriptorImageInfo imageInfo; + imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + imageInfo.imageView = view; + imageInfo.sampler = sampler; + + descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + descriptorWrites[1].dstSet = _descriptorSet; + descriptorWrites[1].dstBinding = 1; + descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + descriptorWrites[1].descriptorCount = 1; + descriptorWrites[1].pImageInfo = &imageInfo; + + vkUpdateDescriptorSets(device, descriptorWrites.GetSize(), descriptorWrites.GetPtr(), 0, NULL); + isDescriptorUpdated = true; + } +} + +void LAppSprite::SetDescriptorUpdated(bool frag) +{ + isDescriptorUpdated = frag; +} + +void LAppSprite::Render(VkCommandBuffer commandBuffer, VkPipelineLayout pipelineLayout) +{ + UpdateData(); + VkBuffer vertexBuffers[] = {_vertexBuffer.GetBuffer()}; + VkDeviceSize offsets[] = {0}; + vkCmdBindVertexBuffers(commandBuffer, 0, 1, vertexBuffers, offsets); + vkCmdBindIndexBuffer(commandBuffer, _indexBuffer.GetBuffer(), 0, VK_INDEX_TYPE_UINT16); + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &_descriptorSet, 0,nullptr); + vkCmdDrawIndexed(commandBuffer, IndexNum, 1, 0, 0, 0); +} + +bool LAppSprite::IsHit(float pointX, float pointY) const +{ + // 画面サイズを取得する + int maxWidth, maxHeight; + glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &maxWidth, &maxHeight); + + if (maxWidth == 0 || maxHeight == 0) + { + return false; // この際は描画できず + } + + float y = pointY; + + return (pointX >= _rect.left && pointX <= _rect.right && y >= _rect.up && y <= _rect.down); +} + +void LAppSprite::SetColor(float r, float g, float b, float a) +{ + _spriteColor[0] = r; + _spriteColor[1] = g; + _spriteColor[2] = b; + _spriteColor[3] = a; +} + +void LAppSprite::ResetRect(float x, float y, float width, float height) +{ + _rect.left = (x - width * 0.5f); + _rect.right = (x + width * 0.5f); + _rect.up = (y - height * 0.5f); + _rect.down = (y + height * 0.5f); +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppSprite.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppSprite.hpp new file mode 100644 index 00000000..8d2ac121 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppSprite.hpp @@ -0,0 +1,183 @@ +/** + * 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. + */ + +#pragma once +#include + +/** +* @brief スプライトを実装するクラス。 +* +* テクスチャID、Rectの管理。 +* +*/ +class LAppSprite +{ +public: + /** + * @brief Rect 構造体。 + */ + struct Rect + { + public: + float left; ///< 左辺 + float right; ///< 右辺 + float up; ///< 上辺 + float down; ///< 下辺 + }; + + /** + * @brief 頂点情報を保持する構造体 + * + */ + struct SpriteVertex + { + float x, y; // Position + float u, v; // UVs + + /** + * @brief 頂点入力のバインド設定を指定する + */ + static VkVertexInputBindingDescription GetBindingDescription() + { + VkVertexInputBindingDescription bindingDescription{}; + bindingDescription.binding = 0; + bindingDescription.stride = sizeof(SpriteVertex); + bindingDescription.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; + return bindingDescription; + } + + /** + * @brief 頂点入力の構造を指定する + */ + static void GetAttributeDescriptions(VkVertexInputAttributeDescription attributeDescriptions[2]) + { + attributeDescriptions[0].binding = 0; + attributeDescriptions[0].location = 0; + attributeDescriptions[0].format = VK_FORMAT_R32G32_SFLOAT; + attributeDescriptions[0].offset = offsetof(SpriteVertex, x); + attributeDescriptions[1].binding = 0; + attributeDescriptions[1].location = 1; + attributeDescriptions[1].format = VK_FORMAT_R32G32_SFLOAT; + attributeDescriptions[1].offset = offsetof(SpriteVertex, u); + } + }; + + /** + * @brief スプライト用ユニフォームバッファオブジェクトの中身を保持する構造体 + * + */ + struct SpriteUBO + { + float spriteColor[4]; + }; + + /** + * @brief コンストラクタ + * + * @param[in] x x座標 + * @param[in] y y座標 + * @param[in] width 横幅 + * @param[in] height 高さ + * @param[in] textureId テクスチャID + * @param[in] descriptorSetLayout ディスクリプタセット + */ + LAppSprite( + VkDevice device, VkPhysicalDevice physicalDevice, + float x, float y, float width, float height, + uint32_t textureId, VkDescriptorSetLayout descriptorSetLayout + ); + + /** + * @brief デストラクタ + */ + ~LAppSprite(); + + /** + * @brief ディスクリプタセットを作成する + * @param[in] device デバイス + * @param[in] descriptorSetLayout ディスクリプタセットレイアウト + */ + void CreateDescriptorSet(VkDevice device, VkDescriptorSetLayout descriptorSetLayout); + + /** + * @brief ユニフォームバッファを更新する + */ + void UpdateData() const; + + /** + * @brief ディスクリプタセットを更新する + * + * @param[in] device デバイス + * @param[in] view テクスチャビュー + * @param[in] sampler テクスチャサンプラー + */ + void UpdateDescriptorSet(VkDevice device, VkImageView view, VkSampler sampler); + + /** + * @brief ディスクリプタセットの更新フラグを設定する + * + * @param[in] frag フラグ + */ + void SetDescriptorUpdated(bool frag); + + /** + * @brief 描画する + * + * @param[in] commandBuffer コマンドバッファ + * @param[in] pipelineLayout パイプラインレイアウト + */ + void Render(VkCommandBuffer commandBuffer, VkPipelineLayout pipelineLayout); + + /** + * @brief コンストラクタ + * + * @param[in] pointX x座標 + * @param[in] pointY y座標 + */ + bool IsHit(float pointX, float pointY) const; + + /** + * @brief 色設定 + * + * @param[in] r (0.0~1.0) + * @param[in] g (0.0~1.0) + * @param[in] b (0.0~1.0) + * @param[in] a (0.0~1.0) + */ + void SetColor(float r, float g, float b, float a); + + /** + * @brief サイズ再設定 + * + * @param[in] x x座標 + * @param[in] y y座標 + * @param[in] width 横幅 + * @param[in] height 高さ + */ + void ResetRect(float x, float y, float width, float height); + + /** + * @brief Getter テクスチャID + * @return テクスチャIDを返す + */ + uint32_t GetTextureId() { return _textureId; } + + +private: + static const uint16_t VertexNum = 4; + static const uint16_t IndexNum = 6; + Csm::csmUint32 _textureId; ///< テクスチャID + Rect _rect; ///< 矩形 + float _spriteColor[4]; ///< 表示カラー + Live2D::Cubism::Framework::CubismBufferVulkan _vertexBuffer; ///< 頂点バッファ + Live2D::Cubism::Framework::CubismBufferVulkan _stagingBuffer; ///< ステージングバッファ + Live2D::Cubism::Framework::CubismBufferVulkan _indexBuffer; ///< インデックスバッファ + Live2D::Cubism::Framework::CubismBufferVulkan _uniformBuffer; ///< ユニフォームバッファ + VkDescriptorPool _descriptorPool; ///< ディスクリプタプール + VkDescriptorSet _descriptorSet; ///< ディスクリプタセット モデルの数 + bool isDescriptorUpdated; +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppTextureManager.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppTextureManager.cpp new file mode 100644 index 00000000..08680a27 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppTextureManager.cpp @@ -0,0 +1,323 @@ +/** + * 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. + */ + +#include "LAppTextureManager.hpp" +#include +#define STBI_NO_STDIO +#define STBI_ONLY_PNG +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" +#include "LAppPal.hpp" +#include "LAppDelegate.hpp" + +using namespace Live2D::Cubism::Framework; + +LAppTextureManager::LAppTextureManager() +{ + _sequenceId = 0; +} + +LAppTextureManager::~LAppTextureManager() +{ + ReleaseTextures(); +} + +void LAppTextureManager::CopyBufferToImage(VkCommandBuffer commandBuffer, const VkBuffer& buffer, VkImage image, + uint32_t width, uint32_t height) +{ + VkBufferImageCopy region{}; + region.bufferOffset = 0; + region.bufferRowLength = 0; + region.bufferImageHeight = 0; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.mipLevel = 0; + region.imageSubresource.baseArrayLayer = 0; + region.imageSubresource.layerCount = 1; + region.imageOffset = {0, 0, 0}; + region.imageExtent = { + width, + height, + 1 + }; + + vkCmdCopyBufferToImage(commandBuffer, buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); +} + +void LAppTextureManager::GenerateMipmaps(CubismImageVulkan image, uint32_t texWidth, uint32_t texHeight, + uint32_t mipLevels) +{ + VkCommandBuffer commandBuffer = LAppDelegate::GetInstance()->GetVulkanManager()->BeginSingleTimeCommands(); + + VkImageMemoryBarrier barrier{}; + barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier.image = image.GetImage(); + barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + barrier.subresourceRange.baseArrayLayer = 0; + barrier.subresourceRange.layerCount = 1; + barrier.subresourceRange.levelCount = 1; + + int32_t mipWidth = texWidth; + int32_t mipHeight = texHeight; + + for (uint32_t i = 1; i < mipLevels; i++) + { + barrier.subresourceRange.baseMipLevel = i - 1; + barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; + barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + + vkCmdPipelineBarrier(commandBuffer, + VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, + 0, nullptr, + 0, nullptr, + 1, &barrier); + + VkImageBlit blit{}; + blit.srcOffsets[0] = {0, 0, 0}; + blit.srcOffsets[1] = {mipWidth, mipHeight, 1}; + blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + blit.srcSubresource.mipLevel = i - 1; + blit.srcSubresource.baseArrayLayer = 0; + blit.srcSubresource.layerCount = 1; + blit.dstOffsets[0] = {0, 0, 0}; + blit.dstOffsets[1] = {mipWidth > 1 ? mipWidth / 2 : 1, mipHeight > 1 ? mipHeight / 2 : 1, 1}; + blit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + blit.dstSubresource.mipLevel = i; + blit.dstSubresource.baseArrayLayer = 0; + blit.dstSubresource.layerCount = 1; + + vkCmdBlitImage(commandBuffer, + image.GetImage(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + image.GetImage(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 1, &blit, + VK_FILTER_LINEAR); + + barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; + barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + barrier.srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + + vkCmdPipelineBarrier(commandBuffer, + VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, + 0, nullptr, + 0, nullptr, + 1, &barrier); + + if (mipWidth > 1) mipWidth /= 2; + if (mipHeight > 1) mipHeight /= 2; + } + + barrier.subresourceRange.baseMipLevel = mipLevels - 1; + barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + barrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + + vkCmdPipelineBarrier(commandBuffer, + VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, + 0, nullptr, + 0, nullptr, + 1, &barrier); + + LAppDelegate::GetInstance()->GetVulkanManager()->SubmitCommand(commandBuffer); +} + +LAppTextureManager::TextureInfo* LAppTextureManager::CreateTextureFromPngFile( + std::string fileName, VkFormat format, + VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags imageProperties) +{ + VkDevice device = LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice(); + VkPhysicalDevice physicalDevice = LAppDelegate::GetInstance()->GetVulkanManager()->GetPhysicalDevice(); + + //search loaded texture already. + for (Csm::csmUint32 i = 0; i < _texturesInfo.GetSize(); i++) + { + if (_texturesInfo[i]->fileName == fileName) + { + return _texturesInfo[i]; + } + } + + int width, height, channels; + unsigned int size; + unsigned char* png; + unsigned char* address; + + address = LAppPal::LoadFileAsBytes(fileName, &size); + + // png情報を取得する + png = stbi_load_from_memory( + address, + static_cast(size), + &width, + &height, + &channels, + STBI_rgb_alpha); + { +#ifdef PREMULTIPLIED_ALPHA_ENABLE + unsigned int* fourBytes = reinterpret_cast(png); + for (int i = 0; i < width * height; i++) + { + unsigned char* p = png + i * 4; + fourBytes[i] = Premultiply(p[0], p[1], p[2], p[3]); + } +#endif + } + + VkDeviceSize imageSize = static_cast(width * height * 4); + if (!png) + { + LAppPal::PrintLog("could'nt load texture image."); + } + + CubismBufferVulkan stagingBuffer; + stagingBuffer.CreateBuffer(device, physicalDevice, imageSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + stagingBuffer.Map(device, imageSize); + stagingBuffer.MemCpy(png, imageSize); + stagingBuffer.UnMap(device); + + // 解放処理 + stbi_image_free(png); + LAppPal::ReleaseBytes(address); + + _mipLevels = static_cast(std::floor(std::log2(std::max(width, height)))) + 1; + + CubismImageVulkan textureImage; + + textureImage.CreateImage(device, physicalDevice, width, height, _mipLevels, format, tiling, usage); + VkCommandBuffer commandBuffer = LAppDelegate::GetInstance()->GetVulkanManager()->BeginSingleTimeCommands(); + textureImage.SetImageLayout(commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, _mipLevels); + CopyBufferToImage(commandBuffer, stagingBuffer.GetBuffer(), textureImage.GetImage(), width, height); + LAppDelegate::GetInstance()->GetVulkanManager()->SubmitCommand(commandBuffer); + GenerateMipmaps(textureImage, width, height, _mipLevels); + textureImage.CreateView(device, format, VK_IMAGE_ASPECT_COLOR_BIT, _mipLevels); + VkPhysicalDeviceProperties properties{}; + vkGetPhysicalDeviceProperties(physicalDevice, &properties); + textureImage.CreateSampler(device, properties.limits.maxSamplerAnisotropy, _mipLevels); + _textures.PushBack(textureImage); + + LAppTextureManager::TextureInfo* textureInfo = new LAppTextureManager::TextureInfo(); + if (textureInfo != NULL) + { + _sequenceId++; + textureInfo->fileName = fileName; + textureInfo->width = width; + textureInfo->height = height; + textureInfo->id = _sequenceId; + _texturesInfo.PushBack(textureInfo); + } + stagingBuffer.Destroy(device); + return textureInfo; +} + +void LAppTextureManager::ReleaseTextures() +{ + VkDevice device = LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice(); + + for (Csm::csmUint32 i = 0; i < _texturesInfo.GetSize(); i++) + { + _textures[i].Destroy(device); + delete _texturesInfo[i]; + } + + _texturesInfo.Clear(); +} + +void LAppTextureManager::ReleaseTexture(Csm::csmUint32 textureId) +{ + VkDevice device = LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice(); + + for (Csm::csmUint32 i = 0; i < _texturesInfo.GetSize(); i++) + { + if (_texturesInfo[i]->id != textureId) + { + continue; + } + // ID一致 + // info除去 + delete _texturesInfo[i]; + + // 実体除去 + VkDevice device = LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice(); + _textures[i].Destroy(device); + + _texturesInfo.Remove(i); + _textures.Remove(i); + break; + } + if (_texturesInfo.GetSize() == 0) + { + _texturesInfo.Clear(); + } + if (_textures.GetSize() == 0) + { + _textures.Clear(); + } +} + +void LAppTextureManager::ReleaseTexture(std::string fileName) +{ + for (Csm::csmUint32 i = 0; i < _texturesInfo.GetSize(); i++) + { + if (_texturesInfo[i]->fileName == fileName) + { + // info除去 + delete _texturesInfo[i]; + + // 実体除去 + if (_texturesInfo[i] != VK_NULL_HANDLE) + { + VkDevice device = LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice(); + _textures[i].Destroy(device); + _texturesInfo[i] = VK_NULL_HANDLE; + } + _texturesInfo.Remove(i); + _texturesInfo.Remove(i); + break; + } + } + if (_texturesInfo.GetSize() == 0) + { + _texturesInfo.Clear(); + } + if (_texturesInfo.GetSize() == 0) + { + _texturesInfo.Clear(); + } + +} + +LAppTextureManager::TextureInfo* LAppTextureManager::GetTextureInfoById(uint32_t textureId) const +{ + for (Csm::csmUint32 i = 0; i < _texturesInfo.GetSize(); i++) + { + if (_texturesInfo[i]->id == textureId) + { + return _texturesInfo[i]; + } + } + + return NULL; +} + +bool LAppTextureManager::GetTexture(Csm::csmUint64 textureId, CubismImageVulkan& retTexture) const +{ + for (Csm::csmUint32 i = 0; i < _texturesInfo.GetSize(); i++) + { + if (_texturesInfo[i]->id == textureId) + { + retTexture = _textures[i]; + return true; + } + } + + return false; +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppTextureManager.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppTextureManager.hpp new file mode 100644 index 00000000..af9eed87 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppTextureManager.hpp @@ -0,0 +1,150 @@ +/** + * 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. + */ + +#pragma once +#include +#include +#include +#include + +/** +* @brief テクスチャ管理クラス +* +* 画像読み込み、管理を行うクラス。 +*/ +class LAppTextureManager +{ +public: + /** + * @brief 画像情報構造体 + */ + struct TextureInfo + { + uint32_t id = 0; ///< テクスチャID + int width = 0; ///< 横幅 + int height = 0; ///< 高さ + std::string fileName; ///< ファイル名 + }; + + /** + * @brief コンストラクタ + */ + LAppTextureManager(); + + /** + * @brief デストラクタ + * + */ + ~LAppTextureManager(); + + /** + * @brief プリマルチプライ処理 + * + * @param[in] red 画像のRed値 + * @param[in] green 画像のGreen値 + * @param[in] blue 画像のBlue値 + * @param[in] alpha 画像のAlpha値 + * + * @return プリマルチプライ処理後のカラー値 + */ + inline unsigned int Premultiply(unsigned char red, unsigned char green, unsigned char blue, unsigned char alpha) + { + return static_cast( + (red * (alpha + 1) >> 8) | + ((green * (alpha + 1) >> 8) << 8) | + ((blue * (alpha + 1) >> 8) << 16) | + (((alpha)) << 24) + ); + } + + /** + * @brief バッファをイメージにコピーする + * + * @param[in] commandBuffer コマンドバッファ + * @param[in] buffer バッファ + * @param[in] image イメージ + * @param[in] width 画像の横幅 + * @param[in] height 画像の縦幅 + */ + void CopyBufferToImage(VkCommandBuffer commandBuffer, const VkBuffer& buffer, VkImage image, uint32_t width, + uint32_t height); + + /** + * @brief ミップマップを作成する + * + * @param[in] image イメージ + * @param[in] texWidth 画像の幅 + * @param[in] texHeight 画像の高さ + * @param[in] mipLevels ミップレべル + */ + void GenerateMipmaps(Live2D::Cubism::Framework::CubismImageVulkan image, uint32_t texWidth, uint32_t texHeight, + uint32_t mipLevels); + + /** + * @brief 画像ファイルを読み込む + * + * @param[in] fileName 読み込む画像ファイルパス名 + * @param[in] format 画像フォーマット + * @param[in] tiling 画像データのタイリング配置の設定 + * @param[in] usage     画像の使用フラグ + * @param[in] imageProperties + * + * @return 作成したイメージのリソース。読み込み失敗時はNULLを返す。 + */ + TextureInfo* CreateTextureFromPngFile( + std::string fileName, + VkFormat format, VkImageTiling tiling, VkImageUsageFlags usage, VkMemoryPropertyFlags imageProperties + ); + + /** + * @brief 画像の解放 + * + * 配列に存在する画像全てを解放する + */ + void ReleaseTextures(); + + /** + * @brief 画像の解放 + * + * 指定したテクスチャIDの画像を解放する + * @param[in] textureId 解放するテクスチャID + **/ + void ReleaseTexture(Csm::csmUint32 textureId); + + /** + * @brief 画像の解放 + * + * 指定した名前の画像を解放する + * @param[in] fileName 解放する画像ファイルパス名 + **/ + void ReleaseTexture(std::string fileName); + + /** + * @brief テクスチャIDからテクスチャ情報を得る + * + * @param textureId[in] 取得したいテクスチャID + * + * @return テクスチャが存在していればTextureInfoが返る + */ + TextureInfo* GetTextureInfoById(uint32_t textureId) const; + + /** + * @brief テクスチャIDからテクスチャ情報を得る + * + * @param textureId[in] 取得したいテクスチャID + * @param retTexture 取得したいテクスチャを入れる変数 + * + * @return テクスチャが存在していればTextureInfoが返る + */ + bool GetTexture(Csm::csmUint64 textureId, Live2D::Cubism::Framework::CubismImageVulkan& retTexture) const; + +private: + Csm::csmVector _texturesInfo; ///< イメージのリソース + Csm::csmVector _textures; + Csm::csmUint32 _sequenceId = 0; ///< イメージのインデックス + uint32_t _mipLevels = 0; ///< ミップレベル +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppView.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppView.cpp new file mode 100644 index 00000000..50f1695d --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppView.cpp @@ -0,0 +1,691 @@ +/** + * 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. + */ + +#include "LAppView.hpp" +#include +#include +#include "LAppPal.hpp" +#include "LAppDelegate.hpp" +#include "LAppLive2DManager.hpp" +#include "LAppTextureManager.hpp" +#include "LAppDefine.hpp" +#include "TouchManager.hpp" +#include "LAppSprite.hpp" +#include "LAppModel.hpp" + +using namespace std; +using namespace LAppDefine; + +LAppView::LAppView(): + _back(NULL) + , _gear(NULL) + , _power(NULL) + , _renderSprite(NULL) + , _renderTarget(SelectTarget_None) + , _fragShaderModule(VK_NULL_HANDLE) + , _vertShaderModule(VK_NULL_HANDLE) + , _descriptorSetLayout(VK_NULL_HANDLE) + , _pipeline(VK_NULL_HANDLE) + , _pipelineLayout(VK_NULL_HANDLE) +{ + _clearColor[0] = 1.0f; + _clearColor[1] = 1.0f; + _clearColor[2] = 1.0f; + _clearColor[3] = 0.0f; + + // タッチ関係のイベント管理 + _touchManager = new TouchManager(); + + // デバイス座標からスクリーン座標に変換するための + _deviceToScreen = new CubismMatrix44(); + + // 画面の表示の拡大縮小や移動の変換を行う行列 + _viewMatrix = new CubismViewMatrix(); +} + +LAppView::~LAppView() +{ + VkDevice device = LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice(); + Cleanup(device); + vkDestroyDescriptorSetLayout(device, _descriptorSetLayout, nullptr); + vkDestroyShaderModule(device, _vertShaderModule, nullptr); + vkDestroyShaderModule(device, _fragShaderModule, nullptr); + _renderBuffer.DestroyOffscreenSurface(device); + delete _renderSprite; + delete _viewMatrix; + delete _deviceToScreen; + delete _touchManager; + delete _back; + delete _gear; + delete _power; +} + +void LAppView::Initialize() +{ + int width, height; + glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &width, &height); + + if (width == 0 || height == 0) + { + return; + } + + // 縦サイズを基準とする + float ratio = static_cast(width) / static_cast(height); + float left = -ratio; + float right = ratio; + float bottom = ViewLogicalLeft; + float top = ViewLogicalRight; + + _viewMatrix->SetScreenRect(left, right, bottom, top); // デバイスに対応する画面の範囲。 Xの左端, Xの右端, Yの下端, Yの上端 + _viewMatrix->Scale(ViewScale, ViewScale); + + _deviceToScreen->LoadIdentity(); // サイズが変わった際などリセット必須 + if (width > height) + { + float screenW = fabsf(right - left); + _deviceToScreen->ScaleRelative(screenW / width, -screenW / width); + } + else + { + float screenH = fabsf(top - bottom); + _deviceToScreen->ScaleRelative(screenH / height, -screenH / height); + } + _deviceToScreen->TranslateRelative(-width * 0.5f, -height * 0.5f); + + // 表示範囲の設定 + _viewMatrix->SetMaxScale(ViewMaxScale); // 限界拡大率 + _viewMatrix->SetMinScale(ViewMinScale); // 限界縮小率 + + // 表示できる最大範囲 + _viewMatrix->SetMaxScreenRect( + ViewLogicalMaxLeft, + ViewLogicalMaxRight, + ViewLogicalMaxBottom, + ViewLogicalMaxTop + ); +} + +void LAppView::BeginRendering(VkCommandBuffer commandBuffer, float r, float g, float b, float a, bool isClear) +{ + VulkanManager* vkManager = LAppDelegate::GetInstance()->GetVulkanManager(); + VkRenderingAttachmentInfoKHR colorAttachment{}; + colorAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR; + colorAttachment.imageView = vkManager->GetSwapchainImageView(); + colorAttachment.imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL; + if (isClear) + { + colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + } + else + { + colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + } + colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + colorAttachment.clearValue = {r, g, b, a}; + + VkRenderingInfo renderingInfo{}; + renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO; + renderingInfo.renderArea = {{0, 0}, {vkManager->GetSwapchainManager()->GetExtent()}}; + renderingInfo.layerCount = 1; + renderingInfo.colorAttachmentCount = 1; + renderingInfo.pColorAttachments = &colorAttachment; + + vkCmdBeginRendering(commandBuffer, &renderingInfo); +} + +void LAppView::EndRendering(VkCommandBuffer commandBuffer) +{ + vkCmdEndRendering(commandBuffer); +} + +void LAppView::Render() +{ + LAppLive2DManager* live2DManager = LAppLive2DManager::GetInstance(); + if (!live2DManager) + { + return; + } + + //スプライト描画 + VulkanManager* vkManager = LAppDelegate::GetInstance()->GetVulkanManager(); + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + VkCommandBuffer commandBuffer = vkManager->BeginSingleTimeCommands(); + BeginRendering(commandBuffer, 0.0, 0.0, 0.0, 1.0, true); + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, _pipeline); + _back->Render(commandBuffer, _pipelineLayout); + _gear->Render(commandBuffer, _pipelineLayout); + _power->Render(commandBuffer, _pipelineLayout); + EndRendering(commandBuffer); + vkManager->SubmitCommand(commandBuffer, true); + + live2DManager->SetViewMatrix(_viewMatrix); + + // Cubism更新・描画 + live2DManager->OnUpdate(); + + // 各モデルが持つ描画ターゲットをテクスチャとする場合 + if (_renderTarget == SelectTarget_ModelFrameBuffer && _renderSprite) + { + for (csmUint32 i = 0; i < live2DManager->GetModelNum(); i++) + { + LAppModel* model = live2DManager->GetModel(i); + commandBuffer = vkManager->BeginSingleTimeCommands(); + _renderSprite->SetDescriptorUpdated(false); + _renderSprite->UpdateDescriptorSet(vkManager->GetDevice(), + model->GetRenderBuffer().GetTextureView(), + model->GetRenderBuffer().GetTextureSampler()); + BeginRendering(commandBuffer, 0.f, 0.f, 0.3, 1.f, false); + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, _pipeline); + + float alpha = i < 1 ? 1.0f : model->GetOpacity(); // サンプルとしてαに適当な差をつける + _renderSprite->SetColor(1.0f, 1.0f, 1.0f, alpha); + if (model) + { + _renderSprite->Render(commandBuffer, _pipelineLayout); + } + EndRendering(commandBuffer); + vkManager->SubmitCommand(commandBuffer); + } + } +} + +VkShaderModule LAppView::CreateShaderModule(VkDevice device, std::string filename) +{ + std::ifstream file(filename, std::ios::ate | std::ios::binary); + + if (!file.is_open()) + { + CubismLogError("failed to open file!"); + } + + csmInt32 fileSize = (csmInt32)file.tellg(); + csmVector buffer(fileSize); + + file.seekg(0); + file.read(buffer.GetPtr(), fileSize); + file.close(); + + VkShaderModuleCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + createInfo.codeSize = fileSize; + createInfo.pCode = reinterpret_cast(buffer.GetPtr()); + + VkShaderModule shaderModule; + if (vkCreateShaderModule(device, &createInfo, nullptr, &shaderModule) != VK_SUCCESS) + { + CubismLogError("failed to create shader module!"); + } + + return shaderModule; +} + +void LAppView::CreateDescriptorSetLayout(VkDevice device) +{ + VkDescriptorSetLayoutBinding bindings[2]; + + bindings[0].binding = 0; + bindings[0].descriptorCount = 1; + bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + bindings[0].pImmutableSamplers = nullptr; + bindings[0].stageFlags = VK_SHADER_STAGE_ALL; + + bindings[1].binding = 1; + bindings[1].descriptorCount = 1; + bindings[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + bindings[1].pImmutableSamplers = nullptr; + bindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + + VkDescriptorSetLayoutCreateInfo layoutInfo{}; + layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + layoutInfo.bindingCount = sizeof(bindings) / sizeof(bindings[0]); + layoutInfo.pBindings = bindings; + + if (vkCreateDescriptorSetLayout(device, &layoutInfo, nullptr, &_descriptorSetLayout) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to create descriptor set layout!"); + } +} + +void LAppView::CreateSpriteGraphicsPipeline(VkDevice device, VkExtent2D extent, VkShaderModule vertShaderModule, + VkShaderModule fragShaderModule, VkFormat swapchainFormat) +{ + VkPipelineShaderStageCreateInfo vertShaderStageInfo{}; + vertShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + vertShaderStageInfo.stage = VK_SHADER_STAGE_VERTEX_BIT; + vertShaderStageInfo.module = vertShaderModule; + vertShaderStageInfo.pName = "main"; + + VkPipelineShaderStageCreateInfo fragShaderStageInfo{}; + fragShaderStageInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + fragShaderStageInfo.stage = VK_SHADER_STAGE_FRAGMENT_BIT; + fragShaderStageInfo.module = fragShaderModule; + fragShaderStageInfo.pName = "main"; + + VkPipelineShaderStageCreateInfo shaderStages[] = {vertShaderStageInfo, fragShaderStageInfo}; + + VkPipelineVertexInputStateCreateInfo vertexInputInfo{}; + vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; + + VkVertexInputBindingDescription bindingDescription = LAppSprite::SpriteVertex::GetBindingDescription(); + VkVertexInputAttributeDescription attributeDescriptions[2]{}; + LAppSprite::SpriteVertex::GetAttributeDescriptions(attributeDescriptions); + vertexInputInfo.vertexBindingDescriptionCount = 1; + vertexInputInfo.pVertexBindingDescriptions = &bindingDescription; + vertexInputInfo.vertexAttributeDescriptionCount = sizeof(attributeDescriptions) / sizeof(attributeDescriptions[0]); + vertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions; + + VkPipelineInputAssemblyStateCreateInfo inputAssembly{}; + inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; + inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + inputAssembly.primitiveRestartEnable = VK_FALSE; + + VkRect2D scissor{}; + scissor.offset = {0, 0}; + scissor.extent = extent; + + VkViewport viewport{}; + viewport.x = 0.0f; + viewport.y = 0.0f; + viewport.width = (float)scissor.extent.width; + viewport.height = (float)scissor.extent.height; + viewport.minDepth = 0.0f; + viewport.maxDepth = 1.0f; + + VkPipelineViewportStateCreateInfo viewportState{}; + viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; + viewportState.viewportCount = 1; + viewportState.pViewports = &viewport; + viewportState.scissorCount = 1; + viewportState.pScissors = &scissor; + + VkPipelineRasterizationStateCreateInfo rasterizer{}; + rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; + rasterizer.depthClampEnable = VK_FALSE; + rasterizer.rasterizerDiscardEnable = VK_FALSE; + rasterizer.polygonMode = VK_POLYGON_MODE_FILL; + rasterizer.lineWidth = 1.0f; + rasterizer.cullMode = VK_CULL_MODE_BACK_BIT; + rasterizer.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; + rasterizer.depthBiasEnable = VK_FALSE; + + VkPipelineMultisampleStateCreateInfo multisampling{}; + multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; + multisampling.sampleShadingEnable = VK_FALSE; + multisampling.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT; + + VkPipelineColorBlendAttachmentState colorBlendAttachment{}; + colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT + | VK_COLOR_COMPONENT_A_BIT; + colorBlendAttachment.blendEnable = VK_TRUE; + colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; + colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD; + colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; + colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; + + VkPipelineColorBlendStateCreateInfo colorBlending{}; + colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; + colorBlending.logicOpEnable = VK_FALSE; + colorBlending.logicOp = VK_LOGIC_OP_COPY; + colorBlending.attachmentCount = 1; + colorBlending.pAttachments = &colorBlendAttachment; + + VkPipelineLayoutCreateInfo pipelineLayoutInfo{}; + pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + pipelineLayoutInfo.setLayoutCount = 1; + pipelineLayoutInfo.pSetLayouts = &_descriptorSetLayout; + + if (vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr, &_pipelineLayout) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to create pipeline layout!"); + } + + VkPipelineRenderingCreateInfo renderingInfo{}; + renderingInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO; + renderingInfo.colorAttachmentCount = 1; + renderingInfo.pColorAttachmentFormats = &swapchainFormat; + + VkGraphicsPipelineCreateInfo pipelineInfo{}; + pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; + pipelineInfo.stageCount = 2; + pipelineInfo.pStages = shaderStages; + pipelineInfo.pVertexInputState = &vertexInputInfo; + pipelineInfo.pInputAssemblyState = &inputAssembly; + pipelineInfo.pViewportState = &viewportState; + pipelineInfo.pRasterizationState = &rasterizer; + pipelineInfo.pMultisampleState = &multisampling; + pipelineInfo.pColorBlendState = &colorBlending; + pipelineInfo.layout = _pipelineLayout; + pipelineInfo.subpass = 0; + pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; + pipelineInfo.pNext = &renderingInfo; + + if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, &_pipeline) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to create graphics pipeline!"); + } +} + +void LAppView::InitializeSprite() +{ + VulkanManager* vkManager = LAppDelegate::GetInstance()->GetVulkanManager(); + VkDevice device = vkManager->GetDevice(); + VkPhysicalDevice physicalDevice = vkManager->GetPhysicalDevice(); + SwapchainManager* swapchainManager = vkManager->GetSwapchainManager(); + _vertShaderModule = CreateShaderModule(device, "SampleShaders/VertSprite.spv"); + _fragShaderModule = CreateShaderModule(device, "SampleShaders/FragSprite.spv"); + CreateDescriptorSetLayout(device); + CreateSpriteGraphicsPipeline(device, swapchainManager->GetExtent(), _vertShaderModule, _fragShaderModule, + vkManager->GetSwapchainManager()->GetSwapchainImageFormat()); + + int width, height; + glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &width, &height); + + LAppTextureManager* textureManager = LAppDelegate::GetInstance()->GetTextureManager(); + const string resourcesPath = ResourcesPath; + + string imageName; + float x; + float y; + float fWidth; + float fHeight; + + imageName = BackImageName; + LAppTextureManager::TextureInfo* backgroundTexture = textureManager->CreateTextureFromPngFile( + resourcesPath + imageName, vkManager->GetImageFormat(), VK_IMAGE_TILING_OPTIMAL, + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + + x = width * 0.5f; + y = height * 0.5f; + fWidth = static_cast(backgroundTexture->width * 2.0f); + fHeight = static_cast(height * 0.95f); + _back = new LAppSprite(device, physicalDevice, x, y, fWidth, fHeight, backgroundTexture->id, _descriptorSetLayout); + + imageName = GearImageName; + LAppTextureManager::TextureInfo* gearTexture = textureManager->CreateTextureFromPngFile( + resourcesPath + imageName, vkManager->GetImageFormat(), VK_IMAGE_TILING_OPTIMAL, + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + + //X:右向き正、Y:下向き正 + x = static_cast(width - gearTexture->width * 0.5f); + y = static_cast(gearTexture->height * 0.5f); + fWidth = static_cast(gearTexture->width); + fHeight = static_cast(gearTexture->height); + _gear = new LAppSprite(device, physicalDevice, x, y, fWidth, fHeight, gearTexture->id, _descriptorSetLayout); + + imageName = PowerImageName; + LAppTextureManager::TextureInfo* powerTexture = textureManager->CreateTextureFromPngFile( + resourcesPath + imageName, vkManager->GetImageFormat(), VK_IMAGE_TILING_OPTIMAL, + VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT + ); + + //X:右向き正、Y:下向き正 + x = static_cast(width - powerTexture->width * 0.5f); + y = static_cast(height - powerTexture->height * 0.5f); + fWidth = static_cast(powerTexture->width); + fHeight = static_cast(powerTexture->height); + _power = new LAppSprite(device, physicalDevice, x, y, fWidth, fHeight, powerTexture->id, _descriptorSetLayout); + + // 画面全体を覆うサイズ + x = width * 0.5f; + y = height * 0.5f; + LAppLive2DManager* live2DManager = LAppLive2DManager::GetInstance(); + _renderSprite = new LAppSprite(device, physicalDevice, x, y, static_cast(width), static_cast(height),0, _descriptorSetLayout); +} + +void LAppView::OnTouchesBegan(float px, float py) const +{ + _touchManager->TouchesBegan(px, py); +} + +void LAppView::OnTouchesMoved(float px, float py) const +{ + float viewX = this->TransformViewX(_touchManager->GetX()); + float viewY = this->TransformViewY(_touchManager->GetY()); + + _touchManager->TouchesMoved(px, py); + + LAppLive2DManager* Live2DManager = LAppLive2DManager::GetInstance(); + Live2DManager->OnDrag(viewX, viewY); +} + +void LAppView::OnTouchesEnded(float px, float py) const +{ + // タッチ終了 + LAppLive2DManager* live2DManager = LAppLive2DManager::GetInstance(); + live2DManager->OnDrag(0.0f, 0.0f); + { + // シングルタップ + float x = _deviceToScreen->TransformX(_touchManager->GetX()); // 論理座標変換した座標を取得。 + float y = _deviceToScreen->TransformY(_touchManager->GetY()); // 論理座標変換した座標を取得。 + if (DebugTouchLogEnable) + { + LAppPal::PrintLog("[APP]touchesEnded x:%.2f y:%.2f", x, y); + } + live2DManager->OnTap(x, y); + + // 歯車にタップしたか + if (_gear->IsHit(px, py)) + { + live2DManager->NextScene(); + } + + // 電源ボタンにタップしたか + if (_power->IsHit(px, py)) + { + LAppDelegate::GetInstance()->AppEnd(); + } + } +} + +float LAppView::TransformViewX(float deviceX) const +{ + float screenX = _deviceToScreen->TransformX(deviceX); // 論理座標変換した座標を取得。 + return _viewMatrix->InvertTransformX(screenX); // 拡大、縮小、移動後の値。 +} + +float LAppView::TransformViewY(float deviceY) const +{ + float screenY = _deviceToScreen->TransformY(deviceY); // 論理座標変換した座標を取得。 + return _viewMatrix->InvertTransformY(screenY); // 拡大、縮小、移動後の値。 +} + +float LAppView::TransformScreenX(float deviceX) const +{ + return _deviceToScreen->TransformX(deviceX); +} + +float LAppView::TransformScreenY(float deviceY) const +{ + return _deviceToScreen->TransformY(deviceY); +} + + +void LAppView::PreModelDraw(LAppModel& refModel) +{ + // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ + Csm::Rendering::CubismOffscreenSurface_Vulkan* useTarget = NULL; + useTarget = (_renderTarget == SelectTarget_ViewFrameBuffer) ? &_renderBuffer : &refModel.GetRenderBuffer(); + + if (_renderTarget != SelectTarget_None) + { + // 別のレンダリングターゲットへ向けて描画する場合 + if (!useTarget->IsValid()) + { + // 描画ターゲット内部未作成の場合はここで作成 + int width, height; + glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &width, &height); + VulkanManager* vkManager = LAppDelegate::GetInstance()->GetVulkanManager(); + if (width != 0 && height != 0) + { + useTarget->CreateOffscreenSurface(vkManager->GetDevice(), vkManager->GetPhysicalDevice(), + static_cast(width), static_cast(height), + vkManager->GetImageFormat(), + vkManager->GetDepthFormat() + ); + _renderSprite->SetDescriptorUpdated(false); + } + } + Csm::Rendering::CubismRenderer_Vulkan::SetRenderTarget(useTarget->GetTextureImage(), useTarget->GetTextureView()); + } +} + +void LAppView::PostModelDraw(LAppModel& refModel, csmInt32 modelIndex) +{ + // 別のレンダリングターゲットへ向けて描画する場合の使用するフレームバッファ + Csm::Rendering::CubismOffscreenSurface_Vulkan* useTarget = NULL; + + if (_renderTarget != SelectTarget_None) + { + // 別のレンダリングターゲットへ向けて描画する場合 + + // 使用するターゲット + useTarget = (_renderTarget == SelectTarget_ViewFrameBuffer) ? &_renderBuffer : &refModel.GetRenderBuffer(); + + // LAppViewの持つフレームバッファを使うなら、スプライトへの描画はここ + if (_renderTarget == SelectTarget_ViewFrameBuffer && _renderSprite) + { + VulkanManager* vkManager = LAppDelegate::GetInstance()->GetVulkanManager(); + VkCommandBuffer commandBuffer = vkManager->BeginSingleTimeCommands(); + _renderSprite->UpdateDescriptorSet(vkManager->GetDevice(), useTarget->GetTextureView(), + useTarget->GetTextureSampler()); + BeginRendering(commandBuffer, 0.f, 0.f, 0.3, 1.f, false); + vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, _pipeline); + _renderSprite->SetColor(1.0f, 1.0f, 1.0f, GetSpriteAlpha(0)); + _renderSprite->Render(commandBuffer, _pipelineLayout); + EndRendering(commandBuffer); + vkManager->SubmitCommand(commandBuffer); + } + } +} + +void LAppView::SwitchRenderingTarget(SelectTarget targetType) +{ + _renderTarget = targetType; +} + +void LAppView::SetRenderTargetClearColor(float r, float g, float b) +{ + _clearColor[0] = r; + _clearColor[1] = g; + _clearColor[2] = b; +} + +float LAppView::GetSpriteAlpha(int assign) const +{ + // assignの数値に応じて適当に決定 + float alpha = 0.25f + static_cast(assign) * 0.5f; // サンプルとしてαに適当な差をつける + if (alpha > 1.0f) + { + alpha = 1.0f; + } + if (alpha < 0.1f) + { + alpha = 0.1f; + } + + return alpha; +} + +void LAppView::Cleanup(VkDevice device) +{ + vkDestroyPipelineLayout(device, _pipelineLayout, nullptr); + vkDestroyPipeline(device, _pipeline, nullptr); +} + +void LAppView::ResizeSprite(int width, int height) +{ + VulkanManager* vkManager = LAppDelegate::GetInstance()->GetVulkanManager(); + VkDevice device = vkManager->GetDevice(); + SwapchainManager* swapchainManager = vkManager->GetSwapchainManager(); + Cleanup(device); + CreateSpriteGraphicsPipeline(device, swapchainManager->GetExtent(), _vertShaderModule, _fragShaderModule, + vkManager->GetSwapchainManager()->GetSwapchainImageFormat()); + + LAppTextureManager* textureManager = LAppDelegate::GetInstance()->GetTextureManager(); + if (!textureManager) + { + return; + } + + float x = 0.0f; + float y = 0.0f; + float fWidth = 0.0f; + float fHeight = 0.0f; + + if (_back) + { + uint32_t id = _back->GetTextureId(); + LAppTextureManager::TextureInfo* texInfo = textureManager->GetTextureInfoById(id); + if (texInfo) + { + x = width * 0.5f; + y = height * 0.5f; + fWidth = static_cast(texInfo->width * 2); + fHeight = static_cast(height) * 0.95f; + _back->ResetRect(x, y, fWidth, fHeight); + } + } + + if (_power) + { + uint32_t id = _power->GetTextureId(); + LAppTextureManager::TextureInfo* texInfo = textureManager->GetTextureInfoById(id); + if (texInfo) + { + x = static_cast(width - texInfo->width * 0.5f); + y = static_cast(height - texInfo->height * 0.5f); + fWidth = static_cast(texInfo->width); + fHeight = static_cast(texInfo->height); + _power->ResetRect(x, y, fWidth, fHeight); + } + } + + if (_gear) + { + uint32_t id = _gear->GetTextureId(); + LAppTextureManager::TextureInfo* texInfo = textureManager->GetTextureInfoById(id); + if (texInfo) + { + x = static_cast(width - texInfo->width * 0.5f); + y = static_cast(texInfo->height * 0.5f); + fWidth = static_cast(texInfo->width); + fHeight = static_cast(texInfo->height); + _gear->ResetRect(x, y, fWidth, fHeight); + } + } + if (_renderSprite) + { + x = width * 0.5f; + y = height * 0.5f; + _renderSprite->ResetRect(x, y, static_cast(width), static_cast(height)); + } +} + +void LAppView::DestroyOffscreenSurface() +{ + LAppLive2DManager* live2DManager = LAppLive2DManager::GetInstance(); + if (_renderTarget == SelectTarget_ViewFrameBuffer) + { + _renderBuffer.DestroyOffscreenSurface(LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice()); + } + else if (_renderTarget == SelectTarget_ModelFrameBuffer) + { + for (csmUint32 i = 0; i < live2DManager->GetModelNum(); i++) + { + LAppModel* model = live2DManager->GetModel(i); + model->GetRenderBuffer(). + DestroyOffscreenSurface(LAppDelegate::GetInstance()->GetVulkanManager()->GetDevice()); + } + } +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppView.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppView.hpp new file mode 100644 index 00000000..a8ed1beb --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppView.hpp @@ -0,0 +1,234 @@ +/** + * 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. + */ + +#pragma once + +#include +#include +#include +#include +#include "CubismFramework.hpp" + +class TouchManager; +class LAppSprite; +class LAppModel; + +/** +* @brief 描画クラス +*/ +class LAppView +{ +public: + /** + * @brief LAppModelのレンダリング先 + */ + enum SelectTarget + { + SelectTarget_None, + ///< デフォルトのフレームバッファにレンダリング + SelectTarget_ModelFrameBuffer, + ///< LAppModelが各自持つフレームバッファにレンダリング + SelectTarget_ViewFrameBuffer, + ///< LAppViewの持つフレームバッファにレンダリング + }; + + /** + * @brief コンストラクタ + */ + LAppView(); + + /** + * @brief デストラクタ + */ + ~LAppView(); + + /** + * @brief 初期化する。 + */ + void Initialize(); + + /** + * @brief レンダリングを開始する。 + * @param[in] commandBuffer -> コマンドバッファ + * @param[in] r -> r + * @param[in] g -> g + * @param[in] b -> b + * @param[in] a -> a + * @param[in] isClear -> クリアするかのフラグ + */ + void BeginRendering(VkCommandBuffer commandBuffer, float r, float g, float b, float a, bool isClear); + + + /** + * @brief レンダリングを終了する。 + * + * @param[in] commandBuffer -> コマンドバッファ + */ + void EndRendering(VkCommandBuffer commandBuffer); + + /** + * @brief 描画する。 + */ + void Render(); + + /** + * @brief シェーダーモジュ―ルを作成する + * + * @param[in] device -> デバイス + * @param[in] filename -> シェーダーのファイル名 + */ + VkShaderModule CreateShaderModule(VkDevice device, std::string filename); + + /** + * @brief スプライト用のディスクリプタセットのレイアウトを作成する。 + * + * @param[in] device 論理デバイス + */ + void CreateDescriptorSetLayout(VkDevice device); + + /** + * @brief スプライト用のパイプラインを作成する。 + * + * @param[in] device デバイス + * @param[in] extent フレームバッファのサイズ + * @param[in] vertShaderModule 頂点シェーダのモジュール + * @param[in] fragShaderModule フラグメントシェーダのモジュール + */ + void CreateSpriteGraphicsPipeline(VkDevice device, VkExtent2D extent, VkShaderModule vertShaderModule, + VkShaderModule fragShaderModule, VkFormat swapchainFormat); + + /** + * @brief 画像の初期化を行う。 + */ + void InitializeSprite(); + + /** + * @brief タッチされたときに呼ばれる。 + * + * @param[in] pointX スクリーンX座標 + * @param[in] pointY スクリーンY座標 + */ + void OnTouchesBegan(float pointX, float pointY) const; + + /** + * @brief タッチしているときにポインタが動いたら呼ばれる。 + * + * @param[in] pointX スクリーンX座標 + * @param[in] pointY スクリーンY座標 + */ + void OnTouchesMoved(float pointX, float pointY) const; + + /** + * @brief タッチが終了したら呼ばれる。 + * + * @param[in] pointX スクリーンX座標 + * @param[in] pointY スクリーンY座標 + */ + void OnTouchesEnded(float pointX, float pointY) const; + + /** + * @brief X座標をView座標に変換する。 + * + * @param[in] deviceX デバイスX座標 + */ + float TransformViewX(float deviceX) const; + + /** + * @brief Y座標をView座標に変換する。 + * + * @param[in] deviceY デバイスY座標 + */ + float TransformViewY(float deviceY) const; + + /** + * @brief X座標をScreen座標に変換する。 + * + * @param[in] deviceX デバイスX座標 + */ + float TransformScreenX(float deviceX) const; + + /** + * @brief Y座標をScreen座標に変換する。 + * + * @param[in] deviceY デバイスY座標 + */ + float TransformScreenY(float deviceY) const; + + /** + * @brief モデル1体を描画した直後にコールされる + * + * @param[in] refModel モデルのインスタンス + */ + + void PreModelDraw(LAppModel& refModel); + /** + * @brief モデル1体を描画した直後にコールされる + * + * @param[in] refModel モデルのインスタンス + * @param[in] modelIndex モデルのインデックス + */ + void PostModelDraw(LAppModel& refModel, Csm::csmInt32 modelIndex); + + /** + * @brief レンダリング先を切り替える + * + * @param[in] targetType ターゲットタイプ + */ + void SwitchRenderingTarget(SelectTarget targetType); + + /** + * @brief レンダリング先をデフォルト以外に切り替えた際の背景クリア色設定 + * + * @param[in] r 赤(0.0~1.0) + * @param[in] g 緑(0.0~1.0) + * @param[in] b 青(0.0~1.0) + */ + void SetRenderTargetClearColor(float r, float g, float b); + + /** + * @brief 別レンダリングターゲットにモデルを描画するサンプルで + * 描画時のαを決定する + */ + float GetSpriteAlpha(int assign) const; + + /** + * @brief ウィンドウサイズ変更の際にリソースを破棄する。 + * + * @param[in] device デバイス + */ + void Cleanup(VkDevice device); + + /** + * @brief ウィンドウサイズ変更の際にスプライトを再作成する + * + * @param[in] width 横幅 + * @param[in] height 縦幅 + */ + void ResizeSprite(int width, int height); + + /** + * @brief オフスクリーンの破棄 + */ + void DestroyOffscreenSurface(); + +private: + TouchManager* _touchManager; ///< タッチマネージャー + Csm::CubismMatrix44* _deviceToScreen; ///< デバイスからスクリーンへの行列 + Csm::CubismViewMatrix* _viewMatrix; ///< viewMatrix + LAppSprite* _back; ///< 背景画像 + LAppSprite* _gear; ///< ギア画像 + LAppSprite* _power; ///< 電源画像 + LAppSprite* _renderSprite; ///< レンダリング先を別ターゲットにする方式の場合に使用 + Csm::Rendering::CubismOffscreenSurface_Vulkan _renderBuffer; ///< モードによってはCubismモデル結果をこっちにレンダリング + SelectTarget _renderTarget; ///< レンダリング先の選択肢 + float _clearColor[4]; ///< レンダリングターゲットのクリアカラー + VkShaderModule _vertShaderModule; ///< 頂点シェーダーモジュール + VkShaderModule _fragShaderModule; ///< フラグメントシェーダーモジュール + VkDescriptorSetLayout _descriptorSetLayout; ///< ディスクリプタセットのレイアウト, UBOが1つとテクスチャが1つずつ + VkPipelineLayout _pipelineLayout; ///< スプライト描画に使うパイプラインのレイアウト + VkPipeline _pipeline; ///< スプライト描画に使うパイプライン +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppWavFileHandler.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppWavFileHandler.cpp new file mode 100644 index 00000000..7142ba86 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppWavFileHandler.cpp @@ -0,0 +1,233 @@ +/** + * 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. + */ + +#include "LAppWavFileHandler.hpp" +#include +#include +#include "LAppPal.hpp" + +LAppWavFileHandler::LAppWavFileHandler() + : _pcmData(NULL) + , _userTimeSeconds(0.0f) + , _lastRms(0.0f) + , _sampleOffset(0) +{ +} + +LAppWavFileHandler::~LAppWavFileHandler() +{ + if (_pcmData != NULL) + { + ReleasePcmData(); + } +} + +Csm::csmBool LAppWavFileHandler::Update(Csm::csmFloat32 deltaTimeSeconds) +{ + Csm::csmUint32 goalOffset; + Csm::csmFloat32 rms; + + // データロード前/ファイル末尾に達した場合は更新しない + if ((_pcmData == NULL) + || (_sampleOffset >= _wavFileInfo._samplesPerChannel)) + { + _lastRms = 0.0f; + return false; + } + + // 経過時間後の状態を保持 + _userTimeSeconds += deltaTimeSeconds; + goalOffset = static_cast(_userTimeSeconds * _wavFileInfo._samplingRate); + if (goalOffset > _wavFileInfo._samplesPerChannel) + { + goalOffset = _wavFileInfo._samplesPerChannel; + } + + // RMS計測 + rms = 0.0f; + for (Csm::csmUint32 channelCount = 0; channelCount < _wavFileInfo._numberOfChannels; channelCount++) + { + for (Csm::csmUint32 sampleCount = _sampleOffset; sampleCount < goalOffset; sampleCount++) + { + Csm::csmFloat32 pcm = _pcmData[channelCount][sampleCount]; + rms += pcm * pcm; + } + } + rms = sqrt(rms / (_wavFileInfo._numberOfChannels * (goalOffset - _sampleOffset))); + + _lastRms = rms; + _sampleOffset = goalOffset; + return true; +} + +void LAppWavFileHandler::Start(const Csm::csmString& filePath) +{ + // WAVファイルのロード + if (!LoadWavFile(filePath)) + { + return; + } + + // サンプル参照位置を初期化 + _sampleOffset = 0; + _userTimeSeconds = 0.0f; + + // RMS値をリセット + _lastRms = 0.0f; +} + +Csm::csmFloat32 LAppWavFileHandler::GetRms() const +{ + return _lastRms; +} + +Csm::csmBool LAppWavFileHandler::LoadWavFile(const Csm::csmString& filePath) +{ + Csm::csmBool ret; + + // 既にwavファイルロード済みならば領域開放 + if (_pcmData != NULL) + { + ReleasePcmData(); + } + + // ファイルロード + _byteReader._fileByte = LAppPal::LoadFileAsBytes(filePath.GetRawString(), &(_byteReader._fileSize)); + _byteReader._readOffset = 0; + + // ファイルロードに失敗しているか、先頭のシグネチャ"RIFF"を入れるサイズもない場合は失敗 + if ((_byteReader._fileByte == NULL) || (_byteReader._fileSize < 4)) + { + return false; + } + + // ファイル名 + _wavFileInfo._fileName = filePath; + + do { + // シグネチャ "RIFF" + if (!_byteReader.GetCheckSignature("RIFF")) + { + ret = false; + break; + } + // ファイルサイズ-8(読み飛ばし) + _byteReader.Get32LittleEndian(); + // シグネチャ "WAVE" + if (!_byteReader.GetCheckSignature("WAVE")) + { + ret = false; + break; + } + // シグネチャ "fmt " + if (!_byteReader.GetCheckSignature("fmt ")) + { + ret = false; + break; + } + // fmtチャンクサイズ + const Csm::csmUint32 fmtChunkSize = _byteReader.Get32LittleEndian(); + // フォーマットIDは1(リニアPCM)以外受け付けない + if (_byteReader.Get16LittleEndian() != 1) + { + ret = false; + break; + } + // チャンネル数 + _wavFileInfo._numberOfChannels = _byteReader.Get16LittleEndian(); + // サンプリングレート + _wavFileInfo._samplingRate = _byteReader.Get32LittleEndian(); + // データ速度[byte/sec](読み飛ばし) + _byteReader.Get32LittleEndian(); + // ブロックサイズ(読み飛ばし) + _byteReader.Get16LittleEndian(); + // 量子化ビット数 + _wavFileInfo._bitsPerSample = _byteReader.Get16LittleEndian(); + // fmtチャンクの拡張部分の読み飛ばし + if (fmtChunkSize > 16) + { + _byteReader._readOffset += (fmtChunkSize - 16); + } + // "data"チャンクが出現するまで読み飛ばし + while (!(_byteReader.GetCheckSignature("data")) + && (_byteReader._readOffset < _byteReader._fileSize)) + { + _byteReader._readOffset += _byteReader.Get32LittleEndian(); + } + // ファイル内に"data"チャンクが出現しなかった + if (_byteReader._readOffset >= _byteReader._fileSize) + { + ret = false; + break; + } + // サンプル数 + { + const Csm::csmUint32 dataChunkSize = _byteReader.Get32LittleEndian(); + _wavFileInfo._samplesPerChannel = (dataChunkSize * 8) / (_wavFileInfo._bitsPerSample * _wavFileInfo._numberOfChannels); + } + // 領域確保 + _pcmData = static_cast(CSM_MALLOC(sizeof(Csm::csmFloat32*) * _wavFileInfo._numberOfChannels)); + for (Csm::csmUint32 channelCount = 0; channelCount < _wavFileInfo._numberOfChannels; channelCount++) + { + _pcmData[channelCount] = static_cast(CSM_MALLOC(sizeof(Csm::csmFloat32) * _wavFileInfo._samplesPerChannel)); + } + // 波形データ取得 + for (Csm::csmUint32 sampleCount = 0; sampleCount < _wavFileInfo._samplesPerChannel; sampleCount++) + { + for (Csm::csmUint32 channelCount = 0; channelCount < _wavFileInfo._numberOfChannels; channelCount++) + { + _pcmData[channelCount][sampleCount] = GetPcmSample(); + } + } + + ret = true; + + } while (false); + + // ファイル開放 + LAppPal::ReleaseBytes(_byteReader._fileByte); + _byteReader._fileByte = NULL; + _byteReader._fileSize = 0; + + return ret; +} + +Csm::csmFloat32 LAppWavFileHandler::GetPcmSample() +{ + Csm::csmInt32 pcm32; + + // 32ビット幅に拡張してから-1~1の範囲に丸める + switch (_wavFileInfo._bitsPerSample) + { + case 8: + pcm32 = static_cast(_byteReader.Get8()) - 128; + pcm32 <<= 24; + break; + case 16: + pcm32 = _byteReader.Get16LittleEndian() << 16; + break; + case 24: + pcm32 = _byteReader.Get24LittleEndian() << 8; + break; + default: + // 対応していないビット幅 + pcm32 = 0; + break; + } + + return static_cast(pcm32) / INT32_MAX; +} + +void LAppWavFileHandler::ReleasePcmData() +{ + for (Csm::csmUint32 channelCount = 0; channelCount < _wavFileInfo._numberOfChannels; channelCount++) + { + CSM_FREE(_pcmData[channelCount]); + } + CSM_FREE(_pcmData); + _pcmData = NULL; +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/LAppWavFileHandler.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppWavFileHandler.hpp new file mode 100644 index 00000000..e2586a7a --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/LAppWavFileHandler.hpp @@ -0,0 +1,188 @@ +/** + * 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. + */ + +#pragma once + +#include +#include + +/** + * @brief wavファイルハンドラ + * @attention 16bit wav ファイル読み込みのみ実装済み + */ +class LAppWavFileHandler +{ +public: + /** + * @brief コンストラクタ + */ + LAppWavFileHandler(); + + /** + * @brief デストラクタ + */ + ~LAppWavFileHandler(); + + /** + * @brief wavファイルハンドラの内部状態更新 + * + * @param[in] deltaTimeSeconds デルタ時間[秒] + * @retval true 更新されている + * @retval false 更新されていない + */ + Csm::csmBool Update(Csm::csmFloat32 deltaTimeSeconds); + + /** + * @brief 引数で指定したwavファイルの読み込みを開始する + * + * @param[in] filePath wavファイルのパス + */ + void Start(const Csm::csmString& filePath); + + /** + * @brief 現在のRMS値取得 + * + * @retval csmFloat32 RMS値 + */ + Csm::csmFloat32 GetRms() const; + +private: + /** + * @brief wavファイルのロード + * + * @param[in] filePath wavファイルのパス + * @retval true 読み込み成功 + * @retval false 読み込み失敗 + */ + Csm::csmBool LoadWavFile(const Csm::csmString& filePath); + + /** + * @brief PCMデータの解放 + */ + void ReleasePcmData(); + + /** + * @brief -1~1の範囲の1サンプル取得 + * @retval csmFloat32 正規化されたサンプル + */ + Csm::csmFloat32 GetPcmSample(); + + /** + * @brief 読み込んだwavfileの情報 + */ + struct WavFileInfo + { + /** + * @brief コンストラクタ + */ + WavFileInfo() : _fileName("") + , _numberOfChannels(0) + , _bitsPerSample(0) + , _samplingRate(0) + , _samplesPerChannel(0) + { } + + Csm::csmString _fileName; ///< ファイル名 + Csm::csmUint32 _numberOfChannels; ///< チャンネル数 + Csm::csmUint32 _bitsPerSample; ///< サンプルあたりビット数 + Csm::csmUint32 _samplingRate; ///< サンプリングレート + Csm::csmUint32 _samplesPerChannel; ///< 1チャンネルあたり総サンプル数 + } _wavFileInfo; + + /** + * @brief バイトリーダ + */ + struct ByteReader + { + /** + * @brief コンストラクタ + */ + ByteReader() : _fileByte(NULL) + , _fileSize(0) + , _readOffset(0) + { } + + /** + * @brief 8ビット読み込み + * @return Csm::csmUint8 読み取った8ビット値 + */ + Csm::csmUint8 Get8() + { + const Csm::csmUint8 ret = _fileByte[_readOffset]; + _readOffset++; + return ret; + } + + /** + * @brief 16ビット読み込み(リトルエンディアン) + * @return Csm::csmUint16 読み取った16ビット値 + */ + Csm::csmUint16 Get16LittleEndian() + { + const Csm::csmUint16 ret = (_fileByte[_readOffset + 1] << 8) | _fileByte[_readOffset]; + _readOffset += 2; + return ret; + } + + /** + * @brief 24ビット読み込み(リトルエンディアン) + * @return Csm::csmUint32 読み取った24ビット値(下位24ビットに設定) + */ + Csm::csmUint32 Get24LittleEndian() + { + const Csm::csmUint32 ret = + (_fileByte[_readOffset + 2] << 16) | (_fileByte[_readOffset + 1] << 8) + | _fileByte[_readOffset]; + _readOffset += 3; + return ret; + } + + /** + * @brief 32ビット読み込み(リトルエンディアン) + * @return Csm::csmUint32 読み取った32ビット値 + */ + Csm::csmUint32 Get32LittleEndian() + { + const Csm::csmUint32 ret = + (_fileByte[_readOffset + 3] << 24) | (_fileByte[_readOffset + 2] << 16) + | (_fileByte[_readOffset + 1] << 8) | _fileByte[_readOffset]; + _readOffset += 4; + return ret; + } + + /** + * @brief シグネチャの取得と参照文字列との一致チェック + * @param[in] reference 検査対象のシグネチャ文字列 + * @retval true 一致している + * @retval false 一致していない + */ + Csm::csmBool GetCheckSignature(const Csm::csmString& reference) + { + Csm::csmChar getSignature[4] = {0, 0, 0, 0}; + const Csm::csmChar* referenceString = reference.GetRawString(); + if (reference.GetLength() != 4) + { + return false; + } + for (Csm::csmUint32 signatureOffset = 0; signatureOffset < 4; signatureOffset++) + { + getSignature[signatureOffset] = static_cast(Get8()); + } + return (getSignature[0] == referenceString[0]) && (getSignature[1] == referenceString[1]) + && (getSignature[2] == referenceString[2]) && (getSignature[3] == referenceString[3]); + } + + Csm::csmByte* _fileByte; ///< ロードしたファイルのバイト列 + Csm::csmSizeInt _fileSize; ///< ファイルサイズ + Csm::csmUint32 _readOffset; ///< ファイル参照位置 + } _byteReader; + + Csm::csmFloat32** _pcmData; ///< -1から1の範囲で表現された音声データ配列 + Csm::csmUint32 _sampleOffset; ///< サンプル参照位置 + Csm::csmFloat32 _lastRms; ///< 最後に計測したRMS値 + Csm::csmFloat32 _userTimeSeconds; ///< デルタ時間の積算値[秒] +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/SwapchainManager.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/SwapchainManager.cpp new file mode 100644 index 00000000..c8ae81db --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/SwapchainManager.cpp @@ -0,0 +1,270 @@ +#include "SwapchainManager.hpp" + +using namespace Csm; + +SwapchainManager::SwapchainManager(GLFWwindow* _window, VkPhysicalDevice physicalDevice, VkDevice device, + VkSurfaceKHR surface, Csm::csmUint32 graphicsFamily, Csm::csmUint32 presentFamily) +{ + CreateSwapchain(_window, physicalDevice, device, surface, graphicsFamily, presentFamily); +} + +SwapchainManager::SwapchainSupportDetails SwapchainManager::QuerySwapchainSupport( + VkPhysicalDevice& physicalDevice, VkSurfaceKHR surface) +{ + SwapchainSupportDetails details; + vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice, surface, &details.capabilities); + + csmUint32 formatCount; + vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, nullptr); + if (formatCount != 0) + { + details.formats.Resize(formatCount); + vkGetPhysicalDeviceSurfaceFormatsKHR(physicalDevice, surface, &formatCount, details.formats.GetPtr()); + } + + csmUint32 presentModeCount; + vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, nullptr); + + if (presentModeCount != 0) + { + details.presentModes.Resize(presentModeCount); + vkGetPhysicalDeviceSurfacePresentModesKHR(physicalDevice, surface, &presentModeCount, + details.presentModes.GetPtr()); + } + + return details; +} + +VkSurfaceFormatKHR SwapchainManager::ChooseSwapSurfaceFormat(const csmVector& availableFormats) +{ + for (csmUint32 i = 0; i < availableFormats.GetSize(); i++) + { + if (availableFormats[i].format == swapchainFormat && availableFormats[i].colorSpace == + VK_COLOR_SPACE_SRGB_NONLINEAR_KHR) + { + return availableFormats[i]; + } + } + //他に使えるフォーマットが無かったら最初のフォーマットを使う + return availableFormats[0]; +} + +VkPresentModeKHR SwapchainManager::ChooseSwapPresentMode(const csmVector& availablePresentModes) +{ + for (csmUint32 i = 0; i < availablePresentModes.GetSize(); i++) + { + if (availablePresentModes[i] == VK_PRESENT_MODE_MAILBOX_KHR) + { + return availablePresentModes[i]; + } + } + return VK_PRESENT_MODE_FIFO_KHR; +} + +VkExtent2D SwapchainManager::ChooseSwapExtent(GLFWwindow* window, const VkSurfaceCapabilitiesKHR& capabilities) +{ + if (capabilities.currentExtent.width != UINT32_MAX) + { + return capabilities.currentExtent; + } + else + { + //for Retina display + int width, height; + glfwGetFramebufferSize(window, &width, &height); + + VkExtent2D actualExtent = { + static_cast(width), + static_cast(height) + }; + + if (actualExtent.width < capabilities.minImageExtent.width) + { + actualExtent.width = capabilities.minImageExtent.width; + } + else if (actualExtent.width > capabilities.maxImageExtent.width) + { + actualExtent.width = capabilities.maxImageExtent.width; + } + + if (actualExtent.height < capabilities.minImageExtent.height) + { + actualExtent.height = capabilities.minImageExtent.height; + } + else if (actualExtent.height > capabilities.maxImageExtent.height) + { + actualExtent.height = capabilities.maxImageExtent.height; + } + + return actualExtent; + } +} + +void SwapchainManager::CreateSwapchain(GLFWwindow* window, VkPhysicalDevice physicalDevice, VkDevice device, + VkSurfaceKHR surface, Csm::csmUint32 graphicsFamily, + Csm::csmUint32 presentFamily) +{ + SwapchainSupportDetails swapChainSupport = QuerySwapchainSupport(physicalDevice, surface); + VkSurfaceFormatKHR surfaceFormat = ChooseSwapSurfaceFormat(swapChainSupport.formats); + VkPresentModeKHR presentMode = ChooseSwapPresentMode(swapChainSupport.presentModes); + extent = ChooseSwapExtent(window, swapChainSupport.capabilities); + + imageCount = swapChainSupport.capabilities.minImageCount + 1; + if (swapChainSupport.capabilities.maxImageCount > 0 && imageCount > swapChainSupport.capabilities.maxImageCount) + { + imageCount = swapChainSupport.capabilities.maxImageCount; + } + + VkSwapchainCreateInfoKHR createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; + createInfo.surface = surface; + createInfo.minImageCount = imageCount; + createInfo.imageFormat = surfaceFormat.format; + createInfo.imageColorSpace = surfaceFormat.colorSpace; + createInfo.imageExtent = extent; + createInfo.imageArrayLayers = 1; + createInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | + VK_IMAGE_USAGE_TRANSFER_DST_BIT; + if (graphicsFamily != presentFamily) + { + createInfo.imageSharingMode = VK_SHARING_MODE_CONCURRENT; + createInfo.queueFamilyIndexCount = 2; + Csm::csmUint32 queueFamilyIndices[2] = {graphicsFamily, presentFamily}; + createInfo.pQueueFamilyIndices = queueFamilyIndices; + } + else + { + createInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; + createInfo.queueFamilyIndexCount = 0; + createInfo.pQueueFamilyIndices = nullptr; + } + createInfo.preTransform = swapChainSupport.capabilities.currentTransform; + createInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; + createInfo.presentMode = presentMode; + createInfo.clipped = VK_TRUE; + createInfo.oldSwapchain = VK_NULL_HANDLE; + if (vkCreateSwapchainKHR(device, &createInfo, nullptr, &swapchain) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to create swap chain"); + } + + // swapchain imageを取得する + vkGetSwapchainImagesKHR(device, swapchain, &imageCount, nullptr); + images.Resize(imageCount); + vkGetSwapchainImagesKHR(device, swapchain, &imageCount, images.GetPtr()); + + imageViews.Resize(imageCount); + for (csmUint32 i = 0; i < imageCount; i++) + { + VkImageViewCreateInfo viewInfo{}; + viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + viewInfo.image = images[i]; + viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D; + viewInfo.format = swapchainFormat; + viewInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY; + viewInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY; + viewInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY; + viewInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY; + viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + viewInfo.subresourceRange.baseMipLevel = 0; + viewInfo.subresourceRange.levelCount = 1; + viewInfo.subresourceRange.baseArrayLayer = 0; + viewInfo.subresourceRange.layerCount = 1; + + if (vkCreateImageView(device, &viewInfo, nullptr, &imageViews[i]) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to create texture image view"); + } + } +} + +VkResult SwapchainManager::QueuePresent(VkQueue& queue, csmUint32 imageIndex) +{ + VkPresentInfoKHR presentInfo{}; + presentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + + VkSwapchainKHR swapChains[] = {swapchain}; + presentInfo.swapchainCount = 1; + presentInfo.pSwapchains = swapChains; + presentInfo.pImageIndices = &imageIndex; + return vkQueuePresentKHR(queue, &presentInfo); +} + +void SwapchainManager::ChangeLayout(VkDevice device, VkCommandPool commandPool, VkQueue queue) +{ + for (csmInt32 i = 0; i < imageCount; i++) + { + VkImageMemoryBarrier barrier{}; + barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + barrier.image = images[i]; + barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + barrier.subresourceRange.baseMipLevel = 0; + barrier.subresourceRange.levelCount = 1; + barrier.subresourceRange.baseArrayLayer = 0; + barrier.subresourceRange.layerCount = 1; + barrier.srcAccessMask = 0; + + VkPipelineStageFlags sourceStage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; + VkPipelineStageFlags destinationStage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; + + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandPool = commandPool; + allocInfo.commandBufferCount = 1; + + VkCommandBuffer commandBuffer; + vkAllocateCommandBuffers(device, &allocInfo, &commandBuffer); + + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + + vkBeginCommandBuffer(commandBuffer, &beginInfo); + + vkCmdPipelineBarrier( + commandBuffer, + sourceStage, + destinationStage, + 0, + 0, + nullptr, + 0, + nullptr, + 1, + &barrier + ); + + vkEndCommandBuffer(commandBuffer); + + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &commandBuffer; + + vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE); + vkQueueWaitIdle(queue); + vkFreeCommandBuffers(device, commandPool, 1, &commandBuffer); + } + + + VkPipelineStageFlags sourceStage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; + VkPipelineStageFlags destinationStage = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; + +} + +void SwapchainManager::Cleanup(VkDevice device) +{ + if (swapchain != VK_NULL_HANDLE) + { + for (csmUint32 i = 0; i < imageViews.GetSize(); i++) + { + vkDestroyImageView(device, imageViews[i], nullptr); + } + images.Clear(); + imageViews.Clear(); + vkDestroySwapchainKHR(device, swapchain, nullptr); + } +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/SwapchainManager.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/SwapchainManager.hpp new file mode 100644 index 00000000..204bde43 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/SwapchainManager.hpp @@ -0,0 +1,164 @@ +/** + * 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. + */ + +#pragma once +#include +#include +#include +#include +#include "LAppPal.hpp" + + +/** + * @brief スワップチェーンを扱うクラス + */ +class SwapchainManager +{ +public: + struct SwapchainSupportDetails + { + VkSurfaceCapabilitiesKHR capabilities; //基本的な機能 + Csm::csmVector formats; //利用可能なフォーマット + Csm::csmVector presentModes; //利用可能な表示モード + }; + + /** + * @brief コンストラクタ + * @param[in] _window -> ウィンドウ + * @param[in] physicalDevice -> 物理デバイス + * @param[in] device -> デバイス + * @param[in] surface -> サーフェス + * @param[in] graphicsFamily -> 描画コマンドに使うキューファミリ + * @param[in] presentFamily -> 表示コマンドに使うキューファミリ + */ + SwapchainManager(GLFWwindow* _window, VkPhysicalDevice physicalDevice, VkDevice device, VkSurfaceKHR surface, Csm::csmUint32 graphicsFamily, Csm::csmUint32 presentFamily); + + /** + * @brief 物理デバイスのサポートを確認する + * + * @param[in] physicalDevice -> 物理デバイス + * @param[in] surface -> スワップチェーンサーフェス + * @return 物理デバイスのサポート情報 + */ + static SwapchainSupportDetails QuerySwapchainSupport(VkPhysicalDevice& physicalDevice, VkSurfaceKHR surface); + + /** + * @brief サーフェスフォーマットを選択する + * @param[in] availableFormats -> 使えるサーフェスフォーマット + * @return 選択するサーフェスフォーマット + */ + VkSurfaceFormatKHR ChooseSwapSurfaceFormat(const Csm::csmVector& availableFormats); + + /** + * @brief 表示モードを選択する + * @param[in] availableFormats -> 使えるフォーマット + */ + VkPresentModeKHR ChooseSwapPresentMode(const Csm::csmVector& availablePresentModes); + + /** + * @brief スワップチェーンイメージの解像度を選択する + * + * @param[in] window -> ウィンドウ + * @param[in] capabilities -> サーフェスの機能を保持する構造体 + * @return スワップチェーンイメージの解像度 + */ + VkExtent2D ChooseSwapExtent(GLFWwindow* window, const VkSurfaceCapabilitiesKHR& capabilities); + + /** + * @brief スワップチェーンを作成する + * + * @param[in] _window -> ウィンドウ + * @param[in] physicalDevice -> 物理デバイス + * @param[in] device -> デバイス + * @param[in] surface -> サーフェス + * @param[in] graphicsFamily -> 描画コマンドに使うキューファミリ + * @param[in] presentFamily -> 表示コマンドに使うキューファミリ + */ + void CreateSwapchain(GLFWwindow* window, VkPhysicalDevice physicalDevice, VkDevice device, VkSurfaceKHR surface, Csm::csmUint32 graphicsFamily, Csm::csmUint32 presentFamily); + + /** + * @brief 表示コマンドをキューに積む + * + * @param[in] queue -> キュー + * @param[in] imageIndex -> イメージのインデックス + * @return 成功したか + */ + VkResult QueuePresent(VkQueue& queue, Csm::csmUint32 imageIndex); + + /** + * @brief スワップチェーンのレイアウトの変更 + * + * @param[in] device -> 論理デバイス + * @param[in] commandPool -> コマンドプール + * @param[in] queue -> キュー + */ + void ChangeLayout(VkDevice device, VkCommandPool commandPool, VkQueue queue); + + /** + * @brief リソースを破棄&再作成する + * + * @param[in] device -> デバイス + */ + void Cleanup(VkDevice device); + + /** + * @brief extentを取得する + * + * @return extent + */ + VkExtent2D GetExtent() { return extent; } + + /** + * @brief イメージ数を取得する + * + * @return イメージ数 + */ + Csm::csmInt32 GetImageCount() { return imageCount; } + + /** + * @brief スワップチェーンイメージビューを取得する + * + * @return スワップチェーンイメージビュー + */ + Csm::csmVector GetViews() { return imageViews; } + + /** + * @brief スワップチェーンを取得する + * + * @return スワップチェーン + */ + VkSwapchainKHR GetSwapchain() { return swapchain; } + + /** + * @brief スワップチェーンのフォーマットを取得する + * + * @return フォーマット + */ + VkFormat GetSwapchainImageFormat() { return swapchainFormat; } + + /** + * @brief スワップチェーンのイメージを取得する + * + * @return イメージ + */ + Csm::csmVector GetImages() { return images; } + + /** + * @brief スワップチェーンのイメージを取得する + * + * @return イメージ + */ + Csm::csmVector GetImageViews() { return imageViews; } + +private: + VkExtent2D extent = {0, 0}; ///< イメージの解像度 + Csm::csmUint32 imageCount = 0; ///< イメージ数 + Csm::csmVector images; ///< スワップチェーンのイメージ + Csm::csmVector imageViews; ///< スワップチェーンのイメージビュー + VkSwapchainKHR swapchain; ///< スワップチェーン + const VkFormat swapchainFormat = VK_FORMAT_B8G8R8A8_UNORM; ///< スワップチェーンのフォーマット +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/TouchManager.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/TouchManager.cpp new file mode 100644 index 00000000..f1e62700 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/TouchManager.cpp @@ -0,0 +1,97 @@ +/** + * 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. + */ + +#include "TouchManager.hpp" +#include + +TouchManager::TouchManager() + : _startY(0.0f) + , _startX(0.0f) + , _lastX(0.0f) + , _lastY(0.0f) + , _lastX1(0.0f) + , _lastY1(0.0f) + , _lastX2(0.0f) + , _lastY2(0.0f) + , _lastTouchDistance(0.0f) + , _deltaX(0.0f) + , _deltaY(0.0f) + , _scale(1.0f) + , _touchSingle(false) + , _flipAvailable(false) +{ } + +void TouchManager::TouchesBegan(float deviceX, float deviceY) +{ + _lastX = deviceX; + _lastY = deviceY; + _startX = deviceX; + _startY = deviceY; + _lastTouchDistance = -1.0f; + _flipAvailable = true; + _touchSingle = true; +} + +void TouchManager::TouchesMoved(float deviceX, float deviceY) +{ + _lastX = deviceX; + _lastY = deviceY; + _lastTouchDistance = -1.0f; + _touchSingle = true; +} + +void TouchManager::TouchesMoved(float deviceX1, float deviceY1, float deviceX2, float deviceY2) +{ + float distance = CalculateDistance(deviceX1, deviceY1, deviceX2, deviceY2); + float centerX = (deviceX1 + deviceX2) * 0.5f; + float centerY = (deviceY1 + deviceY2) * 0.5f; + + if (_lastTouchDistance > 0.0f) + { + _scale = powf(distance / _lastTouchDistance, 0.75f); + _deltaX = CalculateMovingAmount(deviceX1 - _lastX1, deviceX2 - _lastX2); + _deltaY = CalculateMovingAmount(deviceY1 - _lastY1, deviceY2 - _lastY2); + } + else + { + _scale = 1.0f; + _deltaX = 0.0f; + _deltaY = 0.0f; + } + + _lastX = centerX; + _lastY = centerY; + _lastX1 = deviceX1; + _lastY1 = deviceY1; + _lastX2 = deviceX2; + _lastY2 = deviceY2; + _lastTouchDistance = distance; + _touchSingle = false; +} + +float TouchManager::GetFlickDistance() const +{ + return CalculateDistance(_startX, _startY, _lastX, _lastY); +} + +float TouchManager::CalculateDistance(float x1, float y1, float x2, float y2) const +{ + return sqrtf((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); +} + +float TouchManager::CalculateMovingAmount(float v1, float v2) +{ + if ((v1 > 0.0f) != (v2 > 0.0f)) + { + return 0.0f; + } + + float sign = v1 > 0.0f ? 1.0f : -1.0f; + float absoluteValue1 = fabsf(v1); + float absoluteValue2 = fabsf(v2); + return sign * ((absoluteValue1 < absoluteValue2) ? absoluteValue1 : absoluteValue2); +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/TouchManager.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/TouchManager.hpp new file mode 100644 index 00000000..d1240545 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/TouchManager.hpp @@ -0,0 +1,102 @@ +/** + * 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. + */ + +#pragma once + +class TouchManager +{ +public: + TouchManager(); + + float GetCenterX() const { return _lastX; } + float GetCenterY() const { return _lastY; } + float GetDeltaX() const { return _deltaX; } + float GetDeltaY() const { return _deltaY; } + float GetStartX() const { return _startX; } + float GetStartY() const { return _startY; } + float GetScale() const { return _scale; } + float GetX() const { return _lastX; } + float GetY() const { return _lastY; } + float GetX1() const { return _lastX1; } + float GetY1() const { return _lastY1; } + float GetX2() const { return _lastX2; } + float GetY2() const { return _lastY2; } + bool IsSingleTouch() const { return _touchSingle; } + bool IsFlickAvailable() const { return _flipAvailable; } + void DisableFlick() { _flipAvailable = false; } + + /* + * @brief タッチ開始時イベント + * + * @param[in] deviceY タッチした画面のyの値 + * @param[in] deviceX タッチした画面のxの値 + */ + void TouchesBegan(float deviceX, float deviceY); + + /* + * @brief ドラッグ時のイベント + * + * @param[in] deviceX タッチした画面のyの値 + * @param[in] deviceY タッチした画面のxの値 + */ + void TouchesMoved(float deviceX, float deviceY); + + /* + * @brief ドラッグ時のイベント + * + * @param[in] deviceX1 1つめのタッチした画面のxの値 + * @param[in] deviceY1 1つめのタッチした画面のyの値 + * @param[in] deviceX2 2つめのタッチした画面のxの値 + * @param[in] deviceY2 2つめのタッチした画面のyの値 + */ + void TouchesMoved(float deviceX1, float deviceY1, float deviceX2, float deviceY2); + + /* + * @brief フリックの距離測定 + * + * @return フリック距離 + */ + float GetFlickDistance() const; + +private: + /* + * @brief 点1から点2への距離を求める + * + * @param[in] x1 1つめのタッチした画面のxの値 + * @param[in] y1 1つめのタッチした画面のyの値 + * @param[in] x2 2つめのタッチした画面のxの値 + * @param[in] y2 2つめのタッチした画面のyの値 + * @return 2点の距離 + */ + float CalculateDistance(float x1, float y1, float x2, float y2) const; + + /* + * 二つの値から、移動量を求める。 + * 違う方向の場合は移動量0。同じ方向の場合は、絶対値が小さい方の値を参照する + * + * @param[in] v1 1つめの移動量 + * @param[in] v2 2つめの移動量 + * + * @return 小さい方の移動量 + */ + float CalculateMovingAmount(float v1, float v2); + + float _startY; // タッチを開始した時のxの値 + float _startX; // タッチを開始した時のyの値 + float _lastX; // シングルタッチ時のxの値 + float _lastY; // シングルタッチ時のyの値 + float _lastX1; // ダブルタッチ時の一つ目のxの値 + float _lastY1; // ダブルタッチ時の一つ目のyの値 + float _lastX2; // ダブルタッチ時の二つ目のxの値 + float _lastY2; // ダブルタッチ時の二つ目のyの値 + float _lastTouchDistance; // 2本以上でタッチしたときの指の距離 + float _deltaX; // 前回の値から今回の値へのxの移動距離。 + float _deltaY; // 前回の値から今回の値へのyの移動距離。 + float _scale; // このフレームで掛け合わせる拡大率。拡大操作中以外は1。 + bool _touchSingle; // シングルタッチ時はtrue + bool _flipAvailable; // フリップが有効かどうか +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/VulkanManager.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/VulkanManager.cpp new file mode 100644 index 00000000..62b426e2 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/VulkanManager.cpp @@ -0,0 +1,527 @@ +#include "VulkanManager.hpp" +#include +#include + +#include "Rendering/Vulkan/CubismRenderer_Vulkan.hpp" +using namespace Csm; + +/** +* @brief デバッグ用コールバック +*/ +static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + void* pUserData) +{ + // LappPal::PrintLogは最大文字数を増やせば使える + // LAppPal::PrintLog("validation layer: %s\n", pCallbackData->pMessage); + std::cout << "validation layer: " << pCallbackData->pMessage << std::endl; + return VK_FALSE; +} + +/** +* @brief デバッグ用拡張関数を使えるようにする +*/ +VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, + const VkAllocationCallbacks* pAllocator, + VkDebugUtilsMessengerEXT* pDebugMessenger) +{ + auto func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"); + if (func != nullptr) + { + return func(instance, pCreateInfo, pAllocator, pDebugMessenger); + } + else + { + return VK_ERROR_EXTENSION_NOT_PRESENT; + } +} + +/** +* @brief デバッグメッセンジャーの破棄 +*/ +void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT debugMessenger, + const VkAllocationCallbacks* pAllocator) +{ + auto func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT"); + if (func != nullptr) + { + func(instance, debugMessenger, pAllocator); + } +} + +void VulkanManager::framebufferResizeCallback(GLFWwindow* window, int width, int height) { + auto app = reinterpret_cast(glfwGetWindowUserPointer(window)); + app->_framebufferResized = true; +} + +VulkanManager::VulkanManager(GLFWwindow* wind): + _instance(VK_NULL_HANDLE) + , _physicalDevice(VK_NULL_HANDLE) + , _device(VK_NULL_HANDLE) + , _swapchainManager() + , _surface() + , _graphicQueue(VK_NULL_HANDLE) + , _presentQueue(VK_NULL_HANDLE) + , _commandPool(VK_NULL_HANDLE) + , _debugMessenger() +{ + _window = wind; +} + +VulkanManager::~VulkanManager() +{ + Destroy(); +} + +bool VulkanManager::CheckValidationLayerSupport() +{ + csmUint32 layerCount; + vkEnumerateInstanceLayerProperties(&layerCount, nullptr); + + csmVector availableLayers; + availableLayers.Resize(layerCount); + vkEnumerateInstanceLayerProperties(&layerCount, availableLayers.GetPtr()); + + for (const char* layerName : validationLayers) + { + bool layerFound = false; + + for (csmUint32 i = 0; i < availableLayers.GetSize(); i++) + { + if (strcmp(layerName, availableLayers[i].layerName) == 0) + { + layerFound = true; + break; + } + } + + if (!layerFound) + { + return false; + } + } + + return true; +} + +csmVector VulkanManager::GetRequiredExtensions() +{ + csmUint32 glfwExtensionCount = 0; + const char** glfwExtensions; + glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount); + + csmVector extensions; + for (csmUint32 i = 0; i < glfwExtensionCount; i++) + { + extensions.PushBack(*(glfwExtensions + i)); + } + + if (_enableValidationLayers) + { + extensions.PushBack(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); + } + + return extensions; +} + +void VulkanManager::populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo) +{ + createInfo = {}; + createInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; + createInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; + createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; + createInfo.pfnUserCallback = debugCallback; +} + +void VulkanManager::CreateInstance() +{ + //検証レイヤーが有効のときに使えるか確認 + if (_enableValidationLayers && !CheckValidationLayerSupport()) + { + LAppPal::PrintLog("validation layers requested, but not available!"); + } + + VkApplicationInfo appInfo{}; + appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; + appInfo.pApplicationName = "SAMPLE"; + appInfo.pEngineName = "SAMPLE"; + appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0); + appInfo.apiVersion = VK_API_VERSION_1_3; + + VkInstanceCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + createInfo.pApplicationInfo = &appInfo; + + csmVector extensions = GetRequiredExtensions(); + createInfo.enabledExtensionCount = static_cast(extensions.GetSize()); + createInfo.ppEnabledExtensionNames = extensions.GetPtr(); + + VkDebugUtilsMessengerCreateInfoEXT debugCreateInfo{}; + if (_enableValidationLayers) + { + createInfo.enabledLayerCount = static_cast(sizeof(validationLayers) / sizeof(validationLayers[0])); + createInfo.ppEnabledLayerNames = validationLayers; + // vkDestroyInstanceでデバッグコールが呼ばれるために次の行が必要 + populateDebugMessengerCreateInfo(debugCreateInfo); + createInfo.pNext = (VkDebugUtilsMessengerCreateInfoEXT*)&debugCreateInfo; + } + else + { + createInfo.enabledLayerCount = 0; + } + if (vkCreateInstance(&createInfo, nullptr, &_instance) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to create _instance!"); + } +} + +void VulkanManager::SetupDebugMessenger() +{ + if (!_enableValidationLayers) return; + + VkDebugUtilsMessengerCreateInfoEXT createInfo; + populateDebugMessengerCreateInfo(createInfo); + + if (CreateDebugUtilsMessengerEXT(_instance, &createInfo, nullptr, &_debugMessenger) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to set up debug messenger!"); + } +} + +bool VulkanManager::CheckDeviceExtensionSupport(VkPhysicalDevice physicalDevice) +{ + csmUint32 extensionCount; + vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extensionCount, nullptr); + + csmVector availableExtensions; + availableExtensions.Resize(extensionCount); + vkEnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extensionCount, availableExtensions.GetPtr()); + + for (csmUint32 i = 0; i < sizeof(deviceExtensions) / sizeof(deviceExtensions[0]); i++) + { + bool found = false; + for (csmUint32 j = 0; j < availableExtensions.GetSize(); j++) + { + if (*deviceExtensions[i] == *availableExtensions[j].extensionName) + { + found = true; + } + } + if (found == false) + { + return false; + } + } + return true; +} + +void VulkanManager::CreateSurface() +{ + if (glfwCreateWindowSurface(_instance, _window, nullptr, &_surface) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to create _window _surface!"); + } +} + +void VulkanManager::FindQueueFamilies(VkPhysicalDevice device) +{ + csmUint32 queueFamilyCount = 0; + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, nullptr); + csmVector queueFamilies; + queueFamilies.Resize(queueFamilyCount); + vkGetPhysicalDeviceQueueFamilyProperties(device, &queueFamilyCount, queueFamilies.GetPtr()); + + for (csmUint32 i = 0; i < queueFamilies.GetSize(); i++) + { + if (queueFamilies[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) + { + indices.graphicsFamily = i; + } + + VkBool32 presentSupport = false; + vkGetPhysicalDeviceSurfaceSupportKHR(device, i, _surface, &presentSupport); + if (presentSupport) + { + indices.presentFamily = i; + } + + if (indices.isComplete()) + { + break; + } + } +} + +bool VulkanManager::IsDeviceSuitable(VkPhysicalDevice device) +{ + FindQueueFamilies(device); + bool extensionsSupported = CheckDeviceExtensionSupport(device); + bool swapChainAdequate = false; + //デバイスの拡張機能がサポートされていたら、スワップチェインをサポートしているか確認する + if (extensionsSupported) + { + SwapchainManager::SwapchainSupportDetails swapchainSupport = SwapchainManager::QuerySwapchainSupport( + device, _surface); + swapChainAdequate = swapchainSupport.formats.GetSize() != 0 && swapchainSupport.presentModes.GetSize() != 0; + } + + VkPhysicalDeviceFeatures supportedFeatures; + vkGetPhysicalDeviceFeatures(device, &supportedFeatures); + + return indices.isComplete() && swapChainAdequate && supportedFeatures.samplerAnisotropy; +} + +void VulkanManager::PickPhysicalDevice() +{ + csmUint32 deviceCount = 0; + vkEnumeratePhysicalDevices(_instance, &deviceCount, nullptr); + + if (deviceCount == 0) + { + LAppPal::PrintLog("failed to find GPUs with Vulkan support!"); + } + + csmVector devices; + devices.Resize(deviceCount); + vkEnumeratePhysicalDevices(_instance, &deviceCount, devices.GetPtr()); + + // 一番最初に取得した物理デバイスを使用する + for (csmUint32 i = 0; i < devices.GetSize(); i++) + { + if (IsDeviceSuitable(devices[i])) + { + _physicalDevice = devices[i]; + break; + } + } + + if (_physicalDevice == VK_NULL_HANDLE) + { + LAppPal::PrintLog("failed to find a suitable GPU!"); + } +} + +void VulkanManager::CreateLogicalDevice() +{ + FindQueueFamilies(_physicalDevice); + + csmVector uniqueQueueFamilies; + if (indices.graphicsFamily == indices.presentFamily) + { + uniqueQueueFamilies.PushBack(indices.graphicsFamily); + } + else + { + uniqueQueueFamilies.PushBack(indices.graphicsFamily); + uniqueQueueFamilies.PushBack(indices.presentFamily); + } + + float queuePriority = 1.0f; + csmVector queueCreateInfos; + for (csmUint32 i = 0; i < uniqueQueueFamilies.GetSize(); i++) + { + VkDeviceQueueCreateInfo queueCreateInfo{}; + queueCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queueCreateInfo.queueFamilyIndex = uniqueQueueFamilies[i]; + queueCreateInfo.queueCount = 1; + queueCreateInfo.pQueuePriorities = &queuePriority; + queueCreateInfos.PushBack(queueCreateInfo); + } + + VkDeviceCreateInfo createInfo{}; + createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + createInfo.queueCreateInfoCount = queueCreateInfos.GetSize(); + createInfo.pQueueCreateInfos = queueCreateInfos.GetPtr(); + createInfo.enabledExtensionCount = sizeof(deviceExtensions) / sizeof(deviceExtensions[0]); + createInfo.ppEnabledExtensionNames = deviceExtensions; + + if (_enableValidationLayers) + { + createInfo.enabledLayerCount = sizeof(validationLayers) / sizeof(validationLayers[0]); + createInfo.ppEnabledLayerNames = validationLayers; + } + else + { + createInfo.enabledLayerCount = 0; + } + + VkPhysicalDeviceDynamicRenderingFeaturesKHR dynamicRenderingF{}; + dynamicRenderingF.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES_KHR; + dynamicRenderingF.dynamicRendering = VK_TRUE; + + VkPhysicalDeviceExtendedDynamicStateFeaturesEXT dynamicStateF{}; + dynamicStateF.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; + dynamicStateF.extendedDynamicState = VK_TRUE; + dynamicStateF.pNext = &dynamicRenderingF; + + VkPhysicalDeviceFeatures2 deviceFeatures2{}; + deviceFeatures2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; + deviceFeatures2.pNext = &dynamicStateF; + vkGetPhysicalDeviceFeatures2(_physicalDevice, &deviceFeatures2); + createInfo.pNext = &deviceFeatures2; + + if (vkCreateDevice(_physicalDevice, &createInfo, nullptr, &_device) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to create logical _device!"); + } + + // キューハンドルを取得 + vkGetDeviceQueue(_device, indices.graphicsFamily, 0, &_graphicQueue); + vkGetDeviceQueue(_device, indices.presentFamily, 0, &_presentQueue); +} + +void VulkanManager::ChooseSupportedDepthFormat() +{ + VkFormat depthFormats[5] = { + VK_FORMAT_D32_SFLOAT_S8_UINT, + VK_FORMAT_D32_SFLOAT, + VK_FORMAT_D24_UNORM_S8_UINT, + VK_FORMAT_D16_UNORM_S8_UINT, + VK_FORMAT_D16_UNORM + }; + + for (csmInt32 i = 0; i < sizeof(depthFormats) / sizeof(depthFormats[0]); i++) + { + VkFormatProperties formatProps; + vkGetPhysicalDeviceFormatProperties(_physicalDevice, depthFormats[i], &formatProps); + + if (formatProps.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) + { + _depthFormat = depthFormats[i]; + } + } + CubismLogError("can't find depth format!"); + _depthFormat = depthFormats[0]; +} + +void VulkanManager::CreateCommandPool() +{ + VkCommandPoolCreateInfo poolInfo{}; + poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + poolInfo.queueFamilyIndex = indices.graphicsFamily; + + if (vkCreateCommandPool(_device, &poolInfo, nullptr, &_commandPool) != VK_SUCCESS) + { + LAppPal::PrintLog("failed to create graphics command pool!"); + } +} + +void VulkanManager::CreateSyncObjects() +{ + VkSemaphoreCreateInfo semaphoreInfo{}; + semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + vkCreateSemaphore(_device, &semaphoreInfo, nullptr, &_imageAvailableSemaphore); +} + +void VulkanManager::Initialize() +{ + CreateInstance(); + SetupDebugMessenger(); + CreateSurface(); + PickPhysicalDevice(); + CreateLogicalDevice(); + ChooseSupportedDepthFormat(); + _swapchainManager = new SwapchainManager(_window, _physicalDevice, _device, _surface, indices.graphicsFamily, + indices.presentFamily); + CreateCommandPool(); + _swapchainManager->ChangeLayout(_device, _commandPool, _graphicQueue); + CreateSyncObjects(); +} + +VkCommandBuffer VulkanManager::BeginSingleTimeCommands() +{ + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandPool = _commandPool; + allocInfo.commandBufferCount = 1; + + VkCommandBuffer commandBuffer; + vkAllocateCommandBuffers(_device, &allocInfo, &commandBuffer); + + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + + vkBeginCommandBuffer(commandBuffer, &beginInfo); + + return commandBuffer; +} + +void VulkanManager::SubmitCommand(VkCommandBuffer commandBuffer, bool isFirstDraw) +{ + vkEndCommandBuffer(commandBuffer); + + VkSubmitInfo submitInfo{}; + submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + submitInfo.commandBufferCount = 1; + submitInfo.pCommandBuffers = &commandBuffer; + if(isFirstDraw) + { + submitInfo.waitSemaphoreCount = 1; + submitInfo.pWaitSemaphores = &_imageAvailableSemaphore; + VkPipelineStageFlags waitStages[] = { VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT }; + submitInfo.pWaitDstStageMask = waitStages; + } + vkQueueSubmit(_graphicQueue, 1, &submitInfo, nullptr); + // コマンドの実行終了まで待機 + vkQueueWaitIdle(_graphicQueue); + vkFreeCommandBuffers(_device, _commandPool, 1, &commandBuffer); +} + +void VulkanManager::UpdateDrawFrame() +{ + VkResult result = vkAcquireNextImageKHR(_device, _swapchainManager->GetSwapchain(), UINT64_MAX, + _imageAvailableSemaphore, VK_NULL_HANDLE, + &_imageIndex); + if (result == VK_ERROR_OUT_OF_DATE_KHR) + { + _isSwapchainInvalid = true; + } + else if (result != VK_SUCCESS && result != VK_SUBOPTIMAL_KHR) + { + LAppPal::PrintLog("failed to acquire swap chain image!"); + } +} + +void VulkanManager::PostDraw() +{ + VkResult result = _swapchainManager->QueuePresent(_presentQueue, _imageIndex); + if (result == VK_ERROR_OUT_OF_DATE_KHR || result == VK_SUBOPTIMAL_KHR || _framebufferResized) { + _framebufferResized = false; + _isSwapchainInvalid = true; + } + else if (result != VK_SUCCESS) { + LAppPal::PrintLog("failed to present swap chain image!"); + } +} + +void VulkanManager::RecreateSwapchain() +{ + vkDeviceWaitIdle(_device); + _swapchainManager->Cleanup(_device); + _swapchainManager->CreateSwapchain(_window, _physicalDevice, _device, _surface, indices.graphicsFamily, + indices.presentFamily); + _swapchainManager->ChangeLayout(_device, _commandPool, _graphicQueue); +} + +void VulkanManager::Destroy() +{ + _swapchainManager->Cleanup(_device); + + vkDestroySemaphore(_device, _imageAvailableSemaphore, nullptr); + + if (_enableValidationLayers) + { + DestroyDebugUtilsMessengerEXT(_instance, _debugMessenger, nullptr); + } + + vkDestroyCommandPool(_device, _commandPool, nullptr); + vkDestroyDevice(_device, nullptr); + vkDestroySurfaceKHR(_instance, _surface, nullptr); + vkDestroyInstance(_instance, nullptr); +} diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/VulkanManager.hpp b/Samples/Vulkan/Demo/proj.win.cmake/src/VulkanManager.hpp new file mode 100644 index 00000000..3aba6abd --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/VulkanManager.hpp @@ -0,0 +1,262 @@ +/** + * 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. + */ + +#pragma once +#include +#include +#include "Type/csmMap.hpp" +#include "SwapchainManager.hpp" + + /** + * @brief vulkanに必要なリソースを扱うクラス + */ +class VulkanManager +{ +public: + // キューファミリの情報を格納する構造体 + struct QueueFamilyIndices + { + // 描画用と表示用のキューファミリは必ずしも一致するとは限らないので分ける + Csm::csmInt32 graphicsFamily = -1; // 描画コマンドに使用するキューファミリ + Csm::csmInt32 presentFamily = -1; // 表示に使用するキューファミリ + + // 対応するキューファミリがあるか + bool isComplete() + { + return graphicsFamily != -1 && presentFamily != -1; + } + }indices; + + const char* deviceExtensions[2] = { + VK_KHR_SWAPCHAIN_EXTENSION_NAME, + VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME + }; + + const char* validationLayers[1] = { + "VK_LAYER_KHRONOS_validation" + }; + + static void VulkanManager::framebufferResizeCallback(GLFWwindow* window, int width, int height); + + /** + * @brief コンストラクタ + * @param[in] wind -> ウィンドウ + */ + VulkanManager(GLFWwindow* wind); + + /** + * @brief デストラクタ + */ + ~VulkanManager(); + + /** + * @brief 検証レイヤーのサポートを確認する + */ + bool CheckValidationLayerSupport(); + + /** + * @brief 必要な拡張機能を取得する + * + * @return 必要な拡張の配列 + */ + Csm::csmVector GetRequiredExtensions(); + + /** + * @brief デバッグメッセージを有効にする + * + * @param[in] createInfo -> デバッグメッセンジャーオブジェクトの情報 + */ + void populateDebugMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& createInfo); + + /** + * @brief インスタンスを生成する + */ + void CreateInstance(); + + /** + * @brief デバッグメッセージを有効にする + */ + void SetupDebugMessenger(); + + /** + * @brief デバイスの拡張をチェックする + * + * @param[in] physicalDevice -> 物理デバイス + */ + bool CheckDeviceExtensionSupport(VkPhysicalDevice physicalDevice); + + /** + * @brief サーフェスを作る + */ + void CreateSurface(); + + /** + * @brief キューファミリを見つける + * + * @param[in] queueFlags -> 物理デバイス + */ + void FindQueueFamilies(VkPhysicalDevice device); + + /** + * @brief デバイスが使えるか確認する + * + * @param[in] device -> 物理デバイス + */ + bool IsDeviceSuitable(VkPhysicalDevice device); + + /** + * @brief 物理デバイスを取得する + */ + void PickPhysicalDevice(); + + /** + * @brief 論理デバイスを作成する + */ + void CreateLogicalDevice(); + + /** + * @brief 深度フォーマットを作成する + */ + void ChooseSupportedDepthFormat(); + + /** + * @brief コマンドプールを作成する + */ + void CreateCommandPool(); + + /** + * @brief 同期オブジェクトを作成する + */ + void CreateSyncObjects(); + + /** + * @brief 初期化する + */ + void Initialize(); + + /** + * @brief コマンドの記録を開始する + */ + VkCommandBuffer BeginSingleTimeCommands(); + + /** + * @brief コマンドを提出する + * + * @param[in] commandBuffer -> コマンドバッファ + * @param[in] isDraw -> 描画コマンドか + * @param[in] isFirstDraw -> 最初の描画コマンドか + */ + void SubmitCommand(VkCommandBuffer commandBuffer, bool isFirstDraw = false); + + /** + * @brief 描画する + */ + void UpdateDrawFrame(); + + /** + * @brief 描画する + */ + void PostDraw(); + + /** + * @brief スワップチェーンを再構成する + */ + void RecreateSwapchain(); + + /** + * @brief リソースを破棄する + */ + void Destroy(); + + /** + * @brief デバイスを取得する + * @return デバイス + */ + VkDevice GetDevice() { return _device; } + + /** + * @brief 物理デバイスを取得する + * @return 物理デバイス + */ + VkPhysicalDevice GetPhysicalDevice() { return _physicalDevice; } + + /** + * @brief モデル描画用コマンドバッファを取得する + * @return コマンドバッファの配列 + */ + VkQueue GetGraphicQueue() { return _graphicQueue; } + + /** + * @brief コマンドプールを取得する + * @return コマンドプール + */ + VkCommandPool GetCommandPool() { return _commandPool; } + + /** + * @brief スワップチェーンマネージャーを取得する + * @return スワップチェーンマネージャー + */ + SwapchainManager* GetSwapchainManager() { return _swapchainManager; } + + /** + * @brief ウィンドウサイズが変更されたかのフラグを取得する + * @return ウィンドウサイズの変更フラグ + */ + bool GetIsWindowSizeChanged() { return _isSwapchainInvalid; } + + /** + * @brief ウィンドウサイズが変更されたかのフラグをセットする + * @param[in] flag -> セットするフラグ + */ + void SetIsWindowSizeChanged(bool flag) { _isSwapchainInvalid = flag; } + + /** + * @brief 深度フォーマットを取得する + * @return 深度フォーマット + */ + VkFormat GetDepthFormat() const { return _depthFormat; } + + /** + * @brief サーフェスのフォーマットを取得する + * + * @return フォーマット + */ + VkFormat GetImageFormat() { return _surfaceFormat; } + + /** + * @brief スワップチェーンイメージを取得する + * + * @return スワップチェーンイメージ + */ + VkImage GetSwapchainImage() { return GetSwapchainManager()->GetImages()[_imageIndex]; } + + /** + * @brief スワップチェーンイメージを取得する + * + * @return スワップチェーンイメージ + */ + VkImageView GetSwapchainImageView() { return GetSwapchainManager()->GetImageViews()[_imageIndex]; } + +private: + GLFWwindow* _window; // ウィンドウ + VkInstance _instance; // ライブラリを初期化するインスタンス + VkSurfaceKHR _surface; // ウィンドウシステムに描画ために必要なサーフェス + VkPhysicalDevice _physicalDevice; // 物理デバイス + VkDevice _device; // 論理デバイス + VkQueue _graphicQueue; // 描画コマンドを積むキュー + VkQueue _presentQueue; // 表示コマンドに使用するキュー + VkCommandPool _commandPool; // コマンドバッファの作成に必要なコマンドプール + VkSemaphore _imageAvailableSemaphore; // セマフォ + SwapchainManager* _swapchainManager; // スワップチェーンの管理を行うスワップチェーンマネージャー + bool _isSwapchainInvalid = false; // ウィンドウサイズが変更されたかのフラグ + const bool _enableValidationLayers = true; // 検証レイヤーを有効にするか + VkDebugUtilsMessengerEXT _debugMessenger; // デバッグメッセージを出力するオブジェクト + Csm::csmUint32 _imageIndex = 0; // 現在のイメージインデックス + VkFormat _depthFormat; // 深度フォーマット + const VkFormat _surfaceFormat = VK_FORMAT_R8G8B8A8_UNORM; // イメージフォーマット + bool _framebufferResized = false; // フレームバッファのサイズが変わったか +}; diff --git a/Samples/Vulkan/Demo/proj.win.cmake/src/main.cpp b/Samples/Vulkan/Demo/proj.win.cmake/src/main.cpp new file mode 100644 index 00000000..07b6e814 --- /dev/null +++ b/Samples/Vulkan/Demo/proj.win.cmake/src/main.cpp @@ -0,0 +1,22 @@ +/** + * 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. + */ + +#include "LAppDelegate.hpp" + +int main() +{ + // create the application instance + if (LAppDelegate::GetInstance()->Initialize() == GL_FALSE) + { + return 1; + } + + LAppDelegate::GetInstance()->Run(); + + return 0; +} + diff --git a/Samples/Vulkan/README.md b/Samples/Vulkan/README.md new file mode 100644 index 00000000..e71acb42 --- /dev/null +++ b/Samples/Vulkan/README.md @@ -0,0 +1,73 @@ +# Cubism Native Samples for Vulkan + +Vulkan で実装したアプリケーションのサンプル実装です。 + + +## 開発環境 + +| サードパーティ | バージョン | +| --- | --- | +| [GLFW] | 3.3.2 | +| [stb_image.h] | 2.23 | +| [Vulkan SDK] |1.3| + +その他の開発環境・動作確認環境はトップディレクトリにある [README.md](/README.md) を参照してください。 + + +## ディレクトリ構造 + +``` +. +├─ Demo +│ └─ proj.win.cmake # CMake project for Windows +└─ thirdParty # Third party libraries and scripts +``` + + +## Demo + +[Cubism Native Framework] の各機能を一通り使用したサンプルです。 +モーションの再生、表情の設定、ポーズの切り替え、物理演算の設定などを行います。 +メニューボタンからモデルを切り替えることができます。 + +[Cubism Native Framework]: https://github.com/Live2D/CubismNativeFramework + +このディレクトリ内に含まれるものは以下の通りです。 + +### proj.win.cmake + +Windows 用の CMake プロジェクトです。 + +`script` ディレクトリのスクリプトを実行すると `build` ディレクトリに CMake 成果物が生成されます + +| スクリプト名 | 生成物 | +| --- | --- | +| `nmake_msvcXXXX.bat` | 実行可能なアプリケーション | +| `proj_msvcXXXX.bat` | Visual Studio プロジェクト | + +追加ライブラリとして [GLFW] を使用しています。 +[thirdParty](README.md#thirdParty) の項目を参照して事前にダウンロードを行なってください。 + +## thirdParty + +サンプルプロジェクトで使用するサードパーティライブラリと自動展開スクリプトが含まれます。 + +### GLFW のセットアップ + +`script` ディレクトリ内のスクリプトを実行することで GLFW のダウンロードを行います。 + +| プラットフォーム | スクリプト名 | +| --- | --- | +| Windows | `setup_glew_glfw.bat` | + +スクリプト内の `GLFW_VERSION` を変更することで、ダウンロードするバージョンを変更できます。 + +[GLFW]: https://github.com/glfw/glfw +[stb_image.h]: https://github.com/nothings/stb/blob/master/stb_image.h + +### Vulkan SDK のインストール + +あらかじめVulkan SDKインストールしておき、環境変数VULKAN_SDKを設定しておく必要があります。 + +[Vulkan SDK]: https://www.lunarg.com/vulkan-sdk/ + diff --git a/Samples/Vulkan/Shaders/CMakeLists.txt b/Samples/Vulkan/Shaders/CMakeLists.txt new file mode 100644 index 00000000..f0720ccc --- /dev/null +++ b/Samples/Vulkan/Shaders/CMakeLists.txt @@ -0,0 +1,30 @@ +file(GLOB shader_files src/*) + +# Shader compilation +foreach(shader ${shader_files}) + get_filename_component(file_name ${shader} NAME) + if(file_name MATCHES "common.glsl") + continue() + endif() + get_filename_component(full_path ${shader} ABSOLUTE) + set(output_dir ${CMAKE_CURRENT_BINARY_DIR}/compiledShaders) + string(REGEX REPLACE \\.frag|\\.vert "" output_file ${file_name}) + set(output_file ${output_dir}/${output_file}.spv) + set(compiled_shaders ${compiled_shaders} ${output_file}) + set(compiled_shaders ${compiled_shaders} PARENT_SCOPE) + set_source_files_properties(${shader} PROPERTIES HEADER_FILE_ONLY TRUE) + + add_custom_command( + OUTPUT ${output_file} + COMMAND ${CMAKE_COMMAND} -E make_directory ${output_dir} + COMMAND $ENV{VK_SDK_PATH}/Bin/glslc.exe ${full_path} -o ${output_file} + DEPENDS ${full_path} + ) +endforeach() + +source_group("shaders" FILES ${shader_files}) +add_custom_target( + SampleShaders ALL + DEPENDS ${compiled_shaders} + SOURCES ${shader_files} +) diff --git a/Samples/Vulkan/Shaders/src/FragSprite.frag b/Samples/Vulkan/Shaders/src/FragSprite.frag new file mode 100644 index 00000000..026291f2 --- /dev/null +++ b/Samples/Vulkan/Shaders/src/FragSprite.frag @@ -0,0 +1,19 @@ +#version 460 +#extension GL_GOOGLE_include_directive : enable +layout(binding = 0) uniform UBO +{ + vec4 u_baseColor; +}ubo; + +layout(binding = 1) uniform sampler2D s_texture0; +layout(binding = 2) uniform sampler2D s_texture1; + +layout(location = 0) in vec2 v_texCoord; + +layout(location = 0) out vec4 outColor; + +void main() +{ + vec4 color = texture(s_texture0, v_texCoord); + outColor = vec4(color.rgb * color.a, color.a) * ubo.u_baseColor; +} diff --git a/Samples/Vulkan/Shaders/src/VertSprite.vert b/Samples/Vulkan/Shaders/src/VertSprite.vert new file mode 100644 index 00000000..c0504d0e --- /dev/null +++ b/Samples/Vulkan/Shaders/src/VertSprite.vert @@ -0,0 +1,14 @@ +#version 460 +#extension GL_GOOGLE_include_directive : enable + +layout(location = 0) in vec4 a_position; +layout(location = 1) in vec2 a_texCoord; + +layout(location = 0) out vec2 v_texCoord; + +void main() +{ + gl_Position = a_position; + v_texCoord = a_texCoord; + v_texCoord.y = 1.0 - v_texCoord.y; +} diff --git a/Samples/Vulkan/Shaders/src/common.glsl b/Samples/Vulkan/Shaders/src/common.glsl new file mode 100644 index 00000000..48066062 --- /dev/null +++ b/Samples/Vulkan/Shaders/src/common.glsl @@ -0,0 +1,10 @@ +layout(binding = 0) uniform UBO +{ + mat4 u_matrix; + mat4 u_clipMatrix; + vec4 u_baseColor; + vec4 u_channelFlag; +}ubo; + +layout(binding = 1) uniform sampler2D s_texture0; +layout(binding = 2) uniform sampler2D s_texture1;