Shinya Kitaoka 810553
#pragma once
Shinya Kitaoka 810553
Toshihiro Shimizu 890ddd
#ifndef PLASTICSKELETON_H
Toshihiro Shimizu 890ddd
#define PLASTICSKELETON_H
Toshihiro Shimizu 890ddd
Shinya Kitaoka 262a92
#include <memory></memory>
Shinya Kitaoka 262a92
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
Shinya Kitaoka 120a6e
#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.
Shinya Kitaoka d1f6c4
struct DVAPI PlasticSkeletonVertex final : public tcg::Vertex<tpointd>,</tpointd>
Shinya Kitaoka d1f6c4
                                           public TPersist {
Shinya Kitaoka 120a6e
  PERSIST_DECLARATION(PlasticSkeletonVertex)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  friend class PlasticSkeleton;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  QString m_name;  //!< Vertex name
Shinya Kitaoka 120a6e
  int m_number;    //!< Vertex \a number - assigned persistently upon addition
Shinya Kitaoka 120a6e
  //!< in a skeleton
Shinya Kitaoka 120a6e
  int m_parent;  //!< Index of the parent vertex in the skeleton
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  // Tool data
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  double m_minAngle, m_maxAngle;  //!< Minimum and maximum accepted angles when
Shinya Kitaoka 38fd86
                                  //! updating the vertex
Shinya Kitaoka 38fd86
  //!< position with the mouse. In degrees.
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  // Handle data
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool m_interpolate;  //!< Whether the vertex needs to be interpolated (see
Shinya Kitaoka 38fd86
                       //! plasticdeformer.h)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  PlasticSkeletonVertex();
Shinya Kitaoka 120a6e
  explicit PlasticSkeletonVertex(const TPointD &pos);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  operator PlasticHandle() const;
Shinya Kitaoka 120a6e
  operator TPointD() const { return P(); }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  const QString &name() const { return m_name; }
Shinya Kitaoka 120a6e
  int number() const { return m_number; }  // Should be removed
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int parent() const { return m_parent; }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void saveData(TOStream &os) override;
Shinya Kitaoka 473e70
  void loadData(TIStream &is) override;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//************************************************************************************
Toshihiro Shimizu 890ddd
//    PlasticSkeleton  declaration
Toshihiro Shimizu 890ddd
//************************************************************************************
Toshihiro Shimizu 890ddd
Shinya Kitaoka d1f6c4
class DVAPI PlasticSkeleton final
Shinya Kitaoka 120a6e
    : public TSmartObject,
Shinya Kitaoka 120a6e
      public tcg::Mesh<plasticskeletonvertex, tcg::edge,="" tcg::facen<3="">>,</plasticskeletonvertex,>
Shinya Kitaoka 120a6e
      public TPersist {
Shinya Kitaoka 120a6e
  DECLARE_CLASS_CODE
Shinya Kitaoka 120a6e
  PERSIST_DECLARATION(PlasticSkeleton)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  class Imp;
Shinya Kitaoka 120a6e
  std::unique_ptr<imp> m_imp;</imp>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  typedef tcg::Mesh<plasticskeletonvertex, tcg::edge,="" tcg::facen<3="">> mesh_type;</plasticskeletonvertex,>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  PlasticSkeleton();
Shinya Kitaoka 120a6e
  PlasticSkeleton(const PlasticSkeleton &other);
Shinya Kitaoka 120a6e
  ~PlasticSkeleton();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  PlasticSkeleton &operator=(const PlasticSkeleton &other);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int parentVertex(int v) { return vertex(v).m_parent; }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void moveVertex(int v, const TPointD &pos);  //!< Moves a vertex to the
Shinya Kitaoka 38fd86
                                               //! specified position, informing
Shinya Kitaoka 38fd86
  //! associated deformers
Shinya Kitaoka 120a6e
  int addVertex(const PlasticSkeletonVertex &vx,
Shinya Kitaoka 120a6e
                int parent);  //!< Adds a vertex to the skeleton
Shinya Kitaoka 120a6e
  int insertVertex(const PlasticSkeletonVertex &vx,
Shinya Kitaoka 120a6e
                   int e);  //!< Inserts a vertex splitting an existing edge
Shinya Kitaoka 120a6e
  //!< \note Inserted Vertex will connect to parent first
Shinya Kitaoka 120a6e
  int insertVertex(
Shinya Kitaoka 120a6e
      const PlasticSkeletonVertex &vx,
Shinya Kitaoka 120a6e
      int parent,  //!< Generalization of vertex addition/insertion,
Shinya Kitaoka 120a6e
      const std::vector<int></int>
Shinya Kitaoka 120a6e
          &children);  //!< it is useful as inverse of vertex removal.
Shinya Kitaoka 120a6e
  void removeVertex(
Shinya Kitaoka 120a6e
      int v);  //!< Removes a vertex, reattaching all its children to parent
Shinya Kitaoka 120a6e
  void clear();
Shinya Kitaoka 120a6e
  void squeeze();
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  bool setVertexName(int v, const QString &name);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 473e70
  void saveData(TOStream &os) override;
Shinya Kitaoka 473e70
  void loadData(TIStream &is) override;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // Utility functions
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  int closestVertex(const TPointD &pos, double *distance = 0) const;
Shinya Kitaoka 120a6e
  int closestEdge(const TPointD &pos, double *distance = 0) const;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  std::vector<plastichandle> verticesToHandles() const;</plastichandle>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  // RValues-related functions
Shinya Kitaoka 120a6e
  PlasticSkeleton(PlasticSkeleton &&other);
Shinya Kitaoka 120a6e
  PlasticSkeleton &operator=(PlasticSkeleton &&other);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Shinya Kitaoka 120a6e
  friend class PlasticSkeletonDeformation;  // Skeleton deformations can
Shinya Kitaoka 120a6e
                                            // register to be notified
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  void addListener(PlasticSkeletonDeformation *deformation);
Shinya Kitaoka 120a6e
  void removeListener(PlasticSkeletonDeformation *deformation);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===============================================================================
Toshihiro Shimizu 890ddd
Shinya Kitaoka 9f5a1b
#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
Shinya Kitaoka 120a6e
#endif  // PLASTICSKELETON_H