in GLTFSDK.Samples/Serialize/Source/main.cpp [174:248]
void SerializeTriangle(const std::experimental::filesystem::path& path)
{
// Pass the absolute path, without the filename, to the stream writer
auto streamWriter = std::make_unique<StreamWriter>(path.parent_path());
std::experimental::filesystem::path pathFile = path.filename();
std::experimental::filesystem::path pathFileExt = pathFile.extension();
auto MakePathExt = [](const std::string& ext)
{
return "." + ext;
};
std::unique_ptr<ResourceWriter> resourceWriter;
// If the file has a '.gltf' extension then create a GLTFResourceWriter
if (pathFileExt == MakePathExt(GLTF_EXTENSION))
{
resourceWriter = std::make_unique<GLTFResourceWriter>(std::move(streamWriter));
}
// If the file has a '.glb' extension then create a GLBResourceWriter. This class derives
// from GLTFResourceWriter and adds support for writing manifests to a GLB container's
// JSON chunk and resource data to the binary chunk.
if (pathFileExt == MakePathExt(GLB_EXTENSION))
{
resourceWriter = std::make_unique<GLBResourceWriter>(std::move(streamWriter));
}
if (!resourceWriter)
{
throw std::runtime_error("Command line argument path filename extension must be .gltf or .glb");
}
// The Document instance represents the glTF JSON manifest
Document document;
std::string accessorIdIndices;
std::string accessorIdPositions;
// Use the BufferBuilder helper class to simplify the process of
// constructing valid glTF Buffer, BufferView and Accessor entities
BufferBuilder bufferBuilder(std::move(resourceWriter));
CreateTriangleResources(document, bufferBuilder, accessorIdIndices, accessorIdPositions);
CreateTriangleEntities(document, accessorIdIndices, accessorIdPositions);
std::string manifest;
try
{
// Serialize the glTF Document into a JSON manifest
manifest = Serialize(document, SerializeFlags::Pretty);
}
catch (const GLTFException& ex)
{
std::stringstream ss;
ss << "Microsoft::glTF::Serialize failed: ";
ss << ex.what();
throw std::runtime_error(ss.str());
}
auto& gltfResourceWriter = bufferBuilder.GetResourceWriter();
if (auto glbResourceWriter = dynamic_cast<GLBResourceWriter*>(&gltfResourceWriter))
{
glbResourceWriter->Flush(manifest, pathFile.u8string()); // A GLB container isn't created until the GLBResourceWriter::Flush member function is called
}
else
{
gltfResourceWriter.WriteExternal(pathFile.u8string(), manifest); // Binary resources have already been written, just need to write the manifest
}
}