/*---------------------------------------------------------------------------* Project: NintendoWare File: lyt_Window.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. 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. $Revision: 25594 $ *---------------------------------------------------------------------------*/ #ifndef NW_LYT_WINDOW_H_ #define NW_LYT_WINDOW_H_ #include #include #include #include namespace nw { namespace lyt { class DrawInfo; class AnimationLink; //--------------------------------------------------------------------------- //! :category 描画 //! //! @brief ウィンドウの表示を行うペインです。 //! //! @since 2009/09/18 初版。 //--------------------------------------------------------------------------- class Window : public Pane { typedef Pane Base; //! @details :private struct Content { ut::Color8 vtxColors[VERTEXCOLOR_MAX]; internal::TexCoordAry texCoordAry; }; //! @details :private struct Frame { Frame() : textureFlip(0), pMaterial(0) {} ~Frame(); TextureFlip GetTextureFlip() const { return (TextureFlip) this->textureFlip; } u8 textureFlip; Material* pMaterial; }; public: //! 実行時型情報です。 NW_UT_RUNTIME_TYPEINFO; //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! @brief コンストラクタです。 //! //! @details //! コンテンツ領域とフレーム(4辺共通)でそれぞれ指定したテクスチャの //! 枚数分のメモリを確保して、オブジェクトを生成します。 //! //! @param contentTexNum コンテンツ領域で使用するテクスチャの最大数です。 //! @param frameTexNum フレームで使用するテクスチャの最大数です。 //! //! @since 2009/09/18 初版。 //! Window( u8 contentTexNum, u8 frameTexNum); //! @brief コンストラクタです。 //! //! @details //! コンテンツ領域とフレーム(4辺)でそれぞれ指定したテクスチャの //! 枚数分のメモリを確保して、オブジェクトを生成します。 //! //! @param contentTexNum コンテンツ領域で使用するテクスチャの最大数です。 //! @param frameLTTexNum 左上辺フレームで使用するテクスチャの最大数です。 //! @param frameRTTexNum 右上辺フレームで使用するテクスチャの最大数です。 //! @param frameRBTexNum 右下辺フレームで使用するテクスチャの最大数です。 //! @param frameLBTexNum 左下辺フレームで使用するテクスチャの最大数です。 //! //! @since 2009/09/18 初版。 //! Window( u8 contentTexNum, u8 frameLTTexNum, u8 frameRTTexNum, u8 frameRBTexNum, u8 frameLBTexNum); //! @brief コンストラクタです。 //! //! @details //! コンテンツ領域とフレーム(4隅と4辺)でそれぞれ指定したテクスチャの //! 枚数分のメモリを確保して、オブジェクトを生成します。 //! //! @param contentTexNum コンテンツ領域で使用するテクスチャの最大数です。 //! @param cornerLTTexNum 左上隅フレームで使用するテクスチャの最大数です。 //! @param cornerRTTexNum 右上隅フレームで使用するテクスチャの最大数です。 //! @param cornerRBTexNum 右下隅フレームで使用するテクスチャの最大数です。 //! @param cornerLBTexNum 左下隅フレームで使用するテクスチャの最大数です。 //! @param frameLTexNum 左辺フレームで使用するテクスチャの最大数です。 //! @param frameTTexNum 上辺フレームで使用するテクスチャの最大数です。 //! @param frameRTexNum 右辺フレームで使用するテクスチャの最大数です。 //! @param frameBTexNum 下辺フレームで使用するテクスチャの最大数です。 //! //! @since 2009/09/18 初版。 //! Window( u8 contentTexNum, u8 cornerLTTexNum, u8 cornerRTTexNum, u8 cornerRBTexNum, u8 cornerLBTexNum, u8 frameLTexNum, u8 frameTTexNum, u8 frameRTexNum, u8 frameBTexNum); //! @brief コンストラクタです。 //! //! @details //! リソースからオブジェクトを生成します。 //! //! @param pBlock リソースへのポインタです。 //! @param resBlockSet ResBlockSet への参照です。 //! //! @since 2009/09/18 初版。 //! Window( const res::Window* pBlock, const ResBlockSet& resBlockSet); //! @brief デストラクタです。 //! //! @since 2009/09/18 初版。 //! virtual ~Window(); //@} //---------------------------------------- //! @name 設定/取得 //@{ //! @brief 頂点カラーを取得します。 //! //! @param idx インデックスです。 lyt::VertexColor を指定します。 //! //! @return ペインの四隅の頂点カラーを返します。 //! //! @sa SetVtxColor //! @sa GetVtxColorElement //! @sa lyt::VertexColor //! //! @since 2009/09/18 初版。 //! virtual const ut::Color8 GetVtxColor(u32 idx) const; //! @brief 頂点カラーを設定します。 //! //! @param idx インデックスです。 lyt::VertexColor を指定します。 //! @param value 頂点カラーです。 //! //! @sa GetVtxColor //! @sa SetVtxColorElement //! @sa lyt::VertexColor //! //! @since 2009/09/18 初版。 //! virtual void SetVtxColor(u32 idx, ut::Color8 value); //! @brief テキストの表示色(頂点カラー)の各カラー成分を取得します。 //! //! @param idx インデックスです。 lyt::AnimTargetPaneColor を指定します。 //! //! @return テキストの表示色の各成分を返します。 //! //! @sa SetVtxColorElement //! @sa GetVtxColor //! @sa lyt::AnimTargetPaneColor //! //! @since 2009/09/18 初版。 //! virtual u8 GetVtxColorElement(u32 idx) const; //! @brief テキストの表示色(頂点カラー)の各カラー成分を設定します。 //! //! @param idx インデックスです。 lyt::AnimTargetPaneColor を指定します。 //! @param value カラーの成分値です。 //! //! @sa GetVtxColorElement //! @sa SetVtxColor //! @sa lyt::AnimTargetPaneColor //! //! @since 2009/09/18 初版。 //! virtual void SetVtxColorElement(u32 idx, u8 value); using Base::GetMaterial; //! @brief ペインが持つマテリアルの数を取得します。 //! //! @details //! Window ペインはコンテンツ領域+フレーム数のマテリアルを持ちます。 //! //! @return フレーム数 + 1 を返します。 //! //! @sa GetMaterial //! //! @since 2009/09/18 初版。 //! virtual u8 GetMaterialNum() const; //! @brief ペインのマテリアルを取得します。 //! //! @details //! idx に指定する値は GetMaterialNum() の返り値未満でなければなりません。 //! //! @param idx インデックスです。 //! //! @return マテリアルへのポインタを返します。 //! //! @sa GetMaterialNum //! @sa GetContentMaterial //! @sa SetContentMaterial //! @sa GetFrameMaterial //! @sa SetFrameMaterial //! //! @since 2009/09/18 初版。 //! virtual Material* GetMaterial(u32 idx) const; //! @brief コンテント領域のマテリアルを取得します。 //! //! @return マテリアルへのポインタを返します。 //! //! @sa GetMaterial //! @sa SetContentMaterial //! @sa GetFrameMaterial //! @sa SetFrameMaterial //! //! @since 2009/09/18 初版。 //! Material* GetContentMaterial() const; //! @brief コンテント領域のマテリアルを設定します。 //! //! @details //! 現在設定されているマテリアルが Window オブジェクトの生成時に //! 同時に生成されたものだった場合には、そのマテリアルは破棄されます。 //! //! @param pMaterial マテリアルへのポインタです。 //! //! @sa GetMaterial //! @sa GetContentMaterial //! @sa GetFrameMaterial //! @sa SetFrameMaterial //! //! @since 2009/09/18 初版。 //! void SetContentMaterial(Material* pMaterial); //! @brief ウィンドウフレーム領域のマテリアルを取得します。 //! //! @param frameIdx フレームのインデックスです。 //! //! @return マテリアルへのポインタを返します。 //! //! @sa GetMaterial //! @sa GetContentMaterial //! @sa SetContentMaterial //! @sa SetFrameMaterial //! //! @since 2009/09/18 初版。 //! Material* GetFrameMaterial(WindowFrame frameIdx) const; //! @brief ウィンドウフレーム領域のマテリアルを設定します。 //! //! @details //! 現在設定されているマテリアルが Window オブジェクトの生成時に //! 同時に生成されたものだった場合には、そのマテリアルは破棄されます。 //! //! @param frameIdx フレームのインデックスです。 //! @param pMaterial マテリアルへのポインタです。 //! //! @sa GetMaterial //! @sa GetContentMaterial //! @sa SetContentMaterial //! @sa GetFrameMaterial //! //! @since 2009/09/18 初版。 //! void SetFrameMaterial(WindowFrame frameIdx, Material* pMaterial); //! @brief コンテント領域で使うテクスチャ座標を保持するためのメモリ領域を確保します。 //! //! @details //! 保持可能なテクスチャ座標の数の初期値はコンテント領域のテクスチャ数と同じです。 //! //! @param num テクスチャ座標の保持数です。 //! //! @sa Window::Window //! //! @since 2009/09/18 初版。 //! void ReserveTexCoord(u8 num); //! @brief コンテント領域で使うテクスチャ座標の保持数を取得します。 //! //! @return 保持しているテクスチャ座標の数を返します。 //! //! @sa SetTexCoordNum //! //! @since 2009/09/18 初版。 //! u8 GetTexCoordNum() const; //! @brief コンテント領域で使うテクスチャ座標の保持数を設定します。 //! //! @details //! num に指定できる値は保持可能なテクスチャ座標数以下でなければなりません。 //! //! @param num テクスチャ座標の保持数です。 //! //! @sa ReserveTexCoord //! @sa GetTexCoord //! //! @since 2009/09/18 初版。 //! void SetTexCoordNum(u8 num); //! @brief コンテント領域で使うテクスチャ座標を取得します。 //! //! @param idx インデックスです。 //! @param[out] coords テクスチャ座標を格納する領域へのポインタです。 //! //! @since 2009/09/18 初版。 //! void GetTexCoord(u32 idx, TexCoordQuad coords) const; //! @brief コンテント領域で使うテクスチャ座標を設定します。 //! //! @param idx インデックスです。 //! @param coords テクスチャ座標です。 //! //! @since 2009/09/18 初版。 //! void SetTexCoord(u32 idx, const TexCoordQuad coords); //! @brief ウィンドウフレーム数を取得します。 //! //! @details //! ウィンドウフレームの数はオブジェクト生成時に決定されます。 //! //! @return オブジェクトの生成方法によって 1, 4, 8 のいずれかを返します。 //! //! @sa Window::Window //! //! @since 2009/09/18 初版。 //! u8 GetFrameNum() const { return m_FrameNum; } //@} //---------------------------------------- //! @name 検索 //@{ //! @brief 名前でマテリアルを検索します。 //! //! @details //! findName のマテリアル名を持つマテリアルを検索します。 //! //! bRecursive に true を渡した場合は子ペインと、子ペインが子を //! 持つ場合はさらにその子ペインからも検索します。 //! //! @param findName 検索するマテリアル名です。 //! @param bRecursive 子ペインも検索する場合は true を指定します。 //! //! @return マテリアルが見つかった場合はそのマテリアルへのポインタを、 //! 見つからなかった場合は NULL を返します。 //! //! @since 2009/09/18 初版。 //! virtual Material* FindMaterialByName( const char* findName, bool bRecursive = true); //@} #ifdef NW_LYT_DMPGL_ENABLED protected: virtual void DrawSelf(const DrawInfo& drawInfo); private: virtual void DrawContent( const DrawInfo& draInfo, const math::VEC2& basePt, const WindowFrameSize& frameSize, u8 alpha); virtual void DrawFrame( const DrawInfo& draInfo, const math::VEC2& basePt, const Frame& frame, const WindowFrameSize& frameSize, u8 alpha); virtual void DrawFrame4( const DrawInfo& draInfo, const math::VEC2& basePt, const Frame* frames, const WindowFrameSize& frameSize, u8 alpha); virtual void DrawFrame8( const DrawInfo& draInfo, const math::VEC2& basePt, const Frame* frames, const WindowFrameSize& frameSize, u8 alpha); #endif // NW_LYT_DMPGL_ENABLED private: const WindowFrameSize GetFrameSize( u8 frameNum, const Frame* frames) const; void InitTexNum( u8 contentTexNum, u8 frameTexNums[], u8 frameNum); void InitContent(u8 texNum); void InitFrame(u8 frameNum); #ifdef NW_LYT_DRAWER_ENABLE public : virtual void MakeUniformDataSelf( DrawInfo* pDrawInfo, Drawer* pDrawer ) const; private : // 処理削減のためにDrawer が使う // テクスチャ座標が初期化済みかどうか mutable bool m_IsTexCoordInited; // テクスチャ座標の数のキャッシュ mutable u32 m_UniformTexCoordNum; // テクスチャ座標のキャッシュ mutable nw::math::VEC4 m_UniformTexCoords[ TexMapMax * 2 ]; #endif private: // コピーコンストラクタと代入演算子の呼び出しを禁止します。実装してはいけません。 Window(const Window& other); Window& operator = (const Window& other); private: InflationLRTB m_ContentInflation; Content m_Content; Frame* m_Frames; u8 m_FrameNum; Material* m_pMaterial; }; } // namespace nw::lyt } // namespace nw #endif // NW_LYT_WINDOW_H_