Skip to content

Commit f44f456

Browse files
committed
1 parent b2aa6ef commit f44f456

File tree

1,743 files changed

+576172
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,743 files changed

+576172
-0
lines changed

Client/CBBFont.cpp

+160
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
// PUBLIC DOMAIN
2+
/*
3+
Based off code by DrunkenHyena - Many thanks :)
4+
*/
5+
6+
#include "StdInc.h"
7+
8+
extern D3DMATRIX matView;
9+
10+
CBBFont::CBBFont(IDirect3DDevice8* pDevice, char* pFileName)
11+
{
12+
m_pDevice = pDevice;
13+
m_pTexture = NULL;
14+
m_pVB = NULL;
15+
m_dwSavedStates = 0;
16+
m_dwFontStates = 0;
17+
m_fCharWidth = 0.0f;
18+
m_fCharHeight = 0.0f;
19+
m_fScale = 0.01f;
20+
21+
m_pTextureFileName = (char*)malloc(strlen(pFileName) + 5);
22+
m_pMetricsFileName = (char*)malloc(strlen(pFileName) + 5);
23+
sprintf(m_pTextureFileName, "%s.png", pFileName);
24+
sprintf(m_pMetricsFileName, "%s.dat", pFileName);
25+
memset((void*)&m_Metrics, 0, sizeof(m_Metrics));
26+
}
27+
28+
CBBFont::~CBBFont()
29+
{
30+
m_pDevice->DeleteStateBlock(m_dwSavedStates);
31+
m_pDevice->DeleteStateBlock(m_dwFontStates);
32+
free(m_pTextureFileName);
33+
free(m_pMetricsFileName);
34+
SAFE_RELEASE(m_pTexture);
35+
SAFE_RELEASE(m_pVB);
36+
}
37+
38+
BOOL CBBFont::Initialise()
39+
{
40+
if(!m_pDevice)
41+
return FALSE;
42+
43+
D3DXCreateTextureFromFileEx(m_pDevice, m_pTextureFileName, D3DX_DEFAULT, D3DX_DEFAULT, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, &m_pTexture);
44+
45+
m_pDevice->CreateVertexBuffer(((cMaxChars*6)+1)*sizeof(sVertex), D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, cVertexFVF, D3DPOOL_DEFAULT, &m_pVB);
46+
47+
D3DSURFACE_DESC desc;
48+
m_pTexture->GetLevelDesc(0, &desc);
49+
m_fCharWidth = desc.Width / 16.0f;
50+
m_fCharHeight = desc.Height / 16.0f;
51+
52+
FILE * f = fopen(m_pMetricsFileName, "rb");
53+
if(f)
54+
{
55+
fread(&m_Metrics, 1, sizeof(m_Metrics), f);
56+
fclose(f);
57+
}
58+
else
59+
{
60+
memset(&m_Metrics, (int)m_fCharWidth, sizeof(m_Metrics));
61+
}
62+
63+
return TRUE;
64+
}
65+
66+
float CBBFont::Draw(char* pText, float fYOffset, DWORD dwColor)
67+
{
68+
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, dwColor);
69+
70+
int len = (int)strlen(pText);
71+
if (len > cMaxChars)
72+
len = cMaxChars;
73+
74+
sVertex *vert_ptr;
75+
m_pVB->Lock(0, 0, (BYTE**)&vert_ptr, D3DLOCK_DISCARD);
76+
77+
float fX = 0.0f;
78+
for (int i=0; i<len; i++)
79+
{
80+
fX += (float)m_Metrics[pText[i]] * m_fScale;
81+
}
82+
fX = -(fX / 2);
83+
84+
int i = 0;
85+
for (i=0; i<len; i++)
86+
{
87+
InitQuad(pText[i], fX, fYOffset, vert_ptr);
88+
fX += (float)m_Metrics[pText[i]] * m_fScale;
89+
vert_ptr += 6;
90+
}
91+
92+
m_pVB->Unlock();
93+
94+
m_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, len*2);
95+
96+
return fX;
97+
}
98+
99+
void CBBFont::Begin()
100+
{
101+
if(!m_dwSavedStates || !m_dwFontStates)
102+
{
103+
m_pDevice->BeginStateBlock();
104+
m_pDevice->SetRenderState(D3DRS_TEXTUREFACTOR, 0xFFFFFFFF);
105+
m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
106+
m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
107+
m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_CURRENT);
108+
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
109+
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
110+
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
111+
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
112+
m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
113+
m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
114+
m_pDevice->SetTexture(0, NULL);
115+
m_pDevice->SetStreamSource(0, NULL, 0);
116+
m_pDevice->SetVertexShader(cVertexFVF);
117+
m_pDevice->EndStateBlock(&m_dwSavedStates);
118+
119+
m_pDevice->BeginStateBlock();
120+
m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
121+
m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
122+
m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TFACTOR);
123+
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
124+
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
125+
m_pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
126+
m_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
127+
m_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
128+
m_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
129+
m_pDevice->SetTexture(0, m_pTexture);
130+
m_pDevice->SetStreamSource(0, m_pVB, sizeof(sVertex));
131+
m_pDevice->SetVertexShader(cVertexFVF);
132+
m_pDevice->EndStateBlock(&m_dwFontStates);
133+
}
134+
135+
m_pDevice->CaptureStateBlock(m_dwSavedStates);
136+
m_pDevice->ApplyStateBlock(m_dwFontStates);
137+
}
138+
139+
void CBBFont::End()
140+
{
141+
m_pDevice->ApplyStateBlock(m_dwSavedStates);
142+
}
143+
144+
void CBBFont::InitQuad(char c, float x, float y2, sVertex* pVB)
145+
{
146+
float x2 = x + ((float)m_Metrics[c] * m_fScale);
147+
float y = y2 + (m_fCharHeight * m_fScale);
148+
float tu = (c % 16) / 16.0f;
149+
float tu2 = tu + ((1 / 16.0f) * (m_Metrics[c] / m_fCharWidth));
150+
float tv = (c - (c % 16)) / 256.0f;
151+
float tv2 = tv + 1 / 16.0f;
152+
153+
// x y tu tv
154+
pVB[0].Initialise(x, y2, tu, tv2);
155+
pVB[1].Initialise(x, y, tu, tv);
156+
pVB[2].Initialise(x2, y, tu2, tv);
157+
pVB[3] = pVB[0];
158+
pVB[4] = pVB[2];
159+
pVB[5].Initialise(x2, y2, tu2, tv2);
160+
}

Client/CBBFont.h

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// PUBLIC DOMAIN
2+
3+
#pragma once
4+
5+
#include "main.h"
6+
7+
#define cMaxChars 80
8+
#define cVertexFVF D3DFVF_XYZ|D3DFVF_TEX1
9+
10+
class CBBFont
11+
{
12+
private:
13+
struct sVertex
14+
{
15+
float x, y, z, tu, tv;
16+
void Initialise(float fX, float fY, float fTu, float fTv)
17+
{
18+
x = fX;
19+
y = fY;
20+
z = 0.0f;
21+
tu = fTu;
22+
tv = fTv;
23+
}
24+
};
25+
IDirect3DDevice8* m_pDevice;
26+
IDirect3DTexture8* m_pTexture;
27+
IDirect3DVertexBuffer8* m_pVB;
28+
29+
DWORD m_dwSavedStates;
30+
DWORD m_dwFontStates;
31+
32+
char* m_pTextureFileName;
33+
char* m_pMetricsFileName;
34+
35+
char m_Metrics[255];
36+
float m_fCharWidth;
37+
float m_fCharHeight;
38+
float m_fScale;
39+
public:
40+
CBBFont(IDirect3DDevice8* pDevice, char* pFileName);
41+
~CBBFont();
42+
43+
BOOL Initialise();
44+
float Draw(char* pText, float fYOffset, DWORD dwColor);
45+
void Begin();
46+
void End();
47+
void InitQuad(char c, float x, float y, sVertex* pVB);
48+
};

0 commit comments

Comments
 (0)