Khaotic Engine Reborn
Loading...
Searching...
No Matches
bitmap_class.cpp
1#include "bitmap_class.h"
2
3bitmap_class::bitmap_class()
4{
5 vertex_buffer_ = 0;
6 index_buffer_ = 0;
7 texture_ = 0;
8}
9
10
11bitmap_class::bitmap_class(const bitmap_class& other)
12{
13}
14
15
16bitmap_class::~bitmap_class()
17{
18}
19
20
21bool bitmap_class::initialize(ID3D11Device* device, ID3D11DeviceContext* deviceContext, int screenWidth, int screenHeight, char* textureFilename, int renderX, int renderY)
22{
23 Logger::Get().Log("Initializing bitmap class", __FILE__, __LINE__, Logger::LogLevel::Initialize);
24
25 bool result;
26
27 // Store the screen size.
28 screen_width_ = screenWidth;
29 screen_height_ = screenHeight;
30
31 // Store where the bitmap should be rendered to.
32 render_x_ = renderX;
33 render_y_ = renderY;
34
35 // initialize the vertex and index buffer that hold the geometry for the bitmap quad.
36 result = initialize_buffers(device);
37 if (!result)
38 {
39 Logger::Get().Log("Failed to initialize buffers", __FILE__, __LINE__, Logger::LogLevel::Error);
40 return false;
41 }
42
43 // Load the texture for this bitmap.
44 result = load_texture(device, deviceContext, textureFilename);
45 if (!result)
46 {
47 Logger::Get().Log("Failed to load texture", __FILE__, __LINE__, Logger::LogLevel::Error);
48 return false;
49 }
50
51 Logger::Get().Log("Bitmap class initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
52
53 return true;
54}
55
56void bitmap_class::shutdown()
57{
58 // Release the bitmap texture.
59 release_texture();
60
61 // Release the vertex and index buffers.
62 shutdown_buffers();
63
64 return;
65}
66
67bool bitmap_class::render(ID3D11DeviceContext* deviceContext)
68{
69 bool result;
70
71
72 // Update the buffers if the position of the bitmap has changed from its original position.
73 result = update_buffers(deviceContext);
74 if (!result)
75 {
76 Logger::Get().Log("Failed to update buffers", __FILE__, __LINE__, Logger::LogLevel::Error);
77 return false;
78 }
79
80 // Put the vertex and index buffers on the graphics pipeline to prepare them for drawing.
81 render_buffers(deviceContext);
82
83 return true;
84}
85
86int bitmap_class::get_index_count()
87{
88 return index_count_;
89}
90
91ID3D11ShaderResourceView* bitmap_class::get_texture()
92{
93 return texture_->GetTexture();
94}
95
96bool bitmap_class::initialize_buffers(ID3D11Device* device)
97{
98 Logger::Get().Log("Initializing buffers", __FILE__, __LINE__, Logger::LogLevel::Initialize);
99
100 vertex_type* vertices;
101 unsigned long* indices;
102 D3D11_BUFFER_DESC vertexBufferDesc, indexBufferDesc;
103 D3D11_SUBRESOURCE_DATA vertexData, indexData;
104 HRESULT result;
105 int i;
106
107 // initialize the previous rendering position to negative one.
108 prev_pos_x_ = -1;
109 prev_pos_y_ = -1;
110
111 // Set the number of vertices in the vertex array.
112 vertex_count_ = 6;
113
114 // Set the number of indices in the index array.
115 index_count_ = vertex_count_;
116
117 // Create the vertex array.
118 vertices = new vertex_type[vertex_count_];
119
120 // Create the index array.
121 indices = new unsigned long[index_count_];
122
123 // initialize vertex array to zeros at first.
124 memset(vertices, 0, (sizeof(vertex_type) * vertex_count_));
125
126 // Load the index array with data.
127 for (i = 0; i < index_count_; i++)
128 {
129 indices[i] = i;
130 }
131
132 // Set up the description of the dynamic vertex buffer.
133 vertexBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
134 vertexBufferDesc.ByteWidth = sizeof(vertex_type) * vertex_count_;
135 vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
136 vertexBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
137 vertexBufferDesc.MiscFlags = 0;
138 vertexBufferDesc.StructureByteStride = 0;
139
140 // Give the subresource structure a pointer to the vertex data.
141 vertexData.pSysMem = vertices;
142 vertexData.SysMemPitch = 0;
143 vertexData.SysMemSlicePitch = 0;
144
145 // Now finally create the vertex buffer.
146 result = device->CreateBuffer(&vertexBufferDesc, &vertexData, &vertex_buffer_);
147 if (FAILED(result))
148 {
149 Logger::Get().Log("Failed to create vertex buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
150 return false;
151 }
152
153 // Set up the description of the index buffer.
154 indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
155 indexBufferDesc.ByteWidth = sizeof(unsigned long) * index_count_;
156 indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
157 indexBufferDesc.CPUAccessFlags = 0;
158 indexBufferDesc.MiscFlags = 0;
159 indexBufferDesc.StructureByteStride = 0;
160
161 // Give the subresource structure a pointer to the index data.
162 indexData.pSysMem = indices;
163 indexData.SysMemPitch = 0;
164 indexData.SysMemSlicePitch = 0;
165
166 // Create the index buffer.
167 result = device->CreateBuffer(&indexBufferDesc, &indexData, &index_buffer_);
168 if (FAILED(result))
169 {
170 Logger::Get().Log("Failed to create index buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
171 return false;
172 }
173
174 // Release the arrays now that the vertex and index buffers have been created and loaded.
175 delete[] vertices;
176 vertices = 0;
177
178 delete[] indices;
179 indices = 0;
180
181 Logger::Get().Log("Buffers initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
182
183 return true;
184}
185
186void bitmap_class::shutdown_buffers()
187{
188 Logger::Get().Log("Shutting down buffers", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
189
190 // Release the index buffer.
191 if (index_buffer_)
192 {
193 Logger::Get().Log("Releasing index buffer", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
194 index_buffer_->Release();
195 index_buffer_ = 0;
196 Logger::Get().Log("Index buffer released", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
197 }
198
199 // Release the vertex buffer.
200 if (vertex_buffer_)
201 {
202 Logger::Get().Log("Releasing vertex buffer", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
203 vertex_buffer_->Release();
204 vertex_buffer_ = 0;
205 Logger::Get().Log("Vertex buffer released", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
206 }
207
208 Logger::Get().Log("Buffers shut down", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
209
210 return;
211}
212
213bool bitmap_class::update_buffers(ID3D11DeviceContext* deviceContent)
214{
215 float left, right, top, bottom;
216 vertex_type* vertices;
217 D3D11_MAPPED_SUBRESOURCE mappedResource;
218 vertex_type* dataPtr;
219 HRESULT result;
220
221 // If the position we are rendering this bitmap to hasn't changed then don't update the vertex buffer.
222 if ((prev_pos_x_ == render_x_) && (prev_pos_y_ == render_y_))
223 {
224 return true;
225 }
226
227 // If the rendering location has changed then store the new position and update the vertex buffer.
228 prev_pos_x_ = render_x_;
229 prev_pos_y_ = render_y_;
230
231 // Create the vertex array.
232 vertices = new vertex_type[vertex_count_];
233
234 // Calculate the screen coordinates of the left side of the bitmap.
235 left = (float)((screen_width_ / 2) * -1) + (float)render_x_;
236
237 // Calculate the screen coordinates of the right side of the bitmap.
238 right = left + (float)bitmap_width_;
239
240 // Calculate the screen coordinates of the top of the bitmap.
241 top = (float)(screen_height_ / 2) - (float)render_y_;
242
243 // Calculate the screen coordinates of the bottom of the bitmap.
244 bottom = top - (float)bitmap_height_;
245
246 // Load the vertex array with data.
247// First triangle.
248 vertices[0].position = XMFLOAT3(left, top, 0.0f); // Top left.
249 vertices[0].texture = XMFLOAT2(0.0f, 0.0f);
250
251 vertices[1].position = XMFLOAT3(right, bottom, 0.0f); // Bottom right.
252 vertices[1].texture = XMFLOAT2(1.0f, 1.0f);
253
254 vertices[2].position = XMFLOAT3(left, bottom, 0.0f); // Bottom left.
255 vertices[2].texture = XMFLOAT2(0.0f, 1.0f);
256
257 // Second triangle.
258 vertices[3].position = XMFLOAT3(left, top, 0.0f); // Top left.
259 vertices[3].texture = XMFLOAT2(0.0f, 0.0f);
260
261 vertices[4].position = XMFLOAT3(right, top, 0.0f); // Top right.
262 vertices[4].texture = XMFLOAT2(1.0f, 0.0f);
263
264 vertices[5].position = XMFLOAT3(right, bottom, 0.0f); // Bottom right.
265 vertices[5].texture = XMFLOAT2(1.0f, 1.0f);
266
267 // Lock the vertex buffer.
268 result = deviceContent->Map(vertex_buffer_, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
269 if (FAILED(result))
270 {
271 Logger::Get().Log("Failed to map vertex buffer", __FILE__, __LINE__, Logger::LogLevel::Error);
272 return false;
273 }
274
275 // Get a pointer to the data in the constant buffer.
276 dataPtr = (vertex_type*)mappedResource.pData;
277
278 // Copy the data into the vertex buffer.
279 memcpy(dataPtr, (void*)vertices, (sizeof(vertex_type) * vertex_count_));
280
281 // Unlock the vertex buffer.
282 deviceContent->Unmap(vertex_buffer_, 0);
283
284 // Release the pointer reference.
285 dataPtr = 0;
286
287 // Release the vertex array as it is no longer needed.
288 delete[] vertices;
289 vertices = 0;
290
291 return true;
292}
293
294void bitmap_class::render_buffers(ID3D11DeviceContext* deviceContext)
295{
296 unsigned int stride;
297 unsigned int offset;
298
299
300 // Set vertex buffer stride and offset.
301 stride = sizeof(vertex_type);
302 offset = 0;
303
304 // Set the vertex buffer to active in the input assembler so it can be rendered.
305 deviceContext->IASetVertexBuffers(0, 1, &vertex_buffer_, &stride, &offset);
306
307 // Set the index buffer to active in the input assembler so it can be rendered.
308 deviceContext->IASetIndexBuffer(index_buffer_, DXGI_FORMAT_R32_UINT, 0);
309
310 // Set the type of primitive that should be rendered from this vertex buffer, in this case triangles.
311 deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
312
313 return;
314}
315
316bool bitmap_class::load_texture(ID3D11Device* device, ID3D11DeviceContext* deviceContext, char* filename)
317{
318 bool result;
319
320
321 // Create and initialize the texture object.
322 texture_ = new texture_class;
323
324 result = texture_->Initialize(device, deviceContext, filename);
325 if (!result)
326 {
327 Logger::Get().Log("Failed to initialize texture object", __FILE__, __LINE__, Logger::LogLevel::Error);
328 return false;
329 }
330
331 // Store the size in pixels that this bitmap should be rendered at.
332 bitmap_width_ = texture_->GetWidth();
333 bitmap_height_ = texture_->GetHeight();
334
335 return true;
336}
337
338void bitmap_class::release_texture()
339{
340 Logger::Get().Log("Releasing texture", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
341 // Release the texture object.
342 if (texture_)
343 {
344 Logger::Get().Log("Releasing texture object", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
345 texture_->Shutdown();
346 delete texture_;
347 texture_ = 0;
348 Logger::Get().Log("Texture object released", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
349 }
350
351 Logger::Get().Log("Texture released", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
352
353 return;
354}
355
356void bitmap_class::set_render_location(int x, int y)
357{
358 render_x_ = x;
359 render_y_ = y;
360 return;
361}
static Logger & Get()
Definition Logger.h:20
void Log(const std::string &message, const std::string &fileName, int lineNumber, LogLevel level=LogLevel::Info)
Definition Logger.h:158