[Bf-blender-cvs] [0ba55c3] fluid-mantaflow: hooked up blender kernel code to work with obstacle adaptions in liquid script

Sebastián Barschkis noreply at git.blender.org
Mon Oct 3 19:47:57 CEST 2016


Commit: 0ba55c3c39aecb1fa5785f73c8bbe6e6389b72eb
Author: Sebastián Barschkis
Date:   Tue Sep 20 00:45:25 2016 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rB0ba55c3c39aecb1fa5785f73c8bbe6e6389b72eb

hooked up blender kernel code to work with obstacle adaptions in liquid script

===================================================================

M	source/blender/blenkernel/intern/smoke.c

===================================================================

diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index af4b21e..131804b 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -798,6 +798,7 @@ typedef struct ObstaclesFromDMData {
 	float *vert_vel;
 	float *velocityX, *velocityY, *velocityZ;
 	int *num_obstacles;
+	float *distances_map;
 } ObstaclesFromDMData;
 
 static void obstacles_from_derivedmesh_task_cb(void *userdata, const int z)
@@ -851,13 +852,17 @@ static void obstacles_from_derivedmesh_task_cb(void *userdata, const int z)
 					data->num_obstacles[index]++;
 				}
 			}
+			
+			if (sds->type == MOD_SMOKE_DOMAIN_TYPE_LIQUID) {
+				update_mesh_distances(index, data->distances_map, data->tree, sds->cell_size, ray_start);
+			}
 		}
 	}
 }
 
 static void obstacles_from_derivedmesh(
         Object *coll_ob, SmokeDomainSettings *sds, SmokeCollSettings *scs,
-        unsigned char *obstacle_map, float *velocityX, float *velocityY, float *velocityZ, int *num_obstacles, float dt)
+        unsigned char *obstacle_map, float *distances_map, float *velocityX, float *velocityY, float *velocityZ, int *num_obstacles, float dt)
 {
 	if (!scs->dm) return;
 	{
@@ -929,7 +934,7 @@ static void obstacles_from_derivedmesh(
 			    .tree = &treeData, .obstacle_map = obstacle_map,
 			    .has_velocity = has_velocity, .vert_vel = vert_vel,
 			    .velocityX = velocityX, .velocityY = velocityY, .velocityZ = velocityZ,
-			    .num_obstacles = num_obstacles
+			    .num_obstacles = num_obstacles, .distances_map = distances_map
 			};
 			BLI_task_parallel_range(
 			            sds->res_min[2], sds->res_max[2], &data, obstacles_from_derivedmesh_task_cb, true);
@@ -964,6 +969,7 @@ static void update_obstacles(Scene *scene, Object *ob, SmokeDomainSettings *sds,
 	float *g = smoke_get_color_g(sds->fluid);
 	float *b = smoke_get_color_b(sds->fluid);
 	float *phi = liquid_get_phi(sds->fluid);
+	float *phiObsInit = liquid_get_phiobsinit(sds->fluid);
 	unsigned int z;
 
 	int *num_obstacles = MEM_callocN(sizeof(int) * sds->res[0] * sds->res[1] * sds->res[2], "smoke_num_obstacles");
@@ -999,7 +1005,7 @@ static void update_obstacles(Scene *scene, Object *ob, SmokeDomainSettings *sds,
 		if ((smd2->type & MOD_SMOKE_TYPE_COLL) && smd2->coll)
 		{
 			SmokeCollSettings *scs = smd2->coll;
-			obstacles_from_derivedmesh(collob, sds, scs, obstacles, velx, vely, velz, num_obstacles, dt);
+			obstacles_from_derivedmesh(collob, sds, scs, obstacles, phiObsInit, velx, vely, velz, num_obstacles, dt);
 		}
 	}
 
@@ -2260,12 +2266,17 @@ static void adjustDomainResolution(SmokeDomainSettings *sds, int new_shift[3], E
 	}
 }
 
-BLI_INLINE void apply_outflow_fields(int index, float inflow_value, float *density, float *heat, float *fuel, float *react, float *color_r, float *color_g, float *color_b, float *phi, unsigned char *obstacle)
+BLI_INLINE void apply_outflow_fields(int index, float inflow_value, float *density, float *heat, float *fuel, float *react, float *color_r, float *color_g, float *color_b, float *phi, float *phiobsinit, unsigned char *obstacle)
 {
 	/* set liquid outflow */
 	if (phi) {
 		phi[index] = 0.5f; // mantaflow convention
 	}
+	if (phiobsinit) {
+		phiobsinit[index] = 0.0f;
+	}
+	
+	/* set outflow flags */
 	if (obstacle && inflow_value < 0.f) { // only set outflow inside mesh
 //		obstacle[index] = 20; // TODO (sebbas) mantaflow convention (FlagOutflow | FlagEmpty)
 	}
@@ -2612,7 +2623,8 @@ static void update_flowsfluids(Scene *scene, Object *ob, SmokeDomainSettings *sd
 				float *velocity_x = smoke_get_velocity_x(sds->fluid);
 				float *velocity_y = smoke_get_velocity_y(sds->fluid);
 				float *velocity_z = smoke_get_velocity_z(sds->fluid);
-				float *phi = liquid_get_phiinit(sds->fluid);
+				float *phiinit = liquid_get_phiinit(sds->fluid);
+				float *phiobsinit = liquid_get_phiobsinit(sds->fluid);
 				unsigned char *obstacle = smoke_get_obstacle(sds->fluid);
 				// DG TODO UNUSED unsigned char *obstacleAnim = smoke_get_obstacle_anim(sds->fluid);
 				int bigres[3];
@@ -2645,12 +2657,15 @@ static void update_flowsfluids(Scene *scene, Object *ob, SmokeDomainSettings *sd
 							if (dx < 0 || dy < 0 || dz < 0 || dx >= sds->res[0] || dy >= sds->res[1] || dz >= sds->res[2]) continue;
 
 							if (sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_OUTFLOW) { // outflow
-								apply_outflow_fields(d_index, inflow_map[e_index], density, heat, fuel, react, color_r, color_g, color_b, phi, obstacle);
+								apply_outflow_fields(d_index, inflow_map[e_index], density, heat, fuel, react, color_r, color_g, color_b, phiinit, phiobsinit, obstacle);
+							}
+							else if (sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_GEOMETRY && smd2->time > 2) {
+								apply_inflow_fields(sfs, 0.0f, 0.5f, d_index, density, heat, fuel, react, color_r, color_g, color_b, phiinit);
 							}
-							else if (sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_INFLOW || (sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_GEOMETRY && smd2->time == 2)) { // inflow
+							else if (sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_INFLOW || sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_GEOMETRY) { // inflow
 								/* only apply inflow if enabled */
 								if (sfs->flags & MOD_SMOKE_FLOW_USE_INFLOW) {
-									apply_inflow_fields(sfs, emission_map[e_index], inflow_map[e_index], d_index, density, heat, fuel, react, color_r, color_g, color_b, phi);
+									apply_inflow_fields(sfs, emission_map[e_index], inflow_map[e_index], d_index, density, heat, fuel, react, color_r, color_g, color_b, phiinit);
 									
 									/* initial velocity */
 									if (sfs->flags & MOD_SMOKE_FLOW_INITVELOCITY) {
@@ -2739,10 +2754,13 @@ static void update_flowsfluids(Scene *scene, Object *ob, SmokeDomainSettings *sd
 
 											if (sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_OUTFLOW) { // outflow
 												if (interpolated_value) {
-													apply_outflow_fields(index_big, inflow_map_high[index_big], bigdensity, NULL, bigfuel, bigreact, bigcolor_r, bigcolor_g, bigcolor_b, bigphi, bigobstacle);
+													apply_outflow_fields(index_big, inflow_map_high[index_big], bigdensity, NULL, bigfuel, bigreact, bigcolor_r, bigcolor_g, bigcolor_b, bigphi, NULL, bigobstacle);
 												}
 											}
-											else if (sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_INFLOW || (sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_GEOMETRY && smd2->time == 2)) { // inflow
+											else if (sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_GEOMETRY && smd2->time > 2) {
+												apply_inflow_fields(sfs, 0.0f, 0.5f, d_index, density, heat, fuel, react, color_r, color_g, color_b, NULL);
+											}
+											else if (sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_INFLOW || sfs->behavior == MOD_SMOKE_FLOW_BEHAVIOR_GEOMETRY) { // inflow
 												// TODO (sebbas) inflow map highres?
 												apply_inflow_fields(sfs, interpolated_value, inflow_map_high[index_big], index_big, bigdensity, NULL, bigfuel, bigreact, bigcolor_r, bigcolor_g, bigcolor_b, NULL);
 											}




More information about the Bf-blender-cvs mailing list