From 8edce196a7779e022e6f3d02e9aa71c1dd7ec339 Mon Sep 17 00:00:00 2001 From: wada Date: Thu, 12 Oct 2023 11:10:02 +0900 Subject: [PATCH] Update to Cubism 5 SDK for Native R1 beta3 --- CHANGELOG.md | 13 +++ Framework | 2 +- README.ja.md | 4 +- README.md | 4 +- Samples/Cocos2d-x/README.ja.md | 4 +- Samples/Cocos2d-x/README.md | 4 +- Samples/Metal/README.ja.md | 8 +- Samples/Metal/README.md | 8 +- .../Demo/proj.mac.cmake/src/LAppSprite.cpp | 43 +++++----- .../Demo/proj.mac.cmake/src/LAppSprite.hpp | 10 +++ .../Demo/proj.mac.cmake/src/LAppView.cpp | 7 ++ .../proj.mac.cmake/src/LAppWavFileHandler.cpp | 68 ++++++++++++++-- .../proj.mac.cmake/src/LAppWavFileHandler.hpp | 81 ++++++++++++++----- .../Demo/proj.win.cmake/src/LAppSprite.cpp | 42 +++++----- .../Demo/proj.win.cmake/src/LAppSprite.hpp | 10 +++ .../Demo/proj.win.cmake/src/LAppView.cpp | 7 ++ .../proj.win.cmake/src/LAppWavFileHandler.cpp | 68 ++++++++++++++-- .../proj.win.cmake/src/LAppWavFileHandler.hpp | 81 ++++++++++++++----- Samples/OpenGL/README.ja.md | 2 +- Samples/OpenGL/README.md | 2 +- 20 files changed, 350 insertions(+), 118 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 029e2cb2..37da84de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,18 @@ 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.3] - 2023-10-12 + + +### Added + +* Add functions for MotionSyncPlugin to `LAppWavFileHandler`. + +### Changed + +* Change so that `LAppSprite` is not depend on `LAppDelegate`. + + ## [5-r.1-beta.2] - 2023-09-28 ### Added @@ -342,6 +354,7 @@ See [Core Changelog] for details. * What was `Package.json` is currently being changed to`cubism-info.yml`. +[5-r.1-beta.3]: https://github.com/Live2D/CubismNativeSamples/compare/5-r.1-beta.2...5-r.1-beta.3 [5-r.1-beta.2]: https://github.com/Live2D/CubismNativeSamples/compare/5-r.1-beta.1...5-r.1-beta.2 [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 diff --git a/Framework b/Framework index 465335ee..19d1875f 160000 --- a/Framework +++ b/Framework @@ -1 +1 @@ -Subproject commit 465335eef7bf102d715e265bfa55762006f95152 +Subproject commit 19d1875fa6ad70fdec3f68343dd50c216bf8fde3 diff --git a/README.ja.md b/README.ja.md index 696de7e0..002e1dc0 100644 --- a/README.ja.md +++ b/README.ja.md @@ -111,10 +111,10 @@ Demo | CMake | 3.27.1 | | Visual Studio 2013 | Update 5 | | Visual Studio 2015 | Update 3 | -| Visual Studio 2017 | 15.9.56 | +| Visual Studio 2017 | 15.9.57 | | Visual Studio 2019 | 16.11.30 | | Visual Studio 2022 | 17.7.4 | -| XCode | 14.3.1 | +| Xcode | 14.3.1 | ### Android diff --git a/README.md b/README.md index 3596cbcd..47e975ce 100644 --- a/README.md +++ b/README.md @@ -110,10 +110,10 @@ Please refer to [CHANGELOG.md](CHANGELOG.md) for the changelog of this repositor | CMake | 3.27.1 | | Visual Studio 2013 | Update 5 | | Visual Studio 2015 | Update 3 | -| Visual Studio 2017 | 15.9.56 | +| Visual Studio 2017 | 15.9.57 | | Visual Studio 2019 | 16.11.30 | | Visual Studio 2022 | 17.7.4 | -| XCode | 14.3.1 | +| Xcode | 14.3.1 | ### Android diff --git a/Samples/Cocos2d-x/README.ja.md b/Samples/Cocos2d-x/README.ja.md index 4a46d9e2..383fc832 100644 --- a/Samples/Cocos2d-x/README.ja.md +++ b/Samples/Cocos2d-x/README.ja.md @@ -11,7 +11,7 @@ Cocos2d-xで実装したアプリケーションのサンプル実装です。 | フレームワーク | バージョン | | --- | --- | -| [XCode] | 12.4 | +| [Xcode] | 12.4 | | [Cocos2d-x] | 4.0 (`95e5d868ce5958c0dadfc485bdda52f1bc404fe0`) | その他の開発環境・動作確認環境はトップディレクトリにある [README.md](../../README.ja.md) を参照してください。 @@ -80,7 +80,7 @@ iOS 用の CMake プロジェクトです。 ビルド時に下記の手順を行なってください。 -1. XCode の `Project設定 - TARGETS - Demo - Packaging - Info.plist File` に記載されている `Info.plist` 内の `Executable file` を `$(EXECUTABLE_NAME)` または`Demo`(アプリ名)に書き換えてください +1. Xcode の `Project設定 - TARGETS - Demo - Packaging - Info.plist File` に記載されている `Info.plist` 内の `Executable file` を `$(EXECUTABLE_NAME)` または`Demo`(アプリ名)に書き換えてください NOTICE: Cubism Core は i386 アーキテクチャをサポートしていないため、**iPhone Simulator 向けのビルドは行えません。** diff --git a/Samples/Cocos2d-x/README.md b/Samples/Cocos2d-x/README.md index a4df677f..fa294f01 100644 --- a/Samples/Cocos2d-x/README.md +++ b/Samples/Cocos2d-x/README.md @@ -11,7 +11,7 @@ This is a sample implementation of an application implemented with Cocos2d-x. | Framework | Version | | --- | --- | -| [XCode] | 12.4 | +| [Xcode] | 12.4 | | [Cocos2d-x] | 4.0 (`95e5d868ce5958c0dadfc485bdda52f1bc404fe0`) | For other development environments and operation environments, see [README.md](../../README.md) in the top directory. @@ -78,7 +78,7 @@ Running the script in the `script` directory will generate a CMake deliverable i Follow the steps below when building. -1. Rewrite the `Executable file` in `Info.plist` stated in XCode's `Project Settings - TARGETS - Demo - Packaging - Info.plist File` to `$(EXECUTABLE_NAME)` or `Demo` (app name). +1. Rewrite the `Executable file` in `Info.plist` stated in Xcode's `Project Settings - TARGETS - Demo - Packaging - Info.plist File` to `$(EXECUTABLE_NAME)` or `Demo` (app name). NOTICE: Cubism Core does not support the i386 architecture, so **it is not possible to build for iPhone Simulator.** diff --git a/Samples/Metal/README.ja.md b/Samples/Metal/README.ja.md index d68ca6b7..59d979da 100644 --- a/Samples/Metal/README.ja.md +++ b/Samples/Metal/README.ja.md @@ -52,14 +52,14 @@ iOS もしくは Mac Catalyst用の CMake プロジェクトです。 Appleシリコン搭載のMacでのiOS Simulator用ビルド時は下記の手順を行ってください。 -1. XCode の `Project設定 - TARGETS - Demo` および `Framework` の `Build Settings - Architectures - Architectures` の記載を実行環境に合わせて変更してください。 +1. Xcode の `Project設定 - TARGETS - Demo` および `Framework` の `Build Settings - Architectures - Architectures` の記載を実行環境に合わせて変更してください。 Mac Catalyst用ビルド時は下記の手順を行なってください。 -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` に変更してください。 +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を参考ください。 [turning-on-mac-catalyst]:https://developer.apple.com/tutorials/mac-catalyst/turning-on-mac-catalyst diff --git a/Samples/Metal/README.md b/Samples/Metal/README.md index 8d1e3a0b..8ee7b0e7 100644 --- a/Samples/Metal/README.md +++ b/Samples/Metal/README.md @@ -52,14 +52,14 @@ You can choose between iOS, iOS Simulator, or Mac Catalyst when running the scri Follow the steps below when building for iOS Simulator on a Mac with Apple silicon. -1. Change the description of XCode's `Project Settings - TARGETS - Demo` and `Framework`'s `Build Settings - Architectures - Architectures` according to the execution environment. +1. Change the description of Xcode's `Project Settings - TARGETS - Demo` and `Framework`'s `Build Settings - Architectures - Architectures` according to the execution environment. Follow the steps below when building for Mac Catalyst. -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. +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.mac.cmake/src/LAppSprite.cpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppSprite.cpp index e11d3e3e..c6e2a073 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppSprite.cpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppSprite.cpp @@ -6,7 +6,6 @@ */ #include "LAppSprite.hpp" -#include "LAppDelegate.hpp" LAppSprite::LAppSprite(float x, float y, float width, float height, GLuint textureId, GLuint programId) : _rect() @@ -35,11 +34,7 @@ LAppSprite::~LAppSprite() void LAppSprite::Render() const { - // 画面サイズを取得する - int maxWidth, maxHeight; - glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &maxWidth, &maxHeight); - - if(maxWidth==0 || maxHeight==0) + if (_maxWidth == 0 || _maxHeight == 0) { return; } @@ -62,10 +57,10 @@ void LAppSprite::Render() const // 頂点データ float positionVertex[] = { - (_rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.left - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.left - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.down - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.down - maxHeight * 0.5f) / (maxHeight * 0.5f) + (_rect.right - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.up - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.left - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.up - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.left - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.down - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.right - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.down - _maxHeight * 0.5f) / (_maxHeight * 0.5f) }; // attribute属性を登録 @@ -81,11 +76,7 @@ void LAppSprite::Render() const void LAppSprite::RenderImmidiate(GLuint textureId, const GLfloat uvVertex[8]) const { - // 画面サイズを取得する - int maxWidth, maxHeight; - glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &maxWidth, &maxHeight); - - if(maxWidth==0 || maxHeight==0) + if (_maxWidth == 0 || _maxHeight == 0) { return; } @@ -100,10 +91,10 @@ void LAppSprite::RenderImmidiate(GLuint textureId, const GLfloat uvVertex[8]) co // 頂点データ float positionVertex[] = { - (_rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.left - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.left - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.down - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.down - maxHeight * 0.5f) / (maxHeight * 0.5f) + (_rect.right - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.up - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.left - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.up - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.left - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.down - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.right - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.down - _maxHeight * 0.5f) / (_maxHeight * 0.5f) }; // attribute属性を登録 @@ -119,16 +110,12 @@ void LAppSprite::RenderImmidiate(GLuint textureId, const GLfloat uvVertex[8]) co bool LAppSprite::IsHit(float pointX, float pointY) const { - // 画面サイズを取得する - int maxWidth, maxHeight; - glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &maxWidth, &maxHeight); - - if(maxWidth==0 || maxHeight==0) + if (_maxWidth == 0 || _maxHeight == 0) { return false; } //Y座標は変換する必要あり - float y = maxHeight - pointY; + float y = _maxHeight - pointY; return (pointX >= _rect.left && pointX <= _rect.right && y <= _rect.up && y >= _rect.down); } @@ -148,3 +135,9 @@ void LAppSprite::ResetRect(float x, float y, float width, float height) _rect.up = (y + height * 0.5f); _rect.down = (y - height * 0.5f); } + +void LAppSprite::SetWindowSize(int width, int height) +{ + _maxWidth = width; + _maxHeight = height; +} diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppSprite.hpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppSprite.hpp index 7923c2d9..bd09a42a 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppSprite.hpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppSprite.hpp @@ -94,6 +94,14 @@ class LAppSprite */ void ResetRect(float x, float y, float width, float height); + /** + * @brief ウインドウサイズ設定 + * + * @param[in] width 横幅 + * @param[in] height 高さ + */ + void SetWindowSize(int width, int height); + private: GLuint _textureId; ///< テクスチャID Rect _rect; ///< 矩形 @@ -103,5 +111,7 @@ class LAppSprite int _colorLocation; ///< カラーアトリビュート float _spriteColor[4]; ///< 表示カラー + int _maxWidth; ///< ウインドウ幅 + int _maxHeight; ///< ウインドウ高さ }; diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.cpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.cpp index 848bfa98..80c77ab1 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.cpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppView.cpp @@ -106,6 +106,13 @@ void LAppView::Initialize() void LAppView::Render() { + // 画面サイズを取得する + int maxWidth, maxHeight; + glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &maxWidth, &maxHeight); + _back->SetWindowSize(maxWidth, maxHeight); + _gear->SetWindowSize(maxWidth, maxHeight); + _power->SetWindowSize(maxWidth, maxHeight); + _back->Render(); _gear->Render(); _power->Render(); diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppWavFileHandler.cpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppWavFileHandler.cpp index 7142ba86..f9c70487 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppWavFileHandler.cpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppWavFileHandler.cpp @@ -11,7 +11,8 @@ #include "LAppPal.hpp" LAppWavFileHandler::LAppWavFileHandler() - : _pcmData(NULL) + : _rawData(NULL) + , _pcmData(NULL) , _userTimeSeconds(0.0f) , _lastRms(0.0f) , _sampleOffset(0) @@ -20,6 +21,11 @@ LAppWavFileHandler::LAppWavFileHandler() LAppWavFileHandler::~LAppWavFileHandler() { + if (_rawData != NULL) + { + CSM_FREE(_rawData); + } + if (_pcmData != NULL) { ReleasePcmData(); @@ -85,11 +91,54 @@ Csm::csmFloat32 LAppWavFileHandler::GetRms() const return _lastRms; } +const LAppWavFileHandler::WavFileInfo& LAppWavFileHandler::GetWavFileInfo() const +{ + return _wavFileInfo; +} + +Csm::csmByte* LAppWavFileHandler::GetRawData() const +{ + return _rawData; +} + +Csm::csmUint64 LAppWavFileHandler::GetRawDataSize() const +{ + return _rawDataSize; +} + +Csm::csmVector LAppWavFileHandler::GetPcmData() const +{ + Csm::csmVector buffer; + + for (Csm::csmUint32 sampleCount = 0; sampleCount < _wavFileInfo._samplesPerChannel; sampleCount++) + { + for (Csm::csmUint32 channelCount = 0; channelCount < _wavFileInfo._numberOfChannels; channelCount++) + { + buffer.PushBack(_pcmData[channelCount][sampleCount]); + } + } + + return buffer; +} + +void LAppWavFileHandler::GetPcmDataChannel(Csm::csmFloat32* dst, Csm::csmUint32 useChannel) const +{ + for (Csm::csmUint32 sampleCount = 0; sampleCount < _wavFileInfo._samplesPerChannel; sampleCount++) + { + dst[sampleCount] = _pcmData[useChannel][sampleCount]; + } +} + Csm::csmBool LAppWavFileHandler::LoadWavFile(const Csm::csmString& filePath) { Csm::csmBool ret; // 既にwavファイルロード済みならば領域開放 + if (_rawData != NULL) + { + CSM_FREE(_rawData); + _rawDataSize = 0; + } if (_pcmData != NULL) { ReleasePcmData(); @@ -141,10 +190,10 @@ Csm::csmBool LAppWavFileHandler::LoadWavFile(const Csm::csmString& filePath) _wavFileInfo._numberOfChannels = _byteReader.Get16LittleEndian(); // サンプリングレート _wavFileInfo._samplingRate = _byteReader.Get32LittleEndian(); - // データ速度[byte/sec](読み飛ばし) - _byteReader.Get32LittleEndian(); - // ブロックサイズ(読み飛ばし) - _byteReader.Get16LittleEndian(); + // 平均データ速度 + _wavFileInfo._avgBytesPerSec = _byteReader.Get32LittleEndian(); + // ブロックサイズ + _wavFileInfo._blockAlign = _byteReader.Get16LittleEndian(); // 量子化ビット数 _wavFileInfo._bitsPerSample = _byteReader.Get16LittleEndian(); // fmtチャンクの拡張部分の読み飛ばし @@ -170,16 +219,25 @@ Csm::csmBool LAppWavFileHandler::LoadWavFile(const Csm::csmString& filePath) _wavFileInfo._samplesPerChannel = (dataChunkSize * 8) / (_wavFileInfo._bitsPerSample * _wavFileInfo._numberOfChannels); } // 領域確保 + _rawDataSize = static_cast(_wavFileInfo._blockAlign) * static_cast(_wavFileInfo._samplesPerChannel); + _rawData = static_cast(CSM_MALLOC(sizeof(Csm::csmByte) * _rawDataSize)); _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)); } // 波形データ取得 + Csm::csmUint64 rawPos = 0; for (Csm::csmUint32 sampleCount = 0; sampleCount < _wavFileInfo._samplesPerChannel; sampleCount++) { for (Csm::csmUint32 channelCount = 0; channelCount < _wavFileInfo._numberOfChannels; channelCount++) { + // 正規化前 + for (Csm::csmUint32 byteCount = 0; byteCount < _wavFileInfo._bitsPerSample / 8; byteCount++) + { + _rawData[rawPos++] = _byteReader._fileByte[_byteReader._readOffset + byteCount]; + } + // 正規化後 _pcmData[channelCount][sampleCount] = GetPcmSample(); } } diff --git a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppWavFileHandler.hpp b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppWavFileHandler.hpp index 8d5be9a1..3c325dd0 100644 --- a/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppWavFileHandler.hpp +++ b/Samples/OpenGL/Demo/proj.mac.cmake/src/LAppWavFileHandler.hpp @@ -8,7 +8,7 @@ #pragma once #include -#include +#include /** * @brief wavファイルハンドラ @@ -17,6 +17,28 @@ class LAppWavFileHandler { public: + /** + * @brief 読み込んだwavfileの情報 + */ + struct WavFileInfo + { + /** + * @brief コンストラクタ + */ + WavFileInfo() : _fileName(""), _numberOfChannels(0), + _bitsPerSample(0), _samplingRate(0), _samplesPerChannel(0), + _avgBytesPerSec(0), _blockAlign(0) + { } + + Csm::csmString _fileName; ///< ファイル名 + Csm::csmUint32 _numberOfChannels; ///< チャンネル数 + Csm::csmUint32 _bitsPerSample; ///< サンプルあたりビット数 + Csm::csmUint32 _samplingRate; ///< サンプリングレート + Csm::csmUint32 _samplesPerChannel; ///< 1チャンネルあたり総サンプル数 + Csm::csmUint32 _avgBytesPerSec; ///< 平均データ速度 + Csm::csmUint32 _blockAlign; ///< ブロックサイズ + } _wavFileInfo; + /** * @brief コンストラクタ */ @@ -50,6 +72,42 @@ class LAppWavFileHandler */ Csm::csmFloat32 GetRms() const; + /** + * @brief ファイル情報を取得 + * + * @retval ファイル情報 + */ + const WavFileInfo& GetWavFileInfo() const; + + /** + * @brief 正規化前のデータを取得 + * + * @retval 正規化前のデータ + */ + Csm::csmByte* GetRawData() const; + + /** + * @brief 正規化前のデータの大きさを取得 + * + * @retval 正規化前のデータの大きさ + */ + Csm::csmUint64 GetRawDataSize() const; + + /** + * @brief 正規化データを取得する + * + * @retval 正規化データ + */ + Csm::csmVector GetPcmData() const; + + /** + * @brief 引数で指定したチャンネルの正規化データを取得する + * + * @param[in] dst 格納先 + * @param[in] useChannel 使用するチャンネル + */ + void GetPcmDataChannel(Csm::csmFloat32* dst, Csm::csmUint32 useChannel) const; + private: /** * @brief wavファイルのロード @@ -71,25 +129,6 @@ class LAppWavFileHandler */ 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 バイトリーダ */ @@ -175,6 +214,8 @@ class LAppWavFileHandler Csm::csmUint32 _readOffset; ///< ファイル参照位置 } _byteReader; + Csm::csmByte* _rawData; ///< 正規化される前のバイト列 + Csm::csmUint64 _rawDataSize; ///< 正規化される前のバイト列の大きさ Csm::csmFloat32** _pcmData; ///< -1から1の範囲で表現された音声データ配列 Csm::csmUint32 _sampleOffset; ///< サンプル参照位置 Csm::csmFloat32 _lastRms; ///< 最後に計測したRMS値 diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppSprite.cpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppSprite.cpp index fc54096f..9d449f75 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppSprite.cpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppSprite.cpp @@ -6,7 +6,6 @@ */ #include "LAppSprite.hpp" -#include "LAppDelegate.hpp" LAppSprite::LAppSprite(float x, float y, float width, float height, GLuint textureId, GLuint programId) : _rect() @@ -35,11 +34,8 @@ LAppSprite::~LAppSprite() void LAppSprite::Render() const { - // 画面サイズを取得する - int maxWidth, maxHeight; - glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &maxWidth, &maxHeight); - if (maxWidth == 0 || maxHeight == 0) + if (_maxWidth == 0 || _maxHeight == 0) { return; // この際は描画できず } @@ -62,10 +58,10 @@ void LAppSprite::Render() const // 頂点データ float positionVertex[] = { - (_rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.left - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.left - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.down - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.down - maxHeight * 0.5f) / (maxHeight * 0.5f) + (_rect.right - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.up - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.left - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.up - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.left - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.down - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.right - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.down - _maxHeight * 0.5f) / (_maxHeight * 0.5f) }; // attribute属性を登録 @@ -82,11 +78,7 @@ void LAppSprite::Render() const void LAppSprite::RenderImmidiate(GLuint textureId, const GLfloat uvVertex[8]) const { - // 画面サイズを取得する - int maxWidth, maxHeight; - glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &maxWidth, &maxHeight); - - if (maxWidth == 0 || maxHeight == 0) + if (_maxWidth == 0 || _maxHeight == 0) { return; // この際は描画できず } @@ -101,10 +93,10 @@ void LAppSprite::RenderImmidiate(GLuint textureId, const GLfloat uvVertex[8]) co // 頂点データ float positionVertex[] = { - (_rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.left - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.up - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.left - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.down - maxHeight * 0.5f) / (maxHeight * 0.5f), - (_rect.right - maxWidth * 0.5f) / (maxWidth * 0.5f), (_rect.down - maxHeight * 0.5f) / (maxHeight * 0.5f) + (_rect.right - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.up - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.left - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.up - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.left - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.down - _maxHeight * 0.5f) / (_maxHeight * 0.5f), + (_rect.right - _maxWidth * 0.5f) / (_maxWidth * 0.5f), (_rect.down - _maxHeight * 0.5f) / (_maxHeight * 0.5f) }; // attribute属性を登録 @@ -120,17 +112,13 @@ void LAppSprite::RenderImmidiate(GLuint textureId, const GLfloat uvVertex[8]) co bool LAppSprite::IsHit(float pointX, float pointY) const { - // 画面サイズを取得する - int maxWidth, maxHeight; - glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &maxWidth, &maxHeight); - - if (maxWidth == 0 || maxHeight == 0) + if (_maxWidth == 0 || _maxHeight == 0) { return false; // この際は描画できず } //Y座標は変換する必要あり - float y = maxHeight - pointY; + float y = _maxHeight - pointY; return (pointX >= _rect.left && pointX <= _rect.right && y <= _rect.up && y >= _rect.down); } @@ -150,3 +138,9 @@ void LAppSprite::ResetRect(float x, float y, float width, float height) _rect.up = (y + height * 0.5f); _rect.down = (y - height * 0.5f); } + +void LAppSprite::SetWindowSize(int width, int height) +{ + _maxWidth = width; + _maxHeight = height; +} diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppSprite.hpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppSprite.hpp index d1ff2e42..ef27bf10 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppSprite.hpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppSprite.hpp @@ -94,6 +94,14 @@ class LAppSprite */ void ResetRect(float x, float y, float width, float height); + /** + * @brief ウインドウサイズ設定 + * + * @param[in] width 横幅 + * @param[in] height 高さ + */ + void SetWindowSize(int width, int height); + private: GLuint _textureId; ///< テクスチャID Rect _rect; ///< 矩形 @@ -103,5 +111,7 @@ class LAppSprite int _colorLocation; ///< カラーアトリビュート float _spriteColor[4]; ///< 表示カラー + int _maxWidth; ///< ウインドウ幅 + int _maxHeight; ///< ウインドウ高さ }; diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.cpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.cpp index d0b945a5..0e9c7c8d 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.cpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppView.cpp @@ -103,6 +103,13 @@ void LAppView::Initialize() void LAppView::Render() { + // 画面サイズを取得する + int maxWidth, maxHeight; + glfwGetWindowSize(LAppDelegate::GetInstance()->GetWindow(), &maxWidth, &maxHeight); + _back->SetWindowSize(maxWidth, maxHeight); + _gear->SetWindowSize(maxWidth, maxHeight); + _power->SetWindowSize(maxWidth, maxHeight); + _back->Render(); _gear->Render(); _power->Render(); diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppWavFileHandler.cpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppWavFileHandler.cpp index 7142ba86..f9c70487 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppWavFileHandler.cpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppWavFileHandler.cpp @@ -11,7 +11,8 @@ #include "LAppPal.hpp" LAppWavFileHandler::LAppWavFileHandler() - : _pcmData(NULL) + : _rawData(NULL) + , _pcmData(NULL) , _userTimeSeconds(0.0f) , _lastRms(0.0f) , _sampleOffset(0) @@ -20,6 +21,11 @@ LAppWavFileHandler::LAppWavFileHandler() LAppWavFileHandler::~LAppWavFileHandler() { + if (_rawData != NULL) + { + CSM_FREE(_rawData); + } + if (_pcmData != NULL) { ReleasePcmData(); @@ -85,11 +91,54 @@ Csm::csmFloat32 LAppWavFileHandler::GetRms() const return _lastRms; } +const LAppWavFileHandler::WavFileInfo& LAppWavFileHandler::GetWavFileInfo() const +{ + return _wavFileInfo; +} + +Csm::csmByte* LAppWavFileHandler::GetRawData() const +{ + return _rawData; +} + +Csm::csmUint64 LAppWavFileHandler::GetRawDataSize() const +{ + return _rawDataSize; +} + +Csm::csmVector LAppWavFileHandler::GetPcmData() const +{ + Csm::csmVector buffer; + + for (Csm::csmUint32 sampleCount = 0; sampleCount < _wavFileInfo._samplesPerChannel; sampleCount++) + { + for (Csm::csmUint32 channelCount = 0; channelCount < _wavFileInfo._numberOfChannels; channelCount++) + { + buffer.PushBack(_pcmData[channelCount][sampleCount]); + } + } + + return buffer; +} + +void LAppWavFileHandler::GetPcmDataChannel(Csm::csmFloat32* dst, Csm::csmUint32 useChannel) const +{ + for (Csm::csmUint32 sampleCount = 0; sampleCount < _wavFileInfo._samplesPerChannel; sampleCount++) + { + dst[sampleCount] = _pcmData[useChannel][sampleCount]; + } +} + Csm::csmBool LAppWavFileHandler::LoadWavFile(const Csm::csmString& filePath) { Csm::csmBool ret; // 既にwavファイルロード済みならば領域開放 + if (_rawData != NULL) + { + CSM_FREE(_rawData); + _rawDataSize = 0; + } if (_pcmData != NULL) { ReleasePcmData(); @@ -141,10 +190,10 @@ Csm::csmBool LAppWavFileHandler::LoadWavFile(const Csm::csmString& filePath) _wavFileInfo._numberOfChannels = _byteReader.Get16LittleEndian(); // サンプリングレート _wavFileInfo._samplingRate = _byteReader.Get32LittleEndian(); - // データ速度[byte/sec](読み飛ばし) - _byteReader.Get32LittleEndian(); - // ブロックサイズ(読み飛ばし) - _byteReader.Get16LittleEndian(); + // 平均データ速度 + _wavFileInfo._avgBytesPerSec = _byteReader.Get32LittleEndian(); + // ブロックサイズ + _wavFileInfo._blockAlign = _byteReader.Get16LittleEndian(); // 量子化ビット数 _wavFileInfo._bitsPerSample = _byteReader.Get16LittleEndian(); // fmtチャンクの拡張部分の読み飛ばし @@ -170,16 +219,25 @@ Csm::csmBool LAppWavFileHandler::LoadWavFile(const Csm::csmString& filePath) _wavFileInfo._samplesPerChannel = (dataChunkSize * 8) / (_wavFileInfo._bitsPerSample * _wavFileInfo._numberOfChannels); } // 領域確保 + _rawDataSize = static_cast(_wavFileInfo._blockAlign) * static_cast(_wavFileInfo._samplesPerChannel); + _rawData = static_cast(CSM_MALLOC(sizeof(Csm::csmByte) * _rawDataSize)); _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)); } // 波形データ取得 + Csm::csmUint64 rawPos = 0; for (Csm::csmUint32 sampleCount = 0; sampleCount < _wavFileInfo._samplesPerChannel; sampleCount++) { for (Csm::csmUint32 channelCount = 0; channelCount < _wavFileInfo._numberOfChannels; channelCount++) { + // 正規化前 + for (Csm::csmUint32 byteCount = 0; byteCount < _wavFileInfo._bitsPerSample / 8; byteCount++) + { + _rawData[rawPos++] = _byteReader._fileByte[_byteReader._readOffset + byteCount]; + } + // 正規化後 _pcmData[channelCount][sampleCount] = GetPcmSample(); } } diff --git a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppWavFileHandler.hpp b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppWavFileHandler.hpp index 8d5be9a1..3c325dd0 100644 --- a/Samples/OpenGL/Demo/proj.win.cmake/src/LAppWavFileHandler.hpp +++ b/Samples/OpenGL/Demo/proj.win.cmake/src/LAppWavFileHandler.hpp @@ -8,7 +8,7 @@ #pragma once #include -#include +#include /** * @brief wavファイルハンドラ @@ -17,6 +17,28 @@ class LAppWavFileHandler { public: + /** + * @brief 読み込んだwavfileの情報 + */ + struct WavFileInfo + { + /** + * @brief コンストラクタ + */ + WavFileInfo() : _fileName(""), _numberOfChannels(0), + _bitsPerSample(0), _samplingRate(0), _samplesPerChannel(0), + _avgBytesPerSec(0), _blockAlign(0) + { } + + Csm::csmString _fileName; ///< ファイル名 + Csm::csmUint32 _numberOfChannels; ///< チャンネル数 + Csm::csmUint32 _bitsPerSample; ///< サンプルあたりビット数 + Csm::csmUint32 _samplingRate; ///< サンプリングレート + Csm::csmUint32 _samplesPerChannel; ///< 1チャンネルあたり総サンプル数 + Csm::csmUint32 _avgBytesPerSec; ///< 平均データ速度 + Csm::csmUint32 _blockAlign; ///< ブロックサイズ + } _wavFileInfo; + /** * @brief コンストラクタ */ @@ -50,6 +72,42 @@ class LAppWavFileHandler */ Csm::csmFloat32 GetRms() const; + /** + * @brief ファイル情報を取得 + * + * @retval ファイル情報 + */ + const WavFileInfo& GetWavFileInfo() const; + + /** + * @brief 正規化前のデータを取得 + * + * @retval 正規化前のデータ + */ + Csm::csmByte* GetRawData() const; + + /** + * @brief 正規化前のデータの大きさを取得 + * + * @retval 正規化前のデータの大きさ + */ + Csm::csmUint64 GetRawDataSize() const; + + /** + * @brief 正規化データを取得する + * + * @retval 正規化データ + */ + Csm::csmVector GetPcmData() const; + + /** + * @brief 引数で指定したチャンネルの正規化データを取得する + * + * @param[in] dst 格納先 + * @param[in] useChannel 使用するチャンネル + */ + void GetPcmDataChannel(Csm::csmFloat32* dst, Csm::csmUint32 useChannel) const; + private: /** * @brief wavファイルのロード @@ -71,25 +129,6 @@ class LAppWavFileHandler */ 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 バイトリーダ */ @@ -175,6 +214,8 @@ class LAppWavFileHandler Csm::csmUint32 _readOffset; ///< ファイル参照位置 } _byteReader; + Csm::csmByte* _rawData; ///< 正規化される前のバイト列 + Csm::csmUint64 _rawDataSize; ///< 正規化される前のバイト列の大きさ Csm::csmFloat32** _pcmData; ///< -1から1の範囲で表現された音声データ配列 Csm::csmUint32 _sampleOffset; ///< サンプル参照位置 Csm::csmFloat32 _lastRms; ///< 最後に計測したRMS値 diff --git a/Samples/OpenGL/README.ja.md b/Samples/OpenGL/README.ja.md index d740497b..f744381f 100644 --- a/Samples/OpenGL/README.ja.md +++ b/Samples/OpenGL/README.ja.md @@ -78,7 +78,7 @@ iOS 用の CMake プロジェクトです。 Appleシリコン搭載のMacでのiOS Simulator用ビルド時は下記の手順を行ってください。 -1. XCode の `Project設定 - TARGETS - Demo` および `Framework` の `Build Settings - Architectures - Architectures` の記載を実行環境に合わせて変更してください。 +1. Xcode の `Project設定 - TARGETS - Demo` および `Framework` の `Build Settings - Architectures - Architectures` の記載を実行環境に合わせて変更してください。 CMake のツールチェーンとして [ios-cmake] を使用しています。 diff --git a/Samples/OpenGL/README.md b/Samples/OpenGL/README.md index caab2aba..eca45432 100644 --- a/Samples/OpenGL/README.md +++ b/Samples/OpenGL/README.md @@ -78,7 +78,7 @@ When you run these scripts, you can choose to generate the full version or the m Follow the steps below when building for iOS Simulator on a Mac with Apple silicon. -1. Change the description of XCode's `Project Settings - TARGETS - Demo` and `Framework`'s `Build Settings - Architectures - Architectures` according to the execution environment. +1. Change the description of Xcode's `Project Settings - TARGETS - Demo` and `Framework`'s `Build Settings - Architectures - Architectures` according to the execution environment. [ios-cmake] is used as a toolchain for CMake.