public void AddChunk(TerrainChunk chunk, int start_x, int start_y, AddMode mode = AddMode.Add) { int minWidth = Mathf.Min(chunk.data.GetLength(0), this.data.GetLength(0) - start_x); int minHeight = Mathf.Min(chunk.data.GetLength(1), this.data.GetLength(1) - start_y); float centerValue = this.data[start_x + chunk.GetWidth() / 2, start_y + chunk.GetHeight() / 2]; for (int x = 0; x < minWidth; x++) { for (int y = 0; y < minHeight; y++) { int xc = start_x + x; int yc = start_y + y; if (xc < 0 || yc < 0) { continue; } switch (mode) { case AddMode.Add: this.data[xc, yc] = this.data[xc, yc] + chunk.data[x, y]; if (chunk.data[x, y] != 0) { for (int layer = 0; layer < TEXTURE_COUNT; layer++) { this.textureData[xc, yc, layer] = this.textureData[xc, yc, layer] + chunk.textureData[x, y, layer] * 4; } } break; case AddMode.Max: if (chunk.data[x, y] != 0 && chunk.data[x, y] > this.data[xc, yc]) { for (int layer = 0; layer < TEXTURE_COUNT; layer++) { this.textureData[xc, yc, layer] = chunk.textureData[x, y, layer]; } } this.data[xc, yc] = Mathf.Max(this.data[xc, yc], chunk.data[x, y]); break; case AddMode.Min: this.data[xc, yc] = Mathf.Min(this.data[xc, yc], chunk.data[x, y]); break; case AddMode.RelaMin: this.data[xc, yc] = Mathf.Min(this.data[xc, yc], centerValue - chunk.data[x, y]); break; } } } }
public void AddChunkAtPoints(TerrainPoint[] points, TerrainChunk chunk, AddMode mode = AddMode.Add) { for (int i = 0; i < points.Length; i++) { int x = points[i].x; int y = points[i].y; this.AddChunk(chunk, x - chunk.GetWidth() / 2, y - chunk.GetHeight() / 2, mode); } }