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);
}
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs