* Terrain modification more robust, uses area sizes matching those employed by the client display.

* Terrain tools now account for the duration the cursor was held for.
* Terrain tools now support new brushes (completing the common set)
** Smooth brush
** Flatten brush
** Revert brush
** Noise brush
This commit is contained in:
Adam Frisby
2007-06-20 21:57:22 +00:00
parent e4c915eebc
commit 8194d82230
6 changed files with 246 additions and 203 deletions

View File

@@ -19,13 +19,13 @@ namespace SimpleApp
{
class Program : IAssetReceiver, conscmd_callback
{
private LogBase m_console;
private LogBase m_log;
AuthenticateSessionsBase m_circuitManager;
private void Run()
{
m_console = new LogBase(null, "SimpleApp", this, false);
MainLog.Instance = m_console;
m_log = new LogBase(null, "SimpleApp", this, false);
MainLog.Instance = m_log;
CheckSumServer checksumServer = new CheckSumServer(12036);
checksumServer.ServerListener();
@@ -47,7 +47,7 @@ namespace SimpleApp
AssetCache assetCache = new AssetCache(assetServer);
UDPServer udpServer = new UDPServer(simPort, assetCache, inventoryCache, m_console, m_circuitManager );
UDPServer udpServer = new UDPServer(simPort, assetCache, inventoryCache, m_log, m_circuitManager );
PacketServer packetServer = new PacketServer( udpServer, (uint) simPort );
udpServer.ServerListener();
@@ -68,13 +68,13 @@ namespace SimpleApp
httpServer.AddXmlRPCHandler( "login_to_simulator", loginServer.XmlRpcLoginMethod );
httpServer.Start();
m_console.WriteLine( LogPriority.NORMAL, "Press enter to quit.");
m_console.ReadLine();
m_log.WriteLine( LogPriority.NORMAL, "Press enter to quit.");
m_log.ReadLine();
}
private bool AddNewSessionHandler(ulong regionHandle, Login loginData)
{
m_console.WriteLine(LogPriority.NORMAL, "Region [{0}] recieved Login from [{1}] [{2}]", regionHandle, loginData.First, loginData.Last);
m_log.WriteLine(LogPriority.NORMAL, "Region [{0}] recieved Login from [{1}] [{2}]", regionHandle, loginData.First, loginData.Last);
AgentCircuitData agent = new AgentCircuitData();
agent.AgentID = loginData.Agent;

View File

@@ -41,25 +41,62 @@ namespace OpenSim.Region.Scenes
public partial class Scene
{
/// <summary>
///
/// Modifies terrain using the specified information
/// </summary>
/// <param name="action"></param>
/// <param name="north"></param>
/// <param name="west"></param>
public void ModifyTerrain(byte action, float north, float west)
/// <param name="height">The height at which the user started modifying the terrain</param>
/// <param name="seconds">The number of seconds the modify button was pressed</param>
/// <param name="brushsize">The size of the brush used</param>
/// <param name="action">The action to be performed</param>
/// <param name="north">Distance from the north border where the cursor is located</param>
/// <param name="west">Distance from the west border where the cursor is located</param>
public void ModifyTerrain(float height, float seconds, byte brushsize, byte action, float north, float west)
{
// Shiny.
double size = (double)(1 << brushsize);
switch (action)
{
case 0:
// flatten terrain
Terrain.flatten(north, west, size, (double)seconds / 100.0);
RegenerateTerrain(true, (int)north, (int)west);
break;
case 1:
// raise terrain
Terrain.raise(north, west, 10.0, 0.001);
Terrain.raise(north, west, size, (double)seconds / 100.0);
RegenerateTerrain(true, (int)north, (int)west);
break;
case 2:
//lower terrain
Terrain.lower(north, west, 10.0, 0.001);
Terrain.lower(north, west, size, (double)seconds / 100.0);
RegenerateTerrain(true, (int)north, (int)west);
break;
case 3:
// smooth terrain
Terrain.smooth(north, west, size, (double)seconds / 100.0);
RegenerateTerrain(true, (int)north, (int)west);
break;
case 4:
// noise
Terrain.noise(north, west, size, (double)seconds / 100.0);
RegenerateTerrain(true, (int)north, (int)west);
break;
case 5:
// revert
Terrain.revert(north, west, size, (double)seconds / 100.0);
RegenerateTerrain(true, (int)north, (int)west);
break;
// CLIENT EXTENSIONS GO HERE
case 128:
// erode-thermal
break;
case 129:
// erode-aerobic
break;
case 130:
// erode-hydraulic
break;
}
return;
}

View File

@@ -130,7 +130,8 @@ namespace OpenSim
{
if (OnModifyTerrain != null)
{
OnModifyTerrain(modify.ModifyBlock.Action, modify.ParcelData[0].North, modify.ParcelData[0].West);
OnModifyTerrain(modify.ModifyBlock.Height, modify.ModifyBlock.Seconds, modify.ModifyBlock.BrushSize,
modify.ModifyBlock.Action, modify.ParcelData[0].North, modify.ParcelData[0].West);
}
}
break;

View File

@@ -541,6 +541,89 @@ namespace OpenSim.Terrain
tainted++;
}
/// <summary>
/// Flattens the land under the brush of specified coordinates (spherical mask)
/// </summary>
/// <param name="rx">Center of sphere</param>
/// <param name="ry">Center of sphere</param>
/// <param name="size">Radius of the sphere</param>
/// <param name="amount">Thickness of the mask (0..2 recommended)</param>
public void flatten(double rx, double ry, double size, double amount)
{
lock (heightmap)
{
heightmap.flatten(rx, ry, size, amount);
}
tainted++;
}
/// <summary>
/// Creates noise within the specified bounds
/// </summary>
/// <param name="rx">Center of the bounding sphere</param>
/// <param name="ry">Center of the bounding sphere</param>
/// <param name="size">The radius of the sphere</param>
/// <param name="amount">Strength of the mask (0..2) recommended</param>
public void noise(double rx, double ry, double size, double amount)
{
lock (heightmap)
{
Channel smoothed = new Channel();
smoothed.noise();
Channel mask = new Channel();
mask.raise(rx, ry, size, amount);
heightmap.blend(smoothed, mask);
}
tainted++;
}
/// <summary>
/// Reverts land within the specified bounds
/// </summary>
/// <param name="rx">Center of the bounding sphere</param>
/// <param name="ry">Center of the bounding sphere</param>
/// <param name="size">The radius of the sphere</param>
/// <param name="amount">Strength of the mask (0..2) recommended</param>
public void revert(double rx, double ry, double size, double amount)
{
lock (heightmap)
{
Channel mask = new Channel();
mask.raise(rx, ry, size, amount);
heightmap.blend(revertmap, mask);
}
tainted++;
}
/// <summary>
/// Smooths land under the brush of specified coordinates (spherical mask)
/// </summary>
/// <param name="rx">Center of the sphere</param>
/// <param name="ry">Center of the sphere</param>
/// <param name="size">Radius of the sphere</param>
/// <param name="amount">Thickness of the mask (0..2 recommended)</param>
public void smooth(double rx, double ry, double size, double amount)
{
lock (heightmap)
{
Channel smoothed = heightmap.copy();
smoothed.smooth(amount);
Channel mask = new Channel();
mask.raise(rx,ry,size,amount);
heightmap.blend(smoothed, mask);
}
tainted++;
}
/// <summary>
/// Generates a simple set of hills in the shape of an island
/// </summary>