/*---------------------------------------------------------------------------* Project: NintendoWare File: gfx_UserRenderNode.h Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. 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. The content herein is highly confidential and should be handled accordingly. $Revision: $ *---------------------------------------------------------------------------*/ #ifndef NW_GFX_USERRENDERNODE_H_ #define NW_GFX_USERRENDERNODE_H_ #include #include namespace nw { namespace gfx { //--------------------------------------------------------------------------- //! @brief ユーザ定義の描画ノードのクラスです。 //--------------------------------------------------------------------------- class UserRenderNode : public TransformNode { private: NW_DISALLOW_COPY_AND_ASSIGN(UserRenderNode); public: NW_UT_RUNTIME_TYPEINFO; //! @brief 設定内容です。 struct Description : public TransformNode::Description { gfx::ResMaterial::TranslucencyKind translucencyKind; //!< 描画順の種類 u8 priority; //!< 描画優先度 u8 layerId; //!< 描画要素のソート時に最優先に区分される ID UserRenderCommand* userRenderCommand; //!< レンダーコマンドへのポインタ //! @brief コンストラクタです。 Description() : translucencyKind(nw::gfx::ResMaterial::TRANSLUCENCY_KIND_OPAQUE), priority(0), layerId(0), userRenderCommand(NULL) {} }; //---------------------------------------- //! @name 作成/破棄 //@{ //! @brief ユーザ定義の描画ノードを動的に構築するためのクラスです。 //! //! IsFixedSizeMemory の初期値は true です。false に変更すると、各種最大数の設定は無視されます。 class DynamicBuilder { public: //! @brief コンストラクタです。 DynamicBuilder() {} //! @brief デストラクタです。 ~DynamicBuilder() {} //! @brief 生成時以外にもメモリを確保するかどうかのフラグを設定します。 //! //! true を指定すると、生成時のみ固定サイズのメモリ確保を行います。 //! //! false を指定すると、生成時以外にも必要に応じて動的にメモリ確保が行われます。 DynamicBuilder& IsFixedSizeMemory(bool isFixedSizeMemory) { m_Description.isFixedSizeMemory = isFixedSizeMemory; return *this; } //! @brief 子の最大数を設定します。 DynamicBuilder& MaxChildren(int maxChildren) { m_Description.maxChildren = maxChildren; return *this; } //! @brief 管理できるコールバックの最大数を設定します。 DynamicBuilder& MaxCallbacks(int maxCallbacks) { m_Description.maxCallbacks = maxCallbacks; return *this; } //! @brief ユーザ定義の描画ノードを生成します。 //! //! @param[in] allocator アロケータです。 //! //! @return 生成したユーザ定義の描画ノードを返します。 //! UserRenderNode* Create(os::IAllocator* allocator); //! @brief 生成時に必要なメモリサイズを取得します。 //! //! メモリサイズは Builder の設定によって変化します。 //! すべての設定が終わった後にこの関数を呼び出してください。 //! //! @param[in] alignment 計算に用いるアライメントです。2 のべき乗である必要があります。 size_t GetMemorySize(size_t alignment = os::IAllocator::DEFAULT_ALIGNMENT) const { os::MemorySizeCalculator size(alignment); size += sizeof(UserRenderNode); GetMemorySizeForInitialize(&size, m_Description); return size.GetSizeWithPadding(alignment); } private: UserRenderNode::Description m_Description; }; //! @brief 生成時に必要なメモリサイズを取得します。 //! //! @param[in] description 設定内容です。 //! @param[in] alignment 計算に用いるアライメントです。2 のべき乗である必要があります。 static size_t GetMemorySize( Description description, size_t alignment = os::IAllocator::DEFAULT_ALIGNMENT) { os::MemorySizeCalculator size(alignment); GetMemorySizeInternal(&size, description); return size.GetSizeWithPadding(alignment); } //! @details :private static void GetMemorySizeInternal( os::MemorySizeCalculator* pSize, Description description) { os::MemorySizeCalculator& size = *pSize; size += sizeof(UserRenderNode); GetMemorySizeForInitialize(pSize, description); } //@} //---------------------------------------- //! @name 描画の設定 //@{ //! @brief 描画順の種類を設定します。 void SetTranslucencyKind(const gfx::ResMaterial::TranslucencyKind translucencyKind) { m_TranslucencyKind = translucencyKind; } //! @brief 描画順の種類を取得します。 // //! @return 描画順の種類です。 gfx::ResMaterial::TranslucencyKind GetTranslucencyKind() const { return m_TranslucencyKind; } //! @brief 描画優先度を設定します。 void SetPriority(const u8 priority) { m_Priority = priority; } //! @brief 描画優先度を取得します。 // //! @return 描画優先度です。 u8 GetPriority() const { return m_Priority; } //! @brief 描画要素のソート時に最優先に区分される ID を設定します。 void SetLayerId(const u8 layerId) { m_LayerId = layerId; } //! @brief 描画要素のソート時に最優先に区分される ID を取得します。 // //! @return 描画要素のソート時に最優先に区分される ID です。 u8 GetLayerId() const { return m_LayerId; } //! @brief ユーザの描画コマンドを設定します。 //! //! @param[in] userRenderCommand ユーザの描画コマンドです。 void SetUserRenderCommand(UserRenderCommand* userRenderCommand) { // 既にセットされている UserRenderCommand の UserRenderNode を解除します。 UserRenderCommand* lastUserRenderCommand = this->GetUserRenderCommand(); if ( lastUserRenderCommand != NULL ) { lastUserRenderCommand->SetUserRenderNode(NULL); } m_UserRenderCommand = userRenderCommand; userRenderCommand->SetUserRenderNode(this); } //! @brief ユーザの描画コマンドを取得します。 //! //! @return ユーザの描画コマンドへのポインタです。 UserRenderCommand* GetUserRenderCommand() const { return m_UserRenderCommand; } //---------------------------------------- //! @name シーンツリー //@{ //! @brief ビジターを受け付けます。 //! //! @param[in] visitor ビジターです。 //! virtual void Accept(ISceneVisitor* visitor); //@} protected: //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ //! @brief コンストラクタです。 UserRenderNode( os::IAllocator* allocator, const UserRenderNode::Description& description); //! @brief デストラクタです。 virtual ~UserRenderNode() { } //@} //! @brief Initialize() の実行に必要なメモリサイズを取得します。 //! //! @details :private static void GetMemorySizeForInitialize( os::MemorySizeCalculator* pSize, Description description) { NW_ASSERT(description.isFixedSizeMemory); return TransformNode::GetMemorySizeForInitialize(pSize, ResTransformNode(), description); } protected: gfx::ResMaterial::TranslucencyKind m_TranslucencyKind; u8 m_Priority; u8 m_LayerId; UserRenderCommand* m_UserRenderCommand; Description m_Description; }; } // namespace gfx } // namespace nw #endif // NW_GFX_USERRENDERNODE_H_