/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_ResFragmentShader.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: 18106 $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_RESFRAGMENTSHADER_H_ #define NW_GFX_RESFRAGMENTSHADER_H_ #include #include #include #include #include #include #include namespace nw { namespace gfx { namespace res { //! @details :private struct ResFragmentLightingData { enum Flag { FLAG_CLAMP_HIGH_LIGHT_SHIFT, FLAG_DISTRIBUTION0_ENABLED_SHIFT, FLAG_DISTRIBUTION1_ENABLED_SHIFT, FLAG_GEOMETRIC_FACTOR0_ENABLED_SHIFT, FLAG_GEOMETRIC_FACTOR1_ENABLED_SHIFT, FLAG_REFLECTION_ENABLED_SHIFT, FLAG_CLAMP_HIGH_LIGHT = 0x1 << FLAG_CLAMP_HIGH_LIGHT_SHIFT, FLAG_DISTRIBUTION0_ENABLED = 0x1 << FLAG_DISTRIBUTION0_ENABLED_SHIFT, FLAG_DISTRIBUTION1_ENABLED = 0x1 << FLAG_DISTRIBUTION1_ENABLED_SHIFT, FLAG_GEOMETRIC_FACTOR0_ENABLED = 0x1 << FLAG_GEOMETRIC_FACTOR0_ENABLED_SHIFT, FLAG_GEOMETRIC_FACTOR1_ENABLED = 0x1 << FLAG_GEOMETRIC_FACTOR1_ENABLED_SHIFT, FLAG_REFLECTION_ENABLED = 0x1 << FLAG_REFLECTION_ENABLED_SHIFT }; nw::ut::ResU32 m_Flags; nw::ut::ResU32 m_LayerConfig; nw::ut::ResS32 m_FresnelConfig; nw::ut::ResU32 m_BumpTextureIndex; nw::ut::ResU32 m_BumpMode; nw::ut::ResBool m_IsBumpRenormalize; u8 _padding_0[3]; }; //! @details :private struct ResLightingLookupTableData { nw::ut::ResU32 m_Input; nw::ut::ResU32 m_Scale; nw::ut::Offset toSampler; }; //! @details :private struct ResFragmentLightingTableData { nw::ut::Offset toReflectanceRSampler; nw::ut::Offset toReflectanceGSampler; nw::ut::Offset toReflectanceBSampler; nw::ut::Offset toDistribution0Sampler; nw::ut::Offset toDistribution1Sampler; nw::ut::Offset toFresnelSampler; }; //! @details :private struct ResAlphaTestData { nw::ut::ResU32 m_CommandBuffer[2]; }; //! @details :private struct ResTextureCombinerSourceData { nw::ut::ResU32 m_Sources[3]; }; //! @details :private struct ResTextureCombinerOperandData { nw::ut::ResU32 m_Operands[3]; }; //! @details :private struct ResTextureCombinerData { nw::ut::ResU32 m_Constant; union { struct { nw::ut::ResU32 m_CmdSource; nw::ut::ResU32 m_CmdHeader; nw::ut::ResU32 m_CmdOperand; nw::ut::ResU32 m_CmdCombine; nw::ut::ResU32 m_CmdConstant; nw::ut::ResU32 m_CmdScale; }; nw::ut::ResU32 m_CommandBuffer[6]; }; }; //! @details :private struct ResFragmentShaderData { nw::ut::ResFloatColor m_BufferColor; ResFragmentLightingData m_FragmentLighting; nw::ut::Offset toFragmentLightingTable; ResTextureCombinerData m_TextureCombiners[COMBINER_COUNT]; ResAlphaTestData m_AlphaTest; // [0] BufferColor // [1] BufferColorヘッダ (0x0fd) // [2] BufferInput // [3] BufferInputヘッダ(0x0e0 [15:8]) // [4] TextureRemap // [5] TextureRemapヘッダ(0x1c3 [15:8]) nw::ut::ResU32 m_BufferCommand[6]; }; //-------------------------------------------------------------------------- //! @brief フラグメントライティングを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResFragmentLighting : public nw::ut::ResCommon< ResFragmentLightingData > { public: enum LutType { LUT_RR_SHIFT, LUT_RG_SHIFT, LUT_RB_SHIFT, LUT_D0_SHIFT, LUT_D1_SHIFT, LUT_FR_SHIFT, LUT_SP_SHIFT, LUT_DA_SHIFT, LUT_RR = 0x1 << LUT_RR_SHIFT, LUT_RG = 0x1 << LUT_RG_SHIFT, LUT_RB = 0x1 << LUT_RB_SHIFT, LUT_D0 = 0x1 << LUT_D0_SHIFT, LUT_D1 = 0x1 << LUT_D1_SHIFT, LUT_FR = 0x1 << LUT_FR_SHIFT, LUT_SP = 0x1 << LUT_SP_SHIFT, LUT_DA = 0x1 << LUT_DA_SHIFT }; enum ConfigDetail { CONFIG_DETAIL0 = LUT_RR | LUT_D0 | LUT_SP | LUT_DA, CONFIG_DETAIL1 = LUT_RR | LUT_FR | LUT_SP | LUT_DA, CONFIG_DETAIL2 = LUT_RR | LUT_D0 | LUT_D1 | LUT_DA, CONFIG_DETAIL3 = LUT_D0 | LUT_D1 | LUT_SP | LUT_DA, CONFIG_DETAIL4 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_SP | LUT_DA, CONFIG_DETAIL5 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_FR | LUT_SP | LUT_DA, CONFIG_DETAIL6 = LUT_RR | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA, CONFIG_DETAIL7 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA, #ifdef NW_TARGET_CTR_GL_FINAL CONFIG_DETAIL8 = LUT_RR | LUT_D1 | LUT_SP | LUT_DA, CONFIG_DETAIL9 = LUT_D0 | LUT_D1 | LUT_SP | LUT_DA, CONFIG_DETAIL10 = LUT_RR | LUT_RG | LUT_RB | LUT_DA #else CONFIG_DETAIL8 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA, CONFIG_DETAIL9 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA, CONFIG_DETAIL10 = LUT_RR | LUT_RG | LUT_RB | LUT_D0 | LUT_D1 | LUT_FR | LUT_SP | LUT_DA #endif }; //TODO: 使用しませんをチェック。 //! @brief レイヤーコンフィグです。 enum Config { CONFIG_TYPE0 = 0, //!< レイヤーコンフィグ 0 です。 CONFIG_TYPE1 = 1, //!< レイヤーコンフィグ 1 です。 CONFIG_TYPE2 = 2, //!< レイヤーコンフィグ 2 です。 CONFIG_TYPE3 = 3, //!< レイヤーコンフィグ 3 です。 CONFIG_TYPE4 = 4, //!< レイヤーコンフィグ 4 です。 CONFIG_TYPE5 = 5, //!< レイヤーコンフィグ 5 です。 CONFIG_TYPE6 = 6, //!< レイヤーコンフィグ 6 です。 CONFIG_TYPE7 = 8, //!< レイヤーコンフィグ 7 です。 #if defined(NW_TARGET_CTR_GL_FINAL) CONFIG_TYPE8 = 12, //!< 使用しません。 CONFIG_TYPE9 = 13, //!< 使用しません。 CONFIG_TYPE10 = 14 //!< 使用しません。 #else CONFIG_TYPE8 = 8, //!< 使用しません。 CONFIG_TYPE9 = 8, //!< 使用しません。 CONFIG_TYPE10 = 8 //!< 使用しません。 #endif }; //! @brief フレネルの適用先です。 enum FresnelConfig { CONFIG_NO_FRESNEL = 0, //!< フレネルは使用しません。 CONFIG_PRI_ALPHA_FRESNEL = 1, //!< フレネルをプライマリに適用します。 CONFIG_SEC_ALPHA_FRESNEL = 2, //!< フレネルをセカンダリに適用します。 CONFIG_PRI_SEC_ALPHA_FRESNEL = 3 //!< フレネルをプライマリとセカンダリの両方に適用します。 }; //! @brief バンプマッピングの使用方法です。 enum BumpMode { BUMPMODE_NOT_USED = 0, //!< バンプテクスチャを使用しません。 BUMPMODE_AS_BUMP = 1, //!< バンプマップとして使用します。 BUMPMODE_AS_TANG = 2 //!< タンジェントマップとして使用します。 }; //! @brief バンプ使用テクスチャです。 enum BumpTexture { BUMP_TEXTURE0 = 0, //!< テクスチャ 0 です。 BUMP_TEXTURE1 = 1, //!< テクスチャ 1 です。 BUMP_TEXTURE2 = 2, //!< テクスチャ 2 です。 BUMP_TEXTURE3 = 3 //!< テクスチャ 3 です。 }; NW_RES_CTOR( ResFragmentLighting ) //--------------------------------------------------------------------------- //! @fn void SetLayerConfig(Config value) //! @brief レイヤーコンフィグを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFresnelConfig(FresnelConfig value) //! @brief フレネルファクタを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFlags(u32 value) //! @brief フラグの値を設定します。 //! 設定されなかったフラグは無効になります。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void EnaleFlags(u32 value) //! @brief 指定された Flag の値を有効にします。 //! 設定されなかったフラグは変更されません。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void DisableFlags(u32 value) //! @brief 指定された Flag の値を無効にします。 //! 設定されなかったフラグは変更されません。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetBumpTextureIndex(BumpTexture value) //! @brief バンプマッピングを施すテクスチャユニットの番号を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetBumpRenormalize(bool value) //! @brief バンプベクトルのz成分の再計算の有効化フラグを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetBumpMode(BumpMode value) //! @brief バンプマッピングのモードを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn bool IsBumpRenormalize() const //! @brief バンプベクトルのz成分の再計算の有効化フラグを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn Config GetLayerConfig() const //! @brief レイヤーコンフィグを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn FresnelConfig GetFresnelConfig() const //! @brief フレネルファクタを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetFlags() const //! @brief フラグの値を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn BumpTexture GetBumpTextureIndex() const //! @brief バンプマッピングを施すテクスチャユニットの番号を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn BumpMode GetBumpMode() const //! @brief バンプマッピングのモードを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_FLAGS_DECL( u32, Flags ) // GetFlags(), SetFlags(), EnableFlags(), DisableFlags() NW_RES_FIELD_PRIMITIVE_DECL( Config, LayerConfig ) // GetLayerConfig(), SetLayerConfig() NW_RES_FIELD_PRIMITIVE_DECL( FresnelConfig, FresnelConfig ) // GetFresnelConfig(), SetFresnelConfig() NW_RES_FIELD_PRIMITIVE_DECL( BumpTexture, BumpTextureIndex ) // GetBumpTextureIndex(), SetBumpTextureIndex() NW_RES_FIELD_PRIMITIVE_DECL( BumpMode, BumpMode ) // GetBumpMode(), SetBumpMode() NW_RES_FIELD_BOOL_PRIMITIVE_DECL( BumpRenormalize ) // IsBumpRenomalize(), SetBumpRenomalize() //--------------------------------------------------------------------------- //! @brief リフレクションファクタが有効化どうかを返します。 //! //! @return リフレクションファクタが有効な場合には true を返します。 //--------------------------------------------------------------------------- bool IsReflectionEnabled() const { return ut::CheckFlag(GetFlags(), ResFragmentLightingData::FLAG_REFLECTION_ENABLED); } //! @brief LayerConfig から参照テーブル割り当てのフラグを取得します。 //! //! @param[in] config //! //! @return 参照テーブルの割り当てフラグです。 static NW_INLINE ConfigDetail ToConfigDetail( Config config ) { s32 configNumber = static_cast(config) - static_cast(CONFIG_TYPE0); static const ConfigDetail configDetailTable[] = { CONFIG_DETAIL0, CONFIG_DETAIL1, CONFIG_DETAIL2, CONFIG_DETAIL3, CONFIG_DETAIL4, CONFIG_DETAIL5, CONFIG_DETAIL6, CONFIG_DETAIL7, CONFIG_DETAIL8, CONFIG_DETAIL9, CONFIG_DETAIL10 }; return configDetailTable[configNumber]; } }; //-------------------------------------------------------------------------- //! @brief ライティング用ルックアップテーブルを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResLightingLookupTable : public nw::ut::ResCommon { public: enum { SIGNATURE = NW_RES_SIGNATURE32('LLUT') }; //--------------------------------------------------------------------------- //! @brief ルックアップテーブルの入力値の定義です。 //--------------------------------------------------------------------------- enum Input { INPUT_NH, //!< 法線とハーフベクトルのなす角のコサイン値。 INPUT_VH, //!< 視線ベクトルとハーフベクトルのなす角のコサイン値。 INPUT_NV, //!< 法線と視線ベクトルのなす角のコサイン値。 INPUT_LN, //!< ライトベクトルの法線のなす角のコサイン値。 INPUT_SP, //!< ライトベクトルとスポット方向ベクトルのなす角のコサイン値。 INPUT_CP, //!< ハーフベクトルの接平面投影ベクトルと接線ベクトルのなす角のコサイン値。 INPUT_NUM //!< enum の最大値。 }; NW_RES_CTOR( ResLightingLookupTable ) //--------------------------------------------------------------------------- //! @fn void SetInput(Input value) //! @brief ルックアップテーブルの入力設定を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn Input GetInput() const //! @brief ルックアップテーブルの入力設定を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( Input, Input ) // GetInput(), SetInput() //--------------------------------------------------------------------------- //! @brief ルックアップテーブルのスケール値の定義です。 //--------------------------------------------------------------------------- enum Scale { SCALE_1 = 0, //!< 1.0 倍。 SCALE_2 = 1, //!< 2.0 倍。 SCALE_4 = 2, //!< 4.0 倍。 SCALE_8 = 3, //!< 8.0 倍。 SCALE_0_25 = 6, //!< 0.25 倍。 SCALE_0_5 = 7, //!< 0.5 倍。 SCALE_MAX = 8 //!< enum の最大値。 }; //--------------------------------------------------------------------------- //! @fn void SetScale(Scale value) //! @brief ルックアップテーブルのスケール設定を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn Scale GetScale() const //! @brief ルックアップテーブルのスケール設定を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( Scale, Scale ) // GetScale(), SetScale() //--------------------------------------------------------------------------- //! @brief スケール値を float で取得します。 //! //! @return スケール値です。 //--------------------------------------------------------------------------- f32 GetScaleF32() const { const f32 TABLE[] = { 1.0f, 2.0f, 4.0f, 8.0f, 0.0f, 0.0f, 0.25f, 0.5f }; return TABLE[ref().m_Scale]; } //--------------------------------------------------------------------------- //! @brief スケール値を float で設定します。 //! //! scale には 1.0f, 2.0f, 4.0f, 8.0f, 0.25f, 0.5f のいずれかを指定します。 //! //! @param[in] scale スケール値です。 //--------------------------------------------------------------------------- void SetScaleF32(f32 scale) { if (scale == 1.0f) { ref().m_Scale = SCALE_1; } else if (scale == 2.0f) { ref().m_Scale = SCALE_2; } else if (scale == 4.0f) { ref().m_Scale = SCALE_4; } else if (scale == 8.0f) { ref().m_Scale = SCALE_8; } else if (scale == 0.25f) { ref().m_Scale = SCALE_0_25; } else if (scale == 0.5f) { ref().m_Scale = SCALE_0_5; } else { NW_FATAL_ERROR("Illegal scale value"); } } //--------------------------------------------------------------------------- //! @fn ResLookupTable GetSampler() //! @brief ルックアップテーブルを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_CLASS_DECL( ResLookupTable, Sampler ) // GetSampler() //--------------------------------------------------------------------------- //! @brief 参照テーブルへアクセスするための入力値の絶対値化がされているかを取得します。 //! //! @return 入力値を絶対値として扱う場合には、true を返します。 //--------------------------------------------------------------------------- bool IsAbs() const { return this->GetSampler().Dereference().IsAbs(); } //--------------------------------------------------------------------------- //! @brief リソースの後始末をおこないます。 //--------------------------------------------------------------------------- void Cleanup() { NW_ASSERT( IsValid() ); ut::SafeCleanup(this->GetSampler()); } //--------------------------------------------------------------------------- //! @brief 参照テーブルを設定します。 //! 参照先に設定しますのでリソースの解放はされません。 //! //! @param[in] 参照テーブルです。 //--------------------------------------------------------------------------- void SetSampler(ResLookupTable lookupTable) { NW_ASSERT(lookupTable.IsValid()); ResImageLookupTable resImageLookupTable = lookupTable.Dereference(); ResReferenceLookupTable referenceLut = ResStaticCast(GetSampler()); referenceLut.ref().toTargetLut.set_ptr(resImageLookupTable.ptr()); } }; //-------------------------------------------------------------------------- //! @brief フラグメントライティングテーブルを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResFragmentLightingTable : public nw::ut::ResCommon< ResFragmentLightingTableData > { public: NW_RES_CTOR( ResFragmentLightingTable ) //--------------------------------------------------------------------------- //! @fn ResLightingLookupTable GetReflectanceRSampler() //! @brief リフレクションのR成分の参照テーブルを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResLightingLookupTable GetReflectanceGSampler() //! @brief リフレクションのG成分の参照テーブルを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResLightingLookupTable GetReflectanceBSampler() //! @brief リフレクションのB成分の参照テーブルを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResLightingLookupTable GetFresnelSampler() //! @brief フレネルファクタの参照テーブルを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResLightingLookupTable GetDistribution1Sampler() //! @brief ディストリビューション1の参照テーブルを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResLightingLookupTable GetDistribution0Sampler() //! @brief ディストリビューション0の参照テーブルを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceRSampler ) // GetReflectanceRSampler() NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceGSampler ) // GetReflectanceGSampler() NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, ReflectanceBSampler ) // GetReflectanceBSampler() NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, Distribution0Sampler ) // GetDistribution0Sampler() NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, Distribution1Sampler ) // GetDistribution1Sampler() NW_RES_FIELD_CLASS_DECL( ResLightingLookupTable, FresnelSampler ) // GetFresnelSampler() //--------------------------------------------------------------------------- //! @brief リソースの初期化処理をおこないます。 //! //! @param[in] allocator アロケータです。 //! @param[in] graphicsFile グラフィックスリソースです。 //--------------------------------------------------------------------------- Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile); //--------------------------------------------------------------------------- //! @brief リソースの後始末をおこないます。 //--------------------------------------------------------------------------- void Cleanup(); }; //-------------------------------------------------------------------------- //! @brief テクスチャコンバイナのソースを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResTextureCombinerSource : public nw::ut::ResCommon< ResTextureCombinerSourceData > { public: // TODO: チェック GL_PRIMARY_COLOR //! @brief ソースを表します。 enum Kind { KIND_TEXTURE0 = GL_TEXTURE0, //!< テクスチャ 0 です。 KIND_TEXTURE1 = GL_TEXTURE1, //!< テクスチャ 1 です。 KIND_TEXTURE2 = GL_TEXTURE2, //!< テクスチャ 2 です。 KIND_TEXTURE3 = GL_TEXTURE3, //!< テクスチャ 3 です。 KIND_CONSTANT = GL_CONSTANT, //!< コンスタントカラーです。 KIND_PRIMARY_COLOR = GL_PRIMARY_COLOR, //!< 頂点シェーダーの出力結果です。 KIND_PREVIOUS = GL_PREVIOUS, //!< 前段の出力結果です。 KIND_FRAGMENT_PRIMARY_COLOR_DMP = GL_FRAGMENT_PRIMARY_COLOR_DMP, //!< プライマリカラーです。 KIND_FRAGMENT_SECONDARY_COLOR_DMP = GL_FRAGMENT_SECONDARY_COLOR_DMP //!< セカンダリカラーです。 }; NW_RES_CTOR( ResTextureCombinerSource ) //--------------------------------------------------------------------------- //! @fn void SetSources(int idx, u32 value) //! @brief テクスチャコンバイナのソースセットのリストに要素を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetSourcesCount() const //! @brief テクスチャコンバイナのソースセットの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetSources(int idx) const //! @brief テクスチャコンバイナのソースセットを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_FIXED_LIST_DECL( u32, Sources ) // GetSourcesCount(), GetSources(int), GetSources(), SetSources(int,u32) }; //-------------------------------------------------------------------------- //! @brief テクスチャコンバイナのオペランドを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResTextureCombinerOperand : public nw::ut::ResCommon< ResTextureCombinerOperandData > { public: //! @brief オペランドです。 enum Kind { KIND_SRC_COLOR = GL_SRC_COLOR, //!< RGB です。 KIND_ONE_MINUS_SRC_COLOR = GL_ONE_MINUS_SRC_COLOR, //!< 1 - RGB です。 KIND_SRC_ALPHA = GL_SRC_ALPHA, //!< アルファです。 KIND_ONE_MINUS_SRC_ALPHA = GL_ONE_MINUS_SRC_ALPHA, //!< 1 - アルファです。 #ifdef NW_TARGET_CTR_GL_FINAL KIND_SRC_R = GL_SRC_R_DMP, //!< R 成分です。 KIND_SRC_G = GL_SRC_G_DMP, //!< G 成分です。 KIND_SRC_B = GL_SRC_B_DMP, //!< B 成分です。 KIND_ONE_MINUS_SRC_R = GL_ONE_MINUS_SRC_R_DMP, //!< 1 - R 成分です。 KIND_ONE_MINUS_SRC_G = GL_ONE_MINUS_SRC_G_DMP, //!< 1 - G 成分です。 KIND_ONE_MINUS_SRC_B = GL_ONE_MINUS_SRC_B_DMP //!< 1 - B 成分です。 #else KIND_SRC_R = GL_SRC_COLOR, KIND_SRC_G = GL_SRC_COLOR, KIND_SRC_B = GL_SRC_COLOR, KIND_ONE_MINUS_SRC_R = GL_ONE_MINUS_SRC_COLOR, KIND_ONE_MINUS_SRC_G = GL_ONE_MINUS_SRC_COLOR, KIND_ONE_MINUS_SRC_B = GL_ONE_MINUS_SRC_COLOR #endif }; NW_RES_CTOR( ResTextureCombinerOperand ) //--------------------------------------------------------------------------- //! @fn void SetOperands(int idx, u32 value) //! @brief テクスチャコンバイナのオペランドセットのリストに要素を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetOperandsCount() const //! @brief テクスチャコンバイナのオペランドセットの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetOperands(int idx) const //! @brief テクスチャコンバイナのオペランドセットを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_FIXED_LIST_DECL( u32, Operands ) // GetOperandsCount(), GetOperands(int), GetOperands(), SetOperands(int,u32) }; //-------------------------------------------------------------------------- //! @brief アルファテストを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResAlphaTest : public nw::ut::ResCommon< ResAlphaTestData > { public: NW_RES_CTOR( ResAlphaTest ) //! @brief アルファテストの比較関数です。 enum TestFunc { TESTFUNC_NEVER = 0, //!< すべて不通過です。 TESTFUNC_ALWAYS = 1, //!< すべて通過です。 TESTFUNC_EQUAL = 2, //!< 参照値と等しければ通過します。 TESTFUNC_NOTEQUAL = 3, //!< 参照値と等しくなければ通過します。 TESTFUNC_LESS = 4, //!< 参照値より小さければ通過します。 TESTFUNC_LEQUAL = 5, //!< 参照値以下であれば通過します。 TESTFUNC_GREATER = 6, //!< 参照値より大きければ通過します。 TESTFUNC_GEQUAL = 7 //!< 参照値以上であれば通過します。 }; //--------------------------------------------------------------------------- //! @brief アルファテストが有効化かどうかを取得します。 //! //! @return アルファテストが有効な場合には、true を返します。 //--------------------------------------------------------------------------- bool IsTestEnabled() const { enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; return internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ) ? true : false; } //--------------------------------------------------------------------------- //! @brief アルファテストの有効フラグを設定します。 //! //! @param[in] value アルファテストを有効にする場合は true、無効にする場合は false を設定します。 //--------------------------------------------------------------------------- void SetTestEnabled(bool value) { enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief アルファテストに用いる比較関数を取得します。 //! //! @return アルファテストの比較関数の設定値です。 //--------------------------------------------------------------------------- TestFunc GetTestFunc() const { enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; return (TestFunc)internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief アルファテストに用いる比較関数を設定します。 //! //! @param[in] value アルファテストの比較関数です。 //--------------------------------------------------------------------------- void SetTestFunc(TestFunc value) { enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief アルファテストに用いる参照値を取得します。 //! //! @return アルファテストに用いる参照値です。 //--------------------------------------------------------------------------- f32 GetTestReference() const { enum { CMD_SHIFT = 8, CMD_MASK = 0xff }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )) / 255.0f; } //--------------------------------------------------------------------------- //! @brief アルファテストに用いる参照値を設定します。 //! //! @param[in] value アルファテストに用いる参照値です。 //--------------------------------------------------------------------------- void SetTestReference(f32 value) { enum { CMD_SHIFT = 8, CMD_MASK = 0xff }; internal::SetCmdValue( &ref().m_CommandBuffer[0], (0.5f + (value * 255.0f)), CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @fn u32 * GetCommandBuffer() //! @brief コマンドバッファへのポインタを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_COMMAND_BUFFER() }; //-------------------------------------------------------------------------- //! @brief テクスチャコンバイナのソースを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResTextureCombiner : public nw::ut::ResCommon< ResTextureCombinerData > { public: //--------------------------------------------------------------------------- //! @brief テクスチャコンバイナのコンスタント値の定義です。 //--------------------------------------------------------------------------- enum Constant { CONSTANT0, //!< コンスタント0 の設定を使用します。 CONSTANT1, //!< コンスタント1 の設定を使用します。 CONSTANT2, //!< コンスタント2 の設定を使用します。 CONSTANT3, //!< コンスタント3 の設定を使用します。 CONSTANT4, //!< コンスタント4 の設定を使用します。 CONSTANT5, //!< コンスタント5 の設定を使用します。 EMISSION, //!< マテリアルのエミッションカラーの設定を使用します。 AMBIENT, //!< マテリアルのアンビエントカラーの設定を使用します。 DIFFUSE, //!< マテリアルのディフューズカラーの設定を使用します。 SPECULAR0, //!< マテリアルのスペキュラーカラー 0 の設定を使用します。 SPECULAR1 //!< マテリアルのスペキュラーカラー 1 の設定を使用します。 }; NW_RES_CTOR( ResTextureCombiner ) //--------------------------------------------------------------------------- //! @fn void SetConstant(Constant value) //! @brief テクスチャコンバイナの定数設定を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn Constant GetConstant() const //! @brief テクスチャコンバイナの定数設定を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( Constant, Constant ) // GetConstant(), SetConstant() //--------------------------------------------------------------------------- //! @fn u32 * GetCommandBuffer() //! @brief コマンドバッファへのポインタを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_COMMAND_BUFFER(); //--------------------------------------------------------------------------- //! @brief コンスタントカラーの設定コマンドを u32 の rgba 値として設定します。 //! //! @param[in] rgba コンスタントカラーの RGBA 32bit 表現です。 //--------------------------------------------------------------------------- void SetConstantCmd(u32 rgba) { ref().m_CmdConstant = rgba; } //--------------------------------------------------------------------------- //! @brief テクスチャコンバイナのソース設定の定義です。 //--------------------------------------------------------------------------- typedef enum { SOURCE_PRIMARY_COLOR = 0, //!< 頂点シェーダーの出力結果です。 SOURCE_FRAGMENT_PRIMARY_COLOR, //!< プライマリカラーです。 SOURCE_FRAGMENT_SECONDARY_COLOR, //!< セカンダリカラーです。 SOURCE_TEXTURE0, //!< テクスチャ 0 です。 SOURCE_TEXTURE1, //!< テクスチャ 1 です。 SOURCE_TEXTURE2, //!< テクスチャ 2 です。 SOURCE_TEXTURE3, //!< テクスチャ 3 です。 SOURCE_CONSTANT = 0xE, //!< コンスタントカラーです。 SOURCE_PREVIOUS = 0xF, //!< 前段の出力結果です。 SOURCE_PREVIOUS_BUFFER = 0xD //!< 前段のバッファです。 } Source; //--------------------------------------------------------------------------- //! @brief テクスチャコンバイナの RGB オペランド設定の定義です。 //--------------------------------------------------------------------------- typedef enum { OPERANDRGB_SRC_COLOR = 0, //!< RGB です。 OPERANDRGB_ONE_MINUS_SRC_COLOR = 0x1, //!< 1 - RGB です。 OPERANDRGB_SRC_ALPHA = 0x2, //!< アルファです。 OPERANDRGB_ONE_MINUS_SRC_ALPHA = 0x3, //!< 1 - アルファです。 OPERANDRGB_RED = 0x4, //!< R 成分です。 OPERANDRGB_ONE_MINUS_RED = 0x5, //!< 1 - R 成分です。 OPERANDRGB_GREEN = 0x8, //!< G 成分です。 OPERANDRGB_ONE_MINUS_GREEN = 0x9, //!< 1 - G 成分です。 OPERANDRGB_BLUE = 0xC, //!< B 成分です。 OPERANDRGB_ONE_MINUS_BLUE = 0xD //!< 1 - B 成分です。 } OperandRgb; //--------------------------------------------------------------------------- //! @brief テクスチャコンバイナの Alpha オペランド設定の定義です。 //--------------------------------------------------------------------------- typedef enum { OPERANDALPHA_SRC_ALPHA = 0, //!< アルファです。 OPERANDALPHA_SRC_ONE_MINUS_ALPHA = 0x1, //!< 1 - アルファです。 OPERANDALPHA_RED = 0x2, //!< R 成分です。 OPERANDALPHA_ONE_MINUS_RED = 0x3, //!< 1 - R 成分です。 OPERANDALPHA_GREEN = 0x4, //!< G 成分です。 OPERANDALPHA_ONE_MINUS_GREEN = 0x5, //!< 1 - G 成分です。 OPERANDALPHA_BLUE = 0x6, //!< B 成分です。 OPERANDALPHA_ONE_MINUS_BLUE = 0x7 //!< 1 - B 成分です。 } OperandAlpha; //--------------------------------------------------------------------------- //! @brief テクスチャコンバイナの コンバイナ関数の定義です。 //! //! A はソース 0 、B はソース 1 、C はソース 2 をそれぞれ表します。 //--------------------------------------------------------------------------- typedef enum { COMBINE_REPLACE = 0, //!< A です COMBINE_MODULATE, //!< A * B です。 COMBINE_ADD, //!< A + B です。 COMBINE_ADDSIGNED, //!< A + B - 0.5 です。 COMBINE_INTERPOLATE, //!< A * C + B * ( 1 - C ) です。 COMBINE_SUBTRACT, //!< A - B です。 COMBINE_DOT3_RGB, //!< RGB ← Dot ( A , B ) です。 COMBINE_DOT3_RGBA, //!< RGBA ← Dot ( A , B ) です。 COMBINE_MULT_ADD, //!< ( A * B ) + C です。 COMBINE_ADD_MULT //!< ( A + B ) * C です。 } Combine; //--------------------------------------------------------------------------- //! @brief テクスチャコンバイナの スケール設定の定義です。 //--------------------------------------------------------------------------- typedef enum { SCALE_ONE = 0, //!< 1.0 倍。 SCALE_TWO, //!< 2.0 倍。 SCALE_FOUR //!< 4.0 倍。 } Scale; //--------------------------------------------------------------------------- //! @brief RGB 値のソースを取得します。 //! //! @param[in] index 取得するソースのインデクスです。 //! //! @return ソースの設定です。 //--------------------------------------------------------------------------- //! @brief カラーのソースを取得します。 //! //! @param[in] index //! //! @return ソースを返します。 Source GetSourceRgb(s32 index) const { NW_MINMAX_ASSERT( index, 0, 2 ); enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; return (Source)internal::GetCmdValue( ref().m_CmdSource, CMD_MASK, CMD_WIDTH * index ); } //--------------------------------------------------------------------------- //! @brief RGB 値のソースを設定します。 //! //! @param[in] index 設定するソースのインデクスです。 //! @param[in] value ソースの設定値です。 //--------------------------------------------------------------------------- void SetSourceRgb(s32 index, Source value) { NW_MINMAX_ASSERT( index, 0, 2 ); enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; internal::SetCmdValue( &ref().m_CmdSource, value, CMD_MASK, CMD_WIDTH * index ); } //--------------------------------------------------------------------------- //! @brief Alpha 値のソースを取得します。 //! //! @param[in] index 取得するソースのインデクスです。 //! //! @return ソースの設定です。 //--------------------------------------------------------------------------- Source GetSourceAlpha(s32 index) const { NW_MINMAX_ASSERT( index, 0, 2 ); enum { CMD_SHIFT = 16, CMD_WIDTH = 4, CMD_MASK = 0xF }; return (Source)internal::GetCmdValue( ref().m_CmdSource, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief Alpha 値のソースを設定します。 //! //! @param[in] index 設定するソースのインデクスです。 //! @param[in] value ソースの設定値です。 //--------------------------------------------------------------------------- void SetSourceAlpha(s32 index, Source value) { NW_MINMAX_ASSERT( index, 0, 2 ); enum { CMD_SHIFT = 16, CMD_WIDTH = 4, CMD_MASK = 0xF }; internal::SetCmdValue( &ref().m_CmdSource, value, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief RGB 値のオペランドを取得します。 //! //! @param[in] index 取得するオペランドのインデクスです。 //! //! @return オペランドの設定です。 //--------------------------------------------------------------------------- //! @brief カラーのオペランドを取得します。 //! //! @param[in] index //! //! @return オペランドを返します。 OperandRgb GetOperandRgb(s32 index) const { NW_MINMAX_ASSERT( index, 0, 2 ); enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; return (OperandRgb)internal::GetCmdValue( ref().m_CmdOperand, CMD_MASK, CMD_WIDTH * index ); } //--------------------------------------------------------------------------- //! @brief RGB 値のオペランドを設定します。 //! //! @param[in] index 設定するオペランドのインデクスです。 //! @param[in] value オペランドの設定値です。 //--------------------------------------------------------------------------- void SetOperandRgb(s32 index, OperandRgb value) { NW_MINMAX_ASSERT( index, 0, 2 ); enum { CMD_WIDTH = 4, CMD_MASK = 0xF }; internal::SetCmdValue( &ref().m_CmdOperand, value, CMD_MASK, CMD_WIDTH * index ); } //--------------------------------------------------------------------------- //! @brief Alpha 値のオペランドを取得します。 //! //! @param[in] index 取得するオペランドのインデクスです。 //! //! @return オペランドの設定です。 //--------------------------------------------------------------------------- OperandAlpha GetOperandAlpha(s32 index) const { NW_MINMAX_ASSERT( index, 0, 2 ); enum { CMD_SHIFT = 12, CMD_WIDTH = 4, CMD_MASK = 0xF }; return (OperandAlpha)internal::GetCmdValue( ref().m_CmdOperand, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief Alpha 値のオペランドを設定します。 //! //! @param[in] index 設定するオペランドのインデクスです。 //! @param[in] value オペランドの設定値です。 //--------------------------------------------------------------------------- void SetOperandAlpha(s32 index, OperandAlpha value) { NW_MINMAX_ASSERT( index, 0, 2 ); enum { CMD_SHIFT = 12, CMD_WIDTH = 4, CMD_MASK = 0xF }; internal::SetCmdValue( &ref().m_CmdOperand, value, CMD_MASK, CMD_WIDTH * index + CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief RGB 値のコンバイナ関数を取得します。 //! //! @return コンバイナ関数を返します。 //--------------------------------------------------------------------------- //! @brief カラーの計算式を取得します。 //! //! @return 計算式を返します。 Combine GetCombineRgb() const { enum { CMD_SHIFT = 0, CMD_MASK = 0xF }; return (Combine)internal::GetCmdValue( ref().m_CmdCombine, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief RGB 値のコンバイナ関数を設定します。 //! //! @param[in] value 設定するコンバイナ関数の値です。 //--------------------------------------------------------------------------- void SetCombineRgb(Combine value) { enum { CMD_SHIFT = 0, CMD_MASK = 0xF }; internal::SetCmdValue( &ref().m_CmdCombine, value, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief Alpha 値のコンバイナ関数を取得します。 //! //! @return コンバイナ関数です。 //--------------------------------------------------------------------------- Combine GetCombineAlpha() const { enum { CMD_SHIFT = 16, CMD_MASK = 0xF }; return (Combine)internal::GetCmdValue( ref().m_CmdCombine, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief Alpha 値のコンバイナ関数を設定します。 //! //! @param[in] value 設定するコンバイナ関数の値です。 //--------------------------------------------------------------------------- void SetCombineAlpha(Combine value) { enum { CMD_SHIFT = 16, CMD_MASK = 0xF }; internal::SetCmdValue( &ref().m_CmdCombine, value, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief RGB 値のスケールを取得します。 //! //! @return スケールの値です。 //--------------------------------------------------------------------------- //! @brief カラーのスケールを取得します。 //! //! @return スケールを返します。 Scale GetScaleRgb() const { enum { CMD_SHIFT = 0, CMD_MASK = 0x3 }; return (Scale)internal::GetCmdValue( ref().m_CmdScale, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief RGB 値のスケールを設定します。 //! //! @param[in] value 設定するスケールの値です。 //--------------------------------------------------------------------------- void SetScaleRgb(Scale value) { enum { CMD_SHIFT = 0, CMD_MASK = 0x3 }; internal::SetCmdValue( &ref().m_CmdScale, value, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief Alpha 値のスケールを取得します。 //! //! @return スケールの値です。 //--------------------------------------------------------------------------- Scale GetScaleAlpha() const { enum { CMD_SHIFT = 16, CMD_MASK = 0x3 }; return (Scale)internal::GetCmdValue( ref().m_CmdScale, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief Alpha 値のスケールを設定します。 //! //! @param[in] value 設定するスケールの値です。 //--------------------------------------------------------------------------- void SetScaleAlpha(Scale value) { enum { CMD_SHIFT = 16, CMD_MASK = 0x3 }; internal::SetCmdValue( &ref().m_CmdScale, value, CMD_MASK, CMD_SHIFT ); } }; //-------------------------------------------------------------------------- //! @brief フラグメントシェーダを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResFragmentShader : public nw::ut::ResCommon< ResFragmentShaderData > { public: //! @brief バッファのインプットを表します。 enum BufferInput { BUFFERINPUT_PREVIOUS_BUFFER = 0, //!< 前段のバッファです。 BUFFERINPUT_PREVIOUS = 1 //!< 前段の出力結果です。 }; NW_RES_CTOR( ResFragmentShader ) //--------------------------------------------------------------------------- //! @fn ResTextureCombinerData & GetTextureCombinersData(int idx) //! @brief テクスチャコンバイナの設定の配列を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetTextureCombinersCount() const //! @brief テクスチャコンバイナの設定の要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResTextureCombiner GetTextureCombiners(int idx) //! @brief テクスチャコンバイナの設定を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResFragmentLightingTable GetFragmentLightingTable() //! @brief フラグメントライティングテーブルを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResFragmentLightingData & GetFragmentLightingData() //! @brief フラグメントライティング設定を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResFragmentLighting GetFragmentLighting() //! @brief フラグメントライティング設定を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResAlphaTestData & GetAlphaTestData() //! @brief アルファテストの設定を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResAlphaTest GetAlphaTest() //! @brief アルファテストの設定を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_RESSTRUCT_DECL( ResFragmentLighting, FragmentLighting ) // GetFragmentLighting(), GetFragmentLightingData() NW_RES_FIELD_CLASS_DECL( ResFragmentLightingTable, FragmentLightingTable ) // GetFragmentLightingTable() NW_RES_FIELD_STRUCT_FIXED_LIST_DECL( ResTextureCombiner, TextureCombiners ) // GetTextureCombinersCount(), GetTextureCombiners(idx) NW_RES_FIELD_RESSTRUCT_DECL( ResAlphaTest, AlphaTest ) // GetAlphaTest(), GetAlphaTestData() //--------------------------------------------------------------------------- //! @brief リソースの初期化処理をおこないます。 //! //! @param[in] allocator アロケータです。 //! @param[in] graphicsFile グラフィックスリソースです。 //--------------------------------------------------------------------------- Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile); //--------------------------------------------------------------------------- //! @brief リソースの後始末をおこないます。 //--------------------------------------------------------------------------- void Cleanup(); //! @brief フラグメントシェーダーが正しく設定されているか確認します。 bool CheckFragmentShader(); //! @brief バッファカラーを U32 で取得します。 //! //! @return バッファカラーを U32 で返します。 u32 GetBufferColorU32() const { return ref().m_BufferCommand[0]; } //! @brief バッファカラーを設定します。 //! //! @param[in] r 設定するバッファカラーの R 成分です。 //! @param[in] g 設定するバッファカラーの G 成分です。 //! @param[in] b 設定するバッファカラーの B 成分です。 void SetBufferColor( f32 r, f32 g, f32 b ) { ref().m_BufferColor.Set(r, g, b); ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32(); } //! @brief バッファカラーを設定します。 //! //! @param[in] r 設定するバッファカラーの R 成分です。 //! @param[in] g 設定するバッファカラーの G 成分です。 //! @param[in] b 設定するバッファカラーの B 成分です。 //! @param[in] b 設定するバッファカラーのアルファ成分です。 void SetBufferColor( f32 r, f32 g, f32 b, f32 a ) { ref().m_BufferColor.Set(r, g, b, a); ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32(); } //! @brief バッファカラーを取得します。 //! //! @return バッファカラーを返します。 const ut::FloatColor& GetBufferColor() const { return ref().m_BufferColor; } //! @brief バッファカラーを設定します。 //! //! @param[in] value 設定するバッファカラーです。 void SetBufferColor(const ut::FloatColor& value) { ref().m_BufferColor = value; ref().m_BufferCommand[0] = ref().m_BufferColor.ToPicaU32(); } //! @brief RGB のバッファインプットを取得します。 //! //! @param[in] index 取得するコンバイナのインデクスです。 BufferInput GetBufferInputRgb(s32 index) const { NW_MINMAX_ASSERT(index, 1, 4); enum { CMD_SHIFT = 7, CMD_MASK = 0x1 }; return static_cast(internal::GetCmdValue( ref().m_BufferCommand[2], CMD_MASK, CMD_SHIFT+index )); } //! @brief RGB のバッファインプットを設定します。 //! //! @param[in] index 設定するコンバイナのインデクスです。 //! @param[in] value 設定するバッファインプットです。 void SetBufferInputRgb(s32 index, BufferInput value) { NW_MINMAX_ASSERT(index, 1, 4); enum { CMD_SHIFT = 7, CMD_MASK = 0x1 }; internal::SetCmdValue( &ref().m_BufferCommand[2], value, CMD_MASK, CMD_SHIFT+index ); } //! @brief Alpha のバッファインプットを取得します。 //! //! @param[in] index 取得するコンバイナのインデクスです。 BufferInput GetBufferInputAlpha(s32 index) const { NW_MINMAX_ASSERT(index, 1, 4); enum { CMD_SHIFT = 11, CMD_MASK = 0x1 }; return static_cast(internal::GetCmdValue( ref().m_BufferCommand[2], CMD_MASK, CMD_SHIFT+index )); } //! @brief Alpha のバッファインプットを設定します。 //! //! @param[in] index 設定するコンバイナのインデクスです。 //! @param[in] value 設定するバッファインプットです。 void SetBufferInputAlpha(s32 index, BufferInput value) { NW_MINMAX_ASSERT(index, 1, 4); enum { CMD_SHIFT = 11, CMD_MASK = 0x1 }; internal::SetCmdValue( &ref().m_BufferCommand[2], value, CMD_MASK, CMD_SHIFT+index ); } }; } // namespace res } // namespace gfx } // namespace nw #endif // NW_GFX_RESFRAGMENTSHADER_H_