[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