// managerposteffect.h #ifndef _3DRENDERER_MANAGERPOSTEFFECT_H_ #define _3DRENDERER_MANAGERPOSTEFFECT_H_ #include "managerbase.h" #include "managervertexshader.h" #include "managerpixelshader.h" // Post Effect Type #define PET_GLOW ( 0x00000001 ) #define PET_MOTION_BLUR ( 0x00000002 ) #define PET_GRAYSCALE ( 0x00000004 ) #define PET_REFRACTION ( 0x00000008 ) #define PET_UNIT_MOTIONBLUR ( 0x00000010 ) #define PET_DEPTH_OF_FIELD ( 0x00000020 ) #define PET_VOLUME_LIGHT ( 0x00000040 ) struct St_PE_BLUR { int m_iBlurCount; //ºí·¯ Ƚ¼ö float m_fMinLuminance; //Àû¿ëÇÒ ÃÖ¼Ò Èñµµ 0.0~1.0 float m_fSelectHighLight; //¼±ÅÃµÈ »ö±ò HighLight·® WzColor m_wcSelectColor; //Àû¿ëÇÒ »ö»ó float m_fFinalColorBlend; //¿¬»ê ¸¶Á÷¸·¿¡ ¾ó¸¶¸¸Å­ Àû¿ë ÇÒ²«Áö. float m_fOriginalColorBlend; //¿øº»À̹ÌÁö Àû¿ë ºñÀ² }; // ¹öÆÛ Á¤º¸ typedef struct St_PEFrameBufferList { int m_iNumBuffer; int m_iCurrent; HANDLE *m_phBuffer; WORD *m_pwBufferStatus; } St_PEFrameBufferList; enum ENUM_FB_SIZE { FBS_FULL = 0, FBS_HALF, NUM_FBS }; enum ENUM_PE_STEP // Post Effect ÁøÇà ´Ü°è { PS_AFTER_INITIATE = 0, PS_AFTER_APPLY_BEFORE, PS_TO_MAKE_LAST_RESULT, PS_AFTER_APPLY_STEP_BY_STEP, PS_AFTER_APPLY_AFTER, }; class CManagerPostEffect : public CManagerBase { public: CManagerPostEffect(void); virtual ~CManagerPostEffect(void); virtual void Clear(); virtual BOOL Create( CDrawBase *pParentDraw, void *pParam); virtual void Destroy(); virtual void OnLostDevice(); virtual void OnResetDevice(); virtual BOOL Initiate(); // PostEffect 󸮸¦ À§ÇÑ Áغñ (³»ºÎ È£ÃâµÊ) virtual void Apply(); // PostEffect Àû¿ë (¿ÜºÎ È£Ãâ °¡´É) protected: virtual void Apply_Before(); // Àü ´Ü°è virtual void Apply_After(); // ÈÄ ´Ü°è virtual void ApplyStepByStep(); // ¿©·¯ PostEffect ¸¦ ´Ü°èº° Àû¿ë // ³»ºÎ »óÅ protected: BOOL m_bHardwareSupport; // Hardware °¡ Àû¿ëÇÏ´ÂÁö ¿©ºÎ BOOL m_bApplied; // Àû¿ëµÇ¾ú´ÂÁö ¿©ºÎ BOOL m_bFogWasEnabled; // PostEffect ¿ÜºÎ¿¡¼­ Fog °¡ ÄÑÁ®ÀÖ¾ú´ÂÁö ¿©ºÎ ENUM_PE_STEP m_ePEStep; // ÇöÀç ÁøÇà ´Ü°è public: ENUM_PE_STEP GetPEStep() { return ( m_ePEStep); } // Post Effect Mode protected: DWORD m_dwPostEffectMode, m_dwPostEffectModeToBe; public: virtual void TurnOnPostEffect( DWORD dwPostEffectMode); virtual void TurnOffPostEffect( DWORD dwPostEffectMode); virtual BOOL IsPostEffectTurnedOn( DWORD dwPostEffectMode) { return ( dwPostEffectMode == ( dwPostEffectMode & m_dwPostEffectMode)); } virtual BOOL IsPostEffectGoingToBeTurnedOn( DWORD dwPostEffectMode) { return ( dwPostEffectMode == ( dwPostEffectMode & m_dwPostEffectModeToBe)); } virtual DWORD GetPostEffectMode() { return ( m_dwPostEffectMode); } // ¹öÆÛ ÇÒ´ç protected: St_PEFrameBufferList m_PEFrameBuffer[NUM_FBS]; BOOL CreateFrameBufferList(); void DestroyFrameBufferList(); HANDLE AssignFreeFrameBuffer( ENUM_FB_SIZE eSize); BOOL ReleaseFreeFrameBuffer( ENUM_FB_SIZE eSize, HANDLE hHandle); // ³»ºÎ ¹öÆÛµé ¹× ÀÎÀÚ protected: HANDLE m_hFrameBuffer; // Frame Buffer HANDLE m_hOldMotionBlurBuffer; // ÀÌÀü Frame ¿¡ »ý¼ºµÈ Motion Blur °á°ú HANDLE m_hCurrentUnitMotionBlurBuffer; // UnitMotionBlurÀ϶§ MotionBlurµÇ´Â Unit¸¸ À̰÷¿¡ ·»´õ HANDLE m_hTempBuffer; // m_hCurrentUnitMotionBlurBuffer°¡ ·»´õŸ°ÙÀÌ µÇ±â Àü¿¡ ·»´õŸ°ÙÀ» ÀúÀåÇϱâ À§ÇÑ Àӽà º¯¼ö float m_fDownFrameEpsilonHeight, m_fDownFrameEpsilonWidth, m_fFrameEpsilonHeight, m_fFrameEpsilonWidth; float m_fDownSampleWidth, m_fDownSampleHeight, m_fFrameWidth, m_fFrameHeight; long m_lLatestMotionBlurFrame; void CheckHardwareSupport(); HANDLE m_hTempRefractionMap; ENUM_CULL_FACE m_eOldCullFace; BOOL m_bOldTexture; ENUM_MESH_DRAW m_eOldMeshDraw; BOOL m_bZWrite; DWORD m_dwOldColorMask; HANDLE m_hOldRenderTarget; // --- °¢ È¿°úº° Parameter // Glow protected: St_PE_BLUR m_BlurAttribute; // DOF Members float m_fFocus; // Camera Æ÷Ä¿½Ì °Å¸® float m_fFocusRange; // Camera Æ÷Ä¿½Ì ¹üÀ§ float m_fFocusOutRange; // Camera Æ÷Ä¿½Ì ¾Æ¿ô ¹üÀ§ float m_fFocusInRange; // Camera Æ÷Ä¿½Ì ÀÎ ¹üÀ§ public: virtual void SetTechBlur(St_PE_BLUR* pnewBlur){m_BlurAttribute=*pnewBlur;} virtual St_PE_BLUR GetTechBlur() {return m_BlurAttribute;} void SetFocus(float fFocus) { m_fFocus = fFocus; } float GetFocus() { return m_fFocus; } void SetFocusRange(float fFocusRange) { m_fFocusRange = fFocusRange; } float GetFocusRange() { return m_fFocusRange; } void SetFocusOutRange(float fFocusOutRange) { m_fFocusOutRange = fFocusOutRange; } float GetFocusOutRange() { return m_fFocusOutRange; } void SetFocusInRange(float fFocusInRange) { m_fFocusInRange = fFocusInRange; } float GetFocusInRange() { return m_fFocusInRange; } // Motion Blur protected: float m_fMotionBlurRatio; public: virtual void SetMotionBlurRatio( float fRatio ){ m_fMotionBlurRatio = max( min( fRatio, 1.0f ), 0.0f ); } virtual float GetMotionBlurRatio(){ return m_fMotionBlurRatio; } // Gray Scale protected: WzColor m_wcGrayScaleColor; public: virtual void SetGrayScaleColor( WzColor wcColor) { m_wcGrayScaleColor = wcColor; } virtual WzColor GetGrayScaleColor() { return ( m_wcGrayScaleColor); } // Unit Motion Blur protected: float m_fUnitMotionBlurRatio; BOOL m_bUnitMotionBlurCalled; St_Camera m_stPrevCameraInfo; BOOL m_bFirstFrame; // ¸ð¼Çºí·¯ÀÇ Ã¹ ÇÁ·¹ÀÓÀÎÁö.. public: virtual void SetUnitMotionBlurRatio( float fRatio ){ m_fUnitMotionBlurRatio = max( min( fRatio, 1.0f ), 0.0f ); } virtual float GetUnitMotionBlurRatio(){ return m_fUnitMotionBlurRatio; } virtual void StartUnitMotionBlur(); virtual void EndUnitMotionBlur(); // Unit Glow protected: HANDLE m_hUnitGlowRT; public: virtual HANDLE GetUnitGlowRT(); virtual void FreeUnitGlowRT(); // --- Shader ¼¼ÆÃ protected: virtual void SetVS( ENUM_VERTEX_SHADER_TYPE evst, float *pfData = NULL, int iStartIdx = 0, int iVec4Count = 0) {} virtual void SetVSConst( float *pfData, int iStartIdx, int iVec4Count) {} virtual void SetPS( ENUM_PIXEL_SHADER_TYPE ePst, float *pfData = NULL, int iStartIdx = 0, int iVec4Count = 0) {} virtual void SetPSConst( float *pfData, int iStartIdx, int iVec4Count) {} virtual void SetConstant4RenderTexture(float fWidth,float fHeight) {} // --- Áß°£ ÇÔ¼ö protected: virtual void BlurStepN(int nthBlur, HANDLE hTarget, HANDLE hSource) {} virtual void Effect_End( HANDLE hFrameBuffer); // --- °¢ È¿°úº° protected: virtual void Glow_GetDownSampleFromOriginalScene( HANDLE hOriginalScene, HANDLE hGlowBuffer); virtual HANDLE Glow_MixAndMix( HANDLE hGlowBuffer); virtual void Glow_End( HANDLE hDestBuffer, HANDLE hFrameBuffer, HANDLE hGlowBuffer); virtual void MotionBlur_GetBlurredSampleFromOriginalScene( HANDLE hNewBlur, HANDLE hOldBlur, HANDLE hOriginalScene); virtual HANDLE MotionBlur_UpdatePrevImage( HANDLE hNewBlur, HANDLE hOldBlur); virtual void GrayScale_ConvertToGrayImage( HANDLE hTo, HANDLE hFrom); virtual void RenderDepthOfField( HANDLE hOriginalScene); virtual HANDLE UnitMotionBlur_Accumulate( HANDLE hCurrent, HANDLE hPrev, float fBlurRatio ); virtual void UnitMotionBlur_BlendOriginalAndPrevScene( HANDLE hNewBlur, HANDLE hOldBlur, HANDLE hOriginalScene); public: virtual BOOL BeginGeneratingRefrationMap(); // ÇÁ·¹ÀÓ¹öÆÛ 1/2 Â¥¸® ¹öÆÛ »ý¼º virtual HANDLE EndGeneratingRefrationMap(); // ÇÁ·¹ÀÓ¹öÆÛ 1/2 Â¥¸® ¹öÆÛ »ý¼º virtual void FreeRefrationMap( HANDLE hRefration) {} virtual void RenderWaterMask(){} virtual void RenderVolumeLight(){}; // --- ¿ÜºÎ È£Ãâ ÇÔ¼ö public: virtual void ApplyNow(); // Post Effect ¸¦ Áö±Ý Àû¿ëÇØ¼­ BackBuffer ¿¡ Àû¿ëµÇ¾îÀÖµµ·Ï ÇÔ virtual void FreeRestingBuffer(); // »ç¿ë ¾ÈµÇ°í ÀÖ´Â ¹öÆÛ ÇØÁ¦ }; #endif // _3DRENDERER_MANAGERPOSTEFFECT_H_