expose additional parameters to ini files
parent
f0bc7e018b
commit
75f4750694
|
@ -40,13 +40,8 @@ namespace Flocking
|
||||||
private Vector3 m_vel;
|
private Vector3 m_vel;
|
||||||
private Vector3 m_acc;
|
private Vector3 m_acc;
|
||||||
private Random m_rndnums = new Random (Environment.TickCount);
|
private Random m_rndnums = new Random (Environment.TickCount);
|
||||||
private float m_tolerance; // how close can we get to things witout being edgy
|
|
||||||
private float m_maxForce; // Maximum steering force
|
|
||||||
private float m_maxSpeed; // Maximum speed
|
|
||||||
|
|
||||||
private float m_neighborDist = 25.0f;
|
|
||||||
private float m_desiredSeparation = 20.0f;
|
|
||||||
|
|
||||||
|
private FlockingModel m_model;
|
||||||
private FlowMap m_flowMap;
|
private FlowMap m_flowMap;
|
||||||
|
|
||||||
|
|
||||||
|
@ -62,14 +57,12 @@ namespace Flocking
|
||||||
/// <param name='mf'>
|
/// <param name='mf'>
|
||||||
/// Mf. max force / acceleration this boid can extert
|
/// Mf. max force / acceleration this boid can extert
|
||||||
/// </param>
|
/// </param>
|
||||||
public Boid (string id, float ms, float mf, FlowMap flowMap)
|
public Boid (string id, FlockingModel model, FlowMap flowMap)
|
||||||
{
|
{
|
||||||
m_id = id;
|
m_id = id;
|
||||||
m_acc = Vector3.Zero;
|
m_acc = Vector3.Zero;
|
||||||
m_vel = new Vector3 (m_rndnums.Next (-1, 1), m_rndnums.Next (-1, 1), m_rndnums.Next (-1, 1));
|
m_vel = new Vector3 (m_rndnums.Next (-1, 1), m_rndnums.Next (-1, 1), m_rndnums.Next (-1, 1));
|
||||||
m_tolerance = 5.0f;
|
m_model = model;
|
||||||
m_maxSpeed = ms;
|
|
||||||
m_maxForce = mf;
|
|
||||||
m_flowMap = flowMap;
|
m_flowMap = flowMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,7 +152,7 @@ namespace Flocking
|
||||||
m_vel += m_acc;
|
m_vel += m_acc;
|
||||||
// Limit speed
|
// Limit speed
|
||||||
//m_vel.limit(maxspeed);
|
//m_vel.limit(maxspeed);
|
||||||
m_vel = Util.Limit (m_vel, m_maxSpeed);
|
m_vel = Util.Limit (m_vel, m_model.MaxSpeed);
|
||||||
m_loc += m_vel;
|
m_loc += m_vel;
|
||||||
// Reset accelertion to 0 each cycle
|
// Reset accelertion to 0 each cycle
|
||||||
m_acc *= 0.0f;
|
m_acc *= 0.0f;
|
||||||
|
@ -201,15 +194,15 @@ namespace Flocking
|
||||||
desired.Normalize ();
|
desired.Normalize ();
|
||||||
// Two options for desired vector magnitude (1 -- based on distance, 2 -- maxspeed)
|
// Two options for desired vector magnitude (1 -- based on distance, 2 -- maxspeed)
|
||||||
if ((slowdown) && (d < 100.0f)) {
|
if ((slowdown) && (d < 100.0f)) {
|
||||||
desired *= (m_maxSpeed * (d / 100.0f)); // This damping is somewhat arbitrary
|
desired *= (m_model.MaxSpeed * (d / 100.0f)); // This damping is somewhat arbitrary
|
||||||
} else {
|
} else {
|
||||||
desired *= m_maxSpeed;
|
desired *= m_model.MaxSpeed;
|
||||||
}
|
}
|
||||||
// Steering = Desired minus Velocity
|
// Steering = Desired minus Velocity
|
||||||
//steer = target.sub(desired,m_vel);
|
//steer = target.sub(desired,m_vel);
|
||||||
steer = Vector3.Subtract (desired, m_vel);
|
steer = Vector3.Subtract (desired, m_vel);
|
||||||
//steer.limit(maxforce); // Limit to maximum steering force
|
//steer.limit(maxforce); // Limit to maximum steering force
|
||||||
steer = Util.Limit (steer, m_maxForce);
|
steer = Util.Limit (steer, m_model.MaxForce);
|
||||||
} else {
|
} else {
|
||||||
steer = Vector3.Zero;
|
steer = Vector3.Zero;
|
||||||
}
|
}
|
||||||
|
@ -226,7 +219,7 @@ namespace Flocking
|
||||||
{
|
{
|
||||||
//look tolerance metres ahead
|
//look tolerance metres ahead
|
||||||
Vector3 normVel = Vector3.Normalize(m_vel);
|
Vector3 normVel = Vector3.Normalize(m_vel);
|
||||||
Vector3 inFront = m_loc + Vector3.Multiply(normVel, m_tolerance);
|
Vector3 inFront = m_loc + Vector3.Multiply(normVel, m_model.Tolerance);
|
||||||
if( m_flowMap.WouldHitObstacle( m_loc, inFront ) ) {
|
if( m_flowMap.WouldHitObstacle( m_loc, inFront ) ) {
|
||||||
AdjustVelocityToAvoidObstacles ();
|
AdjustVelocityToAvoidObstacles ();
|
||||||
|
|
||||||
|
@ -243,7 +236,7 @@ namespace Flocking
|
||||||
normVel.X += xDelta;
|
normVel.X += xDelta;
|
||||||
normVel.Y += yDelta;
|
normVel.Y += yDelta;
|
||||||
normVel.Z += zDelta;
|
normVel.Z += zDelta;
|
||||||
Vector3 inFront = m_loc + Vector3.Multiply(normVel, m_tolerance);
|
Vector3 inFront = m_loc + Vector3.Multiply(normVel, m_model.Tolerance);
|
||||||
if( !m_flowMap.WouldHitObstacle( m_loc, inFront ) ) {
|
if( !m_flowMap.WouldHitObstacle( m_loc, inFront ) ) {
|
||||||
m_vel.X += xDelta;
|
m_vel.X += xDelta;
|
||||||
m_vel.Y += yDelta;
|
m_vel.Y += yDelta;
|
||||||
|
@ -280,7 +273,7 @@ namespace Flocking
|
||||||
foreach (Boid other in boids) {
|
foreach (Boid other in boids) {
|
||||||
float d = Vector3.Distance (m_loc, other.Location);
|
float d = Vector3.Distance (m_loc, other.Location);
|
||||||
// If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself)
|
// If the distance is greater than 0 and less than an arbitrary amount (0 when you are yourself)
|
||||||
if ((d > 0) && (d < m_desiredSeparation)) {
|
if ((d > 0) && (d < m_model.DesiredSeparation)) {
|
||||||
// Calculate vector pointing away from neighbor
|
// Calculate vector pointing away from neighbor
|
||||||
Vector3 diff = Vector3.Subtract (m_loc, other.Location);
|
Vector3 diff = Vector3.Subtract (m_loc, other.Location);
|
||||||
diff.Normalize ();
|
diff.Normalize ();
|
||||||
|
@ -298,10 +291,10 @@ namespace Flocking
|
||||||
if (steer.Length () > 0) {
|
if (steer.Length () > 0) {
|
||||||
// Implement Reynolds: Steering = Desired - Velocity
|
// Implement Reynolds: Steering = Desired - Velocity
|
||||||
steer.Normalize ();
|
steer.Normalize ();
|
||||||
steer *= m_maxSpeed;
|
steer *= m_model.MaxSpeed;
|
||||||
steer -= m_vel;
|
steer -= m_vel;
|
||||||
//steer.limit(maxforce);
|
//steer.limit(maxforce);
|
||||||
steer = Util.Limit (steer, m_maxForce);
|
steer = Util.Limit (steer, m_model.MaxForce);
|
||||||
}
|
}
|
||||||
return steer;
|
return steer;
|
||||||
}
|
}
|
||||||
|
@ -320,7 +313,7 @@ namespace Flocking
|
||||||
int count = 0;
|
int count = 0;
|
||||||
foreach (Boid other in boids) {
|
foreach (Boid other in boids) {
|
||||||
float d = Vector3.Distance (m_loc, other.Location);
|
float d = Vector3.Distance (m_loc, other.Location);
|
||||||
if ((d > 0) && (d < m_neighborDist)) {
|
if ((d > 0) && (d < m_model.NeighbourDistance)) {
|
||||||
steer += other.Velocity;
|
steer += other.Velocity;
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
@ -333,10 +326,10 @@ namespace Flocking
|
||||||
if (steer.Length () > 0) {
|
if (steer.Length () > 0) {
|
||||||
// Implement Reynolds: Steering = Desired - Velocity
|
// Implement Reynolds: Steering = Desired - Velocity
|
||||||
steer.Normalize ();
|
steer.Normalize ();
|
||||||
steer *= m_maxSpeed;
|
steer *= m_model.MaxSpeed;
|
||||||
steer -= m_vel;
|
steer -= m_vel;
|
||||||
//steer.limit(maxforce);
|
//steer.limit(maxforce);
|
||||||
steer = Util.Limit (steer, m_maxForce);
|
steer = Util.Limit (steer, m_model.MaxForce);
|
||||||
|
|
||||||
}
|
}
|
||||||
return steer;
|
return steer;
|
||||||
|
@ -357,7 +350,7 @@ namespace Flocking
|
||||||
|
|
||||||
foreach (Boid other in boids) {
|
foreach (Boid other in boids) {
|
||||||
float d = Vector3.Distance (m_loc, other.Location);
|
float d = Vector3.Distance (m_loc, other.Location);
|
||||||
if ((d > 0) && (d < m_neighborDist)) {
|
if ((d > 0) && (d < m_model.NeighbourDistance)) {
|
||||||
sum += other.Location; // Add location
|
sum += other.Location; // Add location
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
<include name="FlockingModel.cs" />
|
<include name="FlockingModel.cs" />
|
||||||
<include name="FlockingModule.cs" />
|
<include name="FlockingModule.cs" />
|
||||||
<include name="FlockingView.cs" />
|
<include name="FlockingView.cs" />
|
||||||
|
<include name="FlowMap.cs" />
|
||||||
<include name="Util.cs" />
|
<include name="Util.cs" />
|
||||||
</sources>
|
</sources>
|
||||||
<references basedir="${project::get-base-directory()}">
|
<references basedir="${project::get-base-directory()}">
|
||||||
|
|
|
@ -34,6 +34,11 @@ namespace Flocking
|
||||||
{
|
{
|
||||||
private List<Boid> m_flock = new List<Boid>();
|
private List<Boid> m_flock = new List<Boid>();
|
||||||
private FlowMap m_flowMap;
|
private FlowMap m_flowMap;
|
||||||
|
private float m_maxSpeed;
|
||||||
|
private float m_maxForce;
|
||||||
|
private float m_neighbourDistance;
|
||||||
|
private float m_desiredSeparation;
|
||||||
|
private float m_tolerance;
|
||||||
|
|
||||||
private Random m_rnd = new Random(Environment.TickCount);
|
private Random m_rnd = new Random(Environment.TickCount);
|
||||||
|
|
||||||
|
@ -47,10 +52,18 @@ namespace Flocking
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FlockingModel( float maxSpeed, float maxForce, float neighbourDistance, float desiredSeparation, float tolerance ) {
|
||||||
|
m_maxSpeed = maxSpeed;
|
||||||
|
m_maxForce = maxForce;
|
||||||
|
m_neighbourDistance = neighbourDistance;
|
||||||
|
m_desiredSeparation = desiredSeparation;
|
||||||
|
m_tolerance = tolerance;
|
||||||
|
}
|
||||||
|
|
||||||
void AddBoid (string name)
|
void AddBoid (string name)
|
||||||
{
|
{
|
||||||
Boid boid = new Boid (name, 3.0f, 0.05f, m_flowMap);
|
Boid boid = new Boid (name, this, m_flowMap);
|
||||||
|
|
||||||
// find an initial random location for this Boid
|
// find an initial random location for this Boid
|
||||||
// somewhere not within an obstacle
|
// somewhere not within an obstacle
|
||||||
|
@ -68,8 +81,27 @@ namespace Flocking
|
||||||
m_flock.Add (boid);
|
m_flock.Add (boid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float MaxSpeed {
|
||||||
|
get {return m_maxSpeed;}
|
||||||
|
}
|
||||||
|
|
||||||
|
public float MaxForce {
|
||||||
|
get {return m_maxForce;}
|
||||||
|
}
|
||||||
|
|
||||||
|
public float NeighbourDistance {
|
||||||
|
get {return m_neighbourDistance;}
|
||||||
|
}
|
||||||
|
|
||||||
|
public float DesiredSeparation {
|
||||||
|
get {return m_desiredSeparation;}
|
||||||
|
}
|
||||||
|
|
||||||
|
public float Tolerance {
|
||||||
|
get {return m_tolerance;}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public void Initialise (int num, FlowMap flowMap)
|
public void Initialise (int num, FlowMap flowMap)
|
||||||
{
|
{
|
||||||
m_flowMap = flowMap;
|
m_flowMap = flowMap;
|
||||||
|
|
|
@ -55,6 +55,12 @@ namespace Flocking
|
||||||
private int m_chatChannel = 118;
|
private int m_chatChannel = 118;
|
||||||
private string m_boidPrim;
|
private string m_boidPrim;
|
||||||
private int m_flockSize = 100;
|
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 UUID m_owner;
|
private UUID m_owner;
|
||||||
|
|
||||||
#region IRegionModule Members
|
#region IRegionModule Members
|
||||||
|
@ -70,6 +76,12 @@ namespace Flocking
|
||||||
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_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);
|
||||||
|
|
||||||
|
|
||||||
// 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;
|
||||||
|
@ -89,7 +101,7 @@ namespace Flocking
|
||||||
m_scene.EventManager.OnChatFromClient += SimChatSent; //listen for commands sent from the client
|
m_scene.EventManager.OnChatFromClient += SimChatSent; //listen for commands sent from the client
|
||||||
|
|
||||||
// init module
|
// init module
|
||||||
m_model = new FlockingModel ();
|
m_model = new FlockingModel (m_maxSpeed, m_maxForce, m_neighbourDistance, m_desiredSeparation, m_tolerance);
|
||||||
m_view = new FlockingView (m_scene);
|
m_view = new FlockingView (m_scene);
|
||||||
m_view.BoidPrim = m_boidPrim;
|
m_view.BoidPrim = m_boidPrim;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue