use List
parent
0ff367ef6a
commit
3e8ca0b273
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,6 +27,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
||||||
|
@ -35,12 +36,13 @@ namespace Flocking
|
||||||
public class FlowMap
|
public class FlowMap
|
||||||
{
|
{
|
||||||
private Scene m_scene;
|
private Scene m_scene;
|
||||||
private double[, ,] m_flowMap;
|
|
||||||
private uint regionX;
|
private uint regionX;
|
||||||
private uint regionY;
|
private uint regionY;
|
||||||
private uint regionZ;
|
private uint regionZ;
|
||||||
private float regionBorder;
|
private float regionBorder;
|
||||||
|
|
||||||
|
private List<FlowEntry> m_flowMap = new List<FlowEntry>();
|
||||||
|
|
||||||
public FlowMap (Scene scene, int maxHeight, float borderSize)
|
public FlowMap (Scene scene, int maxHeight, float borderSize)
|
||||||
{
|
{
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
@ -48,7 +50,6 @@ namespace Flocking
|
||||||
regionY = m_scene.RegionInfo.RegionSizeY;
|
regionY = m_scene.RegionInfo.RegionSizeY;
|
||||||
regionZ = (uint)maxHeight;
|
regionZ = (uint)maxHeight;
|
||||||
regionBorder = borderSize;
|
regionBorder = borderSize;
|
||||||
m_flowMap = new double[regionX, regionY, regionZ];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int LengthX {
|
public int LengthX {
|
||||||
|
@ -68,20 +69,20 @@ namespace Flocking
|
||||||
//fill in the boundaries
|
//fill in the boundaries
|
||||||
for( int x = 0; x < regionX; x++ ) {
|
for( int x = 0; x < regionX; x++ ) {
|
||||||
for( int y = 0; y < regionY; y++ ) {
|
for( int y = 0; y < regionY; y++ ) {
|
||||||
m_flowMap[x,y,0] = 100;
|
m_flowMap.Add(new FlowEntry(x, y, 0, 100));
|
||||||
m_flowMap[x,y, regionZ-1] = 100;
|
m_flowMap.Add(new FlowEntry(x, y, regionZ - 1, 100));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for( int x = 0; x < regionX; x++ ) {
|
for( int x = 0; x < regionX; x++ ) {
|
||||||
for( int z = 0; z < regionZ; z++ ) {
|
for( int z = 0; z < regionZ; z++ ) {
|
||||||
m_flowMap[x,0,z] = 100;
|
m_flowMap.Add(new FlowEntry(x, 0, z, 100));
|
||||||
m_flowMap[x,regionY-1,z] = 100;
|
m_flowMap.Add(new FlowEntry(x, regionY - 1, z, 100));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for( int y = 0; y < regionY; y++ ) {
|
for( int y = 0; y < regionY; y++ ) {
|
||||||
for( int z = 0; z < regionZ; z++ ) {
|
for( int z = 0; z < regionZ; z++ ) {
|
||||||
m_flowMap[0,y,z] = 100;
|
m_flowMap.Add(new FlowEntry(0, y, z, 100));
|
||||||
m_flowMap[regionX-1,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 ));
|
int zMax = Convert.ToInt32(m_scene.GetGroundHeight( x, y ));
|
||||||
for( int z = 1; z < zMax; z++ ) {
|
for( int z = 1; z < zMax; z++ ) {
|
||||||
if (x < regionX && y < regionY && z < zMax)
|
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 y = minY; y < maxY; y++ ) {
|
||||||
for( int z = minZ; z < maxZ; z++ ) {
|
for( int z = minZ; z < maxZ; z++ ) {
|
||||||
if(x < maxX && y < maxY && z < maxX)
|
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 ) {
|
public bool IsWithinObstacle( int x, int y, int z ) {
|
||||||
bool retVal = false;
|
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;
|
retVal = true;
|
||||||
}
|
}
|
||||||
else if (x < 0 || y < 0 || z < 0)
|
else if (x < 0 || y < 0 || z < 0)
|
||||||
{
|
{
|
||||||
retVal = true;
|
retVal = true;
|
||||||
} else if (m_flowMap[x,y,z] > 50) {
|
} else if (flow.Value > 50) {
|
||||||
retVal = true;
|
retVal = true;
|
||||||
}
|
}
|
||||||
return retVal;
|
return retVal;
|
||||||
|
|
Loading…
Reference in New Issue