Snap Center Point to Motion Path (#523)

* Snap Center Point to Motion Path

* Fix moving centerpoint while on motion path

Co-authored-by: manongjohn <manongjohn@users.noreply.github.com>
This commit is contained in:
manongjohn 2020-11-30 14:58:57 -05:00 committed by GitHub
parent 305188c432
commit 58fd6d5706
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 51 additions and 25 deletions

View file

@ -291,7 +291,11 @@ object.
double getParam(Channel type, double frame) const;
//! Sets the center of the \e frame to \e center.
void setCenter(double frame, const TPointD &center);
void setCenter(double frame, const TPointD &centerPoint,
const TPointD &frameCenter);
void setCenter(double frame, const TPointD &center) {
setCenter(frame, center, center);
}
//! Returns the center of the \e frame.
TPointD getCenter(double frame) const;
@ -526,7 +530,7 @@ private:
PlasticSkeletonDeformationP
m_skeletonDeformation; //!< Deformation curves for a plastic skeleton
TPointD m_center;
TPointD m_center, m_frameCenter;
TPointD m_offset;
// ----For Inverse Kinematics interpolation

View file

@ -319,7 +319,11 @@ public:
\b \e frame, to \b \e center; it calls \b TStageObject::setCenter().
\sa getCenter()
*/
void setCenter(const TStageObjectId &id, int frame, const TPointD &center);
void setCenter(const TStageObjectId &id, int frame,
const TPointD &centerPoint, const TPointD &frameCenter);
void setCenter(const TStageObjectId &id, int frame, const TPointD &center) {
setCenter(id, frame, center, center);
}
/*! Returns parent related to pegbar \b TStageObject with \b \e id
TStageObjectId specialization;
it calls \b TStageObject::getParent().

View file

@ -120,10 +120,15 @@ public:
->getCurrentTool()
->getTool()
->getXsheet()
->setCenter(m_objId, m_frame, m_center);
->setCenter(m_objId, m_frame, m_center, m_oldCenter);
}
void leftButtonUp(const TPointD &pos, const TMouseEvent &) override {
if ((m_lockCenterX && m_lockCenterY) || m_firstPos == pos) return;
TTool::getApplication()
->getCurrentTool()
->getTool()
->getXsheet()
->setCenter(m_objId, m_frame, m_center);
UndoStageObjectCenterMove *undo =
new UndoStageObjectCenterMove(m_objId, m_frame, m_oldCenter, m_center);
TTool::Application *app = TTool::getApplication();

View file

@ -373,6 +373,7 @@ TStageObject::TStageObject(TStageObjectTree *tree, TStageObjectId id)
, m_shearx(new TDoubleParam())
, m_sheary(new TDoubleParam())
, m_center()
, m_frameCenter()
, m_offset()
, m_cycleEnabled(false)
, m_handle("B")
@ -727,12 +728,14 @@ void TStageObject::enableUppk(bool enabled) {
//-----------------------------------------------------------------------------
void TStageObject::setCenter(double frame, const TPointD &center) {
TPointD c = center - getHandlePos(m_handle, (int)frame);
void TStageObject::setCenter(double frame, const TPointD &centerPoint,
const TPointD &frameCenter) {
TPointD c = centerPoint - getHandlePos(m_handle, (int)frame);
TAffine aff = computeLocalPlacement(frame);
TPointD delta = aff * c - aff * m_center;
m_center = c;
m_frameCenter = frameCenter;
m_offset += delta;
invalidate();
}
@ -765,16 +768,18 @@ void TStageObject::getCenterAndOffset(TPointD &center, TPointD &offset) const {
void TStageObject::setCenterAndOffset(const TPointD &center,
const TPointD &offset) {
m_center = center;
m_offset = offset;
m_center = center;
m_frameCenter = m_center;
m_offset = offset;
invalidate();
}
//-----------------------------------------------------------------------------
void TStageObject::setHandle(const std::string &s) {
m_handle = s;
if (!s.empty() && s[0] == 'H') m_offset = m_center = TPointD();
m_handle = s;
if (!s.empty() && s[0] == 'H')
m_offset = m_center = m_frameCenter = TPointD();
invalidate();
}
@ -1237,11 +1242,12 @@ TStageObject *TStageObject::clone() {
cloned->m_skeletonDeformation =
new PlasticSkeletonDeformation(*m_skeletonDeformation);
cloned->m_noScaleZ = m_noScaleZ;
cloned->m_center = m_center;
cloned->m_offset = m_offset;
cloned->m_name = m_name;
cloned->m_dagNodePos = m_dagNodePos;
cloned->m_noScaleZ = m_noScaleZ;
cloned->m_center = m_center;
cloned->m_frameCenter = m_frameCenter;
cloned->m_offset = m_offset;
cloned->m_name = m_name;
cloned->m_dagNodePos = m_dagNodePos;
return cloned;
}
@ -1359,7 +1365,8 @@ TAffine TStageObject::computeLocalPlacement(double frame) {
assert(m_spline->getStroke());
posPath = m_spline->getStroke()->getLength() *
m_posPath->getValue(frame) * 0.01;
position = m_spline->getStroke()->getPointAtLength(posPath);
position = m_spline->getStroke()->getPointAtLength(posPath) -
(m_frameCenter * Stage::inch);
break;
case PATH_AIM:
assert(m_spline);
@ -1367,7 +1374,8 @@ TAffine TStageObject::computeLocalPlacement(double frame) {
posPath = m_spline->getStroke()->getLength() *
m_posPath->getValue(frame) * 0.01;
position = m_spline->getStroke()->getPointAtLength(posPath);
position = m_spline->getStroke()->getPointAtLength(posPath) -
(m_frameCenter * Stage::inch);
if (m_spline->getStroke()->getLength() > 1e-5)
ang +=
rad2degree(atan(m_spline->getStroke()->getSpeedAtLength(posPath)));
@ -1694,7 +1702,8 @@ void TStageObject::loadData(TIStream &is) {
if (parentHandle != "") setParentHandle(parentHandle);
} else if (tagName == "center") {
is >> m_center.x >> m_center.y >> m_offset.x >> m_offset.y;
m_offset = -m_offset;
m_offset = -m_offset;
m_frameCenter = m_center;
} else if (tagName == "name")
is >> m_name;
else if (tagName == "x")
@ -1804,6 +1813,7 @@ void TStageObject::loadData(TIStream &is) {
if (tnzVersion < VersionNumber(1, 14)) {
double factor = 1.0 / Stage::inch;
m_center = m_center * factor;
m_frameCenter = m_center;
m_offset = m_offset * factor;
}
if (tnzVersion < VersionNumber(1, 16) && !keyframes.empty()) {
@ -1866,11 +1876,12 @@ TStageObjectParams *TStageObject::getParams() const {
void TStageObject::assignParams(const TStageObjectParams *src,
bool doParametersClone) {
m_name = src->m_name;
m_center = src->m_center;
m_noScaleZ = src->m_noScaleZ;
m_offset = src->m_offset;
m_status = src->m_status;
m_name = src->m_name;
m_center = src->m_center;
m_frameCenter = m_center;
m_noScaleZ = src->m_noScaleZ;
m_offset = src->m_offset;
m_status = src->m_status;
if (m_spline) m_spline->release();
m_spline = src->m_spline;
if (m_spline) m_spline->addRef();

View file

@ -580,9 +580,11 @@ TPointD TXsheet::getCenter(const TStageObjectId &id, int frame) const {
//-----------------------------------------------------------------------------
void TXsheet::setCenter(const TStageObjectId &id, int frame,
const TPointD &center) {
const TPointD &centerPoint,
const TPointD &frameCenter) {
assert(id != TStageObjectId::NoneId);
m_imp->m_pegTree->getStageObject(id)->setCenter(frame, center);
m_imp->m_pegTree->getStageObject(id)->setCenter(frame, centerPoint,
frameCenter);
}
//-----------------------------------------------------------------------------