initial commit
commit
bcca860e88
|
@ -0,0 +1,4 @@
|
|||
The following people have contributed to the development of the osboids module
|
||||
|
||||
* Jon Cundill - initial implementation
|
||||
|
|
@ -0,0 +1,340 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, https://github.com/jonc/osboids
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace Flocking
|
||||
{
|
||||
public class Boid
|
||||
{
|
||||
private string m_id;
|
||||
|
||||
private Vector3 m_loc;
|
||||
private Quaternion m_rotation;
|
||||
private Vector3 m_vel;
|
||||
private Vector3 m_acc;
|
||||
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_width = 255f;
|
||||
private float m_height = 255f;
|
||||
|
||||
private float m_neighborDist = 25.0f;
|
||||
private float m_desiredSeparation = 20.0f;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="Flocking.Boid"/> class.
|
||||
/// </summary>
|
||||
/// <param name='l'>
|
||||
/// L. the initial position of this boid
|
||||
/// </param>
|
||||
/// <param name='ms'>
|
||||
/// Ms. max speed this boid can attain
|
||||
/// </param>
|
||||
/// <param name='mf'>
|
||||
/// Mf. max force / acceleration this boid can extert
|
||||
/// </param>
|
||||
public Boid (string id, float ms, float mf)
|
||||
{
|
||||
m_id = id;
|
||||
m_acc = Vector3.Zero;
|
||||
m_vel = new Vector3 (m_rndnums.Next (-1, 1), m_rndnums.Next (-1, 1), m_rndnums.Next (-1, 1));
|
||||
|
||||
m_tolerance = 2.0f;
|
||||
m_maxSpeed = ms;
|
||||
m_maxForce = mf;
|
||||
}
|
||||
|
||||
public Vector3 Location {
|
||||
get { return m_loc;}
|
||||
set { m_loc = value; }
|
||||
}
|
||||
|
||||
public Vector3 Velocity {
|
||||
get { return m_vel;}
|
||||
}
|
||||
|
||||
public Quaternion Rotation {
|
||||
get { return m_rotation; }
|
||||
}
|
||||
|
||||
public String Id {
|
||||
get {return m_id;}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Moves our boid in the scene relative to the rest of the flock.
|
||||
/// </summary>
|
||||
/// <param name='boids'>
|
||||
/// Boids. all the other chaps in the scene
|
||||
/// </param>
|
||||
public void MoveInSceneRelativeToFlock (List<Boid> boids)
|
||||
{
|
||||
Vector3 previousLoc = new Vector3( m_loc );
|
||||
Flock (boids);
|
||||
UpdatePositionInScene ();
|
||||
AvoidBorders ();
|
||||
|
||||
m_rotation = Vector3.RotationBetween( previousLoc, m_loc );
|
||||
|
||||
//render();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Move within our flock
|
||||
///
|
||||
/// We accumulate a new acceleration each time based on three rules
|
||||
/// these are:
|
||||
/// our separation from our closest neighbours,
|
||||
/// our desire to keep travelling within the local flock,
|
||||
/// our desire to move towards the flock centre
|
||||
///
|
||||
/// </summary>
|
||||
void Flock (List<Boid> boids)
|
||||
{
|
||||
|
||||
// calc the force vectors on this boid
|
||||
Vector3 sep = Separate (boids); // Separation
|
||||
Vector3 ali = Align (boids); // Alignment
|
||||
Vector3 coh = Cohesion (boids); // Cohesion
|
||||
|
||||
// Arbitrarily weight these forces
|
||||
//TODO: expose these consts
|
||||
sep *= 1.5f; //.mult(1.5);
|
||||
//ali.mult(1.0);
|
||||
ali *= 1.0f;
|
||||
//coh.mult(1.0);
|
||||
coh *= 1.0f;
|
||||
|
||||
// Add the force vectors to the current acceleration of the boid
|
||||
//acc.add(sep);
|
||||
m_acc += sep;
|
||||
//acc.add(ali);
|
||||
m_acc += ali;
|
||||
//acc.add(coh);
|
||||
m_acc += coh;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Method to update our location within the scene.
|
||||
/// update our location in the world based on our
|
||||
/// current location, velocity and acceleration
|
||||
/// taking into account our max speed
|
||||
///
|
||||
/// </summary>
|
||||
void UpdatePositionInScene ()
|
||||
{
|
||||
// Update velocity
|
||||
//vel.add(acc);
|
||||
m_vel += m_acc;
|
||||
// Limit speed
|
||||
//m_vel.limit(maxspeed);
|
||||
m_vel = Util.Limit (m_vel, m_maxSpeed);
|
||||
m_loc += m_vel;
|
||||
// Reset accelertion to 0 each cycle
|
||||
m_acc *= 0.0f;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Seek the specified target. Move into that flock
|
||||
/// Accelerate us towards where we want to go
|
||||
/// </summary>
|
||||
/// <param name='target'>
|
||||
/// Target. the position within the flock we would like to achieve
|
||||
/// </param>
|
||||
void Seek (Vector3 target)
|
||||
{
|
||||
m_acc += Steer (target, false);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Arrive the specified target. Slow us down, as we are almost there
|
||||
/// </summary>
|
||||
/// <param name='target'>
|
||||
/// Target. the flock we would like to think ourselves part of
|
||||
/// </param>
|
||||
void arrive (Vector3 target)
|
||||
{
|
||||
m_acc += Steer (target, true);
|
||||
}
|
||||
|
||||
/// A method that calculates a steering vector towards a target
|
||||
/// Takes a second argument, if true, it slows down as it approaches the target
|
||||
Vector3 Steer (Vector3 target, bool slowdown)
|
||||
{
|
||||
Vector3 steer; // The steering vector
|
||||
Vector3 desired = Vector3.Subtract(target, m_loc); // A vector pointing from the location to the target
|
||||
float d = desired.Length (); // Distance from the target is the magnitude of the vector
|
||||
// If the distance is greater than 0, calc steering (otherwise return zero vector)
|
||||
if (d > 0) {
|
||||
// Normalize desired
|
||||
desired.Normalize ();
|
||||
// Two options for desired vector magnitude (1 -- based on distance, 2 -- maxspeed)
|
||||
if ((slowdown) && (d < 100.0f)) {
|
||||
desired *= (m_maxSpeed * (d / 100.0f)); // This damping is somewhat arbitrary
|
||||
} else {
|
||||
desired *= m_maxSpeed;
|
||||
}
|
||||
// Steering = Desired minus Velocity
|
||||
//steer = target.sub(desired,m_vel);
|
||||
steer = Vector3.Subtract (desired, m_vel);
|
||||
//steer.limit(maxforce); // Limit to maximum steering force
|
||||
steer = Util.Limit (steer, m_maxForce);
|
||||
} else {
|
||||
steer = Vector3.Zero;
|
||||
}
|
||||
return steer;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Borders this instance.
|
||||
/// if we get too close wrap us around
|
||||
/// CHANGE THIS to navigate away from whatever it is we are too close to
|
||||
/// </summary>
|
||||
void AvoidBorders ()
|
||||
{
|
||||
if (m_loc.X < 5 || m_loc.X > 250)
|
||||
m_vel.X = -m_vel.X;
|
||||
if (m_loc.Y < 5 || m_loc.Y > 250)
|
||||
m_vel.Y = -m_vel.Y;
|
||||
if (m_loc.Z < 21 || m_loc.Z > 271 )
|
||||
m_vel.Z = -m_vel.Z;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Separate ourselves from the specified boids.
|
||||
/// keeps us a respectable distance from our closest neighbours whilst still
|
||||
/// being part of our local flock
|
||||
/// </summary>
|
||||
/// <param name='boids'>
|
||||
/// Boids. all the boids in the scene
|
||||
/// </param>
|
||||
Vector3 Separate (List<Boid> boids)
|
||||
{
|
||||
Vector3 steer = new Vector3 (0, 0, 0);
|
||||
int count = 0;
|
||||
// For every boid in the system, check if it's too close
|
||||
foreach (Boid other in boids) {
|
||||
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 ((d > 0) && (d < m_desiredSeparation)) {
|
||||
// Calculate vector pointing away from neighbor
|
||||
Vector3 diff = Vector3.Subtract (m_loc, other.Location);
|
||||
diff.Normalize ();
|
||||
diff = Vector3.Divide (diff, d);
|
||||
steer = Vector3.Add (steer, diff);
|
||||
count++; // Keep track of how many
|
||||
}
|
||||
}
|
||||
// Average -- divide by how many
|
||||
if (count > 0) {
|
||||
steer /= (float)count;
|
||||
}
|
||||
|
||||
// As long as the vector is greater than 0
|
||||
if (steer.Length () > 0) {
|
||||
// Implement Reynolds: Steering = Desired - Velocity
|
||||
steer.Normalize ();
|
||||
steer *= m_maxSpeed;
|
||||
steer -= m_vel;
|
||||
//steer.limit(maxforce);
|
||||
steer = Util.Limit (steer, m_maxForce);
|
||||
}
|
||||
return steer;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Align our boid within the flock.
|
||||
/// For every nearby boid in the system, calculate the average velocity
|
||||
/// and move us towards that - this keeps us moving with the flock.
|
||||
/// </summary>
|
||||
/// <param name='boids'>
|
||||
/// Boids. all the boids in the scene - we only really care about those in the neighbourdist
|
||||
/// </param>
|
||||
Vector3 Align (List<Boid> boids)
|
||||
{
|
||||
Vector3 steer = new Vector3 (0, 0, 0);
|
||||
int count = 0;
|
||||
foreach (Boid other in boids) {
|
||||
float d = Vector3.Distance (m_loc, other.Location);
|
||||
if ((d > 0) && (d < m_neighborDist)) {
|
||||
steer += other.Velocity;
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if (count > 0) {
|
||||
steer /= (float)count;
|
||||
}
|
||||
|
||||
// As long as the vector is greater than 0
|
||||
if (steer.Length () > 0) {
|
||||
// Implement Reynolds: Steering = Desired - Velocity
|
||||
steer.Normalize ();
|
||||
steer *= m_maxSpeed;
|
||||
steer -= m_vel;
|
||||
//steer.limit(maxforce);
|
||||
steer = Util.Limit (steer, m_maxForce);
|
||||
|
||||
}
|
||||
return steer;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// MAintain the cohesion of our local flock
|
||||
/// For the average location (i.e. center) of all nearby boids, calculate our steering vector towards that location
|
||||
/// </summary>
|
||||
/// <param name='boids'>
|
||||
/// Boids. the boids in the scene
|
||||
/// </param>
|
||||
Vector3 Cohesion (List<Boid> boids)
|
||||
{
|
||||
|
||||
Vector3 sum = Vector3.Zero; // Start with empty vector to accumulate all locations
|
||||
int count = 0;
|
||||
|
||||
foreach (Boid other in boids) {
|
||||
float d = Vector3.Distance (m_loc, other.Location);
|
||||
if ((d > 0) && (d < m_neighborDist)) {
|
||||
sum += other.Location; // Add location
|
||||
count++;
|
||||
}
|
||||
}
|
||||
if (count > 0) {
|
||||
sum /= (float)count;
|
||||
return Steer (sum, false); // Steer towards the location
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,138 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
|
||||
<PropertyGroup>
|
||||
<ProjectType>Local</ProjectType>
|
||||
<ProductVersion>9.0.21022</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{7BC283D1-0000-0000-0000-000000000000}</ProjectGuid>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<AssemblyKeyContainerName>
|
||||
</AssemblyKeyContainerName>
|
||||
<AssemblyName>Flocking</AssemblyName>
|
||||
<DefaultClientScript>JScript</DefaultClientScript>
|
||||
<DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>
|
||||
<DefaultTargetSchema>IE50</DefaultTargetSchema>
|
||||
<DelaySign>false</DelaySign>
|
||||
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>
|
||||
</AppDesignerFolder>
|
||||
<RootNamespace>Flocking</RootNamespace>
|
||||
<StartArguments>
|
||||
</StartArguments>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<BaseAddress>285212672</BaseAddress>
|
||||
<ConfigurationOverrideFile>
|
||||
</ConfigurationOverrideFile>
|
||||
<DefineConstants>TRACE;DEBUG</DefineConstants>
|
||||
<DocumentationFile>
|
||||
</DocumentationFile>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<FileAlignment>4096</FileAlignment>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\..\..\bin\</OutputPath>
|
||||
<RegisterForComInterop>False</RegisterForComInterop>
|
||||
<RemoveIntegerChecks>False</RemoveIntegerChecks>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>full</DebugType>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<BaseAddress>285212672</BaseAddress>
|
||||
<ConfigurationOverrideFile>
|
||||
</ConfigurationOverrideFile>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DocumentationFile>
|
||||
</DocumentationFile>
|
||||
<FileAlignment>4096</FileAlignment>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>..\..\..\bin\</OutputPath>
|
||||
<RegisterForComInterop>False</RegisterForComInterop>
|
||||
<RemoveIntegerChecks>False</RemoveIntegerChecks>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System">
|
||||
<Name>System</Name>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Drawing">
|
||||
<Name>System.Drawing</Name>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml">
|
||||
<Name>System.Xml</Name>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821">
|
||||
<HintPath>..\..\..\bin\log4net.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="Nini, Version=1.1.0.0, Culture=neutral, PublicKeyToken=null">
|
||||
<HintPath>..\..\..\bin\Nini.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="OpenMetaverse, Version=0.9.0.29631, Culture=neutral, PublicKeyToken=null">
|
||||
<HintPath>..\..\..\bin\OpenMetaverse.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
<Reference Include="OpenMetaverseTypes, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
|
||||
<HintPath>..\..\..\bin\OpenMetaverseTypes.dll</HintPath>
|
||||
<Private>False</Private>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\..\OpenSim\Framework\OpenSim.Framework.csproj">
|
||||
<Project>{7404933D-0000-0000-0000-000000000000}</Project>
|
||||
<Name>OpenSim.Framework</Name>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\OpenSim\Framework\Communications\OpenSim.Framework.Communications.csproj">
|
||||
<Project>{7667FA4E-0000-0000-0000-000000000000}</Project>
|
||||
<Name>OpenSim.Framework.Communications</Name>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\OpenSim\Framework\Console\OpenSim.Framework.Console.csproj">
|
||||
<Project>{16759386-0000-0000-0000-000000000000}</Project>
|
||||
<Name>OpenSim.Framework.Console</Name>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\..\OpenSim\Region\Framework\OpenSim.Region.Framework.csproj">
|
||||
<Project>{9169B545-0000-0000-0000-000000000000}</Project>
|
||||
<Name>OpenSim.Region.Framework</Name>
|
||||
<Private>False</Private>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Boid.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FlockingModel.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FlockingModule.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="FlockingView.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Util.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="Resources\Flocking.addin.xml">
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSHARP.Targets" />
|
||||
<PropertyGroup>
|
||||
<PreBuildEvent>
|
||||
</PreBuildEvent>
|
||||
<PostBuildEvent>
|
||||
</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -0,0 +1,12 @@
|
|||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ReferencePath>/Users/jon/osim/opensim/bin/</ReferencePath>
|
||||
<LastOpenVersion>9.0.21022</LastOpenVersion>
|
||||
<ProjectView>ProjectFiles</ProjectView>
|
||||
<ProjectTrust>0</ProjectTrust>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition = " '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' " />
|
||||
<PropertyGroup Condition = " '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " />
|
||||
</Project>
|
|
@ -0,0 +1,60 @@
|
|||
<?xml version="1.0" ?>
|
||||
<project name="Flocking" default="build">
|
||||
<target name="build">
|
||||
<echo message="Build Directory is ${project::get-base-directory()}/${build.dir}" />
|
||||
<mkdir dir="${project::get-base-directory()}/${build.dir}" />
|
||||
<copy todir="${project::get-base-directory()}/${build.dir}" flatten="true">
|
||||
<fileset basedir="${project::get-base-directory()}">
|
||||
</fileset>
|
||||
</copy>
|
||||
<copy todir="${project::get-base-directory()}/${build.dir}">
|
||||
<fileset basedir=".">
|
||||
</fileset>
|
||||
</copy>
|
||||
<csc target="library" debug="${build.debug}" platform="${build.platform}" unsafe="False" warnaserror="False" define="TRACE;DEBUG" nostdlib="False" main="" output="${project::get-base-directory()}/${build.dir}/${project::get-name()}.dll" noconfig="true">
|
||||
<resources prefix="Flocking" dynamicprefix="true" >
|
||||
<include name="Resources/Flocking.addin.xml" />
|
||||
</resources>
|
||||
<sources failonempty="true">
|
||||
<include name="Boid.cs" />
|
||||
<include name="FlockingModel.cs" />
|
||||
<include name="FlockingModule.cs" />
|
||||
<include name="FlockingView.cs" />
|
||||
<include name="Util.cs" />
|
||||
</sources>
|
||||
<references basedir="${project::get-base-directory()}">
|
||||
<lib>
|
||||
<include name="${project::get-base-directory()}" />
|
||||
<include name="${project::get-base-directory()}/../../../bin" />
|
||||
</lib>
|
||||
<include name="../../../bin/log4net.dll"/>
|
||||
<include name="../../../bin/Nini.dll"/>
|
||||
<include name="../../../bin/OpenMetaverse.dll"/>
|
||||
<include name="../../../bin/OpenMetaverseTypes.dll"/>
|
||||
<include name="../../../bin/OpenSim.Framework.dll"/>
|
||||
<include name="../../../bin/OpenSim.Framework.Communications.dll"/>
|
||||
<include name="../../../bin/OpenSim.Framework.Console.dll"/>
|
||||
<include name="../../../bin/OpenSim.Region.Framework.dll"/>
|
||||
<include name="System.dll" />
|
||||
<include name="System.Drawing.dll" />
|
||||
<include name="System.Xml.dll" />
|
||||
</references>
|
||||
</csc>
|
||||
<echo message="Copying from [${project::get-base-directory()}/${build.dir}/] to [${project::get-base-directory()}/../../../bin/" />
|
||||
<mkdir dir="${project::get-base-directory()}/../../../bin/"/>
|
||||
<copy todir="${project::get-base-directory()}/../../../bin/">
|
||||
<fileset basedir="${project::get-base-directory()}/${build.dir}/" >
|
||||
<include name="*.dll"/>
|
||||
<include name="*.exe"/>
|
||||
<include name="*.mdb" if='${build.debug}'/>
|
||||
<include name="*.pdb" if='${build.debug}'/>
|
||||
</fileset>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="clean">
|
||||
<delete dir="${bin.dir}" failonerror="false" />
|
||||
<delete dir="${obj.dir}" failonerror="false" />
|
||||
</target>
|
||||
<target name="doc" description="Creates documentation.">
|
||||
</target>
|
||||
</project>
|
Binary file not shown.
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, https://github.com/jonc/osboids
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace Flocking
|
||||
{
|
||||
public class FlockingModel
|
||||
{
|
||||
private List<Boid> flock = new List<Boid>();
|
||||
|
||||
|
||||
public void Initialise (int num, int xRange, int yRange, int zRange)
|
||||
{
|
||||
//TODO: fill in the initial Flock array properly
|
||||
for (int i = 0; i < num; i++) {
|
||||
Boid boid = new Boid ("boid"+i, 3.0f, 0.05f);
|
||||
boid.Location = new Vector3 (xRange / 2f, yRange / 2f, zRange / 2f);
|
||||
flock.Add (boid);
|
||||
}
|
||||
}
|
||||
|
||||
public List<Boid> UpdateFlockPos ()
|
||||
{
|
||||
foreach (Boid b in flock) {
|
||||
b.MoveInSceneRelativeToFlock(flock); // Passing the entire list of boids to each boid individually
|
||||
}
|
||||
|
||||
return flock;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,155 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, https://github.com/jonc/osboids
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Timers;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
using System.IO;
|
||||
using Nini.Config;
|
||||
using System.Threading;
|
||||
using log4net;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Console;
|
||||
|
||||
|
||||
|
||||
namespace Flocking
|
||||
{
|
||||
public class FlockingModule : INonSharedRegionModule
|
||||
{
|
||||
|
||||
private static readonly ILog m_log = LogManager.GetLogger (System.Reflection.MethodBase.GetCurrentMethod ().DeclaringType);
|
||||
|
||||
private Scene m_scene;
|
||||
|
||||
private FlockingModel m_model;
|
||||
private FlockingView m_view;
|
||||
|
||||
private bool m_enabled = false;
|
||||
private bool m_ready = false;
|
||||
|
||||
private uint m_frame = 0;
|
||||
private int m_frameUpdateRate = 1;
|
||||
|
||||
|
||||
#region IRegionModule Members
|
||||
|
||||
|
||||
|
||||
public void Initialise (IConfigSource source)
|
||||
{
|
||||
//TODO: check if we are in the ini files
|
||||
//TODO: if so get some physical constants out of them and pass into the model
|
||||
m_enabled = true;
|
||||
}
|
||||
|
||||
public void AddRegion (Scene scene)
|
||||
{
|
||||
m_log.Info("ADDING FLOCKING");
|
||||
m_scene = scene;
|
||||
if (m_enabled) {
|
||||
m_scene.EventManager.OnFrame += FlockUpdate;
|
||||
|
||||
m_model = new FlockingModel();
|
||||
m_view = new FlockingView (m_scene);
|
||||
|
||||
m_scene.AddCommand (this, "flocking", "I haz got a Flocking Module", "wotever" , null);
|
||||
}
|
||||
}
|
||||
|
||||
public void RegionLoaded (Scene scene)
|
||||
{
|
||||
if (m_enabled) {
|
||||
// Generate initial flock values
|
||||
m_model.Initialise( 200, 255, 255, 255);
|
||||
m_view.PostInitialize();
|
||||
|
||||
// Mark Module Ready for duty
|
||||
m_ready = true;
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveRegion (Scene scene)
|
||||
{
|
||||
if (m_enabled) {
|
||||
m_scene.EventManager.OnFrame -= FlockUpdate;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public string Name {
|
||||
get { return "FlockingModule"; }
|
||||
}
|
||||
|
||||
public bool IsSharedModule {
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region EventHandlers
|
||||
|
||||
public void FlockUpdate()
|
||||
{
|
||||
if (((m_frame++ % m_frameUpdateRate) != 0) || !m_ready)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//m_log.InfoFormat("update my boids");
|
||||
|
||||
// work out where everyone has moved to
|
||||
// and tell the scene to render the new positions
|
||||
List<Boid> boids = m_model.UpdateFlockPos();
|
||||
m_view.Render(boids);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
|
||||
#region IRegionModuleBase Members
|
||||
|
||||
|
||||
|
||||
public void Close ()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
public Type ReplaceableInterface {
|
||||
get { return null; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,145 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, https://github.com/jonc/osboids
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace Flocking
|
||||
{
|
||||
public class FlockingView
|
||||
{
|
||||
private const float DEG_TO_RAD = 0.01745329238f;
|
||||
|
||||
private Scene m_scene;
|
||||
private UUID m_owner;
|
||||
|
||||
private Dictionary<string, SceneObjectGroup> m_sogMap = new Dictionary<string, SceneObjectGroup> ();
|
||||
|
||||
public FlockingView (Scene scene)
|
||||
{
|
||||
m_scene = scene;
|
||||
}
|
||||
|
||||
public void PostInitialize ()
|
||||
{
|
||||
m_owner = m_scene.RegionInfo.EstateSettings.EstateOwner;
|
||||
}
|
||||
|
||||
public void Render (List<Boid> boids)
|
||||
{
|
||||
foreach (Boid boid in boids) {
|
||||
SceneObjectGroup sog = DrawBoid (boid);
|
||||
//sog.ScheduleGroupForTerseUpdate ();
|
||||
}
|
||||
}
|
||||
|
||||
private SceneObjectGroup DrawBoid (Boid boid)
|
||||
{
|
||||
SceneObjectPart existing = m_scene.GetSceneObjectPart (boid.Id);
|
||||
|
||||
|
||||
SceneObjectGroup copy;
|
||||
if (existing == null) {
|
||||
SceneObjectGroup group = findByName ("boidPrim");
|
||||
copy = CopyPrim (group, boid.Id);
|
||||
m_sogMap [boid.Id] = copy;
|
||||
m_scene.AddNewSceneObject (copy, false);
|
||||
} else {
|
||||
copy = existing.ParentGroup;
|
||||
}
|
||||
|
||||
Quaternion rotation = CalcRotationToEndpoint (copy, copy.AbsolutePosition, boid.Location);
|
||||
copy.UpdateGroupRotationPR (boid.Location, rotation);
|
||||
return copy;
|
||||
}
|
||||
|
||||
private static Quaternion CalcRotationToEndpoint (SceneObjectGroup copy, Vector3 sv, Vector3 ev)
|
||||
{
|
||||
Vector3 currDirVec = Vector3.UnitX;
|
||||
float angle = 0f;
|
||||
|
||||
copy.GroupRotation.GetAxisAngle (out currDirVec, out angle);
|
||||
currDirVec.Normalize ();
|
||||
|
||||
|
||||
Vector3 desiredDirVec = Vector3.Subtract (ev, sv);
|
||||
desiredDirVec.Normalize ();
|
||||
|
||||
Quaternion rot = Vector3.RotationBetween (currDirVec, desiredDirVec);
|
||||
|
||||
//Quaternion x90 = Quaternion.CreateFromEulers (90f * DEG_TO_RAD, 0f, 0f);
|
||||
//rot = rot * x90;
|
||||
|
||||
return rot;
|
||||
}
|
||||
|
||||
private SceneObjectGroup CopyPrim (SceneObjectGroup prim, string name)
|
||||
{
|
||||
SceneObjectGroup copy = prim.Copy (true);
|
||||
copy.Name = name;
|
||||
copy.DetachFromBackup ();
|
||||
return copy;
|
||||
}
|
||||
|
||||
private SceneObjectGroup findByName (string name)
|
||||
{
|
||||
SceneObjectGroup retVal = null;
|
||||
foreach (EntityBase e in m_scene.GetEntities()) {
|
||||
if (e.Name == name) {
|
||||
retVal = (SceneObjectGroup)e;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// can't find it so make a default one
|
||||
if (retVal == null) {
|
||||
retVal = MakeDefaultPrim (name);
|
||||
}
|
||||
|
||||
return retVal;
|
||||
}
|
||||
|
||||
private SceneObjectGroup MakeDefaultPrim (string name)
|
||||
{
|
||||
PrimitiveBaseShape shape = PrimitiveBaseShape.CreateSphere ();
|
||||
shape.Scale = new Vector3 (0.5f, 0.5f, 2.5f);
|
||||
|
||||
SceneObjectGroup prim = new SceneObjectGroup (m_owner, new Vector3 (128f, 128f, 25f), shape);
|
||||
prim.Name = name;
|
||||
prim.DetachFromBackup ();
|
||||
m_scene.AddNewSceneObject (prim, false);
|
||||
|
||||
return prim;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, https://github.com/jonc/osboids
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace Flocking
|
||||
{
|
||||
public class Util
|
||||
{
|
||||
public static Vector3 Limit (Vector3 initial, float maxLen)
|
||||
{
|
||||
float currLen = initial.Length ();
|
||||
float ratio = 1.0f;
|
||||
|
||||
if (currLen > maxLen) {
|
||||
ratio = currLen / maxLen;
|
||||
}
|
||||
|
||||
return initial /= ratio;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<Addin id="Flocking" version="0.1">
|
||||
<Runtime>
|
||||
<Import assembly="Flocking.dll"/>
|
||||
</Runtime>
|
||||
|
||||
<Dependencies>
|
||||
<Addin id="OpenSim" version="0.5" />
|
||||
</Dependencies>
|
||||
|
||||
<Extension path = "/OpenSim/RegionModules">
|
||||
<RegionModule id="Flocking" type="Flocking.FlockingModule" />
|
||||
</Extension>
|
||||
</Addin>
|
|
@ -0,0 +1,5 @@
|
|||
/Users/jon/osim/opensim/bin/Flocking.dll.mdb
|
||||
/Users/jon/osim/opensim/bin/Flocking.dll
|
||||
/Users/jon/osim/opensim/addon-modules/flocking/Flocking/obj/Debug/Flocking.dll
|
||||
/Users/jon/osim/opensim/addon-modules/flocking/Flocking/obj/Debug/Flocking.dll.mdb
|
||||
/Users/jon/osim/opensim/addon-modules/flocking/Flocking/obj/Debug/Flocking.Resources.Flocking.addin.xml
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,13 @@
|
|||
<Addin id="Flocking" version="0.1">
|
||||
<Runtime>
|
||||
<Import assembly="Flocking.dll"/>
|
||||
</Runtime>
|
||||
|
||||
<Dependencies>
|
||||
<Addin id="OpenSim" version="0.5" />
|
||||
</Dependencies>
|
||||
|
||||
<Extension path = "/OpenSim/RegionModules">
|
||||
<RegionModule id="Flocking" type="Flocking.FlockingModule" />
|
||||
</Extension>
|
||||
</Addin>
|
|
@ -0,0 +1,16 @@
|
|||
Placeholder.... - preliminary commit
|
||||
|
||||
Region Module - ability to control flocks within an OpenSim scene
|
||||
|
||||
Build instructions
|
||||
Add source tree under opensim/addon-modules
|
||||
|
||||
./runprebuild.sh to build the module into a local server
|
||||
|
||||
Prebuilt binaries etc.. to follow
|
||||
|
||||
Currently only tested against opensim master
|
||||
|
||||
Status: pre alpha
|
||||
|
||||
Licence: all files released under a BSD licence
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!-- Core TerrainTools Project -->
|
||||
|
||||
<Project name="Flocking" path="addon-modules/flocking/Flocking/" type="Library">
|
||||
<Configuration name="Debug">
|
||||
<Options>
|
||||
<OutputPath>../../../bin/</OutputPath>
|
||||
</Options>
|
||||
</Configuration>
|
||||
<Configuration name="Release">
|
||||
<Options>
|
||||
<OutputPath>../../../bin/</OutputPath>
|
||||
</Options>
|
||||
</Configuration>
|
||||
|
||||
<ReferencePath>../../../bin/</ReferencePath>
|
||||
<Reference name="log4net" path="../../../bin/" />
|
||||
<Reference name="System"/>
|
||||
<Reference name="System.Drawing" />
|
||||
<Reference name="System.Xml"/>
|
||||
<Reference name="Nini" path="../../../bin/" />
|
||||
<!--Reference name="Mono.Cecil" path="../../../bin/" /-->
|
||||
<Reference name="OpenSim.Framework" path="../../../bin/" />
|
||||
<Reference name="OpenSim.Framework.Communications" path="../../../bin/" />
|
||||
<Reference name="OpenSim.Region.Framework" path="../../../bin/" />
|
||||
<Reference name="OpenSim.Framework.Console" path="../../../bin/" />
|
||||
<Reference name="OpenMetaverseTypes" path="../../../bin/" />
|
||||
<Reference name="OpenMetaverse" path="../../../bin/" />
|
||||
<Files>
|
||||
<Match pattern="*.cs" recurse="true"/>
|
||||
<Match pattern="*.addin.xml" path="Resources" buildAction="EmbeddedResource" recurse="true"/>
|
||||
|
||||
</Files>
|
||||
</Project>
|
||||
|
Loading…
Reference in New Issue