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>
171 lines
4.9 KiB
C++
171 lines
4.9 KiB
C++
// RenderTextureMipmap.cpp: implementation of the CRenderTextureMipmap class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "BaseGraphicsLayer.h"
|
|
#include "RenderTextureMipmap.h"
|
|
#include "Vertex.h"
|
|
#include "SceneStateMgr.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CRenderTextureMipmap::CRenderTextureMipmap()
|
|
{
|
|
|
|
}
|
|
|
|
CRenderTextureMipmap::~CRenderTextureMipmap()
|
|
{
|
|
|
|
}
|
|
|
|
void CRenderTextureMipmap::Create(int nSizeX, int nSizeY)
|
|
{
|
|
D3DDISPLAYMODE mode;
|
|
BaseGraphicsLayer::GetDevice()->GetDisplayMode(&mode);
|
|
//BaseGraphicsLayer::GetDevice()->CreateTexture(SizeX,SizeY,1,D3DUSAGE_RENDERTARGET,mode.Format,D3DPOOL_DEFAULT,&m_pRenderTexture);
|
|
//m_pRenderTexture->GetSurfaceLevel(0, &m_pRenderSurface);
|
|
BaseGraphicsLayer::GetDevice()->CreateDepthStencilSurface(nSizeX,nSizeY,BaseGraphicsLayer::m_d3dpp.AutoDepthStencilFormat,D3DMULTISAMPLE_NONE,&m_pRenderZBuffer);
|
|
|
|
m_nSize=nSizeX;
|
|
LPDIRECT3DTEXTURE8 pMipmapTexture;
|
|
LPDIRECT3DSURFACE8 pRenderSurface;
|
|
|
|
for(int i=nSizeX;i>=32;i=i>>1)
|
|
{
|
|
BaseGraphicsLayer::GetDevice()->CreateTexture(i,i,1,D3DUSAGE_RENDERTARGET,mode.Format,D3DPOOL_DEFAULT,&pMipmapTexture);
|
|
pMipmapTexture->GetSurfaceLevel(0, &pRenderSurface);
|
|
m_pRenderTextureList.Add(pMipmapTexture);
|
|
m_pRenderSurfaceList.Add(pRenderSurface);
|
|
break;
|
|
}
|
|
/*
|
|
for(int i=nSizeX;i>=32;i=i>>1)
|
|
{
|
|
CRenderTexture *AddNode=new CRenderTexture();
|
|
AddNode->Create(i,i);
|
|
m_TextureMipmap.Add(AddNode);
|
|
}
|
|
*/
|
|
}
|
|
|
|
LPDIRECT3DTEXTURE8 CRenderTextureMipmap::GetTexture(int nTexture)
|
|
{
|
|
if(m_pRenderTextureList.num>0)
|
|
{
|
|
return m_pRenderTextureList[nTexture];
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void CRenderTextureMipmap::GenerateMipmap(LPDIRECT3DDEVICE8 pd3dDevice)
|
|
{
|
|
pd3dDevice->EndScene();
|
|
LPDIRECT3DSURFACE8 m_pTempRenderSurface;
|
|
LPDIRECT3DSURFACE8 m_pTempRenderZBuffer;
|
|
pd3dDevice->GetRenderTarget(&m_pTempRenderSurface);
|
|
pd3dDevice->GetDepthStencilSurface(&m_pTempRenderZBuffer);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG1,D3DTA_TEXTURE);
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLORARG2,D3DTA_DIFFUSE);
|
|
CSceneStateMgr::_SetD3DTextureStageState( 0, D3DTSS_COLOROP,D3DTOP_SELECTARG1);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState( 1, D3DTSS_COLOROP,D3DTOP_DISABLE);
|
|
CSceneStateMgr::_SetD3DTextureStageState( 2, D3DTSS_COLOROP,D3DTOP_DISABLE);
|
|
CSceneStateMgr::_SetD3DTextureStageState( 3, D3DTSS_COLOROP,D3DTOP_DISABLE);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_ALPHABLENDENABLE,FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_LIGHTING,FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState( D3DRS_FOGENABLE,FALSE);
|
|
|
|
|
|
TLVertex pVertex[4];
|
|
int TextureSize=m_nSize>>1;
|
|
|
|
pVertex[0].v.x=0.0f;
|
|
pVertex[1].v.x=0.0f;
|
|
pVertex[2].v.x=(float)TextureSize;
|
|
pVertex[3].v.x=(float)TextureSize;
|
|
|
|
|
|
pVertex[1].v.y=0.0f;
|
|
pVertex[3].v.y=0.0f;
|
|
pVertex[0].v.y=(float)TextureSize;
|
|
pVertex[2].v.y=(float)TextureSize;
|
|
|
|
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=0xffff0000;
|
|
pVertex[i].Specular.c=0xffffffff;
|
|
}
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
|
|
|
|
pd3dDevice->SetTexture(1,NULL);
|
|
pd3dDevice->SetVertexShader(TLVERTEXFVF);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,FALSE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
|
|
|
|
|
|
for(i=1;i<m_pRenderTextureList.num;i++,TextureSize=TextureSize>>1)
|
|
{
|
|
pVertex[2].v.x=(float)TextureSize;
|
|
pVertex[3].v.x=(float)TextureSize;
|
|
pVertex[0].v.y=(float)TextureSize;
|
|
pVertex[2].v.y=(float)TextureSize;
|
|
|
|
pd3dDevice->SetRenderTarget(m_pRenderSurfaceList[i],m_pTempRenderZBuffer);
|
|
|
|
pd3dDevice->BeginScene();
|
|
pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,0xffffffff,1.0f,0);
|
|
|
|
pd3dDevice->SetTexture(0,m_pRenderTextureList[0]);
|
|
pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,pVertex,sizeof(TLVertex));
|
|
pd3dDevice->EndScene();
|
|
|
|
}
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZWRITEENABLE,TRUE);
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
|
|
|
|
CSceneStateMgr::_SetD3DRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
|
|
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
|
|
CSceneStateMgr::_SetD3DTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);
|
|
|
|
pd3dDevice->SetRenderTarget(m_pTempRenderSurface,m_pTempRenderZBuffer);
|
|
m_pTempRenderSurface->Release();
|
|
m_pTempRenderZBuffer->Release();
|
|
|
|
pd3dDevice->BeginScene();
|
|
}
|
|
|
|
LPDIRECT3DSURFACE8 CRenderTextureMipmap::GetSurface()
|
|
{
|
|
if(m_pRenderSurfaceList.num>0)
|
|
{
|
|
return m_pRenderSurfaceList[0];
|
|
}
|
|
return NULL;
|
|
}
|