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()