Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- private void btnStep_Click(object sender, EventArgs e) {
- btnStep.Text = "Working...";
- Application.DoEvents();
- ovWater = Overlays[Overlays.Count - 1];
- Overlay ovHeight = Overlays[0];
- for (int idx = 0; idx < 100; idx++) {
- for (int x = 0; x < worldWidth; x++) {
- //Parallel.For(0, worldWidth, x => {
- for (int y = 0; y < worldHeight; y++) {
- slopeMap[x, y] = new FlowPoint();
- if (x > 0) {
- slopeMap[x, y].West = (ovHeight.Heightmap[x, y] + ovWater.Heightmap[x, y]) - (ovHeight.Heightmap[x - 1, y] + ovWater.Heightmap[x - 1, y]);
- }
- if (x < worldWidth - 1) {
- slopeMap[x, y].East = (ovHeight.Heightmap[x, y] + ovWater.Heightmap[x, y]) - (ovHeight.Heightmap[x + 1, y] + ovWater.Heightmap[x + 1, y]);
- }
- if (y > 0) {
- slopeMap[x, y].North = (ovHeight.Heightmap[x, y] + ovWater.Heightmap[x, y]) - (ovHeight.Heightmap[x, y - 1] + ovWater.Heightmap[x, y - 1]);
- }
- if (y < worldHeight - 1) {
- slopeMap[x, y].South = (ovHeight.Heightmap[x, y] + ovWater.Heightmap[x, y]) - (ovHeight.Heightmap[x, y + 1] + ovWater.Heightmap[x, y + 1]);
- }
- }
- }//);
- double[,] tmp = new double[worldWidth, worldHeight];
- for (int x = 0; x < worldWidth; x++) {
- //Parallel.For(0, worldWidth, x => {
- for (int y = 0; y < worldHeight; y++) {
- bool wvalid = x > 0 && slopeMap[x, y].West > 0,
- evalid = x < (worldWidth - 1) && slopeMap[x, y].East > 0,
- nvalid = y > 0 && slopeMap[x, y].North > 0,
- svalid = y < (worldHeight - 1) && slopeMap[x, y].South > 0;
- int ct = (wvalid ? 1 : 0) +
- (evalid ? 1 : 0) +
- (nvalid ? 1 : 0) +
- (svalid ? 1 : 0);
- double flowCt =
- (nvalid ? slopeMap[x, y].North : 0) +
- (svalid ? slopeMap[x, y].South : 0) +
- (evalid ? slopeMap[x, y].East : 0) +
- (wvalid ? slopeMap[x, y].West : 0);
- double flowAmt = ovWater.Heightmap[x, y];
- //if (flowAmt > 0.01)
- // flowAmt = 0.01;
- if (ct > 0) {
- double flowTot = 0.0, amt = 0;
- if (nvalid) {
- amt = (flowAmt * (slopeMap[x, y].North / flowCt));
- tmp[x, y - 1] += amt;
- flowTot += amt;
- }
- if (svalid) {
- amt = (flowAmt * (slopeMap[x, y].South / flowCt));
- tmp[x, y + 1] += amt;
- flowTot += amt;
- }
- if (evalid) {
- amt = (flowAmt * (slopeMap[x, y].East / flowCt));
- tmp[x + 1, y] += amt;
- flowTot += amt;
- }
- if (wvalid) {
- amt = (flowAmt * (slopeMap[x, y].West / flowCt));
- tmp[x - 1, y] += amt;
- flowTot += amt;
- }
- tmp[x, y] += (ovWater.Heightmap[x, y] - flowTot);
- }
- else {
- tmp[x, y] = ovWater.Heightmap[x, y];
- }
- }
- }//);
- ovWater.Heightmap = tmp;
- Overlays[Overlays.Count - 1] = ovWater;
- if (idx % 10 == 0) {
- FillDefaultOverlays();
- Draw();
- }
- lblWater.Text =
- idx.ToString() + "\n" +
- (from double d in ovWater.Heightmap select d).Sum().ToString() + "\n" +
- (from double d in ovWater.Heightmap select d).Min().ToString() + "\n" +
- (from double d in ovWater.Heightmap select d).Max().ToString();
- Application.DoEvents();
- }
- FillDefaultOverlays();
- Draw();
- btnStep.Text = "Step water";
- Application.DoEvents();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement