#pragma once #include "gfx/mesh_obj_load.h" // fn::gfx::Mesh #include namespace fn::gfx { // Carga el primer mesh (primera primitive del primer mesh) de un archivo GLB 2.0. // // Soporta: // - POSITION (vec3 float, obligatorio) // - NORMAL (vec3 float, opcional — si falta se generan normales smooth // area-weighted promediando las normales de cara de cada vertice) // - indices (ubyte/ushort/uint, escalares) — sin indices se interpreta como // lista de triangulos directa. // // Node transform: si el primer nodo que referencia el mesh tiene matrix o TRS, // se aplica a posiciones y normales (normales se transforman con la inversa transpuesta). // // Limitaciones (documentadas): // - Solo GLB (binario). .gltf+.bin separado y data-URIs base64 no soportados. // - Solo el primer mesh / primera primitive. // - Sin texturas ni materiales (mesh viewer usa color uniforme). // - Asume buffer 0 embebido en el chunk BIN. // // Retorna Mesh vacio (positions.empty()) si el parse falla. // El detalle del error esta disponible via gltf_load_last_error(). Mesh gltf_load_mesh_from_file(const char* path); // Variante pura (salvo el buffer): parsea GLB desde un bloque de memoria. // 'data' debe vivir al menos mientras dure la llamada. // Retorna Mesh vacio en fallo; gltf_load_last_error() da el detalle. Mesh gltf_load_mesh_from_memory(const unsigned char* data, size_t size); // Descripcion del ultimo error de gltf_load_mesh_from_file / // gltf_load_mesh_from_memory. Valida hasta la siguiente llamada a cualquiera // de las dos funciones. Nunca retorna nullptr (puede ser ""). const char* gltf_load_last_error(); } // namespace fn::gfx