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.