diff --git a/CHANGELOG.md b/CHANGELOG.md index 47ed01b..c335d58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,60 @@ 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.2] - 2024-12-19 + +### Added + +* Add copy constructor to `csmMap`. +* Add functions to get `CombinedParameters` listed in `cdi3.json`. +* Add the functionality to call a function when motion playback starts. +* Add updates to the OpenGL rendering code for HarmonyOS compatibility. +* Add Linux support for the Vulkan renderer. +* Add an API to `CubismMotionJson` for verifying the consistency of `motion3.json`. by [@pillowtrucker](https://github.com/Live2D/CubismNativeFramework/pull/57) +* Add dedicated resource destruction functions for some platforms + +### Changed + +* Change to permit to overwrite motion fade by the value specified in .model3.json on `CubismUserModel::LoadMotion()`. +* Change the threshold for enabling anisotropic filtering in all renderers. +* Change `CubismJson` to not use character masking. +* Resources in Vulkan have been changed to support multi-buffering. +* Change the `ACubismMotion::UpdateFadeWeight()` function to return an error code of `-1` when the argument is NULL. by [@Coloryr](https://github.com/Live2D/CubismNativeFramework/pull/56) +* Change the access level of the private members in the `CubismModelSettingJson` class to protected. +* Change the value of pi used in the calculation of `CubismBreath::UpdateParameters()` to `CubismMath.PI`. + +### Deprecated + +* Deprecate the following elements because a priority value is not actually used during expression motion playback: + * `CubismExpressionMotionManager::_currentPriority` + * `CubismExpressionMotionManager::_reservePriority` + * `CubismExpressionMotionManager::StartMotionPriority()` + * `CubismExpressionMotionManager::GetCurrentPriority()` + * `CubismExpressionMotionManager::GetReservePriority()` + * `CubismExpressionMotionManager::SetReservePriority()` + + Please use the `CubismMotionQueueManager::StartMotion()` instead of `CubismExpressionMotionManager::StartMotionPriority()`. + +### Fixed + +* Fix an issue where already registered keys could be added on `csmMap.appendKey()`. +* Fix JSON parser to work even when locale is set. +* Fix memory leak in Vulkan. +* Fix the Anisotropy processing of Vulkan to match the Sample. +* Fix D3D11 anisotropic filtering to allow filtering with the specified settings. +* Fix anisotropic filtering in D3D9. + * Improved the rendering quality by setting the appropriate filter settings. + * Anisotropic filtering is now properly processed. +* Fix a bug that caused an error when playing CubismExpresionMotion with CubismMotionQueueManager::StartMotion(). +* Fix a potential problem with division by 0 when a pose fade time is set to 0 seconds. +* Fix an issue where calling `+=` on `csmString` would throw an exception if the character count exceeded 64. + +### Removed + +* Remove the Cocos2d-x renderer. + + ## [5-r.1] - 2024-03-26 ### Added @@ -371,6 +425,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). * Fix invalid expressions of `CubismCdiJson`. +[5-r.2]: https://github.com/Live2D/CubismNativeFramework/compare/5-r.1...5-r.2 [5-r.1]: https://github.com/Live2D/CubismNativeFramework/compare/5-r.1-beta.4...5-r.1 [5-r.1-beta.4]: https://github.com/Live2D/CubismNativeFramework/compare/5-r.1-beta.3...5-r.1-beta.4 [5-r.1-beta.3]: https://github.com/Live2D/CubismNativeFramework/compare/5-r.1-beta.2...5-r.1-beta.3 diff --git a/TRANSLATION.md b/TRANSLATION.md index 0e4e01e..246a498 100644 --- a/TRANSLATION.md +++ b/TRANSLATION.md @@ -9,10 +9,10 @@ Please see the table below for progress. | Module | Path | Status | | ---: | :--- | :---: | | Framework Systems | ./src/ | Done | -| Effect | ./src/Effect/ | - | -| Id | ./src/Id/ | - | -| Math | ./src/Math/ | - | -| Model | ./src/Model/ | - | +| Effect | ./src/Effect/ | Done | +| Id | ./src/Id/ | Done | +| Math | ./src/Math/ | Done | +| Model | ./src/Model/ | Done | | Physics | ./src/Physics/ | - | | Utils | ./src/Utils/ | - | | Rendering | ./src/Rendering/ | - | @@ -36,37 +36,37 @@ Please see the table below for progress. | File | Completion Date | | :--- | :--- | -| ./Effect/CubismBreath.hpp | - | -| ./Effect/CubismEyeBlink.hpp | - | -| ./Effect/CubismPose.hpp | - | +| ./Effect/CubismBreath.hpp | 2024-10-08 | +| ./Effect/CubismEyeBlink.hpp | 2024-10-08 | +| ./Effect/CubismPose.hpp | 2024-10-08 | ## Id | File | Completion Date | | :--- | :--- | -| ./Id/CubismId.hpp | - | -| ./Id/CubismIdManager.hpp | - | +| ./Id/CubismId.hpp | 2024-10-08 | +| ./Id/CubismIdManager.hpp | 2024-10-08 | ## Math | File | Completion Date | | :--- | :--- | -| ./Math/CubismMath.hpp | - | -| ./Math/CubismMatrix44.hpp | - | -| ./Math/CubismModelMatrix.hpp | - | -| ./Math/CubismTargetPoint.hpp | - | -| ./Math/CubismVector2.hpp | - | -| ./Math/CubismViewMatrix.hpp | - | +| ./Math/CubismMath.hpp | 2024-10-08 | +| ./Math/CubismMatrix44.hpp | 2024-10-08 | +| ./Math/CubismModelMatrix.hpp | 2024-10-08 | +| ./Math/CubismTargetPoint.hpp | 2024-10-08 | +| ./Math/CubismVector2.hpp | 2024-10-08 | +| ./Math/CubismViewMatrix.hpp | 2024-10-08 | ## Model | File | Completion Date | | :--- | :--- | -| ./Model/CubismMoc.hpp | - | -| ./Model/CubismModel.hpp | - | -| ./Model/CubismModelUserData.hpp | - | -| ./Model/CubismModelUserDataJson.hpp | - | -| ./Model/CubismUserModel.hpp | - | +| ./Model/CubismMoc.hpp | 2024-10-08 | +| ./Model/CubismModel.hpp | 2024-10-08 | +| ./Model/CubismModelUserData.hpp | 2024-10-08 | +| ./Model/CubismModelUserDataJson.hpp | 2024-10-08 | +| ./Model/CubismUserModel.hpp | 2024-10-08 | ## Physics diff --git a/src/CubismCdiJson.cpp b/src/CubismCdiJson.cpp index 05a6e30..0dfe4b1 100644 --- a/src/CubismCdiJson.cpp +++ b/src/CubismCdiJson.cpp @@ -16,6 +16,7 @@ const csmChar* Version = "Version"; const csmChar* Parameters = "Parameters"; const csmChar* ParameterGroups = "ParameterGroups"; const csmChar* Parts = "Parts"; +const csmChar* CombinedParameters = "CombinedParameters"; const csmChar* Id = "Id"; const csmChar* GroupId = "GroupId"; const csmChar* Name = "Name"; @@ -50,6 +51,12 @@ csmBool CubismCdiJson::IsExistParts() const return !node.IsNull() && !node.IsError(); } +csmBool CubismCdiJson::IsExistCombinedParameters() const +{ + Utils::Value& node = (_json->GetRoot()[CombinedParameters]); + return !node.IsNull() && !node.IsError(); +} + // パラメータについて csmInt32 CubismCdiJson::GetParametersCount() { @@ -111,4 +118,16 @@ const csmChar* CubismCdiJson::GetPartsName(csmInt32 index) return _json->GetRoot()[Parts][index][Name].GetRawString(); } +// 結合パラメータについて +csmInt32 CubismCdiJson::GetCombinedParametersCount() +{ + if (!IsExistCombinedParameters()) return 0; + return _json->GetRoot()[CombinedParameters].GetSize(); +} + +const csmVector* CubismCdiJson::GetCombinedParameters(csmInt32 index) +{ + return _json->GetRoot()[CombinedParameters][index].GetVector(); +} + }}} diff --git a/src/CubismCdiJson.hpp b/src/CubismCdiJson.hpp index b20544f..292b7e2 100644 --- a/src/CubismCdiJson.hpp +++ b/src/CubismCdiJson.hpp @@ -126,6 +126,21 @@ class CubismCdiJson : public CubismJsonHolder */ const csmChar* GetPartsName(csmInt32 index); + /** + * Returns the number of combined parameters. + * + * @return Number of combined parameters + */ + csmInt32 GetCombinedParametersCount(); + + /** + * Returns the pair list of the combined parameters. + * + * @param index Index to the desired combined parameter + * + * @return Pair list of the combined parameter + */ + const csmVector* GetCombinedParameters(csmInt32 index); private: /** @@ -148,6 +163,13 @@ class CubismCdiJson : public CubismJsonHolder * @return true if parts exist; otherwise false. */ csmBool IsExistParts() const; + + /** + * Returns whether the combined parameters exist in the Display Information File. + * + * @return true if combined parameters exist; otherwise false. + */ + csmBool IsExistCombinedParameters() const; }; }}} diff --git a/src/CubismJsonHolder.hpp b/src/CubismJsonHolder.hpp index 2bd46a4..294c853 100644 --- a/src/CubismJsonHolder.hpp +++ b/src/CubismJsonHolder.hpp @@ -36,7 +36,7 @@ namespace Live2D { namespace Cubism { namespace Framework { * * @return true if valid; otherwise false */ - csmBool IsValid() + csmBool IsValid() const { return _json; } diff --git a/src/CubismModelSettingJson.hpp b/src/CubismModelSettingJson.hpp index f2c8143..6dc9aae 100644 --- a/src/CubismModelSettingJson.hpp +++ b/src/CubismModelSettingJson.hpp @@ -256,7 +256,7 @@ class CubismModelSettingJson : public ICubismModelSetting, public CubismJsonHold */ CubismIdHandle GetLipSyncParameterId(csmInt32 index); -private: +protected: enum FrequentNode { diff --git a/src/Effect/CubismBreath.cpp b/src/Effect/CubismBreath.cpp index 032702c..9312b1f 100644 --- a/src/Effect/CubismBreath.cpp +++ b/src/Effect/CubismBreath.cpp @@ -7,6 +7,7 @@ #include "CubismBreath.hpp" #include +#include "Math/CubismMath.hpp" namespace Live2D { namespace Cubism { namespace Framework { @@ -41,7 +42,7 @@ void CubismBreath::UpdateParameters(CubismModel* model, csmFloat32 deltaTimeSeco { _currentTime += deltaTimeSeconds; - const csmFloat32 t = _currentTime * 2.0f * 3.14159f; + const csmFloat32 t = _currentTime * 2.0f * CubismMath::Pi; for (csmUint32 i = 0; i < _breathParameters.GetSize(); ++i) { diff --git a/src/Effect/CubismBreath.hpp b/src/Effect/CubismBreath.hpp index dd1344c..8db7d82 100644 --- a/src/Effect/CubismBreath.hpp +++ b/src/Effect/CubismBreath.hpp @@ -14,24 +14,18 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief 呼吸機能 - * - * 呼吸機能を提供する。 + * Handles the breathing effect */ class CubismBreath { public: /** - * @brief 呼吸のパラメータ情報 - * - * 呼吸のパラメータ情報。 + * Data attached to the parameters of breathing */ struct BreathParameterData { /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ BreathParameterData() : ParameterId(NULL) @@ -42,15 +36,16 @@ class CubismBreath { } /** - * @brief コンストラクタ + * Constructor
+ * Sets the data. * - * コンストラクタ。 + * @param parameterId ID of the breath parameter to attach + * @param offset offset of the sine wave + * @param peak peak value of the sine wave + * @param cycle cycle of the sine wave + * @param weight weight of the parameter * - * @param[in] parameterId 呼吸をひもづけるパラメータID - * @param[in] offset 呼吸を正弦波としたときの、波のオフセット - * @param[in] peak 呼吸を正弦波としたときの、波の高さ - * @param[in] cycle 呼吸を正弦波としたときの、波の周期 - * @param[in] weight パラメータへの重み + * @note The cyclic motion of breathing is set entirely by sine waves. */ BreathParameterData(CubismIdHandle parameterId, csmFloat32 offset, csmFloat32 peak, csmFloat32 cycle, csmFloat32 weight) : ParameterId(parameterId) @@ -60,77 +55,61 @@ class CubismBreath , Weight(weight) { } - CubismIdHandle ParameterId; ///< 呼吸をひもづけるパラメータID - csmFloat32 Offset; ///< 呼吸を正弦波としたときの、波のオフセット - csmFloat32 Peak; ///< 呼吸を正弦波としたときの、波の高さ - csmFloat32 Cycle; ///< 呼吸を正弦波としたときの、波の周期 - csmFloat32 Weight; ///< パラメータへの重み + CubismIdHandle ParameterId; ///< ID of the breath parameter to attach + csmFloat32 Offset; ///< Offset of the sine wave + csmFloat32 Peak; ///< Peak value of the sine wave + csmFloat32 Cycle; ///< Cycle of the sine wave + csmFloat32 Weight; ///< Weight of the parameter }; /** - * @brief インスタンスの作成 + * Makes an instance of CubismBreath. * - * インスタンスを作成する。 + * @return Maked instance of CubismBreath */ static CubismBreath* Create(); /** - * @brief インスタンスの破棄 + * Destroys an instance of CubismBreath. * - * インスタンスを破棄する。 - * - * @param[in] instance 対象のCubismBreath + * @param instance Instance of CubismBreath to destroy */ static void Delete(CubismBreath* instance); /** - * @brief 呼吸のパラメータのひもづけ - * - * 呼吸のパラメータをひもづける。 + * Attaches the parameters of breathing. * - * @param[in] breathParameters 呼吸をひもづけたいパラメータのリスト + * @param breathParameters Collection of breathing parameters to attach */ void SetParameters(const csmVector& breathParameters); /** - * @brief 呼吸にひもづいているパラメータの取得 - * - * 呼吸にひもづいているパラメータを取得する。 + * Returns parameters attached to breathing. * - * @return 呼吸にひもづいているパラメータのリスト + * @return Attached collection of breathing parameters */ const csmVector& GetParameters() const; /** - * @brief モデルのパラメータの更新 + * Updates the parameters of the model. * - * モデルのパラメータを更新する。 + * @param model Model to update + * @param deltaTimeSeconds Current time in seconds * - * @param[in] model 対象のモデル - * @param[in] deltaTimeSeconds デルタ時間[秒] + * @note Execute after making an instance with #Create() and binding parameters with #setParameters(). */ void UpdateParameters(CubismModel* model, csmFloat32 deltaTimeSeconds); private: - /** - * @brief コンストラクタ - * - * コンストラクタ。 - */ CubismBreath(); - /** - * @brief デストラクタ - * - * デストラクタ。 - */ virtual ~CubismBreath(); - csmVector _breathParameters; ///< 呼吸にひもづいているパラメータのリスト - csmFloat32 _currentTime; ///< 積算時間[秒] + csmVector _breathParameters; + csmFloat32 _currentTime; }; }}} diff --git a/src/Effect/CubismEyeBlink.hpp b/src/Effect/CubismEyeBlink.hpp index dd80aeb..0247bb6 100644 --- a/src/Effect/CubismEyeBlink.hpp +++ b/src/Effect/CubismEyeBlink.hpp @@ -16,132 +16,98 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief 自動まばたき機能 - * - * 自動まばたき機能を提供する。 - * + * Handles automatic blinking effects */ class CubismEyeBlink { public: /** - * @brief まばたきの状態 - * - * まばたきの状態を表す列挙型。 + * Enumeration representing the current state */ enum EyeState { - EyeState_First = 0, ///< 初期状態 - EyeState_Interval, ///< まばたきしていない状態 - EyeState_Closing, ///< まぶたが閉じていく途中の状態 - EyeState_Closed, ///< まぶたが閉じている状態 - EyeState_Opening ///< まぶたが開いていく途中の状態 + EyeState_First = 0, ///< Initial state + EyeState_Interval, ///< State of not blinking + EyeState_Closing, ///< State of closing the eyelids + EyeState_Closed, ///< State where the eyelids are closed + EyeState_Opening ///< State of opening the eyelids }; /** - * @brief インスタンスの作成 + * Makes an instance of CubismEyeBlink. + * + * @param modelSetting Model setting * - * インスタンスを作成する。 + * @return Maked instance of CubismEyeBlink * - * @param[in] modelSetting モデルの設定情報 - * @return 作成されたインスタンス - * @note 引数がNULLの場合、パラメータIDが設定されていない空のインスタンスを作成する。 + * @note If the model setting is empty, creates an empty instance with no parameter ID set. */ static CubismEyeBlink* Create(ICubismModelSetting* modelSetting = NULL); /** - * @brief インスタンスの破棄 + * Destroys an instance of CubismEyeBlink. * - * インスタンスを破棄する。 - * - * @param[in] eyeBlink 対象のCubismEyeBlink + * @param eyeBlink Instance of CubismEyeBlink to destroy */ static void Delete(CubismEyeBlink* eyeBlink); /** - * @brief まばたきの間隔の設定 + * Sets the interval for blinking. * - * まばたきの間隔を設定する。 + * @param blinkingInterval Time interval for blinking in seconds * - * @param[in] blinkingInterval まばたきの間隔の時間[秒] + * @note The time between blinks will be random from 0 seconds to twice the set interval. */ void SetBlinkingInterval(csmFloat32 blinkingInterval); /** - * @brief またばきのモーションの詳細設定 - * - * まばたきのモーションの詳細設定を行う。 + * Sets the behavior for blinking. * - * @param[in] closing まぶたを閉じる動作の所要時間[秒] - * @param[in] closed まぶたを閉じている動作の所要時間[秒] - * @param[in] opening まぶたを開く動作の所要時間[秒] + * @param closing Time taken to close the eyelids in seconds + * @param closed Time taken to keep the eyelids closed in seconds + * @param opening Time taken to open the eyelids in seconds */ void SetBlinkingSettings(csmFloat32 closing, csmFloat32 closed, csmFloat32 opening); /** - * @brief まばたきさせるパラメータIDのリストの設定 + * Sets the collection of parameter IDs to apply blinking. * - * まばたきさせるパラメータIDのリストを設定する。 - * - * @param[in] parameterIds パラメータIDのリスト + * @param parameterIds Collection of parameter IDs to apply */ void SetParameterIds(const csmVector& parameterIds); /** - * @brief まばたきさせるパラメータIDのリストの取得 - * - * まばたきさせるパラメータIDのリストを取得する。 - * - * @return パラメータIDのリスト - */ + * Returns the collection of parameter IDs to apply blinking. + * + * @return Collection of parameter IDs + */ const csmVector& GetParameterIds() const; /** - * @brief モデルのパラメータの更新 - * - * モデルのパラメータを更新する。 + * Updates the parameters of the model. * - * @param[in] model 対象のモデル - * @param[in] deltaTimeSeconds デルタ時間[秒] + * @param model Model to update + * @param deltaTimeSeconds Current time in seconds */ void UpdateParameters(CubismModel* model, csmFloat32 deltaTimeSeconds); private: - /** - * @brief コンストラクタ - * - * コンストラクタ。 - * - * @param[in] modelSetting モデルの設定情報 - */ CubismEyeBlink(ICubismModelSetting* modelSetting); - /** - * @brief デストラクタ - * - * デストラクタ。 - */ virtual ~CubismEyeBlink(); - /** - * @brief 次のまばたきのタイミングの決定 - * - * 次のまばたきのタイミングを決定する。 - * - * @return 次のまばたきを行う時刻[秒] - */ csmFloat32 DetermineNextBlinkingTiming() const; - csmInt32 _blinkingState; ///< 現在の状態 - csmVector _parameterIds; ///< 操作対象のパラメータのIDのリスト - csmFloat32 _nextBlinkingTime; ///< 次のまばたきの時刻[秒] - csmFloat32 _stateStartTimeSeconds; ///< 現在の状態が開始した時刻[秒] - csmFloat32 _blinkingIntervalSeconds; ///< まばたきの間隔[秒] - csmFloat32 _closingSeconds; ///< まぶたを閉じる動作の所要時間[秒] - csmFloat32 _closedSeconds; ///< まぶたを閉じている動作の所要時間[秒] - csmFloat32 _openingSeconds; ///< まぶたを開く動作の所要時間[秒] - csmFloat32 _userTimeSeconds; ///< デルタ時間の積算値[秒] + csmInt32 _blinkingState; + csmVector _parameterIds; + csmFloat32 _nextBlinkingTime; + csmFloat32 _stateStartTimeSeconds; + csmFloat32 _blinkingIntervalSeconds; + csmFloat32 _closingSeconds; + csmFloat32 _closedSeconds; + csmFloat32 _openingSeconds; + csmFloat32 _userTimeSeconds; }; diff --git a/src/Effect/CubismPose.cpp b/src/Effect/CubismPose.cpp index 38a6ddf..fcb8882 100644 --- a/src/Effect/CubismPose.cpp +++ b/src/Effect/CubismPose.cpp @@ -229,6 +229,12 @@ void CubismPose::DoFade(CubismModel* model, csmFloat32 deltaTimeSeconds, csmInt3 } visiblePartIndex = i; + if (_fadeTimeSeconds == 0.0f) + { + newOpacity = 1.0f; + continue; + } + newOpacity = model->GetPartOpacity(partIndex); // 新しい不透明度を計算 diff --git a/src/Effect/CubismPose.hpp b/src/Effect/CubismPose.hpp index 3df93fa..707a271 100644 --- a/src/Effect/CubismPose.hpp +++ b/src/Effect/CubismPose.hpp @@ -12,144 +12,96 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief パーツの不透明度の設定 - * - * パーツの不透明度の管理と設定を行う。 + * Handles the management of model part opacities using pose settings */ class CubismPose { public: /** - * @brief パーツにまつわるデータを管理 - * - * パーツにまつわる諸々のデータを管理する。 - */ + * Handles data related to parts + */ struct PartData { /** - * @brief コンストラクタ - * - * コンストラクタ。 - */ + * Constructor + */ PartData(); /** - * @brief コピーコンストラクタ - * - * コピーコンストラクタ。 - */ + * Copy constructor + */ PartData(const PartData& v); /** - * @brief デストラクタ - * - * デストラクタ。 - */ + * Destructor + */ virtual ~PartData(); /** - * @brief 代入のオーバーロード - * - * 代入のオーバーロード。 - */ + * Overloads assignment + */ PartData& operator=(const PartData& v); /** - * @brief 初期化 - * - * 初期化する。 - * - * @param[in] model 初期化に使用するモデル - */ + * Initializes. + * + * @param model Model used for initialization + */ void Initialize(CubismModel* model); - CubismIdHandle PartId; ///< パーツID - csmInt32 ParameterIndex; ///< パラメータのインデックス - csmInt32 PartIndex; ///< パーツのインデックス - csmVector Link; ///< 連動するパラメータ + CubismIdHandle PartId; ///< Part ID + csmInt32 ParameterIndex; ///< Parameter index + csmInt32 PartIndex; ///< Part index + csmVector Link; ///< Attached parameter }; /** - * @brief インスタンスの作成 + * Makes an instance of CubismPose. * - * インスタンスを作成する。 + * @param pose3json Buffer where the pose settings file is loaded + * @param size Size of the buffer in bytes * - * @param[in] pose3json pose3.jsonのデータ - * @param[in] size pose3.jsonのデータのサイズ[Byte] - * @return 作成されたインスタンス + * @return Maked instance of CubismPose */ static CubismPose* Create(const csmByte* pose3json, csmSizeInt size); /** - * @brief インスタンスの破棄 + * Destroys an instance of CubismPose. * - * インスタンスを破棄する。 - * - * @param[in] pose 対象のCubismPose + * @param pose Instance of CubismPose to destroy */ static void Delete(CubismPose* pose); /** - * @brief モデルのパラメータの更新 - * - * モデルのパラメータを更新する。 + * Updates the parameters of the model. * - * @param[in] model 対象のモデル - * @param[in] deltaTimeSeconds デルタ時間[秒] + * @param model Model to update + * @param deltaTimeSeconds Current time in seconds */ void UpdateParameters(CubismModel* model, csmFloat32 deltaTimeSeconds); /** - * @brief 表示を初期化 + * Resets the state. * - * 表示を初期化する。 + * @param model Model to reset * - * @param[in] model 対象のモデル - * - * @note 不透明度の初期値が0でないパラメータは、不透明度を1に設定する。 + * @note Parameters with an initial opacity value other than 0 will have their opacity set to 1. */ void Reset(CubismModel* model); private: - /** - * @brief コンストラクタ - * - * コンストラクタ。 - */ CubismPose(); - /** - * @brief デストラクタ - * - * デストラクタ。 - */ virtual ~CubismPose(); - /** - * @brief パーツの不透明度をコピー - * - * パーツの不透明度をコピーし、リンクしているパーツへ設定する。 - * - * @param[in] model 対象のモデル - */ void CopyPartOpacities(CubismModel* model); - /** - * @brief パーツのフェード操作を実行 - * - * パーツのフェード操作を行う。 - * - * @param[in] model 対象のモデル - * @param[in] deltaTimeSeconds デルタ時間[秒] - * @param[in] beginIndex フェード操作を行うパーツグループの先頭インデックス - * @param[in] partGroupCount フェード操作を行うパーツグループの個数 - */ void DoFade(CubismModel* model, csmFloat32 deltaTimeSeconds, csmInt32 beginIndex, csmInt32 partGroupCount); - csmVector _partGroups; ///< パーツグループ - csmVector _partGroupCounts; ///< それぞれのパーツグループの個数 - csmFloat32 _fadeTimeSeconds; ///< フェード時間[秒] - CubismModel* _lastModel; ///< 前回操作したモデル + csmVector _partGroups; + csmVector _partGroupCounts; + csmFloat32 _fadeTimeSeconds; + CubismModel* _lastModel; }; }}} diff --git a/src/Id/CubismId.hpp b/src/Id/CubismId.hpp index b16acd3..42edbcc 100644 --- a/src/Id/CubismId.hpp +++ b/src/Id/CubismId.hpp @@ -14,53 +14,56 @@ namespace Live2D { namespace Cubism { namespace Framework { class CubismIdManager; /** - * @brief パラメータ名・パーツ名・Drawable名を保持 - * - * パラメータ名・パーツ名・Drawable名を保持するクラス。 + * Handles the ID of parameters, parts, and drawing objects. */ struct CubismId { friend class CubismIdManager; /** - * @brief ID名を取得 + * Returns the ID. * - * ID名を取得する。 + * @return ID */ const csmString& GetString() const; - CubismId& operator=(const CubismId& c); - - csmBool operator==(const CubismId& c) const; - csmBool operator!=(const CubismId& c) const; - -private: /** - * @brief コンストラクタ + * Assigns the ID held by another CubismId to this ID. + * + * @param c CubismId object to assign * - * コンストラクタ。 + * @return Reference to this object after assignment */ - CubismId(); + CubismId& operator=(const CubismId& c); /** - * @brief コンストラクタ + * Compares if the ID held by another CubismId is equal to the ID held by this object. * - * コンストラクタ。 + * @param c CubismId object to compare * - * @param[in] id ID名 + * @return true if the IDs are equal; otherwise false. */ - CubismId(const csmChar* id); + csmBool operator==(const CubismId& c) const; /** - * @brief デストラクタ + * Compares if the ID held by another CubismId is not equal to the ID held by this object. + * + * @param c CubismId object to compare * - * デストラクタ。 + * @return true if the IDs are not equal; otherwise false. */ + csmBool operator!=(const CubismId& c) const; + +private: + CubismId(); + + CubismId(const csmChar* id); + ~CubismId(); CubismId(const CubismId& c); - csmString _id; ///< ID名 + csmString _id; }; typedef const CubismId* CubismIdHandle; diff --git a/src/Id/CubismIdManager.hpp b/src/Id/CubismIdManager.hpp index 6a4ac1d..ad6586c 100644 --- a/src/Id/CubismIdManager.hpp +++ b/src/Id/CubismIdManager.hpp @@ -16,9 +16,7 @@ namespace Live2D { namespace Cubism { namespace Framework { struct CubismId; /** - * @brief ID名の管理 - * - * ID名を管理する。 + * Handles ID names. */ class CubismIdManager { @@ -26,113 +24,94 @@ class CubismIdManager public: /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismIdManager(); /** - * @brief デストラクタ - * - * デストラクタ。 + * Destructor */ ~CubismIdManager(); /** - * @brief ID名をリストから登録 + * Registers IDs. * - * ID名をリストから登録する。 - * - * @param[in] ids ID名リスト - * @param[in] count IDの個数 + * @param ids Array of ID strings + * @param count Number of IDs */ void RegisterIds(const csmChar** ids, csmInt32 count); /** - * @brief ID名をリストから登録 - * - * ID名をリストから登録する。 - * - * @param[in] ids ID名リスト - */ + * Registers IDs. + * + * @param ids Collection of ID strings + */ void RegisterIds(const csmVector& ids); /** - * @brief ID名を登録 + * Registers an ID. * - * ID名を登録する。 - * - * @param[in] id ID名 + * @param id ID string */ const CubismId* RegisterId(const csmChar* id); /** - * @brief ID名を登録 - * - * ID名を登録する。 - * - * @param[in] id ID名 - */ + * Registers an ID. + * + * @param id ID string + * + * @return Registered ID
+ * If the ID was already registered, the already registered ID + */ const CubismId* RegisterId(const csmString& id); /** - * @brief ID名からIDを取得する。 + * Returns an ID. * - * ID名からIDを取得する。 + * @param id ID string * - * @param[in] id ID名 + * @return ID * - * @note 未登録のID名の場合、登録も行う。 + * @note If the ID is not registered, it registers the ID. */ const CubismId* GetId(const csmString& id); /** - * @brief ID名からIDを取得する。 - * - * ID名からIDを取得する。 - * - * @param[in] id ID名 - * - * @note 未登録のID名の場合、登録も行う。 - */ + * Returns an ID. + * + * @param id ID string + * + * @return ID + * + * @note If the requested ID is not registered, it registers the ID. + */ const CubismId* GetId(const csmChar* id); /** - * @brief ID名からIDの確認 + * Checks if an ID is registered. * - * ID名からIDが登録されているかどうか確認する。 + * @param id ID string to check * - * @retval true 存在する - * @retval false 存在しない + * @return true if the ID is registered; otherwise false. */ csmBool IsExist(const csmString& id) const; /** - * @brief ID名からIDの確認 - * - * ID名からIDが登録されているかどうか確認する。 - * - * @retval true 存在する - * @retval false 存在しない - */ + * Checks if an ID is registered. + * + * @param id ID string to check + * + * @return true if the ID is registered; otherwise false. + */ csmBool IsExist(const csmChar* id) const; private: CubismIdManager(const CubismIdManager&); CubismIdManager& operator=(const CubismIdManager&); - /** - * @brief ID名からIDを検索 - * - * ID名からIDを検索する。 - * - * @param[in] id ID名 - * @return 登録されているID。なければNULL。 - */ CubismId* FindId(const csmChar* id) const; - csmVector _ids; ///< 登録されているIDのリスト + csmVector _ids; }; }}} diff --git a/src/Math/CubismMath.hpp b/src/Math/CubismMath.hpp index a04ebf9..382ff0b 100644 --- a/src/Math/CubismMath.hpp +++ b/src/Math/CubismMath.hpp @@ -15,8 +15,7 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - *@brief 数値計算などに使用するユーティリティクラス - * + * Handles numerical calculations and other utility functions */ class CubismMath { @@ -25,12 +24,13 @@ class CubismMath static const csmFloat32 Epsilon; /** - *@brief 第一引数の値を最小値と最大値の範囲に収めた値を返す + * Returns the value of the first argument clamped within the range of the minimum and maximum values. + * + *@param value Value to be clamped + *@param min Minimum value of the range + *@param max Maximum value of the range * - *@param value -> 収められる値 - *@param min -> 範囲の最小値 - *@param max -> 範囲の最大値 - *@return 最小値と最大値の範囲に収めた値 + *@return Value clamped within the range of minimum and maximum values */ static csmFloat32 RangeF(csmFloat32 value, csmFloat32 min, csmFloat32 max) { @@ -40,10 +40,11 @@ class CubismMath }; /** - *@brief サイン関数の値を求める + * Returns the value of the sine function. * - *@param x -> 角度値(ラジアン) - *@return サイン関数sin(x)の値 + *@param x Angle value in radians [rad] + * + *@return Value of the sine function sin(x) */ static csmFloat32 SinF(csmFloat32 x) { @@ -51,10 +52,11 @@ class CubismMath }; /** - *@brief コサイン関数の値を求める + * Returns the value of the cosine function. + * + *@param x Angle value in radians [rad] * - *@param x -> 角度値(ラジアン) - *@return コサイン関数cos(x)の値 + *@return Value of the cosine function cos(x) */ static csmFloat32 CosF(csmFloat32 x) { @@ -62,10 +64,11 @@ class CubismMath }; /** - *@brief 絶対値の値を求める + * Returns the absolute value. * - *@param x -> 絶対値を求める値 - *@return 値の絶対値 + * @param x Value to calculate the absolute value + * + * @return Absolute value of the input */ static csmFloat32 AbsF(csmFloat32 x) { @@ -73,10 +76,11 @@ class CubismMath }; /** - *@brief 平方根(ルート)を求める + * Returns the square root. + * + * @param x Value to calculate the square root * - *@param x -> 平方根を求める値 - *@return 値の平方根 + * @return Square root of the input */ static csmFloat32 SqrtF(csmFloat32 x) { @@ -84,11 +88,12 @@ class CubismMath }; /** - *@brief イージング処理されたサインを求める
- * フェードイン・アウト時のイージングに利用できる + * Returns the value processed with sine wave easing.
+ * Can be used for easing during fade-in and fade-out. + * + * @param value Value to be eased * - *@param value -> イージングを行う値 - *@return イージング処理されたサイン値 + * @return Value processed with sine wave easing */ static csmFloat32 GetEasingSine(csmFloat32 value) { @@ -99,11 +104,12 @@ class CubismMath } /** - * @brief 大きい方の値を返す。 + * Returns the greater value. * - * @param l -> 左辺の値 - * @param r -> 右辺の値 - * @return 大きい方の値 + * @param l Left-hand value + * @param r Right-hand value + * + * @return Greater value */ static csmFloat32 Max(csmFloat32 l, csmFloat32 r) { @@ -111,11 +117,12 @@ class CubismMath } /** - * @brief 小さい方の値を返す。 + * Returns the smaller value. + * + * @param l Left-hand value + * @param r Right-hand value * - * @param l -> 左辺の値 - * @param r -> 右辺の値 - * @return 小さい方の値 + * @return Smaller value */ static csmFloat32 Min(csmFloat32 l, csmFloat32 r) { @@ -123,106 +130,108 @@ class CubismMath } /** - * @brief 値を範囲内に納めて返す + * Returns the value clamped within the specified range. * - * @param val -> 範囲内か確認する値 - * @param min -> 最小値 - * @param max -> 最大値 - * @return 範囲内に収まった値 + * @param val Value to be clamped within the range + * @param min Minimum value + * @param max Maximum value + * @return Clamped value within the range */ static csmInt32 Clamp(csmInt32 val, csmInt32 min, csmInt32 max); /** - * @brief 値を範囲内に納めて返す + * Returns the value clamped within the specified range. * - * @param val -> 範囲内か確認する値 - * @param min -> 最小値 - * @param max -> 最大値 - * @return 範囲内に収まった値 + * @param val Value to be checked within the range + * @param min Minimum value + * @param max Maximum value + * @return Clamped value within the range */ static csmFloat32 ClampF(csmFloat32 val, csmFloat32 min, csmFloat32 max); /** - * @brief 角度値をラジアン値に変換します。 + * Converts an angle from degrees to radians. + * + * @param degrees Angle in degrees [degree] * - * @param degrees -> 角度値 - * @return 角度値から変換したラジアン値 + * @return Angle in radians [rad] */ static csmFloat32 DegreesToRadian(csmFloat32 degrees); /** - * @brief ラジアン値を角度値に変換します。 + * Converts an angle from radians to degrees. * - * @param radian -> ラジアン値 - * @return ラジアン値から変換した角度値 + * @param radian Angle in radians [rad] + * + * @return Angle in degrees [degree] */ static csmFloat32 RadianToDegrees(csmFloat32 radian); /** - * @brief 2つのベクトルからラジアン値を求めます。 + * Calculates the angle between two vectors. + * + * @param from Starting vector + * @param to Ending vector * - * @param from -> 始点ベクトル - * @param to -> 終点ベクトル - * @return ラジアン値から求めた方向ベクトル + * @return Angle in radians [rad] */ static csmFloat32 DirectionToRadian(CubismVector2 from, CubismVector2 to); /** - * @brief 2つのベクトルから角度値を求めます。 + * Calculates the angle between two vectors. + * + * @param from Starting vector + * @param to Ending vector * - * @param from -> 始点ベクトル - * @param to -> 終点ベクトル - * @return 角度値から求めた方向ベクトル + * @return Angle in radians [rad] */ static csmFloat32 DirectionToDegrees(CubismVector2 from, CubismVector2 to); /** - * @brief ラジアン値を方向ベクトルに変換します。 + * Calculates the direction vector from an angle. * - * @param totalAngle -> ラジアン値 - * @return ラジアン値から変換した方向ベクトル + * @param totalAngle Angle in radians [rad] + * + * @return Direction vector */ static CubismVector2 RadianToDirection(csmFloat32 totalAngle); /** - * @brief 三次方程式の三次項の係数が0になったときに補欠的に二次方程式の解をもとめる。 - * a * x^2 + b * x + c = 0 - * - * @param a -> 二次項の係数値 - * @param b -> 一次項の係数値 - * @param c -> 定数項の値 - * @return 二次方程式の解 - */ + * Finds the solution of a quadratic equation when the cubic coefficient of the cubic equation is zero.
+ * a * x^2 + b * x + c = 0 + * + * @param a Coefficient of the quadratic term + * @param b Coefficient of the linear term + * @param c Constant term + * + * @return Solution of the quadratic equation + */ static csmFloat32 QuadraticEquation(csmFloat32 a, csmFloat32 b, csmFloat32 c); /** - * @brief カルダノの公式によってベジェのt値に該当する3次方程式の解を求める。 - * 重解になったときには0.0~1.0の値になる解を返す。 - * - * a * x^3 + b * x^2 + c * x + d = 0 - * - * @param a -> 三次項の係数値 - * @param b -> 二次項の係数値 - * @param c -> 一次項の係数値 - * @param d -> 定数項の値 - * @return 0.0~1.0の間にある解 - */ + * Finds the solution of a cubic equation corresponding to the Bezier's t-value using Cardano's formula.
+ * Returns the solution in the range 0.0-1.0 when it is a multiple root.
+ * a * x^3 + b * x^2 + c * x + d = 0 + * + * @param a Coefficient of the cubic term + * @param b Coefficient of the quadratic term + * @param c Coefficient of the linear term + * @param d Constant term + * + * @return Solution in the range 0.0-1.0 + */ static csmFloat32 CardanoAlgorithmForBezier(csmFloat32 a, csmFloat32 b, csmFloat32 c, csmFloat32 d); /** - * @brief 浮動小数点の余りを求める。 - * - * @param dividend 被除数(割られる値) - * @param divisor 除数(割る値) - * @returns 余り - */ + * Calculates the remainder of a floating-point division. + * + * @param dividend Dividend (value to be divided) + * @param divisor Divisor (value to divide by) + * @return Remainder + */ static csmFloat32 ModF(csmFloat32 dividend, csmFloat32 divisor); private: - /** - *@brief privateコンストラクタ - * - */ CubismMath(); }; diff --git a/src/Math/CubismMatrix44.hpp b/src/Math/CubismMatrix44.hpp index 44e3b41..3c65cb8 100644 --- a/src/Math/CubismMatrix44.hpp +++ b/src/Math/CubismMatrix44.hpp @@ -12,211 +12,168 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief 4x4の行列 - * - * 4x4行列の便利クラス。 + * Handles 4x4 matrices */ class CubismMatrix44 { public: /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismMatrix44(); /** - * @brief デストラクタ - * - * デストラクタ。 + * Destructor */ virtual ~CubismMatrix44(); /** - * @brief 乗算 + * Multiplies the two given matrices and stores the result in the destination matrix. * - * 受け取った2つの行列の乗算を行う。 - * - * @param[in] a 行列a - * @param[in] b 行列b - * @param[out] dst 格納先の行列 + * @param a Matrix a + * @param b Matrix b + * @param dst Destination matrix for storing the result */ static void Multiply(csmFloat32* a, csmFloat32* b, csmFloat32* dst); /** - * @brief 単位行列に初期化 - * - * 単位行列に初期化する。 + * Sets the identity matrix. */ void LoadIdentity(); /** - * @brief 行列を浮動小数点数の配列で取得 + * Returns the matrix as an array of floating-point numbers. * - * 行列を浮動小数点数の配列で取得する。 - * - * @return 16個の浮動小数点数で表される4x4の行列 + * @return 4x4 matrix represented by 16 floating-point numbers */ csmFloat32* GetArray(); /** - * @brief 行列を設定 - * - * 行列を設定する。 + * Sets the matrix. * - * @param[in] tr 16個の浮動小数点数で表される4x4の行列 + * @param tr 4x4 matrix represented by 16 floating-point numbers */ void SetMatrix(csmFloat32* tr); /** - * @brief X軸の拡大率を取得 - * - * X軸の拡大率を取得する。 + * Returns the scaling factor along the X-axis. * - * @return X軸の拡大率 + * @return Scaling factor along the X-axis */ csmFloat32 GetScaleX() const; /** - * @brief Y軸の拡大率を取得 + * Returns the scaling factor along the Y-axis. * - * Y軸の拡大率を取得する。 - * - * @return Y軸の拡大率 + * @return Scaling factor along the Y-axis */ csmFloat32 GetScaleY() const; /** - * @brief X軸の移動量を取得 - * - * X軸の移動量を取得する。 - * - * @return X軸の移動量 + * Returns the translation value along the X-axis. * + * @return Translation value along the X-axis */ csmFloat32 GetTranslateX() const; /** - * @brief Y軸の移動量を取得 - * - * Y軸の移動量を取得する。 + * Returns the translation value along the Y-axis. * - * @return Y軸の移動量 + * @return Translation value along the Y-axis */ csmFloat32 GetTranslateY() const; /** - * @brief X軸の値を現在の行列で計算 + * Calculates the value along the X-axis using the current matrix. * - * X軸の値を現在の行列で計算する。 + * @param src Value along the X-axis * - * @param[in] src X軸の値 - * @return 現在の行列で計算されたX軸の値 + * @return Calculated value along the X-axis using the current matrix */ csmFloat32 TransformX(csmFloat32 src); /** - * @brief Y軸の値を現在の行列で計算 + * Calculates the value along the Y-axis using the current matrix. * - * Y軸の値を現在の行列で計算する。 + * @param src Value along the Y-axis * - * @param[in] src Y軸の値 - * @return 現在の行列で計算されたY軸の値 + * @return Calculated value along the Y-axis using the current matrix */ csmFloat32 TransformY(csmFloat32 src); /** - * @brief X軸の値を現在の行列で逆計算 + * Calculates the inverse value along the X-axis using the current matrix. * - * X軸の値を現在の行列で逆計算する。 + * @param src Value along the X-axis * - * @param[in] src X軸の値 - * @return 現在の行列で逆計算されたX軸の値 + * @return Calculated inverse value along the X-axis using the current matrix */ csmFloat32 InvertTransformX(csmFloat32 src); /** - * @brief Y軸の値を現在の行列で逆計算 + * Calculates the inverse value along the Y-axis using the current matrix. * - * Y軸の値を現在の行列で逆計算する。 + * @param src Value along the Y-axis * - * @parain[in] src Y軸の値 - * @return 現在の行列で逆計算されたY軸の値 + * @return Calculated inverse value along the Y-axis using the current matrix */ csmFloat32 InvertTransformY(csmFloat32 src); /** - * @brief 現在の行列の位置を起点にして移動 - * - * 現在の行列の位置を起点にして相対的に移動する。 + * Moves relatively based on the current matrix position. * - * @param[in] x X軸の移動量 - * @param[in] y Y軸の移動量 + * @param x Translation amount along the X-axis + * @param y Translation amount along the Y-axis */ void TranslateRelative(csmFloat32 x, csmFloat32 y); /** - * @brief 現在の行列の位置を移動 + * Moves the current matrix position to the specified location. * - * 現在の行列の位置を指定した位置へ移動する。 - * - * @param[in] x X軸の移動量 - * @param[in] y Y軸の移動量 + * @param x Translation value along the X-axis + * @param y Translation value along the Y-axis */ void Translate(csmFloat32 x, csmFloat32 y); /** - * @brief 現在の行列のX軸の位置を移動 - * - * 現在の行列のX軸の位置を指定した位置へ移動する。 + * Moves the current matrix position along the X-axis to the specified location. * - * @param[in] x X軸の移動量 + * @param x Translation value along the X-axis */ void TranslateX(csmFloat32 x); /** - * @brief 現在の行列のY軸の位置を移動 + * Moves the current matrix position along the Y-axis to the specified location. * - * 現在の行列のY軸の位置を指定した位置へ移動する。 - * - * @param[in] y Y軸の移動量 + * @param x Translation value along the Y-axis */ void TranslateY(csmFloat32 y); /** - * @brief 現在の行列の拡大率を相対的に設定 - * - * 現在の行列の拡大率を相対的に設定する。 + * Sets the scaling factor relative to the current matrix. * - * @param[in] x X軸の拡大率 - * @param[in] y Y軸の拡大率 + * @param x Scaling factor along the X-axis + * @param y Scaling factor along the Y-axis */ void ScaleRelative(csmFloat32 x, csmFloat32 y); /** - * @brief 現在の行列の拡大率を設定 + * Sets the scaling factor of the current matrix to the specified value. * - * 現在の行列の拡大率を指定した倍率に設定する。 - * - * @param[in] x X軸の拡大率 - * @param[in] y Y軸の拡大率 + * @param x Scaling factor along the X-axis + * @param y Scaling factor along the Y-axis */ void Scale(csmFloat32 x, csmFloat32 y); /** - * @brief 引数で与えられた行列にこの行列を乗算 - * - * 引数で与えられた行列にこの行列を乗算する。 - * (引数で与えられた行列)* (この行列) + * Multiplies the current matrix by the given matrix. * - * @note 関数名と実際の計算内容に乖離があるため、今後計算順が修正される可能性があります。 - * @param[in] m 行列 + * @param m Matrix to multiply with the current matrix */ void MultiplyByMatrix(CubismMatrix44* m); protected: - csmFloat32 _tr[16]; ///< 4x4行列データ + csmFloat32 _tr[16]; }; }}} diff --git a/src/Math/CubismModelMatrix.hpp b/src/Math/CubismModelMatrix.hpp index d8d7f2b..22e94bb 100644 --- a/src/Math/CubismModelMatrix.hpp +++ b/src/Math/CubismModelMatrix.hpp @@ -12,161 +12,128 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief モデル座標設定用の4x4行列 - * - * モデル座標設定用の4x4行列クラス。 + * Handles 4x4 matrices for setting model coordinates */ class CubismModelMatrix : public CubismMatrix44 { public: /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismModelMatrix(); /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor
+ * Creates with specified width and height. * - * @param[in] w 横幅 - * @param[in] h 縦幅 + * @param w Width + * @param h Height */ CubismModelMatrix(csmFloat32 w, csmFloat32 h); /** - * @brief デストラクタ - * - * デストラクタ。 - */ + * Destructor + */ virtual ~CubismModelMatrix(); /** - * @brief 横幅を設定 - * - * 横幅を設定する。 + * Sets the width. * - * @param[in] w 横幅 + * @param w Width */ void SetWidth(csmFloat32 w); /** - * @brief 縦幅を設定 + * Sets the height. * - * 縦幅を設定する。 - * - * @param[in] h 縦幅 + * @param h Height */ void SetHeight(csmFloat32 h); /** - * @brief 位置を設定 - * - * 位置を設定する。 + * Sets the position. * - * @param[in] x X軸の位置 - * @param[in] y Y軸の位置 + * @param x Position along the X-axis + * @param y Position along the Y-axis */ void SetPosition(csmFloat32 x, csmFloat32 y); /** - * @brief 中心位置を設定 + * Sets the center position. * - * 中心位置を設定する。 + * @param x Center position along the X-axis + * @param y Center position along the Y-axis * - * @param[in] x X軸の中心位置 - * @param[in] y Y軸の中心位置 - * - * @note widthかheightを設定したあとでないと、拡大率が正しく取得できないためずれる。 + * @note Must be set after setting width or height to ensure correct scaling. */ void SetCenterPosition(csmFloat32 x, csmFloat32 y); /** - * @brief 上辺の位置を設定 - * - * 上辺の位置を設定する。 + * Sets the position of the top edge. * - * @param[in] y 上辺のY軸位置 + * @param y Y-axis position of the top edge */ void Top(csmFloat32 y); /** - * @brief 下辺の位置を設定 + * Sets the position of the bottom edge. * - * 下辺の位置を設定する。 - * - * @param[in] y 下辺のY軸位置 + * @param y Y-axis position of the bottom edge */ void Bottom(csmFloat32 y); /** - * @brief 左辺の位置を設定 - * - * 左辺の位置を設定する。 + * Sets the position of the left edge. * - * @param[in] x 左辺のX軸位置 + * @param x X-axis position of the left edge */ void Left(csmFloat32 x); /** - * @brief 右辺の位置を設定 + * Sets the position of the right edge. * - * 右辺の位置を設定する。 - * - * @param[in] x 右辺のX軸位置 + * @param x X-axis position of the right edge */ void Right(csmFloat32 x); /** - * @brief X軸の中心位置を設定 - * - * X軸の中心位置を設定する。 + * Sets the center position along the X-axis. * - * @param[in] x X軸の中心位置 + * @param x Center position along the X-axis */ void CenterX(csmFloat32 x); /** - * @brief X軸の位置を設定 + * Sets the position along the X-axis. * - * X軸の位置を設定する。 - * - * @param[in] x X軸の位置 + * @param x Position along the X-axis */ void SetX(csmFloat32 x); /** - * @brief Y軸の中心位置を設定 - * - * Y軸の中心位置を設定する。 + * Sets the center position along the Y-axis. * - * @param[in] y Y軸の中心位置 + * @param y Center position along the Y-axis */ void CenterY(csmFloat32 y); /** - * @brief Y軸の位置を設定 + * Sets the position along the Y-axis. * - * Y軸の位置を設定する。 - * - * @param[in] y Y軸の位置 + * @param y Position along the Y-axis */ void SetY(csmFloat32 y); /** - * @brief レイアウト情報から位置を設定 - * - * レイアウト情報から位置を設定する。 + * Sets the position based on layout information. * - * @param[in] layout レイアウト情報 + * @param layout Layout information */ void SetupFromLayout(csmMap& layout); private: - csmFloat32 _width; ///< 横幅 - csmFloat32 _height; ///< 縦幅 + csmFloat32 _width; + csmFloat32 _height; }; }}} diff --git a/src/Math/CubismTargetPoint.hpp b/src/Math/CubismTargetPoint.hpp index 1d1c061..199a828 100644 --- a/src/Math/CubismTargetPoint.hpp +++ b/src/Math/CubismTargetPoint.hpp @@ -12,73 +12,59 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief 顔の向きの制御機能 - * - * 顔の向きの制御機能を提供するクラス。 + * Handles the direction the model is facing */ class CubismTargetPoint { public: /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismTargetPoint(); /** - * @brief デストラクタ - * - * デストラクタ。 + * Destructor */ virtual ~CubismTargetPoint(); /** - * @brief 更新処理 - * - * 更新処理を行う。 + * Updates the state. * - * @param[in] deltaTimeSeconds デルタ時間[秒] + * @param deltaTimeSeconds Time step in seconds [seconds] */ void Update(csmFloat32 deltaTimeSeconds); /** - * @brief X軸の顔の向きの値を取得 + * Returns the direction value along the X-axis. * - * X軸の顔の向きの値を取得する。 - * - * @return X軸の顔の向きの値(-1.0 - 1.0) + * @return Direction value of the face along the X-axis (-1.0 to 1.0) */ csmFloat32 GetX() const; /** - * @brief Y軸の顔の向きの値を取得 - * - * Y軸の顔の向きの値を取得する。 - * - * @return Y軸の顔の向きの値(-1.0 - 1.0) - */ + * Returns the direction value along the Y-axis. + * + * @return Direction value of the face along the Y-axis (-1.0 to 1.0) + */ csmFloat32 GetY() const; /** - * @brief 顔の向きの目標値を設定 - * - * 顔の向きの目標値を設定する。 + * Sets the target direction values. * - * @param[in] x X軸の顔の向きの値(-1.0 - 1.0) - * @param[in] y Y軸の顔の向きの値(-1.0 - 1.0) + * @param x Direction value along the X-axis (-1.0 to 1.0) + * @param y Direction value along the Y-axis (-1.0 to 1.0) */ void Set(csmFloat32 x, csmFloat32 y); private: - csmFloat32 _faceTargetX; ///< 顔の向きのX目標値(この値に近づいていく) - csmFloat32 _faceTargetY; ///< 顔の向きのY目標値(この値に近づいていく) - csmFloat32 _faceX; ///< 顔の向きX(-1.0 - 1.0) - csmFloat32 _faceY; ///< 顔の向きY(-1.0 - 1.0) - csmFloat32 _faceVX; ///< 顔の向きの変化速度X - csmFloat32 _faceVY; ///< 顔の向きの変化速度Y - csmFloat32 _lastTimeSeconds; ///< 最後の実行時間[秒] - csmFloat32 _userTimeSeconds; ///< デルタ時間の積算値[秒] + csmFloat32 _faceTargetX; + csmFloat32 _faceTargetY; + csmFloat32 _faceX; + csmFloat32 _faceY; + csmFloat32 _faceVX; + csmFloat32 _faceVY; + csmFloat32 _lastTimeSeconds; + csmFloat32 _userTimeSeconds; }; diff --git a/src/Math/CubismVector2.hpp b/src/Math/CubismVector2.hpp index 9f3cce2..2da27fc 100644 --- a/src/Math/CubismVector2.hpp +++ b/src/Math/CubismVector2.hpp @@ -17,211 +17,187 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief 2次元ベクトル型 - * - * 2次元ベクトル型の機能を提供する。 + * Handles 2D vectors */ struct CubismVector2 { - csmFloat32 X; ///< X軸の値 - csmFloat32 Y; ///< Y軸の値 + csmFloat32 X; ///< X-axis value + csmFloat32 Y; ///< Y-axis value /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismVector2(): X(0.0f), Y(0.0f) {} /** - * @brief デストラクタ + * Constructor
+ * Initializes with specified values. * - * デストラクタ。 + * @param x Value along the X-axis + * @param y Value along the Y-axis */ CubismVector2(csmFloat32 x, csmFloat32 y) : X(x), Y(y) {} /** - * @brief ベクトルの加算 - * - * ベクトルを加算する。 + * Adds two vectors.
* a + b = result * - * @param[in] a 値a - * @oaram[in] b 値b - * @return a + bの結果 + * @param a Value a + * @param b Value b + * + * @return Result of a + b */ friend CubismVector2 operator+(const CubismVector2& a, const CubismVector2& b); /** - * @brief ベクトルの減算 - * - * ベクトルを減算する。 + * Subtracts one vector from another.
* a - b = result * - * @param[in] a 値a - * @param[in] b 値b - * @return a - bの結果 + * @param a Value a + * @param b Value b + * + * @return Result of a - b */ friend CubismVector2 operator-(const CubismVector2& a, const CubismVector2& b); /** - * @brief ベクトルの乗算(ベクトル値とスカラー値) - * - * ベクトルを乗算する。(ベクトル値とスカラー値) + * Multiplies a vector by a scalar.
* vector * scalar = result * - * @param[in] vector 値vector(ベクトル値) - * @param[in] scalar 値scalar(スカラー値) - * @return vector * scalarの結果(ベクトル値) + * @param vector Value vector (vector quantity) + * @param scalar Value scalar (scalar quantity) + * + * @return Result of vector * scalar (vector quantity) */ friend CubismVector2 operator*(const CubismVector2& vector, const csmFloat32 scalar); /** - * @brief ベクトルの乗算(スカラー値とベクトル値) - * - * ベクトルを乗算する。(スカラー値とベクトル値) + * Multiplies a scalar by a vector.
* scalar * vector = result * - * @param[in] scalar 値scalar(スカラー値) - * @param[in] vector 値vector(ベクトル値) - * @return scalar * vectorの結果(ベクトル値) + * @param scalar Value scalar (scalar quantity) + * @param vector Value vector (vector quantity) + * + * @return Result of scalar * vector (vector quantity) */ friend CubismVector2 operator*(const csmFloat32 scalar, const CubismVector2& vector); /** - * @brief ベクトルの除算(ベクトル値とスカラー値) - * - * ベクトルを除算する。(ベクトル値とスカラー値) + * Divides a vector by a scalar.
* vector / scalar = result * - * @param[in] vector 値vector(ベクトル値) - * @param[in] scalar 値scalar(スカラー値) - * @return vector / scalarの結果(ベクトル値) + * @param vector Value vector (vector quantity) + * @param scalar Value scalar (scalar quantity) + * + * @return Result of vector / scalar (vector quantity) */ friend CubismVector2 operator/(const CubismVector2& vector, const csmFloat32 scalar); /** - * @brief 加算 + * Adds a vector to this vector. * - * 加算する。 + * @param rhs Value to add * - * @param[in] rhs 加算する値 - * @return 結果 + * @return Result of addition */ const CubismVector2& operator+=(const CubismVector2& rhs); /** - * @brief 減算 - * - * 減算する。 - * - * @param[in] rhs 減算する値 - * @return 結果 - */ + * Subtracts a vector from this vector. + * + * @param rhs Value to subtract + * + * @return Result of subtraction + */ const CubismVector2& operator-=(const CubismVector2& rhs); /** - * @brief 乗算(ベクトル値) - * - * 乗算する。(ベクトル値) - * - * @param[in] rhs 乗算する値(ベクトル値) - * @return 結果 - */ + * Multiplies this vector by another vector. + * + * @param rhs Value to multiply by + * + * @return Result of multiplication + */ const CubismVector2& operator*=(const CubismVector2& rhs); /** - * @brief 除算(ベクトル値) - * - * 除算する。(ベクトル値) - * - * @param[in] rhs 除算する値(ベクトル値) - * @return 結果 - */ + * Divides this vector by another vector. + * + * @param rhs Value to divide by + * + * @return Result of division + */ const CubismVector2& operator/=(const CubismVector2& rhs); /** - * @brief 乗算(スカラー値) - * - * 乗算する。(スカラー値) - * - * @param[in] scalar 乗算する値(スカラー値) - * @return 結果 - */ + * Multiplies this vector by a scalar. + * + * @param scalar Value to multiply by + * + * @return Result of multiplication + */ const CubismVector2& operator*=(const csmFloat32 scalar); /** - * @brief 除算(スカラー値) - * - * 除算する。(スカラー値) - * - * @param[in] scalar 除算する値(スカラー値) - * @return 結果 - */ + * Divides this vector by a scalar. + * + * @param scalar Value to divide by + * + * @return Result of division + */ const CubismVector2& operator/=(const csmFloat32 scalar); /** - * @brief 等しさの確認(等しいか?) + * Checks if the value is equal. * - * 値が等しいか? + * @param rhs Value to check * - * @param[in] rhs 確認する値 - * @retval true 値は等しい - * @retval false 値は等しくない + * @return true if the value is equal; otherwise false. */ csmBool operator==(const CubismVector2& rhs) const; /** - * @brief 等しさの確認(等しくないか?) + * Checks if the value is not equal. * - * 値が等しくないか? + * @param rhs Value to check * - * @param[in] rhs 確認する値 - * @retval true 値は等しくない - * @retval false 値は等しい + * @return true if the value is not equal; otherwise false. */ csmBool operator!=(const CubismVector2& rhs) const; /** - * @brief 正規化の適用 - * - * 正規化する。 + * Normalizes the vector. */ void Normalize(); /** - * @brief ベクトルの長さの取得 - * - * ベクトルの長さを取得する。 + * Returns the length of the vector. * - * @return ベクトルの長さ + * @return Length of the vector */ csmFloat32 GetLength() const; /** - * @brief ベクトルの距離の取得 + * Returns the distance between this vector and the given position vector. * - * ベクトルの距離を取得する。 + * @param a Position vector * - * @param[in] a 点 - * @return ベクトルの距離 + * @return Distance between the vectors */ csmFloat32 GetDistanceWith(CubismVector2 a) const; /** - * @brief ドット積の計算 + * Calculates the dot product of this vector and the given vector. * - * ドット積を計算する。 + * @param a Vector to be multiplied * - * @param[in] a 値 - * @return 結果 + * @return Result of the dot product */ csmFloat32 Dot(const CubismVector2& a) const; }; -// Utility functions for csmVector2. CubismVector2 operator+(const CubismVector2& a, const CubismVector2& b); CubismVector2 operator-(const CubismVector2& a, const CubismVector2& b); CubismVector2 operator*(const CubismVector2& vector, const csmFloat32 scalar); diff --git a/src/Math/CubismViewMatrix.hpp b/src/Math/CubismViewMatrix.hpp index 0c29352..2abfc55 100644 --- a/src/Math/CubismViewMatrix.hpp +++ b/src/Math/CubismViewMatrix.hpp @@ -11,211 +11,169 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief カメラの位置変更に使うと便利な4x4行列 - * - * カメラの位置変更に使うと便利な4x4行列のクラス。 + * Handles 4x4 matrix utilities for changing camera position */ class CubismViewMatrix : public CubismMatrix44 { public: /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismViewMatrix(); /** - * @brief デストラクタ - * - * デストラクタ。 + * Destructor */ virtual ~CubismViewMatrix(); /** - * @brief 移動を調整 - * - * 移動を調整する。 + * Moves by the given values.
+ * The movement amount is adjusted with respect to the screen size and its maximum value. * - * @param[in] x X軸の移動量 - * @param[in] y Y軸の移動量 + * @param x Translation amount along the X-axis + * @param y Translation amount along the Y-axis */ void AdjustTranslate(csmFloat32 x, csmFloat32 y); /** - * @brief 拡大率を調整 + * Scales by the given values.
+ * The scaling factor is adjusted considering the maximum and minimum scaling rates. * - * 拡大率を調整する。 - * - * @param[in] cx 拡大を行うX軸の中心位置 - * @param[in] cy 拡大を行うY軸の中心位置 - * @param[in] scale 拡大率 + * @param cx Center position along the X-axis for scaling + * @param cy Center position along the Y-axis for scaling + * @param scale Scaling factor */ void AdjustScale(csmFloat32 cx, csmFloat32 cy, csmFloat32 scale); /** - * @brief デバイスに対応する論理座標上の範囲の設定 - * - * デバイスに対応する論理座標上の範囲の設定を行う。 + * Sets the range on the logical coordinates corresponding to the device. * - * @param[in] left 左辺のX軸の位置 - * @param[in] right 右辺のX軸の位置 - * @param[in] bottom 下辺のY軸の位置 - * @param[in] top 上辺のY軸の位置 + * @param left X-axis position of the left edge + * @param right X-axis position of the right edge + * @param bottom Y-axis position of the bottom edge + * @param top Y-axis position of the top edge */ void SetScreenRect(csmFloat32 left, csmFloat32 right, csmFloat32 bottom, csmFloat32 top); /** - * @brief デバイスに対応する論理座標上の移動可能範囲の設定 - * - * デバイスに対応する論理座標上の移動可能範囲の設定を行う。 + * Sets the movable range on the logical coordinates corresponding to the device. * - * @param[in] left 左辺のX軸の位置 - * @param[in] right 右辺のX軸の位置 - * @param[in] bottom 下辺のY軸の位置 - * @param[in] top 上辺のY軸の位置 + * @param left X-axis position of the left edge + * @param right X-axis position of the right edge + * @param bottom Y-axis position of the bottom edge + * @param top Y-axis position of the top edge */ void SetMaxScreenRect(csmFloat32 left, csmFloat32 right, csmFloat32 bottom, csmFloat32 top); /** - * @brief 最大拡大率の設定 + * Sets the maximum scaling factor. * - * 最大拡大率を設定する。 - * - * @param[in] maxScale 最大拡大率 + * @param maxScale Maximum scaling factor */ void SetMaxScale(csmFloat32 maxScale); /** - * @brief 最小拡大率の設定 - * - * 最小拡大率を設定する。 + * Sets the minimum scaling factor. * - * @param[in] minScale 最小拡大率 + * @param minScale Minimum scaling factor */ void SetMinScale(csmFloat32 minScale); /** - * @brief 最大拡大率の取得 + * Returns the maximum scaling factor. * - * 最大拡大率を取得する。 - * - * @return 最大拡大率 + * @return Maximum scaling factor */ csmFloat32 GetMaxScale() const; /** - * @brief 最小拡大率の取得 - * - * 最小拡大率を取得する。 + * Returns the minimum scaling factor. * - * @return 最小拡大率 + * @return Minimum scaling factor */ csmFloat32 GetMinScale() const; /** - * @brief 拡大率が最大か? + * Checks if the scaling factor is at its maximum. * - * 拡大率が最大になっているかどうかを確認する。 - * - * @retval true 拡大率は最大になっている - * @retval false 拡大率は最大になっていない + * @return true if the scaling factor is at its maximum; otherwise false. */ csmBool IsMaxScale() const; /** - * @brief 拡大率が最小か? - * - * 拡大率が最小になっているかどうかを確認する。 + * Checks if the scaling factor is at its minimum. * - * @retval true 拡大率は最小になっている - * @retval false 拡大率は最小になっていない + * @return true if the scaling factor is at its minimum; otherwise false. */ csmBool IsMinScale() const; /** - * @brief デバイスに対応する論理座標の左辺のX軸位置の取得 - * - * デバイスに対応する論理座標の左辺のX軸位置を取得する。 + * Returns the X-axis position of the left edge on the logical coordinates corresponding to the device. * - * @return デバイスに対応する論理座標の左辺のX軸位置 + * @return X-axis position of the left edge on the logical coordinates corresponding to the device */ csmFloat32 GetScreenLeft() const; /** - * @brief デバイスに対応する論理座標の右辺のX軸位置の取得 - * - * デバイスに対応する論理座標の右辺のX軸位置を取得する。 - * - * @return デバイスに対応する論理座標の右辺のX軸位置 - */ + * Returns the X-axis position of the right edge on the logical coordinates corresponding to the device. + * + * @return X-axis position of the right edge on the logical coordinates corresponding to the device + */ csmFloat32 GetScreenRight() const; /** - * @brief デバイスに対応する論理座標の下辺のY軸位置の取得 - * - * デバイスに対応する論理座標の下辺のY軸位置を取得する。 - * - * @return デバイスに対応する論理座標の下辺のY軸位置 - */ + * Returns the Y-axis position of the bottom edge on the logical coordinates corresponding to the device. + * + * @return Y-axis position of the bottom edge on the logical coordinates corresponding to the device + */ csmFloat32 GetScreenBottom() const; /** - * @brief デバイスに対応する論理座標の上辺のY軸位置の取得 - * - * デバイスに対応する論理座標の上辺のY軸位置を取得する。 - * - * @return デバイスに対応する論理座標の上辺のY軸位置 - */ + * Returns the Y-axis position of the top edge on the logical coordinates corresponding to the device. + * + * @return Y-axis position of the top edge on the logical coordinates corresponding to the device + */ csmFloat32 GetScreenTop() const; /** - * @brief 左辺のX軸位置の最大値の取得 - * - * 左辺のX軸位置の最大値を取得する。 + * Returns the maximum X-axis position of the left edge. * - * @return 左辺のX軸位置の最大値 + * @return Maximum X-axis position of the left edge */ csmFloat32 GetMaxLeft() const; /** - * @brief 右辺のX軸位置の最大値の取得 - * - * 右辺のX軸位置の最大値を取得する。 - * - * @return 右辺のX軸位置の最大値 - */ + * Returns the maximum X-axis position of the right edge. + * + * @return Maximum X-axis position of the right edge + */ csmFloat32 GetMaxRight() const; /** - * @brief 下辺のY軸位置の最大値の取得 - * - * 下辺のY軸位置の最大値を取得する。 - * - * @return 下辺のY軸位置の最大値 - */ + * Returns the maximum Y-axis position of the bottom edge. + * + * @return Maximum Y-axis position of the bottom edge + */ csmFloat32 GetMaxBottom() const; /** - * @brief 上辺のY軸位置の最大値の取得 - * - * 上辺のY軸位置の最大値を取得する。 - * - * @return 上辺のY軸位置の最大値 - */ + * Returns the maximum Y-axis position of the top edge. + * + * @return Maximum Y-axis position of the top edge + */ csmFloat32 GetMaxTop() const; private: - csmFloat32 _screenLeft; ///< デバイスに対応する論理座標上の範囲(左辺X軸位置) - csmFloat32 _screenRight; ///< デバイスに対応する論理座標上の範囲(右辺X軸位置) - csmFloat32 _screenTop; ///< デバイスに対応する論理座標上の範囲(下辺Y軸位置) - csmFloat32 _screenBottom; ///< デバイスに対応する論理座標上の範囲(上辺Y軸位置) - csmFloat32 _maxLeft; ///< 論理座標上の移動可能範囲(左辺X軸位置) - csmFloat32 _maxRight; ///< 論理座標上の移動可能範囲(右辺X軸位置) - csmFloat32 _maxTop; ///< 論理座標上の移動可能範囲(下辺Y軸位置) - csmFloat32 _maxBottom; ///< 論理座標上の移動可能範囲(上辺Y軸位置) - csmFloat32 _maxScale; ///< 拡大率の最大値 - csmFloat32 _minScale; ///< 拡大率の最小値 + csmFloat32 _screenLeft; + csmFloat32 _screenRight; + csmFloat32 _screenTop; + csmFloat32 _screenBottom; + csmFloat32 _maxLeft; + csmFloat32 _maxRight; + csmFloat32 _maxTop; + csmFloat32 _maxBottom; + csmFloat32 _maxScale; + csmFloat32 _minScale; }; }}} diff --git a/src/Model/CubismMoc.hpp b/src/Model/CubismMoc.hpp index 392c545..0281502 100644 --- a/src/Model/CubismMoc.hpp +++ b/src/Model/CubismMoc.hpp @@ -14,106 +14,85 @@ namespace Live2D { namespace Cubism { namespace Framework { class CubismModel; /** - * @brief Mocデータの管理 - * - * Mocデータの管理を行うクラス。 + * Handles management of MOC data */ class CubismMoc { friend class CubismModel; public: /** - * @brief バッファからMocデータの作成 + * Makes an instance. * - * バッファからMocファイルを読み取り、Mocデータを作成する。 + * @param mocBytes Buffer containing the loaded MOC file + * @param size Size of the buffer in bytes * - * @param[in] mocBytes Mocファイルのバッファ - * @param[in] size バッファのサイズ - * @param[in] shouldCheckMocConsistency MOCの整合性チェックフラグ(初期値 : false) + * @return Created instance */ static CubismMoc* Create(const csmByte* mocBytes, csmSizeInt size, csmBool shouldCheckMocConsistency = false); /** - * @brief Mocデータを削除 + * Destroys an instance. * - * Mocデータを削除する。 + * @param moc `CubismMoc` instance to be destroyed */ static void Delete(CubismMoc* moc); /** - * @brief モデルを作成 - * - * モデルを作成する。 + * Makes a model instance. * - * @return Mocデータから作成されたモデル + * @return Created model instance */ CubismModel* CreateModel(); /** - * @brief モデルを削除 - * - * モデルを削除する。 + * Destroys a model instance. * - * @param[in] model 対象のモデル + * @param model `CubismModel` instance to be destroyed */ void DeleteModel(CubismModel* model); /** - * @brief 最新の.moc3 Versionを取得 + * Returns the latest MOC file version. * - * 最新の.moc3 Versionを取得する。 - * - * @return 最新の.moc3 Version + * @return Version */ static Core::csmMocVersion GetLatestMocVersion(); /** - * @brief 読み込んだモデルの.moc3 Versionを取得 - * - * 読み込んだモデルの.moc3 Versionを取得する。 + * Returns the version of the loaded MOC file. * - * @return 読み込んだモデルの.moc3 Version + * @return Version */ Core::csmMocVersion GetMocVersion(); /** - * @brief Checks consistency of a moc. + * Checks the consistency of the MOC file. * - * @param address Address of unrevived moc. The address must be aligned to 'csmAlignofMoc'. - * @param size Size of moc (in bytes). + * @param address Address of the un-restored MOC file. The address must be aligned to 'csmAlignofMoc'. + * @param size Size of the MOC file in bytes * - * @return '1' if Moc is valid; '0' otherwise. + * @return true if the file is consistent; otherwise false */ static csmBool HasMocConsistency(void* address, const csmUint32 size); /** - * @brief Checks consistency of a moc. + * Checks the consistency of the MOC file. * - * @param mocBytes Mocファイルのバッファ - * @param size バッファのサイズ + * @param mocBytes Buffer of the MOC file + * @param size Size of the buffer * - * @return 'true' if Moc is valid; 'false' otherwise. + * @return true if the file is consistent; otherwise false */ static csmBool HasMocConsistencyFromUnrevivedMoc(const csmByte* mocBytes, csmSizeInt size); private: - /** - * @brief コンストラクタ - * - * コンストラクタ。 - */ CubismMoc(Core::csmMoc* moc); - /** - * @brief デストラクタ - * - * デストラクタ。 - */ virtual ~CubismMoc(); - Core::csmMoc* _moc; ///< Mocデータ - csmInt32 _modelCount; ///< Mocデータから作られたモデルの個数 - csmUint32 _mocVersion; ///< 読み込んだモデルの.moc3 Version + Core::csmMoc* _moc; + csmInt32 _modelCount; + csmUint32 _mocVersion; }; }}} diff --git a/src/Model/CubismModel.hpp b/src/Model/CubismModel.hpp index 0514578..a0e0e08 100644 --- a/src/Model/CubismModel.hpp +++ b/src/Model/CubismModel.hpp @@ -18,959 +18,879 @@ namespace Live2D { namespace Cubism { namespace Framework { class CubismMoc; /** - * @brief モデル - * - * Mocデータから生成されるモデルのクラス。 + * Handles models created from MOC data. */ class CubismModel { friend class CubismMoc; public: - /** - * @brief テクスチャの色をRGBAで扱うための構造体 - */ + * Structure for color information of drawing object + */ struct DrawableColorData { /** - * @brief コンストラクタ + * Constructor */ DrawableColorData() : IsOverwritten(false) , Color() {}; /** - * @brief コンストラクタ + * Constructor + * + * @param isOverwritten whether to be overwritten + * @param color Texture color */ DrawableColorData(csmBool isOverwritten, Rendering::CubismRenderer::CubismTextureColor color) : IsOverwritten(isOverwritten) , Color(color) {}; /** - * @brief デストラクタ + * Destructor */ virtual ~DrawableColorData() {}; - csmBool IsOverwritten; - Rendering::CubismRenderer::CubismTextureColor Color; + csmBool IsOverwritten; ///< Whether to be overwritten + Rendering::CubismRenderer::CubismTextureColor Color; ///< Color - }; // DrawableColorData + }; /** - * @brief テクスチャのカリング設定を管理するための構造体 - */ + * Structure to manage texture culling settings + */ struct DrawableCullingData { /** - * @brief コンストラクタ + * Constructor */ DrawableCullingData() : IsOverwritten(false) , IsCulling(0) {}; /** - * @brief コンストラクタ + * Constructor + * + * @param isOverwritten whether to be overwritten + * @param isCulling Culling information */ DrawableCullingData(csmBool isOverwritten, csmInt32 isCulling) : IsOverwritten(isOverwritten) , IsCulling(isCulling) {}; /** - * @brief デストラクタ + * Destructor */ virtual ~DrawableCullingData() {}; - csmBool IsOverwritten; - csmInt32 IsCulling; + csmBool IsOverwritten; ///< Whether to be overwritten + csmInt32 IsCulling; ///< Culling information - }; // DrawableCullingData + }; /** - * @brief テクスチャの色をRGBAで扱うための構造体 - */ + * Structure to handle texture color in RGBA + */ struct PartColorData { /** - * @brief コンストラクタ + * Constructor */ PartColorData() : IsOverwritten(false) , Color() {}; /** - * @brief コンストラクタ + * Constructor + * + * @param isOverwritten whether to be overwritten + * @param color Texture color */ PartColorData(csmBool isOverwritten, Rendering::CubismRenderer::CubismTextureColor color) : IsOverwritten(isOverwritten) , Color(color) {}; /** - * @brief デストラクタ + * Destructor */ virtual ~PartColorData() {}; - csmBool IsOverwritten; - Rendering::CubismRenderer::CubismTextureColor Color; - - }; // PartColorData + csmBool IsOverwritten; ///< Whether to be overwritten + Rendering::CubismRenderer::CubismTextureColor Color; ///< Color + }; /** - * @brief モデルのパラメータの更新 - * - * モデルのパラメータを更新する。 + * Calculates and updates the model state based on the set parameters. */ void Update() const; /** - * @brief Pixel単位でキャンバスの幅の取得 - * - * キャンバスの幅を取得する。 + * Returns the width of the canvas. * - * @return キャンバスの幅(pixel) + * @return Width of the canvas in pixels */ csmFloat32 GetCanvasWidthPixel() const; /** - * @brief Pixel単位でキャンバスの高さの取得 - * - * キャンバスの高さを取得する。 + * Returns the height of the canvas. * - * @return キャンバスの高さ(pixel) + * @return Height of the canvas in pixels */ csmFloat32 GetCanvasHeightPixel() const; /** - * @brief PixelsPerUnitの取得 + * Returns the pixels per unit (PPU). * - * PixelsPerUnitを取得する。 - * - * @return PixelsPerUnit + * @return Pixels per unit */ csmFloat32 GetPixelsPerUnit() const; /** - * @brief Unit単位でキャンバスの幅の取得 - * - * キャンバスの幅を取得する。 + * Returns the width of the canvas. * - * @return キャンバスの幅(Unit) + * @return Width of the canvas in PPU (pixels per unit) */ csmFloat32 GetCanvasWidth() const; /** - * @brief Unit単位でキャンバスの高さの取得 + * Returns the height of the canvas. * - * キャンバスの高さを取得する。 - * - * @return キャンバスの高さ(Unit) + * @return Height of the canvas in PPU (pixels per unit) */ csmFloat32 GetCanvasHeight() const; /** - * @brief パーツのインデックスの取得 + * Returns the index of the part. * - * パーツのインデックスを取得する。 + * @param partId Part ID * - * @param[in] partId パーツのID - * @return パーツのインデックス + * @return Index of the part */ csmInt32 GetPartIndex(CubismIdHandle partId); /** - * @brief パーツのIDの取得 - * - * パーツのIDを取得する。 + * Returns the ID of the part. * - * @param[in] partIndex パーツのIndex - * @return パーツのID + * @param partIndex Index of the part + * @return Part ID */ CubismIdHandle GetPartId(csmUint32 partIndex); /** - * @brief パーツの個数の取得 - * - * パーツの個数を取得する。 + * Returns the number of parts. * - * @return パーツの個数 + * @return Number of parts */ csmInt32 GetPartCount() const; /** - * @brief パーツの不透明度の設定 + * Sets the opacity of the part. * - * パーツの不透明度を設定する。 - * - * @param[in] partId パーツのID - * @param[in] opacity 不透明度 + * @param partId Part ID + * @param opacity Opacity */ void SetPartOpacity(CubismIdHandle partId, csmFloat32 opacity); /** - * @brief パーツの不透明度の設定 - * - * パーツの不透明度を設定する。 + * Sets the opacity of the part. * - * @param[in] partIndex パーツのインデックス - * @param[in] opacity パーツの不透明度 + * @param partIndex Part index + * @param opacity Part opacity */ void SetPartOpacity(csmInt32 partIndex, csmFloat32 opacity); /** - * @brief パーツの不透明度の取得 + * Returns the opacity of the part. * - * パーツの不透明度を取得する。 + * @param partId Part ID * - * @param[in] partId パーツのID - * @return パーツの不透明度 + * @return Part opacity */ csmFloat32 GetPartOpacity(CubismIdHandle partId); /** - * @brief パーツの不透明度の取得 + * Returns the opacity of the part. * - * パーツの不透明度を取得する。 + * @param partIndex Part index * - * @param[in] partIndex パーツのインデックス - * @return パーツの不透明度 + * @return Part opacity */ csmFloat32 GetPartOpacity(csmInt32 partIndex); /** - * @brief パラメータのインデックスの取得 + * Returns the index of the parameter. * - * パラメータのインデックスを取得する。 + * @param parameterId Parameter ID * - * @param[in] parameterId パラメータID - * @return パラメータのインデックス + * @return Parameter index */ csmInt32 GetParameterIndex(CubismIdHandle parameterId); /** - * @brief パラメータのIDの取得 + * Returns the ID of the parameter * - * パラメータのIDを取得する。 + * Retrieves the ID of the parameter. * - * @param[in] parameterIndex パラメータのIndex - * @return パラメータのID + * @param parameterIndex Index of the parameter + * @return Parameter ID */ CubismIdHandle GetParameterId(csmUint32 parameterIndex); /** - * @brief パラメータの個数の取得 - * - * パラメータの個数を取得する。 + * Returns the number of parameters. * - * @return パラメータの個数 + * @return Number of parameters */ csmInt32 GetParameterCount() const; /** - * @brief パラメータの種類の取得 + * Returns the type of the parameter. * - * パラメータの種類を取得する。 + * @param parameterIndex Parameter index * - * @return Core::csmParameterType_Normal -> 通常のパラメータ - * Core::csmParameterType_BlendShape -> ブレンドシェイプパラメータ + * @return Parameter type */ Core::csmParameterType GetParameterType(csmUint32 parameterIndex) const; /** - * @brief パラメータの最大値の取得 + * Returns the maximum value of the parameter. * - * パラメータの最大値を取得する。 + * @param parameterIndex Parameter index * - * @param[in] parameterIndex パラメータのインデックス - * @return パラメータの最大値 + * @return Maximum value of the parameter */ csmFloat32 GetParameterMaximumValue(csmUint32 parameterIndex) const; /** - * @brief パラメータの最小値の取得 + * Returns the minimum value of the parameter. * - * パラメータの最小値を取得する。 + * @param parameterIndex Parameter index * - * @param[in] parameterIndex パラメータのインデックス - * @return パラメータの最小値 + * @return Minimum value of the parameter */ csmFloat32 GetParameterMinimumValue(csmUint32 parameterIndex) const; /** - * @brief パラメータのデフォルト値の取得 + * Returns the default value of the parameter. * - * パラメータのデフォルト値を取得する。 + * @param parameterIndex Parameter index * - * @param[in] parameterIndex パラメータのインデックス - * @return パラメータのデフォルト値 + * @return Default value of the parameter */ csmFloat32 GetParameterDefaultValue(csmUint32 parameterIndex) const; /** - * @brief パラメータの値の取得 + * Returns the value of the parameter. * - * パラメータの値を取得する。 + * @param parameterId Parameter ID * - * @param[in] parameterId パラメータID - * @return パラメータの値 + * @return Parameter value */ csmFloat32 GetParameterValue(CubismIdHandle parameterId); /** - * @brief パラメータの値の取得 + * Returns the value of the parameter. * - * パラメータの値を取得する。 + * @param parameterIndex Parameter index * - * @param[in] parameterIndex パラメータのインデックス - * @return パラメータの値 + * @return Parameter value */ csmFloat32 GetParameterValue(csmInt32 parameterIndex); /** - * @brief パラメータの値の設定 + * Sets the value of the parameter. * - * パラメータの値を設定する。 - * - * @param[in] parameterId パラメータID - * @param[in] value パラメータの値 - * @param[in] weight 重み + * @param parameterId Parameter ID + * @param value Parameter value + * @param weight Weight */ void SetParameterValue(CubismIdHandle parameterId, csmFloat32 value, csmFloat32 weight = 1.0f); /** - * @brief パラメータの値の設定 - * - * パラメータの値を設定する。 + * Sets the value of the parameter. * - * @param[in] parameterIndex パラメータのインデックス - * @param[in] value パラメータの値 - * @param[in] weight 重み + * @param parameterIndex Parameter index + * @param value Parameter value + * @param weight Weight */ void SetParameterValue(csmInt32 parameterIndex, csmFloat32 value, csmFloat32 weight = 1.0f); /** - * @brief パラメータの値の加算 - * - * パラメータの値を加算する。 + * Adds to the value of the parameter. * - * @param[in] parameterId パラメータID - * @param[in] value 加算する値 - * @param[in] weight 重み + * @param parameterId Parameter ID + * @param value Value to be added + * @param weight Weight */ void AddParameterValue(CubismIdHandle parameterId, csmFloat32 value, csmFloat32 weight = 1.0f); /** - * @brief パラメータの値の加算 + * Adds to the value of the parameter. * - * パラメータの値を加算する。 - * - * @param[in] parameterIndex パラメータのインデックス - * @param[in] value 加算する値 - * @param[in] weight 重み + * @param parameterIndex Parameter index + * @param value Value to be added + * @param weight Weight */ void AddParameterValue(csmInt32 parameterIndex, csmFloat32 value, csmFloat32 weight = 1.0f); /** - * @brief パラメータの値の乗算 - * - * パラメータの値を乗算する。 + * Multiplies the value of the parameter. * - * @param[in] parameterId パラメータID - * @param[in] value 乗算する値 - * @param[in] weight 重み + * @param parameterId Parameter ID + * @param value Value to be multiplied + * @param weight Weight */ void MultiplyParameterValue(CubismIdHandle parameterId, csmFloat32 value, csmFloat32 weight = 1.0f); /** - * @brief パラメータの値の乗算 - * - * パラメータの値を乗算する。 - * - * @param[in] parameterIndex パラメータのインデックス - * @param[in] value 乗算する値 - * @param[in] weight 重み - */ + * Multiplies the value of the parameter. + * + * @param parameterIndex Parameter index + * @param value Value to be multiplied + * @param weight Weight + */ void MultiplyParameterValue(csmInt32 parameterIndex, csmFloat32 value, csmFloat32 weight = 1.0f); /** - * @brief Drawableのインデックスの取得 + * Returns the index of the drawable. * - * Drawableのインデックスを取得する。 + * @param drawableId Drawable ID * - * @param[in] drawableId DrawableのID - * @return Drawableのインデックス + * @return Index of the drawable */ csmInt32 GetDrawableIndex(CubismIdHandle drawableId) const; /** - * @brief Drawableの個数の取得 - * - * Drawableの個数を取得する。 + * Returns the number of drawables. * - * @return Drawableの個数 + * @return Number of drawables */ csmInt32 GetDrawableCount() const; /** - * @brief DrawableのIDの取得 + * Returns the ID of the drawable. * - * DrawableのIDを取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return DrawableのID + * @return Drawable ID */ CubismIdHandle GetDrawableId(csmInt32 drawableIndex) const; /** - * @brief Drawableの描画順リストの取得 + * Returns the list of drawable render orders. * - * Drawableの描画順リストを取得する。 - * - * @return Drawableの描画順リスト + * @return List of drawable render orders */ const csmInt32* GetDrawableRenderOrders() const; /** - * @deprecated - * 関数名が誤っていたため、代替となる getDrawableTextureIndex を追加し、この関数は非推奨となりました。 + * Returns the list of texture indices attached to the drawable. * - * @brief Drawableのテクスチャインデックスリストの取得 + * @deprecated This function is deprecated due to a naming error, use getDrawableTextureIndex instead. * - * Drawableのテクスチャインデックスリストを取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableのテクスチャインデックスリスト + * @return List of texture indices */ csmInt32 GetDrawableTextureIndices(csmInt32 drawableIndex) const; /** - * @brief Drawableのテクスチャインデックスリストの取得 + * Returns the texture index attached to the drawable. * - * Drawableのテクスチャインデックスを取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableのテクスチャインデックス + * @return Texture index attached to the drawable */ csmInt32 GetDrawableTextureIndex(csmInt32 drawableIndex) const; /** - * @brief Drawableの頂点インデックスの個数の取得 + * Returns the number of vertex indices in the drawable. * - * Drawableの頂点インデックスの個数を取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableの頂点インデックスの個数 + * @return Number of vertex indices in the drawable */ csmInt32 GetDrawableVertexIndexCount(csmInt32 drawableIndex) const; /** - * @brief Drawableの頂点の個数の取得 + * Returns the number of vertices in the drawable. * - * Drawableの頂点の個数を取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableの頂点の個数 + * @return Number of vertices in the drawable */ csmInt32 GetDrawableVertexCount(csmInt32 drawableIndex) const; /** - * @brief Drawableの頂点リストの取得 + * Returns the list of vertices in the drawable. * - * Drawableの頂点リストを取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableの頂点リスト + * @return List of vertices in the drawable */ const csmFloat32* GetDrawableVertices(csmInt32 drawableIndex) const; /** - * @brief Drawableの頂点インデックスリストの取得 + * Returns the list of vertex indices in the drawable. * - * Drawableの頂点インデックスリストを取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableの頂点インデックスリスト + * @return List of vertex indices in the drawable */ const csmUint16* GetDrawableVertexIndices(csmInt32 drawableIndex) const; /** - * @brief Drawableの頂点リストの取得 + * Returns the list of vertices in the drawable. * - * Drawableの頂点リストを取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableの頂点リスト + * @return List of vertices in the drawable */ const Core::csmVector2* GetDrawableVertexPositions(csmInt32 drawableIndex) const; /** - * @brief Drawableの頂点のUVリストの取得 + * Returns the list of vertex UVs in the drawable. * - * Drawableの頂点のUVリストを取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableの頂点のUVリスト + * @return List of vertex UVs in the drawable */ const Core::csmVector2* GetDrawableVertexUvs(csmInt32 drawableIndex) const; /** - * @brief Drawableの不透明度の取得 + * Returns the opacity of the drawable. * - * Drawableの不透明度を取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableの不透明度 + * @return Opacity of the drawable */ csmFloat32 GetDrawableOpacity(csmInt32 drawableIndex) const; /** - * @brief Drawableの乗算色の取得 + * Returns the multiply color of the drawable. * - * Drawableの乗算色を取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableの乗算色 + * @return Multiply color of the drawable */ Core::csmVector4 GetDrawableMultiplyColor(csmInt32 drawableIndex) const; /** - * @brief Drawableのスクリーン色の取得 + * Returns the screen color of the drawable. * - * Drawableのスクリーン色を取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableのスクリーン色 + * @return Screen color of the drawable */ Core::csmVector4 GetDrawableScreenColor(csmInt32 drawableIndex) const; /** - * @brief Drawableの親パーツのインデックスの取得 + * Returns the index of the parent part of the drawable. * - * Drawableの親パーツのインデックスを取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return drawableの親パーツのインデックス + * @return Index of the parent part of the drawable */ csmInt32 GetDrawableParentPartIndex(csmUint32 drawableIndex) const; /** - * @brief Drawableのブレンドモードの取得 + * Returns the blend mode of the drawable. * - * Drawableのブレンドモードを取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableのブレンドモード + * @return Blend mode of the drawable */ Rendering::CubismRenderer::CubismBlendMode GetDrawableBlendMode(csmInt32 drawableIndex) const; /** - * @brief Drawableのマスクの反転使用の取得 - * - * Drawableのマスク使用時の反転設定を取得する。 - * マスクを使用しない場合は無視される - * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableのマスクの反転設定 - */ + * Returns the inverted mask setting for the drawable. + * + * @param drawableIndex Drawable index + * + * @return Inverted mask setting of the drawable. true if inverted. + * + * @note Ignored if the mask is not used. + */ csmBool GetDrawableInvertedMask(csmInt32 drawableIndex) const; /** - * @brief Drawableの表示情報の取得 - * - * Drawableの表示情報を取得する。 - * - * @param[in] drawableIndex Drawableのインデックス - * @return true Drawableが表示 - * @retval false Drawableが非表示 - */ + * Returns the visibility information of the drawable. + * + * @param drawableIndex Drawable index + * + * @return Visibility state of the drawable. true if visible. + */ csmBool GetDrawableDynamicFlagIsVisible(csmInt32 drawableIndex) const; /** - * @brief Drawableの表示状態の変化の取得 - * - * 直近のCubismModel::Update関数でDrawableの表示状態が変化したかを取得する。 - * - * @param[in] drawableIndex Drawableのインデックス - * @retval true Drawableの表示状態が直近のCubismModel::Update関数で変化した - * @retval false Drawableの表示状態が直近のCubismModel::Update関数で変化していない - */ + * Returns whether the visibility state of the drawable has changed from the dynamic flag. + * + * @param drawableIndex Drawable index + * + * @return true if the visibility state of the drawable has changed. + */ csmBool GetDrawableDynamicFlagVisibilityDidChange(csmInt32 drawableIndex) const; /** - * @brief Drawableの不透明度の変化情報の取得 - * - * 直近のCubismModel::Update関数でDrawableの不透明度が変化したかを取得する。 - * - * @param[in] drawableIndex Drawableのインデックス - * @retval true Drawableの不透明度が直近のCubismModel::Update関数で変化した - * @retval false Drawableの不透明度が直近のCubismModel::Update関数で変化していない - */ + * Returns whether the opacity of the drawable has changed from the dynamic flag. + * + * @param drawableIndex Drawable index + * + * @return true if the opacity of the drawable has changed. + */ csmBool GetDrawableDynamicFlagOpacityDidChange(csmInt32 drawableIndex) const; /** - * @brief DrawableのDrawOrderの変化情報の取得 - * - * 直近のCubismModel::Update関数でDrawableのDrawOrderが変化したかを取得する。 - * DrawOrderはArtMesh上で指定する0から1000の情報 - * - * @param[in] drawableIndex Drawableのインデックス - * @retval true Drawableの不透明度が直近のCubismModel::Update関数で変化した - * @retval false Drawableの不透明度が直近のCubismModel::Update関数で変化していない - */ + * Returns whether the draw order of the drawable has changed from the dynamic flag. + * + * @param drawableIndex Drawable index + * + * @return true if the draw order of the drawable has changed. + * + * @note Draw order is information specified from 0 to 1000 on the ArtMesh. + */ csmBool GetDrawableDynamicFlagDrawOrderDidChange(csmInt32 drawableIndex) const; /** - * @brief Drawableの描画順序の変化情報の取得 - * - * 直近のCubismModel::Update関数でDrawableの描画の順序が変化したかを取得する。 - * - * @param[in] drawableIndex Drawableのインデックス - * @retval true Drawableの描画の順序が直近のCubismModel::Update関数で変化した - * @retval false Drawableの描画の順序が直近のCubismModel::Update関数で変化していない - */ + * Returns whether the render order of the drawable has changed from the dynamic flag. + * + * @param drawableIndex Drawable index + * + * @return true if the render order of the drawable has changed. + */ csmBool GetDrawableDynamicFlagRenderOrderDidChange(csmInt32 drawableIndex) const; /** - * @brief DrawableのVertexPositionsの変化情報の取得 - * - * 直近のCubismModel::Update関数でDrawableの頂点情報が変化したかを取得する。 - * - * @param[in] drawableIndex Drawableのインデックス - * @retval true Drawableの頂点情報が直近のCubismModel::Update関数で変化した - * @retval false Drawableの頂点情報が直近のCubismModel::Update関数で変化していない - */ + * Returns whether the vertex information of the drawable has changed from the dynamic flag. + * + * @param drawableIndex Drawable index + * + * @return true if the vertex information of the drawable has changed. + */ csmBool GetDrawableDynamicFlagVertexPositionsDidChange(csmInt32 drawableIndex) const; /** - * @brief Drawableの乗算色・スクリーン色の変化情報の取得 - * - * 直近のCubismModel::Update関数でDrawableの乗算色・スクリーン色が変化したかを取得する。 - * - * @param[in] drawableIndex Drawableのインデックス - * @retval true Drawableの乗算色・スクリーン色が直近のCubismModel::Update関数で変化した - * @retval false Drawableの乗算色・スクリーン色が直近のCubismModel::Update関数で変化していない - */ + * Returns whether the multiply or screen color of the drawable has changed from the dynamic flag. + * + * @param drawableIndex Drawable index + * + * @return true if the multiply or screen color of the drawable has changed. + */ csmBool GetDrawableDynamicFlagBlendColorDidChange(csmInt32 drawableIndex) const; /** - * @brief Drawableのクリッピングマスクリストの取得 + * Returns the list of clipping masks of the drawables. * - * Drawableのクリッピングマスクリストを取得する。 - * - * @return Drawableのクリッピングマスクリスト + * @return List of clipping masks of the drawables */ const csmInt32** GetDrawableMasks() const; /** - * @brief Drawableのクリッピングマスクの個数リストの取得 - * - * Drawableのクリッピングマスクの個数リストを取得する。 + * Returns the list of the number of clipping masks of the drawables. * - * @return Drawableのクリッピングマスクの個数リスト + * @return List of the number of clipping masks of the drawables */ const csmInt32* GetDrawableMaskCounts() const; /** - * @brief クリッピングマスクの使用状態 + * Checks whether the model uses clipping masks. * - * クリッピングマスクを使用しているかどうか? - * - * @retval true クリッピングマスクを使用している - * @retval false クリッピングマスクを使用していない + * @return true if the model uses clipping masks. */ csmBool IsUsingMasking() const; /** - * @brief 保存されたパラメータの読み込み - * - * 保存されたパラメータを読み込む + * Loads temporarily stored parameter values. */ void LoadParameters(); /** - * @brief パラメータの保存 - * - * パラメータを保存する。 + * Stores the value of the parameter temporarily. */ void SaveParameters(); /** - * @brief drawableの乗算色を取得する + * Returns the multiply color from the list of drawables. + * + * @param drawableIndex Drawable index + * + * @return Multiply color (CubismTextureColor) */ Rendering::CubismRenderer::CubismTextureColor GetMultiplyColor(csmInt32 drawableIndex) const; /** - * @brief drawableのスクリーン色を取得する + * Returns the screen color from the list of drawables. + * + * @param drawableIndex Drawable index + * + * @return Screen color (CubismTextureColor) */ Rendering::CubismRenderer::CubismTextureColor GetScreenColor(csmInt32 drawableIndex) const; /** - * @brief drawableの乗算色を設定する + * Sets the multiply color of the drawable. + * + * @param drawableIndex Drawable index + * @param color Multiply color to be set (CubismTextureColor) */ void SetMultiplyColor(csmInt32 drawableIndex, const Rendering::CubismRenderer::CubismTextureColor& color); /** - * @brief drawableの乗算色を設定する + * Sets the multiply color of the drawable. + * + * @param drawableIndex Drawable index + * @param r Red value of the multiply color to be set + * @param g Green value of the multiply color to be set + * @param b Blue value of the multiply color to be set + * @param a Alpha value of the multiply color to be set */ void SetMultiplyColor(csmInt32 drawableIndex, csmFloat32 r, csmFloat32 g, csmFloat32 b, csmFloat32 a = 1.0f); /** - * @brief drawableのスクリーン色を設定する + * Sets the screen color of the drawable. + * + * @param drawableIndex Drawable index + * @param color Screen color to be set (CubismTextureColor) */ void SetScreenColor(csmInt32 drawableIndex, const Rendering::CubismRenderer::CubismTextureColor& color); /** - * @brief drawableのスクリーン色を設定する + * Sets the screen color of the drawable. + * + * @param drawableIndex Drawable index + * @param r Red value of the screen color to be set + * @param g Green value of the screen color to be set + * @param b Blue value of the screen color to be set + * @param a Alpha value of the screen color to be set */ void SetScreenColor(csmInt32 drawableIndex, csmFloat32 r, csmFloat32 g, csmFloat32 b, csmFloat32 a = 1.0f); /** - * @brief partの乗算色を取得する + * Returns the multiply color of the part. */ Rendering::CubismRenderer::CubismTextureColor GetPartMultiplyColor(csmInt32 partIndex) const; /** - * @brief partの乗算色を取得する + * Returns the screen color of the part. */ Rendering::CubismRenderer::CubismTextureColor GetPartScreenColor(csmInt32 partIndex) const; /** - * @brief partのスクリーン色を設定する + * Sets the multiply color of the part. */ void SetPartMultiplyColor(csmInt32 partIndex, const Rendering::CubismRenderer::CubismTextureColor& color); /** - * @brief partの乗算色を設定する + * Sets the multiply color of the part. */ void SetPartMultiplyColor(csmInt32 partIndex, csmFloat32 r, csmFloat32 g, csmFloat32 b, csmFloat32 a = 1.0f); /** - * @brief partのスクリーン色を設定する + * Sets the screen color of the part. */ void SetPartScreenColor(csmInt32 partIndex, const Rendering::CubismRenderer::CubismTextureColor& color); /** - * @brief partのスクリーン色を設定する + * Sets the screen color of the part. */ void SetPartScreenColor(csmInt32 partIndex, csmFloat32 r, csmFloat32 g, csmFloat32 b, csmFloat32 a = 1.0f); /** - * @brief SDKからモデル全体の乗算色を上書きするか。 + * Returns the flag indicating whether the color set at runtime is used as the multiply color for the entire model during rendering. * - * @retval true -> SDK上の色情報を使用 - * @retval false -> モデルの色情報を使用 + * @return true if the color set at runtime is used; otherwise false. */ csmBool GetOverwriteFlagForModelMultiplyColors() const; /** - * @brief SDKからモデル全体のスクリーン色を上書きするか。 + * Returns the flag indicating whether the color set at runtime is used as the screen color for the entire model during rendering. * - * @retval true -> SDK上の色情報を使用 - * @retval false -> モデルの色情報を使用 + * @return true if the color set at runtime is used; otherwise false. */ csmBool GetOverwriteFlagForModelScreenColors() const; /** - * @brief SDKからモデル全体の乗算色を上書きするかをセットする - * SDK上の色情報を使うならtrue、モデルの色情報を使うならfalse + * Sets the flag indicating whether the color set at runtime is used as the multiply color for the entire model during rendering. + * + * @param value true if the color set at runtime is to be used; otherwise false. */ void SetOverwriteFlagForModelMultiplyColors(csmBool value); /** - * @brief SDKからモデル全体のスクリーン色を上書きするかをセットする - * SDK上の色情報を使うならtrue、モデルの色情報を使うならfalse + * Sets the flag indicating whether the color set at runtime is used as the screen color for the entire model during rendering. + * + * @param value true if the color set at runtime is to be used; otherwise false. */ void SetOverwriteFlagForModelScreenColors(csmBool value); /** - * @brief SDKからdrawableの乗算色を上書きするか。 + * Returns the flag indicating whether the color set at runtime is used as the multiply color for the drawable during rendering. * - * @retval true -> SDK上の色情報を使用 - * @retval false -> モデルの色情報を使用 + * @param drawableIndex Drawable index + * + * @return true if the color set at runtime is used; otherwise false. */ csmBool GetOverwriteFlagForDrawableMultiplyColors(csmInt32 drawableIndex) const; /** - * @brief SDKからdrawableのスクリーン色を上書きするか。 + * Returns the flag indicating whether the color set at runtime is used as the screen color for the drawable during rendering. + * + * @param drawableIndex Drawable index * - * @retval true -> SDK上の色情報を使用 - * @retval false -> モデルの色情報を使用 + * @return true if the color set at runtime is used; otherwise false. */ csmBool GetOverwriteFlagForDrawableScreenColors(csmInt32 drawableIndex) const; /** - * @brief SDKからdrawableの乗算色を上書きするかをセットする - * SDK上の色情報を使うならtrue、モデルの色情報を使うならfalse + * Sets the flag indicating whether the color set at runtime is used as the multiply color for the drawable during rendering. + * + * @param drawableIndex Drawable index + * @param value true if the color set at runtime is to be used; otherwise false. */ void SetOverwriteFlagForDrawableMultiplyColors(csmUint32 drawableIndex, csmBool value); /** - * @brief SDKからdrawableのスクリーン色を上書きするかをセットする - * SDK上の色情報を使うならtrue、モデルの色情報を使うならfalse + * Sets the flag indicating whether the color set at runtime is used as the screen color for the drawable during rendering. + * + * @param drawableIndex Drawable index + * @param value true if the color set at runtime is to be used; otherwise false. */ void SetOverwriteFlagForDrawableScreenColors(csmUint32 drawableIndex, csmBool value); /** - * @brief SDKからpartの乗算色を上書きするか。 + * Checks whether the part multiply color is overridden by the SDK. * - * @retval true -> SDK上の色情報を使用 - * @retval false -> モデルの色情報を使用 + * @return true if the color information from the SDK is used; otherwise false. */ csmBool GetOverwriteColorForPartMultiplyColors(csmInt32 partIndex) const; /** - * @brief SDKからpartのスクリーン色を上書きするか。 + * Checks whether the part screen color is overridden by the SDK. * - * @retval true -> SDK上の色情報を使用 - * @retval false -> モデルの色情報を使用 + * @return true if the color information from the SDK is used; otherwise false. */ csmBool GetOverwriteColorForPartScreenColors(csmInt32 partIndex) const; /** - * @brief SDKからpartの乗算色を上書きするかをセットする - * SDK上の色情報を使うならtrue、モデルの色情報を使うならfalse + * Sets whether the part multiply color is overridden by the SDK. + * Use true to use the color information from the SDK, or false to use the color information from the model. */ void SetOverwriteColorForPartMultiplyColors(csmUint32 partIndex, csmBool value); /** - * @brief SDKからpartのスクリーン色を上書きするかをセットする - * SDK上の色情報を使うならtrue、モデルの色情報を使うならfalse + * Sets whether the part screen color is overridden by the SDK. + * Use true to use the color information from the SDK, or false to use the color information from the model. */ void SetOverwriteColorForPartScreenColors(csmUint32 partIndex, csmBool value); /** - * @brief Drawableのカリング情報の取得 + * Returns the culling information of the drawable. * - * Drawableのカリング情報を取得する。 + * @param drawableIndex Drawable index * - * @param[in] drawableIndex Drawableのインデックス - * @return Drawableのカリング情報 + * @return Culling information of the drawable */ csmInt32 GetDrawableCulling(csmInt32 drawableIndex) const; /** - * @brief Drawableのカリング情報を設定する + * Sets the culling information of the drawable. */ void SetDrawableCulling(csmInt32 drawableIndex, csmInt32 isCulling); /** - * @brief SDKからモデル全体のカリング設定を上書きするか。 + * Checks whether the culling settings for the entire model are overridden by the SDK. * - * @retval true -> SDK上のカリング設定を使用 - * @retval false -> モデルのカリング設定を使用 + * @return true if the culling settings from the SDK are used; otherwise false. */ csmBool GetOverwriteFlagForModelCullings() const; /** - * @brief SDKからモデル全体のカリング設定を上書きするかをセットする - * SDK上のカリング設定を使うならtrue、モデルのカリング設定を使うならfalse + * Sets whether the culling settings for the entire model are overridden by the SDK. + * Use true to use the culling settings from the SDK, or false to use the culling settings from the model. */ void SetOverwriteFlagForModelCullings(csmBool value); /** - * @brief SDKからdrawableのカリング設定を上書きするか。 + * Checks whether the culling settings for the drawable are overridden by the SDK. * - * @retval true -> SDK上のカリング設定を使用 - * @retval false -> モデルのカリング設定を使用 + * @return true if the culling settings from the SDK are used; otherwise false. */ csmBool GetOverwriteFlagForDrawableCullings(csmInt32 drawableIndex) const; /** - * @brief SDKからdrawableのカリング設定を上書きするかをセットする - * SDK上のカリング設定を使うならtrue、モデルのカリング設定を使うならfalse + * Sets whether the culling settings for the drawable are overridden by the SDK. + * Use true to use the culling settings from the SDK, or false to use the culling settings from the model. */ void SetOverwriteFlagForDrawableCullings(csmUint32 drawableIndex, csmBool value); /** - * @brief モデルの不透明度を取得する + * Returns the opacity of the model. * - * @return 不透明度の値 + * @return Opacity value */ csmFloat32 GetModelOpacity(); /** - * @brief モデルの不透明度を設定する + * Sets the opacity of the model. * - * @param[in] value 不透明度の値 + * @param value Opacity value */ void SetModelOpacity(csmFloat32 value); Core::csmModel* GetModel() const; private: - /** - * @brief コンストラクタ - * - * コンストラクタ。 - * - * @param[in] model csmModelへのポインタ - */ CubismModel(Core::csmModel* model); - /** - * @brief デストラクタ - * - * デストラクタ。 - */ virtual ~CubismModel(); - //Prevention of copy Constructor CubismModel(const CubismModel&); CubismModel& operator=(const CubismModel&); - /** - * @brief 初期化 - * - * 初期化する。 - */ void Initialize(); - /** - * @brief partのOverwriteColor Set関数 - */ void SetPartColor( csmUint32 partIndex, csmFloat32 r, csmFloat32 g, csmFloat32 b, csmFloat32 a, csmVector& partColors, csmVector & drawableColors); - /** - * @brief partのOverwriteFlag Set関数 - */ void SetOverwriteColorForPartColors( csmUint32 partIndex, csmBool value, csmVector& partColors, csmVector & drawableColors); - csmMap _notExistPartOpacities; ///< 存在していないパーツの不透明度のリスト - csmMap _notExistPartId; ///< 存在していないパーツIDのリスト + csmMap _notExistPartOpacities; + csmMap _notExistPartId; - csmMap _notExistParameterValues; ///< 存在していないパラメータの値のリスト - csmMap _notExistParameterId; ///< 存在していないパラメータIDのリスト + csmMap _notExistParameterValues; + csmMap _notExistParameterId; - csmVector _savedParameters; ///< 保存されたパラメータ + csmVector _savedParameters; - Core::csmModel* _model; ///< モデル + Core::csmModel* _model; - csmFloat32* _parameterValues; ///< パラメータの値のリスト - const csmFloat32* _parameterMaximumValues; ///< パラメータの最大値のリスト - const csmFloat32* _parameterMinimumValues; ///< パラメータの最小値のリスト + csmFloat32* _parameterValues; + const csmFloat32* _parameterMaximumValues; + const csmFloat32* _parameterMinimumValues; - csmFloat32* _partOpacities; ///< パーツの不透明度のリスト + csmFloat32* _partOpacities; - csmFloat32 _modelOpacity; ///< モデルの不透明度 + csmFloat32 _modelOpacity; csmVector _parameterIds; csmVector _partIds; csmVector _drawableIds; - csmVector _userScreenColors; ///< Drawable 乗算色の配列 - csmVector _userMultiplyColors; ///< Drawable スクリーン色の配列 - csmVector _userCullings; ///< カリング設定の配列 - csmVector _userPartScreenColors; ///< Part 乗算色の配列 - csmVector _userPartMultiplyColors; ///< Part スクリーン色の配列 - csmVector > _partChildDrawables; ///< Partの子DrawableIndexの配列 - csmBool _isOverwrittenModelMultiplyColors; ///< 乗算色を全て上書きするか? - csmBool _isOverwrittenModelScreenColors; ///< スクリーン色を全て上書きするか? - csmBool _isOverwrittenCullings; ///< モデルのカリング設定をすべて上書きするか? + csmVector _userScreenColors; + csmVector _userMultiplyColors; + csmVector _userCullings; + csmVector _userPartScreenColors; + csmVector _userPartMultiplyColors; + csmVector > _partChildDrawables; + csmBool _isOverwrittenModelMultiplyColors; + csmBool _isOverwrittenModelScreenColors; + csmBool _isOverwrittenCullings; }; }}} diff --git a/src/Model/CubismModelUserData.hpp b/src/Model/CubismModelUserData.hpp index 051a2cf..4838b84 100644 --- a/src/Model/CubismModelUserData.hpp +++ b/src/Model/CubismModelUserData.hpp @@ -11,78 +11,58 @@ namespace Live2D { namespace Cubism { namespace Framework { -/// ユーザデータの種類を指定するタイプ宣言 typedef CubismIdHandle ModelUserDataType; /** -* @brief ユーザデータの管理クラス -* -* ユーザデータをロード、管理、検索インターフェイス、解放までを行う。 -*/ + * Handles management of user data. + */ class CubismModelUserData { public: /** - * @brief ユーザデータ構造体 - * - * Jsonから読み込んだユーザデータを記録しておくための構造体 - */ + * Structure for user data information + */ struct CubismModelUserDataNode { - ModelUserDataType TargetType; ///< ユーザデータターゲットタイプ - CubismIdHandle TargetId; ///< ユーザデータターゲットのID - csmString Value; ///< ユーザデータ + ModelUserDataType TargetType; ///< User data type + CubismIdHandle TargetId; ///< ID of the object attached to the user data + csmString Value; ///< User data value }; /** - * @brief インスタンスの作成 - * - * インスタンスを作成する。 - * - * @param[in] buffer userdata3.jsonが読み込まれいるバッファ - * @param[in] size バッファのサイズ - * @return 作成されたインスタンス - */ + * Makes an instance. + * + * @param buffer Buffer where the user data file is loaded + * @param size Byte size of the buffer + * + * @return Instance + */ static CubismModelUserData* Create(const csmByte* buffer, csmSizeInt size); /** - * @brief インスタンスの破棄 - * - * インスタンスを破棄する。 - * - * @param[in] modelUserData 破棄するインスタンス - */ + * Destroys the instance. + * + * @param modelUserData Instance of `CubismModelUserData` to destroy + */ static void Delete(CubismModelUserData* modelUserData); /** - * @brief デストラクタ - * - * ユーザーデータ構造体配列を解放する - */ + * Destructor + */ virtual ~CubismModelUserData(); /** - * @brief ArtMeshのユーザデータのリストの取得 - * - * ArtMeshのユーザデータのリストの取得する。 - * - * @return csmVectorのユーザデータリスト - */ + * Returns the list of user data for ArtMesh. + * + * @return List of user data + */ const csmVector& GetArtMeshUserDatas() const; private: - /** - * @brief userdata3.jsonのパース - * - * userdata3.jsonをパースする。 - * - * @param[in] buffer userdata3.jsonが読み込まれいるバッファ - * @param[in] size バッファのサイズ - */ void ParseUserData(const csmByte* buffer, csmSizeInt size); - csmVector _userDataNodes; ///< ユーザデータ構造体配列 - csmVector _artMeshUserDataNodes; ///< 閲覧リスト保持 + csmVector _userDataNodes; + csmVector _artMeshUserDataNodes; }; }}} //--------- LIVE2D NAMESPACE ------------ diff --git a/src/Model/CubismModelUserDataJson.hpp b/src/Model/CubismModelUserDataJson.hpp index b7874ce..39cf9bc 100644 --- a/src/Model/CubismModelUserDataJson.hpp +++ b/src/Model/CubismModelUserDataJson.hpp @@ -15,75 +15,64 @@ //--------- LIVE2D NAMESPACE ------------ namespace Live2D { namespace Cubism { namespace Framework { +/** + * Handles user data. + */ class CubismModelUserDataJson : public CubismJsonHolder { public: /** - * @brief コンストラクタ - * - * コンストラクタ。 - * - * @param[in] buffer userdata3.jsonが読み込まれているバッファ - * @param[in] size バッファのサイズ - */ + * Constructor + * + * @param buffer Buffer where the user data file is loaded + * @param size Number of bytes in the buffer + */ CubismModelUserDataJson(const csmByte* buffer, csmSizeInt size); /** - * @brief デストラクタ - * - * デストラクタ。 - */ + * Destructor + */ virtual ~CubismModelUserDataJson(); /** - * @brief ユーザデータ個数の取得 - * - * userdata3.jsonに入っていたユーザデータの個数を取得する。 - * - * @return ユーザデータの個数 - */ + * Returns the number of user data entries in the user data file. + * + * @return Number of user data entries + */ csmInt32 GetUserDataCount() const; /** - * @brief ユーザデータ総文字列数の取得 - * - * ユーザデータ総文字列数の取得する。 - * - * @return ユーザデータ総文字列数 - */ + * Returns the number of bytes in the user data file. + * + * @return Number of bytes + */ csmInt32 GetTotalUserDataSize() const; /** - * @brief ユーザデータのタイプの取得 - * - * 指定番目のユーザデータのタイプの取得を取得する。 - * - * @param[in] i インデックス - * - * @return ユーザデータのタイプ - */ + * Returns the type of user data at the specified index. + * + * @param i Index of the user data + * + * @return Type of user data + */ csmString GetUserDataTargetType(csmInt32 i) const; /** - * @brief ユーザデータのターゲットIDの取得 - * - * 指定番目のユーザデータのターゲットIDの取得を取得する。 - * - * @param[in] i インデックス - * - * @return ユーザデータターゲットID - */ + * Returns the ID of the target attached to the user data at the specified index. + * + * @param i Index of the user data + * + * @return ID of the target attached to the user data + */ CubismIdHandle GetUserDataId(csmInt32 i) const; /** - * @brief ユーザデータの文字列の取得 - * - * 指定番目のユーザデータの文字列の取得を取得する。 - * - * @param[in] i インデックス - * - * @return ユーザデータ - */ + * Returns the value of the user data at the specified index. + * + * @param i Index of the user data + * + * @return Value of the user data + */ const csmChar* GetUserDataValue(csmInt32 i) const; }; diff --git a/src/Model/CubismUserModel.cpp b/src/Model/CubismUserModel.cpp index 87963b5..3629abf 100644 --- a/src/Model/CubismUserModel.cpp +++ b/src/Model/CubismUserModel.cpp @@ -188,14 +188,41 @@ csmBool CubismUserModel::IsHit(CubismIdHandle drawableId, csmFloat32 pointX, csm return ((left <= tx) && (tx <= right) && (top <= ty) && (ty <= bottom)); } -ACubismMotion* CubismUserModel::LoadMotion(const csmByte* buffer, csmSizeInt size, const csmChar* name, ACubismMotion::FinishedMotionCallback onFinishedMotionHandler) +ACubismMotion* CubismUserModel::LoadMotion(const csmByte* buffer, csmSizeInt size, const csmChar* name, + ACubismMotion::FinishedMotionCallback onFinishedMotionHandler, ACubismMotion::BeganMotionCallback onBeganMotionHandler, + ICubismModelSetting* modelSetting, const csmChar* group, const csmInt32 index) { if (!buffer) { - CubismLogError("Failed to LoadMotion()."); + CubismLogError("Failed to LoadMotion(). Buffer is NULL."); return NULL; } - return CubismMotion::Create(buffer, size, onFinishedMotionHandler); + + ACubismMotion* motion = CubismMotion::Create(buffer, size, onFinishedMotionHandler, onBeganMotionHandler); + + if (!motion) + { + CubismLogError("Failed to create motion from buffer in LoadMotion()."); + return NULL; + } + + // 必要であればモーションフェード値を上書き + if (modelSetting) + { + const csmFloat32 fadeInTime = modelSetting->GetMotionFadeInTimeValue(group, index); + if (fadeInTime >= 0.0f) + { + motion->SetFadeInTime(fadeInTime); + } + + const csmFloat32 fadeOutTime = modelSetting->GetMotionFadeOutTimeValue(group, index); + if (fadeOutTime >= 0.0f) + { + motion->SetFadeOutTime(fadeOutTime); + } + } + + return motion; } void CubismUserModel::SetDragging(csmFloat32 x, csmFloat32 y) diff --git a/src/Model/CubismUserModel.hpp b/src/Model/CubismUserModel.hpp index 060cd97..f18d771 100644 --- a/src/Model/CubismUserModel.hpp +++ b/src/Model/CubismUserModel.hpp @@ -24,276 +24,232 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief ユーザーが実際に使用するモデル - * - * ユーザーが実際に使用するモデルの基底クラス。これを継承してユーザーが実装する。 + * Base for models actually used by thegit a user. */ class CubismUserModel { public: /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismUserModel(); /** - * @brief デストラクタ - * - * デストラクタ。 + * Destructor */ virtual ~CubismUserModel(); /** - * @brief 初期化状態の取得 - * - * 初期化されている状態か? + * Checks if it is initialized. * - * @retval true 初期化されている - * @retval false 初期化されていない + * @return true if initialized; otherwise false. */ virtual csmBool IsInitialized(); /** - * @brief 初期化状態の設定 + * Sets the initialization state. * - * 初期化状態を設定する。 - * - * @param[in] v 初期化状態 + * @param v Initialization state. true if initialized. */ virtual void IsInitialized(csmBool v); /** - * @brief 更新状態の取得 - * - * 更新されている状態か? + * Checks if it is updated. * - * @retval true 更新されている - * @retval false 更新されていない + * @return true if updated; otherwise false. */ virtual csmBool IsUpdating(); /** - * @brief 更新状態の設定 + * Sets the update state. * - * 更新状態を設定する。 - * - * @param[in] v 更新状態 + * @param v Update state. true if updated. */ virtual void IsUpdating(csmBool v); /** - * @brief マウスドラッグ情報の設定 - * - * マウスドラッグの情報を設定する。 + * Sets the information during mouse dragging. * - * @param[in] x ドラッグしているカーソルのX位置 - * @param[in] y ドラッグしているカーソルのY位置 + * @param x X position of the mouse cursor during dragging + * @param y Y position of the mouse cursor during dragging */ virtual void SetDragging(csmFloat32 x, csmFloat32 y); /** - * @brief 加速度情報の設定 + * Sets the acceleration information. * - * 加速度の情報を設定する。 - * - * @param[in] x X軸方向の加速度 - * @param[in] y Y軸方向の加速度 - * @param[in] z Z軸方向の加速度 + * @param x Acceleration in the X-axis direction + * @param y Acceleration in the Y-axis direction + * @param z Acceleration in the Z-axis direction */ virtual void SetAcceleration(csmFloat32 x, csmFloat32 y, csmFloat32 z); /** - * @brief モデル行列の取得 - * - * モデル行列を取得する。 + * Returns the matrix applied to the model. * - * @return モデル行列 + * @return Matrix */ CubismModelMatrix* GetModelMatrix() const; /** - * @brief 不透明度の設定 + * Sets the opacity. * - * 不透明度を設定する。 - * - * @param[in] a 不透明度 + * @param a Opacity */ virtual void SetOpacity(csmFloat32 a); /** - * @brief 不透明度の取得 - * - * 不透明度を取得する。 + * Returns the opacity. * - * @return 不透明度 + * @return Opacity */ virtual csmFloat32 GetOpacity(); /** - * @brief モデルデータの読み込み + * Loads the model from a MOC3 file. * - * モデルデータを読み込む。 - * - * @param[in] buffer moc3ファイルが読み込まれているバッファ - * @param[in] size バッファのサイズ - * @param[in] shouldCheckMocConsistency MOCの整合性チェックフラグ(初期値 : false) + * @param buffer Buffer where the MOC3 file is loaded + * @param size Number of bytes in the buffer */ virtual void LoadModel(const csmByte* buffer, csmSizeInt size, csmBool shouldCheckMocConsistency = false); /** - * @brief モーションデータの読み込み + * Loads motion from a motion file. + * If a fade value is defined in model3.json, the fade value defined in motion3.json will be overwritten. * - * モーションデータを読み込む。 + * @param buffer Buffer where the motion file is loaded + * @param size Number of bytes in the buffer + * @param name Name of the motion + * @param onFinishedMotionHandler Callback function when motion playback finishes + * @param modelSetting Model setting information + * @param group – Name to the desired Motion Group + * @param index – Index to the desired Motion * - * @param[in] buffer motion3.jsonファイルが読み込まれているバッファ - * @param[in] size バッファのサイズ - * @param[in] name モーションの名前 - * @param[in] onFinishedMotionHandler モーション再生終了時に呼び出されるコールバック関数。NULLの場合、呼び出されない。 - * @return モーションクラス + * @return Instance of the motion class */ - virtual ACubismMotion* LoadMotion(const csmByte* buffer, csmSizeInt size, const csmChar* name, ACubismMotion::FinishedMotionCallback onFinishedMotionHandler = NULL); + virtual ACubismMotion* LoadMotion(const csmByte* buffer, csmSizeInt size, const csmChar* name, + ACubismMotion::FinishedMotionCallback onFinishedMotionHandler = NULL, ACubismMotion::BeganMotionCallback onBeganMotionHandler = NULL, + ICubismModelSetting* modelSetting = NULL, const csmChar* group = NULL, const csmInt32 index = -1); /** - * @brief 表情データの読み込み + * Loads expression from an expression configuration file. * - * 表情データを読み込む。 + * @param buffer Buffer where the expression configuration file is loaded + * @param size Number of bytes in the buffer + * @param name Name of the expression * - * @param[in] buffer expファイルが読み込まれているバッファ - * @param[in] size バッファのサイズ - * @param[in] name 表情の名前 + * @return Instance of the expression motion class */ virtual ACubismMotion* LoadExpression(const csmByte* buffer, csmSizeInt size, const csmChar* name); /** - * @brief ポーズデータの読み込み - * - * ポーズデータを読み込む。 + * Loads pose from a pose configuration file. * - * @param[in] buffer pose3.jsonが読み込まれているバッファ - * @param[in] size バッファのサイズ + * @param buffer Buffer where the pose configuration file is loaded + * @param size Number of bytes in the buffer */ virtual void LoadPose(const csmByte* buffer, csmSizeInt size); /** - * @brief 物理演算データの読み込み + * Loads physics from a physics configuration file. * - * 物理演算データを読み込む。 - * - * @param[in] buffer physics3.jsonが読み込まれているバッファ - * @param[in] size バッファのサイズ + * @param buffer Buffer where the physics configuration file is loaded + * @param size Number of bytes in the buffer */ virtual void LoadPhysics(const csmByte* buffer, csmSizeInt size); /** - * @brief モデルに付属するユーザーデータを読み込む - * - * ユーザーデータを読み込む。 - * - * @param[in] buffer userdata3.jsonが読み込まれているバッファ - * @param[in] size バッファのサイズ - */ + * Loads user data from a user data file. + * + * @param buffer Buffer where the user data file is loaded + * @param size Number of bytes in the buffer + */ virtual void LoadUserData(const csmByte* buffer, csmSizeInt size); /** - * @brief あたり判定の取得 + * Returns whether the hit test of a drawable object hits at the specified position. * - * 指定した位置にDrawableがヒットしているかどうかを取得する。 + * @param drawableId ID of the drawable object to test + * @param pointX X position + * @param pointY Y position * - * @param[in] drawableId 検証したいDrawableのID - * @param[in] pointX X位置 - * @param[in] pointY Y位置 - * @retval true ヒットしている - * @retval false ヒットしていない + * @return true if the hit test of the drawable object hits at the specified position; otherwise false. */ virtual csmBool IsHit(CubismIdHandle drawableId, csmFloat32 pointX, csmFloat32 pointY); /** - * @brief モデルの取得 - * - * モデルを取得する。 + * Returns the model. * - * @return モデル + * @return Instance of the model */ CubismModel* GetModel() const; /** - * @brief レンダラの取得 + * Returns the renderer. * - * レンダラを取得する。 - * - * @return レンダラ + * @return Instance of the renderer */ template T* GetRenderer() { return dynamic_cast(_renderer); } /** - * @brief レンダラの生成 - * - * レンダラを生成して初期化を実行する。 - * + * Makes the renderer. */ void CreateRenderer(csmInt32 maskBufferCount = 1); /** - * @brief レンダラの解放 - * - * レンダラを解放する。 - * + * Destroys the renderer. */ void DeleteRenderer(); /** - * @brief イベント発火時の標準処理 - * - * Eventが再生処理時にあった場合の処理をする。 - * 継承で上書きすることを想定している。 - * 上書きしない場合はログ出力をする。 - * - * @param[in] eventValue 発火したイベントの文字列データ - */ + * Handles the event when user data fires during motion playback. + * + * @param eventValue Event value of the user data that fired + * + * @note This function is intended to be overridden.
+ * If not overridden, it outputs to the log. + */ virtual void MotionEventFired(const csmString& eventValue); /** - * @brief イベント用のCallback - * - * CubismMotionQueueManagerにイベント用に登録するためのCallback。 - * CubismUserModelの継承先のEventFiredを呼ぶ。 - * - * @param[in] caller 発火したイベントを管理していたモーションマネージャー、比較用 - * @param[in] eventValue 発火したイベントの文字列データ - * @param[in] customData CubismUserModelを継承したインスタンスを想定 - */ + * Callback function to receive user data events registered in the motion management class. + * + * @param caller Motion management class that handled the fired user data event + * @param eventValue Event value of the fired user data + * @param customData Arbitrary data + * + * @note Calls the `MotionEventFired` of the CubismUserModel subclass. + */ static void CubismDefaultMotionEventCallback(const CubismMotionQueueManager* caller, const csmString& eventValue, void* customData); protected: - CubismMoc* _moc; ///< Mocデータ - CubismModel* _model; ///< Modelインスタンス - - CubismMotionManager* _motionManager; ///< モーション管理 - CubismExpressionMotionManager* _expressionManager; ///< 表情管理 - CubismEyeBlink* _eyeBlink; ///< 自動まばたき - CubismBreath* _breath; ///< 呼吸 - CubismModelMatrix* _modelMatrix; ///< モデル行列 - CubismPose* _pose; ///< ポーズ管理 - CubismTargetPoint* _dragManager; ///< マウスドラッグ - CubismPhysics* _physics; ///< 物理演算 - CubismModelUserData* _modelUserData; ///< ユーザデータ - - csmBool _initialized; ///< 初期化されたかどうか - csmBool _updating; ///< 更新されたかどうか - csmFloat32 _opacity; ///< 不透明度 - csmBool _lipSync; ///< リップシンクするかどうか - csmFloat32 _lastLipSyncValue; ///< 最後のリップシンクの制御値 - csmFloat32 _dragX; ///< マウスドラッグのX位置 - csmFloat32 _dragY; ///< マウスドラッグのY位置 - csmFloat32 _accelerationX; ///< X軸方向の加速度 - csmFloat32 _accelerationY; ///< Y軸方向の加速度 - csmFloat32 _accelerationZ; ///< Z軸方向の加速度 - csmBool _mocConsistency; ///< MOC3整合性検証するかどうか - csmBool _debugMode; ///< デバッグモードかどうか + CubismMoc* _moc; + CubismModel* _model; + + CubismMotionManager* _motionManager; + CubismExpressionMotionManager* _expressionManager; + CubismEyeBlink* _eyeBlink; + CubismBreath* _breath; + CubismModelMatrix* _modelMatrix; + CubismPose* _pose; + CubismTargetPoint* _dragManager; + CubismPhysics* _physics; + CubismModelUserData* _modelUserData; + + csmBool _initialized; + csmBool _updating; + csmFloat32 _opacity; + csmBool _lipSync; + csmFloat32 _lastLipSyncValue; + csmFloat32 _dragX; + csmFloat32 _dragY; + csmFloat32 _accelerationX; + csmFloat32 _accelerationY; + csmFloat32 _accelerationZ; + csmBool _mocConsistency; + csmBool _debugMode; private: - Rendering::CubismRenderer* _renderer; ///< レンダラ + Rendering::CubismRenderer* _renderer; }; }}} diff --git a/src/Motion/ACubismMotion.cpp b/src/Motion/ACubismMotion.cpp index 4668446..931fb1a 100644 --- a/src/Motion/ACubismMotion.cpp +++ b/src/Motion/ACubismMotion.cpp @@ -23,6 +23,8 @@ ACubismMotion::ACubismMotion() , _fadeOutSeconds(-1.0f) , _weight(1.0f) , _offsetSeconds(0.0f) //再生の開始時刻 + , _onBeganMotion(NULL) + , _onBeganMotionCustomData(NULL) , _onFinishedMotion(NULL) , _onFinishedMotionCustomData(NULL) { } @@ -76,6 +78,11 @@ void ACubismMotion::SetupMotionQueueEntry(CubismMotionQueueEntry* motionQueueEnt motionQueueEntry->SetEndTime((duration <= 0) ? -1 : motionQueueEntry->GetStartTime() + duration); //duration == -1 の場合はループする } + + if (this->_onBeganMotion != NULL) + { + this->_onBeganMotion(this); + } } csmFloat32 ACubismMotion::UpdateFadeWeight(CubismMotionQueueEntry* motionQueueEntry, csmFloat32 userTimeSeconds) @@ -83,6 +90,7 @@ csmFloat32 ACubismMotion::UpdateFadeWeight(CubismMotionQueueEntry* motionQueueEn if (motionQueueEntry == NULL) { CubismLogError("motionQueueEntry is null."); + return -1; } csmFloat32 fadeWeight = _weight; //現在の値と掛け合わせる割合 @@ -157,6 +165,33 @@ const csmVector& ACubismMotion::GetFiredEvent(csmFloat32 befor return _firedEventValues; } +void ACubismMotion::SetBeganMotionHandler(BeganMotionCallback onBeganMotionHandler) +{ + this->_onBeganMotion = onBeganMotionHandler; +} + +ACubismMotion::BeganMotionCallback ACubismMotion::GetBeganMotionHandler() const +{ + return this->_onBeganMotion; +} + +void ACubismMotion::SetBeganMotionCustomData(void* onBeganMotionCustomData) +{ + this->_onBeganMotionCustomData = onBeganMotionCustomData; +} + +void* ACubismMotion::GetBeganMotionCustomData() const +{ + return this->_onBeganMotionCustomData; +} + +void ACubismMotion::SetBeganMotionHandlerAndMotionCustomData(BeganMotionCallback onBeganMotionHandler, + void* onBeganMotionCustomData) +{ + this->_onBeganMotion = onBeganMotionHandler; + this->_onBeganMotionCustomData = onBeganMotionCustomData; +} + void ACubismMotion::SetFinishedMotionHandler(FinishedMotionCallback onFinishedMotionHandler) { this->_onFinishedMotion = onFinishedMotionHandler; diff --git a/src/Motion/ACubismMotion.hpp b/src/Motion/ACubismMotion.hpp index fea58e7..698d355 100644 --- a/src/Motion/ACubismMotion.hpp +++ b/src/Motion/ACubismMotion.hpp @@ -18,238 +18,245 @@ class CubismMotionQueueEntry; class CubismModel; /** - * @brief モーションの抽象基底クラス - * - * モーションの抽象基底クラス。MotionQueueManagerによってモーションの再生を管理する。 + * Abstract base class for motions.
+ * Handles the management of motion playback through the MotionQueueManager. */ class ACubismMotion { public: - /// モーション再生終了コールバック関数定義 + typedef void (*BeganMotionCallback)(ACubismMotion* self); typedef void (*FinishedMotionCallback)(ACubismMotion* self); /** - * @brief インスタンスの破棄 - * - * インスタンスを破棄する。 + * Destroys the instance. * - * @param[in] motion 破棄対象のACubismMotion + * @param motion instance to destroy */ static void Delete(ACubismMotion* motion); /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ ACubismMotion(); /** - * @brief モデルのパラメータ更新 - * - * モデルのパラメータを更新する。 + * Updates the model parameters. * - * @param[in] model 対象のモデル - * @param[in] motionQueueEntry CubismMotionQueueManagerで管理されているモーション - * @param[in] userTimeSeconds デルタ時間の積算値[秒] + * @param model model to update + * @param motionQueueEntry motion managed by the CubismMotionQueueManager + * @param userTimeSeconds current time in seconds */ void UpdateParameters(CubismModel* model, CubismMotionQueueEntry* motionQueueEntry, csmFloat32 userTimeSeconds); /** - * モーションの再生を開始するためのセットアップを行う。 + * Sets up to start the playback of the motion. * - * @param motionQueueEntry CubismMotionQueueManagerによって管理されるモーション - * @param userTimeSeconds 総再生時間(秒) + * @param motionQueueEntry motion managed by the CubismMotionQueueManager + * @param userTimeSeconds total playback time in seconds */ void SetupMotionQueueEntry(CubismMotionQueueEntry* motionQueueEntry, csmFloat32 userTimeSeconds); /** - * @brief フェードイン + * Sets the number of seconds for the motion to complete fading in. * - * フェードインの時間を設定する。 - * - * @param[in] fadeInSeconds フェードインにかかる時間[秒] + * @param fadeInSeconds number of seconds for the fade-in to complete */ void SetFadeInTime(csmFloat32 fadeInSeconds); /** - * @brief フェードアウト - * - * フェードアウトの時間を設定する。 + * Sets the number of seconds for the motion to complete fading out. * - * @param[in] fadeOutSeconds フェードアウトにかかる時間[秒] + * @param fadeOutSeconds number of seconds for the fade-out to complete */ void SetFadeOutTime(csmFloat32 fadeOutSeconds); /** - * @brief フェードアウトにかかる時間の取得 + * Returns the number of seconds for the motion to complete fading out. * - * フェードアウトにかかる時間を取得する。 - * - * @return フェードアウトにかかる時間[秒] + * @return number of seconds for the fade-out to complete */ csmFloat32 GetFadeOutTime() const; /** - * @brief フェードインにかかる時間の取得 - * - * フェードインにかかる時間を取得する。 + * Returns the number of seconds for the motion to complete fading in. * - * @return フェードインにかかる時間[秒] + * @return number of seconds for the fade-in to complete */ csmFloat32 GetFadeInTime() const; /** - * @brief モーション適用の重みの設定 + * Sets the weight during the application of the motion. * - * モーション適用の重みを設定する。 - * - * @param[in] weight 重み(0.0 - 1.0) + * @param weight weight during the application of the motion (0.0-1.0) */ void SetWeight(csmFloat32 weight); /** - * @brief モーション適用の重みの取得 - * - * モーション適用の重みを取得する。 + * Returns the weight during the application of the motion. * - * @return 重み(0.0 - 1.0) + * @return weight during the application of the motion (0.0-1.0) */ csmFloat32 GetWeight() const; /** - * @brief モーションの長さの取得 + * Returns the length of the motion. * - * モーションの長さを取得する。 + * @return length of the motion in seconds
+ * -1 if the motion is looping. * - * @return モーションの長さ[秒] - * - * @note ループのときは「-1」。 - * ループではない場合は、オーバーライドする。 - * 正の値の時は取得される時間で終了する。 - * 「-1」のときは外部から停止命令が無い限り終わらない処理となる。 + * @note When a positive value is returned, the motion ends at the obtained time.
+ * When -1 is returned, the motion is looping and does not end. */ virtual csmFloat32 GetDuration(); /** - * @brief モーションのループ1回分の長さの取得 - * - * モーションのループ1回分の長さを取得する。 + * Returns the length of one loop of the looping motion. * - * @return モーションのループ1回分の長さ[秒] + * @return length of one loop of the looping motion in seconds
+ * Same value as GetDuration() if the motion is not looping. * - * @note ループしない場合は GetDuration()と同じ値を返す。 - * ループ一回分の長さが定義できない場合(プログラム的に動き続けるサブクラスなど)の場合は「-1」を返す + * @note Returns -1 if the length of one loop of the looping motion cannot be determined. */ virtual csmFloat32 GetLoopDuration(); /** - * @brief モーション再生の開始時刻の設定 + * Sets the number of seconds to start the motion playback. * - * モーション再生の開始時刻を設定する。 - * - * @param[in] offsetSeconds モーション再生の開始時刻[秒] + * @param offsetSeconds number of seconds to start the motion playback */ void SetOffsetTime(csmFloat32 offsetSeconds); /** - * @brief モデルのパラメータ更新 - * - * イベント発火のチェック。 - * 入力する時間は呼ばれるモーションタイミングを0とした秒数で行う。 - * - * @param[in] beforeCheckTimeSeconds 前回のイベントチェック時間[秒] - * @param[in] motionTimeSeconds 今回の再生時間[秒] - */ + * Returns the triggered user data events. + * + * @param beforeCheckTimeSeconds previous playback time in seconds + * @param motionTimeSeconds current playback time in seconds + * + * @return instance of the collection of triggered user data events + * + * @note The input times should be in seconds, with the motion timing set to zero. + */ virtual const csmVector& GetFiredEvent(csmFloat32 beforeCheckTimeSeconds, csmFloat32 motionTimeSeconds); + /** + * Sets the motion playback completion callback. + * + * Not called in the following cases: + * 1. When the motion being played is set as "loop" + * 2. When NULL is set as the callback + * + * @param onBeganMotionHandler Motion playback start callback function + */ + void SetBeganMotionHandler(BeganMotionCallback onBeganMotionHandler); + + /** + * Sets the motion playback start callback. + * + * @return Set motion playback start callback function. NULL if no function is set. + */ + BeganMotionCallback GetBeganMotionHandler() const; /** - * @brief モーション再生終了コールバックの登録 + * Sets the user-defined data. * - * モーション再生終了コールバックを登録する。 - * IsFinishedフラグを設定するタイミングで呼び出される。 - * 以下の状態の際には呼び出されない: - * 1. 再生中のモーションが「ループ」として設定されているとき - * 2. コールバックにNULLが登録されているとき + * @param onBeganMotionCustomData User-defined data + */ + void SetBeganMotionCustomData(void* onBeganMotionCustomData); + + /** + * Returns the user-defined data. * - * @param[in] onFinishedMotionHandler モーション再生終了コールバック関数 + * @return Set user-defined data. */ - void SetFinishedMotionHandler(FinishedMotionCallback onFinishedMotionHandler); + void* GetBeganMotionCustomData() const; /** - * @brief モーション再生終了コールバックの取得 + * Sets the motion playback start callback. * - * モーション再生終了コールバックを取得する。 + * Not called in the following cases: + * 1. When the motion being played is set as "loop" + * 2. When NULL is set as the callback * - * @return 登録されているモーション再生終了コールバック関数。NULLのとき、関数は何も登録されていない。 + * @param onBeganMotionHandler Motion playback start callback function + * @param onBeganMotionCustomData User-defined data */ - FinishedMotionCallback GetFinishedMotionHandler(); + void SetBeganMotionHandlerAndMotionCustomData(BeganMotionCallback onBeganMotionHandler, void* onBeganMotionCustomData); /** - * @brief ユーザー任意データの登録 + * Sets the callback function for when motion playback ends. * - * ユーザー任意データを登録します。 + * @param onFinishedMotionHandler callback function for when motion playback ends * - * @param[in] onFinishedMotionCustomData ユーザー任意データ + * @note The callback function is called at the timing of setting the IsFinished flag.
+ * Not called in the following states: + * 1. When the playing motion is a loop motion + * 2. When the callback function is not set */ - void SetFinishedMotionCustomData(void* onFinishedMotionCustomData); + void SetFinishedMotionHandler(FinishedMotionCallback onFinishedMotionHandler); + + /** + * Returns the callback function for when motion playback ends. + * + * @return set callback function for when motion playback ends + */ + FinishedMotionCallback GetFinishedMotionHandler(); /** - * @brief ユーザー任意データの取得 + * Sets the user-defined data. * - * ユーザー任意データを取得します。 + * @param onFinishedMotionCustomData User-defined data + */ + void SetFinishedMotionCustomData(void* onFinishedMotionCustomData); + + /** + * Returns the user-defined data. * - * @return 登録されているユーザー任意データ。 + * @return Set user-defined data. */ void* GetFinishedMotionCustomData(); /** - * @brief モーション再生終了コールバックとユーザー任意データの登録 + * Sets the motion playback completion callback. * - * モーション再生終了コールバックを登録する。 - * IsFinishedフラグを設定するタイミングで呼び出される。 - * 以下の状態の際には呼び出されない: - * 1. 再生中のモーションが「ループ」として設定されているとき - * 2. コールバックにNULLが登録されているとき + * Called when the IsFinished flag is set. + * Not called in the following cases: + * 1. When the motion being played is set as "loop" + * 2. When NULL is set as the callback * - * @param[in] onFinishedMotionHandler モーション再生終了コールバック関数 - * @param[in] onFinishedMotionCustomData ユーザー任意データ + * @param onFinishedMotionHandler Motion playback completion callback function + * @param onFinishedMotionCustomData User-defined data */ void SetFinishedMotionHandlerAndMotionCustomData(FinishedMotionCallback onFinishedMotionHandler, void* onFinishedMotionCustomData); /** - * @brief 透明度のカーブが存在するかどうかを確認する + * Checks whether there is an opacity curve. * - * @retval true -> キーが存在する - * @retval false -> キーが存在しない + * @return true if the key exists; otherwise false. */ virtual csmBool IsExistModelOpacity() const; /** - * @brief 透明度のカーブのインデックスを返す - * - * - * @return success:透明度のカーブのインデックス - */ + * Returns the index of the opacity curve. + * + * @return index of the opacity curve on success + */ virtual csmInt32 GetModelOpacityIndex() const; /** - * @brief 透明度のIdを返す + * Returns the ID of the opacity. * - * - * @return success:透明度のId + * @return ID of the opacity on success */ virtual CubismIdHandle GetModelOpacityId(csmInt32 index); /** - * @brief モデルのウェイト更新 + * Updates the fade weight of the motion. * - * モーションのウェイトを更新する。 + * @param motionQueueEntry motion managed by the CubismMotionQueueManager + * @param userTimeSeconds cumulative delta time in seconds * - * @param[in] motionQueueEntry CubismMotionQueueManagerで管理されているモーション - * @param[in] userTimeSeconds デルタ時間の積算値[秒] + * @return true if the fade weight of the motion is updated; otherwise false. */ csmFloat32 UpdateFadeWeight(CubismMotionQueueEntry* motionQueueEntry, csmFloat32 userTimeSeconds); @@ -259,46 +266,23 @@ class ACubismMotion ACubismMotion& operator=(const ACubismMotion&); protected: - /** - * @brief デストラクタ - * - * デストラクタ。 - */ virtual ~ACubismMotion(); - /** - * - * @brief 指定時間の透明度の値を返す - * - * @param[in] motionTimeSeconds 現在の再生時間[秒] - * - * @return success:モーションの当該時間におけるOpacityの値 - * - * @note 更新後の値を取るにはUpdateParameters() の後に呼び出す。 - */ virtual csmFloat32 GetModelOpacityValue() const; - /** - * @brief モデルのパラメータの更新の実行 - * - * モデルのパラメータ更新を実行する。 - * - * @param[in] model 対象のモデル - * @param[in] userTimeSeconds デルタ時間の積算値[秒] - * @param[in] weight モーションの重み - * @param[in] motionQueueEntry CubismMotionQueueManagerで管理されているモーション - */ virtual void DoUpdateParameters(CubismModel* model, csmFloat32 userTimeSeconds, csmFloat32 weight, CubismMotionQueueEntry* motionQueueEntry) = 0; - csmFloat32 _fadeInSeconds; ///< フェードインにかかる時間[秒] - csmFloat32 _fadeOutSeconds; ///< フェードアウトにかかる時間[秒] - csmFloat32 _weight; ///< モーションの重み - csmFloat32 _offsetSeconds; ///< モーション再生の開始時刻[秒] + csmFloat32 _fadeInSeconds; + csmFloat32 _fadeOutSeconds; + csmFloat32 _weight; + csmFloat32 _offsetSeconds; csmVector _firedEventValues; - FinishedMotionCallback _onFinishedMotion; ///< モーション再生終了コールバック関数ポインタ - void* _onFinishedMotionCustomData; ///< モーション再生終了コールバックに戻されるデータ + BeganMotionCallback _onBeganMotion; + void* _onBeganMotionCustomData; + FinishedMotionCallback _onFinishedMotion; + void* _onFinishedMotionCustomData; }; }}} diff --git a/src/Motion/CubismExpressionMotion.hpp b/src/Motion/CubismExpressionMotion.hpp index b877981..80094b1 100644 --- a/src/Motion/CubismExpressionMotion.hpp +++ b/src/Motion/CubismExpressionMotion.hpp @@ -15,142 +15,97 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief 表情のモーション - * - * 表情のモーションクラス。 + * Handles facial expression motions. */ class CubismExpressionMotion : public ACubismMotion { public: /** - * @brief 表情パラメータ値の計算方式 - * + * Blending calculation method for facial expression parameters */ enum ExpressionBlendType { - Additive = 0, ///< 加算 - Multiply = 1, ///< 乗算 - Overwrite = 2 ///< 上書き + Additive = 0, ///< Addition + Multiply = 1, ///< Multiplication + Overwrite = 2 ///< Overwrite }; /** - * @brief 表情のパラメータ情報 - * - * 表情のパラメータ情報の構造体。 + * Data for facial expression parameter information */ struct ExpressionParameter { - CubismIdHandle ParameterId; ///< パラメータID - ExpressionBlendType BlendType; ///< パラメータの演算種類 - csmFloat32 Value; ///< 値 + CubismIdHandle ParameterId; ///< Attached parameter ID + ExpressionBlendType BlendType; ///< Blending calculation method for facial expression parameters attached to the parameter + csmFloat32 Value; ///< Parameter value }; /** - * @brief インスタンスの作成 + * Makes an instance. * - * インスタンスを作成する。 + * @param buf buffer containing the loaded facial expression settings file + * @param size size of the buffer in bytes * - * @param[in] buf expファイルが読み込まれているバッファ - * @param[in] size バッファのサイズ - * @return 作成されたインスタンス + * @return created instance */ static CubismExpressionMotion* Create(const csmByte* buf, csmSizeInt size); /** - * @brief モデルのパラメータの更新の実行 - * - * モデルのパラメータ更新を実行する。 - * - * @param[in] model 対象のモデル - * @param[in] userTimeSeconds デルタ時間の積算値[秒] - * @param[in] weight モーションの重み - * @param[in] motionQueueEntry CubismMotionQueueManagerで管理されているモーション - */ + * Updates the model parameters. + * + * @param model model to update + * @param userTimeSeconds current time in seconds + * @param weight weight during the application of the motion (0.0-1.0) + * @param motionQueueEntry motion managed by the CubismMotionQueueManager + */ virtual void DoUpdateParameters(CubismModel* model, csmFloat32 userTimeSeconds, csmFloat32 weight, CubismMotionQueueEntry* motionQueueEntry); /** - * @brief 表情によるモデルのパラメータの計算 - * - * モデルの表情に関するパラメータを計算する。 - * - * @param[in] model 対象のモデル - * @param[in] userTimeSeconds デルタ時間の積算値[秒] - * @param[in] motionQueueEntry CubismMotionQueueManagerで管理されているモーション - * @param[in] expressionParameterValues モデルに適用する各パラメータの値 - * @param[in] expressionIndex 表情のインデックス - */ + * Computes the parameters related to the model's facial expressions. + * + * @param model model to update + * @param userTimeSeconds cumulative delta time in seconds + * @param motionQueueEntry motion managed by the CubismMotionQueueManager + * @param expressionParameterValues values of each parameter to be applied to the model + * @param expressionIndex index of the facial expression + */ void CalculateExpressionParameters(CubismModel* model, csmFloat32 userTimeSeconds, CubismMotionQueueEntry* motionQueueEntry, csmVector* expressionParameterValues, csmInt32 expressionIndex, csmFloat32 fadeWeight); /** - * @brief 表情が参照しているパラメータを取得 - * - * 表情が参照しているパラメータを取得する。 + * Returns the parameters referenced by the facial expression. */ csmVector GetExpressionParameters(); /** - * @brief 表情のフェードの値を取得 - * - * 現在の表情のフェードのウェイト値を取得する。 + * Returns the current fade weight value of the facial expression. * - * @return 表情のフェードのウェイト値 + * @return fade weight value of the facial expression * - * @deprecated CubismExpressionMotion._fadeWeightが削除予定のため非推奨 - * CubismExpressionMotionManager.getFadeWeight(int index) を使用してください。 + * @deprecated Not recommended due to the planned removal of CubismExpressionMotion._fadeWeight. + * Use CubismExpressionMotionManager.getFadeWeight(int index) instead. * - * @see CubismExpressionMotionManager#GetFadeWeight(int index) + * @see CubismExpressionMotionManager#getFadeWeight(int index) */ csmFloat32 GetFadeWeight(); - static const csmFloat32 DefaultAdditiveValue; ///< 加算適用の初期値 - static const csmFloat32 DefaultMultiplyValue; ///< 乗算適用の初期値 + static const csmFloat32 DefaultAdditiveValue; + static const csmFloat32 DefaultMultiplyValue; protected: - /** - * @brief コンストラクタ - * - * コンストラクタ。 - */ CubismExpressionMotion(); - /** - * @brief デストラクタ - * - * デストラクタ。 - */ virtual ~CubismExpressionMotion(); - /** - * @brief exp3.jsonのパース - * - * exp3.jsonをパースする。 - * - * @param[in] exp3Json exp3.jsonが読み込まれているバッファ - * @param[in] size バッファのサイズ - */ void Parse(const csmByte* exp3Json, csmSizeInt size); - csmVector _parameters; ///< 表情が参照しているパラメータ一覧 + csmVector _parameters; private: - /** - * @brief ブレンド計算 - * - * 入力された値でブレンド計算をする。 - * - * @param[in] source 現在の値 - * @param[in] destination 適用する値 - */ csmFloat32 CalculateValue(csmFloat32 source, csmFloat32 destination, csmFloat32 fadeWeight); - /** - * 表情の現在のウェイト - * - * @deprecated 不具合を引き起こす要因となるため非推奨。 - */ csmFloat32 _fadeWeight; }; diff --git a/src/Motion/CubismExpressionMotionManager.cpp b/src/Motion/CubismExpressionMotionManager.cpp index d0d5616..adfaddf 100644 --- a/src/Motion/CubismExpressionMotionManager.cpp +++ b/src/Motion/CubismExpressionMotionManager.cpp @@ -17,6 +17,7 @@ CubismExpressionMotionManager::CubismExpressionMotionManager() : _currentPriority(0) , _reservePriority(0) , _expressionParameterValues(CSM_NEW csmVector()) + , _fadeWeights(CSM_NEW csmVector()) { } CubismExpressionMotionManager::~CubismExpressionMotionManager() @@ -28,34 +29,50 @@ CubismExpressionMotionManager::~CubismExpressionMotionManager() _expressionParameterValues = NULL; } - _fadeWeights.Clear(); + if (_fadeWeights) + { + CSM_DELETE(_fadeWeights); + + _fadeWeights = NULL; + } } csmInt32 CubismExpressionMotionManager::GetCurrentPriority() const { +#if _DEBUG + CubismLogWarning("CubismExpressionMotionManager::GetCurrentPriority() is deprecated because a priority value is not actually used during expression motion playback."); +#endif return _currentPriority; } csmInt32 CubismExpressionMotionManager::GetReservePriority() const { +#if _DEBUG + CubismLogWarning("CubismExpressionMotionManager::GetReservePriority() is deprecated because a priority value is not actually used during expression motion playback."); +#endif return _reservePriority; } void CubismExpressionMotionManager::SetReservePriority(csmInt32 priority) { +#if _DEBUG + CubismLogWarning("CubismExpressionMotionManager::SetReservePriority() is deprecated because a priority value is not actually used during expression motion playback."); +#endif _reservePriority = priority; } CubismMotionQueueEntryHandle CubismExpressionMotionManager::StartMotionPriority(ACubismMotion* motion, csmBool autoDelete, csmInt32 priority) { +#if _DEBUG + CubismLogWarning("CubismExpressionMotionManager::StartMotionPriority() is deprecated because a priority value is not actually used during expression motion playback."); +#endif + if (priority == _reservePriority) { _reservePriority = 0; // 予約を解除 } _currentPriority = priority; // 再生中モーションの優先度を設定 - _fadeWeights.PushBack(0.0f); - return CubismMotionQueueManager::StartMotion(motion, autoDelete); } @@ -68,6 +85,11 @@ csmBool CubismExpressionMotionManager::UpdateMotion(CubismModel* model, csmFloat csmFloat32 expressionWeight = 0.0f; csmInt32 expressionIndex = 0; + while (_fadeWeights->GetSize() < motions->GetSize()) + { + _fadeWeights->PushBack(0.0f); + } + // ------- 処理を行う -------- // 既にモーションがあれば終了フラグを立てる for (csmVector::iterator ite = motions->Begin(); ite != motions->End();) @@ -130,9 +152,10 @@ csmBool CubismExpressionMotionManager::UpdateMotion(CubismModel* model, csmFloat // ------ 値を計算する ------ expressionMotion->SetupMotionQueueEntry(motionQueueEntry, _userTimeSeconds); - _fadeWeights[expressionIndex] = expressionMotion->UpdateFadeWeight(motionQueueEntry, _userTimeSeconds); + + SetFadeWeight(expressionIndex, expressionMotion->UpdateFadeWeight(motionQueueEntry, _userTimeSeconds)); expressionMotion->CalculateExpressionParameters(model, _userTimeSeconds, motionQueueEntry, - _expressionParameterValues, expressionIndex, _fadeWeights[expressionIndex]); + _expressionParameterValues, expressionIndex, GetFadeWeight(expressionIndex)); expressionWeight += expressionMotion->GetFadeInTime() == 0.0f ? 1.0f @@ -153,10 +176,8 @@ csmBool CubismExpressionMotionManager::UpdateMotion(CubismModel* model, csmFloat // ----- 最新のExpressionのフェードが完了していればそれ以前を削除する ------ if (motions->GetSize() > 1) { - CubismExpressionMotion* expressionMotion = - (CubismExpressionMotion*)(motions->At(motions->GetSize() - 1))->GetCubismMotion(); + csmFloat32 latestFadeWeight = GetFadeWeight(_fadeWeights->GetSize() - 1); - csmFloat32 latestFadeWeight = _fadeWeights[_fadeWeights.GetSize() - 1]; if (latestFadeWeight >= 1.0f) { // 配列の最後の要素は削除しない @@ -165,7 +186,7 @@ csmBool CubismExpressionMotionManager::UpdateMotion(CubismModel* model, csmFloat CubismMotionQueueEntry* motionQueueEntry = motions->At(i); CSM_DELETE(motionQueueEntry); motions->Remove(i); - _fadeWeights.Remove(i); + _fadeWeights->Remove(i); } } } @@ -191,7 +212,24 @@ csmBool CubismExpressionMotionManager::UpdateMotion(CubismModel* model, csmFloat csmFloat32 CubismExpressionMotionManager::GetFadeWeight(csmInt32 index) { - return _fadeWeights[index]; + if (index < 0 || _fadeWeights->GetSize() < 1 || _fadeWeights->GetSize() <= index) + { + CubismLogWarning("Failed to get the fade weight value. The element at that index does not exist."); + return -1; + } + + return _fadeWeights->At(index); +} + +void CubismExpressionMotionManager::SetFadeWeight(csmInt32 index, csmFloat32 expressionFadeWeight) +{ + if (index < 0 || _fadeWeights->GetSize() < 1 || _fadeWeights->GetSize() <= index) + { + CubismLogWarning("Failed to set the fade weight value. The element at that index does not exist."); + return; + } + + _fadeWeights->At(index) = expressionFadeWeight; } }}} diff --git a/src/Motion/CubismExpressionMotionManager.hpp b/src/Motion/CubismExpressionMotionManager.hpp index 209d66f..34c7c58 100644 --- a/src/Motion/CubismExpressionMotionManager.hpp +++ b/src/Motion/CubismExpressionMotionManager.hpp @@ -14,108 +14,108 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief 表情モーションの管理 - * - * 表情モーションの管理を行うクラス。 + * Handles the management of facial expression motions. */ class CubismExpressionMotionManager : public CubismMotionQueueManager { public: /** - * @brief パラメータに適用する表情の値を持たせる構造体 + * Structure that holds facial expression values to apply to parameters */ struct ExpressionParameterValue { - CubismIdHandle ParameterId; ///< パラメータID - csmFloat32 AdditiveValue; ///< 加算値 - csmFloat32 MultiplyValue; ///< 乗算値 - csmFloat32 OverwriteValue; ///< 上書き値 + CubismIdHandle ParameterId; ///< Parameter ID + csmFloat32 AdditiveValue; ///< Added value + csmFloat32 MultiplyValue; ///< Multiplied value + csmFloat32 OverwriteValue; ///< Overwritten value }; /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismExpressionMotionManager(); /** - * @brief デストラクタ - * - * デストラクタ。 + * Destructor */ virtual ~CubismExpressionMotionManager(); /** - * @brief 再生中のモーションの優先度の取得 + * Returns the priority of the playing facial expression motion. * - * 再生中の表情モーションの優先度の取得する。 + * @deprecated This function is deprecated because a priority value is not actually used during expression motion playback. * - * @return 表情モーションの優先度 + * @return priority of the facial expression motion */ csmInt32 GetCurrentPriority() const; /** - * @brief 予約中のモーションの優先度の取得 + * Returns the priority of the reserved facial expression motion. * - * 予約中の表情モーションの優先度を取得する。 + * @deprecated This function is deprecated because a priority value is not actually used during expression motion playback. * - * @return 表情モーションの優先度 + * @return priority of the facial expression motion */ csmInt32 GetReservePriority() const; /** - * @brief 予約中のモーションの優先度の設定 + * Sets the priority of the reserved facial expression motion. * - * 予約中の表情モーションの優先度を設定する。 + * @deprecated This function is deprecated because a priority value is not actually used during expression motion playback. * - * @param[in] priority 優先度 + * @param[in] priority priority to set */ void SetReservePriority(csmInt32 priority); /** - * @brief 優先度を設定して表情モーションの開始 + * Starts the facial expression motion with the specified priority. * - * 優先度を設定して表情モーションを開始する。 + * @deprecated This function is deprecated because a priority value is not actually used during expression motion playback. + * Use CubismMotionQueueManager::StartMotion(ACubismMotion* motion, csmBool autoDelete) instead. * - * @param[in] motion モーション - * @param[in] autoDelete 再生が終了したモーションのインスタンスを削除するならtrue - * @param[in] priority 優先度 - * @return 開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」 + * @param[in] motion motion + * @param[in] autoDelete true to delete the instance of the motion when playback ends + * @param[in] priority priority + * @return identifier of the started motion. Use this as an argument to IsFinished() to determine if the individual motion has finished. Returns -1 if the motion could not be started. */ CubismMotionQueueEntryHandle StartMotionPriority(ACubismMotion* motion, csmBool autoDelete, csmInt32 priority); /** - * @brief モーションの更新 + * Updates the facial expression motion and reflects the parameter values on the model. * - * 表情モーションを更新して、モデルにパラメータ値を反映する。 - * - * @param[in] model 対象のモデル - * @param[in] deltaTimeSeconds デルタ時間[秒] - * @retval true 更新されている - * @retval false 更新されていない + * @param[in] model target model + * @param[in] deltaTimeSeconds delta time in seconds + * @return true if updated; otherwise false. */ csmBool UpdateMotion(CubismModel* model, csmFloat32 deltaTimeSeconds); /** - * 現在の表情のフェードのウェイト値を取得する。 - * - * @param index 取得する表情モーションのインデックス + * @param index index of the facial expression motion to retrieve * - * @return 表情のフェードのウェイト値 + * @return fade weight value of the facial expression */ csmFloat32 GetFadeWeight(csmInt32 index); private: - // モデルに適用する各パラメータの値 + /** + * @brief Set the weight of expression fade + * + * Set the weight of expression fade. + * + * @param[in] index Index of the expression motion to be set + * @param[in] expressionFadeWeight Weight value of expression fade + */ + void SetFadeWeight(csmInt32 index, csmFloat32 expressionFadeWeight); + + // Values of each parameter to be applied to the model csmVector* _expressionParameterValues; - // 再生中の表情のウェイト - csmVector _fadeWeights; + // Weights of the currently playing expression + csmVector* _fadeWeights; - csmInt32 _currentPriority; ///< 現在再生中のモーションの優先度 - csmInt32 _reservePriority; ///< 再生予定のモーションの優先度。再生中は0になる。モーションファイルを別スレッドで読み込むときの機能。 + csmInt32 _currentPriority; ///< @deprecated This variable is deprecated because a priority value is not actually used during expression motion playback. + csmInt32 _reservePriority; ///< @deprecated This variable is deprecated because a priority value is not actually used during expression motion playback. }; }}} diff --git a/src/Motion/CubismMotion.cpp b/src/Motion/CubismMotion.cpp index 0ddd304..031f854 100644 --- a/src/Motion/CubismMotion.cpp +++ b/src/Motion/CubismMotion.cpp @@ -244,7 +244,7 @@ CubismMotion::~CubismMotion() CSM_DELETE(_motionData); } -CubismMotion* CubismMotion::Create(const csmByte* buffer, csmSizeInt size, FinishedMotionCallback onFinishedMotionHandler) +CubismMotion* CubismMotion::Create(const csmByte* buffer, csmSizeInt size, FinishedMotionCallback onFinishedMotionHandler, BeganMotionCallback onBeganMotionHandler) { CubismMotion* ret = CSM_NEW CubismMotion(); @@ -252,6 +252,7 @@ CubismMotion* CubismMotion::Create(const csmByte* buffer, csmSizeInt size, Finis ret->_sourceFrameRate = ret->_motionData->Fps; ret->_loopDurationSeconds = ret->_motionData->Duration; ret->_onFinishedMotion = onFinishedMotionHandler; + ret->_onBeganMotion = onBeganMotionHandler; // NOTE: Editorではループありのモーション書き出しは非対応 // ret->_loop = (ret->_motionData->Loop > 0); @@ -533,6 +534,10 @@ void CubismMotion::Parse(const csmByte* motionJson, const csmSizeInt size) return; } +#if _DEBUG + json->HasConsistency(); +#endif // _DEBUG + _motionData->Duration = json->GetMotionDuration(); _motionData->Loop = json->IsMotionLoop(); _motionData->CurveCount = json->GetMotionCurveCount(); diff --git a/src/Motion/CubismMotion.hpp b/src/Motion/CubismMotion.hpp index 5228c75..6a298c9 100644 --- a/src/Motion/CubismMotion.hpp +++ b/src/Motion/CubismMotion.hpp @@ -18,236 +18,183 @@ class CubismMotionQueueEntry; struct CubismMotionData; /** - * @brief モーションクラス - * - * モーションのクラス。 + * Handles motions. */ class CubismMotion : public ACubismMotion { public: /** - * @brief インスタンスの生成 + * Makes an instance. * - * インスタンスを作成する。 + * @param buf buffer containing the loaded motion file + * @param size size of the buffer in bytes + * @param onFinishedMotionHandler callback function for when motion playback ends * - * @param[in] buffer motion3.jsonが読み込まれているバッファ - * @param[in] size バッファのサイズ - * @param[in] onFinishedMotionHandler モーション再生終了時に呼び出されるコールバック関数。NULLの場合、呼び出されない。 - * @return 作成されたインスタンス + * @return created instance */ - static CubismMotion* Create(const csmByte* buffer, csmSizeInt size, FinishedMotionCallback onFinishedMotionHandler = NULL); + static CubismMotion* Create(const csmByte* buffer, csmSizeInt size, FinishedMotionCallback onFinishedMotionHandler = NULL, BeganMotionCallback onBeganMotionHandler = NULL); /** - * @brief モデルのパラメータの更新の実行 - * - * モデルのパラメータ更新を実行する。 - * - * @param[in] model 対象のモデル - * @param[in] userTimeSeconds 現在の時刻[秒] - * @param[in] fadeWeight モーションの重み - * @param[in] motionQueueEntry CubismMotionQueueManagerで管理されているモーション - */ + * Updates the model parameters. + * + * @param model model to update + * @param userTimeSeconds current time in seconds + * @param weight weight during the application of the motion (0.0-1.0) + * @param motionQueueEntry motion managed by the CubismMotionQueueManager + */ virtual void DoUpdateParameters(CubismModel* model, csmFloat32 userTimeSeconds, csmFloat32 fadeWeight, CubismMotionQueueEntry* motionQueueEntry); /** - * @brirf ループ情報の設定 + * Sets whether the motion should loop. * - * ループ情報を設定する。 - * - * @param[in] loop ループ情報 + * @param loop true to set the motion to loop */ void IsLoop(csmBool loop); /** - * @brief ループ情報の取得 - * - * モーションがループするかどうか? + * Checks whether the motion is set to loop. * - * @retval true ループする - * @retval false ループしない + * @return true if the motion is set to loop; otherwise false. */ csmBool IsLoop() const; /** - * @brief ループ時のフェードイン情報の設定 - * - * ループ時のフェードイン情報を設定する。 + * Sets whether to perform fade-in for looping motion. * - * @param[in] loopFadeIn ループ時のフェードイン情報 + * @param loopFadeIn true to perform fade-in for looping motion */ void IsLoopFadeIn(csmBool loopFadeIn); /** - * @brief ループ時のフェードイン情報の取得 + * Checks the setting for fade-in of looping motion. * - * ループ時にフェードインするかどうか? - * - * @retval true する - * @retval false しない + * @return true if fade-in for looping motion is set; otherwise false. */ csmBool IsLoopFadeIn() const; /** - * @brief モーションの長さの取得 + * Returns the length of the motion. * - * モーションの長さを取得する。 + * @return length of the motion in seconds
+ * -1 if the motion is looping. * - * @return モーションの長さ[秒] + * @note When a positive value is returned, the motion ends at the obtained time.
+ * When -1 is returned, the motion is looping and does not end. */ virtual csmFloat32 GetDuration(); /** - * @brief モーションのループ時の長さの取得 + * Returns the length of one loop of the looping motion. * - * モーションのループ時の長さを取得する。 + * @return length of one loop of the looping motion in seconds
+ * Same value as GetDuration() if the motion is not looping. * - * @return モーションのループ時の長さ[秒] + * @note Returns -1 if the length of one loop of the looping motion cannot be determined. */ virtual csmFloat32 GetLoopDuration(); /** - * @brief パラメータに対するフェードインの時間の設定 - * - * パラメータに対するフェードインの時間を設定する。 + * Sets the number of seconds for the motion parameter to complete fading in. * - * @param[in] parameterId パラメータID - * @param[in] value フェードインにかかる時間[秒] + * @param parameterId parameter ID + * @param value number of seconds for the fade-in to complete */ void SetParameterFadeInTime(CubismIdHandle parameterId, csmFloat32 value); /** - * @brief パラメータに対するフェードアウトの時間の設定 - * - * パラメータに対するフェードアウトの時間を設定する。 - * - * @param[in] parameterId パラメータID - * @param[in] value フェードアウトにかかる時間[秒] - */ + * Sets the number of seconds for the motion parameter to complete fading out. + * + * @param parameterId parameter ID + * @param value number of seconds for the fade-out to complete + */ void SetParameterFadeOutTime(CubismIdHandle parameterId, csmFloat32 value); /** - * @brief パラメータに対するフェードインの時間の取得 - * - * パラメータに対するフェードインの時間を取得する。 - * - * @param[in] parameterId パラメータID - * @return フェードインにかかる時間[秒] - */ + * Sets the number of seconds for the motion parameter to complete fading in. + * + * @param parameterId parameter ID + * @param value number of seconds for the fade-in to complete + */ csmFloat32 GetParameterFadeInTime(CubismIdHandle parameterId) const; /** - * @brief パラメータに対するフェードアウトの時間の取得 - * - * パラメータに対するフェードアウトの時間を取得する。 - * - * @param[in] parameterId パラメータID - * @return フェードアウトにかかる時間[秒] - */ + * Sets the number of seconds for the motion parameter to complete fading out. + * + * @param parameterId parameter ID + * @param value number of seconds for the fade-out to complete + */ csmFloat32 GetParameterFadeOutTime(CubismIdHandle parameterId) const; /** - * @brief 自動エフェクトがかかっているパラメータIDリストの設定 + * Sets the collections of parameter IDs associated with the eye blink and lip sync settings. * - * 自動エフェクトがかかっているパラメータIDリストを設定する。 - * - * @param[in] eyeBlinkParameterIds 自動まばたきがかかっているパラメータIDのリスト - * @param[in] lipSyncParameterIds リップシンクがかかっているパラメータIDのリスト + * @param eyeBlinkParameterIds collection of parameter IDs associated with the eye blink settings + * @param lipSyncParameterIds collection of parameter IDs associated with the lip sync settings */ void SetEffectIds(const csmVector& eyeBlinkParameterIds, const csmVector& lipSyncParameterIds); /** - * @brief モデルのパラメータ更新 - * - * イベント発火のチェック。 - * 入力する時間は呼ばれるモーションタイミングを0とした秒数で行う。 - * - * @param[in] beforeCheckTimeSeconds 前回のイベントチェック時間[秒] - * @param[in] motionTimeSeconds 今回の再生時間[秒] - */ + * Returns the triggered user data events. + * + * @param beforeCheckTimeSeconds previous playback time in seconds + * @param motionTimeSeconds current playback time in seconds + * + * @return instance of the collection of triggered user data events + * + * @note The input times should be in seconds, with the motion timing set to zero. + */ virtual const csmVector& GetFiredEvent(csmFloat32 beforeCheckTimeSeconds, csmFloat32 motionTimeSeconds); /** - * @brief 透明度のカーブが存在するかどうかを確認する - * - * @retval true -> キーが存在する - * @retval false -> キーが存在しない - */ + * Checks whether there is an opacity curve. + * + * @return true if the key exists; otherwise false. + */ csmBool IsExistModelOpacity() const; /** - * @brief 透明度のカーブのインデックスを返す - * - * - * @return success:透明度のカーブのインデックス - */ + * Returns the index of the opacity curve. + * + * @return index of the opacity curve on success + */ csmInt32 GetModelOpacityIndex() const; /** - * @brief 透明度のIdを返す - * - * - * @return success:透明度のId - */ + * Returns the ID of the opacity. + * + * @return ID of the opacity on success + */ CubismIdHandle GetModelOpacityId(csmInt32 index); protected: - /** - * - * @brief 透明度の値を返す - * - * @param[in] motionTimeSeconds 現在の再生時間[秒](未利用) - * - * @return success:モーションの現在時間のOpacityの値 - * - * @note 更新後の値を取るにはUpdateParameters() の後に呼び出す。 - */ csmFloat32 GetModelOpacityValue() const; private: - /** - * @brief コンストラクタ - * - * コンストラクタ。 - */ CubismMotion(); - /** - * @brief デストラクタ - * - * デストラクタ。 - */ virtual ~CubismMotion(); - // Prevention of copy Constructor CubismMotion(const CubismMotion&); CubismMotion& operator=(const CubismMotion&); - /** - * @brief motion3.jsonのパース - * - * motion3.jsonをパースする。 - * - * @param[in] motionJson motion3.jsonが読み込まれているバッファ - * @param[in] size バッファのサイズ - */ void Parse(const csmByte* motionJson, const csmSizeInt size); - csmFloat32 _sourceFrameRate; ///< ロードしたファイルのFPS。記述が無ければデフォルト値15fpsとなる - csmFloat32 _loopDurationSeconds; ///< mtnファイルで定義される一連のモーションの長さ - csmBool _isLoop; ///< ループするか? - csmBool _isLoopFadeIn; ///< ループ時にフェードインが有効かどうかのフラグ。初期値では有効。 - csmFloat32 _lastWeight; ///< 最後に設定された重み + csmFloat32 _sourceFrameRate; + csmFloat32 _loopDurationSeconds; + csmBool _isLoop; + csmBool _isLoopFadeIn; + csmFloat32 _lastWeight; - CubismMotionData* _motionData; ///< 実際のモーションデータ本体 + CubismMotionData* _motionData; - csmVector _eyeBlinkParameterIds; ///< 自動まばたきを適用するパラメータIDハンドルのリスト。 モデル(モデルセッティング)とパラメータを対応付ける。 - csmVector _lipSyncParameterIds; ///< リップシンクを適用するパラメータIDハンドルのリスト。 モデル(モデルセッティング)とパラメータを対応付ける。 + csmVector _eyeBlinkParameterIds; + csmVector _lipSyncParameterIds; - CubismIdHandle _modelCurveIdEyeBlink; ///< モデルが持つ自動まばたき用パラメータIDのハンドル。 モデルとモーションを対応付ける。 - CubismIdHandle _modelCurveIdLipSync; ///< モデルが持つリップシンク用パラメータIDのハンドル。 モデルとモーションを対応付ける。 - CubismIdHandle _modelCurveIdOpacity; ///< モデルが持つ不透明度用パラメータIDのハンドル。 モデルとモーションを対応付ける。 + CubismIdHandle _modelCurveIdEyeBlink; + CubismIdHandle _modelCurveIdLipSync; + CubismIdHandle _modelCurveIdOpacity; - csmFloat32 _modelOpacity; ///< モーションから取得した不透明度 + csmFloat32 _modelOpacity; }; }}} diff --git a/src/Motion/CubismMotionInternal.hpp b/src/Motion/CubismMotionInternal.hpp index 2d45227..c763917 100644 --- a/src/Motion/CubismMotionInternal.hpp +++ b/src/Motion/CubismMotionInternal.hpp @@ -12,69 +12,58 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief モーションカーブの種類 - * - * モーションカーブの種類。 + * Types of motion curve application targets */ enum CubismMotionCurveTarget { - CubismMotionCurveTarget_Model, ///< モデルに対して - CubismMotionCurveTarget_Parameter, ///< パラメータに対して - CubismMotionCurveTarget_PartOpacity ///< パーツの不透明度に対して + CubismMotionCurveTarget_Model, ///< Applied to model + CubismMotionCurveTarget_Parameter, ///< Applied to parameter + CubismMotionCurveTarget_PartOpacity ///< Applied to part opacity }; - /** - * @brief モーションカーブのセグメントの種類 - * - * モーションカーブのセグメントの種類。 + * Types of motion curve segments */ enum CubismMotionSegmentType { - CubismMotionSegmentType_Linear = 0, ///< リニア - CubismMotionSegmentType_Bezier = 1, ///< ベジェ曲線 - CubismMotionSegmentType_Stepped = 2, ///< ステップ - CubismMotionSegmentType_InverseStepped = 3 ///< インバースステップ + CubismMotionSegmentType_Linear = 0, ///< Linear + CubismMotionSegmentType_Bezier = 1, ///< Bezier curve + CubismMotionSegmentType_Stepped = 2, ///< Step + CubismMotionSegmentType_InverseStepped = 3 ///< Inverse step }; /** - * @brief モーションカーブの制御点 - * - * モーションカーブの制御点。 + * Data for control points of motion curve */ struct CubismMotionPoint { + /** + * Constructor + */ CubismMotionPoint() : Time(0.0f) , Value(0.0f) { } - csmFloat32 Time; ///< 時間[秒] - csmFloat32 Value; ///< 値 + csmFloat32 Time; ///< Time [seconds] + csmFloat32 Value; ///< Value }; /** - * @brief モーションカーブのセグメントの評価関数 - * - * モーションカーブのセグメントの評価関数。 + * Function declaration for evaluating motion curve segments * - * @param[in] points モーションカーブの制御点リスト - * @param[in] time 評価する時間[秒] + * @param points Collection of control points for the motion curve + * @param time Time to evaluate [seconds] */ typedef csmFloat32 (*csmMotionSegmentEvaluationFunction)(const CubismMotionPoint* points, const csmFloat32 time); - /** - * @brief モーションカーブのセグメント - * - * モーションカーブのセグメント。 + * Data for motion curve segments */ struct CubismMotionSegment { /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismMotionSegment() : Evaluate(NULL) @@ -82,18 +71,19 @@ struct CubismMotionSegment , SegmentType(0) { } - csmMotionSegmentEvaluationFunction Evaluate; ///< 使用する評価関数 - csmInt32 BasePointIndex; ///< 最初のセグメントへのインデックス - csmInt32 SegmentType; ///< セグメントの種類 + csmMotionSegmentEvaluationFunction Evaluate; ///< Function to evaluate segment + csmInt32 BasePointIndex; ///< Index of the first control point + csmInt32 SegmentType; ///< Segment type }; /** - * @brief モーションカーブ - * - * モーションカーブ。 + * Data for motion curve */ struct CubismMotionCurve { + /** + * Constructor + */ CubismMotionCurve() : Type(CubismMotionCurveTarget_Model) , SegmentCount(0) @@ -102,36 +92,38 @@ struct CubismMotionCurve , FadeOutTime(0.0f) { } - CubismMotionCurveTarget Type; ///< カーブの種類 - CubismIdHandle Id; ///< カーブのID - csmInt32 SegmentCount; ///< セグメントの個数 - csmInt32 BaseSegmentIndex; ///< 最初のセグメントのインデックス - csmFloat32 FadeInTime; ///< フェードインにかかる時間[秒] - csmFloat32 FadeOutTime; ///< フェードアウトにかかる時間[秒] + CubismMotionCurveTarget Type; ///< Curve type + CubismIdHandle Id; ///< ID of the parameter attached to the curve + csmInt32 SegmentCount; ///< Number of segments + csmInt32 BaseSegmentIndex; ///< Index of the first segment + csmFloat32 FadeInTime; ///< Seconds to complete fade-in from start to finish [seconds] + csmFloat32 FadeOutTime; ///< Seconds to complete fade-out from start to finish [seconds] }; /** -* @brief イベント -* -* イベント。 -*/ + * Data for user data events + */ struct CubismMotionEvent { + /** + * Constructor + */ CubismMotionEvent() : FireTime(0.0f) { } - csmFloat32 FireTime; - csmString Value; + csmFloat32 FireTime; ///< Seconds in motion when the event fires [seconds] + csmString Value; ///< Value }; /** - * @brief モーションデータ - * - * モーションデータ。 + * Data for motion */ struct CubismMotionData { + /** + * Constructor + */ CubismMotionData() : Duration(0.0f) , Loop(0) @@ -140,15 +132,15 @@ struct CubismMotionData , Fps(0.0f) { } - csmFloat32 Duration; ///< モーションの長さ[秒] - csmInt16 Loop; ///< ループするかどうか - csmInt16 CurveCount; ///< カーブの個数 - csmInt32 EventCount; ///< UserDataの個数 - csmFloat32 Fps; ///< フレームレート - csmVector Curves; ///< カーブのリスト - csmVector Segments; ///< セグメントのリスト - csmVector Points; ///< ポイントのリスト - csmVector Events; ///< イベントのリスト + csmFloat32 Duration; ///< Motion length [seconds] + csmInt16 Loop; ///< Whether to loop + csmInt16 CurveCount; ///< Number of curves + csmInt32 EventCount; ///< Number of user data events + csmFloat32 Fps; ///< Motion frame rate + csmVector Curves; ///< Curve collection + csmVector Segments; ///< Segment collection + csmVector Points; ///< Control point collection + csmVector Events; ///< User data event collection }; }}} diff --git a/src/Motion/CubismMotionJson.cpp b/src/Motion/CubismMotionJson.cpp index 8e44743..6cd35be 100644 --- a/src/Motion/CubismMotionJson.cpp +++ b/src/Motion/CubismMotionJson.cpp @@ -6,6 +6,7 @@ */ #include "CubismMotionJson.hpp" +#include "CubismMotionInternal.hpp" #include "Id/CubismId.hpp" #include "Id/CubismIdManager.hpp" @@ -54,6 +55,79 @@ csmBool CubismMotionJson::IsMotionLoop() const return _json->GetRoot()[Meta][Loop].ToBoolean(); } +csmBool CubismMotionJson::HasConsistency() const +{ + csmBool result = true; + + if (!IsValid()) + { + return false; + } + + const csmInt32 actualCurveListSize = static_cast(_json->GetRoot()[Curves].GetVector()->GetSize()); + csmInt32 actualTotalSegmentCount = 0; + csmInt32 actualTotalPointCount = 0; + + // カウント処理 + for (csmInt32 curvePosition = 0; curvePosition < actualCurveListSize; ++curvePosition) + { + for (csmInt32 segmentPosition = 0; segmentPosition < GetMotionCurveSegmentCount(curvePosition);) + { + if (segmentPosition == 0) + { + actualTotalPointCount += 1; + segmentPosition += 2; + } + + const csmInt32 segment = static_cast(GetMotionCurveSegment(curvePosition, segmentPosition)); + + switch (segment) + { + case CubismMotionSegmentType_Linear: + actualTotalPointCount += 1; + segmentPosition += 3; + break; + case CubismMotionSegmentType_Bezier: + actualTotalPointCount += 3; + segmentPosition += 7; + break; + case CubismMotionSegmentType_Stepped: + actualTotalPointCount += 1; + segmentPosition += 3; + break; + case CubismMotionSegmentType_InverseStepped: + actualTotalPointCount += 1; + segmentPosition += 3; + break; + default: + CSM_ASSERT(0); + break; + } + + ++actualTotalSegmentCount; + } + } + + // 個数チェック + if (actualCurveListSize != GetMotionCurveCount()) + { + CubismLogWarning("The number of curves does not match the metadata."); + result = false; + } + if (actualTotalSegmentCount != GetMotionTotalSegmentCount()) + { + CubismLogWarning("The number of segment does not match the metadata."); + result = false; + } + if (actualTotalPointCount != GetMotionTotalPointCount()) + { + CubismLogWarning("The number of point does not match the metadata."); + result = false; + } + + return result; +} + csmBool CubismMotionJson::GetEvaluationOptionFlag(const csmInt32 flagType) const { if (EvaluationOptionFlag_AreBeziersRestricted == flagType) diff --git a/src/Motion/CubismMotionJson.hpp b/src/Motion/CubismMotionJson.hpp index c376717..11e0b84 100644 --- a/src/Motion/CubismMotionJson.hpp +++ b/src/Motion/CubismMotionJson.hpp @@ -14,264 +14,219 @@ namespace Live2D { namespace Cubism { namespace Framework { -/** -* @brief ベジェカーブの解釈方法のフラグタイプ -*/ enum EvaluationOptionFlag { - EvaluationOptionFlag_AreBeziersRestricted = 0, ///< ベジェハンドルの規制状態 + EvaluationOptionFlag_AreBeziersRestricted = 0, }; /** - * @brief motion3.jsonのコンテナ。 - * - * motion3.jsonのコンテナ。 + * Handles motion files. */ class CubismMotionJson : public CubismJsonHolder { public: /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor
+ * Loads the motion file. * - * @param[in] buffer motion3.jsonが読み込まれているバッファ - * @param[in] size バッファのサイズ + * @param buffer buffer containing the loaded motion file + * @param size size of the buffer in bytes */ CubismMotionJson(const csmByte* buffer, csmSizeInt size); /** - * @brief デストラクタ - * - * デストラクタ。 + * Destructor */ virtual ~CubismMotionJson(); /** - * @brief モーションの長さの取得 - * - * モーションの長さを取得する。 + * Returns the length of the motion. * - * @return モーションの長さ[秒] + * @return length of the motion in seconds */ csmFloat32 GetMotionDuration() const; /** - * @brief モーションのループ情報の取得 + * Checks whether the motion is set to loop. * - * モーションがループするかどうか? - * - * @retval true ループする - * @retval false ループしない + * @return true if the motion is set to loop; otherwise false. */ csmBool IsMotionLoop() const; /** - * @brief モーションのベジェカーブの解釈方式のフラグ取得 + * Returns the consistency of the motion3.json file. + * + * @return true if the file is consistent; otherwise returns false. + */ + csmBool HasConsistency() const; + + /** + * Returns the option settings used during the motion curve evaluation. * - * モーション内のベジェカーブハンドルの解釈フラグの状態を取得する。 + * @param Type option to retrieve * - * @param[in] flagType EvaluationOptionFlagで指定されるフラグタイプ + * @return option setting; true if enabled * - * @retval true フラグあり - * @retval false フラグなし + * @note Use EvaluationOptionFlag to specify the option to retrieve. */ csmBool GetEvaluationOptionFlag(csmInt32 flagType) const; /** - * @brief モーションカーブの個数の取得 + * Returns the number of curves in the motion. * - * モーションカーブの個数を取得する。 - * - * @return モーションカーブの個数 + * @return number of curves in the motion */ csmInt32 GetMotionCurveCount() const; /** - * @brief モーションのフレームレートの取得 - * - * モーションのフレームレートを取得する。 + * Returns the frame rate of the motion. * - * @return フレームレート[FPS] + * @return frame rate of the motion in FPS */ csmFloat32 GetMotionFps() const; /** - * @brief モーションのセグメントの総合計の取得 + * Returns the total number of segments in the motion. * - * モーションのセグメントの総合計を取得する。 - * - * @return モーションのセグメントの総合計 + * @return total number of segments in the motion */ csmInt32 GetMotionTotalSegmentCount() const; /** - * @brief モーションのカーブの制御点の総合計の取得 - * - * モーションのカーブの制御点の総合計を取得する。 + * Returns the total number of control points in the motion curves. * - * @return モーションのカーブの制御点の総合計 + * @return total number of control points in the motion curves */ csmInt32 GetMotionTotalPointCount() const; /** - * @brief モーションのフェードイン時間の存在 - * - * モーションにフェードイン時間が設定されているかどうか? - * - * @retval true 存在する - * @retval false 存在しない - */ + * Checks whether the setting for the number of seconds to complete fading in exists. + * + * @return true if the setting exists; otherwise false. + */ csmBool IsExistMotionFadeInTime() const; /** - * @brief モーションのフェードアウト時間の存在 - * - * モーションにフェードアウト時間が設定されているかどうか? - * - * @retval true 存在する - * @retval false 存在しない - */ + * Checks whether the setting for the number of seconds to complete fading out exists. + * + * @return true if the setting exists; otherwise false. + */ csmBool IsExistMotionFadeOutTime() const; /** - * @brief モーションのフェードイン時間の取得 - * - * モーションのフェードイン時間を取得する。 - * - * @return フェードイン時間[秒] - */ + * Returns the number of seconds for the motion to complete fading in. + * + * @return number of seconds for the fade-in to complete + */ csmFloat32 GetMotionFadeInTime() const; /** - * @brief モーションのフェードアウト時間の取得 - * - * モーションのフェードアウト時間を取得する。 - * - * @return フェードアウト時間[秒] - */ + * Returns the number of seconds for the motion to complete fading out. + * + * @return number of seconds for the fade-out to complete + */ csmFloat32 GetMotionFadeOutTime() const; /** - * @brief モーションのカーブの種類の取得 + * Returns the destination type of the motion curve. * - * モーションのカーブの種類を取得する。 + * @param curveIndex index of the curve to retrieve * - * @param[in] curveIndex カーブのインデックス - * @return カーブの種類 + * @return destination type of the curve */ const csmChar* GetMotionCurveTarget(csmInt32 curveIndex) const; /** - * @brief モーションのカーブのIDの取得 + * Returns the ID of the parameter attached to the motion curve. * - * モーションのカーブのIDを取得する。 + * @param curveIndex index of the curve to retrieve * - * @param[in] curveIndex カーブのインデックス - * @return カーブのID + * @return ID of the attached parameter */ CubismIdHandle GetMotionCurveId(csmInt32 curveIndex) const; /** - * @brief モーションのカーブのフェードイン時間の存在 + * Checks whether the setting for the number of seconds to complete fading in for the motion curve exists. * - * モーションのカーブにフェードイン時間が設定されているかどうか? + * @param curveIndex index of the curve to check * - * @param[in] curveIndex カーブのインデックス - * @retval true 存在する - * @retval false 存在しない + * @return true if the setting exists; otherwise false. */ csmBool IsExistMotionCurveFadeInTime(csmInt32 curveIndex) const; /** - * @brief モーションのカーブのフェードアウト時間の存在 + * Checks whether the setting for the number of seconds to complete fading out for the motion curve exists. * - * モーションのカーブにフェードアウト時間が設定されているかどうか? + * @param curveIndex index of the curve to check * - * @param[in] curveIndex カーブのインデックス - * @retval true 存在する - * @retval false 存在しない + * @return true if the setting exists; otherwise false. */ csmBool IsExistMotionCurveFadeOutTime(csmInt32 curveIndex) const; /** - * @brief モーションのカーブのフェードイン時間の取得 - * - * モーションのカーブのフェードイン時間を取得する。 + * Returns the number of seconds for the motion curve to complete fading in. * - * @param[in] curveIndex カーブのインデックス - * @return フェードイン時間[秒] + * @return number of seconds for the fade-in to complete */ csmFloat32 GetMotionCurveFadeInTime(csmInt32 curveIndex) const; /** - * @brief モーションのカーブのフェードアウト時間の取得 - * - * モーションのカーブのフェードアウト時間を取得する。 - * - * @param[in] curveIndex カーブのインデックス - * @return フェードアウト時間[秒] - */ + * Returns the number of seconds for the motion to complete fading out. + * + * @return number of seconds for the fade-out to complete + */ csmFloat32 GetMotionCurveFadeOutTime(csmInt32 curveIndex) const; /** - * @brief モーションのカーブのセグメントの個数の取得 + * Returns the number of segments in the motion curve. * - * モーションのカーブのセグメントの個数を取得する。 + * @param curveIndex index of the curve to retrieve * - * @param[in] curveIndex カーブのインデックス - * @return モーションのカーブのセグメントの個数 + * @return number of segments in the curve */ csmInt32 GetMotionCurveSegmentCount(csmInt32 curveIndex) const; /** - * @brief モーションのカーブのセグメントの値の取得 + * Returns the value of the segment in the motion curve. * - * モーションのカーブのセグメントの値を取得する、 + * @param curveIndex index of the curve to retrieve + * @param segmentIndex index of the segment to retrieve * - * @param[in] curveIndex カーブのインデックス - * @param[in] segmentIndex セグメントのインデックス - * @return セグメントの値 + * @return value of the segment in the curve */ csmFloat32 GetMotionCurveSegment(csmInt32 curveIndex, csmInt32 segmentIndex) const; /** - * @brief イベントの個数の取得 - * - * イベントの個数の取得する。 - * - * @return イベントの個数 - */ + * Returns the number of user data events in the motion. + * + * @return number of user data events + */ csmInt32 GetEventCount() const; /** - * @brief イベントの総文字数の取得 - * - * イベントの総文字数の取得する。 - * - * @return イベントの総文字数 - */ + * Returns the number of user data events in the motion. + * + * @return number of user data events + */ csmInt32 GetTotalEventValueSize() const; /** - * @brief イベントの時間の取得 - * - * イベントの時間の取得する。 - * - * @param[in] userDataIndex イベントのインデックス - * @return イベントの時間[秒] - */ + * Returns the motion time in seconds when the user data event fires. + * + * @param userDataIndex index of the user data event to retrieve + * + * @return motion time in seconds when the user data event fires + */ csmFloat32 GetEventTime(csmInt32 userDataIndex) const; /** - * @brief イベントの取得 - * - * イベントの取得する。 - * - * @param[in] userDataIndex イベントのインデックス - * @return イベントの文字列 - */ + * Returns the value of the user data event in the motion. + * + * @param userDataIndex index of the user data event to retrieve + * + * @return value of the user data event + */ const csmChar* GetEventValue(csmInt32 userDataIndex) const; }; diff --git a/src/Motion/CubismMotionManager.hpp b/src/Motion/CubismMotionManager.hpp index f7f9eaf..e7d0657 100644 --- a/src/Motion/CubismMotionManager.hpp +++ b/src/Motion/CubismMotionManager.hpp @@ -14,93 +14,80 @@ namespace Live2D { namespace Cubism { namespace Framework { /** - * @brief モーションの管理 - * - * モーションの管理を行うクラス。 + * Handles the management of motions. */ class CubismMotionManager : public CubismMotionQueueManager { public: /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor. */ CubismMotionManager(); /** - * @brief デストラクタ - * - * デストラクタ。 + * Destructor */ virtual ~CubismMotionManager(); /** - * @brief 再生中のモーションの優先度の取得 - * - * 再生中のモーションの優先度の取得する。 + * Returns the priority of the playing motion. * - * @return モーションの優先度 + * @return priority of the motion */ csmInt32 GetCurrentPriority() const; /** - * @brief 予約中のモーションの優先度の取得 + * Returns the priority of the reserved motion. * - * 予約中のモーションの優先度を取得する。 - * - * @return モーションの優先度 + * @return priority of the motion */ csmInt32 GetReservePriority() const; /** - * @brief 予約中のモーションの優先度の設定 - * - * 予約中のモーションの優先度を設定する。 + * Sets the priority of the reserved motion. * - * @param[in] val 優先度 + * @param val priority to set */ void SetReservePriority(csmInt32 val); /** - * @brief 優先度を設定してモーションの開始 + * Plays the motion with the specified priority. + * + * @param motion motion to play + * @param autoDelete true to delete the instance of the motion when playback ends + * @param priority priority of the motion * - * 優先度を設定してモーションを開始する。 + * @return ID of the played motion.
+ * -1 if the motion could not be started. * - * @param[in] motion モーション - * @param[in] autoDelete 再生が終了したモーションのインスタンスを削除するならtrue - * @param[in] priority 優先度 - * @return 開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」 + * @note The return value can be used as an argument to IsFinished() to determine if the motion has finished playing. */ CubismMotionQueueEntryHandle StartMotionPriority(ACubismMotion* motion, csmBool autoDelete, csmInt32 priority); /** - * @brief モーションの更新 + * Updates the motion.
+ * Evaluates the current motion and sets the parameter values on the model. * - * モーションを更新して、モデルにパラメータ値を反映する。 + * @param model model to update + * @param deltaTimeSeconds current time in seconds + * @param opacity opacity to set or get * - * @param[in] model 対象のモデル - * @param[in] deltaTimeSeconds デルタ時間[秒] - * @param[in][out] opacity 透明度の値(Nullable) - * @retval true 更新されている - * @retval false 更新されていない + * @return true if the motion was updated; otherwise false. */ csmBool UpdateMotion(CubismModel* model, csmFloat32 deltaTimeSeconds); /** - * @brief モーションの予約 + * Reserves the motion for playback. * - * モーションを予約する。 + * @param priority priority of the motion * - * @param[in] priority 優先度 - * @retval true 予約できた - * @retval false 予約できなかった + * @return true if the motion was reserved for playback; otherwise false. */ csmBool ReserveMotion(csmInt32 priority); private: - csmInt32 _currentPriority; ///< 現在再生中のモーションの優先度 - csmInt32 _reservePriority; ///< 再生予定のモーションの優先度。再生中は0になる。モーションファイルを別スレッドで読み込むときの機能。 + csmInt32 _currentPriority; + csmInt32 _reservePriority; }; }}} diff --git a/src/Motion/CubismMotionQueueEntry.hpp b/src/Motion/CubismMotionQueueEntry.hpp index 5a272c8..f25bd3d 100644 --- a/src/Motion/CubismMotionQueueEntry.hpp +++ b/src/Motion/CubismMotionQueueEntry.hpp @@ -16,9 +16,7 @@ namespace Live2D { namespace Cubism { namespace Framework { class CubismMotion; /** - * @brief CubismMotionQueueManagerで再生している各モーションの管理 - * - * CubismMotionQueueManagerで再生している各モーションの管理クラス。 + * Handles adding information to the motion data for use by the CubismMotionQueueManager. */ class CubismMotionQueueEntry { @@ -28,232 +26,183 @@ class CubismMotionQueueEntry public: /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismMotionQueueEntry(); /** - * @brief デストラクタ - * - * デストラクタ。 + * Destructor */ virtual ~CubismMotionQueueEntry(); /** - * @brief フェードアウト開始の設定 - * - * フェードアウトの開始を設定する。 + * Sets the number of seconds for the motion to complete fading out. * - * @param[in] fadeOutSeconds フェードアウトにかかる時間[秒] + * @param fadeOutSeconds number of seconds for the fade-out to complete */ void SetFadeout(csmFloat32 fadeOutSeconds); /** - * @brief フェードアウトの開始 + * Sets the number of seconds for the motion to complete fading out and starts the fade out. * - * フェードアウトを開始する。 - * - * @param[in] fadeOutSeconds フェードアウトにかかる時間[秒] - * @param[in] userTimeSeconds デルタ時間の積算値[秒] + * @param fadeOutSeconds number of seconds for the fade-out to complete + * @param userTimeSeconds current time in seconds */ void StartFadeout(csmFloat32 fadeOutSeconds, csmFloat32 userTimeSeconds); /** - * @brief モーションの終了の確認 - * - * モーションが終了したかどうか。 + * Checks whether the motion playback has finished. * - * @retval true モーションが終了した - * @retval false 終了していない + * @return true if the motion playback has finished; otherwise false. */ csmBool IsFinished() const; /** - * @brief モーションの開始の確認 - * - * モーションが開始したかどうか。 + * Checks whether the motion playback has started. * - * @retval true モーションが開始した - * @retval false 終了していない + * @return true if the motion playback has started; otherwise false. */ csmBool IsStarted() const; /** - * @brief モーションの開始時刻の取得 + * Returns the time at which the motion playback started. * - * モーションの開始時刻を取得する。 - * - * @return モーションの開始時刻[秒] + * @return time at which the motion playback started in seconds */ csmFloat32 GetStartTime() const; /** - * @brief フェードインの開始時刻の取得 - * - * フェードインの開始時刻を取得する。 + * Returns the time at which the fade-in of the motion starts. * - * @return フェードインの開始時刻[秒] + * @return time at which the fade-in starts in seconds */ csmFloat32 GetFadeInStartTime() const; /** - * @brief フェードインの終了時刻の取得 + * Returns the time at which the fade-in of the motion ends. * - * フェードインの終了時刻を取得する。 - * - * @return フェードインの終了時刻[秒] + * @return time at which the fade-in ends in seconds */ csmFloat32 GetEndTime() const; /** - * @brief モーションの開始時刻の設定 - * - * モーションの開始時刻を設定する。 + * Sets the time to start playing the motion. * - * @param[in] startTime モーションの開始時刻[秒] + * @param startTime time to start playing the motion in seconds */ void SetStartTime(csmFloat32 startTime); /** - * @brief フェードインの開始時刻の設定 + * Sets the time to start the fade-in of the motion. * - * フェードインの開始時刻を設定する。 - * - * @param[in] startTime フェードインの開始時刻[秒] + * @param startTime time to start the fade-in in seconds */ void SetFadeInStartTime(csmFloat32 startTime); /** - * @brief フェードインの終了時刻の設定 - * - * フェードインの終了時刻を設定する。 + * Sets the time to end the fade-in of the motion. * - * @param[in] endTime フェードインの終了時刻[秒] + * @param endTime time to end the fade-in in seconds */ void SetEndTime(csmFloat32 endTime); /** - * @brief モーションの終了の設定 - * - * モーションの終了を設定する。 + * Sets whether to end the motion playback. * - * @param[in] f trueならモーションの終了 + * @param f true to end the motion playback */ void IsFinished(csmBool f); /** - * @brief モーションの開始の設定 + * Sets whether to play the motion. * - * モーションの開始を設定する。 - * - * @param[in] f trueならモーションの開始 + * @param f true to play the motion */ void IsStarted(csmBool f); /** - * @brief モーションの有効性の確認 - * - * モーションの有効・無効を取得する。 + * Checks whether the motion is active. * - * @retval true モーションは有効 - * @retval false モーションは無効 + * @return true if the motion is active; otherwise false. */ csmBool IsAvailable() const; /** - * @brief モーションの有効性の設定 + * Sets whether the motion is active. * - * モーションの有効・無効を設定する。 - * - * @param[in] v trueならモーションは有効 + * @param v true to activate the motion */ void IsAvailable(csmBool v); /** - * @brief モーションの状態の設定 - * - * モーションの状態を設定する。 + * Sets the state of the motion. * - * @param[in] timeSeconds 現在時刻[秒] - * @param[in] weight モーションの重み + * @param timeSeconds current time to set in seconds + * @param weight weight of the motion to set */ void SetState(csmFloat32 timeSeconds, csmFloat32 weight); /** - * @brief モーションの現在時刻の取得 + * Returns the current time from the state of the motion. * - * モーションの現在時刻を取得する。 - * - * @return モーションの現在時刻[秒] + * @return current time in seconds */ csmFloat32 GetStateTime() const; /** - * @brief モーションの重みの取得 - * - * モーションの重みを取得する。 + * Returns the weight of the motion from its state. * - * @return モーションの重み + * @return weight of the motion */ csmFloat32 GetStateWeight() const; /** - * @brief 最後にイベントの発火をチェックした時間を取得 - * - * 最後にイベントの発火をチェックした時間を取得する。 - * - * @return 最後にイベントの発火をチェックした時間[秒] - */ + * Returns the last time the user data event was confirmed to fire. + * + * @return last time the user data event was confirmed to fire in seconds + */ csmFloat32 GetLastCheckEventTime() const; /** - * @brief 最後にイベントをチェックした時間を設定 - * - * 最後にイベントをチェックした時間を設定する。 - * - * @param[in] checkTime 最後にイベントをチェックした時間[秒] - */ + * Sets the time when the user data event was last confirmed to fire. + * + * @param checkTime last confirmed time in seconds + */ void SetLastCheckEventTime(csmFloat32 checkTime); /** - * @brief フェードアウトが開始しているかを取得 - * - * モーションがフェードアウトが開始しているかを取得する。 - * - * @return フェードアウトが開始しているか - */ + * Checks whether the motion is currently fading out. + * + * @return true if the motion is currently fading out; otherwise false. + */ csmBool IsTriggeredFadeOut(); /** - * @brief フェードアウト時間の取得 - * - * モーションのフェードアウト時間を取得する。 - * - * @return フェードアウト開始[秒] - */ + * Returns the number of seconds for the motion to complete fading out. + * + * @return number of seconds for the fade-out to complete + */ csmFloat32 GetFadeOutSeconds(); ACubismMotion* GetCubismMotion(); private: - csmBool _autoDelete; ///< 自動削除 - ACubismMotion* _motion; ///< モーション - - csmBool _available; ///< 有効化フラグ - csmBool _finished; ///< 終了フラグ - csmBool _started; ///< 開始フラグ(0.9.00以降) - csmFloat32 _startTimeSeconds; ///< モーション再生開始時刻[秒] - csmFloat32 _fadeInStartTimeSeconds; ///< フェードイン開始時刻(ループの時は初回のみ)[秒] - csmFloat32 _endTimeSeconds; ///< 終了予定時刻[秒] - csmFloat32 _stateTimeSeconds; ///< 時刻の状態[秒] - csmFloat32 _stateWeight; ///< 重みの状態 - csmFloat32 _lastEventCheckSeconds; ///< 最終のMotion側のチェックした時間 + csmBool _autoDelete; + ACubismMotion* _motion; + + csmBool _available; + csmBool _finished; + csmBool _started; + csmFloat32 _startTimeSeconds; + csmFloat32 _fadeInStartTimeSeconds; + csmFloat32 _endTimeSeconds; + csmFloat32 _stateTimeSeconds; + csmFloat32 _stateWeight; + csmFloat32 _lastEventCheckSeconds; csmFloat32 _fadeOutSeconds; csmBool _IsTriggeredFadeOut; - CubismMotionQueueEntryHandle _motionQueueEntryHandle; ///< インスタンスごとに一意の値を持つ識別番号 + CubismMotionQueueEntryHandle _motionQueueEntryHandle; }; }}} diff --git a/src/Motion/CubismMotionQueueManager.hpp b/src/Motion/CubismMotionQueueManager.hpp index bcd65a5..57ac94b 100644 --- a/src/Motion/CubismMotionQueueManager.hpp +++ b/src/Motion/CubismMotionQueueManager.hpp @@ -16,156 +16,123 @@ namespace Live2D { namespace Cubism { namespace Framework { class CubismMotionQueueEntry; class CubismMotionQueueManager; -/** -* @brief イベントのコールバック関数定義 -* -* イベントのコールバックに登録できる関数の型情報 -* -* @param[in] caller 発火したイベントを再生させたCubismMotionQueueManager -* @param[in] eventValue 発火したイベントの文字列データ -* @param[in] customData コールバックに返される登録時に指定されたデータ -*/ typedef void(*CubismMotionEventFunction)(const CubismMotionQueueManager* caller, const csmString& eventValue, void* customData); -/** - * @brief モーションの識別番号 - * - * モーションの識別番号の定義 - */ typedef void* CubismMotionQueueEntryHandle; -extern const CubismMotionQueueEntryHandle InvalidMotionQueueEntryHandleValue; ///< 無効なモーションの識別番号の定義 +extern const CubismMotionQueueEntryHandle InvalidMotionQueueEntryHandleValue; /** - * @brief モーション再生の管理 + * Handles the management of motion playback.
+ * Used for playing subclasses of ACubismMotion such as CubismMotion. * - * モーション再生の管理用クラス。CubismMotionモーションなどACubismMotionのサブクラスを再生するために使用する。 - * - * @note 再生中に別のモーションが StartMotion()された場合は、新しいモーションに滑らかに変化し旧モーションは中断する。 - * 表情用モーション、体用モーションなどを分けてモーション化した場合など、 - * 複数のモーションを同時に再生させる場合は、複数のCubismMotionQueueManagerインスタンスを使用する。 + * @note If a different motion is started with StartMotion() during playback, + * it transitions smoothly to the new motion, interrupting the old one.
+ * When different motions such as facial expressions and body motions are played together,
+ * use multiple instances of CubismMotionQueueManager. */ class CubismMotionQueueManager { public: /** - * @brief コンストラクタ - * - * コンストラクタ。 + * Constructor */ CubismMotionQueueManager(); /** - * @brief デストラクタ - * - * デストラクタ。 + * Destructor */ virtual ~CubismMotionQueueManager(); /** - * @brief 指定したモーションの開始 + * Plays the motion.
+ * If a motion of the same type is already playing, it ends the currently playing motion and starts fading it out. + * + * @param motion motion to play + * @param autoDelete true to delete the instance of the motion when playback ends + * @param userTimeSeconds current time in seconds * - * 指定したモーションを開始する。同じタイプのモーションが既にある場合は、既存のモーションに終了フラグを立て、フェードアウトを開始させる。 + * @return ID of the played motion.
+ * -1 if the motion could not be started. * - * @param[in] motion 開始するモーション - * @param[in] autoDelete 再生が終了したモーションのインスタンスを削除するなら true - * @return 開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」 + * @note The return value can be used as an argument to IsFinished() to determine if the motion has finished playing. */ CubismMotionQueueEntryHandle StartMotion(ACubismMotion* motion, csmBool autoDelete); /** - * @deprecated 第3引数userTimeSecondsを関数内で使用していないため非推奨。StartMotion(ACubismMotion* motion, csmBool autoDelete)を使用してください。 - * @brief 指定したモーションの開始 + * @deprecated Not recommended as the third parameter userTimeSeconds is not used within the function. + * Use StartMotion(ACubismMotion* motion, csmBool autoDelete) instead. * - * 指定したモーションを開始する。同じタイプのモーションが既にある場合は、既存のモーションに終了フラグを立て、フェードアウトを開始させる。 + * Plays the motion.
+ * If a motion of the same type is already playing, it ends the currently playing motion and starts fading it out. * - * @param[in] motion 開始するモーション - * @param[in] autoDelete 再生が終了したモーションのインスタンスを削除するなら true - * @param[in] userTimeSeconds デルタ時間の積算値[秒] - * @return 開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」 + * @param motion motion to play + * @param autoDelete true to delete the instance of the motion when playback ends + * @param userTimeSeconds current time in seconds + * + * @return ID of the played motion.
+ * -1 if the motion could not be started. + * + * @note The return value can be used as an argument to IsFinished() to determine if the motion has finished playing. */ CubismMotionQueueEntryHandle StartMotion(ACubismMotion* motion, csmBool autoDelete, csmFloat32 userTimeSeconds); /** - * @brief すべてのモーションの終了の確認 + * Checks whether all motions have finished playing. * - * すべてのモーションが終了しているかどうか。 - * - * @retval true すべて終了している - * @retval false 終了していない + * @return true if all motions have finished playing; otherwise false. */ csmBool IsFinished(); /** - * @brief 指定したモーションの終了の確認 + * Checks whether the motion has finished playing. * - * 指定したモーションが終了しているかどうか。 + * @param motionQueueEntryNumber identifier of the motion to check * - * @param[in] motionQueueEntryNumber モーションの識別番号 - * @retval true 指定したモーションは終了している - * @retval false 終了していない + * @return true if the motion has finished playing; otherwise false. */ csmBool IsFinished(CubismMotionQueueEntryHandle motionQueueEntryNumber); /** - * @brief すべてのモーションの停止 - * - * すべてのモーションを停止する。 + * Ends the playback of all motions. */ void StopAllMotions(); /** - * @brief 指定したCubismMotionQueueEntryの取得 + * Returns a reference to the CubismMotionQueueEntry. * - * 指定したCubismMotionQueueEntryを取得する。 + * @param motionQueueEntryNumber identifier of the motion to retrieve * - * @param[in] motionQueueEntryNumber モーションの識別番号 - * @return 指定したCubismMotionQueueEntryへのポインタ - * @retval NULL 見つからなかった + * @return reference to the CubismMotionQueueEntry */ CubismMotionQueueEntry* GetCubismMotionQueueEntry(CubismMotionQueueEntryHandle motionQueueEntryNumber); /** - * @brief CubismMotionQueueEntryの配列の取得 + * Returns a pointer to the array of CubismMotionQueueEntry. * - * CubismMotionQueueEntryの配列を取得する。 - * - * @return CubismMotionQueueEntryの配列へのポインタ - * @retval NULL 見つからなかった + * @return pointer to the array of CubismMotionQueueEntry */ csmVector* GetCubismMotionQueueEntries(); /** - * @brief イベントを受け取るCallbackの登録 - * - * イベントを受け取るCallbackの登録をする。 - * - * @param[in] callback コールバック関数 - * @param[in] customData コールバックに返されるデータ - */ + * Sets the callback function to receive user data events. + * + * @param callback Callback function to receive user data events + * @param customData User-defined data passed to the callback + */ void SetEventCallback(CubismMotionEventFunction callback, void* customData = NULL); protected: - /** - * @brief モーションの更新 - * - * モーションを更新して、モデルにパラメータ値を反映する。 - * - * @param[in] model 対象のモデル - * @param[in] userTimeSeconds デルタ時間の積算値[秒] - * @retval true モデルへパラメータ値の反映あり - * @retval false モデルへパラメータ値の反映なし(モーションの変化なし) - */ virtual csmBool DoUpdateMotion(CubismModel* model, csmFloat32 userTimeSeconds); - csmFloat32 _userTimeSeconds; ///< デルタ時間の積算値[秒] + csmFloat32 _userTimeSeconds; private: - csmVector _motions; ///< モーション + csmVector _motions; - CubismMotionEventFunction _eventCallback; ///< コールバック関数ポインタ - void* _eventCustomData; ///< コールバックに戻されるデータ + CubismMotionEventFunction _eventCallback; + void* _eventCustomData; }; }}} diff --git a/src/Rendering/CMakeLists.txt b/src/Rendering/CMakeLists.txt index 29e705e..a49a819 100644 --- a/src/Rendering/CMakeLists.txt +++ b/src/Rendering/CMakeLists.txt @@ -6,13 +6,6 @@ target_sources(${LIB_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/CubismClippingManager.tpp ) -if(NOT DEFINED FRAMEWORK_SOURCE) - message(WARNING - "[${LIB_NAME}] Set 'FRAMEWORK_SOURCE' variable to 'Cocos2dx' when using Cocos2d-x rendering." - ) - set(FRAMEWORK_SOURCE Cocos2d) -endif() - # Add specified rendering directory. add_subdirectory(${FRAMEWORK_SOURCE}) diff --git a/src/Rendering/Cocos2d/CMakeLists.txt b/src/Rendering/Cocos2d/CMakeLists.txt deleted file mode 100644 index dcf1217..0000000 --- a/src/Rendering/Cocos2d/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -target_sources(${LIB_NAME} - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/CubismOffscreenSurface_Cocos2dx.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/CubismOffscreenSurface_Cocos2dx.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/CubismRenderer_Cocos2dx.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/CubismRenderer_Cocos2dx.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/CubismShader_Cocos2dx.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/CubismShader_Cocos2dx.hpp - ${CMAKE_CURRENT_SOURCE_DIR}/CubismCommandBuffer_Cocos2dx.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/CubismCommandBuffer_Cocos2dx.hpp -) diff --git a/src/Rendering/Cocos2d/CubismCommandBuffer_Cocos2dx.cpp b/src/Rendering/Cocos2d/CubismCommandBuffer_Cocos2dx.cpp deleted file mode 100644 index 3081731..0000000 --- a/src/Rendering/Cocos2d/CubismCommandBuffer_Cocos2dx.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/** - * Copyright(c) Live2D Inc. All rights reserved. - * - * Use of this source code is governed by the Live2D Open Software license - * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. - */ - -#include "CubismCommandBuffer_Cocos2dx.hpp" -#include "CubismFramework.hpp" - -//------------ LIVE2D NAMESPACE ------------ -namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { -CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand::DrawCommand() -{ - _command.init(0.0); -} - -CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand::~DrawCommand() -{ - if (_command.getPipelineDescriptor().programState != NULL) - { - _command.getPipelineDescriptor().programState->release(); - } -} - -cocos2d::backend::BlendDescriptor* CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand::GetBlendDescriptor() -{ - return &_command.getPipelineDescriptor().blendDescriptor; -} - -cocos2d::PipelineDescriptor* CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand::GetPipelineDescriptor() -{ - return &_command.getPipelineDescriptor(); -} - -cocos2d::CustomCommand* CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand::GetCommand() -{ - return &_command; -} - -CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommandBuffer() - : _vbStride(0) - , _vbCount(0) - , _ibCount(0) -{ -} - -CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::~DrawCommandBuffer() -{ - if (_drawBuffer != NULL) - { - CSM_FREE(_drawBuffer); - } -} - -void CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::CreateVertexBuffer(csmSizeInt stride, csmSizeInt count) -{ - _vbStride = stride; - _vbCount = count; - _drawBuffer = static_cast(CSM_MALLOC(stride * count)); - _drawCommandDraw.GetCommand()->createVertexBuffer(stride, count, cocos2d::CustomCommand::BufferUsage::DYNAMIC); -} - -void CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::CreateIndexBuffer(csmSizeInt count) -{ - _ibCount = count; - _drawCommandDraw.GetCommand()->createIndexBuffer(cocos2d::backend::IndexFormat::U_SHORT, count, cocos2d::CustomCommand::BufferUsage::DYNAMIC); -} - -void CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::UpdateVertexBuffer(void* data, void* uvData, csmSizeInt count) -{ - csmSizeInt length = count * _vbStride; - csmFloat32* dest = reinterpret_cast(_drawBuffer); - csmFloat32* sourceVertices = reinterpret_cast(data); - csmFloat32* sourceUvs = reinterpret_cast(uvData); - - for (csmUint32 i = 0, j = 0; i < count; ++i) - { - *dest = *sourceVertices; - dest++; - sourceVertices++; - *dest = *sourceVertices; - dest++; - sourceVertices++; - - *dest = *sourceUvs; - dest++; - sourceUvs++; - *dest = *sourceUvs; - dest++; - sourceUvs++; - } -} - -void CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::UpdateIndexBuffer(void* data, csmSizeInt count) -{ - csmSizeInt length = count * sizeof(csmInt16); - - _drawCommandDraw.GetCommand()->updateIndexBuffer(data, length); -} - -void CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::CommitVertexBuffer() { - - csmSizeInt count = _vbCount * _vbStride; - - _drawCommandDraw.GetCommand()->updateVertexBuffer(_drawBuffer, count); -} - -CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand* CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::GetCommandDraw() -{ - return &_drawCommandDraw; -} - -CubismCommandBuffer_Cocos2dx::CubismCommandBuffer_Cocos2dx() - :_currentColorBuffer(NULL) -{ - _groupCommand.init(0.0); -} - -CubismCommandBuffer_Cocos2dx::~CubismCommandBuffer_Cocos2dx() -{ -} - -void CubismCommandBuffer_Cocos2dx::PushCommandGroup() -{ - GetCocos2dRenderer()->addCommand(&_groupCommand); - GetCocos2dRenderer()->pushGroup(_groupCommand.getRenderQueueID()); -} - -void CubismCommandBuffer_Cocos2dx::PopCommandGroup() -{ - GetCocos2dRenderer()->popGroup(); -} - -void CubismCommandBuffer_Cocos2dx::SetOperationEnable(OperationType operationType, csmBool enabled) -{ - _operationStateArray[operationType].Enabled = enabled; - - - AddCommand - ( - [=]() -> void - { - switch (operationType) - { - case OperationType_ScissorTest: - GetCocos2dRenderer()->setScissorTest(enabled); - break; - case OperationType_DepthTest: - GetCocos2dRenderer()->setDepthTest(enabled); - break; - case OperationType_StencilTest: - GetCocos2dRenderer()->setStencilTest(enabled); - break; - case OperationType_Culling: - if (!enabled) - { - GetCocos2dRenderer()->setCullMode(cocos2d::CullMode::NONE); - } - else - { - switch (_operationStateArray[operationType].Arg0.i32) - { - case CullType_Back: - GetCocos2dRenderer()->setCullMode(cocos2d::CullMode::BACK); - break; - case CullType_Front: - GetCocos2dRenderer()->setCullMode(cocos2d::CullMode::FRONT); - break; - } - } - break; - - } - } - ); -} - -csmBool CubismCommandBuffer_Cocos2dx::GetOperationEnabled(OperationType operationType) -{ - return _operationStateArray[operationType].Enabled; -} - -void CubismCommandBuffer_Cocos2dx::SetCullMode(CullType cullType) -{ - _operationStateArray[OperationType_Culling].Arg0.i32 = cullType; - - - SetOperationEnable(OperationType_Culling, _operationStateArray[OperationType_Culling].Enabled); -} - -void CubismCommandBuffer_Cocos2dx::SetWindingMode(WindingType windingType) -{ - _operationStateArray[OperationType_Winding].Arg0.i32 = windingType; - - - AddCommand - ( - [=] () -> void - { - switch (_operationStateArray[OperationType_Winding].Arg0.i32) - { - case WindingType_ClockWise: - GetCocos2dRenderer()->setWinding(cocos2d::Winding::CLOCK_WISE); - break; - - case WindingType_CounterClockWise: - GetCocos2dRenderer()->setWinding(cocos2d::Winding::COUNTER_CLOCK_WISE); - break; - } - } - ); -} - -void CubismCommandBuffer_Cocos2dx::Clear(csmFloat32 r, csmFloat32 g, csmFloat32 b, csmFloat32 a) -{ - // Add the callback command internally. - GetCocos2dRenderer()->clear(cocos2d::ClearFlag::COLOR, cocos2d::Color4F(r, g, b, a), 0.0f, 0, 0.0f); -} - -void CubismCommandBuffer_Cocos2dx::Viewport(csmFloat32 x, csmFloat32 y, csmFloat32 w, csmFloat32 h) -{ - AddCommand - ( - [=] () -> void - { - GetCocos2dRenderer()->setViewPort(x, y, w, h); - } - ); -} - -void CubismCommandBuffer_Cocos2dx::SetColorBuffer(cocos2d::Texture2D* colorBuffer) -{ - _currentColorBuffer = colorBuffer; - - AddCommand - ( - [=] () -> void - { - GetCocos2dRenderer()->setRenderTarget(cocos2d::RenderTargetFlag::COLOR, colorBuffer, NULL, NULL); - } - ); -} - -cocos2d::Texture2D* CubismCommandBuffer_Cocos2dx::GetColorBuffer() -{ - return _currentColorBuffer; -} - -void CubismCommandBuffer_Cocos2dx::AddDrawCommand(DrawCommandBuffer::DrawCommand* drawCommand) -{ - GetCocos2dRenderer()->addCommand(drawCommand->GetCommand()); -} - -void CubismCommandBuffer_Cocos2dx::AddCommand(const std::function& fn) -{ - cocos2d::CallbackCommand* command = CSM_NEW cocos2d::CallbackCommand(); - - command->init(0.0f); - command->func = [=] () -> void - { - fn(); - delete command; - }; - - GetCocos2dRenderer()->addCommand(command); -} - -}}}} diff --git a/src/Rendering/Cocos2d/CubismCommandBuffer_Cocos2dx.hpp b/src/Rendering/Cocos2d/CubismCommandBuffer_Cocos2dx.hpp deleted file mode 100644 index 7898036..0000000 --- a/src/Rendering/Cocos2d/CubismCommandBuffer_Cocos2dx.hpp +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Copyright(c) Live2D Inc. All rights reserved. - * - * Use of this source code is governed by the Live2D Open Software license - * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. - */ - -#pragma once - -#include "CubismFramework.hpp" -#include "cocos2d.h" - -#ifdef CSM_TARGET_ANDROID_ES2 -#include -#include -#include -#include -#endif - -#ifdef CSM_TARGET_IPHONE_ES2 -#include -#include -#endif - -#if defined(CSM_TARGET_WIN_GL) || defined(CSM_TARGET_LINUX_GL) -//#include -//#include -#endif - -#ifdef CSM_TARGET_MAC_GL -#ifndef CSM_TARGET_COCOS -#include -#endif -#include -#endif - -namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { - -static inline cocos2d::Renderer* GetCocos2dRenderer() -{ - return cocos2d::Director::getInstance()->getRenderer(); -} - -class CubismCommandBuffer_Cocos2dx -{ -public: - class DrawCommandBuffer - { - public: - class DrawCommand - { - public: - DrawCommand(); - virtual ~DrawCommand(); - - cocos2d::backend::BlendDescriptor* GetBlendDescriptor(); - cocos2d::PipelineDescriptor* GetPipelineDescriptor(); - cocos2d::CustomCommand* GetCommand(); - - private: - DrawCommand& operator=(const DrawCommand&); - cocos2d::CustomCommand _command; - }; - - DrawCommandBuffer(); - virtual ~DrawCommandBuffer(); - - - void CreateVertexBuffer(csmSizeInt stride, csmSizeInt count); - void CreateIndexBuffer(csmSizeInt count); - void UpdateVertexBuffer(void* data, void* uvData, csmSizeInt count); - void UpdateIndexBuffer(void* data, csmSizeInt count); - void CommitVertexBuffer(); - - DrawCommand* GetCommandDraw(); - - private: - DrawCommand _drawCommandDraw; - csmSizeInt _vbStride; - csmSizeInt _vbCount; - csmSizeInt _ibCount; - csmUint8* _drawBuffer; - }; - - union OperationStateDataArgument - { - csmBool bl; - csmInt32 i32; - csmUint32 u32; - csmFloat32 f32; - }; - - struct OperationStateData - { - OperationStateData() - : Enabled(false) - { - Arg0.i32 = 0; - Arg1.i32 = 0; - Arg2.i32 = 0; - Arg3.i32 = 0; - } - - csmBool Enabled; - OperationStateDataArgument Arg0; - OperationStateDataArgument Arg1; - OperationStateDataArgument Arg2; - OperationStateDataArgument Arg3; - }; - - enum OperationType - { - OperationType_ScissorTest = 0, - OperationType_DepthTest, - OperationType_StencilTest, - OperationType_Culling, - OperationType_Winding, - OperationType_TypeMax, - }; - - enum CullType - { - CullType_Back, - CullType_Front, - }; - - enum WindingType - { - WindingType_ClockWise, - WindingType_CounterClockWise, - }; - - CubismCommandBuffer_Cocos2dx(); - virtual ~CubismCommandBuffer_Cocos2dx(); - - void PushCommandGroup(); - void PopCommandGroup(); - - void SetOperationEnable(OperationType operationType, csmBool enabled); - csmBool GetOperationEnabled(OperationType operationType); - - void SetCullMode(CullType cullType); - void SetWindingMode(WindingType windingType); - - void Clear(csmFloat32 r, csmFloat32 g, csmFloat32 b, csmFloat32 a); - - void Viewport(csmFloat32 x, csmFloat32 y, csmFloat32 w, csmFloat32 h); - - void SetColorBuffer(cocos2d::Texture2D* colorBuffer); - cocos2d::Texture2D* GetColorBuffer(); - - void AddDrawCommand(DrawCommandBuffer::DrawCommand* drawCommand); - -private: - void AddCommand(const std::function& fn); - - cocos2d::Texture2D* _currentColorBuffer; - OperationStateData _operationStateArray[OperationType_TypeMax]; - cocos2d::GroupCommand _groupCommand; -}; - -}}}} diff --git a/src/Rendering/Cocos2d/CubismOffscreenSurface_Cocos2dx.cpp b/src/Rendering/Cocos2d/CubismOffscreenSurface_Cocos2dx.cpp deleted file mode 100644 index 89d1913..0000000 --- a/src/Rendering/Cocos2d/CubismOffscreenSurface_Cocos2dx.cpp +++ /dev/null @@ -1,174 +0,0 @@ -/** - * Copyright(c) Live2D Inc. All rights reserved. - * - * Use of this source code is governed by the Live2D Open Software license - * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. - */ - -#include "CubismOffscreenSurface_Cocos2dx.hpp" - -//------------ LIVE2D NAMESPACE ------------ -namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { - -CubismOffscreenSurface_Cocos2dx::CubismOffscreenSurface_Cocos2dx() - : _renderTexture(NULL) - , _colorBuffer(NULL) - , _isInheritedRenderTexture(false) - , _previousColorBuffer(NULL) - , _bufferWidth(0) - , _bufferHeight(0) -{ -} - - -void CubismOffscreenSurface_Cocos2dx::BeginDraw(CubismCommandBuffer_Cocos2dx* commandBuffer, cocos2d::Texture2D* colorBufferOnFinishDrawing) -{ - if (!IsValid()) - { - return; - } - - // バックバッファのサーフェイスを記憶しておく - if (colorBufferOnFinishDrawing == NULL) - { - _previousColorBuffer = commandBuffer->GetColorBuffer(); - if (_previousColorBuffer == NULL) - { - _previousColorBuffer = GetCocos2dRenderer()->getColorAttachment(); - } - } - else - { - _previousColorBuffer = colorBufferOnFinishDrawing; - } - - // マスク用RenderTextureをactiveにセット - commandBuffer->SetColorBuffer(_renderTexture->getSprite()->getTexture()); -} - -void CubismOffscreenSurface_Cocos2dx::EndDraw(CubismCommandBuffer_Cocos2dx* commandBuffer) -{ - if (!IsValid()) - { - return; - } - - // 描画対象を戻す - commandBuffer->SetColorBuffer(_previousColorBuffer); -} - -void CubismOffscreenSurface_Cocos2dx::Clear(CubismCommandBuffer_Cocos2dx* commandBuffer, float r, float g, float b, float a) -{ - // マスクをクリアする - commandBuffer->Clear(r, g, b, a); -} - -csmBool CubismOffscreenSurface_Cocos2dx::CreateOffscreenSurface(csmUint32 displayBufferWidth, csmUint32 displayBufferHeight, cocos2d::RenderTexture* renderTexture) -{ - // 一旦削除 - DestroyOffscreenSurface(); - - do - { - if (!renderTexture) - { - // The inherited RenderTexture is nothing. - // Make a RenderTexture. - - - csmBool initResult = false; - - - _renderTexture = cocos2d::RenderTexture::create(displayBufferWidth, displayBufferHeight); - - if (!_renderTexture) - { - break; - } - - _renderTexture->retain(); - - - _renderTexture->getSprite()->getTexture()->setTexParameters( - cocos2d::Texture2D::TexParams( - cocos2d::backend::SamplerFilter::LINEAR, // MagFilter - cocos2d::backend::SamplerFilter::LINEAR, // MinFilter - cocos2d::backend::SamplerAddressMode::CLAMP_TO_EDGE, // AddressingMode S - cocos2d::backend::SamplerAddressMode::CLAMP_TO_EDGE // AddressingMode T - ) - ); - - _colorBuffer = _renderTexture->getSprite()->getTexture(); - _isInheritedRenderTexture = false; - } - else - { - // Use the inherited RenderTexture. - _renderTexture = renderTexture; - _colorBuffer = _renderTexture->getSprite()->getTexture(); - - - _isInheritedRenderTexture = true; - } - - if (_colorBuffer) - { - _viewPortSize = csmRectF(0.0f, 0.0f, _colorBuffer->getContentSizeInPixels().width, _colorBuffer->getContentSizeInPixels().height); - } - else - { - _viewPortSize = csmRectF(0.0f, 0.0f, _bufferWidth, _bufferHeight); - } - - _bufferWidth = displayBufferWidth; - _bufferHeight = displayBufferHeight; - - - // 成功 - return true; - - } while (0); - - // 失敗したので削除 - DestroyOffscreenSurface(); - - return false; -} - -void CubismOffscreenSurface_Cocos2dx::DestroyOffscreenSurface() -{ - if ((_renderTexture != NULL) && !_isInheritedRenderTexture) - { - CC_SAFE_RELEASE_NULL(_renderTexture); - _colorBuffer = NULL; - } -} - -cocos2d::Texture2D* CubismOffscreenSurface_Cocos2dx::GetColorBuffer() const -{ - return _renderTexture->getSprite()->getTexture(); -} - -csmUint32 CubismOffscreenSurface_Cocos2dx::GetBufferWidth() const -{ - return _bufferWidth; -} - -csmUint32 CubismOffscreenSurface_Cocos2dx::GetBufferHeight() const -{ - return _bufferHeight; -} - -csmRectF CubismOffscreenSurface_Cocos2dx::GetViewPortSize() const -{ - return _viewPortSize; -} - -csmBool CubismOffscreenSurface_Cocos2dx::IsValid() const -{ - return _renderTexture != NULL; -} - -}}}} - -//------------ LIVE2D NAMESPACE ------------ diff --git a/src/Rendering/Cocos2d/CubismOffscreenSurface_Cocos2dx.hpp b/src/Rendering/Cocos2d/CubismOffscreenSurface_Cocos2dx.hpp deleted file mode 100644 index e1bf55f..0000000 --- a/src/Rendering/Cocos2d/CubismOffscreenSurface_Cocos2dx.hpp +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Copyright(c) Live2D Inc. All rights reserved. - * - * Use of this source code is governed by the Live2D Open Software license - * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. - */ - -#pragma once - -#include "CubismFramework.hpp" -#include "CubismCommandBuffer_Cocos2dx.hpp" -#include "Type/csmVector.hpp" -#include "Type/csmRectF.hpp" -#include "Type/csmMap.hpp" -#include - -#ifdef CSM_TARGET_ANDROID_ES2 -#include -#include -#include -#include -#endif - -#ifdef CSM_TARGET_IPHONE_ES2 -#include -#include -#endif - -#if defined(CSM_TARGET_WIN_GL) || defined(CSM_TARGET_LINUX_GL) -#include -#include -#endif - -#ifdef CSM_TARGET_MAC_GL -#ifndef CSM_TARGET_COCOS -#include -#endif -#include -#endif - -//------------ LIVE2D NAMESPACE ------------ -namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { - - -/** - * @brief オフスクリーン描画用構造体 - */ -class CubismOffscreenSurface_Cocos2dx -{ -public: - - CubismOffscreenSurface_Cocos2dx(); - - /** - * @brief 指定の描画ターゲットに向けて描画開始 - * - */ - void BeginDraw(CubismCommandBuffer_Cocos2dx* commandBuffer, cocos2d::Texture2D* colorBufferOnFinishDrawing); - - /** - * @brief 描画終了 - * - */ - void EndDraw(CubismCommandBuffer_Cocos2dx* commandBuffer); - - /** - * @brief レンダリングターゲットのクリア - * 呼ぶ場合はBeginDrawの後で呼ぶこと - * @param r 赤(0.0~1.0) - * @param g 緑(0.0~1.0) - * @param b 青(0.0~1.0) - * @param a α(0.0~1.0) - */ - void Clear(CubismCommandBuffer_Cocos2dx* commandBuffer, float r, float g, float b, float a); - - /** - * @brief CubismOffscreenSurface作成 - * @param displayBufferWidth 作成するバッファ幅 - * @param displayBufferHeight 作成するバッファ高さ - * @param colorBuffer 0以外の場合、ピクセル格納領域としてcolorBufferを使用する - */ - csmBool CreateOffscreenSurface(csmUint32 displayBufferWidth, csmUint32 displayBufferHeight, cocos2d::RenderTexture* renderTexture = NULL); - - /** - * @brief CubismOffscreenSurfaceの削除 - */ - void DestroyOffscreenSurface(); - - /** - * @brief カラーバッファメンバーへのアクセッサ - */ - cocos2d::Texture2D* GetColorBuffer() const; - - /** - * @brief バッファ幅取得 - */ - csmUint32 GetBufferWidth() const; - - /** - * @brief バッファ高さ取得 - */ - csmUint32 GetBufferHeight() const; - - csmRectF GetViewPortSize() const; - - /** - * @brief 現在有効かどうか - */ - csmBool IsValid() const; - -private: - cocos2d::RenderTexture* _renderTexture; ///< レンダリングターゲットとしてのアドレス - cocos2d::Texture2D* _colorBuffer; - csmBool _isInheritedRenderTexture; - - cocos2d::Texture2D* _previousColorBuffer; ///< 旧フレームバッファ - - csmUint32 _bufferWidth; ///< Create時に指定された幅 - csmUint32 _bufferHeight; ///< Create時に指定された高さ - - csmRectF _viewPortSize; -}; - - -}}}} - -//------------ LIVE2D NAMESPACE ------------ diff --git a/src/Rendering/Cocos2d/CubismRenderer_Cocos2dx.cpp b/src/Rendering/Cocos2d/CubismRenderer_Cocos2dx.cpp deleted file mode 100644 index 3ba4f2b..0000000 --- a/src/Rendering/Cocos2d/CubismRenderer_Cocos2dx.cpp +++ /dev/null @@ -1,722 +0,0 @@ -/** - * Copyright(c) Live2D Inc. All rights reserved. - * - * Use of this source code is governed by the Live2D Open Software license - * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. - */ - -#include "CubismRenderer_Cocos2dx.hpp" -#include "Math/CubismMatrix44.hpp" -#include "Type/csmVector.hpp" -#include "Model/CubismModel.hpp" -#include -#include "renderer/backend/Device.h" - -#ifdef CSM_TARGET_WIN_GL -#include -#endif - -//------------ LIVE2D NAMESPACE ------------ -namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { - -/********************************************************************************************************************* -* CubismClippingManager_Cocos2dx -********************************************************************************************************************/ -void CubismClippingManager_Cocos2dx::SetupClippingContext(CubismModel& model, CubismRenderer_Cocos2dx* renderer, cocos2d::Texture2D* lastColorBuffer, csmRectF lastViewport) -{ - // 全てのクリッピングを用意する - // 同じクリップ(複数の場合はまとめて1つのクリップ)を使う場合は1度だけ設定する - csmInt32 usingClipCount = 0; - for (csmUint32 clipIndex = 0; clipIndex < _clippingContextListForMask.GetSize(); clipIndex++) - { - // 1つのクリッピングマスクに関して - CubismClippingContext_Cocos2dx* cc = _clippingContextListForMask[clipIndex]; - - // このクリップを利用する描画オブジェクト群全体を囲む矩形を計算 - CalcClippedDrawTotalBounds(model, cc); - - if (cc->_isUsing) - { - usingClipCount++; //使用中としてカウント - } - } - - if (usingClipCount <= 0) - { - return; - } - - // マスク作成処理 - // 後の計算のためにインデックスの最初をセット - _currentMaskBuffer = renderer->GetOffscreenSurface(0); - - // 生成したOffscreenSurfaceと同じサイズでビューポートを設定 - renderer->GetCommandBuffer()->Viewport(0, 0, _currentMaskBuffer->GetViewPortSize().Width, _currentMaskBuffer->GetViewPortSize().Height); - - renderer->PreDraw(); // バッファをクリアする - - // _OffscreenSurfaceへ切り替え - _currentMaskBuffer->BeginDraw(renderer->GetCommandBuffer(), lastColorBuffer); - - // 各マスクのレイアウトを決定していく - SetupLayoutBounds(usingClipCount); - - // サイズがレンダーテクスチャの枚数と合わない場合は合わせる - if (_clearedMaskBufferFlags.GetSize() != _renderTextureCount) - { - _clearedMaskBufferFlags.Clear(); - - for (csmInt32 i = 0; i < _renderTextureCount; ++i) - { - _clearedMaskBufferFlags.PushBack(false); - } - } - else - { - // マスクのクリアフラグを毎フレーム開始時に初期化 - for (csmInt32 i = 0; i < _renderTextureCount; ++i) - { - _clearedMaskBufferFlags[i] = false; - } - } - - // 実際にマスクを生成する - // 全てのマスクをどの様にレイアウトして描くかを決定し、ClipContext , ClippedDrawContext に記憶する - for (csmUint32 clipIndex = 0; clipIndex < _clippingContextListForMask.GetSize(); clipIndex++) - { - // --- 実際に1つのマスクを描く --- - CubismClippingContext_Cocos2dx* clipContext = _clippingContextListForMask[clipIndex]; - csmRectF* allClippedDrawRect = clipContext->_allClippedDrawRect; //このマスクを使う、全ての描画オブジェクトの論理座標上の囲み矩形 - csmRectF* layoutBoundsOnTex01 = clipContext->_layoutBounds; //この中にマスクを収める - const csmFloat32 MARGIN = 0.05f; - const csmBool isRightHanded = false; - - // clipContextに設定したレンダーテクスチャをインデックスで取得 - CubismOffscreenSurface_Cocos2dx* clipContextOffscreenSurface = renderer->GetOffscreenSurface(clipContext->_bufferIndex); - - // 現在のレンダーテクスチャがclipContextのものと異なる場合 - if (_currentMaskBuffer != clipContextOffscreenSurface) - { - _currentMaskBuffer->EndDraw(renderer->GetCommandBuffer()); - _currentMaskBuffer = clipContextOffscreenSurface; - renderer->GetCommandBuffer()->Viewport(0, 0, _currentMaskBuffer->GetViewPortSize().Width, _currentMaskBuffer->GetViewPortSize().Height); - renderer->PreDraw(); // バッファをクリアする - _currentMaskBuffer->BeginDraw(renderer->GetCommandBuffer(), lastColorBuffer); - } - - - // モデル座標上の矩形を、適宜マージンを付けて使う - _tmpBoundsOnModel.SetRect(allClippedDrawRect); - _tmpBoundsOnModel.Expand(allClippedDrawRect->Width * MARGIN, allClippedDrawRect->Height * MARGIN); - //########## 本来は割り当てられた領域の全体を使わず必要最低限のサイズがよい - // シェーダ用の計算式を求める。回転を考慮しない場合は以下のとおり - // movePeriod' = movePeriod * scaleX + offX [[ movePeriod' = (movePeriod - tmpBoundsOnModel.movePeriod)*scale + layoutBoundsOnTex01.movePeriod ]] - csmFloat32 scaleX = layoutBoundsOnTex01->Width / _tmpBoundsOnModel.Width; - csmFloat32 scaleY = layoutBoundsOnTex01->Height / _tmpBoundsOnModel.Height; - - // マスク生成時に使う行列を求める - createMatrixForMask(isRightHanded, layoutBoundsOnTex01, scaleX, scaleY); - - clipContext->_matrixForMask.SetMatrix(_tmpMatrixForMask.GetArray()); - clipContext->_matrixForDraw.SetMatrix(_tmpMatrixForDraw.GetArray()); - - const csmInt32 clipDrawCount = clipContext->_clippingIdCount; - for (csmInt32 i = 0; i < clipDrawCount; i++) - { - const csmInt32 clipDrawIndex = clipContext->_clippingIdList[i]; - CubismCommandBuffer_Cocos2dx::DrawCommandBuffer* drawCommandBufferData = clipContext->_clippingCommandBufferList->At(i);// [i]; - - - // 頂点情報が更新されておらず、信頼性がない場合は描画をパスする - if (!model.GetDrawableDynamicFlagVertexPositionsDidChange(clipDrawIndex)) - { - continue; - } - - // Update Vertex / Index buffer. - { - csmFloat32* vertices = const_cast(model.GetDrawableVertices(clipDrawIndex)); - Core::csmVector2* uvs = const_cast(model.GetDrawableVertexUvs(clipDrawIndex)); - csmUint16* vertexIndices = const_cast(model.GetDrawableVertexIndices(clipDrawIndex)); - const csmUint32 vertexCount = model.GetDrawableVertexCount(clipDrawIndex); - const csmUint32 vertexIndexCount = model.GetDrawableVertexIndexCount(clipDrawIndex); - - drawCommandBufferData->UpdateVertexBuffer(vertices, uvs, vertexCount); - drawCommandBufferData->CommitVertexBuffer(); - if (vertexIndexCount > 0) - { - drawCommandBufferData->UpdateIndexBuffer(vertexIndices, vertexIndexCount); - } - - if (vertexCount <= 0) - { - continue; - } - - } - - renderer->IsCulling(model.GetDrawableCulling(clipDrawIndex) != 0); - - // マスクがクリアされていないなら処理する - if (!_clearedMaskBufferFlags[clipContext->_bufferIndex]) - { - // マスクをクリアする - // (仮仕様) 1が無効(描かれない)領域、0が有効(描かれる)領域。(シェーダーCd*Csで0に近い値をかけてマスクを作る。1をかけると何も起こらない) - renderer->GetOffscreenSurface(clipContext->_bufferIndex)->Clear(renderer->GetCommandBuffer(), 1.0f, 1.0f, 1.0f, 1.0f); - _clearedMaskBufferFlags[clipContext->_bufferIndex] = true; - } - - // 今回専用の変換を適用して描く - // チャンネルも切り替える必要がある(A,R,G,B) - renderer->SetClippingContextBufferForMask(clipContext); - renderer->DrawMeshCocos2d(drawCommandBufferData->GetCommandDraw(), model, clipDrawIndex); - } - } - - // --- 後処理 --- - _currentMaskBuffer->EndDraw(renderer->GetCommandBuffer()); // 描画対象を戻す - renderer->SetClippingContextBufferForMask(NULL); - renderer->GetCommandBuffer()->Viewport(lastViewport.X, lastViewport.Y, lastViewport.Width, lastViewport.Height); -} - -/********************************************************************************************************************* -* CubismClippingContext_Cocos2dx -********************************************************************************************************************/ -CubismClippingContext_Cocos2dx::CubismClippingContext_Cocos2dx(CubismClippingManager* manager, CubismModel& model, const csmInt32* clippingDrawableIndices, csmInt32 clipCount) - : CubismClippingContext(clippingDrawableIndices, clipCount) -{ - _owner = manager; - - _clippingCommandBufferList = CSM_NEW csmVector; - for (csmUint32 i = 0; i < _clippingIdCount; ++i) - { - const csmInt32 clippingId = _clippingIdList[i]; - CubismCommandBuffer_Cocos2dx::DrawCommandBuffer* drawCommandBuffer = NULL; - const csmInt32 drawableVertexCount = model.GetDrawableVertexCount(clippingId); - const csmInt32 drawableVertexIndexCount = model.GetDrawableVertexIndexCount(clippingId); - const csmSizeInt vertexSize = sizeof(csmFloat32) * 2; - - - drawCommandBuffer = CSM_NEW CubismCommandBuffer_Cocos2dx::DrawCommandBuffer(); - drawCommandBuffer->GetCommandDraw()->GetCommand()->setDrawType(cocos2d::CustomCommand::DrawType::ELEMENT); - drawCommandBuffer->GetCommandDraw()->GetCommand()->setPrimitiveType(cocos2d::backend::PrimitiveType::TRIANGLE); - drawCommandBuffer->CreateVertexBuffer(vertexSize, drawableVertexCount * 2); // Vertices + UVs - drawCommandBuffer->CreateIndexBuffer(drawableVertexIndexCount); - - - _clippingCommandBufferList->PushBack(drawCommandBuffer); - } -} - -CubismClippingContext_Cocos2dx::~CubismClippingContext_Cocos2dx() -{ - if (_clippingCommandBufferList != NULL) - { - for (csmUint32 i = 0; i < _clippingCommandBufferList->GetSize(); ++i) - { - CSM_DELETE(_clippingCommandBufferList->At(i)); - _clippingCommandBufferList->At(i) = NULL; - } - - CSM_DELETE(_clippingCommandBufferList); - _clippingCommandBufferList = NULL; - } -} - -CubismClippingManager* CubismClippingContext_Cocos2dx::GetClippingManager() -{ - return _owner; -} - -/********************************************************************************************************************* -* CubismDrawProfile_OpenGL -********************************************************************************************************************/ -void CubismRendererProfile_Cocos2dx::Save() -{ - //-- push state -- - _lastScissorTest = GetCocos2dRenderer()->getScissorTest(); - _lastStencilTest = GetCocos2dRenderer()->getStencilTest(); - _lastDepthTest = GetCocos2dRenderer()->getDepthTest(); - _lastCullFace = GetCocos2dRenderer()->getCullMode(); - _lastWinding = GetCocos2dRenderer()->getWinding(); - - - // モデル描画直前のFBOとビューポートを保存 - _lastColorBuffer = GetCocos2dRenderer()->getColorAttachment(); - _lastDepthBuffer = GetCocos2dRenderer()->getDepthAttachment(); - _lastStencilBuffer = GetCocos2dRenderer()->getStencilAttachment(); - _lastRenderTargetFlag = GetCocos2dRenderer()->getRenderTargetFlag(); - _lastViewport = csmRectF(GetCocos2dRenderer()->getViewport().x, GetCocos2dRenderer()->getViewport().y, GetCocos2dRenderer()->getViewport().w, GetCocos2dRenderer()->getViewport().h); -} - -void CubismRendererProfile_Cocos2dx::Restore() -{ - GetCocos2dRenderer()->setScissorTest(_lastScissorTest); - GetCocos2dRenderer()->setStencilTest(_lastStencilTest); - GetCocos2dRenderer()->setDepthTest(_lastDepthTest); - GetCocos2dRenderer()->setCullMode(_lastCullFace); - GetCocos2dRenderer()->setWinding(_lastWinding); - - GetCocos2dRenderer()->setRenderTarget(_lastRenderTargetFlag, _lastColorBuffer, _lastDepthBuffer, _lastStencilBuffer); - GetCocos2dRenderer()->setViewPort(_lastViewport.X, _lastViewport.Y, _lastViewport.Width, _lastViewport.Height); -} - -/********************************************************************************************************************* - * CubismRenderer_Cocos2dx - ********************************************************************************************************************/ - -#ifdef CSM_TARGET_ANDROID_ES2 -void CubismRenderer_Cocos2dx::SetExtShaderMode(csmBool extMode, csmBool extPAMode) -{ - CubismShader_Cocos2dx::SetExtShaderMode(extMode, extPAMode); - CubismShader_Cocos2dx::DeleteInstance(); -} - -void CubismRenderer_Cocos2dx::ReloadShader() -{ - CubismShader_Cocos2dx::DeleteInstance(); -} -#endif - -CubismRenderer* CubismRenderer::Create() -{ - return CSM_NEW CubismRenderer_Cocos2dx(); -} - -void CubismRenderer::StaticRelease() -{ - CubismRenderer_Cocos2dx::DoStaticRelease(); -} - -namespace -{ - CubismCommandBuffer_Cocos2dx* _commandBuffer; -} - -CubismRenderer_Cocos2dx::CubismRenderer_Cocos2dx() : _clippingManager(NULL) - , _clippingContextBufferForMask(NULL) - , _clippingContextBufferForDraw(NULL) -{ - // テクスチャ対応マップの容量を確保しておく. - _textures.PrepareCapacity(32, true); -} - -CubismRenderer_Cocos2dx::~CubismRenderer_Cocos2dx() -{ - CSM_DELETE_SELF(CubismClippingManager_Cocos2dx, _clippingManager); - - if (_drawableDrawCommandBuffer.GetSize() > 0) - { - for (csmInt32 i = 0 ; i < _drawableDrawCommandBuffer.GetSize() ; i++) - { - if (_drawableDrawCommandBuffer[i] != NULL) - { - CSM_DELETE(_drawableDrawCommandBuffer[i]); - } - } - } - - if (_drawableDrawCommandBuffer.GetSize() > 0) - { - _drawableDrawCommandBuffer.Clear(); - } - - if (_textures.GetSize() > 0) - { - _textures.Clear(); - } - - for (csmUint32 i = 0; i < _offscreenSurfaces.GetSize(); ++i) - { - _offscreenSurfaces[i].DestroyOffscreenSurface(); - } - _offscreenSurfaces.Clear(); -} - -void CubismRenderer_Cocos2dx::DoStaticRelease() -{ -#ifdef CSM_TARGET_WINGL - s_isInitializeGlFunctionsSuccess = false; ///< 初期化が完了したかどうか。trueなら初期化完了 - s_isFirstInitializeGlFunctions = true; ///< 最初の初期化実行かどうか。trueなら最初の初期化実行 -#endif - CubismShader_Cocos2dx::DeleteInstance(); -} - -void CubismRenderer_Cocos2dx::Initialize(CubismModel* model) -{ - Initialize(model, 1); -} - -void CubismRenderer_Cocos2dx::Initialize(Framework::CubismModel* model, csmInt32 maskBufferCount) -{ - // 1未満は1に補正する - if (maskBufferCount < 1) - { - maskBufferCount = 1; - CubismLogWarning("The number of render textures must be an integer greater than or equal to 1. Set the number of render textures to 1."); - } - - if (model->IsUsingMasking()) - { - _clippingManager = CSM_NEW CubismClippingManager_Cocos2dx(); //クリッピングマスク・バッファ前処理方式を初期化 - _clippingManager->Initialize( - *model, - maskBufferCount - ); - - _offscreenSurfaces.Clear(); - - for (csmInt32 i = 0; i < maskBufferCount; ++i) - { - CubismOffscreenSurface_Cocos2dx OffscreenSurface; - OffscreenSurface.CreateOffscreenSurface(_clippingManager->GetClippingMaskBufferSize().X, _clippingManager->GetClippingMaskBufferSize().Y); - _offscreenSurfaces.PushBack(OffscreenSurface); - } - } - - _sortedDrawableIndexList.Resize(model->GetDrawableCount(), 0); - - _drawableDrawCommandBuffer.Resize(model->GetDrawableCount()); - - for (csmInt32 i = 0; i < _drawableDrawCommandBuffer.GetSize(); ++i) - { - const csmInt32 drawableVertexCount = model->GetDrawableVertexCount(i); - const csmInt32 drawableVertexIndexCount = model->GetDrawableVertexIndexCount(i); - const csmSizeInt vertexSize = sizeof(csmFloat32) * 2; - - _drawableDrawCommandBuffer[i] = CSM_NEW CubismCommandBuffer_Cocos2dx::DrawCommandBuffer(); - _drawableDrawCommandBuffer[i]->GetCommandDraw()->GetCommand()->setDrawType(cocos2d::CustomCommand::DrawType::ELEMENT); - _drawableDrawCommandBuffer[i]->GetCommandDraw()->GetCommand()->setPrimitiveType(cocos2d::backend::PrimitiveType::TRIANGLE); - _drawableDrawCommandBuffer[i]->CreateVertexBuffer(vertexSize, drawableVertexCount * 2); // Vertices + UVs - - if (drawableVertexIndexCount > 0) - { - _drawableDrawCommandBuffer[i]->CreateIndexBuffer(drawableVertexIndexCount); - } - } - - - CubismRenderer::Initialize(model, maskBufferCount); //親クラスの処理を呼ぶ -} - -void CubismRenderer_Cocos2dx::PreDraw() -{ - _commandBuffer->SetOperationEnable(CubismCommandBuffer_Cocos2dx::OperationType_ScissorTest, false); - _commandBuffer->SetOperationEnable(CubismCommandBuffer_Cocos2dx::OperationType_StencilTest, false); - _commandBuffer->SetOperationEnable(CubismCommandBuffer_Cocos2dx::OperationType_DepthTest, false); - - - //異方性フィルタリング。プラットフォームのOpenGLによっては未対応の場合があるので、未設定のときは設定しない - if (GetAnisotropy() > 0.0f) - { - // Not supported. - } -} - -void CubismRenderer_Cocos2dx::DoDrawModel() -{ - //------------ クリッピングマスク・バッファ前処理方式の場合 ------------ - if (_clippingManager != NULL) - { - PreDraw(); - - // サイズが違う場合はここで作成しなおし - for (csmInt32 i = 0; i < _clippingManager->GetRenderTextureCount(); ++i) - { - if (_offscreenSurfaces[i].GetBufferWidth() != _clippingManager->GetClippingMaskBufferSize().X || - _offscreenSurfaces[i].GetBufferHeight() != _clippingManager->GetClippingMaskBufferSize().Y) - { - _offscreenSurfaces[i].CreateOffscreenSurface(_clippingManager->GetClippingMaskBufferSize().X, _clippingManager->GetClippingMaskBufferSize().Y); - } - } - - if(IsUsingHighPrecisionMask()) - { - _clippingManager->SetupMatrixForHighPrecision(*GetModel(), false); - } - else - { - _clippingManager->SetupClippingContext(*GetModel(), this, _rendererProfile._lastColorBuffer, _rendererProfile._lastViewport); - } - } - - // 上記クリッピング処理内でも一度PreDrawを呼ぶので注意!! - PreDraw(); - - const csmInt32 drawableCount = GetModel()->GetDrawableCount(); - const csmInt32* renderOrder = GetModel()->GetDrawableRenderOrders(); - - // インデックスを描画順でソート - for (csmInt32 i = 0; i < drawableCount; ++i) - { - const csmInt32 order = renderOrder[i]; - _sortedDrawableIndexList[order] = i; - } - - // Update Vertex / Index buffer. - for (csmInt32 i = 0; i < drawableCount; ++i) - { - csmFloat32* vertices = const_cast(GetModel()->GetDrawableVertices(i)); - Core::csmVector2* uvs = const_cast(GetModel()->GetDrawableVertexUvs(i)); - csmUint16* vertexIndices = const_cast(GetModel()->GetDrawableVertexIndices(i)); - const csmUint32 vertexCount = GetModel()->GetDrawableVertexCount(i); - const csmUint32 vertexIndexCount = GetModel()->GetDrawableVertexIndexCount(i); - - _drawableDrawCommandBuffer[i]->UpdateVertexBuffer(vertices, uvs, vertexCount); - _drawableDrawCommandBuffer[i]->CommitVertexBuffer(); - if (vertexIndexCount > 0) - { - _drawableDrawCommandBuffer[i]->UpdateIndexBuffer(vertexIndices, vertexIndexCount); - } - - } - - // 描画 - for (csmInt32 i = 0; i < drawableCount; ++i) - { - const csmInt32 drawableIndex = _sortedDrawableIndexList[i]; - - // Drawableが表示状態でなければ処理をパスする - if (!GetModel()->GetDrawableDynamicFlagIsVisible(drawableIndex)) - { - continue; - } - - // クリッピングマスク - CubismClippingContext_Cocos2dx* clipContext = (_clippingManager != NULL) - ? (*_clippingManager->GetClippingContextListForDraw())[drawableIndex] - : NULL; - - if (clipContext != NULL && IsUsingHighPrecisionMask()) // マスクを書く必要がある - { - if(clipContext->_isUsing) // 書くことになっていた - { - // 生成したOffscreenSurfaceと同じサイズでビューポートを設定 - _commandBuffer->Viewport(0, 0, _offscreenSurfaces[ clipContext->_bufferIndex].GetViewPortSize().Width, _offscreenSurfaces[ clipContext->_bufferIndex].GetViewPortSize().Height); - - PreDraw(); // バッファをクリアする - - _offscreenSurfaces[ clipContext->_bufferIndex].BeginDraw(_commandBuffer, _rendererProfile._lastColorBuffer); - - // マスクをクリアする - // 1が無効(描かれない)領域、0が有効(描かれる)領域。(シェーダで Cd*Csで0に近い値をかけてマスクを作る。1をかけると何も起こらない) - _offscreenSurfaces[ clipContext->_bufferIndex].Clear(_commandBuffer, 1.0f, 1.0f, 1.0f, 1.0f); - } - - { - const csmInt32 clipDrawCount = clipContext->_clippingIdCount; - for (csmInt32 index = 0; index < clipDrawCount; index++) - { - const csmInt32 clipDrawIndex = clipContext->_clippingIdList[index]; - CubismCommandBuffer_Cocos2dx::DrawCommandBuffer* drawCommandBufferMask = clipContext->_clippingCommandBufferList->At(index); - - // 頂点情報が更新されておらず、信頼性がない場合は描画をパスする - if (!GetModel()->GetDrawableDynamicFlagVertexPositionsDidChange(clipDrawIndex)) - { - continue; - } - - IsCulling(GetModel()->GetDrawableCulling(clipDrawIndex) != 0); - - if (GetModel()->GetDrawableVertexIndexCount(clipDrawIndex) <= 0) - { - continue; - } - - // Update Vertex / Index buffer. - { - csmFloat32* vertices = const_cast(GetModel()->GetDrawableVertices(clipDrawIndex)); - Core::csmVector2* uvs = const_cast(GetModel()->GetDrawableVertexUvs(clipDrawIndex)); - csmUint16* vertexIndices = const_cast(GetModel()->GetDrawableVertexIndices(clipDrawIndex)); - const csmUint32 vertexCount = GetModel()->GetDrawableVertexCount(clipDrawIndex); - const csmUint32 vertexIndexCount = GetModel()->GetDrawableVertexIndexCount(clipDrawIndex); - - drawCommandBufferMask->UpdateVertexBuffer(vertices, uvs, vertexCount); - drawCommandBufferMask->CommitVertexBuffer(); - if (vertexIndexCount > 0) - { - drawCommandBufferMask->UpdateIndexBuffer(vertexIndices, vertexIndexCount); - } - - if (vertexCount <= 0) - { - continue; - } - - } - - // 今回専用の変換を適用して描く - // チャンネルも切り替える必要がある(A,R,G,B) - SetClippingContextBufferForMask(clipContext); - DrawMeshCocos2d(drawCommandBufferMask->GetCommandDraw(), *GetModel(), clipDrawIndex); - } - } - - { - // --- 後処理 --- - _offscreenSurfaces[ clipContext->_bufferIndex].EndDraw(_commandBuffer); - SetClippingContextBufferForMask(NULL); - _commandBuffer->Viewport(_rendererProfile._lastViewport.X, _rendererProfile._lastViewport.Y, _rendererProfile._lastViewport.Width, _rendererProfile._lastViewport.Height); - - PreDraw(); // バッファをクリアする - } - } - - CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand* drawCommandDraw = _drawableDrawCommandBuffer[drawableIndex]->GetCommandDraw(); - - // クリッピングマスクをセットする - SetClippingContextBufferForDraw(clipContext); - - IsCulling(GetModel()->GetDrawableCulling(drawableIndex) != 0); - - if (GetModel()->GetDrawableVertexIndexCount(drawableIndex) <= 0) - { - continue; - } - - DrawMeshCocos2d(drawCommandDraw, *GetModel(), drawableIndex); - } - - PostDraw(); -} - -void CubismRenderer_Cocos2dx::DrawMeshCocos2d(CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand* drawCommand - ,const CubismModel& model, const csmInt32 index) -{ -#ifndef CSM_DEBUG - if (_textures[model.GetDrawableTextureIndex(index)] == 0) return; // モデルが参照するテクスチャがバインドされていない場合は描画をスキップする -#endif - - // 裏面描画の有効・無効 - _commandBuffer->SetOperationEnable(CubismCommandBuffer_Cocos2dx::OperationType_Culling, (IsCulling() ? true : false)); - - // Cubism SDK OpenGLはマスク・アートメッシュ共にCCWが表面 - _commandBuffer->SetWindingMode(CubismCommandBuffer_Cocos2dx::WindingType_CounterClockWise); - - if (IsGeneratingMask()) // マスク生成時 - { - CubismShader_Cocos2dx::GetInstance()->SetupShaderProgramForMask(drawCommand, this, model, index); - } - else - { - CubismShader_Cocos2dx::GetInstance()->SetupShaderProgramForDraw(drawCommand, this, model, index); - } - - // ポリゴンメッシュを描画する - _commandBuffer->AddDrawCommand(drawCommand); - - // 後処理 - SetClippingContextBufferForDraw(NULL); - SetClippingContextBufferForMask(NULL); -} - -CubismCommandBuffer_Cocos2dx* CubismRenderer_Cocos2dx::GetCommandBuffer() -{ - return _commandBuffer; -} - -void CubismRenderer_Cocos2dx::StartFrame(CubismCommandBuffer_Cocos2dx* commandBuffer) -{ - _commandBuffer = commandBuffer; -} - -void CubismRenderer_Cocos2dx::EndFrame(CubismCommandBuffer_Cocos2dx* commandBuffer) -{ -} - -CubismCommandBuffer_Cocos2dx::DrawCommandBuffer* CubismRenderer_Cocos2dx::GetDrawCommandBufferData(csmInt32 drawableIndex) -{ - return _drawableDrawCommandBuffer[drawableIndex]; -} - -void CubismRenderer_Cocos2dx::SaveProfile() -{ - _rendererProfile.Save(); -} - -void CubismRenderer_Cocos2dx::RestoreProfile() -{ - _rendererProfile.Restore(); -} - -void CubismRenderer_Cocos2dx::BindTexture(csmUint32 modelTextureIndex, cocos2d::Texture2D* texture) -{ - _textures[modelTextureIndex] = texture; -} - -const csmMap& CubismRenderer_Cocos2dx::GetBindedTextures() const -{ - return _textures; -} - -void CubismRenderer_Cocos2dx::SetClippingMaskBufferSize(csmFloat32 width, csmFloat32 height) -{ - if (_clippingManager == NULL) - { - return; - } - - // インスタンス破棄前にレンダーテクスチャの数を保存 - const csmInt32 renderTextureCount = _clippingManager->GetRenderTextureCount(); - - //OffscreenSurfaceのサイズを変更するためにインスタンスを破棄・再作成する - CSM_DELETE_SELF(CubismClippingManager_Cocos2dx, _clippingManager); - - _clippingManager = CSM_NEW CubismClippingManager_Cocos2dx(); - - _clippingManager->SetClippingMaskBufferSize(width, height); - - _clippingManager->Initialize( - *GetModel(), - renderTextureCount - ); -} - -csmInt32 CubismRenderer_Cocos2dx::GetRenderTextureCount() const -{ - return _clippingManager->GetRenderTextureCount(); -} - -CubismVector2 CubismRenderer_Cocos2dx::GetClippingMaskBufferSize() const -{ - return _clippingManager->GetClippingMaskBufferSize(); -} - -CubismOffscreenSurface_Cocos2dx* CubismRenderer_Cocos2dx::GetOffscreenSurface(csmInt32 index) -{ - return &_offscreenSurfaces[index]; -} - -void CubismRenderer_Cocos2dx::SetClippingContextBufferForMask(CubismClippingContext_Cocos2dx* clip) -{ - _clippingContextBufferForMask = clip; -} - -CubismClippingContext_Cocos2dx* CubismRenderer_Cocos2dx::GetClippingContextBufferForMask() const -{ - return _clippingContextBufferForMask; -} - -void CubismRenderer_Cocos2dx::SetClippingContextBufferForDraw(CubismClippingContext_Cocos2dx* clip) -{ - _clippingContextBufferForDraw = clip; -} - -CubismClippingContext_Cocos2dx* CubismRenderer_Cocos2dx::GetClippingContextBufferForDraw() const -{ - return _clippingContextBufferForDraw; -} - -const csmBool CubismRenderer_Cocos2dx::IsGeneratingMask() const -{ - return GetClippingContextBufferForMask() != NULL; -} - -cocos2d::Texture2D* CubismRenderer_Cocos2dx::GetBindedTexture(csmInt32 textureIndex) -{ - return _textures[textureIndex]; -} - -}}}} - -//------------ LIVE2D NAMESPACE ------------ diff --git a/src/Rendering/Cocos2d/CubismRenderer_Cocos2dx.hpp b/src/Rendering/Cocos2d/CubismRenderer_Cocos2dx.hpp deleted file mode 100644 index 0e50156..0000000 --- a/src/Rendering/Cocos2d/CubismRenderer_Cocos2dx.hpp +++ /dev/null @@ -1,358 +0,0 @@ -/** - * Copyright(c) Live2D Inc. All rights reserved. - * - * Use of this source code is governed by the Live2D Open Software license - * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. - */ - -#pragma once - -#include "../CubismRenderer.hpp" -#include "../CubismClippingManager.hpp" -#include "CubismFramework.hpp" -#include "CubismOffscreenSurface_Cocos2dx.hpp" -#include "CubismCommandBuffer_Cocos2dx.hpp" -#include "CubismShader_Cocos2dx.hpp" -#include "Math/CubismVector2.hpp" -#include "Type/csmVector.hpp" -#include "Type/csmRectF.hpp" -#include "Type/csmMap.hpp" - - -#ifdef CSM_TARGET_ANDROID_ES2 -#include -#include -#include -#include -#endif - -#ifdef CSM_TARGET_IPHONE_ES2 -#include -#include -#endif - -#if defined(CSM_TARGET_WIN_GL) || defined(CSM_TARGET_LINUX_GL) -#include -#include -#endif - -#ifdef CSM_TARGET_MAC_GL -#ifndef CSM_TARGET_COCOS -#include -#endif -#include -#endif - -//------------ LIVE2D NAMESPACE ------------ -namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { - -// 前方宣言 -class CubismRenderer_Cocos2dx; -class CubismClippingContext_Cocos2dx; -class CubismShader_Cocos2dx; - -/** - * @brief クリッピングマスクの処理を実行するクラス - * - */ -class CubismClippingManager_Cocos2dx : public CubismClippingManager -{ -public: - - /** - * @brief クリッピングコンテキストを作成する。モデル描画時に実行する。 - * - * @param[in] model -> モデルのインスタンス - * @param[in] renderer -> レンダラのインスタンス - * @param[in] lastFBO -> フレームバッファ - * @param[in] lastViewport -> ビューポート - */ - void SetupClippingContext(CubismModel& model, CubismRenderer_Cocos2dx* renderer, cocos2d::Texture2D* lastColorBuffer, csmRectF lastViewport); -}; - -/** - * @brief クリッピングマスクのコンテキスト - */ -class CubismClippingContext_Cocos2dx : public CubismClippingContext -{ - friend class CubismClippingManager_Cocos2dx; - friend class CubismRenderer_Cocos2dx; - -public: - /** - * @brief 引数付きコンストラクタ - * - */ - CubismClippingContext_Cocos2dx(CubismClippingManager* manager, CubismModel& model, const csmInt32* clippingDrawableIndices, csmInt32 clipCount); - - /** - * @brief デストラクタ - */ - virtual ~CubismClippingContext_Cocos2dx(); - - /** - * @brief このマスクを管理するマネージャのインスタンスを取得する。 - * - * @return クリッピングマネージャのインスタンス - */ - CubismClippingManager* GetClippingManager(); - -private: - csmVector* _clippingCommandBufferList; - CubismClippingManager* _owner; ///< このマスクを管理しているマネージャのインスタンス -}; - -/** - * @brief Cubismモデルを描画する直前のCocos2dxのステートを保持・復帰させるクラス - * - */ -class CubismRendererProfile_Cocos2dx -{ - friend class CubismRenderer_Cocos2dx; - -private: - /** - * @biref privateなコンストラクタ - */ - CubismRendererProfile_Cocos2dx() {}; - - /** - * @biref privateなデストラクタ - */ - virtual ~CubismRendererProfile_Cocos2dx() {}; - - /** - * @brief Cocos2dxのステートを保持する - */ - void Save(); - - /** - * @brief 保持したCocos2dxのステートを復帰させる - * - */ - void Restore(); - - csmBool _lastScissorTest; ///< モデル描画直前のGL_VERTEX_ATTRIB_ARRAY_ENABLEDパラメータ - csmBool _lastBlend; ///< モデル描画直前のGL_SCISSOR_TESTパラメータ - csmBool _lastStencilTest; ///< モデル描画直前のGL_STENCIL_TESTパラメータ - csmBool _lastDepthTest; ///< モデル描画直前のGL_DEPTH_TESTパラメータ - cocos2d::CullMode _lastCullFace; ///< モデル描画直前のGL_CULL_FACEパラメータ - cocos2d::Winding _lastWinding; - cocos2d::Texture2D* _lastColorBuffer; ///< モデル描画直前のフレームバッファ - cocos2d::Texture2D* _lastDepthBuffer; - cocos2d::Texture2D* _lastStencilBuffer; - cocos2d::RenderTargetFlag _lastRenderTargetFlag; - csmRectF _lastViewport; ///< モデル描画直前のビューポート -}; - -/** - * @brief Cocos2dx用の描画命令を実装したクラス - * - */ -class CubismRenderer_Cocos2dx : public CubismRenderer -{ - friend class CubismRenderer; - friend class CubismClippingManager_Cocos2dx; - friend class CubismShader_Cocos2dx; - -public: - /** - * @brief レンダラの初期化処理を実行する
- * 引数に渡したモデルからレンダラの初期化処理に必要な情報を取り出すことができる - * - * @param[in] model -> モデルのインスタンス - */ - void Initialize(Framework::CubismModel* model) override; - - void Initialize(Framework::CubismModel* model, csmInt32 maskBufferCount) override; - - /** - * @brief OpenGLテクスチャのバインド処理
- * CubismRendererにテクスチャを設定し、CubismRenderer中でその画像を参照するためのIndex値を戻り値とする - * - * @param[in] modelTextureIndex -> セットするモデルテクスチャの番号 - * @param[in] texture -> バックエンドテクスチャ - * - */ - void BindTexture(csmUint32 modelTextureIndex, cocos2d::Texture2D* texture); - - /** - * @brief OpenGLにバインドされたテクスチャのリストを取得する - * - * @return テクスチャのアドレスのリスト - */ - const csmMap& GetBindedTextures() const; - - /** - * @brief クリッピングマスクバッファのサイズを設定する
- * マスク用のOffscreenSurfaceを破棄・再作成するため処理コストは高い。 - * - * @param[in] width -> クリッピングマスクバッファの横サイズ - * @param[in] height -> クリッピングマスクバッファの縦サイズ - * - */ - void SetClippingMaskBufferSize(csmFloat32 width, csmFloat32 height); - - /** - * @brief レンダーテクスチャの枚数を取得する。 - * - * @return レンダーテクスチャの枚数 - * - */ - csmInt32 GetRenderTextureCount() const; - - /** - * @brief クリッピングマスクバッファのサイズを取得する - * - * @return クリッピングマスクバッファのサイズ - * - */ - CubismVector2 GetClippingMaskBufferSize() const; - - /** - * @brief オフスクリーンサーフェスを取得する - * - * @return オフスクリーンサーフェスへの参照 - * - */ - CubismOffscreenSurface_Cocos2dx* GetOffscreenSurface(csmInt32 index); - - static CubismCommandBuffer_Cocos2dx* GetCommandBuffer(); - - static void StartFrame(CubismCommandBuffer_Cocos2dx* commandBuffer); - - static void EndFrame(CubismCommandBuffer_Cocos2dx* commandBuffer); - -protected: - /** - * @brief コンストラクタ - */ - CubismRenderer_Cocos2dx(); - - /** - * @brief デストラクタ - */ - virtual ~CubismRenderer_Cocos2dx(); - - /** - * @brief モデルを描画する実際の処理 - * - */ - void DoDrawModel() override; - - /** - * @brief 描画オブジェクト(アートメッシュ)を描画する。
- * 描画するモデルと、描画対象のインデックスを渡す。 - * - * @param[in] drawCommand -> コマンドバッファ - * @param[in] model -> 描画対象のモデル - * @param[in] index -> 描画すべき対象のインデックス - * - */ - void DrawMeshCocos2d(CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand* drawCommand - ,const CubismModel& model, const csmInt32 index); - - CubismCommandBuffer_Cocos2dx::DrawCommandBuffer* GetDrawCommandBufferData(csmInt32 drawableIndex); - -#ifdef CSM_TARGET_ANDROID_ES2 -public: - /** - * @brief Tegraプロセッサ対応。拡張方式による描画の有効・無効 - * - * @param[in] extMode -> trueなら拡張方式で描画する - * @param[in] extPAMode -> trueなら拡張方式のPA設定を有効にする - */ - static void SetExtShaderMode(csmBool extMdoe, csmBool extPAMode = false); - - /** - * @brief Android-Tegra対応. シェーダプログラムをリロードする。 - */ - static void ReloadShader(); -#endif - -private: - // Prevention of copy Constructor - CubismRenderer_Cocos2dx(const CubismRenderer_Cocos2dx&); - CubismRenderer_Cocos2dx& operator=(const CubismRenderer_Cocos2dx&); - - /** - * @brief レンダラが保持する静的なリソースを解放する
- * Cocos2dxの静的なシェーダプログラムを解放する - */ - static void DoStaticRelease(); - - /** - * @brief 描画開始時の追加処理。
- * モデルを描画する前にクリッピングマスクに必要な処理を実装している。 - */ - void PreDraw(); - - /** - * @brief 描画完了後の追加処理。 - * - */ - void PostDraw(){}; - - /** - * @brief モデル描画直前のCocos2dxのステートを保持する - */ - void SaveProfile() override; - - /** - * @brief モデル描画直前のCocos2dxのステートを保持する - */ - void RestoreProfile() override; - - /** - * @brief マスクテクスチャに描画するクリッピングコンテキストをセットする。 - */ - void SetClippingContextBufferForMask(CubismClippingContext_Cocos2dx* clip); - - /** - * @brief マスクテクスチャに描画するクリッピングコンテキストを取得する。 - * - * @return マスクテクスチャに描画するクリッピングコンテキスト - */ - CubismClippingContext_Cocos2dx* GetClippingContextBufferForMask() const; - - /** - * @brief 画面上に描画するクリッピングコンテキストをセットする。 - */ - void SetClippingContextBufferForDraw(CubismClippingContext_Cocos2dx* clip); - - /** - * @brief 画面上に描画するクリッピングコンテキストを取得する。 - * - * @return 画面上に描画するクリッピングコンテキスト - */ - CubismClippingContext_Cocos2dx* GetClippingContextBufferForDraw() const; - - /** - * @brief マスク生成時かを判定する - * - * @return 判定値 - */ - const csmBool inline IsGeneratingMask() const; - - /** - * @brief テクスチャマップからバインド済みテクスチャIDを取得する - * バインドされていなければNULLを返却される - * - * @return バインドされたテクスチャ - */ - cocos2d::Texture2D* GetBindedTexture(csmInt32 textureIndex); - - - csmMap _textures; ///< モデルが参照するテクスチャとレンダラでバインドしているテクスチャとのマップ - csmVector _sortedDrawableIndexList; ///< 描画オブジェクトのインデックスを描画順に並べたリスト - CubismRendererProfile_Cocos2dx _rendererProfile; ///< OpenGLのステートを保持するオブジェクト - CubismClippingManager_Cocos2dx* _clippingManager; ///< クリッピングマスク管理オブジェクト - CubismClippingContext_Cocos2dx* _clippingContextBufferForMask; ///< マスクテクスチャに描画するためのクリッピングコンテキスト - CubismClippingContext_Cocos2dx* _clippingContextBufferForDraw; ///< 画面上描画するためのクリッピングコンテキスト - - csmVector _offscreenSurfaces; ///< マスク描画用のフレームバッファ - csmVector _drawableDrawCommandBuffer; -}; - -}}}} -//------------ LIVE2D NAMESPACE ------------ diff --git a/src/Rendering/Cocos2d/CubismShader_Cocos2dx.cpp b/src/Rendering/Cocos2d/CubismShader_Cocos2dx.cpp deleted file mode 100644 index e7fe15e..0000000 --- a/src/Rendering/Cocos2d/CubismShader_Cocos2dx.cpp +++ /dev/null @@ -1,949 +0,0 @@ -/** - * Copyright(c) Live2D Inc. All rights reserved. - * - * Use of this source code is governed by the Live2D Open Software license - * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. - */ - -#include "CubismShader_Cocos2dx.hpp" -#include -#include "renderer/backend/Device.h" - -#ifdef CSM_TARGET_WIN_GL -#include -#endif - -//------------ LIVE2D NAMESPACE ------------ -namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { - -/********************************************************************************************************************* -* CubismShader_Cocos2dx -********************************************************************************************************************/ -namespace { - const csmInt32 ShaderCount = 19; ///< シェーダの数 = マスク生成用 + (通常 + 加算 + 乗算) * (マスク無 + マスク有 + マスク有反転 + マスク無の乗算済アルファ対応版 + マスク有の乗算済アルファ対応版 + マスク有反転の乗算済アルファ対応版) - CubismShader_Cocos2dx* s_instance; -} - -enum ShaderNames -{ - // SetupMask - ShaderNames_SetupMask, - - //Normal - ShaderNames_Normal, - ShaderNames_NormalMasked, - ShaderNames_NormalMaskedInverted, - ShaderNames_NormalPremultipliedAlpha, - ShaderNames_NormalMaskedPremultipliedAlpha, - ShaderNames_NormalMaskedInvertedPremultipliedAlpha, - - //Add - ShaderNames_Add, - ShaderNames_AddMasked, - ShaderNames_AddMaskedInverted, - ShaderNames_AddPremultipliedAlpha, - ShaderNames_AddMaskedPremultipliedAlpha, - ShaderNames_AddMaskedPremultipliedAlphaInverted, - - //Mult - ShaderNames_Mult, - ShaderNames_MultMasked, - ShaderNames_MultMaskedInverted, - ShaderNames_MultPremultipliedAlpha, - ShaderNames_MultMaskedPremultipliedAlpha, - ShaderNames_MultMaskedPremultipliedAlphaInverted, -}; - -void CubismShader_Cocos2dx::ReleaseShaderProgram() -{ - for (csmUint32 i = 0; i < _shaderSets.GetSize(); i++) - { - if (_shaderSets[i]->ShaderProgram) - { - CSM_DELETE(_shaderSets[i]); - } - } -} - -// SetupMask -static const csmChar* VertShaderSrcSetupMask = -#if defined(CC_PLATFORM_MOBILE) -#else - "#version 120\n" -#endif - "attribute vec2 a_position;" - "attribute vec2 a_texCoord;" - "varying vec2 v_texCoord;" - "varying vec4 v_myPos;" - "uniform mat4 u_clipMatrix;" - "void main()" - "{" - "vec4 pos = vec4(a_position.x, a_position.y, 0.0, 1.0);" - "gl_Position = u_clipMatrix * pos;" - "v_myPos = u_clipMatrix * pos;" - "v_texCoord = a_texCoord;" - "v_texCoord.y = 1.0 - v_texCoord.y;" - "}"; -static const csmChar* FragShaderSrcSetupMask = -#if defined(CC_PLATFORM_MOBILE) -#else -#endif - "varying vec2 v_texCoord;" - "varying vec4 v_myPos;" - "uniform sampler2D s_texture0;" - "uniform vec4 u_channelFlag;" - "uniform vec4 u_baseColor;" - "void main()" - "{" - "float isInside = " - " step(u_baseColor.x, v_myPos.x/v_myPos.w)" - "* step(u_baseColor.y, v_myPos.y/v_myPos.w)" - "* step(v_myPos.x/v_myPos.w, u_baseColor.z)" - "* step(v_myPos.y/v_myPos.w, u_baseColor.w);" - - "gl_FragColor = u_channelFlag * texture2D(s_texture0 , v_texCoord).a * isInside;" - "}"; -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID -static const csmChar* FragShaderSrcSetupMaskTegra = - "#extension GL_NV_shader_framebuffer_fetch : enable\n" - "precision mediump float;" - "varying vec2 v_texCoord;" - "varying vec4 v_myPos;" - "uniform sampler2D s_texture0;" - "uniform vec4 u_channelFlag;" - "uniform vec4 u_baseColor;" - "void main()" - "{" - "float isInside = " - " step(u_baseColor.x, v_myPos.x/v_myPos.w)" - "* step(u_baseColor.y, v_myPos.y/v_myPos.w)" - "* step(v_myPos.x/v_myPos.w, u_baseColor.z)" - "* step(v_myPos.y/v_myPos.w, u_baseColor.w);" - - "gl_FragColor = u_channelFlag * texture2D(s_texture0 , v_texCoord).a * isInside;" - "}"; -#endif - -//----- バーテックスシェーダプログラム ----- -// Normal & Add & Mult 共通 -static const csmChar* VertShaderSrc = -#if defined(CC_PLATFORM_MOBILE) -#else - "#version 120\n" -#endif - "attribute vec2 a_position;" //v.vertex - "attribute vec2 a_texCoord;" //v.texcoord - "varying vec2 v_texCoord;" //v2f.texcoord - "uniform mat4 u_matrix;" - "void main()" - "{" - "vec4 pos = vec4(a_position.x, a_position.y, 0.0, 1.0);" - "gl_Position = u_matrix * pos;" - "v_texCoord = a_texCoord;" - "v_texCoord.y = 1.0 - v_texCoord.y;" - "}"; - -// Normal & Add & Mult 共通(クリッピングされたものの描画用) -static const csmChar* VertShaderSrcMasked = -#if defined(CC_PLATFORM_MOBILE) -#else - "#version 120\n" -#endif - "attribute vec2 a_position;" - "attribute vec2 a_texCoord;" - "varying vec2 v_texCoord;" - "varying vec4 v_clipPos;" - "uniform mat4 u_matrix;" - "uniform mat4 u_clipMatrix;" - "void main()" - "{" - "vec4 pos = vec4(a_position.x, a_position.y, 0.0, 1.0);" - "gl_Position = u_matrix * pos;" - "v_clipPos = u_clipMatrix * pos;" -#if defined(CC_USE_METAL) - "v_clipPos = vec4(v_clipPos.x, 1.0 - v_clipPos.y, v_clipPos.zw);" -#endif - "v_texCoord = a_texCoord;" - "v_texCoord.y = 1.0 - v_texCoord.y;" - "}"; - -//----- フラグメントシェーダプログラム ----- -// Normal & Add & Mult 共通 -static const csmChar* FragShaderSrc = -#if defined(CC_PLATFORM_MOBILE) -#else -#endif - "varying vec2 v_texCoord;" //v2f.texcoord - "uniform sampler2D s_texture0;" //_MainTex - "uniform vec4 u_baseColor;" //v2f.color - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = texColor.rgb + u_screenColor.rgb - (texColor.rgb * u_screenColor.rgb);" - "vec4 color = texColor * u_baseColor;" - "gl_FragColor = vec4(color.rgb * color.a, color.a);" - "}"; -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID -static const csmChar* FragShaderSrcTegra = - "#extension GL_NV_shader_framebuffer_fetch : enable\n" - "precision mediump float;" - "varying vec2 v_texCoord;" //v2f.texcoord - "uniform sampler2D s_texture0;" //_MainTex - "uniform vec4 u_baseColor;" //v2f.color - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = texColor.rgb + u_screenColor.rgb - (texColor.rgb * u_screenColor.rgb);" - "vec4 color = texColor * u_baseColor;" - "gl_FragColor = vec4(color.rgb * color.a, color.a);" - "}"; -#endif - -// Normal & Add & Mult 共通 (PremultipliedAlpha) -static const csmChar* FragShaderSrcPremultipliedAlpha = -#if defined(CC_PLATFORM_MOBILE) -#else -#endif - "varying vec2 v_texCoord;" //v2f.texcoord - "uniform sampler2D s_texture0;" //_MainTex - "uniform vec4 u_baseColor;" //v2f.color - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = (texColor.rgb + u_screenColor.rgb * texColor.a) - (texColor.rgb * u_screenColor.rgb);" - "gl_FragColor = texColor * u_baseColor;" - "}"; -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID -static const csmChar* FragShaderSrcPremultipliedAlphaTegra = - "#extension GL_NV_shader_framebuffer_fetch : enable\n" - "precision mediump float;" - "varying vec2 v_texCoord;" //v2f.texcoord - "uniform sampler2D s_texture0;" //_MainTex - "uniform vec4 u_baseColor;" //v2f.color - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = (texColor.rgb + u_screenColor.rgb * texColor.a) - (texColor.rgb * u_screenColor.rgb);" - "gl_FragColor = texColor * u_baseColor;" - "}"; -#endif - -// Normal & Add & Mult 共通(クリッピングされたものの描画用) -static const csmChar* FragShaderSrcMask = -#if defined(CC_PLATFORM_MOBILE) -#else -#endif - "varying vec2 v_texCoord;" - "varying vec4 v_clipPos;" - "uniform sampler2D s_texture0;" - "uniform sampler2D s_texture1;" - "uniform vec4 u_channelFlag;" - "uniform vec4 u_baseColor;" - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = texColor.rgb + u_screenColor.rgb - (texColor.rgb * u_screenColor.rgb);" - "vec4 col_formask = texColor * u_baseColor;" - "col_formask.rgb = col_formask.rgb * col_formask.a ;" - "vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;" - "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;" - "col_formask = col_formask * maskVal;" - "gl_FragColor = col_formask;" - "}"; -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID -static const csmChar* FragShaderSrcMaskTegra = - "#extension GL_NV_shader_framebuffer_fetch : enable\n" - "precision mediump float;" - "varying vec2 v_texCoord;" - "varying vec4 v_clipPos;" - "uniform sampler2D s_texture0;" - "uniform sampler2D s_texture1;" - "uniform vec4 u_channelFlag;" - "uniform vec4 u_baseColor;" - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = texColor.rgb + u_screenColor.rgb - (texColor.rgb * u_screenColor.rgb);" - "vec4 col_formask = texColor * u_baseColor;" - "col_formask.rgb = col_formask.rgb * col_formask.a ;" - "vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;" - "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;" - "col_formask = col_formask * maskVal;" - "gl_FragColor = col_formask;" - "}"; -#endif - -// Normal & Add & Mult 共通(クリッピングされて反転使用の描画用) -static const csmChar* FragShaderSrcMaskInverted = -#if defined(CC_PLATFORM_MOBILE) -#else -#endif - "varying vec2 v_texCoord;" - "varying vec4 v_clipPos;" - "uniform sampler2D s_texture0;" - "uniform sampler2D s_texture1;" - "uniform vec4 u_channelFlag;" - "uniform vec4 u_baseColor;" - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = texColor.rgb + u_screenColor.rgb - (texColor.rgb * u_screenColor.rgb);" - "vec4 col_formask = texColor * u_baseColor;" - "col_formask.rgb = col_formask.rgb * col_formask.a ;" - "vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;" - "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;" - "col_formask = col_formask * (1.0 - maskVal);" - "gl_FragColor = col_formask;" - "}"; -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID -static const csmChar* FragShaderSrcMaskInvertedTegra = - "#extension GL_NV_shader_framebuffer_fetch : enable\n" - "precision mediump float;" - "varying vec2 v_texCoord;" - "varying vec4 v_clipPos;" - "uniform sampler2D s_texture0;" - "uniform sampler2D s_texture1;" - "uniform vec4 u_channelFlag;" - "uniform vec4 u_baseColor;" - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = texColor.rgb + u_screenColor.rgb - (texColor.rgb * u_screenColor.rgb);" - "vec4 col_formask = texColor * u_baseColor;" - "col_formask.rgb = col_formask.rgb * col_formask.a ;" - "vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;" - "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;" - "col_formask = col_formask * (1.0 - maskVal);" - "gl_FragColor = col_formask;" - "}"; -#endif - -// Normal & Add & Mult 共通(クリッピングされたものの描画用、PremultipliedAlphaの場合) -static const csmChar* FragShaderSrcMaskPremultipliedAlpha = -#if defined(CC_PLATFORM_MOBILE) -#else -#endif - "varying vec2 v_texCoord;" - "varying vec4 v_clipPos;" - "uniform sampler2D s_texture0;" - "uniform sampler2D s_texture1;" - "uniform vec4 u_channelFlag;" - "uniform vec4 u_baseColor;" - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = (texColor.rgb + u_screenColor.rgb * texColor.a) - (texColor.rgb * u_screenColor.rgb);" - "vec4 col_formask = texColor * u_baseColor;" - "vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;" - "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;" - "col_formask = col_formask * maskVal;" - "gl_FragColor = col_formask;" - "}"; -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID -static const csmChar* FragShaderSrcMaskPremultipliedAlphaTegra = - "#extension GL_NV_shader_framebuffer_fetch : enable\n" - "precision mediump float;" - "varying vec2 v_texCoord;" - "varying vec4 v_clipPos;" - "uniform sampler2D s_texture0;" - "uniform sampler2D s_texture1;" - "uniform vec4 u_channelFlag;" - "uniform vec4 u_baseColor;" - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = (texColor.rgb + u_screenColor.rgb * texColor.a) - (texColor.rgb * u_screenColor.rgb);" - "vec4 col_formask = texColor * u_baseColor;" - "vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;" - "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;" - "col_formask = col_formask * maskVal;" - "gl_FragColor = col_formask;" - "}"; -#endif - -// Normal & Add & Mult 共通(クリッピングされて反転使用の描画用、PremultipliedAlphaの場合) -static const csmChar* FragShaderSrcMaskInvertedPremultipliedAlpha = -#if defined(CC_PLATFORM_MOBILE) -#else -#endif - "varying vec2 v_texCoord;" - "varying vec4 v_clipPos;" - "uniform sampler2D s_texture0;" - "uniform sampler2D s_texture1;" - "uniform vec4 u_channelFlag;" - "uniform vec4 u_baseColor;" - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = (texColor.rgb + u_screenColor.rgb * texColor.a) - (texColor.rgb * u_screenColor.rgb);" - "vec4 col_formask = texColor * u_baseColor;" - "vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;" - "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;" - "col_formask = col_formask * (1.0 - maskVal);" - "gl_FragColor = col_formask;" - "}"; -#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID -static const csmChar* FragShaderSrcMaskInvertedPremultipliedAlphaTegra = - "#extension GL_NV_shader_framebuffer_fetch : enable\n" - "precision mediump float;" - "varying vec2 v_texCoord;" - "varying vec4 v_clipPos;" - "uniform sampler2D s_texture0;" - "uniform sampler2D s_texture1;" - "uniform vec4 u_channelFlag;" - "uniform vec4 u_baseColor;" - "uniform vec4 u_multiplyColor;" - "uniform vec4 u_screenColor;" - "void main()" - "{" - "vec4 texColor = texture2D(s_texture0 , v_texCoord);" - "texColor.rgb = texColor.rgb * u_multiplyColor.rgb;" - "texColor.rgb = (texColor.rgb + u_screenColor.rgb * texColor.a) - (texColor.rgb * u_screenColor.rgb);" - "vec4 col_formask = texColor * u_baseColor;" - "vec4 clipMask = (1.0 - texture2D(s_texture1, v_clipPos.xy / v_clipPos.w)) * u_channelFlag;" - "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;" - "col_formask = col_formask * (1.0 - maskVal);" - "gl_FragColor = col_formask;" - "}"; -#endif - -CubismShader_Cocos2dx::CubismShader_Cocos2dx() -{ } - -CubismShader_Cocos2dx::~CubismShader_Cocos2dx() -{ - ReleaseShaderProgram(); -} - -CubismShader_Cocos2dx* CubismShader_Cocos2dx::GetInstance() -{ - if (s_instance == NULL) - { - s_instance = CSM_NEW CubismShader_Cocos2dx(); - } - return s_instance; -} - -void CubismShader_Cocos2dx::DeleteInstance() -{ - if (s_instance) - { - CSM_DELETE_SELF(CubismShader_Cocos2dx, s_instance); - s_instance = NULL; - } -} - -#ifdef CSM_TARGET_ANDROID_ES2 -csmBool CubismShader_Cocos2dx::s_extMode = false; -csmBool CubismShader_Cocos2dx::s_extPAMode = false; -void CubismShader_Cocos2dx::SetExtShaderMode(csmBool extMode, csmBool extPAMode) { - s_extMode = extMode; - s_extPAMode = extPAMode; -} -#endif - -void CubismShader_Cocos2dx::GenerateShaders() -{ - for (csmInt32 i = 0; i < ShaderCount; i++) - { - _shaderSets.PushBack(CSM_NEW CubismShaderSet()); - } - -#ifdef CSM_TARGET_ANDROID_ES2 - if (s_extMode) - { - _shaderSets[0]->ShaderProgram = LoadShaderProgram(VertShaderSrcSetupMask, FragShaderSrcSetupMaskTegra); - - _shaderSets[1]->ShaderProgram = LoadShaderProgram(VertShaderSrc, FragShaderSrcTegra); - _shaderSets[2]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMaskTegra); - _shaderSets[3]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMaskInvertedTegra); - _shaderSets[4]->ShaderProgram = LoadShaderProgram(VertShaderSrc, FragShaderSrcPremultipliedAlphaTegra); - _shaderSets[5]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMaskPremultipliedAlphaTegra); - _shaderSets[6]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMaskInvertedPremultipliedAlphaTegra); - } - else - { - _shaderSets[0]->ShaderProgram = LoadShaderProgram(VertShaderSrcSetupMask, FragShaderSrcSetupMask); - - _shaderSets[1]->ShaderProgram = LoadShaderProgram(VertShaderSrc, FragShaderSrc); - _shaderSets[2]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMask); - _shaderSets[3]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMaskInverted); - _shaderSets[4]->ShaderProgram = LoadShaderProgram(VertShaderSrc, FragShaderSrcPremultipliedAlpha); - _shaderSets[5]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMaskPremultipliedAlpha); - _shaderSets[6]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMaskInvertedPremultipliedAlpha); - } - - // 加算も通常と同じシェーダーを利用する - _shaderSets[7]->ShaderProgram = _shaderSets[1]->ShaderProgram; - _shaderSets[8]->ShaderProgram = _shaderSets[2]->ShaderProgram; - _shaderSets[9]->ShaderProgram = _shaderSets[3]->ShaderProgram; - _shaderSets[10]->ShaderProgram = _shaderSets[4]->ShaderProgram; - _shaderSets[11]->ShaderProgram = _shaderSets[5]->ShaderProgram; - _shaderSets[12]->ShaderProgram = _shaderSets[6]->ShaderProgram; - - // 乗算も通常と同じシェーダーを利用する - _shaderSets[13]->ShaderProgram = _shaderSets[1]->ShaderProgram; - _shaderSets[14]->ShaderProgram = _shaderSets[2]->ShaderProgram; - _shaderSets[15]->ShaderProgram = _shaderSets[3]->ShaderProgram; - _shaderSets[16]->ShaderProgram = _shaderSets[4]->ShaderProgram; - _shaderSets[17]->ShaderProgram = _shaderSets[5]->ShaderProgram; - _shaderSets[18]->ShaderProgram = _shaderSets[6]->ShaderProgram; - -#else - - _shaderSets[0]->ShaderProgram = LoadShaderProgram(VertShaderSrcSetupMask, FragShaderSrcSetupMask); - - _shaderSets[1]->ShaderProgram = LoadShaderProgram(VertShaderSrc, FragShaderSrc); - _shaderSets[2]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMask); - _shaderSets[3]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMaskInverted); - _shaderSets[4]->ShaderProgram = LoadShaderProgram(VertShaderSrc, FragShaderSrcPremultipliedAlpha); - _shaderSets[5]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMaskPremultipliedAlpha); - _shaderSets[6]->ShaderProgram = LoadShaderProgram(VertShaderSrcMasked, FragShaderSrcMaskInvertedPremultipliedAlpha); - - - - // 加算も通常と同じシェーダーを利用する - _shaderSets[7]->ShaderProgram = _shaderSets[1]->ShaderProgram; - _shaderSets[8]->ShaderProgram = _shaderSets[2]->ShaderProgram; - _shaderSets[9]->ShaderProgram = _shaderSets[3]->ShaderProgram; - _shaderSets[10]->ShaderProgram = _shaderSets[4]->ShaderProgram; - _shaderSets[11]->ShaderProgram = _shaderSets[5]->ShaderProgram; - _shaderSets[12]->ShaderProgram = _shaderSets[6]->ShaderProgram; - - - // 乗算も通常と同じシェーダーを利用する - _shaderSets[13]->ShaderProgram = _shaderSets[1]->ShaderProgram; - _shaderSets[14]->ShaderProgram = _shaderSets[2]->ShaderProgram; - _shaderSets[15]->ShaderProgram = _shaderSets[3]->ShaderProgram; - _shaderSets[16]->ShaderProgram = _shaderSets[4]->ShaderProgram; - _shaderSets[17]->ShaderProgram = _shaderSets[5]->ShaderProgram; - _shaderSets[18]->ShaderProgram = _shaderSets[6]->ShaderProgram; -#endif - - // SetupMask - _shaderSets[0]->AttributePositionLocation = _shaderSets[0]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[0]->AttributeTexCoordLocation = _shaderSets[0]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[0]->SamplerTexture0Location = _shaderSets[0]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[0]->UniformClipMatrixLocation = _shaderSets[0]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[0]->UnifromChannelFlagLocation = _shaderSets[0]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[0]->UniformBaseColorLocation = _shaderSets[0]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[0]->UniformMultiplyColorLocation = _shaderSets[0]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[0]->UniformScreenColorLocation = _shaderSets[0]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 通常 - _shaderSets[1]->AttributePositionLocation = _shaderSets[1]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[1]->AttributeTexCoordLocation = _shaderSets[1]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[1]->SamplerTexture0Location = _shaderSets[1]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[1]->UniformMatrixLocation = _shaderSets[1]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[1]->UniformBaseColorLocation = _shaderSets[1]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[1]->UniformMultiplyColorLocation = _shaderSets[1]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[1]->UniformScreenColorLocation = _shaderSets[1]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 通常(クリッピング) - _shaderSets[2]->AttributePositionLocation = _shaderSets[2]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[2]->AttributeTexCoordLocation = _shaderSets[2]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[2]->SamplerTexture0Location = _shaderSets[2]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[2]->SamplerTexture1Location = _shaderSets[2]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[2]->UniformMatrixLocation = _shaderSets[2]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[2]->UniformClipMatrixLocation = _shaderSets[2]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[2]->UnifromChannelFlagLocation = _shaderSets[2]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[2]->UniformBaseColorLocation = _shaderSets[2]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[2]->UniformMultiplyColorLocation = _shaderSets[2]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[2]->UniformScreenColorLocation = _shaderSets[2]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 通常(クリッピング・反転) - _shaderSets[3]->AttributePositionLocation = _shaderSets[3]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[3]->AttributeTexCoordLocation = _shaderSets[3]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[3]->SamplerTexture0Location = _shaderSets[3]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[3]->SamplerTexture1Location = _shaderSets[3]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[3]->UniformMatrixLocation = _shaderSets[3]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[3]->UniformClipMatrixLocation = _shaderSets[3]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[3]->UnifromChannelFlagLocation = _shaderSets[3]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[3]->UniformBaseColorLocation = _shaderSets[3]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[3]->UniformMultiplyColorLocation = _shaderSets[3]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[3]->UniformScreenColorLocation = _shaderSets[3]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 通常(PremultipliedAlpha) - _shaderSets[4]->AttributePositionLocation = _shaderSets[4]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[4]->AttributeTexCoordLocation = _shaderSets[4]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[4]->SamplerTexture0Location = _shaderSets[4]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[4]->UniformMatrixLocation = _shaderSets[4]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[4]->UniformBaseColorLocation = _shaderSets[4]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[4]->UniformMultiplyColorLocation = _shaderSets[4]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[4]->UniformScreenColorLocation = _shaderSets[4]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 通常(クリッピング、PremultipliedAlpha) - _shaderSets[5]->AttributePositionLocation = _shaderSets[5]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[5]->AttributeTexCoordLocation = _shaderSets[5]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[5]->SamplerTexture0Location = _shaderSets[5]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[5]->SamplerTexture1Location = _shaderSets[5]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[5]->UniformMatrixLocation = _shaderSets[5]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[5]->UniformClipMatrixLocation = _shaderSets[5]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[5]->UnifromChannelFlagLocation = _shaderSets[5]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[5]->UniformBaseColorLocation = _shaderSets[5]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[5]->UniformMultiplyColorLocation = _shaderSets[5]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[5]->UniformScreenColorLocation = _shaderSets[5]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 通常(クリッピング・反転、PremultipliedAlpha) - _shaderSets[6]->AttributePositionLocation = _shaderSets[6]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[6]->AttributeTexCoordLocation = _shaderSets[6]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[6]->SamplerTexture0Location = _shaderSets[6]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[6]->SamplerTexture1Location = _shaderSets[6]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[6]->UniformMatrixLocation = _shaderSets[6]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[6]->UniformClipMatrixLocation = _shaderSets[6]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[6]->UnifromChannelFlagLocation = _shaderSets[6]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[6]->UniformBaseColorLocation = _shaderSets[6]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[6]->UniformMultiplyColorLocation = _shaderSets[6]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[6]->UniformScreenColorLocation = _shaderSets[6]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 加算 - _shaderSets[7]->AttributePositionLocation = _shaderSets[7]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[7]->AttributeTexCoordLocation = _shaderSets[7]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[7]->SamplerTexture0Location = _shaderSets[7]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[7]->UniformMatrixLocation = _shaderSets[7]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[7]->UniformBaseColorLocation = _shaderSets[7]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[7]->UniformMultiplyColorLocation = _shaderSets[7]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[7]->UniformScreenColorLocation = _shaderSets[7]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 加算(クリッピング) - _shaderSets[8]->AttributePositionLocation = _shaderSets[8]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[8]->AttributeTexCoordLocation = _shaderSets[8]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[8]->SamplerTexture0Location = _shaderSets[8]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[8]->SamplerTexture1Location = _shaderSets[8]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[8]->UniformMatrixLocation = _shaderSets[8]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[8]->UniformClipMatrixLocation = _shaderSets[8]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[8]->UnifromChannelFlagLocation = _shaderSets[8]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[8]->UniformBaseColorLocation = _shaderSets[8]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[8]->UniformMultiplyColorLocation = _shaderSets[8]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[8]->UniformScreenColorLocation = _shaderSets[8]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 加算(クリッピング・反転) - _shaderSets[9]->AttributePositionLocation = _shaderSets[9]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[9]->AttributeTexCoordLocation = _shaderSets[9]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[9]->SamplerTexture0Location = _shaderSets[9]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[9]->SamplerTexture1Location = _shaderSets[9]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[9]->UniformMatrixLocation = _shaderSets[9]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[9]->UniformClipMatrixLocation = _shaderSets[9]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[9]->UnifromChannelFlagLocation = _shaderSets[9]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[9]->UniformBaseColorLocation = _shaderSets[9]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[9]->UniformMultiplyColorLocation = _shaderSets[9]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[9]->UniformScreenColorLocation = _shaderSets[9]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 加算(PremultipliedAlpha) - _shaderSets[10]->AttributePositionLocation = _shaderSets[10]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[10]->AttributeTexCoordLocation = _shaderSets[10]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[10]->SamplerTexture0Location = _shaderSets[10]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[10]->UniformMatrixLocation = _shaderSets[10]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[10]->UniformBaseColorLocation = _shaderSets[10]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[10]->UniformMultiplyColorLocation = _shaderSets[10]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[10]->UniformScreenColorLocation = _shaderSets[10]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 加算(クリッピング、PremultipliedAlpha) - _shaderSets[11]->AttributePositionLocation = _shaderSets[11]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[11]->AttributeTexCoordLocation = _shaderSets[11]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[11]->SamplerTexture0Location = _shaderSets[11]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[11]->SamplerTexture1Location = _shaderSets[11]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[11]->UniformMatrixLocation = _shaderSets[11]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[11]->UniformClipMatrixLocation = _shaderSets[11]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[11]->UnifromChannelFlagLocation = _shaderSets[11]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[11]->UniformBaseColorLocation = _shaderSets[11]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[11]->UniformMultiplyColorLocation = _shaderSets[11]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[11]->UniformScreenColorLocation = _shaderSets[11]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 加算(クリッピング・反転、PremultipliedAlpha) - _shaderSets[12]->AttributePositionLocation = _shaderSets[12]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[12]->AttributeTexCoordLocation = _shaderSets[12]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[12]->SamplerTexture0Location = _shaderSets[12]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[12]->SamplerTexture1Location = _shaderSets[12]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[12]->UniformMatrixLocation = _shaderSets[12]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[12]->UniformClipMatrixLocation = _shaderSets[12]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[12]->UnifromChannelFlagLocation = _shaderSets[12]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[12]->UniformBaseColorLocation = _shaderSets[12]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[12]->UniformMultiplyColorLocation = _shaderSets[12]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[12]->UniformScreenColorLocation = _shaderSets[12]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 乗算 - _shaderSets[13]->AttributePositionLocation = _shaderSets[13]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[13]->AttributeTexCoordLocation = _shaderSets[13]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[13]->SamplerTexture0Location = _shaderSets[13]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[13]->UniformMatrixLocation = _shaderSets[13]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[13]->UniformBaseColorLocation = _shaderSets[13]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[13]->UniformMultiplyColorLocation = _shaderSets[13]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[13]->UniformScreenColorLocation = _shaderSets[13]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 乗算(クリッピング) - _shaderSets[14]->AttributePositionLocation = _shaderSets[14]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[14]->AttributeTexCoordLocation = _shaderSets[14]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[14]->SamplerTexture0Location = _shaderSets[14]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[14]->SamplerTexture1Location = _shaderSets[14]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[14]->UniformMatrixLocation = _shaderSets[14]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[14]->UniformClipMatrixLocation = _shaderSets[14]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[14]->UnifromChannelFlagLocation = _shaderSets[14]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[14]->UniformBaseColorLocation = _shaderSets[14]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[14]->UniformMultiplyColorLocation = _shaderSets[14]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[14]->UniformScreenColorLocation = _shaderSets[14]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 乗算(クリッピング・反転) - _shaderSets[15]->AttributePositionLocation = _shaderSets[15]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[15]->AttributeTexCoordLocation = _shaderSets[15]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[15]->SamplerTexture0Location = _shaderSets[15]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[15]->SamplerTexture1Location = _shaderSets[15]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[15]->UniformMatrixLocation = _shaderSets[15]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[15]->UniformClipMatrixLocation = _shaderSets[15]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[15]->UnifromChannelFlagLocation = _shaderSets[15]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[15]->UniformBaseColorLocation = _shaderSets[15]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[15]->UniformMultiplyColorLocation = _shaderSets[15]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[15]->UniformScreenColorLocation = _shaderSets[15]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 乗算(PremultipliedAlpha) - _shaderSets[16]->AttributePositionLocation = _shaderSets[16]->ShaderProgram->getAttributeLocation( "a_position"); - _shaderSets[16]->AttributeTexCoordLocation = _shaderSets[16]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[16]->SamplerTexture0Location = _shaderSets[16]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[16]->UniformMatrixLocation = _shaderSets[16]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[16]->UniformBaseColorLocation = _shaderSets[16]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[16]->UniformMultiplyColorLocation = _shaderSets[16]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[16]->UniformScreenColorLocation = _shaderSets[16]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 乗算(クリッピング、PremultipliedAlpha) - _shaderSets[17]->AttributePositionLocation = _shaderSets[17]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[17]->AttributeTexCoordLocation = _shaderSets[17]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[17]->SamplerTexture0Location = _shaderSets[17]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[17]->SamplerTexture1Location = _shaderSets[17]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[17]->UniformMatrixLocation = _shaderSets[17]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[17]->UniformClipMatrixLocation = _shaderSets[17]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[17]->UnifromChannelFlagLocation = _shaderSets[17]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[17]->UniformBaseColorLocation = _shaderSets[17]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[17]->UniformMultiplyColorLocation = _shaderSets[17]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[17]->UniformScreenColorLocation = _shaderSets[17]->ShaderProgram->getUniformLocation("u_screenColor"); - - // 乗算(クリッピング・反転、PremultipliedAlpha) - _shaderSets[18]->AttributePositionLocation = _shaderSets[18]->ShaderProgram->getAttributeLocation("a_position"); - _shaderSets[18]->AttributeTexCoordLocation = _shaderSets[18]->ShaderProgram->getAttributeLocation("a_texCoord"); - _shaderSets[18]->SamplerTexture0Location = _shaderSets[18]->ShaderProgram->getUniformLocation("s_texture0"); - _shaderSets[18]->SamplerTexture1Location = _shaderSets[18]->ShaderProgram->getUniformLocation("s_texture1"); - _shaderSets[18]->UniformMatrixLocation = _shaderSets[18]->ShaderProgram->getUniformLocation("u_matrix"); - _shaderSets[18]->UniformClipMatrixLocation = _shaderSets[18]->ShaderProgram->getUniformLocation("u_clipMatrix"); - _shaderSets[18]->UnifromChannelFlagLocation = _shaderSets[18]->ShaderProgram->getUniformLocation("u_channelFlag"); - _shaderSets[18]->UniformBaseColorLocation = _shaderSets[18]->ShaderProgram->getUniformLocation("u_baseColor"); - _shaderSets[18]->UniformMultiplyColorLocation = _shaderSets[18]->ShaderProgram->getUniformLocation("u_multiplyColor"); - _shaderSets[18]->UniformScreenColorLocation = _shaderSets[18]->ShaderProgram->getUniformLocation("u_screenColor"); -} - -void CubismShader_Cocos2dx::SetupShaderProgramForMask(CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand* drawCommand, CubismRenderer_Cocos2dx* renderer - ,const CubismModel& model, const csmInt32 index) -{ - if (_shaderSets.GetSize() == 0) - { - GenerateShaders(); - } - - CubismShaderSet* shaderSet = _shaderSets[ShaderNames_SetupMask]; - - cocos2d::backend::BlendDescriptor* blendDescriptor = drawCommand->GetBlendDescriptor(); - blendDescriptor->sourceRGBBlendFactor = cocos2d::backend::BlendFactor::ZERO; - blendDescriptor->destinationRGBBlendFactor = cocos2d::backend::BlendFactor::ONE_MINUS_SRC_COLOR; - blendDescriptor->sourceAlphaBlendFactor = cocos2d::backend::BlendFactor::ZERO; - blendDescriptor->destinationAlphaBlendFactor = cocos2d::backend::BlendFactor::ONE_MINUS_SRC_ALPHA; - - cocos2d::PipelineDescriptor* pipelineDescriptor = drawCommand->GetPipelineDescriptor(); - cocos2d::backend::ProgramState* programState = pipelineDescriptor->programState; - if (!programState) - { - programState = new cocos2d::backend::ProgramState(shaderSet->ShaderProgram); - } - - //テクスチャ設定 - SetupTexture(renderer, programState, model, index, shaderSet); - - // 頂点属性の設定 - SetVertexAttributes(programState, shaderSet); - - // カラーチャンネル - CubismClippingContext_Cocos2dx* contextBuffer = renderer->GetClippingContextBufferForMask(); - SetColorChannel(renderer, programState, shaderSet, contextBuffer); - - //マスク用行列 - programState->setUniform(shaderSet->UniformClipMatrixLocation, - renderer->GetClippingContextBufferForMask()->_matrixForMask.GetArray(), - sizeof(float) * 16); - - // ユニフォーム変数設定 - csmRectF* rect = renderer->GetClippingContextBufferForMask()->_layoutBounds; - CubismRenderer::CubismTextureColor baseColor = {rect->X * 2.0f - 1.0f, rect->Y * 2.0f - 1.0f, rect->GetRight() * 2.0f - 1.0f, rect->GetBottom() * 2.0f - 1.0f}; - CubismRenderer::CubismTextureColor multiplyColor = model.GetMultiplyColor(index); - CubismRenderer::CubismTextureColor screenColor = model.GetScreenColor(index); - SetColorUniformVariables(programState, shaderSet, baseColor, multiplyColor, screenColor); - - programState->getVertexLayout()->setLayout(sizeof(csmFloat32) * 4); - blendDescriptor->blendEnabled = true; - pipelineDescriptor->programState = programState; -} - -void CubismShader_Cocos2dx::SetupShaderProgramForDraw(CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand* drawCommand - , CubismRenderer_Cocos2dx* renderer, const CubismModel& model, const csmInt32 index) -{ - if (_shaderSets.GetSize() == 0) - { - GenerateShaders(); - } - - // _shaderSets用offsetの計算 - const csmBool masked = renderer->GetClippingContextBufferForDraw() != NULL; // この描画オブジェクトはマスク対象か - const csmBool invertedMask = model.GetDrawableInvertedMask(index); - const csmBool isPremultipliedAlpha = renderer->IsPremultipliedAlpha(); - const csmInt32 offset = (masked ? ( invertedMask ? 2 : 1 ) : 0) + (isPremultipliedAlpha ? 3 : 0); - - CubismShaderSet* shaderSet; - cocos2d::backend::BlendDescriptor* blendDescriptor = drawCommand->GetBlendDescriptor(); - switch (model.GetDrawableBlendMode(index)) - { - case CubismRenderer::CubismBlendMode_Normal: - default: - shaderSet = _shaderSets[ShaderNames_Normal + offset]; - blendDescriptor->sourceRGBBlendFactor = cocos2d::backend::BlendFactor::ONE; - blendDescriptor->destinationRGBBlendFactor = cocos2d::backend::BlendFactor::ONE_MINUS_SRC_ALPHA; - blendDescriptor->sourceAlphaBlendFactor = cocos2d::backend::BlendFactor::ONE; - blendDescriptor->destinationAlphaBlendFactor = cocos2d::backend::BlendFactor::ONE_MINUS_SRC_ALPHA; - break; - - case CubismRenderer::CubismBlendMode_Additive: - shaderSet = _shaderSets[ShaderNames_Add + offset]; - blendDescriptor->sourceRGBBlendFactor = cocos2d::backend::BlendFactor::ONE; - blendDescriptor->destinationRGBBlendFactor = cocos2d::backend::BlendFactor::ONE; - blendDescriptor->sourceAlphaBlendFactor = cocos2d::backend::BlendFactor::ZERO; - blendDescriptor->destinationAlphaBlendFactor = cocos2d::backend::BlendFactor::ONE; - break; - - case CubismRenderer::CubismBlendMode_Multiplicative: - shaderSet = _shaderSets[ShaderNames_Mult + offset]; - blendDescriptor->sourceRGBBlendFactor = cocos2d::backend::BlendFactor::DST_COLOR; - blendDescriptor->destinationRGBBlendFactor = cocos2d::backend::BlendFactor::ONE_MINUS_SRC_ALPHA; - blendDescriptor->sourceAlphaBlendFactor = cocos2d::backend::BlendFactor::ZERO; - blendDescriptor->destinationAlphaBlendFactor = cocos2d::backend::BlendFactor::ONE; - break; - } - - cocos2d::PipelineDescriptor* pipelineDescriptor = drawCommand->GetPipelineDescriptor(); - cocos2d::backend::ProgramState* programState = pipelineDescriptor->programState; - if (!programState) - { - programState = new cocos2d::backend::ProgramState(shaderSet->ShaderProgram); - } - - //テクスチャ設定 - SetupTexture(renderer, programState, model, index, shaderSet); - - // 頂点属性の設定 - SetVertexAttributes(programState, shaderSet); - - if (masked) - { - // frameBufferに書かれたテクスチャ - cocos2d::Texture2D* tex = renderer->GetOffscreenSurface(renderer->GetClippingContextBufferForDraw()->_bufferIndex)->GetColorBuffer(); - - programState->setTexture(shaderSet->SamplerTexture1Location, 1, tex->getBackendTexture()); - - // View座標をClippingContextの座標に変換するための行列を設定 - programState->setUniform(shaderSet->UniformClipMatrixLocation, - renderer->GetClippingContextBufferForDraw()->_matrixForDraw.GetArray(), - sizeof(float) * 16); - - // カラーチャンネル - CubismClippingContext_Cocos2dx* contextBuffer = renderer->GetClippingContextBufferForDraw(); - SetColorChannel(renderer, programState, shaderSet, contextBuffer); - } - - //座標変換 - CubismMatrix44 matrix4x4 = renderer->GetMvpMatrix(); - programState->setUniform(shaderSet->UniformMatrixLocation, matrix4x4.GetArray(), sizeof(float) * 16); - - // ユニフォーム変数設定 - CubismRenderer::CubismTextureColor baseColor = renderer->GetModelColorWithOpacity(model.GetDrawableOpacity(index)); - CubismRenderer::CubismTextureColor multiplyColor = model.GetMultiplyColor(index); - CubismRenderer::CubismTextureColor screenColor = model.GetScreenColor(index); - SetColorUniformVariables(programState, shaderSet, baseColor, multiplyColor, screenColor); - - programState->getVertexLayout()->setLayout(sizeof(csmFloat32) * 4); - blendDescriptor->blendEnabled = true; - pipelineDescriptor->programState = programState; -} - -cocos2d::backend::Program* CubismShader_Cocos2dx::LoadShaderProgram(const csmChar* vertShaderSrc, const csmChar* fragShaderSrc) -{ - // cocos2dx対応 - // Create shader program. - return cocos2d::backend::Device::getInstance()->newProgram(vertShaderSrc, fragShaderSrc); -} - -void CubismShader_Cocos2dx::SetVertexAttributes(cocos2d::backend::ProgramState* programState, CubismShaderSet* shaderSet) -{ - // 頂点配列の設定 - programState->getVertexLayout()->setAttribute("a_position", shaderSet->AttributePositionLocation, cocos2d::backend::VertexFormat::FLOAT2, 0, false); - // テクスチャ頂点の設定 - programState->getVertexLayout()->setAttribute("a_texCoord", shaderSet->AttributeTexCoordLocation, cocos2d::backend::VertexFormat::FLOAT2, sizeof(csmFloat32) * 2, false); -} - -void CubismShader_Cocos2dx::SetupTexture(CubismRenderer_Cocos2dx* renderer, cocos2d::backend::ProgramState* programState - , const CubismModel& model, const csmInt32 index, CubismShaderSet* shaderSet) -{ - const csmInt32 textureIndex = model.GetDrawableTextureIndex(index); - cocos2d::Texture2D* texture = renderer->GetBindedTexture(textureIndex); - programState->setTexture(shaderSet->SamplerTexture0Location, 0, texture->getBackendTexture()); -} - -void CubismShader_Cocos2dx::SetColorUniformVariables(cocos2d::backend::ProgramState* programState, CubismShaderSet* shaderSet, CubismRenderer::CubismTextureColor& baseColor, - CubismRenderer::CubismTextureColor& multiplyColor, CubismRenderer::CubismTextureColor& screenColor) -{ - csmFloat32 base[4] = { baseColor.R, baseColor.G, baseColor.B, baseColor.A }; - csmFloat32 multiply[4] = { multiplyColor.R, multiplyColor.G, multiplyColor.B, multiplyColor.A }; - csmFloat32 screen[4] = { screenColor.R, screenColor.G, screenColor.B, screenColor.A }; - - programState->setUniform(shaderSet->UniformBaseColorLocation, base, sizeof(float) * 4); - programState->setUniform(shaderSet->UniformMultiplyColorLocation, multiply, sizeof(float) * 4); - programState->setUniform(shaderSet->UniformScreenColorLocation, screen, sizeof(float) * 4); -} - -void CubismShader_Cocos2dx::SetColorChannel(CubismRenderer_Cocos2dx* renderer, cocos2d::backend::ProgramState* programState, - CubismShaderSet* shaderSet, CubismClippingContext_Cocos2dx* contextBuffer) -{ - const csmInt32 channelIndex = contextBuffer->_layoutChannelIndex; - CubismRenderer::CubismTextureColor* colorChannel = contextBuffer->GetClippingManager()->GetChannelFlagAsColor(channelIndex); - csmFloat32 colorFlag[4] = { colorChannel->R, colorChannel->G, colorChannel->B, colorChannel->A }; - programState->setUniform(shaderSet->UnifromChannelFlagLocation, colorFlag, sizeof(float) * 4); -} - -}}}} -//------------ LIVE2D NAMESPACE ------------ diff --git a/src/Rendering/Cocos2d/CubismShader_Cocos2dx.hpp b/src/Rendering/Cocos2d/CubismShader_Cocos2dx.hpp deleted file mode 100644 index bb7b963..0000000 --- a/src/Rendering/Cocos2d/CubismShader_Cocos2dx.hpp +++ /dev/null @@ -1,199 +0,0 @@ -/** - * Copyright(c) Live2D Inc. All rights reserved. - * - * Use of this source code is governed by the Live2D Open Software license - * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. - */ - -#pragma once - -#include "CubismFramework.hpp" -#include "CubismCommandBuffer_Cocos2dx.hpp" -#include "CubismRenderer_Cocos2dx.hpp" -#include "Type/csmVector.hpp" - -#ifdef CSM_TARGET_ANDROID_ES2 -#include -#include -#include -#include -#endif - -#ifdef CSM_TARGET_IPHONE_ES2 -#include -#include -#endif - -#if defined(CSM_TARGET_WIN_GL) || defined(CSM_TARGET_LINUX_GL) -#include -#include -#endif - -#ifdef CSM_TARGET_MAC_GL -#ifndef CSM_TARGET_COCOS -#include -#endif -#include -#endif - -//------------ LIVE2D NAMESPACE ------------ -namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { - -// 前方宣言 -class CubismRenderer_Cocos2dx; -class CubismClippingContext_Cocos2dx; - -/** - * @brief Cocos2dx用のシェーダプログラムを生成・破棄するクラス
- * シングルトンなクラスであり、CubismShader_Cocos2dx::GetInstance()からアクセスする。 - */ -class CubismShader_Cocos2dx -{ -public: - /** - * @brief インスタンスを取得する(シングルトン)。 - * - * @return インスタンスのポインタ - */ - static CubismShader_Cocos2dx* GetInstance(); - - /** - * @brief インスタンスを解放する(シングルトン)。 - */ - static void DeleteInstance(); - - /** - * @brief マスク用のシェーダプログラムの一連のセットアップを実行する - * - * @param[in] drawCommand -> コマンドバッファ - * @param[in] renderer -> レンダラー - * @param[in] model -> 描画対象のモデル - * @param[in] index -> 描画対象のメッシュのインデックス - */ - void SetupShaderProgramForMask(CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand* drawCommand, CubismRenderer_Cocos2dx* renderer - ,const CubismModel& model, const csmInt32 index); - - /** - * @brief 描画用のシェーダプログラムの一連のセットアップを実行する - * - * @param[in] drawCommand -> コマンドバッファ - * @param[in] renderer -> レンダラー - * @param[in] model -> 描画対象のモデル - * @param[in] index -> 描画対象のメッシュのインデックス - */ - void SetupShaderProgramForDraw(CubismCommandBuffer_Cocos2dx::DrawCommandBuffer::DrawCommand* drawCommand, CubismRenderer_Cocos2dx* renderer - ,const CubismModel& model, const csmInt32 index); - -private: - /** - * @bref シェーダープログラムとシェーダ変数のアドレスを保持する構造体 - * - */ - struct CubismShaderSet - { - cocos2d::backend::Program* ShaderProgram; ///< シェーダプログラムのアドレス - unsigned int AttributePositionLocation; ///< シェーダプログラムに渡す変数のアドレス(Position) - unsigned int AttributeTexCoordLocation; ///< シェーダプログラムに渡す変数のアドレス(TexCoord) - cocos2d::backend::UniformLocation UniformMatrixLocation; ///< シェーダプログラムに渡す変数のアドレス(Matrix) - cocos2d::backend::UniformLocation UniformClipMatrixLocation; ///< シェーダプログラムに渡す変数のアドレス(ClipMatrix) - cocos2d::backend::UniformLocation SamplerTexture0Location; ///< シェーダプログラムに渡す変数のアドレス(Texture0) - cocos2d::backend::UniformLocation SamplerTexture1Location; ///< シェーダプログラムに渡す変数のアドレス(Texture1) - cocos2d::backend::UniformLocation UniformBaseColorLocation; ///< シェーダプログラムに渡す変数のアドレス(BaseColor) - cocos2d::backend::UniformLocation UniformMultiplyColorLocation; ///< シェーダプログラムに渡す変数のアドレス(MultiplyColor) - cocos2d::backend::UniformLocation UniformScreenColorLocation; ///< シェーダプログラムに渡す変数のアドレス(ScreenColor) - cocos2d::backend::UniformLocation UnifromChannelFlagLocation; ///< シェーダプログラムに渡す変数のアドレス(ChannelFlag) - }; - - /** - * @brief privateなコンストラクタ - */ - CubismShader_Cocos2dx(); - - /** - * @brief privateなデストラクタ - */ - virtual ~CubismShader_Cocos2dx(); - - /** - * @brief シェーダプログラムを解放する - */ - void ReleaseShaderProgram(); - - /** - * @brief シェーダプログラムを初期化する - */ - void GenerateShaders(); - - /** - * @brief シェーダプログラムをロードしてアドレス返す。 - * - * @param[in] vertShaderSrc -> 頂点シェーダのソース - * @param[in] fragShaderSrc -> フラグメントシェーダのソース - * - * @return シェーダプログラムのアドレス - */ - cocos2d::backend::Program* LoadShaderProgram(const csmChar* vertShaderSrc, const csmChar* fragShaderSrc); - - /** - * @brief 必要な頂点属性を設定する - * - * @param[in] programState -> cocos2dプログラムステート - * @param[in] shaderSet -> シェーダープログラムのセット - */ - void SetVertexAttributes(cocos2d::backend::ProgramState* programState, CubismShaderSet* shaderSet); - - /** - * @brief テクスチャの設定を行う - * - * @param[in] renderer -> レンダラー - * @param[in] programState -> cocos2dプログラムステート - * @param[in] model -> 描画対象のモデル - * @param[in] index -> 描画対象のメッシュのインデックス - * @param[in] shaderSet -> シェーダープログラムのセット - */ - void SetupTexture(CubismRenderer_Cocos2dx* renderer, cocos2d::backend::ProgramState* programState - , const CubismModel& model, const csmInt32 index, CubismShaderSet* shaderSet); - - /** - * @brief 色関連のユニフォーム変数の設定を行う - * - * @param[in] programState -> cocos2dプログラムステート - * @param[in] shaderSet -> シェーダープログラムのセット - * @param[in] baseColor -> ベースカラー - * @param[in] multiplyColor -> 乗算カラー - * @param[in] screenColor -> スクリーンカラー - */ - void SetColorUniformVariables(cocos2d::backend::ProgramState* programState, CubismShaderSet* shaderSet, CubismRenderer::CubismTextureColor& baseColor - , CubismRenderer::CubismTextureColor& multiplyColor, CubismRenderer::CubismTextureColor& screenColor); - - /** - * @brief カラーチャンネル関連のユニフォーム変数の設定を行う - * - * @param[in] renderer -> レンダラー - * @param[in] programState -> cocos2dプログラムステート - * @param[in] shaderSet -> シェーダープログラムのセット - * @param[in] contextBuffer -> 描画コンテキスト - */ - void SetColorChannel(CubismRenderer_Cocos2dx* renderer, cocos2d::backend::ProgramState* programState, - CubismShaderSet* shaderSet, CubismClippingContext_Cocos2dx* contextBuffer); - -#ifdef CSM_TARGET_ANDROID_ES2 -public: - /** - * @brief Tegraプロセッサ対応。拡張方式による描画の有効・無効 - * - * @param[in] extMode -> trueなら拡張方式で描画する - * @param[in] extPAMode -> trueなら拡張方式のPA設定を有効にする - */ - static void SetExtShaderMode(csmBool extMode, csmBool extPAMode); - -private: - static csmBool s_extMode; ///< Tegra対応.拡張方式で描画 - static csmBool s_extPAMode; ///< 拡張方式のPA設定用の変数 -#endif - - csmVector _shaderSets; ///< ロードしたシェーダプログラムを保持する変数 -}; - -}}}} -//------------ LIVE2D NAMESPACE ------------ diff --git a/src/Rendering/D3D11/CubismRenderState_D3D11.cpp b/src/Rendering/D3D11/CubismRenderState_D3D11.cpp index 0674c11..7157164 100644 --- a/src/Rendering/D3D11/CubismRenderState_D3D11.cpp +++ b/src/Rendering/D3D11/CubismRenderState_D3D11.cpp @@ -200,12 +200,6 @@ void CubismRenderState_D3D11::Create(ID3D11Device* device) samplerDesc.BorderColor[0] = samplerDesc.BorderColor[1] = samplerDesc.BorderColor[2] = samplerDesc.BorderColor[3] = 1.0f; device->CreateSamplerState(&samplerDesc, &sampler); _samplerState.PushBack(sampler); - - // anisotropy - samplerDesc.Filter = D3D11_FILTER_ANISOTROPIC; - samplerDesc.MaxAnisotropy = 2; - device->CreateSamplerState(&samplerDesc, &sampler); - _samplerState.PushBack(sampler); } void CubismRenderState_D3D11::StartFrame() @@ -362,7 +356,7 @@ void CubismRenderState_D3D11::SetZEnable(ID3D11DeviceContext* renderContext, Dep _stored._valid[State_ZEnable] = true; } -void CubismRenderState_D3D11::SetSampler(ID3D11DeviceContext* renderContext, Sampler sample, csmFloat32 anisotropy, csmBool force) +void CubismRenderState_D3D11::SetSampler(ID3D11DeviceContext* renderContext, Sampler sample, csmFloat32 anisotropy, ID3D11Device* device, csmBool force) { if (!renderContext || sample<0 || Sampler_Max <= sample) {// パラメータ異常チェック @@ -372,7 +366,8 @@ void CubismRenderState_D3D11::SetSampler(ID3D11DeviceContext* renderContext, Sam if (!_stored._valid[State_ZEnable] || force || _stored._sampler != sample) { - if (anisotropy > 0.0 && sample == Sampler_Anisotropy) { + if (anisotropy > 0.0f && sample == Sampler_Anisotropy && device != NULL) + { // Sampler ID3D11SamplerState* sampler; D3D11_SAMPLER_DESC samplerDesc; @@ -381,6 +376,9 @@ void CubismRenderState_D3D11::SetSampler(ID3D11DeviceContext* renderContext, Sam sampler->GetDesc(&samplerDesc); samplerDesc.Filter = D3D11_FILTER_ANISOTROPIC; samplerDesc.MaxAnisotropy = anisotropy; + + device->CreateSamplerState(&samplerDesc, &sampler); + _samplerState.PushBack(sampler); } // 0番だけ使用している diff --git a/src/Rendering/D3D11/CubismRenderState_D3D11.hpp b/src/Rendering/D3D11/CubismRenderState_D3D11.hpp index 7e687c9..934ce40 100644 --- a/src/Rendering/D3D11/CubismRenderState_D3D11.hpp +++ b/src/Rendering/D3D11/CubismRenderState_D3D11.hpp @@ -100,7 +100,7 @@ class CubismRenderState_D3D11 _viewportMaxZ = 0.0f; _sampler = Sampler_Normal; - _anisotropy = 0.0; + _anisotropy = 0.0f; memset(_valid, 0, sizeof(_valid)); } @@ -198,7 +198,7 @@ class CubismRenderState_D3D11 * @param renderContext[in] 描画コンテキスト * @param force[in] trueの場合は今の設定が何であろうと強制設定 */ - void SetSampler(ID3D11DeviceContext* renderContext, Sampler sample, csmFloat32 anisotropy = 0.0, csmBool force = false); + void SetSampler(ID3D11DeviceContext* renderContext, Sampler sample, csmFloat32 anisotropy = 0.0f, ID3D11Device* device = NULL, csmBool force = false); private: CubismRenderState_D3D11(); diff --git a/src/Rendering/D3D11/CubismRenderer_D3D11.cpp b/src/Rendering/D3D11/CubismRenderer_D3D11.cpp index c60237a..420b25a 100644 --- a/src/Rendering/D3D11/CubismRenderer_D3D11.cpp +++ b/src/Rendering/D3D11/CubismRenderer_D3D11.cpp @@ -1133,9 +1133,9 @@ void CubismRenderer_D3D11::UpdateConstantBuffer(CubismConstantBufferD3D11& cb, c void CubismRenderer_D3D11::SetSamplerAccordingToAnisotropy() { - if (GetAnisotropy() > 0.0) + if (GetAnisotropy() >= 1.0f) { - GetRenderStateManager()->SetSampler(s_context, CubismRenderState_D3D11::Sampler_Anisotropy, GetAnisotropy()); + GetRenderStateManager()->SetSampler(s_context, CubismRenderState_D3D11::Sampler_Anisotropy, GetAnisotropy(), s_device); } else { diff --git a/src/Rendering/D3D11/CubismShader_D3D11.cpp b/src/Rendering/D3D11/CubismShader_D3D11.cpp index ce2b549..38a1827 100644 --- a/src/Rendering/D3D11/CubismShader_D3D11.cpp +++ b/src/Rendering/D3D11/CubismShader_D3D11.cpp @@ -42,7 +42,7 @@ static const csmChar* CubismShaderEffectSrc = "Out.Position = mul(float4(In.pos, 0.0f, 1.0f), projectMatrix);"\ "Out.clipPosition = mul(float4(In.pos, 0.0f, 1.0f), projectMatrix);"\ "Out.uv.x = In.uv.x;"\ - "Out.uv.y = 1.0 - +In.uv.y;"\ + "Out.uv.y = 1.0f - +In.uv.y;"\ "return Out;"\ "}"\ "float4 PixelSetupMask(VS_OUT In) : SV_Target{"\ @@ -60,7 +60,7 @@ static const csmChar* CubismShaderEffectSrc = "VS_OUT Out = (VS_OUT)0;"\ "Out.Position = mul(float4(In.pos, 0.0f, 1.0f), projectMatrix);"\ "Out.uv.x = In.uv.x;"\ - "Out.uv.y = 1.0 - +In.uv.y;"\ + "Out.uv.y = 1.0f - +In.uv.y;"\ "return Out;"\ "}"\ "/* masked */"\ @@ -69,7 +69,7 @@ static const csmChar* CubismShaderEffectSrc = "Out.Position = mul(float4(In.pos, 0.0f, 1.0f), projectMatrix);"\ "Out.clipPosition = mul(float4(In.pos, 0.0f, 1.0f), clipMatrix);"\ "Out.uv.x = In.uv.x;"\ - "Out.uv.y = 1.0 - In.uv.y;"\ + "Out.uv.y = 1.0f - In.uv.y;"\ "return Out;"\ "}"\ \ @@ -100,7 +100,7 @@ static const csmChar* CubismShaderEffectSrc = "texColor.rgb = (texColor.rgb + screenColor.rgb) - (texColor.rgb * screenColor.rgb);"\ "float4 color = texColor * baseColor;"\ "color.xyz *= color.w;\n"\ - "float4 clipMask = (1.0 - maskTexture.Sample(mainSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;\n"\ + "float4 clipMask = (1.0f - maskTexture.Sample(mainSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;\n"\ "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;\n"\ "color = color * maskVal;\n"\ "return color;\n"\ @@ -112,9 +112,9 @@ static const csmChar* CubismShaderEffectSrc = "texColor.rgb = (texColor.rgb + screenColor.rgb) - (texColor.rgb * screenColor.rgb);"\ "float4 color = texColor * baseColor;"\ "color.xyz *= color.w;\n"\ - "float4 clipMask = (1.0 - maskTexture.Sample(mainSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;\n"\ + "float4 clipMask = (1.0f - maskTexture.Sample(mainSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;\n"\ "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;\n"\ - "color = color * (1.0 - maskVal);\n"\ + "color = color * (1.0f - maskVal);\n"\ "return color;\n"\ "}"\ "/* masked premult alpha */\n"\ @@ -123,7 +123,7 @@ static const csmChar* CubismShaderEffectSrc = "texColor.rgb = texColor.rgb * multiplyColor.rgb;"\ "texColor.rgb = (texColor.rgb + screenColor.rgb * texColor.a) - (texColor.rgb * screenColor.rgb);"\ "float4 color = texColor * baseColor;\n"\ - "float4 clipMask = (1.0 - maskTexture.Sample(mainSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;\n"\ + "float4 clipMask = (1.0f - maskTexture.Sample(mainSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;\n"\ "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;\n"\ "color = color * maskVal;\n"\ "return color;\n"\ @@ -134,9 +134,9 @@ static const csmChar* CubismShaderEffectSrc = "texColor.rgb = texColor.rgb * multiplyColor.rgb;"\ "texColor.rgb = (texColor.rgb + screenColor.rgb * texColor.a) - (texColor.rgb * screenColor.rgb);"\ "float4 color = texColor * baseColor;\n"\ - "float4 clipMask = (1.0 - maskTexture.Sample(mainSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;\n"\ + "float4 clipMask = (1.0f - maskTexture.Sample(mainSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;\n"\ "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;\n"\ - "color = color * (1.0 - maskVal);\n"\ + "color = color * (1.0f - maskVal);\n"\ "return color;\n"\ "}\n"; diff --git a/src/Rendering/D3D9/CubismRenderState_D3D9.cpp b/src/Rendering/D3D9/CubismRenderState_D3D9.cpp index 5d79543..b23caf8 100644 --- a/src/Rendering/D3D9/CubismRenderState_D3D9.cpp +++ b/src/Rendering/D3D9/CubismRenderState_D3D9.cpp @@ -223,13 +223,19 @@ void CubismRenderState_D3D9::SetTextureFilter(LPDIRECT3DDEVICE9 device, csmInt32 device->SetSamplerState(stage, D3DSAMP_MINFILTER, minFilter); device->SetSamplerState(stage, D3DSAMP_MAGFILTER, magFilter); + device->SetSamplerState(stage, D3DSAMP_MIPFILTER, mipFilter); device->SetSamplerState(stage, D3DSAMP_ADDRESSU, addressU); device->SetSamplerState(stage, D3DSAMP_ADDRESSV, addressV); - if (anisotropy > 0.0f) + + // 1以下だと無効 + if (anisotropy > 1.0f) { - device->SetSamplerState(stage, D3DSAMP_MIPFILTER, D3DTEXF_NONE); device->SetSamplerState(stage, D3DSAMP_MAXANISOTROPY, anisotropy); } + else + { + device->SetSamplerState(stage, D3DSAMP_MAXANISOTROPY, 1.0f); + } } _stored.MinFilter[stage] = minFilter; diff --git a/src/Rendering/D3D9/CubismRenderState_D3D9.hpp b/src/Rendering/D3D9/CubismRenderState_D3D9.hpp index dbe2c66..19a6c8a 100644 --- a/src/Rendering/D3D9/CubismRenderState_D3D9.hpp +++ b/src/Rendering/D3D9/CubismRenderState_D3D9.hpp @@ -75,14 +75,14 @@ class CubismRenderState_D3D9 MipFilter[0] = D3DTEXF_NONE; AddressU[0] = D3DTADDRESS_WRAP; AddressV[0] = D3DTADDRESS_WRAP; - Anisotropy[0] = 0.0f; + Anisotropy[0] = 1.0f; MinFilter[1] = D3DTEXF_NONE; MagFilter[1] = D3DTEXF_NONE; MipFilter[1] = D3DTEXF_NONE; AddressU[1] = D3DTADDRESS_WRAP; AddressV[1] = D3DTADDRESS_WRAP; - Anisotropy[1] = 0.0f; + Anisotropy[1] = 1.0f; memset(_valid, 0, sizeof(_valid)); } @@ -210,7 +210,7 @@ class CubismRenderState_D3D9 * @param addressU[in] アドレッシングモードU * @param addressV[in] アドレッシングモードV */ - void SetTextureFilter(LPDIRECT3DDEVICE9 device, csmInt32 stage, D3DTEXTUREFILTERTYPE minFilter, D3DTEXTUREFILTERTYPE magFilter, D3DTEXTUREFILTERTYPE mipFilter, D3DTEXTUREADDRESS addressU, D3DTEXTUREADDRESS addressV, csmFloat32 anisotropy = 0.0, csmBool force = false); + void SetTextureFilter(LPDIRECT3DDEVICE9 device, csmInt32 stage, D3DTEXTUREFILTERTYPE minFilter, D3DTEXTUREFILTERTYPE magFilter, D3DTEXTUREFILTERTYPE mipFilter, D3DTEXTUREADDRESS addressU, D3DTEXTUREADDRESS addressV, csmFloat32 anisotropy = 1.0f, csmBool force = false); private: CubismRenderState_D3D9(); diff --git a/src/Rendering/D3D9/CubismRenderer_D3D9.cpp b/src/Rendering/D3D9/CubismRenderer_D3D9.cpp index b3b313d..9b8f055 100644 --- a/src/Rendering/D3D9/CubismRenderer_D3D9.cpp +++ b/src/Rendering/D3D9/CubismRenderer_D3D9.cpp @@ -686,7 +686,7 @@ void CubismRenderer_D3D9::ExecuteDrawForMask(const CubismModel& model, const csm shaderEffect->BeginPass(0); // マスクには線形補間を適用 - GetRenderStateManager()->SetTextureFilter(s_useDevice, 1, D3DTEXF_LINEAR, D3DTEXF_LINEAR, D3DTEXF_LINEAR, D3DTADDRESS_WRAP, D3DTADDRESS_WRAP); + GetRenderStateManager()->SetTextureFilter(s_useDevice, 1, D3DTEXF_LINEAR, D3DTEXF_LINEAR, D3DTEXF_NONE, D3DTADDRESS_WRAP, D3DTADDRESS_WRAP); // 定数バッファ { @@ -1052,14 +1052,14 @@ void CubismRenderer_D3D9::SetTechniqueForDraw(const CubismModel& model, const cs void CubismRenderer_D3D9::SetTextureFilter() const { - if (GetAnisotropy() > 0.0) - { - GetRenderStateManager()->SetTextureFilter(s_useDevice, 0, D3DTEXF_ANISOTROPIC, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTADDRESS_WRAP, D3DTADDRESS_WRAP, GetAnisotropy()); - } - else - { - GetRenderStateManager()->SetTextureFilter(s_useDevice, 0, D3DTEXF_LINEAR, D3DTEXF_LINEAR, D3DTEXF_LINEAR, D3DTADDRESS_WRAP, D3DTADDRESS_WRAP); - } + if (GetAnisotropy() > 1.0f) + { + GetRenderStateManager()->SetTextureFilter(s_useDevice, 0, D3DTEXF_ANISOTROPIC, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTADDRESS_WRAP, D3DTADDRESS_WRAP, GetAnisotropy()); + } + else + { + GetRenderStateManager()->SetTextureFilter(s_useDevice, 0, D3DTEXF_LINEAR, D3DTEXF_LINEAR, D3DTEXF_LINEAR, D3DTADDRESS_WRAP, D3DTADDRESS_WRAP); + } } void CubismRenderer_D3D9::SetColorVectors(ID3DXEffect* shaderEffect, CubismTextureColor& baseColor, CubismTextureColor& multiplyColor, CubismTextureColor& screenColor) diff --git a/src/Rendering/D3D9/CubismShader_D3D9.cpp b/src/Rendering/D3D9/CubismShader_D3D9.cpp index fdc10e3..d02996a 100644 --- a/src/Rendering/D3D9/CubismShader_D3D9.cpp +++ b/src/Rendering/D3D9/CubismShader_D3D9.cpp @@ -45,7 +45,7 @@ static const csmChar* CubismShaderEffectSrc = "Out.Position = mul(float4(In.pos, 0.0f, 1.0f), projectMatrix);"\ "Out.clipPosition = mul(float4(In.pos, 0.0f, 1.0f), projectMatrix);"\ "Out.uv.x = In.uv.x;"\ - "Out.uv.y = 1.0 - +In.uv.y;"\ + "Out.uv.y = 1.0f - +In.uv.y;"\ "return Out;"\ "}"\ "float4 PixelSetupMask(VS_OUT In) : COLOR0{"\ @@ -63,7 +63,7 @@ static const csmChar* CubismShaderEffectSrc = "VS_OUT Out = (VS_OUT)0;"\ "Out.Position = mul(float4(In.pos, 0.0f, 1.0f), projectMatrix);"\ "Out.uv.x = In.uv.x;"\ - "Out.uv.y = 1.0 - +In.uv.y;"\ + "Out.uv.y = 1.0f - +In.uv.y;"\ "return Out;"\ "}"\ "/* masked */"\ @@ -72,7 +72,7 @@ static const csmChar* CubismShaderEffectSrc = "Out.Position = mul(float4(In.pos, 0.0f, 1.0f), projectMatrix);"\ "Out.clipPosition = mul(float4(In.pos, 0.0f, 1.0f), clipMatrix);"\ "Out.uv.x = In.uv.x;"\ - "Out.uv.y = 1.0 - In.uv.y;"\ + "Out.uv.y = 1.0f - In.uv.y;"\ "return Out;"\ "}"\ \ @@ -103,7 +103,7 @@ static const csmChar* CubismShaderEffectSrc = "texColor.rgb = (texColor.rgb + screenColor.rgb) - (texColor.rgb * screenColor.rgb);"\ "float4 color = texColor * baseColor;"\ "color.xyz *= color.w;"\ - "float4 clipMask = (1.0 - tex2D(maskSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;"\ + "float4 clipMask = (1.0f - tex2D(maskSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;"\ "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;"\ "color = color * maskVal;"\ "return color;"\ @@ -115,9 +115,9 @@ static const csmChar* CubismShaderEffectSrc = "texColor.rgb = (texColor.rgb + screenColor.rgb) - (texColor.rgb * screenColor.rgb);"\ "float4 color = texColor * baseColor;"\ "color.xyz *= color.w;"\ - "float4 clipMask = (1.0 - tex2D(maskSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;"\ + "float4 clipMask = (1.0f - tex2D(maskSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;"\ "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;"\ - "color = color * (1.0 - maskVal);"\ + "color = color * (1.0f - maskVal);"\ "return color;"\ "}"\ "/* masked premult alpha */"\ @@ -126,7 +126,7 @@ static const csmChar* CubismShaderEffectSrc = "texColor.rgb = texColor.rgb * multiplyColor.rgb;"\ "texColor.rgb = (texColor.rgb + screenColor.rgb * texColor.a) - (texColor.rgb * screenColor.rgb);"\ "float4 color = texColor * baseColor;"\ - "float4 clipMask = (1.0 - tex2D(maskSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;"\ + "float4 clipMask = (1.0f - tex2D(maskSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;"\ "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;"\ "color = color * maskVal;"\ "return color;"\ @@ -137,9 +137,9 @@ static const csmChar* CubismShaderEffectSrc = "texColor.rgb = texColor.rgb * multiplyColor.rgb;"\ "texColor.rgb = (texColor.rgb + screenColor.rgb * texColor.a) - (texColor.rgb * screenColor.rgb);"\ "float4 color = texColor * baseColor;"\ - "float4 clipMask = (1.0 - tex2D(maskSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;"\ + "float4 clipMask = (1.0f - tex2D(maskSampler, In.clipPosition.xy / In.clipPosition.w)) * channelFlag;"\ "float maskVal = clipMask.r + clipMask.g + clipMask.b + clipMask.a;"\ - "color = color * (1.0 - maskVal);"\ + "color = color * (1.0f - maskVal);"\ "return color;"\ "}"\ \ diff --git a/src/Rendering/Metal/CubismShader_Metal.mm b/src/Rendering/Metal/CubismShader_Metal.mm index 2523f28..70f0a70 100644 --- a/src/Rendering/Metal/CubismShader_Metal.mm +++ b/src/Rendering/Metal/CubismShader_Metal.mm @@ -472,7 +472,7 @@ samplerDescriptor.mipFilter = MTLSamplerMipFilterLinear; //異方性フィルタリング - if (renderer->GetAnisotropy() > 0.0f) + if (renderer->GetAnisotropy() >= 1.0f) { samplerDescriptor.maxAnisotropy = renderer->GetAnisotropy(); } diff --git a/src/Rendering/OpenGL/CubismOffscreenSurface_OpenGLES2.hpp b/src/Rendering/OpenGL/CubismOffscreenSurface_OpenGLES2.hpp index 83c3879..8f6290a 100644 --- a/src/Rendering/OpenGL/CubismOffscreenSurface_OpenGLES2.hpp +++ b/src/Rendering/OpenGL/CubismOffscreenSurface_OpenGLES2.hpp @@ -37,6 +37,11 @@ #include #endif +#ifdef CSM_TARGET_HARMONYOS_ES3 +#include +#include +#endif + //------------ LIVE2D NAMESPACE ------------ namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { diff --git a/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.cpp b/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.cpp index e608f64..b5fdf7b 100644 --- a/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.cpp +++ b/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.cpp @@ -519,7 +519,7 @@ void CubismRenderer_OpenGLES2::PreDraw() glBindBuffer(GL_ARRAY_BUFFER, 0); //前にバッファがバインドされていたら破棄する必要がある //異方性フィルタリング。プラットフォームのOpenGLによっては未対応の場合があるので、未設定のときは設定しない - if (GetAnisotropy() > 0.0f) + if (GetAnisotropy() >= 1.0f) { for (csmInt32 i = 0; i < _textures.GetSize(); i++) { diff --git a/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.hpp b/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.hpp index 421e13c..9aa585e 100644 --- a/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.hpp +++ b/src/Rendering/OpenGL/CubismRenderer_OpenGLES2.hpp @@ -41,6 +41,11 @@ #include #endif +#ifdef CSM_TARGET_HARMONYOS_ES3 +#include +#include +#endif + //------------ LIVE2D NAMESPACE ------------ namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { diff --git a/src/Rendering/OpenGL/CubismShader_OpenGLES2.cpp b/src/Rendering/OpenGL/CubismShader_OpenGLES2.cpp index f97eca0..ffd2641 100644 --- a/src/Rendering/OpenGL/CubismShader_OpenGLES2.cpp +++ b/src/Rendering/OpenGL/CubismShader_OpenGLES2.cpp @@ -62,7 +62,7 @@ enum ShaderNames // SetupMask static const csmChar* VertShaderSrcSetupMask = -#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) +#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) || defined(CSM_TARGET_HARMONYOS_ES3) "#version 100\n" #else "#version 120\n" @@ -80,7 +80,7 @@ static const csmChar* VertShaderSrcSetupMask = "v_texCoord.y = 1.0 - v_texCoord.y;" "}"; static const csmChar* FragShaderSrcSetupMask = -#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) +#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) || defined(CSM_TARGET_HARMONYOS_ES3) "#version 100\n" "precision " CSM_FRAGMENT_SHADER_FP_PRECISION " float;" #else @@ -126,7 +126,7 @@ static const csmChar* FragShaderSrcSetupMaskTegra = //----- バーテックスシェーダプログラム ----- // Normal & Add & Mult 共通 static const csmChar* VertShaderSrc = -#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) +#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) || defined(CSM_TARGET_HARMONYOS_ES3) "#version 100\n" #else "#version 120\n" @@ -144,7 +144,7 @@ static const csmChar* VertShaderSrc = // Normal & Add & Mult 共通(クリッピングされたものの描画用) static const csmChar* VertShaderSrcMasked = -#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) +#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) || defined(CSM_TARGET_HARMONYOS_ES3) "#version 100\n" #else "#version 120\n" @@ -166,7 +166,7 @@ static const csmChar* VertShaderSrcMasked = //----- フラグメントシェーダプログラム ----- // Normal & Add & Mult 共通 static const csmChar* FragShaderSrc = -#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) +#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) || defined(CSM_TARGET_HARMONYOS_ES3) "#version 100\n" "precision " CSM_FRAGMENT_SHADER_FP_PRECISION " float;" #else @@ -207,7 +207,7 @@ static const csmChar* FragShaderSrcTegra = // Normal & Add & Mult 共通 (PremultipliedAlpha) static const csmChar* FragShaderSrcPremultipliedAlpha = -#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) +#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) || defined(CSM_TARGET_HARMONYOS_ES3) "#version 100\n" "precision " CSM_FRAGMENT_SHADER_FP_PRECISION " float;" #else @@ -246,7 +246,7 @@ static const csmChar* FragShaderSrcPremultipliedAlphaTegra = // Normal & Add & Mult 共通(クリッピングされたものの描画用) static const csmChar* FragShaderSrcMask = -#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) +#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) || defined(CSM_TARGET_HARMONYOS_ES3) "#version 100\n" "precision " CSM_FRAGMENT_SHADER_FP_PRECISION " float;" #else @@ -301,7 +301,7 @@ static const csmChar* FragShaderSrcMaskTegra = // Normal & Add & Mult 共通(クリッピングされて反転使用の描画用) static const csmChar* FragShaderSrcMaskInverted = -#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) +#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) || defined(CSM_TARGET_HARMONYOS_ES3) "#version 100\n" "precision " CSM_FRAGMENT_SHADER_FP_PRECISION " float;" #else @@ -356,7 +356,7 @@ static const csmChar* FragShaderSrcMaskInvertedTegra = // Normal & Add & Mult 共通(クリッピングされたものの描画用、PremultipliedAlphaの場合) static const csmChar* FragShaderSrcMaskPremultipliedAlpha = -#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) +#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) || defined(CSM_TARGET_HARMONYOS_ES3) "#version 100\n" "precision " CSM_FRAGMENT_SHADER_FP_PRECISION " float;" #else @@ -409,7 +409,7 @@ static const csmChar* FragShaderSrcMaskPremultipliedAlphaTegra = // Normal & Add & Mult 共通(クリッピングされて反転使用の描画用、PremultipliedAlphaの場合) static const csmChar* FragShaderSrcMaskInvertedPremultipliedAlpha = -#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) +#if defined(CSM_TARGET_IPHONE_ES2) || defined(CSM_TARGET_ANDROID_ES2) || defined(CSM_TARGET_HARMONYOS_ES3) "#version 100\n" "precision " CSM_FRAGMENT_SHADER_FP_PRECISION " float;" #else @@ -473,6 +473,16 @@ void CubismShader_OpenGLES2::ReleaseShaderProgram() } } +void CubismShader_OpenGLES2::ReleaseInvalidShaderProgram() +{ + for (csmUint32 i = 0; i < _shaderSets.GetSize(); i++) + { + CSM_DELETE(_shaderSets[i]); + } + _shaderSets.Clear(); +} + + CubismShader_OpenGLES2::CubismShader_OpenGLES2() { } diff --git a/src/Rendering/OpenGL/CubismShader_OpenGLES2.hpp b/src/Rendering/OpenGL/CubismShader_OpenGLES2.hpp index 025ba93..88be58f 100644 --- a/src/Rendering/OpenGL/CubismShader_OpenGLES2.hpp +++ b/src/Rendering/OpenGL/CubismShader_OpenGLES2.hpp @@ -34,6 +34,11 @@ #include #endif +#ifdef CSM_TARGET_HARMONYOS_ES3 +#include +#include +#endif + //------------ LIVE2D NAMESPACE ------------ namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { @@ -60,6 +65,12 @@ class CubismShader_OpenGLES2 */ static void DeleteInstance(); + /** + * @brief 一部の環境でこのインスタンスが管理するリソースが破棄される場合があります。 + * このような場合に二重解放を避け無効になったリソースを破棄します。 + */ + void ReleaseInvalidShaderProgram(); + /** * @brief 描画用のシェーダプログラムの一連のセットアップを実行する * diff --git a/src/Rendering/Vulkan/CubismClass_Vulkan.cpp b/src/Rendering/Vulkan/CubismClass_Vulkan.cpp index 9b470fe..336d00d 100644 --- a/src/Rendering/Vulkan/CubismClass_Vulkan.cpp +++ b/src/Rendering/Vulkan/CubismClass_Vulkan.cpp @@ -176,7 +176,7 @@ void CubismImageVulkan::CreateView(VkDevice device, VkFormat format, VkImageAspe } } -void CubismImageVulkan::CreateSampler(VkDevice device, float maxAnistropy, +void CubismImageVulkan::CreateSampler(VkDevice device, csmFloat32 maxAnistropy, csmUint32 mipLevel) { VkSamplerCreateInfo samplerInfo{}; @@ -186,7 +186,6 @@ void CubismImageVulkan::CreateSampler(VkDevice device, float maxAnistropy, samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; - samplerInfo.anisotropyEnable = VK_TRUE; samplerInfo.maxAnisotropy = maxAnistropy; samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK; samplerInfo.unnormalizedCoordinates = VK_FALSE; @@ -197,6 +196,15 @@ void CubismImageVulkan::CreateSampler(VkDevice device, float maxAnistropy, samplerInfo.maxLod = static_cast(mipLevel); samplerInfo.mipLodBias = 0.0f; + if (maxAnistropy >= 1.0f) + { + samplerInfo.anisotropyEnable = VK_TRUE; + } + else + { + samplerInfo.anisotropyEnable = VK_FALSE; + } + if (vkCreateSampler(device, &samplerInfo, nullptr, &sampler) != VK_SUCCESS) { CubismLogError("failed to create texture sampler!"); diff --git a/src/Rendering/Vulkan/CubismClass_Vulkan.hpp b/src/Rendering/Vulkan/CubismClass_Vulkan.hpp index 6a90276..cb3816b 100644 --- a/src/Rendering/Vulkan/CubismClass_Vulkan.hpp +++ b/src/Rendering/Vulkan/CubismClass_Vulkan.hpp @@ -140,7 +140,7 @@ class CubismImageVulkan * @param[in] maxAnistropy -> 異方性の値の最大値 * @param[in] mipLevel -> ミップマップのレベル */ - void CreateSampler(VkDevice device, float maxAnistropy, csmUint32 mipLevel); + void CreateSampler(VkDevice device, csmFloat32 maxAnistropy, csmUint32 mipLevel); /** * @brief イメージのレイアウトを変更する diff --git a/src/Rendering/Vulkan/CubismOffscreenSurface_Vulkan.cpp b/src/Rendering/Vulkan/CubismOffscreenSurface_Vulkan.cpp index 121f1ab..3759de8 100644 --- a/src/Rendering/Vulkan/CubismOffscreenSurface_Vulkan.cpp +++ b/src/Rendering/Vulkan/CubismOffscreenSurface_Vulkan.cpp @@ -80,7 +80,7 @@ void CubismOffscreenSurface_Vulkan::CreateOffscreenSurface( csmUint32 displayBufferWidth, csmUint32 displayBufferHeight, VkFormat surfaceFormat, VkFormat depthFormat) { - _colorImage = new CubismImageVulkan; + _colorImage = CSM_NEW CubismImageVulkan; _colorImage->CreateImage(device, physicalDevice, displayBufferWidth, displayBufferHeight, 1, surfaceFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | @@ -88,7 +88,7 @@ void CubismOffscreenSurface_Vulkan::CreateOffscreenSurface( _colorImage->CreateView(device, surfaceFormat, VK_IMAGE_ASPECT_COLOR_BIT, 1); _colorImage->CreateSampler(device, 1.0, 1); - _depthImage = new CubismImageVulkan; + _depthImage = CSM_NEW CubismImageVulkan; _depthImage->CreateImage(device, physicalDevice, displayBufferWidth, displayBufferHeight, 1, depthFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT); @@ -103,11 +103,13 @@ void CubismOffscreenSurface_Vulkan::DestroyOffscreenSurface(VkDevice device) if (_colorImage != VK_NULL_HANDLE) { _colorImage->Destroy(device); + CSM_DELETE(_colorImage); _colorImage = VK_NULL_HANDLE; } if (_depthImage != VK_NULL_HANDLE) { _depthImage->Destroy(device); + CSM_DELETE(_depthImage); _depthImage = VK_NULL_HANDLE; } } diff --git a/src/Rendering/Vulkan/CubismRenderer_Vulkan.cpp b/src/Rendering/Vulkan/CubismRenderer_Vulkan.cpp index ae3dbdc..8e0e6d1 100644 --- a/src/Rendering/Vulkan/CubismRenderer_Vulkan.cpp +++ b/src/Rendering/Vulkan/CubismRenderer_Vulkan.cpp @@ -14,19 +14,20 @@ namespace Live2D { namespace Cubism { namespace Framework { namespace Rendering { // 各種静的変数 namespace { +bool s_useRenderTarget = false; + VkDevice s_device = VK_NULL_HANDLE; VkPhysicalDevice s_physicalDevice = VK_NULL_HANDLE; VkCommandPool s_commandPool = VK_NULL_HANDLE; VkQueue s_queue = VK_NULL_HANDLE; -VkExtent2D s_swapchainExtent; -VkFormat s_swapchainImageFormat; +csmUint32 s_bufferSetNum = 0; + +// 描画対象情報 +VkExtent2D s_renderExtent; +VkImage s_renderImage; +VkImageView s_imageView; VkFormat s_imageFormat; -VkImage s_swapchainImage; -VkImageView s_swapchainImageView; VkFormat s_depthFormat; -bool s_useRenderTarget = false; -VkImage s_renderTargetImage; -VkImageView s_renderTargetImageView; } VkViewport GetViewport(csmFloat32 width, csmFloat32 height, csmFloat32 minDepth, csmFloat32 maxDepth) @@ -55,7 +56,7 @@ VkRect2D GetScissor(csmFloat32 offsetX, csmFloat32 offsetY, csmFloat32 width, cs void CubismClippingManager_Vulkan::SetupClippingContext(CubismModel& model, VkCommandBuffer commandBuffer, VkCommandBuffer updateCommandBuffer, - CubismRenderer_Vulkan* renderer) + CubismRenderer_Vulkan* renderer, csmInt32 offscreenCurrent) { // 全てのクリッピングを用意する // 同じクリップ(複数の場合はまとめて1つのクリップ)を使う場合は1度だけ設定する @@ -82,7 +83,7 @@ void CubismClippingManager_Vulkan::SetupClippingContext(CubismModel& model, VkCo // マスク作成処理 // 後の計算のためにインデックスの最初をセット - _currentMaskBuffer = renderer->GetMaskBuffer(0); + _currentMaskBuffer = renderer->GetMaskBuffer(offscreenCurrent, 0); // 1が無効(描かれない)領域、0が有効(描かれる)領域。(シェーダで Cd*Csで0に近い値をかけてマスクを作る。1をかけると何も起こらない) _currentMaskBuffer->BeginDraw(commandBuffer, 1.0f, 1.0f, 1.0f, 1.0f); @@ -134,7 +135,7 @@ void CubismClippingManager_Vulkan::SetupClippingContext(CubismModel& model, VkCo const csmFloat32 MARGIN = 0.05f; // clipContextに設定したオフスクリーンサーフェイスをインデックスで取得 - CubismOffscreenSurface_Vulkan* clipContextOffscreenSurface = renderer->GetMaskBuffer(clipContext->_bufferIndex); + CubismOffscreenSurface_Vulkan* clipContextOffscreenSurface = renderer->GetMaskBuffer(offscreenCurrent, clipContext->_bufferIndex); // 現在のオフスクリーンサーフェイスがclipContextのものと異なる場合 if (_currentMaskBuffer != clipContextOffscreenSurface) @@ -198,20 +199,6 @@ CubismClippingContext_Vulkan::CubismClippingContext_Vulkan( _isUsing = false; _owner = manager; - - // クリップしている(=マスク用の)Drawableのインデックスリスト - _clippingIdList = clippingDrawableIndices; - - // マスクの数 - _clippingIdCount = clipCount; - - _layoutChannelIndex = 0; - - _allClippedDrawRect = CSM_NEW csmRectF(); - _layoutBounds = CSM_NEW csmRectF(); - - _clippedDrawableIndexList = CSM_NEW csmVector(); - } CubismClippingContext_Vulkan::~CubismClippingContext_Vulkan() @@ -374,14 +361,7 @@ void CubismPipeline_Vulkan::PipelineResource::CreateGraphicsPipeline(std::string VkPipelineRenderingCreateInfo renderingInfo{}; renderingInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO; renderingInfo.colorAttachmentCount = 1; - if (s_useRenderTarget) - { - renderingInfo.pColorAttachmentFormats = &s_imageFormat; - } - else - { - renderingInfo.pColorAttachmentFormats = &s_swapchainImageFormat; - } + renderingInfo.pColorAttachmentFormats = &s_imageFormat; renderingInfo.depthAttachmentFormat = s_depthFormat; VkGraphicsPipelineCreateInfo pipelineInfo{}; @@ -479,9 +459,10 @@ void CubismPipeline_Vulkan::CreatePipelines(VkDescriptorSetLayout descriptorSetL return; } - for (csmInt32 i = 0; i < ShaderCount; i++) + _pipelineResource.Resize(ShaderCount); + for (csmInt32 i = 0; i < 7; i++) { - _pipelineResource.PushBack(CSM_NEW PipelineResource); + _pipelineResource[i] = CSM_NEW PipelineResource(); } _pipelineResource[0]->CreateGraphicsPipeline("FrameworkShaders/VertShaderSrcSetupMask.spv", "FrameworkShaders/FragShaderSrcSetupMask.spv", descriptorSetLayout); @@ -521,6 +502,8 @@ void CubismPipeline_Vulkan::ReleaseShaderProgram() for (csmInt32 i = 0; i < 7; i++) { _pipelineResource[i]->Release(); + CSM_DELETE(_pipelineResource[i]); + _pipelineResource[i] = NULL; } } @@ -546,43 +529,53 @@ CubismRenderer_Vulkan::CubismRenderer_Vulkan() : , _descriptorPool(VK_NULL_HANDLE) , _descriptorSetLayout(VK_NULL_HANDLE) , _clearColor() + , _commandBufferCurrent(0) {} CubismRenderer_Vulkan::~CubismRenderer_Vulkan() { + CSM_DELETE_SELF(CubismClippingManager_Vulkan, _clippingManager); + // オフスクリーンを作成していたのなら開放 - for (csmInt32 i = 0; i < _offscreenFrameBuffers.GetSize(); i++) + for (csmUint32 buffer = 0; buffer < _offscreenFrameBuffers.GetSize(); buffer++) { - _offscreenFrameBuffers[i].DestroyOffscreenSurface(s_device); + for (csmInt32 i = 0; i < _offscreenFrameBuffers[buffer].GetSize(); i++) + { + _offscreenFrameBuffers[buffer][i].DestroyOffscreenSurface(s_device); + } + _offscreenFrameBuffers[buffer].Clear(); } _offscreenFrameBuffers.Clear(); - _depthImage.Destroy(s_device); - vkDestroySemaphore(s_device, _updateFinishedSemaphore, nullptr); - vkDestroyDescriptorPool(s_device, _descriptorPool, nullptr); - vkDestroyDescriptorSetLayout(s_device, _descriptorSetLayout, nullptr); - for (csmUint32 i = 0; i < _vertexBuffers.GetSize(); i++) + // セマフォ解放 + for (csmUint32 buffer = 0; buffer < s_bufferSetNum; buffer++) { - _vertexBuffers[i].Destroy(s_device); + vkDestroySemaphore(s_device, _updateFinishedSemaphores[buffer], nullptr); } - for (csmUint32 i = 0; i < _stagingBuffers.GetSize(); i++) - { - _stagingBuffers[i].Destroy(s_device); - } + // ディスクリプタ関連解放 + vkDestroyDescriptorPool(s_device, _descriptorPool, nullptr); + vkDestroyDescriptorSetLayout(s_device, _descriptorSetLayout, nullptr); - for (csmUint32 i = 0; i < _indexBuffers.GetSize(); i++) + for (csmUint32 buffer = 0; buffer < s_bufferSetNum; buffer++) { - _indexBuffers[i].Destroy(s_device); + for (csmInt32 i = 0; i < _descriptorSets[buffer].GetSize(); i++) + { + _descriptorSets[buffer][i].uniformBuffer.Destroy(s_device); + } } - for (csmInt32 i = 0; i < _descriptorSets.GetSize(); i++) + // その他バッファ開放 + for (csmUint32 buffer = 0; buffer < s_bufferSetNum; buffer++) { - _descriptorSets[i].uniformBuffer.Destroy(s_device); + for (csmUint32 drawAssign = 0; drawAssign < _vertexBuffers[buffer].GetSize(); drawAssign++) + { + _vertexBuffers[buffer][drawAssign].Destroy(s_device); + _stagingBuffers[buffer][drawAssign].Destroy(s_device); + _indexBuffers[buffer][drawAssign].Destroy(s_device); + } } - - CSM_DELETE_SELF(CubismClippingManager_Vulkan, _clippingManager); } void CubismRenderer_Vulkan::DoStaticRelease() @@ -645,23 +638,19 @@ void CubismRenderer_Vulkan::SubmitCommand(VkCommandBuffer commandBuffer, VkSemap } -void CubismRenderer_Vulkan::InitializeConstantSettings( - VkDevice device, VkPhysicalDevice physicalDevice, - VkCommandPool commandPool, VkQueue queue, - VkExtent2D extent, VkFormat imageFormat, VkFormat surfaceFormat, VkImage swapchainImage, - VkImageView swapchainImageView, - VkFormat dFormat) +void CubismRenderer_Vulkan::InitializeConstantSettings(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool, VkQueue queue, + csmUint32 swapchainImageCount, VkExtent2D extent, VkImageView imageView, VkFormat imageFormat, VkFormat depthFormat) { s_device = device; s_physicalDevice = physicalDevice; s_commandPool = commandPool; s_queue = queue; - s_swapchainExtent = extent; - s_swapchainImageFormat = imageFormat; - s_imageFormat = surfaceFormat; - s_swapchainImage = swapchainImage; - s_swapchainImageView = swapchainImageView; - s_depthFormat = dFormat; + s_bufferSetNum = swapchainImageCount; + + s_renderExtent = extent; + s_imageView = imageView; + s_imageFormat = imageFormat; + s_depthFormat = depthFormat; } void CubismRenderer_Vulkan::EnableChangeRenderTarget() @@ -669,65 +658,67 @@ void CubismRenderer_Vulkan::EnableChangeRenderTarget() s_useRenderTarget = true; } -void CubismRenderer_Vulkan::SetRenderTarget(VkImage image, VkImageView imageview) -{ - s_renderTargetImage = image; - s_renderTargetImageView = imageview; -} - -void CubismRenderer_Vulkan::UpdateSwapchainVariable(VkExtent2D extent, VkImage image, - VkImageView imageView) +void CubismRenderer_Vulkan::SetRenderTarget(VkImage image, VkImageView view, VkFormat format, VkExtent2D extent) { - s_swapchainExtent = extent; - s_swapchainImage = image; - s_swapchainImageView = imageView; + s_renderImage = image; + s_imageView = view; + s_imageFormat = format; + s_renderExtent = extent; } -void CubismRenderer_Vulkan::UpdateRendererSettings(VkImage image, VkImageView imageView) +void CubismRenderer_Vulkan::SetImageExtent(VkExtent2D extent) { - s_swapchainImage = image; - s_swapchainImageView = imageView; + s_renderExtent = extent; } void CubismRenderer_Vulkan::CreateCommandBuffer() { - VkCommandBufferAllocateInfo allocInfo{}; - allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; - allocInfo.commandPool = s_commandPool; - allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; - allocInfo.commandBufferCount = 1; - if (vkAllocateCommandBuffers(s_device, &allocInfo, &updateCommandBuffer) != VK_SUCCESS || vkAllocateCommandBuffers( - s_device, &allocInfo, &drawCommandBuffer) != VK_SUCCESS) - { - CubismLogError("failed to allocate command buffers!"); + _updateCommandBuffers.Resize(s_bufferSetNum); + _drawCommandBuffers.Resize(s_bufferSetNum); + for (csmUint32 buffer = 0; buffer < s_bufferSetNum; buffer++) + { + VkCommandBufferAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + allocInfo.commandPool = s_commandPool; + allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + allocInfo.commandBufferCount = 1; + if (vkAllocateCommandBuffers(s_device, &allocInfo, &_updateCommandBuffers[buffer]) != VK_SUCCESS || + vkAllocateCommandBuffers(s_device, &allocInfo, &_drawCommandBuffers[buffer]) != VK_SUCCESS) + { + CubismLogError("failed to allocate command buffers!"); + } } } void CubismRenderer_Vulkan::CreateVertexBuffer() { const csmInt32 drawableCount = GetModel()->GetDrawableCount(); - _vertexBuffers.Resize(drawableCount); + _stagingBuffers.Resize(s_bufferSetNum); + _vertexBuffers.Resize(s_bufferSetNum); - for (csmInt32 drawAssign = 0; drawAssign < drawableCount; drawAssign++) + for (csmUint32 buffer = 0; buffer < s_bufferSetNum; buffer++) { - const csmInt32 vcount = GetModel()->GetDrawableVertexCount(drawAssign); - if (vcount != 0) + _stagingBuffers[buffer].Resize(drawableCount); + _vertexBuffers[buffer].Resize(drawableCount); + for (csmInt32 drawAssign = 0; drawAssign < drawableCount; drawAssign++) { - //頂点データは初期化できない - - VkDeviceSize bufferSize = sizeof(ModelVertex) * vcount; // 総長 構造体サイズ*個数 - CubismBufferVulkan stagingBuffer; - stagingBuffer.CreateBuffer(s_device, s_physicalDevice, bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); - - stagingBuffer.Map(s_device, bufferSize); - _stagingBuffers.PushBack(stagingBuffer); - - CubismBufferVulkan vertexBuffer; - vertexBuffer.CreateBuffer(s_device, s_physicalDevice, bufferSize, - VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - _vertexBuffers[drawAssign] = vertexBuffer; + const csmInt32 vcount = GetModel()->GetDrawableVertexCount(drawAssign); + if (vcount != 0) + { + VkDeviceSize bufferSize = sizeof(ModelVertex) * vcount; // 総長 構造体サイズ*個数 + + CubismBufferVulkan stagingBuffer; + stagingBuffer.CreateBuffer(s_device, s_physicalDevice, bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + stagingBuffer.Map(s_device, bufferSize); + _stagingBuffers[buffer][drawAssign] = stagingBuffer; + + CubismBufferVulkan vertexBuffer; + vertexBuffer.CreateBuffer(s_device, s_physicalDevice, bufferSize, + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + _vertexBuffers[buffer][drawAssign] = vertexBuffer; + } } } } @@ -735,36 +726,40 @@ void CubismRenderer_Vulkan::CreateVertexBuffer() void CubismRenderer_Vulkan::CreateIndexBuffer() { const csmInt32 drawableCount = GetModel()->GetDrawableCount(); - _indexBuffers.Resize(drawableCount); + _indexBuffers.Resize(s_bufferSetNum); - for (csmInt32 drawAssign = 0; drawAssign < drawableCount; drawAssign++) + for (csmUint32 buffer = 0; buffer < s_bufferSetNum; buffer++) { - const csmInt32 icount = GetModel()->GetDrawableVertexIndexCount(drawAssign); - if (icount != 0) + _indexBuffers[buffer].Resize(drawableCount); + for (csmInt32 drawAssign = 0; drawAssign < drawableCount; drawAssign++) { - VkDeviceSize bufferSize = sizeof(uint16_t) * icount; - const csmUint16* indices = GetModel()->GetDrawableVertexIndices(drawAssign); - - CubismBufferVulkan stagingBuffer; - stagingBuffer.CreateBuffer(s_device, s_physicalDevice, bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); - stagingBuffer.Map(s_device, bufferSize); - stagingBuffer.MemCpy(indices, bufferSize); - stagingBuffer.UnMap(s_device); - - CubismBufferVulkan indexBuffer; - indexBuffer.CreateBuffer(s_device, s_physicalDevice, bufferSize, - VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - - VkCommandBuffer commandBuffer = BeginSingleTimeCommands(); - - VkBufferCopy copyRegion{}; - copyRegion.size = bufferSize; - vkCmdCopyBuffer(commandBuffer, stagingBuffer.GetBuffer(), indexBuffer.GetBuffer(), 1, ©Region); - SubmitCommand(commandBuffer); - _indexBuffers[drawAssign] = indexBuffer; - stagingBuffer.Destroy(s_device); + const csmInt32 icount = GetModel()->GetDrawableVertexIndexCount(drawAssign); + if (icount != 0) + { + VkDeviceSize bufferSize = sizeof(uint16_t) * icount; + const csmUint16* indices = GetModel()->GetDrawableVertexIndices(drawAssign); + + CubismBufferVulkan stagingBuffer; + stagingBuffer.CreateBuffer(s_device, s_physicalDevice, bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + stagingBuffer.Map(s_device, bufferSize); + stagingBuffer.MemCpy(indices, bufferSize); + stagingBuffer.UnMap(s_device); + + CubismBufferVulkan indexBuffer; + indexBuffer.CreateBuffer(s_device, s_physicalDevice, bufferSize, + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + + VkCommandBuffer commandBuffer = BeginSingleTimeCommands(); + + VkBufferCopy copyRegion{}; + copyRegion.size = bufferSize; + vkCmdCopyBuffer(commandBuffer, stagingBuffer.GetBuffer(), indexBuffer.GetBuffer(), 1, ©Region); + SubmitCommand(commandBuffer); + _indexBuffers[buffer][drawAssign] = indexBuffer; + stagingBuffer.Destroy(s_device); + } } } } @@ -775,7 +770,8 @@ void CubismRenderer_Vulkan::CreateDescriptorSets() const csmInt32 drawableCount = GetModel()->GetDrawableCount(); csmInt32 textureCount = 2; csmInt32 drawModeCount = 2; // マスクされる描画と通常の描画 - csmInt32 descriptorSetCount = drawableCount * drawModeCount; + csmInt32 descriptorSetCountPerBuffer = drawableCount * drawModeCount; + csmInt32 descriptorSetCount = s_bufferSetNum * descriptorSetCountPerBuffer; VkDescriptorPoolSize poolSizes[2]{}; poolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; poolSizes[0].descriptorCount = descriptorSetCount; @@ -794,6 +790,7 @@ void CubismRenderer_Vulkan::CreateDescriptorSets() } // ディスクリプタセットレイアウトの作成 + // ユニフォームバッファ用 VkDescriptorSetLayoutBinding bindings[3]; bindings[0].binding = 0; bindings[0].descriptorCount = 1; @@ -801,12 +798,14 @@ void CubismRenderer_Vulkan::CreateDescriptorSets() 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; + // マスク用オフスクリーンに使用するテクスチャ bindings[2].binding = 2; bindings[2].descriptorCount = 1; bindings[2].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; @@ -823,45 +822,49 @@ void CubismRenderer_Vulkan::CreateDescriptorSets() CubismLogError("failed to create descriptor set layout!"); } - _descriptorSets.Resize(drawableCount); - - for (csmInt32 drawAssign = 0; drawAssign < drawableCount; drawAssign++) + // ディスクリプタセットの作成 + _descriptorSets.Resize(s_bufferSetNum); + for (csmUint32 buffer = 0; buffer < s_bufferSetNum; buffer++) { - _descriptorSets[drawAssign].uniformBuffer.CreateBuffer(s_device, s_physicalDevice, sizeof(ModelUBO), - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | - VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); - _descriptorSets[drawAssign].uniformBuffer.Map(s_device, VK_WHOLE_SIZE); - } + _descriptorSets[buffer].Resize(drawableCount); + for (csmInt32 drawAssign = 0; drawAssign < drawableCount; drawAssign++) + { + _descriptorSets[buffer][drawAssign].uniformBuffer.CreateBuffer(s_device, s_physicalDevice, sizeof(ModelUBO), + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | + VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + _descriptorSets[buffer][drawAssign].uniformBuffer.Map(s_device, VK_WHOLE_SIZE); + } - VkDescriptorSetAllocateInfo allocInfo{}; - allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - allocInfo.descriptorPool = _descriptorPool; - allocInfo.descriptorSetCount = descriptorSetCount; - csmVector layouts; - for (csmInt32 i = 0; i < descriptorSetCount; i++) - { - layouts.PushBack(_descriptorSetLayout); - } - allocInfo.pSetLayouts = layouts.GetPtr(); + VkDescriptorSetAllocateInfo allocInfo{}; + allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + allocInfo.descriptorPool = _descriptorPool; + allocInfo.descriptorSetCount = descriptorSetCountPerBuffer; + csmVector layouts; + for (csmInt32 i = 0; i < descriptorSetCountPerBuffer; i++) + { + layouts.PushBack(_descriptorSetLayout); + } + allocInfo.pSetLayouts = layouts.GetPtr(); - csmVector descriptorSets; - descriptorSets.Resize(descriptorSetCount); - if (vkAllocateDescriptorSets(s_device, &allocInfo, descriptorSets.GetPtr()) != VK_SUCCESS) - { - CubismLogError("failed to allocate descriptor sets!"); - } + csmVector descriptorSets; + descriptorSets.Resize(descriptorSetCountPerBuffer); + if (vkAllocateDescriptorSets(s_device, &allocInfo, descriptorSets.GetPtr()) != VK_SUCCESS) + { + CubismLogError("failed to allocate descriptor sets!"); + } - for (csmInt32 drawAssign = 0; drawAssign < drawableCount; drawAssign++) - { - _descriptorSets[drawAssign].descriptorSet = descriptorSets[drawAssign * 2]; - _descriptorSets[drawAssign].descriptorSetMasked = descriptorSets[drawAssign * 2 + 1]; + for (csmInt32 drawAssign = 0; drawAssign < drawableCount; drawAssign++) + { + _descriptorSets[buffer][drawAssign].descriptorSet = descriptorSets[drawAssign * 2]; + _descriptorSets[buffer][drawAssign].descriptorSetMasked = descriptorSets[drawAssign * 2 + 1]; + } } } void CubismRenderer_Vulkan::CreateDepthBuffer() { - _depthImage.CreateImage(s_device, s_physicalDevice, s_swapchainExtent.width, s_swapchainExtent.height, + _depthImage.CreateImage(s_device, s_physicalDevice, s_renderExtent.width, s_renderExtent.height, 1, s_depthFormat, VK_IMAGE_TILING_OPTIMAL, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT); _depthImage.CreateView(s_device, s_depthFormat, @@ -872,9 +875,13 @@ void CubismRenderer_Vulkan::InitializeRenderer() { vkCmdSetCullModeEXT = reinterpret_cast(vkGetDeviceProcAddr(s_device, "vkCmdSetCullModeEXT")); - VkSemaphoreCreateInfo semaphoreInfo{}; - semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; - vkCreateSemaphore(s_device, &semaphoreInfo, nullptr, &_updateFinishedSemaphore); + _updateFinishedSemaphores.Resize(s_bufferSetNum); + for (csmUint32 buffer = 0; buffer < s_bufferSetNum; buffer++) + { + VkSemaphoreCreateInfo semaphoreInfo{}; + semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + vkCreateSemaphore(s_device, &semaphoreInfo, nullptr, &_updateFinishedSemaphores[buffer]); + } CreateCommandBuffer(); CreateVertexBuffer(); @@ -925,15 +932,22 @@ void CubismRenderer_Vulkan::Initialize(CubismModel* model, csmInt32 maskBufferCo const csmInt32 bufferHeight = static_cast(_clippingManager->GetClippingMaskBufferSize().Y); _offscreenFrameBuffers.Clear(); - _offscreenFrameBuffers.Resize(maskBufferCount); - // バックバッファ分確保 - for (csmInt32 i = 0; i < maskBufferCount; i++) + + _offscreenFrameBuffers.Resize(s_bufferSetNum); + for (csmUint32 buffer = 0; buffer < s_bufferSetNum; buffer++) { - _offscreenFrameBuffers[i].CreateOffscreenSurface(s_device, s_physicalDevice, bufferWidth, bufferHeight, - s_imageFormat, s_depthFormat); + _offscreenFrameBuffers[buffer].Resize(maskBufferCount); + // バックバッファ分確保 + for (csmInt32 i = 0; i < maskBufferCount; i++) + { + _offscreenFrameBuffers[buffer][i].CreateOffscreenSurface(s_device, s_physicalDevice, bufferWidth, bufferHeight, + s_imageFormat, s_depthFormat); + } } } + _commandBufferCurrent = 0; + InitializeRenderer(); } @@ -953,11 +967,11 @@ void CubismRenderer_Vulkan::CopyToBuffer(csmInt32 drawAssign, const csmInt32 vco vertices.PushBack(vertex); } csmUint32 bufferSize = sizeof(ModelVertex) * vertices.GetSize(); - _stagingBuffers[drawAssign].MemCpy(vertices.GetPtr(), (size_t)bufferSize); + _stagingBuffers[_commandBufferCurrent][drawAssign].MemCpy(vertices.GetPtr(), (size_t)bufferSize); VkBufferCopy copyRegion{}; copyRegion.size = bufferSize; - vkCmdCopyBuffer(commandBuffer, _stagingBuffers[drawAssign].GetBuffer(), _vertexBuffers[drawAssign].GetBuffer(), 1, + vkCmdCopyBuffer(commandBuffer, _stagingBuffers[_commandBufferCurrent][drawAssign].GetBuffer(), _vertexBuffers[_commandBufferCurrent][drawAssign].GetBuffer(), 1, ©Region); } @@ -1030,9 +1044,9 @@ void CubismRenderer_Vulkan::UpdateDescriptorSet(Descriptor& descriptor, csmUint3 { VkDescriptorImageInfo imageInfo2{}; imageInfo2.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - imageInfo2.imageView = _offscreenFrameBuffers[GetClippingContextBufferForDraw()-> + imageInfo2.imageView = _offscreenFrameBuffers[_commandBufferCurrent][GetClippingContextBufferForDraw()-> _bufferIndex].GetTextureView(); - imageInfo2.sampler = _offscreenFrameBuffers[GetClippingContextBufferForDraw()-> + imageInfo2.sampler = _offscreenFrameBuffers[_commandBufferCurrent][GetClippingContextBufferForDraw()-> _bufferIndex].GetTextureSampler(); VkWriteDescriptorSet image2{}; image2.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; @@ -1074,7 +1088,7 @@ void CubismRenderer_Vulkan::ExecuteDrawForDraw(const CubismModel& model, const c break; } - Descriptor &descriptor = _descriptorSets[index]; + Descriptor &descriptor = _descriptorSets[_commandBufferCurrent][index]; ModelUBO ubo; if (masked) { @@ -1105,8 +1119,8 @@ void CubismRenderer_Vulkan::ExecuteDrawForDraw(const CubismModel& model, const c // ディスクリプタセットのバインド UpdateDescriptorSet(descriptor, textureIndex, masked); - VkDescriptorSet* descriptorSet = (masked ? &_descriptorSets[index].descriptorSetMasked - : &_descriptorSets[index].descriptorSet); + VkDescriptorSet* descriptorSet = (masked ? &_descriptorSets[_commandBufferCurrent][index].descriptorSetMasked + : &_descriptorSets[_commandBufferCurrent][index].descriptorSet); vkCmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, CubismPipeline_Vulkan::GetInstance()->GetPipelineLayout(shaderIndex, blendIndex), 0, 1, descriptorSet, 0, nullptr); @@ -1124,7 +1138,7 @@ void CubismRenderer_Vulkan::ExecuteDrawForMask(const CubismModel& model, const c csmUint32 shaderIndex = ShaderNames_SetupMask; csmUint32 blendIndex = Blend_Mask; - Descriptor &descriptor = _descriptorSets[index]; + Descriptor &descriptor = _descriptorSets[_commandBufferCurrent][index]; ModelUBO ubo; // クリッピング用行列の設定 @@ -1153,7 +1167,7 @@ void CubismRenderer_Vulkan::ExecuteDrawForMask(const CubismModel& model, const c UpdateDescriptorSet(descriptor, textureIndex, false); vkCmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, CubismPipeline_Vulkan::GetInstance()->GetPipelineLayout(shaderIndex, blendIndex), 0, 1, - &_descriptorSets[index].descriptorSet, 0, nullptr); + &_descriptorSets[_commandBufferCurrent][index].descriptorSet, 0, nullptr); // パイプラインのバインド vkCmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, @@ -1202,7 +1216,7 @@ void CubismRenderer_Vulkan::DrawMeshVulkan(const CubismModel& model, const csmIn CopyToBuffer(index, model.GetDrawableVertexCount(index), const_cast(model.GetDrawableVertices(index)), reinterpret_cast(const_cast(model.GetDrawableVertexUvs(index))), - updateCommandBuffer); + _updateCommandBuffers[_commandBufferCurrent]); if (GetClippingContextBufferForMask() != NULL) // マスク生成時 { @@ -1223,25 +1237,22 @@ void CubismRenderer_Vulkan::BeginRendering(VkCommandBuffer drawCommandBuffer, bo clearValue[0].color = _clearColor.color; clearValue[1].depthStencil = {1.0, 0}; + VkImageMemoryBarrier memoryBarrier{}; + memoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + memoryBarrier.srcAccessMask = VK_ACCESS_NONE; + memoryBarrier.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + memoryBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + memoryBarrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + memoryBarrier.image = s_renderImage; + memoryBarrier.subresourceRange = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; + vkCmdPipelineBarrier(drawCommandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier); + VkRenderingAttachmentInfoKHR colorAttachment{}; colorAttachment.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR; - if (s_useRenderTarget) - { - colorAttachment.imageView = s_renderTargetImageView; - if (isResume) - { - colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - } - else - { - colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; - } - } - else - { - colorAttachment.imageView = s_swapchainImageView; - colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; - } + colorAttachment.imageView = s_imageView; + colorAttachment.loadOp = ((s_useRenderTarget && !isResume)? VK_ATTACHMENT_LOAD_OP_CLEAR + : VK_ATTACHMENT_LOAD_OP_LOAD); colorAttachment.imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL; colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; colorAttachment.clearValue = *clearValue; @@ -1256,7 +1267,7 @@ void CubismRenderer_Vulkan::BeginRendering(VkCommandBuffer drawCommandBuffer, bo VkRenderingInfo renderingInfo{}; renderingInfo.sType = VK_STRUCTURE_TYPE_RENDERING_INFO; - renderingInfo.renderArea = {{0, 0}, {s_swapchainExtent}}; + renderingInfo.renderArea = {{0, 0}, {s_renderExtent}}; renderingInfo.layerCount = 1; renderingInfo.colorAttachmentCount = 1; renderingInfo.pColorAttachments = &colorAttachment; @@ -1270,36 +1281,24 @@ void CubismRenderer_Vulkan::EndRendering(VkCommandBuffer drawCommandBuffer) vkCmdEndRendering(drawCommandBuffer); // レイアウト変更 - if (s_useRenderTarget) - { - VkImageMemoryBarrier memoryBarrier{}; - memoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - memoryBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - memoryBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; - memoryBarrier.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - memoryBarrier.image = s_renderTargetImage; - memoryBarrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; - - vkCmdPipelineBarrier(drawCommandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier); - } - else - { - VkImageMemoryBarrier memoryBarrier{}; - memoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - memoryBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - memoryBarrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; - memoryBarrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; - memoryBarrier.image = s_swapchainImage; - memoryBarrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; - - vkCmdPipelineBarrier(drawCommandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, - VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier); - } + VkImageMemoryBarrier memoryBarrier{}; + memoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + memoryBarrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + memoryBarrier.dstAccessMask = VK_ACCESS_NONE; + memoryBarrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + memoryBarrier.newLayout = (s_useRenderTarget ? VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL : VK_IMAGE_LAYOUT_GENERAL); + memoryBarrier.image = s_renderImage; + memoryBarrier.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; + + vkCmdPipelineBarrier(drawCommandBuffer, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, + VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, 0, 0, nullptr, 0, nullptr, 1, &memoryBarrier); } void CubismRenderer_Vulkan::DoDrawModel() { + VkCommandBuffer updateCommandBuffer = _updateCommandBuffers[_commandBufferCurrent]; + VkCommandBuffer drawCommandBuffer = _drawCommandBuffers[_commandBufferCurrent]; + //------------ クリッピングマスク・バッファ前処理方式の場合 ------------ VkCommandBufferBeginInfo beginInfo{}; beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; @@ -1311,15 +1310,15 @@ void CubismRenderer_Vulkan::DoDrawModel() // サイズが違う場合はここで作成しなおし for (csmInt32 i = 0; i < _clippingManager->GetRenderTextureCount(); ++i) { - if (_offscreenFrameBuffers[i].GetBufferWidth() != static_cast( + if (_offscreenFrameBuffers[_commandBufferCurrent][i].GetBufferWidth() != static_cast( _clippingManager-> GetClippingMaskBufferSize().X) || - _offscreenFrameBuffers[i].GetBufferHeight() != static_cast( + _offscreenFrameBuffers[_commandBufferCurrent][i].GetBufferHeight() != static_cast( _clippingManager-> GetClippingMaskBufferSize().Y)) { - _offscreenFrameBuffers[i].DestroyOffscreenSurface(s_device); - _offscreenFrameBuffers[i].CreateOffscreenSurface( + _offscreenFrameBuffers[_commandBufferCurrent][i].DestroyOffscreenSurface(s_device); + _offscreenFrameBuffers[_commandBufferCurrent][i].CreateOffscreenSurface( s_device, s_physicalDevice, static_cast(_clippingManager->GetClippingMaskBufferSize().X), static_cast(_clippingManager->GetClippingMaskBufferSize().Y), @@ -1333,14 +1332,14 @@ void CubismRenderer_Vulkan::DoDrawModel() } else { - _clippingManager->SetupClippingContext(*GetModel(), drawCommandBuffer, updateCommandBuffer, this); + _clippingManager->SetupClippingContext(*GetModel(), drawCommandBuffer, updateCommandBuffer, this, _commandBufferCurrent); } } - SubmitCommand(updateCommandBuffer, _updateFinishedSemaphore); - SubmitCommand(drawCommandBuffer, VK_NULL_HANDLE, _updateFinishedSemaphore); + SubmitCommand(updateCommandBuffer, _updateFinishedSemaphores[_commandBufferCurrent]); + SubmitCommand(drawCommandBuffer, VK_NULL_HANDLE, _updateFinishedSemaphores[_commandBufferCurrent]); // スワップチェーンを再作成した際に深度バッファのサイズを更新する - if (_depthImage.GetWidth() != s_swapchainExtent.width || _depthImage.GetHeight() != s_swapchainExtent.height) + if (_depthImage.GetWidth() != s_renderExtent.width || _depthImage.GetHeight() != s_renderExtent.height) { _depthImage.Destroy(s_device); CreateDepthBuffer(); @@ -1383,12 +1382,12 @@ void CubismRenderer_Vulkan::DoDrawModel() EndRendering(drawCommandBuffer); // 描画順を考慮して今までに積んだコマンドを実行する - SubmitCommand(updateCommandBuffer, _updateFinishedSemaphore); - SubmitCommand(drawCommandBuffer, VK_NULL_HANDLE, _updateFinishedSemaphore); + SubmitCommand(updateCommandBuffer, _updateFinishedSemaphores[_commandBufferCurrent]); + SubmitCommand(drawCommandBuffer, VK_NULL_HANDLE, _updateFinishedSemaphores[_commandBufferCurrent]); vkBeginCommandBuffer(updateCommandBuffer, &beginInfo); vkBeginCommandBuffer(drawCommandBuffer, &beginInfo); - CubismOffscreenSurface_Vulkan* currentHighPrecisionMaskColorBuffer = &_offscreenFrameBuffers[clipContext->_bufferIndex]; + CubismOffscreenSurface_Vulkan* currentHighPrecisionMaskColorBuffer = &_offscreenFrameBuffers[_commandBufferCurrent][clipContext->_bufferIndex]; currentHighPrecisionMaskColorBuffer->BeginDraw(drawCommandBuffer, 1.0f, 1.0f, 1.0f, 1.0f); // 生成したFrameBufferと同じサイズでビューポートを設定 @@ -1425,8 +1424,8 @@ void CubismRenderer_Vulkan::DoDrawModel() // --- 後処理 --- currentHighPrecisionMaskColorBuffer->EndDraw(drawCommandBuffer); // オフスクリーン描画終了 SetClippingContextBufferForMask(NULL); - SubmitCommand(updateCommandBuffer, _updateFinishedSemaphore); - SubmitCommand(drawCommandBuffer, VK_NULL_HANDLE, _updateFinishedSemaphore); + SubmitCommand(updateCommandBuffer, _updateFinishedSemaphores[_commandBufferCurrent]); + SubmitCommand(drawCommandBuffer, VK_NULL_HANDLE, _updateFinishedSemaphores[_commandBufferCurrent]); vkBeginCommandBuffer(updateCommandBuffer, &beginInfo); vkBeginCommandBuffer(drawCommandBuffer, &beginInfo); @@ -1437,16 +1436,16 @@ void CubismRenderer_Vulkan::DoDrawModel() // ビューポートを設定する const VkViewport viewport = GetViewport( - static_cast(s_swapchainExtent.width), - static_cast(s_swapchainExtent.height), + static_cast(s_renderExtent.width), + static_cast(s_renderExtent.height), 0.0, 1.0 ); vkCmdSetViewport(drawCommandBuffer, 0, 1, &viewport); const VkRect2D rect = GetScissor( 0.0, 0.0, - static_cast(s_swapchainExtent.width), - static_cast(s_swapchainExtent.height) + static_cast(s_renderExtent.width), + static_cast(s_renderExtent.height) ); vkCmdSetScissor(drawCommandBuffer, 0, 1, &rect); @@ -1457,8 +1456,19 @@ void CubismRenderer_Vulkan::DoDrawModel() } EndRendering(drawCommandBuffer); - SubmitCommand(updateCommandBuffer, _updateFinishedSemaphore); - SubmitCommand(drawCommandBuffer, VK_NULL_HANDLE, _updateFinishedSemaphore); + SubmitCommand(updateCommandBuffer, _updateFinishedSemaphores[_commandBufferCurrent]); + SubmitCommand(drawCommandBuffer, VK_NULL_HANDLE, _updateFinishedSemaphores[_commandBufferCurrent]); + + PostDraw(); +} + +void CubismRenderer_Vulkan::PostDraw() +{ + _commandBufferCurrent++; + if (s_bufferSetNum <= _commandBufferCurrent) + { + _commandBufferCurrent = 0; + } } void CubismRenderer_Vulkan::SetClippingContextBufferForMask(CubismClippingContext_Vulkan* clip) @@ -1509,9 +1519,9 @@ CubismVector2 CubismRenderer_Vulkan::GetClippingMaskBufferSize() const return _clippingManager->GetClippingMaskBufferSize(); } -CubismOffscreenSurface_Vulkan* CubismRenderer_Vulkan::GetMaskBuffer(csmInt32 index) +CubismOffscreenSurface_Vulkan* CubismRenderer_Vulkan::GetMaskBuffer(csmUint32 backbufferNum, csmInt32 offscreenIndex) { - return &_offscreenFrameBuffers[index]; + return &_offscreenFrameBuffers[backbufferNum][offscreenIndex]; } void CubismRenderer_Vulkan::SetColorUniformBuffer(ModelUBO& ubo, const CubismTextureColor& baseColor, @@ -1524,10 +1534,10 @@ void CubismRenderer_Vulkan::SetColorUniformBuffer(ModelUBO& ubo, const CubismTex void CubismRenderer_Vulkan::BindVertexAndIndexBuffers(const csmInt32 index, VkCommandBuffer& cmdBuffer) { - VkBuffer vertexBuffers[] = {_vertexBuffers[index].GetBuffer()}; + VkBuffer vertexBuffers[] = {_vertexBuffers[_commandBufferCurrent][index].GetBuffer()}; VkDeviceSize offsets[] = {0}; vkCmdBindVertexBuffers(cmdBuffer, 0, 1, vertexBuffers, offsets); - vkCmdBindIndexBuffer(cmdBuffer, _indexBuffers[index].GetBuffer(), 0, VK_INDEX_TYPE_UINT16); + vkCmdBindIndexBuffer(cmdBuffer, _indexBuffers[_commandBufferCurrent][index].GetBuffer(), 0, VK_INDEX_TYPE_UINT16); } void CubismRenderer_Vulkan::SetColorChannel(ModelUBO& ubo, CubismClippingContext_Vulkan* contextBuffer) diff --git a/src/Rendering/Vulkan/CubismRenderer_Vulkan.hpp b/src/Rendering/Vulkan/CubismRenderer_Vulkan.hpp index 9b0948e..60df045 100644 --- a/src/Rendering/Vulkan/CubismRenderer_Vulkan.hpp +++ b/src/Rendering/Vulkan/CubismRenderer_Vulkan.hpp @@ -63,7 +63,7 @@ class CubismClippingManager_Vulkan : public CubismClippingManager< * @param[in] renderer -> レンダラのインスタンス */ void SetupClippingContext(CubismModel& model, VkCommandBuffer commandBuffer, VkCommandBuffer updateCommandBuffer, - CubismRenderer_Vulkan* renderer); + CubismRenderer_Vulkan* renderer, csmInt32 offscreenCurrent); }; /** @@ -330,8 +330,9 @@ class CubismRenderer_Vulkan : public CubismRenderer /** * @brief コマンドを実行する。 * - * @param[in] commandBuffer -> コマンドバッファ - * @param[in] signalUpdateFinishedSemaphore -> フェンス + * @param[in] commandBuffer -> コマンドバッファ + * @param[in] signalUpdateFinishedSemaphore -> コマンド終了時にシグナルを出すセマフォ + * @param[in] waitUpdateFinishedSemaphore -> コマンド実行前に待つセマフォ */ void SubmitCommand(VkCommandBuffer commandBuffer, VkSemaphore signalUpdateFinishedSemaphore = VK_NULL_HANDLE, VkSemaphore waitUpdateFinishedSemaphore = VK_NULL_HANDLE); @@ -344,17 +345,16 @@ class CubismRenderer_Vulkan : public CubismRenderer * @param[in] physicalDevice -> 物理デバイス * @param[in] commandPool -> コマンドプール * @param[in] queue -> キュー + * @param[in] swapchainImageCount -> スワップチェーンのイメージ数 * @param[in] extent -> 描画解像度 + * @param[in] imageView -> イメージビュー + * @param[in] imageFormat -> 描画対象のフォーマット * @param[in] depthFormat -> 深度フォーマット - * @param[in] surfaceFormat -> フレームバッファのフォーマット - * @param[in] swapchainImageView -> スワップチェーンのイメージビュー */ static void InitializeConstantSettings(VkDevice device, VkPhysicalDevice physicalDevice, VkCommandPool commandPool, VkQueue queue, - VkExtent2D extent, VkFormat depthFormat, VkFormat surfaceFormat, - VkImage swapchainImage, - VkImageView swapchainImageView, - VkFormat dFormat); + csmUint32 swapchainImageCount, VkExtent2D extent, + VkImageView imageView, VkFormat imageFormat, VkFormat depthFormat); /** * @brief レンダーターゲット変更を有効にする @@ -362,36 +362,27 @@ class CubismRenderer_Vulkan : public CubismRenderer static void EnableChangeRenderTarget(); /** - * @brief レンダーターゲットを変更した際にレンダラを作成するための各種設定 + * @brief レンダリング対象の指定 * * @param[in] image -> イメージ - * @param[in] imageview -> イメージビュー + * @param[in] view -> イメージビュー + * @param[in] format -> フォーマット + * @param[in] extent -> 描画解像度 */ - static void SetRenderTarget(VkImage image, VkImageView imageview); + static void SetRenderTarget(VkImage image, VkImageView view, VkFormat format, VkExtent2D extent); /** - * @brief スワップチェーンを再作成したときに変更されるリソースを更新する + * @brief 描画対象の解像度を設定する * - * @param[in] extent   -> クリッピングマスクバッファのサイズ - * @param[in] imageView -> イメージビュー + * @param[in] extent   -> 描画解像度 */ - static void UpdateSwapchainVariable(VkExtent2D extent, VkImage image, - VkImageView imageView); - - /** - * @brief スワップチェーンイメージを更新する - * - * @param[in] iamge -> イメージ - * @param[in] iamgeView -> イメージビュー - */ - static void UpdateRendererSettings(VkImage image, VkImageView imageView); + static void SetImageExtent(VkExtent2D extent); /** * @brief コマンドバッファを作成する。 */ void CreateCommandBuffer(); - /** * @brief 空の頂点バッファを作成する。 */ @@ -466,6 +457,7 @@ class CubismRenderer_Vulkan : public CubismRenderer * @brief ディスクリプタセットを更新する * @param[in] descriptor -> 1つのシェーダーが使用するディスクリプタセットとUBO * @param[in] textureIndex -> テクスチャインデックス + * @param[in] isMasked -> 描画対象がマスクされるか */ void UpdateDescriptorSet(Descriptor& descriptor, csmUint32 textureIndex, bool isMasked); @@ -519,6 +511,12 @@ class CubismRenderer_Vulkan : public CubismRenderer */ void DoDrawModel() override; + /** + * @brief 描画完了後の追加処理。
+ * マルチバッファリングに必要な処理を実装している。 + */ + void PostDraw(); + /** * @brief モデル描画直前のステートを保持する */ @@ -531,6 +529,8 @@ class CubismRenderer_Vulkan : public CubismRenderer /** * @brief マスクテクスチャに描画するクリッピングコンテキストをセットする。 + * + * @param[in] clip -> クリッピングコンテキスト */ void SetClippingContextBufferForMask(CubismClippingContext_Vulkan* clip); @@ -543,6 +543,8 @@ class CubismRenderer_Vulkan : public CubismRenderer /** * @brief 画面上に描画するクリッピングコンテキストをセットする。 + * + * @param[in] clip -> クリッピングコンテキスト */ void SetClippingContextBufferForDraw(CubismClippingContext_Vulkan* clip); @@ -580,10 +582,13 @@ class CubismRenderer_Vulkan : public CubismRenderer /** * @brief クリッピングマスクのバッファを取得する * + * @param[in] backbufferNum -> バックバッファの番号 + * @param[in] offscreenIndex -> オフスクリーンのインデックス + * * @return クリッピングマスクのバッファへのポインタ * */ - CubismOffscreenSurface_Vulkan* GetMaskBuffer(csmInt32 index); + CubismOffscreenSurface_Vulkan* GetMaskBuffer(csmUint32 backbufferNum, csmInt32 offscreenIndex); private: @@ -602,7 +607,7 @@ class CubismRenderer_Vulkan : public CubismRenderer * @brief 頂点バッファとインデックスバッファをバインドする * * @param[in] index -> 描画メッシュのインデックス - * @param[in] commandBuffer -> コマンドバッファ + * @param[in] cmdBuffer -> コマンドバッファ */ void BindVertexAndIndexBuffers(const csmInt32 index, VkCommandBuffer& cmdBuffer); @@ -623,19 +628,25 @@ class CubismRenderer_Vulkan : public CubismRenderer csmVector _sortedDrawableIndexList; ///< 描画オブジェクトのインデックスを描画順に並べたリスト CubismClippingContext_Vulkan* _clippingContextBufferForMask; ///< マスクテクスチャに描画するためのクリッピングコンテキスト CubismClippingContext_Vulkan* _clippingContextBufferForDraw; ///< 画面上描画するためのクリッピングコンテキスト - csmVector _offscreenFrameBuffers; ///< マスク描画用のフレームバッファ - csmVector _vertexBuffers; ///< 頂点バッファ - csmVector _stagingBuffers; ///< 頂点バッファを更新する際に使うステージングバッファ - csmVector _indexBuffers; ///< インデックスバッファ + + csmUint32 _commandBufferCurrent; ///< スワップチェーン用に使用中のバッファインデックス + + csmVector> _offscreenFrameBuffers; ///< マスク描画用のフレームバッファ + csmVector> _vertexBuffers; ///< 頂点バッファ + csmVector> _stagingBuffers; ///< 頂点バッファを更新する際に使うステージングバッファ + csmVector> _indexBuffers; ///< インデックスバッファ + VkDescriptorPool _descriptorPool; ///< ディスクリプタプール VkDescriptorSetLayout _descriptorSetLayout; ///< ディスクリプタセットのレイアウト - csmVector _descriptorSets; ///< ディスクリプタ管理オブジェクト + csmVector> _descriptorSets; ///< ディスクリプタ管理オブジェクト + csmVector _textures; ///< モデルが使うテクスチャ CubismImageVulkan _depthImage; ///< オフスクリーンの色情報を保持する深度画像 VkClearValue _clearColor; ///< クリアカラー - VkSemaphore _updateFinishedSemaphore; ///< セマフォ - VkCommandBuffer updateCommandBuffer; ///< 更新用コマンドバッファ - VkCommandBuffer drawCommandBuffer; ///< 描画用コマンドバッファ + + csmVector _updateFinishedSemaphores; ///< セマフォ + csmVector _updateCommandBuffers; ///< 更新用コマンドバッファ + csmVector _drawCommandBuffers; ///< 描画用コマンドバッファ }; }}}} diff --git a/src/Rendering/Vulkan/Shaders/CMakeLists.txt b/src/Rendering/Vulkan/Shaders/CMakeLists.txt index 154ea34..80e10bc 100644 --- a/src/Rendering/Vulkan/Shaders/CMakeLists.txt +++ b/src/Rendering/Vulkan/Shaders/CMakeLists.txt @@ -14,12 +14,22 @@ foreach(shader ${shader_files}) set(compiled_shaders_framework ${compiled_shaders_framework} 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} - ) + if(WIN32) + 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} + ) + endif() + if(UNIX AND NOT APPLE) + add_custom_command( + OUTPUT ${output_file} + COMMAND ${CMAKE_COMMAND} -E make_directory ${output_dir} + COMMAND glslc ${full_path} -o ${output_file} + DEPENDS ${full_path} + ) + endif() endforeach() source_group("shaders" FILES ${shader_files}) diff --git a/src/Type/csmMap.hpp b/src/Type/csmMap.hpp index 2ca5707..034dcfa 100644 --- a/src/Type/csmMap.hpp +++ b/src/Type/csmMap.hpp @@ -82,6 +82,13 @@ class csmMap */ csmMap(csmInt32 size); + /** + * @brief 引数付きコンストラクタ + * + * @param[in] m -> 文字列 + */ + csmMap(const csmMap& m); + /** * @brief デストラクタ * @@ -95,6 +102,23 @@ class csmMap */ void AppendKey(_KeyT& key) { + csmInt32 findIndex = -1; + for (csmInt32 i = 0; i < _size; i++) + { + if (_keyValues[i].First == key) + { + findIndex = i; + break; + } + } + + // 同じkeyが既に作られている場合は何もしない + if (findIndex != -1) + { + CubismLogWarning("The key is already append."); + return; + } + // 新しくKey/Valueのペアを作る PrepareCapacity(_size + 1, false); //1つ以上入る隙間を作る // 新しいkey/valueのインデックスは _size @@ -105,6 +129,22 @@ class csmMap _size += 1; } + /** + * @brief コピーコンストラクタ + * + * @param[in] c -> csmMap<_KeyT, _ValT>のインスタンス + */ + csmMap<_KeyT, _ValT>& operator=(const csmMap<_KeyT, _ValT>& c) + { + if (this != &c) + { + Clear(); + Copy(c); + } + + return *this; + } + /** * @brief 添字演算子[key]のオーバーロード * @@ -490,6 +530,32 @@ class csmMap return ite2; } + /** + * @brief csmMap<_keyT, _valT>のコピー関数 + * + * @param[in] c -> csmMap<_keyT, _valT>のインスタンス + */ + void Copy(const csmMap& c) + { + _dummyValuePtr = NULL; + _size = c._size; + _capacity = c._capacity; + + if (c._capacity == 0) + { + _keyValues = NULL; + return; + } + + _keyValues = (csmPair<_KeyT, _ValT>*)(CSM_MALLOC(_capacity * sizeof(csmPair<_KeyT, _ValT>))); + + for (csmInt32 i = 0; i < _size; ++i) + { + CSM_PLACEMENT_NEW(&_keyValues[i]) csmPair<_KeyT, _ValT>(c._keyValues[i].First, + c._keyValues[i].Second); + } + } + /** * @brief コンテナの値を32ビット符号付き整数型でダンプする * @@ -544,6 +610,13 @@ csmMap<_KeyT, _ValT>::csmMap(csmInt32 size) } } +template +csmMap<_KeyT, _ValT>::csmMap(const csmMap& m) + : _dummyValuePtr(NULL) +{ + Copy(m); +} + template csmMap<_KeyT, _ValT>::~csmMap() { diff --git a/src/Type/csmString.cpp b/src/Type/csmString.cpp index 7adfe2f..1c195d3 100644 --- a/src/Type/csmString.cpp +++ b/src/Type/csmString.cpp @@ -282,7 +282,7 @@ csmString& csmString::operator+=(const csmChar* c) { newptr = static_cast(CSM_MALLOC(sizeof(csmChar) * (len1 + len2 + 1))); - memcpy(newptr, this->_ptr, len1); //nullを含めない + memcpy(newptr, GetRawString(), len1); //nullを含めない memcpy(&newptr[len1], c, len2 + 1); //nullを含めて+1 Clear(); //現在のポインタを開放してから処理する diff --git a/src/Utils/CubismJson.cpp b/src/Utils/CubismJson.cpp index ec4d9ae..d0d7059 100644 --- a/src/Utils/CubismJson.cpp +++ b/src/Utils/CubismJson.cpp @@ -143,15 +143,12 @@ csmString CubismJson::ParseString(const csmChar* string, csmInt32 length, csmInt } csmInt32 i = begin; - csmChar c, c2; csmString ret; csmInt32 buf_start = begin; //sbufに登録されていない文字の開始位置 for (; i < length; i++) { - c = static_cast(string[i] & 0xFF); - - switch (c) + switch (string[i]) { case '\"': {//終端の”, エスケープ文字は別に処理されるのでここにはこない *outEndPos = i + 1; // ”の次の文字 @@ -169,8 +166,7 @@ csmString CubismJson::ParseString(const csmChar* string, csmInt32 length, csmInt if (i < length) { - c2 = static_cast(string[i] & 0xFF); - switch (c2) + switch (string[i]) { case '\\': ret.Append(1, '\\'); break; @@ -211,6 +207,84 @@ csmString CubismJson::ParseString(const csmChar* string, csmInt32 length, csmInt } +Value* CubismJson::ParseNumeric(const csmChar* buffer, csmInt32 length, csmInt32 begin, csmInt32* outEndPos) +{ + if (_error) + { + return NULL; + } + + if (!buffer) + { + _error = "buffer is null"; + return NULL; + } + + csmFloat32 ret = 0.0f; + csmInt32 i = begin; + csmBool decimalPointSeen = false; + csmBool isNegative = false; + csmFloat32 decimalMultiplier = 0.1f; + + // 改行もしくは区切り文字に当たるまで読み込む + for (; i < length; i++) + { + switch (buffer[i]) + { + case '-': + { + isNegative = true; + break; + } + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + { + csmInt32 digit = buffer[i] - '0'; + + if (!decimalPointSeen) // 整数部分構築 + { + ret = ret * 10 + digit; + } + else // 小数部分構築 + { + ret += digit * decimalMultiplier; + decimalMultiplier *= 0.1f; + } + break; + } + case '.': // . 小数点記号チェック + { + if (decimalPointSeen) + { + _error = "multiple decimal points found"; + return NULL; + } + decimalPointSeen = true; + break; + } + case '\n': case ',': // 終端には改行文字か、区切り文字の , が来る + { + *outEndPos = i; + if (isNegative) // 負数処理 + { + ret *= -1; + } + return CSM_NEW Float(ret); + } + case '\r': break; // CRLF スキップ用 + default: + { + _error = "non-numeric charactor found"; + return NULL; + } + } + } + + _error = "parse numeric/illegal end"; + return NULL; +} + + Value* CubismJson::ParseObject(const csmChar* buffer, csmInt32 length, csmInt32 begin, csmInt32* outEndPos) { if (_error) @@ -229,7 +303,6 @@ Value* CubismJson::ParseObject(const csmChar* buffer, csmInt32 length, csmInt32 //key : value , csmString key; csmInt32 i = begin; - csmChar c; csmInt32 local_ret_endpos2[1]; csmBool ok = false; @@ -238,9 +311,7 @@ Value* CubismJson::ParseObject(const csmChar* buffer, csmInt32 length, csmInt32 { for (; i < length; i++) { - c = static_cast(buffer[i] & 0xFF); - - switch (c) + switch (buffer[i]) { case '\"': key = ParseString(buffer, length, i + 1, local_ret_endpos2); @@ -270,9 +341,7 @@ Value* CubismJson::ParseObject(const csmChar* buffer, csmInt32 length, csmInt32 // : をチェック for (; i < length; i++) { - c = static_cast(buffer[i] & 0xFF); - - switch (c) + switch (buffer[i]) { case ':': ok = true; i++; @@ -306,9 +375,7 @@ Value* CubismJson::ParseObject(const csmChar* buffer, csmInt32 length, csmInt32 for (; i < length; i++) { - c = static_cast(buffer[i] & 0xFF); - - switch (c) + switch (buffer[i]) { case ',': goto BREAK_LOOP3; @@ -346,7 +413,6 @@ Value* CubismJson::ParseArray(const csmChar* buffer, csmInt32 length, csmInt32 b //key : value , csmInt32 i = begin; - csmChar c; csmInt32 local_ret_endpos2[1]; // , が続く限りループ @@ -368,9 +434,7 @@ Value* CubismJson::ParseArray(const csmChar* buffer, csmInt32 length, csmInt32 b //bool breakflag = false; for (; i < length; i++) { - c = static_cast(buffer[i] & 0xFF); - - switch (c) + switch (buffer[i]) { case ',': // breakflag = true; @@ -414,19 +478,12 @@ Value* CubismJson::ParseValue(const csmChar* buffer, csmInt32 length, csmInt32 b for (; i < length; i++) { - csmChar c = static_cast(buffer[i] & 0xFF); - - switch (c) + switch (buffer[i]) { - case '-': case '.': + case '-': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': - { - char* ret_ptr; - f = strtof(const_cast(buffer + i), &ret_ptr); - *outEndPos = static_cast(ret_ptr - buffer); - return CSM_NEW Float(f); - } + return ParseNumeric(buffer, length, i, outEndPos); case '\"': return CSM_NEW String(ParseString(buffer, length, i + 1, outEndPos)); //\"の次の文字から case '[': diff --git a/src/Utils/CubismJson.hpp b/src/Utils/CubismJson.hpp index 5a052d7..12f822f 100644 --- a/src/Utils/CubismJson.hpp +++ b/src/Utils/CubismJson.hpp @@ -303,6 +303,16 @@ class CubismJson */ csmString ParseString(const csmChar* string, csmInt32 length, csmInt32 begin, csmInt32* outEndPos); + /** + * @brief 数値をパースする。ロケール設定にかかわらず、小数点の区切り文字を . としてパースする。 + * + * @param[in] buffer -> JSONエレメントのバッファ + * @param[in] length -> パースする長さ + * @param[in] begin -> パースを開始する位置 + * @param[out] outEndPos -> パース終了時の位置 + * @return パースから取得したValueオブジェクト + */ + Value* ParseNumeric(const csmChar* buffer, csmInt32 length, csmInt32 begin, csmInt32* outEndPos); /** * @brief JSONのオブジェクトエレメントをパースしてValueオブジェクトを返す