/* ==================================================================== * ÆÄ ÀÏ : RenderSystem.h * ¸ñ Àû : °ÔÀӺ긮¿À ±×·¡ÇÈ WrappingÀ̸鼭 ¸ðµç ·£´õ¸µ °ü¸®ÀÚ * ÀÛ ¼º ÀÚ : À̹ý¼® * ÀÛ ¼º ÀÏ : 2006.12 * * ÁÖÀÇ»çÇ× : * =================================================================== */ #pragma once #include "Renderer.h" class cAppWindow; class cFontAgent; class cLightAgent; class cFogAgent; class cSceneManager; class cBrightShader; const unsigned int DEFAULT_WIDTH = 1024; const unsigned int DEFAULT_HEIGHT = 768; const unsigned int DEFAULT_BPP = 32; class cPostProcess { public: cPostProcess(); ~cPostProcess(); bool Init( cRenderer* r ); void Recreate( cRenderer* r, unsigned int width, unsigned int height, unsigned char bpp ); void Render( cRenderer* r ); inline NiRenderTargetGroup* GetRenderTarget() { return mpRenderTargetGroup; } protected: void RenderImmediate( cRenderer* r ); protected: LPDIRECT3DVERTEXDECLARATION9 mVertexDeclaration; LPDIRECT3DVERTEXBUFFER9 mPosCoordBuffer; LPDIRECT3DVERTEXBUFFER9 mTexCoordBuffer; NiRenderedTexturePtr mpRenderedTexture; NiRenderTargetGroupPtr mpRenderTargetGroup; public: cBrightShader* mShader; }; /// ·»´õ¸µ ½Ã½ºÅÛ class cRenderSystem { static cRenderSystem* mpSingleton; public: /// ´ÜÀÏü¸¦ ¸®ÅÏ static cRenderSystem* GetSingleton(); public: cRenderSystem( cAppWindow* pwindow ); ~cRenderSystem(); /// ·£´õ¸µ ¿É¼Ç struct sRenderOption { /// Window Width Height unsigned int Width; unsigned int Height; unsigned char Bpp; /// Gamebryo Option unsigned int Flags; /// ±×·¡ÇÈ Ä«µå unsigned int Adapter; /// µð¹ÙÀ̽º ¿É¼Ç NiDX9Renderer::DeviceDesc DevDesc; /// ¹öÆÛ Æ÷¸Ë NiDX9Renderer::FrameBufferFormat FBformat; /// Depth Stencil Æ÷¸Ë NiDX9Renderer::DepthStencilFormat DSformat; /// NiDX9Renderer::PresentationInterval Interval; /// NiDX9Renderer::SwapEffect Swapeffect; /// ¹öÆÛ ¸ðµå unsigned int FBmode; /// unsigned int Backbuffercount; /// unsigned int Refreshrate; sRenderOption() { Width = 1024; //= 1280; Height = 768; //= 1024; Bpp = 32; Flags = NiDX9Renderer::USE_FULLSCREEN | NiDX9Renderer::USE_STENCIL | NiDX9Renderer::USE_MULTITHREADED; Adapter = D3DADAPTER_DEFAULT; DevDesc = NiDX9Renderer::DEVDESC_PURE; FBformat = NiDX9Renderer::FBFMT_X8R8G8B8; DSformat = NiDX9Renderer::DSFMT_D24S8; Interval = NiDX9Renderer::PRESENT_INTERVAL_IMMEDIATE; Swapeffect = NiDX9Renderer::SWAPEFFECT_DISCARD; FBmode = NiDX9Renderer::FBMODE_LOCKABLE; // FBmode = NiDX9Renderer::FBMODE_MULTISAMPLES_4; Backbuffercount = 1; Refreshrate = NiDX9Renderer::REFRESHRATE_DEFAULT; } }; /// ÃʱâÈ­ bool Init(); /// Á¾·á void Exit(); bool RenderOnce( NiTexture* tex ); /// Àå¸é Ç¥Çö void Render(); /// ¿É¼Ç ¼³Á¤ÀÇ º¯°æ ¹× ÀåÄ¡ÀÇ Àç»ý¼º bool Reset( unsigned int width, unsigned int height, unsigned char bpp, bool winmode ); /// ÀåÄ¡ ¼Ò½Ç¿¡ ´ëÇÑ Ã³¸® ·çƾ void Invalidate(); void Restore(); inline void SetClearColor( NiColorA color ) { mClearColor = color; } /// ½ºÅ©¸° ¸ðµåÀÇ º¯°æ ·£´õ ¿É¼ÇÀÇ º¯°æ void ToggleFullScreenMode(); /// ·»´õ·¯ cRenderer* GetRenderer() const; /// ¿É¼Ç ÂüÁ¶ ÇÔ¼ö inline cAppWindow* GetWindowRef() { return mpWindowRef; } inline sRenderOption* GetOption() { return &mRenderOption; } inline unsigned int GetScreenWidth() { return mRenderOption.Width; } inline unsigned int GetScreenHeight() { return mRenderOption.Height; } inline unsigned char GetScreenBpp() { return mRenderOption.Bpp; } inline tArray* GetResolutionArr() { return &mResolutionArr; }; inline NiDX9AdapterDesc::ModeDesc* GetCurrentMode() { return mCurrentMode; } inline NiDX9AdapterDesc* GetCurrentAdapter() { return mCurrentAdapter; } /// ½ºÅ©¸° ¸ðµå°ª üũ inline const bool IsFullScreenMode() { return (mRenderOption.Flags & NiDX9Renderer::USE_FULLSCREEN)? true:false; } /// À©µµ¿ì ÇÚµéÀ» ȹµæÇÑ´Ù. HWND GetHWND(); bool mReCreateContinue; unsigned long mReCreateTime; void SetWorldRendering( bool set ) { mWorldRendering = set; } void SetBrightness( float br ); inline unsigned int GetMonitorWidth() { return mMonWidth; } inline unsigned int GetMonitorHeight() { return mMonHeight; } void SetMonitorDisplay( unsigned int width, unsigned int height, unsigned int bpp ); void ToggleVideoCapture(); void SaveScreenShot(); bool IsVideoCapturing(); /// post process protected: cPostProcess* mPostProcess; private: /// °ÔÀӺ긮¿À ·£´õ·¯¸¦ »ý¼ºÇÑ´Ù. bool CreateRenderer(); /// ÀåÄ¡¿¡ ´ëÇÑ ³ª¿­ bool EnumAdapters(); void EnumResolutions( unsigned int curWidth, unsigned int curheight, unsigned int curBpp, bool windowed ); void EnumMultisamples(); private: /// monitor resolution unsigned int mMonWidth; unsigned int mMonHeight; unsigned int mMonBpp; /// ·£´õ¸µ ¿É¼Ç sRenderOption mRenderOption; /// ·»´õ·¯ cRendererPtr mRenderer; /// À©µµ¿ì ÂüÁ¶ Æ÷ÀÎÅÍ cAppWindow* mpWindowRef; /// Font °ü¸® cFontAgent* mpFontAgent; /// ¶óÀÌÆ® °ü¸® cLightAgent* mpLightAgent; /// ¾È°³ °ü¸® cFogAgent* mpFogAgent; NiColorA mClearColor; /// ÀåÄ¡¿¡ ´ëÇÑ ³ª¿­ typedef tArray cArray; /// adapter and device cArray mAdapterArr; NiDX9AdapterDesc* mCurrentAdapter; NiDX9DeviceDesc* mCurrentDevice; /// mode cArray mResolutionArr; NiDX9AdapterDesc::ModeDesc* mCurrentMode; /// multi sample cArray mMultisampleArr; bool mWorldRendering; TCHAR mVideoPathName[MAX_PATH]; unsigned long mVideoCaptureTime; }; inline cRenderer* cRenderSystem::GetRenderer() const { return mRenderer; } inline cRenderSystem* cRenderSystem::GetSingleton() { return mpSingleton; } /// Àå¸é ³ëµå ºñ±³ ÇÔ¼öÀÚ /// ÇÈÅ· °Å¸®·Î ºñ±³ÇÑ´Ù. class cResolutionCompare { public: bool operator () ( const void* left, const void* right ) const { if( ((NiDX9AdapterDesc::ModeDesc*)left)->m_uiWidth > ((NiDX9AdapterDesc::ModeDesc*)right)->m_uiWidth ) { return false; } else if( ((NiDX9AdapterDesc::ModeDesc*)left)->m_uiWidth == ((NiDX9AdapterDesc::ModeDesc*)right)->m_uiWidth ) { if( ((NiDX9AdapterDesc::ModeDesc*)left)->m_uiHeight > ((NiDX9AdapterDesc::ModeDesc*)right)->m_uiHeight ) { return false; } else if( ((NiDX9AdapterDesc::ModeDesc*)left)->m_uiHeight == ((NiDX9AdapterDesc::ModeDesc*)right)->m_uiHeight ) { if( ((NiDX9AdapterDesc::ModeDesc*)left)->m_uiBPP >= ((NiDX9AdapterDesc::ModeDesc*)right)->m_uiBPP ) return false; else return true; } else return true; } else return true; }; }; #define RENDERSYS cRenderSystem::GetSingleton()