in GLTFSDK/Source/Deserialize.cpp [117:174]
Accessor ParseAccessor(const rapidjson::Value& v, const ExtensionDeserializer& extensionDeserializer)
{
Accessor accessor;
accessor.name = GetMemberValueOrDefault<std::string>(v, "name");
rapidjson::Value::ConstMemberIterator it;
if (TryFindMember("sparse", v, it))
{
const rapidjson::Value& sparseMember = it->value;
const rapidjson::Value& sparseIndicesMember = FindRequiredMember("indices", sparseMember)->value;
const rapidjson::Value& sparseValuesMember = FindRequiredMember("values", sparseMember)->value;
accessor.sparse.count = GetValue<size_t>(FindRequiredMember("count", sparseMember)->value);
accessor.sparse.indicesBufferViewId = std::to_string(FindRequiredMember("bufferView", sparseIndicesMember)->value.GetUint());
accessor.sparse.indicesComponentType = Accessor::GetComponentType(FindRequiredMember("componentType", sparseIndicesMember)->value.GetUint());
accessor.sparse.indicesByteOffset = GetMemberValueOrDefault<size_t>(sparseIndicesMember, "byteOffset");
accessor.sparse.valuesBufferViewId = std::to_string(FindRequiredMember("bufferView", sparseValuesMember)->value.GetUint());
accessor.sparse.valuesByteOffset = GetMemberValueOrDefault<size_t>(sparseValuesMember, "byteOffset");
if (TryFindMember("bufferView", v, it))
{
accessor.bufferViewId = std::to_string(it->value.GetUint());
}
}
else
{
accessor.bufferViewId = GetMemberValueAsString<size_t>(v, "bufferView");
}
accessor.byteOffset = GetMemberValueOrDefault<size_t>(v, "byteOffset");
accessor.componentType = Accessor::GetComponentType(FindRequiredMember("componentType", v)->value.GetUint());
accessor.normalized = GetMemberValueOrDefault<bool>(v, "normalized", false);
accessor.count = GetValue<size_t>(FindRequiredMember("count", v)->value);
accessor.type = Accessor::ParseType(FindRequiredMember("type", v)->value.GetString());
if (TryFindMember("min", v, it))
{
for (rapidjson::Value::ConstValueIterator ait = it->value.Begin(); ait != it->value.End(); ++ait)
{
accessor.min.push_back(static_cast<float>(ait->GetDouble()));
}
}
if (TryFindMember("max", v, it))
{
for (rapidjson::Value::ConstValueIterator ait = it->value.Begin(); ait != it->value.End(); ++ait)
{
accessor.max.push_back(static_cast<float>(ait->GetDouble()));
}
}
ParseProperty(v, accessor, extensionDeserializer);
return accessor;
}