OpenSim.Modules.PathFinding/src/PathFinder.cs

76 lines
2.3 KiB
C#

using OpenMetaverse;
using OpenSim.Region.Framework.Scenes;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OpenSim.Modules.PathFinding
{
class PathFinder
{
private UUID m_requestID = UUID.Zero;
private Scene m_scene = null;
private Bitmap m_bitmap = null;
public PathFinder(UUID requestID, Scene localScene)
{
m_requestID = requestID;
m_scene = localScene;
m_bitmap = new Bitmap((int)m_scene.RegionInfo.RegionSizeX, (int)m_scene.RegionInfo.RegionSizeY);
}
public void preparePathFindingScene(bool terrain)
{
convertRegionToBitmap(terrain);
saveDebugImageToDisc();
}
private void convertRegionToBitmap(bool terrain)
{
if (terrain == true)
{
for (int X = 0; X < m_scene.RegionInfo.RegionSizeX; X++)
{
for (int Y = 0; Y < m_scene.RegionInfo.RegionSizeY; Y++)
{
float baseheight = (float)m_scene.Heightmap[X, Y];
//Block the position then water is on this place.
if (baseheight <= m_scene.RegionInfo.RegionSettings.WaterHeight)
m_bitmap.SetPixel(X, Y, Color.Black);
//Allow all positions they have terrain over the water height.
if (baseheight > m_scene.RegionInfo.RegionSettings.WaterHeight)
m_bitmap.SetPixel(X, Y, Color.White);
}
}
}
else
{
for (int X = 0; X < m_scene.RegionInfo.RegionSizeX; X++)
{
for (int Y = 0; Y < m_scene.RegionInfo.RegionSizeY; Y++)
{
m_bitmap.SetPixel(X, Y, Color.Black);
}
}
}
PathFindingSceneGenerator.DrawObjectVolume(m_scene, ref m_bitmap);
}
private void saveDebugImageToDisc()
{
m_bitmap.Save(m_requestID + ".png", ImageFormat.Png);
}
}
}