/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_ResMaterial.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: 19093 $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_RESMATERIAL_H_ #define NW_GFX_RESMATERIAL_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace nw { namespace gfx { namespace res { class ResGraphicsFile; //! @details :private struct ResMaterialColorData { nw::ut::ResFloatColor m_Emission; nw::ut::ResFloatColor m_AmbientAndVertexColorScale; nw::ut::ResFloatColor m_Diffuse; nw::ut::ResFloatColor m_Specular0; nw::ut::ResFloatColor m_Specular1; nw::ut::ResFloatColor m_Constant0; nw::ut::ResFloatColor m_Constant1; nw::ut::ResFloatColor m_Constant2; nw::ut::ResFloatColor m_Constant3; nw::ut::ResFloatColor m_Constant4; nw::ut::ResFloatColor m_Constant5; nw::ut::ResU32 m_EmissionU32; nw::ut::ResU32 m_AmbientU32; nw::ut::ResU32 m_DiffuseU32; nw::ut::ResU32 m_Specular0U32; nw::ut::ResU32 m_Specular1U32; nw::ut::ResU32 m_Constant0U32; nw::ut::ResU32 m_Constant1U32; nw::ut::ResU32 m_Constant2U32; nw::ut::ResU32 m_Constant3U32; nw::ut::ResU32 m_Constant4U32; nw::ut::ResU32 m_Constant5U32; void* m_CommandCache; }; // ResRasterizationData::m_CommandBuffer のフォーマットは次の形式になっています。 // // [0] 0x040のデータ // [1] 0x040へのヘッダ(BE:1) //! @details :private struct ResRasterizationData { enum Flag { FLAG_POLYGON_OFFSET_ENABLED = 0x1 << 0 }; nw::ut::ResU32 m_Flags; nw::ut::ResU32 m_CullingMode; nw::ut::ResF32 m_PolygonOffsetUnit; nw::ut::ResU32 m_CommandBuffer[2]; }; // ResBlendOperationData::m_CommandBuffer のフォーマットは次の形式になっています。 // // [0] 0x100のデータ // [1] 0x100へのヘッダ(BE:0xf) // [2] 0x101のデータ // [3] 0x102のデータ // [4] 0x103のデータ // [5] padding //! @details :private struct ResBlendOperationData { nw::ut::ResS32 m_Mode; nw::ut::ResFloatColor m_BlendColor; nw::ut::ResU32 m_CommandBuffer[6]; }; // ResDepthOperationData::m_CommandBuffer のフォーマットは次の形式になっています。 // // [0] 0x107の[7:0] // [1] 0x107へのヘッダ(BE:1) // [2] 0x126の[31:24] // [3] 0x126へのヘッダ(BE:8) //! @details :private struct ResDepthOperationData { enum Flag { FLAG_TEST_ENABLED = 0x1 << 0, FLAG_MASK_ENABLED = 0x1 << 1 }; nw::ut::ResU32 m_Flags; nw::ut::ResU32 m_CommandBuffer[4]; }; // ResStencilOperationData::m_CommandBuffer のフォーマットは次の形式になっています。 // // [0] 0x105のデータ // [1] 0x105へのヘッダ(BE:0xd) // [2] 0x106のデータ // [3] 0x106へのヘッダ(BE:0xf) //! @details :private struct ResStencilOperationData { nw::ut::ResU32 m_CommandBuffer[4]; }; //! @details :private struct ResFragmentOperationData { ResDepthOperationData m_DepthOperation; ResBlendOperationData m_BlendOperation; ResStencilOperationData m_StencilOperation; }; //! @details :private struct ResTextureCoordinatorData { nw::ut::ResS32 m_SourceCoordinate; nw::ut::ResS32 m_MappingMethod; nw::ut::ResS32 m_ReferenceCamera; nw::ut::ResS32 m_MatrixMode; nw::ut::ResVec2 m_Scale; nw::ut::ResF32 m_Rotate; nw::ut::ResVec2 m_Translate; nw::ut::ResBool m_IsDirty; nw::ut::ResBool m_IsEnabled; u8 _padding_0[2]; nw::ut::ResMtx34 m_TextureMatrix; }; //! @details :private struct ResMaterialData : public ResSceneObjectData { enum Flag { FLAG_FRAGMENTLIGHT_ENABLED = 0x1 << 0, FLAG_VERTEXLIGHT_ENABLED = 0x1 << 1, FLAG_HEMISPHERELIGHT_ENABLED = 0x1 << 2, FLAG_HEMISPHERE_OCCLUSION_ENABLED = 0x1 << 3, FLAG_FOG_ENABLED = 0x1 << 4, FLAG_PARTICLE_MATERIAL_ENABLED = 0x1 << 5 }; nw::ut::ResU32 m_Flags; nw::ut::ResS32 m_TextureCoordinateConfig; nw::ut::ResS32 m_TranslucencyKind; ResMaterialColorData m_MaterialColor; ResRasterizationData m_Rasterization; ResFragmentOperationData m_FragmentOperation; nw::ut::ResS32 m_ActiveTextureCoordinatorsCount; ResTextureCoordinatorData m_TextureCoordinators[3]; nw::ut::Offset toTextureMappers[3]; nw::ut::Offset toProceduralTextureMapper; nw::ut::Offset toShader; nw::ut::Offset toFragmentShader; nw::ut::ResS32 m_ShaderProgramDescriptionIndex; nw::ut::ResS32 m_ShaderParametersTableCount; nw::ut::Offset toShaderParametersTable; nw::ut::ResS32 m_LightSetIndex; nw::ut::ResS32 m_FogIndex; nw::ut::ResU32 m_ShadingParameterHash; nw::ut::ResU32 m_ShaderParametersHash; nw::ut::ResU32 m_TextureCoordinatorsHash; nw::ut::ResU32 m_TextureSamplersHash; nw::ut::ResU32 m_TextureMappersHash; nw::ut::ResU32 m_MaterialColorHash; nw::ut::ResU32 m_RasterizationHash; nw::ut::ResU32 m_FragmentLightingHash; nw::ut::ResU32 m_FragmentLightingTableHash; nw::ut::ResU32 m_FragmentLightingTableParametersHash; nw::ut::ResU32 m_TextureCombinersHash; nw::ut::ResU32 m_AlphaTestHash; nw::ut::ResU32 m_FragmentOperationHash; nw::ut::ResU32 m_MaterialId; }; //-------------------------------------------------------------------------- //! @brief マテリアルを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResMaterialColor : public nw::ut::ResCommon< ResMaterialColorData > { public: NW_RES_CTOR( ResMaterialColor ) //---------------------------------------- //! @name 取得/設定 //@{ //--------------------------------------------------------------------------- //! @brief アンビエントカラーを取得します。 //! //! @return α値に VertexColorScale が格納されたアンビエントカラーです。 //--------------------------------------------------------------------------- const nw::ut::FloatColor& GetAmbient() const { return ref().m_AmbientAndVertexColorScale; } //--------------------------------------------------------------------------- //! @brief 頂点カラーのスケール値を取得します。 //! //! @return 頂点カラーのスケール値を返します。 //--------------------------------------------------------------------------- f32 GetVertexColorScale() const { return ref().m_AmbientAndVertexColorScale.a; } //--------------------------------------------------------------------------- //! @brief 頂点カラーのスケール値を設定します。 //! //! @param[in] scale 頂点カラーの設定値です。 //--------------------------------------------------------------------------- void SetVertexColorScale(f32 scale) { ref().m_AmbientAndVertexColorScale.a = scale; } //--------------------------------------------------------------------------- //! @brief アンビエントカラーを RGBA8 フォーマットで取得します。 //! //! @return アンビエントカラーを RGBA8 フォーマットで返します。 //--------------------------------------------------------------------------- u32 GetAmbientU32() const { return ref().m_AmbientU32; } //--------------------------------------------------------------------------- //! @brief アンビエントカラーを設定します。 //! //! @param[in] r 設定するアンビエントカラーの R 成分です。 //! @param[in] g 設定するアンビエントカラーの G 成分です。 //! @param[in] b 設定するアンビエントカラーの B 成分です。 //--------------------------------------------------------------------------- void SetAmbient( f32 r, f32 g, f32 b ) { ref().m_AmbientAndVertexColorScale.SetColor(r, g, b); ref().m_AmbientU32 = ref().m_AmbientAndVertexColorScale.ToPicaU32(); } //--------------------------------------------------------------------------- //! @brief アンビエントカラーを設定します。 //! //! @param[in] value 設定するアンビエントカラーです。 //--------------------------------------------------------------------------- void SetAmbient( const nw::ut::FloatColor& value ) { this->SetAmbient(value.r, value.g, value.b); } //--------------------------------------------------------------------------- //! @fn void SetSpecular1(f32 r, f32 g, f32 b) //! @brief スペキュラカラー1を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetSpecular0(f32 r, f32 g, f32 b) //! @brief スペキュラカラー0を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetEmission(f32 r, f32 g, f32 b) //! @brief エミッションカラーを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetDiffuse(f32 r, f32 g, f32 b) //! @brief ディフューズカラーを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetConstant5(f32 r, f32 g, f32 b) //! @brief コンスタントカラー5を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetConstant4(f32 r, f32 g, f32 b) //! @brief コンスタントカラー4を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetConstant3(f32 r, f32 g, f32 b) //! @brief コンスタントカラー3を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetConstant2(f32 r, f32 g, f32 b) //! @brief コンスタントカラー2を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetConstant1(f32 r, f32 g, f32 b) //! @brief コンスタントカラー1を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetConstant0(f32 r, f32 g, f32 b) //! @brief コンスタントカラー0を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetSpecular1U32() const //! @brief スペキュラカラー1を RGBA8 の32bitフォーマットで取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const nw::ut::FloatColor & GetSpecular1() const //! @brief スペキュラカラー1を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetSpecular0U32() const //! @brief スペキュラカラー0を RGBA8 の32bitフォーマットで取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const nw::ut::FloatColor & GetSpecular0() const //! @brief スペキュラカラー0を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetEmissionU32() const //! @brief エミッションカラーを RGBA8 の32bitフォーマットで取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const nw::ut::FloatColor & GetEmission() const //! @brief エミッションカラーを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetDiffuseU32() const //! @brief ディフューズカラーを RGBA8 の32bitフォーマットで取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const nw::ut::FloatColor & GetDiffuse() const //! @brief ディフューズカラーを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetConstant5U32() const //! @brief コンスタントカラー5を RGBA8 の32bitフォーマットで取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const nw::ut::FloatColor & GetConstant5() const //! @brief コンスタントカラー5を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetConstant4U32() const //! @brief コンスタントカラー4を RGBA8 の32bitフォーマットで取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const nw::ut::FloatColor & GetConstant4() const //! @brief コンスタントカラー4を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetConstant3U32() const //! @brief コンスタントカラー3を RGBA8 の32bitフォーマットで取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const nw::ut::FloatColor & GetConstant3() const //! @brief コンスタントカラー3を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetConstant2U32() const //! @brief コンスタントカラー2を RGBA8 の32bitフォーマットで取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const nw::ut::FloatColor & GetConstant2() const //! @brief コンスタントカラー2を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetConstant1U32() const //! @brief コンスタントカラー1を RGBA8 の32bitフォーマットで取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const nw::ut::FloatColor & GetConstant1() const //! @brief コンスタントカラー1を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetConstant0U32() const //! @brief コンスタントカラー0を RGBA8 の32bitフォーマットで取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const nw::ut::FloatColor & GetConstant0() const //! @brief コンスタントカラー0を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Emission ) // GetEmission() NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Diffuse ) // GetDiffuse(), SetDiffuse(r,g,b), SetDiffuse(r,g,b,a), SetDiffuse(FloatColor) NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Specular0 ) // GetSpecular0(), SetSpecular0(r,g,b), SetSpecular0(r,g,b,a), SetSpecular0(FloatColor) NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Specular1 ) // GetSpecular1(), SetSpecular1(r,g,b), SetSpecular1(r,g,b,a), SetSpecular1(FloatColor) NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant0 ) // GetConstant0(), SetConstant0(r,g,b), SetConstant0(r,g,b,a), SetConstant0(FloatColor) NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant1 ) // GetConstant1(), SetConstant1(r,g,b), SetConstant1(r,g,b,a), SetConstant1(FloatColor) NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant2 ) // GetConstant2(), SetConstant2(r,g,b), SetConstant2(r,g,b,a), SetConstant2(FloatColor) NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant3 ) // GetConstant3(), SetConstant3(r,g,b), SetConstant3(r,g,b,a), SetConstant3(FloatColor) NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant4 ) // GetConstant4(), SetConstant4(r,g,b), SetConstant4(r,g,b,a), SetConstant4(FloatColor) NW_RES_FIELD_FLOAT_U32_COLOR_DECL( nw::ut::FloatColor, Constant5 ) // GetConstant5(), SetConstant5(r,g,b), SetConstant5(r,g,b,a), SetConstant5(FloatColor) //@} }; //-------------------------------------------------------------------------- //! @brief ポリゴンのラスタライゼーション方法を管理するバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResRasterization : public nw::ut::ResCommon< ResRasterizationData > { public: //! カリングモードです。 enum CullingMode { CULLINGMODE_FRONT = 0, //!< 表面カリングです。 CULLINGMODE_BACK = 1, //!< 裏面カリングです。 CULLINGMODE_NONE = 3 //!< 両面表示です。 }; NW_RES_CTOR( ResRasterization ) //--------------------------------------------------------------------------- //! @fn void SetPolygonOffsetUnit(f32 value) //! @brief ポリゴンオフセットのユニット要素を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFlags(u32 value) //! @brief フラグの値を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn f32 GetPolygonOffsetUnit() const //! @brief ポリゴンオフセットのユニット要素を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetFlags() const //! @brief フラグの値を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 * GetCommandBuffer() //! @brief コマンドバッファへのポインタを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( u32, Flags ) // GetFlags(), SetFlags() NW_RES_FIELD_PRIMITIVE_DECL( f32, PolygonOffsetUnit ) // GetPolygonOffsetUnit(), SetPolygonOffsetUnit() NW_RES_FIELD_COMMAND_BUFFER() // GetCommandBuffer() //--------------------------------------------------------------------------- //! @brief カリングモードを取得します。 //! //! @return カリングモードを返します。 //--------------------------------------------------------------------------- CullingMode GetCullingMode() const { return static_cast(this->ref().m_CullingMode); } //--------------------------------------------------------------------------- //! @brief カリングモードを設定します。 //! //! @param[in] value 設定するカリングモードです。 //--------------------------------------------------------------------------- void SetCullingMode(CullingMode value) { enum { CMD_SHIFT = 0, CMD_MASK = 0x3, CMD_CULLING_MODE_NONE = 0, CMD_CULLING_MODE_OTHER = 1, CMD_CULLING_MODE_BACK = 2 }; this->ref().m_CullingMode = static_cast(value); static const u32 table[] = { CMD_CULLING_MODE_OTHER, CMD_CULLING_MODE_BACK, CMD_CULLING_MODE_OTHER, CMD_CULLING_MODE_NONE }; internal::SetCmdValue( &ref().m_CommandBuffer[0], table[value], CMD_MASK, CMD_SHIFT ); } }; //-------------------------------------------------------------------------- //! @brief ブレンダーを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResBlendOperation : public nw::ut::ResCommon< ResBlendOperationData > { public: //! @brief ブレンドモードの定義です。 enum Mode { MODE_NOT_USE, //!< 使用しません。 MODE_BLEND, //!< ブレンド処理です。 MODE_SEPARATE_BLEND, //!< セパレートブレンド処理です。 MODE_LOGIC //!< 論理演算です。 }; //! @brief 論理演算の演算方法の定義です。 enum LogicOp { LOGICOP_CLEAR = 0, //!< すべてのビット値を 0 にします。 LOGICOP_AND = 1, //!< ソースカラーとディスティネーションカラーの論理積をとります。 LOGICOP_AND_REVERSE = 2, //!< ソースカラーとディスティネーションカラーの反転ビット値の論理積をとります。 LOGICOP_COPY = 3, //!< ソースカラーのビット値をとります。 LOGICOP_SET = 4, //!< すべてのビット値を 1 にします。 LOGICOP_COPY_INVERTED = 5, //!< ソースカラーの反転ビット値をとります。 LOGICOP_NOOP = 6, //!< ディスティネーションカラーのビット値をとります。 LOGICOP_INVERT = 7, //!< ディスティネーションカラーの反転ビット値をとります。 LOGICOP_NAND = 8, //!< ソースカラーとディスティネーションカラーの論理積の反転ビット値をとります。 LOGICOP_OR = 9, //!< ソースカラーとディスティネーションカラーの論理和をとります。 LOGICOP_NOR = 10, //!< ソースカラーとディスティネーションカラーの論理和の反転ビット値をとります。 LOGICOP_XOR = 11, //!< ソースカラーとディスティネーションカラーの排他的論理和をとります。 LOGICOP_EQUIV = 12, //!< ソースカラーとディスティネーションカラーの排他的論理和の反転ビット値をとります。 LOGICOP_AND_INVERTED = 13, //!< ソースカラーの反転ビット値と、ディスティネーションカラーの論理積をとります。 LOGICOP_OR_REVERSE = 14, //!< ソースカラーとディスティネーションカラーの反転ビット値の論理和をとります。 LOGICOP_OR_INVERTED = 15 //!< ソースカラーの反転ビット値と、ディスティネーションカラーの論理和をとります。 }; //! @brief 入出力の要素の定義です。 //! //! MIN(a,b) は a と b の小さい方を表します。 enum BlendFactor { BLENDFACTOR_ZERO = 0, //!< 指定の成分に「 0 」を利用します。 BLENDFACTOR_ONE = 1, //!< 指定の成分に「 1 」を利用します。 BLENDFACTOR_SRC_COLOR = 2, //!< 指定の成分に「ソースカラー」を利用します。 BLENDFACTOR_ONE_MINUS_SRC_COLOR = 3, //!< 指定の成分に「1 - ソースカラー」 を利用します。 BLENDFACTOR_DST_COLOR = 4, //!< 指定の成分に「デスティネーションカラー」を利用します。 BLENDFACTOR_ONE_MINUS_DST_COLOR = 5, //!< 指定の成分に「 1 - デスティネーションカラー」を利用します。 BLENDFACTOR_SRC_ALPHA = 6, //!< 指定の成分に「ソースアルファ」を利用します。 BLENDFACTOR_ONE_MINUS_SRC_ALPHA = 7, //!< 指定の成分に「 1 - ソースアルファ」 を利用します。 BLENDFACTOR_DST_ALPHA = 8, //!< 指定の成分に「デスティネーションアルファ」を利用します。 BLENDFACTOR_ONE_MINUS_DST_ALPHA = 9, //!< 指定の成分に「 1 - デスティネーションアルファ」を利用します。 BLENDFACTOR_CONSTANT_COLOR = 10, //!< 指定の成分に「コンスタントカラー(ブレンドカラー)」を利用します。 BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR = 11, //!< 指定の成分に「 1 - コンスタントカラー」を利用します。 BLENDFACTOR_CONSTANT_ALPHA = 12, //!< 指定の成分に「コンスタントアルファ(ブレンドアルファ)」を利用します。 BLENDFACTOR_ONE_MINUS_CONSTANT_ALPHA = 13, //!< 指定の成分に「 1 - コンスタントアルファ」を利用します。 BLENDFACTOR_SRC_ALPHA_SATURATE = 14 //!< 指定の成分に「 MIN( ソースアルファ , 1 - デスティネーションアルファ ) 」を利用します。 }; //! @brief ブレンド式の定義です。 enum BlendEquation { BLENDEQ_FUNC_ADD = 0, //!< ソースとデスティネーションを加算します。 BLENDEQ_FUNC_SUBTRACT = 1, //!< ソースからデスティネーションを減算します。 BLENDEQ_FUNC_REVERSE_SUBTRACT = 2, //!< デスティネーションからソースを減算します。 BLENDEQ_MIN = 3, //!< ソースとデスティネーションのより小さい方です。 BLENDEQ_MAX = 4 //!< ソースとデスティネーションのより大きい方です。 }; NW_RES_CTOR( ResBlendOperation ) //--------------------------------------------------------------------------- //! @brief ブレンドモードを取得します。 //! //! @return ブレンドモードを返します。 //--------------------------------------------------------------------------- Mode GetMode() const { return static_cast(ref().m_Mode); } //--------------------------------------------------------------------------- //! @brief ブレンドモードを設定します。 //! //! @param[in] value 設定するブレンドモードです。 //--------------------------------------------------------------------------- void SetMode(Mode value) { enum { CMD_SHIFT = 8, CMD_MASK = 0x1, CMD_BLEND_MODE_LOGIC = 0, CMD_BLEND_MODE_OTHER = 1 }; ref().m_Mode = value; const u32 table[] = { CMD_BLEND_MODE_OTHER, CMD_BLEND_MODE_OTHER, CMD_BLEND_MODE_OTHER, CMD_BLEND_MODE_LOGIC }; internal::SetCmdValue( &ref().m_CommandBuffer[0], table[value], CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief ブレンドカラーを設定します。 //! //! @param[in] r 設定するブレンドカラーの R 成分です。 //! @param[in] g 設定するブレンドカラーの G 成分です。 //! @param[in] b 設定するブレンドカラーの B 成分です。 //--------------------------------------------------------------------------- void SetBlendColor( f32 r, f32 g, f32 b ) { enum { CMD_SHIFT = 0, CMD_MASK = 0xffffffff }; ref().m_BlendColor.Set(r, g, b); u32 colorByte = ref().m_BlendColor.ToPicaU32(); internal::SetCmdValue( &ref().m_CommandBuffer[4], colorByte, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief ブレンドカラーを設定します。 //! //! @param[in] r 設定するブレンドカラーの R 成分です。 //! @param[in] g 設定するブレンドカラーの G 成分です。 //! @param[in] b 設定するブレンドカラーの B 成分です。 //! @param[in] a 設定するブレンドカラーのアルファ成分です。 //--------------------------------------------------------------------------- void SetBlendColor( f32 r, f32 g, f32 b, f32 a ) { enum { CMD_SHIFT = 0, CMD_MASK = 0xffffffff }; ref().m_BlendColor.Set(r, g, b, a); u32 colorByte = ref().m_BlendColor.ToPicaU32(); internal::SetCmdValue( &ref().m_CommandBuffer[4], colorByte, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief ブレンドカラーを取得します。 //! //! @return ブレンドカラーを返します。 //--------------------------------------------------------------------------- const nw::ut::FloatColor& GetBlendColor() const { return ref().m_BlendColor; } //--------------------------------------------------------------------------- //! @brief ブレンドカラーを設定します。 //! //! @param[in] value 設定するブレンドカラーです。 //--------------------------------------------------------------------------- void SetBlendColor(const nw::ut::FloatColor& value) { enum { CMD_SHIFT = 0, CMD_MASK = 0xffffffff }; ref().m_BlendColor = value; u32 colorByte = ref().m_BlendColor.ToPicaU32(); internal::SetCmdValue( &ref().m_CommandBuffer[4], colorByte, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief 論理演算の演算方法を取得します。 //! //! @return 演算方法を返します。 //--------------------------------------------------------------------------- LogicOp GetLogicOperation() const { enum { CMD_SHIFT = 0, CMD_MASK = 0xf }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[3], CMD_MASK, CMD_SHIFT )); } //--------------------------------------------------------------------------- //! @brief 論理演算の演算方法を設定します。 //! //! @param[in] value 設定する演算方法です。 //--------------------------------------------------------------------------- void SetLogicOperation(LogicOp value) { enum { CMD_SHIFT = 0, CMD_MASK = 0xf }; internal::SetCmdValue( &ref().m_CommandBuffer[3], value, CMD_MASK, CMD_SHIFT ); } //------------------------------------------------------------ //! @brief カラーブレンド式の入力要素を取得します。 //! //! @return 入力要素を返します。 //--------------------------------------------------------------------------- BlendFactor GetBlendFuncSrcRgb() const { enum { CMD_SHIFT = 16, CMD_MASK = 0xf }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); } //--------------------------------------------------------------------------- //! @brief カラーブレンド式の入力要素を設定します。 //! //! @param[in] value 設定する入力要素です。 //--------------------------------------------------------------------------- void SetBlendFuncSrcRgb(BlendFactor value) { enum { CMD_SHIFT = 16, CMD_MASK = 0xf }; internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); } //------------------------------------------------------------ //! @brief アルファブレンド式の入力要素を取得します。 //! //! @return 入力要素を返します。 //--------------------------------------------------------------------------- BlendFactor GetBlendFuncSrcAlpha() const { enum { CMD_SHIFT = 24, CMD_MASK = 0xf }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); } //--------------------------------------------------------------------------- //! @brief アルファブレンド式の入力要素を設定します。 //! //! @param[in] value 設定する入力要素です。 //--------------------------------------------------------------------------- void SetBlendFuncSrcAlpha(BlendFactor value) { enum { CMD_SHIFT = 24, CMD_MASK = 0xf }; internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); } //------------------------------------------------------------ //! @brief カラーブレンド式の出力要素を取得します。 //! //! @return 出力要素を返します。 //--------------------------------------------------------------------------- BlendFactor GetBlendFuncDstRgb() const { enum { CMD_SHIFT = 20, CMD_MASK = 0xf }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); } //--------------------------------------------------------------------------- //! @brief カラーブレンド式の出力要素を設定します。 //! //! @param[in] value 設定する出力要素です。 //--------------------------------------------------------------------------- void SetBlendFuncDstRgb(BlendFactor value) { enum { CMD_SHIFT = 20, CMD_MASK = 0xf }; internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief アルファブレンド式の出力要素を取得します。 //! //! @return 出力要素を返します。 //--------------------------------------------------------------------------- BlendFactor GetBlendFuncDstAlpha() const { enum { CMD_SHIFT = 28, CMD_MASK = 0xf }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); } //--------------------------------------------------------------------------- //! @brief アルファブレンド式の出力要素を設定します。 //! //! @param[in] value 設定する出力要素です。 //--------------------------------------------------------------------------- void SetBlendFuncDstAlpha(BlendFactor value) { enum { CMD_SHIFT = 28, CMD_MASK = 0xf }; internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); } //------------------------------------------------------------ //! @brief カラーブレンド式を取得します。 //! //! @return カラーブレンド式を返します。 //--------------------------------------------------------------------------- BlendEquation GetBlendEquationRgb() const { enum { CMD_SHIFT = 0, CMD_MASK = 0x7 }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); } //--------------------------------------------------------------------------- //! @brief カラーブレンド式を設定します、。 //! //! @param[in] value 設定するカラーブレンド式です。 //--------------------------------------------------------------------------- void SetBlendEquationRgb(BlendEquation value) { enum { CMD_SHIFT = 0, CMD_MASK = 0x7 }; internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief アルファブレンド式を取得します。 //! //! @return アルファブレンド式を返します。 //--------------------------------------------------------------------------- BlendEquation GetBlendEquationAlpha() const { enum { CMD_SHIFT = 8, CMD_MASK = 0x7 }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); } //--------------------------------------------------------------------------- //! @brief アルファブレンド式を設定します。 //! //! @param[in] value 設定するアルファブレンド式です。 //--------------------------------------------------------------------------- void SetBlendEquationAlpha(BlendEquation value) { enum { CMD_SHIFT = 8, CMD_MASK = 0x7 }; internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @fn u32 * GetCommandBuffer() //! @brief コマンドバッファへのポインタを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_COMMAND_BUFFER(); }; //-------------------------------------------------------------------------- //! @brief デプステストを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResDepthOperation : public nw::ut::ResCommon< ResDepthOperationData > { public: //! @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 //!< デプスバッファの値以上であれば通過します。 }; NW_RES_CTOR( ResDepthOperation ) //--------------------------------------------------------------------------- //! @brief フラグ値を取得します。 //! //! @return フラグの値です。 //--------------------------------------------------------------------------- u32 GetFlags() const { return static_cast(ref().m_Flags); } //--------------------------------------------------------------------------- //! @brief フラグ値を設定します。 //! //! @return 設定するフラグの値です。 //--------------------------------------------------------------------------- void SetFlags(u32 value) { ref().m_Flags = value; enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; // ここでは DepthTestEnabled のみ設定します。 // DepthMask に関しては実行時にフラグの値から設定します。 internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); } //--------------------------------------------------------------------------- //! @brief テスト方法を取得します。 //! //! @return テスト方法を返します。 //--------------------------------------------------------------------------- TestFunc GetTestFunc() const { enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; return static_cast(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 }; enum { CMD_SHIFT126 = 24, CMD_MASK126 = 0x3, CMD_NEVER = 0, CMD_ALWAYS = 1, CMD_GEATERORGEQUAL = 2, CMD_OTHERS = 3 }; internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); static const uint table[] = { CMD_NEVER, CMD_ALWAYS, CMD_OTHERS, CMD_OTHERS, CMD_OTHERS, CMD_OTHERS, CMD_GEATERORGEQUAL, CMD_GEATERORGEQUAL }; internal::SetCmdValue( &ref().m_CommandBuffer[2], table[value], CMD_MASK126, CMD_SHIFT126 ); } //--------------------------------------------------------------------------- //! @fn u32 * GetCommandBuffer() //! @brief コマンドバッファへのポインタを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_COMMAND_BUFFER() // GetCommandBuffer() }; //-------------------------------------------------------------------------- //! @brief ステンシルテストを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResStencilOperation : public nw::ut::ResCommon< ResStencilOperationData > { public: //! @brief ステンシルテスト関数です。 enum TestFunc { TESTFUNC_NEVER, //!< すべて不通過です。 TESTFUNC_ALWAYS, //!< すべて通過です。 TESTFUNC_EQUAL, //!< 参照値と等しければ通過します。 TESTFUNC_NOTEQUAL, //!< 参照値と等しくなければ通過します。 TESTFUNC_LESS, //!< 参照値より小さければ通過します。 TESTFUNC_LEQUAL, //!< 参照値以下であれば通過します。 TESTFUNC_GREATER, //!< 参照値より大きければ通過します。 TESTFUNC_GEQUAL //!< 参照値以上であれば通過します。 }; //! @brief テスト後の処理です。 enum StencilOp { STENCILOP_KEEP, //!< 現在の値を保持します。 STENCILOP_ZERO, //!< 0 に置換します。 STENCILOP_REPLACE, //!< 参照値に置換します。 STENCILOP_INCREASE, //!< 増加させます。極値処理はクランプです。 STENCILOP_DECREASE, //!< 減少させます。極値処理はクランプです。 STENCILOP_INVERT, //!< ビット単位で反転させます。 STENCILOP_INCREASE_WRAP, //!< 増加させます。極値処理は回り込みです。 STENCILOP_DECREASE_WRAP //!< 減少させます。極値処理は回り込みです。 }; NW_RES_CTOR( ResStencilOperation ) //--------------------------------------------------------------------------- //! @fn u32 * GetCommandBuffer() //! @brief コマンドバッファへのポインタを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_COMMAND_BUFFER(); //! @brief ステンシルテストが有効であるかどうかを取得します。 bool IsTestEnabled() const { enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; return (internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )) ? true : false; } //! @brief ステンシルテストが有効であるかどうかを設定します。 void SetTestEnabled(bool value) { enum { CMD_SHIFT = 0, CMD_MASK = 0x1 }; internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); } //! @brief テスト関数を取得します。 TestFunc GetTestFunction() const { enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )); } //! @brief テスト関数を設定します。 void SetTestFunction(TestFunc value) { enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); } //! @brief 参照値を取得します。 s32 GetTestReference() const { enum { CMD_SHIFT = 16, CMD_MASK = 0xff }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )); } //! @brief 参照値を設定します。 void SetTestReference(s32 value) { enum { CMD_SHIFT = 16, CMD_MASK = 0xff }; internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); } //! @brief テストマスクを取得します。 u32 GetTestMask() const { enum { CMD_SHIFT = 24, CMD_MASK = 0xff }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )); } //! @brief テストマスクを設定します。 void SetTestMask(u32 value) { enum { CMD_SHIFT = 24, CMD_MASK = 0xff }; internal::SetCmdValue( &ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); } //! @brief ステンシルテストを通過できなかったフラグメントへの処理を取得します。 StencilOp GetFailOperation() const { enum { CMD_SHIFT = 0, CMD_MASK = 0x7 }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); } //! @brief ステンシルテストを通過できなかったフラグメントへの処理を設定します。 void SetFailOperation(StencilOp value) { enum { CMD_SHIFT = 0, CMD_MASK = 0x7 }; internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); } //! @brief ステンシルテストを通過し、デプステストを通過できなかったフラグメントへの処理を取得します。 StencilOp GetZFailOperation() const { enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); } //! @brief ステンシルテストを通過し、デプステストを通過できなかったフラグメントへの処理を設定します。 void SetZFailOperation(StencilOp value) { enum { CMD_SHIFT = 4, CMD_MASK = 0x7 }; internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); } //! @brief ステンシルテストを通過し、デプステストを通過または非実施のフラグメントへの処理を取得します。 StencilOp GetPassOperation() const { enum { CMD_SHIFT = 8, CMD_MASK = 0x7 }; return static_cast(internal::GetCmdValue( ref().m_CommandBuffer[2], CMD_MASK, CMD_SHIFT )); } //! @brief ステンシルテストを通過し、デプステストを通過または非実施のフラグメントへの処理を設定します。 void SetPassOperation(StencilOp value) { enum { CMD_SHIFT = 8, CMD_MASK = 0x7 }; internal::SetCmdValue( &ref().m_CommandBuffer[2], value, CMD_MASK, CMD_SHIFT ); } }; //-------------------------------------------------------------------------- //! @brief フラグメントオペレーションを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResFragmentOperation : public nw::ut::ResCommon< ResFragmentOperationData > { public: NW_RES_CTOR( ResFragmentOperation ) //! @brief フラグメントオペレーションモードです。 enum FragmentOperationMode { FRAGMENT_OPERATION_MODE_GL = 0, FRAGMENT_OPERATION_MODE_GAS = 1, FRAGMENT_OPERATION_MODE_SHADOW = 3 }; //! @brief フラグメントオペレーションモードを設定します。 void SetFragmentOperationMode(FragmentOperationMode value) { enum { CMD_SHIFT = 0, CMD_MASK = 0x3 }; ResBlendOperation blendOperation = GetBlendOperation(); NW_ASSERT(blendOperation.IsValid()); internal::SetCmdValue( &blendOperation.ref().m_CommandBuffer[0], value, CMD_MASK, CMD_SHIFT ); } //! @brief フラグメントオペレーションモードを取得します。 FragmentOperationMode GetFragmentOperationMode() const { enum { CMD_SHIFT = 0, CMD_MASK = 0x3 }; ResBlendOperation blendOperation = GetBlendOperation(); NW_ASSERT(blendOperation.IsValid()); return static_cast(internal::GetCmdValue( blendOperation.ref().m_CommandBuffer[0], CMD_MASK, CMD_SHIFT )); } //--------------------------------------------------------------------------- //! @fn ResStencilOperationData & GetStencilOperationData() //! @brief ステンシルオペレーションのデータを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResStencilOperation GetStencilOperation() //! @brief ステンシルオペレーションのデータを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResDepthOperationData & GetDepthOperationData() //! @brief デプスオペレーションのデータを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResDepthOperation GetDepthOperation() //! @brief デプスオペレーションのデータを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResBlendOperationData & GetBlendOperationData() //! @brief ブレンドオペレーションのデータを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResBlendOperation GetBlendOperation() //! @brief ブレンドオペレーションのデータを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_RESSTRUCT_DECL( ResDepthOperation, DepthOperation ) // GetDepthOperation(), GetDepthOperationData() NW_RES_FIELD_RESSTRUCT_DECL( ResBlendOperation, BlendOperation ) // GetBlendOperation(), GetBlendOperationData() NW_RES_FIELD_RESSTRUCT_DECL( ResStencilOperation, StencilOperation ) // GetStencilOperation(), GetStencilOperationData() }; //-------------------------------------------------------------------------- //! @brief テクスチャ座標の設定や変換情報を表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResTextureCoordinator : public nw::ut::ResCommon< ResTextureCoordinatorData > { public: //! @brief テクスチャマッピングの方法です。 enum MappingMethod { MAPPINGMETHOD_UV_COORDINATE, //!< テクスチャ座標です。 MAPPINGMETHOD_CAMERA_CUBE_ENV, //!< カメラキューブ座標です。 MAPPINGMETHOD_CAMERA_SPHERE_ENV, //!< カメラスフィア座標です。 MAPPINGMETHOD_PROJECTION, //!< 投影します。 MAPPINGMETHOD_SHADOW //!< シャドウ用の投影です。 }; //! @brief テクスチャ座標の計算方法です。 enum MappingMatrixMode { MAPPINGMATRIXMODE_MAYA, //!< Maya 方式です。 MAPPINGMATRIXMODE_SOFTIMAGE, //!< Softimage 方式です。 MAPPINGMATRIXMODE_3DSMAX //!< 3ds max 方式です。 }; NW_RES_CTOR( ResTextureCoordinator ) //! @brief テクスチャのスケールを取得します。 const nw::math::VEC2& GetScale() const { return this->ref().m_Scale; } //! @brief テクスチャのスケールを設定します。 //! TextureMatrix を再計算する Dirty フラグを立てます。 void SetScale(const nw::math::VEC2& scale) { if (this->ref().m_Scale != scale) { this->ref().m_Scale.Set(scale.x, scale.y); this->SetDirty(true); } } //! @brief テクスチャの回転を取得します。 f32 GetRotate() { return this->ref().m_Rotate; } //! @brief テクスチャの回転を設定します。 //! TextureMatrix を再計算する Dirty フラグを立てます。 void SetRotate(f32 rotate) { if (this->ref().m_Rotate != rotate) { this->ref().m_Rotate = rotate; this->SetDirty(true); } } //! @brief テクスチャの平行移動を取得します。 const nw::math::VEC2& GetTranslate() const { return this->ref().m_Translate; } //! @brief テクスチャの平行移動を設定します。 //! TextureMatrix を再計算する Dirty フラグを立てます。 void SetTranslate(const nw::math::VEC2& translate) { if (this->ref().m_Translate != translate) { this->ref().m_Translate.Set(translate.x, translate.y); this->SetDirty(true); } } //--------------------------------------------------------------------------- //! @fn void SetTextureMatrix(const nw::math::MTX34 & value) //! @brief テクスチャ行列を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetSourceCoordinate(s32 value) //! @brief ソースとなるテクスチャ座標の番号を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetReferenceCamera(s32 value) //! @brief 参照するカメラの番号を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetMatrixMode(MappingMatrixMode value) //! @brief テクスチャ座標計算の方法を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetMappingMethod(MappingMethod value) //! @brief テクスチャマッピングの方法を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetEnabled(bool value) //! @brief 有効・無効フラグを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetDirty(bool value) //! @brief ダーティフラグを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn bool IsEnabled() const //! @brief 有効・無効フラグを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn bool IsDirty() const //! @brief ダーティフラグを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn nw::math::MTX34 & GetTextureMatrix() //! @brief テクスチャ行列を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetSourceCoordinate() const //! @brief ソースとなるテクスチャ座標の番号を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetReferenceCamera() const //! @brief 参照するカメラの番号を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn MappingMatrixMode GetMatrixMode() const //! @brief テクスチャ座標計算の方法を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn MappingMethod GetMappingMethod() const //! @brief テクスチャマッピングの方法を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( s32, SourceCoordinate ) // GetSourceCoordinate(), SetSourceCoordinate() NW_RES_FIELD_PRIMITIVE_DECL( MappingMethod, MappingMethod ) // GetMappingMethod(), SetMappingMethod() NW_RES_FIELD_PRIMITIVE_DECL( s32, ReferenceCamera ) // GetReferenceCamera(), SetReferenceCamera() NW_RES_FIELD_PRIMITIVE_DECL( MappingMatrixMode, MatrixMode ) // GetMatrixMode(), SetMatrixMode() NW_RES_FIELD_BOOL_PRIMITIVE_DECL( Dirty ) // IsDirty(), SetDirty() NW_RES_FIELD_BOOL_PRIMITIVE_DECL( Enabled ) // IsEnabled(), SetEnabled() NW_RES_FIELD_STRUCT_DECL( nw::math::MTX34, TextureMatrix ) // GetTextureMatrix() }; //-------------------------------------------------------------------------- //! @brief マテリアルを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResMaterial : public ResSceneObject { public: enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResMaterial) }; enum { SIGNATURE = NW_RES_SIGNATURE32('MTOB') }; enum { BINARY_REVISION = REVISION_RES_MATERIAL }; //! @brief テクスチャコーディネータの設定です。 //! //! どのテクスチャコーディネータを割り当てるかを設定します。 //! テクスチャ 0 、テクスチャ 1 、テクスチャ 2 、プロシージャルテクスチャの順で表します。 enum TextureCoordinateConfig { CONFIG_0120, //!< 0 1 2 0 です。 CONFIG_0110, //!< 0 1 1 0 です。 CONFIG_0111, //!< 0 1 1 1 です。 CONFIG_0112, //!< 0 1 1 2 です。 CONFIG_0121, //!< 0 1 2 1 です。 CONFIG_0122, //!< 0 1 2 2 です。 CONFIG_NUM //!< 使用しません。 }; //! @brief 描画レイヤーです。 enum TranslucencyKind { TRANSLUCENCY_KIND_LAYER0, //!< レイヤー 0 ( 不透明メッシュとして描画 ) です。 TRANSLUCENCY_KIND_LAYER1, //!< レイヤー 2 ( 半透明メッシュとして描画 ) です。 TRANSLUCENCY_KIND_LAYER2, //!< レイヤー 3 ( 減算合成メッシュとして描画 ) です。 TRANSLUCENCY_KIND_LAYER3, //!< レイヤー 4 ( 加算合成メッシュとして描画 ) です。 TRANSLUCENCY_KIND_OPAQUE = TRANSLUCENCY_KIND_LAYER0, //!< TRANSLUCENCY_KIND_LAYER0 と同じです。 TRANSLUCENCY_KIND_TRANSLUCENT = TRANSLUCENCY_KIND_LAYER1, //!< TRANSLUCENCY_KIND_LAYER1 と同じです。 TRANSLUCENCY_KIND_SUBTRACTIVE = TRANSLUCENCY_KIND_LAYER2, //!< TRANSLUCENCY_KIND_LAYER2 と同じです。 TRANSLUCENCY_KIND_ADDITIVE = TRANSLUCENCY_KIND_LAYER3, //!< TRANSLUCENCY_KIND_LAYER3 と同じです。 TRANSLUCENCY_KIND_END = TRANSLUCENCY_KIND_LAYER3 //!< 最後の描画レイヤーです。 }; NW_RES_CTOR_INHERIT( ResMaterial, ResSceneObject ) //--------------------------------------------------------------------------- //! @fn void SetTranslucencyKind(TranslucencyKind value) //! @brief 透明性の種類を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetTextureCoordinateConfig(TextureCoordinateConfig value) //! @brief テクスチャの座標のユニット割当設定を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetShaderProgramDescriptionIndex(s32 value) //! @brief シェーダープログラムのインデックスを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetLightSetIndex(s32 value) //! @brief ライトセットのインデクスを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFogIndex(s32 value) //! @brief フォグのインデクスを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFlags(u32 value) //! @brief フラグの値を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetActiveTextureCoordinatorsCount(s32 value) //! @brief テクスチャコーディネータの有効な数を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn TranslucencyKind GetTranslucencyKind() const //! @brief 透明性の種類を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetTextureMappersCount() const //! @brief テクスチャマッパーの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResPixelBasedTextureMapper GetTextureMappers(int idx) //! @brief テクスチャマッパーを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResTextureCoordinatorData & GetTextureCoordinatorsData(int idx) //! @brief テクスチャコーディネータの配列を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetTextureCoordinatorsCount() const //! @brief テクスチャコーディネータの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResTextureCoordinator GetTextureCoordinators(int idx) //! @brief テクスチャコーディネータを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn TextureCoordinateConfig GetTextureCoordinateConfig() const //! @brief テクスチャの座標のユニット割当設定を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetShaderProgramDescriptionIndex() const //! @brief シェーダープログラムのインデックスを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetShaderParametersCount() const //! @brief シェーダーパラメータの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResShaderParameter GetShaderParameters(int idx) //! @brief シェーダーパラメータを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResShader GetShader() //! @brief シェーダーを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResRasterizationData & GetRasterizationData() //! @brief ラスタライゼーションを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResRasterization GetRasterization() //! @brief ラスタライゼーションを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResProceduralTextureMapper GetProceduralTextureMapper() //! @brief プロシージャルテクスチャユニットのマッパーを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetMaterialId() const //! @brief 描画ソートに使用するマテリアルIDを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetMaterialId(u32 value) //! @brief 描画ソートに使用するマテリアルIDを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResMaterialColorData & GetMaterialColorData() //! @brief マテリアルカラーを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResMaterialColor GetMaterialColor() //! @brief マテリアルカラーを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetLightSetIndex() const //! @brief ライトセットのインデクスを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResFragmentShader GetFragmentShader() //! @brief フラグメントシェーダーを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResFragmentOperationData & GetFragmentOperationData() //! @brief フラグメントオペレーションを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResFragmentOperation GetFragmentOperation() //! @brief フラグメントオペレーションを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetFogIndex() const //! @brief フォグのインデクスを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetFlags() const //! @brief フラグの値を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetActiveTextureCoordinatorsCount() const //! @brief テクスチャコーディネータの有効な数を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( u32, Flags ) // GetFlags(), SetFlags() NW_RES_FIELD_PRIMITIVE_DECL( TextureCoordinateConfig, TextureCoordinateConfig ) // GetTextureCoordinateConfig(), SetTextureCoordinateConfig() NW_RES_FIELD_PRIMITIVE_DECL( TranslucencyKind, TranslucencyKind ) // GetTranslucencyKind(), SetTranslucencyKind() NW_RES_FIELD_RESSTRUCT_DECL( ResMaterialColor, MaterialColor ) // GetMaterialColor(), GetMaterialColorData() NW_RES_FIELD_RESSTRUCT_DECL( ResRasterization, Rasterization ) // GetRasterization(), GetRasterizationData() NW_RES_FIELD_RESSTRUCT_DECL( ResFragmentOperation, FragmentOperation ) // GetFragmentOperation(), GetFragmentOperationData() NW_RES_FIELD_PRIMITIVE_DECL( s32, ActiveTextureCoordinatorsCount ) // SetActiveTextureCoordinatorsCount() GetActiveTextureCoordinatorsCount() NW_RES_FIELD_STRUCT_FIXED_LIST_DECL( ResTextureCoordinator, TextureCoordinators ) // GetTextureCoordinators(int idx), GetTextureCoodinatorsData(), GetTextureCoordinatorsData(int idx), GetTextureCoordinatorsCount() NW_RES_FIELD_CLASS_FIXED_LIST_DECL( ResPixelBasedTextureMapper, TextureMappers ) // GetTextureMappers(int idx), GetTextureMappersCount() NW_RES_FIELD_CLASS_DECL( ResProceduralTextureMapper, ProceduralTextureMapper ) // GetProceduralTextureMapper() NW_RES_FIELD_CLASS_DECL( ResShader, Shader ) // GetShader() NW_RES_FIELD_CLASS_DECL( ResFragmentShader, FragmentShader ) // GetFragmentShader() NW_RES_FIELD_PRIMITIVE_DECL( s32, ShaderProgramDescriptionIndex ) // GetShaderProgramDescriptionIndex() NW_RES_FIELD_CLASS_LIST_DECL( ResShaderParameter, ShaderParameters ) // GetParameters(int idx), GetParametersCount() NW_RES_FIELD_PRIMITIVE_DECL( s32, LightSetIndex ) // GetLightSetIndex(), SetLightSetIndex() NW_RES_FIELD_PRIMITIVE_DECL( s32, FogIndex ) // GetFogIndex(), SetFogIndex() NW_RES_FIELD_PRIMITIVE_DECL( u32, ShadingParameterHash ) // GetShadingParameterHash(), SetShadingParameterHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, ShaderParametersHash ) // GetShaderParametersHash(), SetShaderParametersHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureCoordinatorsHash ) // GetTextureCoordinatorsHash(), SetTextureCoordinatorsHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureSamplersHash ) // GetTextureSamplersHash(), SetTextureSamplersHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureMappersHash ) // GetTextureMappersHash(), SetTextureMappersHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, MaterialColorHash ) // GetMaterialColorHash(), SetMaterialColorHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, RasterizationHash ) // GetRasterizationHash(), SetRasterizationHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentLightingHash ) // GetFragmentLightingHash(), SetFragmentLightingHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentLightingTableHash ) // GetFragmentLightingTableHash(), SetFragmentLightingTableHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentLightingTableParametersHash ) // GetFragmentLightingTableParametersHash(), SetFragmentLightingTableParametersHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, AlphaTestHash ) // GetAlphaTestHash(), SetAlphaTestHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, TextureCombinersHash ) // GetTextureCombinersHash(), SetTextureCombinersHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, FragmentOperationHash ) // GetFragmentOperationHash(), SetFragmentOperationHash() NW_RES_FIELD_PRIMITIVE_DECL( u32, MaterialId ) // GetMaterialId(), SetMaterialId() //! @brief マテリアルバイナリのリビジョンを取得します。 //! //! @return マテリアルバイナリのリビジョンを返します。 u32 GetRevision() const { return this->GetHeader().revision; } //--------------------------------------------------------------------------- //! @brief リソースの初期化処理をおこないます。 //! //! @param[in] allocator アロケータです。 //! @param[in] graphicsFile グラフィックスリソースです。 //--------------------------------------------------------------------------- Result Setup(os::IAllocator* allocator, ResGraphicsFile graphicsFile); //--------------------------------------------------------------------------- //! @brief リソースの後始末をおこないます。 //--------------------------------------------------------------------------- void Cleanup(); //! @brief セットアップ済みのシェーダーを設定します。 //! //! @param[in] resShader 設定するシェーダーです。 //! void SetShader(ResShader resShader); //--------------------------------------------------------------------------- //! @fn void SetMaterialColorHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFragmentOperationHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFragmentLightingTableParametersHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFragmentLightingTableHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFragmentLightingHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetAlphaTestHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetTextureSamplersHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetTextureMappersHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetTextureCoordinatorsHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetTextureCombinersHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetShadingParameterHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetFragmentOperationHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetMaterialColorHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetRasterizationHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetFragmentLightingTableParametersHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetFragmentLightingTableHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetFragmentLightingHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetAlphaTestHash() const //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetTextureSamplersHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetTextureMappersHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetTextureCoordinatorsHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetTextureCombinersHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetShadingParameterHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetRasterizationHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetShaderParametersHash(u32 value) //! @details :private //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetShaderParametersHash() const //! @details :private //--------------------------------------------------------------------------- private: //! @brief シェーダーをセットアップします。 Result SetupShader(os::IAllocator* allocator, ResShader resShader, ResGraphicsFile graphicsFile); //! @brief テクスチャをセットアップします。 Result SetupTextures(os::IAllocator* allocator, ResMaterial resMaterial, ResGraphicsFile graphicsFile); //! @brief シェーダーシンボルへのインデックスをキャッシュします。 //! //! @param[in] symbols キャッシュを行うシェーダーシンボルの配列です。 //! void CacheUserUniformIndex(ResShaderSymbolArray symbols); //! @brief フラグメントライティングテーブルをセットアップします。 Result SetupFragmentLightingTable(os::IAllocator* allocator, ResFragmentLightingTable resLightingTable, ResGraphicsFile graphicsFile); //! @brief フラグメントライティングのハッシュを計算します。 void CalcFragmentLightingTableHash(); }; typedef nw::ut::ResArrayPatricia::type ResMaterialArray; typedef nw::ut::ResArrayPatricia::type ResMaterialArrayConst; } // namespace res } // namespace gfx } // namespace nw #endif // NW_GFX_RESMATERIAL_H_