All Projects → syoyo → Tinygltf

syoyo / Tinygltf

Licence: mit
Header only C++11 tiny glTF 2.0 library

Programming Languages

cpp
1120 projects

Labels

Projects that are alternatives of or similar to Tinygltf

MeshIO
CloudCompare plugin for loading COLLADA, glTF, and IFC-SPF 3D models
Stars: ✭ 14 (-98.45%)
Mutual labels:  gltf
Xeokit Sdk
Open source JavaScript SDK for viewing high-detail, full-precision 3D BIM and AEC models in the Web browser.
Stars: ✭ 316 (-65.08%)
Mutual labels:  gltf
Lighthouse2
Lighthouse 2 framework for real-time ray tracing
Stars: ✭ 542 (-40.11%)
Mutual labels:  gltf
Fx Gltf
A C++14/C++17 header-only library for simple, efficient, and robust serialization/deserialization of glTF 2.0
Stars: ✭ 257 (-71.6%)
Mutual labels:  gltf
Gltfutility
Simple GLTF importer for Unity
Stars: ✭ 305 (-66.3%)
Mutual labels:  gltf
3dtilesrendererjs
Renderer for 3D Tiles in Javascript using three.js
Stars: ✭ 333 (-63.2%)
Mutual labels:  gltf
VRMKit
VRM loader and VRM renderer (3D model / gltf)
Stars: ✭ 85 (-90.61%)
Mutual labels:  gltf
Engine
Fast and lightweight JavaScript game engine built on WebGL and glTF
Stars: ✭ 6,890 (+661.33%)
Mutual labels:  gltf
Gltf Sdk
glTF-SDK is a C++ Software Development Kit for glTF (GL Transmission Format -https://github.com/KhronosGroup/glTF).
Stars: ✭ 312 (-65.52%)
Mutual labels:  gltf
Objto3d Tiles
Convert obj model file to 3d tiles
Stars: ✭ 480 (-46.96%)
Mutual labels:  gltf
Gltf Vscode
This is an extension for Visual Studio Code to add support for editing glTF files.
Stars: ✭ 259 (-71.38%)
Mutual labels:  gltf
Exporters
Exporters for Babylon.js and gltf file formats
Stars: ✭ 302 (-66.63%)
Mutual labels:  gltf
Vulkan Gltf Pbr
Physical based rendering with Vulkan using glTF 2.0 models
Stars: ✭ 438 (-51.6%)
Mutual labels:  gltf
orkid
Orkid Media Engine (C++/Lua/Python3/Linux/MacOs/OpenVR/Qt5)
Stars: ✭ 20 (-97.79%)
Mutual labels:  gltf
Clay Viewer
3D model viewer with high quality rendering and glTF2.0/GLB export
Stars: ✭ 558 (-38.34%)
Mutual labels:  gltf
vpx-js
🎮 Visual Pinball in the Browser
Stars: ✭ 38 (-95.8%)
Mutual labels:  gltf
Spoke
Easily create custom 3D environments
Stars: ✭ 321 (-64.53%)
Mutual labels:  gltf
Gltf Pipeline
Content pipeline tools for optimizing glTF assets. 🌐
Stars: ✭ 789 (-12.82%)
Mutual labels:  gltf
Cgltf
💠 Single-file glTF 2.0 loader and writer written in C99
Stars: ✭ 628 (-30.61%)
Mutual labels:  gltf
Castle Engine
Cross-platform (desktop, mobile, console) 3D and 2D game engine supporting many asset formats (glTF, X3D, Spine...) and using modern Object Pascal
Stars: ✭ 475 (-47.51%)
Mutual labels:  gltf

Header only C++ tiny glTF library(loader/saver).

TinyGLTF is a header only C++11 glTF 2.0 https://github.com/KhronosGroup/glTF library.

TinyGLTF uses Niels Lohmann's json library(https://github.com/nlohmann/json), so now it requires C++11 compiler. If you are looking for old, C++03 version, please use devel-picojson branch(but not maintained anymore).

Status

  • v2.4.0 Experimental RapidJSON support. Experimental C++14 support(C++14 may give better performance)
  • v2.3.0 Modified Material representation according to glTF 2.0 schema(and introduced TextureInfo class)
  • v2.2.0 release(Support loading 16bit PNG. Sparse accessor support)
  • v2.1.0 release(Draco support)
  • v2.0.0 release(22 Aug, 2018)!

Branches

  • sajson : Use sajson to parse JSON. Parsing only but faster compile time(2x reduction compared to json.hpp and RapidJson)

Builds

Build Status

Build status

C/C++ CI

Features

  • Written in portable C++. C++-11 with STL dependency only.
    • [x] macOS + clang(LLVM)
    • [x] iOS + clang
    • [x] Linux + gcc/clang
    • [x] Windows + MinGW
    • [x] Windows + Visual Studio 2015 Update 3 or later.
      • Visual Studio 2013 is not supported since they have limited C++11 support and failed to compile json.hpp.
    • [x] Android NDK
    • [x] Android + CrystaX(NDK drop-in replacement) GCC
    • [x] Web using Emscripten(LLVM)
  • Moderate parsing time and memory consumption.
  • glTF specification v2.0.0
    • [x] ASCII glTF
      • [x] Load
      • [x] Save
    • [x] Binary glTF(GLB)
      • [x] Load
      • [x] Save(.bin embedded .glb)
  • Buffers
    • [x] Parse BASE64 encoded embedded buffer data(DataURI).
    • [x] Load .bin file.
  • Image(Using stb_image)
    • [x] Parse BASE64 encoded embedded image data(DataURI).
    • [x] Load external image file.
    • [x] Load PNG(8bit and 16bit)
    • [x] Load JPEG(8bit only)
    • [x] Load BMP
    • [x] Load GIF
    • [x] Custom Image decoder callback(e.g. for decoding OpenEXR image)
  • Morph traget
    • [x] Sparse accessor
  • Load glTF from memory
  • Custom callback handler
    • [x] Image load
    • [x] Image save
  • Extensions
    • [x] Draco mesh decoding
    • [ ] Draco mesh encoding

Note on extension property

In extension(ExtensionMap), JSON number value is parsed as int or float(number) and stored as tinygltf::Value object. If you want a floating point value from tinygltf::Value, use GetNumberAsDouble() method.

IsNumber() returns true if the underlying value is an int value or a floating point value.

Examples

  • glview : Simple glTF geometry viewer.
  • validator : Simple glTF validator with JSON schema.
  • basic : Basic glTF viewer with texturing support.
  • build-gltf : Build simple glTF scene from a scratch.

Projects using TinyGLTF

TODOs

  • [ ] Write C++ code generator which emits C++ code from JSON schema for robust parsing.
  • [ ] Mesh Compression/decompression(Open3DGC, etc)
    • [x] Load Draco compressed mesh
    • [ ] Save Draco compressed mesh
    • [ ] Open3DGC?
  • [x] Support extensions and extras property
  • [ ] HDR image?
    • [ ] OpenEXR extension through TinyEXR.
  • [ ] 16bit PNG support in Serialization
  • [ ] Write example and tests for animation and skin

Licenses

TinyGLTF is licensed under MIT license.

TinyGLTF uses the following third party libraries.

  • json.hpp : Copyright (c) 2013-2017 Niels Lohmann. MIT license.
  • base64 : Copyright (C) 2004-2008 René Nyffenegger
  • stb_image.h : v2.08 - public domain image loader - Github link
  • stb_image_write.h : v1.09 - public domain image writer - Github link

Build and example

Copy stb_image.h, stb_image_write.h, json.hpp and tiny_gltf.h to your project.

Loading glTF 2.0 model

// Define these only in *one* .cc file.
#define TINYGLTF_IMPLEMENTATION
#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION
// #define TINYGLTF_NOEXCEPTION // optional. disable exception handling.
#include "tiny_gltf.h"

using namespace tinygltf;

Model model;
TinyGLTF loader;
std::string err;
std::string warn;

bool ret = loader.LoadASCIIFromFile(&model, &err, &warn, argv[1]);
//bool ret = loader.LoadBinaryFromFile(&model, &err, &warn, argv[1]); // for binary glTF(.glb)

if (!warn.empty()) {
  printf("Warn: %s\n", warn.c_str());
}

if (!err.empty()) {
  printf("Err: %s\n", err.c_str());
}

if (!ret) {
  printf("Failed to parse glTF\n");
  return -1;
}

Loader options

  • TinyGLTF::SetPreserveimageChannels(bool onoff). true to preserve image channels as stored in image file for loaded image. false by default for backward compatibility(image channels are widen to RGBA 4 channels). Effective only when using builtin image loader(STB image loader).

Compile options

  • TINYGLTF_NOEXCEPTION : Disable C++ exception in JSON parsing. You can use -fno-exceptions or by defining the symbol JSON_NOEXCEPTION and TINYGLTF_NOEXCEPTION to fully remove C++ exception codes when compiling TinyGLTF.
  • TINYGLTF_NO_STB_IMAGE : Do not load images with stb_image. Instead use TinyGLTF::SetImageLoader(LoadimageDataFunction LoadImageData, void *user_data) to set a callback for loading images.
  • TINYGLTF_NO_STB_IMAGE_WRITE : Do not write images with stb_image_write. Instead use TinyGLTF::SetImageWriter(WriteimageDataFunction WriteImageData, void *user_data) to set a callback for writing images.
  • TINYGLTF_NO_EXTERNAL_IMAGE : Do not try to load external image file. This option would be helpful if you do not want to load image files during glTF parsing.
  • TINYGLTF_ANDROID_LOAD_FROM_ASSETS: Load all files from packaged app assets instead of the regular file system. Note: You must pass a valid asset manager from your android app to tinygltf::asset_manager beforehand.
  • TINYGLTF_ENABLE_DRACO: Enable Draco compression. User must provide include path and link correspnding libraries in your project file.
  • TINYGLTF_NO_INCLUDE_JSON: Disable including json.hpp from within tiny_gltf.h because it has been already included before or you want to include it using custom path before including tiny_gltf.h.
  • TINYGLTF_NO_INCLUDE_RAPIDJSON: Disable including RapidJson's header files from within tiny_gltf.h because it has been already included before or you want to include it using custom path before including tiny_gltf.h.
  • TINYGLTF_NO_INCLUDE_STB_IMAGE: Disable including stb_image.h from within tiny_gltf.h because it has been already included before or you want to include it using custom path before including tiny_gltf.h.
  • TINYGLTF_NO_INCLUDE_STB_IMAGE_WRITE: Disable including stb_image_write.h from within tiny_gltf.h because it has been already included before or you want to include it using custom path before including tiny_gltf.h.
  • TINYGLTF_USE_RAPIDJSON : Use RapidJSON as a JSON parser/serializer. RapidJSON files are not included in TinyGLTF repo. Please set an include path to RapidJSON if you enable this featrure.
  • TINYGLTF_USE_CPP14 : Use C++14 feature(requires C++14 compiler). This may give better performance than C++11.

Saving gltTF 2.0 model

  • Buffers.
    • [x] To file
    • [x] Embedded
    • [ ] Draco compressed?
  • [x] Images
    • [x] To file
    • [x] Embedded
  • Binary(.glb)
    • [x] .bin embedded single .glb
    • [ ] External .bin

Running tests.

glTF parsing test

Setup

Python 2.6 or 2.7 required. Git clone https://github.com/KhronosGroup/glTF-Sample-Models to your local dir.

Run parsing test

After building loader_example, edit test_runner.py, then,

$ python test_runner.py

Unit tests

$ cd tests
$ make
$ ./tester
$ ./tester_noexcept

Fuzzing tests

See tests/fuzzer for details.

After running fuzzer on Ryzen9 3950X a week, at least LoadASCIIFromString looks safe except for out-of-memory error in Fuzzer. We may be better to introduce bounded memory size checking when parsing glTF data.

Third party licenses

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].