in GLTFSDK/Source/ExtensionsKHR.cpp [479:535]
std::unique_ptr<Extension> KHR::TextureInfos::DeserializeTextureTransform(const std::string& json, const ExtensionDeserializer& extensionDeserializer)
{
TextureTransform textureTransform;
auto doc = RapidJsonUtils::CreateDocumentFromString(json);
const rapidjson::Value sit = doc.GetObject();
// Offset
auto offsetIt = sit.FindMember("offset");
if (offsetIt != sit.MemberEnd())
{
if (offsetIt->value.Size() != 2)
{
throw GLTFException("Offset member of " + std::string(TEXTURETRANSFORM_NAME) + " must have two values.");
}
std::vector<float> offset;
for (rapidjson::Value::ConstValueIterator ait = offsetIt->value.Begin(); ait != offsetIt->value.End(); ++ait)
{
offset.push_back(static_cast<float>(ait->GetDouble()));
}
textureTransform.offset.x = offset[0];
textureTransform.offset.y = offset[1];
}
// Rotation
textureTransform.rotation = GetMemberValueOrDefault<float>(sit, "rotation", 0.0f);
// Scale
auto scaleIt = sit.FindMember("scale");
if (scaleIt != sit.MemberEnd())
{
if (scaleIt->value.Size() != 2)
{
throw GLTFException("Scale member of " + std::string(TEXTURETRANSFORM_NAME) + " must have two values.");
}
std::vector<float> scale;
for (rapidjson::Value::ConstValueIterator ait = scaleIt->value.Begin(); ait != scaleIt->value.End(); ++ait)
{
scale.push_back(static_cast<float>(ait->GetDouble()));
}
textureTransform.scale.x = scale[0];
textureTransform.scale.y = scale[1];
}
// TexCoord
auto texCoordIt = sit.FindMember("texCoord");
if (texCoordIt != sit.MemberEnd())
{
textureTransform.texCoord = static_cast<size_t>(texCoordIt->value.GetUint());
}
ParseProperty(sit, textureTransform, extensionDeserializer);
return std::make_unique<TextureTransform>(textureTransform);
}