Files
FC1/RenderDll/XRenderD3D9/D3DFont.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

309 lines
8.3 KiB
C++

#include "RenderPCH.h"
#include "DriverD3D9.h"
//=========================================================================================
#include "../CryFont/FBitmap.h"
bool CD3D9Renderer::FontUpdateTexture(int nTexId, int X, int Y, int USize, int VSize, byte *pData)
{
WaitForDevice();
STexPicD3D *tp = (STexPicD3D *)gRenDev->m_TexMan->m_Textures[nTexId-TX_FIRSTBIND];
assert (tp && tp->m_Bind == nTexId);
if (tp)
{
m_TexMan->UpdateTextureRegion(tp, pData, X, Y, USize, VSize);
return true;
}
return false;
}
bool CD3D9Renderer::FontUploadTexture(class CFBitmap* pBmp, ETEX_Format eTF)
{
if(!pBmp)
{
return false;
}
unsigned int *pData = new unsigned int[pBmp->GetWidth() * pBmp->GetHeight()];
if (!pData)
{
return false;
}
pBmp->Get32Bpp(&pData);
char szName[128];
sprintf(szName, "$AutoFont_%d", m_TexGenID++);
int iFlags = FT_HASALPHA | FT_FONT | FT_NOSTREAM;
STexPic *tp = m_TexMan->CreateTexture(szName, pBmp->GetWidth(), pBmp->GetHeight(), 1, iFlags, 0, (unsigned char *)pData, eTT_Base, -1.0f, -1.0f, 0, NULL, 0, eTF);
SAFE_DELETE_ARRAY(pData);
pBmp->SetRenderData((void *)tp);
return true;
}
int CD3D9Renderer::FontCreateTexture(int Width, int Height, byte *pData, ETEX_Format eTF)
{
if (!pData)
return -1;
char szName[128];
sprintf(szName, "$AutoFont_%d", m_TexGenID++);
int iFlags = FT_HASALPHA | FT_FONT | FT_NOSTREAM | FT_NOMIPS;
STexPic *tp = m_TexMan->CreateTexture(szName, Width, Height, 1, iFlags, 0, pData, eTT_Base, -1.0f, -1.0f, 0, NULL, 0, eTF);
return tp->GetTextureID();
}
void CD3D9Renderer::FontReleaseTexture(class CFBitmap *pBmp)
{
if(!pBmp)
{
return;
}
STexPic *tp = (STexPic *)pBmp->GetRenderData();
tp->Release(false);
}
void CD3D9Renderer::FontSetTexture(class CFBitmap* pBmp, int nFilterMode)
{
if (pBmp)
{
STexPic *tp = (STexPic *)pBmp->GetRenderData();
tp->Set();
}
LPDIRECT3DDEVICE9 dv = mfGetD3DDevice();
int tmu = 0;
switch(nFilterMode)
{
case FILTER_LINEAR:
default:
if (m_RP.m_TexStages[tmu].nMipFilter != D3DTEXF_NONE)
{
m_RP.m_TexStages[tmu].nMipFilter = D3DTEXF_NONE;
dv->SetSamplerState(tmu, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
}
if (m_RP.m_TexStages[tmu].MagFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MagFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
}
if (m_RP.m_TexStages[tmu].MinFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MinFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
}
break;
case FILTER_BILINEAR:
if (m_RP.m_TexStages[tmu].nMipFilter == D3DTEXF_POINT)
{
m_RP.m_TexStages[tmu].nMipFilter = D3DTEXF_POINT;
dv->SetSamplerState(tmu, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
}
if (m_RP.m_TexStages[tmu].MagFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MagFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
}
if (m_RP.m_TexStages[tmu].MinFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MinFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
}
break;
case FILTER_TRILINEAR:
if (m_RP.m_TexStages[tmu].nMipFilter == D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].nMipFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
}
if (m_RP.m_TexStages[tmu].MagFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MagFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
}
if (m_RP.m_TexStages[tmu].MinFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MinFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
}
break;
}
}
void CD3D9Renderer::FontSetTexture(int nTexId, int nFilterMode)
{
if (nTexId <= 0 || nTexId > TX_LASTBIND)
return;
STexPicD3D *tp = (STexPicD3D *)gRenDev->m_TexMan->m_Textures[nTexId-TX_FIRSTBIND];
assert (tp && tp->m_Bind == nTexId);
if (CV_d3d9_forcesoftware)
return;
tp->Set();
LPDIRECT3DDEVICE9 dv = mfGetD3DDevice();
int tmu = 0;
switch(nFilterMode)
{
case FILTER_LINEAR:
default:
if (m_RP.m_TexStages[tmu].nMipFilter != D3DTEXF_NONE)
{
m_RP.m_TexStages[tmu].nMipFilter = D3DTEXF_NONE;
dv->SetSamplerState(tmu, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
}
if (m_RP.m_TexStages[tmu].MagFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MagFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
}
if (m_RP.m_TexStages[tmu].MinFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MinFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
}
break;
case FILTER_BILINEAR:
if (m_RP.m_TexStages[tmu].nMipFilter == D3DTEXF_POINT)
{
m_RP.m_TexStages[tmu].nMipFilter = D3DTEXF_POINT;
dv->SetSamplerState(tmu, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
}
if (m_RP.m_TexStages[tmu].MagFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MagFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
}
if (m_RP.m_TexStages[tmu].MinFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MinFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
}
break;
case FILTER_TRILINEAR:
if (m_RP.m_TexStages[tmu].nMipFilter == D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].nMipFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
}
if (m_RP.m_TexStages[tmu].MagFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MagFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
}
if (m_RP.m_TexStages[tmu].MinFilter != D3DTEXF_LINEAR)
{
m_RP.m_TexStages[tmu].MinFilter = D3DTEXF_LINEAR;
dv->SetSamplerState(tmu, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
}
break;
}
}
void CD3D9Renderer::FontSetRenderingState(unsigned long nVPWidth, unsigned long nVPHeight)
{
// setup various d3d things that we need
FontSetState(false);
D3DXMATRIX *m;
m_matProj->Push();
m_matProj->LoadIdentity();
m = m_matProj->GetTop();
D3DXMatrixOrthoOffCenterRH(m, 0.0f, (float)m_Viewport.Width, (float)m_Viewport.Height, 0.0f, -1.0f, 1.0f);
m_pd3dDevice->SetTransform(D3DTS_PROJECTION, m);
EF_PushMatrix();
m_matView->LoadIdentity();
m_pd3dDevice->SetTransform(D3DTS_VIEW, m_matView->GetTop());
}
// match table with the blending modes
static int nBlendMatchTable[] =
{
D3DBLEND_ZERO,
D3DBLEND_ONE,
D3DBLEND_SRCCOLOR,
D3DBLEND_INVSRCCOLOR,
D3DBLEND_SRCALPHA,
D3DBLEND_INVSRCALPHA,
D3DBLEND_DESTALPHA,
D3DBLEND_INVDESTALPHA,
D3DBLEND_DESTCOLOR,
D3DBLEND_INVDESTCOLOR,
};
void CD3D9Renderer::FontSetBlending(int blendSrc, int blendDest)
{
}
void CD3D9Renderer::FontRestoreRenderingState()
{
D3DXMATRIX *m;
m_matProj->Pop();
m = m_matProj->GetTop();
m_pd3dDevice->SetTransform(D3DTS_PROJECTION, m);
EF_PopMatrix();
FontSetState(true);
}
void CD3D9Renderer::FontSetState(bool bRestore)
{
static DWORD polyMode;
static D3DCOLORVALUE color;
static bool bMatColor;
static int State;
if (CV_d3d9_forcesoftware)
return;
CD3D9TexMan::BindNULL(1);
// grab the modes that we might need to change
if(!bRestore)
{
D3DSetCull(eCULL_None);
color = m_Material.Diffuse;
bMatColor = m_bMatColor;
State = m_CurState;
polyMode = m_polygon_mode;
EF_SetVertColor();
if(polyMode == R_WIREFRAME_MODE)
m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
m_RP.m_FlagsPerFlush = 0;
EF_SetState(GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA | GS_NODEPTHTEST | GS_ALPHATEST_GREATER0);
EF_SetColorOp(eCO_REPLACE, eCO_MODULATE, eCA_Diffuse | (eCA_Diffuse<<3), DEF_TEXARG0);
//m_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
//m_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
}
else
{
if (m_bMatColor)
EF_SetGlobalColor(color.r,color.g,color.b,color.a);
if(polyMode == R_WIREFRAME_MODE)
m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
//EF_SetState(State);
}
}