[Bf-blender-cvs] [9773ffa] fluid-mantaflow: added new liquid inflow function. this version uses 6 raycasts and not only considers distance to flow mesh surface from within mesh but also from outside.

Sebastián Barschkis noreply at git.blender.org
Thu Jun 30 00:39:28 CEST 2016


Commit: 9773ffa92ff756fe07c016adff7e85fbdec59e07
Author: Sebastián Barschkis
Date:   Tue Jun 28 19:21:49 2016 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rB9773ffa92ff756fe07c016adff7e85fbdec59e07

added new liquid inflow function. this version uses 6 raycasts and not only considers distance to flow mesh surface from within mesh but also from outside.

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

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

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

diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index 8b72e02..0280d0c 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -1550,27 +1550,70 @@ static void sample_derivedmesh(
 		}
 	}
 	
-	/*****************************************************/	
+//	/*****************************************************/	
+//	
+//	/* Calculate map which indicates whether point is inside a mesh or not */
+//	if (BLI_bvhtree_ray_cast(treeData->tree, ray_start, ray_dir, 0.0f, &hit, treeData->raycast_callback, treeData) != -1) {
+//		float dot = ray_dir[0] * hit.no[0] + ray_dir[1] * hit.no[1] + ray_dir[2] * hit.no[2];
+//		/*  If ray and hit face normal are facing same direction
+//		 *	hit point is inside a closed mesh. */
+//		if (dot >= 0) {
+//			/* Also cast a ray in opposite direction to make sure
+//			 * point is at least surrounded by two faces */
+//			negate_v3(ray_dir);
+//			hit.index = -1;
+//			hit.dist = 9999;
+//
+//			BLI_bvhtree_ray_cast(treeData->tree, ray_start, ray_dir, 0.0f, &hit, treeData->raycast_callback, treeData);
+//			
+//			if (hit.index != -1) {
+//				inflow_map[index] = -0.5; // Inside mesh
+//			}
+//		}
+//	}
+	
+	/*****************************************************
+	 * 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 */
-	if (BLI_bvhtree_ray_cast(treeData->tree, ray_start, ray_dir, 0.0f, &hit, treeData->raycast_callback, treeData) != -1) {
-		float dot = ray_dir[0] * hit.no[0] + ray_dir[1] * hit.no[1] + ray_dir[2] * hit.no[2];
-		/*  If ray and hit face normal are facing same direction
-		 *	hit point is inside a closed mesh. */
-		if (dot >= 0) {
-			/* Also cast a ray in opposite direction to make sure
-			 * point is at least surrounded by two faces */
-			negate_v3(ray_dir);
-			hit.index = -1;
-			hit.dist = 9999;
-
-			BLI_bvhtree_ray_cast(treeData->tree, ray_start, ray_dir, 0.0f, &hit, treeData->raycast_callback, treeData);
-			
-			if (hit.index != -1) {
-				inflow_map[index] = -0.5; // Inside mesh
+	BVHTreeRayHit hit_tree = {0}; // Reset hit tree
+	int i, hit_index;
+	float min_dist_pos, min_dist_neg, min_dist_combined; // 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++) {
+		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) {
+		
+			float 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);
+	
+	/* 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; // 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