Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

💠 Single-file glTF 2.0 loader and writer written in C99

License

NotificationsYou must be signed in to change notification settings

jkuhlmann/cgltf

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Single-file/stb-style C glTF loader and writer

Build Status

Used in:bgfx,Filament,gltfpack,raylib,Unigine, and more!

Usage: Loading

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.

Usage: Writing

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.

Features

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.

Building

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:

  1. Includecgltf.h where you need the functionality.
  2. Have exactly one source file that definesCGLTF_IMPLEMENTATION before includingcgltf.h.
  3. 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.

Contributing

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.

Dependencies

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.

Testing

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.


[8]ページ先頭

©2009-2025 Movatter.jp