32 auto smoothingLength = this->
animationPipeline()->template createModule<FloatingNumber<TDataType>>();
33 smoothingLength->varValue()->setValue(
Real(0.006));
35 auto samplingDistance = this->
animationPipeline()->template createModule<FloatingNumber<TDataType>>();
36 samplingDistance->varValue()->setValue(
Real(0.005));
38 auto integrator = std::make_shared<ParticleIntegrator<TDataType>>();
39 this->stateTimeStep()->connect(integrator->inTimeStep());
40 this->statePosition()->connect(integrator->inPosition());
41 this->stateVelocity()->connect(integrator->inVelocity());
44 auto nbrQuery = std::make_shared<NeighborPointQuery<TDataType>>();
45 smoothingLength->outFloating()->connect(nbrQuery->inRadius());
46 this->statePosition()->connect(nbrQuery->inPosition());
49 auto density = std::make_shared<SemiImplicitDensitySolver<TDataType>>();
50 smoothingLength->outFloating()->connect(density->inSmoothingLength());
51 samplingDistance->outFloating()->connect(density->inSamplingDistance());
52 this->stateTimeStep()->connect(density->inTimeStep());
53 this->statePosition()->connect(density->inPosition());
54 this->stateVelocity()->connect(density->inVelocity());
55 nbrQuery->outNeighborIds()->connect(density->inNeighborIds());
58 auto viscosity = std::make_shared<ImplicitViscosity<TDataType>>();
59 viscosity->varViscosity()->setValue(
Real(1.0));
60 this->stateTimeStep()->connect(viscosity->inTimeStep());
61 smoothingLength->outFloating()->connect(viscosity->inSmoothingLength());
62 samplingDistance->outFloating()->connect(viscosity->inSamplingDistance());
63 this->statePosition()->connect(viscosity->inPosition());
64 this->stateVelocity()->connect(viscosity->inVelocity());
65 nbrQuery->outNeighborIds()->connect(viscosity->inNeighborIds());
69 auto calculateNorm = std::make_shared<CalculateNorm<DataType3f>>();
70 this->stateVelocity()->connect(calculateNorm->inVec());
73 auto colorMapper = std::make_shared<ColorMapping<DataType3f>>();
74 colorMapper->varMax()->setValue(5.0f);
75 calculateNorm->outNorm()->connect(colorMapper->inScalar());
78 auto ptRender = std::make_shared<GLPointVisualModule>();
79 ptRender->varPointSize()->setValue(0.0035f);
80 ptRender->setColor(
Color(1, 0, 0));
81 ptRender->setColorMapMode(GLPointVisualModule::PER_VERTEX_SHADER);
83 this->statePointSet()->connect(ptRender->inPointSet());
84 colorMapper->outColor()->connect(ptRender->inColor());
100 auto emitters = this->getParticleEmitters();
102 int curNum = this->statePosition()->size();
103 int totalNum = curNum;
104 if (emitters.size() > 0)
106 for (
int i = 0; i < emitters.size(); i++)
108 totalNum += emitters[i]->sizeOfParticles();
111 if (totalNum > curNum)
118 pBuf.assign(this->statePosition()->getData());
119 vBuf.assign(this->stateVelocity()->getData());
122 this->statePosition()->resize(totalNum);
123 this->stateVelocity()->resize(totalNum);
131 new_pos.assign(pBuf, curNum, 0, 0);
132 new_vel.assign(vBuf, curNum, 0, 0);
140 for (
int i = 0; i < emitters.size(); i++)
142 int num = emitters[i]->sizeOfParticles();
148 new_pos.assign(points, num, offset, 0);
149 new_vel.assign(vels, num, offset, 0);
157 if (this->varReshuffleParticles()->getValue())
159 auto& pos = this->statePosition()->getData();
160 auto& vel = this->stateVelocity()->getData();
174 auto initials = this->getInitialStates();
176 if (initials.size() > 0)
180 for (
int i = 0; i < initials.size(); i++)
182 totalNum += initials[i]->statePosition()->size();
185 this->statePosition()->resize(totalNum);
186 this->stateVelocity()->resize(totalNum);
194 for (
int i = 0; i < initials.size(); i++)
196 auto inPos = initials[i]->statePosition()->getDataPtr();
197 auto inVel = initials[i]->stateVelocity()->getDataPtr();
198 if (!inPos->isEmpty())
200 uint num = inPos->size();
202 new_pos.assign(*inPos, num, offset, 0);
203 new_vel.assign(*inVel, num, offset, 0);
211 this->statePosition()->resize(0);
212 this->stateVelocity()->resize(0);
void reshuffleParticles()
void preUpdateStates() override
~ParticleFluid() override
void resetStates() override
static void reorderParticles(DArray< Coord > &pos, DArray< Coord > &vel, DArray< OcKey > &morton)
static void calculateMortonCode(DArray< OcKey > &morton, DArray< Coord > &pos, Real d)