Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef SKELETON_TOOL_INCLUDED
Toshihiro Shimizu 890ddd
#define SKELETON_TOOL_INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tools/tool.h"
Toshihiro Shimizu 890ddd
#include "tgeometry.h"
Toshihiro Shimizu 890ddd
#include "tproperty.h"
Toshihiro Shimizu 890ddd
#include "toonz/hook.h"
Toshihiro Shimizu 890ddd
#include "toonz/skeleton.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include <qcoreapplication></qcoreapplication>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace SkeletonSubtools
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DragTool;
Toshihiro Shimizu 890ddd
class CommandHandler;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class HookData
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	int m_columnIndex;
Toshihiro Shimizu 890ddd
	int m_hookId; // 0=center (e.g. B,C,...), 1,2... = hook
Toshihiro Shimizu 890ddd
	TPointD m_pos;
Toshihiro Shimizu 890ddd
	std::string m_name; // name visualized in the balloons
Toshihiro Shimizu 890ddd
	bool m_isPivot;		// true if this is the level "pivot", i.e. the current handle
Toshihiro Shimizu 890ddd
	HookData(TXsheet *xsh, int columnIndex, int hookId, const TPointD &pos);
Toshihiro Shimizu 890ddd
	std::string getHandle() const { return m_hookId > 0 ? "H" + m_name : m_name; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class MagicLink
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	HookData m_h0, m_h1;
Toshihiro Shimizu 890ddd
	double m_dist2;
Toshihiro Shimizu 890ddd
	MagicLink(const HookData &h0, const HookData &h1, double dist2) : m_h0(h0), m_h1(h1), m_dist2(dist2) {}
Toshihiro Shimizu 890ddd
	bool operator<(const MagicLink &link) const { return m_dist2 < link.m_dist2; }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class SkeletonTool : public TTool
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	Q_DECLARE_TR_FUNCTIONS(SkeletonTool)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	SkeletonSubtools::DragTool *m_dragTool;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD m_lastPos;
Toshihiro Shimizu 890ddd
	TPointD m_curPos;
Toshihiro Shimizu 890ddd
	TPointD m_firstPos;
Toshihiro Shimizu 890ddd
	TPointD m_curCenter;
Toshihiro Shimizu 890ddd
	TPointD m_parentProbe;
Toshihiro Shimizu 890ddd
	bool m_parentProbeEnabled;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool m_active;
Toshihiro Shimizu 890ddd
	bool m_firstTime;
Toshihiro Shimizu 890ddd
	int m_device;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TEnumProperty m_mode;
Toshihiro Shimizu 890ddd
	TBoolProperty m_showOnlyActiveSkeleton;
Toshihiro Shimizu 890ddd
	TBoolProperty m_globalKeyframes;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPropertyGroup m_prop;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::vector<skeletonsubtools::magiclink> m_magicLinks;</skeletonsubtools::magiclink>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::set<int> m_temporaryPinnedColumns;</int>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int m_currentFrame;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	SkeletonSubtools::CommandHandler *m_commandHandler;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// column currently selected, during a click&drag operation
Toshihiro Shimizu 890ddd
	int m_otherColumn;
Toshihiro Shimizu 890ddd
	TRectD m_otherColumnBBox;
Toshihiro Shimizu 890ddd
	TAffine m_otherColumnBBoxAff;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TPointD m_labelPos;
Toshihiro Shimizu 890ddd
	std::string m_label;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	SkeletonTool();
Toshihiro Shimizu 890ddd
	~SkeletonTool();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ToolType getToolType() const { return TTool::ColumnTool; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void updateTranslation(); // QString localization stuff
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool doesApply() const; // ritorna vero se posso deformare l'oggetto corrente
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onEnter() {}
Toshihiro Shimizu 890ddd
	void leftButtonDown(const TPointD &pos, const TMouseEvent &);
Toshihiro Shimizu 890ddd
	void leftButtonDrag(const TPointD &pos, const TMouseEvent &);
Toshihiro Shimizu 890ddd
	void leftButtonUp(const TPointD &pos, const TMouseEvent &);
Toshihiro Shimizu 890ddd
	void mouseMove(const TPointD &, const TMouseEvent &e);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onImageChanged() { invalidate(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void reset()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_temporaryPinnedColumns.clear();
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Shinya Kitaoka 3bfa54
	bool onPropertyChanged(std::string propertyName);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void draw();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawSkeleton(const Skeleton &skeleton, int row);
Toshihiro Shimizu 890ddd
	void drawLevelBoundingBox(int frame, int columnIndex);
Toshihiro Shimizu 890ddd
	void getImageBoundingBox(TRectD &bbox, TAffine &aff, int frame, int columnIndex);
Toshihiro Shimizu 890ddd
	void drawIKJoint(const Skeleton::Bone *bone);
Toshihiro Shimizu 890ddd
	void drawJoint(const TPointD &p, bool current);
Toshihiro Shimizu 890ddd
	void drawBone(const TPointD &a, const TPointD &b, bool selected);
Toshihiro Shimizu 890ddd
	void drawIKBone(const TPointD &a, const TPointD &b);
Toshihiro Shimizu 890ddd
	void drawMainGadget(const TPointD ¢er);
Toshihiro Shimizu 890ddd
	void drawDrawingBrowser(const TXshCell &cell, const TPointD ¢er);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setParentProbe(const TPointD &parentProbe)
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_parentProbe = parentProbe;
Toshihiro Shimizu 890ddd
		m_parentProbeEnabled = true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void resetParentProbe()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_parentProbeEnabled = false;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void drawHooks();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void computeMagicLinks();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool keyDown(int key, TUINT32 flags, const TPoint &pos);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void onActivate();
Toshihiro Shimizu 890ddd
	void onDeactivate();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getMagicLinkCount() const { return (int)m_magicLinks.size(); }
Toshihiro Shimizu 890ddd
	SkeletonSubtools::MagicLink getMagicLink(int index) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void magicLink(int index);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int getCursorId() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//TRaster32P getToolIcon() const {return Pixmaps::arrow;}
Toshihiro Shimizu 890ddd
	TPropertyGroup *getProperties(int targetType) { return &m_prop; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void updateMatrix()
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		setMatrix(getCurrentObjectParentMatrix());
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	void addContextMenuItems(QMenu *menu);
Toshihiro Shimizu 890ddd
	bool select(const TSelection *) { return false; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void togglePinnedStatus(int columnIndex, int frame, bool shiftPressed);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void buildSkeleton(Skeleton &skeleton, int columnIndex);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void setTemporaryPinnedColumns(const std::set<int> &tmp)</int>
Toshihiro Shimizu 890ddd
	{
Toshihiro Shimizu 890ddd
		m_temporaryPinnedColumns = tmp;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	bool isGlobalKeyframesEnabled() const;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif