Fix one frame pose duration issue in motion editor
This commit also remove height above ground settings.master
parent
0cb574b6ea
commit
54b5a9ef5e
|
@ -54,7 +54,7 @@ void AnimalPoser::resolveTransform()
|
|||
mostBottomYBeforeTransform = bone.tailPosition.y();
|
||||
}
|
||||
|
||||
float legHeightBeforeTransform = std::abs(mostBottomYBeforeTransform - firstSpineBone.headPosition.y());
|
||||
//float legHeightBeforeTransform = std::abs(mostBottomYBeforeTransform - firstSpineBone.headPosition.y());
|
||||
auto transformedJointNodeTree = m_jointNodeTree;
|
||||
transformedJointNodeTree.recalculateTransformMatrices();
|
||||
float mostBottomYAfterTransform = std::numeric_limits<float>::max();
|
||||
|
@ -70,11 +70,13 @@ void AnimalPoser::resolveTransform()
|
|||
if (newPosition.y() < mostBottomYAfterTransform)
|
||||
mostBottomYAfterTransform = newPosition.y();
|
||||
}
|
||||
float legHeightAfterTransform = std::abs(mostBottomYAfterTransform - firstSpineBonePositionAfterTransform.y());
|
||||
float translateY = legHeightAfterTransform - legHeightBeforeTransform;
|
||||
//float legHeightAfterTransform = std::abs(mostBottomYAfterTransform - firstSpineBonePositionAfterTransform.y());
|
||||
//float translateY = legHeightAfterTransform - legHeightBeforeTransform;
|
||||
float translateY = mostBottomYBeforeTransform - mostBottomYAfterTransform;
|
||||
|
||||
//qDebug() << "Leg height changed, translateY:" << translateY << "legHeightBeforeTransform:" << legHeightBeforeTransform << "legHeightAfterTransform:" << legHeightAfterTransform << "firstSpineBonePositionAfterTransform:" << firstSpineBonePositionAfterTransform << "firstSpineBone.headPosition:" << firstSpineBone.headPosition;
|
||||
|
||||
/*
|
||||
const auto &findRootParameters = parameters().find(Rigger::rootBoneName);
|
||||
if (findRootParameters != parameters().end()) {
|
||||
auto findHeightAboveGroundLevel = findRootParameters->second.find("heightAboveGroundLevel");
|
||||
|
@ -85,6 +87,7 @@ void AnimalPoser::resolveTransform()
|
|||
//qDebug() << "heightAboveGroundLevel:" << heightAboveGroundLevel << "myHeightAboveGroundLevel:" << myHeightAboveGroundLevel << "legHeightBeforeTransform:" << legHeightBeforeTransform << "applied translateY:" << translateY;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if (!qFuzzyIsNull(translateY)) {
|
||||
int rootBoneIndex = findBoneIndex(Rigger::rootBoneName);
|
||||
|
|
|
@ -85,8 +85,11 @@ float MotionsGenerator::calculatePoseDuration(const QUuid &poseId)
|
|||
if (nullptr == pose)
|
||||
return 0;
|
||||
float totalDuration = 0;
|
||||
for (const auto &frame: *pose) {
|
||||
totalDuration += valueOfKeyInMapOrEmpty(frame.first, "duration").toFloat();
|
||||
if (pose->size() > 1) {
|
||||
// Pose with only one frame has zero duration
|
||||
for (const auto &frame: *pose) {
|
||||
totalDuration += valueOfKeyInMapOrEmpty(frame.first, "duration").toFloat();
|
||||
}
|
||||
}
|
||||
return totalDuration;
|
||||
}
|
||||
|
@ -149,6 +152,8 @@ void MotionsGenerator::generateMotion(const QUuid &motionId, std::set<QUuid> &vi
|
|||
|
||||
float interval = 1.0 / m_fps;
|
||||
float lastProgress = 0;
|
||||
if (totalDuration < interval)
|
||||
totalDuration = interval;
|
||||
for (float progress = 0; progress < totalDuration; ) {
|
||||
int clipIndex = findClipIndexByProgress(progress);
|
||||
if (-1 == clipIndex) {
|
||||
|
|
|
@ -158,8 +158,8 @@ void PoseDocument::reset()
|
|||
m_otherIds.clear();
|
||||
m_boneNameToIdsMap.clear();
|
||||
m_bonesPartId = QUuid();
|
||||
m_groundPartId = QUuid();
|
||||
m_groundEdgeId = QUuid();
|
||||
//m_groundPartId = QUuid();
|
||||
//m_groundEdgeId = QUuid();
|
||||
emit cleanup();
|
||||
emit parametersChanged();
|
||||
}
|
||||
|
@ -253,24 +253,24 @@ void PoseDocument::fromParameters(const std::vector<RiggerBone> *rigBones,
|
|||
otherParameters);
|
||||
|
||||
std::map<QString, std::pair<QUuid, QUuid>> boneNameToIdsMap;
|
||||
QUuid groundPartId;
|
||||
//QUuid groundPartId;
|
||||
QUuid bonesPartId;
|
||||
QUuid groundEdgeId;
|
||||
//QUuid groundEdgeId;
|
||||
parametersToNodes(&otherBones,
|
||||
otherHeightAboveGroundLevel,
|
||||
&boneNameToIdsMap,
|
||||
&groundPartId,
|
||||
//&groundPartId,
|
||||
&bonesPartId,
|
||||
&groundEdgeId,
|
||||
//&groundEdgeId,
|
||||
true);
|
||||
}
|
||||
|
||||
parametersToNodes(&bones,
|
||||
heightAboveGroundLevel,
|
||||
&m_boneNameToIdsMap,
|
||||
&m_groundPartId,
|
||||
//&m_groundPartId,
|
||||
&m_bonesPartId,
|
||||
&m_groundEdgeId,
|
||||
//&m_groundEdgeId,
|
||||
false);
|
||||
|
||||
emit parametersChanged();
|
||||
|
@ -279,9 +279,9 @@ void PoseDocument::fromParameters(const std::vector<RiggerBone> *rigBones,
|
|||
void PoseDocument::parametersToNodes(const std::vector<RiggerBone> *rigBones,
|
||||
const float heightAboveGroundLevel,
|
||||
std::map<QString, std::pair<QUuid, QUuid>> *boneNameToIdsMap,
|
||||
QUuid *groundPartId,
|
||||
//QUuid *groundPartId,
|
||||
QUuid *bonesPartId,
|
||||
QUuid *groundEdgeId,
|
||||
//QUuid *groundEdgeId,
|
||||
bool isOther)
|
||||
{
|
||||
if (nullptr == rigBones || rigBones->empty()) {
|
||||
|
@ -402,6 +402,7 @@ void PoseDocument::parametersToNodes(const std::vector<RiggerBone> *rigBones,
|
|||
nodeMap[findRootNodeId->second].setRadius(m_nodeRadius * 2);
|
||||
}
|
||||
|
||||
/*
|
||||
if (!isOther) {
|
||||
*groundPartId = QUuid::createUuid();
|
||||
auto &groundPart = partMap[*groundPartId];
|
||||
|
@ -452,6 +453,7 @@ void PoseDocument::parametersToNodes(const std::vector<RiggerBone> *rigBones,
|
|||
nodeMap[groundNodesPair.second].edgeIds.push_back(edge.id);
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if (isOther) {
|
||||
for (const auto &nodeIt: newAddedNodeIds)
|
||||
|
@ -536,6 +538,7 @@ float PoseDocument::findFirstSpineY() const
|
|||
|
||||
void PoseDocument::toParameters(std::map<QString, std::map<QString, QString>> ¶meters, const std::set<QUuid> &limitNodeIds) const
|
||||
{
|
||||
/*
|
||||
float heightAboveGroundLevel = 0;
|
||||
auto findGroundEdge = edgeMap.find(m_groundEdgeId);
|
||||
if (findGroundEdge != edgeMap.end()) {
|
||||
|
@ -559,6 +562,7 @@ void PoseDocument::toParameters(std::map<QString, std::map<QString, QString>> &p
|
|||
auto &boneParameter = parameters[Rigger::rootBoneName];
|
||||
boneParameter["heightAboveGroundLevel"] = QString::number(heightAboveGroundLevel);
|
||||
}
|
||||
*/
|
||||
for (const auto &item: m_boneNameToIdsMap) {
|
||||
const auto &boneNodeIdPair = item.second;
|
||||
auto findFirstNode = nodeMap.find(boneNodeIdPair.first);
|
||||
|
|
|
@ -66,18 +66,18 @@ private:
|
|||
void parametersToNodes(const std::vector<RiggerBone> *rigBones,
|
||||
const float heightAboveGroundLevel,
|
||||
std::map<QString, std::pair<QUuid, QUuid>> *boneNameToIdsMap,
|
||||
QUuid *groundPartId,
|
||||
//QUuid *groundPartId,
|
||||
QUuid *bonesPartId,
|
||||
QUuid *groundEdgeId,
|
||||
//QUuid *groundEdgeId,
|
||||
bool isOther=false);
|
||||
void updateBonesAndHeightAboveGroundLevelFromParameters(std::vector<RiggerBone> *bones,
|
||||
float *heightAboveGroundLevel,
|
||||
const std::map<QString, std::map<QString, QString>> ¶meters);
|
||||
|
||||
std::map<QString, std::pair<QUuid, QUuid>> m_boneNameToIdsMap;
|
||||
QUuid m_groundPartId;
|
||||
//QUuid m_groundPartId;
|
||||
QUuid m_bonesPartId;
|
||||
QUuid m_groundEdgeId;
|
||||
//QUuid m_groundEdgeId;
|
||||
std::deque<PoseHistoryItem> m_undoItems;
|
||||
std::deque<PoseHistoryItem> m_redoItems;
|
||||
std::vector<RiggerBone> m_riggerBones;
|
||||
|
|
|
@ -12,9 +12,8 @@ PoseManageWidget::PoseManageWidget(const Document *document, QWidget *parent) :
|
|||
{
|
||||
QPushButton *addPoseButton = new QPushButton(Theme::awesome()->icon(fa::plus), tr("Add Pose..."));
|
||||
addPoseButton->hide();
|
||||
|
||||
connect(addPoseButton, &QPushButton::clicked, this, &PoseManageWidget::showAddPoseDialog);
|
||||
|
||||
|
||||
QHBoxLayout *toolsLayout = new QHBoxLayout;
|
||||
toolsLayout->addWidget(addPoseButton);
|
||||
|
||||
|
|
Loading…
Reference in New Issue