master
Christopher 2020-08-06 22:20:39 +02:00
parent 0ff367ef6a
commit 3e8ca0b273
2 changed files with 45 additions and 13 deletions

View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Flocking
{
class FlowEntry
{
public float X = 0;
public float Y = 0;
public float Z = 0;
public float Value = 0;
public FlowEntry(float x, float y, float z, float value)
{
X = x;
Y = y;
Z = z;
Value = value;
}
}
}

View File

@ -27,6 +27,7 @@
*/
using System;
using System.Collections.Generic;
using OpenMetaverse;
using OpenSim.Region.Framework.Scenes;
@ -35,12 +36,13 @@ namespace Flocking
public class FlowMap
{
private Scene m_scene;
private double[, ,] m_flowMap;
private uint regionX;
private uint regionY;
private uint regionZ;
private float regionBorder;
private List<FlowEntry> m_flowMap = new List<FlowEntry>();
public FlowMap (Scene scene, int maxHeight, float borderSize)
{
m_scene = scene;
@ -48,7 +50,6 @@ namespace Flocking
regionY = m_scene.RegionInfo.RegionSizeY;
regionZ = (uint)maxHeight;
regionBorder = borderSize;
m_flowMap = new double[regionX, regionY, regionZ];
}
public int LengthX {
@ -68,20 +69,20 @@ namespace Flocking
//fill in the boundaries
for( int x = 0; x < regionX; x++ ) {
for( int y = 0; y < regionY; y++ ) {
m_flowMap[x,y,0] = 100;
m_flowMap[x,y, regionZ-1] = 100;
m_flowMap.Add(new FlowEntry(x, y, 0, 100));
m_flowMap.Add(new FlowEntry(x, y, regionZ - 1, 100));
}
}
for( int x = 0; x < regionX; x++ ) {
for( int z = 0; z < regionZ; z++ ) {
m_flowMap[x,0,z] = 100;
m_flowMap[x,regionY-1,z] = 100;
m_flowMap.Add(new FlowEntry(x, 0, z, 100));
m_flowMap.Add(new FlowEntry(x, regionY - 1, z, 100));
}
}
for( int y = 0; y < regionY; y++ ) {
for( int z = 0; z < regionZ; z++ ) {
m_flowMap[0,y,z] = 100;
m_flowMap[regionX-1,y,z] = 100;
m_flowMap.Add(new FlowEntry(0, y, z, 100));
m_flowMap.Add(new FlowEntry(regionX - 1, y, z, 100));
}
}
@ -91,7 +92,7 @@ namespace Flocking
int zMax = Convert.ToInt32(m_scene.GetGroundHeight( x, y ));
for( int z = 1; z < zMax; z++ ) {
if (x < regionX && y < regionY && z < zMax)
m_flowMap[x,y,z] = 100;
m_flowMap.Add(new FlowEntry(x, y, z, 100));
}
}
}
@ -119,7 +120,7 @@ namespace Flocking
for( int y = minY; y < maxY; y++ ) {
for( int z = minZ; z < maxZ; z++ ) {
if(x < maxX && y < maxY && z < maxX)
m_flowMap[x,y,z] = 100;
m_flowMap.Add(new FlowEntry(x, y, z, 100));
}
}
}
@ -186,14 +187,20 @@ namespace Flocking
public bool IsWithinObstacle( int x, int y, int z ) {
bool retVal = false;
if (x >= LengthX || y >= LengthY || z >= LengthZ)
FlowEntry flow = m_flowMap.Find(X => X.X == x && X.Y == y && X.Z == z);
if (flow == null)
return retVal;
if (x >= LengthX || y >= LengthY || z >= LengthZ)
{
retVal = true;
}
else if (x < 0 || y < 0 || z < 0)
{
retVal = true;
} else if (m_flowMap[x,y,z] > 50) {
} else if (flow.Value > 50) {
retVal = true;
}
return retVal;