Commit: f5e1be853224f573d9cfe49189e3342250dff3da
Author: Lukas Tönne
Date: Fri Nov 14 15:51:23 2014 +0100
Branches: hair_immediate_fixes
https://developer.blender.org/rBf5e1be853224f573d9cfe49189e3342250dff3da
Fixed wrong stride values used for offsetting the index of Eigen values.
The Eigen solver for hair grids uses an extra margin of 1, which means
greater stride values.
===================================================================
M source/blender/physics/intern/hair_volume.cpp
===================================================================
diff --git a/source/blender/physics/intern/hair_volume.cpp
b/source/blender/physics/intern/hair_volume.cpp
index 972571a..5b885cd 100644
--- a/source/blender/physics/intern/hair_volume.cpp
+++ b/source/blender/physics/intern/hair_volume.cpp
@@ -752,17 +752,17 @@ bool BPH_hair_volume_solve_divergence(HairGrid *grid,
float dt, float target_den
* needed for the diagonal element
*/
if (!NEIGHBOR_MARGIN_k0 && (vert -
stride2)->density > density_threshold)
-
neighbor_lo_index[neighbors_lo++] = u - stride2;
+
neighbor_lo_index[neighbors_lo++] = u - strideA2;
if (!NEIGHBOR_MARGIN_j0 && (vert -
stride1)->density > density_threshold)
-
neighbor_lo_index[neighbors_lo++] = u - stride1;
+
neighbor_lo_index[neighbors_lo++] = u - strideA1;
if (!NEIGHBOR_MARGIN_i0 && (vert -
stride0)->density > density_threshold)
-
neighbor_lo_index[neighbors_lo++] = u - stride0;
+
neighbor_lo_index[neighbors_lo++] = u - strideA0;
if (!NEIGHBOR_MARGIN_i1 && (vert +
stride0)->density > density_threshold)
-
neighbor_hi_index[neighbors_hi++] = u + stride0;
+
neighbor_hi_index[neighbors_hi++] = u + strideA0;
if (!NEIGHBOR_MARGIN_j1 && (vert +
stride1)->density > density_threshold)
-
neighbor_hi_index[neighbors_hi++] = u + stride1;
+
neighbor_hi_index[neighbors_hi++] = u + strideA1;
if (!NEIGHBOR_MARGIN_k1 && (vert +
stride2)->density > density_threshold)
-
neighbor_hi_index[neighbors_hi++] = u + stride2;
+
neighbor_hi_index[neighbors_hi++] = u + strideA2;
/*int liquid_neighbors = neighbors_lo +
neighbors_hi;*/
non_solid_neighbors = 6;
@@ -789,6 +789,41 @@ bool BPH_hair_volume_solve_divergence(HairGrid *grid,
float dt, float target_den
lVector p = cg.solve(B);
if (cg.info() == Eigen::Success) {
+ /* Calculate velocity = grad(p) */
+ for (k = 0; k < resA[2]; ++k) {
+ for (j = 0; j < resA[1]; ++j) {
+ for (i = 0; i < resA[0]; ++i) {
+ int u = i * strideA0 + j * strideA1 + k
* strideA2;
+ bool is_margin = MARGIN_i0 || MARGIN_i1
|| MARGIN_j0 || MARGIN_j1 || MARGIN_k0 || MARGIN_k1;
+ if (is_margin)
+ continue;
+
+ vert = vert_start + i * stride0 + j *
stride1 + k * stride2;
+ if (vert->density > density_threshold) {
+ float p_left = p[u -
strideA0];
+ float p_right = p[u +
strideA0];
+ float p_down = p[u -
strideA1];
+ float p_up = p[u +
strideA1];
+ float p_bottom = p[u -
strideA2];
+ float p_top = p[u +
strideA2];
+
+ /* finite difference estimate
of pressure gradient */
+ float dvel[3];
+ dvel[0] = p_right - p_left;
+ dvel[1] = p_up - p_down;
+ dvel[2] = p_top - p_bottom;
+ mul_v3_fl(dvel, -0.5f *
inv_flowfac);
+
+ /* pressure gradient describes
velocity delta */
+
add_v3_v3v3(vert->velocity_smooth, vert->velocity, dvel);
+ }
+ else {
+ zero_v3(vert->velocity_smooth);
+ }
+ }
+ }
+ }
+
#if 0
{
int axis = 0;
@@ -801,8 +836,8 @@ bool BPH_hair_volume_solve_divergence(HairGrid *grid, float
dt, float target_den
for (i = 0; i < resA[0]; ++i) {
int u = i * strideA0 + j *
strideA1 + k * strideA2;
bool is_margin = MARGIN_i0 ||
MARGIN_i1 || MARGIN_j0 || MARGIN_j1 || MARGIN_k0 || MARGIN_k1;
-// if (i != slice)
-// continue;
+ if (i != slice)
+ continue;
vert = vert_start + i * stride0
+ j * stride1 + k * stride2;
@@ -831,14 +866,20 @@ bool BPH_hair_volume_solve_divergence(HairGrid *grid,
float dt, float target_den
BKE_sim_debug_data_add_circle(grid->debug_data, wloc, 0.01f, col[0], col[1],
col[2], "grid", hash_int_2d(5533, hash_int_2d(i, hash_int_2d(j, k))));
if (!is_margin) {
+ float dvel[3];
+ sub_v3_v3v3(dvel,
vert->velocity_smooth, vert->velocity);
+
BKE_sim_debug_data_add_vector(grid->debug_data, wloc, dvel, 1, 1, 1, "grid",
hash_int_2d(5566, hash_int_2d(i, hash_int_2d(j, k))));
+ }
+
+ if (!is_margin) {
float d =
CLAMPIS(vert->density * target_density, 0.0f, 1.0f);
float col0[3] = {0.3,
0.3, 0.3};
float colp[3] = {0.0,
0.0, 1.0};
float col[3];
interp_v3_v3v3(col,
col0, colp, d);
- if (d > 0.05f)
-
BKE_sim_debug_data_add_dot(grid->debug_data, wloc, col[0], col[1], col[2],
"grid", hash_int_2d(5544, hash_int_2d(i, hash_int_2d(j, k))));
+// if (d > 0.05f)
+//
BKE_sim_debug_data_add_dot(grid->debug_data, wloc, col[0], col[1], col[2],
"grid", hash_int_2d(5544, hash_int_2d(i, hash_int_2d(j, k))));
}
}
}
@@ -846,41 +887,6 @@ bool BPH_hair_volume_solve_divergence(HairGrid *grid,
float dt, float target_den
}
#endif
- /* Calculate velocity = grad(p) */
- for (k = 0; k < resA[2]; ++k) {
- for (j = 0; j < resA[1]; ++j) {
- for (i = 0; i < resA[0]; ++i) {
- int u = i * strideA0 + j * strideA1 + k
* strideA2;
- bool is_margin = MARGIN_i0 || MARGIN_i1
|| MARGIN_j0 || MARGIN_j1 || MARGIN_k0 || MARGIN_k1;
- if (is_margin)
- continue;
-
- vert = vert_start + i * stride0 + j *
stride1 + k * stride2;
- if (vert->density > density_threshold) {
- float p_left = p[u - stride0];
- float p_right = p[u + stride0];
- float p_down = p[u - stride1];
- float p_up = p[u + stride1];
- float p_bottom = p[u - stride2];
- float p_top = p[u + stride2];
-
- /* finite difference estimate
of pressure gradient */
- float dvel[3];
- dvel[0] = p_right - p_left;
- dvel[1] = p_up - p_down;
- dvel[2] = p_top - p_bottom;
- mul_v3_fl(dvel, -0.5f *
inv_flowfac);
-
- /* pressure gradient describes
velocity delta */
-
add_v3_v3v3(vert->velocity_smooth, vert->velocity, dvel);
- }
- else {
- zero_v3(vert->velocity_smooth);
- }
- }
- }
- }
-
return true;
}
else {
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs