-
Notifications
You must be signed in to change notification settings - Fork 0
/
Texture.cpp
86 lines (65 loc) · 1.87 KB
/
Texture.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "texture.h"
CTexture::CTexture()
{
Log.LogFile << "Constructing Texture object...OK\n\n";
m_pTexture = NULL;
m_pDevice = NULL;
ZeroMemory(&m_LockedRect, sizeof(D3DLOCKED_RECT));
ZeroMemory(&m_Desc, sizeof(D3DSURFACE_DESC));
m_Width = 0;
m_Height = 0;
}
CTexture::~CTexture()
{
CBase::SafeRelease(m_pTexture, "Releasing Texture");
}
HRESULT CTexture::CreateTextureFromFile(LPDIRECT3DDEVICE9 pDevice, const char *pTextureName, const int ColourKey,
const int Width, const int Height)
{
m_pDevice = pDevice;
Log.LogFile << "Loading Texture " << pTextureName << "...";
HRESULT hr = D3DXCreateTextureFromFileEx(pDevice, pTextureName, Width, Height, 0, 0, D3DFMT_A8R8G8B8,
D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, ColourKey,
NULL, NULL, &m_pTexture);
if(hr == S_OK)
Log.LogFile << "OK\n\n";
else
throw("\nError, file not found...\n\n");
// Get width and height data here cos they may have come from the file, only returns top level
m_pTexture->GetLevelDesc(0, &m_Desc);
m_Width = m_Desc.Width;
m_Height = m_Desc.Height;
return hr;
}
HRESULT CTexture::CreateTexture(LPDIRECT3DDEVICE9 pDevice, const int Width, const int Height)
{
m_pDevice = pDevice;
D3DXCreateTexture(pDevice, Width, Height, 0, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &m_pTexture);
m_Width = Width;
m_Height = Height;
return S_OK;
}
void CTexture::GenerateMipLevels()
{
assert(m_pTexture != NULL);
D3DXFilterTexture(m_pTexture, NULL, 0, D3DX_DEFAULT);
}
void CTexture::SetTexture(const int Stage)
{
assert(m_pTexture != NULL);
GetDevice()->SetTexture(Stage, m_pTexture);
}
LPDIRECT3DTEXTURE9 CTexture::GetTexture()
{
return m_pTexture;
}
// Lock the rect and point ptr to the pixel data
void* CTexture::Lock()
{
m_pTexture->LockRect(0, &m_LockedRect, 0, 0);
return m_LockedRect.pBits;
}
void CTexture::Unlock()
{
m_pTexture->UnlockRect(0);
}