// managerrendercommand.h #ifndef _3DRENDERER_MANAGERRENDERCOMMAND_H_ #define _3DRENDERER_MANAGERRENDERCOMMAND_H_ #include "managerbase.h" #include "rendercommand.h" /*----------------------------------------------------------------------------- // RenderCommand °ü·Ã //----------------------------------------------------------------------------- »ç¿ë °ü·Ã: >¿ì¼±¼øÀ§ ¼³Á¤ ¿¹) RenderCommand::SetSortPriority(0, ESP_DEPTH); RenderCommand::SetSortPriority(1, ESP_BUFFER); >Ãß°¡Çϱâ 1) St_RenderCommand* pRC = AllocRender() Ãß°¡½ÃÄѼ­ ÇØ´ç Æ÷ÀÎÅ͸¦ ¾ò´Â´Ù. 2) pRC->... °ªÀ» ä¿ö³Ö´Â´Ù. 3) AddRender( pRC)¸¦ È£ÃâÇÏ¿© Ãß°¡½ÃŲ´Ù. 1) - 3) ¹Ýº¹ >±×¸®±â 1) SortRender() È£ÃâÇØ¼­ ÀûÀýÈ÷ ¼ÒÆ®½ÃŲ´Ù. 2) GetNumberOfRender()¸¸Å­ÀÇ À妽º¸¦ °¡Áö°í GetRender(À妽º)¸¦ ÅëÇØ Æ÷ÀÎÅ͸¦ ¾ò¾î¼­ New_RealizeRenderCommmandÀÇ È£ÃâÇÑ´Ù. 3) GetNumberOfAlphaRender()¸¸Å­ÀÇ À妽º¸¦ °¡Áö°í GetAlphaRender(À妽º)¸¦ ÅëÇØ Æ÷ÀÎÅ͸¦ ¾ò¾î¼­ New_RealizeRenderCommmandÀÇ È£ÃâÇÑ´Ù. 4) ClearRender()¸¦ È£ÃâÇØ¼­ ÇöÀç Á¤º¸¸¦ ¸ðµÎ Áö¿î´Ù. --------------------------------------------------------------------------------*/ class CManagerRenderCommand : public CManagerBase { public: ///< »ý¼ºÀÚ/¼Ò¸êÀÚ CManagerRenderCommand(); virtual ~CManagerRenderCommand(); ///< CManagerBaseÀÇ ±âº» ÇÔ¼ö virtual void Clear(); virtual BOOL Create( CDrawBase *pParentDraw, void *pParam); virtual void Destroy(); public: ///< ±íÀÌ¿¡ µû¸¥ ¾ËÆÄ ¼ÒÆ®¸¦ Á¦¿ÜÇÏ°í ¼ÒÆ®¸¦ »ç¿ëÇÒ Áö ¼³Á¤ÇÑ´Ù, default: TRUE virtual void SetSort( BOOL bUse) { m_bUseSort = bUse; } virtual BOOL IsSort() const { return m_bUseSort; } ///< ¾ËÆÄ ¿ÀºêÁ§Æ®¸¦ ¼ÒÆ®¸¦ ÇÏÁö ¾Êµµ·Ï ¼³Á¤, default : TRUE; virtual void SetAlphaSort( BOOL bUse) { m_bUseAlphaSort = bUse; } virtual BOOL IsAlphaSort() const { return m_bUseAlphaSort; } ///< ¼ÒÆÃ ¿ì¼± ¼øÀ§¸¦ ¼³Á¤ÇÑ´Ù. enum { MAX_NUM_PRIORITY = NUM_ESP-1 }; // RenderCommand Á¤º¸¸¦ ¼ÒÆ®Çϴµ¥ ¿ì¼± ¼øÀ§¸¦ °áÁ¤ÇÑ´Ù. virtual void SetSortPriority( int iPriority, ENUM_SORT_PRIORITY eSp); virtual ENUM_SORT_PRIORITY GetSortPriority( int iPriority); public: ///< RenderCommand Manager ÇÔ¼ö ------------------------------------------------- ///< RenderCommandÀÇ ºó°ø°£ ÇÒ´ç ÇÔ¼ö St_RenderCommand* AllocRender(); St_TriRenderCommand* AllocTriRender( St_TriRenderCommand::ENUM_TRI_RENDERCOMMAND_TYPE eTriType); St_SpriteRenderCommand* AllocSpriteRender(); St_NewSpriteRenderCommand* AllocNewSpriteRender(); St_InstancingRenderCommand* AllocInstancingRender(); St_InstancingInfo* AllocInstancingInfo( St_InstancingRenderCommand* pIRC); public: ///< ±âº» ·»´õ¸µ Ãß°¡ ÇÔ¼ö virtual void AddRender( St_BaseRenderCommand* pBaseRC); ///< ¿É¼Ç¿¡ µû¶ó ÀûÀýÈ÷ ¼ÒÆ®ÇÏ´Â ÇÔ¼ö virtual void SortRender(); ///< Ãß°¡µÈ ·»´õ¸µ Á¤º¸¸¦ 0 Ä«¿îÆ® ½ÃŲ´Ù virtual void ClearRender(); ///< Ãß°¡µÈ ·»´õ¸µ Á¤º¸¸¦ ¾ò°Å³ª ±× °¹¼ö¸¦ ¾ò´Â ÇÔ¼ö // Çϳª¶óµµ ·»´õ¸µ Á¤º¸°¡ ÀÖ´ÂÁö À¯¹« BOOL IsRenderCommand(); int GetNumberOfRender() { return m_arRenderCmd.GetCount(); } int GetNumberOfAlphaRender() { return m_arAlphaRenderCmd.GetCount(); } int GetNumberOfLastAlphaRender() { return m_arLastAlphaRenderCmd.GetCount(); } int GetNumberOfZAlphaRender() { return m_arZAlphaRenderCmd.GetCount(); } St_BaseRenderCommand* GetRender( int iIndex) { return m_arRenderCmd.Get( iIndex); } St_BaseRenderCommand* GetAlphaRender( int iIndex) { return m_arAlphaRenderCmd.Get( iIndex); } St_BaseRenderCommand* GetLastAlphaRender( int iIndex) { return m_arLastAlphaRenderCmd.Get( iIndex); } St_BaseRenderCommand* GetZAlphaRender( int iIndex) { return m_arZAlphaRenderCmd.Get( iIndex); } public: int GetNumberOfMotionBlur() { return m_arMotionBlur.GetCount(); } int GetNumberOfRefraction() { return m_arRefraction.GetCount(); } int GetNumberOfGlow() { return m_arGlow.GetCount(); } int GetNumberOfHaze() { return m_arHaze.GetCount(); } int GetNumberOfRefractionMask() { return m_arRefractionMask.GetCount(); } St_BaseRenderCommand* GetMotionBlur( int iIndex) { return m_arMotionBlur.Get( iIndex); } St_BaseRenderCommand* GetRefraction( int iIndex) { return m_arRefraction.Get( iIndex); } St_BaseRenderCommand* GetGlow( int iIndex) { return m_arGlow.Get( iIndex); } St_BaseRenderCommand* GetHaze( int iIndex) { return m_arHaze.Get( iIndex); } St_BaseRenderCommand* GetRefractionMask( int iIndex) { return m_arRefractionMask.Get( iIndex); } int GetNumberOfInstancing() { return m_arInstancingRenderCmd.GetCount(); } int GetNumberOfInstancingAlpha() { return m_arInstancingAlphaRenderCmd.GetCount(); } St_BaseRenderCommand* GetInstancing( int iIndex) { return m_arInstancingRenderCmd.Get( iIndex); } St_BaseRenderCommand* GetInstancingAlpha( int iIndex) { return m_arInstancingAlphaRenderCmd.Get( iIndex); } public: int GetNumberOfShadow() { return m_arShadowRenderCmd.GetCount(); } St_RenderCommand* GetShadow( int iIndex) { return m_arShadowRenderCmd.Get( iIndex); } St_RenderCommand** GetShadowArray() { return m_arShadowRenderCmd.GetBufferPtr(); } protected: void SortByDepth( St_BaseRenderCommand** pArray, int iCount, BOOL bFrontToBack=TRUE) const; void SortByBuffer( St_BaseRenderCommand** pArray, int iCount) const; void SortByTexture( St_BaseRenderCommand** pArray, int iCount) const; void SortByRenderState( St_BaseRenderCommand** pArray, int iCount) const; static int CompareF( LPCVOID l, LPCVOID r); static int CompareDW( LPCVOID l, LPCVOID r); protected: //< ¸É¹ö º¯¼öµé ---------------------------------------------------------- BOOL m_bUseSort; BOOL m_bUseAlphaSort; ///< ¸Þ¸ð¸® ÇÒ´ç °ü·Ã º¯¼öµé int m_iAllocRenderCmd; int m_iAllocTriRenderCmd; int m_iAllocSpriteRenderCmd; int m_iAllocNewSpriteRenderCmd; int m_iAllocInstancingRenderCmd; CWzArray m_arAllocRenderCmd; CWzArray m_arAllocTriRenderCmd; CWzArray m_arAllocSpriteRenderCmd; CWzArray m_arAllocNewSpriteRenderCmd; CWzArray m_arAllocInstancingRenderCmd; ///< ºÐ·ùµÈ ·»´õ¸µ º¯¼öµé CWzArray m_arRenderCmd; CWzArray m_arZAlphaRenderCmd;// Z-Write Disabled CWzArray m_arAlphaRenderCmd; CWzArray m_arLastAlphaRenderCmd; CWzArray m_arMotionBlur; CWzArray m_arRefraction; CWzArray m_arGlow; CWzArray m_arHaze; CWzArray m_arRefractionMask; CWzArray m_arInstancingRenderCmd; CWzArray m_arInstancingAlphaRenderCmd; CWzArray m_arShadowRenderCmd; ENUM_SORT_PRIORITY m_aiSortPriority[MAX_NUM_PRIORITY]; ///< Instancing ¿ë RenderCommand Ãß°¡ protected: void AddRCForInstancing( St_RenderCommand* pRC, BOOL bAlphaRender ); ///< Ư¼öÇÑ ÁöÇü ·»´õ¸µ public: enum ENUM_RENDER_TERRAIN_ETCS { ERTE_SHADOWMAP = 0, ERTE_WATER, ERTE_GLOW, ERTE_NUM }; virtual void AddRenderTerrainEtcs( ENUM_RENDER_TERRAIN_ETCS eRender) { m_abRenderTerrainEtcs[eRender] = TRUE; } virtual BOOL IsRenderTerrainEtcs( ENUM_RENDER_TERRAIN_ETCS eRender) const { return m_abRenderTerrainEtcs[eRender]; } protected: BOOL IsRenderTerrainEtcs() const; BOOL m_abRenderTerrainEtcs[ERTE_NUM]; }; // inline inline void CManagerRenderCommand::SetSortPriority( int iPriority, ENUM_SORT_PRIORITY eSp) { WzAssert( iPriority < MAX_NUM_PRIORITY); m_aiSortPriority[iPriority] = eSp; } inline ENUM_SORT_PRIORITY CManagerRenderCommand::GetSortPriority( int iPriority) { WzAssert( iPriority < MAX_NUM_PRIORITY); return m_aiSortPriority[iPriority]; } #endif // _3DRENDERER_MANAGERRENDERCOMMAND_H_