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

Reply via email to