Accessor ParseAccessor()

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