/*---------------------------------------------------------------------------* Project: NintendoWare File: lyt_GraphicsResource.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_GRAPHICSRESOURCE_H_ #define NW_LYT_GRAPHICSRESOURCE_H_ #include #include #include #include #include #include #include namespace nw { namespace lyt { class Layout; //--------------------------------------------------------------------------- //! :category 描画 //! //! @brief 複数の %Layout で共通に使用される %OpenGL のリソースを保持するクラスです。 //! //! @details //! DrawInfo::SetGraphicsResource() で DrawInfo に設定します。 //! //! @since 2009/09/18 初版。 //--------------------------------------------------------------------------- class GraphicsResource { public: #ifdef NW_LYT_DMPGL_ENABLED //! :private //! @brief キャッシュされた Uniform Location の ID です。 enum Uniform { UNIFORM_uProjection, UNIFORM_uModelView, UNIFORM_uTexMtx0, UNIFORM_uTexMtx1, UNIFORM_uTexMtx2, UNIFORM_uColor, UNIFORM_uTransform, UNIFORM_uFrameSpec, UNIFORM_uVertexColor, UNIFORM_uVertexTexCoord0, UNIFORM_uVertexTexCoord1, UNIFORM_uVertexTexCoord2, UNIFORM_uRcpTexSize0, UNIFORM_dmp_Texture0_samplerType, UNIFORM_dmp_Texture1_samplerType, UNIFORM_dmp_Texture2_samplerType, UNIFORM_dmp_Texture3_samplerType, UNIFORM_dmp_TexEnv0_combineRgb, UNIFORM_dmp_TexEnv1_combineRgb, UNIFORM_dmp_TexEnv2_combineRgb, UNIFORM_dmp_TexEnv3_combineRgb, UNIFORM_dmp_TexEnv4_combineRgb, UNIFORM_dmp_TexEnv5_combineRgb, UNIFORM_dmp_TexEnv0_combineAlpha, UNIFORM_dmp_TexEnv1_combineAlpha, UNIFORM_dmp_TexEnv2_combineAlpha, UNIFORM_dmp_TexEnv3_combineAlpha, UNIFORM_dmp_TexEnv4_combineAlpha, UNIFORM_dmp_TexEnv5_combineAlpha, UNIFORM_dmp_TexEnv0_srcRgb, UNIFORM_dmp_TexEnv1_srcRgb, UNIFORM_dmp_TexEnv2_srcRgb, UNIFORM_dmp_TexEnv3_srcRgb, UNIFORM_dmp_TexEnv4_srcRgb, UNIFORM_dmp_TexEnv5_srcRgb, UNIFORM_dmp_TexEnv0_srcAlpha, UNIFORM_dmp_TexEnv1_srcAlpha, UNIFORM_dmp_TexEnv2_srcAlpha, UNIFORM_dmp_TexEnv3_srcAlpha, UNIFORM_dmp_TexEnv4_srcAlpha, UNIFORM_dmp_TexEnv5_srcAlpha, UNIFORM_dmp_TexEnv0_operandRgb, UNIFORM_dmp_TexEnv1_operandRgb, UNIFORM_dmp_TexEnv2_operandRgb, UNIFORM_dmp_TexEnv3_operandRgb, UNIFORM_dmp_TexEnv4_operandRgb, UNIFORM_dmp_TexEnv5_operandRgb, UNIFORM_dmp_TexEnv0_operandAlpha, UNIFORM_dmp_TexEnv1_operandAlpha, UNIFORM_dmp_TexEnv2_operandAlpha, UNIFORM_dmp_TexEnv3_operandAlpha, UNIFORM_dmp_TexEnv4_operandAlpha, UNIFORM_dmp_TexEnv5_operandAlpha, UNIFORM_dmp_TexEnv0_scaleRgb, UNIFORM_dmp_TexEnv1_scaleRgb, UNIFORM_dmp_TexEnv2_scaleRgb, UNIFORM_dmp_TexEnv3_scaleRgb, UNIFORM_dmp_TexEnv4_scaleRgb, UNIFORM_dmp_TexEnv5_scaleRgb, UNIFORM_dmp_TexEnv0_scaleAlpha, UNIFORM_dmp_TexEnv1_scaleAlpha, UNIFORM_dmp_TexEnv2_scaleAlpha, UNIFORM_dmp_TexEnv3_scaleAlpha, UNIFORM_dmp_TexEnv4_scaleAlpha, UNIFORM_dmp_TexEnv5_scaleAlpha, UNIFORM_dmp_TexEnv0_constRgba, UNIFORM_dmp_TexEnv1_constRgba, UNIFORM_dmp_TexEnv2_constRgba, UNIFORM_dmp_TexEnv3_constRgba, UNIFORM_dmp_TexEnv4_constRgba, UNIFORM_dmp_TexEnv5_constRgba, UNIFORM_dmp_TexEnv0_bufferColor, UNIFORM_dmp_TexEnv1_bufferInput, UNIFORM_dmp_TexEnv2_bufferInput, UNIFORM_dmp_TexEnv3_bufferInput, UNIFORM_dmp_TexEnv4_bufferInput, UNIFORM_dmp_FragOperation_enableAlphaTest, UNIFORM_dmp_FragOperation_alphaRefValue, UNIFORM_dmp_FragOperation_alphaTestFunc, UNIFORM_MAX }; //! :private //! バッファオブジェクトのインデックスです。 enum VBO { VBO_ELEMENT, VBO_VERTEX_INDEX, VBO_MAX }; #endif // NW_LYT_DMPGL_ENABLED //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! @brief コンストラクタです。 //! //! @since 2009/09/18 初版。 //! GraphicsResource(); //! @brief デストラクタです。 //! //! @since 2009/09/18 初版。 //! ~GraphicsResource(); //@} //---------------------------------------- //! @name 初期化/開放 //@{ //! @brief 初期化を開始します。 //! //! @details //! この関数の呼び出し後に、GetResourcePath() と SetResource() を使ってリソース //! ファイルを設定します。 //! //! 最後に FinishSetup() を呼び出して初期化を完了します。 //! //! @sa GetResourcePath //! @sa SetResource //! @sa FinishSetup //! //! @since 2009/09/18 初版。 //! void StartSetup(); //! @brief リソースファイルのパスを取得します。 //! //! @param index リソースファイルのインデックス番号です(index >= 0)。 //! //! @return //! リソースファイルのパスを返します。 //! インデックスに対応するリソースがない場合には NULL を返します。 //! //! @sa StartSetup //! @sa GetResourceName //! //! @since 2009/09/18 初版。 //! const wchar_t* GetResourcePath(int index); //! @brief リソースファイルを設定します。 //! //! @details //! index にはパスを取得した時のインデックスを指定します。 //! //! bFree に true を指定した場合には、ライブラリは content の指す //! メモリ領域を Layout::FreeMemory() で開放します。その場合、 //! content は Layout::AllocMemory() で割り当てられていなければなりません。 //! //! @param index リソースファイルのインデックス番号です。 //! @param content リソースファイルの内容です。 //! @param fileSize リソースファイルのサイズです。 //! @param bFree content のメモリ削除をライブラリに任せます。 //! //! @sa StartSetup //! @sa Layout::AllocMemory //! //! @date 2010/04/23 bFree 引数を追加しました。 //! @since 2009/09/18 初版。 //! void SetResource(int index, void* content, u32 fileSize, bool bFree = true); //! @brief 初期化を完了します。 //! //! @return 初期化が正常に完了したら true を返します。 //! //! @sa StartSetup //! //! @since 2009/09/18 初版。 //! bool FinishSetup(); //! @brief リソースを開放します。 //! //! @details //! デストラクタの呼び出し以前にリソースを開放しなければならない場合に //! 使用します。 //! //! @since 2009/09/18 初版。 //! void Finalize(); //! @brief 初期化が済んでいるか調べます。 //! //! @return 初期化が済んでいれば true を返します。 //! //! @since 2009/09/18 初版。 //! bool Initialized() const { return m_Initialized; } //@} #ifdef NW_LYT_DMPGL_ENABLED //! :private //! //! @brief ペインの描画に使用するプログラムオブジェクトを得ます。 //! //! @return プログラムオブジェクトのハンドルを返します。 //! //! @since 2009/09/18 初版。 //! GLuint GetGlProgram() const { return m_GlProgram; } #endif //! :private //! //! @brief Drawer 用のシェーダーバイナリを取得します。 //! const void* GetRectShaderBinary() const { return m_pRectShaderBinary; } //! :private //! //! @brief Drawer 用のシェーダーバイナリのサイズを取得します。 //! u32 GetRectShaderBinarySize() const { return m_RectShaderBinarySize; } #ifdef NW_LYT_DMPGL_ENABLED //! :private //! //! @brief デバッグ情報の描画に使用するプログラムオブジェクトを得ます。 //! //! @return プログラムオブジェクトのハンドルを返します。 //! //! //! @since 2009/09/18 初版。 //! GLuint GetGlProgramDebug() const { return m_GlProgramDebug; } #endif //! :private //! //! @brief TextBox ペインの描画に使用する TextWriter を取得します。 //! //! @return TextWriter への参照を返します。 //! //! @since 2009/09/18 初版。 //! font::WideTextWriter& GetTextWriter() { return m_TextWriter; } //! :private //! //! @brief TextBox ペインの描画に使用する TextWriter を取得します。 //! //! @return TextWriter への参照を返します。 //! //! @since 2009/09/18 初版。 //! const font::WideTextWriter& GetTextWriter() const { return m_TextWriter; } //! :private //! //! @brief TextBox ペインの描画に使用する TextWriterResource を取得します。 //! //! @return TextWriterResource への参照を返します。 //! //! @since 2009/09/18 初版。 //! font::TextWriterResource& GetTextWriterResource() { return m_TextWriterResource; } //! :private //! //! @brief TextBox ペインの描画に使用する TextWriterResource を取得します。 //! //! @return TextWriterResource への参照を返します。 //! //! @since 2009/09/18 初版。 //! const font::TextWriterResource& GetTextWriterResource() const { return m_TextWriterResource; } #ifdef NW_LYT_DMPGL_ENABLED //! :private //! //! @brief モデルビュー行列を取得します。 //! //! @return モデルビュー行列を返します。 //! //! @since 2009/09/18 初版。 //! const math::MTX34& GetMtxModelView() const { return m_MtxModelView; } //! :private //! //! @brief モデルビュー行列を設定します。 //! void SetMtxModelView(const math::MTX34 m) { m_MtxModelView = m; m_MtxModelViewLoaded = false; } //! :private //! //! @brief テクスチャが使用するテクスチャ座標の番号を取得します。 //! //! @param index テクスチャのインデックスです。 //! //! @return 使用するテクスチャ座標の番号です。 //! int GetTexCoordSrc(int index) const { return m_TexCoordSrc[index]; } //! :private //! //! @brief テクスチャが使用するテクスチャ座標の番号を設定します。 //! //! @param index テクスチャのインデックスです。 //! @param src 使用するテクスチャ座標の番号です。 //! void SetTexCoordSrc(int index, int src) { m_TexCoordSrc[index] = src; } //! :private //! //! @brief 射影行列を設定します。 //! //! @param mtx 射影行列です。 //! void SetProjectionMtx(const nw::math::MTX44& mtx); //! :private //! //! @brief キャッシュされた Uniform Location を取得します。 //! //! @param uniformName Uniform 列挙型の値を指定します。 //! //! @return Uniform Location を返します。 //! GLint GetUniformLocation(int uniformName) const { return m_UniformLocation[uniformName]; } //! :private //! //! @brief 前回の描画で使用したTexEnvの段数を得ます。 //! //! @return TexEnvの段数を返します。 //! u32 GetNumTexEnv() const { return m_NumTexEnv; } //! :private //! //! @brief 描画中の情報のキャッシュを初期化します。 //! void ResetGlProgramState(); //! :private //! //! @brief 描画中の情報のキャッシュを初期化します。 //! void ResetGlState(); //! :private //! //! @brief 描画で使用するTexEnvの段数を記録します。 //! void SetNumTexEnv(u32 numTexEnv) { m_NumTexEnv = static_cast(numTexEnv); } //! :private //! //! @brief 前回の描画でのTexEnvの設定が簡易設定によるものか調べます。 //! //! @return 自動設定であれば true を返します。 //! bool GetTexEnvAuto() const { return m_TexEnvAuto; } //! :private //! //! @brief 前回の描画で使用されたテクスチャ枚数を取得します。 //! //! @return テクスチャ枚数を返します。 //! u8 GetNumTexMap() const { return m_NumTexMap; } //! :private //! //! @brief TexEnvへの設定情報を記録します。 //! //! @param value 簡易設定であれば true を指定します。 //! @param numTexMap 使用するテクスチャ枚数を指定します。 //! void SetTexEnvAuto(bool value, u8 numTexMap = 0) { m_TexEnvAuto = value; m_NumTexMap = numTexMap; } //! :private //! //! @brief モデルビュー行列をシェーダーにロードします。 //! void LoadMtxModelView() { if (!m_MtxModelViewLoaded) { m_MtxModelViewLoaded = true; GLint loc = this->GetUniformLocation(this->UNIFORM_uModelView); glUniform4fv(loc, 3, m_MtxModelView.a); } } //! :private //! //! @brief シェーダープログラムを設定します。 //! //! @param program シェーダープログラムのIDです。 //! void UseProgram(GLuint program) { glUseProgram(program); } public: //! :private //! //! @brief バッファオブジェクトを取得します。 //! GLuint GetVBO(int index) const { return m_GlVertexBufferObject[index]; } //! :private //! //! @brief プログラムオブジェクトを設定します。 //! void SetupProgram() { if (m_FirstDraw) { m_FirstDraw = false; this->ActiveVBO(); } } protected: //! :private //! //! @brief 共通で利用するバッファオブジェクトを初期化します。 //! void InitVBO(); //! :private //! //! @brief 共通で利用するバッファオブジェクトを有効化します。 //! void ActiveVBO(); #endif // NW_LYT_DMPGL_ENABLED protected: //! @details :private void* m_pRectShaderBinary; //! @details :private u32 m_RectShaderBinarySize; //! @details :private font::TextWriterResource m_TextWriterResource; //! @details :private font::WideTextWriter m_TextWriter; #ifdef NW_LYT_DMPGL_ENABLED //! @details :private GLuint m_GlProgram; //! @details :private GLuint m_GlProgramDebug; //! @details :private math::MTX34 m_MtxModelView; //! @details :private s8 m_TexCoordSrc[TexMapMax]; //! @details :private u8 m_NumTexEnv; //! @details :private u8 m_NumTexMap; //! @details :private GLuint m_GlVertexBufferObject[VBO_MAX]; //! @details :private GLint m_UniformLocation[UNIFORM_MAX]; //! @details :private bool m_TexEnvAuto; //! @details :private bool m_MtxModelViewLoaded; //! @details :private bool m_FirstDraw; #endif //! @details :private bool m_Initialized; }; } // namespace nw::lyt } // namespace nw #endif // NW_LYT_GRAPHICSRESOURCE_H_