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 static void FlattenArea(UGUI agentOwner, SceneInterface scene, ModifyLand modify, ModifyLand.Data data) { var changed = new List <LayerPatch>(); double sum = 0; double steps = 0; for (var x = (int)data.West; x < (int)data.East; x++) { for (var y = (int)data.South; y < (int)data.North; y++) { if (!scene.CanTerraform(agentOwner, new Vector3(x, y, 0))) { continue; } sum += scene.Terrain[(uint)x, (uint)y]; steps++; } } double avg = sum / steps; double str = 0.1f * modify.Size; // == 0.2 in the default client for (var x = (int)data.West; x < (int)data.East; x++) { for (var y = (int)data.South; y < (int)data.North; y++) { if (scene.CanTerraform(agentOwner, new Vector3(x, y, 0))) { LayerPatch lp = scene.Terrain.BlendTerrain((uint)x, (uint)y, avg, str); 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 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(); } }
public void SendModifyLand( ScriptInstance instance, ViewerAgentAccessor agent, int action, int brushSize, double seconds, double height, ModifyLandParcelDataList list) { lock (instance) { ViewerConnection vc; ViewerCircuit viewerCircuit; if (m_Clients.TryGetValue(agent.AgentID, out vc) && vc.ViewerCircuits.TryGetValue((uint)agent.CircuitCode, out viewerCircuit)) { var m = new ModifyLand { AgentID = agent.AgentID, SessionID = viewerCircuit.SessionID, Action = (byte)action, Size = (byte)brushSize, Seconds = seconds, Height = height }; foreach (ModifyLandParcelData entry in list) { m.ParcelData.Add(new ModifyLand.Data { LocalID = entry.LocalID, West = entry.West, South = entry.South, East = entry.East, North = entry.North, BrushSize = entry.BrushSize }); } viewerCircuit.SendMessage(m); } } }
public static void NoiseSphere(UGUI agentOwner, SceneInterface scene, ModifyLand modify, ModifyLand.Data data) { var changed = new List <LayerPatch>(); int n = (int)(data.BrushSize + 0.5f); if (data.BrushSize > 6) { data.BrushSize = 6; } double strength = MetersToSphericalStrength(data.BrushSize); double area = data.BrushSize; double step = data.BrushSize / 4; double duration = modify.Seconds * 0.01f; int zx = (int)(data.West + 0.5); int zy = (int)(data.South + 0.5); double average = 0; int avgsteps = 0; for (double nn = 0 - area; nn < area; nn += step) { for (double l = 0 - area; l < area; l += step) { avgsteps++; average += GetBilinearInterpolate(data.West + nn, data.South + l, scene); } } for (int dx = -n; dx <= n; dx++) { for (int dy = -n; dy <= n; dy++) { int x = zx + dx; int y = zy + dy; if (x >= 0 && y >= 0 && x < scene.SizeX && y < scene.SizeY) { Vector3 pos = new Vector3(x, y, 0); if (!scene.CanTerraform(agentOwner, pos)) { continue; } double z = SphericalFactor(x, y, data.West, data.South, strength) / (strength); if (z > 0) // add in non-zero amount { double a = scene.Terrain[(uint)x, (uint)y] - (average / avgsteps); LayerPatch lp = scene.Terrain.AdjustTerrain((uint)x, (uint)y, a * duration); 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 static void FlattenSphere(UGUI agentOwner, SceneInterface scene, ModifyLand modify, ModifyLand.Data data) { var changed = new List <LayerPatch>(); double strength = MetersToSphericalStrength(data.BrushSize); int xFrom = (int)(data.West - data.BrushSize + 0.5); int xTo = (int)(data.West + data.BrushSize + 0.5); int yFrom = (int)(data.South - data.BrushSize + 0.5); int yTo = (int)(data.South + data.BrushSize + 0.5); if (xFrom < 0) { xFrom = 0; } if (yFrom < 0) { yFrom = 0; } if (xTo >= scene.SizeX) { xTo = (int)scene.SizeX - 1; } if (yTo > scene.SizeY) { yTo = (int)scene.SizeY - 1; } for (int x = xFrom; x <= xTo; x++) { for (int y = yFrom; y <= yTo; y++) { var pos = new Vector3(x, y, 0); if (!scene.CanTerraform(agentOwner, pos)) { continue; } double z = (modify.Seconds < 4.0) ? SphericalFactor(x, y, data.West, data.South, strength) * modify.Seconds * 0.25f : 1; double delta = modify.Height - scene.Terrain[(uint)x, (uint)y]; if (Math.Abs(delta) > 0.1) { if (z > 1) { z = 1; } else if (z < 0) { z = 0; } delta *= z; } if (Math.Abs(delta) >= Double.Epsilon) // add in non-zero amount { LayerPatch lp = scene.Terrain.AdjustTerrain((uint)x, (uint)y, delta); if (lp != null && !changed.Contains(lp)) { changed.Add(lp); } } } } if (changed.Count != 0) { foreach (LayerPatch lp in changed) { lp.IncrementSerial(); } scene.Terrain.UpdateTerrainDataToClients(); } }
public static void LowerSphere(UGUI agentOwner, SceneInterface scene, ModifyLand modify, ModifyLand.Data data) { var changed = new List <LayerPatch>(); int xFrom = (int)(data.West - data.BrushSize + 0.5); int xTo = (int)(data.West + data.BrushSize + 0.5); int yFrom = (int)(data.South - data.BrushSize + 0.5); int yTo = (int)(data.South + data.BrushSize + 0.5); if (xFrom < 0) { xFrom = 0; } if (yFrom < 0) { yFrom = 0; } if (xTo >= scene.SizeX) { xTo = (int)scene.SizeX - 1; } if (yTo >= scene.SizeY) { yTo = (int)scene.SizeY - 1; } for (int x = xFrom; x <= xTo; x++) { for (int y = yFrom; y <= yTo; y++) { Vector3 pos = new Vector3(x, y, 0); if (!scene.CanTerraform(agentOwner, pos)) { continue; } // Calculate a cos-sphere and add it to the heightmap double r = Math.Sqrt((x - data.West) * (x - data.West) + ((y - data.South) * (y - data.South))); double z = Math.Cos(r * Math.PI / (data.BrushSize * 2)); if (z > 0.0) { LayerPatch lp = scene.Terrain.AdjustTerrain((uint)x, (uint)y, -z * modify.Seconds); 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(); } }