Commit: f13e9ccc615998d8571517c7399f0b086574ea89
Author: Sebastián Barschkis
Date:   Wed Jun 1 19:20:21 2016 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rBf13e9ccc615998d8571517c7399f0b086574ea89

better 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 29d4ef0..8888b5e 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -1545,6 +1545,26 @@ 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 (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; // Outside mesh (-0.5 
because of mantaflow convention)
+                       }
+               }
+       }
+
 
        /* find the nearest point on the mesh */
        if (BLI_bvhtree_find_nearest(treeData->tree, ray_start, &nearest, 
treeData->nearest_callback, treeData) != -1) {
@@ -1561,18 +1581,6 @@ static void sample_derivedmesh(
                else
                        sample_str = 0.0f;
 
-               /* Calculate map of points inside and outside mesh */
-               float x_delta = nearest.co[0] - x;
-               float y_delta = nearest.co[1] - y;
-               float z_delta = nearest.co[2] - z;
-               
-               float dot = x_delta * nearest.no[0] + y_delta * nearest.no[1] + 
z_delta * nearest.no[2];
-               
-               if (dot < 0.0f)
-                       inflow_map[index] = 1; // Outside mesh
-               else
-                       inflow_map[index] = -1; // Inside mesh
-
                /* calculate barycentric weights for nearest point */
                v1 = mloop[mlooptri[f_index].tri[0]].v;
                v2 = mloop[mlooptri[f_index].tri[1]].v;
@@ -2168,7 +2176,7 @@ BLI_INLINE void apply_inflow_fields(SmokeFlowSettings 
*sfs, float emission_value
 {
        /* add liquid inflow */
        if (phi) {
-               phi[index] = inflow_value; // TODO How to get more accurate 
value?
+               if (inflow_value < 0) phi[index] = inflow_value; // Only copy 
values of points inside a mesh
                return;
        }
        int absolute_flow = (sfs->flags & MOD_SMOKE_FLOW_ABSOLUTE);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to