diff options
Diffstat (limited to 'Smoke/fluids.c')
-rw-r--r-- | Smoke/fluids.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/Smoke/fluids.c b/Smoke/fluids.c index 01ca443..a6c0a03 100644 --- a/Smoke/fluids.c +++ b/Smoke/fluids.c @@ -247,6 +247,11 @@ struct point vector_normal(struct point vert1, struct point vert2, struct point return_value.y /= length; return_value.z /= length; + if (return_value.x == return_value.y == return_value.z == 0.0f) + { + return_value.z = 1.0f; + } + return return_value; } @@ -263,7 +268,7 @@ void calculate_normal_vectors(void) for (j = 0; j < DIM; j++) { for (i = 0; i < DIM; i++) - { + { idx = (j * DIM) + i; px = wn + (fftw_real)i * wn; py = hn + (fftw_real)(j + 1) * hn; @@ -281,33 +286,39 @@ void calculate_normal_vectors(void) p3.z = height_array[idx + 1]; normal_array[idx] = vector_normal(p2, p1, p3); + normal_array[idx + 1] = vector_normal(p2, p1, p3); } } } struct point calculate_normal_vector(fftw_real *height, int index, int i, int j) { - struct point p1, p2, p3; + int idx; + float px, py; + struct point p1, p2, p3, rv; fftw_real wn = (fftw_real)winWidth / (fftw_real)(DIM + 1); // Grid cell width fftw_real hn = (fftw_real)winHeight / (fftw_real)(DIM + 1); // Grid cell height - float px = wn + (fftw_real)i * wn; - float py = hn + (fftw_real)(j + 1) * hn; + + px = wn + (fftw_real)i * wn; + py = hn + (fftw_real)(j + 1) * hn; p1.x = px; - p1.y = py + hn; - p1.z = height[index + DIM]; + p1.y = py; + p1.z = height[index]; p2.x = px; - p2.y = py; - p2.z = height[index]; + p2.y = py + hn; + p2.z = height[index + DIM]; p3.x = px + wn; p3.y = py; p3.z = height[index + 1]; + normal_array[index] = vector_normal(p2, p1, p3); + rv = vector_normal(p2, p1, p3); - return vector_normal(p1, p2, p3); + return rv; } void calculate_height_plots(void) @@ -486,7 +497,8 @@ void fluids_calculate_one_simulation_step(struct vis_data_arrays *vis_data) int dataset; fftw_real *frame; - if (fluids_calculate) { + if (fluids_calculate) + { set_forces(); solve(DIM, vx, vy, vx0, vy0, visc, dt); diffuse_matter(DIM, vx, vy, rho, rho0, dt); |