encapsulated parameters that control flock behaviour

stable0711
Jon Cundill 2011-07-17 12:42:48 +01:00
parent c1109c1810
commit bf2061a391
3 changed files with 56 additions and 61 deletions

View File

@ -0,0 +1,19 @@
using System;
namespace Flocking
{
public struct FlockParameters
{
public int flockSize;
public float maxSpeed;
public float maxForce;
public float neighbourDistance;
public float desiredSeparation;
public float tolerance;
public float separationWeighting;
public float alignmentWeighting;
public float cohesionWeighting;
public float lookaheadDistance;
}
}

View File

@ -35,17 +35,7 @@ namespace Flocking
{ {
private List<Boid> m_flock = new List<Boid>(); private List<Boid> m_flock = new List<Boid>();
private FlowField m_flowField; private FlowField m_flowField;
private float m_maxSpeed; private FlockParameters m_parameters;
private float m_maxForce;
private float m_neighbourDistance;
private float m_desiredSeparation;
private float m_tolerance;
private float m_separationWeighting = 1.5f;
private float m_alignmentWeighting = 1f;
private float m_cohesionWeighting = 1f;
private float m_lookaheadDistance = 100f;
private Random m_rnd = new Random(Environment.TickCount); private Random m_rnd = new Random(Environment.TickCount);
public int Size { public int Size {
@ -59,12 +49,8 @@ namespace Flocking
} }
} }
public FlockingModel( float maxSpeed, float maxForce, float neighbourDistance, float desiredSeparation, float tolerance ) { public FlockingModel( FlockParameters parameters ) {
m_maxSpeed = maxSpeed; m_parameters = parameters;
m_maxForce = maxForce;
m_neighbourDistance = neighbourDistance;
m_desiredSeparation = desiredSeparation;
m_tolerance = tolerance;
} }
void AddBoid (string name) void AddBoid (string name)
@ -82,57 +68,58 @@ namespace Flocking
} }
public float MaxSpeed { public float MaxSpeed {
get {return m_maxSpeed;} get {return m_parameters.maxSpeed;}
} }
public float MaxForce { public float MaxForce {
get {return m_maxForce;} get {return m_parameters.maxForce;}
} }
public float NeighbourDistance { public float NeighbourDistance {
get {return m_neighbourDistance;} get {return m_parameters.neighbourDistance;}
} }
public float DesiredSeparation { public float DesiredSeparation {
get {return m_desiredSeparation;} get {return m_parameters.desiredSeparation;}
} }
public float Tolerance { public float Tolerance {
get {return m_tolerance;} get {return m_parameters.tolerance;}
} }
public float SeparationWeighting { public float SeparationWeighting {
get{ return m_separationWeighting; } get{ return m_parameters.separationWeighting; }
set{ m_separationWeighting = value;} set{ m_parameters.separationWeighting = value;}
} }
public float AlignmentWeighting { public float AlignmentWeighting {
get{ return m_alignmentWeighting; } get{ return m_parameters.alignmentWeighting; }
set{ m_alignmentWeighting = value;} set{ m_parameters.alignmentWeighting = value;}
} }
public float CohesionWeighting { public float CohesionWeighting {
get{ return m_cohesionWeighting; } get{ return m_parameters.cohesionWeighting; }
set{ m_cohesionWeighting = value;} set{ m_parameters.cohesionWeighting = value;}
} }
public float LookaheadDistance { public float LookaheadDistance {
get { return m_lookaheadDistance; } get { return m_parameters.lookaheadDistance; }
set { m_lookaheadDistance = value;} set { m_parameters.lookaheadDistance = value;}
} }
public void Initialise (int num, FlowField flowField) public void Initialise (FlowField flowField)
{ {
m_flowField = flowField; m_flowField = flowField;
for (int i = 0; i < num; i++) { for (int i = 0; i < m_parameters.flockSize; i++) {
AddBoid ("boid"+i ); AddBoid ("boid"+i );
} }
} }
public List<Boid> GetNeighbours(Boid boid) { public List<Boid> GetNeighbours(Boid boid) {
return m_flock.FindAll(delegate(Boid other) { return m_flock.FindAll(delegate(Boid other)
return (boid != other) && (Utils.GetDistanceTo (boid.Location, other.Location) < m_neighbourDistance); {
return (boid != other) && (Utils.GetDistanceTo (boid.Location, other.Location) < m_parameters.neighbourDistance);
}); });
} }

View File

@ -54,17 +54,8 @@ namespace Flocking
private int m_frameUpdateRate = 1; private int m_frameUpdateRate = 1;
private int m_chatChannel = 118; private int m_chatChannel = 118;
private string m_boidPrim; private string m_boidPrim;
private int m_flockSize = 100;
private float m_maxSpeed;
private float m_maxForce;
private float m_neighbourDistance;
private float m_desiredSeparation;
private float m_tolerance;
private float m_separationWeighting = 1.5f;
private float m_alignmentWeighting = 1f;
private float m_cohesionWeighting = 1f;
private float m_lookaheadDistance = 100f;
private ChatCommandParser m_chatCommandParser; private ChatCommandParser m_chatCommandParser;
private FlockParameters m_parameters;
private UUID m_owner; private UUID m_owner;
@ -80,17 +71,18 @@ namespace Flocking
if (config != null) { if (config != null) {
m_chatChannel = config.GetInt ("chat-channel", 118); m_chatChannel = config.GetInt ("chat-channel", 118);
m_boidPrim = config.GetString ("boid-prim", "boidPrim"); m_boidPrim = config.GetString ("boid-prim", "boidPrim");
m_flockSize = config.GetInt ("flock-size", 100);
m_maxSpeed = config.GetFloat("max-speed", 3f);
m_maxForce = config.GetFloat("max-force", 0.25f);
m_neighbourDistance = config.GetFloat("neighbour-dist", 25f);
m_desiredSeparation = config.GetFloat("desired-separation", 20f);
m_tolerance = config.GetFloat("tolerance", 5f);
m_separationWeighting = config.GetFloat("separation-weighting", 1.5f);
m_alignmentWeighting = config.GetFloat("alignment-weighting", 1f);
m_cohesionWeighting = config.GetFloat("cohesion-weighting", 1f);
m_lookaheadDistance = config.GetFloat("lookahead-dist",100f);
m_parameters = new FlockParameters();
m_parameters.flockSize = config.GetInt ("flock-size", 100);
m_parameters.maxSpeed = config.GetFloat("max-speed", 3f);
m_parameters.maxForce = config.GetFloat("max-force", 0.25f);
m_parameters.neighbourDistance = config.GetFloat("neighbour-dist", 25f);
m_parameters.desiredSeparation = config.GetFloat("desired-separation", 20f);
m_parameters.tolerance = config.GetFloat("tolerance", 5f);
m_parameters.separationWeighting = config.GetFloat("separation-weighting", 1.5f);
m_parameters.alignmentWeighting = config.GetFloat("alignment-weighting", 1f);
m_parameters.cohesionWeighting = config.GetFloat("cohesion-weighting", 1f);
m_parameters.lookaheadDistance = config.GetFloat("lookahead-dist", 100f);
// we're in the config - so turn on this module // we're in the config - so turn on this module
m_enabled = true; m_enabled = true;
@ -111,11 +103,8 @@ namespace Flocking
m_scene.EventManager.OnChatFromClient += m_chatCommandParser.SimChatSent; //listen for commands sent from the client m_scene.EventManager.OnChatFromClient += m_chatCommandParser.SimChatSent; //listen for commands sent from the client
// init module // init module
m_model = new FlockingModel (m_maxSpeed, m_maxForce, m_neighbourDistance, m_desiredSeparation, m_tolerance); m_model = new FlockingModel (m_parameters);
m_model.SeparationWeighting = m_separationWeighting;
m_model.AlignmentWeighting = m_alignmentWeighting;
m_model.CohesionWeighting = m_cohesionWeighting;
m_model.LookaheadDistance = m_lookaheadDistance;
m_view = new FlockingView (m_scene); m_view = new FlockingView (m_scene);
m_view.BoidPrim = m_boidPrim; m_view.BoidPrim = m_boidPrim;
} }
@ -134,7 +123,7 @@ namespace Flocking
FlowField field = new FlowField(scene, new Vector3(128f, 128f, 128f), 200, 200, 200); FlowField field = new FlowField(scene, new Vector3(128f, 128f, 128f), 200, 200, 200);
// Generate initial flock values // Generate initial flock values
m_model.Initialise (m_flockSize, field); m_model.Initialise (field);
// who is the owner for the flock in this region // who is the owner for the flock in this region
m_owner = m_scene.RegionInfo.EstateSettings.EstateOwner; m_owner = m_scene.RegionInfo.EstateSettings.EstateOwner;