Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef PLASTICSKELETON_H
Toshihiro Shimizu 890ddd
#define PLASTICSKELETON_H
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tsmartpointer.h"
Toshihiro Shimizu 890ddd
#include "tpersist.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzExt includes
Toshihiro Shimizu 890ddd
#include "plastichandle.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Boost includes
Toshihiro Shimizu 890ddd
#include <boost config.hpp=""></boost>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qstring></qstring>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if (defined TNZEXT_EXPORTS && !defined INCLUDE_HPP)
Toshihiro Shimizu 890ddd
#define REMOVE_INCLUDE_HPP
Toshihiro Shimizu 890ddd
#define INCLUDE_HPP // Exporting templates needs full instantiation
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tcg_wrap.h"
Toshihiro Shimizu 890ddd
#include "tcg/tcg_vertex.h"
Toshihiro Shimizu 890ddd
#include "tcg/tcg_edge.h"
Toshihiro Shimizu 890ddd
#include "tcg/tcg_face.h"
Toshihiro Shimizu 890ddd
#include "tcg/tcg_mesh.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef REMOVE_INCLUDE_HPP
Toshihiro Shimizu 890ddd
#undef INCLUDE_HPP
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TNZEXT_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//    Forward declarations
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class PlasticSkeletonDeformation;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//==========================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************************
Toshihiro Shimizu 890ddd
//    PlasticSkeletonVertex  declaration
Toshihiro Shimizu 890ddd
//************************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//! PlasticSkeletonVertex is the vertex of a plastic skeleton object.
Toshihiro Shimizu 890ddd
struct DVAPI PlasticSkeletonVertex : public tcg::Vertex<tpointd>, public TPersist {</tpointd>
Toshihiro Shimizu 890ddd
	PERSIST_DECLARATION(PlasticSkeletonVertex)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	friend class PlasticSkeleton;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	QString m_name; //!< Vertex name
Toshihiro Shimizu 890ddd
	int m_number;   //!< Vertex \a number - assigned persistently upon addition
Toshihiro Shimizu 890ddd
	//!< in a skeleton
Toshihiro Shimizu 890ddd
	int m_parent; //!< Index of the parent vertex in the skeleton
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	// Tool data
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double m_minAngle, m_maxAngle; //!< Minimum and maximum accepted angles when updating the vertex
Toshihiro Shimizu 890ddd
								   //!< position with the mouse. In degrees.
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	// Handle data
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool m_interpolate; //!< Whether the vertex needs to be interpolated (see plasticdeformer.h)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	PlasticSkeletonVertex();
Toshihiro Shimizu 890ddd
	explicit PlasticSkeletonVertex(const TPointD &pos);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	operator PlasticHandle() const;
Toshihiro Shimizu 890ddd
	operator TPointD() const { return P(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	const QString &name() const { return m_name; }
Toshihiro Shimizu 890ddd
	int number() const { return m_number; } // Should be removed
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int parent() const { return m_parent; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void saveData(TOStream &os);
Toshihiro Shimizu 890ddd
	void loadData(TIStream &is);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************************
Toshihiro Shimizu 890ddd
//    PlasticSkeleton  declaration
Toshihiro Shimizu 890ddd
//************************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class DVAPI PlasticSkeleton : public TSmartObject, public tcg::Mesh<plasticskeletonvertex, tcg::edge,="" tcg::facen<3="">>, public TPersist</plasticskeletonvertex,>
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	DECLARE_CLASS_CODE
Toshihiro Shimizu 890ddd
	PERSIST_DECLARATION(PlasticSkeleton)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	class Imp;
Toshihiro Shimizu 890ddd
	Imp *m_imp;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	typedef tcg::Mesh<plasticskeletonvertex, tcg::edge,="" tcg::facen<3="">> mesh_type;</plasticskeletonvertex,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	PlasticSkeleton();
Toshihiro Shimizu 890ddd
	PlasticSkeleton(const PlasticSkeleton &other);
Toshihiro Shimizu 890ddd
	~PlasticSkeleton();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	PlasticSkeleton &operator=(const PlasticSkeleton &other);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int parentVertex(int v) { return vertex(v).m_parent; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void moveVertex(int v, const TPointD &pos);					  //!< Moves a vertex to the specified position, informing associated deformers
Toshihiro Shimizu 890ddd
	int addVertex(const PlasticSkeletonVertex &vx, int parent);   //!< Adds a vertex to the skeleton
Toshihiro Shimizu 890ddd
	int insertVertex(const PlasticSkeletonVertex &vx, int e);	 //!< Inserts a vertex splitting an existing edge
Toshihiro Shimizu 890ddd
																  //!< \note Inserted Vertex will connect to parent first
Toshihiro Shimizu 890ddd
	int insertVertex(const PlasticSkeletonVertex &vx, int parent, //!< Generalization of vertex addition/insertion,
Toshihiro Shimizu 890ddd
					 const std::vector<int> &children);			  //!< it is useful as inverse of vertex removal.</int>
Toshihiro Shimizu 890ddd
	void removeVertex(int v);									  //!< Removes a vertex, reattaching all its children to parent
Toshihiro Shimizu 890ddd
	void clear();
Toshihiro Shimizu 890ddd
	void squeeze();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	bool setVertexName(int v, const QString &name);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void saveData(TOStream &os);
Toshihiro Shimizu 890ddd
	void loadData(TIStream &is);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Utility functions
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int closestVertex(const TPointD &pos, double *distance = 0) const;
Toshihiro Shimizu 890ddd
	int closestEdge(const TPointD &pos, double *distance = 0) const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	std::vector<plastichandle> verticesToHandles() const;</plastichandle>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
// RValues-related functions
Toshihiro Shimizu 890ddd
#ifndef BOOST_NO_RVALUE_REFERENCES
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	PlasticSkeleton(PlasticSkeleton &&other);
Toshihiro Shimizu 890ddd
	PlasticSkeleton &operator=(PlasticSkeleton &&other);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	friend class PlasticSkeletonDeformation; // Skeleton deformations can register to be notified
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	void addListener(PlasticSkeletonDeformation *deformation);
Toshihiro Shimizu 890ddd
	void removeListener(PlasticSkeletonDeformation *deformation);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
template class DVAPI TSmartPointerT<plasticskeleton>;</plasticskeleton>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef TSmartPointerT<plasticskeleton> PlasticSkeletonP;</plasticskeleton>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif // PLASTICSKELETON_H