View difference between Paste ID: JktpizHW and FNwKCj4i
SHOW: | | - or go back to the newest paste.
1
/// <summary>
2
/// Update the fluid. Part 3.2 in the paper.
3
/// </summary>
4
/// <param name="dt">delta time</param>
5
/// <param name="dx">delta x. Distance between middles of grid-cells.</param>
6
/// <param name="lowerLayersHeight">The total heights of the layers under this one. Basically this is the ground under the water.</param>
7
public override void DoUpdate(float dt, float dx, float[][] lowerLayersHeight) {
8
	_fluidTimer.Start();
9
	
10
	int x, y;
11
	float totalHeight, dhL, dhR, dhT, dhB;
12
	float dt_A_g_l = dt * _A * g / dx; //all constants for equation 2
13
	float K; // scaling factor for the outflow flux
14
	float dV;
15
	
16
	for (x=1 ; x <= N ; x++ ) {
17
		for (y=1 ; y <= N ; y++ ) {
18
			//
19
			// 3.2.1 Outflow Flux Computation
20
			// --------------------------------------------------------------
21
			totalHeight = lowerLayersHeight[x][y] + _height[x][y];
22
			dhL = totalHeight - lowerLayersHeight[x-1][y] - _height[x-1][y]; //(3)
23
			dhR = totalHeight - lowerLayersHeight[x+1][y] - _height[x+1][y];
24
			dhT = totalHeight - lowerLayersHeight[x][y+1] - _height[x][y+1];
25
			dhB = totalHeight - lowerLayersHeight[x][y-1] - _height[x][y-1];
26
			
27
			_tempFlux[x][y].left =	 Mathf.Max(0.0f, _flux[x][y].left	 + dt_A_g_l * dhL ); //(2)
28
			_tempFlux[x][y].right =	 Mathf.Max(0.0f, _flux[x][y].right	 + dt_A_g_l * dhR );
29
			_tempFlux[x][y].top =	 Mathf.Max(0.0f, _flux[x][y].top	 + dt_A_g_l * dhT );
30-
			_tempFlux[x][y].bottom = Mathf.Max(0.0f, _flux[x][y].bottom  + dt_A_g_l * dhB );
30+
			_tempFlux[x][y].bottom = Mathf.Max(0.0f, _flux[x][y].bottom 	 + dt_A_g_l * dhB );
31
			
32
			float totalFlux = _tempFlux[x][y].left + _tempFlux[x][y].right + _tempFlux[x][y].top + _tempFlux[x][y].bottom;
33
			if (totalFlux > 0) {
34
				K = Mathf.Min(1.0f, _height[x][y] * dx * dx / totalFlux / dt);  //(4)
35
				
36
				_tempFlux[x][y].left =	 K * _tempFlux[x][y].left;  //(5)
37
				_tempFlux[x][y].right =	 K * _tempFlux[x][y].right;
38
				_tempFlux[x][y].top =	 K * _tempFlux[x][y].top;
39
				_tempFlux[x][y].bottom = K * _tempFlux[x][y].bottom;
40
			}
41
			//swap temp and the real one after the for-loops
42
			
43
			//
44
			// 3.2.2 Water Surface and Velocity Field Update
45
			// ----------------------------------------------------------------------------------------
46
			dV = dt * (
47
				//sum in
48
				_tempFlux[x-1][y].right + _tempFlux[x][y-1].top + _tempFlux[x+1][y].left + _tempFlux[x][y+1].bottom
49
				//minus sum out
50
				- _tempFlux[x][y].right - _tempFlux[x][y].top - _tempFlux[x][y].left - _tempFlux[x][y].bottom
51
				); //(6)
52
			_tempHeight[x][y] = _height[x][y] + dV / (dx*dx); //(7)
53
			//swap temp and the real one after the for-loops
54
		}
55
	}
56
	Helpers.Swap(ref _tempFlux, ref _flux);
57
	Helpers.Swap(ref _tempHeight, ref _height);
58
	
59
	_fluidTimer.Stop();
60
}