float HeightDifference(Vector2 cell, FluxMode mode) { switch (mode) { case FluxMode.LeftFlux: if ((int)cell.x - 1 < 0) { return(0); } return(grid[(int)cell.x, (int)cell.y].terrainHeight + grid[(int)cell.x, (int)cell.y].waterHeight - grid[(int)cell.x - 1, (int)cell.y].terrainHeight - grid[(int)cell.x - 1, (int)cell.y].waterHeight); case FluxMode.RightFlux: if ((int)cell.x + 1 >= size) { return(0); } return(grid[(int)cell.x, (int)cell.y].terrainHeight + grid[(int)cell.x, (int)cell.y].waterHeight - grid[(int)cell.x + 1, (int)cell.y].terrainHeight - grid[(int)cell.x + 1, (int)cell.y].waterHeight); case FluxMode.UpFlux: if ((int)cell.y - 1 < 0) { return(0); } return(grid[(int)cell.x, (int)cell.y].terrainHeight + grid[(int)cell.x, (int)cell.y].waterHeight - grid[(int)cell.x, (int)cell.y - 1].terrainHeight - grid[(int)cell.x, (int)cell.y - 1].waterHeight); case FluxMode.DownFlux: if ((int)cell.y + 1 >= size) { return(0); } return(grid[(int)cell.x, (int)cell.y].terrainHeight + grid[(int)cell.x, (int)cell.y].waterHeight - grid[(int)cell.x, (int)cell.y + 1].terrainHeight - grid[(int)cell.x, (int)cell.y + 1].waterHeight); default: return(0); } }
float GetFlux(Vector2 cell, FluxMode mode, float Δt) { switch (mode) { case FluxMode.LeftFlux: return(Mathf.Max(0, grid[(int)cell.x, (int)cell.y].outflowFlux[(int)FluxMode.LeftFlux] + Δt * (pipeLength * pipeLength) * ((Physics.gravity.y * HeightDifference(cell, FluxMode.LeftFlux)) / pipeLength))); case FluxMode.RightFlux: return(Mathf.Max(0, grid[(int)cell.x, (int)cell.y].outflowFlux[(int)FluxMode.RightFlux] + Δt * (pipeLength * pipeLength) * ((Physics.gravity.y * HeightDifference(cell, FluxMode.RightFlux)) / pipeLength))); case FluxMode.UpFlux: return(Mathf.Max(0, grid[(int)cell.x, (int)cell.y].outflowFlux[(int)FluxMode.UpFlux] + Δt * (pipeLength * pipeLength) * ((Physics.gravity.y * HeightDifference(cell, FluxMode.UpFlux)) / pipeLength))); case FluxMode.DownFlux: return(Mathf.Max(0, grid[(int)cell.x, (int)cell.y].outflowFlux[(int)FluxMode.DownFlux] + Δt * (pipeLength * pipeLength) * ((Physics.gravity.y * HeightDifference(cell, FluxMode.DownFlux)) / pipeLength))); default: return(0); } }