TinyGLTF僅是C ++ 11 GLTF 2.0 https://github.com/khronosgroup/gltf庫。
TinyGLTF使用Niels Lohmann的JSON庫(https://github.com/nlohmann/json),因此現在需要C ++ 11編譯器。 (另外,您可以將Radpidjson用作JSON後端)如果您正在尋找舊的C ++ 03版本,請使用devel-picojson Branch(但不再維護)。
當前TinyGLTF穩定且維護模式。沒有計劃的更改和功能增加。
sajson :使用Sajson解析JSON。僅解析但更快的編譯時間(與JSON.HPP和Rapidjson相比減少了2倍),但保持不佳。 可能主要是完整的。最後缺少的功能是Draco編碼:#207
json.hpp 。 .bin文件。在擴展( ExtensionMap )中,JSON數字值被解析為INT或FLOAT(數字),並將其存儲為tinygltf::Value Object。如果您想要從tinygltf::Value中的浮點值,請使用GetNumberAsDouble()方法。
如果基本值是int值或浮點值, IsNumber()將返回true。
想要安全,安全地運行TinyGLTF的用戶(例如需要處理Mifucit GLTF文件以服務於在線GLTF),我建議為WASM Target構建TinyGLTF。 WASI構建示例位於WASM中。
-3D引擎與現代圖形extensions和extras屬性animation和skin的示例和測試TinyGLTF已根據MIT許可獲得許可。
TinyGLTF使用以下第三方庫。
複製stb_image.h , stb_image_write.h , json.hpp和tiny_gltf.h到您的項目。
// 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 ;
}TinyGLTF::SetPreserveimageChannels(bool onoff) 。 true中存儲在圖像文件中的圖像通道以保存圖像通道。默認情況下, false的向後兼容性(圖像通道將擴大到RGBA 4通道)。僅在使用內置圖像加載器(STB圖像加載程序)時有效。 TINYGLTF_NOEXCEPTION :JSON解析中禁用C ++例外。您可以使用-fno-exceptions ,也可以通過定義符號JSON_NOEXCEPTION和TINYGLTF_NOEXCEPTION來完全刪除C ++異常代碼時,在編譯TinyGlTF時。TINYGLTF_NO_STB_IMAGE :請勿使用stb_image加載圖像。而是使用TinyGLTF::SetImageLoader(LoadimageDataFunction LoadImageData, void *user_data)設置用於加載圖像的回調。TINYGLTF_NO_STB_IMAGE_WRITE :請勿使用stb_image_write編寫圖像。而是使用TinyGLTF::SetImageWriter(WriteimageDataFunction WriteImageData, void *user_data)設置用於編寫圖像的回調。TINYGLTF_NO_EXTERNAL_IMAGE :不要嘗試加載外部圖像文件。如果您不想在GLTF解析過程中加載圖像文件,此選項將有所幫助。TINYGLTF_ANDROID_LOAD_FROM_ASSETS :加載包裝應用程序資產而不是常規文件系統中的所有文件。注意:您必須事先將有效的資產管理器從Android應用程序傳遞到tinygltf::asset_manager 。TINYGLTF_ENABLE_DRACO :啟用draco壓縮。用戶必須提供項目文件中的路徑和鏈接相關庫。TINYGLTF_NO_INCLUDE_JSON :禁用包括tiny_gltf.h中的json.hpp ,因為它已經包含在之前包含了tiny_gltf.h 。TINYGLTF_NO_INCLUDE_RAPIDJSON :禁用來自tiny_gltf.h中的RapidJson的標頭文件,因為它已經在之前包含了,或者您想在包含tiny_gltf.h之前使用自定義路徑包含它。TINYGLTF_NO_INCLUDE_STB_IMAGE :禁用,包括tiny_gltf.h中的stb_image.h ,因為它已經在以前包含了tiny_gltf.h中,或者您想在包含tiny_gltf.h之前使用自定義路徑包含它。TINYGLTF_NO_INCLUDE_STB_IMAGE_WRITE :禁用包括stb_image_write.h從tiny_gltf.h中的內部包含在內,因為它已經在之前包括在內,否則您想在包含tiny_gltf.h之前使用自定義路徑包含它。TINYGLTF_USE_RAPIDJSON :使用Rapidjson作為JSON Parser/Serialializer。 Rapidjson文件不包含在TinyGLTF回購中。如果您啟用此功能,請設置Rapidjson的路徑。TINYGLTF_USE_CPP14 :使用C ++ 14功能(需要C ++ 14編譯器)。這可能比C ++ 11更好。 您可以使用add_subdirectory功能添加tinyGltf。如果您使用add_subdirectory將tinygltf添加到項目中,則最好將TINYGLTF_HEADER_ONLY設置(只需在tinygltf中添加一個incepl路徑)和TINYGLTF_INSTALL (不會安裝tinygltf文件)。
// Your project's CMakeLists.txt
...
set(TINYGLTF_HEADER_ONLY ON CACHE INTERNAL "" FORCE)
set(TINYGLTF_INSTALL OFF CACHE INTERNAL "" FORCE)
add_subdirectory(/path/to/tinygltf)
需要Python。 git克隆https://github.com/khronosgroup/gltf-sample-models到您的本地dir。
構建loader_example後,編輯test_runner.py ,然後,
$ python test_runner.py$ cd tests
$ make
$ ./tester
$ ./tester_noexcept有關詳細信息,請參見tests/fuzzer 。
在Ryzen9 3950x上運行Fuzzer之後,除了Fuzzer中的失誤錯誤外,至少LoadASCIIFromString看起來很安全。在解析GLTF數據時,我們可能會更好地引入有限的內存大小檢查。