PeriDyno 1.0.0
Loading...
Searching...
No Matches
Cloth.cpp
Go to the documentation of this file.
1#include "Cloth.h"
2#include "Topology/TriangleSet.h"
3#include "Topology/PointSet.h"
5
6#include "ParticleSystem/Module/ParticleIntegrator.h"
7
8#include "Collision/NeighborPointQuery.h"
9
12#include "Module/FixedPoints.h"
13
15
16#include "SharedFunc.h"
17#include "TriangularSystem.h"
18
19#include "GLPointVisualModule.h"
22
23namespace dyno
24{
25 IMPLEMENT_TCLASS(Cloth, TDataType)
26
27 template<typename TDataType>
29 : TriangularSystem<TDataType>()
30 {
31 this->varHorizon()->attach(
32 std::make_shared<FCallBackFunc>(
33 [=]() {
34 this->stateHorizon()->setValue(this->varHorizon()->getValue());
35 })
36 );
37
38 this->varHorizon()->setValue(0.0085);
39
40 auto integrator = std::make_shared<ParticleIntegrator<TDataType>>();
41 this->stateTimeStep()->connect(integrator->inTimeStep());
42 this->statePosition()->connect(integrator->inPosition());
43 this->stateVelocity()->connect(integrator->inVelocity());
44
45 this->animationPipeline()->pushModule(integrator);
46
47 auto elasticity = std::make_shared<LinearElasticitySolver<TDataType>>();
48 this->stateHorizon()->connect(elasticity->inHorizon());
49 this->stateTimeStep()->connect(elasticity->inTimeStep());
50 this->stateRestPosition()->connect(elasticity->inX());
51 this->statePosition()->connect(elasticity->inY());
52 this->stateVelocity()->connect(elasticity->inVelocity());
53 this->stateBonds()->connect(elasticity->inBonds());
54 this->animationPipeline()->pushModule(elasticity);
55
56 auto pointRenderer = std::make_shared<GLPointVisualModule>();
57 pointRenderer->setColor(Color(1, 0.2, 1));
58 pointRenderer->setColorMapMode(GLPointVisualModule::PER_OBJECT_SHADER);
59 pointRenderer->varPointSize()->setValue(0.002f);
60 this->stateTriangleSet()->connect(pointRenderer->inPointSet());
61 this->stateVelocity()->connect(pointRenderer->inColor());
62
63 this->graphicsPipeline()->pushModule(pointRenderer);
64 this->setVisible(true);
65
66 auto wireRenderer = std::make_shared<GLWireframeVisualModule>();
67 wireRenderer->varBaseColor()->setValue(Color(1.0, 0.8, 0.8));
68 wireRenderer->varRadius()->setValue(0.001f);
69 wireRenderer->varRenderMode()->setCurrentKey(GLWireframeVisualModule::CYLINDER);
70 this->stateTriangleSet()->connect(wireRenderer->inEdgeSet());
71 this->graphicsPipeline()->pushModule(wireRenderer);
72
73 auto surfaceRenderer = std::make_shared<GLSurfaceVisualModule>();
74 this->stateTriangleSet()->connect(surfaceRenderer->inTriangleSet());
75 this->graphicsPipeline()->pushModule(surfaceRenderer);
76 }
77
78 template<typename TDataType>
83
84 template<typename TDataType>
86 {
87 auto input = this->inTriangleSet()->getDataPtr();
88
89 auto ts = this->stateTriangleSet()->getDataPtr();
90
91 ts->copyFrom(*input);
92
94 ts->requestPointNeighbors(nbr);
95 auto& pts = ts->getPoints();
96
97 this->statePosition()->resize(pts.size());
98 this->stateVelocity()->resize(pts.size());
99
100 this->statePosition()->assign(pts);
101 this->stateVelocity()->reset();
102
103 if (this->stateBonds()->isEmpty()) {
104 this->stateBonds()->allocate();
105 }
106
107 auto nbrPtr = this->stateBonds()->getDataPtr();
108
109 this->stateOldPosition()->assign(this->statePosition()->getData());
110 this->stateRestPosition()->assign(this->statePosition()->getData());
111
112 constructRestShapeWithSelf(*nbrPtr, nbr, this->statePosition()->getData());
113
114 nbr.clear();
115 }
116
117 template<typename TDataType>
119 {
120 auto& posOld = this->stateOldPosition()->getData();
121 auto& posNew = this->statePosition()->getData();
122
123 posOld.assign(posNew);
124 }
125
127}
#define DEFINE_CLASS(name)
Definition Object.h:140
#define IMPLEMENT_TCLASS(name, T1)
Definition Object.h:103
Peridynamics-based cloth.
Definition Cloth.h:13
~Cloth() override
Definition Cloth.cpp:79
void resetStates() override
Definition Cloth.cpp:85
void preUpdateStates() override
Definition Cloth.cpp:118
std::shared_ptr< GraphicsPipeline > graphicsPipeline()
Definition Node.cpp:320
std::shared_ptr< AnimationPipeline > animationPipeline()
Definition Node.cpp:311
virtual void setVisible(bool visible)
Set the visibility of context.
Definition Node.cpp:88
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
ArrayList< ElementType, DeviceType::GPU > DArrayList
Definition ArrayList.inl:83
void constructRestShapeWithSelf(DArrayList< Bond > &shape, DArrayList< int > &nbr, DArray< Coord > &pos)