[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