-
Notifications
You must be signed in to change notification settings - Fork 0
/
XSprite.cpp
140 lines (107 loc) · 3.9 KB
/
XSprite.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#include "XSprite.h"
XSprite::XSprite()
{
}
XSprite::~XSprite()
{
}
bool XSprite::CreateInputLayout()
{
HRESULT hr;
D3D11_INPUT_ELEMENT_DESC polygonLayout[3];
unsigned int numElements;
D3D11_BUFFER_DESC matrixBufferDesc;
// Now setup the layout of the data that goes into the shader.
polygonLayout[0].SemanticName = "POSITION";
polygonLayout[0].SemanticIndex = 0;
polygonLayout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
polygonLayout[0].InputSlot = 0;
polygonLayout[0].AlignedByteOffset = 0;
polygonLayout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
polygonLayout[0].InstanceDataStepRate = 0;
polygonLayout[1].SemanticName = "TEXCOORD";
polygonLayout[1].SemanticIndex = 0;
polygonLayout[1].Format = DXGI_FORMAT_R32G32_FLOAT;
polygonLayout[1].InputSlot = 0;
polygonLayout[1].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
polygonLayout[1].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
polygonLayout[1].InstanceDataStepRate = 0;
polygonLayout[2].SemanticName = "COLOR";
polygonLayout[2].SemanticIndex = 0;
polygonLayout[2].Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
polygonLayout[2].InputSlot = 0;
polygonLayout[2].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT;
polygonLayout[2].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
polygonLayout[2].InstanceDataStepRate = 0;
// Get a count of the elements in the layout.
numElements = sizeof(polygonLayout) / sizeof(polygonLayout[0]);
// Create the vertex input layout.
hr = m_pD3D->GetD3DDevice()->CreateInputLayout(polygonLayout, numElements, m_pShader->GetD3DShader(0)->GetVertexShaderBuffer()->GetBufferPointer(),
m_pShader->GetD3DShader(0)->GetVertexShaderBuffer()->GetBufferSize(), &m_pLayout);
m_pShader->GetD3DShader(0)->GetVertexShaderBuffer()->Release();
m_pShader->GetD3DShader(0)->GetPixelShaderBuffer()->Release();
if (FAILED(hr))
return false;
return true;
}
bool XSprite::CreateVertexBuffer()
{
HRESULT hr; D3D11_BUFFER_DESC vertexBufferDesc;
D3D11_SUBRESOURCE_DATA vertexData;
vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
vertexBufferDesc.ByteWidth = sizeof(m_vertices[0]) * 4;
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vertexBufferDesc.CPUAccessFlags = 0;
vertexBufferDesc.MiscFlags = 0;
vertexBufferDesc.StructureByteStride = 0;
vertexData.pSysMem = m_vertices;
vertexData.SysMemPitch = 0;
vertexData.SysMemSlicePitch = 0;
hr = m_pD3D->GetD3DDevice()->CreateBuffer(&vertexBufferDesc, &vertexData, &m_pVertexBuffer);
if (FAILED(hr))
return false;
return true;
}
bool XSprite::CreateIndexBuffer(void)
{
HRESULT hr;
D3D11_BUFFER_DESC indexBufferDesc;
D3D11_SUBRESOURCE_DATA indexData;
indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
indexBufferDesc.ByteWidth = sizeof(unsigned long) * 6;
indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
indexBufferDesc.CPUAccessFlags = 0;
indexBufferDesc.MiscFlags = 0;
indexBufferDesc.StructureByteStride = 0;
// Give the subresource structure a pointer to the index data.
indexData.pSysMem = m_indices;
indexData.SysMemPitch = 0;
indexData.SysMemSlicePitch = 0;
// Create the index buffer.
hr = m_pD3D->GetD3DDevice()->CreateBuffer(&indexBufferDesc, &indexData, &m_pIndexBuffer);
if (FAILED(hr))
return false;
return true;
}
bool XSprite::Load(const std::string& fileName)
{
if (!m_pTextureManager)
return false;
m_pShader = new XShader(fileName, 0, 0);
LoadD3DShader("Sprite.vs", "Sprite.ps");
const std::string ext = fileName.substr(fileName.find("."), fileName.length());
if (ext == "jpg")
{
if (!m_pTextureManager->Load(fileName, fileName, false))
return false;
}
else if (ext == "tga")
{
TGAImage tgaImg;
if (!tgaImg.Load(fileName))
return false;
if (!m_pTextureManager->CreateTexture(tgaImg.GetImageData(), fileName, tgaImg.GetHeight(), tgaImg.GetWidth(), false))
return false;
}
return true;
}