241 lines
5.5 KiB
C++
241 lines
5.5 KiB
C++
#include "stdafx.h"
|
|
#include "DriverD3D8.h"
|
|
|
|
//=========================================================================================
|
|
|
|
#include "../CryFont/FBitmap.h"
|
|
|
|
bool CD3D8Renderer::FontUploadTexture(class CFBitmap* pBmp)
|
|
{
|
|
if(!pBmp)
|
|
return false;
|
|
|
|
char name[128];
|
|
sprintf(name, "$AutoDownload_%d", m_TexGenID++);
|
|
|
|
int flags = FT_NOMIPS | FT_HASALPHA | FT_NOREMOVE;
|
|
STexPic *tp = m_TexMan->CreateTexture(name, pBmp->GetWidth(), pBmp->GetHeight(), 1, flags, 0, (byte *)pBmp->GetData(), eTT_Base, -1.0f, -1.0f, 0, NULL, 0, eTF_8888);
|
|
|
|
pBmp->m_pIRenderData = (void*)tp;
|
|
return true;
|
|
}
|
|
void CD3D8Renderer::FontReleaseTexture(class CFBitmap *pBmp)
|
|
{
|
|
if(!pBmp)
|
|
return;
|
|
|
|
STexPic *tp = (STexPic *)pBmp->m_pIRenderData;
|
|
tp->Release(false);
|
|
}
|
|
|
|
void CD3D8Renderer::FontSetTexture(class CFBitmap* pBmp)
|
|
{
|
|
STexPic *tp = (STexPic *)pBmp->m_pIRenderData;
|
|
tp->Set();
|
|
EF_SetColorOp(eCO_MODULATE);
|
|
}
|
|
|
|
void CD3D8Renderer::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 CD3D8Renderer::FontSetBlending(int blendSrc, int blendDest)
|
|
{
|
|
m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, nBlendMatchTable[blendSrc]);
|
|
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, nBlendMatchTable[blendDest]);
|
|
mCurState &= ~GS_BLEND_MASK;
|
|
mCurState |= GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA;
|
|
}
|
|
|
|
void CD3D8Renderer::FontRestoreRenderingState()
|
|
{
|
|
D3DXMATRIX *m;
|
|
|
|
m_matProj->Pop();
|
|
m = m_matProj->GetTop();
|
|
m_pd3dDevice->SetTransform(D3DTS_PROJECTION, m);
|
|
|
|
EF_PopMatrix();
|
|
|
|
FontSetState(true);
|
|
}
|
|
|
|
void CD3D8Renderer::FontSetState(bool bRestore)
|
|
{
|
|
static DWORD polyMode;
|
|
static D3DCOLORVALUE color;
|
|
static bool bMatColor;
|
|
static int State;
|
|
|
|
// grab the modes that we might need to change
|
|
if(!bRestore)
|
|
{
|
|
D3DSetCull(eCULL_None);
|
|
|
|
color = m_Material.Diffuse;
|
|
bMatColor = m_bMatColor;
|
|
State = mCurState;
|
|
polyMode = m_polygon_mode;
|
|
|
|
EF_SetVertColor();
|
|
|
|
if(polyMode == R_WIREFRAME_MODE)
|
|
m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
|
|
|
|
SetState(GS_BLSRC_SRCALPHA | GS_BLDST_ONEMINUSSRCALPHA | GS_NODEPTHTEST | GS_ALPHATEST_GEQUAL128);
|
|
|
|
EF_SetColorOp(eCO_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);
|
|
|
|
SetState(State);
|
|
}
|
|
m_pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
|
|
m_pd3dDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
|
|
}
|
|
|
|
void CD3D8Renderer::DrawString(int x, int y,bool bIgnoreColor, const char *message, ...)
|
|
{
|
|
CXFont *pFont = m_pCurFont;
|
|
float xscale = m_fXFontScale;
|
|
float yscale = m_fYFontScale;
|
|
if (!pFont)
|
|
{
|
|
if (iConsole && iConsole->GetFont())
|
|
pFont = iConsole->GetFont();
|
|
}
|
|
if (!pFont)
|
|
return;
|
|
|
|
float xsize = pFont->m_charsize*xscale*(float)(m_width)/800.0f;
|
|
float ysize = pFont->m_charsize*yscale*(float)(m_height)/600.0f;
|
|
|
|
va_list arglist;
|
|
char buf[1024];
|
|
|
|
va_start(arglist, message);
|
|
vsprintf(buf, message, arglist);
|
|
va_end(arglist);
|
|
|
|
FontSetRenderingState(m_width, m_height);
|
|
m_TexMan->SetTexture(pFont->m_image->GetTextureID(), eTT_Base);
|
|
|
|
float fX, fY, fBaseX;
|
|
|
|
fX = fBaseX = (float)x;
|
|
fY = (float)y;
|
|
|
|
bool bRGB = ((GetFeatures() & RFT_RGBA) != 0) ? true : false;
|
|
|
|
CFColor fCol = m_CurFontColor;
|
|
if (!bRGB)
|
|
COLCONV(fCol);
|
|
|
|
char *p = buf;
|
|
int nChar;
|
|
|
|
//glBegin(GL_QUADS);
|
|
|
|
while(*p)
|
|
{
|
|
nChar = *p;
|
|
if (nChar=='$')
|
|
{
|
|
if (*(p+1))
|
|
{
|
|
p++;
|
|
if ((*p)!='$')
|
|
{
|
|
char sColor[2];
|
|
sColor[0] =(*p);
|
|
sColor[1] = '\0';
|
|
int nColor = atoi(sColor);
|
|
if (nColor<0 || nColor>=FONTCOLORS)
|
|
nColor = 1;
|
|
if (!bIgnoreColor) // only change color for first pass !
|
|
{
|
|
fCol = m_FontColorTable[nColor];
|
|
if (!bRGB)
|
|
COLCONV(fCol);
|
|
}
|
|
nChar = 255;
|
|
}
|
|
}
|
|
}
|
|
if(nChar < 255)
|
|
{
|
|
if(nChar == '\n' || nChar == '\r')
|
|
{
|
|
fY += ysize;
|
|
fX = fBaseX;
|
|
}
|
|
else
|
|
if(nChar == '\t')
|
|
{
|
|
fX += xsize*4;
|
|
}
|
|
else
|
|
if (nChar > 32 && nChar < 256)
|
|
{
|
|
float xot = (float)(nChar & 15)*pFont->m_char_inc;
|
|
float yot = 1.f-(-(float)(*buf >> 4)*pFont->m_char_inc);
|
|
|
|
/*glColor4fv (&fCol[0]);
|
|
glTexCoord2f(xot, yot);
|
|
glVertex2f (fX, fY);
|
|
|
|
glColor4fv (&fCol[0]);
|
|
glTexCoord2f(xot+pFont->m_char_inc, yot);
|
|
glVertex2f (fX+xsize, fY);
|
|
|
|
glColor4fv (&fCol[0]);
|
|
glTexCoord2f(xot+pFont->m_char_inc, yot+pFont->m_char_inc);
|
|
glVertex2f (fX+xsize, fY+ysize);
|
|
|
|
glColor4fv (&fCol[0]);
|
|
glTexCoord2f(xot, yot+pFont->m_char_inc);
|
|
glVertex2f (fX, fY+ysize);*/
|
|
}
|
|
}
|
|
fX += xsize;
|
|
p++;
|
|
}
|
|
|
|
FontRestoreRenderingState();
|
|
}
|