From faa112cd27bbce2498910e551373a37437513f7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Fri, 14 Nov 2014 15:51:23 +0100 Subject: 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. --- source/blender/physics/intern/hair_volume.cpp | 96 ++++++++++++++------------- 1 file changed, 51 insertions(+), 45 deletions(-) (limited to 'source/blender/physics') diff --git a/source/blender/physics/intern/hair_volume.cpp b/source/blender/physics/intern/hair_volume.cpp index 972571aa616..5b885cd9fa3 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; @@ -830,6 +865,12 @@ bool BPH_hair_volume_solve_divergence(HairGrid *grid, float dt, float target_den if (fac > 0.05f) 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}; @@ -837,8 +878,8 @@ bool BPH_hair_volume_solve_divergence(HairGrid *grid, float dt, float target_den 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 { -- cgit v1.2.3