From 4025f7e423f055506114074fc416c39c1ad45327 Mon Sep 17 00:00:00 2001 From: turanszkij Date: Fri, 5 Jan 2018 16:43:56 +0000 Subject: [PATCH] created TGA loader --- Editor/PostprocessWindow.cpp | 2 +- Editor/config.ini | 4 +- WickedEngine/WickedEngine_SHARED.vcxitems | 2 + .../WickedEngine_SHARED.vcxitems.filters | 6 ++ WickedEngine/wiHelper.cpp | 19 ++++++ WickedEngine/wiHelper.h | 20 ++++++ WickedEngine/wiResourceManager.cpp | 50 ++++++++------ WickedEngine/wiResourceManager.h | 2 +- WickedEngine/wiTGATextureLoader.cpp | 66 +++++++++++++++++++ WickedEngine/wiTGATextureLoader.h | 32 +++++++++ WickedEngine/wiVersion.cpp | 2 +- 11 files changed, 180 insertions(+), 25 deletions(-) create mode 100644 WickedEngine/wiTGATextureLoader.cpp create mode 100644 WickedEngine/wiTGATextureLoader.h diff --git a/Editor/PostprocessWindow.cpp b/Editor/PostprocessWindow.cpp index 60f82b134..4b9af3fd6 100644 --- a/Editor/PostprocessWindow.cpp +++ b/Editor/PostprocessWindow.cpp @@ -176,7 +176,7 @@ PostprocessWindow::PostprocessWindow(wiGUI* gui, Renderable3DComponent* comp) : // use the contents of szFile to initialize itself. ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof(szFile); - ofn.lpstrFilter = "Color Grading texture\0*.dds;*.png\0"; + ofn.lpstrFilter = "Color Grading texture\0*.dds;*.png;*.tga\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; diff --git a/Editor/config.ini b/Editor/config.ini index db7591a73..fcbe7ab01 100644 --- a/Editor/config.ini +++ b/Editor/config.ini @@ -1,7 +1,7 @@ enabled 1 x 0 y 0 -w 1920 -h 1080 +w 3840 +h 2160 fullscreen 0 borderless 1 \ No newline at end of file diff --git a/WickedEngine/WickedEngine_SHARED.vcxitems b/WickedEngine/WickedEngine_SHARED.vcxitems index b987d2efb..20cb4b1fc 100644 --- a/WickedEngine/WickedEngine_SHARED.vcxitems +++ b/WickedEngine/WickedEngine_SHARED.vcxitems @@ -363,6 +363,7 @@ + @@ -704,6 +705,7 @@ + diff --git a/WickedEngine/WickedEngine_SHARED.vcxitems.filters b/WickedEngine/WickedEngine_SHARED.vcxitems.filters index 3115c4854..70a4f0f91 100644 --- a/WickedEngine/WickedEngine_SHARED.vcxitems.filters +++ b/WickedEngine/WickedEngine_SHARED.vcxitems.filters @@ -1137,6 +1137,9 @@ ENGINE\Graphics\GPUMapping + + ENGINE\Helpers + @@ -1940,6 +1943,9 @@ UTILITY + + ENGINE\Helpers + diff --git a/WickedEngine/wiHelper.cpp b/WickedEngine/wiHelper.cpp index e06b0468a..56914a722 100644 --- a/WickedEngine/wiHelper.cpp +++ b/WickedEngine/wiHelper.cpp @@ -13,6 +13,25 @@ using namespace std; namespace wiHelper { + DataBlob::DataBlob(const string& fileName) : DATA(nullptr), dataSize(0), dataPos(0) + { + ifstream file(fileName, ios::binary | ios::ate); + + if (file.is_open()) + { + dataSize = file.tellg(); + file.seekg(0, file.beg); + DATA = new char[dataSize]; + file.read(DATA, dataSize); + file.close(); + + dataPos = reinterpret_cast(DATA); + } + } + DataBlob::~DataBlob() + { + SAFE_DELETE_ARRAY(DATA); + } string toUpper(const std::string& s) { diff --git a/WickedEngine/wiHelper.h b/WickedEngine/wiHelper.h index 1705e9c97..fef5eb41b 100644 --- a/WickedEngine/wiHelper.h +++ b/WickedEngine/wiHelper.h @@ -8,6 +8,26 @@ namespace wiHelper { + // Simple binary reader utility + struct DataBlob + { + char* DATA; + size_t dataSize; + size_t dataPos; + + DataBlob(const std::string& fileName = ""); + ~DataBlob(); + + template + void read(T& data) + { + assert(DATA != nullptr); + assert(dataPos - (size_t)DATA < dataSize); + memcpy(&data, reinterpret_cast(dataPos), sizeof(T)); + dataPos += sizeof(T); + } + }; + std::string toUpper(const std::string& s); bool readByteData(const std::string& fileName, BYTE** data, size_t& dataSize); diff --git a/WickedEngine/wiResourceManager.cpp b/WickedEngine/wiResourceManager.cpp index ea99e4558..ddd006e08 100644 --- a/WickedEngine/wiResourceManager.cpp +++ b/WickedEngine/wiResourceManager.cpp @@ -2,6 +2,8 @@ #include "wiRenderer.h" #include "wiSound.h" #include "wiHelper.h" +#include "wiTGATextureLoader.h" +#include "wiTextureHelper.h" using namespace std; using namespace wiGraphicsTypes; @@ -41,6 +43,7 @@ void wiResourceManager::SetUp() types.insert(pair("JPG", IMAGE)); types.insert(pair("PNG", IMAGE)); types.insert(pair("DDS", IMAGE)); + types.insert(pair("TGA", IMAGE)); types.insert(pair("WAV", SOUND)); } @@ -72,7 +75,8 @@ void* wiResourceManager::add(const wiHashString& name, Data_Type newType string nameStr = name.GetString(); string ext = wiHelper::toUpper(nameStr.substr(nameStr.length() - 3, nameStr.length())); Data_Type type; -#pragma region dynamic type selection + + // dynamic type selection: if(newType==Data_Type::DYNAMIC){ filetypes::iterator it = types.find(ext); if(it!=types.end()) @@ -82,7 +86,7 @@ void* wiResourceManager::add(const wiHashString& name, Data_Type newType } else type = newType; -#pragma endregion + void* success = nullptr; LOCK(); @@ -90,19 +94,25 @@ void* wiResourceManager::add(const wiHashString& name, Data_Type newType switch(type){ case Data_Type::IMAGE: { - Texture2D* image=nullptr; + Texture2D* image = nullptr; + + if (ext.compare("TGA") == 0) { - wiRenderer::GetDevice()->CreateTextureFromFile(name.GetString().c_str(), &image, true, GRAPHICSTHREAD_IMMEDIATE); + wiTGATextureLoader loader; + loader.load(nameStr); + image = new Texture2D; + HRESULT hr = wiTextureHelper::CreateTexture(image, loader.texels, (UINT)loader.header.width, (UINT)loader.header.height, 4); + if (FAILED(hr)) + { + SAFE_DELETE(image); + } + } + else + { + wiRenderer::GetDevice()->CreateTextureFromFile(nameStr.c_str(), &image, true, GRAPHICSTHREAD_IMMEDIATE); } - if(image) - success=image; - } - break; - case Data_Type::IMAGE_STAGING: - { - wiHelper::messageBox("IMAGE_STAGING texture loading not implemented in ResourceManager!", "Warning!"); - success = nullptr; + success = image; } break; case Data_Type::SOUND: @@ -119,18 +129,21 @@ void* wiResourceManager::add(const wiHashString& name, Data_Type newType { BYTE* buffer; size_t bufferSize; - if (wiHelper::readByteData(name.GetString(), &buffer, bufferSize)){ + if (wiHelper::readByteData(name.GetString(), &buffer, bufferSize)) + { VertexShaderInfo* vertexShaderInfo = new VertexShaderInfo; vertexShaderInfo->vertexShader = new VertexShader; vertexShaderInfo->vertexLayout = new VertexLayout; wiRenderer::GetDevice()->CreateVertexShader(buffer, bufferSize, vertexShaderInfo->vertexShader); - if (vertexLayoutDesc != nullptr && elementCount > 0){ + if (vertexLayoutDesc != nullptr && elementCount > 0) + { wiRenderer::GetDevice()->CreateInputLayout(vertexLayoutDesc, elementCount, buffer, bufferSize, vertexShaderInfo->vertexLayout); } success = vertexShaderInfo; delete[] buffer; } - else{ + else + { success = nullptr; } } @@ -215,8 +228,8 @@ void* wiResourceManager::add(const wiHashString& name, Data_Type newType break; }; - if(success) - resources.insert( pair(name,new Resource(success,type)) ); + if (success) + resources.insert(pair(name, new Resource(success, type))); UNLOCK(); @@ -248,9 +261,6 @@ bool wiResourceManager::del(const wiHashString& name, bool forceDelete) if(res->data) switch(res->type){ case Data_Type::IMAGE: - case Data_Type::IMAGE_STAGING: - SAFE_DELETE(reinterpret_cast(res->data)); - break; case Data_Type::VERTEXSHADER: SAFE_DELETE(reinterpret_cast(res->data)); break; diff --git a/WickedEngine/wiResourceManager.h b/WickedEngine/wiResourceManager.h index a29cbac52..0ec691544 100644 --- a/WickedEngine/wiResourceManager.h +++ b/WickedEngine/wiResourceManager.h @@ -14,7 +14,7 @@ class wiResourceManager : public wiThreadSafeManager public: enum Data_Type{ DYNAMIC, - IMAGE,IMAGE_STAGING, + IMAGE, SOUND,MUSIC, VERTEXSHADER, PIXELSHADER, diff --git a/WickedEngine/wiTGATextureLoader.cpp b/WickedEngine/wiTGATextureLoader.cpp new file mode 100644 index 000000000..957fbfcfb --- /dev/null +++ b/WickedEngine/wiTGATextureLoader.cpp @@ -0,0 +1,66 @@ +#include "wiTGATextureLoader.h" +#include "wiHelper.h" + +#include + +using namespace std; + +wiTGATextureLoader::wiTGATextureLoader() : texels(nullptr) +{ +} +wiTGATextureLoader::~wiTGATextureLoader() +{ + SAFE_DELETE_ARRAY(texels); +} + +void wiTGATextureLoader::load(const string& fileName) +{ + wiHelper::DataBlob file(fileName); + + if (file.DATA == nullptr) + { + return; + } + + /*Fill our header.*/ + file.read(header.idlength); + file.read(header.colourmaptype); + file.read(header.datatypecode); + file.read(header.colourmaporigin); + file.read(header.colourmaplength); + file.read(header.colourmapdepth); + file.read(header.x_origin); + file.read(header.y_origin); + file.read(header.width); + file.read(header.height); + file.read(header.bitsperpixel); + file.read(header.imagedescriptor); + + /*Allocate memory*/ + texels = new uint8_t[header.width * header.height * 4]; + + /*Start reading and converting our image!*/ + for (int y = 0; y < header.height; ++y) + { + for (int x = 0; x < header.width; ++x) + { + // Origin conversion: + int _X = x; + int _Y = header.height - 1 - y; + int gridpos = (_X + _Y * header.width) * 4; + + /*BGRA --> RGBA*/ + file.read(texels[gridpos + 2]); + file.read(texels[gridpos + 1]); + file.read(texels[gridpos + 0]); + if (header.bitsperpixel == 32) + { + file.read(texels[gridpos + 3]); + } + else if (header.bitsperpixel == 24) + { + texels[gridpos + 3] = 255; + } + } + } +} diff --git a/WickedEngine/wiTGATextureLoader.h b/WickedEngine/wiTGATextureLoader.h new file mode 100644 index 000000000..2c6e290ef --- /dev/null +++ b/WickedEngine/wiTGATextureLoader.h @@ -0,0 +1,32 @@ +#pragma once +#include "CommonInclude.h" + +#include +#include + +struct TGAHeader{ + char idlength; + char colourmaptype; + char datatypecode; + short int colourmaporigin; + short int colourmaplength; + char colourmapdepth; + short int x_origin; + short int y_origin; + short width; + short height; + char bitsperpixel; + char imagedescriptor; +}; + +class wiTGATextureLoader +{ +public: + TGAHeader header; + uint8_t *texels; + + wiTGATextureLoader(); + ~wiTGATextureLoader(); + + void load(const std::string& fname); +}; diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index cbdba9848..71d434bde 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates const int minor = 14; // minor bug fixes, alterations, refactors, updates - const int revision = 16; + const int revision = 17; long GetVersion()