/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_RelativeHashMaterialIdGenerator.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: 22799 $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_RELATIVEHASHMATERIALIDGENERATOR_H_ #define NW_GFX_RELATIVEHASHMATERIALIDGENERATOR_H_ #include namespace nw { namespace gfx { //--------------------------------------------------------------------------- //! @brief マテリアルハッシュを用いたマテリアルIDの生成を行うクラスです。 //! RelativeHashMaterialIdGenerator は 1.3.0 で廃止予定です。 //! SortingMaterialIdGenerator か、独自に実装した MaterialIdGenerator を用いてください。 //--------------------------------------------------------------------------- class RelativeHashMaterialIdGenerator : public IMaterialIdGenerator { private: NW_DISALLOW_COPY_AND_ASSIGN(RelativeHashMaterialIdGenerator); enum MaterialOrder { MATERIAL_ORDER_SHADER_PARAMETERS, MATERIAL_ORDER_ALPHA_TEST, MATERIAL_ORDER_TEXTURE_SAMPLERS, MATERIAL_ORDER_TEXTURE_COMBINER, MATERIAL_ORDER_FRAGMENT_OPERATION, MATERIAL_ORDER_FRAGMENT_LIGHTING_TABLE_PARAMETERS, MATERIAL_ORDER_RASTERIZATION, MATERIAL_ORDER_SHADING_PARMETER, MATERIAL_ORDER_TEXTURE_COORDINATORS, MATERIAL_ORDER_MATERIAL_COLOR, MATERIAL_ORDER_FRAGMENT_LIGHTING }; public: NW_UT_RUNTIME_TYPEINFO; //! @brief 設定内容です。 struct Description { bool isForceGeneration; //!< 強制的に生成するフラグです。 bool isFixedSizeMemory; //!< 最初に固定サイズのメモリを確保するフラグです。 int maxMaterials; //!< マテリアルの最大数です。 //! @brief コンストラクタです。 Description() : isForceGeneration(false), isFixedSizeMemory(true), maxMaterials(128) {} }; //---------------------------------------- //! @name 生成 //@{ //! マテリアルハッシュを用いたマテリアルIDの生成クラスを構築するためのクラスです。 //! //! IsFixedSizeMemory の初期値は true です。false に変更すると、各種最大数の設定は無視されます。 class Builder { public: //! 強制的に生成するフラグを設定します。 Builder& IsForceGeneration(bool isForceGeneration) { m_Description.isForceGeneration = isForceGeneration; return *this; } //! @brief 生成時以外にもメモリを確保するかどうかのフラグを設定します。 //! //! true を指定すると、生成時のみ固定サイズのメモリ確保を行います。 //! //! false を指定すると、生成時以外にも必要に応じて動的にメモリ確保が行われます。 Builder& IsFixedSizeMemory(bool isFixedSizeMemory) { m_Description.isFixedSizeMemory = isFixedSizeMemory; return *this; } //! マテリアルの最大数を設定します。 Builder& MaxMaterials(int maxMaterials) { m_Description.maxMaterials = maxMaterials; return *this; } //! @brief マテリアルIDの生成クラスを生成します。 //! RelativeHashMaterialIdGenerator は 1.3.0 で廃止予定です。 //! SortingMaterialIdGenerator か、独自に実装した MaterialIdGenerator を用いてください。 //! //! @param[in] allocator アロケータです。 //! //! @return 生成したマテリアルIDの生成クラスを返します。 //! NW_DEPRECATED_FUNCTION(IMaterialIdGenerator* Create(os::IAllocator* allocator)); private: Description m_Description; }; //! @brief マテリアルを受け取ります。 //! ここではマテリアルを配列に追加します。 //! //! @param[in] material マテリアルです。 //! virtual void Accept(Material* material) { bool isPushed = m_Materials.push_back(material); NW_ASSERT(isPushed); } //! @brief マテリアルIDを生成します。 virtual void Generate(); //@} private: //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! コンストラクタです。 RelativeHashMaterialIdGenerator( os::IAllocator* allocator, bool isForceGeneration, MaterialArray materials) : IMaterialIdGenerator(allocator), m_IsForceGeneration(isForceGeneration), m_Materials(materials) {} //@} NW_INLINE u32 CompareHash(u32 materialHash, MaterialOrder order); static const u32 m_DefaultHashes[]; bool m_IsForceGeneration; MaterialArray m_Materials; }; } // namespace gfx } // namespace nw #endif // NW_GFX_RELATIVEHASHMATERIALIDGENERATOR_H_