/*---------------------------------------------------------------------------* Project: NintendoWare File: lyt_Layout.h Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. The content herein is highly confidential and should be handled accordingly. $Revision: 31311 $ *---------------------------------------------------------------------------*/ #ifndef NW_LYT_LAYOUT_H_ #define NW_LYT_LAYOUT_H_ #include #include #include #include #include #include #include #include namespace nw { namespace ut { struct Rect; } // namespace ut namespace font { template class TagProcessorBase; } // namespace font namespace lyt { namespace res { struct AnimShareInfoList; } // namespace res class ResourceAccessor; struct ResBlockSet; class Pane; class GroupContainer; class DrawInfo; //! @name アニメーション //@{ //! @brief アニメーションの一覧を保持します。 //! //! @since 2009/09/18 初版。 //! typedef ut::LinkList AnimTransformList; //@} //--------------------------------------------------------------------------- //! :category 管理 //! //! @brief レイアウト全体を管理するためのクラスです。 //! //! @sa Pane //! @sa AnimTransform //! //! @since 2009/09/18 初版。 //--------------------------------------------------------------------------- class Layout { public: //---------------------------------------- //! @name メモリ管理 //@{ //! @brief 現在のメモリアロケータを取得します。 //! //! @return メモリアロケータへのポインタを返します。 //! //! @sa SetAllocator //! //! @since 2009/09/18 初版。 //! static nw::os::IAllocator* GetAllocator() { return s_pAllocator; } //! @brief 現在のデバイスメモリ用メモリアロケータを取得します。 //! //! @return メモリアロケータへのポインタを返します。 //! //! @sa SetAllocator //! //! @since 2010/02/09 初版。 //! static nw::os::IAllocator* GetDeviceMemoryAllocator() { return s_pDeviceMemoryAllocator; } //! @brief メモリブロックの確保に使用するメモリアロケータを設定します。 //! //! @param pAllocator メモリアロケータへのポインタです。 //! //! @sa AllocMemory //! @sa GetAllocator //! @sa SetDeviceMemoryAllocator //! //! @since 2009/09/18 初版。 //! static void SetAllocator(nw::os::IAllocator* pAllocator); //! @brief メモリブロックの確保に使用するメモリアロケータを設定します。 //! //! @details //! このメモリアロケータはデバイスメモリから確保するように //! なっていなければいけません。 //! //! @param pAllocator メモリアロケータへのポインタです。 //! //! @sa AllocMemory //! @sa GetDeviceMemoryAllocator //! @sa SetAllocator //! //! @since 2010/02/09 初版。 //! static void SetDeviceMemoryAllocator(nw::os::IAllocator* pAllocator); //! @brief メモリブロックを確保します。 //! //! @details //! size バイトのメモリブロックを確保します。 //! この関数を使用する前に Layout::SetAllocator() によりメモリアロケータを //! 設定してください。 //! //! @param size 確保するメモリブロックのサイズです。 //! @param alignment 確保するメモリブロックのアライメント値です。 //! //! @return //! メモリブロックを確保できた場合はメモリブロックの先頭アドレスを、 //! 確保できなかった場合は NULL を返します。 //! //! @sa SetAllocator //! @sa FreeMemory //! //! @since 2009/09/18 初版。 //! static void* AllocMemory(u32 size, u8 alignment = 4); //! @brief メモリブロックをデバイスメモリから確保します。 //! //! @details //! size バイトのメモリブロックを確保します。 //! この関数を使用する前に Layout::SetDeviceMemoryAllocator() によりメモリアロケータを //! 設定してください。 //! //! @param size 確保するメモリブロックのサイズです。 //! @param alignment 確保するメモリブロックのアライメント値です。 //! //! @return //! メモリブロックを確保できた場合はメモリブロックの先頭アドレスを、 //! 確保できなかった場合は NULL を返します。 //! //! @sa SetDeviceMemoryAllocator //! @sa FreeDeviceMemory //! //! @since 2010/02/09 初版。 //! static void* AllocDeviceMemory(u32 size, u8 alignment = 4); //! @brief メモリブロックを開放します。 //! //! @param mem 開放するメモリブロックの先頭アドレスです。 //! //! @sa AllocMemory //! //! @since 2009/09/18 初版。 //! static void FreeMemory(void* mem); //! @brief メモリブロックをデバイスメモリへ開放します。 //! //! @param mem 開放するメモリブロックの先頭アドレスです。 //! //! @sa AllocDeviceMemory //! //! @since 2010/02/09 初版。 //! static void FreeDeviceMemory(void* mem); //@} //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! @brief コンストラクタです。 //! //! @since 2009/09/18 初版。 //! Layout(); //! @brief デストラクタです。 //! //! @since 2009/09/18 初版。 //! virtual ~Layout(); //@} //---------------------------------------- //! @name 初期化 //@{ //! @brief リソースをもとにレイアウトの初期化を行います。 //! //! @details //! リソースのフォーマットが正しくなければ失敗します。 //! //! @param lytResBuf レイアウトリソースへのポインタです。 //! @param pResAcsr リソースアクセサへのポインタです。 //! //! @return 初期化に成功した場合は true を、失敗した場合は false を返します。 //! //! @since 2009/09/18 初版。 //! virtual bool Build( const void* lytResBuf, ResourceAccessor* pResAcsr); #ifdef NW_LYT_DMPGL_ENABLED //! @brief Layout::Draw を使用するか宣言します(非推奨)。 //! //! @details //! 本関数は NW_LYT_DMPGL_ENABLED マクロを定義してライブラリを //! ビルドした場合にのみ利用可能です。 //! //! デフォルトでは false に設定されています。 //! //! Layout::Draw() による描画には、リソースから DMPGL の API を使用して //! 生成したオブジェクト(シェーダ、頂点バッファ、テクスチャ)が必要です。 //! //! (Drawer の描画では必要としません。) //! //! この関数により Layout::Draw を使用すると宣言した場合には、 //! 初期化およびリソースアクセサにおいて、DMPGL のオブジェクト生成が //! 行われます。 //! //! 本関数は GraphicsResource::StartSetup() および Layout::Build() よりも //! 前に呼び出します。 //! //! @param enable Layout::Draw を使用する場合に true を指定します。 //! //! @sa GetLayoutDrawEnable //! @sa GraphicsResource::StartSetup //! @sa Build //! //! @since 2010/07/30 初版。 //! @date 2010/10/20 NW_LYT_DMPGL_ENABLED マクロを定義してライブラリをビルドした場合にのみ利用できるようにしました。 //! static void SetLayoutDrawEnable(bool enable) { s_LayoutDrawEnable = enable; } //! @brief Layout::Draw を使用するかの設定を取得します(非推奨)。 //! //! @details //! 本関数は NW_LYT_DMPGL_ENABLED マクロを定義してライブラリを //! ビルドした場合にのみ利用可能です。 //! //! デフォルト値は false です。 //! //! @return Layout::Draw を使用する場合は true を返します。 //! //! @sa SetLayoutDrawEnable //! //! @since 2010/07/30 初版。 //! @date 2010/10/20 NW_LYT_DMPGL_ENABLED マクロを定義してライブラリをビルドした場合にのみ利用できるようにしました。 //! static bool GetLayoutDrawEnable() { #ifdef NW_PLATFORM_CTR return s_LayoutDrawEnable; #else return true; #endif } #endif // NW_LYT_DMPGL_ENABLED //@} //---------------------------------------- //! @name アニメーション //@{ //! @brief アニメーションを作成します。 //! //! @details //! アニメーションオブジェクトの作成のみ行います。 //! //! @return 生成したアニメーションへのポインタを返します。 //! //! @since 2009/09/18 初版。 //! virtual AnimTransform* CreateAnimTransform(); //! @brief アニメーションを作成します。 //! //! @details //! アニメーションオブジェクトを作成し、指定されたリソースを関連付けます。 //! リソースのフォーマットが正しくなければ失敗します。 //! //! アニメーションリソースにアニメーション共有情報が含まれる場合は、 //! BindAnimationAuto() を使用してください。 //! //! @param animResBuf アニメーションリソースへのポインタです。 //! @param pResAcsr リソースアクセサへのポインタです。 //! //! @return //! アニメーションの作成に成功した場合はアニメーションへのポインタを、 //! 失敗した場合は NULL を返します。 //! //! @sa BindAnimationAuto //! //! @since 2009/09/18 初版。 //! virtual AnimTransform* CreateAnimTransform( const void* animResBuf, ResourceAccessor* pResAcsr); //! @brief アニメーションを作成します。 //! //! @details //! アニメーションオブジェクトを作成し、指定されたリソースを関連付けます。 //! リソースのフォーマットが正しくなければ失敗します。 //! //! アニメーションリソースにアニメーション共有情報が含まれる場合は、 //! BindAnimationAuto() を使用してください。 //! //! @param animRes アニメーションリソースオブジェクトです。 //! @param pResAcsr リソースアクセサへのポインタです。 //! //! @return //! アニメーションの作成に成功した場合はアニメーションへのポインタを、 //! 失敗した場合は NULL を返します。 //! //! @sa BindAnimationAuto //! //! @since 2009/09/18 初版。 //! virtual AnimTransform* CreateAnimTransform( const AnimResource& animRes, ResourceAccessor* pResAcsr); //! @brief アニメーションを削除します。 //! //! @param pAnimTransform アニメーションへのポインタです。 //! //! @since 2009/09/18 初版。 //! virtual void DeleteAnimTransform( AnimTransform* pAnimTransform); //! @brief アニメーションを関連付けます。 //! //! @param pAnimTrans アニメーションへのポインタです。 //! //! @sa UnbindAnimation //! @sa UnbindAllAnimation //! //! @since 2009/09/18 初版。 //! virtual void BindAnimation(AnimTransform* pAnimTrans); //! @brief アニメーションの関連付けを解除します。 //! //! @details //! pAnimTrans に NULL を渡した場合はすべての関連付けが解除されます。 //!( UnbindAllAnimation() と同義) //! //! @param pAnimTrans アニメーションへのポインタです。 //! //! @sa BindAnimation //! @sa UnbindAllAnimation //! //! @since 2009/09/18 初版。 //! virtual void UnbindAnimation(AnimTransform* pAnimTrans); //! @brief アニメーションとペインの関連付けをすべて解除します。 //! //! @details //! UnbindAnimation() の引数に NULL を渡すのと同義です。 //! //! @sa BindAnimation //! @sa UnbindAnimation //! //! @since 2009/09/18 初版。 //! virtual void UnbindAllAnimation(); //! @brief アニメーションの作成と関連付けを一度に行います。 //! //! @details //! アニメーションリソースオブジェクトの内容に応じて、 //! アニメーションオブジェクト(AnimTransform)を作成し、 //! ペインに関連付けます。 //! //! アニメーションファイルにアニメーション共有情報が含まれている場合は、 //! 共有対象のペインごとにアニメーションオブジェクト(AnimTransform)が //! 作成されます。 //! //! また、アニメーション区間タグが含まれていて、関連グループが //! 指定されている場合は、アニメーションを関連付けるペインを関連グループに限定します。 //! //! この関数では、アニメーションは無効状態で関連付けます。 //! (アニメーションリンク情報の AnimationLink::IsEnable() が false の状態) //! //! @param animRes アニメーションリソースオブジェクトです。 //! @param pResAcsr リソースアクセサへのポインタです。 //! //! @return 関数が成功した場合は true、失敗した場合は false を返します。 //! //! @sa CreateAnimTransform //! @sa AnimationLink //! //! @since 2009/09/18 初版。 //! virtual bool BindAnimationAuto( const AnimResource& animRes, ResourceAccessor* pResAcsr); //! @brief アニメーションの有効/無効状態をセットします。 //! //! @param pAnimTrans アニメーションへのポインタです。 //! @param bEnable 有効にする場合は true を指定します。 //! //! @since 2009/09/18 初版。 //! virtual void SetAnimationEnable( AnimTransform* pAnimTrans, bool bEnable); //! @brief 全てのペインのアニメーションの結果を計算します。 //! //! @details //! opiton に ANIMATEOPT_NOANIMATEINVISIBLE を指定した場合、 //! 非表示のペイン(Pane::IsVisible() が false)とその子供以下の //! ペインのアニメーションの計算を省略します。 //! //! @param option オプションです。 lyt::AnimateOpt を指定します。 //! //! @sa lyt::AnimateOpt //! @sa Pane::IsVisible //! //! @since 2009/09/18 初版。 //! virtual void Animate(u32 option = 0); //@} //---------------------------------------- //! @name 描画 //@{ //! @brief 描画のための行列を計算します。 //! //! @param drawInfo 描画情報です。 //! //! @since 2009/09/18 初版。 //! virtual void CalculateMtx(const DrawInfo& drawInfo); #ifdef NW_LYT_DMPGL_ENABLED //! @brief 描画処理を行います(非推奨)。 //! //! @details //! 本関数は NW_LYT_DMPGL_ENABLED マクロを定義してライブラリを //! ビルドした場合にのみ利用可能です。 //! //! レイアウトの描画には Drawer を使用します。 //! //! この関数はリファレンス実装であり、使用は非推奨です。 //! //! drawInfo には、あらかじめ DrawInfo::SetGraphicsResource() により //! GraphicsResource を設定しておく必要があります。 //! //! GLの以下の設定はユーザに任せています(lytでは設定しません)。 //! //! ・カリング\n //! ・シザー処理\n //! ・ステンシルテスト\n //! ・マスク処理\n //! ・ポリゴンオフセット\n //! ・デプステスト\n //! ・アーリーデプステスト\n //! ・フレームバッファオブジェクト //! //! @param drawInfo 描画情報です。 //! //! @sa Drawer //! @sa GraphicsResource //! //! @since 2009/09/18 初版。 //! @date 2010/06/28 本関数の使用は非推奨としました。 //! @date 2010/10/20 NW_LYT_DMPGL_ENABLED マクロを定義してライブラリをビルドした場合にのみ利用できるようにしました。 //! virtual void Draw(const DrawInfo& drawInfo); #endif //@} //---------------------------------------- //! @name 取得/設定 //@{ //! @brief ルートペインを取得します。 //! //! @return //! ルートペインへのポインタを返します。 //! ルートペインが存在しない場合は NULL を返します。 //! //! @since 2009/09/18 初版。 //! Pane* GetRootPane() const { return m_pRootPane; } //! @brief グループコンテナを取得します。 //! //! @return //! グループコンテナへのポインタを返します。 //! グループコンテナが存在しない場合は NULL を返します。 //! //! @since 2009/09/18 初版。 //! GroupContainer* GetGroupContainer() const { return m_pGroupContainer; } //! @brief 表示領域のサイズを取得します。 //! //! @return サイズを返します。 //! //! @since 2009/09/18 初版。 //! const Size& GetLayoutSize() const { return m_LayoutSize; } //! @brief レイアウトの表示領域を取得します。 //! //! @return 表示領域の矩形を返します。 //! //! @since 2009/09/18 初版。 //! const ut::Rect GetLayoutRect() const; //! @brief レイアウト内の全てのテキストボックスペインにタグプロセッサを設定します。 //! //! @param pTagProcessor タグプロセッサへのポインタです。 //! //! @sa TextBox::GetTagProcessor //! @sa TextBox::SetTagProcessor //! //! @since 2009/09/18 初版。 //! virtual void SetTagProcessor(font::TagProcessorBase* pTagProcessor); //! @brief レイアウトに関連付けているアニメーションのリストを取得します。 //! //! @return AnimTransform オブジェクトのリストを返します。 //! //! @since 2009/09/18 初版。 //! const AnimTransformList& GetAnimTransformList() const { return m_AnimTransList; } //! @brief レイアウトに関連付けているアニメーションのリストを取得します。 //! //! @since 2009/09/18 初版。 //! AnimTransformList& GetAnimTransformList() { return m_AnimTransList; } //@} //---------------------------------------- //! @name オブジェクト生成/破棄 //@{ //! @brief オブジェクトを生成します。 //! //! @tparam T 生成するオブジェクトのクラスです。 //! //! @return 生成されたオブジェクトへのポインタを返します。 //! //! @sa DeleteObj //! //! @since 2010/01/26 初版。 //! template static T* NewObj() { if (void* pMem = Layout::AllocMemory(sizeof(T))) { return new (pMem) T(); } return 0; } //! @brief オブジェクトを生成します。 //! //! @tparam T 生成するオブジェクトのクラスです。 //! @tparam Param1 コンストラクタの第1引数の型です。 //! //! @param param1 コンストラクタの第1引数です。 //! //! @return 生成されたオブジェクトへのポインタを返します。 //! //! @sa DeleteObj //! //! @since 2010/01/26 初版。 //! template static T* NewObj(Param1 param1) { if (void* pMem = Layout::AllocMemory(sizeof(T))) { return new (pMem) T(param1); } return 0; } //! @brief オブジェクトを生成します。 //! //! @tparam T 生成するオブジェクトのクラスです。 //! @tparam Param1 コンストラクタの第1引数の型です。 //! @tparam Param2 コンストラクタの第2引数の型です。 //! //! @param param1 コンストラクタの第1引数です。 //! @param param2 コンストラクタの第2引数です。 //! //! @return 生成されたオブジェクトへのポインタを返します。 //! //! @sa DeleteObj //! //! @since 2010/01/26 初版。 //! template static T* NewObj(Param1 param1, Param2 param2) { if (void* pMem = Layout::AllocMemory(sizeof(T))) { return new (pMem) T(param1, param2); } return 0; } //! @brief オブジェクトを生成します。 //! //! @tparam T 生成するオブジェクトのクラスです。 //! @tparam Param1 コンストラクタの第1引数の型です。 //! @tparam Param2 コンストラクタの第2引数の型です。 //! @tparam Param3 コンストラクタの第3引数の型です。 //! //! @param param1 コンストラクタの第1引数です。 //! @param param2 コンストラクタの第2引数です。 //! @param param3 コンストラクタの第3引数です。 //! //! @return 生成されたオブジェクトへのポインタを返します。 //! //! @sa DeleteObj //! //! @since 2010/01/26 初版。 //! template static T* NewObj(Param1 param1, Param2 param2, Param3 param3) { if (void* pMem = Layout::AllocMemory(sizeof(T))) { return new (pMem) T(param1, param2, param3); } return 0; } //! @brief オブジェクトを生成します。 //! //! @tparam T 生成するオブジェクトのクラスです。 //! @tparam Param1 コンストラクタの第1引数の型です。 //! @tparam Param2 コンストラクタの第2引数の型です。 //! @tparam Param3 コンストラクタの第3引数の型です。 //! @tparam Param4 コンストラクタの第4引数の型です。 //! //! @param param1 コンストラクタの第1引数です。 //! @param param2 コンストラクタの第2引数です。 //! @param param3 コンストラクタの第3引数です。 //! @param param4 コンストラクタの第4引数です。 //! //! @return 生成されたオブジェクトへのポインタを返します。 //! //! @sa DeleteObj //! //! @since 2010/01/26 初版。 //! template static T* NewObj(Param1 param1, Param2 param2, Param3 param3, Param4 param4) { if (void* pMem = Layout::AllocMemory(sizeof(T))) { return new (pMem) T(param1, param2, param3, param4); } return 0; } //! :private //! @brief 配列を生成します。 template static T* NewArray(u32 num) { void* pMem = AllocMemory(sizeof(T) * num); if (! pMem) { return 0; } T *const objAry = static_cast(pMem); for (u32 i = 0; i < num; ++i) { new (&objAry[i]) T(); } return objAry; } //! @brief オブジェクトを廃棄します。 //! //! @tparam T オブジェクトのクラスです。 //! //! @param pObj オブジェクトへのポインタです。 //! //! @since 2010/01/26 初版。 //! template static void DeleteObj(T* pObj) { if (pObj) { pObj->~T(); FreeMemory(pObj); } } //! :private //! @brief 配列を廃棄します。 template static void DeleteArray(T objAry[], u32 num) { if (objAry) { for (u32 i = 0; i < num; ++i) { objAry[i].~T(); } FreeMemory(objAry); } } //! :private //! @brief 配列を廃棄します。 template static void DeletePrimArray(T objAry[]) { if (objAry) { FreeMemory(objAry); } } //@} protected: //! @name 初期化 // @{ //! @brief リソースからペインを生成します。 //! //! @details //! kind には以下のいずれかのデータブロック・シグニチャが指定されます。 //! //! ・res::DATABLOCKKIND_PANE\n //! ・res::DATABLOCKKIND_PICTURE\n //! ・res::DATABLOCKKIND_TEXTBOX\n //! ・res::DATABLOCKKIND_WINDOW\n //! ・res::DATABLOCKKIND_BOUNDING //! //! @param kind データブロックのシグニチャです。 //! @param pBlock データブロックです。 //! @param resBlockSet データブロックセットです。 //! //! @return 生成されたペインを返します。 //! //! @since 2010/02/26 初版。 //! virtual Pane* BuildPaneObj( s32 kind, const void* pBlock, const ResBlockSet& resBlockSet); //@} //! @name 取得/設定 // @{ //! @brief ルートペインを設定します。 //! //! @param pPane ペインです。 //! //! @since 2010/02/26 初版。 //! void SetRootPane(Pane* pPane) { m_pRootPane = pPane; } //! @brief グループコンテナを設定します。 //! //! @param pGroupContainer グループコンテナです。 //! //! @since 2010/02/26 初版。 //! void SetGroupContainer(GroupContainer* pGroupContainer) { m_pGroupContainer = pGroupContainer; } //! @brief 表示領域のサイズを設定します。 //! //! @param size 表示領域のサイズです。 //! //! @since 2010/02/26 初版。 //! void SetLayoutSize(const Size& size) { m_LayoutSize = size; } // @} protected: //! @details :private static nw::os::IAllocator* s_pAllocator; //! @details :private static nw::os::IAllocator* s_pDeviceMemoryAllocator; //! @details :private static bool s_LayoutDrawEnable; //! @details :private AnimTransformList m_AnimTransList; //! @details :private Pane* m_pRootPane; //! @details :private GroupContainer* m_pGroupContainer; //! @details :private Size m_LayoutSize; private: // コピーコンストラクタと代入演算子の呼び出しを禁止します。実装してはいけません。 Layout(const Layout& other); Layout& operator = (const Layout& other); }; } // namespace nw::lyt } // namespace nw #endif // NW_LYT_LAYOUT_H_