|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzBase includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tdoubleparam.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzLib includes
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tstageobject.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tobjecthandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txsheethandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tframehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/doubleparamcmd.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tstageobjecttree.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/stageobjectutil.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// TStageObjectValues
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectValues::Channel::Channel(TStageObject::Channel actionId)
|
|
Shinya Kitaoka |
120a6e |
: m_actionId(actionId)
|
|
Shinya Kitaoka |
120a6e |
, m_value(0) //, m_isKeyframe(false)
|
|
Shinya Kitaoka |
120a6e |
{}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectValues::TStageObjectValues()
|
|
Shinya Kitaoka |
120a6e |
: m_objectId(TStageObjectId::NoneId), m_frame(-1) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TStageObjectValues::TStageObjectValues(TStageObjectId id,
|
|
Shinya Kitaoka |
120a6e |
TStageObject::Channel a0)
|
|
Shinya Kitaoka |
120a6e |
: m_objectId(id), m_frame(-1) {
|
|
Shinya Kitaoka |
120a6e |
add(a0);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TStageObjectValues::TStageObjectValues(TStageObjectId id,
|
|
Shinya Kitaoka |
120a6e |
TStageObject::Channel a0,
|
|
Shinya Kitaoka |
120a6e |
TStageObject::Channel a1)
|
|
Shinya Kitaoka |
120a6e |
: m_objectId(id), m_frame(-1) {
|
|
Shinya Kitaoka |
120a6e |
add(a0);
|
|
Shinya Kitaoka |
120a6e |
add(a1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStageObjectValues::add(TStageObject::Channel actionId) {
|
|
Shinya Kitaoka |
120a6e |
bool isFound = false;
|
|
Shinya Kitaoka |
120a6e |
std::vector<channel>::iterator it;</channel>
|
|
Shinya Kitaoka |
120a6e |
for (it = m_channels.begin(); it != m_channels.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
TStageObjectValues::Channel ch = *it;
|
|
Shinya Kitaoka |
120a6e |
if (ch.m_actionId == actionId) {
|
|
Shinya Kitaoka |
120a6e |
isFound = true;
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (!isFound) m_channels.push_back(Channel(actionId));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStageObjectValues::updateValues() {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
if (m_objectId == TStageObjectId::NoneId)
|
|
Shinya Kitaoka |
120a6e |
m_objectId = m_objectHandle->getObjectId();
|
|
Shinya Kitaoka |
120a6e |
m_frame = m_frameHandle->getFrame();
|
|
Shinya Kitaoka |
120a6e |
std::vector<channel>::iterator it;</channel>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
for (it = m_channels.begin(); it != m_channels.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
TDoubleParam *param =
|
|
Shinya Kitaoka |
120a6e |
xsh->getStageObject(m_objectId)->getParam(it->m_actionId);
|
|
Shinya Kitaoka |
120a6e |
it->setValue(param->getValue(m_frame));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Shinya Kitaoka |
120a6e |
TStageObject *getAncestor(TStageObjectTree *tree, TStageObject *obj) {
|
|
Shinya Kitaoka |
120a6e |
TStageObjectId parentId = obj->getParent();
|
|
Shinya Kitaoka |
120a6e |
TStageObject *root = obj;
|
|
Shinya Kitaoka |
120a6e |
while (parentId != TStageObjectId::NoneId && parentId.isColumn()) {
|
|
Shinya Kitaoka |
120a6e |
root = tree->getStageObject(parentId);
|
|
Shinya Kitaoka |
120a6e |
parentId = root->getParent();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return root;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------
|
|
Shinya Kitaoka |
120a6e |
void TStageObjectValues::applyValues(bool undoEnabled) const {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
std::vector<channel>::const_iterator it;</channel>
|
|
Shinya Kitaoka |
120a6e |
for (it = m_channels.begin(); it != m_channels.end(); ++it) {
|
|
Shinya Kitaoka |
120a6e |
TStageObject *pegbar = xsh->getStageObject(m_objectId);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TDoubleParam *param =
|
|
Shinya Kitaoka |
120a6e |
pegbar->getParam((TStageObject::Channel)it->m_actionId);
|
|
Shinya Kitaoka |
120a6e |
if (!param->isKeyframe(m_frame)) {
|
|
Shinya Kitaoka |
120a6e |
KeyframeSetter setter(param, -1,
|
|
Shinya Kitaoka |
120a6e |
undoEnabled); // Deve essere registrato l'undo
|
|
Shinya Kitaoka |
120a6e |
setter.createKeyframe(m_frame);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
int indexKeyframe = param->getClosestKeyframe(m_frame);
|
|
Shinya Kitaoka |
120a6e |
KeyframeSetter setter(param, indexKeyframe,
|
|
Shinya Kitaoka |
120a6e |
false); // Non deve essere registrato l'undo
|
|
Shinya Kitaoka |
120a6e |
setter.setValue(it->getValue());
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
//--- Permette l'undo per l'interpolazione con la cinematica inversa
|
|
Shinya Kitaoka |
120a6e |
TStageObjectTree *tree = xsh->getStageObjectTree();
|
|
Shinya Kitaoka |
120a6e |
if (tree) {
|
|
Shinya Kitaoka |
120a6e |
TStageObject *root = getAncestor(tree, tree->getStageObject(m_objectId));
|
|
Shinya Kitaoka |
120a6e |
if (root) root->invalidate();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
//---
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStageObjectValues::Channel::setValue(double value) {
|
|
Shinya Kitaoka |
120a6e |
if (m_actionId == TStageObject::T_ScaleX ||
|
|
Shinya Kitaoka |
120a6e |
m_actionId == TStageObject::T_ScaleY) {
|
|
Shinya Kitaoka |
120a6e |
const double eps = 1.e-8;
|
|
Shinya Kitaoka |
120a6e |
if (fabs(value) < eps) value = value < 0 ? -eps : eps;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_value = value;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStageObjectValues::setValue(double v) { m_channels[0].setValue(v); }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStageObjectValues::setValues(double v0, double v1) {
|
|
Shinya Kitaoka |
120a6e |
m_channels[0].setValue(v0);
|
|
Shinya Kitaoka |
120a6e |
m_channels[1].setValue(v1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
double TStageObjectValues::getValue(int index) const {
|
|
Shinya Kitaoka |
120a6e |
assert(0 <= index && index < (int)m_channels.size());
|
|
Shinya Kitaoka |
120a6e |
return m_channels[index].getValue();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void TStageObjectValues::setGlobalKeyframe() {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
TStageObject *stageObject = xsh->getStageObject(m_objectId);
|
|
Shinya Kitaoka |
120a6e |
stageObject->setKeyframeWithoutUndo(m_frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*-- HistoryViewerに、動かしたObject/Channel名・フレーム番号の文字列を返す --*/
|
|
Shinya Kitaoka |
120a6e |
QString TStageObjectValues::getStringForHistory() {
|
|
Shinya Kitaoka |
120a6e |
/*-- どのチャンネルを動かしたか --*/
|
|
Shinya Kitaoka |
120a6e |
QString channelStr;
|
|
Shinya Kitaoka |
120a6e |
if (m_channels.size() > 1) /*--複数チャンネルを動かした場合--*/
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Move");
|
|
Shinya Kitaoka |
120a6e |
else {
|
|
Shinya Kitaoka |
120a6e |
switch (m_channels.at(0).m_actionId) {
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_Angle:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Edit Rotation");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_X:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Move E/W");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_Y:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Move N/S");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_Z:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Move Z");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_SO:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Edit Stack Order");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_ScaleX:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Edit Scale W");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_ScaleY:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Edit Scale H");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_Scale:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Edit Scale");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_Path:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Edit PosPath");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_ShearX:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Edit Shear X");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case TStageObject::T_ShearY:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Edit Shear Y");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
default:
|
|
Shinya Kitaoka |
120a6e |
channelStr = QObject::tr("Move");
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
return QObject::tr("%1 %2 Frame : %3")
|
|
Shinya Kitaoka |
120a6e |
.arg(channelStr)
|
|
Shinya Kitaoka |
120a6e |
.arg(QString::fromStdString(m_objectId.toString()))
|
|
Shinya Kitaoka |
120a6e |
.arg(m_frame + 1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// UndoSetKeyFrame
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
UndoSetKeyFrame::UndoSetKeyFrame(TStageObjectId objectId, int frame,
|
|
Shinya Kitaoka |
120a6e |
TXsheetHandle *xsheetHandle)
|
|
Shinya Kitaoka |
120a6e |
: m_objId(objectId), m_frame(frame), m_xsheetHandle(xsheetHandle) {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
TStageObject *obj = xsh->getStageObject(m_objId);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_key = obj->getKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void UndoSetKeyFrame::undo() const {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
assert(xsh->getStageObject(m_objId));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (TStageObject *obj = xsh->getStageObject(m_objId)) {
|
|
Shinya Kitaoka |
120a6e |
obj->removeKeyframeWithoutUndo(m_frame);
|
|
Shinya Kitaoka |
120a6e |
if (m_key.m_isKeyframe) obj->setKeyframeWithoutUndo(m_frame, m_key);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_objectHandle->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void UndoSetKeyFrame::redo() const {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
assert(xsh->getStageObject(m_objId));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (TStageObject *obj = xsh->getStageObject(m_objId))
|
|
Shinya Kitaoka |
120a6e |
obj->setKeyframeWithoutUndo(m_frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_objectHandle->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int UndoSetKeyFrame::getSize() const {
|
|
Shinya Kitaoka |
120a6e |
return 10 << 10;
|
|
Shinya Kitaoka |
120a6e |
} // Gave up exact calculation. Say ~10 kB?
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// UndoRemoveKeyFrame
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
UndoRemoveKeyFrame::UndoRemoveKeyFrame(TStageObjectId objectId, int frame,
|
|
Shinya Kitaoka |
120a6e |
TStageObject::Keyframe key,
|
|
Shinya Kitaoka |
120a6e |
TXsheetHandle *xsheetHandle)
|
|
Shinya Kitaoka |
120a6e |
: m_objId(objectId)
|
|
Shinya Kitaoka |
120a6e |
, m_frame(frame)
|
|
Shinya Kitaoka |
120a6e |
, m_xsheetHandle(xsheetHandle)
|
|
Shinya Kitaoka |
120a6e |
, m_key(key) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void UndoRemoveKeyFrame::undo() const {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
assert(xsh->getStageObject(m_objId));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (TStageObject *obj = xsh->getStageObject(m_objId)) {
|
|
Shinya Kitaoka |
120a6e |
obj->setKeyframeWithoutUndo(m_frame);
|
|
Shinya Kitaoka |
120a6e |
obj->setKeyframeWithoutUndo(m_frame, m_key);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_objectHandle->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void UndoRemoveKeyFrame::redo() const {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
assert(xsh->getStageObject(m_objId));
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (TStageObject *obj = xsh->getStageObject(m_objId))
|
|
Shinya Kitaoka |
120a6e |
obj->removeKeyframeWithoutUndo(m_frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
m_objectHandle->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int UndoRemoveKeyFrame::getSize() const {
|
|
Shinya Kitaoka |
120a6e |
return 10 << 10;
|
|
Shinya Kitaoka |
120a6e |
} // Gave up exact calculation. Say ~10 kB?
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// UndoStageObjectCenterMove
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
UndoStageObjectCenterMove::UndoStageObjectCenterMove(const TStageObjectId &id,
|
|
Shinya Kitaoka |
120a6e |
int frame,
|
|
Shinya Kitaoka |
120a6e |
const TPointD &before,
|
|
Shinya Kitaoka |
120a6e |
const TPointD &after)
|
|
Shinya Kitaoka |
120a6e |
: m_pid(id), m_frame(frame), m_before(before), m_after(after) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void UndoStageObjectCenterMove::undo() const {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
xsh->setCenter(m_pid, m_frame, m_before);
|
|
Shinya Kitaoka |
120a6e |
m_objectHandle->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void UndoStageObjectCenterMove::redo() const {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
xsh->setCenter(m_pid, m_frame, m_after);
|
|
Shinya Kitaoka |
120a6e |
m_objectHandle->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// UndoStageObjectMove
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
UndoStageObjectMove::UndoStageObjectMove(const TStageObjectValues &before,
|
|
Shinya Kitaoka |
120a6e |
const TStageObjectValues &after)
|
|
Shinya Kitaoka |
120a6e |
: m_before(before), m_after(after) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void UndoStageObjectMove::undo() const {
|
|
Shinya Kitaoka |
120a6e |
m_before.applyValues(false);
|
|
Shinya Kitaoka |
120a6e |
m_objectHandle->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void UndoStageObjectMove::redo() const {
|
|
Shinya Kitaoka |
120a6e |
m_after.applyValues(false);
|
|
Shinya Kitaoka |
120a6e |
m_objectHandle->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// UndoStageObjectPinned
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
UndoStageObjectPinned::UndoStageObjectPinned(const TStageObjectId &id,
|
|
Shinya Kitaoka |
120a6e |
int frame, const bool &before,
|
|
Shinya Kitaoka |
120a6e |
const bool &after)
|
|
Shinya Kitaoka |
120a6e |
: m_pid(id), m_frame(frame), m_before(before), m_after(after) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void UndoStageObjectPinned::undo() const {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
TStageObject *obj = xsh->getStageObject(m_pid);
|
|
Shinya Kitaoka |
120a6e |
assert(0);
|
|
Shinya Kitaoka |
120a6e |
// obj->setIsPinned(m_frame,m_before);
|
|
Shinya Kitaoka |
120a6e |
m_objectHandle->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void UndoStageObjectPinned::redo() const {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = m_xsheetHandle->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
TStageObject *obj = xsh->getStageObject(m_pid);
|
|
Shinya Kitaoka |
120a6e |
assert(0);
|
|
Shinya Kitaoka |
120a6e |
// obj->setIsPinned(m_frame,m_after);
|
|
Shinya Kitaoka |
120a6e |
m_objectHandle->notifyObjectIdChanged(false);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// insertFrame
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
// sposto avanti di un frame tutti i keyframes >= frame
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Shinya Kitaoka |
120a6e |
void insertFrame(TDoubleParam *param, int frame) {
|
|
Shinya Kitaoka |
120a6e |
std::map<int, tdoublekeyframe=""> keyframes;</int,>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
for (int i = param->getKeyframeCount() - 1; i >= 0; --i) {
|
|
Shinya Kitaoka |
120a6e |
TDoubleKeyframe k = param->getKeyframe(i);
|
|
Shinya Kitaoka |
120a6e |
if (k.m_frame < (double)frame) break;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
k.m_frame += 1.0;
|
|
Shinya Kitaoka |
120a6e |
keyframes.insert(keyframes.begin(), std::make_pair(i, k));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (!keyframes.empty()) param->setKeyframes(keyframes);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void insertFrame(TStageObject *obj, int frame) {
|
|
Shinya Kitaoka |
120a6e |
// Move standard TStageObject channels
|
|
Shinya Kitaoka |
120a6e |
for (int channel = 0; channel != TStageObject::T_ChannelCount; ++channel)
|
|
Shinya Kitaoka |
120a6e |
insertFrame(obj->getParam((TStageObject::Channel)channel), frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
if (const SkDP &sd = obj->getPlasticSkeletonDeformation()) {
|
|
Shinya Kitaoka |
120a6e |
// Move Plastic channels
|
|
Shinya Kitaoka |
120a6e |
insertFrame(sd->skeletonIdsParam().getPointer(), frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
PlasticSkeletonDeformation::vd_iterator vt, vEnd;
|
|
Shinya Kitaoka |
120a6e |
sd->vertexDeformations(vt, vEnd);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
for (; vt != vEnd; ++vt) {
|
|
Shinya Kitaoka |
120a6e |
SkVD *vd = (*vt).second;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
for (int p = 0; p != SkVD::PARAMS_COUNT; ++p)
|
|
Shinya Kitaoka |
120a6e |
insertFrame(vd->m_params[p].getPointer(), frame);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// removeFrame
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
// cancello l'eventuale keyframe = frame;
|
|
Toshihiro Shimizu |
890ddd |
// sposto tutti i successivi indietro di un frame
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Shinya Kitaoka |
120a6e |
void removeFrame(TDoubleParam *param, int frame) {
|
|
Shinya Kitaoka |
120a6e |
param->deleteKeyframe((double)frame);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
std::map<int, tdoublekeyframe=""> keyframes;</int,>
|
|
Shinya Kitaoka |
120a6e |
int i = 0;
|
|
Shinya Kitaoka |
120a6e |
while (i < param->getKeyframeCount()) {
|
|
Shinya Kitaoka |
120a6e |
TDoubleKeyframe k = param->getKeyframe(i);
|
|
Shinya Kitaoka |
120a6e |
if (k.m_frame < frame) {
|
|
Shinya Kitaoka |
120a6e |
i++;
|
|
Shinya Kitaoka |
120a6e |
continue;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
k.m_frame -= 1;
|
|
Shinya Kitaoka |
120a6e |
keyframes[i] = k;
|
|
Shinya Kitaoka |
120a6e |
i++;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (!keyframes.empty()) param->setKeyframes(keyframes);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void removeFrame(TStageObject *obj, int frame) {
|
|
Shinya Kitaoka |
120a6e |
for (int channel = 0; channel != TStageObject::T_ChannelCount; ++channel)
|
|
Shinya Kitaoka |
120a6e |
removeFrame(obj->getParam((TStageObject::Channel)channel), frame);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// Plastic keys can be removed through xsheet commands - do so
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (const SkDP &sd = obj->getPlasticSkeletonDeformation()) {
|
|
Shinya Kitaoka |
120a6e |
removeFrame(sd->skeletonIdsParam().getPointer(), frame);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
SkD::vd_iterator vdt, vdEnd;
|
|
Shinya Kitaoka |
120a6e |
sd->vertexDeformations(vdt, vdEnd);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (; vdt != vdEnd; ++vdt) {
|
|
Shinya Kitaoka |
120a6e |
SkVD *vd = (*vdt).second;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
for (int p = 0; p != SkVD::PARAMS_COUNT; ++p)
|
|
Shinya Kitaoka |
120a6e |
removeFrame(vd->m_params[p].getPointer(), frame);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|