diff --git a/libraries/model-baker/src/model-baker/PrepareJointsTask.cpp b/libraries/model-baker/src/model-baker/PrepareJointsTask.cpp index a896766058..b8bcdb386e 100644 --- a/libraries/model-baker/src/model-baker/PrepareJointsTask.cpp +++ b/libraries/model-baker/src/model-baker/PrepareJointsTask.cpp @@ -29,8 +29,14 @@ QMap getJointNameMapping(const QVariantHash& mapping) { QMap getJointRotationOffsets(const QVariantHash& mapping) { QMap jointRotationOffsets; static const QString JOINT_ROTATION_OFFSET_FIELD = "jointRotationOffset"; - if (!mapping.isEmpty() && mapping.contains(JOINT_ROTATION_OFFSET_FIELD) && mapping[JOINT_ROTATION_OFFSET_FIELD].type() == QVariant::Hash) { - auto offsets = mapping[JOINT_ROTATION_OFFSET_FIELD].toHash(); + static const QString JOINT_ROTATION_OFFSET2_FIELD = "jointRotationOffset2"; + if (!mapping.isEmpty() && ((mapping.contains(JOINT_ROTATION_OFFSET_FIELD) && mapping[JOINT_ROTATION_OFFSET_FIELD].type() == QVariant::Hash) || (mapping.contains(JOINT_ROTATION_OFFSET2_FIELD) && mapping[JOINT_ROTATION_OFFSET2_FIELD].type() == QVariant::Hash))) { + QHash offsets; + if (mapping.contains(JOINT_ROTATION_OFFSET_FIELD)) { + offsets = mapping[JOINT_ROTATION_OFFSET_FIELD].toHash(); + } else { + offsets = mapping[JOINT_ROTATION_OFFSET2_FIELD].toHash(); + } for (auto itr = offsets.begin(); itr != offsets.end(); itr++) { QString jointName = itr.key(); QString line = itr.value().toString(); @@ -57,6 +63,15 @@ void PrepareJointsTask::run(const baker::BakeContextPointer& context, const Inpu auto& jointRotationOffsets = output.edit1(); auto& jointIndices = output.edit2(); + bool newJointRot = false; + static const QString JOINT_ROTATION_OFFSET2_FIELD = "jointRotationOffset2"; + QVariantHash fstHashMap = mapping.second; + if (fstHashMap.contains(JOINT_ROTATION_OFFSET2_FIELD)) { + newJointRot = true; + } else { + newJointRot = false; + } + // Get joint renames auto jointNameMapping = getJointNameMapping(mapping.second); // Apply joint metadata from FST file mappings @@ -64,11 +79,12 @@ void PrepareJointsTask::run(const baker::BakeContextPointer& context, const Inpu jointsOut.push_back(jointIn); auto& jointOut = jointsOut.back(); - auto jointNameMapKey = jointNameMapping.key(jointIn.name); - if (jointNameMapping.contains(jointNameMapKey)) { - jointOut.name = jointNameMapKey; + if (!newJointRot) { + auto jointNameMapKey = jointNameMapping.key(jointIn.name); + if (jointNameMapping.contains(jointNameMapKey)) { + jointOut.name = jointNameMapKey; + } } - jointIndices.insert(jointOut.name, (int)jointsOut.size()); } @@ -77,10 +93,33 @@ void PrepareJointsTask::run(const baker::BakeContextPointer& context, const Inpu for (auto itr = offsets.begin(); itr != offsets.end(); itr++) { QString jointName = itr.key(); int jointIndex = jointIndices.value(jointName) - 1; - if (jointIndex != -1) { + if (jointIndex >= 0) { glm::quat rotationOffset = itr.value(); jointRotationOffsets.insert(jointIndex, rotationOffset); qCDebug(model_baker) << "Joint Rotation Offset added to Rig._jointRotationOffsets : " << " jointName: " << jointName << " jointIndex: " << jointIndex << " rotation offset: " << rotationOffset; } } + + if (newJointRot) { + for (const auto& jointIn : jointsIn) { + + auto jointNameMapKey = jointNameMapping.key(jointIn.name); + int mappedIndex = jointIndices.value(jointIn.name); + if (jointNameMapping.contains(jointNameMapKey)) { + + // delete and replace with hifi name + jointIndices.remove(jointIn.name); + jointIndices.insert(jointNameMapKey, mappedIndex); + } else { + + // nothing mapped to this fbx joint name + if (jointNameMapping.contains(jointIn.name)) { + // but the name is in the list of hifi names is mapped to a different joint + int extraIndex = jointIndices.value(jointIn.name); + jointIndices.remove(jointIn.name); + jointIndices.insert("", extraIndex); + } + } + } + } }