* 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 brushSugilite
parent
e4c915eebc
commit
8194d82230
|
@ -37,7 +37,7 @@ namespace OpenSim.Framework.Interfaces
|
||||||
{
|
{
|
||||||
public delegate void ChatFromViewer(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID);
|
public delegate void ChatFromViewer(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID);
|
||||||
public delegate void RezObject(AssetBase primAsset, LLVector3 pos);
|
public delegate void RezObject(AssetBase primAsset, LLVector3 pos);
|
||||||
public delegate void ModifyTerrain(byte action, float north, float west);
|
public delegate void ModifyTerrain(float height, float seconds, byte size, byte action, float north, float west);
|
||||||
public delegate void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam);
|
public delegate void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam);
|
||||||
public delegate void StartAnim(LLUUID animID, int seq);
|
public delegate void StartAnim(LLUUID animID, int seq);
|
||||||
public delegate void LinkObjects(uint parent, List<uint> children);
|
public delegate void LinkObjects(uint parent, List<uint> children);
|
||||||
|
|
78
OpenSim.sln
78
OpenSim.sln
|
@ -55,84 +55,6 @@ Global
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
Release|Any CPU = Release|Any CPU
|
Release|Any CPU = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectDependencies) = postSolution
|
|
||||||
({683344D5-0000-0000-0000-000000000000}).1 = ({62CDF671-0000-0000-0000-000000000000})
|
|
||||||
({683344D5-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({39BD9497-0000-0000-0000-000000000000}).2 = ({62CDF671-0000-0000-0000-000000000000})
|
|
||||||
({DA9A7391-0000-0000-0000-000000000000}).2 = ({62CDF671-0000-0000-0000-000000000000})
|
|
||||||
({DA9A7391-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({DA9A7391-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({DA9A7391-0000-0000-0000-000000000000}).5 = ({E88EF749-0000-0000-0000-000000000000})
|
|
||||||
({DA9A7391-0000-0000-0000-000000000000}).6 = ({8BB20F0A-0000-0000-0000-000000000000})
|
|
||||||
({DA9A7391-0000-0000-0000-000000000000}).10 = ({8E81D43C-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).3 = ({683344D5-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).4 = ({1938EB12-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).7 = ({E88EF749-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).8 = ({79CED992-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).9 = ({8BE16150-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).10 = ({196916AF-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).11 = ({632E1BFD-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).12 = ({8BB20F0A-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).13 = ({2270B8FE-0000-0000-0000-000000000000})
|
|
||||||
({438A9556-0000-0000-0000-000000000000}).16 = ({8E81D43C-0000-0000-0000-000000000000})
|
|
||||||
({1938EB12-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({8ACA2445-0000-0000-0000-000000000000}).2 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({8ACA2445-0000-0000-0000-000000000000}).5 = ({8E81D43C-0000-0000-0000-000000000000})
|
|
||||||
({E88EF749-0000-0000-0000-000000000000}).0 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({546099CD-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({546099CD-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({B55C0B5D-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({B55C0B5D-0000-0000-0000-000000000000}).2 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({B55C0B5D-0000-0000-0000-000000000000}).5 = ({8E81D43C-0000-0000-0000-000000000000})
|
|
||||||
({79CED992-0000-0000-0000-000000000000}).1 = ({683344D5-0000-0000-0000-000000000000})
|
|
||||||
({79CED992-0000-0000-0000-000000000000}).2 = ({62CDF671-0000-0000-0000-000000000000})
|
|
||||||
({79CED992-0000-0000-0000-000000000000}).3 = ({DA9A7391-0000-0000-0000-000000000000})
|
|
||||||
({79CED992-0000-0000-0000-000000000000}).4 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({4F874463-0000-0000-0000-000000000000}).1 = ({8BE16150-0000-0000-0000-000000000000})
|
|
||||||
({8BE16150-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({8BE16150-0000-0000-0000-000000000000}).2 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({63A05FE9-0000-0000-0000-000000000000}).2 = ({8BE16150-0000-0000-0000-000000000000})
|
|
||||||
({988F0AC4-0000-0000-0000-000000000000}).1 = ({8BE16150-0000-0000-0000-000000000000})
|
|
||||||
({196916AF-0000-0000-0000-000000000000}).3 = ({683344D5-0000-0000-0000-000000000000})
|
|
||||||
({196916AF-0000-0000-0000-000000000000}).4 = ({1938EB12-0000-0000-0000-000000000000})
|
|
||||||
({196916AF-0000-0000-0000-000000000000}).5 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({196916AF-0000-0000-0000-000000000000}).6 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({196916AF-0000-0000-0000-000000000000}).7 = ({E88EF749-0000-0000-0000-000000000000})
|
|
||||||
({196916AF-0000-0000-0000-000000000000}).8 = ({8BE16150-0000-0000-0000-000000000000})
|
|
||||||
({196916AF-0000-0000-0000-000000000000}).9 = ({8BB20F0A-0000-0000-0000-000000000000})
|
|
||||||
({196916AF-0000-0000-0000-000000000000}).10 = ({2270B8FE-0000-0000-0000-000000000000})
|
|
||||||
({196916AF-0000-0000-0000-000000000000}).13 = ({8E81D43C-0000-0000-0000-000000000000})
|
|
||||||
({632E1BFD-0000-0000-0000-000000000000}).3 = ({1938EB12-0000-0000-0000-000000000000})
|
|
||||||
({632E1BFD-0000-0000-0000-000000000000}).4 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({632E1BFD-0000-0000-0000-000000000000}).5 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({632E1BFD-0000-0000-0000-000000000000}).6 = ({E88EF749-0000-0000-0000-000000000000})
|
|
||||||
({632E1BFD-0000-0000-0000-000000000000}).7 = ({8BE16150-0000-0000-0000-000000000000})
|
|
||||||
({632E1BFD-0000-0000-0000-000000000000}).8 = ({196916AF-0000-0000-0000-000000000000})
|
|
||||||
({632E1BFD-0000-0000-0000-000000000000}).9 = ({8BB20F0A-0000-0000-0000-000000000000})
|
|
||||||
({632E1BFD-0000-0000-0000-000000000000}).10 = ({2270B8FE-0000-0000-0000-000000000000})
|
|
||||||
({632E1BFD-0000-0000-0000-000000000000}).13 = ({8E81D43C-0000-0000-0000-000000000000})
|
|
||||||
({8BB20F0A-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({8BB20F0A-0000-0000-0000-000000000000}).2 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({8BB20F0A-0000-0000-0000-000000000000}).5 = ({8E81D43C-0000-0000-0000-000000000000})
|
|
||||||
({EE9E5D96-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({EE9E5D96-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({E1B79ECF-0000-0000-0000-000000000000}).2 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({E1B79ECF-0000-0000-0000-000000000000}).3 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({6B20B603-0000-0000-0000-000000000000}).1 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({6B20B603-0000-0000-0000-000000000000}).2 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({24B12448-0000-0000-0000-000000000000}).1 = ({683344D5-0000-0000-0000-000000000000})
|
|
||||||
({24B12448-0000-0000-0000-000000000000}).2 = ({1938EB12-0000-0000-0000-000000000000})
|
|
||||||
({24B12448-0000-0000-0000-000000000000}).3 = ({8ACA2445-0000-0000-0000-000000000000})
|
|
||||||
({24B12448-0000-0000-0000-000000000000}).4 = ({A7CD0630-0000-0000-0000-000000000000})
|
|
||||||
({24B12448-0000-0000-0000-000000000000}).5 = ({546099CD-0000-0000-0000-000000000000})
|
|
||||||
({24B12448-0000-0000-0000-000000000000}).6 = ({79CED992-0000-0000-0000-000000000000})
|
|
||||||
({24B12448-0000-0000-0000-000000000000}).7 = ({196916AF-0000-0000-0000-000000000000})
|
|
||||||
({24B12448-0000-0000-0000-000000000000}).8 = ({632E1BFD-0000-0000-0000-000000000000})
|
|
||||||
({24B12448-0000-0000-0000-000000000000}).9 = ({8BB20F0A-0000-0000-0000-000000000000})
|
|
||||||
({24B12448-0000-0000-0000-000000000000}).13 = ({8E81D43C-0000-0000-0000-000000000000})
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{683344D5-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{683344D5-0000-0000-0000-000000000000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{683344D5-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{683344D5-0000-0000-0000-000000000000}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
|
|
@ -19,13 +19,13 @@ namespace SimpleApp
|
||||||
{
|
{
|
||||||
class Program : IAssetReceiver, conscmd_callback
|
class Program : IAssetReceiver, conscmd_callback
|
||||||
{
|
{
|
||||||
private LogBase m_console;
|
private LogBase m_log;
|
||||||
AuthenticateSessionsBase m_circuitManager;
|
AuthenticateSessionsBase m_circuitManager;
|
||||||
|
|
||||||
private void Run()
|
private void Run()
|
||||||
{
|
{
|
||||||
m_console = new LogBase(null, "SimpleApp", this, false);
|
m_log = new LogBase(null, "SimpleApp", this, false);
|
||||||
MainLog.Instance = m_console;
|
MainLog.Instance = m_log;
|
||||||
|
|
||||||
CheckSumServer checksumServer = new CheckSumServer(12036);
|
CheckSumServer checksumServer = new CheckSumServer(12036);
|
||||||
checksumServer.ServerListener();
|
checksumServer.ServerListener();
|
||||||
|
@ -47,7 +47,7 @@ namespace SimpleApp
|
||||||
|
|
||||||
AssetCache assetCache = new AssetCache(assetServer);
|
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 );
|
PacketServer packetServer = new PacketServer( udpServer, (uint) simPort );
|
||||||
udpServer.ServerListener();
|
udpServer.ServerListener();
|
||||||
|
|
||||||
|
@ -68,13 +68,13 @@ namespace SimpleApp
|
||||||
httpServer.AddXmlRPCHandler( "login_to_simulator", loginServer.XmlRpcLoginMethod );
|
httpServer.AddXmlRPCHandler( "login_to_simulator", loginServer.XmlRpcLoginMethod );
|
||||||
httpServer.Start();
|
httpServer.Start();
|
||||||
|
|
||||||
m_console.WriteLine( LogPriority.NORMAL, "Press enter to quit.");
|
m_log.WriteLine( LogPriority.NORMAL, "Press enter to quit.");
|
||||||
m_console.ReadLine();
|
m_log.ReadLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool AddNewSessionHandler(ulong regionHandle, Login loginData)
|
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();
|
AgentCircuitData agent = new AgentCircuitData();
|
||||||
agent.AgentID = loginData.Agent;
|
agent.AgentID = loginData.Agent;
|
||||||
|
|
|
@ -41,25 +41,62 @@ namespace OpenSim.Region.Scenes
|
||||||
public partial class Scene
|
public partial class Scene
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Modifies terrain using the specified information
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="action"></param>
|
/// <param name="height">The height at which the user started modifying the terrain</param>
|
||||||
/// <param name="north"></param>
|
/// <param name="seconds">The number of seconds the modify button was pressed</param>
|
||||||
/// <param name="west"></param>
|
/// <param name="brushsize">The size of the brush used</param>
|
||||||
public void ModifyTerrain(byte action, float north, float west)
|
/// <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)
|
switch (action)
|
||||||
{
|
{
|
||||||
|
case 0:
|
||||||
|
// flatten terrain
|
||||||
|
Terrain.flatten(north, west, size, (double)seconds / 100.0);
|
||||||
|
RegenerateTerrain(true, (int)north, (int)west);
|
||||||
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
// raise terrain
|
// 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);
|
RegenerateTerrain(true, (int)north, (int)west);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
//lower terrain
|
//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);
|
RegenerateTerrain(true, (int)north, (int)west);
|
||||||
break;
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,7 +130,8 @@ namespace OpenSim
|
||||||
{
|
{
|
||||||
if (OnModifyTerrain != null)
|
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;
|
break;
|
||||||
|
|
|
@ -541,6 +541,89 @@ namespace OpenSim.Terrain
|
||||||
tainted++;
|
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>
|
/// <summary>
|
||||||
/// Generates a simple set of hills in the shape of an island
|
/// Generates a simple set of hills in the shape of an island
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
Loading…
Reference in New Issue