/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_Material.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: 28677 $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_MATERIAL_H_ #define NW_GFX_MATERIAL_H_ #include #include #include #include namespace nw { namespace gfx { class Model; class AnimGroup; //--------------------------------------------------------------------------- //! @brief マテリアルを表すクラスです。 //! //! マテリアルに対して、アニメーション後に生成時の状態に戻したい場合、Bufferを使用する必要があります。 //--------------------------------------------------------------------------- class Material : public SceneObject { private: NW_DISALLOW_COPY_AND_ASSIGN(Material); public: NW_UT_RUNTIME_TYPEINFO; //---------------------------------------- //! @name 作成 //@{ //! @brief リソースからマテリアルを生成します。 //! //! @param[in] resource リソースです。 //! @param[in] bufferCount 生成するマテリアルバッファの数です。 //! @param[in] parent マテリアルの親となるモデルクラスです。 //! @param[in] allocator アロケータです。 //! //! @return 生成されたマテリアルです。 //! static Material* Create( ResMaterial resource, s32 bufferCount, Model* parent, os::IAllocator* allocator); //! @brief 生成時に必要なメモリサイズを取得します。 //! //! @param[in] resource リソースです。 //! @param[in] bufferCount 生成するマテリアルバッファの数です。 //! @param[in] parent マテリアルの親となるモデルクラスです。 //! @param[in] alignment 計算に用いるアライメントです。2 のべき乗である必要があります。 static size_t GetMemorySize( ResMaterial resource, s32 bufferCount, bit32 bufferOption, size_t alignment = os::IAllocator::DEFAULT_ALIGNMENT) { os::MemorySizeCalculator size(alignment); GetMemorySizeInternal(&size, resource, bufferCount, bufferOption); return size.GetSizeWithPadding(alignment); } //! @details :private static void GetMemorySizeInternal( os::MemorySizeCalculator* pSize, ResMaterial resource, s32 bufferCount, bit32 bufferOption); //@} //---------------------------------------- //! @name 取得/設定 //@{ //! @brief オリジナルリソースを取得します。 ResMaterial GetOriginal() { return ResStaticCast(this->GetResSceneObject()); } //! @brief オリジナルリソースを取得します。 const ResMaterial GetOriginal() const { return ResStaticCast(this->GetResSceneObject()); } //! @brief 所有者となるモデルを取得します。 //! //! @return マテリアルの所有者のモデルです。 //! Model* GetOwnerModel() { return this->m_Owner; } //! @brief 所有者となるモデルを取得します。 //! //! @return マテリアルの所有者のモデルです。 //! const Model* GetOwnerModel() const { return this->m_Owner; } //! @brief リソースを設定します。 //! //! @param[in] description シェーダプログラムの詳細設定です。 //! void SetDescription(ResShaderProgramDescription description) { m_ProgramDescription = description; } //! @brief リソースを取得します。 //! //! @return シェーダプログラムの詳細設定です。 //! const ResShaderProgramDescription GetDescription() const { return m_ProgramDescription; } //@} //---------------------------------------- //! @name バッファオプション関連 //@{ //! @brief バッファの数を取得します。 int GetBufferCount() const { return this->m_Buffers.size(); } //! @brief バッファを取得します。 ResMaterial GetBuffer() { bool hasBuffer = (0 < m_BufferCount); if (hasBuffer) { return this->m_Buffers[0]; } else { return ResMaterial(NULL); } } //! バッファを取得します。 const ResMaterial GetBuffer() const { bool hasBuffer = (0 < m_BufferCount); if (hasBuffer) { return this->m_Buffers[0]; } else { return ResMaterial(NULL); } } //! 有効なシェーダーパラメータが取得できるマテリアルを取得します。 ResMaterial& GetShaderParameterResMaterial() { return m_ShaderParameterResMaterial; } //! 有効なシェーダーパラメータが取得できるマテリアルを取得します。 const ResMaterial& GetShaderParameterResMaterial() const { return m_ShaderParameterResMaterial; } //! 有効なシェーディングパラメータが取得できるマテリアルを取得します。 ResMaterial& GetShadingParameterResMaterial() { return m_ShadingParameterResMaterial; } //! 有効なシェーディングパラメータが取得できるマテリアルを取得します。 const ResMaterial& GetShadingParameterResMaterial() const { return m_ShadingParameterResMaterial; } //! 有効なマテリアルカラーが取得できるマテリアルを取得します。 ResMaterial& GetMaterialColorResMaterial() { return m_MaterialColorResMaterial; } //! 有効なマテリアルカラーが取得できるマテリアルを取得します。 const ResMaterial& GetMaterialColorResMaterial() const { return m_MaterialColorResMaterial; } //! 有効なラスタライゼーションが取得できるマテリアルを取得します。 ResMaterial& GetRasterizationResMaterial() { return m_RasterizationResMaterial; } //! 有効なラスタライゼーションが取得できるマテリアルを取得します。 const ResMaterial& GetRasterizationResMaterial() const { return m_RasterizationResMaterial; } //! 有効なテクスチャコーディネータが取得できるマテリアルを取得します。 ResMaterial& GetTextureCoordinatorResMaterial() { return m_TextureCoordinatorResMaterial; } //! 有効なテクスチャコーディネータが取得できるマテリアルを取得します。 const ResMaterial& GetTextureCoordinatorResMaterial() const { return m_TextureCoordinatorResMaterial; } //! 有効なテクスチャマッパーが取得できるマテリアルを取得します。 ResMaterial& GetTextureMapperResMaterial() { return m_TextureMapperResMaterial; } //! 有効なテクスチャマッパーが取得できるマテリアルを取得します。 const ResMaterial& GetTextureMapperResMaterial() const { return m_TextureMapperResMaterial; } //! 有効なフラグメントライティングが取得できるマテリアルを取得します。 ResMaterial& GetFragmentLightingResMaterial() { return m_FragmentLightingResMaterial; } //! 有効なフラグメントライティングが取得できるマテリアルを取得します。 const ResMaterial& GetFragmentLightingResMaterial() const { return m_FragmentLightingResMaterial; } //! 有効なフラグメントライティングテーブルが取得できるマテリアルを取得します。 ResMaterial& GetFragmentLightingTableResMaterial() { return m_FragmentLightingTableResMaterial; } //! 有効なフラグメントライティングテーブルが取得できるマテリアルを取得します。 const ResMaterial& GetFragmentLightingTableResMaterial() const { return m_FragmentLightingTableResMaterial; } //! 有効なテクスチャコンバイナが取得できるマテリアルを取得します。 ResMaterial& GetTextureCombinerResMaterial() { return m_TextureCombinerResMaterial; } //! 有効なテクスチャコンバイナが取得できるマテリアルを取得します。 const ResMaterial& GetTextureCombinerResMaterial() const { return m_TextureCombinerResMaterial; } //! 有効なアルファテストが取得できるマテリアルを取得します。 ResMaterial& GetAlphaTestResMaterial() { return m_AlphaTestResMaterial; } //! 有効なアルファテストが取得できるマテリアルを取得します。 const ResMaterial& GetAlphaTestResMaterial() const { return m_AlphaTestResMaterial; } //! 有効なフラグメントオペレーションが取得できるマテリアルを取得します。 ResMaterial& GetFragmentOperationResMaterial() { return m_FragmentOperationResMaterial; } //! 有効なフラグメントオペレーションが取得できるマテリアルを取得します。 const ResMaterial& GetFragmentOperationResMaterial() const { return m_FragmentOperationResMaterial; } //! 有効なシェーディングパラメータが取得できるマテリアルを取得します。 ResMaterial& GetSceneEnvironmentResMaterial() { return m_SceneEnvironmentResMaterial; } //! 有効なシーン環境の設定が取得できるマテリアルを取得します。 const ResMaterial& GetSceneEnvironmentResMaterial() const { return m_SceneEnvironmentResMaterial; } //@} protected: //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! コンストラクタです。 Material( os::IAllocator* allocator, ResMaterial resMaterial, s32 bufferCount, Model* parent); //! デストラクタです。 virtual ~Material(); //@} struct ResMaterialDestroyer : public std::unary_function { ResMaterialDestroyer(os::IAllocator* allocator = 0) : m_Allocator(allocator) {} result_type operator()(argument_type data) { DestroyResMaterial(m_Allocator, data); } os::IAllocator* m_Allocator; }; private: //! @brief メンバのメモリ確保と初期化を行います。 Result Initialize(os::IAllocator* allocator); //--------------------------------------------------------------------------- //! @brief バッファを作成します。 //! //! @param[in] allocator アロケータです。 //--------------------------------------------------------------------------- Result CreateBuffers(os::IAllocator* allocator); //--------------------------------------------------------------------------- //! @brief ResMaterialをコピーします。 //! //! @param[in] allocator アロケータです。 //! @param[in] bufferOption 生成オプションです。 //! //! @return コピーしたマテリアルとコピー結果を表すフラグを返します。 //--------------------------------------------------------------------------- ::std::pair CopyResMaterial( os::IAllocator* allocator, bit32 bufferOption); //--------------------------------------------------------------------------- //! @brief ResMaterial のリソースを破棄します。 //! //! @param[in] allocator リソース用のメモリを解放するアロケータです。 //! @param[in] resMaterial 解放するリソースです。 //--------------------------------------------------------------------------- static void DestroyResMaterial(os::IAllocator* allocator, ResMaterial resMaterial); //--------------------------------------------------------------------------- //! @brief ResFragmentShader のリソースを破棄します。 //! //! @param[in] allocator リソース用のメモリを解放するアロケータです。 //! @param[in] resFragmentShader 解放するリソースです。 //--------------------------------------------------------------------------- static void DestroyResFragmentShader( os::IAllocator* allocator, ResFragmentShader resFragmentShader); //--------------------------------------------------------------------------- //! @brief ResShaderParameter のリソースを破棄します。 //! //! @param[in] allocator リソース用のメモリを解放するアロケータです。 //! @param[in] resShaderParameter 解放するリソースです。 //--------------------------------------------------------------------------- static void DestroyResShaderParameter( os::IAllocator* allocator, ResShaderParameter resShaderParameter); //--------------------------------------------------------------------------- //! @brief リソースからフラグメントライティングテーブルをコピーします。 //! //! @param[in] allocator アロケータです。 //! @param[in] resFragmentLightingTable オリジナルのデータです。 //--------------------------------------------------------------------------- ::std::pair CopyResFragmentLightingTable( os::IAllocator* allocator, ResFragmentLightingTable resFragmentLightingTable); //--------------------------------------------------------------------------- //! @brief リソースからライティング参照テーブルをコピーします。 //! //! @param[in] allocator アロケータです。 //! @param[in] resLightingLookupTable オリジナルのデータです。 //--------------------------------------------------------------------------- ::std::pair CopyResLightingLookupTable( os::IAllocator* allocator, ResLightingLookupTable resLightingLookupTable); //! @brief アニメーション対象のリソースを取得します。 //! //! @param objectType 対応するタイプです。 //! @return バッファがあればバッファを、無ければオリジナルを返します。 //! ResMaterial GetActiveResource(u32 objectType) { return (CanUseBuffer(objectType)) ? GetBuffer() : GetOriginal(); } //! @brief アニメーションに登録するモデルデータのポインタを取得します。 void* GetAnimTargetObject(const anim::ResAnimGroupMember& anim, const ResMaterial resMaterial); // アニメーションのオブジェクトタイプに対応するバッファーが存在するかどうかを取得します。 bool CanUseBuffer(u32 objectType) const; typedef ut::MoveArray ResMaterialArray; ResMaterialArray m_Buffers; Model* m_Owner; ResShaderProgramDescription m_ProgramDescription; s32 m_BufferCount; ResMaterial m_ShaderParameterResMaterial; ResMaterial m_ShadingParameterResMaterial; ResMaterial m_MaterialColorResMaterial; ResMaterial m_RasterizationResMaterial; ResMaterial m_TextureCoordinatorResMaterial; ResMaterial m_TextureMapperResMaterial; ResMaterial m_FragmentLightingResMaterial; ResMaterial m_FragmentLightingTableResMaterial; ResMaterial m_TextureCombinerResMaterial; ResMaterial m_AlphaTestResMaterial; ResMaterial m_FragmentOperationResMaterial; ResMaterial m_SceneEnvironmentResMaterial; // TODO: CanUseBufferを非公開にするために暫定で対処しています。 friend class Model; }; //! @brief マテリアルの Array の定義です。 typedef ut::MoveArray MaterialArray; } // namespace gfx } // namespace nw #endif // NW_GFX_MATERIAL_H_