[Bf-blender-cvs] [a5a4724] fluid-mantaflow: refactored liquid inflow function
Sebastián Barschkis
noreply at git.blender.org
Mon Oct 3 19:47:51 CEST 2016
Commit: a5a472485cebfd66aeba33bb9c2b738b5f160fb0
Author: Sebastián Barschkis
Date: Sun Sep 18 13:41:40 2016 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rBa5a472485cebfd66aeba33bb9c2b738b5f160fb0
refactored liquid inflow function
===================================================================
M source/blender/blenkernel/intern/smoke.c
===================================================================
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index af22a03..af4b21e 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -756,6 +756,7 @@ void smokeModifier_copy(struct SmokeModifierData *smd, struct SmokeModifierData
// forward decleration
static void smoke_calc_transparency(SmokeDomainSettings *sds, Scene *scene);
static float calc_voxel_transp(float *result, float *input, int res[3], int *pixel, float *tRay, float correct);
+static void update_mesh_distances(int index, float *inflow_map, BVHTreeFromMesh *treeData, const float cell_size[3], const float ray_start[3]);
static int get_lamp(Scene *scene, float *light)
{
@@ -1580,6 +1581,51 @@ static void emit_from_particles(
}
}
+static void update_mesh_distances(int index, float *inflow_map, BVHTreeFromMesh *treeData, const float cell_size[3], const float ray_start[3]) {
+ /*****************************************************
+ * Liquid inflow based on raycasts in all 6 directions.
+ * Uses distances to mesh surface from within and outside flow mesh for inflow map.
+ *****************************************************/
+
+ /* Calculate map which indicates whether point is inside a mesh or not */
+ int i, hit_index;
+ float dot;
+ float min_dist_pos, min_dist_neg, min_dist_combined, min_dist_combined_normalized; // for xyz axis in pos and neg direction and when combining 6 axis
+ float hit_dists[6] = {0.0f};
+ float ray_dirs[6][3] = {{1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f},
+ {-1.0f, 0.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, -1.0f}};
+ size_t ray_cnt = sizeof ray_dirs / sizeof ray_dirs[0];
+ inflow_map[index] = 1.0f; // Init inflow map to one, undetermined otherwise which is not good ...
+
+ for (i = 0; i < ray_cnt; i++) {
+ BVHTreeRayHit hit_tree = {0};
+ hit_tree.index = -1;
+ hit_tree.dist = 9999;
+
+ hit_index = BLI_bvhtree_ray_cast(treeData->tree, ray_start, ray_dirs[i], 0.0f, &hit_tree, treeData->raycast_callback, treeData);
+ hit_dists[i] = hit_tree.dist;
+
+ if (hit_index != -1) {
+
+ dot = ray_dirs[i][0] * hit_tree.no[0] + ray_dirs[i][1] * hit_tree.no[1] + ray_dirs[i][2] * hit_tree.no[2];
+
+ if (dot >= 0) {
+ inflow_map[index] = -1.0f; // place mark in map: current point is inside flow mesh. we need this info later
+ }
+ }
+ }
+
+ /* Get the minimum distance of pos and neg coord systems. Then compare both and again get min */
+ min_dist_pos = MIN3(hit_dists[0], hit_dists[1], hit_dists[2]);
+ min_dist_neg = MIN3(hit_dists[3], hit_dists[4], hit_dists[5]);
+ min_dist_combined = MIN2(min_dist_pos, min_dist_neg);
+ min_dist_combined_normalized = min_dist_combined; // / cell_size[0]; // TODO (sebbas): normalization results in too big values
+
+ /* If distance is still undetermined (=9999) use default manta value (=0.5) instead (outside emission map value is also 0.5)
+ * Otherwise use computed distance. inflow_map is either 1.0 or -1.0. Multiplied with dist_comb we have mesh dist from out- and inside */
+ inflow_map[index] *= (min_dist_combined == 9999) ? 0.5f : min_dist_combined_normalized;
+}
+
static void sample_derivedmesh(
SmokeFlowSettings *sfs,
const MVert *mvert, const MLoop *mloop, const MLoopTri *mlooptri, const MLoopUV *mloopuv, const float cell_size[3],
@@ -1621,50 +1667,10 @@ static void sample_derivedmesh(
}
}
- /*****************************************************
- * Liquid inflow based on raycasts in all 6 directions.
- * Uses distances to mesh surface from within and outside flow mesh for inflow map.
- *****************************************************/
-
- /* Calculate map which indicates whether point is inside a mesh or not */
- int i, hit_index;
- float dot;
- float min_dist_pos, min_dist_neg, min_dist_combined, min_dist_combined_normalized; // for xyz axis in pos and neg direction and when combining 6 axis
- float hit_dists[6] = {0.0f};
- float ray_dirs[6][3] = {{1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {0.0f, 0.0f, 1.0f},
- {-1.0f, 0.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, -1.0f}};
- size_t ray_cnt = sizeof ray_dirs / sizeof ray_dirs[0];
- inflow_map[index] = 1.0f; // Init inflow map to zero, undetermined otherwise which is not good ...
-
- for (i = 0; i < ray_cnt; i++) {
- BVHTreeRayHit hit_tree = {0};
- hit_tree.index = -1;
- hit_tree.dist = 9999;
-
- hit_index = BLI_bvhtree_ray_cast(treeData->tree, ray_start, ray_dirs[i], 0.0f, &hit_tree, treeData->raycast_callback, treeData);
- hit_dists[i] = hit_tree.dist;
-
- if (hit_index != -1) {
-
- dot = ray_dirs[i][0] * hit_tree.no[0] + ray_dirs[i][1] * hit_tree.no[1] + ray_dirs[i][2] * hit_tree.no[2];
-
- if (dot >= 0) {
- inflow_map[index] = -1.0f; // place mark in map: current point is inside flow mesh. we need this info later
- }
- }
+ /* Get mesh distances for liquid phi grid */
+ if (sfs->type == MOD_SMOKE_FLOW_TYPE_LIQUID) {
+ update_mesh_distances(index, inflow_map, treeData, cell_size, ray_start);
}
-
- /* Get the minimum distance of pos and neg coord systems. Then compare both and again get min */
- min_dist_pos = MIN3(hit_dists[0], hit_dists[1], hit_dists[2]);
- min_dist_neg = MIN3(hit_dists[3], hit_dists[4], hit_dists[5]);
- min_dist_combined = MIN2(min_dist_pos, min_dist_neg);
- min_dist_combined_normalized = min_dist_combined / cell_size[0]; // TODO (sebbas): also consider cell_size[1] and cell_size[2] ?!
-
- /* If distance is still undetermined (=9999) use default manta value (=0.5) instead (outside emission map value is also 0.5)
- * Otherwise use computed distance. inflow_map is either 1.0 or -1.0. Multiplied with dist_comb we have mesh dist from out- and inside */
- inflow_map[index] *= (min_dist_combined == 9999) ? 0.5 : min_dist_combined_normalized; // TODO (sebbas): Better value for 0.5?
-
- /*****************************************************/
/* find the nearest point on the mesh */
if (BLI_bvhtree_find_nearest(treeData->tree, ray_start, &nearest, treeData->nearest_callback, treeData) != -1) {
More information about the Bf-blender-cvs
mailing list