rapidjson::Value SerializeNode()

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;
    }