Cargador y escritor de CLB GLTF de estilo único/STB
Usado en: BGFX, Filament, Gltfpack, Raylib, Unigine y más.
Carga desde el archivo:
#define CGLTF_IMPLEMENTATION
#include "cgltf.h"
cgltf_options options = { 0 };
cgltf_data * data = NULL ;
cgltf_result result = cgltf_parse_file ( & options , "scene.gltf" , & data );
if ( result == cgltf_result_success )
{
/* TODO make awesome stuff */
cgltf_free ( data );
}Carga desde la memoria:
#define CGLTF_IMPLEMENTATION
#include "cgltf.h"
void * buf ; /* Pointer to glb or gltf file data */
size_t size ; /* Size of the file data */
cgltf_options options = { 0 };
cgltf_data * data = NULL ;
cgltf_result result = cgltf_parse ( & options , buf , size , & data );
if ( result == cgltf_result_success )
{
/* TODO make awesome stuff */
cgltf_free ( data );
} Tenga en cuenta que CGLTF no carga el contenido de archivos adicionales, como buffers o imágenes, en memoria de forma predeterminada. Deberá leer estos archivos utilizando URI de data.buffers[] o data.images[] respectivamente. Para los datos de búfer, alternativamente puede llamar cgltf_load_buffers , que usará API FILE* para abrir y leer archivos de búfer. Esto decodifica automáticamente los URI de datos base64 en buffers. Para los URI de datos en las imágenes, deberá usar cgltf_load_buffer_base64 .
Para obtener una documentación más profunda y una descripción de la interfaz pública, consulte la parte superior del archivo cgltf.h .
Al escribir datos GLTF, necesita una estructura cgltf_data válida que represente un documento GLTF válido. Puede construir tal estructura usted mismo o cargarla utilizando las funciones del cargador descritas anteriormente. Las funciones del escritor no desaniman ningún recuerdo. Por lo tanto, debe hacerlo manualmente o llamar cgltf_free() si obtiene los datos cargándolos desde un documento GLTF.
Escribir al archivo:
#define CGLTF_IMPLEMENTATION
#define CGLTF_WRITE_IMPLEMENTATION
#include "cgltf_write.h"
cgltf_options options = { 0 };
cgltf_data * data = /* TODO must be valid data */ ;
cgltf_result result = cgltf_write_file ( & options , "out.gltf" , data );
if ( result != cgltf_result_success )
{
/* TODO handle error */
}Escribir a la memoria:
#define CGLTF_IMPLEMENTATION
#define CGLTF_WRITE_IMPLEMENTATION
#include "cgltf_write.h"
cgltf_options options = { 0 };
cgltf_data * data = /* TODO must be valid data */ ;
cgltf_size size = cgltf_write ( & options , NULL , 0 , data );
char * buf = malloc ( size );
cgltf_size written = cgltf_write ( & options , buf , size , data );
if ( written != size )
{
/* TODO handle error */
}Tenga en cuenta que CGLTF no escribe el contenido de archivos adicionales, como buffers o imágenes. Tendrá que escribir estos datos usted mismo.
Para obtener una documentación más profunda y una descripción de la interfaz pública, consulte la parte superior del archivo cgltf_write.h .
CGLTF admite Core GLTF 2.0:
CGLTF también admite algunas extensiones GLTF:
CGLTF aún no admite extensiones no listadas. Sin embargo, se puede acceder a extensiones no listadas a través de un miembro de "extensiones" en objetos.
El enfoque más fácil es integrar el archivo de encabezado cgltf.h en su proyecto. Si no está familiarizado con las bibliotecas C de un solo archivo (también conocido como bibliotecas de estilo STB), así es como va:
cgltf.h donde necesite la funcionalidad.CGLTF_IMPLEMENTATION antes de incluir cgltf.h . El soporte para la escritura se puede encontrar en un archivo separado llamado cgltf_write.h (que incluye cgltf.h ). Construirlo funciona de manera análoga utilizando el CGLTF_WRITE_IMPLEMENTATION Define.
Todos son bienvenidos a contribuir a la biblioteca. Si encuentra algún problema, puede enviarlos utilizando el sistema de problemas de GitHub. Si desea contribuir con código, debe desembolsar el proyecto y luego enviar una solicitud de extracción.
Ninguno.
Los encabezados C utilizados por la implementación:
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <assert.h> // If asserts are enabled.
Tenga en cuenta que esta biblioteca tiene una copia del analizador JSMN JSON incrustado en su fuente.
Hay un script de Python en la carpeta test/ que recupera los archivos de muestra GLTF 2.0 desde el repositorio GLTF-Sample-Models (https://github.com/khronosgroup/gltf-sample-models/tree/2.0) y ejecuta la biblioteca contra todos los archivos GLTF y GLB.
Aquí hay una forma de construir y ejecutar la prueba:
cd test ; mkdir build ; cd build ; cmake .. -DCMAKE_BUILD_TYPE=Debug
make -j
cd ..
./test_all.py
También hay una prueba de Fuzz LLVM en fuzz/ . Consulte http://llvm.org/docs/libfuzzer.html para obtener más información.