/*---------------------------------------------------------------------------* Project: NintendoWare File: lyt_Drawer.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: 26780 $ *---------------------------------------------------------------------------*/ #ifndef NW_LYT_DRAWER_H_ #define NW_LYT_DRAWER_H_ // 高速化実験を有効にする #ifdef NW_PLATFORM_CTR #define NW_LYT_DRAWER_ENABLE 1 #endif #include #ifdef NW_LYT_DRAWER_ENABLE //-------------------------------------- // 動作設定 // ASSERT #if 1 #define NW_LYT_DRAWER_GL_ASSERT() NW_GL_ASSERT() #define NW_LYT_DRAWER_ASSERT( x ) NW_ASSERT( x ) #define NW_LYT_DRAWER_NULL_ASSERT( x ) NW_NULL_ASSERT( x ) #else #define NW_LYT_DRAWER_ASSERT( x ) #define NW_LYT_DRAWER_GL_ASSERT() #define NW_LYT_DRAWER_NULL_ASSERT( x ) #endif // 必要のない機能であれば削れば速いかも #define NW_LYT_DRAWER_ENABLE_ALPHA_TEST 1 #define NW_LYT_DRAWER_ENABLE_BLEND_FUNC 1 #define NW_LYT_DRAWER_ENABLE_USER_TEX_ENV 1 //---------------------------------------------------------- // マクロ // nngxValidateState #ifdef NW_FONT_RECTDRAWER_USE_DRAW_ARRAYS #define NW_LYT_DRAWER_VALIDATE( state_mask ) \ nngxValidateState( state_mask, GL_FALSE ) #else #define NW_LYT_DRAWER_VALIDATE( state_mask ) \ nngxValidateState( state_mask, GL_TRUE ) #endif #if 0 #define NW_LYT_DRAWER_ALIGN_32 __attribute__((aligned(32))) #else #define NW_LYT_DRAWER_ALIGN_32 #endif //---------------------------------------------------------- // 実験用 // PictureのDrawを切る // #define NW_LYT_DRAWER_DISABLE_DRAW_PICTURE 1 // TextBoxのDrawを切る // #define NW_LYT_DRAWER_DISABLE_DRAW_TEXTBOX 1 // WindowのDrawを切る // #define NW_LYT_DRAWER_DISABLE_DRAW_WINOOW 1 // UniformDataのPRINT // #define NW_LYT_DRAWER_PRINT_UNIFORM_DATA 1 //---------------------------------------------------------- #include #include #include #include namespace nw { namespace lyt { class Layout; class Pane; class Material; class DrawInfo; class Material; class TexMap; class TextBox; class GraphicsResource; //--------------------------------------------------------------------------- //! :category 描画 //! //! @brief 高速描画クラスです。 //! //! @details //! レイアウトを高速に描画します。 //! //! Layout::Draw() の代わりに使用します。 //! //!  nw::lyt::Drawer drawer(graphicsResource);\n //!  \n //!  pLayout->Animate();\n //!  pLayout->CalculateMtx(drawInfo);\n //!  \n //!  // ユーザの行うGL設定。\n //!  InitGX();\n //!  \n //!  drawer.DrawBegin(drawInfo);\n //!  drawer.Draw(pLayout, drawInfo);\n //!  drawer.DrawEnd(drawInfo);\n //!  \n //!  // DMPGLステートの一貫性を回復します。\n //!  nngxUpdateState(NN_GX_STATE_ALL); //! //! GLの以下の設定はユーザに任せています(lytでは設定しません)。 //! //! ・カリング\n //! ・シザー処理\n //! ・ステンシルテスト\n //! ・マスク処理\n //! ・ポリゴンオフセット\n //! ・デプステスト\n //! ・アーリーデプステスト\n //! ・フレームバッファオブジェクト //! //! 設定方法については simple デモのソースを確認してください //! (Drawer は通常のGL関数を使わないため、設定方法が複雑です)。 //! //! Drawer の描画関数を使用すると DMPGL ステートが一貫性の無い状態になります。 //! //! Drawerの使用後に GL の関数を使用する前には nngxUpdateState() 呼び出しを行ってください。 //! //! @since 2010/05/14 初版。DrawManagerを置き換えました。 //! @date 2010/09/24 Drawerの初期化後のnngxUpdateState()呼び出しは必要なくなりました。 //! //--------------------------------------------------------------------------- class Drawer : public font::RectDrawer { typedef RectDrawer Base; public: //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! @brief コンストラクタです。 //! //! @details //! Initialize() による初期化が必要です。 //! //! @sa Initialize //! //! @since 2010/05/14 初版。 //! Drawer(); //! @brief コンストラクタです。 //! //! @details //! オブジェクトの構築と Initialize() の呼び出しを行います。 //! //! @param graphicsResource GraphicsResource を指定します。 //! //! @since 2010/04/12 初版。 //! explicit Drawer( GraphicsResource& graphicsResource ); //@} //---------------------------------------- //! @name 初期化/後処理 //@{ //! @brief 初期化を行います。 //! //! @param graphicsResource GraphicsResource を指定します。 //! @param vertexBuffer 頂点用バッファ。 //! //! @sa Finalize //! //! @since 2010/05/14 初版。 //! @date 2010/09/24 nngxUpdateState()の呼び出しは必要なくなりました。 //! void Initialize( GraphicsResource& graphicsResource, void* vertexBuffer = NULL ); protected: //! @details :private void Initialize( void* vtxBufCmdBuf, const void* shaderBinary, u32 size ) { Base::Initialize(vtxBufCmdBuf, shaderBinary, size); } //! @details :private void Initialize( void* vertexBuffer, void* commandBuffer, const void* shaderBinary, u32 size ) { Base::Initialize(vertexBuffer, commandBuffer, shaderBinary, size); } public: //! @brief 開放を行います。 //! //! @sa Initialize //! //! @since 2010/06/02 初版。 //! virtual void Finalize(); //@} public: //---------------------------------------- //! @name 描画 //@{ //! @brief 描画を開始します。 //! //! @param drawInfo DrawInfo を指定します。 //! //! @sa Draw //! @sa DrawEnd //! //! @details //! 本関数を使用すると DMPGL ステートが一貫性の無い状態になります。 //! 以後に GL 関数を使用する場合は nngxUpdateState() //! 呼び出しを行ってください。 //! //! @since 2010/05/14 初版。StartCmdList より改名しました。 //! @date 2010/09/30 nngxUpdateState() 呼び出しについて加筆しました。 //! void DrawBegin( const DrawInfo& drawInfo ); //! @details :private virtual void DrawBegin(u32 flag = 0); //! @brief レイアウトを描画します。 //! //! @details //! DrawBegin(), DrawEnd() の間で複数回の Draw() を行うことができます。 //! //! 本関数を使用すると DMPGL ステートが一貫性の無い状態になります。 //! 以後に GL 関数を使用する場合は nngxUpdateState() //! 呼び出しを行ってください。 //! //! @param pLayout Layout を指定します。 //! @param drawInfo DrawInfo を指定します。 //! //! @sa DrawBegin //! @sa DrawEnd //! //! @since 2010/05/14 初版。AddCmdList より改名しました。 //! @date 2010/09/30 nngxUpdateState() 呼び出しについて加筆しました。 //! void Draw( const Layout* pLayout, DrawInfo& drawInfo ); //! @brief ペインを描画します。 //! //! @details //! 指定したペインおよびその子階層のペインを描画します。 //! //! DrawBegin(), DrawEnd() の間で複数回の Draw() を行うことができます。 //! //! 本関数を使用すると DMPGL ステートが一貫性の無い状態になります。 //! 以後に GL 関数を使用する場合は nngxUpdateState() //! 呼び出しを行ってください。 //! //! @param pPane Pane を指定します。 //! @param drawInfo DrawInfo を指定します。 //! //! @sa DrawBegin //! @sa DrawEnd //! //! @since 2010/05/14 初版。AddCmdList より改名しました。 //! @date 2010/09/30 nngxUpdateState() 呼び出しについて加筆しました。 //! void Draw( const Pane* pPane, DrawInfo& drawInfo ); //! @brief 描画を終了します。 //! //! @param drawInfo DrawInfo を指定します。 //! //! @details //! 本関数を使用すると DMPGL ステートが一貫性の無い状態になります。 //! 以後に GL 関数を使用する場合は nngxUpdateState() //! 呼び出しを行ってください。 //! //! @sa DrawBegin //! @sa Draw //! //! @since 2010/05/14 初版。UseCmdList より改名しました。 //! @date 2010/09/30 nngxUpdateState() 呼び出しについて加筆しました。 //! void DrawEnd( const DrawInfo& /* drawInfo */ ) { u32 flag = 0; DrawEnd(flag); } //! @details :private virtual void DrawEnd(u32 flag = 0); //@} public: //! @details :private void DumpCmdList(); //! @details :private void SetUpTexEnv( const Material* pMaterial ); //! @details :private void SetUpTextures( const Material* pMaterial, bool addDisableCommand = true); //! @details :private void SetUpTextureCoords( const nw::math::VEC4 texCoords[ TexMapMax * 2 ], const int texCoordNum ); //! @details :private void SetUpVtxColors( const nw::ut::Color8 vtxColors[VERTEX_MAX], const u8 globalAlpha ); //! @details :private void SetUpTextBox( const TextBox* pTextBox, const Material* pMaterial, const DrawInfo& drawInfo ); //! @details :private void SetUpMtx( const nw::math::MTX34& mtx ); //! @details :private void SetUpQuad( const nw::lyt::Size& size, const nw::math::VEC2& basePt ); //! @details :private void SetUniformDataEnd(); //! @details :private void SetCurrentUniformAlpha( const f32 alpha ); //! @details :private u8 CalcTextureCoords( const Material* pMaterial, const TexCoordQuad* pTexCoordQuad, nw::math::VEC4 texCoords[ TexMapMax * 2 ] ) const; //! @brief バッファの内容を書き出します。 //! void FlushBuffer() { #ifdef NW_FONT_RECTDRAWER_USE_DRAW_BUFFER if (m_UniformAddrIndex > 0) { UniformAndDraw(); } #endif } protected: //! @details :private void UniformAndDraw(); //! @details :private void SetUpTexEnvType2( const Material* pMaterial ); //! @details :private void SetUpTexEnvType3( const Material* pMaterial ); #ifdef NW_LYT_DRAWER_ENABLE_USER_TEX_ENV //! @details :private void SetUpGLTexEnvUser( const Material* pMaterial ); #endif #ifdef NW_LYT_DRAWER_ENABLE_BLEND_FUNC //! @details :private void SetUpBlendMode( const Material* pMaterial ); #endif #ifdef NW_LYT_DRAWER_ENABLE_ALPHA_TEST //! @details :private void SetUpAlphaTest( const Material* pMaterial ); #endif protected: ////////////////////////////// Command //! @details :private GLuint m_PrevTexObj; //! @details :private int m_ActiveTexureNum; //! @details :private int m_TexCoordNum; //! @details :private bool m_IsBlendDefault; //! @details :private bool m_AlphaTestEnable; protected: ////////////////////////////// Texture Combiner //! @details :private enum TEX_ENV_TYPE { TEX_ENV_TYPE_0_TEX, TEX_ENV_TYPE_1_TEX, TEX_ENV_TYPE_2_TEX, TEX_ENV_TYPE_3_TEX, TEX_ENV_TYPE_TEXT, TEX_ENV_TYPE_USER, TEX_ENV_TYPE_NUM }; //! @details :private TEX_ENV_TYPE m_CurrentTexEnvType; #if ! defined(NW_RELEASE) //! @details :private TEX_ENV_TYPE m_PreviousTexEnvType; #endif //! @details :private enum { TEX_ENV_UNIFORM_NUM = 8, #ifdef NW_TARGET_CTR_GL_FINAL TEX_ENV_STAGE_NUM = 6, #else TEX_ENV_STAGE_NUM = 3, #endif TEX_ENV_UNIFORM_VALUE_NUM = 16 }; }; }} #endif // #ifdef NW_LYT_DRAWER_ENABLE #endif