/** * 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 "2d/RenderTexture.h" #include #include #include #include #include #include "LAppDefine.hpp" #include "AppDelegate.h" /** * @brief ユーザーが実際に使用するモデルの実装クラス
* モデル生成、機能コンポーネント生成、更新処理とレンダリングの呼び出しを行う。 * */ class LAppModel : public Csm::CubismUserModel { public: /** * @brief コンストラクタ */ LAppModel(); /** * @brief デストラクタ * */ virtual ~LAppModel(); /** * @brief model3.jsonが置かれたディレクトリとファイルパスからモデルを生成する * */ void LoadAssets(const Csm::csmChar dir[], const Csm::csmChar fileName[]); /** * @brief レンダラを再構築する * */ void ReloadRnederer(); /** * @brief モデルの更新処理。モデルのパラメータから描画状態を決定する。 * */ void Update(); /** * @brief モデルを描画する処理。モデルを描画する空間のView-Projection行列を渡す。 * * @param[in] matrix View-Projection行列 */ void Draw(Csm::Rendering::CubismCommandBuffer_Cocos2dx* commandBuffer, Csm::CubismMatrix44& matrix); /** * @brief 引数で指定したモーションの再生を開始する。 * * @param[in] group モーショングループ名 * @param[in] no グループ内の番号 * @param[in] priority 優先度 * @param[in] onFinishedMotionHandler モーション再生終了時に呼び出されるコールバック関数。NULLの場合、呼び出されない。 * @return 開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」 */ Csm::CubismMotionQueueEntryHandle StartMotion(const Csm::csmChar* group, Csm::csmInt32 no, Csm::csmInt32 priority, Csm::ACubismMotion::FinishedMotionCallback onFinishedMotionHandler = NULL); /** * @brief ランダムに選ばれたモーションの再生を開始する。 * * @param[in] group モーショングループ名 * @param[in] priority 優先度 * @param[in] onFinishedMotionHandler モーション再生終了時に呼び出されるコールバック関数。NULLの場合、呼び出されない。 * @return 開始したモーションの識別番号を返す。個別のモーションが終了したか否かを判定するIsFinished()の引数で使用する。開始できない時は「-1」 */ Csm::CubismMotionQueueEntryHandle StartRandomMotion(const Csm::csmChar* group, Csm::csmInt32 priority, Csm::ACubismMotion::FinishedMotionCallback onFinishedMotionHandler = NULL); /** * @brief 引数で指定した表情モーションをセットする * * @param expressionID 表情モーションのID */ void SetExpression(const Csm::csmChar* expressionID); /** * @brief ランダムに選ばれた表情モーションをセットする * */ void SetRandomExpression(); /** * @brief イベントの発火を受け取る * */ virtual void MotionEventFired(const Live2D::Cubism::Framework::csmString& eventValue); /** * @brief 当たり判定テスト。
* 指定IDの頂点リストから矩形を計算し、座標が矩形範囲内か判定する。 * * @param[in] hitAreaName 当たり判定をテストする対象のID * @param[in] x 判定を行うX座標 * @param[in] y 判定を行うY座標 */ virtual Csm::csmBool HitTest(const Csm::csmChar* hitAreaName, Csm::csmFloat32 x, Csm::csmFloat32 y); Csm::csmRectF GetDrawableArea(Csm::csmInt32 drawableIndex, const Csm::CubismMatrix44& vpMatrix, const Csm::CubismVector2& windowSize) const; const Csm::csmVector& GetHitAreas(const Csm::CubismMatrix44& vpMatrix, const Csm::CubismVector2& windowSize); const Csm::csmVector& GetUserDataAreas(const Csm::CubismMatrix44& vpMatrix, const Csm::CubismVector2& windowSize); /** * @brief 別ターゲットに描画する際に使用するバッファ・スプライトを作成し、 * スプライトをSampleSceneへ登録する */ void MakeRenderingTarget(); /** * @brief 別ターゲットに描画する際のスプライト色設定 * @param[in] r 赤(0.0~1.0) * @param[in] g 緑(0.0~1.0) * @param[in] b 青(0.0~1.0) * @param[in] a α(0.0~1.0) */ void SetSpriteColor(float r, float g, float b, float a); protected: /** * @brief モデルを描画する処理。モデルを描画する空間のView-Projection行列を渡す。 * */ void DoDraw(); private: /** * @brief model3.jsonからモデルを生成する。
* model3.jsonの記述に従ってモデル生成、モーション、物理演算などのコンポーネント生成を行う。 * * @param[in] setting ICubismModelSettingのインスタンス * */ void SetupModel(Csm::ICubismModelSetting* setting); /** * @brief OpenGLのテクスチャユニットにテクスチャをロードする * */ void SetupTextures(); /** * @brief モーションデータをグループ名から一括でロードする。
* モーションデータの名前は内部でModelSettingから取得する。 * * @param[in] group モーションデータのグループ名 */ void PreloadMotionGroup(const Csm::csmChar* group); /** * @brief モーションデータをグループ名から一括で解放する。
* モーションデータの名前は内部でModelSettingから取得する。 * * @param[in] group モーションデータのグループ名 */ void ReleaseMotionGroup(const Csm::csmChar* group) const; /** * @brief すべてのモーションデータの解放 * * すべてのモーションデータを解放する。 */ void ReleaseMotions(); /** * @brief すべての表情データの解放 * * すべての表情データを解放する。 */ void ReleaseExpressions(); Csm::ICubismModelSetting* _modelSetting; ///< モデルセッティング情報 Csm::csmString _modelHomeDir; ///< モデルセッティングが置かれたディレクトリ Csm::csmFloat32 _userTimeSeconds; ///< デルタ時間の積算値[秒] Csm::csmVector _eyeBlinkIds; ///< モデルに設定されたまばたき機能用パラメータID Csm::csmVector _lipSyncIds; ///< モデルに設定されたリップシンク機能用パラメータID Csm::csmMap _motions; ///< 読み込まれているモーションのリスト Csm::csmMap _expressions; ///< 読み込まれている表情のリスト Csm::csmVector_hitArea; Csm::csmVector_userArea; const Csm::CubismId* _idParamAngleX; ///< パラメータID: ParamAngleX const Csm::CubismId* _idParamAngleY; ///< パラメータID: ParamAngleX const Csm::CubismId* _idParamAngleZ; ///< パラメータID: ParamAngleX const Csm::CubismId* _idParamBodyAngleX; ///< パラメータID: ParamBodyAngleX const Csm::CubismId* _idParamEyeBallX; ///< パラメータID: ParamEyeBallX const Csm::CubismId* _idParamEyeBallY; ///< パラメータID: ParamEyeBallXY Csm::Rendering::CubismOffscreenFrame_Cocos2dx* _renderBuffer; ///< モードによってはCubismOffscreenFrameのテクスチャを描画 ax::RenderTexture* _renderSprite; ///< _renderBufferを描画するスプライト float _clearColor[4]; ///< _renderBufferをクリアする際の色 Csm::csmVector _loadedTextures; };