opaque texture check
This commit is contained in:
parent
00a5704653
commit
fc85c5318b
1 changed files with 28 additions and 10 deletions
|
|
@ -26,11 +26,17 @@ import Crafter.Math;
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
export namespace Crafter {
|
export namespace Crafter {
|
||||||
|
enum class OpaqueType : std::uint8_t {
|
||||||
|
FullyOpaque, // All pixels have A of 255
|
||||||
|
SemiOpaque, // All pixels have A of 0 or 255 (no blending needed)
|
||||||
|
Transparent // Color blending is used
|
||||||
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
struct TextureAsset {
|
struct TextureAsset {
|
||||||
std::uint32_t sizeX;
|
std::uint16_t sizeX;
|
||||||
std::uint32_t sizeY;
|
std::uint16_t sizeY;
|
||||||
std::uint32_t sizeZ;
|
OpaqueType opaque;
|
||||||
std::vector<T> pixels;
|
std::vector<T> pixels;
|
||||||
|
|
||||||
void Save(fs::path path) {
|
void Save(fs::path path) {
|
||||||
|
|
@ -38,8 +44,7 @@ export namespace Crafter {
|
||||||
|
|
||||||
file.write(reinterpret_cast<char*>(&sizeX), sizeof(sizeX));
|
file.write(reinterpret_cast<char*>(&sizeX), sizeof(sizeX));
|
||||||
file.write(reinterpret_cast<char*>(&sizeY), sizeof(sizeY));
|
file.write(reinterpret_cast<char*>(&sizeY), sizeof(sizeY));
|
||||||
file.write(reinterpret_cast<char*>(&sizeZ), sizeof(sizeZ));
|
file.write(reinterpret_cast<char*>(&opaque), sizeof(opaque));
|
||||||
|
|
||||||
file.write(reinterpret_cast<char*>(pixels.data()), pixels.size() * sizeof(T));
|
file.write(reinterpret_cast<char*>(pixels.data()), pixels.size() * sizeof(T));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -50,11 +55,10 @@ export namespace Crafter {
|
||||||
|
|
||||||
file.read(reinterpret_cast<char*>(&tex.sizeX), sizeof(tex.sizeX));
|
file.read(reinterpret_cast<char*>(&tex.sizeX), sizeof(tex.sizeX));
|
||||||
file.read(reinterpret_cast<char*>(&tex.sizeY), sizeof(tex.sizeY));
|
file.read(reinterpret_cast<char*>(&tex.sizeY), sizeof(tex.sizeY));
|
||||||
file.read(reinterpret_cast<char*>(&tex.sizeZ), sizeof(tex.sizeZ));
|
file.read(reinterpret_cast<char*>(&tex.opaque), sizeof(tex.opaque));
|
||||||
|
tex.pixels.resize(tex.sizeX * tex.sizeY);
|
||||||
|
|
||||||
tex.pixels.resize(tex.sizeX * tex.sizeY * tex.sizeZ);
|
file.read(reinterpret_cast<char*>(tex.pixels.data()), tex.sizeX * tex.sizeY * sizeof(T));
|
||||||
|
|
||||||
file.read(reinterpret_cast<char*>(tex.pixels.data()), tex.sizeX * tex.sizeY * tex.sizeZ * sizeof(T));
|
|
||||||
return tex;
|
return tex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -70,12 +74,26 @@ export namespace Crafter {
|
||||||
|
|
||||||
tex.sizeX = sizeX;
|
tex.sizeX = sizeX;
|
||||||
tex.sizeY = sizeY;
|
tex.sizeY = sizeY;
|
||||||
tex.sizeZ = 1;
|
|
||||||
|
|
||||||
tex.pixels.resize(tex.sizeX*tex.sizeY);
|
tex.pixels.resize(tex.sizeX*tex.sizeY);
|
||||||
|
|
||||||
std::memcpy(tex.pixels.data(), data, tex.sizeX * tex.sizeY * 4);
|
std::memcpy(tex.pixels.data(), data, tex.sizeX * tex.sizeY * 4);
|
||||||
|
|
||||||
|
tex.opaque = OpaqueType::FullyOpaque;
|
||||||
|
|
||||||
|
for(std::uint32_t i = 0; i < tex.sizeX* tex.sizeY; i++) {
|
||||||
|
if(tex.pixels[i].a != 255) {
|
||||||
|
tex.opaque = OpaqueType::SemiOpaque;
|
||||||
|
for(std::uint32_t i2 = i; i2 < tex.sizeX* tex.sizeY; i2++) {
|
||||||
|
if(tex.pixels[i].a != 0 && tex.pixels[i].a != 255) {
|
||||||
|
tex.opaque = OpaqueType::Transparent;
|
||||||
|
return tex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return tex;
|
return tex;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue