From fc85c5318b480190c8cd7fa4932d136e6ce0dda5 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Tue, 10 Mar 2026 19:01:01 +0100 Subject: [PATCH] opaque texture check --- interfaces/Crafter.Asset-Texture.cppm | 38 ++++++++++++++++++++------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/interfaces/Crafter.Asset-Texture.cppm b/interfaces/Crafter.Asset-Texture.cppm index 1e2e75b..e974fbe 100644 --- a/interfaces/Crafter.Asset-Texture.cppm +++ b/interfaces/Crafter.Asset-Texture.cppm @@ -26,11 +26,17 @@ import Crafter.Math; namespace fs = std::filesystem; 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 struct TextureAsset { - std::uint32_t sizeX; - std::uint32_t sizeY; - std::uint32_t sizeZ; + std::uint16_t sizeX; + std::uint16_t sizeY; + OpaqueType opaque; std::vector pixels; void Save(fs::path path) { @@ -38,8 +44,7 @@ export namespace Crafter { file.write(reinterpret_cast(&sizeX), sizeof(sizeX)); file.write(reinterpret_cast(&sizeY), sizeof(sizeY)); - file.write(reinterpret_cast(&sizeZ), sizeof(sizeZ)); - + file.write(reinterpret_cast(&opaque), sizeof(opaque)); file.write(reinterpret_cast(pixels.data()), pixels.size() * sizeof(T)); } @@ -50,11 +55,10 @@ export namespace Crafter { file.read(reinterpret_cast(&tex.sizeX), sizeof(tex.sizeX)); file.read(reinterpret_cast(&tex.sizeY), sizeof(tex.sizeY)); - file.read(reinterpret_cast(&tex.sizeZ), sizeof(tex.sizeZ)); + file.read(reinterpret_cast(&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(tex.pixels.data()), tex.sizeX * tex.sizeY * tex.sizeZ * sizeof(T)); + file.read(reinterpret_cast(tex.pixels.data()), tex.sizeX * tex.sizeY * sizeof(T)); return tex; } @@ -70,12 +74,26 @@ export namespace Crafter { tex.sizeX = sizeX; tex.sizeY = sizeY; - tex.sizeZ = 1; tex.pixels.resize(tex.sizeX*tex.sizeY); 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; } };