/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_ResShader.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: 19452 $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_RESSHADER_H_ #define NW_GFX_RESSHADER_H_ #include #include #include #include #include #include #include namespace nw { namespace os { class IAllocator; } namespace gfx { namespace res { class ResGraphicsFile; class ResShaderSymbol; class ResBinaryShader; typedef ut::ResArrayClass::type::iterator ResShaderSymbolArrayIterator; typedef ut::ResArrayClass::type::const_iterator ResShaderSymbolArrayConstIterator; typedef ut::ResArrayClass::type ResShaderSymbolArray; typedef ut::ResArrayClass::type ResShaderSymbolArrayConst; //! @details :private struct ResShaderParameterValueData { nw::ut::ResS32 m_UniformType; nw::ut::ResF32 m_Value[1]; // UniformType によってこの後に可変長のデータが続きます。 }; //! @details :private struct ResShaderSymbolData { nw::ut::BinString toName; nw::ut::ResBool m_IsEnabled; nw::ut::ResBool m_IsGeometryUniform; u8 _padding_0[2]; nw::ut::ResS32 m_Location; ResShaderParameterValueData m_DefaultValue; // 可変長となりますので、この後ろにデータを入れてはならない。 }; //! @details :private struct ResShaderParameterData { nw::ut::BinString toName; nw::ut::ResS32 m_SymbolIndex; ResShaderParameterValueData m_Parameter; }; //! @details :private struct ResShaderProgramDescriptionData { enum { VERTEX_ATTRIBUTE_USAGE_COUNT = 22 }; nw::ut::ResU32 m_Flags; nw::ut::ResU32 m_VertexShaderObject; nw::ut::ResU32 m_GeometryShaderObject; nw::ut::ResS32 m_VertexShaderIndex; nw::ut::ResS32 m_GeometryShaderIndex; nw::ut::ResS32 m_SymbolsTableCount; nw::ut::Offset toSymbolsTable; nw::ut::BinString toAttributeSymbols[VERTEX_ATTRIBUTE_COUNT]; nw::ut::ResS8 m_AttributeIndices[VERTEX_ATTRIBUTE_USAGE_COUNT]; u8 _padding_0[2]; nw::ut::ResS32 m_MaxBoneCount; nw::ut::ResS32 m_MaxVertexLightCount; nw::ut::ResS32 m_VertexLightEndUniform; nw::ut::ResS32 m_GeometryShaderMode; nw::ut::ResU32 m_ProgramObject; void* m_UniformLocation; void* m_CommandCache; u32 m_CommandCacheSize; nw::ut::Offset toOwnerShader; }; //! @details :private struct ResShaderData : public ResSceneObjectData { }; //! @details :private struct ResBinaryShaderData : public ResShaderData { nw::ut::ResS32 m_BinaryDataTableCount; nw::ut::Offset toBinaryDataTable; nw::ut::ResS32 m_ShaderKindsTableCount; nw::ut::Offset toShaderKindsTable; nw::ut::ResS32 m_DescriptionsTableCount; nw::ut::Offset toDescriptionsTable; nw::ut::ResS32 m_ShaderObjectsTableCount; nw::ut::Offset toShaderObjectsTable; void* m_CommandCache; s32 m_CommandCacheSize; void* m_ShaderBinaryInfo; }; //! @details :private struct ResReferenceShaderData : public ResShaderData { nw::ut::BinString toPath; nw::ut::Offset toTargetShader; }; //-------------------------------------------------------------------------- //! @brief シェーダパラメータの値を表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResShaderParameterValue : public nw::ut::ResCommon< ResShaderParameterValueData > { public: //! @brief シェーダパラメータの型です。 enum UniformType { TYPE_BOOL1, //!< ブール値です。 TYPE_FLOAT1, //!< 1 次元のベクトルです。 TYPE_FLOAT2, //!< 2 次元のベクトルです。 TYPE_FLOAT3, //!< 3 次元のベクトルです。 TYPE_FLOAT4 //!< 4 次元のベクトルです。 }; NW_RES_CTOR( ResShaderParameterValue ) //--------------------------------------------------------------------------- //! @fn void SetUniformType(UniformType value) //! @brief ユニフォームの種類を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn UniformType GetUniformType() const //! @brief ユニフォームの種類を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( UniformType, UniformType ) // GetUniformType(), SetUniformType() //--------------------------------------------------------------------------- //! @brief パラメータの値を指し示す float 型のポインタを取得します。 //! //! パラメータの 1 次元目の値を指し示す float 型のポインタを返します。 //! 2 次元目以降は戻り値をインクリメントすることで取得できます。 //! //! @return パラメータの値を指し示す float 型のポインタを返します。 //--------------------------------------------------------------------------- const f32* GetValueF32() const { return &ref().m_Value[0]; } //--------------------------------------------------------------------------- //! @brief パラメータの値を指し示す float 型のポインタを取得します。 //! //! パラメータの 1 次元目の値を指し示す float 型のポインタを返します。 //! 2 次元目以降は戻り値をインクリメントすることで取得できます。 //! //! @return パラメータの値を指し示す float 型のポインタを返します。 //--------------------------------------------------------------------------- f32* GetValueF32() { return &ref().m_Value[0]; } //--------------------------------------------------------------------------- //! @brief パラメータの値を指し示す int 型のポインタを取得します。 //! //! パラメータの 1 次元目の値を指し示す int 型のポインタを返します。 //! 2 次元目以降は戻り値をインクリメントすることで取得できます。 //! //! @return パラメータの値を指し示す int 型のポインタを返します。 //--------------------------------------------------------------------------- const s32* GetValueS32() const { return reinterpret_cast( &ref().m_Value[0] ); } //--------------------------------------------------------------------------- //! @brief パラメータの値を指し示す int 型のポインタを取得します。 //! //! パラメータの 1 次元目の値を指し示す int 型のポインタを返します。 //! 2 次元目以降は戻り値をインクリメントすることで取得できます。 //! //! @return パラメータの値を指し示す int 型のポインタを返します。 //--------------------------------------------------------------------------- s32* GetValueS32() { return reinterpret_cast( &ref().m_Value[0] ); } //--------------------------------------------------------------------------- //! @brief パラメータの値を bool 型で取得します。 //! //! @return パラメータの値を bool 型で返します。 //--------------------------------------------------------------------------- bool GetValueBool() const { return *reinterpret_cast( &ref().m_Value[0]) != 0; } //--------------------------------------------------------------------------- //! @brief 種別が TYPE_BOOL1 の場合に値を設定します。 //! //! @param[in] value 設定する値です。 //--------------------------------------------------------------------------- void SetValue(bool value) { NW_ASSERT( this->GetUniformType() == TYPE_BOOL1 ); s32* pValue = this->GetValueS32(); *pValue = value ? 1 : 0; } //--------------------------------------------------------------------------- //! @brief 種別が TYPE_FLOAT1 の場合に値を設定します。 //! //! @param[in] x 設定する値です。 //--------------------------------------------------------------------------- void SetValue(f32 x) { NW_ASSERT( this->GetUniformType() == TYPE_FLOAT1 ); f32* pValue = this->GetValueF32(); *pValue = x; } //--------------------------------------------------------------------------- //! @brief 種別が TYPE_FLOAT2 の場合に値を設定します。 //! //! @param[in] x 設定する値の x 座標です。 //! @param[in] y 設定する値の x 座標です。 //--------------------------------------------------------------------------- void SetValue(f32 x, f32 y) { NW_ASSERT( this->GetUniformType() == TYPE_FLOAT2 ); f32* pValue = this->GetValueF32(); *pValue++ = x; *pValue = y; } //--------------------------------------------------------------------------- //! @brief 種別が TYPE_FLOAT2 の場合に値を設定します。 //! //! @param[in] value 設定する VEC2 の値です。 //--------------------------------------------------------------------------- void SetValue(const math::VEC2& value) { NW_ASSERT( this->GetUniformType() == TYPE_FLOAT2 ); f32* pDstValue = this->GetValueF32(); const f32* pSrcValue = value; *pDstValue++ = *pSrcValue++; *pDstValue = *pSrcValue; } //--------------------------------------------------------------------------- //! @brief 種別が TYPE_FLOAT2 の場合に値を設定します。 //! //! @param[in] x 設定する値の x 座標です。 //! @param[in] y 設定する値の x 座標です。 //! @param[in] z 設定する値の z 座標です。 //--------------------------------------------------------------------------- void SetValue(f32 x, f32 y, f32 z) { NW_ASSERT( this->GetUniformType() == TYPE_FLOAT3 ); f32* pValue = this->GetValueF32(); *pValue = x; ++pValue; *pValue = y; ++pValue; *pValue = z; } //--------------------------------------------------------------------------- //! @brief 種別が TYPE_FLOAT3 の場合に値を設定します。 //! //! @param[in] value 設定する VEC3 の値です。 //--------------------------------------------------------------------------- void SetValue(const math::VEC3& value) { NW_ASSERT( this->GetUniformType() == TYPE_FLOAT3 ); f32* pDstValue = this->GetValueF32(); const f32* pSrcValue = value; *pDstValue++ = *pSrcValue++; *pDstValue++ = *pSrcValue++; *pDstValue = *pSrcValue; } //--------------------------------------------------------------------------- //! @brief 種別が TYPE_FLOAT2 の場合に値を設定します。 //! //! @param[in] x 設定する値の x 座標です。 //! @param[in] y 設定する値の x 座標です。 //! @param[in] z 設定する値の z 座標です。 //! @param[in] w 設定する値の w 座標です。 //--------------------------------------------------------------------------- void SetValue(f32 x, f32 y, f32 z, f32 w) { NW_ASSERT( this->GetUniformType() == TYPE_FLOAT4 ); f32* pValue = this->GetValueF32(); *pValue = x; ++pValue; *pValue = y; ++pValue; *pValue = z; ++pValue; *pValue = w; } //--------------------------------------------------------------------------- //! @brief 種別が TYPE_FLOAT4 の場合に値を設定します。 //! //! @param[in] value 設定する VEC4 の値です。 //--------------------------------------------------------------------------- void SetValue(const math::VEC4& value) { NW_ASSERT( this->GetUniformType() == TYPE_FLOAT4 ); f32* pDstValue = this->GetValueF32(); const f32* pSrcValue = value; *pDstValue++ = *pSrcValue++; *pDstValue++ = *pSrcValue++; *pDstValue++ = *pSrcValue++; *pDstValue = *pSrcValue; } }; //-------------------------------------------------------------------------- //! @brief シェーダパラメータを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResShaderParameter : public nw::ut::ResCommon< ResShaderParameterData > { public: NW_RES_CTOR( ResShaderParameter ) //--------------------------------------------------------------------------- //! @fn void SetSymbolIndex(s32 value) //! @brief シンボルのインデクスを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetSymbolIndex() const //! @brief シンボルのインデクスを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResShaderParameterValueData & GetParameterData() //! @brief パラメータを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResShaderParameterValue GetParameter() //! @brief パラメータを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const char * GetName() const //! @brief シェーダパラメータの名前を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_STRING_DECL( Name ) // GetName() NW_RES_FIELD_PRIMITIVE_DECL( s32, SymbolIndex ) // GetSymbolIndex(), SetSymbolIndex() NW_RES_FIELD_RESSTRUCT_DECL( ResShaderParameterValue, Parameter ) // GetParamter() //--------------------------------------------------------------------------- //! @brief パラメータの要素数を取得します。 //--------------------------------------------------------------------------- s32 GetParameterLength() { switch (GetParameter().GetUniformType()) { case ResShaderParameterValue::TYPE_BOOL1: return 1; case ResShaderParameterValue::TYPE_FLOAT1: return 1; case ResShaderParameterValue::TYPE_FLOAT2: return 2; case ResShaderParameterValue::TYPE_FLOAT3: return 3; case ResShaderParameterValue::TYPE_FLOAT4: return 4; default: NW_FATAL_ERROR("Unsupported ShaderParameterValue type."); return 0; } } }; typedef nw::ut::ResArrayClass::type ResShaderParameterArray; typedef nw::ut::ResArrayClass::type ResShaderParameterArrayConst; //-------------------------------------------------------------------------- //! @brief シェーダシンボルを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResShaderSymbol : public nw::ut::ResCommon< ResShaderSymbolData > { public: NW_RES_CTOR( ResShaderSymbol ) //--------------------------------------------------------------------------- //! @fn void SetLocation(s32 value) //! @brief シェーダユニフォームのロケーションを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetGeometryUniform(bool value) //! @brief ジオメトリシェーダのパラメータかどうかのフラグを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetEnabled(bool value) //! @brief シェーダシンボルの有効フラグを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn bool IsGeometryUniform() const //! @brief ジオメトリシェーダのパラメータかどうかのフラグを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn bool IsEnabled() const //! @brief シェーダシンボルの有効フラグを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const char * GetName() const //! @brief シェーダシンボルの名前を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetLocation() const //! @brief シェーダユニフォームのロケーションを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResShaderParameterValueData & GetDefaultValueData() //! @brief 初期値を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResShaderParameterValue GetDefaultValue() //! @brief 初期値を取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_STRING_DECL( Name ) // GetName() NW_RES_FIELD_BOOL_PRIMITIVE_DECL( Enabled ) // IsEnabled(), SetEnabled() NW_RES_FIELD_RESSTRUCT_DECL( ResShaderParameterValue, DefaultValue ) // GetDefaultValue() NW_RES_FIELD_BOOL_PRIMITIVE_DECL( GeometryUniform ) // IsGeometryUniform(), SetGeometryUniform() NW_RES_FIELD_PRIMITIVE_DECL( s32, Location) // GetLocation(), SetLocation() }; //-------------------------------------------------------------------------- //! @brief シェーダープログラムの詳細設定を表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResShaderProgramDescription : public nw::ut::ResCommon< ResShaderProgramDescriptionData > { public: //! @brief シェーダプログラムリソースのフラグ定義です。 enum Flag { FLAG_IS_SUPPORTING_RIGID_SKINNING = 0x1 << 0, //!< リジッドスキニングがサポートされているかのフラグです。 FLAG_IS_SUPPORTING_SMOOTH_SKINNING = 0x1 << 1, //!< スムーススキニングがサポートされているかのフラグです。 FLAG_IS_SUPPORTING_HEMISPHERE_LIGHTING = 0x1 << 2, //!< 半球ライティングをサポートしているかのフラグです。 FLAG_IS_SUPPORTING_VERTEX_MORPH_SHADER = 0x1 << 3 //!< 頂点モーフィングをサポートしているかのフラグです。 }; NW_RES_CTOR( ResShaderProgramDescription ) //--------------------------------------------------------------------------- //! @fn void SetVertexShaderObject(u32 value) //! @brief 頂点シェーダオブジェクトを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetVertexShaderIndex(s32 value) //! @brief シェーダバイナリ中の頂点シェーダのインデクスを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetVertexLightEndUniform(s32 value) //! @brief 頂点ライトの終了ユニフォームを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetUniformLocation(void * uniformLocation) //! @brief ユニフォームのロケーションを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetProgramObject(u32 value) //! @brief プログラムオブジェクトを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetMaxVertexLightCount(s32 value) //! @brief 処理可能な頂点ライト数の最大値を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetMaxBoneCount(s32 value) //! @brief 一度に設定できるマトリックスパレットの最大値を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetGeometryShaderObject(u32 value) //! @brief ジオメトリシェーダオブジェクトを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetGeometryShaderMode(s32 value) //! @brief ジオメトリシェーダのモードを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetGeometryShaderIndex(s32 value) //! @brief シェーダバイナリ中のジオメトリシェーダのインデクスを設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetFlags(u32 value) //! @brief フラグの値を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetAttributeIndices(int idx, s8 value) //! @brief 頂点属性のインデックスのリストに要素を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetVertexShaderObject() const //! @brief 頂点シェーダオブジェクトを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetVertexShaderIndex() const //! @brief シェーダバイナリ中の頂点シェーダのインデクスを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetVertexLightEndUniform() const //! @brief 頂点ライトの終了ユニフォームを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void * GetUniformLocation() //! @brief ユニフォームのロケーションを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetSymbolsCount() const //! @brief シンボルの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResShaderSymbol GetSymbols(int idx) //! @brief シンボルを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetProgramObject() const //! @brief プログラムオブジェクトを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetMaxVertexLightCount() const //! @brief 処理可能な頂点ライト数の最大値を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetMaxBoneCount() const //! @brief 一度に設定できるマトリックスパレットの最大値を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetGeometryShaderObject() const //! @brief ジオメトリシェーダオブジェクトを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetGeometryShaderMode() const //! @brief ジオメトリシェーダのモードを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetGeometryShaderIndex() const //! @brief シェーダバイナリ中のジオメトリシェーダのインデクスを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetFlags() const //! @brief フラグの値を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetAttributeSymbolsCount() const //! @brief 頂点属性のシンボル名の要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const char * GetAttributeSymbols(int idx) const //! @brief 頂点属性のシンボル名を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetAttributeIndicesCount() const //! @brief 頂点属性のインデックスの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s8 GetAttributeIndices(int idx) const //! @brief 頂点属性のインデックスを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_DECL( u32, Flags ) // GetFlags(), SetFlags() NW_RES_FIELD_PRIMITIVE_DECL( u32, VertexShaderObject ) // GetVertexShaderObject(), SetVertexShaderObject() NW_RES_FIELD_PRIMITIVE_DECL( u32, GeometryShaderObject ) // GetGeometryShaderObject(), SetGeometryShaderObject() NW_RES_FIELD_PRIMITIVE_DECL( s32, VertexShaderIndex ) // GetVertexShaderIndex(), SetVertexShaderIndex() NW_RES_FIELD_PRIMITIVE_DECL( s32, GeometryShaderIndex ) // GetGeometryShaderIndex(), SetGeometryShaderIndex() NW_RES_FIELD_CLASS_LIST_DECL( ResShaderSymbol, Symbols ) // GetSymbols(int idx), GetSymbolsCount() NW_RES_FIELD_STRING_FIXED_LIST_DECL( AttributeSymbols ) // GetAttributeSymbols(int idx), GetAttributeSymbolsCount() NW_RES_FIELD_PRIMITIVE_FIXED_LIST_DECL( s8, AttributeIndices ) // GetAttributeIndices(int idx), GetAttributeIndices(), GetAttributeIndicesCount(), SetAttributeIndices(int,s8) NW_RES_FIELD_PRIMITIVE_DECL( s32, MaxBoneCount ) // GetMaxBoneCount(), SetMaxBoneCount() NW_RES_FIELD_PRIMITIVE_DECL( s32, MaxVertexLightCount ) // GetMaxVertexLightCount(), SetMaxVertexLightCount() NW_RES_FIELD_PRIMITIVE_DECL( s32, VertexLightEndUniform ) // GetVertexLightEndUniform(), SetVertexLightEndUniform() NW_RES_FIELD_PRIMITIVE_DECL( s32, GeometryShaderMode ) // GetGeometryShaderMode(), SetGeometryShaderMode() NW_RES_FIELD_PRIMITIVE_DECL( u32, ProgramObject ) // GetProgramObject(), SetProgramObject() #if defined(NW_GFX_PROGRAM_OBJECT_ENABLED) void* GetUniformLocation() { return ref().m_UniformLocation; } const void* GetUniformLocation() const { return ref().m_UniformLocation; } void SetUniformLocation(void* uniformLocation) { ref().m_UniformLocation = uniformLocation; } #endif //--------------------------------------------------------------------------- //! @brief このシェーダプログラムを所有するシェーダバイナリを取得します。 //! //! @return シェーダバイナリへのポインタです。 //--------------------------------------------------------------------------- ResBinaryShaderData* GetOwnerShaderData() { return static_cast( ref().toOwnerShader.to_ptr() ); } //--------------------------------------------------------------------------- //! @brief このシェーダプログラムを所有するシェーダバイナリを取得します。 //! //! @return シェーダバイナリへのポインタです。 //--------------------------------------------------------------------------- const ResBinaryShaderData* GetOwnerShaderData() const { return static_cast( ref().toOwnerShader.to_ptr() ); } //--------------------------------------------------------------------------- //! @brief シェーダバイナリ解析情報クラスを取得します。 //! //! @return シェーダバイナリ解析情報クラスへのポインタです。 //--------------------------------------------------------------------------- const ShaderBinaryInfo* GetShaderBinaryInfo() const { return static_cast( this->GetOwnerShaderData()->m_ShaderBinaryInfo ); } //--------------------------------------------------------------------------- //! @brief 頂点シェーダのユニフォームインデックスを取得します。 //! //! @param[in] name ユニフォーム名です。 //! @param[out] pSymbolType ユニフォームのタイプ取得用の領域です。 //! //! @return シェーダユニフォームレジスタのインデックスを返します。 //! 見つからなかった場合には -1 を返します。 //--------------------------------------------------------------------------- s32 GetVertexUniformIndex( const char* name, ShaderBinaryInfo::SymbolType* pSymbolType ) const; //--------------------------------------------------------------------------- //! @brief ジオメトリシェーダのユニフォームインデックスを取得します。 //! //! @param[in] name ユニフォーム名です。 //! @param[out] pSymbolType ユニフォームのタイプ取得用の領域です。 //! //! @return シェーダユニフォームレジスタのインデックスを返します。 //! 見つからなかった場合には -1 を返します。 //--------------------------------------------------------------------------- s32 GetGeometryUniformIndex( const char* name, ShaderBinaryInfo::SymbolType* pSymbolType ) const; //--------------------------------------------------------------------------- //! @brief リソースの初期化処理をおこないます。 //! //! @param[in] allocator アロケータです。 //--------------------------------------------------------------------------- Result Setup(os::IAllocator* allocator); //--------------------------------------------------------------------------- //! @brief リソースの後始末をおこないます。 //--------------------------------------------------------------------------- void Cleanup(); #if defined(NW_GFX_PROGRAM_OBJECT_ENABLED) private: GLuint CreateProgramObject(); void AttachProgram(GLuint programObject); void LinkProgram(GLuint programObject); #endif }; //-------------------------------------------------------------------------- //! @brief シェーダを表すバイナリリソースの基底クラスです。 //--------------------------------------------------------------------------- class ResShader : public ResSceneObject { public: enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResShader) }; enum { SIGNATURE = NW_RES_SIGNATURE32('SHDR') }; enum { BINARY_REVISION = REVISION_RES_SHADER }; NW_RES_CTOR_INHERIT( ResShader, ResSceneObject ) //--------------------------------------------------------------------------- //! @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 参照を解決し、ResBinaryShader を取得します。 //--------------------------------------------------------------------------- ResBinaryShader Dereference(); //--------------------------------------------------------------------------- //! @brief 参照を解決し、const ResBinaryShader を取得します。 //--------------------------------------------------------------------------- const ResBinaryShader Dereference() const; }; //-------------------------------------------------------------------------- //! @brief シェーダバイナリを表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResBinaryShader : public ResShader { public: enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResBinaryShader) }; enum { SIGNATURE = NW_RES_SIGNATURE32('BSHD') }; NW_RES_CTOR_INHERIT( ResBinaryShader, ResShader ) //--------------------------------------------------------------------------- //! @fn void SetShaderObjects(int idx, u32 value) //! @brief シェーダオブジェクトのリストに要素を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetShaderKinds(int idx, u32 value) //! @brief 格納されているシェーダーの種類のリストに要素を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn void SetBinaryData(int idx, u8 value) //! @brief シェーダバイナリデータのリストに要素を設定します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetShaderObjectsCount() const //! @brief シェーダオブジェクトの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetShaderObjects(int idx) const //! @brief シェーダオブジェクトを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetShaderKindsCount() const //! @brief 格納されているシェーダーの種類の要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u32 GetShaderKinds(int idx) const //! @brief 格納されているシェーダーの種類を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetDescriptionsCount() const //! @brief シェーダープログラムの設定の要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn ResShaderProgramDescription GetDescriptions(int idx) //! @brief シェーダープログラムの設定を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn s32 GetBinaryDataCount() const //! @brief シェーダバイナリデータの要素数を取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn u8 GetBinaryData(int idx) const //! @brief シェーダバイナリデータを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_PRIMITIVE_LIST_DECL( u8, BinaryData ) // GetBinaryData(), GetBinaryData(int idx), GetBinaryDataCount() NW_RES_FIELD_PRIMITIVE_LIST_DECL( u32, ShaderKinds ) // GetShaderKinds(), GetShaderKinds(int idx), GetShaderKindsCount() NW_RES_FIELD_CLASS_LIST_DECL( ResShaderProgramDescription, Descriptions ) // GetDescriptions(int idx), GetDescriptionsCount() NW_RES_FIELD_PRIMITIVE_LIST_DECL( u32, ShaderObjects ) // GetShaderObjects(), GetShaderObjects(int idx), GetShaderObjectsCount() //--------------------------------------------------------------------------- //! @brief シェーダバイナリ設定用の GPU コマンドです。 //! //! @return GPU コマンドへのポインタです。 //--------------------------------------------------------------------------- const void* GetCommandCache() const { return ref().m_CommandCache; } //--------------------------------------------------------------------------- //! @brief シェーダバイナリ設定用の GPU コマンドのサイズです。 //! //! @return GPU コマンドのサイズを返します。 //--------------------------------------------------------------------------- int GetCommandCacheSize() const { return ref().m_CommandCacheSize; } //--------------------------------------------------------------------------- //! @brief シェーダバイナリ解析情報クラスを取得します。 //! //! @return シェーダバイナリ解析情報クラスへのポインタです。 //--------------------------------------------------------------------------- ShaderBinaryInfo* GetShaderBinaryInfo() { return static_cast( ref().m_ShaderBinaryInfo ); } //--------------------------------------------------------------------------- //! @brief シェーダバイナリ情報へのアクセサを取得します。 //! //! @return シェーダバイナリへのアクセサクラスへのポインタです。 //--------------------------------------------------------------------------- const ShaderBinaryInfo* GetShaderBinaryInfo() const { return static_cast( ref().m_ShaderBinaryInfo ); } }; //-------------------------------------------------------------------------- //! @brief シェーダの外部参照を表すバイナリリソースクラスです。 //--------------------------------------------------------------------------- class ResReferenceShader : public ResShader { public: enum { TYPE_INFO = NW_GFX_RES_TYPE_INFO(ResReferenceShader) }; enum { SIGNATURE = NW_RES_SIGNATURE32('SDRF') }; NW_RES_CTOR_INHERIT( ResReferenceShader, ResShader ) //--------------------------------------------------------------------------- //! @fn ResShader GetTargetShader() //! @brief 参照解決後のシェーダデータを取得します。 //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //! @fn const char * GetPath() const //! @brief 参照するシェーダのパスを取得します。 //--------------------------------------------------------------------------- NW_RES_FIELD_STRING_DECL( Path ) // GetPath() NW_RES_FIELD_CLASS_DECL( ResShader, TargetShader ) // GetTargetShader() }; } // namespace res } // namespace gfx } // namespace nw #endif // NW_GFX_RESSHADER_H_