1#include "texture_class.h"
3texture_class::texture_class()
16texture_class::~texture_class()
20bool texture_class::Initialize(ID3D11Device * device, ID3D11DeviceContext * deviceContext, std::string filename)
22 Logger::Get().
Log((
"Iinitializing texture: %s", filename), __FILE__, __LINE__, Logger::LogLevel::Initialize);
25 D3D11_TEXTURE2D_DESC textureDesc;
27 unsigned int rowPitch;
28 D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
30 result = LoadTarga(filename);
33 Logger::Get().
Log(
"Failed to load targa data", __FILE__, __LINE__, Logger::LogLevel::Error);
37 textureDesc.Height = m_height;
38 textureDesc.Width = m_width;
39 textureDesc.MipLevels = 0;
40 textureDesc.ArraySize = 1;
41 textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
42 textureDesc.SampleDesc.Count = 1;
43 textureDesc.SampleDesc.Quality = 0;
44 textureDesc.Usage = D3D11_USAGE_DEFAULT;
45 textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
46 textureDesc.CPUAccessFlags = 0;
47 textureDesc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS;
50 hResult = device->CreateTexture2D(&textureDesc, NULL, &m_texture);
53 Logger::Get().
Log(
"Failed to create texture", __FILE__, __LINE__, Logger::LogLevel::Error);
58 rowPitch = (m_width * 4) *
sizeof(
unsigned char);
60 deviceContext->UpdateSubresource(m_texture, 0, NULL, m_targaData, rowPitch, 0);
62 srvDesc.Format = textureDesc.Format;
63 srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
64 srvDesc.Texture2D.MostDetailedMip = 0;
65 srvDesc.Texture2D.MipLevels = -1;
68 hResult = device->CreateShaderResourceView(m_texture, &srvDesc, &m_textureView);
71 Logger::Get().
Log(
"Failed to create shader resource view", __FILE__, __LINE__, Logger::LogLevel::Error);
76 deviceContext->GenerateMips(m_textureView);
82 Logger::Get().
Log(
"Texture initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
87void texture_class::Shutdown()
90 Logger::Get().
Log(
"Shutting down texture", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
94 m_textureView->Release();
101 m_texture->Release();
108 delete[] m_targaData;
112 Logger::Get().
Log(
"Texture shut down", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
117ID3D11ShaderResourceView* texture_class::GetTexture()
119 return m_textureView;
122bool texture_class::LoadTarga(std::string filename)
125 Logger::Get().
Log((
"Loading targa file: %s", filename), __FILE__, __LINE__);
126 int error, bpp, imageSize, index, i, j, k;
129 TargaHeader targaFileHeader;
130 unsigned char* targaImage;
134 error = fopen_s(&filePtr, filename.c_str(),
"rb");
137 Logger::Get().
Log(
"Failed to open targa file. Working directory: " + std::filesystem::current_path().
string(), __FILE__, __LINE__, Logger::LogLevel::Error);
142 count = (
unsigned int)fread(&targaFileHeader,
sizeof(TargaHeader), 1, filePtr);
145 Logger::Get().
Log(
"Failed to read targa file header", __FILE__, __LINE__, Logger::LogLevel::Error);
150 m_height = (int)targaFileHeader.height;
151 m_width = (int)targaFileHeader.width;
152 bpp = (int)targaFileHeader.bpp;
155 if (bpp != 32 && bpp != 24)
157 Logger::Get().
Log(
"Targa file is not 32 or 24 bit", __FILE__, __LINE__, Logger::LogLevel::Error);
162 imageSize = m_width * m_height * (bpp / 8);
165 targaImage =
new unsigned char[imageSize];
168 count = (
unsigned int)fread(targaImage, 1, imageSize, filePtr);
169 if (count != imageSize)
171 Logger::Get().
Log(
"Failed to read targa image data", __FILE__, __LINE__, Logger::LogLevel::Error);
176 error = fclose(filePtr);
179 Logger::Get().
Log(
"Failed to close targa file", __FILE__, __LINE__, Logger::LogLevel::Error);
184 m_targaData =
new unsigned char[imageSize];
190 k = (m_width * m_height * (bpp / 8)) - (m_width * (bpp / 8));
193 for (j = 0; j < m_height; j++)
195 for (i = 0; i < m_width; i++)
197 if (index + 3 < imageSize)
199 m_targaData[index + 0] = targaImage[k + 2];
200 m_targaData[index + 1] = targaImage[k + 1];
201 m_targaData[index + 2] = targaImage[k + 0];
204 m_targaData[index + 3] = targaImage[k + 3];
209 Logger::Get().
Log(
"Index out of bounds", __FILE__, __LINE__, Logger::LogLevel::Error);
219 k -= (m_width * (bpp / 8) * 2);
227 Logger::Get().
Log((
"targa file %s loaded", filename), __FILE__, __LINE__);
233int texture_class::GetWidth()
239int texture_class::GetHeight()
void Log(const std::string &message, const std::string &fileName, int lineNumber, LogLevel level=LogLevel::Info)