|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
|
|
manongjohn |
19dec5 |
#include "edittool.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tools/tool.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tools/cursors.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tproperty.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/stageobjectutil.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tstroke.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tgl.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "tenv.h"
|
|
Jeremy Bullock |
63e8da |
#include "toonzqt/gutil.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tstageobjecttree.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tstageobjectspline.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/toonzscene.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txshcolumn.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/stage.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tcamera.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "tools/toolhandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tcolumnhandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tframehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tobjecthandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/txsheethandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tscenehandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tfxhandle.h"
|
|
Toshihiro Shimizu |
890ddd |
#include "toonz/tstageobjectcmd.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include "edittoolgadgets.h"
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
// For Qt translation support
|
|
Toshihiro Shimizu |
890ddd |
#include <qcoreapplication></qcoreapplication>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#include <qdebug></qdebug>
|
|
shun_iwasawa |
1fbdc9 |
#include <qapplication></qapplication>
|
|
shun_iwasawa |
1fbdc9 |
#include <qdesktopwidget></qdesktopwidget>
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// Scale Constraints
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace ScaleConstraints {
|
|
Shinya Kitaoka |
120a6e |
enum { None = 0, AspectRatio, Mass };
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar LockCenterX("EditToolLockCenterX", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar LockCenterY("EditToolLockCenterY", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar LockPositionX("EditToolLockPositionX", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar LockPositionY("EditToolLockPositionY", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar LockRotation("EditToolLockRotation", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar LockShearH("EditToolLockShearH", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar LockShearV("EditToolLockShearV", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar LockScaleH("EditToolLockScaleH", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar LockScaleV("EditToolLockScaleV", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar LockGlobalScale("EditToolLockGlobalScale", 0);
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar ShowEWNSposition("EditToolShowEWNSposition", 1);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar ShowZposition("EditToolShowZposition", 1);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar ShowSOposition("EditToolShowSOposition", 1);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar ShowRotation("EditToolShowRotation", 1);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar ShowGlobalScale("EditToolShowGlobalScale", 1);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar ShowHVscale("EditToolShowHVscale", 1);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar ShowShear("EditToolShowShear", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::IntVar ShowCenterPosition("EditToolShowCenterPosition", 0);
|
|
Toshihiro Shimizu |
890ddd |
TEnv::StringVar Active("EditToolActiveAxis", "Position");
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
using EditToolGadgets::DragTool;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DragCenterTool
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DragCenterTool final : public DragTool {
|
|
Shinya Kitaoka |
120a6e |
TStageObjectId m_objId;
|
|
Shinya Kitaoka |
120a6e |
int m_frame;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool m_lockCenterX;
|
|
Shinya Kitaoka |
120a6e |
bool m_lockCenterY;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
TPointD m_firstPos;
|
|
Shinya Kitaoka |
120a6e |
TPointD m_oldCenter;
|
|
Shinya Kitaoka |
120a6e |
TPointD m_center;
|
|
Shinya Kitaoka |
120a6e |
TAffine m_affine;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
DragCenterTool(bool lockCenterX, bool lockCenterY)
|
|
Shinya Kitaoka |
120a6e |
: m_objId(
|
|
Shinya Kitaoka |
120a6e |
TTool::getApplication()->getCurrentTool()->getTool()->getObjectId())
|
|
Shinya Kitaoka |
120a6e |
, m_frame(
|
|
Shinya Kitaoka |
120a6e |
TTool::getApplication()->getCurrentTool()->getTool()->getFrame())
|
|
Shinya Kitaoka |
120a6e |
, m_lockCenterX(lockCenterX)
|
|
Shinya Kitaoka |
120a6e |
, m_lockCenterY(lockCenterY) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDown(const TPointD &pos, const TMouseEvent &) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockCenterX && m_lockCenterY) return;
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh =
|
|
Shinya Kitaoka |
120a6e |
TTool::getApplication()->getCurrentTool()->getTool()->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
m_center = m_oldCenter = xsh->getCenter(m_objId, m_frame);
|
|
Shinya Kitaoka |
120a6e |
m_firstPos = pos;
|
|
Shinya Kitaoka |
120a6e |
m_affine = xsh->getPlacement(m_objId, m_frame).inv() *
|
|
Shinya Kitaoka |
120a6e |
xsh->getParentPlacement(m_objId, m_frame);
|
|
Shinya Kitaoka |
120a6e |
m_affine.a13 = m_affine.a23 = 0;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
bce58d |
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockCenterX && m_lockCenterY) return;
|
|
Shinya Kitaoka |
120a6e |
double factor = 1.0 / Stage::inch;
|
|
shun-iwasawa |
bce58d |
// precise control with pressing Alt key
|
|
shun-iwasawa |
bce58d |
if (e.isAltPressed()) factor *= 0.1;
|
|
Shinya Kitaoka |
120a6e |
TPointD delta = pos - m_firstPos;
|
|
Shinya Kitaoka |
120a6e |
if (m_lockCenterX)
|
|
Shinya Kitaoka |
120a6e |
delta = TPointD(0.0, delta.y);
|
|
Shinya Kitaoka |
120a6e |
else if (m_lockCenterY)
|
|
shun-iwasawa |
bce58d |
delta = TPointD(delta.x, 0.0);
|
|
Shinya Kitaoka |
120a6e |
m_center = m_oldCenter + (m_affine * delta) * factor;
|
|
Shinya Kitaoka |
120a6e |
TTool::getApplication()
|
|
Shinya Kitaoka |
120a6e |
->getCurrentTool()
|
|
Shinya Kitaoka |
120a6e |
->getTool()
|
|
Shinya Kitaoka |
120a6e |
->getXsheet()
|
|
Shinya Kitaoka |
120a6e |
->setCenter(m_objId, m_frame, m_center);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
473e70 |
void leftButtonUp(const TPointD &pos, const TMouseEvent &) override {
|
|
shun-iwasawa |
f404fb |
if (m_firstPos == pos) return;
|
|
shun-iwasawa |
f404fb |
leftButtonUp();
|
|
shun-iwasawa |
f404fb |
}
|
|
shun-iwasawa |
f404fb |
void leftButtonUp() override {
|
|
shun-iwasawa |
f404fb |
if (m_lockCenterX && m_lockCenterY) return;
|
|
Shinya Kitaoka |
120a6e |
UndoStageObjectCenterMove *undo =
|
|
Shinya Kitaoka |
120a6e |
new UndoStageObjectCenterMove(m_objId, m_frame, m_oldCenter, m_center);
|
|
Shinya Kitaoka |
120a6e |
TTool::Application *app = TTool::getApplication();
|
|
Shinya Kitaoka |
120a6e |
undo->setObjectHandle(app->getCurrentObject());
|
|
Shinya Kitaoka |
120a6e |
undo->setXsheetHandle(app->getCurrentXsheet());
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(undo);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DragChannelTool
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
class DragChannelTool : public DragTool {
|
|
Toshihiro Shimizu |
890ddd |
protected:
|
|
Shinya Kitaoka |
120a6e |
TStageObjectValues m_before, m_after;
|
|
Shinya Kitaoka |
120a6e |
bool m_globalKeyframesEnabled;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool m_isStarted;
|
|
Shinya Kitaoka |
120a6e |
TPointD m_firstPos;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
DragChannelTool(TStageObject::Channel a0, bool globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
: m_globalKeyframesEnabled(globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
, m_isStarted(false)
|
|
Shinya Kitaoka |
120a6e |
, m_firstPos() {
|
|
Shinya Kitaoka |
120a6e |
TTool::Application *app = TTool::getApplication();
|
|
Shinya Kitaoka |
120a6e |
m_before.setFrameHandle(app->getCurrentFrame());
|
|
Shinya Kitaoka |
120a6e |
m_before.setObjectHandle(app->getCurrentObject());
|
|
Shinya Kitaoka |
120a6e |
m_before.setXsheetHandle(app->getCurrentXsheet());
|
|
Shinya Kitaoka |
120a6e |
m_before.add(a0);
|
|
Shinya Kitaoka |
120a6e |
if (m_globalKeyframesEnabled) {
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_Angle);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_X);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_Y);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_Z);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_SO);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_ScaleX);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_ScaleY);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_Scale);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_Path);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_ShearX);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_ShearY);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_after = m_before;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
DragChannelTool(TStageObject::Channel a0, TStageObject::Channel a1,
|
|
Shinya Kitaoka |
120a6e |
bool globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
: m_globalKeyframesEnabled(globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
, m_isStarted(false)
|
|
Shinya Kitaoka |
120a6e |
, m_firstPos() {
|
|
Shinya Kitaoka |
120a6e |
TTool::Application *app = TTool::getApplication();
|
|
Shinya Kitaoka |
120a6e |
m_before.setFrameHandle(app->getCurrentFrame());
|
|
Shinya Kitaoka |
120a6e |
m_before.setObjectHandle(app->getCurrentObject());
|
|
Shinya Kitaoka |
120a6e |
m_before.setXsheetHandle(app->getCurrentXsheet());
|
|
Shinya Kitaoka |
120a6e |
m_before.add(a0);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(a1);
|
|
Shinya Kitaoka |
120a6e |
if (m_globalKeyframesEnabled) {
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_Angle);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_X);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_Y);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_Z);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_SO);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_ScaleX);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_ScaleY);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_Scale);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_Path);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_ShearX);
|
|
Shinya Kitaoka |
120a6e |
m_before.add(TStageObject::T_ShearY);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_after = m_before;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void enableGlobalKeyframes(bool enabled) override {
|
|
Shinya Kitaoka |
120a6e |
m_globalKeyframesEnabled = enabled;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
void start() {
|
|
Shinya Kitaoka |
120a6e |
m_isStarted = true;
|
|
Shinya Kitaoka |
120a6e |
m_before.updateValues();
|
|
Shinya Kitaoka |
120a6e |
m_after = m_before;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TPointD getCenter() {
|
|
Shinya Kitaoka |
120a6e |
TTool *tool = TTool::getApplication()->getCurrentTool()->getTool();
|
|
Shinya Kitaoka |
120a6e |
TStageObjectId objId = tool->getObjectId();
|
|
Shinya Kitaoka |
120a6e |
int frame = tool->getFrame();
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = tool->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
return xsh->getParentPlacement(objId, frame).inv() *
|
|
Shinya Kitaoka |
120a6e |
xsh->getPlacement(objId, frame) *
|
|
Shinya Kitaoka |
120a6e |
(Stage::inch * xsh->getCenter(objId, frame));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double getOldValue(int index) const { return m_before.getValue(index); }
|
|
Shinya Kitaoka |
120a6e |
double getValue(int index) const { return m_after.getValue(index); }
|
|
Shinya Kitaoka |
120a6e |
void setValue(double v) {
|
|
Shinya Kitaoka |
120a6e |
m_after.setValue(v);
|
|
Shinya Kitaoka |
120a6e |
m_after.applyValues();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
void setValues(double v0, double v1) {
|
|
Shinya Kitaoka |
120a6e |
m_after.setValues(v0, v1);
|
|
Shinya Kitaoka |
120a6e |
m_after.applyValues();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void leftButtonUp(const TPointD &pos, const TMouseEvent &) override {
|
|
shun-iwasawa |
f404fb |
if (m_firstPos == pos) return;
|
|
shun-iwasawa |
f404fb |
leftButtonUp();
|
|
shun-iwasawa |
f404fb |
}
|
|
shun-iwasawa |
f404fb |
void leftButtonUp() override {
|
|
shun-iwasawa |
f404fb |
if (!m_isStarted)
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
m_isStarted = false;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TTool::Application *app = TTool::getApplication();
|
|
Shinya Kitaoka |
120a6e |
UndoStageObjectMove *undo = new UndoStageObjectMove(m_before, m_after);
|
|
Shinya Kitaoka |
120a6e |
undo->setObjectHandle(app->getCurrentObject());
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->add(undo);
|
|
Shinya Kitaoka |
120a6e |
app->getCurrentScene()->setDirtyFlag(true);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DragPositionTool
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DragPositionTool final : public DragChannelTool {
|
|
Shinya Kitaoka |
120a6e |
bool m_lockPositionX;
|
|
Shinya Kitaoka |
120a6e |
bool m_lockPositionY;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
DragPositionTool(bool lockPositionX, bool lockPositionY,
|
|
Shinya Kitaoka |
120a6e |
bool globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
: DragChannelTool(TStageObject::T_X, TStageObject::T_Y,
|
|
Shinya Kitaoka |
120a6e |
globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
, m_lockPositionX(lockPositionX)
|
|
Shinya Kitaoka |
120a6e |
, m_lockPositionY(lockPositionY) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDown(const TPointD &pos, const TMouseEvent &) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockPositionX && m_lockPositionY) return;
|
|
Shinya Kitaoka |
120a6e |
start();
|
|
Shinya Kitaoka |
120a6e |
m_firstPos = pos;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockPositionX && m_lockPositionY) return;
|
|
Shinya Kitaoka |
120a6e |
TPointD delta = pos - m_firstPos;
|
|
Shinya Kitaoka |
120a6e |
if (m_lockPositionX)
|
|
Shinya Kitaoka |
120a6e |
delta = TPointD(0, delta.y);
|
|
Shinya Kitaoka |
120a6e |
else if (m_lockPositionY)
|
|
Shinya Kitaoka |
120a6e |
delta = TPointD(delta.x, 0);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (e.isShiftPressed()) {
|
|
Shinya Kitaoka |
120a6e |
if (fabs(delta.x) > fabs(delta.y))
|
|
Shinya Kitaoka |
120a6e |
delta.y = 0;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
delta.x = 0;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
double factor = 1.0 / Stage::inch;
|
|
shun-iwasawa |
bce58d |
// precise control with pressing Alt key
|
|
shun-iwasawa |
bce58d |
if (e.isAltPressed()) factor *= 0.1;
|
|
Shinya Kitaoka |
120a6e |
setValues(getOldValue(0) + delta.x * factor,
|
|
Shinya Kitaoka |
120a6e |
getOldValue(1) + delta.y * factor);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DragSplinePositionTool
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DragSplinePositionTool final : public DragChannelTool {
|
|
Shinya Kitaoka |
120a6e |
const TStroke *m_spline;
|
|
Shinya Kitaoka |
120a6e |
std::vector<double> m_lengthAtCPs;</double>
|
|
Shinya Kitaoka |
120a6e |
double m_offset;
|
|
Shinya Kitaoka |
120a6e |
double m_splineLength;
|
|
Shinya Kitaoka |
120a6e |
double m_tolerance;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
shun_iwasawa |
1fbdc9 |
DragSplinePositionTool(const TStroke *spline, bool globalKeyframesEnabled,
|
|
shun_iwasawa |
1fbdc9 |
double pixelSize)
|
|
Shinya Kitaoka |
120a6e |
: DragChannelTool(TStageObject::T_Path, globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
, m_spline(spline)
|
|
Shinya Kitaoka |
120a6e |
, m_offset(0.0)
|
|
Shinya Kitaoka |
120a6e |
, m_splineLength(0)
|
|
shun_iwasawa |
1fbdc9 |
, m_tolerance(pixelSize * 10.0) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double getLengthAtPos(const TPointD &pos) const {
|
|
Shinya Kitaoka |
120a6e |
assert(m_spline);
|
|
Shinya Kitaoka |
120a6e |
double t = m_spline->getW(pos);
|
|
Shinya Kitaoka |
120a6e |
return m_spline->getLength(t);
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
double length = m_spline->getLength();
|
|
Shinya Kitaoka |
120a6e |
if(length>0) return 100 * m_spline->getLength(t) / length;
|
|
Shinya Kitaoka |
120a6e |
else return 0.0;
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double paramValueToLength(double s) const {
|
|
Shinya Kitaoka |
120a6e |
return s * m_splineLength * 0.01;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
double lengthToParamValue(double len) const {
|
|
Shinya Kitaoka |
120a6e |
if (m_splineLength > 0)
|
|
Shinya Kitaoka |
120a6e |
return 100 * len / m_splineLength;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
return 0.0;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDown(const TPointD &pos, const TMouseEvent &) override {
|
|
Shinya Kitaoka |
120a6e |
m_firstPos = pos;
|
|
Shinya Kitaoka |
120a6e |
start();
|
|
Shinya Kitaoka |
120a6e |
assert(m_spline);
|
|
Shinya Kitaoka |
120a6e |
m_splineLength = m_spline->getLength();
|
|
Shinya Kitaoka |
120a6e |
m_lengthAtCPs.clear();
|
|
Shinya Kitaoka |
120a6e |
int n = m_spline->getControlPointCount();
|
|
Shinya Kitaoka |
120a6e |
for (int i = 0; i < n; i += 4)
|
|
Shinya Kitaoka |
120a6e |
m_lengthAtCPs.push_back(m_spline->getLengthAtControlPoint(i));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_offset = paramValueToLength(getOldValue(0)) - getLengthAtPos(pos);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool snapLengthToControlPoint(double &len) const {
|
|
Shinya Kitaoka |
120a6e |
int n = (int)m_lengthAtCPs.size();
|
|
Shinya Kitaoka |
120a6e |
if (n <= 0) return false;
|
|
Shinya Kitaoka |
120a6e |
double cpLen = len;
|
|
Shinya Kitaoka |
120a6e |
int k = 0;
|
|
Shinya Kitaoka |
120a6e |
while (k < n && m_lengthAtCPs[k] <= len) k++;
|
|
Shinya Kitaoka |
120a6e |
if (k >= n) {
|
|
Shinya Kitaoka |
120a6e |
// len is >= all CP lengths. The closest is the last
|
|
Shinya Kitaoka |
120a6e |
cpLen = m_lengthAtCPs.back();
|
|
Shinya Kitaoka |
120a6e |
} else if (k == 0) {
|
|
Shinya Kitaoka |
120a6e |
// len is < all CP lengths. the closest is the first
|
|
Shinya Kitaoka |
120a6e |
cpLen = m_lengthAtCPs.front();
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
// m_lengthAtCPs[k-1]<=len && len < m_lengthAtCPs[k]
|
|
Shinya Kitaoka |
120a6e |
double cpLen0 = m_lengthAtCPs[k - 1];
|
|
Shinya Kitaoka |
120a6e |
double cpLen1 = m_lengthAtCPs[k];
|
|
Shinya Kitaoka |
120a6e |
assert(cpLen0 <= len && len < cpLen1);
|
|
Shinya Kitaoka |
120a6e |
cpLen = (len - cpLen0 < cpLen1 - len) ? cpLen0 : cpLen1;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (fabs(cpLen - len) < m_tolerance) {
|
|
Shinya Kitaoka |
120a6e |
len = cpLen;
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
Shinya Kitaoka |
120a6e |
return false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDrag(const TPointD &pos, const TMouseEvent &) override {
|
|
Shinya Kitaoka |
120a6e |
double len = tcrop(getLengthAtPos(pos) + m_offset, 0.0, m_splineLength);
|
|
Shinya Kitaoka |
120a6e |
snapLengthToControlPoint(len);
|
|
Shinya Kitaoka |
120a6e |
setValue(lengthToParamValue(len));
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DragRotationTool
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DragRotationTool final : public DragChannelTool {
|
|
Shinya Kitaoka |
120a6e |
TPointD m_lastPos;
|
|
Shinya Kitaoka |
120a6e |
TPointD m_center;
|
|
Shinya Kitaoka |
120a6e |
bool m_lockRotation;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
DragRotationTool(bool lockRotation, bool globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
: DragChannelTool(TStageObject::T_Angle, globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
, m_lockRotation(lockRotation) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDown(const TPointD &pos, const TMouseEvent &) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockRotation) return;
|
|
Shinya Kitaoka |
120a6e |
m_firstPos = pos;
|
|
Shinya Kitaoka |
120a6e |
m_lastPos = pos;
|
|
Shinya Kitaoka |
120a6e |
m_center = getCenter();
|
|
Shinya Kitaoka |
120a6e |
start();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
shun-iwasawa |
bce58d |
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockRotation) return;
|
|
Shinya Kitaoka |
120a6e |
TPointD a = m_lastPos - m_center;
|
|
Shinya Kitaoka |
120a6e |
TPointD b = pos - m_center;
|
|
Shinya Kitaoka |
120a6e |
m_lastPos = pos;
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
if(cameraFlag)
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
// m_viewer->updateViewMatrix();
|
|
Shinya Kitaoka |
120a6e |
b = m_viewer->mouseToTool(gb) - m_curCenter;
|
|
Shinya Kitaoka |
120a6e |
a = m_viewer->mouseToTool(gc) - m_curCenter;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double a2 = norm2(a), b2 = norm2(b);
|
|
Shinya Kitaoka |
120a6e |
const double eps = 1e-8;
|
|
Shinya Kitaoka |
120a6e |
if (a2 < eps || b2 < eps) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
double dang = asin(cross(a, b) / sqrt(a2 * b2)) * M_180_PI;
|
|
shun-iwasawa |
bce58d |
// precise control with pressing Alt key
|
|
shun-iwasawa |
bce58d |
if (e.isAltPressed()) dang *= 0.1;
|
|
Shinya Kitaoka |
120a6e |
setValue(getValue(0) + dang);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DragIsotropicScaleTool
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DragIsotropicScaleTool final : public DragChannelTool {
|
|
Shinya Kitaoka |
120a6e |
TPointD m_center;
|
|
Shinya Kitaoka |
120a6e |
double m_r0;
|
|
Shinya Kitaoka |
120a6e |
bool m_lockGlobalScale;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
DragIsotropicScaleTool(bool lockGlobalScale, bool globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
: DragChannelTool(TStageObject::T_Scale, globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
, m_lockGlobalScale(lockGlobalScale)
|
|
Shinya Kitaoka |
120a6e |
, m_r0(0) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDown(const TPointD &pos, const TMouseEvent &) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockGlobalScale) return;
|
|
Shinya Kitaoka |
120a6e |
m_firstPos = pos;
|
|
Shinya Kitaoka |
120a6e |
m_center = getCenter();
|
|
Shinya Kitaoka |
120a6e |
start();
|
|
Shinya Kitaoka |
120a6e |
m_r0 = norm(m_firstPos - m_center);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockGlobalScale) return;
|
|
Shinya Kitaoka |
120a6e |
if (m_r0 < 0.001) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// TPointD a = m_firstPos - m_center;
|
|
Shinya Kitaoka |
120a6e |
double r1 = norm(pos - m_center);
|
|
Shinya Kitaoka |
120a6e |
if (r1 < 0.0001) return;
|
|
shun-iwasawa |
bce58d |
// precise control with pressing Alt key
|
|
shun-iwasawa |
bce58d |
if (e.isAltPressed()) r1 = m_r0 + (r1 - m_r0) * 0.1;
|
|
Shinya Kitaoka |
120a6e |
setValue(getOldValue(0) * r1 / m_r0);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DragScaleTool
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DragScaleTool final : public DragChannelTool {
|
|
Shinya Kitaoka |
120a6e |
TPointD m_center;
|
|
Shinya Kitaoka |
120a6e |
int m_constraint;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool m_lockScaleH;
|
|
Shinya Kitaoka |
120a6e |
bool m_lockScaleV;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
DragScaleTool(int constraint, bool lockScaleH, bool lockScaleV,
|
|
Shinya Kitaoka |
120a6e |
bool globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
: DragChannelTool(TStageObject::T_ScaleX, TStageObject::T_ScaleY,
|
|
Shinya Kitaoka |
120a6e |
globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
, m_constraint(constraint)
|
|
Shinya Kitaoka |
120a6e |
, m_lockScaleH(lockScaleH)
|
|
Shinya Kitaoka |
120a6e |
, m_lockScaleV(lockScaleV) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDown(const TPointD &pos, const TMouseEvent &) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockScaleH && m_lockScaleV) return;
|
|
Shinya Kitaoka |
120a6e |
m_firstPos = pos;
|
|
Shinya Kitaoka |
120a6e |
m_center = getCenter();
|
|
Shinya Kitaoka |
120a6e |
start();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockScaleH && m_lockScaleV) return;
|
|
Shinya Kitaoka |
120a6e |
TPointD center = m_center + TPointD(40, 40);
|
|
Shinya Kitaoka |
120a6e |
TPointD a = m_firstPos - center;
|
|
Shinya Kitaoka |
120a6e |
TPointD b = pos - center;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
const double eps = 1e-8;
|
|
Shinya Kitaoka |
120a6e |
if (norm2(a) < eps || norm2(b) < eps) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
bce58d |
double fx = b.x / a.x;
|
|
Rozhuk Ivan |
823a31 |
if (fabs(fx) > 1) fx = tsign(fx) * sqrt(std::abs(fx));
|
|
shun-iwasawa |
bce58d |
double fy = b.y / a.y;
|
|
Rozhuk Ivan |
823a31 |
if (fabs(fy) > 1) fy = tsign(fy) * sqrt(std::abs(fy));
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int constraint = m_constraint;
|
|
Shinya Kitaoka |
120a6e |
if (constraint == ScaleConstraints::None && e.isShiftPressed())
|
|
Shinya Kitaoka |
120a6e |
constraint = ScaleConstraints::AspectRatio;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (constraint == ScaleConstraints::AspectRatio) {
|
|
Shinya Kitaoka |
120a6e |
TPointD c = pos - m_firstPos;
|
|
Shinya Kitaoka |
120a6e |
if (fabs(c.x) > fabs(c.y))
|
|
Shinya Kitaoka |
120a6e |
fy = fx;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
fx = fy;
|
|
Shinya Kitaoka |
120a6e |
} else if (constraint == ScaleConstraints::Mass) {
|
|
Shinya Kitaoka |
120a6e |
double bxay = b.x * a.y;
|
|
Shinya Kitaoka |
120a6e |
double byax = b.y * a.x;
|
|
Shinya Kitaoka |
120a6e |
if (fabs(bxay) < eps || fabs(byax) < eps) return;
|
|
Shinya Kitaoka |
120a6e |
fx = bxay / byax;
|
|
Shinya Kitaoka |
120a6e |
fy = byax / bxay;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (fabs(fx) > eps && fabs(fy) > eps) {
|
|
shun-iwasawa |
bce58d |
double oldv0 = getOldValue(0);
|
|
shun-iwasawa |
bce58d |
double oldv1 = getOldValue(1);
|
|
Shinya Kitaoka |
120a6e |
if (fabs(oldv0) < 0.001) oldv0 = 0.001;
|
|
Shinya Kitaoka |
120a6e |
if (fabs(oldv1) < 0.001) oldv1 = 0.001;
|
|
shun-iwasawa |
bce58d |
// precise control with pressing Alt key
|
|
shun-iwasawa |
bce58d |
if (e.isAltPressed()) {
|
|
shun-iwasawa |
bce58d |
fx = 1.0 + (fx - 1.0) * 0.1;
|
|
shun-iwasawa |
bce58d |
fy = 1.0 + (fy - 1.0) * 0.1;
|
|
shun-iwasawa |
bce58d |
}
|
|
Shinya Kitaoka |
120a6e |
double valueX = oldv0 * fx;
|
|
Shinya Kitaoka |
120a6e |
double valueY = oldv1 * fy;
|
|
Shinya Kitaoka |
120a6e |
if (m_lockScaleH)
|
|
Shinya Kitaoka |
120a6e |
valueX = oldv0;
|
|
Shinya Kitaoka |
120a6e |
else if (m_lockScaleV)
|
|
Shinya Kitaoka |
120a6e |
valueY = oldv1;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
setValues(valueX, valueY);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DragShearTool
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DragShearTool final : public DragChannelTool {
|
|
Shinya Kitaoka |
120a6e |
TPointD m_center;
|
|
Shinya Kitaoka |
120a6e |
bool m_lockShearH;
|
|
Shinya Kitaoka |
120a6e |
bool m_lockShearV;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
Shinya Kitaoka |
120a6e |
DragShearTool(bool lockShearH, bool lockShearV, bool globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
: DragChannelTool(TStageObject::T_ShearX, TStageObject::T_ShearY,
|
|
Shinya Kitaoka |
120a6e |
globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
, m_lockShearH(lockShearH)
|
|
Shinya Kitaoka |
120a6e |
, m_lockShearV(lockShearV) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDown(const TPointD &pos, const TMouseEvent &) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockShearH && m_lockShearV) return;
|
|
Shinya Kitaoka |
120a6e |
m_firstPos = pos;
|
|
Shinya Kitaoka |
120a6e |
m_center = getCenter();
|
|
Shinya Kitaoka |
120a6e |
start();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override {
|
|
Shinya Kitaoka |
120a6e |
if (m_lockShearH && m_lockShearV) return;
|
|
Shinya Kitaoka |
120a6e |
TPointD a = m_firstPos - m_center;
|
|
Shinya Kitaoka |
120a6e |
TPointD b = pos - m_center;
|
|
Shinya Kitaoka |
120a6e |
double fx = a.x - b.x;
|
|
Shinya Kitaoka |
120a6e |
double fy = b.y - a.y;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (m_lockShearH)
|
|
Shinya Kitaoka |
120a6e |
fx = 0;
|
|
Shinya Kitaoka |
120a6e |
else if (m_lockShearV)
|
|
Shinya Kitaoka |
120a6e |
fy = 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (e.isShiftPressed()) {
|
|
Shinya Kitaoka |
120a6e |
if (fabs(fx) > fabs(fy))
|
|
Shinya Kitaoka |
120a6e |
fy = 0;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
fx = 0;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
shun-iwasawa |
bce58d |
// precise control with pressing Alt key
|
|
shun-iwasawa |
bce58d |
if (e.isAltPressed()) {
|
|
shun-iwasawa |
bce58d |
fx *= 0.1;
|
|
shun-iwasawa |
bce58d |
fy *= 0.1;
|
|
shun-iwasawa |
bce58d |
}
|
|
Shinya Kitaoka |
120a6e |
setValues(getOldValue(0) + 0.01 * fx, getOldValue(1) + 0.01 * fy);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
// DragZTool
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
d1f6c4 |
class DragZTool final : public DragChannelTool {
|
|
shun_iwasawa |
bc352c |
TPointD m_lastPos;
|
|
|
1c557b |
TToolViewer *m_viewer;
|
|
Shinya Kitaoka |
120a6e |
double m_dz;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
public:
|
|
|
1c557b |
DragZTool(TToolViewer *viewer, bool globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
: DragChannelTool(TStageObject::T_Z, globalKeyframesEnabled)
|
|
Shinya Kitaoka |
120a6e |
, m_viewer(viewer) {}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDown(const TPointD &pos, const TMouseEvent &e) override {
|
|
Shinya Kitaoka |
120a6e |
m_lastPos = e.m_pos;
|
|
Shinya Kitaoka |
120a6e |
m_firstPos = pos;
|
|
Shinya Kitaoka |
120a6e |
m_dz = 0;
|
|
Shinya Kitaoka |
120a6e |
start();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
473e70 |
void leftButtonDrag(const TPointD &pos, const TMouseEvent &e) override {
|
|
Shinya Kitaoka |
120a6e |
double dz = m_viewer->projectToZ(e.m_pos - m_lastPos);
|
|
shun-iwasawa |
bce58d |
// precise control with pressing Alt key
|
|
shun-iwasawa |
bce58d |
if (e.isAltPressed()) dz *= 0.1;
|
|
Shinya Kitaoka |
120a6e |
m_lastPos = e.m_pos;
|
|
Shinya Kitaoka |
120a6e |
if (dz != 0.0) {
|
|
Shinya Kitaoka |
120a6e |
m_dz += dz;
|
|
Shinya Kitaoka |
120a6e |
setValue(getOldValue(0) + m_dz);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
d464a1 |
bool hasVisibleChildColumn(const TStageObject *obj, const TXsheet *xsh) {
|
|
shun-iwasawa |
58f115 |
if (!(obj->getId().isColumn())) return false; // just in case
|
|
shun-iwasawa |
58f115 |
TXshColumn *column = xsh->getColumn(obj->getId().getIndex());
|
|
shun-iwasawa |
58f115 |
if (!column) return false;
|
|
shun-iwasawa |
58f115 |
if (column->isCamstandVisible()) return true;
|
|
shun-iwasawa |
d464a1 |
for (const auto child : obj->getChildren()) {
|
|
shun-iwasawa |
d464a1 |
if (hasVisibleChildColumn(child, xsh)) return true;
|
|
shun-iwasawa |
d464a1 |
}
|
|
shun-iwasawa |
d464a1 |
return false;
|
|
shun-iwasawa |
d464a1 |
}
|
|
shun-iwasawa |
d464a1 |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
EditTool::EditTool()
|
|
Shinya Kitaoka |
120a6e |
: TTool("T_Edit")
|
|
Shinya Kitaoka |
120a6e |
, m_active(false)
|
|
Shinya Kitaoka |
120a6e |
, m_what(Translation)
|
|
Shinya Kitaoka |
120a6e |
, m_highlightedDevice(None)
|
|
Shinya Kitaoka |
120a6e |
, m_currentScaleFactor(1)
|
|
Shinya Kitaoka |
120a6e |
, m_fxGadgetController(0)
|
|
Shinya Kitaoka |
120a6e |
, m_keyFrameAdded(false)
|
|
Shinya Kitaoka |
120a6e |
, m_scaleConstraint("Scale Constraint:") // W_ToolOptions_ScaleConstraint
|
|
Shinya Kitaoka |
120a6e |
, m_autoSelect("Auto Select Column") // W_ToolOptions_AutoSelect
|
|
Shinya Kitaoka |
120a6e |
, m_globalKeyframes("Global Key", false) // W_ToolsOptions_GlobalKeyframes
|
|
|
c7649c |
, m_lockCenterX("Lock Center X", false)
|
|
|
c7649c |
, m_lockCenterY("Lock Center Y", false)
|
|
|
c7649c |
, m_lockPositionX("Lock Position X", false)
|
|
|
c7649c |
, m_lockPositionY("Lock Position Y", false)
|
|
Shinya Kitaoka |
120a6e |
, m_lockRotation("Lock Rotation", false)
|
|
Shinya Kitaoka |
120a6e |
, m_lockShearH("Lock Shear H", false)
|
|
Shinya Kitaoka |
120a6e |
, m_lockShearV("Lock Shear V", false)
|
|
Shinya Kitaoka |
120a6e |
, m_lockScaleH("Lock Scale H", false)
|
|
Shinya Kitaoka |
120a6e |
, m_lockScaleV("Lock Scale V", false)
|
|
Shinya Kitaoka |
120a6e |
, m_lockGlobalScale("Lock Global Scale", false)
|
|
|
c7649c |
, m_showEWNSposition("X and Y Positions", true)
|
|
Shinya Kitaoka |
120a6e |
, m_showZposition("Z Position", true)
|
|
Shinya Kitaoka |
120a6e |
, m_showSOposition("SO", true)
|
|
Shinya Kitaoka |
120a6e |
, m_showRotation("Rotation", true)
|
|
Shinya Kitaoka |
120a6e |
, m_showGlobalScale("Global Scale", true)
|
|
Shinya Kitaoka |
120a6e |
, m_showHVscale("Horizontal and Vertical Scale", true)
|
|
Shinya Kitaoka |
120a6e |
, m_showShear("Shear", true)
|
|
Shinya Kitaoka |
120a6e |
, m_showCenterPosition("Center Position", true)
|
|
Shinya Kitaoka |
120a6e |
, m_dragTool(0)
|
|
Shinya Kitaoka |
120a6e |
, m_firstTime(true)
|
|
shun-iwasawa |
bce58d |
, m_activeAxis("Active Axis")
|
|
shun-iwasawa |
bce58d |
, m_isAltPressed(false) {
|
|
Shinya Kitaoka |
120a6e |
bind(TTool::AllTargets);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_scaleConstraint);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_autoSelect);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_globalKeyframes);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_lockCenterX);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_lockCenterY);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_lockPositionX);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_lockPositionY);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_lockRotation);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_lockShearH);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_lockShearV);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_lockScaleH);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_lockScaleV);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_lockGlobalScale);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_showEWNSposition);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_showZposition);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_showSOposition);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_showRotation);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_showGlobalScale);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_showHVscale);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_showShear);
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_showCenterPosition);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_scaleConstraint.addValue(L"None");
|
|
Shinya Kitaoka |
120a6e |
m_scaleConstraint.addValue(L"A/R");
|
|
Shinya Kitaoka |
120a6e |
m_scaleConstraint.addValue(L"Mass");
|
|
Shinya Kitaoka |
120a6e |
m_scaleConstraint.setValue(L"None");
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_autoSelect.addValue(L"None");
|
|
Shinya Kitaoka |
120a6e |
m_autoSelect.addValue(L"Column");
|
|
Shinya Kitaoka |
120a6e |
m_autoSelect.addValue(L"Pegbar");
|
|
Shinya Kitaoka |
120a6e |
m_autoSelect.setValue(L"None");
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_globalKeyframes.setId("GlobalKey");
|
|
Shinya Kitaoka |
120a6e |
m_autoSelect.setId("AutoSelect");
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_prop.bind(m_activeAxis);
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.addValue(L"Position", "edit_position");
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.addValue(L"Rotation", "edit_rotation");
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.addValue(L"Scale", "edit_scale");
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.addValue(L"Shear", "edit_shear");
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.addValue(L"Center", "edit_center");
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.addValue(L"All", "edit_all");
|
|
Shinya Kitaoka |
120a6e |
m_activeAxis.setValue(L"Position");
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_activeAxis.setId("EditToolActiveAxis");
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
EditTool::~EditTool() {
|
|
Shinya Kitaoka |
120a6e |
delete m_dragTool;
|
|
Shinya Kitaoka |
120a6e |
delete m_fxGadgetController;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void EditTool::updateTranslation() {
|
|
Shinya Kitaoka |
120a6e |
m_scaleConstraint.setQStringName(tr("Scale Constraint:"));
|
|
shun-iwasawa |
df7bb0 |
m_scaleConstraint.setItemUIName(L"None", tr("None"));
|
|
shun-iwasawa |
df7bb0 |
m_scaleConstraint.setItemUIName(L"A/R", tr("A/R"));
|
|
shun-iwasawa |
df7bb0 |
m_scaleConstraint.setItemUIName(L"Mass", tr("Mass"));
|
|
shun-iwasawa |
df7bb0 |
|
|
Shinya Kitaoka |
120a6e |
m_autoSelect.setQStringName(tr("Auto Select Column"));
|
|
shun-iwasawa |
df7bb0 |
m_autoSelect.setItemUIName(L"None", tr("None"));
|
|
shun-iwasawa |
df7bb0 |
m_autoSelect.setItemUIName(L"Column", tr("Column"));
|
|
shun-iwasawa |
df7bb0 |
m_autoSelect.setItemUIName(L"Pegbar", tr("Pegbar"));
|
|
shun-iwasawa |
df7bb0 |
|
|
Shinya Kitaoka |
120a6e |
m_globalKeyframes.setQStringName(tr("Global Key"));
|
|
|
c7649c |
m_lockCenterX.setQStringName(tr("Lock Center X"));
|
|
|
c7649c |
m_lockCenterY.setQStringName(tr("Lock Center Y"));
|
|
|
c7649c |
m_lockPositionX.setQStringName(tr("Lock Position X"));
|
|
|
c7649c |
m_lockPositionY.setQStringName(tr("Lock Position Y"));
|
|
Shinya Kitaoka |
120a6e |
m_lockRotation.setQStringName(tr("Lock Rotation"));
|
|
Shinya Kitaoka |
120a6e |
m_lockShearH.setQStringName(tr("Lock Shear H"));
|
|
Shinya Kitaoka |
120a6e |
m_lockShearV.setQStringName(tr("Lock Shear V"));
|
|
Shinya Kitaoka |
120a6e |
m_lockScaleH.setQStringName(tr("Lock Scale H"));
|
|
Shinya Kitaoka |
120a6e |
m_lockScaleV.setQStringName(tr("Lock Scale V"));
|
|
Shinya Kitaoka |
120a6e |
m_lockGlobalScale.setQStringName(tr("Lock Global Scale"));
|
|
|
c7649c |
m_showEWNSposition.setQStringName(tr("X and Y Positions"));
|
|
Shinya Kitaoka |
120a6e |
m_showZposition.setQStringName(tr("Z Position"));
|
|
Shinya Kitaoka |
120a6e |
m_showSOposition.setQStringName(tr("SO"));
|
|
Shinya Kitaoka |
120a6e |
m_showRotation.setQStringName(tr("Rotation"));
|
|
Shinya Kitaoka |
120a6e |
m_showGlobalScale.setQStringName(tr("Global Scale"));
|
|
Shinya Kitaoka |
120a6e |
m_showHVscale.setQStringName(tr("Horizontal and Vertical Scale"));
|
|
Shinya Kitaoka |
120a6e |
m_showShear.setQStringName(tr("Shear"));
|
|
Shinya Kitaoka |
120a6e |
m_showCenterPosition.setQStringName(tr("Center Position"));
|
|
shun-iwasawa |
df7bb0 |
|
|
Shinya Kitaoka |
120a6e |
m_activeAxis.setQStringName(tr("Active Axis"));
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.setItemUIName(L"Position", tr("Position"));
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.setItemUIName(L"Rotation", tr("Rotation"));
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.setItemUIName(L"Scale", tr("Scale"));
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.setItemUIName(L"Shear", tr("Shear"));
|
|
shun-iwasawa |
df7bb0 |
m_activeAxis.setItemUIName(L"Center", tr("Center"));
|
|
shun-iwasawa |
e87e08 |
m_activeAxis.setItemUIName(L"All", tr("All"));
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool EditTool::doesApply() const {
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = TTool::getApplication()->getCurrentXsheet()->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
assert(xsh);
|
|
Shinya Kitaoka |
120a6e |
TStageObjectId objId =
|
|
Shinya Kitaoka |
120a6e |
TTool::getApplication()->getCurrentObject()->getObjectId();
|
|
Shinya Kitaoka |
120a6e |
if (objId.isColumn()) {
|
|
Shinya Kitaoka |
120a6e |
TXshColumn *column = xsh->getColumn(objId.getIndex());
|
|
Shinya Kitaoka |
120a6e |
if (column && column->getSoundColumn()) return false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
d464a1 |
bool EditTool::transformEnabled() const {
|
|
shun-iwasawa |
d464a1 |
// check if the column transformation is enabled
|
|
shun-iwasawa |
d464a1 |
TXsheet *xsh = getXsheet();
|
|
shun-iwasawa |
d464a1 |
TStageObjectId objId(getObjectId());
|
|
shun-iwasawa |
d464a1 |
TStageObject *pegbar = xsh->getStageObject(objId);
|
|
shun-iwasawa |
d464a1 |
return (!objId.isColumn() || hasVisibleChildColumn(pegbar, xsh));
|
|
shun-iwasawa |
d464a1 |
}
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
d464a1 |
|
|
Shinya Kitaoka |
120a6e |
const TStroke *EditTool::getSpline() const {
|
|
Shinya Kitaoka |
120a6e |
TTool::Application *app = TTool::getApplication();
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = app->getCurrentXsheet()->getXsheet();
|
|
Shinya Kitaoka |
120a6e |
TStageObjectId objId = app->getCurrentObject()->getObjectId();
|
|
Shinya Kitaoka |
120a6e |
TStageObject *pegbar = xsh->getStageObject(objId);
|
|
Shinya Kitaoka |
120a6e |
TStageObjectSpline *spline = pegbar ? pegbar->getSpline() : 0;
|
|
Shinya Kitaoka |
120a6e |
return spline ? spline->getStroke() : 0;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void EditTool::mouseMove(const TPointD &, const TMouseEvent &e) {
|
|
shun-iwasawa |
59484b |
/*-- return while left dragging --*/
|
|
Shinya Kitaoka |
120a6e |
if (e.isLeftButtonPressed()) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
59484b |
/*-- Pick screen only when the FxGadget is displayed or
|
|
shun-iwasawa |
59484b |
when the "All" axis is selected. --*/
|
|
shun-iwasawa |
59484b |
int selectedDevice = -1;
|
|
shun-iwasawa |
59484b |
if (m_fxGadgetController->hasGadget() || m_activeAxis.getValue() == L"All")
|
|
shun-iwasawa |
59484b |
selectedDevice = pick(e.m_pos);
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
59484b |
if (selectedDevice <= 0) {
|
|
Shinya Kitaoka |
120a6e |
selectedDevice = m_what;
|
|
Shinya Kitaoka |
120a6e |
if (m_what == Translation && e.isCtrlPressed())
|
|
Shinya Kitaoka |
120a6e |
selectedDevice = ZTranslation;
|
|
Shinya Kitaoka |
120a6e |
else if (
|
|
Shinya Kitaoka |
120a6e |
m_what == ZTranslation &&
|
|
Shinya Kitaoka |
120a6e |
!e.isCtrlPressed()) /*--ここには、一度Z移動をした後に入る可能性がある--*/
|
|
Shinya Kitaoka |
120a6e |
selectedDevice = Translation;
|
|
Shinya Kitaoka |
120a6e |
else if (m_what == Scale && e.isCtrlPressed())
|
|
Shinya Kitaoka |
120a6e |
selectedDevice = ScaleXY;
|
|
Shinya Kitaoka |
120a6e |
else if (m_what == ScaleXY && !e.isCtrlPressed())
|
|
Shinya Kitaoka |
120a6e |
selectedDevice = Scale;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (selectedDevice != m_highlightedDevice) {
|
|
Shinya Kitaoka |
120a6e |
m_highlightedDevice = selectedDevice;
|
|
Shinya Kitaoka |
120a6e |
m_fxGadgetController->selectById(selectedDevice);
|
|
Shinya Kitaoka |
120a6e |
invalidate();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
shun-iwasawa |
bce58d |
|
|
shun-iwasawa |
bce58d |
// for adding decoration to the cursor while pressing Alt key
|
|
shun-iwasawa |
bce58d |
m_isAltPressed = e.isAltPressed();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
TPoint ga, gb, gc;
|
|
Toshihiro Shimizu |
890ddd |
TPoint lastScreenPos;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void EditTool::leftButtonDown(const TPointD &ppos, const TMouseEvent &e) {
|
|
Shinya Kitaoka |
120a6e |
TPointD pos = ppos;
|
|
Shinya Kitaoka |
120a6e |
/*-- Soundカラムの場合は何もしない --*/
|
|
Shinya Kitaoka |
120a6e |
if (!doesApply()) return;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (m_activeAxis.getValue() == L"Position")
|
|
Shinya Kitaoka |
120a6e |
if (e.isCtrlPressed())
|
|
Shinya Kitaoka |
120a6e |
m_what = ZTranslation;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
m_what = Translation;
|
|
Shinya Kitaoka |
120a6e |
else if (m_activeAxis.getValue() == L"Scale")
|
|
Shinya Kitaoka |
120a6e |
if (e.isCtrlPressed())
|
|
Shinya Kitaoka |
120a6e |
m_what = ScaleXY;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
m_what = Scale;
|
|
shun-iwasawa |
59484b |
else if (m_activeAxis.getValue() == L"All")
|
|
shun-iwasawa |
59484b |
onEditAllLeftButtonDown(pos, e);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
int scaleConstraint = 0;
|
|
Shinya Kitaoka |
120a6e |
if (m_scaleConstraint.getValue() == L"A/R")
|
|
Shinya Kitaoka |
120a6e |
scaleConstraint = ScaleConstraints::AspectRatio;
|
|
Shinya Kitaoka |
120a6e |
else if (m_scaleConstraint.getValue() == L"Mass")
|
|
Shinya Kitaoka |
120a6e |
scaleConstraint = ScaleConstraints::Mass;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
assert(m_dragTool == 0);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (m_highlightedDevice >= 1000) {
|
|
Shinya Kitaoka |
120a6e |
m_dragTool = m_fxGadgetController->createDragTool(m_highlightedDevice);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
d464a1 |
if (!m_dragTool && transformEnabled()) {
|
|
Shinya Kitaoka |
120a6e |
switch (m_what) {
|
|
Shinya Kitaoka |
120a6e |
case Center:
|
|
Shinya Kitaoka |
120a6e |
m_dragTool = new DragCenterTool(m_lockCenterX.getValue(),
|
|
Shinya Kitaoka |
120a6e |
m_lockCenterY.getValue());
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
case Translation:
|
|
Shinya Kitaoka |
120a6e |
if (const TStroke *spline = getSpline())
|
|
shun_iwasawa |
1fbdc9 |
m_dragTool = new DragSplinePositionTool(
|
|
shun_iwasawa |
1fbdc9 |
spline, m_globalKeyframes.getValue(), getPixelSize());
|
|
Shinya Kitaoka |
120a6e |
else
|
|
Shinya Kitaoka |
120a6e |
m_dragTool = new DragPositionTool(m_lockPositionX.getValue(),
|
|
Shinya Kitaoka |
120a6e |
m_lockPositionY.getValue(),
|
|
Shinya Kitaoka |
120a6e |
m_globalKeyframes.getValue());
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
case Rotation:
|
|
Shinya Kitaoka |
120a6e |
m_dragTool = new DragRotationTool(m_lockRotation.getValue(),
|
|
Shinya Kitaoka |
120a6e |
m_globalKeyframes.getValue());
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
case Scale:
|
|
Shinya Kitaoka |
120a6e |
m_dragTool = new DragIsotropicScaleTool(m_lockGlobalScale.getValue(),
|
|
Shinya Kitaoka |
120a6e |
m_globalKeyframes.getValue());
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
case ScaleXY:
|
|
Shinya Kitaoka |
120a6e |
m_dragTool = new DragScaleTool(scaleConstraint, m_lockScaleH.getValue(),
|
|
Shinya Kitaoka |
120a6e |
m_lockScaleV.getValue(),
|
|
Shinya Kitaoka |
120a6e |
m_globalKeyframes.getValue());
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
case Shear:
|
|
Shinya Kitaoka |
120a6e |
m_dragTool =
|
|
Shinya Kitaoka |
120a6e |
new DragShearTool(m_lockShearH.getValue(), m_lockShearV.getValue(),
|
|
Shinya Kitaoka |
120a6e |
m_globalKeyframes.getValue());
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
case ZTranslation:
|
|
Shinya Kitaoka |
120a6e |
m_dragTool = new DragZTool(m_viewer, m_globalKeyframes.getValue());
|
|
Shinya Kitaoka |
120a6e |
break;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
if (m_dragTool) {
|
|
Shinya Kitaoka |
120a6e |
m_dragTool->enableGlobalKeyframes(m_globalKeyframes.getValue());
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->beginBlock();
|
|
Shinya Kitaoka |
120a6e |
m_dragTool->leftButtonDown(pos, e);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
59484b |
void EditTool::onEditAllLeftButtonDown(TPointD &pos, const TMouseEvent &e) {
|
|
shun-iwasawa |
59484b |
int selectedDevice = pick(e.m_pos);
|
|
shun-iwasawa |
59484b |
m_what = selectedDevice >= 0 ? selectedDevice : Translation;
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
if (selectedDevice < 0 && m_autoSelect.getValue() != L"None") {
|
|
shun-iwasawa |
2d0135 |
pos = getMatrix() * pos;
|
|
shun-iwasawa |
2d0135 |
int columnIndex = getViewer()->posToColumnIndex(e.m_pos, 5.0, false);
|
|
shun-iwasawa |
59484b |
if (columnIndex >= 0) {
|
|
shun-iwasawa |
59484b |
TStageObjectId id = TStageObjectId::ColumnId(columnIndex);
|
|
shun-iwasawa |
59484b |
int currentColumnIndex = getColumnIndex();
|
|
shun-iwasawa |
59484b |
TXsheet *xsh = getXsheet();
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
if (m_autoSelect.getValue() == L"Pegbar") {
|
|
shun-iwasawa |
59484b |
TStageObjectId id2 = id;
|
|
shun-iwasawa |
59484b |
while (!id2.isPegbar()) {
|
|
shun-iwasawa |
59484b |
id2 = xsh->getStageObjectParent(id2);
|
|
shun-iwasawa |
59484b |
if (!id2.isColumn() && !id2.isPegbar()) break;
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
if (id2.isPegbar()) id = id2;
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
if (id.isColumn()) {
|
|
shun-iwasawa |
59484b |
if (columnIndex >= 0 && columnIndex != currentColumnIndex) {
|
|
shun-iwasawa |
59484b |
if (e.isShiftPressed()) {
|
|
shun-iwasawa |
59484b |
TXsheetHandle *xshHandle =
|
|
shun-iwasawa |
59484b |
TTool::getApplication()->getCurrentXsheet();
|
|
shun-iwasawa |
59484b |
TStageObjectId curColId =
|
|
shun-iwasawa |
59484b |
TStageObjectId::ColumnId(currentColumnIndex);
|
|
shun-iwasawa |
59484b |
TStageObjectId colId = TStageObjectId::ColumnId(columnIndex);
|
|
shun-iwasawa |
59484b |
TStageObjectCmd::setParent(curColId, colId, "", xshHandle);
|
|
shun-iwasawa |
59484b |
m_what = None;
|
|
shun-iwasawa |
59484b |
xshHandle->notifyXsheetChanged();
|
|
shun-iwasawa |
59484b |
} else {
|
|
shun-iwasawa |
59484b |
TXshColumn *column = xsh->getColumn(columnIndex);
|
|
shun-iwasawa |
59484b |
if (!column || !column->isLocked()) {
|
|
shun-iwasawa |
59484b |
TTool::getApplication()->getCurrentColumn()->setColumnIndex(
|
|
shun-iwasawa |
59484b |
columnIndex);
|
|
shun-iwasawa |
59484b |
updateMatrix();
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
} else {
|
|
shun-iwasawa |
59484b |
TTool::getApplication()->getCurrentObject()->setObjectId(id);
|
|
shun-iwasawa |
59484b |
updateMatrix();
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
pos = getMatrix().inv() * pos;
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
59484b |
|
|
Shinya Kitaoka |
120a6e |
void EditTool::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) {
|
|
Shinya Kitaoka |
120a6e |
if (!m_dragTool) return;
|
|
Shinya Kitaoka |
120a6e |
m_dragTool->leftButtonDrag(pos, e);
|
|
Shinya Kitaoka |
120a6e |
TTool::getApplication()->getCurrentObject()->notifyObjectIdChanged(true);
|
|
Shinya Kitaoka |
120a6e |
invalidate();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void EditTool::leftButtonUp(const TPointD &pos, const TMouseEvent &e) {
|
|
Shinya Kitaoka |
120a6e |
if (m_dragTool) {
|
|
Shinya Kitaoka |
120a6e |
m_dragTool->leftButtonUp(pos, e);
|
|
Shinya Kitaoka |
120a6e |
TUndoManager::manager()->endBlock();
|
|
Shinya Kitaoka |
120a6e |
delete m_dragTool;
|
|
Shinya Kitaoka |
120a6e |
m_dragTool = 0;
|
|
Shinya Kitaoka |
120a6e |
TTool::getApplication()->getCurrentObject()->notifyObjectIdChanged(false);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
m_keyFrameAdded = false;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
namespace {
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void drawArrow(double r, bool filled) {
|
|
Shinya Kitaoka |
120a6e |
double z0 = 0.25 * r;
|
|
Shinya Kitaoka |
120a6e |
double z1 = 2 * r;
|
|
Shinya Kitaoka |
120a6e |
double z2 = 4 * r;
|
|
Shinya Kitaoka |
120a6e |
double x0 = r;
|
|
Shinya Kitaoka |
120a6e |
double x1 = 2 * r;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
if (filled) {
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_POLYGON);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(x1, 0, z2);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(-x1, 0, z2);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(-x1, 0, -z2);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(x1, 0, -z2);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(x1, 0, z2);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
} else {
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(x0, 0, z0);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(x0, 0, z1);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(x1, 0, z1);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(0, 0, z2);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(-x1, 0, z1);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(-x0, 0, z1);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(-x0, 0, z0);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(-x0, 0, z0);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(x0, 0, -z0);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(x0, 0, -z1);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(x1, 0, -z1);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(0, 0, -z2);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(-x1, 0, -z1);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(-x0, 0, -z1);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(-x0, 0, -z0);
|
|
Shinya Kitaoka |
120a6e |
glVertex3d(-x0, 0, -z0);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void drawCameraIcon() {
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(5, 0);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(16, 0);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(16, 3);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(16, 3);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(22, 0);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(22, 9);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(16, 6);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(16, 9);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(14, 9);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(16, 11);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(16, 14);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(14, 16);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(11, 16);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(9, 14);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(9, 11);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(11, 9);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(7, 9);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(7, 11);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(5, 13);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(2, 13);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(0, 11);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(0, 8);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(2, 6);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(5, 6);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(5, 0);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void drawZArrow() {
|
|
Shinya Kitaoka |
120a6e |
/*--矢印--*/
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_LOOP);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(0, 3);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(2, 2);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(1, 2);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(2, -3);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(4, -3);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(0, -6);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(-4, -3);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(-2, -3);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(-1, 2);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(-2, 2);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
/*--Zの文字--*/
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(3, 4);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(5, 4);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(3, 1);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(5, 1);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Shinya Kitaoka |
120a6e |
} // namespace
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void EditTool::drawText(const TPointD &p, double unit, std::string text) {
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
glTranslated(p.x, p.y, 0.0);
|
|
Shinya Kitaoka |
120a6e |
double sc = unit * 1.6;
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
double w = sc * tglGetTextWidth(text, GLUT_STROKE_ROMAN);
|
|
Shinya Kitaoka |
120a6e |
double h = sc;
|
|
Shinya Kitaoka |
120a6e |
glEnable(GL_BLEND);
|
|
Shinya Kitaoka |
120a6e |
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
Shinya Kitaoka |
120a6e |
glColor4d(0.9,0.9,0.1,0.5);
|
|
Shinya Kitaoka |
120a6e |
glRectd(0,0,w,h);
|
|
Shinya Kitaoka |
120a6e |
glDisable(GL_BLEND);
|
|
Shinya Kitaoka |
120a6e |
glColor3d(0,0,0);
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
glScaled(sc, sc, 1);
|
|
Shinya Kitaoka |
120a6e |
tglDrawText(TPointD(8, -3), text);
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
59484b |
void EditTool::drawMainHandle() {
|
|
shun-iwasawa |
59484b |
const TPixel32 normalColor(250, 127, 240);
|
|
shun-iwasawa |
59484b |
const TPixel32 highlightedColor(150, 255, 140);
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
// collect information
|
|
shun-iwasawa |
59484b |
TXsheet *xsh = getXsheet();
|
|
shun-iwasawa |
59484b |
TStageObjectId objId = getObjectId();
|
|
shun-iwasawa |
59484b |
int frame = getFrame();
|
|
shun-iwasawa |
59484b |
TAffine parentAff = xsh->getParentPlacement(objId, frame);
|
|
shun-iwasawa |
59484b |
TAffine aff = xsh->getPlacement(objId, frame);
|
|
shun-iwasawa |
59484b |
TPointD center = Stage::inch * xsh->getCenter(objId, frame);
|
|
shun-iwasawa |
f2e168 |
int devPixRatio = getDevicePixelRatio(m_viewer->viewerWidget());
|
|
shun-iwasawa |
59484b |
// the gadget appears on the center of the level. orientation and dimension
|
|
shun-iwasawa |
59484b |
// are independent of the movement of the level
|
|
shun-iwasawa |
59484b |
glPushMatrix();
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
tglMultMatrix(parentAff.inv() * TTranslation(aff * center));
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
// so in the system of ref. of the gadget the center is always in the origin
|
|
shun-iwasawa |
59484b |
center = TPointD();
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
double unit = sqrt(tglGetPixelSize2());
|
|
Jeremy Bullock |
63e8da |
unit *= devPixRatio;
|
|
shun-iwasawa |
59484b |
bool dragging = m_dragTool != 0;
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
// draw center
|
|
shun-iwasawa |
59484b |
tglColor(m_highlightedDevice == Center ? highlightedColor : normalColor);
|
|
shun-iwasawa |
59484b |
glPushName(Center);
|
|
shun-iwasawa |
59484b |
if (isPicking())
|
|
shun-iwasawa |
59484b |
tglDrawDisk(center, unit * 12);
|
|
shun-iwasawa |
59484b |
else {
|
|
shun-iwasawa |
59484b |
tglDrawCircle(center, unit * 10);
|
|
shun-iwasawa |
59484b |
tglDrawCircle(center, unit * 8);
|
|
shun-iwasawa |
59484b |
if (m_highlightedDevice == Center && !dragging)
|
|
shun-iwasawa |
59484b |
drawText(center + TPointD(4 * unit, 0), unit, "Move center");
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
glPopName();
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
// draw label (column/pegbar name; possibly camera icon)
|
|
shun-iwasawa |
59484b |
tglColor(normalColor);
|
|
shun-iwasawa |
59484b |
glPushMatrix();
|
|
shun-iwasawa |
59484b |
glTranslated(center.x + unit * 10, center.y - unit * 20, 0);
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
if (objId.isColumn() || objId.isPegbar()) {
|
|
shun-iwasawa |
59484b |
TStageObject *pegbar = xsh->getStageObject(objId);
|
|
shun-iwasawa |
59484b |
std::string name = pegbar->getFullName();
|
|
shun-iwasawa |
59484b |
glScaled(unit * 2, unit * 1.5, 1);
|
|
shun-iwasawa |
59484b |
tglDrawText(TPointD(0, 0), name);
|
|
shun-iwasawa |
59484b |
} else if (objId.isCamera()) {
|
|
shun-iwasawa |
59484b |
glScaled(unit, unit, 1);
|
|
shun-iwasawa |
59484b |
drawCameraIcon();
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
glPopMatrix();
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
// draw rotation handle
|
|
shun-iwasawa |
59484b |
const double delta = 30;
|
|
shun-iwasawa |
59484b |
tglColor(m_highlightedDevice == Rotation ? highlightedColor : normalColor);
|
|
shun-iwasawa |
59484b |
glPushName(Rotation);
|
|
shun-iwasawa |
59484b |
TPointD p = center + unit * TPointD(0, delta);
|
|
shun-iwasawa |
59484b |
if (isPicking())
|
|
shun-iwasawa |
59484b |
tglDrawDisk(p, unit * 10);
|
|
shun-iwasawa |
59484b |
else
|
|
shun-iwasawa |
59484b |
tglDrawDisk(p, unit * 5);
|
|
shun-iwasawa |
59484b |
glPopName();
|
|
shun-iwasawa |
59484b |
if (m_highlightedDevice == Rotation && !dragging && !isPicking())
|
|
shun-iwasawa |
59484b |
drawText(p, unit, "Rotate");
|
|
shun-iwasawa |
59484b |
tglColor(normalColor);
|
|
shun-iwasawa |
59484b |
tglDrawSegment(p, center);
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
// draw scale handle
|
|
shun-iwasawa |
59484b |
p = center + m_currentScaleFactor * unit * delta * TPointD(-1, -1);
|
|
shun-iwasawa |
59484b |
double r = unit * 3;
|
|
shun-iwasawa |
59484b |
double f = 5;
|
|
shun-iwasawa |
59484b |
TRectD hitRect;
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
tglColor(m_highlightedDevice == Scale ? highlightedColor : normalColor);
|
|
shun-iwasawa |
59484b |
glPushName(Scale);
|
|
shun-iwasawa |
59484b |
hitRect =
|
|
shun-iwasawa |
59484b |
TRectD(p.x - (f - 2) * r, p.y - (f - 2) * r, p.x + r * 2, p.y + r * 2);
|
|
shun-iwasawa |
59484b |
// tglDrawRect(hitRect);
|
|
shun-iwasawa |
59484b |
if (isPicking())
|
|
shun-iwasawa |
59484b |
tglFillRect(hitRect);
|
|
shun-iwasawa |
59484b |
else
|
|
shun-iwasawa |
59484b |
tglDrawRect(p.x - r, p.y - r, p.x + r, p.y + r);
|
|
shun-iwasawa |
59484b |
glPopName();
|
|
shun-iwasawa |
59484b |
TPointD scaleTooltipPos = p + unit * TPointD(-16, -16);
|
|
shun-iwasawa |
59484b |
if (m_highlightedDevice == Scale && !dragging && !isPicking())
|
|
shun-iwasawa |
59484b |
drawText(scaleTooltipPos, unit, "Scale");
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
tglColor(normalColor);
|
|
shun-iwasawa |
59484b |
tglDrawSegment(p, center);
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
TPointD q;
|
|
shun-iwasawa |
59484b |
double dd = unit * 10;
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
q = p + TPointD(dd, dd);
|
|
shun-iwasawa |
59484b |
tglColor(m_highlightedDevice == ScaleXY ? highlightedColor : normalColor);
|
|
shun-iwasawa |
59484b |
glPushName(ScaleXY);
|
|
shun-iwasawa |
59484b |
hitRect =
|
|
shun-iwasawa |
59484b |
TRectD(q.x - 2 * r, q.y - 2 * r, q.x + r * (f - 2), q.y + r * (f - 2));
|
|
shun-iwasawa |
59484b |
// tglDrawRect(hitRect);
|
|
shun-iwasawa |
59484b |
if (isPicking())
|
|
shun-iwasawa |
59484b |
tglFillRect(hitRect);
|
|
shun-iwasawa |
59484b |
else
|
|
shun-iwasawa |
59484b |
tglDrawRect(q.x - r, q.y - r, q.x + r, q.y + r);
|
|
shun-iwasawa |
59484b |
glPopName();
|
|
shun-iwasawa |
59484b |
if (m_highlightedDevice == ScaleXY && !dragging && !isPicking())
|
|
shun-iwasawa |
59484b |
drawText(scaleTooltipPos, unit, "Horizontal/Vertical scale");
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
// draw shear handle
|
|
shun-iwasawa |
59484b |
p = center + m_currentScaleFactor * unit * delta * TPointD(1, -1);
|
|
shun-iwasawa |
59484b |
tglColor(m_highlightedDevice == Shear ? highlightedColor : normalColor);
|
|
shun-iwasawa |
59484b |
glPushName(Shear);
|
|
shun-iwasawa |
59484b |
if (isPicking()) {
|
|
shun-iwasawa |
59484b |
glBegin(GL_POLYGON);
|
|
shun-iwasawa |
59484b |
glVertex2d(p.x - unit * 6, p.y - unit * 3);
|
|
shun-iwasawa |
59484b |
glVertex2d(p.x - unit * 3, p.y - unit * 3);
|
|
shun-iwasawa |
59484b |
glVertex2d(p.x + unit * 6, p.y + unit * 3);
|
|
shun-iwasawa |
59484b |
glVertex2d(p.x + unit * 3, p.y + unit * 3);
|
|
shun-iwasawa |
59484b |
glVertex2d(p.x - unit * 6, p.y - unit * 3);
|
|
shun-iwasawa |
59484b |
glEnd();
|
|
shun-iwasawa |
59484b |
} else {
|
|
shun-iwasawa |
59484b |
glBegin(GL_LINE_STRIP);
|
|
shun-iwasawa |
59484b |
glVertex2d(p.x - unit * 6, p.y - unit * 3);
|
|
shun-iwasawa |
59484b |
glVertex2d(p.x - unit * 3, p.y - unit * 3);
|
|
shun-iwasawa |
59484b |
glVertex2d(p.x + unit * 6, p.y + unit * 3);
|
|
shun-iwasawa |
59484b |
glVertex2d(p.x + unit * 3, p.y + unit * 3);
|
|
shun-iwasawa |
59484b |
glVertex2d(p.x - unit * 6, p.y - unit * 3);
|
|
shun-iwasawa |
59484b |
glEnd();
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
glPopName();
|
|
shun-iwasawa |
59484b |
if (m_highlightedDevice == Shear && !dragging)
|
|
shun-iwasawa |
59484b |
drawText(p + TPointD(0, -unit * 10), unit, "Shear");
|
|
shun-iwasawa |
59484b |
tglColor(normalColor);
|
|
shun-iwasawa |
59484b |
tglDrawSegment(p, center);
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
//
|
|
shun-iwasawa |
59484b |
if (objId.isCamera()) {
|
|
shun-iwasawa |
59484b |
if (xsh->getStageObjectTree()->getCurrentCameraId() != objId) {
|
|
shun-iwasawa |
59484b |
glEnable(GL_LINE_STIPPLE);
|
|
shun-iwasawa |
59484b |
glColor3d(1.0, 0.0, 1.0);
|
|
shun-iwasawa |
59484b |
glLineStipple(1, 0x1111);
|
|
shun-iwasawa |
59484b |
TRectD cameraRect = TTool::getApplication()
|
|
shun-iwasawa |
59484b |
->getCurrentScene()
|
|
shun-iwasawa |
59484b |
->getScene()
|
|
shun-iwasawa |
59484b |
->getCurrentCamera()
|
|
shun-iwasawa |
59484b |
->getStageRect();
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
glPushMatrix();
|
|
shun-iwasawa |
59484b |
// tglMultMatrix(mat);
|
|
shun-iwasawa |
59484b |
tglDrawRect(cameraRect);
|
|
shun-iwasawa |
59484b |
glPopMatrix();
|
|
shun-iwasawa |
59484b |
glDisable(GL_LINE_STIPPLE);
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
|
|
shun-iwasawa |
59484b |
glPopMatrix();
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
59484b |
|
|
Shinya Kitaoka |
120a6e |
void EditTool::draw() {
|
|
Shinya Kitaoka |
120a6e |
// the tool is using the coordinate system of the parent object
|
|
Shinya Kitaoka |
120a6e |
// glColor3d(1,0,1);
|
|
Shinya Kitaoka |
120a6e |
// tglDrawCircle(crossHair,50);
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
59484b |
/*-- Show nothing on Level Editing mode --*/
|
|
Shinya Kitaoka |
120a6e |
if (TTool::getApplication()->getCurrentFrame()->isEditingLevel()) return;
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
// if the column and its children are all hidden, only draw fx gadgets
|
|
shun-iwasawa |
d464a1 |
if (!transformEnabled()) {
|
|
shun-iwasawa |
d464a1 |
m_fxGadgetController->draw(isPicking());
|
|
shun-iwasawa |
d464a1 |
return;
|
|
shun-iwasawa |
d464a1 |
}
|
|
Shinya Kitaoka |
120a6e |
const TPixel32 normalColor(250, 127, 240);
|
|
Shinya Kitaoka |
120a6e |
const TPixel32 highlightedColor(150, 255, 140);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// collect information
|
|
Shinya Kitaoka |
120a6e |
TXsheet *xsh = getXsheet();
|
|
shun-iwasawa |
59484b |
/*-- Obtain ID of the current editing stage object --*/
|
|
Shinya Kitaoka |
120a6e |
TStageObjectId objId = getObjectId();
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
int frame = getFrame();
|
|
shun-iwasawa |
d464a1 |
TAffine parentAff = xsh->getParentPlacement(objId, frame);
|
|
shun-iwasawa |
d464a1 |
TAffine aff = xsh->getPlacement(objId, frame);
|
|
shun-iwasawa |
d464a1 |
TPointD center = Stage::inch * xsh->getCenter(objId, frame);
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
59484b |
/*-- Enable Z translation on 3D view --*/
|
|
Shinya Kitaoka |
120a6e |
if (getViewer()->is3DView()) {
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
glPushName(ZTranslation);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
tglColor(m_highlightedDevice == ZTranslation ? highlightedColor
|
|
Shinya Kitaoka |
120a6e |
: normalColor);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
double z = xsh->getZ(objId, frame);
|
|
Shinya Kitaoka |
120a6e |
glTranslated(0, -1, z);
|
|
Shinya Kitaoka |
120a6e |
drawArrow(50, isPicking());
|
|
Shinya Kitaoka |
120a6e |
glPopName();
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
return;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
59484b |
// Edit-all
|
|
shun-iwasawa |
59484b |
if (m_activeAxis.getValue() == L"All") {
|
|
shun-iwasawa |
59484b |
if (!m_fxGadgetController->isEditingNonZeraryFx()) drawMainHandle();
|
|
shun-iwasawa |
59484b |
m_fxGadgetController->draw(isPicking());
|
|
shun-iwasawa |
59484b |
return;
|
|
shun-iwasawa |
59484b |
}
|
|
shun-iwasawa |
59484b |
|
|
shun_iwasawa |
1fbdc9 |
double unit = getPixelSize();
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
59484b |
/*-- Obtain object's center position --*/
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
tglMultMatrix(parentAff.inv() * TTranslation(aff * TPointD(0.0, 0.0)));
|
|
Shinya Kitaoka |
120a6e |
tglColor(normalColor);
|
|
Shinya Kitaoka |
120a6e |
tglDrawDisk(TPointD(0.0, 0.0), unit * 4);
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
59484b |
/*-- Z translation : Draw arrow mark (placed at the camera center) --*/
|
|
Shinya Kitaoka |
120a6e |
if (m_activeAxis.getValue() == L"Position" &&
|
|
Shinya Kitaoka |
120a6e |
m_highlightedDevice == ZTranslation) {
|
|
Shinya Kitaoka |
120a6e |
tglColor(normalColor);
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
TStageObjectId currentCamId =
|
|
John Dancel |
c323ac |
TStageObjectId::CameraId(xsh->getCameraColumnIndex());
|
|
Shinya Kitaoka |
120a6e |
TAffine camParentAff = xsh->getParentPlacement(currentCamId, frame);
|
|
Shinya Kitaoka |
120a6e |
TAffine camAff = xsh->getPlacement(currentCamId, frame);
|
|
Shinya Kitaoka |
120a6e |
tglMultMatrix(camParentAff.inv() *
|
|
Shinya Kitaoka |
120a6e |
TTranslation(camAff * TPointD(0.0, 0.0)));
|
|
Shinya Kitaoka |
120a6e |
glScaled(unit * 8, unit * 8, 1);
|
|
Shinya Kitaoka |
120a6e |
drawZArrow();
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
shun-iwasawa |
59484b |
/*-- Rotation, Position : Draw vertical and horizontal lines --*/
|
|
shun-iwasawa |
59484b |
else if (m_activeAxis.getValue() == L"Rotation" ||
|
|
shun-iwasawa |
59484b |
m_activeAxis.getValue() == L"Position") {
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
tglMultMatrix(parentAff.inv() * aff * TTranslation(center));
|
|
Shinya Kitaoka |
120a6e |
glScaled(unit, unit, 1);
|
|
Shinya Kitaoka |
120a6e |
tglColor(normalColor);
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(-800, 0);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(800, 0);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(0, -100);
|
|
Shinya Kitaoka |
120a6e |
glVertex2i(0, 100);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
tglMultMatrix(parentAff.inv() * TTranslation(aff * center));
|
|
Shinya Kitaoka |
120a6e |
center = TPointD();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
bool dragging = m_dragTool != 0;
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// draw center
|
|
Shinya Kitaoka |
120a6e |
tglColor(normalColor);
|
|
Shinya Kitaoka |
120a6e |
glPushName(Center);
|
|
Shinya Kitaoka |
120a6e |
{
|
|
Shinya Kitaoka |
120a6e |
tglDrawCircle(center, unit * 10);
|
|
Shinya Kitaoka |
120a6e |
tglDrawCircle(center, unit * 8);
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
59484b |
/*-- Draw crossed lines in the circle. It's already translated to the center
|
|
shun-iwasawa |
59484b |
* position. --*/
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
glVertex2d(-unit * 8, 0.0);
|
|
Shinya Kitaoka |
120a6e |
glVertex2d(unit * 8, 0.0);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
glBegin(GL_LINE_STRIP);
|
|
Shinya Kitaoka |
120a6e |
glVertex2d(0.0, -unit * 8);
|
|
Shinya Kitaoka |
120a6e |
glVertex2d(0.0, unit * 8);
|
|
Shinya Kitaoka |
120a6e |
glEnd();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
glPopName();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
// draw label (column/pegbar name; possibly camera icon)
|
|
Shinya Kitaoka |
120a6e |
tglColor(normalColor);
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
glTranslated(center.x + unit * 10, center.y - unit * 20, 0);
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
59484b |
/*-- Object name --*/
|
|
Shinya Kitaoka |
120a6e |
TStageObject *pegbar = xsh->getStageObject(objId);
|
|
Shinya Kitaoka |
120a6e |
std::string name = pegbar->getFullName();
|
|
Shinya Kitaoka |
120a6e |
if (objId.isColumn() || objId.isPegbar() || objId.isTable()) {
|
|
Shinya Kitaoka |
120a6e |
glScaled(unit * 2, unit * 1.5, 1);
|
|
Shinya Kitaoka |
120a6e |
tglDrawText(TPointD(0, 0), name);
|
|
Shinya Kitaoka |
120a6e |
} else if (objId.isCamera()) {
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
glScaled(unit * 2, unit * 1.5, 1);
|
|
Shinya Kitaoka |
120a6e |
tglDrawText(TPointD(12, 0), name);
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
glScaled(unit, unit, 1);
|
|
Shinya Kitaoka |
120a6e |
drawCameraIcon();
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
|
|
shun-iwasawa |
59484b |
/*--- When editing non-active camera, draw its camera frame ---*/
|
|
Shinya Kitaoka |
120a6e |
if (objId.isCamera()) {
|
|
Shinya Kitaoka |
120a6e |
if (xsh->getStageObjectTree()->getCurrentCameraId() != objId) {
|
|
Shinya Kitaoka |
120a6e |
// TODO : glLineStipple has been deprecated in the OpenGL APIs. Need to be
|
|
Shinya Kitaoka |
120a6e |
// replaced. 2016/1/20 shun_iwasawa
|
|
Shinya Kitaoka |
120a6e |
glEnable(GL_LINE_STIPPLE);
|
|
Shinya Kitaoka |
120a6e |
glColor3d(1.0, 0.0, 1.0);
|
|
Shinya Kitaoka |
120a6e |
glLineStipple(1, 0x1111);
|
|
Shinya Kitaoka |
120a6e |
TRectD cameraRect = TTool::getApplication()
|
|
Shinya Kitaoka |
120a6e |
->getCurrentScene()
|
|
Shinya Kitaoka |
120a6e |
->getScene()
|
|
Shinya Kitaoka |
120a6e |
->getCurrentCamera()
|
|
Shinya Kitaoka |
120a6e |
->getStageRect();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glPushMatrix();
|
|
Shinya Kitaoka |
120a6e |
tglDrawRect(cameraRect);
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
glDisable(GL_LINE_STIPPLE);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
glPopMatrix();
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_fxGadgetController->draw(isPicking());
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
void EditTool::onActivate() {
|
|
Shinya Kitaoka |
120a6e |
if (m_firstTime) {
|
|
Shinya Kitaoka |
120a6e |
m_lockCenterX.setValue(LockCenterX ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_lockCenterY.setValue(LockCenterY ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_lockPositionX.setValue(LockPositionX ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_lockPositionY.setValue(LockPositionY ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_lockRotation.setValue(LockRotation ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_lockShearH.setValue(LockShearH ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_lockShearV.setValue(LockShearV ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_lockScaleH.setValue(LockScaleH ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_lockScaleV.setValue(LockScaleV ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_lockGlobalScale.setValue(LockGlobalScale ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_showEWNSposition.setValue(ShowEWNSposition ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_showZposition.setValue(ShowZposition ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_showSOposition.setValue(ShowSOposition ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_showRotation.setValue(ShowRotation ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_showGlobalScale.setValue(ShowGlobalScale ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_showHVscale.setValue(ShowHVscale ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_showShear.setValue(ShowShear ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
m_showCenterPosition.setValue(ShowCenterPosition ? 1 : 0);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_fxGadgetController = new FxGadgetController(this);
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
/*
|
|
Shinya Kitaoka |
120a6e |
m_foo.setTool(this);
|
|
Shinya Kitaoka |
120a6e |
m_foo.setFxHandle(getApplication()->getCurrentFx());
|
|
Shinya Kitaoka |
120a6e |
*/
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
m_firstTime = false;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
|
|
Shinya Kitaoka |
120a6e |
TStageObjectId objId = getObjectId();
|
|
Shinya Kitaoka |
120a6e |
if (objId == TStageObjectId::NoneId) {
|
|
John Dancel |
c323ac |
int index = getColumnIndex();
|
|
John Dancel |
c323ac |
TXsheet *xsh = TTool::getApplication()->getCurrentXsheet()->getXsheet();
|
|
John Dancel |
c323ac |
if (index == -1)
|
|
John Dancel |
c323ac |
objId = TStageObjectId::CameraId(xsh->getCameraColumnIndex());
|
|
John Dancel |
c323ac |
else
|
|
John Dancel |
c323ac |
objId = TStageObjectId::ColumnId(index);
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Shinya Kitaoka |
120a6e |
TTool::getApplication()->getCurrentObject()->setObjectId(objId);
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
f404fb |
void EditTool::onDeactivate() {
|
|
shun-iwasawa |
f404fb |
if (m_dragTool) {
|
|
shun-iwasawa |
f404fb |
m_dragTool->leftButtonUp();
|
|
shun-iwasawa |
f404fb |
TUndoManager::manager()->endBlock();
|
|
shun-iwasawa |
f404fb |
delete m_dragTool;
|
|
shun-iwasawa |
f404fb |
m_dragTool = nullptr;
|
|
shun-iwasawa |
f404fb |
}
|
|
shun-iwasawa |
f404fb |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
bool EditTool::onPropertyChanged(std::string propertyName) {
|
|
Shinya Kitaoka |
120a6e |
if (propertyName == m_lockCenterX.getName())
|
|
Shinya Kitaoka |
120a6e |
LockCenterX = (int)m_lockCenterX.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_lockCenterY.getName())
|
|
Shinya Kitaoka |
120a6e |
LockCenterY = (int)m_lockCenterY.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_lockPositionX.getName())
|
|
Shinya Kitaoka |
120a6e |
LockPositionX = (int)m_lockPositionX.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_lockPositionY.getName())
|
|
Shinya Kitaoka |
120a6e |
LockPositionY = (int)m_lockPositionY.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_lockRotation.getName())
|
|
Shinya Kitaoka |
120a6e |
LockRotation = (int)m_lockRotation.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_lockShearH.getName())
|
|
Shinya Kitaoka |
120a6e |
LockShearH = (int)m_lockShearH.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_lockShearV.getName())
|
|
Shinya Kitaoka |
120a6e |
LockShearV = (int)m_lockShearV.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_lockScaleH.getName())
|
|
Shinya Kitaoka |
120a6e |
LockScaleH = (int)m_lockScaleH.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_lockScaleV.getName())
|
|
Shinya Kitaoka |
120a6e |
LockScaleV = (int)m_lockScaleV.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_lockGlobalScale.getName())
|
|
Shinya Kitaoka |
120a6e |
LockGlobalScale = (int)m_lockGlobalScale.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_showEWNSposition.getName())
|
|
Shinya Kitaoka |
120a6e |
ShowEWNSposition = (int)m_showEWNSposition.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_showZposition.getName())
|
|
Shinya Kitaoka |
120a6e |
ShowZposition = (int)m_showZposition.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_showSOposition.getName())
|
|
Shinya Kitaoka |
120a6e |
ShowSOposition = (int)m_showSOposition.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_showRotation.getName())
|
|
Shinya Kitaoka |
120a6e |
ShowRotation = (int)m_showRotation.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_showGlobalScale.getName())
|
|
Shinya Kitaoka |
120a6e |
ShowGlobalScale = (int)m_showGlobalScale.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_showHVscale.getName())
|
|
Shinya Kitaoka |
120a6e |
ShowHVscale = (int)m_showHVscale.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_showShear.getName())
|
|
Shinya Kitaoka |
120a6e |
ShowShear = (int)m_showShear.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_showCenterPosition.getName())
|
|
Shinya Kitaoka |
120a6e |
ShowCenterPosition = (int)m_showCenterPosition.getValue();
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
/*-- Active Axis の変更 --*/
|
|
Shinya Kitaoka |
120a6e |
else if (propertyName == m_activeAxis.getName()) {
|
|
Shinya Kitaoka |
120a6e |
std::wstring activeAxis = m_activeAxis.getValue();
|
|
Shinya Kitaoka |
120a6e |
if (activeAxis == L"Position")
|
|
Shinya Kitaoka |
120a6e |
m_what = Translation;
|
|
Shinya Kitaoka |
120a6e |
else if (activeAxis == L"Rotation")
|
|
Shinya Kitaoka |
120a6e |
m_what = Rotation;
|
|
Shinya Kitaoka |
120a6e |
else if (activeAxis == L"Scale")
|
|
Shinya Kitaoka |
120a6e |
m_what = Scale;
|
|
Shinya Kitaoka |
120a6e |
else if (activeAxis == L"Shear")
|
|
Shinya Kitaoka |
120a6e |
m_what = Shear;
|
|
Shinya Kitaoka |
120a6e |
else if (activeAxis == L"Center")
|
|
Shinya Kitaoka |
120a6e |
m_what = Center;
|
|
shun-iwasawa |
59484b |
else if (activeAxis == L"All")
|
|
shun-iwasawa |
59484b |
m_what = None;
|
|
Shinya Kitaoka |
120a6e |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
return true;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//-----------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
int EditTool::getCursorId() const {
|
|
shun-iwasawa |
bce58d |
int ret;
|
|
luz paz |
6454c4 |
// cursor for controlling the fx gadget
|
|
shun-iwasawa |
bce58d |
if (m_highlightedDevice >= 1000)
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::FxGadgetCursor;
|
|
shun-iwasawa |
d464a1 |
else if (transformEnabled()) {
|
|
shun-iwasawa |
bce58d |
// switch cursors depending on the active axis
|
|
shun-iwasawa |
bce58d |
std::wstring activeAxis = m_activeAxis.getValue();
|
|
shun-iwasawa |
bce58d |
if (activeAxis == L"Position") {
|
|
shun-iwasawa |
bce58d |
if (m_highlightedDevice == ZTranslation)
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::MoveZCursor;
|
|
shun-iwasawa |
bce58d |
else if (LockPositionX && LockPositionY)
|
|
Shinya Kitaoka |
120a6e |
return ToolCursor::DisableCursor;
|
|
shun-iwasawa |
bce58d |
else if (LockPositionX)
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::MoveNSCursor;
|
|
shun-iwasawa |
bce58d |
else if (LockPositionY)
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::MoveEWCursor;
|
|
Shinya Kitaoka |
120a6e |
else
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::MoveCursor;
|
|
shun-iwasawa |
bce58d |
} else if (activeAxis == L"Rotation") {
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::RotCursor;
|
|
shun-iwasawa |
bce58d |
} else if (activeAxis == L"Scale") {
|
|
shun-iwasawa |
bce58d |
if (m_highlightedDevice == ScaleXY) {
|
|
shun-iwasawa |
bce58d |
if (LockScaleH && LockScaleV)
|
|
shun-iwasawa |
bce58d |
return ToolCursor::DisableCursor;
|
|
shun-iwasawa |
bce58d |
else if (LockScaleH)
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::ScaleVCursor;
|
|
shun-iwasawa |
bce58d |
else if (LockScaleV)
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::ScaleHCursor;
|
|
shun-iwasawa |
bce58d |
else
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::ScaleHVCursor;
|
|
shun-iwasawa |
bce58d |
} else
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::ScaleGlobalCursor;
|
|
shun-iwasawa |
bce58d |
} else if (activeAxis == L"Shear") {
|
|
shun-iwasawa |
bce58d |
if (LockShearH && LockShearV)
|
|
shun-iwasawa |
bce58d |
return ToolCursor::DisableCursor;
|
|
shun-iwasawa |
bce58d |
else if (LockShearH)
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::ScaleVCursor;
|
|
shun-iwasawa |
bce58d |
else if (LockShearV)
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::ScaleHCursor;
|
|
shun-iwasawa |
bce58d |
else
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::ScaleCursor;
|
|
shun-iwasawa |
bce58d |
} else if (activeAxis == L"Center") {
|
|
shun-iwasawa |
bce58d |
if (LockCenterX && LockCenterY)
|
|
shun-iwasawa |
bce58d |
return ToolCursor::DisableCursor;
|
|
shun-iwasawa |
bce58d |
else if (LockCenterX)
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::MoveNSCursor;
|
|
shun-iwasawa |
bce58d |
else if (LockCenterY)
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::MoveEWCursor;
|
|
shun-iwasawa |
bce58d |
else
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::MoveCursor;
|
|
Shinya Kitaoka |
120a6e |
} else
|
|
shun-iwasawa |
bce58d |
ret = ToolCursor::StrokeSelectCursor;
|
|
shun-iwasawa |
d464a1 |
} else
|
|
shun-iwasawa |
d464a1 |
return ToolCursor::DisableCursor;
|
|
shun-iwasawa |
bce58d |
// precise control with pressing Alt key
|
|
shun-iwasawa |
bce58d |
if (m_isAltPressed) ret = ret | ToolCursor::Ex_Precise;
|
|
shun-iwasawa |
bce58d |
return ret;
|
|
Toshihiro Shimizu |
890ddd |
}
|
|
Toshihiro Shimizu |
890ddd |
|
|
shun-iwasawa |
d464a1 |
//-----------------------------------------------------------------------------
|
|
shun-iwasawa |
d464a1 |
// overriding TTool::updateEnabled()
|
|
shun-iwasawa |
d464a1 |
QString EditTool::updateEnabled(int rowIndex, int columnIndex) {
|
|
shun-iwasawa |
d464a1 |
// toolType = TTool::ColumnTool
|
|
shun-iwasawa |
d464a1 |
// targetType = TTool::AllTargets;
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
// Disable every tool during playback
|
|
shun-iwasawa |
d464a1 |
if (m_application->getCurrentFrame()->isPlaying())
|
|
shun-iwasawa |
d464a1 |
return (enable(false), QString());
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
// Disable in Level Strip
|
|
shun-iwasawa |
d464a1 |
if (m_application->getCurrentFrame()->isEditingLevel())
|
|
shun-iwasawa |
d464a1 |
return (
|
|
shun-iwasawa |
d464a1 |
enable(false),
|
|
shun-iwasawa |
d464a1 |
QObject::tr("The current tool cannot be used in Level Strip mode."));
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
// if an object other than column is selected, then enable the tool
|
|
shun-iwasawa |
d464a1 |
// regardless of the current column state
|
|
shun-iwasawa |
d464a1 |
TStageObjectId objId = m_application->getCurrentObject()->getObjectId();
|
|
shun-iwasawa |
d464a1 |
if (!objId.isColumn()) return (enable(true), QString());
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
// Retrieve vars and view modes
|
|
shun-iwasawa |
d464a1 |
TXsheet *xsh = m_application->getCurrentXsheet()->getXsheet();
|
|
shun-iwasawa |
d464a1 |
// if a column object is selected, switch the inspected column to it
|
|
shun-iwasawa |
d464a1 |
TXshColumn *column = xsh->getColumn(objId.getIndex());
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
// disable if the column is empty
|
|
shun-iwasawa |
d464a1 |
if (!column || column->isEmpty()) return (enable(false), QString());
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
if (column->getSoundColumn())
|
|
shun-iwasawa |
d464a1 |
return (enable(false),
|
|
shun-iwasawa |
d464a1 |
QObject::tr("It is not possible to edit the audio column."));
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
else if (column->getSoundTextColumn())
|
|
shun-iwasawa |
d464a1 |
return (enable(false),
|
|
shun-iwasawa |
d464a1 |
QObject::tr(
|
|
shun-iwasawa |
d464a1 |
"Note columns can only be edited in the xsheet or timeline."));
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
// Enable to control Fx gadgets even on the locked or hidden columns
|
|
shun-iwasawa |
d464a1 |
if (m_fxGadgetController && m_fxGadgetController->hasGadget())
|
|
shun-iwasawa |
d464a1 |
return (enable(true), QString());
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
// Check against unplaced columns
|
|
shun-iwasawa |
d464a1 |
if (column->isLocked())
|
|
shun-iwasawa |
d464a1 |
return (enable(false), QObject::tr("The current column is locked."));
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
// check if the current column and all of its child columns are hidden
|
|
shun-iwasawa |
d464a1 |
if (!hasVisibleChildColumn(xsh->getStageObject(objId), xsh))
|
|
shun-iwasawa |
d464a1 |
return (enable(false), QObject::tr("The current column is hidden."));
|
|
shun-iwasawa |
d464a1 |
|
|
shun-iwasawa |
d464a1 |
return (enable(true), QString());
|
|
shun-iwasawa |
d464a1 |
}
|
|
shun-iwasawa |
d464a1 |
|
|
Toshihiro Shimizu |
890ddd |
//=============================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
EditTool arrowTool;
|