public static void NoiseArea(UGUI agentOwner, SceneInterface scene, ModifyLand modify, ModifyLand.Data data) { var changed = new List <LayerPatch>(); for (int x = (int)data.West; x < (int)data.East; x++) { for (int y = (int)data.South; y < (int)data.North; y++) { if (!scene.CanTerraform(agentOwner, new Vector3(x, y, 0))) { continue; } double noise = PerlinNoise2D((double)x / scene.SizeX, (double)y / scene.SizeY, 8, 1); LayerPatch lp = scene.Terrain.AdjustTerrain((uint)x, (uint)y, noise * modify.Size); if (lp != null && !changed.Contains(lp)) { changed.Add(lp); } } } if (changed.Count != 0) { foreach (LayerPatch lp in changed) { lp.IncrementSerial(); scene.Terrain.UpdateTerrainListeners(lp); } scene.Terrain.UpdateTerrainDataToClients(); } }
public double this[uint x, uint y] { get { if (x >= m_Scene.SizeX || y >= m_Scene.SizeY) { throw new KeyNotFoundException(); } return(m_TerrainPatches[x / LayerCompressor.LAYER_PATCH_NUM_XY_ENTRIES, y / LayerCompressor.LAYER_PATCH_NUM_XY_ENTRIES].Data[y % LayerCompressor.LAYER_PATCH_NUM_XY_ENTRIES, x % LayerCompressor.LAYER_PATCH_NUM_XY_ENTRIES]); } set { LayerPatch lp = null; if (x >= m_Scene.SizeX || y >= m_Scene.SizeY) { throw new KeyNotFoundException(); } m_TerrainRwLock.AcquireWriterLock(() => { lp = m_TerrainPatches[x / LayerCompressor.LAYER_PATCH_NUM_XY_ENTRIES, y / LayerCompressor.LAYER_PATCH_NUM_XY_ENTRIES]; lp.Data[y % LayerCompressor.LAYER_PATCH_NUM_XY_ENTRIES, x % LayerCompressor.LAYER_PATCH_NUM_XY_ENTRIES] = (float)value; lp.IncrementSerial(); }); if (lp != null) { lp.Dirty = true; } } }
public static void SmoothArea(UGUI agentOwner, SceneInterface scene, ModifyLand modify, ModifyLand.Data data) { var changed = new List <LayerPatch>(); double area = modify.Size; double step = area / 4; for (int x = (int)data.West; x < (int)data.East; x++) { for (int y = (int)data.South; y < (int)data.North; y++) { if (!scene.CanTerraform(agentOwner, new Vector3(x, y, 0))) { continue; } double average = 0; int avgsteps = 0; for (double n = 0 - area; n < area; n += step) { for (double l = 0 - area; l < area; l += step) { avgsteps++; average += GetBilinearInterpolate(x + n, y + l, scene); } } LayerPatch lp = scene.Terrain.BlendTerrain((uint)x, (uint)y, average / avgsteps, 1); if (lp != null && !changed.Contains(lp)) { changed.Add(lp); } } } if (changed.Count != 0) { foreach (LayerPatch lp in changed) { lp.IncrementSerial(); scene.Terrain.UpdateTerrainListeners(lp); } scene.Terrain.UpdateTerrainDataToClients(); } }