// FullSceneEffect.cpp: implementation of the CFullSceneEffect class. // ////////////////////////////////////////////////////////////////////// #include "FullSceneEffect.h" #include "BaseGraphicsLayer.h" #include "SceneStateMgr.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// /* enum FULLSCENE_EFFECTS { FULLSCENE_MOTIONBLUR = 0, FULLSCENE_BRIGHT, FULLSCENE_BLACK, FULLSCENE_CONTRAST, FULLSCENE_LEVEL, FULLSCENE_GRAYLEVEL, FULLSCENE_EDGE, FULLSCENE_NEGATIVE, FULLSCENE_SEPIA, FULLSCENE_SOLAR, FULLSCENE_NUMS, }; #define FULLSCENE_BLURTEXNUM 6 #define FULLSCENE_BLURTEXSIZE 1024 class CFullSceneEffect { protected: LPDIRECT3DDEVICE8 m_pDevice; LPDIRECT3DTEXTURE8 m_pBlurTexture[FULLSCENE_BLURTEXNUM]; LPDIRECT3DSURFACE8 m_pBlurTextureSurf[FULLSCENE_BLURTEXNUM]; LPDIRECT3DTEXTURE8 m_pRenderTexture; LPDIRECT3DSURFACE8 m_pRenderTextureSurface; LPDIRECT3DSURFACE8 m_pRenderZSurface; LPDIRECT3DSURFACE8 m_pFrameBuffer; LPDIRECT3DSURFACE8 m_pFrameZBuffer; bool m_bFlag[FULLSCENE_NUMS]; public: void Init(LPDIRECT3DDEVICE8 lpDevice); void BeginRender(); void EndRender(); void Render(); void Update(); void SetFlag(int i,bool bFlag) { m_bFlag[i] = bFlag;} }; */ CFullSceneEffect::CFullSceneEffect() : m_pDevice(0),m_pRenderZSurface(0),m_pFrameBuffer(0),m_pFrameZBuffer(0) { for(int i = 0; i < FULLSCENE_BLURTEXNUM + 1; i++ ) { m_pRenderTexture[i] = NULL; m_pRenderTextureSurface[i] = NULL; } memset(m_bFlag,0,sizeof(bool) * FULLSCENE_NUMS); m_iFrameWidth = 0; m_iFrameHeight = 0; m_pVertexBuffer = NULL; m_iBlurTexUpdateFrame = 1; // BlurTex Update °£°Ý m_iBlurTexUpdateCount = 0; m_lstEffects.clear(); m_bPixelShader = false; m_iBlurFirstUpdate = -1; m_bFullSceneEffect = true; m_iRenderWidth = 0; m_iRenderHeight = 0; m_pRenderZSurface = NULL; m_pFrameBuffer = NULL; m_pFrameZBuffer = NULL; m_pVertexBuffer = NULL; m_iMaxCountNum = 0; m_pGaussianProp = NULL; } CFullSceneEffect::~CFullSceneEffect() { if(m_pGaussianProp) { delete[] m_pGaussianProp; m_pGaussianProp = NULL; } for(int i = 0; i < FULLSCENE_BLURTEXNUM + 1; i++ ) { if(m_pRenderTexture[i]) { m_pRenderTexture[i]->Release(); m_pRenderTexture[i] = NULL; } if(m_pRenderTextureSurface[i] ) { m_pRenderTextureSurface[i]->Release(); m_pRenderTextureSurface[i] = NULL; } } if(m_pRenderZSurface) { m_pRenderZSurface->Release(); m_pRenderZSurface = NULL; } if(m_pFrameBuffer) { m_pFrameBuffer->Release(); m_pFrameBuffer = NULL; } if(m_pFrameZBuffer) { m_pFrameZBuffer->Release(); m_pFrameZBuffer = NULL; } if(m_pVertexBuffer) { m_pVertexBuffer->Release(); m_pVertexBuffer = NULL; } for(i=0;i <(int)(m_lstEffects.size());i++) { if(m_lstEffects[i] != NULL) { delete m_lstEffects[i]; m_lstEffects[i] = NULL; } } m_lstEffects.clear(); } void CFullSceneEffect::Init(LPDIRECT3DDEVICE8 lpDevice,int iWidth,int iHeight) { m_iCurrentTextureNum = 0; m_iMaxCountNum = 0; if(m_bFullSceneEffect) { m_pDevice = lpDevice; m_pDevice->GetDeviceCaps(&m_pCaps); if(m_pCaps.PixelShaderVersion <= 1.0f) { m_bPixelShader = false; } else m_bPixelShader = true; m_pDevice->GetRenderTarget(&m_pFrameBuffer); D3DSURFACE_DESC FrameDecl; m_pFrameBuffer->GetDesc( &FrameDecl ); if(iWidth > -1) { m_iFrameWidth = iWidth; m_iFrameHeight = iHeight; } else { m_iFrameWidth = FrameDecl.Width; m_iFrameHeight = FrameDecl.Height; } D3DXCreateTexture(m_pDevice, m_iFrameWidth,m_iFrameHeight, 1, D3DUSAGE_RENDERTARGET, BaseGraphicsLayer::m_d3dpp.BackBufferFormat, D3DPOOL_DEFAULT , &m_pRenderTexture[0]); // Render Texture Surface Get m_pRenderTexture[0]->GetSurfaceLevel(0, &m_pRenderTextureSurface[0]); m_pRenderTextureSurface[0]->GetDesc( &FrameDecl ); int iTexWidth = FrameDecl.Width; int iTexHeight = FrameDecl.Height; /* if(BaseGraphicsLayer::GetGraphicCard() < 5) { if(iTexWidth > 1024 || iTexHeight > 1024) { // 1024 ÀÌ»óÀº ³Ê¹« ´À·ÁÁ®¼­ ¾µ¼ö ¾ø´Ù. m_bFullSceneEffect = false; if(m_pRenderTexture[0]) { m_pRenderTexture[0]->Release(); m_pRenderTexture[0] = NULL; } if(m_pRenderTextureSurface[0]) { m_pRenderTextureSurface[0]->Release(); m_pRenderTextureSurface[0] = NULL; } return; } } */ m_iRenderWidth = iTexWidth; m_iRenderHeight = iTexHeight; m_fPerTexelWidth = 1.0f / (float)m_iRenderWidth; m_fPerTexelHeight = 1.0f / (float)m_iRenderHeight; m_Woff = m_fPerTexelWidth / 2.0f; m_Hoff = m_fPerTexelHeight / 2.0f; for(int iBlur = 0;iBlur < FULLSCENE_BLURTEXNUM; iBlur++) { D3DXCreateTexture(m_pDevice, iTexWidth,iTexHeight, 1, D3DUSAGE_RENDERTARGET, BaseGraphicsLayer::m_d3dpp.BackBufferFormat, D3DPOOL_DEFAULT, &m_pRenderTexture[iBlur+1]); // Render Texture Surface Get m_pRenderTexture[iBlur+1]->GetSurfaceLevel(0, &m_pRenderTextureSurface[iBlur+1]); } //Depth Buffer Create m_pDevice->CreateDepthStencilSurface(iTexWidth, iTexHeight, BaseGraphicsLayer::m_d3dpp.AutoDepthStencilFormat, D3DMULTISAMPLE_NONE, &m_pRenderZSurface); // Frame Surface Backup m_pDevice->GetDepthStencilSurface(&m_pFrameZBuffer); m_pDevice->GetViewport(&m_FrameViewport); // ÇÊÅ͸µ ÇÒ¶§ °æ°è»öÀ» ÀÏÁ¤ÇÏ°Ô À¯Áö Çϱâ À§ÇØ ºó °ø¹é ÁØ´Ù. if(iWidth > -1) { m_RenderViewport.X = 0; m_RenderViewport.Y = 0; m_RenderViewport.Width = iTexWidth; m_RenderViewport.Height = iTexHeight; m_RenderViewport.MinZ = 0.0f; m_RenderViewport.MaxZ = 1.0f; } else { m_RenderViewport.X = 0 + 1; m_RenderViewport.Y = 0 + 1; m_RenderViewport.Width = iTexWidth - 2; m_RenderViewport.Height = iTexHeight- 2; m_RenderViewport.MinZ = 0.0f; m_RenderViewport.MaxZ = 1.0f; } m_ClearViewport.X = 0; m_ClearViewport.Y = 0; m_ClearViewport.Width = iTexWidth; m_ClearViewport.Height = iTexHeight; m_ClearViewport.MinZ = 0.0f; m_ClearViewport.MaxZ = 1.0f; CreateVertexBuffer(); m_iBlurTexUpdateFrame = 1; // BlurTex Update °£°Ý m_iBlurTexUpdateCount = 0; if(m_bPixelShader) { // Filter Init for(int i = 0; i < FULLSCENE_NUMS;i++ ) { CFullSceneShader *m_pShader = NULL; switch(i) { case FULLSCENE_BRIGHT: m_pShader = new CFullSceneShader("Brightness"); m_lstEffects.push_back(m_pShader); break; case FULLSCENE_BLACK: m_pShader = new CFullSceneShader("Black"); m_lstEffects.push_back(m_pShader); break; /* case FULLSCENE_CONTRAST: m_pShader = new CFullSceneShader("Contrast"); m_lstEffects.push_back(m_pShader); break;*/ /* case FULLSCENE_LEVEL: m_pShader = new CFullSceneShader("Levels"); m_lstEffects.push_back(m_pShader); break;*/ /* case FULLSCENE_GRAYLEVEL: m_pShader = new CFullSceneShader("LevelsGrayScale.psh"); m_lstEffects.push_back(m_pShader); break;*/ case FULLSCENE_EDGE: m_pShader = new CFullSceneShader("Edges"); m_lstEffects.push_back(m_pShader); break; case FULLSCENE_NEGATIVE: m_pShader = new CFullSceneShader("Negative"); m_lstEffects.push_back(m_pShader); break; case FULLSCENE_SEPIA: m_pShader = new CFullSceneShader("Sepia"); m_lstEffects.push_back(m_pShader); break; /* case FULLSCENE_SOLAR: m_pShader = new CFullSceneShader("Solarize"); m_lstEffects.push_back(m_pShader); break;*/ case FULLSCENE_EDGE2: m_pShader = new CFullSceneShader("Edge2"); m_lstEffects.push_back(m_pShader); break; case FULLSCENE_EDGE3: m_pShader = new CFullSceneShader("Edge3"); m_lstEffects.push_back(m_pShader); break; case FULLSCENE_SHARPEN: m_pShader = new CFullSceneShader("Sharpen"); m_lstEffects.push_back(m_pShader); break; case FULLSCENE_SATURATION: m_pShader = new CFullSceneShader("saturation"); m_lstEffects.push_back(m_pShader); break; case FULLSCENE_SATURATION2: m_pShader = new CFullSceneShader("saturation2"); m_lstEffects.push_back(m_pShader); break; case FULLSCENE_GLARE: m_pShader = new CFullSceneShader("Glare"); SetGlareValue(3); m_lstEffects.push_back(m_pShader); break; /* case FULLSCENE_BLUR: m_pShader = new CFullSceneShader("Blur.psh"); m_lstEffects.push_back(m_pShader); break; */ default: break; } } } } } void CFullSceneEffect::CreateVertexBuffer() { if(m_pVertexBuffer == NULL) { m_pDevice->CreateVertexBuffer(sizeof(TLVertex) * 4,D3DUSAGE_WRITEONLY,TLVERTEXFVF,D3DPOOL_MANAGED,&m_pVertexBuffer); } TLVertex *pVertex = NULL; m_pVertexBuffer->Lock(0,0,(BYTE **)&pVertex,0); pVertex[0].v.x=0.0f; pVertex[1].v.x=0.0f; pVertex[2].v.x=m_iFrameWidth; pVertex[3].v.x=m_iFrameWidth; pVertex[1].v.y=0.0f; pVertex[3].v.y=0.0f;// pVertex[0].v.y=m_iFrameHeight; pVertex[2].v.y=m_iFrameHeight; pVertex[0].tu=0.0f; pVertex[1].tu=0.0f; pVertex[3].tu=1.0f; pVertex[2].tu=1.0f; pVertex[1].tv=0.0f; pVertex[3].tv=0.0f; pVertex[0].tv=1.0f; pVertex[2].tv=1.0f; for(int i=0;i<4;i++) { pVertex[i].w=0.1f; pVertex[i].v.z=0.1f; pVertex[i].Diffuse.c=0xffffffff; pVertex[i].Specular.c=0xffffffff; } m_pVertexBuffer->Unlock(); } HRESULT CFullSceneEffect::BeginRender(DWORD dwClearColor) { if(m_bFullSceneEffect) { HRESULT hr = m_pDevice->SetRenderTarget(m_pRenderTextureSurface[m_iCurrentTextureNum], m_pRenderZSurface);//m_pFrameZBuffer); m_pDevice->SetViewport(&m_ClearViewport); m_pDevice->Clear( 0, NULL, D3DCLEAR_ZBUFFER|D3DCLEAR_TARGET, dwClearColor, 1.0f, 0 ); m_pDevice->SetViewport(&m_RenderViewport); return hr; } return 0; } HRESULT CFullSceneEffect::EndRender() { if(m_bFullSceneEffect) { HRESULT hr = m_pDevice->SetRenderTarget(m_pFrameBuffer, m_pFrameZBuffer); m_pDevice->SetViewport(&m_FrameViewport); return hr; } return 0; } void CFullSceneEffect::Render(int iValue,int iFrameWidth,int iFrameHeight,bool bUpdate) { if(m_bFullSceneEffect) { bool bUpdateBuffer = false; if(iFrameWidth != m_iFrameWidth && iFrameWidth > 0) { m_iFrameWidth = iFrameWidth; bUpdateBuffer = true; } if(iFrameHeight != m_iFrameHeight && iFrameHeight > 0) { m_iFrameHeight = iFrameHeight; bUpdateBuffer = true; } if(bUpdateBuffer == true) { CreateVertexBuffer(); } for (int i = 0; i < 4; ++i) { CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_MINFILTER, D3DTEXF_LINEAR); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_MIPFILTER, D3DTEXF_NONE); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); } CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE, FALSE); ///////////////// CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2); CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_TEXCOORDINDEX,0); CSceneStateMgr::_SetD3DTextureStageState(0 ,D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); CSceneStateMgr::_SetD3DRenderState(D3DRS_NORMALIZENORMALS,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_LOCALVIEWER,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_LIGHTING,FALSE); CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,FALSE); m_pDevice->SetVertexShader(TLVERTEXFVF); m_pDevice->SetStreamSource(0,m_pVertexBuffer,sizeof(TLVertex)); m_pDevice->SetTexture(0,m_pRenderTexture[m_iCurrentTextureNum]); CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE); if(m_bPixelShader) { // FullScene Filter for(i=1;i Apply(); else m_lstEffects[i - 1]->Apply(1); } } if(iValue == 1) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR, 0x66ffffff); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2); } if(m_bFlag[FULLSCENE_EDGE] == true || m_bFlag[FULLSCENE_EDGE2] == true || m_bFlag[FULLSCENE_EDGE3] == true || m_bFlag[FULLSCENE_SHARPEN] == true) { m_pDevice->SetTexture(1,m_pRenderTexture[m_iCurrentTextureNum]); m_pDevice->SetTexture(2,m_pRenderTexture[m_iCurrentTextureNum]); m_pDevice->SetTexture(3,m_pRenderTexture[m_iCurrentTextureNum]); } } else { m_pDevice->SetPixelShader(0); } // Render Scene m_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2); if(0)//m_bFlag[FULLSCENE_GLARE]) { CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE); m_pDevice->SetTexture(0,m_pRenderTexture[m_iCurrentTextureNum]); m_pDevice->SetTexture(1,m_pRenderTexture[m_iCurrentTextureNum]); m_pDevice->SetTexture(2,m_pRenderTexture[m_iCurrentTextureNum]); m_pDevice->SetTexture(3,m_pRenderTexture[m_iCurrentTextureNum]); for(int ik=0; ik < 4; ik++ ) { CSceneManager::GetDevice()->SetTextureStageState( ik, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP ); CSceneManager::GetDevice()->SetTextureStageState( ik, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP ); CSceneManager::GetDevice()->SetTextureStageState( ik, D3DTSS_MAGFILTER, D3DTEXF_POINT ); CSceneManager::GetDevice()->SetTextureStageState( ik, D3DTSS_MINFILTER, D3DTEXF_POINT ); CSceneManager::GetDevice()->SetTextureStageState( ik, D3DTSS_MIPFILTER, D3DTEXF_POINT ); } m_lstEffects[FULLSCENE_GLARE - 1]->SetOff(m_Woff,m_Hoff); ///////////////// float pix_mult[4][4]; float woff, hoff; float centw, centh; centw = m_fPerTexelWidth * 0.5f; centh = m_fPerTexelHeight * 0.5f; centw = 0.0f; centh = 0.0f; D3DXVECTOR4 vecOffset[4]; // 1st pass is opaque m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); // Additive blending when alphablend is enabled m_pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE ); m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR ); for( i=0; i < 1;/*m_vGaussian1D.size()*/ i += 4 ) { if( i == 4 ) { // switch to additive blending if > 1 pass - ie if // gaussian has more than 4 elements. m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); } for( int n=0; n < 4; n++ ) { FilterKernelElement * pE; pE = & ( m_vGaussian1D.at(i+n) ); pix_mult[n][0] = pE->coef * m_fColorAtemp; pix_mult[n][1] = pE->coef * m_fColorAtemp; pix_mult[n][2] = pE->coef * m_fColorAtemp; pix_mult[n][3] = pE->coef * m_fColorAtemp; woff = m_fPerTexelWidth * pE->du; hoff = m_fPerTexelHeight * pE->dv; vecOffset[n] = D3DXVECTOR4(centw + woff, centh + hoff, 0.0f, 0.0f ); } CSceneManager::GetDevice()->SetVertexShaderConstant(0, &vecOffset[0],1); CSceneManager::GetDevice()->SetVertexShaderConstant(1, &vecOffset[1],1); CSceneManager::GetDevice()->SetVertexShaderConstant(2, &vecOffset[2],1); CSceneManager::GetDevice()->SetVertexShaderConstant(3, &vecOffset[3],1); CSceneManager::GetDevice()->SetPixelShaderConstant(0, &pix_mult[0],1); CSceneManager::GetDevice()->SetPixelShaderConstant(1, &pix_mult[1],1); CSceneManager::GetDevice()->SetPixelShaderConstant(2, &pix_mult[2],1); CSceneManager::GetDevice()->SetPixelShaderConstant(3, &pix_mult[3],1); ///////////////// m_lstEffects[FULLSCENE_GLARE - 1]->Apply(1); m_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2); } CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE); } // FullScene MotionBlur if(m_bFlag[FULLSCENE_MOTIONBLUR] == true && (m_bFlag[FULLSCENE_BRIGHT] != true)) {//&&( m_bFlag[FULLSCENE_SATURATION] != true)) { // FullScene Filter if(m_bPixelShader) { for(i=1;i Apply(1); } } } else { m_pDevice->SetPixelShader(0); } CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); CSceneStateMgr::_SetD3DRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); CSceneStateMgr::_SetD3DRenderState(D3DRS_TEXTUREFACTOR, 0x66ffffff); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR); CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2); for(int iBlur = 0;iBlur < m_iMaxCountNum; iBlur++) { if(iBlur == m_iCurrentTextureNum) continue; m_pDevice->SetVertexShader(TLVERTEXFVF); m_pDevice->SetTexture(0,m_pRenderTexture[iBlur]); if(m_bPixelShader) { if(m_bFlag[FULLSCENE_EDGE] == true || m_bFlag[FULLSCENE_EDGE2] == true || m_bFlag[FULLSCENE_EDGE3] == true || m_bFlag[FULLSCENE_SHARPEN] == true) { m_pDevice->SetTexture(1,m_pRenderTexture[iBlur]); m_pDevice->SetTexture(2,m_pRenderTexture[iBlur]); m_pDevice->SetTexture(3,m_pRenderTexture[iBlur]); } } m_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2); } CSceneStateMgr::_SetD3DRenderState(D3DRS_ALPHABLENDENABLE,FALSE); } if(m_bPixelShader) { //Filter Pixel Shader Free for(i=1;i UnApply(); } } } for (i = 0; i < 4; ++i) { CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_DISABLE); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_MINFILTER, D3DTEXF_LINEAR); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP); CSceneStateMgr::_SetD3DTextureStageState(i, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP); } CSceneStateMgr::_SetD3DRenderState(D3DRS_FOGENABLE,TRUE); CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW); if(bUpdate) Update(); } } void CFullSceneEffect::Update() { m_iCurrentTextureNum++; m_iMaxCountNum++; if(m_iCurrentTextureNum >= FULLSCENE_BLURTEXNUM +1) m_iCurrentTextureNum = 0; if(m_iMaxCountNum >= FULLSCENE_BLURTEXNUM +1) m_iMaxCountNum = FULLSCENE_BLURTEXNUM +1; /* if(m_bFlag[FULLSCENE_MOTIONBLUR] == true) { m_iBlurTexUpdateCount++; if(m_iBlurTexUpdateCount == m_iBlurTexUpdateFrame) { // Update Blur Texture m_iBlurFirstUpdate++; m_iBlurTexUpdateCount = 0; D3DXLoadSurfaceFromSurface( m_pBlurTextureSurf[m_iCurrentBlurTex], NULL, NULL, m_pRenderTextureSurface, NULL, NULL, D3DX_DEFAULT, 0); m_iCurrentBlurTex++; if(m_iCurrentBlurTex >= FULLSCENE_BLURTEXNUM) m_iCurrentBlurTex = 0; if(m_iBlurFirstUpdate >= FULLSCENE_BLURTEXNUM) m_iBlurFirstUpdate = FULLSCENE_BLURTEXNUM; } } else { m_iCurrentBlurTex = 0; m_iBlurFirstUpdate = -1; }*/ } void CFullSceneEffect::SaveTexture(char *strFilename) { D3DXSaveTextureToFile(strFilename, D3DXIFF_DDS ,m_pRenderTexture[m_iCurrentTextureNum],NULL); } void CFullSceneEffect::SetGlareValue(int iGlareNum) { if(iGlareNum < 0 || iGlareNum > 6) iGlareNum = 3; if(m_pGaussianProp) delete[] m_pGaussianProp; m_pGaussianProp = new GaussianProp[2]; switch(iGlareNum) { /* case 0: m_nNumGaussiansInSingleBlur = 2; m_pGaussianProp[0].radius_scale = 0.18f; m_pGaussianProp[0].amp = 0.06f; m_pGaussianProp[1].radius_scale = 4.5f; m_pGaussianProp[1].amp = 0.11f; m_nGaussianSize = 27; // size of the Gaussian blur diameter in texels m_fColorAtten = 0.90f; m_nTexRes = 128; break; case 1: m_nNumGaussiansInSingleBlur = 2; m_pGaussianProp[0].radius_scale = 0.25f; m_pGaussianProp[0].amp = 0.06f; m_pGaussianProp[1].radius_scale = 3.0f; m_pGaussianProp[1].amp = 0.15f; m_nGaussianSize = 17; // size of the Gaussian blur diameter in texels m_fColorAtten = 1.60f; m_nTexRes = 128; break; case 2: // higher res render target & larger Flare // Code in the CreateGaussianBlur() also turns #2 into // a checkerboard pattern with gaps every 2 texels. m_nNumGaussiansInSingleBlur = 1; m_pGaussianProp[0].radius_scale = 0.5f; m_pGaussianProp[0].amp = 0.55f; m_nGaussianSize = 28; // size of the Gaussian blur diameter in texels m_fColorAtten = 0.379f; m_nTexRes = 256; break; */ case 3: // really big kernel m_iGaussianPass = 2; m_pGaussianProp[0].radius_scale = 0.18f; m_pGaussianProp[0].amp = 0.24f; m_pGaussianProp[1].radius_scale = 4.5f; m_pGaussianProp[1].amp = 0.41f; m_iGaussianSize = 44; m_fColorAtemp = 0.2f; break; /* case 4: // more of a uniform square block from each bright Flareing texel m_nNumGaussiansInSingleBlur = 1; m_pGaussianProp[0].radius_scale = 0.2f; m_pGaussianProp[0].amp = 0.3f; m_pGaussianProp[1].radius_scale = 4.5f; m_pGaussianProp[1].amp = 0.11f; m_nGaussianSize = 28; // size of the Gaussian blur diameter in texels m_fColorAtten = 0.33f; m_nTexRes = 256; break; case 5: m_nNumGaussiansInSingleBlur = 2; m_pGaussianProp[0].radius_scale = 0.11f; m_pGaussianProp[0].amp = 0.1f; m_pGaussianProp[1].radius_scale = 4.5f; m_pGaussianProp[1].amp = 0.11f; m_nGaussianSize = 21; // size of the Gaussian blur diameter in texels m_fColorAtten = 0.90f; m_nTexRes = 128; break; case 6: m_nNumGaussiansInSingleBlur = 1; m_pGaussianProp[0].radius_scale = 0.09f; m_pGaussianProp[0].amp = 0.3f; m_pGaussianProp[1].radius_scale = 4.5f; m_pGaussianProp[1].amp = 0.11f; m_nGaussianSize = 28; // size of the Gaussian blur diameter in texels m_fColorAtten = 0.90f; m_nTexRes = 256; */ } m_vGaussian.clear(); m_vGaussian1D.clear(); m_fGaussianValue = -0.1f; FilterKernelElement el; int u; float cent = (((float)m_iGaussianSize) - 1.0f ) / 2.0f; float coe; float radi; int remainder; int m; for( u=0; u < m_iGaussianSize; u++ ) { el.du = ((float)u) - cent + m_fGaussianValue; el.dv = 0.0f; radi = el.du * el.du / (cent * cent); el.coef = 0.0f; for( m=0; m < m_iGaussianPass; m++ ) { coe = radi * m_pGaussianProp[m].radius_scale; coe = (float) ( 1.0f / exp( coe ) ); el.coef += coe * m_pGaussianProp[m].amp; } m_vGaussian1D.push_back( el ); } el.du = 0.0f; el.dv = 0.0f; el.coef = 0.0f; remainder = m_vGaussian1D.size() % 4; remainder = ( 4 - remainder ) % 4; for( u = 0; u < remainder; u++ ) { m_vGaussian1D.push_back( el ); } } void CFullSceneEffect::LockCurrentRect(UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags) { if(m_pRenderTexture[m_iCurrentTextureNum]) m_pRenderTexture[m_iCurrentTextureNum]->LockRect(Level,pLockedRect,pRect,Flags); else pLockedRect = NULL; }