160 const pxr::UsdPrim &prim,
162 const pxr::UsdTimeCode time_code)
164 pxr::UsdAttributeVector attribs = prim.GetAuthoredAttributes();
165 if (attribs.empty()) {
171 for (
const pxr::UsdAttribute &attr : attribs) {
172 if (!attr.IsCustom()) {
176 std::vector<std::string> attr_names = attr.SplitName();
178 bool is_user_prop = attr_names[0] ==
"userProperties";
180 if (attr_names.size() > 2 && is_user_prop && attr_names[1] ==
"blender") {
184 if (!all_custom_attrs && !is_user_prop) {
191 pxr::TfToken attr_name;
195 const std::string token =
"userProperties:";
196 const std::string name = attr.GetName().GetString();
197 attr_name = pxr::TfToken(name.substr(token.size(), name.size() - token.size()));
200 attr_name = attr.GetName();
203 pxr::SdfValueTypeName type_name = attr.GetTypeName();
205 if (type_name == pxr::SdfValueTypeNames->Int) {
207 if (attr.Get<
int>(&ival, time_code)) {
208 set_int_prop(idgroup, attr_name.GetString().c_str(), ival);
211 else if (type_name == pxr::SdfValueTypeNames->Float) {
213 if (attr.Get<
float>(&fval, time_code)) {
217 else if (type_name == pxr::SdfValueTypeNames->Double) {
219 if (attr.Get<
double>(&dval, time_code)) {
223 else if (type_name == pxr::SdfValueTypeNames->Half) {
224 pxr::GfHalf hval = 0.0f;
225 if (attr.Get<pxr::GfHalf>(&hval, time_code)) {
229 else if (type_name == pxr::SdfValueTypeNames->String) {
231 if (attr.Get<std::string>(&sval, time_code)) {
235 else if (type_name == pxr::SdfValueTypeNames->Token) {
237 if (attr.Get<pxr::TfToken>(&tval, time_code)) {
238 set_string_prop(idgroup, attr_name.GetString().c_str(), tval.GetString().c_str());
241 else if (type_name == pxr::SdfValueTypeNames->Asset) {
242 pxr::SdfAssetPath aval;
243 if (attr.Get<pxr::SdfAssetPath>(&aval, time_code)) {
244 set_string_prop(idgroup, attr_name.GetString().c_str(), aval.GetAssetPath().c_str());
247 else if (type_name == pxr::SdfValueTypeNames->Bool) {
249 if (attr.Get<
bool>(&bval, time_code)) {
253 else if (equivalent(type_name, pxr::SdfValueTypeNames->Float2)) {
254 set_array_prop<pxr::GfVec2f>(idgroup, attr_name.GetString().c_str(), attr, time_code);
256 else if (equivalent(type_name, pxr::SdfValueTypeNames->Float3)) {
257 set_array_prop<pxr::GfVec3f>(idgroup, attr_name.GetString().c_str(), attr, time_code);
259 else if (equivalent(type_name, pxr::SdfValueTypeNames->Float4)) {
260 set_array_prop<pxr::GfVec4f>(idgroup, attr_name.GetString().c_str(), attr, time_code);
262 else if (equivalent(type_name, pxr::SdfValueTypeNames->Double2)) {
263 set_array_prop<pxr::GfVec2d>(idgroup, attr_name.GetString().c_str(), attr, time_code);
265 else if (equivalent(type_name, pxr::SdfValueTypeNames->Double3)) {
266 set_array_prop<pxr::GfVec3d>(idgroup, attr_name.GetString().c_str(), attr, time_code);
268 else if (equivalent(type_name, pxr::SdfValueTypeNames->Double4)) {
269 set_array_prop<pxr::GfVec4d>(idgroup, attr_name.GetString().c_str(), attr, time_code);
271 else if (equivalent(type_name, pxr::SdfValueTypeNames->Int2)) {
272 set_array_prop<pxr::GfVec2i>(idgroup, attr_name.GetString().c_str(), attr, time_code);
274 else if (equivalent(type_name, pxr::SdfValueTypeNames->Int3)) {
275 set_array_prop<pxr::GfVec3i>(idgroup, attr_name.GetString().c_str(), attr, time_code);
277 else if (equivalent(type_name, pxr::SdfValueTypeNames->Int4)) {
278 set_array_prop<pxr::GfVec4i>(idgroup, attr_name.GetString().c_str(), attr, time_code);
280 else if (equivalent(type_name, pxr::SdfValueTypeNames->Half2)) {
281 set_array_prop<pxr::GfVec2h>(idgroup, attr_name.GetString().c_str(), attr, time_code);
283 else if (equivalent(type_name, pxr::SdfValueTypeNames->Half3)) {
284 set_array_prop<pxr::GfVec3h>(idgroup, attr_name.GetString().c_str(), attr, time_code);
286 else if (equivalent(type_name, pxr::SdfValueTypeNames->Half4)) {
287 set_array_prop<pxr::GfVec4h>(idgroup, attr_name.GetString().c_str(), attr, time_code);