- Notifications
You must be signed in to change notification settings - Fork142
💠 Single-file glTF 2.0 loader and writer written in C99
License
jkuhlmann/cgltf
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Single-file/stb-style C glTF loader and writer
Used in:bgfx,Filament,gltfpack,raylib,Unigine, and more!
Loading from file:
#defineCGLTF_IMPLEMENTATION#include"cgltf.h"cgltf_optionsoptions= {0};cgltf_data*data=NULL;cgltf_resultresult=cgltf_parse_file(&options,"scene.gltf",&data);if (result==cgltf_result_success){/* TODO make awesome stuff */cgltf_free(data);}
Loading from memory:
#defineCGLTF_IMPLEMENTATION#include"cgltf.h"void*buf;/* Pointer to glb or gltf file data */size_tsize;/* Size of the file data */cgltf_optionsoptions= {0};cgltf_data*data=NULL;cgltf_resultresult=cgltf_parse(&options,buf,size,&data);if (result==cgltf_result_success){/* TODO make awesome stuff */cgltf_free(data);}
Note that cgltf does not load the contents of extra files such as buffers or images into memory by default. You'll need to read these files yourself using URIs fromdata.buffers[]
ordata.images[]
respectively.For buffer data, you can alternatively callcgltf_load_buffers
, which will useFILE*
APIs to open and read buffer files. This automatically decodes base64 data URIs in buffers. For data URIs in images, you will need to usecgltf_load_buffer_base64
.
For more in-depth documentation and a description of the public interface refer to the top of thecgltf.h
file.
When writing glTF data, you need a validcgltf_data
structure that represents a valid glTF document. You can construct such a structure yourself or load it using the loader functions described above. The writer functions do not deallocate any memory. So, you either have to do it manually or callcgltf_free()
if you got the data by loading it from a glTF document.
Writing to file:
#defineCGLTF_IMPLEMENTATION#defineCGLTF_WRITE_IMPLEMENTATION#include"cgltf_write.h"cgltf_optionsoptions= {0};cgltf_data*data=/* TODO must be valid data */;cgltf_resultresult=cgltf_write_file(&options,"out.gltf",data);if (result!=cgltf_result_success){/* TODO handle error */}
Writing to memory:
#defineCGLTF_IMPLEMENTATION#defineCGLTF_WRITE_IMPLEMENTATION#include"cgltf_write.h"cgltf_optionsoptions= {0};cgltf_data*data=/* TODO must be valid data */;cgltf_sizesize=cgltf_write(&options,NULL,0,data);char*buf=malloc(size);cgltf_sizewritten=cgltf_write(&options,buf,size,data);if (written!=size){/* TODO handle error */}
Note that cgltf does not write the contents of extra files such as buffers or images. You'll need to write this data yourself.
For more in-depth documentation and a description of the public interface refer to the top of thecgltf_write.h
file.
cgltf supports core glTF 2.0:
- glb (binary files) and gltf (JSON files)
- meshes (including accessors, buffer views, buffers)
- materials (including textures, samplers, images)
- scenes and nodes
- skins
- animations
- cameras
- morph targets
- extras data
cgltf also supports some glTF extensions:
- EXT_mesh_gpu_instancing
- EXT_meshopt_compression
- EXT_texture_webp
- KHR_draco_mesh_compression (requires a library likeGoogle's Draco for decompression though)
- KHR_lights_punctual
- KHR_materials_anisotropy
- KHR_materials_clearcoat
- KHR_materials_diffuse_transmission
- KHR_materials_dispersion
- KHR_materials_emissive_strength
- KHR_materials_ior
- KHR_materials_iridescence
- KHR_materials_pbrSpecularGlossiness
- KHR_materials_sheen
- KHR_materials_specular
- KHR_materials_transmission
- KHR_materials_unlit
- KHR_materials_variants
- KHR_materials_volume
- KHR_texture_basisu (requires a library likeBinomial Basisu for transcoding to native compressed texture)
- KHR_texture_transform
cgltf doesnot yet support unlisted extensions. However, unlisted extensions can be accessed via "extensions" member on objects.
The easiest approach is to integrate thecgltf.h
header file into your project. If you are unfamiliar with single-file C libraries (also known as stb-style libraries), this is how it goes:
- Include
cgltf.h
where you need the functionality. - Have exactly one source file that defines
CGLTF_IMPLEMENTATION
before includingcgltf.h
. - Use the cgltf functions as described above.
Support for writing can be found in a separate file calledcgltf_write.h
(which includescgltf.h
). Building it works analogously using theCGLTF_WRITE_IMPLEMENTATION
define.
Everyone is welcome to contribute to the library. If you find any problems, you can submit them usingGitHub's issue system. If you want to contribute code, you should fork the project and then send a pull request.
None.
C headers being used by the implementation:
#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.
Note, this library has a copy of theJSMN JSON parser embedded in its source.
There is a Python script in thetest/
folder that retrieves the glTF 2.0 sample files from the glTF-Sample-Models repository (https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0) and runs the library against all gltf and glb files.
Here's one way to build and run the test:
cd test ; mkdir build ; cd build ; cmake .. -DCMAKE_BUILD_TYPE=Debugmake -jcd .../test_all.py
There is also a llvm-fuzz test infuzz/
. Seehttp://llvm.org/docs/LibFuzzer.html for more information.
About
💠 Single-file glTF 2.0 loader and writer written in C99