diff --git a/implementations/main.cpp b/implementations/main.cpp index adca7f5..ff86818 100644 --- a/implementations/main.cpp +++ b/implementations/main.cpp @@ -24,13 +24,31 @@ using namespace Crafter; namespace fs = std::filesystem; int main(int argc, char** argv) { - if (argc != 3) { - std::cout << "Usage: crafter-asset \n"; + if (argc != 3 && argc != 2) { // Allow the possibility of just one argument (input file) + std::cout << "Usage: crafter-asset [output_file]\n"; return 1; } fs::path inputPath = argv[1]; - fs::path outputPath = argv[2]; + fs::path outputPath; + + // Check if output path is provided; if not, use input path with a modified extension + if (argc == 3) { + outputPath = argv[2]; + } else { + // Determine extension type for output + std::string extension = inputPath.extension().string(); + if (extension == ".obj") { + outputPath = inputPath; + outputPath.replace_extension(".mesh"); + } else if (extension == ".png") { + outputPath = inputPath; + outputPath.replace_extension(".tex"); + } else { + std::cerr << "Unsupported file type: " << extension << "\n"; + return 1; + } + } if (!fs::exists(inputPath)) { std::cerr << "Error: Input file does not exist.\n"; @@ -47,7 +65,7 @@ int main(int argc, char** argv) { } else if (extension == ".png") { // Load PNG as TextureAsset - auto texture = TextureAsset>::LoadPNG(inputPath); + auto texture = TextureAsset>::LoadPNG(inputPath); texture.Save(outputPath); } else { diff --git a/interfaces/Crafter.Asset-Texture.cppm b/interfaces/Crafter.Asset-Texture.cppm index e974fbe..aa9137d 100644 --- a/interfaces/Crafter.Asset-Texture.cppm +++ b/interfaces/Crafter.Asset-Texture.cppm @@ -62,7 +62,7 @@ export namespace Crafter { return tex; } - static TextureAsset LoadPNG(fs::path path) requires (std::same_as>) { + static TextureAsset LoadPNG(fs::path path) { TextureAsset tex; std::filesystem::path abs = std::filesystem::absolute(path); @@ -77,23 +77,50 @@ export namespace Crafter { 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; + if constexpr(std::same_as || std::same_as || std::same_as) { + for(std::uint32_t i = 0; i < sizeX*sizeY; i++) { + tex.pixels[i].r = (((T)data[i*4])/255); + tex.pixels[i].g = (((T)data[i*4+1])/255); + tex.pixels[i].b = (((T)data[i*4+2])/255); + tex.pixels[i].a = (((T)data[i*4+3])/255); + } + + for(std::uint32_t i = 0; i < tex.sizeX* tex.sizeY; i++) { + if(tex.pixels[i].a != 1) { + tex.opaque = OpaqueType::SemiOpaque; + for(std::uint32_t i2 = i; i2 < tex.sizeX* tex.sizeY; i2++) { + if(tex.pixels[i2].a != 0 && tex.pixels[i2].a != 1) { + tex.opaque = OpaqueType::Transparent; + stbi_image_free(data); + return tex; + } } + stbi_image_free(data); + return tex; + } + } + } else { + std::memcpy(tex.pixels.data(), data, tex.sizeX * tex.sizeY * 4); + + 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[i2].a != 0 && tex.pixels[i2].a != 255) { + tex.opaque = OpaqueType::Transparent; + stbi_image_free(data); + return tex; + } + } + stbi_image_free(data); + return tex; } - return tex; } } + stbi_image_free(data); return tex; } };