|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tstageobject.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzLib includes
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tstageobjecttree.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tstageobjectspline.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txsheet.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/observer.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshlevelcolumn.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshcell.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/stage.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tcamera.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/doubleparamcmd.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tpinnedrangeset.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzExt includes
|
|
Toshihiro Shimizu |
890ddd |
#include "ext/plasticskeleton.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "ext/plasticskeletondeformation.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "ext/plasticdeformerstorage.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// TnzCore includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tstream.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tstroke.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tconvert.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tundo.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tconst.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Qt includes
|
|
Toshihiro Shimizu |
890ddd |
#include <qmetaobject></qmetaobject>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// tcg includes
|
|
Toshihiro Shimizu |
890ddd |
#include "tcg/tcg_function_types.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// STD includes
|
|
Toshihiro Shimizu |
890ddd |
#include <fstream></fstream>
|
|
Toshihiro Shimizu |
890ddd |
#include <set></set>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
using namespace std;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
// Per un problema su alcune macchine, solo Release.
|
|
Toshihiro Shimizu |
890ddd |
// il problema si verifica ruotando gli oggetti sul camera stand
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
Toshihiro Shimizu |
890ddd |
#pragma optimize("", off)
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
TAffine makeRotation(double ang)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return TRotation(ang);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Shinya Kitaoka |
9f5a1b |
#ifdef _WIN32
|
|
Toshihiro Shimizu |
890ddd |
#pragma optimize("", on)
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
DEFINE_CLASS_CODE(TStageObject, 102)
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// Local namespace
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
namespace
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
enum StageObjectType {
|
|
Toshihiro Shimizu |
890ddd |
NONE = 0,
|
|
Toshihiro Shimizu |
890ddd |
CAMERA = 1,
|
|
Toshihiro Shimizu |
890ddd |
TABLE = 2,
|
|
Toshihiro Shimizu |
890ddd |
PEGBAR = 5,
|
|
Toshihiro Shimizu |
890ddd |
COLUMN = 6
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const int StageObjectTypeShift = 28;
|
|
Toshihiro Shimizu |
890ddd |
const int StageObjectMaxIndex = ((1 << StageObjectTypeShift) - 1);
|
|
Toshihiro Shimizu |
890ddd |
const int StageObjectIndexMask = ((1 << StageObjectTypeShift) - 1);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TStageObjectParams implementation
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectParams::TStageObjectParams()
|
|
Toshihiro Shimizu |
890ddd |
: m_spline(0), m_noScaleZ(0)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectParams::TStageObjectParams(TStageObjectParams *data)
|
|
Toshihiro Shimizu |
890ddd |
: m_id(data->m_id), m_parentId(data->m_parentId), m_children(data->m_children), m_keyframes(data->m_keyframes), m_cycleEnabled(data->m_cycleEnabled), m_spline(data->m_spline), m_status(data->m_status), m_handle(data->m_handle), m_parentHandle(data->m_parentHandle), m_x(data->m_x), m_y(data->m_y), m_z(data->m_z), m_so(data->m_so), m_rot(data->m_rot), m_scalex(data->m_scalex), m_scaley(data->m_scaley), m_scale(data->m_scale), m_posPath(data->m_posPath), m_shearx(data->m_shearx), m_sheary(data->m_sheary), m_skeletonDeformation(data->m_skeletonDeformation), m_noScaleZ(data->m_noScaleZ), m_center(data->m_center), m_offset(data->m_offset), m_name(data->m_name), m_isOpened(data->m_isOpened), m_pinnedRangeSet(data->m_pinnedRangeSet->clone())
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectParams::~TStageObjectParams()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
delete m_pinnedRangeSet;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectParams *TStageObjectParams::clone()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return new TStageObjectParams(this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//===========================================================================
|
|
Toshihiro Shimizu |
890ddd |
// Utility Functions
|
|
Toshihiro Shimizu |
890ddd |
//---------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectId toStageObjectId(string s)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (s == "None")
|
|
Toshihiro Shimizu |
890ddd |
return TStageObjectId::NoneId;
|
|
Toshihiro Shimizu |
890ddd |
else if (s == "Table")
|
|
Toshihiro Shimizu |
890ddd |
return TStageObjectId::TableId;
|
|
Toshihiro Shimizu |
890ddd |
else if (isInt(s)) {
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectId id;
|
|
Toshihiro Shimizu |
890ddd |
id.setCode(toInt(s));
|
|
Toshihiro Shimizu |
890ddd |
return id;
|
|
Toshihiro Shimizu |
890ddd |
} else if (s.length() > 3) {
|
|
Toshihiro Shimizu |
890ddd |
if (s.substr(0, 3) == "Col")
|
|
Toshihiro Shimizu |
890ddd |
return TStageObjectId::ColumnId(toInt(s.substr(3)) - 1);
|
|
Toshihiro Shimizu |
890ddd |
else if (s.substr(0, 3) == "Peg")
|
|
Toshihiro Shimizu |
890ddd |
return TStageObjectId::PegbarId(toInt(s.substr(3)) - 1);
|
|
Toshihiro Shimizu |
890ddd |
else if (s.length() > 6 && s.substr(0, 6) == "Camera")
|
|
Toshihiro Shimizu |
890ddd |
return TStageObjectId::CameraId(toInt(s.substr(6)) - 1);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
return TStageObjectId::NoneId;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
ostream &operator<<(ostream &out, const TStageObjectId &id)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return out << id.toString();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TStageObjectId implementation
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectId::TStageObjectId() : m_id(NONE << StageObjectTypeShift) {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectId::~TStageObjectId() {}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObjectId::isCamera() const { return m_id >> StageObjectTypeShift == CAMERA; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObjectId::isTable() const { return m_id >> StageObjectTypeShift == TABLE; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObjectId::isPegbar() const { return m_id >> StageObjectTypeShift == PEGBAR; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObjectId::isColumn() const { return m_id >> StageObjectTypeShift == COLUMN; }
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const TStageObjectId TStageObjectId::NoneId(NONE << StageObjectTypeShift);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const TStageObjectId TStageObjectId::TableId(TABLE << StageObjectTypeShift);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const TStageObjectId TStageObjectId::CameraId(int index)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= index && index <= StageObjectMaxIndex);
|
|
Toshihiro Shimizu |
890ddd |
return TStageObjectId(CAMERA << StageObjectTypeShift | index);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const TStageObjectId TStageObjectId::PegbarId(int index)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= index && index <= StageObjectMaxIndex);
|
|
Toshihiro Shimizu |
890ddd |
return TStageObjectId(PEGBAR << StageObjectTypeShift | index);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const TStageObjectId TStageObjectId::ColumnId(int index)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(0 <= index && index <= StageObjectMaxIndex);
|
|
Toshihiro Shimizu |
890ddd |
return TStageObjectId(COLUMN << StageObjectTypeShift | index);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
string TStageObjectId::toString() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int index = m_id & StageObjectIndexMask;
|
|
Toshihiro Shimizu |
890ddd |
string shortName;
|
|
Toshihiro Shimizu |
890ddd |
switch (m_id >> StageObjectTypeShift) {
|
|
Toshihiro Shimizu |
890ddd |
case NONE:
|
|
Toshihiro Shimizu |
890ddd |
shortName = "None";
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case CAMERA:
|
|
Toshihiro Shimizu |
890ddd |
shortName = "Camera" + ::toString(index + 1);
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case TABLE:
|
|
Toshihiro Shimizu |
890ddd |
shortName = "Table";
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case PEGBAR:
|
|
Toshihiro Shimizu |
890ddd |
shortName = "Peg" + ::toString(index + 1);
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case COLUMN:
|
|
Toshihiro Shimizu |
890ddd |
shortName = "Col" + ::toString(index + 1);
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
default:
|
|
Toshihiro Shimizu |
890ddd |
shortName = "BadPegbar";
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
return shortName;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int TStageObjectId::getIndex() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_id & StageObjectIndexMask;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
namespace
|
|
Toshihiro Shimizu |
890ddd |
{ // TStageObject Utility
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TDoubleKeyframe withFrame(TDoubleKeyframe k, double frame)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
k.m_frame = frame;
|
|
Toshihiro Shimizu |
890ddd |
return k;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool setKeyframe(const TDoubleParamP ¶m, const TDoubleKeyframe &kf,
|
|
Toshihiro Shimizu |
890ddd |
int frame, const double &easeIn, const double &easeOut)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!kf.m_isKeyframe)
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TDoubleKeyframe kfCopy = kf;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
kfCopy.m_frame = frame;
|
|
Toshihiro Shimizu |
890ddd |
if (easeIn >= 0.0)
|
|
Toshihiro Shimizu |
890ddd |
kfCopy.m_speedIn = TPointD(-easeIn, kfCopy.m_speedIn.y);
|
|
Toshihiro Shimizu |
890ddd |
if (easeOut >= 0.0)
|
|
Toshihiro Shimizu |
890ddd |
kfCopy.m_speedOut = TPointD(easeOut, kfCopy.m_speedOut.y);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
param->setKeyframe(kfCopy);
|
|
Toshihiro Shimizu |
890ddd |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void setkey(const TDoubleParamP ¶m, int frame)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
KeyframeSetter setter(param.getPointer(), -1, false);
|
|
Toshihiro Shimizu |
890ddd |
setter.createKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void updateUnit(TDoubleParam *param)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
for (int i = 0; i < param->getKeyframeCount(); i++) {
|
|
Toshihiro Shimizu |
890ddd |
TDoubleKeyframe k = param->getKeyframe(i);
|
|
Toshihiro Shimizu |
890ddd |
k.m_value /= Stage::inch;
|
|
Toshihiro Shimizu |
890ddd |
param->setKeyframe(i, k);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
string convertTo4InchCenterUnits(string handle)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
// per convenzione un handle del tipo 'a'..'z' utilizza
|
|
Toshihiro Shimizu |
890ddd |
// la vecchia convenzione per i centri (4 inch invece di 8)
|
|
Toshihiro Shimizu |
890ddd |
if (handle.length() == 1 && 'A' <= handle[0] && handle[0] <= 'Z' && handle[0] != 'B')
|
|
Toshihiro Shimizu |
890ddd |
return string(1, handle[0] + 'a' - 'A');
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return handle;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPointD updateDagPosition(const TPointD &pos, const VersionNumber &tnzVersion)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (tnzVersion < VersionNumber(1, 16))
|
|
Toshihiro Shimizu |
890ddd |
return TConst::nowhere;
|
|
Toshihiro Shimizu |
890ddd |
return pos;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Update the passed stage object keyframe and keyframe type specification with
|
|
Toshihiro Shimizu |
890ddd |
// a new keyframe. Returns true if specifications match, false otherwise.
|
|
Toshihiro Shimizu |
890ddd |
bool touchEaseAndCompare(const TDoubleKeyframe &kf,
|
|
Toshihiro Shimizu |
890ddd |
TStageObject::Keyframe &stageKf, TDoubleKeyframe::Type &type)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
bool initialization = (type == TDoubleKeyframe::None);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (initialization)
|
|
Toshihiro Shimizu |
890ddd |
type = kf.m_type;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (kf.m_type != type ||
|
|
Toshihiro Shimizu |
890ddd |
(kf.m_type != TDoubleKeyframe::SpeedInOut &&
|
|
Toshihiro Shimizu |
890ddd |
kf.m_type != TDoubleKeyframe::EaseInOut &&
|
|
Toshihiro Shimizu |
890ddd |
(kf.m_prevType != TDoubleKeyframe::None &&
|
|
Toshihiro Shimizu |
890ddd |
kf.m_prevType != TDoubleKeyframe::SpeedInOut &&
|
|
Toshihiro Shimizu |
890ddd |
kf.m_prevType != TDoubleKeyframe::EaseInOut))) {
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_easeIn = -1.0;
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_easeOut = -1.0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double easeIn = -kf.m_speedIn.x;
|
|
Toshihiro Shimizu |
890ddd |
if (initialization)
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_easeIn = easeIn;
|
|
Toshihiro Shimizu |
890ddd |
else if (stageKf.m_easeIn != easeIn)
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_easeIn = -1.0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double easeOut = kf.m_speedOut.x;
|
|
Toshihiro Shimizu |
890ddd |
if (initialization)
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_easeOut = easeOut;
|
|
Toshihiro Shimizu |
890ddd |
else if (stageKf.m_easeOut != easeOut)
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_easeOut = -1.0;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TStageObject::LazyData implementation
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObject::LazyData::LazyData()
|
|
Toshihiro Shimizu |
890ddd |
: m_time(-1.0)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
// TStageObject implementation
|
|
Toshihiro Shimizu |
890ddd |
//************************************************************************************************
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObject::TStageObject(TStageObjectTree *tree, TStageObjectId id)
|
|
Toshihiro Shimizu |
890ddd |
: m_tree(tree), m_id(id), m_parent(0), m_name(""), m_isOpened(false), m_spline(0), m_status(XY), m_x(new TDoubleParam()), m_y(new TDoubleParam()), m_z(new TDoubleParam()), m_so(new TDoubleParam()), m_rot(new TDoubleParam()), m_scalex(new TDoubleParam(1.0)), m_scaley(new TDoubleParam(1.0)), m_scale(new TDoubleParam(1.0)), m_posPath(new TDoubleParam()), m_shearx(new TDoubleParam()), m_sheary(new TDoubleParam()), m_center(), m_offset(), m_cycleEnabled(false), m_handle("B"), m_parentHandle("B"), m_dagNodePos(TConst::nowhere), m_camera(0), m_locked(false), m_noScaleZ(0), m_pinnedRangeSet(0), m_ikflag(0), m_groupSelector(-1)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
// NOTA: per le unita' di misura controlla anche tooloptions.cpp
|
|
Toshihiro Shimizu |
890ddd |
m_x->setName("W_EW");
|
|
Toshihiro Shimizu |
890ddd |
m_x->setMeasureName("length.x");
|
|
Toshihiro Shimizu |
890ddd |
m_x->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_y->setName("W_NS");
|
|
Toshihiro Shimizu |
890ddd |
m_y->setMeasureName("length.y");
|
|
Toshihiro Shimizu |
890ddd |
m_y->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_z->setName("W_Z");
|
|
Toshihiro Shimizu |
890ddd |
m_z->setMeasureName(id.isCamera() ? "zdepth.cam" : "zdepth");
|
|
Toshihiro Shimizu |
890ddd |
m_z->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_so->setName("W_SO");
|
|
Toshihiro Shimizu |
890ddd |
m_so->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_rot->setName("W_Rotation");
|
|
Toshihiro Shimizu |
890ddd |
m_rot->setMeasureName("angle");
|
|
Toshihiro Shimizu |
890ddd |
m_rot->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_scalex->setName("W_ScaleH");
|
|
Toshihiro Shimizu |
890ddd |
m_scalex->setMeasureName("scale");
|
|
Toshihiro Shimizu |
890ddd |
m_scalex->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_scaley->setName("W_ScaleV");
|
|
Toshihiro Shimizu |
890ddd |
m_scaley->setMeasureName("scale");
|
|
Toshihiro Shimizu |
890ddd |
m_scaley->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_scale->setName("W_Scale");
|
|
Toshihiro Shimizu |
890ddd |
m_scale->setMeasureName("scale");
|
|
Toshihiro Shimizu |
890ddd |
m_scale->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_shearx->setName("W_ShearH");
|
|
Toshihiro Shimizu |
890ddd |
m_shearx->setMeasureName("shear");
|
|
Toshihiro Shimizu |
890ddd |
m_shearx->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_sheary->setName("W_ShearV");
|
|
Toshihiro Shimizu |
890ddd |
m_sheary->setMeasureName("shear");
|
|
Toshihiro Shimizu |
890ddd |
m_sheary->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_posPath->setName("posPath");
|
|
Toshihiro Shimizu |
890ddd |
m_posPath->setMeasureName("percentage2");
|
|
Toshihiro Shimizu |
890ddd |
m_posPath->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_x);
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_y);
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_z);
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_so);
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_rot);
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_scalex);
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_scaley);
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_scale);
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_shearx);
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_sheary);
|
|
Toshihiro Shimizu |
890ddd |
m_tree->setGrammar(m_posPath);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (id.isCamera())
|
|
Toshihiro Shimizu |
890ddd |
m_camera = new TCamera();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_pinnedRangeSet = new TPinnedRangeSet();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObject::~TStageObject()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline) {
|
|
Toshihiro Shimizu |
890ddd |
if (m_posPath)
|
|
Toshihiro Shimizu |
890ddd |
m_spline->removeParam(m_posPath.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_spline->release();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_x)
|
|
Toshihiro Shimizu |
890ddd |
m_x->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
if (m_y)
|
|
Toshihiro Shimizu |
890ddd |
m_y->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
if (m_z)
|
|
Toshihiro Shimizu |
890ddd |
m_z->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
if (m_so)
|
|
Toshihiro Shimizu |
890ddd |
m_so->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
if (m_rot)
|
|
Toshihiro Shimizu |
890ddd |
m_rot->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
if (m_scalex)
|
|
Toshihiro Shimizu |
890ddd |
m_scalex->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
if (m_scaley)
|
|
Toshihiro Shimizu |
890ddd |
m_scaley->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
if (m_scale)
|
|
Toshihiro Shimizu |
890ddd |
m_scale->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
if (m_shearx)
|
|
Toshihiro Shimizu |
890ddd |
m_shearx->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
if (m_sheary)
|
|
Toshihiro Shimizu |
890ddd |
m_sheary->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
if (m_posPath)
|
|
Toshihiro Shimizu |
890ddd |
m_posPath->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation) {
|
|
Toshihiro Shimizu |
890ddd |
PlasticDeformerStorage::instance()->releaseDeformationData(m_skeletonDeformation.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
delete m_camera;
|
|
Toshihiro Shimizu |
890ddd |
delete m_pinnedRangeSet;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const TStageObject::LazyData &TStageObject::lazyData() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
typedef tcg::function<void &)="" &tstageobject::update="" (tstageobject::*)(lazydata="" const,=""> Func;</void>
|
|
Toshihiro Shimizu |
890ddd |
return m_lazyData(tcg::bind1st(Func(), *this));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObject::LazyData &TStageObject::lazyData()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return const_cast<lazydata &="">(static_cast<const &="" tstageobject="">(*this).lazyData());</const></lazydata>
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::update(LazyData &ld) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (ld.m_time >= 0.0)
|
|
Toshihiro Shimizu |
890ddd |
invalidate(ld);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
updateKeyframes(ld);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::onChange(const class TParamChange &c)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
// Rationale: Since a stage object holds many parameters (or par references),
|
|
Toshihiro Shimizu |
890ddd |
// it may receive multiple notifications at the same time - but it should
|
|
Toshihiro Shimizu |
890ddd |
// actually refresh its data only ONCE for 'em all.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Even worse, the stage object may be notified for EACH touched key of just
|
|
Toshihiro Shimizu |
890ddd |
// one of its parameters. This means this function gets called A LOT.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Thus, we're just SCHEDULING for a data refresh. The actual refresh happens
|
|
Toshihiro Shimizu |
890ddd |
// whenever the scheduled datas are accessed.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (c.m_keyframeChanged)
|
|
Toshihiro Shimizu |
890ddd |
m_lazyData.invalidate(); // Both invalidate placement AND keyframes
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
invalidate(); // Invalidate placement only
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectId TStageObject::getId() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_id;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double TStageObject::paramsTime(double t) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
const KeyframeMap &keyframes = lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_cycleEnabled && keyframes.size() > 1) {
|
|
Toshihiro Shimizu |
890ddd |
int firstT = keyframes.begin()->first;
|
|
Toshihiro Shimizu |
890ddd |
if (t <= firstT)
|
|
Toshihiro Shimizu |
890ddd |
return t;
|
|
Toshihiro Shimizu |
890ddd |
int lastT = keyframes.rbegin()->first;
|
|
Toshihiro Shimizu |
890ddd |
int tRange = lastT - firstT + 1;
|
|
Toshihiro Shimizu |
890ddd |
assert(tRange > 0);
|
|
Toshihiro Shimizu |
890ddd |
int it = tfloor(t);
|
|
Toshihiro Shimizu |
890ddd |
double ft = t - it;
|
|
Toshihiro Shimizu |
890ddd |
return firstT + ((it - firstT) % tRange) + ft;
|
|
Toshihiro Shimizu |
890ddd |
} else
|
|
Toshihiro Shimizu |
890ddd |
return t;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setName(const std::string &name)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_name = (name == m_id.toString()) ? std::string() : name;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
string TStageObject::getName() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (m_name != "")
|
|
Toshihiro Shimizu |
890ddd |
return m_name;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_id.isColumn())
|
|
Toshihiro Shimizu |
890ddd |
return m_id.toString();
|
|
Toshihiro Shimizu |
890ddd |
wstring s = L"Col" + toWideString(m_id.getIndex() + 1);
|
|
Toshihiro Shimizu |
890ddd |
return toString(s);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
string TStageObject::getFullName() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
string name = getName();
|
|
Toshihiro Shimizu |
890ddd |
if (m_id.isColumn()) {
|
|
Toshihiro Shimizu |
890ddd |
if (name.find("Col") == 0 &&
|
|
Toshihiro Shimizu |
890ddd |
name.length() > 3 &&
|
|
Toshihiro Shimizu |
890ddd |
name.find_first_not_of("0123456789", 3) == string::npos)
|
|
Toshihiro Shimizu |
890ddd |
return name;
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return name + " (" + toString(m_id.getIndex() + 1) + ")";
|
|
Toshihiro Shimizu |
890ddd |
} else
|
|
Toshihiro Shimizu |
890ddd |
return name;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setParent(const TStageObjectId &parentId)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(m_tree);
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *newParent = 0;
|
|
Toshihiro Shimizu |
890ddd |
if (parentId != TStageObjectId::NoneId) {
|
|
Toshihiro Shimizu |
890ddd |
newParent = m_tree->getStageObject(parentId);
|
|
Toshihiro Shimizu |
890ddd |
assert(newParent);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// cerco di evitare i cicli
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *p = newParent;
|
|
Toshihiro Shimizu |
890ddd |
while (p->m_parent) {
|
|
Toshihiro Shimizu |
890ddd |
if (p->m_parent->getId() == getId())
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
p = p->m_parent;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
if (!m_id.isCamera() && !m_id.isTable()) {
|
|
Toshihiro Shimizu |
890ddd |
newParent = m_tree->getStageObject(TStageObjectId::TableId);
|
|
Toshihiro Shimizu |
890ddd |
assert(newParent);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_parent)
|
|
Toshihiro Shimizu |
890ddd |
m_parent->m_children.remove(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_parent = newParent;
|
|
Toshihiro Shimizu |
890ddd |
if (m_parent)
|
|
Toshihiro Shimizu |
890ddd |
m_parent->m_children.insert(m_parent->m_children.end(), this);
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef NDEBUG
|
|
Toshihiro Shimizu |
890ddd |
if (m_id.isCamera()) {
|
|
Toshihiro Shimizu |
890ddd |
} else if (m_id.isTable()) {
|
|
Toshihiro Shimizu |
890ddd |
assert(m_parent == 0);
|
|
Toshihiro Shimizu |
890ddd |
} else if (m_id.isColumn()) {
|
|
Toshihiro Shimizu |
890ddd |
assert(m_parent &&
|
|
Toshihiro Shimizu |
890ddd |
(m_parent->m_id.isTable() ||
|
|
Toshihiro Shimizu |
890ddd |
m_parent->m_id.isColumn() ||
|
|
Toshihiro Shimizu |
890ddd |
m_parent->m_id.isPegbar() ||
|
|
Toshihiro Shimizu |
890ddd |
m_parent->m_id.isCamera()));
|
|
Toshihiro Shimizu |
890ddd |
} else if (m_id.isPegbar()) {
|
|
Toshihiro Shimizu |
890ddd |
assert(m_parent &&
|
|
Toshihiro Shimizu |
890ddd |
(m_parent->m_id.isTable() ||
|
|
Toshihiro Shimizu |
890ddd |
m_parent->m_id.isCamera() ||
|
|
Toshihiro Shimizu |
890ddd |
m_parent->m_id.isPegbar()));
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
assert(0);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::detachFromParent()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (m_parent)
|
|
Toshihiro Shimizu |
890ddd |
m_parent->m_children.remove(this);
|
|
Toshihiro Shimizu |
890ddd |
m_parent = 0;
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::attachChildrenToParent(const TStageObjectId &parentId)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
while (!m_children.empty()) {
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *son = *m_children.begin();
|
|
Toshihiro Shimizu |
890ddd |
if (son)
|
|
Toshihiro Shimizu |
890ddd |
son->setParent(parentId);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectId TStageObject::getParent() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_parent ? m_parent->m_id : TStageObjectId();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::isAncestor(TStageObject *stageObject) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!stageObject)
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
if (stageObject == (TStageObject *)m_parent)
|
|
Toshihiro Shimizu |
890ddd |
return true;
|
|
Toshihiro Shimizu |
890ddd |
else if (m_parent == 0)
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return m_parent->isAncestor(stageObject);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectSpline *TStageObject::getSpline() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_spline;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::doSetSpline(TStageObjectSpline *spline)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
TDoubleParam *param = m_posPath.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
bool uppkEnabled = isUppkEnabled();
|
|
Toshihiro Shimizu |
890ddd |
if (!spline) {
|
|
Toshihiro Shimizu |
890ddd |
if (uppkEnabled && m_spline)
|
|
Toshihiro Shimizu |
890ddd |
m_spline->removeParam(param);
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline)
|
|
Toshihiro Shimizu |
890ddd |
m_spline->release();
|
|
Toshihiro Shimizu |
890ddd |
m_spline = 0;
|
|
Toshihiro Shimizu |
890ddd |
enablePath(false);
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline != spline) {
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline && uppkEnabled)
|
|
Toshihiro Shimizu |
890ddd |
m_spline->removeParam(param);
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline)
|
|
Toshihiro Shimizu |
890ddd |
m_spline->release();
|
|
Toshihiro Shimizu |
890ddd |
m_spline = spline;
|
|
Toshihiro Shimizu |
890ddd |
m_spline->addRef();
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline && uppkEnabled)
|
|
Toshihiro Shimizu |
890ddd |
m_spline->addParam(param);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
if (!isPathEnabled())
|
|
Toshihiro Shimizu |
890ddd |
enablePath(true);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setSpline(TStageObjectSpline *spline)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
doSetSpline(spline);
|
|
Toshihiro Shimizu |
890ddd |
TNotifier::instance()->notify(TXsheetChange());
|
|
Toshihiro Shimizu |
890ddd |
TNotifier::instance()->notify(TStageChange());
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setStatus(Status status)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (m_status == status)
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
bool oldPathEnabled = isPathEnabled();
|
|
Toshihiro Shimizu |
890ddd |
bool oldUppkEnabled = isUppkEnabled();
|
|
Toshihiro Shimizu |
890ddd |
m_status = status;
|
|
Toshihiro Shimizu |
890ddd |
bool pathEnabled = isPathEnabled();
|
|
Toshihiro Shimizu |
890ddd |
bool uppkEnabled = isUppkEnabled();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (pathEnabled) {
|
|
Toshihiro Shimizu |
890ddd |
if (!m_spline)
|
|
Toshihiro Shimizu |
890ddd |
doSetSpline(m_tree->createSpline());
|
|
Toshihiro Shimizu |
890ddd |
else if (oldUppkEnabled != uppkEnabled) {
|
|
Toshihiro Shimizu |
890ddd |
TDoubleParam *param = getParam(T_Path);
|
|
Toshihiro Shimizu |
890ddd |
if (uppkEnabled)
|
|
Toshihiro Shimizu |
890ddd |
m_spline->addParam(param);
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
m_spline->removeParam(param);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
doSetSpline(0);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::enableAim(bool enabled)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
setStatus((Status)((m_status & ~STATUS_MASK) | (enabled ? PATH_AIM : PATH)));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::enablePath(bool enabled)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (isPathEnabled() != enabled)
|
|
Toshihiro Shimizu |
890ddd |
setStatus(enabled ? PATH : XY);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::enableUppk(bool enabled)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(isPathEnabled());
|
|
Toshihiro Shimizu |
890ddd |
setStatus((Status)((m_status & ~UPPK_MASK) | (enabled ? UPPK_MASK : 0)));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setCenter(double frame, const TPointD ¢er)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
TPointD c = center - getHandlePos(m_handle, (int)frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TAffine aff = computeLocalPlacement(frame);
|
|
Toshihiro Shimizu |
890ddd |
TPointD delta = aff * c - aff * m_center;
|
|
Toshihiro Shimizu |
890ddd |
m_center = c;
|
|
Toshihiro Shimizu |
890ddd |
m_offset += delta;
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPointD TStageObject::getCenter(double frame) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_center + getHandlePos(m_handle, (int)frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPointD TStageObject::getOffset() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_offset;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setOffset(const TPointD &off)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_offset = off;
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::getCenterAndOffset(TPointD ¢er, TPointD &offset) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
center = m_center;
|
|
Toshihiro Shimizu |
890ddd |
offset = m_offset;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setCenterAndOffset(const TPointD ¢er, const TPointD &offset)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_center = center;
|
|
Toshihiro Shimizu |
890ddd |
m_offset = offset;
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setHandle(const std::string &s)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_handle = s;
|
|
Toshihiro Shimizu |
890ddd |
if (!s.empty() && s[0] == 'H')
|
|
Toshihiro Shimizu |
890ddd |
m_offset = m_center = TPointD();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setParentHandle(const std::string &s)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_parentHandle = s;
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPointD TStageObject::getHandlePos(string handle, int row) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
double unit = 8;
|
|
Toshihiro Shimizu |
890ddd |
if (handle == "")
|
|
Toshihiro Shimizu |
890ddd |
return TPointD();
|
|
Toshihiro Shimizu |
890ddd |
else if (handle.length() > 1 && handle[0] == 'H')
|
|
Toshihiro Shimizu |
890ddd |
return m_tree->getHandlePos(m_id, handle, row);
|
|
Toshihiro Shimizu |
890ddd |
else if (handle.length() == 1 && 'A' <= handle[0] && handle[0] <= 'Z')
|
|
Toshihiro Shimizu |
890ddd |
return TPointD(unit * (handle[0] - 'B'), 0);
|
|
Toshihiro Shimizu |
890ddd |
else if (handle.length() == 1 && 'a' <= handle[0] && handle[0] <= 'z')
|
|
Toshihiro Shimizu |
890ddd |
return TPointD(0.5 * unit * (handle[0] - 'b'), 0);
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return TPointD(0, 0);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::isKeyframe(int frame) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
const KeyframeMap &keyframes = lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
return keyframes.find(frame) != keyframes.end();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::is52FullKeyframe(int frame) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_rot->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_x->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_y->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_z->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_posPath->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_scalex->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_scaley->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_shearx->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_sheary->isKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::isFullKeyframe(int frame) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_rot->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_x->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_y->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_z->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_so->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_posPath->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_scalex->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_scaley->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_scale->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_shearx->isKeyframe(frame) &&
|
|
Toshihiro Shimizu |
890ddd |
m_sheary->isKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObject::Keyframe TStageObject::getKeyframe(int frame) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
const KeyframeMap &keyframes = lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
std::map<int, tstageobject::keyframe="">::const_iterator it;</int,>
|
|
Toshihiro Shimizu |
890ddd |
it = keyframes.find(frame);
|
|
Toshihiro Shimizu |
890ddd |
if (it == keyframes.end()) {
|
|
Toshihiro Shimizu |
890ddd |
TStageObject::Keyframe k;
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_Angle] = m_rot->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_X] = m_x->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_Y] = m_y->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_Z] = m_z->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_SO] = m_so->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_ScaleX] = m_scalex->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_ScaleY] = m_scaley->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_Scale] = m_scale->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_Path] = m_posPath->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_ShearX] = m_shearx->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
k.m_channels[TStageObject::T_ShearY] = m_sheary->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation)
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation->getKeyframeAt(frame, k.m_skeletonKeyframe);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
k.m_isKeyframe = false;
|
|
Toshihiro Shimizu |
890ddd |
return k;
|
|
Toshihiro Shimizu |
890ddd |
} else
|
|
Toshihiro Shimizu |
890ddd |
return it->second;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setKeyframeWithoutUndo(int frame, const TStageObject::Keyframe &k)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
KeyframeMap &keyframes = lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool keyWasSet = false;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_rot, k.m_channels[TStageObject::T_Angle], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_x, k.m_channels[TStageObject::T_X], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_y, k.m_channels[TStageObject::T_Y], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_z, k.m_channels[TStageObject::T_Z], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_so, k.m_channels[TStageObject::T_SO], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_posPath, k.m_channels[TStageObject::T_Path], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_scalex, k.m_channels[TStageObject::T_ScaleX], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_scaley, k.m_channels[TStageObject::T_ScaleY], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_scale, k.m_channels[TStageObject::T_Scale], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_shearx, k.m_channels[TStageObject::T_ShearX], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = ::setKeyframe(m_sheary, k.m_channels[TStageObject::T_ShearY], frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation)
|
|
Toshihiro Shimizu |
890ddd |
keyWasSet = m_skeletonDeformation->setKeyframe(k.m_skeletonKeyframe, frame, k.m_easeIn, k.m_easeOut) || keyWasSet;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (keyWasSet)
|
|
Toshihiro Shimizu |
890ddd |
keyframes[frame] = k;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setKeyframeWithoutUndo(int frame)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (isFullKeyframe(frame))
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_x, frame);
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_y, frame);
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_z, frame);
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_so, frame);
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_posPath, frame);
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_rot, frame);
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_scalex, frame);
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_scaley, frame);
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_scale, frame);
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_shearx, frame);
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_sheary, frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Plastic keys are currently not *created* by xsheet commands.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*if(m_skeletonDeformation)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
const PlasticSkeleton* skeleton = m_skeletonDeformation->skeleton();
|
|
Toshihiro Shimizu |
890ddd |
const tcg::list<plasticskeleton::vertex_type>& vertices = skeleton->vertices();</plasticskeleton::vertex_type>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
tcg::list<plasticskeleton::vertex_type>::const_iterator vt, vEnd(vertices.end());</plasticskeleton::vertex_type>
|
|
Toshihiro Shimizu |
890ddd |
for(vt = vertices.begin(); vt != vertices.end(); ++vt)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
SkVD* vd = m_skeletonDeformation->vertexDeformation(vt->name());
|
|
Toshihiro Shimizu |
890ddd |
assert(vd);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
for(int p=0; p
|
|
Toshihiro Shimizu |
890ddd |
setkey(vd->m_params[p], frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}*/
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::removeKeyframeWithoutUndo(int frame)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
KeyframeMap &keyframes = lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
double &time = lazyData().m_time;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (!isKeyframe(frame))
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
keyframes.erase(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_rot->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_x->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_y->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_z->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_so->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_scalex->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_scaley->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_scale->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_posPath->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_shearx->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
m_sheary->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation)
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation->deleteKeyframe(frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
time = -1;
|
|
Toshihiro Shimizu |
890ddd |
if ((int)keyframes.size() < 2)
|
|
Toshihiro Shimizu |
890ddd |
m_cycleEnabled = false;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::moveKeyframe(int dst, int src)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(dst != src);
|
|
Toshihiro Shimizu |
890ddd |
if (isKeyframe(dst) || !isKeyframe(src))
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
setKeyframeWithoutUndo(dst, getKeyframe(src));
|
|
Toshihiro Shimizu |
890ddd |
removeKeyframeWithoutUndo(src);
|
|
Toshihiro Shimizu |
890ddd |
assert(isKeyframe(dst));
|
|
Toshihiro Shimizu |
890ddd |
assert(!isKeyframe(src));
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::canMoveKeyframes(std::set<int> &frames, int delta)</int>
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (delta == 0)
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
std::set<int>::iterator it;</int>
|
|
Toshihiro Shimizu |
890ddd |
for (it = frames.begin(); it != frames.end(); ++it) {
|
|
Toshihiro Shimizu |
890ddd |
int f = *it;
|
|
Toshihiro Shimizu |
890ddd |
if (!isKeyframe(f))
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
f += delta;
|
|
Toshihiro Shimizu |
890ddd |
if (f < 0)
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
if (frames.find(f) == frames.end() && isKeyframe(f))
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::moveKeyframes(std::set<int> &frames, int delta)</int>
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!canMoveKeyframes(frames, delta))
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
if (delta < 0) {
|
|
Toshihiro Shimizu |
890ddd |
std::set<int>::iterator it;</int>
|
|
Toshihiro Shimizu |
890ddd |
for (it = frames.begin(); it != frames.end(); ++it) {
|
|
Toshihiro Shimizu |
890ddd |
bool ret = moveKeyframe(*it + delta, *it);
|
|
Toshihiro Shimizu |
890ddd |
assert(ret);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
std::set<int>::reverse_iterator ti;</int>
|
|
Toshihiro Shimizu |
890ddd |
for (ti = frames.rbegin(); ti != frames.rend(); ++ti) {
|
|
Toshihiro Shimizu |
890ddd |
bool ret = moveKeyframe(*ti + delta, *ti);
|
|
Toshihiro Shimizu |
890ddd |
assert(ret);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::getKeyframes(KeyframeMap &keyframes) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
keyframes = lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::getKeyframeRange(int &r0, int &r1) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
const KeyframeMap &keyframes = lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (keyframes.empty()) {
|
|
Toshihiro Shimizu |
890ddd |
r0 = 0;
|
|
Toshihiro Shimizu |
890ddd |
r1 = -1;
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
r0 = keyframes.begin()->first;
|
|
Toshihiro Shimizu |
890ddd |
r1 = keyframes.rbegin()->first;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::getKeyframeSpan(int row,
|
|
Toshihiro Shimizu |
890ddd |
int &r0, double &ease0,
|
|
Toshihiro Shimizu |
890ddd |
int &r1, double &ease1) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
const KeyframeMap &keyframes = lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
KeyframeMap::const_iterator it = keyframes.lower_bound(row);
|
|
Toshihiro Shimizu |
890ddd |
if (it == keyframes.end() || it == keyframes.begin() || it->first == row) {
|
|
Toshihiro Shimizu |
890ddd |
r0 = 0;
|
|
Toshihiro Shimizu |
890ddd |
r1 = -1;
|
|
Toshihiro Shimizu |
890ddd |
ease0 = ease1 = 0;
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
r1 = it->first;
|
|
Toshihiro Shimizu |
890ddd |
ease1 = it->second.m_easeIn;
|
|
Toshihiro Shimizu |
890ddd |
--it;
|
|
Toshihiro Shimizu |
890ddd |
r0 = it->first;
|
|
Toshihiro Shimizu |
890ddd |
ease0 = it->second.m_easeOut;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setParam(Channel type, double frame, double val)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(0);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double TStageObject::getParam(Channel type, double frame) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
switch (type) {
|
|
Toshihiro Shimizu |
890ddd |
case T_Angle:
|
|
Toshihiro Shimizu |
890ddd |
return m_rot->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
case T_X:
|
|
Toshihiro Shimizu |
890ddd |
return m_x->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
case T_Y:
|
|
Toshihiro Shimizu |
890ddd |
return m_y->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
case T_Z:
|
|
Toshihiro Shimizu |
890ddd |
return m_z->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
case T_SO:
|
|
Toshihiro Shimizu |
890ddd |
return m_so->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
case T_ScaleX:
|
|
Toshihiro Shimizu |
890ddd |
return m_scalex->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
case T_ScaleY:
|
|
Toshihiro Shimizu |
890ddd |
return m_scaley->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
case T_Scale:
|
|
Toshihiro Shimizu |
890ddd |
return m_scale->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
case T_Path:
|
|
Toshihiro Shimizu |
890ddd |
return m_posPath->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
case T_ShearX:
|
|
Toshihiro Shimizu |
890ddd |
return m_shearx->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
case T_ShearY:
|
|
Toshihiro Shimizu |
890ddd |
return m_sheary->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
default:
|
|
Toshihiro Shimizu |
890ddd |
assert(false);
|
|
Toshihiro Shimizu |
890ddd |
return 0;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TDoubleParam *TStageObject::getParam(Channel channel) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
switch (channel) {
|
|
Toshihiro Shimizu |
890ddd |
case T_X:
|
|
Toshihiro Shimizu |
890ddd |
return m_x.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
case T_Y:
|
|
Toshihiro Shimizu |
890ddd |
return m_y.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
case T_Z:
|
|
Toshihiro Shimizu |
890ddd |
return m_z.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
case T_SO:
|
|
Toshihiro Shimizu |
890ddd |
return m_so.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
case T_Angle:
|
|
Toshihiro Shimizu |
890ddd |
return m_rot.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
case T_Path:
|
|
Toshihiro Shimizu |
890ddd |
return m_posPath.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
case T_ScaleX:
|
|
Toshihiro Shimizu |
890ddd |
return m_scalex.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
case T_ScaleY:
|
|
Toshihiro Shimizu |
890ddd |
return m_scaley.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
case T_Scale:
|
|
Toshihiro Shimizu |
890ddd |
return m_scale.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
case T_ShearX:
|
|
Toshihiro Shimizu |
890ddd |
return m_shearx.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
case T_ShearY:
|
|
Toshihiro Shimizu |
890ddd |
return m_sheary.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
default:
|
|
Toshihiro Shimizu |
890ddd |
return 0;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
PlasticSkeletonDeformationP TStageObject::getPlasticSkeletonDeformation() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_skeletonDeformation;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setPlasticSkeletonDeformation(const PlasticSkeletonDeformationP &sd)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation == sd)
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation) {
|
|
Toshihiro Shimizu |
890ddd |
PlasticDeformerStorage::instance()->releaseDeformationData(m_skeletonDeformation.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation->setGrammar(0);
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation->removeObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation = sd;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation) {
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation->setGrammar(m_tree->getGrammar());
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *TStageObject::clone()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(m_tree);
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectId pegId = getId();
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectId newPegId = TStageObjectId::NoneId;
|
|
Toshihiro Shimizu |
890ddd |
int newIndex = pegId.getIndex();
|
|
Toshihiro Shimizu |
890ddd |
if (pegId.isCamera()) {
|
|
Toshihiro Shimizu |
890ddd |
while ((m_tree->getStageObject(TStageObjectId::CameraId(newIndex), false) != 0L) ||
|
|
Toshihiro Shimizu |
890ddd |
(pegId.getIndex() == newIndex))
|
|
Toshihiro Shimizu |
890ddd |
++newIndex;
|
|
Toshihiro Shimizu |
890ddd |
newPegId = TStageObjectId::CameraId(newIndex);
|
|
Toshihiro Shimizu |
890ddd |
} else if (pegId.isColumn()) {
|
|
Toshihiro Shimizu |
890ddd |
while ((m_tree->getStageObject(TStageObjectId::ColumnId(newIndex), false) != 0L) ||
|
|
Toshihiro Shimizu |
890ddd |
(pegId.getIndex() == newIndex))
|
|
Toshihiro Shimizu |
890ddd |
++newIndex;
|
|
Toshihiro Shimizu |
890ddd |
newPegId = TStageObjectId::ColumnId(newIndex);
|
|
Toshihiro Shimizu |
890ddd |
} else if (pegId.isPegbar()) {
|
|
Toshihiro Shimizu |
890ddd |
while ((m_tree->getStageObject(TStageObjectId::PegbarId(newIndex), false) != 0L) ||
|
|
Toshihiro Shimizu |
890ddd |
(pegId.getIndex() == newIndex))
|
|
Toshihiro Shimizu |
890ddd |
++newIndex;
|
|
Toshihiro Shimizu |
890ddd |
newPegId = TStageObjectId::PegbarId(newIndex);
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
assert(!"Unknown stage object type");
|
|
Toshihiro Shimizu |
890ddd |
return 0L;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
assert(newPegId != TStageObjectId::NoneId);
|
|
Toshihiro Shimizu |
890ddd |
assert(newIndex >= 0);
|
|
Toshihiro Shimizu |
890ddd |
assert(newPegId.getIndex() != pegId.getIndex());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// aggiunge lo stage object clonato nel stage object tree
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *clonedPeg = m_tree->getStageObject(newPegId, true);
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *cloned = clonedPeg;
|
|
Toshihiro Shimizu |
890ddd |
assert(cloned);
|
|
Toshihiro Shimizu |
890ddd |
assert(cloned->m_tree == m_tree);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
KeyframeMap &keyframes = lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
KeyframeMap &clonedKeyframes = cloned->lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
std::map<int, tstageobject::keyframe="">::iterator itKf = keyframes.begin();</int,>
|
|
Toshihiro Shimizu |
890ddd |
for (; itKf != keyframes.end(); ++itKf) {
|
|
Toshihiro Shimizu |
890ddd |
clonedKeyframes.insert(make_pair(
|
|
Toshihiro Shimizu |
890ddd |
itKf->first, itKf->second));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_cycleEnabled = m_cycleEnabled;
|
|
Toshihiro Shimizu |
890ddd |
cloned->lazyData().m_time = lazyData().m_time;
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_localPlacement = m_localPlacement;
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_absPlacement = m_absPlacement;
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_status = m_status;
|
|
Toshihiro Shimizu |
890ddd |
cloned->doSetSpline(m_spline);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_x = static_cast<tdoubleparam *="">(m_x->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_y = static_cast<tdoubleparam *="">(m_y->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_z = static_cast<tdoubleparam *="">(m_z->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_so = static_cast<tdoubleparam *="">(m_so->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_rot = static_cast<tdoubleparam *="">(m_rot->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_scalex = static_cast<tdoubleparam *="">(m_scalex->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_scaley = static_cast<tdoubleparam *="">(m_scaley->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_scale = static_cast<tdoubleparam *="">(m_scale->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_posPath = static_cast<tdoubleparam *="">(m_posPath->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_shearx = static_cast<tdoubleparam *="">(m_shearx->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_sheary = static_cast<tdoubleparam *="">(m_sheary->clone());</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation)
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_skeletonDeformation = new PlasticSkeletonDeformation(*m_skeletonDeformation);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_noScaleZ = m_noScaleZ;
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_center = m_center;
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_offset = m_offset;
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_name = m_name;
|
|
Toshihiro Shimizu |
890ddd |
cloned->m_dagNodePos = m_dagNodePos;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return cloned;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::isCycleEnabled() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_cycleEnabled;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::enableCycle(bool on)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_cycleEnabled = on;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *TStageObject::findRoot(double frame) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!m_parent)
|
|
Toshihiro Shimizu |
890ddd |
return NULL;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *parent = m_parent;
|
|
Toshihiro Shimizu |
890ddd |
while (parent->m_parent && parent->lazyData().m_time != frame)
|
|
Toshihiro Shimizu |
890ddd |
parent = parent->m_parent;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return parent;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *TStageObject::getPinnedDescendant(int frame)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (getPinnedRangeSet()->isPinned(frame))
|
|
Toshihiro Shimizu |
890ddd |
return this;
|
|
Toshihiro Shimizu |
890ddd |
for (list<tstageobject *="">::iterator it = m_children.begin(); it != m_children.end(); ++it) {</tstageobject>
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *child = *it;
|
|
Toshihiro Shimizu |
890ddd |
if (child->getPinnedRangeSet()->isPinned(frame))
|
|
Toshihiro Shimizu |
890ddd |
return child;
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *pinned = child->getPinnedDescendant(frame);
|
|
Toshihiro Shimizu |
890ddd |
if (pinned)
|
|
Toshihiro Shimizu |
890ddd |
return pinned;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
return 0;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TAffine TStageObject::computeIkRootOffset(int t)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (m_ikflag > 0)
|
|
Toshihiro Shimizu |
890ddd |
return TAffine();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// get normal movement (which will be left-multiplied to the IK-part)
|
|
Toshihiro Shimizu |
890ddd |
setStatus(XY);
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
TAffine basePlacement = getPlacement(t);
|
|
Toshihiro Shimizu |
890ddd |
setStatus(IK);
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *foot = getPinnedDescendant(t);
|
|
Toshihiro Shimizu |
890ddd |
if (foot == 0) {
|
|
Toshihiro Shimizu |
890ddd |
foot = this;
|
|
Toshihiro Shimizu |
890ddd |
setStatus(XY);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_ikflag++;
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TAffine placement = foot->getPlacement(t).inv();
|
|
Toshihiro Shimizu |
890ddd |
int t0 = 0;
|
|
Toshihiro Shimizu |
890ddd |
const TPinnedRangeSet::Range *range = foot->getPinnedRangeSet()->getRange(t);
|
|
Toshihiro Shimizu |
890ddd |
if (range)
|
|
Toshihiro Shimizu |
890ddd |
t0 = range->first;
|
|
Toshihiro Shimizu |
890ddd |
while (t0 > 0) {
|
|
Toshihiro Shimizu |
890ddd |
TStageObject *oldFoot = getPinnedDescendant(t0 - 1);
|
|
Toshihiro Shimizu |
890ddd |
if (oldFoot == 0)
|
|
Toshihiro Shimizu |
890ddd |
break; // oldFoot = this;
|
|
Toshihiro Shimizu |
890ddd |
assert(oldFoot != foot);
|
|
Toshihiro Shimizu |
890ddd |
TAffine changeFootAff = oldFoot->getPlacement(t0).inv() * foot->getPlacement(t0);
|
|
Toshihiro Shimizu |
890ddd |
placement = changeFootAff * placement;
|
|
Toshihiro Shimizu |
890ddd |
foot = oldFoot;
|
|
Toshihiro Shimizu |
890ddd |
range = oldFoot->getPinnedRangeSet()->getRange(t0 - 1);
|
|
Toshihiro Shimizu |
890ddd |
t0 = 0;
|
|
Toshihiro Shimizu |
890ddd |
if (range)
|
|
Toshihiro Shimizu |
890ddd |
t0 = range->first;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
m_ikflag--;
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
placement = foot->getPinnedRangeSet()->getPlacement() * placement;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return basePlacement * placement;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
/*
|
|
Toshihiro Shimizu |
890ddd |
inline double getPosPathAtCP(const TStroke* path, int cpIndex)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int n = path->getControlPointCount();
|
|
Toshihiro Shimizu |
890ddd |
return path->getLengthAtControlPoint(tcrop(cpIndex*4,0,n-1));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TAffine TStageObject::computeLocalPlacement(double frame)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
frame = paramsTime(frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (lazyData().m_time != frame) {
|
|
Toshihiro Shimizu |
890ddd |
double sc = m_scale->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
double sx = sc * m_scalex->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
double sy = sc * m_scaley->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
double ang = m_rot->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
double shx = m_shearx->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
double shy = m_sheary->getValue(frame);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPointD position;
|
|
Toshihiro Shimizu |
890ddd |
double posPath = 0;
|
|
Toshihiro Shimizu |
890ddd |
switch (m_status & STATUS_MASK) {
|
|
Toshihiro Shimizu |
890ddd |
case XY:
|
|
Toshihiro Shimizu |
890ddd |
position.x = m_x->getValue(frame) * Stage::inch;
|
|
Toshihiro Shimizu |
890ddd |
position.y = m_y->getValue(frame) * Stage::inch;
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case PATH:
|
|
Toshihiro Shimizu |
890ddd |
assert(m_spline);
|
|
Toshihiro Shimizu |
890ddd |
assert(m_spline->getStroke());
|
|
Toshihiro Shimizu |
890ddd |
posPath = m_spline->getStroke()->getLength() * m_posPath->getValue(frame) * 0.01;
|
|
Toshihiro Shimizu |
890ddd |
position = m_spline->getStroke()->getPointAtLength(posPath);
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case PATH_AIM:
|
|
Toshihiro Shimizu |
890ddd |
assert(m_spline);
|
|
Toshihiro Shimizu |
890ddd |
assert(m_spline->getStroke());
|
|
Toshihiro Shimizu |
890ddd |
posPath = m_spline->getStroke()->getLength() * m_posPath->getValue(frame) * 0.01;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
position = m_spline->getStroke()->getPointAtLength(posPath);
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline->getStroke()->getLength() > 1e-5)
|
|
Toshihiro Shimizu |
890ddd |
ang += rad2degree(atan(m_spline->getStroke()->getSpeedAtLength(posPath)));
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
case IK:
|
|
Toshihiro Shimizu |
890ddd |
return computeIkRootOffset(frame);
|
|
Toshihiro Shimizu |
890ddd |
break;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TAffine shear(1, shx, 0, shy, 1, 0);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPointD handlePos = getHandlePos(m_handle, (int)frame);
|
|
Toshihiro Shimizu |
890ddd |
TPointD center = (m_center + handlePos) * Stage::inch;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPointD pos = m_offset;
|
|
Toshihiro Shimizu |
890ddd |
if (m_parent)
|
|
Toshihiro Shimizu |
890ddd |
pos += m_parent->getHandlePos(m_parentHandle, (int)frame);
|
|
Toshihiro Shimizu |
890ddd |
pos = pos * Stage::inch + position;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_localPlacement = TTranslation(pos) *
|
|
Toshihiro Shimizu |
890ddd |
makeRotation(ang) * shear * TScale(sx, sy) *
|
|
Toshihiro Shimizu |
890ddd |
TTranslation(-center);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return m_localPlacement;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TAffine TStageObject::getPlacement(double t)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
double &time = lazyData().m_time;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (time == t)
|
|
Toshihiro Shimizu |
890ddd |
return m_absPlacement;
|
|
Toshihiro Shimizu |
890ddd |
if (time != -1) {
|
|
Toshihiro Shimizu |
890ddd |
if (!m_parent)
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
findRoot(t)->invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double tt = paramsTime(t);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TAffine place;
|
|
Toshihiro Shimizu |
890ddd |
if (m_parent)
|
|
Toshihiro Shimizu |
890ddd |
place = m_parent->getPlacement(t) * computeLocalPlacement(tt);
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
place = computeLocalPlacement(tt);
|
|
Toshihiro Shimizu |
890ddd |
m_absPlacement = place;
|
|
Toshihiro Shimizu |
890ddd |
time = t;
|
|
Toshihiro Shimizu |
890ddd |
return place;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double TStageObject::getZ(double t)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
double tt = paramsTime(t);
|
|
Toshihiro Shimizu |
890ddd |
if (m_parent)
|
|
Toshihiro Shimizu |
890ddd |
return m_parent->getZ(t) + m_z->getValue(tt);
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return m_z->getValue(tt);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double TStageObject::getSO(double t)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
double tt = paramsTime(t);
|
|
Toshihiro Shimizu |
890ddd |
if (m_parent)
|
|
Toshihiro Shimizu |
890ddd |
return m_parent->getSO(t) + m_so->getValue(tt);
|
|
Toshihiro Shimizu |
890ddd |
else
|
|
Toshihiro Shimizu |
890ddd |
return m_so->getValue(tt);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double TStageObject::getGlobalNoScaleZ() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_parent ? m_parent->getGlobalNoScaleZ() + m_noScaleZ : m_noScaleZ;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double TStageObject::getNoScaleZ() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_noScaleZ;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setNoScaleZ(double noScaleZ)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (m_noScaleZ == noScaleZ)
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
m_noScaleZ = noScaleZ;
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::invalidate(LazyData &ld) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
// Since this is an invalidation function, access to the invalidable data should
|
|
Toshihiro Shimizu |
890ddd |
// not trigger a data update
|
|
Toshihiro Shimizu |
890ddd |
ld.m_time = -1;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
std::list<tstageobject *="">::const_iterator cit = m_children.begin();</tstageobject>
|
|
Toshihiro Shimizu |
890ddd |
for (; cit != m_children.end(); ++cit)
|
|
Toshihiro Shimizu |
890ddd |
(*cit)->invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::invalidate()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
invalidate(m_lazyData(tcg::direct_access));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TAffine TStageObject::getParentPlacement(double t) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_parent ? m_parent->getPlacement(t) : TAffine();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Rebuild the keyframes map
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::updateKeyframes(LazyData &ld) const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
KeyframeMap &keyframes = ld.m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Clear the map
|
|
Toshihiro Shimizu |
890ddd |
keyframes.clear();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Gather all sensible parameters in a vector
|
|
Toshihiro Shimizu |
890ddd |
std::vector<tdoubleparam *=""> params;</tdoubleparam>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_status == XY) {
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_x.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_y.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_posPath.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_z.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_so.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_rot.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_scalex.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_scaley.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_scale.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_shearx.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_sheary.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation) {
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(m_skeletonDeformation->skeletonIdsParam().getPointer());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Add Plastic Skeleton params too
|
|
Toshihiro Shimizu |
890ddd |
SkD::vd_iterator vdt, vdEnd;
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation->vertexDeformations(vdt, vdEnd);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
for (; vdt != vdEnd; ++vdt) {
|
|
Toshihiro Shimizu |
890ddd |
const std::pair<const *="" *,="" qstring="" skvd=""> &vd = *vdt;</const>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
for (int p = 0; p < SkVD::PARAMS_COUNT; ++p)
|
|
Toshihiro Shimizu |
890ddd |
params.push_back(vd.second->m_params[p].getPointer());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Scan each parameter for a key frame - add each in a set
|
|
Toshihiro Shimizu |
890ddd |
std::set<int> frames;</int>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int p, pCount = params.size();
|
|
Toshihiro Shimizu |
890ddd |
for (p = 0; p < pCount; ++p) {
|
|
Toshihiro Shimizu |
890ddd |
TDoubleParam *param = params[p];
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int k, kCount = param->getKeyframeCount();
|
|
Toshihiro Shimizu |
890ddd |
for (k = 0; k < kCount; ++k) {
|
|
Toshihiro Shimizu |
890ddd |
const TDoubleKeyframe &kf = param->getKeyframe(k);
|
|
Toshihiro Shimizu |
890ddd |
frames.insert((int)kf.m_frame);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Traverse said set and build a TStageObject keyframe for each found instant
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
std::set<int>::iterator ft, fEnd(frames.end());</int>
|
|
Toshihiro Shimizu |
890ddd |
for (ft = frames.begin(); ft != fEnd; ++ft) {
|
|
Toshihiro Shimizu |
890ddd |
int f = *ft;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Add values
|
|
Toshihiro Shimizu |
890ddd |
TStageObject::Keyframe stageKf;
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_Angle] = m_rot->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_X] = m_x->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_Y] = m_y->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_Z] = m_z->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_SO] = m_so->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_ScaleX] = m_scalex->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_ScaleY] = m_scaley->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_Scale] = m_scale->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_Path] = m_posPath->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_ShearX] = m_shearx->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_channels[TStageObject::T_ShearY] = m_sheary->getKeyframeAt(f);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation)
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation->getKeyframeAt(f, stageKf.m_skeletonKeyframe);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_isKeyframe = true;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Build the stage keyframe's global ease factors
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_easeIn = -1;
|
|
Toshihiro Shimizu |
890ddd |
stageKf.m_easeOut = -1;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TDoubleKeyframe::Type type = TDoubleKeyframe::None;
|
|
Toshihiro Shimizu |
890ddd |
bool easeOk = true;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Start from analyzing standard channels
|
|
Toshihiro Shimizu |
890ddd |
for (int c = 0; easeOk && c < T_ChannelCount; ++c) {
|
|
Toshihiro Shimizu |
890ddd |
const TDoubleKeyframe &kf = stageKf.m_channels[c];
|
|
Toshihiro Shimizu |
890ddd |
if (!kf.m_isKeyframe)
|
|
Toshihiro Shimizu |
890ddd |
continue;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
easeOk = touchEaseAndCompare(kf, stageKf, type);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// Finally, check the skeleton deformation keyframes
|
|
Toshihiro Shimizu |
890ddd |
const std::map<qstring, skvd::keyframe=""> &vdfs = stageKf.m_skeletonKeyframe.m_vertexKeyframes;</qstring,>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
std::map<qstring, skvd::keyframe="">::const_iterator vdft, vdfEnd(vdfs.end());</qstring,>
|
|
Toshihiro Shimizu |
890ddd |
for (vdft = vdfs.begin(); easeOk && vdft != vdfEnd; ++vdft) {
|
|
Toshihiro Shimizu |
890ddd |
for (int p = 0; p < SkVD::PARAMS_COUNT; ++p) {
|
|
Toshihiro Shimizu |
890ddd |
const TDoubleKeyframe &kf = vdft->second.m_keyframes[p];
|
|
Toshihiro Shimizu |
890ddd |
if (!kf.m_isKeyframe)
|
|
Toshihiro Shimizu |
890ddd |
continue;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
easeOk = touchEaseAndCompare(kf, stageKf, type);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
keyframes[f] = stageKf;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::updateKeyframes()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return updateKeyframes(m_lazyData(tcg::direct_access));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::saveData(TOStream &os)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectId parentId = getParent();
|
|
Shinya Kitaoka |
3bfa54 |
std::map<std::string, string=""> attr;</std::string,>
|
|
Toshihiro Shimizu |
890ddd |
attr["id"] = parentId.toString();
|
|
Toshihiro Shimizu |
890ddd |
attr["handle"] = m_handle;
|
|
Toshihiro Shimizu |
890ddd |
attr["parentHandle"] = m_parentHandle;
|
|
Toshihiro Shimizu |
890ddd |
os.openChild("parent", attr);
|
|
Toshihiro Shimizu |
890ddd |
os.closeChild();
|
|
Toshihiro Shimizu |
890ddd |
if (m_name != "")
|
|
Toshihiro Shimizu |
890ddd |
os.child("name") << m_name;
|
|
Toshihiro Shimizu |
890ddd |
os.child("isOpened") << (int)m_isOpened;
|
|
Toshihiro Shimizu |
890ddd |
if (isGrouped()) {
|
|
Toshihiro Shimizu |
890ddd |
os.openChild("groupIds");
|
|
Toshihiro Shimizu |
890ddd |
int i;
|
|
Toshihiro Shimizu |
890ddd |
for (i = 0; i < m_groupId.size(); i++)
|
|
Toshihiro Shimizu |
890ddd |
os << m_groupId[i];
|
|
Toshihiro Shimizu |
890ddd |
os.closeChild();
|
|
Toshihiro Shimizu |
890ddd |
os.openChild("groupNames");
|
|
Toshihiro Shimizu |
890ddd |
for (i = 0; i < m_groupName.size(); i++)
|
|
Toshihiro Shimizu |
890ddd |
os << m_groupName[i];
|
|
Toshihiro Shimizu |
890ddd |
os.closeChild();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_pinnedRangeSet->saveData(os);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
os.child("center") << m_center.x << m_center.y << -m_offset.x << -m_offset.y;
|
|
Toshihiro Shimizu |
890ddd |
os.child("status") << (int)m_status;
|
|
Toshihiro Shimizu |
890ddd |
if (m_noScaleZ != 0)
|
|
Toshihiro Shimizu |
890ddd |
os.child("noScaleZ") << m_noScaleZ;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline)
|
|
Toshihiro Shimizu |
890ddd |
os.child("splinep") << m_spline;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (!m_x->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("x") << *m_x;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_y->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("y") << *m_y;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_z->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("z") << *m_z;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_so->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("so") << *m_so;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_scalex->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("sx") << *m_scalex;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_scaley->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("sy") << *m_scaley;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_scale->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("sc") << *m_scale;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_rot->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("rot") << *m_rot;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_posPath->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("pos") << *m_posPath;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_shearx->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("shx") << *m_shearx;
|
|
Toshihiro Shimizu |
890ddd |
if (!m_sheary->isDefault())
|
|
Toshihiro Shimizu |
890ddd |
os.child("shy") << *m_sheary;
|
|
Toshihiro Shimizu |
890ddd |
if (m_cycleEnabled)
|
|
Toshihiro Shimizu |
890ddd |
os.child("cycle") << 1;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation)
|
|
Toshihiro Shimizu |
890ddd |
os.child("plasticSD") << *m_skeletonDeformation;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
os.child("nodePos") << m_dagNodePos.x << m_dagNodePos.y;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (getId().isCamera()) {
|
|
Toshihiro Shimizu |
890ddd |
os.openChild("camera");
|
|
Toshihiro Shimizu |
890ddd |
m_camera->saveData(os);
|
|
Toshihiro Shimizu |
890ddd |
os.closeChild();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*TDimensionD size = m_camera->getSize();
|
|
Toshihiro Shimizu |
890ddd |
TDimension res = m_camera->getRes();
|
|
Toshihiro Shimizu |
890ddd |
bool isXPrevalence = m_camera->isXPrevalence();
|
|
Toshihiro Shimizu |
890ddd |
os.child("cameraSize") << size.lx << size.ly;
|
|
Toshihiro Shimizu |
890ddd |
os.child("cameraRes") << res.lx << res.ly;
|
|
Toshihiro Shimizu |
890ddd |
os.child("xPrevalence") << (int)isXPrevalence;*/
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::loadData(TIStream &is)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
VersionNumber tnzVersion = is.getVersion();
|
|
Toshihiro Shimizu |
890ddd |
string tagName;
|
|
Toshihiro Shimizu |
890ddd |
QList<int> groupIds;</int>
|
|
Toshihiro Shimizu |
890ddd |
QList<wstring> groupNames;</wstring>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
KeyframeMap &keyframes = lazyData().m_keyframes;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
while (is.matchTag(tagName)) {
|
|
Toshihiro Shimizu |
890ddd |
if (tagName == "parent") {
|
|
Toshihiro Shimizu |
890ddd |
string parentIdStr = is.getTagAttribute("id");
|
|
Toshihiro Shimizu |
890ddd |
string handle = is.getTagAttribute("handle");
|
|
Toshihiro Shimizu |
890ddd |
string parentHandle = is.getTagAttribute("parentHandle");
|
|
Toshihiro Shimizu |
890ddd |
if (tnzVersion < VersionNumber(1, 15)) {
|
|
Toshihiro Shimizu |
890ddd |
handle = convertTo4InchCenterUnits(handle);
|
|
Toshihiro Shimizu |
890ddd |
parentHandle = convertTo4InchCenterUnits(parentHandle);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
if (parentIdStr == "") // vecchio formato
|
|
Toshihiro Shimizu |
890ddd |
is >> parentIdStr;
|
|
Toshihiro Shimizu |
890ddd |
else {
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectId parentId = toStageObjectId(parentIdStr);
|
|
Toshihiro Shimizu |
890ddd |
if (m_id != TStageObjectId::NoneId && parentId != TStageObjectId::NoneId) {
|
|
Toshihiro Shimizu |
890ddd |
assert(parentId != m_id);
|
|
Toshihiro Shimizu |
890ddd |
setParent(parentId);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
if (handle != "")
|
|
Toshihiro Shimizu |
890ddd |
setHandle(handle);
|
|
Toshihiro Shimizu |
890ddd |
if (parentHandle != "")
|
|
Toshihiro Shimizu |
890ddd |
setParentHandle(parentHandle);
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "center") {
|
|
Toshihiro Shimizu |
890ddd |
is >> m_center.x >> m_center.y >> m_offset.x >> m_offset.y;
|
|
Toshihiro Shimizu |
890ddd |
m_offset = -m_offset;
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "name")
|
|
Toshihiro Shimizu |
890ddd |
is >> m_name;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "x")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_x;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "y")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_y;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "z")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_z;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "so")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_so;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "rot")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_rot;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "sx")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_scalex;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "sy")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_scaley;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "sc")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_scale;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "shx")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_shearx;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "shy")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_sheary;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "pos")
|
|
Toshihiro Shimizu |
890ddd |
is >> *m_posPath;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "posCP") {
|
|
Toshihiro Shimizu |
890ddd |
TDoubleParam posCP;
|
|
Toshihiro Shimizu |
890ddd |
is >> posCP;
|
|
Toshihiro Shimizu |
890ddd |
} // Ghibli 6.2 release. cfr
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "noScaleZ")
|
|
Toshihiro Shimizu |
890ddd |
is >> m_noScaleZ;
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "isOpened") {
|
|
Toshihiro Shimizu |
890ddd |
int v = 0;
|
|
Toshihiro Shimizu |
890ddd |
is >> v;
|
|
Toshihiro Shimizu |
890ddd |
m_isOpened = (bool)v;
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "pinnedStatus") {
|
|
Toshihiro Shimizu |
890ddd |
m_pinnedRangeSet->loadData(is);
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "status") {
|
|
Toshihiro Shimizu |
890ddd |
int v = 0;
|
|
Toshihiro Shimizu |
890ddd |
is >> v;
|
|
Toshihiro Shimizu |
890ddd |
m_status = (Status)v;
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "spline") {
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectSpline *spline = m_tree->createSpline();
|
|
Toshihiro Shimizu |
890ddd |
is >> *spline;
|
|
Toshihiro Shimizu |
890ddd |
m_spline = spline;
|
|
Toshihiro Shimizu |
890ddd |
m_spline->addRef();
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "splinep") {
|
|
Toshihiro Shimizu |
890ddd |
TPersist *p = 0;
|
|
Toshihiro Shimizu |
890ddd |
is >> p;
|
|
Toshihiro Shimizu |
890ddd |
m_spline = dynamic_cast<tstageobjectspline *="">(p);</tstageobjectspline>
|
|
Toshihiro Shimizu |
890ddd |
m_tree->insertSpline(m_spline);
|
|
Toshihiro Shimizu |
890ddd |
m_spline->addRef();
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "cycle") {
|
|
Toshihiro Shimizu |
890ddd |
int dummy;
|
|
Toshihiro Shimizu |
890ddd |
is >> dummy;
|
|
Toshihiro Shimizu |
890ddd |
m_cycleEnabled = true;
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "nodePos") {
|
|
Toshihiro Shimizu |
890ddd |
TPointD pos;
|
|
Toshihiro Shimizu |
890ddd |
is >> pos.x >> pos.y;
|
|
Toshihiro Shimizu |
890ddd |
m_dagNodePos = updateDagPosition(pos, tnzVersion);
|
|
Toshihiro Shimizu |
890ddd |
//is >> m_dagNodePos.x >> m_dagNodePos.y;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
//***** camera parameters till toonz 6.0 ********
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "cameraSize") {
|
|
Toshihiro Shimizu |
890ddd |
TDimensionD size(0, 0);
|
|
Toshihiro Shimizu |
890ddd |
is >> size.lx >> size.ly;
|
|
Toshihiro Shimizu |
890ddd |
if (m_camera)
|
|
Toshihiro Shimizu |
890ddd |
m_camera->setSize(size);
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "cameraRes") {
|
|
Toshihiro Shimizu |
890ddd |
TDimension res(0, 0);
|
|
Toshihiro Shimizu |
890ddd |
is >> res.lx >> res.ly;
|
|
Toshihiro Shimizu |
890ddd |
if (m_camera)
|
|
Toshihiro Shimizu |
890ddd |
m_camera->setRes(res);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
//***** camera parameters toonz 6.1 ******** november 2009
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "camera")
|
|
Toshihiro Shimizu |
890ddd |
m_camera->loadData(is);
|
|
Toshihiro Shimizu |
890ddd |
else if (tagName == "groupIds") {
|
|
Toshihiro Shimizu |
890ddd |
int groupId;
|
|
Toshihiro Shimizu |
890ddd |
while (!is.eos()) {
|
|
Toshihiro Shimizu |
890ddd |
is >> groupId;
|
|
Toshihiro Shimizu |
890ddd |
groupIds.push_back(groupId);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "groupNames") {
|
|
Toshihiro Shimizu |
890ddd |
wstring groupName;
|
|
Toshihiro Shimizu |
890ddd |
while (!is.eos()) {
|
|
Toshihiro Shimizu |
890ddd |
is >> groupName;
|
|
Toshihiro Shimizu |
890ddd |
groupNames.push_back(groupName);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
} else if (tagName == "plasticSD") {
|
|
Toshihiro Shimizu |
890ddd |
PlasticSkeletonDeformation *sd = new PlasticSkeletonDeformation;
|
|
Toshihiro Shimizu |
890ddd |
is >> *sd;
|
|
Toshihiro Shimizu |
890ddd |
setPlasticSkeletonDeformation(sd);
|
|
Toshihiro Shimizu |
890ddd |
} else
|
|
Toshihiro Shimizu |
890ddd |
throw TException("TStageObject::loadData. unexpected tag: " + tagName);
|
|
Toshihiro Shimizu |
890ddd |
is.matchEndTag();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
if (!groupIds.isEmpty()) {
|
|
Toshihiro Shimizu |
890ddd |
assert(groupIds.size() == groupNames.size());
|
|
Toshihiro Shimizu |
890ddd |
int i;
|
|
Toshihiro Shimizu |
890ddd |
for (i = 0; i < groupIds.size(); i++) {
|
|
Toshihiro Shimizu |
890ddd |
setGroupId(groupIds[i]);
|
|
Toshihiro Shimizu |
890ddd |
setGroupName(groupNames[i]);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
if (tnzVersion < VersionNumber(1, 13)) {
|
|
Toshihiro Shimizu |
890ddd |
updateUnit(m_y.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
updateUnit(m_x.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
if (tnzVersion < VersionNumber(1, 14)) {
|
|
Toshihiro Shimizu |
890ddd |
double factor = 1.0 / Stage::inch;
|
|
Toshihiro Shimizu |
890ddd |
m_center = m_center * factor;
|
|
Toshihiro Shimizu |
890ddd |
m_offset = m_offset * factor;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
if (tnzVersion < VersionNumber(1, 16) && !keyframes.empty()) {
|
|
Toshihiro Shimizu |
890ddd |
std::map<int, tstageobject::keyframe="">::iterator itKf = keyframes.begin();</int,>
|
|
Toshihiro Shimizu |
890ddd |
std::set<int> keyframeIndexSet;</int>
|
|
Michał Janiszewski |
b1cc3c |
for (; itKf != keyframes.end(); itKf++)
|
|
Toshihiro Shimizu |
890ddd |
if (is52FullKeyframe(itKf->first))
|
|
Toshihiro Shimizu |
890ddd |
keyframeIndexSet.insert(itKf->first);
|
|
Toshihiro Shimizu |
890ddd |
std::set<int>::iterator itKfInd = keyframeIndexSet.begin();</int>
|
|
Michał Janiszewski |
b1cc3c |
for (; itKfInd != keyframeIndexSet.end(); itKfInd++)
|
|
Toshihiro Shimizu |
890ddd |
setkey(m_scale, *itKfInd);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
updateKeyframes();
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline != 0 && isUppkEnabled())
|
|
Toshihiro Shimizu |
890ddd |
m_spline->addParam(m_posPath.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectParams *TStageObject::getParams() const
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
TStageObjectParams *data = new TStageObjectParams();
|
|
Toshihiro Shimizu |
890ddd |
data->m_name = m_name;
|
|
Toshihiro Shimizu |
890ddd |
data->m_center = m_center;
|
|
Toshihiro Shimizu |
890ddd |
data->m_noScaleZ = m_noScaleZ;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
data->m_id = m_id;
|
|
Toshihiro Shimizu |
890ddd |
data->m_parentId = getParent();
|
|
Toshihiro Shimizu |
890ddd |
data->m_offset = m_offset;
|
|
Toshihiro Shimizu |
890ddd |
data->m_status = m_status;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
data->m_x = m_x;
|
|
Toshihiro Shimizu |
890ddd |
data->m_y = m_y;
|
|
Toshihiro Shimizu |
890ddd |
data->m_z = m_z;
|
|
Toshihiro Shimizu |
890ddd |
data->m_so = m_so;
|
|
Toshihiro Shimizu |
890ddd |
data->m_rot = m_rot;
|
|
Toshihiro Shimizu |
890ddd |
data->m_scalex = m_scalex;
|
|
Toshihiro Shimizu |
890ddd |
data->m_scaley = m_scaley;
|
|
Toshihiro Shimizu |
890ddd |
data->m_scale = m_scale;
|
|
Toshihiro Shimizu |
890ddd |
data->m_posPath = m_posPath;
|
|
Toshihiro Shimizu |
890ddd |
data->m_shearx = m_shearx;
|
|
Toshihiro Shimizu |
890ddd |
data->m_sheary = m_sheary;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
data->m_skeletonDeformation = m_skeletonDeformation;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
data->m_cycleEnabled = m_cycleEnabled;
|
|
Toshihiro Shimizu |
890ddd |
data->m_spline = m_spline;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
data->m_handle = m_handle;
|
|
Toshihiro Shimizu |
890ddd |
data->m_parentHandle = m_parentHandle;
|
|
Toshihiro Shimizu |
890ddd |
if (m_pinnedRangeSet)
|
|
Toshihiro Shimizu |
890ddd |
data->m_pinnedRangeSet = m_pinnedRangeSet->clone();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return data;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::assignParams(const TStageObjectParams *src, bool doParametersClone)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_name = src->m_name;
|
|
Toshihiro Shimizu |
890ddd |
m_center = src->m_center;
|
|
Toshihiro Shimizu |
890ddd |
m_noScaleZ = src->m_noScaleZ;
|
|
Toshihiro Shimizu |
890ddd |
m_offset = src->m_offset;
|
|
Toshihiro Shimizu |
890ddd |
m_status = src->m_status;
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline)
|
|
Toshihiro Shimizu |
890ddd |
m_spline->release();
|
|
Toshihiro Shimizu |
890ddd |
m_spline = src->m_spline;
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline)
|
|
Toshihiro Shimizu |
890ddd |
m_spline->addRef();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (doParametersClone) {
|
|
Toshihiro Shimizu |
890ddd |
m_x->copy(src->m_x.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_y->copy(src->m_y.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_z->copy(src->m_z.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_so->copy(src->m_so.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_rot->copy(src->m_rot.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_scalex->copy(src->m_scalex.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_scaley->copy(src->m_scaley.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_scale->copy(src->m_scale.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_posPath->copy(src->m_posPath.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_shearx->copy(src->m_shearx.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
m_sheary->copy(src->m_sheary.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
if (src->m_skeletonDeformation)
|
|
Toshihiro Shimizu |
890ddd |
setPlasticSkeletonDeformation(new PlasticSkeletonDeformation(*src->m_skeletonDeformation));
|
|
Toshihiro Shimizu |
890ddd |
} else {
|
|
Toshihiro Shimizu |
890ddd |
m_x = src->m_x.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_x->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
m_y = src->m_y.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_y->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
m_z = src->m_z.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_z->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
m_so = src->m_so.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_so->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
m_rot = src->m_rot.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_rot->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
m_scalex = src->m_scalex.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_scalex->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
m_scaley = src->m_scaley.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_scaley->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
m_scale = src->m_scale.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_scale->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
m_posPath = src->m_posPath.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_posPath->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
m_shearx = src->m_shearx.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_shearx->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
m_sheary = src->m_sheary.getPointer();
|
|
Toshihiro Shimizu |
890ddd |
m_sheary->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation = src->m_skeletonDeformation;
|
|
Toshihiro Shimizu |
890ddd |
if (m_skeletonDeformation)
|
|
Toshihiro Shimizu |
890ddd |
m_skeletonDeformation->addObserver(this);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_handle = src->m_handle;
|
|
Toshihiro Shimizu |
890ddd |
m_parentHandle = src->m_parentHandle;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
m_cycleEnabled = src->m_cycleEnabled;
|
|
Toshihiro Shimizu |
890ddd |
if (m_pinnedRangeSet)
|
|
Toshihiro Shimizu |
890ddd |
*m_pinnedRangeSet = *src->m_pinnedRangeSet;
|
|
Toshihiro Shimizu |
890ddd |
updateKeyframes();
|
|
Toshihiro Shimizu |
890ddd |
if (m_spline && isUppkEnabled())
|
|
Toshihiro Shimizu |
890ddd |
m_spline->addParam(m_posPath.getPointer());
|
|
Toshihiro Shimizu |
890ddd |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
// objectZ e' la posizione dell'oggetto lungo l'asse Z
|
|
Toshihiro Shimizu |
890ddd |
// il default e' 0. valori grandi rappresentano oggetti piu' vicini alla camera
|
|
Toshihiro Shimizu |
890ddd |
// la distanza iniziale fra tavolo e camera e' 1000
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
// cameraZ e' la posizione della camera lungo l'asse Z
|
|
Toshihiro Shimizu |
890ddd |
// il default e' 0. valori negativi indicano che la camera si avvicina al tavolo
|
|
Toshihiro Shimizu |
890ddd |
// (che raggiungerebbe per un valore di -1000)
|
|
Toshihiro Shimizu |
890ddd |
//
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::perspective(TAffine &aff,
|
|
Toshihiro Shimizu |
890ddd |
const TAffine &cameraAff, double cameraZ,
|
|
Toshihiro Shimizu |
890ddd |
const TAffine &objectAff, double objectZ, double objectNoScaleZ)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
TPointD cameraPos(cameraAff.a13, cameraAff.a23);
|
|
Toshihiro Shimizu |
890ddd |
TPointD objectPos(objectAff.a13, objectAff.a23);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
const double focus = 1000;
|
|
Toshihiro Shimizu |
890ddd |
const double nearPlane = 1;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*-- dzはカメラとオブジェクトの間の距離、focus(=1000)はPegbarをZ軸方向に動かさなかった場合のデフォルト距離 --*/
|
|
Toshihiro Shimizu |
890ddd |
double dz = focus + cameraZ - objectZ;
|
|
Toshihiro Shimizu |
890ddd |
if (dz < nearPlane) {
|
|
Toshihiro Shimizu |
890ddd |
aff = TAffine();
|
|
Toshihiro Shimizu |
890ddd |
return false;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
double noScaleSc = 1 - objectNoScaleZ / focus;
|
|
Toshihiro Shimizu |
890ddd |
aff =
|
|
Toshihiro Shimizu |
890ddd |
cameraAff * TScale((focus + cameraZ) / dz) * cameraAff.inv() * objectAff * TScale(noScaleSc);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int TStageObject::setGroupId(int value)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_groupSelector++;
|
|
Toshihiro Shimizu |
890ddd |
m_groupId.insert(m_groupSelector, value);
|
|
Toshihiro Shimizu |
890ddd |
return m_groupSelector;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setGroupId(int value, int position)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
assert(position >= 0 && position <= m_groupId.size());
|
|
Toshihiro Shimizu |
890ddd |
m_groupId.insert(position, value);
|
|
Toshihiro Shimizu |
890ddd |
if (m_groupSelector + 1 >= position)
|
|
Toshihiro Shimizu |
890ddd |
m_groupSelector++;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int TStageObject::getGroupId()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_groupId.isEmpty() ||
|
|
Toshihiro Shimizu |
890ddd |
m_groupSelector < 0 ||
|
|
Toshihiro Shimizu |
890ddd |
m_groupSelector >= m_groupId.size()
|
|
Toshihiro Shimizu |
890ddd |
? 0
|
|
Toshihiro Shimizu |
890ddd |
: m_groupId[m_groupSelector];
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
QStack<int> TStageObject::getGroupIdStack()</int>
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_groupId;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::removeGroupId(int position)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!isGrouped())
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
assert(position >= 0 && position <= m_groupId.size());
|
|
Toshihiro Shimizu |
890ddd |
m_groupId.remove(position);
|
|
Toshihiro Shimizu |
890ddd |
if (m_groupSelector + 1 >= position && m_groupSelector > -1)
|
|
Toshihiro Shimizu |
890ddd |
m_groupSelector--;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int TStageObject::removeGroupId()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_groupId.remove(m_groupSelector);
|
|
Toshihiro Shimizu |
890ddd |
if (m_groupSelector > -1)
|
|
Toshihiro Shimizu |
890ddd |
m_groupSelector--;
|
|
Toshihiro Shimizu |
890ddd |
return m_groupSelector + 1;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::isGrouped()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return !m_groupId.isEmpty();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::isContainedInGroup(int groupId)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_groupId.contains(groupId);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::setGroupName(const wstring &name, int position)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int groupSelector = position < 0 ? m_groupSelector : position;
|
|
Toshihiro Shimizu |
890ddd |
assert(groupSelector >= 0 && groupSelector <= m_groupName.size());
|
|
Toshihiro Shimizu |
890ddd |
m_groupName.insert(groupSelector, name);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
wstring TStageObject::getGroupName(bool fromEditor)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int groupSelector = fromEditor ? m_groupSelector + 1 : m_groupSelector;
|
|
Toshihiro Shimizu |
890ddd |
return m_groupName.isEmpty() ||
|
|
Toshihiro Shimizu |
890ddd |
groupSelector < 0 ||
|
|
Toshihiro Shimizu |
890ddd |
groupSelector >= m_groupName.size()
|
|
Toshihiro Shimizu |
890ddd |
? L""
|
|
Toshihiro Shimizu |
890ddd |
: m_groupName[groupSelector];
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
QStack<wstring> TStageObject::getGroupNameStack()</wstring>
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return m_groupName;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int TStageObject::removeGroupName(bool fromEditor)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int groupSelector = fromEditor ? m_groupSelector + 1 : m_groupSelector;
|
|
Toshihiro Shimizu |
890ddd |
if (!isGrouped())
|
|
Toshihiro Shimizu |
890ddd |
return -1;
|
|
Toshihiro Shimizu |
890ddd |
assert(groupSelector >= 0 && groupSelector <= m_groupName.size());
|
|
Toshihiro Shimizu |
890ddd |
m_groupName.remove(groupSelector);
|
|
Toshihiro Shimizu |
890ddd |
return groupSelector;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::removeGroupName(int position)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
int groupSelector = position < 0 ? m_groupSelector : position;
|
|
Toshihiro Shimizu |
890ddd |
assert(groupSelector >= 0 && groupSelector <= m_groupName.size());
|
|
Toshihiro Shimizu |
890ddd |
m_groupName.remove(groupSelector);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::removeFromAllGroup()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_groupId.clear();
|
|
Toshihiro Shimizu |
890ddd |
m_groupName.clear();
|
|
Toshihiro Shimizu |
890ddd |
m_groupSelector = -1;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::editGroup()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
m_groupSelector--;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
bool TStageObject::isGroupEditing()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
return isGrouped() && m_groupSelector == -1;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
void TStageObject::closeEditingGroup(int groupId)
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!m_groupId.contains(groupId))
|
|
Toshihiro Shimizu |
890ddd |
return;
|
|
Toshihiro Shimizu |
890ddd |
m_groupSelector = 0;
|
|
Toshihiro Shimizu |
890ddd |
while (m_groupId[m_groupSelector] != groupId && m_groupSelector < m_groupId.size())
|
|
Toshihiro Shimizu |
890ddd |
m_groupSelector++;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
int TStageObject::getEditingGroupId()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!isGrouped() || m_groupSelector + 1 >= m_groupId.size())
|
|
Toshihiro Shimizu |
890ddd |
return -1;
|
|
Toshihiro Shimizu |
890ddd |
return m_groupId[m_groupSelector + 1];
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
wstring TStageObject::getEditingGroupName()
|
|
Toshihiro Shimizu |
890ddd |
{
|
|
Toshihiro Shimizu |
890ddd |
if (!isGrouped() || m_groupSelector + 1 >= m_groupName.size())
|
|
Toshihiro Shimizu |
890ddd |
return L"";
|
|
Toshihiro Shimizu |
890ddd |
return m_groupName[m_groupSelector + 1];
|
|
Toshihiro Shimizu |
890ddd |
}
|