103 lines
3.1 KiB
C++
103 lines
3.1 KiB
C++
#ifndef PLASTICDEFORMER_H
|
|
#define PLASTICDEFORMER_H
|
|
|
|
#include <memory>
|
|
|
|
// TnzCore includes
|
|
#include "tgeometry.h"
|
|
#include "tmeshimage.h"
|
|
|
|
// TnzExt includes
|
|
#include "ext/plastichandle.h"
|
|
|
|
// STL includes
|
|
#include <vector>
|
|
|
|
// tcg includes
|
|
#include "tcg/tcg_list.h"
|
|
|
|
#undef DVAPI
|
|
#undef DVVAR
|
|
#ifdef TNZEXT_EXPORTS
|
|
#define DVAPI DV_EXPORT_API
|
|
#define DVVAR DV_EXPORT_VAR
|
|
#else
|
|
#define DVAPI DV_IMPORT_API
|
|
#define DVVAR DV_IMPORT_VAR
|
|
#endif
|
|
|
|
//**********************************************************************************************
|
|
// Plastic Deformation declaration
|
|
//**********************************************************************************************
|
|
|
|
/*!
|
|
The PlasticDeformer class implements an interactive mesh deformer.
|
|
|
|
\warning Objects of this class expect that the mesh and rigidities supplied on construction
|
|
remain \b constant throughout the deformer's lifetime. Deforming a changed mesh is not supported
|
|
and will typically result in a crash. Deforming a mesh whose vertex rigidities have been
|
|
\a deleted will result in a crash. Altering the rigidities results in undefined deformations
|
|
until the deformer is recompiled against them.
|
|
*/
|
|
class DVAPI PlasticDeformer
|
|
{
|
|
class Imp;
|
|
std::unique_ptr<Imp> m_imp;
|
|
|
|
public:
|
|
PlasticDeformer();
|
|
~PlasticDeformer();
|
|
|
|
friend void swap(PlasticDeformer &a, PlasticDeformer &b) { std::swap(a.m_imp, b.m_imp); }
|
|
|
|
/*!
|
|
Returns whether the last compilation procedure succeeded, or it either failed
|
|
or was never invoked after the last initialize() call.
|
|
*/
|
|
bool compiled() const;
|
|
|
|
/*!
|
|
Initializes a deformation on the specified mesh object.
|
|
*/
|
|
void initialize(const TTextureMeshP &mesh);
|
|
|
|
/*!
|
|
\brief Compiles the deformer against a group of deformation handles, and returns
|
|
whether the procedure was successful.
|
|
|
|
\note Accepts hints about the mesh face containing each handle; the hinted face
|
|
is checked before scanning the whole mesh. In case hints are supplied, they will be
|
|
returned with the correct face indices containing each handle.
|
|
|
|
\warning Requires a previous initialize() call. The compilation may legitimately
|
|
fail to process handle configurations that \a cannot result in suitable
|
|
deformations (eg, if more than 3 handles lie in the same mesh face).
|
|
*/
|
|
bool compile(const std::vector<PlasticHandle> &handles, int *faceHints = 0);
|
|
|
|
/*!
|
|
Applies the deformation specified with input handles deformed positions, returning
|
|
the deformed mesh vertices positions.
|
|
|
|
\note In case the compilation step failed or was never invoked, this function
|
|
will silently return the original, undeformed mesh vertices.
|
|
|
|
\warning Requires previous compile() invocation.
|
|
*/
|
|
void deform(const TPointD *dstHandlePos, double *dstVerticesCoords) const;
|
|
|
|
/*!
|
|
Releases data from the initialize() step that is unnecessary during deform().
|
|
|
|
\warning Initialization data is still necessary to invoke compile(), which will
|
|
therefore need to be preceded by a new call to initialize().
|
|
*/
|
|
void releaseInitializedData();
|
|
|
|
private:
|
|
// Not copyable
|
|
PlasticDeformer(const PlasticDeformer &);
|
|
PlasticDeformer &operator=(const PlasticDeformer &);
|
|
};
|
|
|
|
#endif // PLASTICDEFORMER_H
|