-
Notifications
You must be signed in to change notification settings - Fork 1
/
Cloth.h
executable file
·142 lines (113 loc) · 4 KB
/
Cloth.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
#pragma once
#include "util/MathUtil.h"
#include <Eigen/Sparse>
class cCloth
{
public:
enum eIntegrator
{
eIntegratorExplicit,
eIntegratorMidpoint,
eIntegratorTrapezoid,
eIntegratorImplicit,
eIntegratorMax
};
struct tParams
{
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
tVector mTopPos0;
tVector mTopPos1;
double mLength;
tVector mRes;
double mMass;
tVector mGravity;
double mStiffness;
double mDamping;
double mAirFriction;
tParams();
};
struct tPin
{
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
int mVert;
tVector mPos;
tPin();
};
cCloth();
virtual ~cCloth();
virtual void Init(const tParams& params);
virtual void Update(double timestep);
virtual int GetNumVerts() const;
virtual const tVector& GetRes() const;
virtual tVector GetVertPos(int id) const;
virtual void SetVertPos(int id, const tVector& pos);
virtual tVector GetVertVel(int id) const;
virtual void SetVertVel(int id, const tVector& vel);
virtual int AddPin(const tPin& pin);
virtual void ClearPins();
virtual int GetNumPins() const;
virtual int GetVertID(int u, int v) const;
virtual int GetNumEdges() const;
virtual void GetEdgePos(int e, tVector& out_pos0, tVector& out_pos1) const;
virtual eIntegrator GetIntegrator() const;
virtual void SetIntegrator(eIntegrator integrator);
virtual double GetStiffness() const;
virtual void SetStiffness(double stiffness);
virtual void ApplyForce(int id, const tVector& force);
protected:
struct tEdge
{
int mVert0;
int mVert1;
double mRestLen;
tEdge();
};
static const int gPosDim;
static const int gVelDim;
static const int gVertDim;
tParams mParams;
Eigen::VectorXd mX;
Eigen::VectorXd mV;
Eigen::VectorXd mForceBuffer;
// temporary memory buffers used for intermediate computation
Eigen::VectorXd mTempX;
Eigen::VectorXd mTempV;
Eigen::VectorXd mdX;
Eigen::VectorXd mdV;
Eigen::VectorXd mdX1;
Eigen::VectorXd mdV1;
Eigen::VectorXd mExternalForces;
Eigen::VectorXd mY;
Eigen::SparseMatrix<double> mJ;
Eigen::SparseLU<Eigen::SparseMatrix<double>> mSolver;
Eigen::VectorXi mIsPinned;
std::vector<tEdge, Eigen::aligned_allocator<tEdge>> mEdges;
std::vector<tPin, Eigen::aligned_allocator<tPin>> mPins;
eIntegrator mIntegrator;
virtual void InitBuffers();
virtual void InitJacobian();
virtual void BuildVerts();
virtual void BuildEdges();
virtual void AddEdge(const tEdge& edge);
virtual double GetVertInvMass(int id) const;
virtual bool IsVertPinned(int id) const;
virtual void ClearForces();
virtual void IntegrateForward(double timestep, const Eigen::VectorXd& X, const Eigen::VectorXd& V,
Eigen::VectorXd& out_X, Eigen::VectorXd& out_V);
virtual void IntegrateMidpoint(double timestep, const Eigen::VectorXd& X, const Eigen::VectorXd& V,
Eigen::VectorXd& out_X, Eigen::VectorXd& out_V);
virtual void IntegrateTrapezoid(double timestep, const Eigen::VectorXd& X, const Eigen::VectorXd& V,
Eigen::VectorXd& out_X, Eigen::VectorXd& out_V);
virtual void IntegrateImplicit(double timestep, const Eigen::VectorXd& X, const Eigen::VectorXd& V,
Eigen::VectorXd& out_X, Eigen::VectorXd& out_V);
virtual void EvalDerivative(const Eigen::VectorXd& X, const Eigen::VectorXd& V, Eigen::VectorXd& out_dX, Eigen::VectorXd& out_dV);
virtual void BuildJacobian(const Eigen::VectorXd& X, const Eigen::VectorXd& V, Eigen::SparseMatrix<double>& out_J) const;
virtual void ClearSparseMat(double val, Eigen::SparseMatrix<double>& out_J) const;
virtual void ApplyGravity(Eigen::VectorXd& out_F) const;
virtual void ApplyAirFriction(const Eigen::VectorXd& V, Eigen::VectorXd& out_F) const;
virtual void ApplyInternalForces(const Eigen::VectorXd& X, const Eigen::VectorXd& V, Eigen::VectorXd& out_F) const;
virtual void ApplyConstraints(Eigen::VectorXd& out_X, Eigen::VectorXd& out_V) const;
virtual tVector GetVertData(int idx, const Eigen::VectorXd& data) const;
virtual void SetVertData(int idx, const tVector& x, Eigen::VectorXd& out_data) const;
virtual void AddVertData(int idx, const tVector& x, Eigen::VectorXd& out_data) const;
};