单文件/STB风格的C GLTF加载器和作家
在:BGFX,细丝,Gltfpack,Raylib,Unigine等中使用!
从文件加载:
#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 );
}从内存加载:
#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 );
}请注意,CGLTF不会将额外文件的内容(例如缓冲区或图像)加载到内存中。您需要分别使用data.buffers[]或data.images[]的URI自己读取这些文件。对于缓冲区数据,您可以调用cgltf_load_buffers ,该cgltf_load_buffers将使用FILE* API打开并读取缓冲区文件。这会自动将基本64数据解码为缓冲区。对于图像中的数据UIS,您需要使用cgltf_load_buffer_base64 。
有关更多深入文档和公共接口的描述,请参阅cgltf.h文件的顶部。
编写GLTF数据时,您需要一个有效的cgltf_data结构,该结构代表有效的GLTF文档。您可以自己构建这样的结构,也可以使用上述加载器功能加载它。作者函数不会划分任何内存。因此,如果您通过从GLTF文档加载数据来获得数据,则必须手动执行此操作,或者调用cgltf_free() 。
写入文件:
#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 */
}写入记忆:
#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 */
}请注意,CGLTF不会编写额外文件的内容,例如缓冲区或图像。您需要自己编写这些数据。
有关更多深入文档和公共接口的描述,请参阅cgltf_write.h文件的顶部。
CGLTF支持Core GLTF 2.0:
CGLTF还支持一些GLTF扩展:
CGLTF尚未支持未列出的扩展。但是,可以通过对象上的“扩展”成员访问未列出的扩展。
最简单的方法是将cgltf.h标头文件集成到您的项目中。如果您不熟悉单文件C库(也称为STB风格的库),那么它就是这样做的:
cgltf.h 。cgltf.h之前,请恰好有一个定义CGLTF_IMPLEMENTATION源文件。可以在称为cgltf_write.h (包括cgltf.h )的单独文件中找到写作的支持。使用CGLTF_WRITE_IMPLEMENTATION DEDINE类似地工作。
欢迎每个人为图书馆做出贡献。如果发现任何问题,可以使用GitHub的问题系统提交它们。如果要贡献代码,则应分配项目,然后发送拉动请求。
没有任何。
实施使用的C标题:
#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.
请注意,该库具有嵌入在其来源中的JSMN JSON PARSER的副本。
test/文件夹中有一个Python脚本,可以从GLTF-Sample-Models存储库中检索GLTF 2.0示例文件(https://github.com/khronosgroup/khronosgroup/gltf-sample-models/tree/tree/master/2.0),并针对所有GLGLB和GLB文件运行库。
这是构建和运行测试的一种方法:
cd test ; mkdir build ; cd build ; cmake .. -DCMAKE_BUILD_TYPE=Debug
make -j
cd ..
./test_all.py
fuzz/也有LLVM-Fuzz测试。有关更多信息,请参见http://llvm.org/docs/libfuzzer.html。