mirror of
https://github.com/syoyo/tinygltf.git
synced 2026-09-08 03:18:34 +00:00
Move tiny_gltf.h/.cc, tinygltf_json.h, json.hpp, stb_image*, loader_example.cc, examples/, wasm/, experimental/, legacy tests and fuzzers under attic/. TinyGLTF v3 C (tiny_gltf_v3.h/.c + tinygltf_json_c.h) is now the mainline: - CMakeLists.txt: v3 C tests only, installs only v3 files - tests/Makefile and Makefile: build/run the v3 C testers - test_runner.py: verifies v3 C tester output only (no v1 ground truth) - CI workflows: build and test v3 C only (GCC/Clang/MSVC/Meson/sanitizers) - README: v3 C quick start, testing, licenses; legacy moved to attic/
130 lines
4.1 KiB
C++
130 lines
4.1 KiB
C++
// An example of how to generate a gltf file from scratch. This example
|
|
// was translated from the pygltlib documentation in the pypi project page,
|
|
// which in turn is based on the Khronos Sample Models at:
|
|
//
|
|
// https://github.com/KhronosGroup/glTF-Sample-Models
|
|
//
|
|
// This example is released under the MIT license.
|
|
//
|
|
// 2021-02-25 Thu
|
|
// Dov Grobgeld <dov.grobgeld@gmail.com>
|
|
|
|
|
|
// Define these only in *one* .cc file.
|
|
#define TINYGLTF_IMPLEMENTATION
|
|
#define TINYGLTF_USE_RAPIDJSON
|
|
#define STB_IMAGE_IMPLEMENTATION
|
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
|
|
|
// #define TINYGLTF_NOEXCEPTION // optional. disable exception handling.
|
|
#include "tiny_gltf.h"
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
// Create a model with a single mesh and save it as a gltf file
|
|
tinygltf::Model m;
|
|
tinygltf::Scene scene;
|
|
tinygltf::Mesh mesh;
|
|
tinygltf::Primitive primitive;
|
|
tinygltf::Node node;
|
|
tinygltf::Buffer buffer;
|
|
tinygltf::BufferView bufferView1;
|
|
tinygltf::BufferView bufferView2;
|
|
tinygltf::Accessor accessor1;
|
|
tinygltf::Accessor accessor2;
|
|
tinygltf::Asset asset;
|
|
|
|
// This is the raw data buffer.
|
|
buffer.data = {
|
|
// 6 bytes of indices and two bytes of padding
|
|
0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,
|
|
// 36 bytes of floating point numbers
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3f,
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
|
|
0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x3f,
|
|
0x00,0x00,0x00,0x00};
|
|
|
|
// "The indices of the vertices (ELEMENT_ARRAY_BUFFER) take up 6 bytes in the
|
|
// start of the buffer.
|
|
bufferView1.buffer = 0;
|
|
bufferView1.byteOffset=0;
|
|
bufferView1.byteLength=6;
|
|
bufferView1.target = TINYGLTF_TARGET_ELEMENT_ARRAY_BUFFER;
|
|
|
|
// The vertices take up 36 bytes (3 vertices * 3 floating points * 4 bytes)
|
|
// at position 8 in the buffer and are of type ARRAY_BUFFER
|
|
bufferView2.buffer = 0;
|
|
bufferView2.byteOffset=8;
|
|
bufferView2.byteLength=36;
|
|
bufferView2.target = TINYGLTF_TARGET_ARRAY_BUFFER;
|
|
|
|
// Describe the layout of bufferView1, the indices of the vertices
|
|
accessor1.bufferView = 0;
|
|
accessor1.byteOffset = 0;
|
|
accessor1.componentType = TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT;
|
|
accessor1.count = 3;
|
|
accessor1.type = TINYGLTF_TYPE_SCALAR;
|
|
accessor1.maxValues.push_back(2);
|
|
accessor1.minValues.push_back(0);
|
|
|
|
// Describe the layout of bufferView2, the vertices themself
|
|
accessor2.bufferView = 1;
|
|
accessor2.byteOffset = 0;
|
|
accessor2.componentType = TINYGLTF_COMPONENT_TYPE_FLOAT;
|
|
accessor2.count = 3;
|
|
accessor2.type = TINYGLTF_TYPE_VEC3;
|
|
accessor2.maxValues = {1.0, 1.0, 0.0};
|
|
accessor2.minValues = {0.0, 0.0, 0.0};
|
|
|
|
// Build the mesh primitive and add it to the mesh
|
|
primitive.indices = 0; // The index of the accessor for the vertex indices
|
|
primitive.attributes["POSITION"] = 1; // The index of the accessor for positions
|
|
primitive.material = 0;
|
|
primitive.mode = TINYGLTF_MODE_TRIANGLES;
|
|
mesh.primitives.push_back(primitive);
|
|
|
|
// Other tie ups
|
|
node.mesh = 0;
|
|
scene.nodes.push_back(0); // Default scene
|
|
|
|
// Define the asset. The version is required
|
|
asset.version = "2.0";
|
|
asset.generator = "tinygltf";
|
|
|
|
// Now all that remains is to tie back all the loose objects into the
|
|
// our single model.
|
|
m.scenes.push_back(scene);
|
|
m.meshes.push_back(mesh);
|
|
m.nodes.push_back(node);
|
|
m.buffers.push_back(buffer);
|
|
m.bufferViews.push_back(bufferView1);
|
|
m.bufferViews.push_back(bufferView2);
|
|
m.accessors.push_back(accessor1);
|
|
m.accessors.push_back(accessor2);
|
|
m.asset = asset;
|
|
|
|
// Create a simple material
|
|
tinygltf::Material mat;
|
|
mat.pbrMetallicRoughness.baseColorFactor = {1.0f, 0.9f, 0.9f, 1.0f};
|
|
mat.doubleSided = true;
|
|
m.materials.push_back(mat);
|
|
|
|
// lights
|
|
tinygltf::Light dummyLight;
|
|
dummyLight.name = "bora";
|
|
m.lights.push_back(dummyLight);
|
|
tinygltf::Value dummyVal(3.14);
|
|
m.extensions.emplace("ext1", dummyVal);
|
|
|
|
// Save it to a file
|
|
tinygltf::TinyGLTF gltf;
|
|
gltf.WriteGltfSceneToFile(&m, "triangle.gltf",
|
|
true, // embedImages
|
|
true, // embedBuffers
|
|
true, // pretty print
|
|
false); // write binary
|
|
|
|
exit(0);
|
|
}
|