/* Crafter®.Asset Copyright (C) 2026 Catcrafts® catcrafts.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License version 3.0 as published by the Free Software Foundation; This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ import Crafter.Asset; import Crafter.Math; import std; using namespace Crafter; namespace fs = std::filesystem; int main(int argc, char** argv) { // Parse arguments: crafter-asset [output_file] [--format u8|f16] fs::path inputPath; fs::path outputPath; std::string textureFormat = "f16"; // default bool hasOutputPath = false; std::vector positional; for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; if (arg == "--format" || arg == "-f") { if (i + 1 >= argc) { std::cerr << "Error: --format requires a value (u8 or f16)\n"; return 1; } textureFormat = argv[++i]; if (textureFormat != "u8" && textureFormat != "f16") { std::cerr << "Error: Invalid format '" << textureFormat << "'. Must be 'u8' or 'f16'.\n"; return 1; } } else { positional.push_back(arg); } } if (positional.empty() || positional.size() > 2) { std::cout << "Usage: crafter-asset [output_file] [--format u8|f16]\n"; return 1; } inputPath = positional[0]; if (positional.size() == 2) { outputPath = positional[1]; hasOutputPath = true; } // Check if output path is provided; if not, use input path with a modified extension if (!hasOutputPath) { 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"; return 1; } std::string extension = inputPath.extension().string(); try { if (extension == ".obj") { auto mesh = MeshAsset::LoadOBJ(inputPath); mesh.Save(outputPath); } else if (extension == ".png") { if (textureFormat == "f16") { auto texture = TextureAsset>::LoadPNG<_Float16>(inputPath); texture.Save(outputPath); } else { // u8 auto texture = TextureAsset>::LoadPNG(inputPath); texture.Save(outputPath); } } else { std::cerr << "Unsupported file type: " << extension << "\n"; return 1; } } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << "\n"; return 1; } return 0; }