From b9b9ecb84c1bf853261208b69f4b8e89437d0b0c Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Wed, 29 Apr 2026 19:42:40 +0200 Subject: [PATCH] crafter-build V2 --- implementations/main.cpp | 62 ++++++++++++++++++++++++++------------- project.cpp | 34 ++++++++++++++++++++++ project.json | 63 ---------------------------------------- 3 files changed, 76 insertions(+), 83 deletions(-) create mode 100644 project.cpp delete mode 100644 project.json diff --git a/implementations/main.cpp b/implementations/main.cpp index 01788ce..2bfbefb 100644 --- a/implementations/main.cpp +++ b/implementations/main.cpp @@ -2,21 +2,17 @@ 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; @@ -24,19 +20,44 @@ using namespace Crafter; namespace fs = std::filesystem; int main(int argc, char** argv) { - if (argc != 3 && argc != 2) { // Allow the possibility of just one argument (input file) - std::cout << "Usage: crafter-asset [output_file]\n"; + // 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; } - fs::path inputPath = argv[1]; - fs::path outputPath; + 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 (argc == 3) { - outputPath = argv[2]; - } else { - // Determine extension type for output + if (!hasOutputPath) { std::string extension = inputPath.extension().string(); if (extension == ".obj") { outputPath = inputPath; @@ -56,18 +77,20 @@ int main(int argc, char** argv) { } std::string extension = inputPath.extension().string(); - try { if (extension == ".obj") { - // Load OBJ as MeshAsset with normal/tangent/uv data auto mesh = MeshAsset::LoadOBJ(inputPath); mesh.Save(outputPath); - } + } else if (extension == ".png") { - // Load PNG as TextureAsset - auto texture = TextureAsset>::LoadPNG<_Float16>(inputPath); - texture.Save(outputPath); - } + 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; @@ -76,6 +99,5 @@ int main(int argc, char** argv) { std::cerr << "Error: " << e.what() << "\n"; return 1; } - return 0; } \ No newline at end of file diff --git a/project.cpp b/project.cpp new file mode 100644 index 0000000..a97f7b4 --- /dev/null +++ b/project.cpp @@ -0,0 +1,34 @@ +import std; +import Crafter.Build; +namespace fs = std::filesystem; +using namespace Crafter; + +extern "C" Configuration CrafterBuildProject(std::span args) { + GitProjectSpec mathSpec{ + .source = { .url = "https://forgejo.catcrafts.net/Catcrafts/Crafter.Math.git" }, + .args = std::vector(args.begin(), args.end()), + }; + Configuration* math = GitProject(mathSpec); + + Configuration cfg; + cfg.path = "./"; + cfg.name = "Crafter.Asset"; + ApplyStandardArgs(cfg, args); + cfg.outputName = (cfg.type == ConfigurationType::Executable) ? "crafter-asset" : "Crafter.Asset"; + cfg.dependencies = { math }; + + std::array ifaces = { + "interfaces/Crafter.Asset", + "interfaces/Crafter.Asset-Texture", + "interfaces/Crafter.Asset-Mesh", + }; + if (cfg.type == ConfigurationType::Executable) { + std::array impls = { "implementations/main" }; + cfg.GetInterfacesAndImplementations(ifaces, impls); + } else { + std::array impls = {}; + cfg.GetInterfacesAndImplementations(ifaces, impls); + } + + return cfg; +} diff --git a/project.json b/project.json deleted file mode 100644 index 1cfcfe3..0000000 --- a/project.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "name": "crafter-asset", - "configurations": [ - { - "name": "base", - "implementations": [], - "interfaces": ["interfaces/Crafter.Asset", "interfaces/Crafter.Asset-Texture", "interfaces/Crafter.Asset-Mesh"] - }, - { - "name": "deps-debug", - "extends": ["base"], - "dependencies": [ - { - "path":"https://forgejo.catcrafts.net/Catcrafts/Crafter.Math.git", - "configuration":"lib-debug" - } - ] - }, - { - "name": "deps", - "extends": ["base"], - "type":"executable", - "dependencies": [ - { - "path":"https://forgejo.catcrafts.net/Catcrafts/Crafter.Math.git", - "configuration":"lib" - } - ] - - }, - { - "name": "executable", - "extends": ["deps"], - "implementations": ["implementations/main"], - "type": "executable" - }, - { - "name": "executable-windows", - "extends": ["deps"], - "implementations": ["implementations/main"], - "type": "executable", - "target": "" - }, - { - "name": "executable-debug", - "extends": ["deps-debug"], - "type": "executable", - "implementations": ["implementations/main"], - "debug": true - }, - { - "name": "lib", - "extends": ["deps"], - "type": "library" - }, - { - "name": "lib-debug", - "extends": ["deps-debug"], - "type": "library", - "debug": true - } - ] -}