11#include "Topology/PointSet.h"
20 auto smoothingLength = std::make_shared<FloatingNumber<DataType3f>>();
21 smoothingLength->varValue()->setValue(
Real(0.006));
22 this->animationPipeline()->pushModule(smoothingLength);
24 auto integrator = std::make_shared<ParticleIntegrator>();
25 this->stateTimeStep()->connect(integrator->inTimeStep());
26 this->statePosition()->connect(integrator->inPosition());
27 this->stateVelocity()->connect(integrator->inVelocity());
28 this->animationPipeline()->pushModule(integrator);
54 ParticleFluid::~ParticleFluid()
56 Log::sendMessage(Log::Info,
"ParticleFluid released \n");
59 void ParticleFluid::preUpdateStates()
61 auto emitters = this->getParticleEmitters();
63 int curNum = this->statePosition()->size();
64 int totalNum = curNum;
65 if (emitters.size() > 0)
67 for (
int i = 0; i < emitters.size(); i++)
69 totalNum += emitters[i]->sizeOfParticles();
72 if (totalNum > curNum)
80 pBuf.assign(this->statePosition()->getData());
81 vBuf.assign(this->stateVelocity()->getData());
82 fBuf.assign(this->stateForce()->getData());
85 this->statePosition()->resize(totalNum);
86 this->stateVelocity()->resize(totalNum);
89 this->stateForce()->resize(totalNum);
90 this->stateForce()->reset();
92 DArray<Vec3f>& new_pos = this->statePosition()->getData();
93 DArray<Vec3f>& new_vel = this->stateVelocity()->getData();
98 new_pos.assign(pBuf, curNum, 0, 0);
99 new_vel.assign(vBuf, curNum, 0, 0);
108 for (
int i = 0; i < emitters.size(); i++)
110 int num = emitters[i]->sizeOfParticles();
113 DArray<Vec3f>& points = emitters[i]->getPositions();
114 DArray<Vec3f>& vels = emitters[i]->getVelocities();
116 new_pos.assign(points, num, offset, 0);
117 new_vel.assign(vels, num, offset, 0);
128 if (!this->statePosition()->isEmpty())
130 auto ptSet = this->statePointSet()->getDataPtr();
131 int num = this->statePosition()->size();
132 auto& pts = ptSet->getPoints();
133 if (num != pts.size())
138 pts.assign(this->statePosition()->getData());
144 auto initials = this->getInitialStates();
146 if (initials.size() > 0)
150 for (
int i = 0; i < initials.size(); i++)
152 totalNum += initials[i]->statePosition()->size();
155 this->statePosition()->resize(totalNum);
156 this->stateVelocity()->resize(totalNum);
157 this->stateForce()->resize(totalNum);
158 this->stateForce()->reset();
162 DArray<Vec3f>& new_pos = this->statePosition()->getData();
163 DArray<Vec3f>& new_vel = this->stateVelocity()->getData();
164 DArray<Vec3f>& new_force = this->stateForce()->getData();
167 for (
int i = 0; i < initials.size(); i++)
169 auto inPos = initials[i]->statePosition()->getDataPtr();
170 auto inVel = initials[i]->stateVelocity()->getDataPtr();
171 if (!inPos->isEmpty())
173 uint num = inPos->size();
175 new_pos.assign(*inPos, num, offset, 0);
176 new_vel.assign(*inVel, num, offset, 0);
184 this->statePosition()->resize(0);
185 this->stateVelocity()->resize(0);
186 this->stateForce()->resize(0);
190 void ParticleFluid::resetStates()
194 if (!this->statePosition()->isEmpty())
196 auto points = this->statePointSet()->getDataPtr();
197 points->setPoints(this->statePosition()->getData());
201 auto points = this->statePointSet()->getDataPtr();
#define IMPLEMENT_CLASS(name)
void postUpdateStates() override
This class represents the base class for more advanced particle-based nodes.
This is an implementation of AdditiveCCD based on peridyno.