in GLTFSDK/Source/Serialize.cpp [569:627]
rapidjson::Value SerializeNode(const Node& node, const Document& gltfDocument, rapidjson::Document& document, const ExtensionSerializer& extensionSerializer)
{
rapidjson::Document::AllocatorType& a = document.GetAllocator();
rapidjson::Value nodeValue(rapidjson::kObjectType);
if (!node.children.empty())
{
rapidjson::Value nodeChildren(rapidjson::kArrayType);
{
for (const auto& childId : node.children)
{
nodeChildren.PushBack(ToKnownSizeType(gltfDocument.nodes.GetIndex(childId)), a);
}
}
nodeValue.AddMember("children", nodeChildren, a);
}
if (!node.HasValidTransformType())
{
throw DocumentException("Node " + node.id + " doesn't have a valid transform type");
}
if (node.GetTransformationType() == Microsoft::glTF::TransformationType::TRANSFORMATION_MATRIX)
{
nodeValue.AddMember("matrix", RapidJsonUtils::ToJsonArray<float, 16>(node.matrix.values, a), a);
}
else if (node.GetTransformationType() == Microsoft::glTF::TransformationType::TRANSFORMATION_TRS)
{
if (node.translation != Vector3::ZERO)
{
nodeValue.AddMember("translation", RapidJsonUtils::ToJsonArray(node.translation, a), a);
}
if (node.rotation != Quaternion::IDENTITY)
{
nodeValue.AddMember("rotation", RapidJsonUtils::ToJsonArray(node.rotation, a), a);
}
if (node.scale != Vector3::ONE)
{
nodeValue.AddMember("scale", RapidJsonUtils::ToJsonArray(node.scale, a), a);
}
}
RapidJsonUtils::AddOptionalMemberIndex("mesh", nodeValue, node.meshId, gltfDocument.meshes, a);
RapidJsonUtils::AddOptionalMemberIndex("skin", nodeValue, node.skinId, gltfDocument.skins, a);
if (!node.cameraId.empty())
{
nodeValue.AddMember("camera", ToKnownSizeType(gltfDocument.cameras.GetIndex(node.cameraId)), a);
}
RapidJsonUtils::AddArrayMember(nodeValue, "weights", node.weights, a);
RapidJsonUtils::AddOptionalMember("name", nodeValue, node.name, a);
SerializeProperty(gltfDocument, node, nodeValue, a, extensionSerializer);
return nodeValue;
}