Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
762 lines
21 KiB
C++
762 lines
21 KiB
C++
// FullSceneEffect.cpp: implementation of the CFullSceneEffect class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "FullSceneEffect.h"
|
|
#include "BaseGraphicsLayer.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_pRenderTexture(0),m_pRenderTextureSurface(0),m_pRenderZSurface(0),m_pFrameBuffer(0),m_pFrameZBuffer(0)
|
|
{
|
|
|
|
for(int i = 0; i < FULLSCENE_BLURTEXNUM; i++ )
|
|
{
|
|
m_pBlurTexture[i] = NULL;
|
|
m_pBlurTextureSurf[i] = NULL;
|
|
|
|
}
|
|
|
|
memset(m_bFlag,0,sizeof(bool) * FULLSCENE_NUMS);
|
|
m_iFrameWidth = 0;
|
|
m_iFrameHeight = 0;
|
|
m_pVertexBuffer = NULL;
|
|
m_iCurrentBlurTex = 0;
|
|
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_pRenderTexture = NULL;
|
|
m_pRenderTextureSurface = NULL;
|
|
m_pRenderZSurface = NULL;
|
|
m_pFrameBuffer = NULL;
|
|
m_pFrameZBuffer = NULL;
|
|
|
|
m_pVertexBuffer = NULL;
|
|
|
|
|
|
|
|
}
|
|
|
|
CFullSceneEffect::~CFullSceneEffect()
|
|
{
|
|
for(int i = 0; i < FULLSCENE_BLURTEXNUM; i++ )
|
|
{
|
|
if(m_pBlurTexture[i]) {
|
|
m_pBlurTexture[i]->Release();
|
|
m_pBlurTexture[i] = NULL;
|
|
}
|
|
if(m_pBlurTextureSurf[i]) {
|
|
m_pBlurTextureSurf[i]->Release();
|
|
m_pBlurTextureSurf[i] = NULL;
|
|
}
|
|
}
|
|
if(m_pRenderTexture) {
|
|
m_pRenderTexture->Release();
|
|
m_pRenderTexture = NULL;
|
|
}
|
|
if(m_pRenderTextureSurface) {
|
|
m_pRenderTextureSurface->Release();
|
|
m_pRenderTextureSurface = 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)
|
|
{
|
|
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 );
|
|
|
|
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);
|
|
|
|
// Render Texture Surface Get
|
|
m_pRenderTexture->GetSurfaceLevel(0, &m_pRenderTextureSurface);
|
|
m_pRenderTextureSurface->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) {
|
|
m_pRenderTexture->Release();
|
|
m_pRenderTexture = NULL;
|
|
}
|
|
if(m_pRenderTextureSurface) {
|
|
m_pRenderTextureSurface->Release();
|
|
m_pRenderTextureSurface = NULL;
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
|
|
m_iRenderWidth = iTexWidth;
|
|
m_iRenderHeight = iTexHeight;
|
|
|
|
for(int iBlur = 0;iBlur < FULLSCENE_BLURTEXNUM; iBlur++) {
|
|
|
|
D3DXCreateTexture(m_pDevice, iTexWidth, iTexHeight, 1,
|
|
0, BaseGraphicsLayer::m_d3dpp.BackBufferFormat,
|
|
D3DPOOL_DEFAULT, &m_pBlurTexture[iBlur]);
|
|
|
|
m_pBlurTexture[iBlur]->GetSurfaceLevel(0,&m_pBlurTextureSurf[iBlur]);
|
|
|
|
}
|
|
//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);
|
|
// ÇÊÅ͸µ ÇÒ¶§ °æ°è»öÀ» ÀÏÁ¤ÇÏ°Ô À¯Áö Çϱâ À§ÇØ ºó °ø¹é ÁØ´Ù.
|
|
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_iCurrentBlurTex = 0;
|
|
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_BLUR:
|
|
m_pShader = new CFullSceneShader("Blur.psh");
|
|
m_lstEffects.push_back(m_pShader);
|
|
break;
|
|
*/
|
|
default:
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
void CFullSceneEffect::CreateVertexBuffer()
|
|
{
|
|
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_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::RenderMulti(CFullSceneEffect *pEffect)
|
|
{
|
|
if(m_bFullSceneEffect) {
|
|
|
|
for (int i = 0; i < 4; ++i)
|
|
{
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MIPFILTER, D3DTEXF_NONE);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|
}
|
|
m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
|
|
m_pDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
|
|
|
|
|
|
/////////////////
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
m_pDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2);
|
|
m_pDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
|
|
|
|
|
|
m_pDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,0);
|
|
m_pDevice->SetTextureStageState(0 ,D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
|
|
|
|
m_pDevice->SetRenderState(D3DRS_NORMALIZENORMALS,FALSE);
|
|
m_pDevice->SetRenderState(D3DRS_LOCALVIEWER,FALSE);
|
|
m_pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
|
|
m_pDevice->SetRenderState(D3DRS_FOGENABLE,FALSE);
|
|
|
|
m_pDevice->SetVertexShader(TLVERTEXFVF);
|
|
m_pDevice->SetStreamSource(0,m_pVertexBuffer,sizeof(TLVertex));
|
|
|
|
m_pDevice->SetTexture(0,m_pRenderTexture);
|
|
|
|
// FullScene Filter
|
|
for(i=1;i <FULLSCENE_NUMS; i++ ) {
|
|
if(m_bFlag[i] == true)
|
|
{
|
|
m_lstEffects[i - 1]->Apply();
|
|
|
|
}
|
|
}
|
|
// if(m_bFlag[FULLSCENE_BLACK] != true)
|
|
// {
|
|
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
// }
|
|
|
|
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_pDevice->SetTexture(2,m_pRenderTexture);
|
|
m_pDevice->SetTexture(3,m_pRenderTexture);
|
|
|
|
}
|
|
|
|
// Render Scene
|
|
m_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
|
|
if(pEffect) {
|
|
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
|
|
m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
|
m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
|
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, 0x66ffffff);
|
|
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2);
|
|
|
|
pEffect->Render(1);
|
|
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
}
|
|
|
|
// FullScene MotionBlur
|
|
if(m_bFlag[FULLSCENE_MOTIONBLUR] == true && (m_bFlag[FULLSCENE_BRIGHT] != true) ) {//&&( m_bFlag[FULLSCENE_SATURATION] != true)) {
|
|
|
|
// FullScene Filter
|
|
for(i=1;i <FULLSCENE_NUMS; i++ ) {
|
|
if(m_bFlag[i] == true)
|
|
{
|
|
m_lstEffects[i - 1]->Apply(1);
|
|
|
|
}
|
|
}
|
|
|
|
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
|
|
m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
|
m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
|
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, 0x66ffffff);
|
|
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2);
|
|
|
|
for(int iBlur = 0;iBlur < FULLSCENE_BLURTEXNUM; iBlur++) {
|
|
m_pDevice->SetVertexShader(TLVERTEXFVF);
|
|
|
|
m_pDevice->SetTexture(0,m_pBlurTexture[iBlur]);
|
|
// FullScene Edge Filter
|
|
/* if(m_bFlag[FULLSCENE_EDGE] == true) {
|
|
m_pDevice->SetTexture(1,m_pBlurTexture[iBlur]);
|
|
m_pDevice->SetTexture(2,m_pBlurTexture[iBlur]);
|
|
|
|
}*/
|
|
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_pBlurTexture[iBlur]);
|
|
m_pDevice->SetTexture(2,m_pBlurTexture[iBlur]);
|
|
m_pDevice->SetTexture(3,m_pBlurTexture[iBlur]);
|
|
|
|
}
|
|
|
|
|
|
m_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
|
|
}
|
|
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
}
|
|
//Filter Pixel Shader Free
|
|
for(i=1;i <FULLSCENE_NUMS; i++ ) {
|
|
if(m_bFlag[i] == true)
|
|
{
|
|
m_lstEffects[i - 1]->UnApply();
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < 4; ++i)
|
|
{
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
|
|
}
|
|
|
|
m_pDevice->SetRenderState(D3DRS_FOGENABLE,TRUE);
|
|
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
|
|
|
|
|
|
Update();
|
|
}
|
|
|
|
}
|
|
void CFullSceneEffect::Render(int iValue) {
|
|
if(m_bFullSceneEffect) {
|
|
|
|
for (int i = 0; i < 4; ++i)
|
|
{
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MIPFILTER, D3DTEXF_NONE);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|
}
|
|
m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
|
|
m_pDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
|
|
|
|
|
|
/////////////////
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
|
|
m_pDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2);
|
|
m_pDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
|
|
|
|
|
|
m_pDevice->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX,0);
|
|
m_pDevice->SetTextureStageState(0 ,D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE);
|
|
|
|
m_pDevice->SetRenderState(D3DRS_NORMALIZENORMALS,FALSE);
|
|
m_pDevice->SetRenderState(D3DRS_LOCALVIEWER,FALSE);
|
|
m_pDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
|
|
m_pDevice->SetRenderState(D3DRS_FOGENABLE,FALSE);
|
|
|
|
m_pDevice->SetVertexShader(TLVERTEXFVF);
|
|
m_pDevice->SetStreamSource(0,m_pVertexBuffer,sizeof(TLVertex));
|
|
|
|
m_pDevice->SetTexture(0,m_pRenderTexture);
|
|
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
|
|
if(m_bPixelShader) {
|
|
// FullScene Filter
|
|
for(i=1;i <FULLSCENE_NUMS; i++ ) {
|
|
if(m_bFlag[i] == true)
|
|
{
|
|
if(iValue == 0)
|
|
m_lstEffects[i - 1]->Apply();
|
|
else
|
|
m_lstEffects[i - 1]->Apply(1);
|
|
}
|
|
}
|
|
|
|
|
|
if(iValue == 1) {
|
|
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
|
|
m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
|
m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
|
|
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, 0x66ffffff);
|
|
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
|
|
m_pDevice->SetTextureStageState( 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_pDevice->SetTexture(2,m_pRenderTexture);
|
|
m_pDevice->SetTexture(3,m_pRenderTexture);
|
|
|
|
}
|
|
}
|
|
else {
|
|
m_pDevice->SetPixelShader(0);
|
|
|
|
}
|
|
// Render Scene
|
|
m_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
|
|
|
|
|
|
// FullScene MotionBlur
|
|
if(m_bFlag[FULLSCENE_MOTIONBLUR] == true && (m_bFlag[FULLSCENE_BRIGHT] != true) && (m_iBlurFirstUpdate >= 0)) {//&&( m_bFlag[FULLSCENE_SATURATION] != true)) {
|
|
|
|
// FullScene Filter
|
|
if(m_bPixelShader) {
|
|
for(i=1;i <FULLSCENE_NUMS; i++ ) {
|
|
if(m_bFlag[i] == true)
|
|
{
|
|
m_lstEffects[i - 1]->Apply(1);
|
|
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
m_pDevice->SetPixelShader(0);
|
|
}
|
|
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
|
|
m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
|
|
m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
|
|
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, 0x66ffffff);
|
|
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
|
|
m_pDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2);
|
|
|
|
for(int iBlur = 0;iBlur < m_iBlurFirstUpdate; iBlur++) {
|
|
m_pDevice->SetVertexShader(TLVERTEXFVF);
|
|
|
|
m_pDevice->SetTexture(0,m_pBlurTexture[iBlur]);
|
|
// FullScene Edge Filter
|
|
/* if(m_bFlag[FULLSCENE_EDGE] == true) {
|
|
m_pDevice->SetTexture(1,m_pBlurTexture[iBlur]);
|
|
m_pDevice->SetTexture(2,m_pBlurTexture[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_pBlurTexture[iBlur]);
|
|
m_pDevice->SetTexture(2,m_pBlurTexture[iBlur]);
|
|
m_pDevice->SetTexture(3,m_pBlurTexture[iBlur]);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
m_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
|
|
}
|
|
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
|
|
}
|
|
if(m_bPixelShader) {
|
|
//Filter Pixel Shader Free
|
|
for(i=1;i <FULLSCENE_NUMS; i++ ) {
|
|
if(m_bFlag[i] == true)
|
|
{
|
|
m_lstEffects[i - 1]->UnApply();
|
|
}
|
|
}
|
|
}
|
|
for (i = 0; i < 4; ++i)
|
|
{
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
|
|
m_pDevice->SetTextureStageState(i, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
|
|
}
|
|
|
|
m_pDevice->SetRenderState(D3DRS_FOGENABLE,TRUE);
|
|
m_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
|
|
|
|
|
|
Update();
|
|
}
|
|
|
|
|
|
|
|
}
|
|
void CFullSceneEffect::Update()
|
|
{
|
|
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;
|
|
}
|
|
}
|