[Bf-blender-cvs] [e3850739a0b] fluid-mantaflow: added support for particle velocities
Sebastián Barschkis
noreply at git.blender.org
Thu Jun 15 13:54:02 CEST 2017
Commit: e3850739a0bf84ec481f14e3edad9eca006ef9f5
Author: Sebastián Barschkis
Date: Wed Jun 14 21:12:51 2017 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rBe3850739a0bf84ec481f14e3edad9eca006ef9f5
added support for particle velocities
now saving and loading particle velocities from uni files
===================================================================
M intern/mantaflow/extern/manta_fluid_API.h
M intern/mantaflow/intern/FLUID.cpp
M intern/mantaflow/intern/FLUID.h
M intern/mantaflow/intern/manta_fluid_API.cpp
M intern/mantaflow/intern/strings/liquid_script.h
M source/blender/blenkernel/intern/particle_system.c
M source/blender/blenkernel/intern/pointcache.c
===================================================================
diff --git a/intern/mantaflow/extern/manta_fluid_API.h b/intern/mantaflow/extern/manta_fluid_API.h
index 542db9c18e5..bdbd21a774a 100644
--- a/intern/mantaflow/extern/manta_fluid_API.h
+++ b/intern/mantaflow/extern/manta_fluid_API.h
@@ -93,6 +93,7 @@ float *liquid_get_phiout(struct FLUID *liquid);
void liquid_ensure_init(struct FLUID *liquid, struct SmokeModifierData *smd);
void liquid_save_mesh(struct FLUID *liquid, char *filename);
void liquid_save_particles(struct FLUID *liquid, char *filename);
+void liquid_save_particle_velocities(struct FLUID *liquid, char *filename);
void liquid_save_data(struct FLUID *liquid, char *pathname);
void liquid_load_data(struct FLUID *liquid, char *pathname);
int liquid_get_num_verts(struct FLUID *liquid);
@@ -115,6 +116,9 @@ int liquid_get_particle_flag_at(struct FLUID *liquid, int i);
float liquid_get_particle_position_x_at(struct FLUID *liquid, int i);
float liquid_get_particle_position_y_at(struct FLUID *liquid, int i);
float liquid_get_particle_position_z_at(struct FLUID *liquid, int i);
+float liquid_get_particle_velocity_x_at(struct FLUID *liquid, int i);
+float liquid_get_particle_velocity_y_at(struct FLUID *liquid, int i);
+float liquid_get_particle_velocity_z_at(struct FLUID *liquid, int i);
void liquid_update_mesh_data(struct FLUID *liquid, char *filename);
void liquid_update_particle_data(struct FLUID *liquid, char* filename);
void liquid_save_mesh_high(struct FLUID *liquid, char *filename);
diff --git a/intern/mantaflow/intern/FLUID.cpp b/intern/mantaflow/intern/FLUID.cpp
index e8b4f824bf9..49578b44293 100644
--- a/intern/mantaflow/intern/FLUID.cpp
+++ b/intern/mantaflow/intern/FLUID.cpp
@@ -341,6 +341,7 @@ void FLUID::initLiquid(SmokeModifierData *smd)
+ liquid_init_phi
+ liquid_save_mesh_low
+ liquid_save_particles_low
+ + liquid_save_particle_velocities
+ liquid_export_low
+ liquid_import_low
+ liquid_adaptive_step
@@ -954,7 +955,7 @@ void FLUID::updateParticleData(const char* filename)
{
gzFile gzf;
float fbuffer[3];
- int ibuffer;
+ int ibuffer[4];
gzf = (gzFile) BLI_gzopen(filename, "rb1"); // do some compression
if (!gzf)
@@ -975,10 +976,7 @@ void FLUID::updateParticleData(const char* filename)
unsigned long long timestamp; // creation time
// read particle header
- gzread(gzf, &mNumParticles, sizeof(int));
- gzread(gzf, &mParticleDimX, sizeof(int));
- gzread(gzf, &mParticleDimY, sizeof(int));
- gzread(gzf, &mParticleDimZ, sizeof(int));
+ gzread(gzf, &ibuffer, sizeof(int) * 4); // num particles, dimX, dimY, dimZ
gzread(gzf, &elementType, sizeof(int));
gzread(gzf, &bytesPerElement, sizeof(int));
gzread(gzf, &info, sizeof(info));
@@ -987,14 +985,25 @@ void FLUID::updateParticleData(const char* filename)
if (with_debug)
std::cout << "read particles , num particles " << mNumParticles << " , in file: "<< filename << std::endl;
- // Sanity check
+ // Sanity checks
const int partSysSize = sizeof(float) * 3 + sizeof(int);
if (! (bytesPerElement == partSysSize) && (elementType == 0)){
std::cout << "particle type doesn't match" << std::endl;
}
+ if (!ibuffer[0]) { // Any particles present?
+ if (with_debug) std::cout << "no particles present yet" << std::endl;
+ return;
+ }
- if (mNumParticles)
+ // Reading base particle system file v2
+ if (!strcmp(ID, "PB02"))
{
+ // Only set head fields when read from particle system and not from pdata files (possibly incomplete)
+ mNumParticles = ibuffer[0];
+ mParticleDimX = ibuffer[1];
+ mParticleDimY = ibuffer[2];
+ mParticleDimZ = ibuffer[3];
+
mParticlePositionsX.resize(mNumParticles);
mParticlePositionsY.resize(mNumParticles);
mParticlePositionsZ.resize(mNumParticles);
@@ -1007,8 +1016,26 @@ void FLUID::updateParticleData(const char* filename)
mParticlePositionsY[i] = fbuffer[1];
mParticlePositionsZ[i] = fbuffer[2];
+// std::cout << "Positions are: [" << mParticlePositionsX[i] << ", " << mParticlePositionsY[i] << "," << mParticlePositionsZ[i] << "]" << std::endl;
+
gzread(gzf, &ibuffer, sizeof(int));
- mParticleFlags[i] = ibuffer;
+ mParticleFlags[i] = ibuffer[0];
+ }
+ }
+ // Reading particle data file v1 with velocities
+ else if (!strcmp(ID, "PD01")) {
+ mParticleVelocitiesX.resize(mNumParticles);
+ mParticleVelocitiesY.resize(mNumParticles);
+ mParticleVelocitiesZ.resize(mNumParticles);
+
+ for (int i = 0; i < mNumParticles; ++i) {
+ gzread(gzf, fbuffer, sizeof(float) * 3);
+
+ mParticleVelocitiesX[i] = fbuffer[0];
+ mParticleVelocitiesY[i] = fbuffer[1];
+ mParticleVelocitiesZ[i] = fbuffer[2];
+
+// std::cout << "Velocities are: [" << mParticleVelocitiesX[i] << ", " << mParticleVelocitiesY[i] << "," << mParticleVelocitiesZ[i] << "]" << std::endl;
}
}
@@ -1147,6 +1174,19 @@ void FLUID::saveParticles(char* filename)
runPythonString(mCommands);
}
+void FLUID::saveParticleVelocities(char* filename)
+{
+ std::string path(filename);
+
+ mCommands.clear();
+ std::ostringstream save_particles_velocities;
+
+ save_particles_velocities << "save_particles_velocities_" << mCurrentID << "(r'" << path << "')";
+ mCommands.push_back(save_particles_velocities.str());
+
+ runPythonString(mCommands);
+}
+
void FLUID::saveSmokeData(char *pathname)
{
std::string path(pathname);
diff --git a/intern/mantaflow/intern/FLUID.h b/intern/mantaflow/intern/FLUID.h
index 4d17a608d33..4fb0b86da9f 100644
--- a/intern/mantaflow/intern/FLUID.h
+++ b/intern/mantaflow/intern/FLUID.h
@@ -72,6 +72,7 @@ public:
// Write files for particles
void saveParticles(char* filename);
+ void saveParticleVelocities(char* filename);
// Load files for liquids
void loadLiquidData(char *pathname);
@@ -161,6 +162,10 @@ public:
inline float getParticlePositionYAt(int i) { return mParticlePositionsY[i]; }
inline float getParticlePositionZAt(int i) { return mParticlePositionsZ[i]; }
+ inline float getParticleVelocityXAt(int i) { return mParticleVelocitiesX[i]; }
+ inline float getParticleVelocityYAt(int i) { return mParticleVelocitiesY[i]; }
+ inline float getParticleVelocityZAt(int i) { return mParticleVelocitiesZ[i]; }
+
void updateMeshData(const char* filename);
void updateParticleData(const char* filename);
@@ -254,6 +259,9 @@ private:
std::vector<float> mParticlePositionsX;
std::vector<float> mParticlePositionsY;
std::vector<float> mParticlePositionsZ;
+ std::vector<float> mParticleVelocitiesX;
+ std::vector<float> mParticleVelocitiesY;
+ std::vector<float> mParticleVelocitiesZ;
void initDomain(struct SmokeModifierData *smd);
void initDomainHigh(struct SmokeModifierData *smd);
diff --git a/intern/mantaflow/intern/manta_fluid_API.cpp b/intern/mantaflow/intern/manta_fluid_API.cpp
index e8ea0f0dc5c..2589b23b8f7 100644
--- a/intern/mantaflow/intern/manta_fluid_API.cpp
+++ b/intern/mantaflow/intern/manta_fluid_API.cpp
@@ -507,6 +507,13 @@ extern "C" void liquid_save_particles(FLUID *liquid, char *filename)
}
}
+extern "C" void liquid_save_particle_velocities(FLUID *liquid, char *filename)
+{
+ if (liquid) {
+ liquid->saveParticleVelocities(filename);
+ }
+}
+
extern "C" void liquid_save_mesh_high(FLUID *liquid, char *filename)
{
if (liquid) {
@@ -642,6 +649,21 @@ extern "C" float liquid_get_particle_position_z_at(FLUID *liquid, int i)
return liquid->getParticlePositionZAt(i);
}
+extern "C" float liquid_get_particle_velocity_x_at(FLUID *liquid, int i)
+{
+ return liquid->getParticleVelocityXAt(i);
+}
+
+extern "C" float liquid_get_particle_velocity_y_at(FLUID *liquid, int i)
+{
+ return liquid->getParticleVelocityYAt(i);
+}
+
+extern "C" float liquid_get_particle_velocity_z_at(FLUID *liquid, int i)
+{
+ return liquid->getParticleVelocityZAt(i);
+}
+
extern "C" void liquid_update_mesh_data(FLUID *liquid, char* filename)
{
liquid->updateMeshData(filename);
diff --git a/intern/mantaflow/intern/strings/liquid_script.h b/intern/mantaflow/intern/strings/liquid_script.h
index 05d1c508b8e..75c077c73c1 100644
--- a/intern/mantaflow/intern/strings/liquid_script.h
+++ b/intern/mantaflow/intern/strings/liquid_script.h
@@ -290,6 +290,10 @@ const std::string liquid_save_particles_low = "\n\
def save_particles_low_$ID$(path):\n\
pp_s$ID$.save(path)\n";
+const std::string liquid_save_particle_velocities = "\n\
+def save_particles_velocities_$ID$(path):\n\
+ pVel_s$ID$.save(path)\n";
+
const std::string liquid_import_low = "\n\
def load_liquid_data_low_$ID$(path):\n\
flags_s$ID$.load(path + '_flags.uni')\n\
diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c
index 483daf02f35..1b3cf3d60e6 100644
--- a/source/blender/blenkernel/intern/particle_system.c
+++ b/source/blender/blenkernel/intern/particle_system.c
@@ -3838,9 +3838,11 @@ static void particles_manta_step(ParticleSimulationData *sim, int UNUSED(cfra),
// printf("pa->state.co[0]: %f, pa->state.co[1]: %f, pa->state.co[2]: %f\n", pa->state.co[0], pa->state.co[1], pa->state.co[2]);
// set particle velocity
- pa->state.vel[0] = 0; // TODO (sebbas): manta stores particle velocities in separate pvel vector.
- pa->state.vel[1] = 0;
- pa->state.vel[2] = 0;
+ pa->state.vel[0] = liquid_get_particle_velocity_x_at(sds->fluid, p);
+ pa->state.vel[1] = liquid_get_particle_velocity_y_at(sds->fluid, p);
+ pa->state.vel[2] = liquid_get_particle_velocity_z_at(sds->fluid, p);
+
+// printf("pa->state.vel[0]: %f, pa->state.vel[1]: %f, pa->state.vel[2]: %f\n", pa->state.vel[0], pa->state.vel[1], pa->state.vel[2]);
// set default angular velocity and particle rotation
zero_v3(pa->state.ave);
diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index fc5fb48e220..8e80b269a7c 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1292,6 +1292,7 @@ static int ptcache_mesh_read(void *smoke_v, char *filename, char *pathname, bool
static int ptcache_uni_read(void *smoke_v, char *filename, char *pathname, bool load_liquid_data)
{
SmokeModifierData *smd = (SmokeModifierData *) smoke_v;
+ int i;
if (!smd) {
return 0;
@@ -1310,6 +1311,12 @@ static
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list