mirror of
https://github.com/dashr9230/SA-MP.git
synced 2024-12-22 22:47:29 +08:00
bbf72d218d
* Updates `DoInitStuff()`
243 lines
6.8 KiB
C++
243 lines
6.8 KiB
C++
|
|
#include "main.h"
|
|
#include "buildinfo.h"
|
|
|
|
//----------------------------------------------------
|
|
|
|
const char szVersionInfo[] = "SA-MP " SAMP_VERSION;
|
|
|
|
//----------------------------------------------------
|
|
|
|
extern CGame *pGame;
|
|
extern CFileSystem *pFileSystem;
|
|
extern CFontRender *pDefaultFont;
|
|
|
|
//----------------------------------------------------
|
|
|
|
typedef struct _D3DTLVERTEX
|
|
{
|
|
float sx, sy, sz;
|
|
float rhw;
|
|
D3DCOLOR color;
|
|
float tu, tv;
|
|
|
|
_D3DTLVERTEX()
|
|
{
|
|
}
|
|
|
|
_D3DTLVERTEX(const D3DVECTOR& v, float rhw, D3DCOLOR color, float tu, float tv)
|
|
{
|
|
this->sx = v.x;
|
|
this->sy = v.y;
|
|
this->sz = v.z;
|
|
this->rhw = rhw;
|
|
this->color = color;
|
|
this->tu = tu;
|
|
this->tv = tv;
|
|
}
|
|
|
|
} D3DTLVERTEX;
|
|
|
|
//----------------------------------------------------
|
|
|
|
CSpawnScreen::CSpawnScreen(IDirect3DDevice9 *pD3DDevice)
|
|
{
|
|
m_pD3DDevice = pD3DDevice;
|
|
m_szSpawnText = NULL;
|
|
m_pTexture = NULL;
|
|
m_pStateBlockDraw = NULL;
|
|
m_pStateBlockSaved = NULL;
|
|
|
|
if (m_pD3DDevice)
|
|
{
|
|
// Just use the default font object
|
|
//m_pFont = new CFontRender(m_pD3DDevice, "Arial", TRUE, TRUE, 0);
|
|
m_pFont = pDefaultFont;
|
|
}
|
|
|
|
RestoreDeviceObjects();
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
CSpawnScreen::~CSpawnScreen()
|
|
{
|
|
if (m_szSpawnText)
|
|
delete m_szSpawnText;
|
|
|
|
if (m_pTexture || m_pStateBlockDraw || m_pStateBlockSaved)
|
|
DeleteDeviceObjects();
|
|
|
|
if (m_pFont != pDefaultFont)
|
|
SAFE_DELETE(m_pFont);
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CSpawnScreen::SetSpawnText(CHAR* szSpawnText)
|
|
{
|
|
if (m_szSpawnText)
|
|
delete m_szSpawnText;
|
|
m_szSpawnText = NULL;
|
|
if (szSpawnText)
|
|
{
|
|
m_szSpawnText = new CHAR[strlen(szSpawnText)+1];
|
|
strcpy(m_szSpawnText, szSpawnText);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CSpawnScreen::Draw()
|
|
{
|
|
if (m_pFont && m_szSpawnText)
|
|
{
|
|
SIZE size = m_pFont->MeasureText(m_szSpawnText);
|
|
|
|
RECT rect;
|
|
rect.bottom = pGame->GetScreenHeight() - 30;
|
|
rect.top = rect.bottom - size.cy;
|
|
rect.left = 20;
|
|
rect.right = rect.left + size.cx;
|
|
|
|
m_pFont->RenderText(0,m_szSpawnText,rect,0xFFFFFFFF);
|
|
|
|
const int iTexWidth = 185;
|
|
const int iTexHeight = 73;
|
|
|
|
rect.top -= iTexHeight + 30;
|
|
rect.bottom = rect.top + iTexHeight;
|
|
rect.left = 20;
|
|
rect.right = rect.left + iTexWidth;
|
|
|
|
if (m_pTexture)
|
|
{
|
|
D3DTLVERTEX v[4];
|
|
float l=rect.left-0.5f;
|
|
float r=rect.right+0.5f;
|
|
float t=rect.top-0.5f;
|
|
float b=rect.bottom+0.5f;
|
|
v[0]=D3DTLVERTEX(D3DXVECTOR3(l,b,0.1f),1.0f,0xFFFFFFFF,0.0f,1.0f);
|
|
v[1]=D3DTLVERTEX(D3DXVECTOR3(l,t,0.1f),1.0f,0xFFFFFFFF,0.0f,0.0f);
|
|
v[2]=D3DTLVERTEX(D3DXVECTOR3(r,b,0.1f),1.0f,0xFFFFFFFF,1.0f,1.0f);
|
|
v[3]=D3DTLVERTEX(D3DXVECTOR3(r,t,0.1f),1.0f,0xFFFFFFFF,1.0f,0.0f);
|
|
|
|
m_pStateBlockSaved->Capture();
|
|
m_pStateBlockDraw->Apply();
|
|
|
|
m_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
|
|
m_pD3DDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
|
|
|
|
m_pD3DDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1 );
|
|
m_pD3DDevice->SetPixelShader( NULL );
|
|
m_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v, sizeof(D3DTLVERTEX));
|
|
|
|
m_pStateBlockSaved->Apply();
|
|
}
|
|
|
|
char *szText = (char *)szVersionInfo;
|
|
size = m_pFont->MeasureText(szText);
|
|
rect.top = rect.bottom;
|
|
rect.bottom = rect.top + size.cy;
|
|
rect.left = 20 + (iTexWidth - size.cx) / 2;
|
|
rect.right = rect.left + size.cx;
|
|
|
|
m_pFont->RenderText(0,szText,rect,0xFF27ABFA);
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CSpawnScreen::RestoreDeviceObjects()
|
|
{
|
|
if(m_pD3DDevice)
|
|
{
|
|
if (m_pTexture)
|
|
m_pTexture->Release();
|
|
|
|
//D3DXCreateTextureFromFile(m_pD3DDevice, "logo.png", &m_pTexture);
|
|
//DWORD dwIndex = pFileSystem->GetFileIndex("logo.png");
|
|
DWORD dwIndex = ((CArchiveFS*)pFileSystem)->GetFileIndex(0xbaddea6b);
|
|
|
|
if (dwIndex != FS_INVALID_FILE)
|
|
{
|
|
BYTE *pbData = pFileSystem->GetFileData(dwIndex);
|
|
DWORD dwSize = pFileSystem->GetFileSize(dwIndex);
|
|
D3DXCreateTextureFromFileInMemory(m_pD3DDevice, pbData, dwSize, &m_pTexture);
|
|
}
|
|
|
|
for(int i=0; i<2; i++)
|
|
{
|
|
m_pD3DDevice->BeginStateBlock();
|
|
m_pD3DDevice->SetTexture( 0, m_pTexture );
|
|
|
|
m_pD3DDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
|
|
m_pD3DDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
|
|
m_pD3DDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
|
|
m_pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
|
|
m_pD3DDevice->SetRenderState( D3DRS_ALPHAREF, 0x08 );
|
|
m_pD3DDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );
|
|
m_pD3DDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
|
|
m_pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
|
|
m_pD3DDevice->SetRenderState( D3DRS_STENCILENABLE, FALSE );
|
|
m_pD3DDevice->SetRenderState( D3DRS_CLIPPING, TRUE );
|
|
m_pD3DDevice->SetRenderState( D3DRS_CLIPPLANEENABLE, FALSE );
|
|
m_pD3DDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_DISABLE );
|
|
m_pD3DDevice->SetRenderState( D3DRS_INDEXEDVERTEXBLENDENABLE, FALSE );
|
|
m_pD3DDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
|
|
m_pD3DDevice->SetRenderState( D3DRS_COLORWRITEENABLE,
|
|
D3DCOLORWRITEENABLE_RED | D3DCOLORWRITEENABLE_GREEN |
|
|
D3DCOLORWRITEENABLE_BLUE | D3DCOLORWRITEENABLE_ALPHA );
|
|
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
|
|
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
|
|
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
|
|
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );
|
|
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
|
|
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );
|
|
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );
|
|
m_pD3DDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE );
|
|
m_pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
|
|
m_pD3DDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
|
|
m_pD3DDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_POINT );
|
|
m_pD3DDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT );
|
|
m_pD3DDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE );
|
|
|
|
if (i==0)
|
|
m_pD3DDevice->EndStateBlock(&m_pStateBlockSaved);
|
|
else
|
|
m_pD3DDevice->EndStateBlock(&m_pStateBlockDraw);
|
|
}
|
|
}
|
|
|
|
if(m_pFont && m_pFont != pDefaultFont)
|
|
{
|
|
m_pFont->RestoreDeviceObjects();
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------
|
|
|
|
void CSpawnScreen::DeleteDeviceObjects()
|
|
{
|
|
if(m_pTexture)
|
|
m_pTexture->Release();
|
|
|
|
if (m_pStateBlockSaved)
|
|
m_pStateBlockSaved->Release();
|
|
|
|
if (m_pStateBlockDraw)
|
|
m_pStateBlockDraw->Release();
|
|
|
|
m_pTexture = NULL;
|
|
m_pStateBlockSaved = NULL;
|
|
m_pStateBlockDraw = NULL;
|
|
|
|
if(m_pFont && m_pFont != pDefaultFont)
|
|
{
|
|
m_pFont->DeleteDeviceObjects();
|
|
m_pFont = NULL;
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------
|