單文件/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。