Merge branch 'dev' into dsg
commit
396f4408cd
|
@ -111,6 +111,7 @@ what it is today.
|
||||||
* Mircea Kitsune
|
* Mircea Kitsune
|
||||||
* mpallari
|
* mpallari
|
||||||
* MrMonkE
|
* MrMonkE
|
||||||
|
* Nebadon Izumi (Michael Cerquoni - http://OSgrid.org)
|
||||||
* nornalbion
|
* nornalbion
|
||||||
* Omar Vera Ustariz (IBM)
|
* Omar Vera Ustariz (IBM)
|
||||||
* openlifegrid.com
|
* openlifegrid.com
|
||||||
|
|
|
@ -2201,6 +2201,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
||||||
/// <description>UUID of the region</description></item>
|
/// <description>UUID of the region</description></item>
|
||||||
/// <item><term>region_name</term>
|
/// <item><term>region_name</term>
|
||||||
/// <description>region name</description></item>
|
/// <description>region name</description></item>
|
||||||
|
/// <item><term>merge</term>
|
||||||
|
/// <description>true if oar should be merged</description></item>
|
||||||
|
/// <item><term>skip-assets</term>
|
||||||
|
/// <description>true if assets should be skiped</description></item>
|
||||||
/// </list>
|
/// </list>
|
||||||
///
|
///
|
||||||
/// <code>region_uuid</code> takes precedence over
|
/// <code>region_uuid</code> takes precedence over
|
||||||
|
@ -2260,9 +2264,21 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
||||||
}
|
}
|
||||||
else throw new Exception("neither region_name nor region_uuid given");
|
else throw new Exception("neither region_name nor region_uuid given");
|
||||||
|
|
||||||
|
bool mergeOar = false;
|
||||||
|
bool skipAssets = false;
|
||||||
|
|
||||||
|
if ((string)requestData["merge"] == "true")
|
||||||
|
{
|
||||||
|
mergeOar = true;
|
||||||
|
}
|
||||||
|
if ((string)requestData["skip-assets"] == "true")
|
||||||
|
{
|
||||||
|
skipAssets = true;
|
||||||
|
}
|
||||||
|
|
||||||
IRegionArchiverModule archiver = scene.RequestModuleInterface<IRegionArchiverModule>();
|
IRegionArchiverModule archiver = scene.RequestModuleInterface<IRegionArchiverModule>();
|
||||||
if (archiver != null)
|
if (archiver != null)
|
||||||
archiver.DearchiveRegion(filename);
|
archiver.DearchiveRegion(filename, mergeOar, skipAssets, Guid.Empty);
|
||||||
else
|
else
|
||||||
throw new Exception("Archiver module not present for scene");
|
throw new Exception("Archiver module not present for scene");
|
||||||
|
|
||||||
|
@ -2302,6 +2318,10 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
||||||
/// <description>UUID of the region</description></item>
|
/// <description>UUID of the region</description></item>
|
||||||
/// <item><term>region_name</term>
|
/// <item><term>region_name</term>
|
||||||
/// <description>region name</description></item>
|
/// <description>region name</description></item>
|
||||||
|
/// <item><term>profile</term>
|
||||||
|
/// <description>profile url</description></item>
|
||||||
|
/// <item><term>noassets</term>
|
||||||
|
/// <description>true if no assets should be saved</description></item>
|
||||||
/// </list>
|
/// </list>
|
||||||
///
|
///
|
||||||
/// <code>region_uuid</code> takes precedence over
|
/// <code>region_uuid</code> takes precedence over
|
||||||
|
@ -2359,12 +2379,29 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
||||||
}
|
}
|
||||||
else throw new Exception("neither region_name nor region_uuid given");
|
else throw new Exception("neither region_name nor region_uuid given");
|
||||||
|
|
||||||
|
Dictionary<string, object> options = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
//if (requestData.Contains("version"))
|
||||||
|
//{
|
||||||
|
// options["version"] = (string)requestData["version"];
|
||||||
|
//}
|
||||||
|
|
||||||
|
if (requestData.Contains("profile"))
|
||||||
|
{
|
||||||
|
options["profile"] = (string)requestData["profile"];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (requestData["noassets"] == "true")
|
||||||
|
{
|
||||||
|
options["noassets"] = (string)requestData["noassets"] ;
|
||||||
|
}
|
||||||
|
|
||||||
IRegionArchiverModule archiver = scene.RequestModuleInterface<IRegionArchiverModule>();
|
IRegionArchiverModule archiver = scene.RequestModuleInterface<IRegionArchiverModule>();
|
||||||
|
|
||||||
if (archiver != null)
|
if (archiver != null)
|
||||||
{
|
{
|
||||||
scene.EventManager.OnOarFileSaved += RemoteAdminOarSaveCompleted;
|
scene.EventManager.OnOarFileSaved += RemoteAdminOarSaveCompleted;
|
||||||
archiver.ArchiveRegion(filename, new Dictionary<string, object>());
|
archiver.ArchiveRegion(filename, options);
|
||||||
lock (m_saveOarLock) Monitor.Wait(m_saveOarLock,5000);
|
lock (m_saveOarLock) Monitor.Wait(m_saveOarLock,5000);
|
||||||
scene.EventManager.OnOarFileSaved -= RemoteAdminOarSaveCompleted;
|
scene.EventManager.OnOarFileSaved -= RemoteAdminOarSaveCompleted;
|
||||||
}
|
}
|
||||||
|
|
|
@ -273,6 +273,7 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
return m_id;
|
return m_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
UUID uuid = UUID.Zero;
|
UUID uuid = UUID.Zero;
|
||||||
|
|
|
@ -742,7 +742,7 @@ namespace OpenSim.Framework
|
||||||
bool IsActive { get; set; }
|
bool IsActive { get; set; }
|
||||||
|
|
||||||
/// <value>
|
/// <value>
|
||||||
/// Determines whether the client is logging out or not.
|
/// Determines whether the client is or has been removed from a given scene
|
||||||
/// </value>
|
/// </value>
|
||||||
bool IsLoggingOut { get; set; }
|
bool IsLoggingOut { get; set; }
|
||||||
|
|
||||||
|
|
|
@ -213,6 +213,8 @@ namespace OpenSim.Framework
|
||||||
/// <param name="prim"></param>
|
/// <param name="prim"></param>
|
||||||
public PrimitiveBaseShape(Primitive prim)
|
public PrimitiveBaseShape(Primitive prim)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[PRIMITIVE BASE SHAPE]: Creating from {0}", prim.ID);
|
||||||
|
|
||||||
PCode = (byte)prim.PrimData.PCode;
|
PCode = (byte)prim.PrimData.PCode;
|
||||||
ExtraParams = new byte[1];
|
ExtraParams = new byte[1];
|
||||||
|
|
||||||
|
@ -376,7 +378,7 @@ namespace OpenSim.Framework
|
||||||
_pathEnd = Primitive.PackEndCut(end);
|
_pathEnd = Primitive.PackEndCut(end);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetSculptData(byte sculptType, UUID SculptTextureUUID)
|
public void SetSculptProperties(byte sculptType, UUID SculptTextureUUID)
|
||||||
{
|
{
|
||||||
_sculptType = sculptType;
|
_sculptType = sculptType;
|
||||||
_sculptTexture = SculptTextureUUID;
|
_sculptTexture = SculptTextureUUID;
|
||||||
|
@ -613,29 +615,39 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte SculptType {
|
public byte SculptType
|
||||||
get {
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
return _sculptType;
|
return _sculptType;
|
||||||
}
|
}
|
||||||
set {
|
set
|
||||||
|
{
|
||||||
_sculptType = value;
|
_sculptType = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[] SculptData {
|
public byte[] SculptData
|
||||||
get {
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
return _sculptData;
|
return _sculptData;
|
||||||
}
|
}
|
||||||
set {
|
set
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[PRIMITIVE BASE SHAPE]: Setting SculptData to data with length {0}", value.Length);
|
||||||
_sculptData = value;
|
_sculptData = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int FlexiSoftness {
|
public int FlexiSoftness
|
||||||
get {
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
return _flexiSoftness;
|
return _flexiSoftness;
|
||||||
}
|
}
|
||||||
set {
|
set
|
||||||
|
{
|
||||||
_flexiSoftness = value;
|
_flexiSoftness = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -849,6 +861,8 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
public byte[] ExtraParamsToBytes()
|
public byte[] ExtraParamsToBytes()
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[EXTRAPARAMS]: Called ExtraParamsToBytes()");
|
||||||
|
|
||||||
ushort FlexiEP = 0x10;
|
ushort FlexiEP = 0x10;
|
||||||
ushort LightEP = 0x20;
|
ushort LightEP = 0x20;
|
||||||
ushort SculptEP = 0x30;
|
ushort SculptEP = 0x30;
|
||||||
|
@ -864,18 +878,21 @@ namespace OpenSim.Framework
|
||||||
TotalBytesLength += 16;// data
|
TotalBytesLength += 16;// data
|
||||||
TotalBytesLength += 2 + 4; // type
|
TotalBytesLength += 2 + 4; // type
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_lightEntry)
|
if (_lightEntry)
|
||||||
{
|
{
|
||||||
ExtraParamsNum++;
|
ExtraParamsNum++;
|
||||||
TotalBytesLength += 16;// data
|
TotalBytesLength += 16;// data
|
||||||
TotalBytesLength += 2 + 4; // type
|
TotalBytesLength += 2 + 4; // type
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_sculptEntry)
|
if (_sculptEntry)
|
||||||
{
|
{
|
||||||
ExtraParamsNum++;
|
ExtraParamsNum++;
|
||||||
TotalBytesLength += 17;// data
|
TotalBytesLength += 17;// data
|
||||||
TotalBytesLength += 2 + 4; // type
|
TotalBytesLength += 2 + 4; // type
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_projectionEntry)
|
if (_projectionEntry)
|
||||||
{
|
{
|
||||||
ExtraParamsNum++;
|
ExtraParamsNum++;
|
||||||
|
@ -885,7 +902,6 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
byte[] returnbytes = new byte[TotalBytesLength];
|
byte[] returnbytes = new byte[TotalBytesLength];
|
||||||
|
|
||||||
|
|
||||||
// uint paramlength = ExtraParamsNum;
|
// uint paramlength = ExtraParamsNum;
|
||||||
|
|
||||||
// Stick in the number of parameters
|
// Stick in the number of parameters
|
||||||
|
@ -905,6 +921,7 @@ namespace OpenSim.Framework
|
||||||
Array.Copy(FlexiData, 0, returnbytes, i, FlexiData.Length);
|
Array.Copy(FlexiData, 0, returnbytes, i, FlexiData.Length);
|
||||||
i += FlexiData.Length;
|
i += FlexiData.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_lightEntry)
|
if (_lightEntry)
|
||||||
{
|
{
|
||||||
byte[] LightData = GetLightBytes();
|
byte[] LightData = GetLightBytes();
|
||||||
|
@ -919,6 +936,7 @@ namespace OpenSim.Framework
|
||||||
Array.Copy(LightData, 0, returnbytes, i, LightData.Length);
|
Array.Copy(LightData, 0, returnbytes, i, LightData.Length);
|
||||||
i += LightData.Length;
|
i += LightData.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_sculptEntry)
|
if (_sculptEntry)
|
||||||
{
|
{
|
||||||
byte[] SculptData = GetSculptBytes();
|
byte[] SculptData = GetSculptBytes();
|
||||||
|
@ -933,6 +951,7 @@ namespace OpenSim.Framework
|
||||||
Array.Copy(SculptData, 0, returnbytes, i, SculptData.Length);
|
Array.Copy(SculptData, 0, returnbytes, i, SculptData.Length);
|
||||||
i += SculptData.Length;
|
i += SculptData.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_projectionEntry)
|
if (_projectionEntry)
|
||||||
{
|
{
|
||||||
byte[] ProjectionData = GetProjectionBytes();
|
byte[] ProjectionData = GetProjectionBytes();
|
||||||
|
@ -946,6 +965,7 @@ namespace OpenSim.Framework
|
||||||
Array.Copy(ProjectionData, 0, returnbytes, i, ProjectionData.Length);
|
Array.Copy(ProjectionData, 0, returnbytes, i, ProjectionData.Length);
|
||||||
i += ProjectionData.Length;
|
i += ProjectionData.Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_flexiEntry && !_lightEntry && !_sculptEntry && !_projectionEntry)
|
if (!_flexiEntry && !_lightEntry && !_sculptEntry && !_projectionEntry)
|
||||||
{
|
{
|
||||||
byte[] returnbyte = new byte[1];
|
byte[] returnbyte = new byte[1];
|
||||||
|
@ -953,10 +973,7 @@ namespace OpenSim.Framework
|
||||||
return returnbyte;
|
return returnbyte;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return returnbytes;
|
return returnbytes;
|
||||||
//m_log.Info("[EXTRAPARAMS]: Length = " + m_shape.ExtraParams.Length.ToString());
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReadInUpdateExtraParam(ushort type, bool inUse, byte[] data)
|
public void ReadInUpdateExtraParam(ushort type, bool inUse, byte[] data)
|
||||||
|
@ -1027,7 +1044,6 @@ namespace OpenSim.Framework
|
||||||
extraParamCount = data[i++];
|
extraParamCount = data[i++];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (int k = 0; k < extraParamCount; k++)
|
for (int k = 0; k < extraParamCount; k++)
|
||||||
{
|
{
|
||||||
ushort epType = Utils.BytesToUInt16(data, i);
|
ushort epType = Utils.BytesToUInt16(data, i);
|
||||||
|
@ -1071,7 +1087,6 @@ namespace OpenSim.Framework
|
||||||
_sculptEntry = false;
|
_sculptEntry = false;
|
||||||
if (!lGotFilter)
|
if (!lGotFilter)
|
||||||
_projectionEntry = false;
|
_projectionEntry = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ReadSculptData(byte[] data, int pos)
|
public void ReadSculptData(byte[] data, int pos)
|
||||||
|
@ -1100,6 +1115,7 @@ namespace OpenSim.Framework
|
||||||
if (_sculptType != (byte)1 && _sculptType != (byte)2 && _sculptType != (byte)3 && _sculptType != (byte)4)
|
if (_sculptType != (byte)1 && _sculptType != (byte)2 && _sculptType != (byte)3 && _sculptType != (byte)4)
|
||||||
_sculptType = 4;
|
_sculptType = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
_sculptTexture = SculptUUID;
|
_sculptTexture = SculptUUID;
|
||||||
_sculptType = SculptTypel;
|
_sculptType = SculptTypel;
|
||||||
//m_log.Info("[SCULPT]:" + SculptUUID.ToString());
|
//m_log.Info("[SCULPT]:" + SculptUUID.ToString());
|
||||||
|
|
|
@ -31,6 +31,7 @@ using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Timers;
|
using System.Timers;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
@ -124,7 +125,6 @@ namespace OpenSim.Framework.Servers
|
||||||
m_logFileAppender = appender;
|
m_logFileAppender = appender;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -443,45 +443,68 @@ namespace OpenSim.Framework.Servers
|
||||||
{
|
{
|
||||||
string buildVersion = string.Empty;
|
string buildVersion = string.Empty;
|
||||||
|
|
||||||
// Add commit hash and date information if available
|
|
||||||
// The commit hash and date are stored in a file bin/.version
|
|
||||||
// This file can automatically created by a post
|
|
||||||
// commit script in the opensim git master repository or
|
|
||||||
// by issuing the follwoing command from the top level
|
|
||||||
// directory of the opensim repository
|
|
||||||
// git log -n 1 --pretty="format:%h: %ci" >bin/.version
|
|
||||||
// For the full git commit hash use %H instead of %h
|
|
||||||
//
|
|
||||||
// The subversion information is deprecated and will be removed at a later date
|
// The subversion information is deprecated and will be removed at a later date
|
||||||
// Add subversion revision information if available
|
// Add subversion revision information if available
|
||||||
// Try file "svn_revision" in the current directory first, then the .svn info.
|
// Try file "svn_revision" in the current directory first, then the .svn info.
|
||||||
// This allows to make the revision available in simulators not running from the source tree.
|
// This allows to make the revision available in simulators not running from the source tree.
|
||||||
// FIXME: Making an assumption about the directory we're currently in - we do this all over the place
|
// FIXME: Making an assumption about the directory we're currently in - we do this all over the place
|
||||||
// elsewhere as well
|
// elsewhere as well
|
||||||
|
string gitDir = "../.git/";
|
||||||
|
string gitRefPointerPath = gitDir + "HEAD";
|
||||||
|
|
||||||
string svnRevisionFileName = "svn_revision";
|
string svnRevisionFileName = "svn_revision";
|
||||||
string svnFileName = ".svn/entries";
|
string svnFileName = ".svn/entries";
|
||||||
string gitCommitFileName = ".version";
|
string manualVersionFileName = ".version";
|
||||||
string inputLine;
|
string inputLine;
|
||||||
int strcmp;
|
int strcmp;
|
||||||
|
|
||||||
if (File.Exists(gitCommitFileName))
|
if (File.Exists(manualVersionFileName))
|
||||||
{
|
{
|
||||||
StreamReader CommitFile = File.OpenText(gitCommitFileName);
|
using (StreamReader CommitFile = File.OpenText(manualVersionFileName))
|
||||||
buildVersion = CommitFile.ReadLine();
|
buildVersion = CommitFile.ReadLine();
|
||||||
CommitFile.Close();
|
|
||||||
m_version += buildVersion ?? "";
|
m_version += buildVersion ?? "";
|
||||||
}
|
}
|
||||||
|
else if (File.Exists(gitRefPointerPath))
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[OPENSIM]: Found {0}", gitRefPointerPath);
|
||||||
|
|
||||||
// Remove the else logic when subversion mirror is no longer used
|
string rawPointer = "";
|
||||||
|
|
||||||
|
using (StreamReader pointerFile = File.OpenText(gitRefPointerPath))
|
||||||
|
rawPointer = pointerFile.ReadLine();
|
||||||
|
|
||||||
|
// m_log.DebugFormat("[OPENSIM]: rawPointer [{0}]", rawPointer);
|
||||||
|
|
||||||
|
Match m = Regex.Match(rawPointer, "^ref: (.+)$");
|
||||||
|
|
||||||
|
if (m.Success)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[OPENSIM]: Matched [{0}]", m.Groups[1].Value);
|
||||||
|
|
||||||
|
string gitRef = m.Groups[1].Value;
|
||||||
|
string gitRefPath = gitDir + gitRef;
|
||||||
|
if (File.Exists(gitRefPath))
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[OPENSIM]: Found gitRefPath [{0}]", gitRefPath);
|
||||||
|
|
||||||
|
using (StreamReader refFile = File.OpenText(gitRefPath))
|
||||||
|
{
|
||||||
|
string gitHash = refFile.ReadLine();
|
||||||
|
m_version += gitHash.Substring(0, 7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Remove the else logic when subversion mirror is no longer used
|
||||||
if (File.Exists(svnRevisionFileName))
|
if (File.Exists(svnRevisionFileName))
|
||||||
{
|
{
|
||||||
StreamReader RevisionFile = File.OpenText(svnRevisionFileName);
|
StreamReader RevisionFile = File.OpenText(svnRevisionFileName);
|
||||||
buildVersion = RevisionFile.ReadLine();
|
buildVersion = RevisionFile.ReadLine();
|
||||||
buildVersion.Trim();
|
buildVersion.Trim();
|
||||||
RevisionFile.Close();
|
RevisionFile.Close();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(buildVersion) && File.Exists(svnFileName))
|
if (string.IsNullOrEmpty(buildVersion) && File.Exists(svnFileName))
|
||||||
|
|
|
@ -324,10 +324,25 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Debug utility function to convert unbroken strings of XML into something human readable for occasional debugging purposes.
|
/// Debug utility function to convert OSD into formatted XML for debugging purposes.
|
||||||
///
|
|
||||||
/// Please don't delete me even if I appear currently unused!
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="osd">
|
||||||
|
/// A <see cref="OSD"/>
|
||||||
|
/// </param>
|
||||||
|
/// <returns>
|
||||||
|
/// A <see cref="System.String"/>
|
||||||
|
/// </returns>
|
||||||
|
public static string GetFormattedXml(OSD osd)
|
||||||
|
{
|
||||||
|
return GetFormattedXml(OSDParser.SerializeLLSDXmlString(osd));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Debug utility function to convert unbroken strings of XML into something human readable for occasional debugging purposes.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// Please don't delete me even if I appear currently unused!
|
||||||
|
/// </remarks>
|
||||||
/// <param name="rawXml"></param>
|
/// <param name="rawXml"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string GetFormattedXml(string rawXml)
|
public static string GetFormattedXml(string rawXml)
|
||||||
|
@ -425,20 +440,30 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Return an SHA1 hash of the given string
|
/// Return an SHA1 hash
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="data"></param>
|
/// <param name="data"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string SHA1Hash(string data)
|
public static string SHA1Hash(string data)
|
||||||
|
{
|
||||||
|
return SHA1Hash(Encoding.Default.GetBytes(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Return an SHA1 hash
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="data"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string SHA1Hash(byte[] data)
|
||||||
{
|
{
|
||||||
byte[] hash = ComputeSHA1Hash(data);
|
byte[] hash = ComputeSHA1Hash(data);
|
||||||
return BitConverter.ToString(hash).Replace("-", String.Empty);
|
return BitConverter.ToString(hash).Replace("-", String.Empty);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static byte[] ComputeSHA1Hash(string src)
|
private static byte[] ComputeSHA1Hash(byte[] src)
|
||||||
{
|
{
|
||||||
SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider();
|
SHA1CryptoServiceProvider SHA1 = new SHA1CryptoServiceProvider();
|
||||||
return SHA1.ComputeHash(Encoding.Default.GetBytes(src));
|
return SHA1.ComputeHash(src);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int fast_distance2d(int x, int y)
|
public static int fast_distance2d(int x, int y)
|
||||||
|
|
|
@ -907,15 +907,6 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SynchronousRestObjectPoster
|
|
||||||
{
|
|
||||||
[Obsolete]
|
|
||||||
public static TResponse BeginPostObject<TRequest, TResponse>(string verb, string requestUrl, TRequest obj)
|
|
||||||
{
|
|
||||||
return SynchronousRestObjectRequester.MakeRequest<TRequest, TResponse>(verb, requestUrl, obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class SynchronousRestObjectRequester
|
public class SynchronousRestObjectRequester
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log =
|
private static readonly ILog m_log =
|
||||||
|
@ -981,9 +972,6 @@ namespace OpenSim.Framework
|
||||||
{
|
{
|
||||||
using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
|
using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
|
||||||
{
|
{
|
||||||
if (resp.StatusCode == HttpStatusCode.NotFound)
|
|
||||||
return deserial;
|
|
||||||
|
|
||||||
if (resp.ContentLength != 0)
|
if (resp.ContentLength != 0)
|
||||||
{
|
{
|
||||||
Stream respStream = resp.GetResponseStream();
|
Stream respStream = resp.GetResponseStream();
|
||||||
|
@ -993,9 +981,19 @@ namespace OpenSim.Framework
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
m_log.DebugFormat("[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}", requestUrl, verb);
|
m_log.DebugFormat("[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}", requestUrl, verb);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (WebException e)
|
||||||
|
{
|
||||||
|
HttpWebResponse hwr = (HttpWebResponse)e.Response;
|
||||||
|
|
||||||
|
if (hwr != null && hwr.StatusCode == HttpStatusCode.NotFound)
|
||||||
|
return deserial;
|
||||||
|
else
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[SynchronousRestObjectRequester]: WebException {0} {1} {2} {3}",
|
||||||
|
requestUrl, typeof(TResponse).ToString(), e.Message, e.StackTrace);
|
||||||
|
}
|
||||||
catch (System.InvalidOperationException)
|
catch (System.InvalidOperationException)
|
||||||
{
|
{
|
||||||
// This is what happens when there is invalid XML
|
// This is what happens when there is invalid XML
|
||||||
|
|
|
@ -328,7 +328,7 @@ namespace OpenSim
|
||||||
config.Set("meshing", "Meshmerizer");
|
config.Set("meshing", "Meshmerizer");
|
||||||
config.Set("physical_prim", true);
|
config.Set("physical_prim", true);
|
||||||
config.Set("see_into_this_sim_from_neighbor", true);
|
config.Set("see_into_this_sim_from_neighbor", true);
|
||||||
config.Set("serverside_object_permissions", false);
|
config.Set("serverside_object_permissions", true);
|
||||||
config.Set("storage_plugin", "OpenSim.Data.SQLite.dll");
|
config.Set("storage_plugin", "OpenSim.Data.SQLite.dll");
|
||||||
config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3");
|
config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3");
|
||||||
config.Set("storage_prim_inventories", true);
|
config.Set("storage_prim_inventories", true);
|
||||||
|
|
|
@ -1,10 +1,39 @@
|
||||||
using System;
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* 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;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
|
using OpenMetaverse.StructuredData;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
|
||||||
|
@ -12,11 +41,14 @@ using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Capabilities;
|
using OpenSim.Framework.Capabilities;
|
||||||
using OpenSim.Region.Framework;
|
using OpenSim.Region.Framework;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||||
using OpenSim.Framework.Servers;
|
using OpenSim.Framework.Servers;
|
||||||
using OpenSim.Framework.Servers.HttpServer;
|
using OpenSim.Framework.Servers.HttpServer;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
|
|
||||||
using Caps = OpenSim.Framework.Capabilities.Caps;
|
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||||
|
using OSDArray = OpenMetaverse.StructuredData.OSDArray;
|
||||||
|
using OSDMap = OpenMetaverse.StructuredData.OSDMap;
|
||||||
|
|
||||||
namespace OpenSim.Region.ClientStack.Linden
|
namespace OpenSim.Region.ClientStack.Linden
|
||||||
{
|
{
|
||||||
|
@ -79,7 +111,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
|
|
||||||
private bool m_persistBakedTextures = false;
|
private bool m_persistBakedTextures = false;
|
||||||
private IAssetService m_assetService;
|
private IAssetService m_assetService;
|
||||||
private bool m_dumpAssetsToFile;
|
private bool m_dumpAssetsToFile = false;
|
||||||
private string m_regionName;
|
private string m_regionName;
|
||||||
|
|
||||||
public BunchOfCaps(Scene scene, Caps caps)
|
public BunchOfCaps(Scene scene, Caps caps)
|
||||||
|
@ -439,7 +471,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Convert raw uploaded data into the appropriate asset and item.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="assetID"></param>
|
/// <param name="assetID"></param>
|
||||||
/// <param name="inventoryItem"></param>
|
/// <param name="inventoryItem"></param>
|
||||||
|
@ -448,6 +480,10 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
|
UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
|
||||||
string assetType)
|
string assetType)
|
||||||
{
|
{
|
||||||
|
m_log.DebugFormat(
|
||||||
|
"Uploaded asset {0} for inventory item {1}, inv type {2}, asset type {3}",
|
||||||
|
assetID, inventoryItem, inventoryType, assetType);
|
||||||
|
|
||||||
sbyte assType = 0;
|
sbyte assType = 0;
|
||||||
sbyte inType = 0;
|
sbyte inType = 0;
|
||||||
|
|
||||||
|
@ -474,6 +510,160 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (inventoryType == "object")
|
||||||
|
{
|
||||||
|
inType = (sbyte)InventoryType.Object;
|
||||||
|
assType = (sbyte)AssetType.Object;
|
||||||
|
|
||||||
|
List<Vector3> positions = new List<Vector3>();
|
||||||
|
List<Quaternion> rotations = new List<Quaternion>();
|
||||||
|
OSDMap request = (OSDMap)OSDParser.DeserializeLLSDXml(data);
|
||||||
|
OSDArray instance_list = (OSDArray)request["instance_list"];
|
||||||
|
OSDArray mesh_list = (OSDArray)request["mesh_list"];
|
||||||
|
OSDArray texture_list = (OSDArray)request["texture_list"];
|
||||||
|
SceneObjectGroup grp = null;
|
||||||
|
|
||||||
|
List<UUID> textures = new List<UUID>();
|
||||||
|
for (int i = 0; i < texture_list.Count; i++)
|
||||||
|
{
|
||||||
|
AssetBase textureAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Texture, "");
|
||||||
|
textureAsset.Data = texture_list[i].AsBinary();
|
||||||
|
m_assetService.Store(textureAsset);
|
||||||
|
textures.Add(textureAsset.FullID);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < mesh_list.Count; i++)
|
||||||
|
{
|
||||||
|
PrimitiveBaseShape pbs = PrimitiveBaseShape.CreateBox();
|
||||||
|
|
||||||
|
Primitive.TextureEntry textureEntry
|
||||||
|
= new Primitive.TextureEntry(Primitive.TextureEntry.WHITE_TEXTURE);
|
||||||
|
OSDMap inner_instance_list = (OSDMap)instance_list[i];
|
||||||
|
|
||||||
|
OSDArray face_list = (OSDArray)inner_instance_list["face_list"];
|
||||||
|
for (uint face = 0; face < face_list.Count; face++)
|
||||||
|
{
|
||||||
|
OSDMap faceMap = (OSDMap)face_list[(int)face];
|
||||||
|
Primitive.TextureEntryFace f = pbs.Textures.CreateFace(face);
|
||||||
|
if(faceMap.ContainsKey("fullbright"))
|
||||||
|
f.Fullbright = faceMap["fullbright"].AsBoolean();
|
||||||
|
if (faceMap.ContainsKey ("diffuse_color"))
|
||||||
|
f.RGBA = faceMap["diffuse_color"].AsColor4();
|
||||||
|
|
||||||
|
int textureNum = faceMap["image"].AsInteger();
|
||||||
|
float imagerot = faceMap["imagerot"].AsInteger();
|
||||||
|
float offsets = (float)faceMap["offsets"].AsReal();
|
||||||
|
float offsett = (float)faceMap["offsett"].AsReal();
|
||||||
|
float scales = (float)faceMap["scales"].AsReal();
|
||||||
|
float scalet = (float)faceMap["scalet"].AsReal();
|
||||||
|
|
||||||
|
if(imagerot != 0)
|
||||||
|
f.Rotation = imagerot;
|
||||||
|
|
||||||
|
if(offsets != 0)
|
||||||
|
f.OffsetU = offsets;
|
||||||
|
|
||||||
|
if (offsett != 0)
|
||||||
|
f.OffsetV = offsett;
|
||||||
|
|
||||||
|
if (scales != 0)
|
||||||
|
f.RepeatU = scales;
|
||||||
|
|
||||||
|
if (scalet != 0)
|
||||||
|
f.RepeatV = scalet;
|
||||||
|
|
||||||
|
if (textures.Count > textureNum)
|
||||||
|
f.TextureID = textures[textureNum];
|
||||||
|
else
|
||||||
|
f.TextureID = Primitive.TextureEntry.WHITE_TEXTURE;
|
||||||
|
|
||||||
|
textureEntry.FaceTextures[face] = f;
|
||||||
|
}
|
||||||
|
|
||||||
|
pbs.TextureEntry = textureEntry.GetBytes();
|
||||||
|
|
||||||
|
AssetBase meshAsset = new AssetBase(UUID.Random(), assetName, (sbyte)AssetType.Mesh, "");
|
||||||
|
meshAsset.Data = mesh_list[i].AsBinary();
|
||||||
|
m_assetService.Store(meshAsset);
|
||||||
|
|
||||||
|
pbs.SculptEntry = true;
|
||||||
|
pbs.SculptTexture = meshAsset.FullID;
|
||||||
|
pbs.SculptType = (byte)SculptType.Mesh;
|
||||||
|
pbs.SculptData = meshAsset.Data;
|
||||||
|
|
||||||
|
Vector3 position = inner_instance_list["position"].AsVector3();
|
||||||
|
Vector3 scale = inner_instance_list["scale"].AsVector3();
|
||||||
|
Quaternion rotation = inner_instance_list["rotation"].AsQuaternion();
|
||||||
|
|
||||||
|
// no longer used - begin ------------------------
|
||||||
|
// int physicsShapeType = inner_instance_list["physics_shape_type"].AsInteger();
|
||||||
|
// int material = inner_instance_list["material"].AsInteger();
|
||||||
|
// int mesh = inner_instance_list["mesh"].AsInteger();
|
||||||
|
|
||||||
|
// OSDMap permissions = (OSDMap)inner_instance_list["permissions"];
|
||||||
|
// int base_mask = permissions["base_mask"].AsInteger();
|
||||||
|
// int everyone_mask = permissions["everyone_mask"].AsInteger();
|
||||||
|
// UUID creator_id = permissions["creator_id"].AsUUID();
|
||||||
|
// UUID group_id = permissions["group_id"].AsUUID();
|
||||||
|
// int group_mask = permissions["group_mask"].AsInteger();
|
||||||
|
// bool is_owner_group = permissions["is_owner_group"].AsBoolean();
|
||||||
|
// UUID last_owner_id = permissions["last_owner_id"].AsUUID();
|
||||||
|
// int next_owner_mask = permissions["next_owner_mask"].AsInteger();
|
||||||
|
// UUID owner_id = permissions["owner_id"].AsUUID();
|
||||||
|
// int owner_mask = permissions["owner_mask"].AsInteger();
|
||||||
|
// no longer used - end ------------------------
|
||||||
|
|
||||||
|
UUID owner_id = m_HostCapsObj.AgentID;
|
||||||
|
|
||||||
|
SceneObjectPart prim
|
||||||
|
= new SceneObjectPart(owner_id, pbs, position, Quaternion.Identity, Vector3.Zero);
|
||||||
|
|
||||||
|
prim.Scale = scale;
|
||||||
|
prim.OffsetPosition = position;
|
||||||
|
rotations.Add(rotation);
|
||||||
|
positions.Add(position);
|
||||||
|
prim.UUID = UUID.Random();
|
||||||
|
prim.CreatorID = owner_id;
|
||||||
|
prim.OwnerID = owner_id;
|
||||||
|
prim.GroupID = UUID.Zero;
|
||||||
|
prim.LastOwnerID = prim.OwnerID;
|
||||||
|
prim.CreationDate = Util.UnixTimeSinceEpoch();
|
||||||
|
prim.Name = assetName;
|
||||||
|
prim.Description = "";
|
||||||
|
|
||||||
|
// prim.BaseMask = (uint)base_mask;
|
||||||
|
// prim.EveryoneMask = (uint)everyone_mask;
|
||||||
|
// prim.GroupMask = (uint)group_mask;
|
||||||
|
// prim.NextOwnerMask = (uint)next_owner_mask;
|
||||||
|
// prim.OwnerMask = (uint)owner_mask;
|
||||||
|
|
||||||
|
if (grp == null)
|
||||||
|
grp = new SceneObjectGroup(prim);
|
||||||
|
else
|
||||||
|
grp.AddPart(prim);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fix first link number
|
||||||
|
if (grp.Parts.Length > 1)
|
||||||
|
grp.RootPart.LinkNum++;
|
||||||
|
|
||||||
|
Vector3 rootPos = positions[0];
|
||||||
|
grp.AbsolutePosition = rootPos;
|
||||||
|
for (int i = 0; i < positions.Count; i++)
|
||||||
|
{
|
||||||
|
Vector3 offset = positions[i] - rootPos;
|
||||||
|
grp.Parts[i].OffsetPosition = offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < rotations.Count; i++)
|
||||||
|
{
|
||||||
|
if (i != 0)
|
||||||
|
grp.Parts[i].RotationOffset = rotations[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
grp.UpdateGroupRotationR(rotations[0]);
|
||||||
|
data = ASCIIEncoding.ASCII.GetBytes(SceneObjectSerializer.ToOriginalXmlFormat(grp));
|
||||||
|
}
|
||||||
|
|
||||||
AssetBase asset;
|
AssetBase asset;
|
||||||
asset = new AssetBase(assetID, assetName, assType, m_HostCapsObj.AgentID.ToString());
|
asset = new AssetBase(assetID, assetName, assType, m_HostCapsObj.AgentID.ToString());
|
||||||
|
@ -497,7 +687,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
item.CurrentPermissions = (uint)PermissionMask.All;
|
item.CurrentPermissions = (uint)PermissionMask.All;
|
||||||
item.BasePermissions = (uint)PermissionMask.All;
|
item.BasePermissions = (uint)PermissionMask.All;
|
||||||
item.EveryOnePermissions = 0;
|
item.EveryOnePermissions = 0;
|
||||||
item.NextPermissions = (uint)(PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer);
|
item.NextPermissions = (uint)PermissionMask.All;
|
||||||
item.CreationDate = Util.UnixTimeSinceEpoch();
|
item.CreationDate = Util.UnixTimeSinceEpoch();
|
||||||
|
|
||||||
if (AddNewInventoryItem != null)
|
if (AddNewInventoryItem != null)
|
||||||
|
@ -506,8 +696,6 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -632,7 +820,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Handle raw asset upload data via the capability.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="data"></param>
|
/// <param name="data"></param>
|
||||||
/// <param name="path"></param>
|
/// <param name="path"></param>
|
||||||
|
@ -670,6 +858,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
///Left this in and commented in case there are unforseen issues
|
///Left this in and commented in case there are unforseen issues
|
||||||
//private void SaveAssetToFile(string filename, byte[] data)
|
//private void SaveAssetToFile(string filename, byte[] data)
|
||||||
//{
|
//{
|
||||||
|
@ -679,6 +868,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
// bw.Close();
|
// bw.Close();
|
||||||
// fs.Close();
|
// fs.Close();
|
||||||
//}
|
//}
|
||||||
|
|
||||||
private static void SaveAssetToFile(string filename, byte[] data)
|
private static void SaveAssetToFile(string filename, byte[] data)
|
||||||
{
|
{
|
||||||
string assetPath = "UserAssets";
|
string assetPath = "UserAssets";
|
||||||
|
@ -719,7 +909,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Handle raw uploaded asset data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="data"></param>
|
/// <param name="data"></param>
|
||||||
/// <param name="path"></param>
|
/// <param name="path"></param>
|
||||||
|
@ -752,6 +942,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
///Left this in and commented in case there are unforseen issues
|
///Left this in and commented in case there are unforseen issues
|
||||||
//private void SaveAssetToFile(string filename, byte[] data)
|
//private void SaveAssetToFile(string filename, byte[] data)
|
||||||
//{
|
//{
|
||||||
|
@ -761,6 +952,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
// bw.Close();
|
// bw.Close();
|
||||||
// fs.Close();
|
// fs.Close();
|
||||||
//}
|
//}
|
||||||
|
|
||||||
private static void SaveAssetToFile(string filename, byte[] data)
|
private static void SaveAssetToFile(string filename, byte[] data)
|
||||||
{
|
{
|
||||||
string assetPath = "UserAssets";
|
string assetPath = "UserAssets";
|
||||||
|
@ -839,7 +1031,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
uploadComplete.new_asset = inventoryItemID;
|
uploadComplete.new_asset = inventoryItemID;
|
||||||
uploadComplete.compiled = errors.Count > 0 ? false : true;
|
uploadComplete.compiled = errors.Count > 0 ? false : true;
|
||||||
uploadComplete.state = "complete";
|
uploadComplete.state = "complete";
|
||||||
uploadComplete.errors = new OSDArray();
|
uploadComplete.errors = new OpenSim.Framework.Capabilities.OSDArray();
|
||||||
uploadComplete.errors.Array = errors;
|
uploadComplete.errors.Array = errors;
|
||||||
|
|
||||||
res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
|
res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
|
||||||
|
@ -905,7 +1097,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Handle raw uploaded baked texture data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="data"></param>
|
/// <param name="data"></param>
|
||||||
/// <param name="path"></param>
|
/// <param name="path"></param>
|
||||||
|
|
|
@ -0,0 +1,149 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* 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;
|
||||||
|
using System.Reflection;
|
||||||
|
using log4net;
|
||||||
|
using Nini.Config;
|
||||||
|
using Mono.Addins;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenMetaverse.StructuredData;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Servers.HttpServer;
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Services.Interfaces;
|
||||||
|
using Caps = OpenSim.Framework.Capabilities.Caps;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.ClientStack.Linden
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// MeshUploadFlag capability. This is required for uploading Mesh.
|
||||||
|
/// </summary>
|
||||||
|
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
||||||
|
public class MeshUploadFlagModule : INonSharedRegionModule
|
||||||
|
{
|
||||||
|
private static readonly ILog m_log =
|
||||||
|
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Is this module enabled?
|
||||||
|
/// </summary>
|
||||||
|
public bool Enabled { get; private set; }
|
||||||
|
|
||||||
|
private Scene m_scene;
|
||||||
|
private UUID m_agentID;
|
||||||
|
|
||||||
|
#region ISharedRegionModule Members
|
||||||
|
|
||||||
|
public MeshUploadFlagModule()
|
||||||
|
{
|
||||||
|
Enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Initialise(IConfigSource source)
|
||||||
|
{
|
||||||
|
IConfig config = source.Configs["Mesh"];
|
||||||
|
if (config == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Enabled = config.GetBoolean("AllowMeshUpload", Enabled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddRegion(Scene s)
|
||||||
|
{
|
||||||
|
if (!Enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_scene = s;
|
||||||
|
m_scene.EventManager.OnRegisterCaps += RegisterCaps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveRegion(Scene s)
|
||||||
|
{
|
||||||
|
if (!Enabled)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_scene.EventManager.OnRegisterCaps -= RegisterCaps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegionLoaded(Scene s)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PostInitialise()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close() { }
|
||||||
|
|
||||||
|
public string Name { get { return "MeshUploadFlagModule"; } }
|
||||||
|
|
||||||
|
public Type ReplaceableInterface
|
||||||
|
{
|
||||||
|
get { return null; }
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
public void RegisterCaps(UUID agentID, Caps caps)
|
||||||
|
{
|
||||||
|
IRequestHandler reqHandler = new RestHTTPHandler("GET", "/CAPS/" + UUID.Random(), MeshUploadFlag);
|
||||||
|
caps.RegisterHandler("MeshUploadFlag", reqHandler);
|
||||||
|
m_agentID = agentID;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Hashtable MeshUploadFlag(Hashtable mDhttpMethod)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[MESH UPLOAD FLAG MODULE]: MeshUploadFlag request");
|
||||||
|
|
||||||
|
OSDMap data = new OSDMap();
|
||||||
|
ScenePresence sp = m_scene.GetScenePresence(m_agentID);
|
||||||
|
data["username"] = sp.Firstname + "." + sp.Lastname;
|
||||||
|
data["display_name_next_update"] = new OSDDate(DateTime.Now);
|
||||||
|
data["legacy_first_name"] = sp.Firstname;
|
||||||
|
data["mesh_upload_status"] = "valid";
|
||||||
|
data["display_name"] = sp.Firstname + " " + sp.Lastname;
|
||||||
|
data["legacy_last_name"] = sp.Lastname;
|
||||||
|
data["id"] = m_agentID;
|
||||||
|
data["is_display_name_default"] = true;
|
||||||
|
|
||||||
|
//Send back data
|
||||||
|
Hashtable responsedata = new Hashtable();
|
||||||
|
responsedata["int_response_code"] = 200;
|
||||||
|
responsedata["content_type"] = "text/plain";
|
||||||
|
responsedata["keepalive"] = false;
|
||||||
|
responsedata["str_response_string"] = OSDParser.SerializeLLSDXmlString(data);
|
||||||
|
return responsedata;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -161,8 +161,6 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
}
|
}
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
string assetName = llsdRequest.name;
|
string assetName = llsdRequest.name;
|
||||||
string assetDes = llsdRequest.description;
|
string assetDes = llsdRequest.description;
|
||||||
string capsBase = "/CAPS/NewFileAgentInventoryVariablePrice/";
|
string capsBase = "/CAPS/NewFileAgentInventoryVariablePrice/";
|
||||||
|
@ -208,12 +206,10 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
return uploadResponse;
|
return uploadResponse;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
|
public void UploadCompleteHandler(string assetName, string assetDescription, UUID assetID,
|
||||||
UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
|
UUID inventoryItem, UUID parentFolder, byte[] data, string inventoryType,
|
||||||
string assetType,UUID AgentID)
|
string assetType,UUID AgentID)
|
||||||
{
|
{
|
||||||
|
|
||||||
sbyte assType = 0;
|
sbyte assType = 0;
|
||||||
sbyte inType = 0;
|
sbyte inType = 0;
|
||||||
|
|
||||||
|
@ -266,7 +262,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
item.CurrentPermissions = (uint)PermissionMask.All;
|
item.CurrentPermissions = (uint)PermissionMask.All;
|
||||||
item.BasePermissions = (uint)PermissionMask.All;
|
item.BasePermissions = (uint)PermissionMask.All;
|
||||||
item.EveryOnePermissions = 0;
|
item.EveryOnePermissions = 0;
|
||||||
item.NextPermissions = (uint)(PermissionMask.Move | PermissionMask.Modify | PermissionMask.Transfer);
|
item.NextPermissions = (uint)PermissionMask.All;
|
||||||
item.CreationDate = Util.UnixTimeSinceEpoch();
|
item.CreationDate = Util.UnixTimeSinceEpoch();
|
||||||
m_scene.AddInventoryItem(item);
|
m_scene.AddInventoryItem(item);
|
||||||
|
|
||||||
|
|
|
@ -251,11 +251,9 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
case 0x40:
|
case 0x40:
|
||||||
pbs.ReadProjectionData(extraParam.ExtraParamData, 0);
|
pbs.ReadProjectionData(extraParam.ExtraParamData, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pbs.PathBegin = (ushort) obj.PathBegin;
|
pbs.PathBegin = (ushort) obj.PathBegin;
|
||||||
pbs.PathCurve = (byte) obj.PathCurve;
|
pbs.PathCurve = (byte) obj.PathCurve;
|
||||||
pbs.PathEnd = (ushort) obj.PathEnd;
|
pbs.PathEnd = (ushort) obj.PathEnd;
|
||||||
|
|
|
@ -7656,13 +7656,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
|
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
|
||||||
if (invAccess != null)
|
if (invAccess != null)
|
||||||
{
|
{
|
||||||
if (!invAccess.GetAgentInventoryItem(this, itemID, requestID))
|
if (!invAccess.CanGetAgentInventoryItem(this, itemID, requestID))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7676,7 +7676,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
{
|
{
|
||||||
AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
|
AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
|
||||||
|
|
||||||
|
|
||||||
// m_log.Debug("upload request " + request.ToString());
|
// m_log.Debug("upload request " + request.ToString());
|
||||||
// m_log.Debug("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString());
|
// m_log.Debug("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString());
|
||||||
UUID temp = UUID.Combine(request.AssetBlock.TransactionID, SecureSessionId);
|
UUID temp = UUID.Combine(request.AssetBlock.TransactionID, SecureSessionId);
|
||||||
|
|
|
@ -86,6 +86,8 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
private List<string> m_CurrentlyWriting = new List<string>();
|
private List<string> m_CurrentlyWriting = new List<string>();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
private bool m_FileCacheEnabled = true;
|
||||||
|
|
||||||
private ExpiringCache<string, AssetBase> m_MemoryCache;
|
private ExpiringCache<string, AssetBase> m_MemoryCache;
|
||||||
private bool m_MemoryCacheEnabled = false;
|
private bool m_MemoryCacheEnabled = false;
|
||||||
|
|
||||||
|
@ -146,6 +148,7 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
m_FileCacheEnabled = assetConfig.GetBoolean("FileCacheEnabled", m_FileCacheEnabled);
|
||||||
m_CacheDirectory = assetConfig.GetString("CacheDirectory", m_DefaultCacheDirectory);
|
m_CacheDirectory = assetConfig.GetString("CacheDirectory", m_DefaultCacheDirectory);
|
||||||
|
|
||||||
m_MemoryCacheEnabled = assetConfig.GetBoolean("MemoryCacheEnabled", m_MemoryCacheEnabled);
|
m_MemoryCacheEnabled = assetConfig.GetBoolean("MemoryCacheEnabled", m_MemoryCacheEnabled);
|
||||||
|
@ -173,7 +176,7 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
|
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Cache Directory {0}", m_CacheDirectory);
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Cache Directory {0}", m_CacheDirectory);
|
||||||
|
|
||||||
if ((m_FileExpiration > TimeSpan.Zero) && (m_FileExpirationCleanupTimer > TimeSpan.Zero))
|
if (m_FileCacheEnabled && (m_FileExpiration > TimeSpan.Zero) && (m_FileExpirationCleanupTimer > TimeSpan.Zero))
|
||||||
{
|
{
|
||||||
m_CacheCleanTimer = new System.Timers.Timer(m_FileExpirationCleanupTimer.TotalMilliseconds);
|
m_CacheCleanTimer = new System.Timers.Timer(m_FileExpirationCleanupTimer.TotalMilliseconds);
|
||||||
m_CacheCleanTimer.AutoReset = true;
|
m_CacheCleanTimer.AutoReset = true;
|
||||||
|
@ -226,7 +229,6 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
if (m_AssetService == null)
|
if (m_AssetService == null)
|
||||||
{
|
{
|
||||||
m_AssetService = scene.RequestModuleInterface<IAssetService>();
|
m_AssetService = scene.RequestModuleInterface<IAssetService>();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -250,8 +252,57 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
|
|
||||||
private void UpdateMemoryCache(string key, AssetBase asset)
|
private void UpdateMemoryCache(string key, AssetBase asset)
|
||||||
{
|
{
|
||||||
if (m_MemoryCacheEnabled)
|
m_MemoryCache.AddOrUpdate(key, asset, m_MemoryExpiration);
|
||||||
m_MemoryCache.AddOrUpdate(key, asset, m_MemoryExpiration);
|
}
|
||||||
|
|
||||||
|
private void UpdateFileCache(string key, AssetBase asset)
|
||||||
|
{
|
||||||
|
string filename = GetFileName(asset.ID);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// If the file is already cached, don't cache it, just touch it so access time is updated
|
||||||
|
if (File.Exists(filename))
|
||||||
|
{
|
||||||
|
File.SetLastAccessTime(filename, DateTime.Now);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Once we start writing, make sure we flag that we're writing
|
||||||
|
// that object to the cache so that we don't try to write the
|
||||||
|
// same file multiple times.
|
||||||
|
lock (m_CurrentlyWriting)
|
||||||
|
{
|
||||||
|
#if WAIT_ON_INPROGRESS_REQUESTS
|
||||||
|
if (m_CurrentlyWriting.ContainsKey(filename))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_CurrentlyWriting.Add(filename, new ManualResetEvent(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
if (m_CurrentlyWriting.Contains(filename))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_CurrentlyWriting.Add(filename);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
Util.FireAndForget(
|
||||||
|
delegate { WriteFileCache(filename, asset); });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
LogException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Cache(AssetBase asset)
|
public void Cache(AssetBase asset)
|
||||||
|
@ -259,55 +310,101 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
// TODO: Spawn this off to some seperate thread to do the actual writing
|
// TODO: Spawn this off to some seperate thread to do the actual writing
|
||||||
if (asset != null)
|
if (asset != null)
|
||||||
{
|
{
|
||||||
UpdateMemoryCache(asset.ID, asset);
|
//m_log.DebugFormat("[FLOTSAM ASSET CACHE]: Caching asset with id {0}", asset.ID);
|
||||||
|
|
||||||
string filename = GetFileName(asset.ID);
|
if (m_MemoryCacheEnabled)
|
||||||
|
UpdateMemoryCache(asset.ID, asset);
|
||||||
|
|
||||||
|
if (m_FileCacheEnabled)
|
||||||
|
UpdateFileCache(asset.ID, asset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Try to get an asset from the in-memory cache.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private AssetBase GetFromMemoryCache(string id)
|
||||||
|
{
|
||||||
|
AssetBase asset = null;
|
||||||
|
|
||||||
|
if (m_MemoryCache.TryGetValue(id, out asset))
|
||||||
|
m_MemoryHits++;
|
||||||
|
|
||||||
|
return asset;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Try to get an asset from the file cache.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private AssetBase GetFromFileCache(string id)
|
||||||
|
{
|
||||||
|
AssetBase asset = null;
|
||||||
|
|
||||||
|
string filename = GetFileName(id);
|
||||||
|
if (File.Exists(filename))
|
||||||
|
{
|
||||||
|
FileStream stream = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// If the file is already cached, don't cache it, just touch it so access time is updated
|
stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||||
if (File.Exists(filename))
|
BinaryFormatter bformatter = new BinaryFormatter();
|
||||||
{
|
|
||||||
File.SetLastAccessTime(filename, DateTime.Now);
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// Once we start writing, make sure we flag that we're writing
|
asset = (AssetBase)bformatter.Deserialize(stream);
|
||||||
// that object to the cache so that we don't try to write the
|
|
||||||
// same file multiple times.
|
|
||||||
lock (m_CurrentlyWriting)
|
|
||||||
{
|
|
||||||
#if WAIT_ON_INPROGRESS_REQUESTS
|
|
||||||
if (m_CurrentlyWriting.ContainsKey(filename))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_CurrentlyWriting.Add(filename, new ManualResetEvent(false));
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
UpdateMemoryCache(id, asset);
|
||||||
if (m_CurrentlyWriting.Contains(filename))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_CurrentlyWriting.Add(filename);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
m_DiskHits++;
|
||||||
|
}
|
||||||
|
catch (System.Runtime.Serialization.SerializationException e)
|
||||||
|
{
|
||||||
|
LogException(e);
|
||||||
|
|
||||||
Util.FireAndForget(
|
// If there was a problem deserializing the asset, the asset may
|
||||||
delegate { WriteFileCache(filename, asset); });
|
// either be corrupted OR was serialized under an old format
|
||||||
}
|
// {different version of AssetBase} -- we should attempt to
|
||||||
|
// delete it and re-cache
|
||||||
|
File.Delete(filename);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
LogException(e);
|
LogException(e);
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (stream != null)
|
||||||
|
stream.Close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if WAIT_ON_INPROGRESS_REQUESTS
|
||||||
|
// Check if we're already downloading this asset. If so, try to wait for it to
|
||||||
|
// download.
|
||||||
|
if (m_WaitOnInprogressTimeout > 0)
|
||||||
|
{
|
||||||
|
m_RequestsForInprogress++;
|
||||||
|
|
||||||
|
ManualResetEvent waitEvent;
|
||||||
|
if (m_CurrentlyWriting.TryGetValue(filename, out waitEvent))
|
||||||
|
{
|
||||||
|
waitEvent.WaitOne(m_WaitOnInprogressTimeout);
|
||||||
|
return Get(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
// Track how often we have the problem that an asset is requested while
|
||||||
|
// it is still being downloaded by a previous request.
|
||||||
|
if (m_CurrentlyWriting.Contains(filename))
|
||||||
|
{
|
||||||
|
m_RequestsForInprogress++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return asset;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AssetBase Get(string id)
|
public AssetBase Get(string id)
|
||||||
|
@ -316,72 +413,10 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
|
|
||||||
AssetBase asset = null;
|
AssetBase asset = null;
|
||||||
|
|
||||||
if (m_MemoryCacheEnabled && m_MemoryCache.TryGetValue(id, out asset))
|
if (m_MemoryCacheEnabled)
|
||||||
{
|
asset = GetFromMemoryCache(id);
|
||||||
m_MemoryHits++;
|
else if (m_FileCacheEnabled)
|
||||||
}
|
asset = GetFromFileCache(id);
|
||||||
else
|
|
||||||
{
|
|
||||||
string filename = GetFileName(id);
|
|
||||||
if (File.Exists(filename))
|
|
||||||
{
|
|
||||||
FileStream stream = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
stream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
|
|
||||||
BinaryFormatter bformatter = new BinaryFormatter();
|
|
||||||
|
|
||||||
asset = (AssetBase)bformatter.Deserialize(stream);
|
|
||||||
|
|
||||||
UpdateMemoryCache(id, asset);
|
|
||||||
|
|
||||||
m_DiskHits++;
|
|
||||||
}
|
|
||||||
catch (System.Runtime.Serialization.SerializationException e)
|
|
||||||
{
|
|
||||||
LogException(e);
|
|
||||||
|
|
||||||
// If there was a problem deserializing the asset, the asset may
|
|
||||||
// either be corrupted OR was serialized under an old format
|
|
||||||
// {different version of AssetBase} -- we should attempt to
|
|
||||||
// delete it and re-cache
|
|
||||||
File.Delete(filename);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
LogException(e);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (stream != null)
|
|
||||||
stream.Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#if WAIT_ON_INPROGRESS_REQUESTS
|
|
||||||
// Check if we're already downloading this asset. If so, try to wait for it to
|
|
||||||
// download.
|
|
||||||
if (m_WaitOnInprogressTimeout > 0)
|
|
||||||
{
|
|
||||||
m_RequestsForInprogress++;
|
|
||||||
|
|
||||||
ManualResetEvent waitEvent;
|
|
||||||
if (m_CurrentlyWriting.TryGetValue(filename, out waitEvent))
|
|
||||||
{
|
|
||||||
waitEvent.WaitOne(m_WaitOnInprogressTimeout);
|
|
||||||
return Get(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// Track how often we have the problem that an asset is requested while
|
|
||||||
// it is still being downloaded by a previous request.
|
|
||||||
if (m_CurrentlyWriting.Contains(filename))
|
|
||||||
{
|
|
||||||
m_RequestsForInprogress++;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
if (((m_LogLevel >= 1)) && (m_HitRateDisplay != 0) && (m_Requests % m_HitRateDisplay == 0))
|
if (((m_LogLevel >= 1)) && (m_HitRateDisplay != 0) && (m_Requests % m_HitRateDisplay == 0))
|
||||||
{
|
{
|
||||||
|
@ -415,10 +450,13 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string filename = GetFileName(id);
|
if (m_FileCacheEnabled)
|
||||||
if (File.Exists(filename))
|
|
||||||
{
|
{
|
||||||
File.Delete(filename);
|
string filename = GetFileName(id);
|
||||||
|
if (File.Exists(filename))
|
||||||
|
{
|
||||||
|
File.Delete(filename);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_MemoryCacheEnabled)
|
if (m_MemoryCacheEnabled)
|
||||||
|
@ -433,11 +471,14 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
if (m_LogLevel >= 2)
|
if (m_LogLevel >= 2)
|
||||||
m_log.Debug("[FLOTSAM ASSET CACHE]: Clearing Cache.");
|
m_log.Debug("[FLOTSAM ASSET CACHE]: Clearing caches.");
|
||||||
|
|
||||||
foreach (string dir in Directory.GetDirectories(m_CacheDirectory))
|
if (m_FileCacheEnabled)
|
||||||
{
|
{
|
||||||
Directory.Delete(dir);
|
foreach (string dir in Directory.GetDirectories(m_CacheDirectory))
|
||||||
|
{
|
||||||
|
Directory.Delete(dir);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_MemoryCacheEnabled)
|
if (m_MemoryCacheEnabled)
|
||||||
|
@ -472,9 +513,9 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
/// removes empty tier directories.
|
/// removes empty tier directories.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dir"></param>
|
/// <param name="dir"></param>
|
||||||
|
/// <param name="purgeLine"></param>
|
||||||
private void CleanExpiredFiles(string dir, DateTime purgeLine)
|
private void CleanExpiredFiles(string dir, DateTime purgeLine)
|
||||||
{
|
{
|
||||||
|
|
||||||
foreach (string file in Directory.GetFiles(dir))
|
foreach (string file in Directory.GetFiles(dir))
|
||||||
{
|
{
|
||||||
if (File.GetLastAccessTime(file) < purgeLine)
|
if (File.GetLastAccessTime(file) < purgeLine)
|
||||||
|
@ -712,18 +753,28 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
switch (cmd)
|
switch (cmd)
|
||||||
{
|
{
|
||||||
case "status":
|
case "status":
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Memory Cache : {0} assets", m_MemoryCache.Count);
|
if (m_MemoryCacheEnabled)
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Memory Cache : {0} assets", m_MemoryCache.Count);
|
||||||
|
else
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Memory cache disabled");
|
||||||
|
|
||||||
int fileCount = GetFileCacheCount(m_CacheDirectory);
|
if (m_FileCacheEnabled)
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] File Cache : {0} assets", fileCount);
|
|
||||||
|
|
||||||
foreach (string s in Directory.GetFiles(m_CacheDirectory, "*.fac"))
|
|
||||||
{
|
{
|
||||||
m_log.Info("[FLOTSAM ASSET CACHE] Deep Scans were performed on the following regions:");
|
int fileCount = GetFileCacheCount(m_CacheDirectory);
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: File Cache : {0} assets", fileCount);
|
||||||
|
|
||||||
string RegionID = s.Remove(0,s.IndexOf("_")).Replace(".fac","");
|
foreach (string s in Directory.GetFiles(m_CacheDirectory, "*.fac"))
|
||||||
DateTime RegionDeepScanTMStamp = File.GetLastWriteTime(s);
|
{
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Region: {0}, {1}", RegionID, RegionDeepScanTMStamp.ToString("MM/dd/yyyy hh:mm:ss"));
|
m_log.Info("[FLOTSAM ASSET CACHE]: Deep Scans were performed on the following regions:");
|
||||||
|
|
||||||
|
string RegionID = s.Remove(0,s.IndexOf("_")).Replace(".fac","");
|
||||||
|
DateTime RegionDeepScanTMStamp = File.GetLastWriteTime(s);
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Region: {0}, {1}", RegionID, RegionDeepScanTMStamp.ToString("MM/dd/yyyy hh:mm:ss"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: File cache disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -731,7 +782,7 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
case "clear":
|
case "clear":
|
||||||
if (cmdparams.Length < 2)
|
if (cmdparams.Length < 2)
|
||||||
{
|
{
|
||||||
m_log.Warn("[FLOTSAM ASSET CACHE] Usage is fcache clear [file] [memory]");
|
m_log.Warn("[FLOTSAM ASSET CACHE]: Usage is fcache clear [file] [memory]");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -752,36 +803,48 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
|
|
||||||
if (clearMemory)
|
if (clearMemory)
|
||||||
{
|
{
|
||||||
m_MemoryCache.Clear();
|
if (m_MemoryCacheEnabled)
|
||||||
m_log.Info("[FLOTSAM ASSET CACHE] Memory cache cleared.");
|
{
|
||||||
|
m_MemoryCache.Clear();
|
||||||
|
m_log.Info("[FLOTSAM ASSET CACHE]: Memory cache cleared.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.Info("[FLOTSAM ASSET CACHE]: Memory cache not enabled.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clearFile)
|
if (clearFile)
|
||||||
{
|
{
|
||||||
ClearFileCache();
|
if (m_FileCacheEnabled)
|
||||||
m_log.Info("[FLOTSAM ASSET CACHE] File cache cleared.");
|
{
|
||||||
|
ClearFileCache();
|
||||||
|
m_log.Info("[FLOTSAM ASSET CACHE]: File cache cleared.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.Info("[FLOTSAM ASSET CACHE]: File cache not enabled.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
case "assets":
|
case "assets":
|
||||||
m_log.Info("[FLOTSAM ASSET CACHE] Caching all assets, in all scenes.");
|
m_log.Info("[FLOTSAM ASSET CACHE]: Caching all assets, in all scenes.");
|
||||||
|
|
||||||
Util.FireAndForget(delegate {
|
Util.FireAndForget(delegate {
|
||||||
int assetsCached = CacheScenes();
|
int assetsCached = CacheScenes();
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Completed Scene Caching, {0} assets found.", assetsCached);
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Completed Scene Caching, {0} assets found.", assetsCached);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "expire":
|
case "expire":
|
||||||
|
|
||||||
|
|
||||||
if (cmdparams.Length < 3)
|
if (cmdparams.Length < 3)
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Invalid parameters for Expire, please specify a valid date & time", cmd);
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Invalid parameters for Expire, please specify a valid date & time", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -799,26 +862,28 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
|
|
||||||
if (!DateTime.TryParse(s_expirationDate, out expirationDate))
|
if (!DateTime.TryParse(s_expirationDate, out expirationDate))
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] {0} is not a valid date & time", cmd);
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: {0} is not a valid date & time", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
CleanExpiredFiles(m_CacheDirectory, expirationDate);
|
if (m_FileCacheEnabled)
|
||||||
|
CleanExpiredFiles(m_CacheDirectory, expirationDate);
|
||||||
|
else
|
||||||
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: File cache not active, not clearing.");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] Unknown command {0}", cmd);
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: Unknown command {0}", cmd);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (cmdparams.Length == 1)
|
else if (cmdparams.Length == 1)
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache status - Display cache status");
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: fcache status - Display cache status");
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache clearmem - Remove all assets cached in memory");
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: fcache clearmem - Remove all assets cached in memory");
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache clearfile - Remove all assets cached on disk");
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: fcache clearfile - Remove all assets cached on disk");
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache cachescenes - Attempt a deep cache of all assets in all scenes");
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: fcache cachescenes - Attempt a deep cache of all assets in all scenes");
|
||||||
m_log.InfoFormat("[FLOTSAM ASSET CACHE] flotsamcache <datetime> - Purge assets older then the specified date & time");
|
m_log.InfoFormat("[FLOTSAM ASSET CACHE]: fcache <datetime> - Purge assets older then the specified date & time");
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,127 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* 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 System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Threading;
|
||||||
|
using log4net.Config;
|
||||||
|
using Nini.Config;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenMetaverse.Assets;
|
||||||
|
using Flotsam.RegionModules.AssetCache;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Region.Framework.Scenes.Serialization;
|
||||||
|
using OpenSim.Tests.Common;
|
||||||
|
using OpenSim.Tests.Common.Mock;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.CoreModules.Asset.Tests
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// At the moment we're only test the in-memory part of the FlotsamAssetCache. This is a considerable weakness.
|
||||||
|
/// </summary>
|
||||||
|
[TestFixture]
|
||||||
|
public class FlotsamAssetCacheTests
|
||||||
|
{
|
||||||
|
protected TestScene m_scene;
|
||||||
|
protected FlotsamAssetCache m_cache;
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void SetUp()
|
||||||
|
{
|
||||||
|
IConfigSource config = new IniConfigSource();
|
||||||
|
|
||||||
|
config.AddConfig("Modules");
|
||||||
|
config.Configs["Modules"].Set("AssetCaching", "FlotsamAssetCache");
|
||||||
|
config.AddConfig("AssetCache");
|
||||||
|
config.Configs["AssetCache"].Set("FileCacheEnabled", "false");
|
||||||
|
config.Configs["AssetCache"].Set("MemoryCacheEnabled", "true");
|
||||||
|
|
||||||
|
m_cache = new FlotsamAssetCache();
|
||||||
|
m_scene = SceneSetupHelpers.SetupScene();
|
||||||
|
SceneSetupHelpers.SetupSceneModules(m_scene, config, m_cache);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestCacheAsset()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
AssetBase asset = AssetHelpers.CreateAsset();
|
||||||
|
asset.ID = TestHelper.ParseTail(0x1).ToString();
|
||||||
|
|
||||||
|
// Check we don't get anything before the asset is put in the cache
|
||||||
|
AssetBase retrievedAsset = m_cache.Get(asset.ID.ToString());
|
||||||
|
Assert.That(retrievedAsset, Is.Null);
|
||||||
|
|
||||||
|
m_cache.Store(asset);
|
||||||
|
|
||||||
|
// Check that asset is now in cache
|
||||||
|
retrievedAsset = m_cache.Get(asset.ID.ToString());
|
||||||
|
Assert.That(retrievedAsset, Is.Not.Null);
|
||||||
|
Assert.That(retrievedAsset.ID, Is.EqualTo(asset.ID));
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestExpireAsset()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
AssetBase asset = AssetHelpers.CreateAsset();
|
||||||
|
asset.ID = TestHelper.ParseTail(0x2).ToString();
|
||||||
|
|
||||||
|
m_cache.Store(asset);
|
||||||
|
|
||||||
|
m_cache.Expire(asset.ID);
|
||||||
|
|
||||||
|
AssetBase retrievedAsset = m_cache.Get(asset.ID.ToString());
|
||||||
|
Assert.That(retrievedAsset, Is.Null);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestClearCache()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
AssetBase asset = AssetHelpers.CreateAsset();
|
||||||
|
asset.ID = TestHelper.ParseTail(0x2).ToString();
|
||||||
|
|
||||||
|
m_cache.Store(asset);
|
||||||
|
|
||||||
|
m_cache.Clear();
|
||||||
|
|
||||||
|
AssetBase retrievedAsset = m_cache.Get(asset.ID.ToString());
|
||||||
|
Assert.That(retrievedAsset, Is.Null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -116,16 +116,20 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Check for the existence of the baked texture assets. Request a rebake
|
/// Check for the existence of the baked texture assets.
|
||||||
/// unless checkonly is true.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="client"></param>
|
/// <param name="client"></param>
|
||||||
/// <param name="checkonly"></param>
|
|
||||||
public bool ValidateBakedTextureCache(IClientAPI client)
|
public bool ValidateBakedTextureCache(IClientAPI client)
|
||||||
{
|
{
|
||||||
return ValidateBakedTextureCache(client, true);
|
return ValidateBakedTextureCache(client, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check for the existence of the baked texture assets. Request a rebake
|
||||||
|
/// unless checkonly is true.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="client"></param>
|
||||||
|
/// <param name="checkonly"></param>
|
||||||
private bool ValidateBakedTextureCache(IClientAPI client, bool checkonly)
|
private bool ValidateBakedTextureCache(IClientAPI client, bool checkonly)
|
||||||
{
|
{
|
||||||
ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
|
ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
|
||||||
|
@ -156,18 +160,20 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
|
|
||||||
defonly = false; // found a non-default texture reference
|
defonly = false; // found a non-default texture reference
|
||||||
|
|
||||||
if (! CheckBakedTextureAsset(client,face.TextureID,idx))
|
if (!CheckBakedTextureAsset(client, face.TextureID, idx))
|
||||||
{
|
{
|
||||||
// the asset didn't exist if we are only checking, then we found a bad
|
// the asset didn't exist if we are only checking, then we found a bad
|
||||||
// one and we're done otherwise, ask for a rebake
|
// one and we're done otherwise, ask for a rebake
|
||||||
if (checkonly) return false;
|
if (checkonly)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_log.InfoFormat("[AVFACTORY]: missing baked texture {0}, requesting rebake", face.TextureID);
|
||||||
|
|
||||||
m_log.InfoFormat("[AVFACTORY]: missing baked texture {0}, requesting rebake",face.TextureID);
|
|
||||||
client.SendRebakeAvatarTextures(face.TextureID);
|
client.SendRebakeAvatarTextures(face.TextureID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.DebugFormat("[AVFACTORY]: completed texture check for {0}", client.AgentId);
|
m_log.DebugFormat("[AVFACTORY]: Completed texture check for {0}", client.AgentId);
|
||||||
|
|
||||||
// If we only found default textures, then the appearance is not cached
|
// If we only found default textures, then the appearance is not cached
|
||||||
return (defonly ? false : true);
|
return (defonly ? false : true);
|
||||||
|
@ -183,7 +189,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
|
ScenePresence sp = m_scene.GetScenePresence(client.AgentId);
|
||||||
if (sp == null)
|
if (sp == null)
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[AVFACTORY]: SetAppearance unable to find presence for {0}",client.AgentId);
|
m_log.WarnFormat("[AVFACTORY]: SetAppearance unable to find presence for {0}", client.AgentId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,7 +217,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
changed = sp.Appearance.SetTextureEntries(textureEntry) || changed;
|
changed = sp.Appearance.SetTextureEntries(textureEntry) || changed;
|
||||||
|
|
||||||
m_log.InfoFormat("[AVFACTORY]: received texture update for {0}", client.AgentId);
|
m_log.InfoFormat("[AVFACTORY]: received texture update for {0}", client.AgentId);
|
||||||
Util.FireAndForget(delegate(object o) { ValidateBakedTextureCache(client,false); });
|
Util.FireAndForget(delegate(object o) { ValidateBakedTextureCache(client, false); });
|
||||||
|
|
||||||
// This appears to be set only in the final stage of the appearance
|
// This appears to be set only in the final stage of the appearance
|
||||||
// update transaction. In theory, we should be able to do an immediate
|
// update transaction. In theory, we should be able to do an immediate
|
||||||
|
@ -220,9 +226,9 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
// save only if there were changes, send no matter what (doesn't hurt to send twice)
|
// save only if there were changes, send no matter what (doesn't hurt to send twice)
|
||||||
if (changed)
|
if (changed)
|
||||||
QueueAppearanceSave(client.AgentId);
|
QueueAppearanceSave(client.AgentId);
|
||||||
|
|
||||||
QueueAppearanceSend(client.AgentId);
|
QueueAppearanceSend(client.AgentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// m_log.WarnFormat("[AVFACTORY]: complete SetAppearance for {0}:\n{1}",client.AgentId,sp.Appearance.ToString());
|
// m_log.WarnFormat("[AVFACTORY]: complete SetAppearance for {0}:\n{1}",client.AgentId,sp.Appearance.ToString());
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* 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 NUnit.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Tests.Common;
|
||||||
|
using OpenSim.Tests.Common.Mock;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class AvatarFactoryModuleTests
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Only partial right now since we don't yet test that it's ended up in the avatar appearance service.
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestSetAppearance()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
UUID userId = TestHelper.ParseTail(0x1);
|
||||||
|
|
||||||
|
AvatarFactoryModule afm = new AvatarFactoryModule();
|
||||||
|
TestScene scene = SceneSetupHelpers.SetupScene();
|
||||||
|
SceneSetupHelpers.SetupSceneModules(scene, afm);
|
||||||
|
TestClient tc = SceneSetupHelpers.AddClient(scene, userId);
|
||||||
|
|
||||||
|
byte[] visualParams = new byte[AvatarAppearance.VISUALPARAM_COUNT];
|
||||||
|
for (byte i = 0; i < visualParams.Length; i++)
|
||||||
|
visualParams[i] = i;
|
||||||
|
|
||||||
|
afm.SetAppearance(tc, new Primitive.TextureEntry(TestHelper.ParseTail(0x10)), visualParams);
|
||||||
|
|
||||||
|
ScenePresence sp = scene.GetScenePresence(userId);
|
||||||
|
|
||||||
|
// TODO: Check baked texture
|
||||||
|
Assert.AreEqual(visualParams, sp.Appearance.VisualParams);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -830,7 +830,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
|
||||||
|
|
||||||
public bool LocalStatusNotification(UUID userID, UUID friendID, bool online)
|
public bool LocalStatusNotification(UUID userID, UUID friendID, bool online)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[FRIENDS]: Local Status Notify {0} that user {1} is {2}", friendID, userID, online);
|
// m_log.DebugFormat("[FRIENDS]: Local Status Notify {0} that user {1} is {2}", friendID, userID, online);
|
||||||
IClientAPI friendClient = LocateClientObject(friendID);
|
IClientAPI friendClient = LocateClientObject(friendID);
|
||||||
if (friendClient != null)
|
if (friendClient != null)
|
||||||
{
|
{
|
||||||
|
|
|
@ -173,9 +173,10 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||||
{
|
{
|
||||||
if (m_RestURL != "")
|
if (m_RestURL != "")
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[OFFLINE MESSAGING] Retrieving stored messages for {0}", client.AgentId);
|
m_log.DebugFormat("[OFFLINE MESSAGING]: Retrieving stored messages for {0}", client.AgentId);
|
||||||
|
|
||||||
List<GridInstantMessage> msglist = SynchronousRestObjectPoster.BeginPostObject<UUID, List<GridInstantMessage>>(
|
List<GridInstantMessage> msglist
|
||||||
|
= SynchronousRestObjectRequester.MakeRequest<UUID, List<GridInstantMessage>>(
|
||||||
"POST", m_RestURL + "/RetrieveMessages/", client.AgentId);
|
"POST", m_RestURL + "/RetrieveMessages/", client.AgentId);
|
||||||
|
|
||||||
if (msglist == null)
|
if (msglist == null)
|
||||||
|
@ -203,7 +204,7 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
|
||||||
if ((im.offline != 0)
|
if ((im.offline != 0)
|
||||||
&& (!im.fromGroup || (im.fromGroup && m_ForwardOfflineGroupMessages)))
|
&& (!im.fromGroup || (im.fromGroup && m_ForwardOfflineGroupMessages)))
|
||||||
{
|
{
|
||||||
bool success = SynchronousRestObjectPoster.BeginPostObject<GridInstantMessage, bool>(
|
bool success = SynchronousRestObjectRequester.MakeRequest<GridInstantMessage, bool>(
|
||||||
"POST", m_RestURL+"/SaveMessage/", im);
|
"POST", m_RestURL+"/SaveMessage/", im);
|
||||||
|
|
||||||
if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent)
|
if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent)
|
||||||
|
|
|
@ -50,6 +50,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The maximum distance, in standard region units (256m) that an agent is allowed to transfer.
|
||||||
|
/// </summary>
|
||||||
|
private int m_MaxTransferDistance = 4095;
|
||||||
|
public int MaxTransferDistance
|
||||||
|
{
|
||||||
|
get { return m_MaxTransferDistance; }
|
||||||
|
set { m_MaxTransferDistance = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected bool m_Enabled = false;
|
protected bool m_Enabled = false;
|
||||||
protected Scene m_aScene;
|
protected Scene m_aScene;
|
||||||
protected List<Scene> m_Scenes = new List<Scene>();
|
protected List<Scene> m_Scenes = new List<Scene>();
|
||||||
|
@ -78,13 +89,26 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
string name = moduleConfig.GetString("EntityTransferModule", "");
|
string name = moduleConfig.GetString("EntityTransferModule", "");
|
||||||
if (name == Name)
|
if (name == Name)
|
||||||
{
|
{
|
||||||
m_agentsInTransit = new List<UUID>();
|
InitialiseCommon(source);
|
||||||
m_Enabled = true;
|
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: {0} enabled.", Name);
|
||||||
m_log.InfoFormat("[ENTITY TRANSFER MODULE]: {0} enabled.", Name);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize config common for this module and any descendents.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="source"></param>
|
||||||
|
protected virtual void InitialiseCommon(IConfigSource source)
|
||||||
|
{
|
||||||
|
IConfig transferConfig = source.Configs["EntityTransfer"];
|
||||||
|
if (transferConfig != null)
|
||||||
|
MaxTransferDistance = transferConfig.GetInt("max_distance", 4095);
|
||||||
|
|
||||||
|
m_agentsInTransit = new List<UUID>();
|
||||||
|
m_Enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
public virtual void PostInitialise()
|
public virtual void PostInitialise()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -114,7 +138,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public virtual void RemoveRegion(Scene scene)
|
public virtual void RemoveRegion(Scene scene)
|
||||||
{
|
{
|
||||||
if (!m_Enabled)
|
if (!m_Enabled)
|
||||||
|
@ -129,7 +152,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
{
|
{
|
||||||
if (!m_Enabled)
|
if (!m_Enabled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -204,8 +226,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
sp.ControllingClient.SendTeleportFailed("Problem at destination");
|
sp.ControllingClient.SendTeleportFailed("Problem at destination");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final destination is x={0} y={1} {2}@{3}",
|
|
||||||
finalDestination.RegionLocX / Constants.RegionSize, finalDestination.RegionLocY / Constants.RegionSize, finalDestination.RegionID, finalDestination.ServerURI);
|
uint curX = 0, curY = 0;
|
||||||
|
Utils.LongToUInts(sp.Scene.RegionInfo.RegionHandle, out curX, out curY);
|
||||||
|
int curCellX = (int)(curX / Constants.RegionSize);
|
||||||
|
int curCellY = (int)(curY / Constants.RegionSize);
|
||||||
|
int destCellX = (int)(finalDestination.RegionLocX / Constants.RegionSize);
|
||||||
|
int destCellY = (int)(finalDestination.RegionLocY / Constants.RegionSize);
|
||||||
|
|
||||||
|
// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Source co-ords are x={0} y={1}", curRegionX, curRegionY);
|
||||||
|
//
|
||||||
|
// m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Final dest is x={0} y={1} {2}@{3}",
|
||||||
|
// destRegionX, destRegionY, finalDestination.RegionID, finalDestination.ServerURI);
|
||||||
|
|
||||||
// Check that these are not the same coordinates
|
// Check that these are not the same coordinates
|
||||||
if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX &&
|
if (finalDestination.RegionLocX == sp.Scene.RegionInfo.RegionLocX &&
|
||||||
|
@ -216,6 +248,18 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Math.Abs(curCellX - destCellX) > MaxTransferDistance || Math.Abs(curCellY - destCellY) > MaxTransferDistance)
|
||||||
|
{
|
||||||
|
sp.ControllingClient.SendTeleportFailed(
|
||||||
|
string.Format(
|
||||||
|
"Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way",
|
||||||
|
finalDestination.RegionName, destCellX, destCellY,
|
||||||
|
sp.Scene.RegionInfo.RegionName, curCellX, curCellY,
|
||||||
|
MaxTransferDistance));
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// This is it
|
// This is it
|
||||||
//
|
//
|
||||||
|
|
|
@ -67,10 +67,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
string name = moduleConfig.GetString("EntityTransferModule", "");
|
string name = moduleConfig.GetString("EntityTransferModule", "");
|
||||||
if (name == Name)
|
if (name == Name)
|
||||||
{
|
{
|
||||||
m_agentsInTransit = new List<UUID>();
|
InitialiseCommon(source);
|
||||||
|
m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
|
||||||
m_Enabled = true;
|
|
||||||
m_log.InfoFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -988,7 +988,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual bool GetAgentInventoryItem(IClientAPI remoteClient, UUID itemID, UUID requestID)
|
public virtual bool CanGetAgentInventoryItem(IClientAPI remoteClient, UUID itemID, UUID requestID)
|
||||||
{
|
{
|
||||||
InventoryItemBase assetRequestItem = GetItem(remoteClient.AgentId, itemID);
|
InventoryItemBase assetRequestItem = GetItem(remoteClient.AgentId, itemID);
|
||||||
if (assetRequestItem == null)
|
if (assetRequestItem == null)
|
||||||
|
@ -1067,7 +1067,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
InventoryItemBase item = new InventoryItemBase(itemID, agentID);
|
InventoryItemBase item = new InventoryItemBase(itemID, agentID);
|
||||||
item = invService.GetItem(item);
|
item = invService.GetItem(item);
|
||||||
|
|
||||||
if (item.CreatorData != null && item.CreatorData != string.Empty)
|
if (item != null && item.CreatorData != null && item.CreatorData != string.Empty)
|
||||||
UserManagementModule.AddUser(item.CreatorIdAsUuid, item.CreatorData);
|
UserManagementModule.AddUser(item.CreatorIdAsUuid, item.CreatorData);
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
|
|
|
@ -68,7 +68,6 @@ namespace OpenSim.Region.CoreModules.Framework.Monitoring
|
||||||
{
|
{
|
||||||
m_scene = scene;
|
m_scene = scene;
|
||||||
|
|
||||||
|
|
||||||
m_scene.AddCommand(this, "monitor report",
|
m_scene.AddCommand(this, "monitor report",
|
||||||
"monitor report",
|
"monitor report",
|
||||||
"Returns a variety of statistics about the current region and/or simulator",
|
"Returns a variety of statistics about the current region and/or simulator",
|
||||||
|
|
|
@ -297,9 +297,10 @@ namespace OpenSim.Region.CoreModules.Framework.UserManagement
|
||||||
if (m_UserCache.ContainsKey(id))
|
if (m_UserCache.ContainsKey(id))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// m_log.DebugFormat("[USER MANAGEMENT MODULE]: Adding user with id {0}, craetorData {1}", id, creatorData);
|
||||||
|
|
||||||
UserData user = new UserData();
|
UserData user = new UserData();
|
||||||
user.Id = id;
|
user.Id = id;
|
||||||
|
|
||||||
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, id);
|
UserAccount account = m_Scenes[0].UserAccountService.GetUserAccount(m_Scenes[0].RegionInfo.ScopeID, id);
|
||||||
|
|
||||||
if (account != null)
|
if (account != null)
|
||||||
|
|
|
@ -394,16 +394,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
// Find the physics actor whether it is an object or a scene presence
|
// Find the physics actor whether it is an object or a scene presence
|
||||||
private PhysicsActor FindPhysicsActor(UUID uuid)
|
private PhysicsActor FindPhysicsActor(UUID uuid)
|
||||||
{
|
{
|
||||||
SceneObjectPart sop = m_validLocalScene.GetSceneObjectPart(uuid);
|
|
||||||
if (sop != null)
|
|
||||||
{
|
|
||||||
return sop.PhysActor;
|
|
||||||
}
|
|
||||||
ScenePresence sp = m_validLocalScene.GetScenePresence(uuid);
|
ScenePresence sp = m_validLocalScene.GetScenePresence(uuid);
|
||||||
if (sp != null)
|
if (sp != null)
|
||||||
{
|
{
|
||||||
return sp.PhysicsActor;
|
return sp.PhysicsActor;
|
||||||
}
|
}
|
||||||
|
SceneObjectPart sop = m_validLocalScene.GetSceneObjectPart(uuid);
|
||||||
|
if (sop != null)
|
||||||
|
{
|
||||||
|
return sop.PhysActor;
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -108,8 +108,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
//m_scene.EventManager.OnPostSceneCreation += OnPostSceneCreation;
|
//m_scene.EventManager.OnPostSceneCreation += OnPostSceneCreation;
|
||||||
|
|
||||||
//Register for Scene/SceneGraph events
|
//Register for Scene/SceneGraph events
|
||||||
//m_scene.SceneGraph.OnObjectCreate += new ObjectCreateDelegate(ClientManager_OnObjectCreate);
|
|
||||||
m_scene.SceneGraph.OnObjectCreateBySync += new ObjectCreateBySyncDelegate(ClientManager_OnObjectCreateBySync);
|
|
||||||
m_scene.EventManager.OnSymmetricSyncStop += ClientManager_OnSymmetricSyncStop;
|
m_scene.EventManager.OnSymmetricSyncStop += ClientManager_OnSymmetricSyncStop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,19 +171,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
private string LogHeader = "[ClientManagerSyncModule]";
|
private string LogHeader = "[ClientManagerSyncModule]";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Script Engine's action upon an object is added to the local scene
|
/// Client Manager's action upon an object is added to the local scene
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void ClientManager_OnObjectCreateBySync(EntityBase entity)
|
private void ClientManager_OnObjectCreateBySync(EntityBase entity)
|
||||||
{
|
{
|
||||||
if (entity is SceneObjectGroup)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClientManager_OnSymmetricSyncStop()
|
public void ClientManager_OnSymmetricSyncStop()
|
||||||
{
|
{
|
||||||
//remove all objects
|
//remove all objects
|
||||||
m_scene.DeleteAllSceneObjects();
|
//m_scene.DeleteAllSceneObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion //ScriptEngineSyncModule
|
#endregion //ScriptEngineSyncModule
|
||||||
|
|
|
@ -115,8 +115,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
//m_scene.EventManager.OnPostSceneCreation += OnPostSceneCreation;
|
//m_scene.EventManager.OnPostSceneCreation += OnPostSceneCreation;
|
||||||
|
|
||||||
//Register for Scene/SceneGraph events
|
//Register for Scene/SceneGraph events
|
||||||
//m_scene.SceneGraph.OnObjectCreate += new ObjectCreateDelegate(PhysicsEngine_OnObjectCreate);
|
|
||||||
m_scene.SceneGraph.OnObjectCreateBySync += new ObjectCreateBySyncDelegate(PhysicsEngine_OnObjectCreateBySync);
|
|
||||||
m_scene.EventManager.OnSymmetricSyncStop += PhysicsEngine_OnSymmetricSyncStop;
|
m_scene.EventManager.OnSymmetricSyncStop += PhysicsEngine_OnSymmetricSyncStop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,7 +178,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
private string LogHeader = "[PhysicsEngineSyncModule]";
|
private string LogHeader = "[PhysicsEngineSyncModule]";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Script Engine's action upon an object is added to the local scene
|
/// Physics Engine's action upon an object is added to the local scene
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void PhysicsEngine_OnObjectCreateBySync(EntityBase entity)
|
private void PhysicsEngine_OnObjectCreateBySync(EntityBase entity)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1880,8 +1880,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
shape = true;
|
shape = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_log.WarnFormat("{0}: HandleUpdatedPrimProperties -- prim {1} not in local SceneGraph. SOP == NULL? ({2}), Sender is {3}, property == Shape? {4}",
|
//m_log.WarnFormat("{0}: HandleUpdatedPrimProperties -- prim {1} not in local SceneGraph. SOP == NULL? ({2}), Sender is {3}, property == Shape? {4}",
|
||||||
LogHeader, primUUID, sop == null, senderActorID, shape);
|
// LogHeader, primUUID, sop == null, senderActorID, shape);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2198,7 +2198,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
{
|
{
|
||||||
m_primSyncInfoManager.RemovePrimSyncInfo(part);
|
m_primSyncInfoManager.RemovePrimSyncInfo(part);
|
||||||
}
|
}
|
||||||
m_scene.DeleteSceneObjectBySynchronization(sog);
|
m_scene.DeleteSceneObjectBySync(sog);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3531,6 +3531,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
SceneObjectGroup group;
|
SceneObjectGroup group;
|
||||||
Dictionary<UUID, PrimSyncInfo> primsSyncInfo;
|
Dictionary<UUID, PrimSyncInfo> primsSyncInfo;
|
||||||
|
|
||||||
|
|
||||||
SceneObjectDecoder(data, out group, out primsSyncInfo);
|
SceneObjectDecoder(data, out group, out primsSyncInfo);
|
||||||
|
|
||||||
if (group == null)
|
if (group == null)
|
||||||
|
@ -3585,7 +3586,16 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
|
|
||||||
OSDMap rootData = (OSDMap)data["RootPart"];
|
OSDMap rootData = (OSDMap)data["RootPart"];
|
||||||
//Decode and copy to the list of PrimSyncInfo
|
//Decode and copy to the list of PrimSyncInfo
|
||||||
PrimSyncInfo primSyncInfo = m_primSyncInfoManager.DecodeFullSetPrimProperties(rootData);
|
PrimSyncInfo primSyncInfo = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
primSyncInfo = m_primSyncInfoManager.DecodeFullSetPrimProperties(rootData);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("SceneObjectDecoder: {0}", e.Message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
SceneObjectPart root= primSyncInfo.PrimSyncInfoToSOP();
|
SceneObjectPart root= primSyncInfo.PrimSyncInfoToSOP();
|
||||||
|
|
||||||
if (root != null)
|
if (root != null)
|
||||||
|
@ -6768,6 +6778,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
part.ParentGroup.AbsolutePosition = (Vector3)pSyncInfo.LastUpdateValue;
|
part.ParentGroup.AbsolutePosition = (Vector3)pSyncInfo.LastUpdateValue;
|
||||||
|
|
||||||
PropertySyncInfo gPosSyncInfo;
|
PropertySyncInfo gPosSyncInfo;
|
||||||
|
|
||||||
|
if (part.IsAttachment)
|
||||||
|
return;
|
||||||
|
|
||||||
if (m_propertiesSyncInfo.ContainsKey(SceneObjectPartSyncProperties.GroupPosition))
|
if (m_propertiesSyncInfo.ContainsKey(SceneObjectPartSyncProperties.GroupPosition))
|
||||||
{
|
{
|
||||||
gPosSyncInfo = m_propertiesSyncInfo[SceneObjectPartSyncProperties.GroupPosition];
|
gPosSyncInfo = m_propertiesSyncInfo[SceneObjectPartSyncProperties.GroupPosition];
|
||||||
|
|
|
@ -113,7 +113,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
|
|
||||||
//Register for Scene/SceneGraph events
|
//Register for Scene/SceneGraph events
|
||||||
m_scene.SceneGraph.OnObjectCreate += new ObjectCreateDelegate(ScenePersistence_OnObjectCreate);
|
m_scene.SceneGraph.OnObjectCreate += new ObjectCreateDelegate(ScenePersistence_OnObjectCreate);
|
||||||
m_scene.SceneGraph.OnObjectCreateBySync += new ObjectCreateBySyncDelegate(ScenePersistence_OnObjectCreateBySync);
|
//m_scene.SceneGraph.OnObjectCreateBySync += new ObjectCreateBySyncDelegate(ScenePersistence_OnObjectCreateBySync);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Called after AddRegion() has been called for all region modules of the scene.
|
//Called after AddRegion() has been called for all region modules of the scene.
|
||||||
|
@ -124,7 +124,6 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
if (!m_active)
|
if (!m_active)
|
||||||
return;
|
return;
|
||||||
m_log.Warn(LogHeader + " RegionLoaded() called");
|
m_log.Warn(LogHeader + " RegionLoaded() called");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemoveRegion(Scene scene)
|
public void RemoveRegion(Scene scene)
|
||||||
|
|
|
@ -109,6 +109,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule
|
||||||
|
|
||||||
//Register for Scene/SceneGraph events
|
//Register for Scene/SceneGraph events
|
||||||
//m_scene.SceneGraph.OnObjectCreate += new ObjectCreateDelegate(ScriptEngine_OnObjectCreate);
|
//m_scene.SceneGraph.OnObjectCreate += new ObjectCreateDelegate(ScriptEngine_OnObjectCreate);
|
||||||
|
|
||||||
|
//Don't subscribe to OnObjectCreate, only subscribe OnObjectCreateBySync.
|
||||||
m_scene.SceneGraph.OnObjectCreateBySync += new ObjectCreateBySyncDelegate(ScriptEngine_OnObjectCreateBySync);
|
m_scene.SceneGraph.OnObjectCreateBySync += new ObjectCreateBySyncDelegate(ScriptEngine_OnObjectCreateBySync);
|
||||||
m_scene.EventManager.OnSymmetricSyncStop += ScriptEngine_OnSymmetricSyncStop;
|
m_scene.EventManager.OnSymmetricSyncStop += ScriptEngine_OnSymmetricSyncStop;
|
||||||
|
|
||||||
|
|
|
@ -284,9 +284,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
|
||||||
|
|
||||||
item = m_InventoryService.GetItem(item);
|
item = m_InventoryService.GetItem(item);
|
||||||
|
|
||||||
if (null == item)
|
// if (null == item)
|
||||||
m_log.ErrorFormat(
|
// m_log.ErrorFormat(
|
||||||
"[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}", requestedItemId);
|
// "[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}", requestedItemId);
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
|
@ -418,7 +418,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
public bool IsBannedFromLand(UUID avatar)
|
public bool IsBannedFromLand(UUID avatar)
|
||||||
{
|
{
|
||||||
if (m_scene.Permissions.IsAdministrator(avatar))
|
if (m_scene.Permissions.CanEditParcelProperties(avatar, this, 0))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0)
|
if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0)
|
||||||
|
@ -429,7 +429,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
if (e.AgentID == avatar && e.Flags == AccessList.Ban)
|
if (e.AgentID == avatar && e.Flags == AccessList.Ban)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}) != -1 && LandData.OwnerID != avatar)
|
}) != -1)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -439,7 +439,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
public bool IsRestrictedFromLand(UUID avatar)
|
public bool IsRestrictedFromLand(UUID avatar)
|
||||||
{
|
{
|
||||||
if (m_scene.Permissions.IsAdministrator(avatar))
|
if (m_scene.Permissions.CanEditParcelProperties(avatar, this, 0))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0)
|
if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0)
|
||||||
|
@ -450,7 +450,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
if (e.AgentID == avatar && e.Flags == AccessList.Access)
|
if (e.AgentID == avatar && e.Flags == AccessList.Access)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}) == -1 && LandData.OwnerID != avatar)
|
}) == -1)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,7 +134,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_allowGridGods = myConfig.GetBoolean("allow_grid_gods", false);
|
m_allowGridGods = myConfig.GetBoolean("allow_grid_gods", false);
|
||||||
m_bypassPermissions = !myConfig.GetBoolean("serverside_object_permissions", false);
|
m_bypassPermissions = !myConfig.GetBoolean("serverside_object_permissions", true);
|
||||||
m_propagatePermissions = myConfig.GetBoolean("propagate_permissions", true);
|
m_propagatePermissions = myConfig.GetBoolean("propagate_permissions", true);
|
||||||
m_RegionOwnerIsGod = myConfig.GetBoolean("region_owner_is_god", true);
|
m_RegionOwnerIsGod = myConfig.GetBoolean("region_owner_is_god", true);
|
||||||
m_RegionManagerIsGod = myConfig.GetBoolean("region_manager_is_god", false);
|
m_RegionManagerIsGod = myConfig.GetBoolean("region_manager_is_god", false);
|
||||||
|
|
|
@ -92,6 +92,8 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_log.DebugFormat("MAP NAME=({0})", mapName);
|
||||||
|
|
||||||
// try to fetch from GridServer
|
// try to fetch from GridServer
|
||||||
List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20);
|
List<GridRegion> regionInfos = m_scene.GridService.GetRegionsByName(m_scene.RegionInfo.ScopeID, mapName, 20);
|
||||||
if (regionInfos == null)
|
if (regionInfos == null)
|
||||||
|
@ -103,7 +105,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
if (info != null)
|
if (info != null)
|
||||||
regionInfos.Add(info);
|
regionInfos.Add(info);
|
||||||
}
|
}
|
||||||
else if (regionInfos.Count == 0 && mapName.StartsWith("http://"))
|
else if (regionInfos.Count == 0)
|
||||||
remoteClient.SendAlertMessage("Hyperlink could not be established.");
|
remoteClient.SendAlertMessage("Hyperlink could not be established.");
|
||||||
|
|
||||||
m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions. Flags={2}", mapName, regionInfos.Count, flags);
|
m_log.DebugFormat("[MAPSEARCHMODULE]: search {0} returned {1} regions. Flags={2}", mapName, regionInfos.Count, flags);
|
||||||
|
|
|
@ -59,7 +59,15 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
|
UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
|
||||||
bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment);
|
bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment);
|
||||||
void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver);
|
void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver);
|
||||||
bool GetAgentInventoryItem(IClientAPI remoteClient, UUID itemID, UUID requestID);
|
|
||||||
|
/// <summary>
|
||||||
|
/// Does the client have sufficient permissions to retrieve the inventory item?
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="remoteClient"></param>
|
||||||
|
/// <param name="itemID"></param>
|
||||||
|
/// <param name="requestID"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
bool CanGetAgentInventoryItem(IClientAPI remoteClient, UUID itemID, UUID requestID);
|
||||||
|
|
||||||
// Must be here because of textures in user's inventory
|
// Must be here because of textures in user's inventory
|
||||||
bool IsForeignUser(UUID userID, out string assetServerURL);
|
bool IsForeignUser(UUID userID, out string assetServerURL);
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
||||||
namespace OpenSim.Region.CoreModules.Avatar.NPC
|
namespace OpenSim.Region.Framework.Interfaces
|
||||||
{
|
{
|
||||||
public interface INPCModule
|
public interface INPCModule
|
||||||
{
|
{
|
|
@ -0,0 +1,156 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* 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 System.Reflection;
|
||||||
|
using System.Threading;
|
||||||
|
using log4net;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.Framework.Scenes
|
||||||
|
{
|
||||||
|
class FetchHolder
|
||||||
|
{
|
||||||
|
public IClientAPI Client { get; private set; }
|
||||||
|
public UUID ItemID { get; private set; }
|
||||||
|
|
||||||
|
public FetchHolder(IClientAPI client, UUID itemID)
|
||||||
|
{
|
||||||
|
Client = client;
|
||||||
|
ItemID = itemID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Send FetchInventoryReply information to clients asynchronously on a single thread rather than asynchronously via
|
||||||
|
/// multiple threads.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// If the main root inventory is right-clicked on a version 1 viewer for a user with a large inventory, a very
|
||||||
|
/// very large number of FetchInventory requests are sent to the simulator. Each is handled on a separate thread
|
||||||
|
/// by the IClientAPI, but the sheer number of requests overwhelms the number of threads available and ends up
|
||||||
|
/// freezing the inbound packet handling.
|
||||||
|
///
|
||||||
|
/// This class makes the first FetchInventory packet thread process the queue. If new requests come
|
||||||
|
/// in while it is processing, then the subsequent threads just add the requests and leave it to the original
|
||||||
|
/// thread to process them.
|
||||||
|
///
|
||||||
|
/// This might slow down outbound packets but these are limited by the IClientAPI outbound queues
|
||||||
|
/// anyway.
|
||||||
|
///
|
||||||
|
/// It might be possible to ignore FetchInventory requests altogether, particularly as they are redundant wrt to
|
||||||
|
/// FetchInventoryDescendents requests, but this would require more investigation.
|
||||||
|
/// </remarks>
|
||||||
|
public class AsyncInventorySender
|
||||||
|
{
|
||||||
|
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
protected Scene m_scene;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Queues fetch requests
|
||||||
|
/// </summary>
|
||||||
|
Queue<FetchHolder> m_fetchHolder = new Queue<FetchHolder>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Signal whether a queue is currently being processed or not.
|
||||||
|
/// </summary>
|
||||||
|
protected volatile bool m_processing;
|
||||||
|
|
||||||
|
public AsyncInventorySender(Scene scene)
|
||||||
|
{
|
||||||
|
m_processing = false;
|
||||||
|
m_scene = scene;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handle a fetch inventory request from the client
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="remoteClient"></param>
|
||||||
|
/// <param name="itemID"></param>
|
||||||
|
/// <param name="ownerID"></param>
|
||||||
|
public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID)
|
||||||
|
{
|
||||||
|
lock (m_fetchHolder)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[ASYNC INVENTORY SENDER]: Putting request from {0} for {1} on queue", remoteClient.Name, itemID);
|
||||||
|
|
||||||
|
m_fetchHolder.Enqueue(new FetchHolder(remoteClient, itemID));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!m_processing)
|
||||||
|
{
|
||||||
|
m_processing = true;
|
||||||
|
ProcessQueue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Process the queue of fetches
|
||||||
|
/// </summary>
|
||||||
|
protected void ProcessQueue()
|
||||||
|
{
|
||||||
|
FetchHolder fh = null;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
lock (m_fetchHolder)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat("[ASYNC INVENTORY SENDER]: {0} items left to process", m_fetchHolder.Count);
|
||||||
|
|
||||||
|
if (m_fetchHolder.Count == 0)
|
||||||
|
{
|
||||||
|
m_processing = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fh = m_fetchHolder.Dequeue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fh.Client.IsLoggingOut)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[ASYNC INVENTORY SENDER]: Handling request from {0} for {1} on queue", fh.Client.Name, fh.ItemID);
|
||||||
|
|
||||||
|
InventoryItemBase item = new InventoryItemBase(fh.ItemID, fh.Client.AgentId);
|
||||||
|
item = m_scene.InventoryService.GetItem(item);
|
||||||
|
|
||||||
|
if (item != null)
|
||||||
|
fh.Client.SendInventoryItemDetails(item.Owner, item);
|
||||||
|
|
||||||
|
// TODO: Possibly log any failure
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -51,6 +51,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected AsyncSceneObjectGroupDeleter m_asyncSceneObjectDeleter;
|
protected AsyncSceneObjectGroupDeleter m_asyncSceneObjectDeleter;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Allows inventory details to be sent to clients asynchronously
|
||||||
|
/// </summary>
|
||||||
|
protected AsyncInventorySender m_asyncInventorySender;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Start all the scripts in the scene which should be started.
|
/// Start all the scripts in the scene which should be started.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -1499,7 +1504,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// m_log.DebugFormat("[AGENT INVENTORY]: Sending inventory folder contents ({0} nodes) for \"{1}\" to {2} {3}",
|
// m_log.DebugFormat("[AGENT INVENTORY]: Sending inventory folder contents ({0} nodes) for \"{1}\" to {2} {3}",
|
||||||
// contents.Folders.Count + contents.Items.Count, containingFolder.Name, client.FirstName, client.LastName);
|
// contents.Folders.Count + contents.Items.Count, containingFolder.Name, client.FirstName, client.LastName);
|
||||||
|
|
||||||
if (containingFolder != null && containingFolder != null)
|
if (containingFolder != null)
|
||||||
{
|
{
|
||||||
// If the folder requested contains links, then we need to send those folders first, otherwise the links
|
// If the folder requested contains links, then we need to send those folders first, otherwise the links
|
||||||
// will be broken in the viewer.
|
// will be broken in the viewer.
|
||||||
|
@ -1511,15 +1516,25 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
InventoryItemBase linkedItem = InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
InventoryItemBase linkedItem = InventoryService.GetItem(new InventoryItemBase(item.AssetID));
|
||||||
|
|
||||||
// Take care of genuinely broken links where the target doesn't exist
|
// Take care of genuinely broken links where the target doesn't exist
|
||||||
if (linkedItem != null)
|
// HACK: Also, don't follow up links that just point to other links. In theory this is legitimate,
|
||||||
linkedItemFolderIdsToSend.Add(linkedItem.Folder);
|
// but no viewer has been observed to set these up and this is the lazy way of avoiding cycles
|
||||||
|
// rather than having to keep track of every folder requested in the recursion.
|
||||||
|
if (linkedItem != null && linkedItem.AssetType != (int)AssetType.Link)
|
||||||
|
{
|
||||||
|
// We don't need to send the folder if source and destination of the link are in the same
|
||||||
|
// folder.
|
||||||
|
if (linkedItem.Folder != containingFolder.ID)
|
||||||
|
linkedItemFolderIdsToSend.Add(linkedItem.Folder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
|
foreach (UUID linkedItemFolderId in linkedItemFolderIdsToSend)
|
||||||
SendInventoryUpdate(client, new InventoryFolderBase(linkedItemFolderId), false, true);
|
SendInventoryUpdate(client, new InventoryFolderBase(linkedItemFolderId), false, true);
|
||||||
|
|
||||||
client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, containingFolder.Version, fetchFolders, fetchItems);
|
client.SendInventoryFolderDetails(
|
||||||
|
client.AgentId, folder.ID, contents.Items, contents.Folders,
|
||||||
|
containingFolder.Version, fetchFolders, fetchItems);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -463,31 +463,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Handle a fetch inventory request from the client
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="remoteClient"></param>
|
|
||||||
/// <param name="itemID"></param>
|
|
||||||
/// <param name="ownerID"></param>
|
|
||||||
public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID)
|
|
||||||
{
|
|
||||||
if (LibraryService != null && LibraryService.LibraryRootFolder != null && ownerID == LibraryService.LibraryRootFolder.Owner)
|
|
||||||
{
|
|
||||||
//m_log.Debug("request info for library item");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
|
|
||||||
item = InventoryService.GetItem(item);
|
|
||||||
|
|
||||||
if (item != null)
|
|
||||||
{
|
|
||||||
remoteClient.SendInventoryItemDetails(ownerID, item);
|
|
||||||
}
|
|
||||||
// else shouldn't we send an alert message?
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tell the client about the various child items and folders contained in the requested folder.
|
/// Tell the client about the various child items and folders contained in the requested folder.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -702,16 +702,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
SceneObjectGroup sog = (SceneObjectGroup)e;
|
SceneObjectGroup sog = (SceneObjectGroup)e;
|
||||||
if (!sog.IsAttachment)
|
if (!sog.IsAttachment)
|
||||||
DeleteSceneObjectBySynchronization((SceneObjectGroup)e);
|
DeleteSceneObjectBySync((SceneObjectGroup)e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Similar to DeleteSceneObject, except that this does not trigger SyncDeleteObject
|
//Similar to DeleteSceneObject, except that this does not trigger SyncDeleteObject
|
||||||
public void DeleteSceneObjectBySynchronization(SceneObjectGroup group)
|
public void DeleteSceneObjectBySync(SceneObjectGroup group)
|
||||||
{
|
{
|
||||||
|
bool silent = false;
|
||||||
|
bool syncDelete = false;
|
||||||
|
DeleteSceneObject(group, silent, syncDelete);
|
||||||
|
|
||||||
|
/*
|
||||||
// Serialise calls to RemoveScriptInstances to avoid
|
// Serialise calls to RemoveScriptInstances to avoid
|
||||||
// deadlocking on m_parts inside SceneObjectGroup
|
// deadlocking on m_parts inside SceneObjectGroup
|
||||||
lock (m_deleting_scene_object)
|
lock (m_deleting_scene_object)
|
||||||
|
@ -743,6 +747,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
bool silent = false; //do not suppress broadcasting changes to other clients, for debugging with viewers
|
bool silent = false; //do not suppress broadcasting changes to other clients, for debugging with viewers
|
||||||
group.DeleteGroupFromScene(silent);
|
group.DeleteGroupFromScene(silent);
|
||||||
|
|
||||||
|
* */
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddNewSceneObjectPartBySync(SceneObjectPart newPart, SceneObjectGroup parentGroup)
|
public void AddNewSceneObjectPartBySync(SceneObjectPart newPart, SceneObjectGroup parentGroup)
|
||||||
|
@ -753,6 +758,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_sceneGraph.AddNewSceneObjectPart(newPart, parentGroup);
|
m_sceneGraph.AddNewSceneObjectPart(newPart, parentGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public ObjectUpdateResult AddNewSceneObjectBySync(SceneObjectGroup sceneObject)
|
public ObjectUpdateResult AddNewSceneObjectBySync(SceneObjectGroup sceneObject)
|
||||||
{
|
{
|
||||||
//if(attachToBackup)
|
//if(attachToBackup)
|
||||||
|
@ -790,7 +796,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return m_sceneGraph.AddNewSceneObjectBySync(sceneObject);
|
if (m_sceneGraph.AddNewSceneObjectBySync(sceneObject))
|
||||||
|
return Scene.ObjectUpdateResult.New;
|
||||||
|
else
|
||||||
|
return Scene.ObjectUpdateResult.Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
//return m_sceneGraph.AddNewSceneObjectBySync(group);
|
//return m_sceneGraph.AddNewSceneObjectBySync(group);
|
||||||
|
@ -1102,6 +1111,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this);
|
m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this);
|
||||||
m_asyncSceneObjectDeleter.Enabled = true;
|
m_asyncSceneObjectDeleter.Enabled = true;
|
||||||
|
|
||||||
|
m_asyncInventorySender = new AsyncInventorySender(this);
|
||||||
|
|
||||||
#region Region Settings
|
#region Region Settings
|
||||||
|
|
||||||
// Load region settings
|
// Load region settings
|
||||||
|
@ -2344,6 +2355,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads the World's objects
|
/// Loads the World's objects
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <param name="regionID"></param>
|
||||||
public virtual void LoadPrimsFromStorage(UUID regionID)
|
public virtual void LoadPrimsFromStorage(UUID regionID)
|
||||||
{
|
{
|
||||||
LoadingPrims = true;
|
LoadingPrims = true;
|
||||||
|
@ -2368,8 +2380,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
SceneObjectPart rootPart = group.GetChildPart(group.UUID);
|
SceneObjectPart rootPart = group.GetChildPart(group.UUID);
|
||||||
rootPart.Flags &= ~PrimFlags.Scripted;
|
rootPart.Flags &= ~PrimFlags.Scripted;
|
||||||
rootPart.TrimPermissions();
|
rootPart.TrimPermissions();
|
||||||
group.CheckSculptAndLoad();
|
|
||||||
//rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
|
// Don't do this here - it will get done later on when sculpt data is loaded.
|
||||||
|
// group.CheckSculptAndLoad();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.InfoFormat("[SCENE ({0})]: Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)", m_regionName);
|
m_log.InfoFormat("[SCENE ({0})]: Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)", m_regionName);
|
||||||
|
@ -2668,12 +2681,25 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Synchronously delete the given object from the scene. This should be called by
|
||||||
|
/// deletion that is initiated locally.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="group"></param>
|
||||||
|
/// <param name="silent"></param>
|
||||||
|
public void DeleteSceneObject(SceneObjectGroup group, bool silent)
|
||||||
|
{
|
||||||
|
DeleteSceneObject(group, silent, true);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Synchronously delete the given object from the scene.
|
/// Synchronously delete the given object from the scene.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="group">Object Id</param>
|
/// <param name="group">Object Id</param>
|
||||||
/// <param name="silent">Suppress broadcasting changes to other clients.</param>
|
/// <param name="silent">Suppress broadcasting changes to other clients.</param>
|
||||||
public void DeleteSceneObject(SceneObjectGroup group, bool silent)
|
/// <param name="syncDelete">"false" if this function is called by
|
||||||
|
/// receiving SymmetricSyncMessage.MsgType.RemovedObject, "true" otherwise.</param>
|
||||||
|
public void DeleteSceneObject(SceneObjectGroup group, bool silent, bool syncDelete)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID);
|
// m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID);
|
||||||
|
|
||||||
|
@ -2715,7 +2741,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
//DSG SYNC
|
//DSG SYNC
|
||||||
//Propagate the RemovedObject message
|
//Propagate the RemovedObject message
|
||||||
if (RegionSyncModule != null)
|
if (RegionSyncModule != null && syncDelete)
|
||||||
{
|
{
|
||||||
//RegionSyncModule.SendDeleteObject(group, false);
|
//RegionSyncModule.SendDeleteObject(group, false);
|
||||||
RegionSyncModule.SyncDeleteObject(group, false);
|
RegionSyncModule.SyncDeleteObject(group, false);
|
||||||
|
@ -3415,14 +3441,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public virtual void SubscribeToClientInventoryEvents(IClientAPI client)
|
public virtual void SubscribeToClientInventoryEvents(IClientAPI client)
|
||||||
{
|
{
|
||||||
|
|
||||||
client.OnLinkInventoryItem += HandleLinkInventoryItem;
|
client.OnLinkInventoryItem += HandleLinkInventoryItem;
|
||||||
client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder;
|
client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder;
|
||||||
client.OnUpdateInventoryFolder += HandleUpdateInventoryFolder;
|
client.OnUpdateInventoryFolder += HandleUpdateInventoryFolder;
|
||||||
client.OnMoveInventoryFolder += HandleMoveInventoryFolder; // 2; //!!
|
client.OnMoveInventoryFolder += HandleMoveInventoryFolder; // 2; //!!
|
||||||
client.OnFetchInventoryDescendents += HandleFetchInventoryDescendents;
|
client.OnFetchInventoryDescendents += HandleFetchInventoryDescendents;
|
||||||
client.OnPurgeInventoryDescendents += HandlePurgeInventoryDescendents; // 2; //!!
|
client.OnPurgeInventoryDescendents += HandlePurgeInventoryDescendents; // 2; //!!
|
||||||
client.OnFetchInventory += HandleFetchInventory;
|
client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory;
|
||||||
client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
|
client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
|
||||||
client.OnCopyInventoryItem += CopyInventoryItem;
|
client.OnCopyInventoryItem += CopyInventoryItem;
|
||||||
client.OnMoveInventoryItem += MoveInventoryItem;
|
client.OnMoveInventoryItem += MoveInventoryItem;
|
||||||
|
@ -3541,13 +3566,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public virtual void UnSubscribeToClientInventoryEvents(IClientAPI client)
|
public virtual void UnSubscribeToClientInventoryEvents(IClientAPI client)
|
||||||
{
|
{
|
||||||
|
|
||||||
client.OnCreateNewInventoryFolder -= HandleCreateInventoryFolder;
|
client.OnCreateNewInventoryFolder -= HandleCreateInventoryFolder;
|
||||||
client.OnUpdateInventoryFolder -= HandleUpdateInventoryFolder;
|
client.OnUpdateInventoryFolder -= HandleUpdateInventoryFolder;
|
||||||
client.OnMoveInventoryFolder -= HandleMoveInventoryFolder; // 2; //!!
|
client.OnMoveInventoryFolder -= HandleMoveInventoryFolder; // 2; //!!
|
||||||
client.OnFetchInventoryDescendents -= HandleFetchInventoryDescendents;
|
client.OnFetchInventoryDescendents -= HandleFetchInventoryDescendents;
|
||||||
client.OnPurgeInventoryDescendents -= HandlePurgeInventoryDescendents; // 2; //!!
|
client.OnPurgeInventoryDescendents -= HandlePurgeInventoryDescendents; // 2; //!!
|
||||||
client.OnFetchInventory -= HandleFetchInventory;
|
client.OnFetchInventory -= m_asyncInventorySender.HandleFetchInventory;
|
||||||
client.OnUpdateInventoryItem -= UpdateInventoryItemAsset;
|
client.OnUpdateInventoryItem -= UpdateInventoryItemAsset;
|
||||||
client.OnCopyInventoryItem -= CopyInventoryItem;
|
client.OnCopyInventoryItem -= CopyInventoryItem;
|
||||||
client.OnMoveInventoryItem -= MoveInventoryItem;
|
client.OnMoveInventoryItem -= MoveInventoryItem;
|
||||||
|
@ -4076,7 +4100,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// In all cases, add or update the circuit data with the new agent circuit data and teleport flags
|
// In all cases, add or update the circuit data with the new agent circuit data and teleport flags
|
||||||
agent.teleportFlags = teleportFlags;
|
agent.teleportFlags = teleportFlags;
|
||||||
m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
|
m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
|
||||||
|
|
|
@ -1436,21 +1436,26 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///
|
/// Update the flags on a scene object. This covers properties such as phantom, physics and temporary.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// This is currently handling the incoming call from the client stack (e.g. LLClientView).
|
||||||
|
/// </remarks>
|
||||||
/// <param name="localID"></param>
|
/// <param name="localID"></param>
|
||||||
/// <param name="packet"></param>
|
/// <param name="UsePhysics"></param>
|
||||||
|
/// <param name="SetTemporary"></param>
|
||||||
|
/// <param name="SetPhantom"></param>
|
||||||
/// <param name="remoteClient"></param>
|
/// <param name="remoteClient"></param>
|
||||||
/// This routine seems to get called when a user changes object settings in the viewer.
|
protected internal void UpdatePrimFlags(
|
||||||
/// If some one can confirm that, please change the comment according.
|
uint localID, bool UsePhysics, bool SetTemporary, bool SetPhantom, IClientAPI remoteClient)
|
||||||
protected internal void UpdatePrimFlags(uint localID, bool UsePhysics, bool IsTemporary, bool IsPhantom, IClientAPI remoteClient)
|
|
||||||
{
|
{
|
||||||
SceneObjectGroup group = GetGroupByPrim(localID);
|
SceneObjectGroup group = GetGroupByPrim(localID);
|
||||||
if (group != null)
|
if (group != null)
|
||||||
{
|
{
|
||||||
if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId))
|
if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId))
|
||||||
{
|
{
|
||||||
group.UpdatePrimFlags(localID, UsePhysics, IsTemporary, IsPhantom, false); // VolumeDetect can't be set via UI and will always be off when a change is made there
|
// VolumeDetect can't be set via UI and will always be off when a change is made there
|
||||||
|
group.UpdatePrimFlags(localID, UsePhysics, SetTemporary, SetPhantom, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2096,6 +2101,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
*/
|
*/
|
||||||
//This is called when an object is added due to receiving a state synchronization message from Scene or an actor. Do similar things as the original AddSceneObject(),
|
//This is called when an object is added due to receiving a state synchronization message from Scene or an actor. Do similar things as the original AddSceneObject(),
|
||||||
//but call ScheduleGroupForFullUpdate_TimeStampUnchanged() instead, so as not to modify the timestamp or actorID, since the object was not created locally.
|
//but call ScheduleGroupForFullUpdate_TimeStampUnchanged() instead, so as not to modify the timestamp or actorID, since the object was not created locally.
|
||||||
|
/*
|
||||||
public Scene.ObjectUpdateResult AddNewSceneObjectBySync(SceneObjectGroup sceneObject)
|
public Scene.ObjectUpdateResult AddNewSceneObjectBySync(SceneObjectGroup sceneObject)
|
||||||
{
|
{
|
||||||
Scene.ObjectUpdateResult updateResult = Scene.ObjectUpdateResult.New;
|
Scene.ObjectUpdateResult updateResult = Scene.ObjectUpdateResult.New;
|
||||||
|
@ -2185,6 +2191,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
return updateResult;
|
return updateResult;
|
||||||
}
|
}
|
||||||
|
* */
|
||||||
|
|
||||||
public void AddNewSceneObjectPart(SceneObjectPart newPart, SceneObjectGroup parentGroup)
|
public void AddNewSceneObjectPart(SceneObjectPart newPart, SceneObjectGroup parentGroup)
|
||||||
{
|
{
|
||||||
|
@ -2534,6 +2541,38 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates, triggerSyncNewObject);
|
return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates, triggerSyncNewObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected internal bool AddNewSceneObjectBySync(SceneObjectGroup sceneObject)
|
||||||
|
{
|
||||||
|
sceneObject.HasGroupChanged = true;
|
||||||
|
bool triggerSyncNewObject = false;
|
||||||
|
if (AddSceneObject(sceneObject, true, true, triggerSyncNewObject))
|
||||||
|
{
|
||||||
|
//Take some special care of the case of this object being an attachment,
|
||||||
|
//since localID of attachedAvatar is different in different sync node's
|
||||||
|
//Scene copies.
|
||||||
|
sceneObject.RootPart.SetAttachmentPoint(sceneObject.RootPart.AttachmentPoint);
|
||||||
|
if (sceneObject.IsAttachment)
|
||||||
|
{
|
||||||
|
ScenePresence avatar = m_parentScene.GetScenePresence(sceneObject.RootPart.AttachedAvatar);
|
||||||
|
//It is possible that the avatar has not been fully
|
||||||
|
//created locally when attachment objects are sync'ed.
|
||||||
|
//So we need to check if the avatar already exists.
|
||||||
|
//If not, handling of NewAvatar will evetually trigger
|
||||||
|
//calling of SetParentLocalId.
|
||||||
|
if (avatar != null)
|
||||||
|
sceneObject.RootPart.SetParentLocalId(avatar.LocalId);
|
||||||
|
}
|
||||||
|
|
||||||
|
sceneObject.HasGroupChanged = true;
|
||||||
|
sceneObject.ScheduleGroupForFullUpdate(null);
|
||||||
|
|
||||||
|
if (OnObjectCreateBySync != null)
|
||||||
|
OnObjectCreateBySync(sceneObject);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion //DSG SYNC
|
#endregion //DSG SYNC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2593,14 +2593,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// Update prim flags for this group.
|
/// Update prim flags for this group.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="localID"></param>
|
/// <param name="localID"></param>
|
||||||
/// <param name="type"></param>
|
/// <param name="UsePhysics"></param>
|
||||||
/// <param name="inUse"></param>
|
/// <param name="SetTemporary"></param>
|
||||||
/// <param name="data"></param>
|
/// <param name="SetPhantom"></param>
|
||||||
public void UpdatePrimFlags(uint localID, bool UsePhysics, bool IsTemporary, bool IsPhantom, bool IsVolumeDetect)
|
/// <param name="SetVolumeDetect"></param>
|
||||||
|
public void UpdatePrimFlags(uint localID, bool UsePhysics, bool SetTemporary, bool SetPhantom, bool SetVolumeDetect)
|
||||||
{
|
{
|
||||||
SceneObjectPart selectionPart = GetChildPart(localID);
|
SceneObjectPart selectionPart = GetChildPart(localID);
|
||||||
|
|
||||||
if (IsTemporary)
|
if (SetTemporary)
|
||||||
{
|
{
|
||||||
DetachFromBackup();
|
DetachFromBackup();
|
||||||
// Remove from database and parcel prim count
|
// Remove from database and parcel prim count
|
||||||
|
@ -2625,7 +2626,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < parts.Length; i++)
|
for (int i = 0; i < parts.Length; i++)
|
||||||
parts[i].UpdatePrimFlags(UsePhysics, IsTemporary, IsPhantom, IsVolumeDetect);
|
parts[i].UpdatePrimFlags(UsePhysics, SetTemporary, SetPhantom, SetVolumeDetect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3404,33 +3405,35 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
return retmass;
|
return retmass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If the object is a sculpt/mesh, retrieve the mesh data for each part and reinsert it into each shape so that
|
||||||
|
/// the physics engine can use it.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// When the physics engine has finished with it, the sculpt data is discarded to save memory.
|
||||||
|
/// </remarks>
|
||||||
public void CheckSculptAndLoad()
|
public void CheckSculptAndLoad()
|
||||||
{
|
{
|
||||||
if (IsDeleted)
|
if (IsDeleted)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((RootPart.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) != 0)
|
if ((RootPart.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// m_log.Debug("Processing CheckSculptAndLoad for {0} {1}", Name, LocalId);
|
||||||
|
|
||||||
SceneObjectPart[] parts = m_parts.GetArray();
|
SceneObjectPart[] parts = m_parts.GetArray();
|
||||||
|
|
||||||
for (int i = 0; i < parts.Length; i++)
|
for (int i = 0; i < parts.Length; i++)
|
||||||
{
|
parts[i].CheckSculptAndLoad();
|
||||||
SceneObjectPart part = parts[i];
|
|
||||||
if (part.Shape.SculptEntry && part.Shape.SculptTexture != UUID.Zero)
|
|
||||||
{
|
|
||||||
// check if a previously decoded sculpt map has been cached
|
|
||||||
if (File.Exists(System.IO.Path.Combine("j2kDecodeCache", "smap_" + part.Shape.SculptTexture.ToString())))
|
|
||||||
{
|
|
||||||
part.SculptTextureCallback(part.Shape.SculptTexture, null);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
m_scene.AssetService.Get(
|
|
||||||
part.Shape.SculptTexture.ToString(), part, AssetReceived);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handle an asset received asynchronously from the asset service.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="id"></param>
|
||||||
|
/// <param name="sender"></param>
|
||||||
|
/// <param name="asset"></param>
|
||||||
protected void AssetReceived(string id, Object sender, AssetBase asset)
|
protected void AssetReceived(string id, Object sender, AssetBase asset)
|
||||||
{
|
{
|
||||||
SceneObjectPart sop = (SceneObjectPart)sender;
|
SceneObjectPart sop = (SceneObjectPart)sender;
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Security.Permissions;
|
using System.Security.Permissions;
|
||||||
|
@ -851,7 +852,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
actor.Orientation = GetWorldRotation();
|
actor.Orientation = GetWorldRotation();
|
||||||
|
|
||||||
// Tell the physics engines that this prim changed.
|
// Tell the physics engines that this prim changed.
|
||||||
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
|
if (m_parentGroup.Scene != null)
|
||||||
|
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1118,7 +1120,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public bool CreateSelected
|
public bool CreateSelected
|
||||||
{
|
{
|
||||||
get { return m_createSelected; }
|
get { return m_createSelected; }
|
||||||
|
@ -1136,11 +1137,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public Vector3 AbsolutePosition
|
public Vector3 AbsolutePosition
|
||||||
{
|
{
|
||||||
get {
|
get
|
||||||
|
{
|
||||||
if (IsAttachment)
|
if (IsAttachment)
|
||||||
return GroupPosition;
|
return GroupPosition;
|
||||||
|
|
||||||
return m_offsetPosition + m_groupPosition; }
|
return m_offsetPosition + m_groupPosition;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SceneObjectGroup ParentGroup
|
public SceneObjectGroup ParentGroup
|
||||||
|
@ -1289,7 +1292,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Property flags. See OpenMetaverse.PrimFlags
|
/// Property flags. See OpenMetaverse.PrimFlags
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
/// Example properties are PrimFlags.Phantom and PrimFlags.DieAtEdge
|
/// Example properties are PrimFlags.Phantom and PrimFlags.DieAtEdge
|
||||||
|
/// </remarks>
|
||||||
public PrimFlags Flags
|
public PrimFlags Flags
|
||||||
{
|
{
|
||||||
get { return _flags; }
|
get { return _flags; }
|
||||||
|
@ -1612,6 +1617,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="m_physicalPrim"></param>
|
/// <param name="m_physicalPrim"></param>
|
||||||
public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive, bool m_physicalPrim)
|
public void ApplyPhysics(uint rootObjectFlags, bool VolumeDetectActive, bool m_physicalPrim)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[SCENE OBJECT PART]: Applying physics to {0} {1} {2}", Name, LocalId, UUID);
|
||||||
|
|
||||||
bool isPhysical = (((rootObjectFlags & (uint) PrimFlags.Physics) != 0) && m_physicalPrim);
|
bool isPhysical = (((rootObjectFlags & (uint) PrimFlags.Physics) != 0) && m_physicalPrim);
|
||||||
bool isPhantom = ((rootObjectFlags & (uint) PrimFlags.Phantom) != 0);
|
bool isPhantom = ((rootObjectFlags & (uint) PrimFlags.Phantom) != 0);
|
||||||
|
|
||||||
|
@ -1632,6 +1639,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// or flexible
|
// or flexible
|
||||||
if (!isPhantom && !IsAttachment && !(Shape.PathCurve == (byte) Extrusion.Flexible))
|
if (!isPhantom && !IsAttachment && !(Shape.PathCurve == (byte) Extrusion.Flexible))
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[SCENE OBJECT PART]: Creating PhysActor for {0} {1} {2}", Name, LocalId, UUID);
|
||||||
|
|
||||||
PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape(
|
PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape(
|
||||||
LocalId,
|
LocalId,
|
||||||
string.Format("{0}/{1}", Name, UUID),
|
string.Format("{0}/{1}", Name, UUID),
|
||||||
|
@ -1854,7 +1863,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
ParentGroup.Scene.jointErrorMessage(joint, "warning: tracked body name not found! joint location will not be updated properly. joint: " + Name);
|
ParentGroup.Scene.jointErrorMessage(joint, "warning: tracked body name not found! joint location will not be updated properly. joint: " + Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1916,7 +1924,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
PhysActor.IsPhysical = UsePhysics;
|
PhysActor.IsPhysical = UsePhysics;
|
||||||
|
|
||||||
|
|
||||||
// If we're not what we're supposed to be in the physics scene, recreate ourselves.
|
// If we're not what we're supposed to be in the physics scene, recreate ourselves.
|
||||||
//m_parentGroup.Scene.PhysicsScene.RemovePrim(PhysActor);
|
//m_parentGroup.Scene.PhysicsScene.RemovePrim(PhysActor);
|
||||||
/// that's not wholesome. Had to make Scene public
|
/// that's not wholesome. Had to make Scene public
|
||||||
|
@ -1940,7 +1947,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
|
|
||||||
|
// If this part is a sculpt then delay the physics update until we've asynchronously loaded the
|
||||||
|
// mesh data.
|
||||||
|
if (((OpenMetaverse.SculptType)Shape.SculptType) == SculptType.Mesh)
|
||||||
|
CheckSculptAndLoad();
|
||||||
|
else
|
||||||
|
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2895,6 +2908,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
StoreUndoState();
|
StoreUndoState();
|
||||||
m_shape.Scale = scale;
|
m_shape.Scale = scale;
|
||||||
|
|
||||||
|
// If we're a mesh/sculpt, then we need to tell the physics engine about our new size. To do this, we
|
||||||
|
// need to reinsert the sculpt data into the shape, since the physics engine deletes it when done to
|
||||||
|
// save memory
|
||||||
|
if (PhysActor != null)
|
||||||
|
CheckSculptAndLoad();
|
||||||
|
|
||||||
ParentGroup.HasGroupChanged = true;
|
ParentGroup.HasGroupChanged = true;
|
||||||
//ScheduleFullUpdate();
|
//ScheduleFullUpdate();
|
||||||
ScheduleFullUpdate(new List<SceneObjectPartSyncProperties>(){SceneObjectPartSyncProperties.Scale});
|
ScheduleFullUpdate(new List<SceneObjectPartSyncProperties>(){SceneObjectPartSyncProperties.Scale});
|
||||||
|
@ -3029,7 +3048,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void SculptTextureCallback(UUID textureID, AssetBase texture)
|
public void SculptTextureCallback(UUID textureID, AssetBase texture)
|
||||||
{
|
{
|
||||||
if (m_shape.SculptEntry)
|
if (m_shape.SculptEntry)
|
||||||
|
@ -3038,14 +3056,17 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
//if (texture != null)
|
//if (texture != null)
|
||||||
{
|
{
|
||||||
if (texture != null)
|
if (texture != null)
|
||||||
|
{
|
||||||
|
// m_log.DebugFormat(
|
||||||
|
// "[SCENE OBJECT PART]: Setting sculpt data for {0} on SculptTextureCallback()", Name);
|
||||||
|
|
||||||
m_shape.SculptData = texture.Data;
|
m_shape.SculptData = texture.Data;
|
||||||
|
}
|
||||||
|
|
||||||
if (PhysActor != null)
|
if (PhysActor != null)
|
||||||
{
|
{
|
||||||
// Tricks physics engine into thinking we've changed the part shape.
|
// Update the physics actor with the new loaded sculpt data and set the taint signal.
|
||||||
PrimitiveBaseShape m_newshape = m_shape.Copy();
|
PhysActor.Shape = m_shape;
|
||||||
PhysActor.Shape = m_newshape;
|
|
||||||
m_shape = m_newshape;
|
|
||||||
|
|
||||||
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
|
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
|
||||||
}
|
}
|
||||||
|
@ -3352,11 +3373,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
m_parentGroup.SetAxisRotation(axis, rotate);
|
m_parentGroup.SetAxisRotation(axis, rotate);
|
||||||
}
|
}
|
||||||
|
|
||||||
//Cannot use ScriptBaseClass constants as no referance to it currently.
|
//Cannot use ScriptBaseClass constants as no referance to it currently.
|
||||||
if (axis == 2)//STATUS_ROTATE_X
|
if (axis == 2)//STATUS_ROTATE_X
|
||||||
STATUS_ROTATE_X = rotate;
|
STATUS_ROTATE_X = rotate;
|
||||||
|
|
||||||
if (axis == 4)//STATUS_ROTATE_Y
|
if (axis == 4)//STATUS_ROTATE_Y
|
||||||
STATUS_ROTATE_Y = rotate;
|
STATUS_ROTATE_Y = rotate;
|
||||||
|
|
||||||
if (axis == 8)//STATUS_ROTATE_Z
|
if (axis == 8)//STATUS_ROTATE_Z
|
||||||
STATUS_ROTATE_Z = rotate;
|
STATUS_ROTATE_Z = rotate;
|
||||||
}
|
}
|
||||||
|
@ -4414,14 +4438,21 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdatePrimFlags(bool UsePhysics, bool IsTemporary, bool IsPhantom, bool IsVD)
|
/// <summary>
|
||||||
|
/// Update the flags on this prim. This covers properties such as phantom, physics and temporary.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="UsePhysics"></param>
|
||||||
|
/// <param name="SetTemporary"></param>
|
||||||
|
/// <param name="SetPhantom"></param>
|
||||||
|
/// <param name="SetVD"></param>
|
||||||
|
public void UpdatePrimFlags(bool UsePhysics, bool SetTemporary, bool SetPhantom, bool SetVD)
|
||||||
{
|
{
|
||||||
bool wasUsingPhysics = ((Flags & PrimFlags.Physics) != 0);
|
bool wasUsingPhysics = ((Flags & PrimFlags.Physics) != 0);
|
||||||
bool wasTemporary = ((Flags & PrimFlags.TemporaryOnRez) != 0);
|
bool wasTemporary = ((Flags & PrimFlags.TemporaryOnRez) != 0);
|
||||||
bool wasPhantom = ((Flags & PrimFlags.Phantom) != 0);
|
bool wasPhantom = ((Flags & PrimFlags.Phantom) != 0);
|
||||||
bool wasVD = VolumeDetectActive;
|
bool wasVD = VolumeDetectActive;
|
||||||
|
|
||||||
if ((UsePhysics == wasUsingPhysics) && (wasTemporary == IsTemporary) && (wasPhantom == IsPhantom) && (IsVD==wasVD))
|
if ((UsePhysics == wasUsingPhysics) && (wasTemporary == SetTemporary) && (wasPhantom == SetPhantom) && (SetVD == wasVD))
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("UpdatePrimFlags called on {0}, nothing changed", Name);
|
//m_log.DebugFormat("UpdatePrimFlags called on {0}, nothing changed", Name);
|
||||||
return;
|
return;
|
||||||
|
@ -4435,32 +4466,31 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// that...
|
// that...
|
||||||
// ... if VD is changed, all others are not.
|
// ... if VD is changed, all others are not.
|
||||||
// ... if one of the others is changed, VD is not.
|
// ... if one of the others is changed, VD is not.
|
||||||
if (IsVD) // VD is active, special logic applies
|
if (SetVD) // VD is active, special logic applies
|
||||||
{
|
{
|
||||||
// State machine logic for VolumeDetect
|
// State machine logic for VolumeDetect
|
||||||
// More logic below
|
// More logic below
|
||||||
bool phanReset = (IsPhantom != wasPhantom) && !IsPhantom;
|
bool phanReset = (SetPhantom != wasPhantom) && !SetPhantom;
|
||||||
|
|
||||||
if (phanReset) // Phantom changes from on to off switch VD off too
|
if (phanReset) // Phantom changes from on to off switch VD off too
|
||||||
{
|
{
|
||||||
IsVD = false; // Switch it of for the course of this routine
|
SetVD = false; // Switch it of for the course of this routine
|
||||||
VolumeDetectActive = false; // and also permanently
|
VolumeDetectActive = false; // and also permanently
|
||||||
if (PhysActor != null)
|
if (PhysActor != null)
|
||||||
PhysActor.SetVolumeDetect(0); // Let physics know about it too
|
PhysActor.SetVolumeDetect(0); // Let physics know about it too
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
IsPhantom = false;
|
|
||||||
// If volumedetect is active we don't want phantom to be applied.
|
// If volumedetect is active we don't want phantom to be applied.
|
||||||
// If this is a new call to VD out of the state "phantom"
|
// If this is a new call to VD out of the state "phantom"
|
||||||
// this will also cause the prim to be visible to physics
|
// this will also cause the prim to be visible to physics
|
||||||
|
SetPhantom = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UsePhysics && IsJoint())
|
if (UsePhysics && IsJoint())
|
||||||
{
|
{
|
||||||
IsPhantom = true;
|
SetPhantom = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UsePhysics)
|
if (UsePhysics)
|
||||||
|
@ -4490,8 +4520,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (SetPhantom || IsAttachment || (Shape.PathCurve == (byte)Extrusion.Flexible)) // note: this may have been changed above in the case of joints
|
||||||
if (IsPhantom || IsAttachment || (Shape.PathCurve == (byte)Extrusion.Flexible)) // note: this may have been changed above in the case of joints
|
|
||||||
{
|
{
|
||||||
AddFlag(PrimFlags.Phantom);
|
AddFlag(PrimFlags.Phantom);
|
||||||
if (PhysActor != null)
|
if (PhysActor != null)
|
||||||
|
@ -4506,6 +4535,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
RemFlag(PrimFlags.Phantom);
|
RemFlag(PrimFlags.Phantom);
|
||||||
|
|
||||||
PhysicsActor pa = PhysActor;
|
PhysicsActor pa = PhysActor;
|
||||||
|
|
||||||
if (pa == null)
|
if (pa == null)
|
||||||
{
|
{
|
||||||
// It's not phantom anymore. So make sure the physics engine get's knowledge of it
|
// It's not phantom anymore. So make sure the physics engine get's knowledge of it
|
||||||
|
@ -4524,6 +4554,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
pa.UUID = this.UUID;
|
pa.UUID = this.UUID;
|
||||||
DoPhysicsPropertyUpdate(UsePhysics, true);
|
DoPhysicsPropertyUpdate(UsePhysics, true);
|
||||||
|
|
||||||
if (m_parentGroup != null)
|
if (m_parentGroup != null)
|
||||||
{
|
{
|
||||||
if (!m_parentGroup.IsDeleted)
|
if (!m_parentGroup.IsDeleted)
|
||||||
|
@ -4534,6 +4565,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
((AggregateScriptEvents & scriptEvents.collision) != 0) ||
|
((AggregateScriptEvents & scriptEvents.collision) != 0) ||
|
||||||
((AggregateScriptEvents & scriptEvents.collision_end) != 0) ||
|
((AggregateScriptEvents & scriptEvents.collision_end) != 0) ||
|
||||||
|
@ -4544,8 +4576,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
(CollisionSound != UUID.Zero)
|
(CollisionSound != UUID.Zero)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PhysActor.OnCollisionUpdate += PhysicsCollision;
|
PhysActor.OnCollisionUpdate += PhysicsCollision;
|
||||||
PhysActor.SubscribeEvents(1000);
|
PhysActor.SubscribeEvents(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4567,7 +4599,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsVD)
|
if (SetVD)
|
||||||
{
|
{
|
||||||
// If the above logic worked (this is urgent candidate to unit tests!)
|
// If the above logic worked (this is urgent candidate to unit tests!)
|
||||||
// we now have a physicsactor.
|
// we now have a physicsactor.
|
||||||
|
@ -4582,18 +4614,19 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like
|
{
|
||||||
|
// Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like
|
||||||
// (mumbles, well, at least if you have infinte CPU powers :-))
|
// (mumbles, well, at least if you have infinte CPU powers :-))
|
||||||
PhysicsActor pa = this.PhysActor;
|
PhysicsActor pa = this.PhysActor;
|
||||||
if (pa != null)
|
if (pa != null)
|
||||||
{
|
{
|
||||||
PhysActor.SetVolumeDetect(0);
|
PhysActor.SetVolumeDetect(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.VolumeDetectActive = false;
|
this.VolumeDetectActive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (SetTemporary)
|
||||||
if (IsTemporary)
|
|
||||||
{
|
{
|
||||||
AddFlag(PrimFlags.TemporaryOnRez);
|
AddFlag(PrimFlags.TemporaryOnRez);
|
||||||
}
|
}
|
||||||
|
@ -4646,6 +4679,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_shape.PathTaperY = shapeBlock.PathTaperY;
|
m_shape.PathTaperY = shapeBlock.PathTaperY;
|
||||||
m_shape.PathTwist = shapeBlock.PathTwist;
|
m_shape.PathTwist = shapeBlock.PathTwist;
|
||||||
m_shape.PathTwistBegin = shapeBlock.PathTwistBegin;
|
m_shape.PathTwistBegin = shapeBlock.PathTwistBegin;
|
||||||
|
|
||||||
if (PhysActor != null)
|
if (PhysActor != null)
|
||||||
{
|
{
|
||||||
PhysActor.Shape = m_shape;
|
PhysActor.Shape = m_shape;
|
||||||
|
@ -4671,12 +4705,45 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
ScheduleFullUpdate(new List<SceneObjectPartSyncProperties>() {SceneObjectPartSyncProperties.Shape});
|
ScheduleFullUpdate(new List<SceneObjectPartSyncProperties>() {SceneObjectPartSyncProperties.Shape});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// If the part is a sculpt/mesh, retrieve the mesh data and reinsert it into the shape so that the physics
|
||||||
|
/// engine can use it.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// When the physics engine has finished with it, the sculpt data is discarded to save memory.
|
||||||
|
/// </remarks>
|
||||||
|
public void CheckSculptAndLoad()
|
||||||
|
{
|
||||||
|
// m_log.Debug("Processing CheckSculptAndLoad for {0} {1}", Name, LocalId);
|
||||||
|
|
||||||
|
if (ParentGroup.IsDeleted)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if ((ParentGroup.RootPart.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) != 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Shape.SculptEntry && Shape.SculptTexture != UUID.Zero)
|
||||||
|
{
|
||||||
|
// check if a previously decoded sculpt map has been cached
|
||||||
|
if (File.Exists(System.IO.Path.Combine("j2kDecodeCache", "smap_" + Shape.SculptTexture.ToString())))
|
||||||
|
{
|
||||||
|
SculptTextureCallback(Shape.SculptTexture, null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ParentGroup.Scene.AssetService.Get(Shape.SculptTexture.ToString(), this, AssetReceived);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update the textures on the part.
|
/// Update the textures on the part.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
/// Added to handle bug in libsecondlife's TextureEntry.ToBytes()
|
/// Added to handle bug in libsecondlife's TextureEntry.ToBytes()
|
||||||
/// not handling RGBA properly. Cycles through, and "fixes" the color
|
/// not handling RGBA properly. Cycles through, and "fixes" the color
|
||||||
/// info
|
/// info
|
||||||
|
/// </remarks>
|
||||||
/// <param name="tex"></param>
|
/// <param name="tex"></param>
|
||||||
public void UpdateTexture(Primitive.TextureEntry tex)
|
public void UpdateTexture(Primitive.TextureEntry tex)
|
||||||
{
|
{
|
||||||
|
@ -4912,6 +4979,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
Inventory.ApplyNextOwnerPermissions();
|
Inventory.ApplyNextOwnerPermissions();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateLookAt()
|
public void UpdateLookAt()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|
|
@ -2029,10 +2029,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
|
m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
|
SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
public void SitRayCastAvatarPosition(SceneObjectPart part)
|
public void SitRayCastAvatarPosition(SceneObjectPart part)
|
||||||
{
|
{
|
||||||
|
@ -2465,7 +2464,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="remoteClient"></param>
|
/// <param name="remoteClient"></param>
|
||||||
public void SendTerseUpdateToClient(IClientAPI remoteClient)
|
public void SendTerseUpdateToClient(IClientAPI remoteClient)
|
||||||
{
|
{
|
||||||
|
|
||||||
// If the client is inactive, it's getting its updates from another
|
// If the client is inactive, it's getting its updates from another
|
||||||
// server.
|
// server.
|
||||||
if (remoteClient.IsActive)
|
if (remoteClient.IsActive)
|
||||||
|
@ -2591,7 +2589,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we aren't using a cached appearance, then clear out the baked textures
|
// If we aren't using a cached appearance, then clear out the baked textures
|
||||||
if (! cachedappearance)
|
if (!cachedappearance)
|
||||||
{
|
{
|
||||||
m_appearance.ResetAppearance();
|
m_appearance.ResetAppearance();
|
||||||
if (m_scene.AvatarFactory != null)
|
if (m_scene.AvatarFactory != null)
|
||||||
|
|
|
@ -1006,6 +1006,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
|
|
||||||
private static void ProcessShpSculptData(PrimitiveBaseShape shp, XmlTextReader reader)
|
private static void ProcessShpSculptData(PrimitiveBaseShape shp, XmlTextReader reader)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[SCENE OBJECT SERIALIZER]: Setting sculpt data length {0}", shp.SculptData.Length);
|
||||||
|
|
||||||
shp.SculptData = Convert.FromBase64String(reader.ReadElementString("SculptData"));
|
shp.SculptData = Convert.FromBase64String(reader.ReadElementString("SculptData"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||||
region1 = scene.RegionInfo.RegionHandle;
|
region1 = scene.RegionInfo.RegionHandle;
|
||||||
region2 = scene2.RegionInfo.RegionHandle;
|
region2 = scene2.RegionInfo.RegionHandle;
|
||||||
|
|
||||||
SceneSetupHelpers.AddRootAgent(scene, agent1);
|
SceneSetupHelpers.AddClient(scene, agent1);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
|
|
@ -139,7 +139,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||||
|
|
||||||
SceneObjectPart part = SceneSetupHelpers.AddSceneObject(scene);
|
SceneObjectPart part = SceneSetupHelpers.AddSceneObject(scene);
|
||||||
|
|
||||||
IClientAPI client = SceneSetupHelpers.AddRootAgent(scene, agentId);
|
IClientAPI client = SceneSetupHelpers.AddClient(scene, agentId);
|
||||||
scene.DeRezObjects(client, new System.Collections.Generic.List<uint>() { part.LocalId }, UUID.Zero, DeRezAction.Delete, UUID.Zero);
|
scene.DeRezObjects(client, new System.Collections.Generic.List<uint>() { part.LocalId }, UUID.Zero, DeRezAction.Delete, UUID.Zero);
|
||||||
|
|
||||||
SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId);
|
SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId);
|
||||||
|
|
|
@ -66,7 +66,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||||
IConfig config = configSource.AddConfig("Startup");
|
IConfig config = configSource.AddConfig("Startup");
|
||||||
config.Set("serverside_object_permissions", true);
|
config.Set("serverside_object_permissions", true);
|
||||||
SceneSetupHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() });
|
SceneSetupHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() });
|
||||||
TestClient client = SceneSetupHelpers.AddRootAgent(scene, userId);
|
TestClient client = SceneSetupHelpers.AddClient(scene, userId);
|
||||||
|
|
||||||
// Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
|
// Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
|
||||||
AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
|
AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
|
||||||
|
@ -105,7 +105,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||||
IConfig config = configSource.AddConfig("Startup");
|
IConfig config = configSource.AddConfig("Startup");
|
||||||
config.Set("serverside_object_permissions", true);
|
config.Set("serverside_object_permissions", true);
|
||||||
SceneSetupHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() });
|
SceneSetupHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() });
|
||||||
TestClient client = SceneSetupHelpers.AddRootAgent(scene, userId);
|
TestClient client = SceneSetupHelpers.AddClient(scene, userId);
|
||||||
|
|
||||||
// Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
|
// Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
|
||||||
AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
|
AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
|
||||||
|
|
|
@ -75,7 +75,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||||
new GroupsModule(),
|
new GroupsModule(),
|
||||||
new MockGroupsServicesConnector() });
|
new MockGroupsServicesConnector() });
|
||||||
|
|
||||||
TestClient client = SceneSetupHelpers.AddRootAgent(scene, userId);
|
TestClient client = SceneSetupHelpers.AddClient(scene, userId);
|
||||||
|
|
||||||
IGroupsModule groupsModule = scene.RequestModuleInterface<IGroupsModule>();
|
IGroupsModule groupsModule = scene.RequestModuleInterface<IGroupsModule>();
|
||||||
|
|
||||||
|
|
|
@ -212,7 +212,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||||
|
|
||||||
SceneSetupHelpers.SetupSceneModules(myScene1, configSource, etm);
|
SceneSetupHelpers.SetupSceneModules(myScene1, configSource, etm);
|
||||||
|
|
||||||
SceneSetupHelpers.AddRootAgent(myScene1, agent1Id);
|
SceneSetupHelpers.AddClient(myScene1, agent1Id);
|
||||||
ScenePresence childPresence = myScene2.GetScenePresence(agent1);
|
ScenePresence childPresence = myScene2.GetScenePresence(agent1);
|
||||||
|
|
||||||
// TODO: Need to do a fair amount of work to allow synchronous establishment of child agents
|
// TODO: Need to do a fair amount of work to allow synchronous establishment of child agents
|
||||||
|
|
|
@ -125,7 +125,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
|
||||||
sceneA.RegisterRegionWithGrid();
|
sceneA.RegisterRegionWithGrid();
|
||||||
|
|
||||||
UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000041");
|
UUID agentId = UUID.Parse("00000000-0000-0000-0000-000000000041");
|
||||||
TestClient client = SceneSetupHelpers.AddRootAgent(sceneA, agentId);
|
TestClient client = SceneSetupHelpers.AddClient(sceneA, agentId);
|
||||||
|
|
||||||
ICapabilitiesModule sceneACapsModule = sceneA.RequestModuleInterface<ICapabilitiesModule>();
|
ICapabilitiesModule sceneACapsModule = sceneA.RequestModuleInterface<ICapabilitiesModule>();
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Appearance
|
||||||
{
|
{
|
||||||
bool bakedTextureValid = scene.AvatarFactory.ValidateBakedTextureCache(client);
|
bool bakedTextureValid = scene.AvatarFactory.ValidateBakedTextureCache(client);
|
||||||
MainConsole.Instance.OutputFormat(
|
MainConsole.Instance.OutputFormat(
|
||||||
"{0} baked apperance texture is {1}", client.Name, bakedTextureValid ? "OK" : "corrupt");
|
"{0} baked appearance texture is {1}", client.Name, bakedTextureValid ? "OK" : "corrupt");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -417,9 +417,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
|
||||||
public string ParcelVoiceInfoRequest(Scene scene, string request, string path, string param,
|
public string ParcelVoiceInfoRequest(Scene scene, string request, string path, string param,
|
||||||
UUID agentID, Caps caps)
|
UUID agentID, Caps caps)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat(
|
m_log.DebugFormat(
|
||||||
// "[FreeSwitchVoice][PARCELVOICE]: ParcelVoiceInfoRequest() on {0} for {1}",
|
"[FreeSwitchVoice][PARCELVOICE]: ParcelVoiceInfoRequest() on {0} for {1}",
|
||||||
// scene.RegionInfo.RegionName, agentID);
|
scene.RegionInfo.RegionName, agentID);
|
||||||
|
|
||||||
ScenePresence avatar = scene.GetScenePresence(agentID);
|
ScenePresence avatar = scene.GetScenePresence(agentID);
|
||||||
string avatarName = avatar.Name;
|
string avatarName = avatar.Name;
|
||||||
|
|
|
@ -70,7 +70,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
// if groups aren't enabled, we're not needed.
|
// if groups aren't enabled, we're not needed.
|
||||||
// if we're not specified as the connector to use, then we're not wanted
|
// if we're not specified as the connector to use, then we're not wanted
|
||||||
if ((groupsConfig.GetBoolean("Enabled", false) == false)
|
if ((groupsConfig.GetBoolean("Enabled", false) == false)
|
||||||
|| (groupsConfig.GetString("MessagingModule", "Default") != Name))
|
|| (groupsConfig.GetString("MessagingModule", "GroupsMessagingModule") != Name))
|
||||||
{
|
{
|
||||||
m_groupMessagingEnabled = false;
|
m_groupMessagingEnabled = false;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -200,7 +200,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
// if groups aren't enabled, we're not needed.
|
// if groups aren't enabled, we're not needed.
|
||||||
// if we're not specified as the connector to use, then we're not wanted
|
// if we're not specified as the connector to use, then we're not wanted
|
||||||
if ((groupsConfig.GetBoolean("Enabled", false) == false)
|
if ((groupsConfig.GetBoolean("Enabled", false) == false)
|
||||||
|| (groupsConfig.GetString("ServicesConnectorModule", "Default") != Name))
|
|| (groupsConfig.GetString("ServicesConnectorModule", "XmlRpcGroupsServicesConnector") != Name))
|
||||||
{
|
{
|
||||||
m_connectorEnabled = false;
|
m_connectorEnabled = false;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -109,7 +109,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
|
||||||
// if groups aren't enabled, we're not needed.
|
// if groups aren't enabled, we're not needed.
|
||||||
// if we're not specified as the connector to use, then we're not wanted
|
// if we're not specified as the connector to use, then we're not wanted
|
||||||
if ((groupsConfig.GetBoolean("Enabled", false) == false)
|
if ((groupsConfig.GetBoolean("Enabled", false) == false)
|
||||||
|| (groupsConfig.GetString("ServicesConnectorModule", "Default") != Name))
|
|| (groupsConfig.GetString("ServicesConnectorModule", "XmlRpcGroupsServicesConnector") != Name))
|
||||||
{
|
{
|
||||||
m_connectorEnabled = false;
|
m_connectorEnabled = false;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -0,0 +1,119 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* 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.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using log4net;
|
||||||
|
using Mono.Addins;
|
||||||
|
using Nini.Config;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Console;
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.OptionalModules.Framework.Monitoring
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// An experimental module to return data on services used by the simulator.
|
||||||
|
/// </summary>
|
||||||
|
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "MonitorServicesModule")]
|
||||||
|
public class MonitorServicesModule : ISharedRegionModule
|
||||||
|
{
|
||||||
|
protected Scene m_scene;
|
||||||
|
|
||||||
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
public string Name { get { return "Services Health Monitoring Module"; } }
|
||||||
|
|
||||||
|
public Type ReplaceableInterface { get { return null; } }
|
||||||
|
|
||||||
|
public void Initialise(IConfigSource source)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PostInitialise()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddRegion(Scene scene)
|
||||||
|
{
|
||||||
|
if (m_scene == null)
|
||||||
|
{
|
||||||
|
m_scene = scene;
|
||||||
|
|
||||||
|
// m_scene.AddCommand(this, "monitor services",
|
||||||
|
// "monitor services",
|
||||||
|
// "Returns the status of services used by the simulator. Experimental.",
|
||||||
|
// HandleMonitorServices);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveRegion(Scene scene)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegionLoaded(Scene scene)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void HandleMonitorServices(string module, string[] args)
|
||||||
|
{
|
||||||
|
MainConsole.Instance.Output(GenerateServicesReport());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected string GenerateServicesReport()
|
||||||
|
{
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.Append("This is an experimental module. Please don't rely on these results\n");
|
||||||
|
sb.Append("Asset service: ");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
CheckAssetService();
|
||||||
|
sb.Append("OK");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
sb.AppendFormat("FAIL ({0})", e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void CheckAssetService()
|
||||||
|
{
|
||||||
|
// Try to fetch an asset that will not exist (and hence avoid hitting cache)
|
||||||
|
m_scene.AssetService.Get(UUID.Random().ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -801,7 +801,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule
|
||||||
// retain pathcurve
|
// retain pathcurve
|
||||||
shapeBlock.PathCurve = part.Shape.PathCurve;
|
shapeBlock.PathCurve = part.Shape.PathCurve;
|
||||||
|
|
||||||
part.Shape.SetSculptData((byte)type, sculptId);
|
part.Shape.SetSculptProperties((byte)type, sculptId);
|
||||||
part.Shape.SculptEntry = true;
|
part.Shape.SculptEntry = true;
|
||||||
part.UpdateShape(shapeBlock);
|
part.UpdateShape(shapeBlock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenMetaverse.StructuredData;
|
using OpenMetaverse.StructuredData;
|
||||||
|
using OpenSim.Services.Interfaces;
|
||||||
|
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
@ -175,6 +176,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.RegionReady
|
||||||
|
|
||||||
m_scene.EventManager.TriggerOnChatBroadcast(this, c);
|
m_scene.EventManager.TriggerOnChatBroadcast(this, c);
|
||||||
m_scene.EventManager.TriggerLoginsEnabled(m_scene.RegionInfo.RegionName);
|
m_scene.EventManager.TriggerLoginsEnabled(m_scene.RegionInfo.RegionName);
|
||||||
|
m_scene.SceneGridService.InformNeighborsThatRegionisUp(m_scene.RequestModuleInterface<INeighbourService>(), m_scene.RegionInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.XmlRpcGridRouterModule
|
||||||
info.channel = channel;
|
info.channel = channel;
|
||||||
info.uri = uri;
|
info.uri = uri;
|
||||||
|
|
||||||
bool success = SynchronousRestObjectPoster.BeginPostObject<XmlRpcInfo, bool>(
|
bool success = SynchronousRestObjectRequester.MakeRequest<XmlRpcInfo, bool>(
|
||||||
"POST", m_ServerURI+"/RegisterChannel/", info);
|
"POST", m_ServerURI+"/RegisterChannel/", info);
|
||||||
|
|
||||||
if (!success)
|
if (!success)
|
||||||
|
@ -125,7 +125,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.XmlRpcGridRouterModule
|
||||||
|
|
||||||
if (m_Channels.ContainsKey(itemID))
|
if (m_Channels.ContainsKey(itemID))
|
||||||
{
|
{
|
||||||
bool success = SynchronousRestObjectPoster.BeginPostObject<UUID, bool>(
|
bool success = SynchronousRestObjectRequester.MakeRequest<UUID, bool>(
|
||||||
"POST", m_ServerURI+"/RemoveChannel/", m_Channels[itemID]);
|
"POST", m_ServerURI+"/RemoveChannel/", m_Channels[itemID]);
|
||||||
|
|
||||||
if (!success)
|
if (!success)
|
||||||
|
|
|
@ -25,13 +25,15 @@
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using OpenMetaverse;
|
using log4net;
|
||||||
using Nini.Config;
|
using Nini.Config;
|
||||||
|
using OpenMetaverse;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.CoreModules.Avatar.NPC;
|
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using Timer=System.Timers.Timer;
|
using Timer=System.Timers.Timer;
|
||||||
using OpenSim.Services.Interfaces;
|
using OpenSim.Services.Interfaces;
|
||||||
|
@ -40,24 +42,17 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
{
|
{
|
||||||
public class NPCModule : IRegionModule, INPCModule
|
public class NPCModule : IRegionModule, INPCModule
|
||||||
{
|
{
|
||||||
// private const bool m_enabled = false;
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private Mutex m_createMutex;
|
// private const bool m_enabled = false;
|
||||||
private Timer m_timer;
|
|
||||||
|
|
||||||
private Dictionary<UUID,NPCAvatar> m_avatars = new Dictionary<UUID, NPCAvatar>();
|
private Dictionary<UUID,NPCAvatar> m_avatars = new Dictionary<UUID, NPCAvatar>();
|
||||||
private Dictionary<UUID,AvatarAppearance> m_appearanceCache = new Dictionary<UUID, AvatarAppearance>();
|
private Dictionary<UUID,AvatarAppearance> m_appearanceCache = new Dictionary<UUID, AvatarAppearance>();
|
||||||
|
|
||||||
// Timer vars.
|
public void Initialise(Scene scene, IConfigSource source)
|
||||||
private bool p_inUse = false;
|
{
|
||||||
private readonly object p_lock = new object();
|
scene.RegisterModuleInterface<INPCModule>(this);
|
||||||
// Private Temporary Variables.
|
}
|
||||||
private string p_firstname;
|
|
||||||
private string p_lastname;
|
|
||||||
private Vector3 p_position;
|
|
||||||
private Scene p_scene;
|
|
||||||
private UUID p_cloneAppearanceFrom;
|
|
||||||
private UUID p_returnUuid;
|
|
||||||
|
|
||||||
private AvatarAppearance GetAppearance(UUID target, Scene scene)
|
private AvatarAppearance GetAppearance(UUID target, Scene scene)
|
||||||
{
|
{
|
||||||
|
@ -74,31 +69,53 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
return new AvatarAppearance();
|
return new AvatarAppearance();
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID CreateNPC(string firstname, string lastname,Vector3 position, Scene scene, UUID cloneAppearanceFrom)
|
public UUID CreateNPC(string firstname, string lastname, Vector3 position, Scene scene, UUID cloneAppearanceFrom)
|
||||||
{
|
{
|
||||||
// Block.
|
NPCAvatar npcAvatar = new NPCAvatar(firstname, lastname, position, scene);
|
||||||
m_createMutex.WaitOne();
|
npcAvatar.CircuitCode = (uint)Util.RandomClass.Next(0, int.MaxValue);
|
||||||
|
|
||||||
// Copy Temp Variables for Timer to pick up.
|
m_log.DebugFormat(
|
||||||
lock (p_lock)
|
"[NPC MODULE]: Creating NPC {0} {1} {2} at {3} in {4}",
|
||||||
|
firstname, lastname, npcAvatar.AgentId, position, scene.RegionInfo.RegionName);
|
||||||
|
|
||||||
|
AgentCircuitData acd = new AgentCircuitData();
|
||||||
|
acd.AgentID = npcAvatar.AgentId;
|
||||||
|
acd.firstname = firstname;
|
||||||
|
acd.lastname = lastname;
|
||||||
|
acd.ServiceURLs = new Dictionary<string, object>();
|
||||||
|
|
||||||
|
AvatarAppearance originalAppearance = GetAppearance(cloneAppearanceFrom, scene);
|
||||||
|
AvatarAppearance npcAppearance = new AvatarAppearance(originalAppearance, true);
|
||||||
|
acd.Appearance = npcAppearance;
|
||||||
|
|
||||||
|
scene.AuthenticateHandler.AddNewCircuit(npcAvatar.CircuitCode, acd);
|
||||||
|
scene.AddNewClient(npcAvatar);
|
||||||
|
|
||||||
|
ScenePresence sp;
|
||||||
|
if (scene.TryGetScenePresence(npcAvatar.AgentId, out sp))
|
||||||
{
|
{
|
||||||
p_firstname = firstname;
|
m_log.DebugFormat(
|
||||||
p_lastname = lastname;
|
"[NPC MODULE]: Successfully retrieved scene presence for NPC {0} {1}", sp.Name, sp.UUID);
|
||||||
p_position = position;
|
|
||||||
p_scene = scene;
|
// Shouldn't call this - temporary.
|
||||||
p_cloneAppearanceFrom = cloneAppearanceFrom;
|
sp.CompleteMovement(npcAvatar);
|
||||||
p_inUse = true;
|
|
||||||
p_returnUuid = UUID.Zero;
|
// sp.SendAppearanceToAllOtherAgents();
|
||||||
|
//
|
||||||
|
// // Send animations back to the avatar as well
|
||||||
|
// sp.Animator.SendAnimPack();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.WarnFormat("[NPC MODULE]: Could not find scene presence for NPC {0} {1}", sp.Name, sp.UUID);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (p_returnUuid == UUID.Zero)
|
lock (m_avatars)
|
||||||
{
|
m_avatars.Add(npcAvatar.AgentId, npcAvatar);
|
||||||
Thread.Sleep(250);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_createMutex.ReleaseMutex();
|
m_log.DebugFormat("[NPC MODULE]: Created NPC with id {0}", npcAvatar.AgentId);
|
||||||
|
|
||||||
return p_returnUuid;
|
return npcAvatar.AgentId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Autopilot(UUID agentID, Scene scene, Vector3 pos)
|
public void Autopilot(UUID agentID, Scene scene, Vector3 pos)
|
||||||
|
@ -137,48 +154,6 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void Initialise(Scene scene, IConfigSource source)
|
|
||||||
{
|
|
||||||
m_createMutex = new Mutex(false);
|
|
||||||
|
|
||||||
m_timer = new Timer(500);
|
|
||||||
m_timer.Elapsed += m_timer_Elapsed;
|
|
||||||
m_timer.Start();
|
|
||||||
|
|
||||||
scene.RegisterModuleInterface<INPCModule>(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void m_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
|
|
||||||
{
|
|
||||||
lock (p_lock)
|
|
||||||
{
|
|
||||||
if (p_inUse)
|
|
||||||
{
|
|
||||||
p_inUse = false;
|
|
||||||
|
|
||||||
NPCAvatar npcAvatar = new NPCAvatar(p_firstname, p_lastname, p_position, p_scene);
|
|
||||||
npcAvatar.CircuitCode = (uint) Util.RandomClass.Next(0, int.MaxValue);
|
|
||||||
|
|
||||||
p_scene.AddNewClient(npcAvatar);
|
|
||||||
|
|
||||||
ScenePresence sp;
|
|
||||||
if (p_scene.TryGetScenePresence(npcAvatar.AgentId, out sp))
|
|
||||||
{
|
|
||||||
AvatarAppearance x = GetAppearance(p_cloneAppearanceFrom, p_scene);
|
|
||||||
|
|
||||||
sp.Appearance.SetTextureEntries(x.Texture);
|
|
||||||
sp.Appearance.SetVisualParams((byte[])x.VisualParams.Clone());
|
|
||||||
p_scene.AvatarFactory.QueueAppearanceSend(sp.UUID);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_avatars.Add(npcAvatar.AgentId, npcAvatar);
|
|
||||||
|
|
||||||
p_returnUuid = npcAvatar.AgentId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void PostInitialise()
|
public void PostInitialise()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* 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.Reflection;
|
||||||
|
using Nini.Config;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Communications;
|
||||||
|
using OpenSim.Region.CoreModules.ServiceConnectorsOut.Avatar;
|
||||||
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
using OpenSim.Services.AvatarService;
|
||||||
|
using OpenSim.Tests.Common;
|
||||||
|
using OpenSim.Tests.Common.Mock;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.OptionalModules.World.NPC.Tests
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public class NPCModuleTests
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void TestCreate()
|
||||||
|
{
|
||||||
|
TestHelper.InMethod();
|
||||||
|
// log4net.Config.XmlConfigurator.Configure();
|
||||||
|
|
||||||
|
IConfigSource config = new IniConfigSource();
|
||||||
|
|
||||||
|
config.AddConfig("Modules");
|
||||||
|
config.Configs["Modules"].Set("AvatarServices", "LocalAvatarServicesConnector");
|
||||||
|
config.AddConfig("AvatarService");
|
||||||
|
config.Configs["AvatarService"].Set("LocalServiceModule", "OpenSim.Services.AvatarService.dll:AvatarService");
|
||||||
|
config.Configs["AvatarService"].Set("StorageProvider", "OpenSim.Data.Null.dll");
|
||||||
|
|
||||||
|
TestScene scene = SceneSetupHelpers.SetupScene();
|
||||||
|
SceneSetupHelpers.SetupSceneModules(scene, config, new NPCModule(), new LocalAvatarServicesConnector());
|
||||||
|
|
||||||
|
INPCModule npcModule = scene.RequestModuleInterface<INPCModule>();
|
||||||
|
UUID npcId = npcModule.CreateNPC("John", "Smith", new Vector3(128, 128, 30), scene, UUID.Zero);
|
||||||
|
|
||||||
|
ScenePresence npc = scene.GetScenePresence(npcId);
|
||||||
|
Assert.That(npc, Is.Not.Null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -37,6 +37,18 @@ namespace OpenSim.Region.Physics.Manager
|
||||||
public delegate void physicsCrash();
|
public delegate void physicsCrash();
|
||||||
|
|
||||||
public delegate void RaycastCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal);
|
public delegate void RaycastCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal);
|
||||||
|
public delegate void RayCallback(List<ContactResult> list);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Contact result from a raycast.
|
||||||
|
/// </summary>
|
||||||
|
public struct ContactResult
|
||||||
|
{
|
||||||
|
public Vector3 Pos;
|
||||||
|
public float Depth;
|
||||||
|
public uint ConsumerID;
|
||||||
|
public Vector3 Normal;
|
||||||
|
}
|
||||||
|
|
||||||
public abstract class PhysicsScene
|
public abstract class PhysicsScene
|
||||||
{
|
{
|
||||||
|
@ -61,7 +73,6 @@ namespace OpenSim.Region.Physics.Manager
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public abstract void Initialise(IMesher meshmerizer, IConfigSource config);
|
public abstract void Initialise(IMesher meshmerizer, IConfigSource config);
|
||||||
|
|
||||||
public abstract PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying);
|
public abstract PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying);
|
||||||
|
@ -86,7 +97,10 @@ namespace OpenSim.Region.Physics.Manager
|
||||||
Vector3 size, Quaternion rotation, bool isPhysical)
|
Vector3 size, Quaternion rotation, bool isPhysical)
|
||||||
{
|
{
|
||||||
PhysicsActor ret = AddPrimShape(primName, pbs, position, size, rotation, isPhysical);
|
PhysicsActor ret = AddPrimShape(primName, pbs, position, size, rotation, isPhysical);
|
||||||
if (ret != null) ret.LocalID = localID;
|
|
||||||
|
if (ret != null)
|
||||||
|
ret.LocalID = localID;
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,6 +236,17 @@ namespace OpenSim.Region.Physics.Manager
|
||||||
retMethod(false, Vector3.Zero, 0, 999999999999f, Vector3.Zero);
|
retMethod(false, Vector3.Zero, 0, 999999999999f, Vector3.Zero);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void RaycastWorld(Vector3 position, Vector3 direction, float length, int Count, RayCallback retMethod)
|
||||||
|
{
|
||||||
|
if (retMethod != null)
|
||||||
|
retMethod(new List<ContactResult>());
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual List<ContactResult> RaycastWorld(Vector3 position, Vector3 direction, float length, int Count)
|
||||||
|
{
|
||||||
|
return new List<ContactResult>();
|
||||||
|
}
|
||||||
|
|
||||||
private class NullPhysicsScene : PhysicsScene
|
private class NullPhysicsScene : PhysicsScene
|
||||||
{
|
{
|
||||||
private static int m_workIndicator;
|
private static int m_workIndicator;
|
||||||
|
|
|
@ -100,7 +100,6 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[SCULPT]: Unable to create {0} directory: ", decodedSculptMapPath, e.Message);
|
m_log.WarnFormat("[SCULPT]: Unable to create {0} directory: ", decodedSculptMapPath, e.Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -156,7 +155,6 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
return box;
|
return box;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a simple bounding box mesh for a complex input mesh
|
/// Creates a simple bounding box mesh for a complex input mesh
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -193,7 +191,6 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
m_log.Error(message);
|
m_log.Error(message);
|
||||||
m_log.Error("\nPrim Name: " + primName);
|
m_log.Error("\nPrim Name: " + primName);
|
||||||
m_log.Error("****** PrimMesh Parameters ******\n" + primMesh.ParamsToDisplayString());
|
m_log.Error("****** PrimMesh Parameters ******\n" + primMesh.ParamsToDisplayString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ulong GetMeshKey(PrimitiveBaseShape pbs, Vector3 size, float lod)
|
private ulong GetMeshKey(PrimitiveBaseShape pbs, Vector3 size, float lod)
|
||||||
|
@ -257,6 +254,52 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
return ((hash << 5) + hash) + (ulong)(c >> 8);
|
return ((hash << 5) + hash) + (ulong)(c >> 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Add a submesh to an existing list of coords and faces.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="subMeshData"></param>
|
||||||
|
/// <param name="size">Size of entire object</param>
|
||||||
|
/// <param name="coords"></param>
|
||||||
|
/// <param name="faces"></param>
|
||||||
|
private void AddSubMesh(OSDMap subMeshData, Vector3 size, List<Coord> coords, List<Face> faces)
|
||||||
|
{
|
||||||
|
// Console.WriteLine("subMeshMap for {0} - {1}", primName, Util.GetFormattedXml((OSD)subMeshMap));
|
||||||
|
|
||||||
|
// As per http://wiki.secondlife.com/wiki/Mesh/Mesh_Asset_Format, some Mesh Level
|
||||||
|
// of Detail Blocks (maps) contain just a NoGeometry key to signal there is no
|
||||||
|
// geometry for this submesh.
|
||||||
|
if (subMeshData.ContainsKey("NoGeometry") && ((OSDBoolean)subMeshData["NoGeometry"]))
|
||||||
|
return;
|
||||||
|
|
||||||
|
OpenMetaverse.Vector3 posMax = ((OSDMap)subMeshData["PositionDomain"])["Max"].AsVector3();
|
||||||
|
OpenMetaverse.Vector3 posMin = ((OSDMap)subMeshData["PositionDomain"])["Min"].AsVector3();
|
||||||
|
ushort faceIndexOffset = (ushort)coords.Count;
|
||||||
|
|
||||||
|
byte[] posBytes = subMeshData["Position"].AsBinary();
|
||||||
|
for (int i = 0; i < posBytes.Length; i += 6)
|
||||||
|
{
|
||||||
|
ushort uX = Utils.BytesToUInt16(posBytes, i);
|
||||||
|
ushort uY = Utils.BytesToUInt16(posBytes, i + 2);
|
||||||
|
ushort uZ = Utils.BytesToUInt16(posBytes, i + 4);
|
||||||
|
|
||||||
|
Coord c = new Coord(
|
||||||
|
Utils.UInt16ToFloat(uX, posMin.X, posMax.X) * size.X,
|
||||||
|
Utils.UInt16ToFloat(uY, posMin.Y, posMax.Y) * size.Y,
|
||||||
|
Utils.UInt16ToFloat(uZ, posMin.Z, posMax.Z) * size.Z);
|
||||||
|
|
||||||
|
coords.Add(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] triangleBytes = subMeshData["TriangleList"].AsBinary();
|
||||||
|
for (int i = 0; i < triangleBytes.Length; i += 6)
|
||||||
|
{
|
||||||
|
ushort v1 = (ushort)(Utils.BytesToUInt16(triangleBytes, i) + faceIndexOffset);
|
||||||
|
ushort v2 = (ushort)(Utils.BytesToUInt16(triangleBytes, i + 2) + faceIndexOffset);
|
||||||
|
ushort v3 = (ushort)(Utils.BytesToUInt16(triangleBytes, i + 4) + faceIndexOffset);
|
||||||
|
Face f = new Face(v1, v2, v3);
|
||||||
|
faces.Add(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
|
private Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
|
||||||
{
|
{
|
||||||
|
@ -276,7 +319,7 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
if (!useMeshiesPhysicsMesh)
|
if (!useMeshiesPhysicsMesh)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
m_log.Debug("[MESH]: experimental mesh proxy generation");
|
m_log.DebugFormat("[MESH]: experimental mesh proxy generation for {0}", primName);
|
||||||
|
|
||||||
OSD meshOsd = null;
|
OSD meshOsd = null;
|
||||||
|
|
||||||
|
@ -291,23 +334,38 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
meshOsd = (OSDMap)OSDParser.DeserializeLLSDBinary(data);
|
OSD osd = OSDParser.DeserializeLLSDBinary(data);
|
||||||
|
if (osd is OSDMap)
|
||||||
|
meshOsd = (OSDMap)osd;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
m_log.Warn("[Mesh}: unable to cast mesh asset to OSDMap");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_log.Error("[MESH]: Exception deserializing mesh asset header:" + e.ToString());
|
m_log.Error("[MESH]: Exception deserializing mesh asset header:" + e.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
start = data.Position;
|
start = data.Position;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (meshOsd is OSDMap)
|
if (meshOsd is OSDMap)
|
||||||
{
|
{
|
||||||
|
OSDMap physicsParms = null;
|
||||||
OSDMap map = (OSDMap)meshOsd;
|
OSDMap map = (OSDMap)meshOsd;
|
||||||
OSDMap physicsParms = (OSDMap)map["physics_shape"]; // old asset format
|
if (map.ContainsKey("physics_shape"))
|
||||||
|
physicsParms = (OSDMap)map["physics_shape"]; // old asset format
|
||||||
if (physicsParms.Count == 0)
|
else if (map.ContainsKey("physics_mesh"))
|
||||||
physicsParms = (OSDMap)map["physics_mesh"]; // new asset format
|
physicsParms = (OSDMap)map["physics_mesh"]; // new asset format
|
||||||
|
|
||||||
|
if (physicsParms == null)
|
||||||
|
{
|
||||||
|
m_log.Warn("[MESH]: no recognized physics mesh found in mesh asset");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
int physOffset = physicsParms["offset"].AsInteger() + (int)start;
|
int physOffset = physicsParms["offset"].AsInteger() + (int)start;
|
||||||
int physSize = physicsParms["size"].AsInteger();
|
int physSize = physicsParms["size"].AsInteger();
|
||||||
|
|
||||||
|
@ -353,42 +411,13 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
// physics_shape is an array of OSDMaps, one for each submesh
|
// physics_shape is an array of OSDMaps, one for each submesh
|
||||||
if (decodedMeshOsd is OSDArray)
|
if (decodedMeshOsd is OSDArray)
|
||||||
{
|
{
|
||||||
|
// Console.WriteLine("decodedMeshOsd for {0} - {1}", primName, Util.GetFormattedXml(decodedMeshOsd));
|
||||||
|
|
||||||
decodedMeshOsdArray = (OSDArray)decodedMeshOsd;
|
decodedMeshOsdArray = (OSDArray)decodedMeshOsd;
|
||||||
foreach (OSD subMeshOsd in decodedMeshOsdArray)
|
foreach (OSD subMeshOsd in decodedMeshOsdArray)
|
||||||
{
|
{
|
||||||
if (subMeshOsd is OSDMap)
|
if (subMeshOsd is OSDMap)
|
||||||
{
|
AddSubMesh(subMeshOsd as OSDMap, size, coords, faces);
|
||||||
OSDMap subMeshMap = (OSDMap)subMeshOsd;
|
|
||||||
|
|
||||||
OpenMetaverse.Vector3 posMax = ((OSDMap)subMeshMap["PositionDomain"])["Max"].AsVector3();
|
|
||||||
OpenMetaverse.Vector3 posMin = ((OSDMap)subMeshMap["PositionDomain"])["Min"].AsVector3();
|
|
||||||
ushort faceIndexOffset = (ushort)coords.Count;
|
|
||||||
|
|
||||||
byte[] posBytes = subMeshMap["Position"].AsBinary();
|
|
||||||
for (int i = 0; i < posBytes.Length; i += 6)
|
|
||||||
{
|
|
||||||
ushort uX = Utils.BytesToUInt16(posBytes, i);
|
|
||||||
ushort uY = Utils.BytesToUInt16(posBytes, i + 2);
|
|
||||||
ushort uZ = Utils.BytesToUInt16(posBytes, i + 4);
|
|
||||||
|
|
||||||
Coord c = new Coord(
|
|
||||||
Utils.UInt16ToFloat(uX, posMin.X, posMax.X) * size.X,
|
|
||||||
Utils.UInt16ToFloat(uY, posMin.Y, posMax.Y) * size.Y,
|
|
||||||
Utils.UInt16ToFloat(uZ, posMin.Z, posMax.Z) * size.Z);
|
|
||||||
|
|
||||||
coords.Add(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
byte[] triangleBytes = subMeshMap["TriangleList"].AsBinary();
|
|
||||||
for (int i = 0; i < triangleBytes.Length; i += 6)
|
|
||||||
{
|
|
||||||
ushort v1 = (ushort)(Utils.BytesToUInt16(triangleBytes, i) + faceIndexOffset);
|
|
||||||
ushort v2 = (ushort)(Utils.BytesToUInt16(triangleBytes, i + 2) + faceIndexOffset);
|
|
||||||
ushort v3 = (ushort)(Utils.BytesToUInt16(triangleBytes, i + 4) + faceIndexOffset);
|
|
||||||
Face f = new Face(v1, v2, v3);
|
|
||||||
faces.Add(f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -511,7 +540,6 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
|
|
||||||
profileBegin = 0.5f * profileBegin + 0.5f;
|
profileBegin = 0.5f * profileBegin + 0.5f;
|
||||||
profileEnd = 0.5f * profileEnd + 0.5f;
|
profileEnd = 0.5f * profileEnd + 0.5f;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int hollowSides = sides;
|
int hollowSides = sides;
|
||||||
|
@ -620,6 +648,7 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
Face f = faces[i];
|
Face f = faces[i];
|
||||||
mesh.Add(new Triangle(vertices[f.v1], vertices[f.v2], vertices[f.v3]));
|
mesh.Add(new Triangle(vertices[f.v1], vertices[f.v2], vertices[f.v3]));
|
||||||
}
|
}
|
||||||
|
|
||||||
return mesh;
|
return mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -630,6 +659,10 @@ namespace OpenSim.Region.Physics.Meshing
|
||||||
|
|
||||||
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical)
|
public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical)
|
||||||
{
|
{
|
||||||
|
#if SPAM
|
||||||
|
m_log.DebugFormat("[MESH]: Creating mesh for {0}", primName);
|
||||||
|
#endif
|
||||||
|
|
||||||
Mesh mesh = null;
|
Mesh mesh = null;
|
||||||
ulong key = 0;
|
ulong key = 0;
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,9 @@
|
||||||
* switch between 'VEHICLE' parameter use and general dynamics
|
* switch between 'VEHICLE' parameter use and general dynamics
|
||||||
* settings use.
|
* settings use.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//#define SPAM
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
@ -56,7 +59,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Various properties that ODE uses for AMotors but isn't exposed in ODE.NET so we must define them ourselves.
|
/// Various properties that ODE uses for AMotors but isn't exposed in ODE.NET so we must define them ourselves.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
||||||
public class OdePrim : PhysicsActor
|
public class OdePrim : PhysicsActor
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
@ -284,14 +286,14 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public override bool Selected
|
public override bool Selected
|
||||||
{
|
{
|
||||||
set {
|
set
|
||||||
|
{
|
||||||
|
|
||||||
// This only makes the object not collidable if the object
|
// This only makes the object not collidable if the object
|
||||||
// is physical or the object is modified somehow *IN THE FUTURE*
|
// is physical or the object is modified somehow *IN THE FUTURE*
|
||||||
// without this, if an avatar selects prim, they can walk right
|
// without this, if an avatar selects prim, they can walk right
|
||||||
// through it while it's selected
|
// through it while it's selected
|
||||||
m_collisionscore = 0;
|
m_collisionscore = 0;
|
||||||
|
|
||||||
if ((m_isphysical && !_zeroFlag) || !value)
|
if ((m_isphysical && !_zeroFlag) || !value)
|
||||||
{
|
{
|
||||||
m_taintselected = value;
|
m_taintselected = value;
|
||||||
|
@ -302,7 +304,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
m_taintselected = value;
|
m_taintselected = value;
|
||||||
m_isSelected = value;
|
m_isSelected = value;
|
||||||
}
|
}
|
||||||
if (m_isSelected) disableBodySoft();
|
|
||||||
|
if (m_isSelected)
|
||||||
|
disableBodySoft();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,8 +333,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
//m_log.Warn("Setting Geom to: " + prim_geom);
|
//m_log.Warn("Setting Geom to: " + prim_geom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void enableBodySoft()
|
public void enableBodySoft()
|
||||||
{
|
{
|
||||||
if (!childPrim)
|
if (!childPrim)
|
||||||
|
@ -631,8 +633,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
float taperX1;
|
float taperX1;
|
||||||
float taperY1;
|
float taperY1;
|
||||||
float taperX;
|
float taperX;
|
||||||
|
@ -643,7 +643,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
float profileEnd;
|
float profileEnd;
|
||||||
|
|
||||||
if (_pbs.PathCurve == (byte)Extrusion.Straight || _pbs.PathCurve == (byte)Extrusion.Flexible)
|
if (_pbs.PathCurve == (byte)Extrusion.Straight || _pbs.PathCurve == (byte)Extrusion.Flexible)
|
||||||
{
|
{
|
||||||
taperX1 = _pbs.PathScaleX * 0.01f;
|
taperX1 = _pbs.PathScaleX * 0.01f;
|
||||||
if (taperX1 > 1.0f)
|
if (taperX1 > 1.0f)
|
||||||
taperX1 = 2.0f - taperX1;
|
taperX1 = 2.0f - taperX1;
|
||||||
|
@ -653,9 +653,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (taperY1 > 1.0f)
|
if (taperY1 > 1.0f)
|
||||||
taperY1 = 2.0f - taperY1;
|
taperY1 = 2.0f - taperY1;
|
||||||
taperY = 1.0f - taperY1;
|
taperY = 1.0f - taperY1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
taperX = _pbs.PathTaperX * 0.01f;
|
taperX = _pbs.PathTaperX * 0.01f;
|
||||||
if (taperX < 0.0f)
|
if (taperX < 0.0f)
|
||||||
taperX = -taperX;
|
taperX = -taperX;
|
||||||
|
@ -665,9 +665,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (taperY < 0.0f)
|
if (taperY < 0.0f)
|
||||||
taperY = -taperY;
|
taperY = -taperY;
|
||||||
taperY1 = 1.0f - taperY;
|
taperY1 = 1.0f - taperY;
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
volume *= (taperX1 * taperY1 + 0.5f * (taperX1 * taperY + taperX * taperY1) + 0.3333333333f * taperX * taperY);
|
volume *= (taperX1 * taperY1 + 0.5f * (taperX1 * taperY + taperX * taperY1) + 0.3333333333f * taperX * taperY);
|
||||||
|
|
||||||
|
@ -687,9 +685,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// else if (returnMass > _parent_scene.maximumMassObject)
|
// else if (returnMass > _parent_scene.maximumMassObject)
|
||||||
// returnMass = _parent_scene.maximumMassObject;
|
// returnMass = _parent_scene.maximumMassObject;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Recursively calculate mass
|
// Recursively calculate mass
|
||||||
bool HasChildPrim = false;
|
bool HasChildPrim = false;
|
||||||
lock (childrenPrim)
|
lock (childrenPrim)
|
||||||
|
@ -698,8 +693,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
HasChildPrim = true;
|
HasChildPrim = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HasChildPrim)
|
if (HasChildPrim)
|
||||||
{
|
{
|
||||||
OdePrim[] childPrimArr = new OdePrim[0];
|
OdePrim[] childPrimArr = new OdePrim[0];
|
||||||
|
@ -716,10 +711,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (returnMass > _parent_scene.maximumMassObject)
|
if (returnMass > _parent_scene.maximumMassObject)
|
||||||
returnMass = _parent_scene.maximumMassObject;
|
returnMass = _parent_scene.maximumMassObject;
|
||||||
|
|
||||||
return returnMass;
|
return returnMass;
|
||||||
}// end CalculateMass
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
@ -755,7 +752,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
|
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
d.BodyDestroy(Body);
|
d.BodyDestroy(Body);
|
||||||
lock (childrenPrim)
|
lock (childrenPrim)
|
||||||
{
|
{
|
||||||
|
@ -784,7 +780,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
|
d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Body = IntPtr.Zero;
|
Body = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -796,6 +791,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public void setMesh(OdeScene parent_scene, IMesh mesh)
|
public void setMesh(OdeScene parent_scene, IMesh mesh)
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[ODE PRIM]: Setting mesh on {0} to {1}", Name, mesh);
|
||||||
|
|
||||||
// This sleeper is there to moderate how long it takes between
|
// This sleeper is there to moderate how long it takes between
|
||||||
// setting up the mesh and pre-processing it when we get rapid fire mesh requests on a single object
|
// setting up the mesh and pre-processing it when we get rapid fire mesh requests on a single object
|
||||||
|
|
||||||
|
@ -852,7 +849,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// if (IsPhysical && Body == (IntPtr) 0)
|
// if (IsPhysical && Body == (IntPtr) 0)
|
||||||
// {
|
// {
|
||||||
// Recreate the body
|
// Recreate the body
|
||||||
|
@ -865,7 +861,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public void ProcessTaints(float timestep)
|
public void ProcessTaints(float timestep)
|
||||||
{
|
{
|
||||||
//Console.WriteLine("ProcessTaints for " + Name);
|
#if SPAM
|
||||||
|
Console.WriteLine("ZProcessTaints for " + Name);
|
||||||
|
#endif
|
||||||
if (m_taintadd)
|
if (m_taintadd)
|
||||||
{
|
{
|
||||||
changeadd(timestep);
|
changeadd(timestep);
|
||||||
|
@ -874,7 +872,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (prim_geom != IntPtr.Zero)
|
if (prim_geom != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
if (!_position.ApproxEquals(m_taintposition, 0f))
|
if (!_position.ApproxEquals(m_taintposition, 0f))
|
||||||
changemove(timestep);
|
changemove(timestep);
|
||||||
|
|
||||||
if (m_taintrot != _orientation)
|
if (m_taintrot != _orientation)
|
||||||
{
|
{
|
||||||
|
@ -892,19 +890,15 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
rotate(timestep);
|
rotate(timestep);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
|
||||||
|
|
||||||
if (m_taintPhysics != m_isphysical && !(m_taintparent != _parent))
|
if (m_taintPhysics != m_isphysical && !(m_taintparent != _parent))
|
||||||
changePhysicsStatus(timestep);
|
changePhysicsStatus(timestep);
|
||||||
//
|
|
||||||
|
|
||||||
if (!_size.ApproxEquals(m_taintsize,0f))
|
if (!_size.ApproxEquals(m_taintsize, 0f))
|
||||||
changesize(timestep);
|
changesize(timestep);
|
||||||
//
|
|
||||||
|
|
||||||
if (m_taintshape)
|
if (m_taintshape)
|
||||||
changeshape(timestep);
|
changeshape(timestep);
|
||||||
//
|
|
||||||
|
|
||||||
if (m_taintforce)
|
if (m_taintforce)
|
||||||
changeAddForce(timestep);
|
changeAddForce(timestep);
|
||||||
|
@ -932,7 +926,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f))
|
if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f))
|
||||||
changeAngularLock(timestep);
|
changeAngularLock(timestep);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -940,7 +933,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void changeAngularLock(float timestep)
|
private void changeAngularLock(float timestep)
|
||||||
{
|
{
|
||||||
// do we have a Physical object?
|
// do we have a Physical object?
|
||||||
|
@ -968,7 +960,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
// Store this for later in case we get turned into a separate body
|
// Store this for later in case we get turned into a separate body
|
||||||
m_angularlock = m_taintAngularLock;
|
m_angularlock = m_taintAngularLock;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void changelink(float timestep)
|
private void changelink(float timestep)
|
||||||
|
@ -1107,7 +1098,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name);
|
m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
prm.m_interpenetrationcount = 0;
|
prm.m_interpenetrationcount = 0;
|
||||||
prm.m_collisionscore = 0;
|
prm.m_collisionscore = 0;
|
||||||
prm.m_disabled = false;
|
prm.m_disabled = false;
|
||||||
|
@ -1167,7 +1157,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ChildSetGeom(OdePrim odePrim)
|
private void ChildSetGeom(OdePrim odePrim)
|
||||||
|
@ -1229,16 +1218,11 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
childrenPrim.Remove(odePrim);
|
childrenPrim.Remove(odePrim);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (Body != IntPtr.Zero)
|
if (Body != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
_parent_scene.remActivePrim(this);
|
_parent_scene.remActivePrim(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
lock (childrenPrim)
|
lock (childrenPrim)
|
||||||
{
|
{
|
||||||
foreach (OdePrim prm in childrenPrim)
|
foreach (OdePrim prm in childrenPrim)
|
||||||
|
@ -1247,8 +1231,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
ParentPrim(prm);
|
ParentPrim(prm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void changeSelectedStatus(float timestep)
|
private void changeSelectedStatus(float timestep)
|
||||||
|
@ -1345,7 +1327,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh)
|
public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh)
|
||||||
{
|
{
|
||||||
//Console.WriteLine("CreateGeom:");
|
#if SPAM
|
||||||
|
Console.WriteLine("CreateGeom:");
|
||||||
|
#endif
|
||||||
if (_mesh != null)
|
if (_mesh != null)
|
||||||
{
|
{
|
||||||
setMesh(_parent_scene, _mesh);
|
setMesh(_parent_scene, _mesh);
|
||||||
|
@ -1403,7 +1387,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||||
|
@ -1443,10 +1426,11 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
lock (_parent_scene.OdeLock)
|
lock (_parent_scene.OdeLock)
|
||||||
{
|
{
|
||||||
//Console.WriteLine("changeadd 1");
|
#if SPAM
|
||||||
|
Console.WriteLine("changeadd 1");
|
||||||
|
#endif
|
||||||
CreateGeom(m_targetSpace, _mesh);
|
CreateGeom(m_targetSpace, _mesh);
|
||||||
|
|
||||||
if (prim_geom != IntPtr.Zero)
|
if (prim_geom != IntPtr.Zero)
|
||||||
|
@ -1690,12 +1674,10 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
PID_G = m_PIDTau + 1;
|
PID_G = m_PIDTau + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Where are we, and where are we headed?
|
// Where are we, and where are we headed?
|
||||||
d.Vector3 pos = d.BodyGetPosition(Body);
|
d.Vector3 pos = d.BodyGetPosition(Body);
|
||||||
d.Vector3 vel = d.BodyGetLinearVel(Body);
|
d.Vector3 vel = d.BodyGetLinearVel(Body);
|
||||||
|
|
||||||
|
|
||||||
// Non-Vehicles have a limited set of Hover options.
|
// Non-Vehicles have a limited set of Hover options.
|
||||||
// determine what our target height really is based on HoverType
|
// determine what our target height really is based on HoverType
|
||||||
switch (m_PIDHoverType)
|
switch (m_PIDHoverType)
|
||||||
|
@ -1801,8 +1783,6 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void rotate(float timestep)
|
public void rotate(float timestep)
|
||||||
{
|
{
|
||||||
d.Quaternion myrot = new d.Quaternion();
|
d.Quaternion myrot = new d.Quaternion();
|
||||||
|
@ -1913,6 +1893,9 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
|
|
||||||
public void changesize(float timestamp)
|
public void changesize(float timestamp)
|
||||||
{
|
{
|
||||||
|
#if SPAM
|
||||||
|
m_log.DebugFormat("[ODE PRIM]: Called changesize");
|
||||||
|
#endif
|
||||||
|
|
||||||
string oldname = _parent_scene.geom_name_map[prim_geom];
|
string oldname = _parent_scene.geom_name_map[prim_geom];
|
||||||
|
|
||||||
|
@ -1923,8 +1906,9 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
// Cleanup of old prim geometry
|
// Cleanup of old prim geometry
|
||||||
if (_mesh != null)
|
if (_mesh != null)
|
||||||
{
|
{
|
||||||
// Cleanup meshing here
|
// TODO: Cleanup meshing here
|
||||||
}
|
}
|
||||||
|
|
||||||
//kill body to rebuild
|
//kill body to rebuild
|
||||||
if (IsPhysical && Body != IntPtr.Zero)
|
if (IsPhysical && Body != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
|
@ -1941,11 +1925,13 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
disableBody();
|
disableBody();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d.SpaceQuery(m_targetSpace, prim_geom))
|
if (d.SpaceQuery(m_targetSpace, prim_geom))
|
||||||
{
|
{
|
||||||
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
_parent_scene.waitForSpaceUnlock(m_targetSpace);
|
||||||
d.SpaceRemove(m_targetSpace, prim_geom);
|
d.SpaceRemove(m_targetSpace, prim_geom);
|
||||||
}
|
}
|
||||||
|
|
||||||
d.GeomDestroy(prim_geom);
|
d.GeomDestroy(prim_geom);
|
||||||
prim_geom = IntPtr.Zero;
|
prim_geom = IntPtr.Zero;
|
||||||
// we don't need to do space calculation because the client sends a position update also.
|
// we don't need to do space calculation because the client sends a position update also.
|
||||||
|
@ -1964,16 +1950,19 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
if (_parent_scene.needsMeshing(_pbs))
|
if (_parent_scene.needsMeshing(_pbs))
|
||||||
mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
|
mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
|
||||||
|
|
||||||
//IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
|
#if SPAM
|
||||||
//Console.WriteLine("changesize 1");
|
Console.WriteLine("changesize 1");
|
||||||
|
#endif
|
||||||
CreateGeom(m_targetSpace, mesh);
|
CreateGeom(m_targetSpace, mesh);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_mesh = null;
|
_mesh = null;
|
||||||
//Console.WriteLine("changesize 2");
|
|
||||||
|
#if SPAM
|
||||||
|
Console.WriteLine("changesize 2");
|
||||||
|
#endif
|
||||||
|
|
||||||
CreateGeom(m_targetSpace, _mesh);
|
CreateGeom(m_targetSpace, _mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2009,8 +1998,6 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
m_taintsize = _size;
|
m_taintsize = _size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void changefloatonwater(float timestep)
|
public void changefloatonwater(float timestep)
|
||||||
{
|
{
|
||||||
m_collidesWater = m_taintCollidesWater;
|
m_collidesWater = m_taintCollidesWater;
|
||||||
|
@ -2058,6 +2045,7 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
prim_geom = IntPtr.Zero;
|
prim_geom = IntPtr.Zero;
|
||||||
m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name);
|
m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
prim_geom = IntPtr.Zero;
|
prim_geom = IntPtr.Zero;
|
||||||
// we don't need to do space calculation because the client sends a position update also.
|
// we don't need to do space calculation because the client sends a position update also.
|
||||||
if (_size.X <= 0) _size.X = 0.01f;
|
if (_size.X <= 0) _size.X = 0.01f;
|
||||||
|
@ -2067,20 +2055,26 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
|
|
||||||
if (_parent_scene.needsMeshing(_pbs))
|
if (_parent_scene.needsMeshing(_pbs))
|
||||||
{
|
{
|
||||||
// Don't need to re-enable body.. it's done in SetMesh
|
// Don't need to re-enable body.. it's done in CreateMesh
|
||||||
float meshlod = _parent_scene.meshSculptLOD;
|
float meshlod = _parent_scene.meshSculptLOD;
|
||||||
|
|
||||||
if (IsPhysical)
|
if (IsPhysical)
|
||||||
meshlod = _parent_scene.MeshSculptphysicalLOD;
|
meshlod = _parent_scene.MeshSculptphysicalLOD;
|
||||||
|
|
||||||
IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
|
|
||||||
// createmesh returns null when it doesn't mesh.
|
// createmesh returns null when it doesn't mesh.
|
||||||
|
IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
|
||||||
|
#if SPAM
|
||||||
|
Console.WriteLine("changeshape needed meshing");
|
||||||
|
#endif
|
||||||
CreateGeom(m_targetSpace, mesh);
|
CreateGeom(m_targetSpace, mesh);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_mesh = null;
|
_mesh = null;
|
||||||
//Console.WriteLine("changeshape");
|
|
||||||
|
#if SPAM
|
||||||
|
Console.WriteLine("changeshape not need meshing");
|
||||||
|
#endif
|
||||||
CreateGeom(m_targetSpace, null);
|
CreateGeom(m_targetSpace, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2115,6 +2109,7 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
parent.ChildSetGeom(this);
|
parent.ChildSetGeom(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
resetCollisionAccounting();
|
resetCollisionAccounting();
|
||||||
m_taintshape = false;
|
m_taintshape = false;
|
||||||
}
|
}
|
||||||
|
@ -2165,11 +2160,8 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_taintforce = false;
|
m_taintforce = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void changeSetTorque(float timestamp)
|
public void changeSetTorque(float timestamp)
|
||||||
{
|
{
|
||||||
if (!m_isSelected)
|
if (!m_isSelected)
|
||||||
|
@ -2357,7 +2349,7 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
{
|
{
|
||||||
lock (_parent_scene.OdeLock)
|
lock (_parent_scene.OdeLock)
|
||||||
{
|
{
|
||||||
m_isVolumeDetect = (param!=0);
|
m_isVolumeDetect = (param != 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2839,7 +2831,6 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
|
|
||||||
public override float APIDDamping{ set { return; } }
|
public override float APIDDamping{ set { return; } }
|
||||||
|
|
||||||
|
|
||||||
private void createAMotor(Vector3 axis)
|
private void createAMotor(Vector3 axis)
|
||||||
{
|
{
|
||||||
if (Body == IntPtr.Zero)
|
if (Body == IntPtr.Zero)
|
||||||
|
@ -2959,7 +2950,6 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
//d.JointSetAMotorParam(Amotor, (int) dParam.Vel, 9000f);
|
//d.JointSetAMotorParam(Amotor, (int) dParam.Vel, 9000f);
|
||||||
d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f);
|
d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f);
|
||||||
d.JointSetAMotorParam(Amotor, (int)dParam.FMax, Mass * 50f);//
|
d.JointSetAMotorParam(Amotor, (int)dParam.FMax, Mass * 50f);//
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Matrix4 FromDMass(d.Mass pMass)
|
public Matrix4 FromDMass(d.Mass pMass)
|
||||||
|
@ -3044,8 +3034,6 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
return Matrix4.Identity; // should probably throw an error. singluar matrix inverse not possible
|
return Matrix4.Identity; // should probably throw an error. singluar matrix inverse not possible
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return (Adjoint(pMat) / determinant3x3(pMat));
|
return (Adjoint(pMat) / determinant3x3(pMat));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3082,6 +3070,7 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
}
|
}
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return minor;
|
return minor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3184,7 +3173,6 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
|
|
||||||
det = diag1 + diag2 + diag3 - (diag4 + diag5 + diag6);
|
det = diag1 + diag2 + diag3 - (diag4 + diag5 + diag6);
|
||||||
return det;
|
return det;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void DMassCopy(ref d.Mass src, ref d.Mass dst)
|
private static void DMassCopy(ref d.Mass src, ref d.Mass dst)
|
||||||
|
@ -3209,6 +3197,5 @@ Console.WriteLine(" JointCreateFixed");
|
||||||
{
|
{
|
||||||
m_material = pMaterial;
|
m_material = pMaterial;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,10 +45,15 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
public class ODERayCastRequestManager
|
public class ODERayCastRequestManager
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Pending Raycast Requests
|
/// Pending raycast requests
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected List<ODERayCastRequest> m_PendingRequests = new List<ODERayCastRequest>();
|
protected List<ODERayCastRequest> m_PendingRequests = new List<ODERayCastRequest>();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Pending ray requests
|
||||||
|
/// </summary>
|
||||||
|
protected List<ODERayRequest> m_PendingRayRequests = new List<ODERayRequest>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Scene that created this object.
|
/// Scene that created this object.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -95,6 +100,29 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Queues a raycast
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="position">Origin of Ray</param>
|
||||||
|
/// <param name="direction">Ray normal</param>
|
||||||
|
/// <param name="length">Ray length</param>
|
||||||
|
/// <param name="count"></param>
|
||||||
|
/// <param name="retMethod">Return method to send the results</param>
|
||||||
|
public void QueueRequest(Vector3 position, Vector3 direction, float length, int count, RayCallback retMethod)
|
||||||
|
{
|
||||||
|
lock (m_PendingRequests)
|
||||||
|
{
|
||||||
|
ODERayRequest req = new ODERayRequest();
|
||||||
|
req.callbackMethod = retMethod;
|
||||||
|
req.length = length;
|
||||||
|
req.Normal = direction;
|
||||||
|
req.Origin = position;
|
||||||
|
req.Count = count;
|
||||||
|
|
||||||
|
m_PendingRayRequests.Add(req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Process all queued raycast requests
|
/// Process all queued raycast requests
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -112,18 +140,26 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (reqs[i].callbackMethod != null) // quick optimization here, don't raycast
|
if (reqs[i].callbackMethod != null) // quick optimization here, don't raycast
|
||||||
RayCast(reqs[i]); // if there isn't anyone to send results
|
RayCast(reqs[i]); // if there isn't anyone to send results
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
foreach (ODERayCastRequest req in m_PendingRequests)
|
|
||||||
{
|
|
||||||
if (req.callbackMethod != null) // quick optimization here, don't raycast
|
|
||||||
RayCast(req); // if there isn't anyone to send results to
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
m_PendingRequests.Clear();
|
m_PendingRequests.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lock (m_PendingRayRequests)
|
||||||
|
{
|
||||||
|
if (m_PendingRayRequests.Count > 0)
|
||||||
|
{
|
||||||
|
ODERayRequest[] reqs = m_PendingRayRequests.ToArray();
|
||||||
|
for (int i = 0; i < reqs.Length; i++)
|
||||||
|
{
|
||||||
|
if (reqs[i].callbackMethod != null) // quick optimization here, don't raycast
|
||||||
|
RayCast(reqs[i]); // if there isn't anyone to send results
|
||||||
|
}
|
||||||
|
|
||||||
|
m_PendingRayRequests.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
lock (m_contactResults)
|
lock (m_contactResults)
|
||||||
m_contactResults.Clear();
|
m_contactResults.Clear();
|
||||||
|
|
||||||
|
@ -146,7 +182,6 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// Remove Ray
|
// Remove Ray
|
||||||
d.GeomDestroy(ray);
|
d.GeomDestroy(ray);
|
||||||
|
|
||||||
|
|
||||||
// Define default results
|
// Define default results
|
||||||
bool hitYN = false;
|
bool hitYN = false;
|
||||||
uint hitConsumerID = 0;
|
uint hitConsumerID = 0;
|
||||||
|
@ -177,6 +212,31 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
req.callbackMethod(hitYN, closestcontact, hitConsumerID, distance, snormal);
|
req.callbackMethod(hitYN, closestcontact, hitConsumerID, distance, snormal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Method that actually initiates the raycast
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="req"></param>
|
||||||
|
private void RayCast(ODERayRequest req)
|
||||||
|
{
|
||||||
|
// Create the ray
|
||||||
|
IntPtr ray = d.CreateRay(m_scene.space, req.length);
|
||||||
|
d.GeomRaySet(ray, req.Origin.X, req.Origin.Y, req.Origin.Z, req.Normal.X, req.Normal.Y, req.Normal.Z);
|
||||||
|
|
||||||
|
// Collide test
|
||||||
|
d.SpaceCollide2(m_scene.space, ray, IntPtr.Zero, nearCallback);
|
||||||
|
|
||||||
|
// Remove Ray
|
||||||
|
d.GeomDestroy(ray);
|
||||||
|
|
||||||
|
// Find closest contact and object.
|
||||||
|
lock (m_contactResults)
|
||||||
|
{
|
||||||
|
// Return results
|
||||||
|
if (req.callbackMethod != null)
|
||||||
|
req.callbackMethod(m_contactResults);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// This is the standard Near. Uses space AABBs to speed up detection.
|
// This is the standard Near. Uses space AABBs to speed up detection.
|
||||||
private void near(IntPtr space, IntPtr g1, IntPtr g2)
|
private void near(IntPtr space, IntPtr g1, IntPtr g2)
|
||||||
{
|
{
|
||||||
|
@ -342,10 +402,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
m_contactResults.Add(collisionresult);
|
m_contactResults.Add(collisionresult);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -365,11 +422,12 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
public RaycastCallback callbackMethod;
|
public RaycastCallback callbackMethod;
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct ContactResult
|
public struct ODERayRequest
|
||||||
{
|
{
|
||||||
public Vector3 Pos;
|
public Vector3 Origin;
|
||||||
public float Depth;
|
|
||||||
public uint ConsumerID;
|
|
||||||
public Vector3 Normal;
|
public Vector3 Normal;
|
||||||
|
public int Count;
|
||||||
|
public float length;
|
||||||
|
public RayCallback callbackMethod;
|
||||||
}
|
}
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -31,17 +31,18 @@ using NUnit.Framework;
|
||||||
using OpenMetaverse;
|
using OpenMetaverse;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Physics.Manager;
|
using OpenSim.Region.Physics.Manager;
|
||||||
|
using OpenSim.Region.Physics.OdePlugin;
|
||||||
using log4net;
|
using log4net;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace OpenSim.Region.Physics.OdePlugin
|
namespace OpenSim.Region.Physics.OdePlugin.Tests
|
||||||
{
|
{
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class ODETestClass
|
public class ODETestClass
|
||||||
{
|
{
|
||||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
private OdePlugin cbt;
|
private OpenSim.Region.Physics.OdePlugin.OdePlugin cbt;
|
||||||
private PhysicsScene ps;
|
private PhysicsScene ps;
|
||||||
private IMeshingPlugin imp;
|
private IMeshingPlugin imp;
|
||||||
|
|
||||||
|
|
|
@ -5147,7 +5147,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.Add(src.Substring(start,length).Trim());
|
result.Add(new LSL_String(src.Substring(start,length).Trim()));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -7009,7 +7009,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
// retain pathcurve
|
// retain pathcurve
|
||||||
shapeBlock.PathCurve = part.Shape.PathCurve;
|
shapeBlock.PathCurve = part.Shape.PathCurve;
|
||||||
|
|
||||||
part.Shape.SetSculptData((byte)type, sculptId);
|
part.Shape.SetSculptProperties((byte)type, sculptId);
|
||||||
part.Shape.SculptEntry = true;
|
part.Shape.SculptEntry = true;
|
||||||
part.UpdateShape(shapeBlock);
|
part.UpdateShape(shapeBlock);
|
||||||
}
|
}
|
||||||
|
@ -7500,7 +7500,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
UUID[] anims;
|
UUID[] anims;
|
||||||
anims = av.Animator.GetAnimationArray();
|
anims = av.Animator.GetAnimationArray();
|
||||||
foreach (UUID foo in anims)
|
foreach (UUID foo in anims)
|
||||||
l.Add(foo.ToString());
|
l.Add(new LSL_Key(foo.ToString()));
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8035,17 +8035,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
|
|
||||||
case (int)ScriptBaseClass.PRIM_TEXT:
|
case (int)ScriptBaseClass.PRIM_TEXT:
|
||||||
Color4 textColor = part.GetTextColor();
|
Color4 textColor = part.GetTextColor();
|
||||||
res.Add(part.Text);
|
res.Add(new LSL_String(part.Text));
|
||||||
res.Add(new LSL_Vector(textColor.R,
|
res.Add(new LSL_Vector(textColor.R,
|
||||||
textColor.G,
|
textColor.G,
|
||||||
textColor.B));
|
textColor.B));
|
||||||
res.Add(new LSL_Float(textColor.A));
|
res.Add(new LSL_Float(textColor.A));
|
||||||
break;
|
break;
|
||||||
case (int)ScriptBaseClass.PRIM_NAME:
|
case (int)ScriptBaseClass.PRIM_NAME:
|
||||||
res.Add(part.Name);
|
res.Add(new LSL_String(part.Name));
|
||||||
break;
|
break;
|
||||||
case (int)ScriptBaseClass.PRIM_DESC:
|
case (int)ScriptBaseClass.PRIM_DESC:
|
||||||
res.Add(part.Description);
|
res.Add(new LSL_String(part.Description));
|
||||||
break;
|
break;
|
||||||
case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
|
case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
|
||||||
res.Add(new LSL_Rotation(part.RotationOffset.X, part.RotationOffset.Y, part.RotationOffset.Z, part.RotationOffset.W));
|
res.Add(new LSL_Rotation(part.RotationOffset.X, part.RotationOffset.Y, part.RotationOffset.Z, part.RotationOffset.W));
|
||||||
|
@ -10004,8 +10004,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
{
|
{
|
||||||
foreach (KeyValuePair<UUID, int> detectedParams in land.GetLandObjectOwners())
|
foreach (KeyValuePair<UUID, int> detectedParams in land.GetLandObjectOwners())
|
||||||
{
|
{
|
||||||
ret.Add(detectedParams.Key.ToString());
|
ret.Add(new LSL_String(detectedParams.Key.ToString()));
|
||||||
ret.Add(detectedParams.Value);
|
ret.Add(new LSL_Integer(detectedParams.Value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ScriptSleep(2000);
|
ScriptSleep(2000);
|
||||||
|
@ -10055,25 +10055,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
switch (o.ToString())
|
switch (o.ToString())
|
||||||
{
|
{
|
||||||
case "0":
|
case "0":
|
||||||
ret = ret + new LSL_List(land.Name);
|
ret.Add(new LSL_String(land.Name));
|
||||||
break;
|
break;
|
||||||
case "1":
|
case "1":
|
||||||
ret = ret + new LSL_List(land.Description);
|
ret.Add(new LSL_String(land.Description));
|
||||||
break;
|
break;
|
||||||
case "2":
|
case "2":
|
||||||
ret = ret + new LSL_List(land.OwnerID.ToString());
|
ret.Add(new LSL_Key(land.OwnerID.ToString()));
|
||||||
break;
|
break;
|
||||||
case "3":
|
case "3":
|
||||||
ret = ret + new LSL_List(land.GroupID.ToString());
|
ret.Add(new LSL_Key(land.GroupID.ToString()));
|
||||||
break;
|
break;
|
||||||
case "4":
|
case "4":
|
||||||
ret = ret + new LSL_List(land.Area);
|
ret.Add(new LSL_Integer(land.Area));
|
||||||
break;
|
break;
|
||||||
case "5":
|
case "5":
|
||||||
ret = ret + new LSL_List(land.GlobalID);
|
ret.Add(new LSL_Key(land.GlobalID.ToString()));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ret = ret + new LSL_List(0);
|
ret.Add(new LSL_Integer(0));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10105,10 +10105,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
switch (o.ToString())
|
switch (o.ToString())
|
||||||
{
|
{
|
||||||
case "1":
|
case "1":
|
||||||
ret.Add(av.Firstname + " " + av.Lastname);
|
ret.Add(new LSL_String(av.Firstname + " " + av.Lastname));
|
||||||
break;
|
break;
|
||||||
case "2":
|
case "2":
|
||||||
ret.Add("");
|
ret.Add(new LSL_String(""));
|
||||||
break;
|
break;
|
||||||
case "3":
|
case "3":
|
||||||
ret.Add(new LSL_Vector((double)av.AbsolutePosition.X, (double)av.AbsolutePosition.Y, (double)av.AbsolutePosition.Z));
|
ret.Add(new LSL_Vector((double)av.AbsolutePosition.X, (double)av.AbsolutePosition.Y, (double)av.AbsolutePosition.Z));
|
||||||
|
@ -10120,13 +10120,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
ret.Add(new LSL_Vector(av.Velocity.X, av.Velocity.Y, av.Velocity.Z));
|
ret.Add(new LSL_Vector(av.Velocity.X, av.Velocity.Y, av.Velocity.Z));
|
||||||
break;
|
break;
|
||||||
case "6":
|
case "6":
|
||||||
ret.Add(id);
|
ret.Add(new LSL_String(id));
|
||||||
break;
|
break;
|
||||||
case "7":
|
case "7":
|
||||||
ret.Add(UUID.Zero.ToString());
|
ret.Add(new LSL_String(UUID.Zero.ToString()));
|
||||||
break;
|
break;
|
||||||
case "8":
|
case "8":
|
||||||
ret.Add(UUID.Zero.ToString());
|
ret.Add(new LSL_String(UUID.Zero.ToString()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10140,10 +10140,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
switch (o.ToString())
|
switch (o.ToString())
|
||||||
{
|
{
|
||||||
case "1":
|
case "1":
|
||||||
ret.Add(obj.Name);
|
ret.Add(new LSL_String(obj.Name));
|
||||||
break;
|
break;
|
||||||
case "2":
|
case "2":
|
||||||
ret.Add(obj.Description);
|
ret.Add(new LSL_String(obj.Description));
|
||||||
break;
|
break;
|
||||||
case "3":
|
case "3":
|
||||||
ret.Add(new LSL_Vector(obj.AbsolutePosition.X, obj.AbsolutePosition.Y, obj.AbsolutePosition.Z));
|
ret.Add(new LSL_Vector(obj.AbsolutePosition.X, obj.AbsolutePosition.Y, obj.AbsolutePosition.Z));
|
||||||
|
@ -10155,13 +10155,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
ret.Add(new LSL_Vector(obj.Velocity.X, obj.Velocity.Y, obj.Velocity.Z));
|
ret.Add(new LSL_Vector(obj.Velocity.X, obj.Velocity.Y, obj.Velocity.Z));
|
||||||
break;
|
break;
|
||||||
case "6":
|
case "6":
|
||||||
ret.Add(obj.OwnerID.ToString());
|
ret.Add(new LSL_String(obj.OwnerID.ToString()));
|
||||||
break;
|
break;
|
||||||
case "7":
|
case "7":
|
||||||
ret.Add(obj.GroupID.ToString());
|
ret.Add(new LSL_String(obj.GroupID.ToString()));
|
||||||
break;
|
break;
|
||||||
case "8":
|
case "8":
|
||||||
ret.Add(obj.CreatorID.ToString());
|
ret.Add(new LSL_String(obj.CreatorID.ToString()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10418,51 +10418,191 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
return rq.ToString();
|
return rq.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options)
|
||||||
|
{
|
||||||
|
m_host.AddScriptLPS(1);
|
||||||
|
|
||||||
|
Vector3 dir = new Vector3((float)(end-start).x, (float)(end-start).y, (float)(end-start).z);
|
||||||
|
Vector3 startvector = new Vector3((float)start.x, (float)start.y, (float)start.z);
|
||||||
|
Vector3 endvector = new Vector3((float)end.x, (float)end.y, (float)end.z);
|
||||||
|
|
||||||
|
int count = 0;
|
||||||
|
// int detectPhantom = 0;
|
||||||
|
int dataFlags = 0;
|
||||||
|
int rejectTypes = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < options.Length; i += 2)
|
||||||
|
{
|
||||||
|
if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_MAX_HITS)
|
||||||
|
{
|
||||||
|
count = options.GetLSLIntegerItem(i + 1);
|
||||||
|
}
|
||||||
|
// else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DETECT_PHANTOM)
|
||||||
|
// {
|
||||||
|
// detectPhantom = options.GetLSLIntegerItem(i + 1);
|
||||||
|
// }
|
||||||
|
else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_DATA_FLAGS)
|
||||||
|
{
|
||||||
|
dataFlags = options.GetLSLIntegerItem(i + 1);
|
||||||
|
}
|
||||||
|
else if (options.GetLSLIntegerItem(i) == ScriptBaseClass.RC_REJECT_TYPES)
|
||||||
|
{
|
||||||
|
rejectTypes = options.GetLSLIntegerItem(i + 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LSL_List list = new LSL_List();
|
||||||
|
List<ContactResult> results = World.PhysicsScene.RaycastWorld(startvector, dir, dir.Length(), count);
|
||||||
|
|
||||||
|
double distance = Util.GetDistanceTo(startvector, endvector);
|
||||||
|
|
||||||
|
if (distance == 0)
|
||||||
|
distance = 0.001;
|
||||||
|
|
||||||
|
Vector3 posToCheck = startvector;
|
||||||
|
ITerrainChannel channel = World.RequestModuleInterface<ITerrainChannel>();
|
||||||
|
|
||||||
|
bool checkTerrain = !((rejectTypes & ScriptBaseClass.RC_REJECT_LAND) == ScriptBaseClass.RC_REJECT_LAND);
|
||||||
|
bool checkAgents = !((rejectTypes & ScriptBaseClass.RC_REJECT_AGENTS) == ScriptBaseClass.RC_REJECT_AGENTS);
|
||||||
|
bool checkNonPhysical = !((rejectTypes & ScriptBaseClass.RC_REJECT_NONPHYSICAL) == ScriptBaseClass.RC_REJECT_NONPHYSICAL);
|
||||||
|
bool checkPhysical = !((rejectTypes & ScriptBaseClass.RC_REJECT_PHYSICAL) == ScriptBaseClass.RC_REJECT_PHYSICAL);
|
||||||
|
|
||||||
|
for (float i = 0; i <= distance; i += 0.1f)
|
||||||
|
{
|
||||||
|
posToCheck = startvector + (dir * (i / (float)distance));
|
||||||
|
|
||||||
|
if (checkTerrain && channel[(int)(posToCheck.X + startvector.X), (int)(posToCheck.Y + startvector.Y)] < posToCheck.Z)
|
||||||
|
{
|
||||||
|
ContactResult result = new ContactResult();
|
||||||
|
result.ConsumerID = 0;
|
||||||
|
result.Depth = 0;
|
||||||
|
result.Normal = Vector3.Zero;
|
||||||
|
result.Pos = posToCheck;
|
||||||
|
results.Add(result);
|
||||||
|
checkTerrain = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (checkAgents)
|
||||||
|
{
|
||||||
|
World.ForEachScenePresence(delegate(ScenePresence sp)
|
||||||
|
{
|
||||||
|
if (sp.AbsolutePosition.ApproxEquals(posToCheck, sp.PhysicsActor.Size.X))
|
||||||
|
{
|
||||||
|
ContactResult result = new ContactResult ();
|
||||||
|
result.ConsumerID = sp.LocalId;
|
||||||
|
result.Depth = 0;
|
||||||
|
result.Normal = Vector3.Zero;
|
||||||
|
result.Pos = posToCheck;
|
||||||
|
results.Add(result);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int refcount = 0;
|
||||||
|
foreach (ContactResult result in results)
|
||||||
|
{
|
||||||
|
if ((rejectTypes & ScriptBaseClass.RC_REJECT_LAND)
|
||||||
|
== ScriptBaseClass.RC_REJECT_LAND && result.ConsumerID == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ISceneEntity entity = World.GetSceneObjectPart(result.ConsumerID);
|
||||||
|
|
||||||
|
if (entity == null && (rejectTypes & ScriptBaseClass.RC_REJECT_AGENTS) != ScriptBaseClass.RC_REJECT_AGENTS)
|
||||||
|
entity = World.GetScenePresence(result.ConsumerID); //Only check if we should be looking for agents
|
||||||
|
|
||||||
|
if (entity == null)
|
||||||
|
{
|
||||||
|
list.Add(UUID.Zero);
|
||||||
|
|
||||||
|
if ((dataFlags & ScriptBaseClass.RC_GET_LINK_NUM) == ScriptBaseClass.RC_GET_LINK_NUM)
|
||||||
|
list.Add(0);
|
||||||
|
|
||||||
|
list.Add(result.Pos);
|
||||||
|
|
||||||
|
if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL)
|
||||||
|
list.Add(result.Normal);
|
||||||
|
|
||||||
|
continue; //Can't find it, so add UUID.Zero
|
||||||
|
}
|
||||||
|
|
||||||
|
/*if (detectPhantom == 0 && intersection.obj is ISceneChildEntity &&
|
||||||
|
((ISceneChildEntity)intersection.obj).PhysActor == null)
|
||||||
|
continue;*/ //Can't do this ATM, physics engine knows only of non phantom objects
|
||||||
|
|
||||||
|
if (entity is SceneObjectPart)
|
||||||
|
{
|
||||||
|
if (((SceneObjectPart)entity).PhysActor != null && ((SceneObjectPart)entity).PhysActor.IsPhysical)
|
||||||
|
{
|
||||||
|
if (!checkPhysical)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!checkNonPhysical)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
refcount++;
|
||||||
|
if ((dataFlags & ScriptBaseClass.RC_GET_ROOT_KEY) == ScriptBaseClass.RC_GET_ROOT_KEY && entity is SceneObjectPart)
|
||||||
|
list.Add(((SceneObjectPart)entity).ParentGroup.UUID);
|
||||||
|
else
|
||||||
|
list.Add(entity.UUID);
|
||||||
|
|
||||||
|
if ((dataFlags & ScriptBaseClass.RC_GET_LINK_NUM) == ScriptBaseClass.RC_GET_LINK_NUM)
|
||||||
|
{
|
||||||
|
if (entity is SceneObjectPart)
|
||||||
|
list.Add(((SceneObjectPart)entity).LinkNum);
|
||||||
|
else
|
||||||
|
list.Add(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
list.Add(result.Pos);
|
||||||
|
|
||||||
|
if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL)
|
||||||
|
list.Add(result.Normal);
|
||||||
|
}
|
||||||
|
|
||||||
|
list.Add(refcount); //The status code, either the # of contacts, RCERR_SIM_PERF_LOW, or RCERR_CAST_TIME_EXCEEDED
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
#region Not Implemented
|
#region Not Implemented
|
||||||
//
|
//
|
||||||
// Listing the unimplemented lsl functions here, please move
|
// Listing the unimplemented lsl functions here, please move
|
||||||
// them from this region as they are completed
|
// them from this region as they are completed
|
||||||
//
|
//
|
||||||
public void llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options)
|
|
||||||
{
|
|
||||||
m_host.AddScriptLPS(1);
|
|
||||||
NotImplemented("llCastRay");
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void llGetEnv(LSL_String name)
|
public void llGetEnv(LSL_String name)
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
NotImplemented("llGetEnv");
|
NotImplemented("llGetEnv");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llGetSPMaxMemory()
|
public void llGetSPMaxMemory()
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
NotImplemented("llGetSPMaxMemory");
|
NotImplemented("llGetSPMaxMemory");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llGetUsedMemory()
|
public void llGetUsedMemory()
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
NotImplemented("llGetUsedMemory");
|
NotImplemented("llGetUsedMemory");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llRegionSayTo( LSL_Key target, LSL_Integer channel, LSL_String msg )
|
public void llRegionSayTo(LSL_Key target, LSL_Integer channel, LSL_String msg)
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
NotImplemented("llRegionSayTo");
|
NotImplemented("llRegionSayTo");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llScriptProfiler( LSL_Integer flags )
|
public void llScriptProfiler(LSL_Integer flags)
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
NotImplemented("llScriptProfiler");
|
NotImplemented("llScriptProfiler");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llSetSoundQueueing(int queue)
|
public void llSetSoundQueueing(int queue)
|
||||||
|
|
|
@ -130,7 +130,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
while (idx < rules.Length)
|
while (idx < rules.Length)
|
||||||
{
|
{
|
||||||
uint rule = (uint)rules.GetLSLIntegerItem(idx);
|
LSL_Integer ruleInt = rules.GetLSLIntegerItem(idx);
|
||||||
|
uint rule = (uint)ruleInt;
|
||||||
LSL_List toadd = new LSL_List();
|
LSL_List toadd = new LSL_List();
|
||||||
|
|
||||||
switch (rule)
|
switch (rule)
|
||||||
|
@ -247,7 +248,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
|
|
||||||
if (toadd.Length > 0)
|
if (toadd.Length > 0)
|
||||||
{
|
{
|
||||||
values.Add(rule);
|
values.Add(ruleInt);
|
||||||
values.Add(toadd.Data[0]);
|
values.Add(toadd.Data[0]);
|
||||||
}
|
}
|
||||||
idx++;
|
idx++;
|
||||||
|
|
|
@ -38,7 +38,6 @@ using OpenSim;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
|
||||||
using OpenSim.Framework.Console;
|
using OpenSim.Framework.Console;
|
||||||
using OpenSim.Region.CoreModules.Avatar.NPC;
|
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
using OpenSim.Region.ScriptEngine.Shared;
|
using OpenSim.Region.ScriptEngine.Shared;
|
||||||
|
@ -812,7 +811,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
World.ForEachScenePresence(delegate(ScenePresence sp)
|
World.ForEachScenePresence(delegate(ScenePresence sp)
|
||||||
{
|
{
|
||||||
if (!sp.IsChildAgent)
|
if (!sp.IsChildAgent)
|
||||||
result.Add(sp.Name);
|
result.Add(new LSL_String(sp.Name));
|
||||||
});
|
});
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -970,7 +969,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
|
|
||||||
public string osDrawPolygon(string drawList, LSL_List x, LSL_List y)
|
public string osDrawPolygon(string drawList, LSL_List x, LSL_List y)
|
||||||
{
|
{
|
||||||
CheckThreatLevel(ThreatLevel.None, "osDrawFilledPolygon");
|
CheckThreatLevel(ThreatLevel.None, "osDrawPolygon");
|
||||||
|
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
|
||||||
|
@ -1241,7 +1240,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
return String.Empty;
|
return String.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void osSetWindParam(string plugin, string param, float value)
|
public void osSetWindParam(string plugin, string param, LSL_Float value)
|
||||||
{
|
{
|
||||||
CheckThreatLevel(ThreatLevel.VeryLow, "osSetWindParam");
|
CheckThreatLevel(ThreatLevel.VeryLow, "osSetWindParam");
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
@ -1251,13 +1250,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
module.WindParamSet(plugin, param, value);
|
module.WindParamSet(plugin, param, (float)value);
|
||||||
}
|
}
|
||||||
catch (Exception) { }
|
catch (Exception) { }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public float osGetWindParam(string plugin, string param)
|
public LSL_Float osGetWindParam(string plugin, string param)
|
||||||
{
|
{
|
||||||
CheckThreatLevel(ThreatLevel.VeryLow, "osGetWindParam");
|
CheckThreatLevel(ThreatLevel.VeryLow, "osGetWindParam");
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
@ -1409,7 +1408,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
{
|
{
|
||||||
// What actually is the difference to the LL function?
|
// What actually is the difference to the LL function?
|
||||||
//
|
//
|
||||||
CheckThreatLevel(ThreatLevel.VeryLow, "osSetParcelMediaURL");
|
CheckThreatLevel(ThreatLevel.VeryLow, "osSetParcelSIPAddress");
|
||||||
|
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
|
||||||
|
@ -1910,8 +1909,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
};
|
};
|
||||||
|
|
||||||
return NotecardCache.GetLines(assetID);
|
return NotecardCache.GetLines(assetID);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string osAvatarName2Key(string firstname, string lastname)
|
public string osAvatarName2Key(string firstname, string lastname)
|
||||||
|
@ -2025,16 +2022,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
// Find matches beginning at start position
|
// Find matches beginning at start position
|
||||||
Regex matcher = new Regex(pattern);
|
Regex matcher = new Regex(pattern);
|
||||||
Match match = matcher.Match(src, start);
|
Match match = matcher.Match(src, start);
|
||||||
if (match.Success)
|
while (match.Success)
|
||||||
{
|
{
|
||||||
foreach (System.Text.RegularExpressions.Group g in match.Groups)
|
foreach (System.Text.RegularExpressions.Group g in match.Groups)
|
||||||
{
|
{
|
||||||
if (g.Success)
|
if (g.Success)
|
||||||
{
|
{
|
||||||
result.Add(g.Value);
|
result.Add(new LSL_String(g.Value));
|
||||||
result.Add(g.Index);
|
result.Add(new LSL_Integer(g.Index));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
match = match.NextMatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -2209,12 +2208,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
return (int)pws;
|
return (int)pws;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void osSetSpeed(string UUID, float SpeedModifier)
|
public void osSetSpeed(string UUID, LSL_Float SpeedModifier)
|
||||||
{
|
{
|
||||||
CheckThreatLevel(ThreatLevel.Moderate, "osSetSpeed");
|
CheckThreatLevel(ThreatLevel.Moderate, "osSetSpeed");
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
ScenePresence avatar = World.GetScenePresence(new UUID(UUID));
|
ScenePresence avatar = World.GetScenePresence(new UUID(UUID));
|
||||||
avatar.SpeedModifier = SpeedModifier;
|
avatar.SpeedModifier = (float)SpeedModifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void osKickAvatar(string FirstName,string SurName,string alert)
|
public void osKickAvatar(string FirstName,string SurName,string alert)
|
||||||
|
@ -2295,14 +2294,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
{
|
{
|
||||||
CheckThreatLevel(ThreatLevel.High, "osGetPrimitiveParams");
|
CheckThreatLevel(ThreatLevel.High, "osGetPrimitiveParams");
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
InitLSL();
|
||||||
|
|
||||||
return m_LSL_Api.GetLinkPrimitiveParamsEx(prim, rules);
|
return m_LSL_Api.GetLinkPrimitiveParamsEx(prim, rules);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void osSetPrimitiveParams(LSL_Key prim, LSL_List rules)
|
public void osSetPrimitiveParams(LSL_Key prim, LSL_List rules)
|
||||||
{
|
{
|
||||||
CheckThreatLevel(ThreatLevel.High, "osGetPrimitiveParams");
|
CheckThreatLevel(ThreatLevel.High, "osSetPrimitiveParams");
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
InitLSL();
|
||||||
|
|
||||||
m_LSL_Api.SetPrimitiveParamsEx(prim, rules);
|
m_LSL_Api.SetPrimitiveParamsEx(prim, rules);
|
||||||
}
|
}
|
||||||
|
@ -2365,9 +2366,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
{
|
{
|
||||||
if (avatar.IsChildAgent == false)
|
if (avatar.IsChildAgent == false)
|
||||||
{
|
{
|
||||||
result.Add(avatar.UUID);
|
result.Add(new LSL_String(avatar.UUID.ToString()));
|
||||||
result.Add(avatar.AbsolutePosition);
|
OpenMetaverse.Vector3 ap = avatar.AbsolutePosition;
|
||||||
result.Add(avatar.Name);
|
result.Add(new LSL_Vector(ap.X, ap.Y, ap.Z));
|
||||||
|
result.Add(new LSL_String(avatar.Name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -60,6 +60,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
||||||
LSL_String llBase64ToString(string str);
|
LSL_String llBase64ToString(string str);
|
||||||
void llBreakAllLinks();
|
void llBreakAllLinks();
|
||||||
void llBreakLink(int linknum);
|
void llBreakLink(int linknum);
|
||||||
|
LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options);
|
||||||
LSL_Integer llCeil(double f);
|
LSL_Integer llCeil(double f);
|
||||||
void llClearCameraParams();
|
void llClearCameraParams();
|
||||||
LSL_Integer llClearPrimMedia(LSL_Integer face);
|
LSL_Integer llClearPrimMedia(LSL_Integer face);
|
||||||
|
@ -404,7 +405,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
||||||
LSL_String llXorBase64StringsCorrect(string str1, string str2);
|
LSL_String llXorBase64StringsCorrect(string str1, string str2);
|
||||||
void print(string str);
|
void print(string str);
|
||||||
|
|
||||||
void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
|
void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
|
||||||
LSL_List GetLinkPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
|
LSL_List GetLinkPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,8 +129,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
||||||
|
|
||||||
// Wind Module Functions
|
// Wind Module Functions
|
||||||
string osWindActiveModelPluginName();
|
string osWindActiveModelPluginName();
|
||||||
void osSetWindParam(string plugin, string param, float value);
|
void osSetWindParam(string plugin, string param, LSL_Float value);
|
||||||
float osGetWindParam(string plugin, string param);
|
LSL_Float osGetWindParam(string plugin, string param);
|
||||||
|
|
||||||
// Parcel commands
|
// Parcel commands
|
||||||
void osParcelJoin(vector pos1, vector pos2);
|
void osParcelJoin(vector pos1, vector pos2);
|
||||||
|
@ -180,7 +180,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
||||||
|
|
||||||
int osGetSimulatorMemory();
|
int osGetSimulatorMemory();
|
||||||
void osKickAvatar(string FirstName,string SurName,string alert);
|
void osKickAvatar(string FirstName,string SurName,string alert);
|
||||||
void osSetSpeed(string UUID, float SpeedModifier);
|
void osSetSpeed(string UUID, LSL_Float SpeedModifier);
|
||||||
void osCauseHealing(string avatar, double healing);
|
void osCauseHealing(string avatar, double healing);
|
||||||
void osCauseDamage(string avatar, double damage);
|
void osCauseDamage(string avatar, double damage);
|
||||||
LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules);
|
LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules);
|
||||||
|
|
|
@ -593,5 +593,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||||
|
|
||||||
public const string URL_REQUEST_GRANTED = "URL_REQUEST_GRANTED";
|
public const string URL_REQUEST_GRANTED = "URL_REQUEST_GRANTED";
|
||||||
public const string URL_REQUEST_DENIED = "URL_REQUEST_DENIED";
|
public const string URL_REQUEST_DENIED = "URL_REQUEST_DENIED";
|
||||||
|
|
||||||
|
public static readonly LSLInteger RC_REJECT_TYPES = 2;
|
||||||
|
public static readonly LSLInteger RC_DATA_FLAGS = 4;
|
||||||
|
public static readonly LSLInteger RC_MAX_HITS = 8;
|
||||||
|
public static readonly LSLInteger RC_DETECT_PHANTOM = 16;
|
||||||
|
|
||||||
|
public static readonly LSLInteger RC_REJECT_AGENTS = 2;
|
||||||
|
public static readonly LSLInteger RC_REJECT_PHYSICAL = 4;
|
||||||
|
public static readonly LSLInteger RC_REJECT_NONPHYSICAL = 8;
|
||||||
|
public static readonly LSLInteger RC_REJECT_LAND = 16;
|
||||||
|
|
||||||
|
public static readonly LSLInteger RC_GET_NORMAL = 2;
|
||||||
|
public static readonly LSLInteger RC_GET_ROOT_KEY = 4;
|
||||||
|
public static readonly LSLInteger RC_GET_LINK_NUM = 8;
|
||||||
|
|
||||||
|
public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,16 +106,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||||
return m_OSSL_Functions.osWindActiveModelPluginName();
|
return m_OSSL_Functions.osWindActiveModelPluginName();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Not yet plugged in as available OSSL functions, so commented out
|
public void osSetWindParam(string plugin, string param, LSL_Float value)
|
||||||
// void osSetWindParam(string plugin, string param, float value)
|
{
|
||||||
// {
|
m_OSSL_Functions.osSetWindParam(plugin, param, value);
|
||||||
// m_OSSL_Functions.osSetWindParam(plugin, param, value);
|
}
|
||||||
// }
|
|
||||||
//
|
public LSL_Float osGetWindParam(string plugin, string param)
|
||||||
// float osGetWindParam(string plugin, string param)
|
{
|
||||||
// {
|
return m_OSSL_Functions.osGetWindParam(plugin, param);
|
||||||
// return m_OSSL_Functions.osGetWindParam(plugin, param);
|
}
|
||||||
// }
|
|
||||||
|
|
||||||
public void osParcelJoin(vector pos1, vector pos2)
|
public void osParcelJoin(vector pos1, vector pos2)
|
||||||
{
|
{
|
||||||
|
@ -714,7 +713,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||||
m_OSSL_Functions.osKickAvatar(FirstName, SurName, alert);
|
m_OSSL_Functions.osKickAvatar(FirstName, SurName, alert);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void osSetSpeed(string UUID, float SpeedModifier)
|
public void osSetSpeed(string UUID, LSL_Float SpeedModifier)
|
||||||
{
|
{
|
||||||
m_OSSL_Functions.osSetSpeed(UUID, SpeedModifier);
|
m_OSSL_Functions.osSetSpeed(UUID, SpeedModifier);
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,6 +106,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
// Get some config
|
// Get some config
|
||||||
WriteScriptSourceToDebugFile = m_scriptEngine.Config.GetBoolean("WriteScriptSourceToDebugFile", false);
|
WriteScriptSourceToDebugFile = m_scriptEngine.Config.GetBoolean("WriteScriptSourceToDebugFile", false);
|
||||||
CompileWithDebugInformation = m_scriptEngine.Config.GetBoolean("CompileWithDebugInformation", true);
|
CompileWithDebugInformation = m_scriptEngine.Config.GetBoolean("CompileWithDebugInformation", true);
|
||||||
|
bool DeleteScriptsOnStartup = m_scriptEngine.Config.GetBoolean("DeleteScriptsOnStartup", true);
|
||||||
|
|
||||||
// Get file prefix from scriptengine name and make it file system safe:
|
// Get file prefix from scriptengine name and make it file system safe:
|
||||||
FilePrefix = "CommonCompiler";
|
FilePrefix = "CommonCompiler";
|
||||||
|
@ -114,11 +115,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
FilePrefix = FilePrefix.Replace(c, '_');
|
FilePrefix = FilePrefix.Replace(c, '_');
|
||||||
}
|
}
|
||||||
|
|
||||||
// First time we start? Delete old files
|
|
||||||
if (in_startup)
|
if (in_startup)
|
||||||
{
|
{
|
||||||
in_startup = false;
|
in_startup = false;
|
||||||
DeleteOldFiles();
|
CreateScriptsDirectory();
|
||||||
|
|
||||||
|
// First time we start? Delete old files
|
||||||
|
if (DeleteScriptsOnStartup)
|
||||||
|
DeleteOldFiles();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map name and enum type of our supported languages
|
// Map name and enum type of our supported languages
|
||||||
|
@ -187,11 +191,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Delete old script files
|
/// Create the directory where compiled scripts are stored.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void DeleteOldFiles()
|
private void CreateScriptsDirectory()
|
||||||
{
|
{
|
||||||
// CREATE FOLDER IF IT DOESNT EXIST
|
|
||||||
if (!Directory.Exists(ScriptEnginesPath))
|
if (!Directory.Exists(ScriptEnginesPath))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
@ -218,7 +221,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
|
||||||
m_scriptEngine.World.RegionInfo.RegionID.ToString()) + "\": " + ex.ToString());
|
m_scriptEngine.World.RegionInfo.RegionID.ToString()) + "\": " + ex.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Delete old script files
|
||||||
|
/// </summary>
|
||||||
|
private void DeleteOldFiles()
|
||||||
|
{
|
||||||
foreach (string file in Directory.GetFiles(Path.Combine(ScriptEnginesPath,
|
foreach (string file in Directory.GetFiles(Path.Combine(ScriptEnginesPath,
|
||||||
m_scriptEngine.World.RegionInfo.RegionID.ToString()), FilePrefix + "_compiled*"))
|
m_scriptEngine.World.RegionInfo.RegionID.ToString()), FilePrefix + "_compiled*"))
|
||||||
{
|
{
|
||||||
|
|
|
@ -1379,7 +1379,9 @@ namespace OpenSim.Region.ScriptEngine.Shared
|
||||||
public struct LSLString
|
public struct LSLString
|
||||||
{
|
{
|
||||||
public string m_string;
|
public string m_string;
|
||||||
|
|
||||||
#region Constructors
|
#region Constructors
|
||||||
|
|
||||||
public LSLString(string s)
|
public LSLString(string s)
|
||||||
{
|
{
|
||||||
m_string = s;
|
m_string = s;
|
||||||
|
@ -1387,22 +1389,24 @@ namespace OpenSim.Region.ScriptEngine.Shared
|
||||||
|
|
||||||
public LSLString(double d)
|
public LSLString(double d)
|
||||||
{
|
{
|
||||||
string s=String.Format(Culture.FormatProvider, "{0:0.000000}", d);
|
string s = String.Format(Culture.FormatProvider, "{0:0.000000}", d);
|
||||||
m_string=s;
|
m_string = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LSLString(LSLFloat f)
|
public LSLString(LSLFloat f)
|
||||||
{
|
{
|
||||||
string s = String.Format(Culture.FormatProvider, "{0:0.000000}", f.value);
|
string s = String.Format(Culture.FormatProvider, "{0:0.000000}", f.value);
|
||||||
m_string=s;
|
m_string = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LSLString(LSLInteger i)
|
public LSLString(int i)
|
||||||
{
|
{
|
||||||
string s = String.Format("{0}", i);
|
string s = String.Format("{0}", i);
|
||||||
m_string = s;
|
m_string = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public LSLString(LSLInteger i) : this(i.value) {}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Operators
|
#region Operators
|
||||||
|
@ -1470,6 +1474,11 @@ namespace OpenSim.Region.ScriptEngine.Shared
|
||||||
return new LSLString(d);
|
return new LSLString(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public explicit operator LSLString(int i)
|
||||||
|
{
|
||||||
|
return new LSLString(i);
|
||||||
|
}
|
||||||
|
|
||||||
public static explicit operator LSLString(LSLFloat f)
|
public static explicit operator LSLString(LSLFloat f)
|
||||||
{
|
{
|
||||||
return new LSLString(f);
|
return new LSLString(f);
|
||||||
|
@ -1742,7 +1751,17 @@ namespace OpenSim.Region.ScriptEngine.Shared
|
||||||
public override bool Equals(Object o)
|
public override bool Equals(Object o)
|
||||||
{
|
{
|
||||||
if (!(o is LSLInteger))
|
if (!(o is LSLInteger))
|
||||||
return false;
|
{
|
||||||
|
if (o is int)
|
||||||
|
{
|
||||||
|
return value == (int)o;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return value == ((LSLInteger)o).value;
|
return value == ((LSLInteger)o).value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,11 +84,20 @@ namespace OpenSim.Services.AssetService
|
||||||
if (assetLoaderEnabled)
|
if (assetLoaderEnabled)
|
||||||
{
|
{
|
||||||
m_log.InfoFormat("[ASSET]: Loading default asset set from {0}", loaderArgs);
|
m_log.InfoFormat("[ASSET]: Loading default asset set from {0}", loaderArgs);
|
||||||
m_AssetLoader.ForEachDefaultXmlAsset(loaderArgs,
|
|
||||||
delegate(AssetBase a)
|
m_AssetLoader.ForEachDefaultXmlAsset(
|
||||||
|
loaderArgs,
|
||||||
|
delegate(AssetBase a)
|
||||||
|
{
|
||||||
|
AssetBase existingAsset = Get(a.ID);
|
||||||
|
// AssetMetadata existingMetadata = GetMetadata(a.ID);
|
||||||
|
|
||||||
|
if (existingAsset == null || Util.SHA1Hash(existingAsset.Data) != Util.SHA1Hash(a.Data))
|
||||||
{
|
{
|
||||||
|
// m_log.DebugFormat("[ASSET]: Storing {0} {1}", a.Name, a.ID);
|
||||||
Store(a);
|
Store(a);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
m_log.Info("[ASSET SERVICE]: Local asset service enabled");
|
m_log.Info("[ASSET SERVICE]: Local asset service enabled");
|
||||||
|
|
|
@ -63,7 +63,7 @@ namespace OpenSim.Services.GridService
|
||||||
protected GatekeeperServiceConnector m_GatekeeperConnector;
|
protected GatekeeperServiceConnector m_GatekeeperConnector;
|
||||||
|
|
||||||
protected UUID m_ScopeID = UUID.Zero;
|
protected UUID m_ScopeID = UUID.Zero;
|
||||||
protected bool m_Check4096 = true;
|
// protected bool m_Check4096 = true;
|
||||||
protected string m_MapTileDirectory = string.Empty;
|
protected string m_MapTileDirectory = string.Empty;
|
||||||
protected string m_ThisGatekeeper = string.Empty;
|
protected string m_ThisGatekeeper = string.Empty;
|
||||||
protected Uri m_ThisGatekeeperURI = null;
|
protected Uri m_ThisGatekeeperURI = null;
|
||||||
|
@ -121,7 +121,7 @@ namespace OpenSim.Services.GridService
|
||||||
if (scope != string.Empty)
|
if (scope != string.Empty)
|
||||||
UUID.TryParse(scope, out m_ScopeID);
|
UUID.TryParse(scope, out m_ScopeID);
|
||||||
|
|
||||||
m_Check4096 = gridConfig.GetBoolean("Check4096", true);
|
// m_Check4096 = gridConfig.GetBoolean("Check4096", true);
|
||||||
|
|
||||||
m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles");
|
m_MapTileDirectory = gridConfig.GetString("MapTileDirectory", "maptiles");
|
||||||
|
|
||||||
|
@ -347,14 +347,18 @@ namespace OpenSim.Services.GridService
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint x, y;
|
// We are now performing this check for each individual teleport in the EntityTransferModule instead. This
|
||||||
if (m_Check4096 && !Check4096(handle, out x, out y))
|
// allows us to give better feedback when teleports fail because of the distance reason (which can't be
|
||||||
{
|
// done here) and it also hypergrid teleports that are within range (possibly because the source grid
|
||||||
RemoveHyperlinkRegion(regInfo.RegionID);
|
// itself has regions that are very far apart).
|
||||||
reason = "Region is too far (" + x + ", " + y + ")";
|
// uint x, y;
|
||||||
m_log.Info("[HYPERGRID LINKER]: Unable to link, region is too far (" + x + ", " + y + ")");
|
// if (m_Check4096 && !Check4096(handle, out x, out y))
|
||||||
return false;
|
// {
|
||||||
}
|
// //RemoveHyperlinkRegion(regInfo.RegionID);
|
||||||
|
// reason = "Region is too far (" + x + ", " + y + ")";
|
||||||
|
// m_log.Info("[HYPERGRID LINKER]: Unable to link, region is too far (" + x + ", " + y + ")");
|
||||||
|
// //return false;
|
||||||
|
// }
|
||||||
|
|
||||||
regInfo.RegionID = regionID;
|
regInfo.RegionID = regionID;
|
||||||
|
|
||||||
|
@ -405,60 +409,59 @@ namespace OpenSim.Services.GridService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
// Not currently used
|
||||||
/// Cope with this viewer limitation.
|
// /// <summary>
|
||||||
/// </summary>
|
// /// Cope with this viewer limitation.
|
||||||
/// <param name="regInfo"></param>
|
// /// </summary>
|
||||||
/// <returns></returns>
|
// /// <param name="regInfo"></param>
|
||||||
public bool Check4096(ulong realHandle, out uint x, out uint y)
|
// /// <returns></returns>
|
||||||
{
|
// public bool Check4096(ulong realHandle, out uint x, out uint y)
|
||||||
uint ux = 0, uy = 0;
|
// {
|
||||||
Utils.LongToUInts(realHandle, out ux, out uy);
|
// uint ux = 0, uy = 0;
|
||||||
x = ux / Constants.RegionSize;
|
// Utils.LongToUInts(realHandle, out ux, out uy);
|
||||||
y = uy / Constants.RegionSize;
|
// x = ux / Constants.RegionSize;
|
||||||
|
// y = uy / Constants.RegionSize;
|
||||||
const uint limit = (4096 - 1) * Constants.RegionSize;
|
//
|
||||||
uint xmin = ux - limit;
|
// const uint limit = (4096 - 1) * Constants.RegionSize;
|
||||||
uint xmax = ux + limit;
|
// uint xmin = ux - limit;
|
||||||
uint ymin = uy - limit;
|
// uint xmax = ux + limit;
|
||||||
uint ymax = uy + limit;
|
// uint ymin = uy - limit;
|
||||||
// World map boundary checks
|
// uint ymax = uy + limit;
|
||||||
if (xmin < 0 || xmin > ux)
|
// // World map boundary checks
|
||||||
xmin = 0;
|
// if (xmin < 0 || xmin > ux)
|
||||||
if (xmax > int.MaxValue || xmax < ux)
|
// xmin = 0;
|
||||||
xmax = int.MaxValue;
|
// if (xmax > int.MaxValue || xmax < ux)
|
||||||
if (ymin < 0 || ymin > uy)
|
// xmax = int.MaxValue;
|
||||||
ymin = 0;
|
// if (ymin < 0 || ymin > uy)
|
||||||
if (ymax > int.MaxValue || ymax < uy)
|
// ymin = 0;
|
||||||
ymax = int.MaxValue;
|
// if (ymax > int.MaxValue || ymax < uy)
|
||||||
|
// ymax = int.MaxValue;
|
||||||
// Check for any regions that are within the possible teleport range to the linked region
|
//
|
||||||
List<GridRegion> regions = m_GridService.GetRegionRange(m_ScopeID, (int)xmin, (int)xmax, (int)ymin, (int)ymax);
|
// // Check for any regions that are within the possible teleport range to the linked region
|
||||||
if (regions.Count == 0)
|
// List<GridRegion> regions = m_GridService.GetRegionRange(m_ScopeID, (int)xmin, (int)xmax, (int)ymin, (int)ymax);
|
||||||
{
|
// if (regions.Count == 0)
|
||||||
return false;
|
// {
|
||||||
}
|
// return false;
|
||||||
else
|
// }
|
||||||
{
|
// else
|
||||||
// Check for regions which are not linked regions
|
// {
|
||||||
List<GridRegion> hyperlinks = m_GridService.GetHyperlinks(m_ScopeID);
|
// // Check for regions which are not linked regions
|
||||||
IEnumerable<GridRegion> availableRegions = regions.Except(hyperlinks);
|
// List<GridRegion> hyperlinks = m_GridService.GetHyperlinks(m_ScopeID);
|
||||||
if (availableRegions.Count() == 0)
|
// IEnumerable<GridRegion> availableRegions = regions.Except(hyperlinks);
|
||||||
return false;
|
// if (availableRegions.Count() == 0)
|
||||||
}
|
// return false;
|
||||||
|
// }
|
||||||
return true;
|
//
|
||||||
}
|
// return true;
|
||||||
|
// }
|
||||||
|
|
||||||
private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle)
|
private void AddHyperlinkRegion(GridRegion regionInfo, ulong regionHandle)
|
||||||
{
|
{
|
||||||
|
|
||||||
RegionData rdata = m_GridService.RegionInfo2RegionData(regionInfo);
|
RegionData rdata = m_GridService.RegionInfo2RegionData(regionInfo);
|
||||||
int flags = (int)OpenSim.Data.RegionFlags.Hyperlink + (int)OpenSim.Data.RegionFlags.NoDirectLogin + (int)OpenSim.Data.RegionFlags.RegionOnline;
|
int flags = (int)OpenSim.Data.RegionFlags.Hyperlink + (int)OpenSim.Data.RegionFlags.NoDirectLogin + (int)OpenSim.Data.RegionFlags.RegionOnline;
|
||||||
rdata.Data["flags"] = flags.ToString();
|
rdata.Data["flags"] = flags.ToString();
|
||||||
|
|
||||||
m_Database.Store(rdata);
|
m_Database.Store(rdata);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RemoveHyperlinkRegion(UUID regionID)
|
private void RemoveHyperlinkRegion(UUID regionID)
|
||||||
|
|
|
@ -326,7 +326,6 @@ namespace OpenSim.Services.HypergridService
|
||||||
// This is recursive!!!!!
|
// This is recursive!!!!!
|
||||||
return TrySendInstantMessage(im, url, false, foreigner);
|
return TrySendInstantMessage(im, url, false, foreigner);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool UndeliveredMessage(GridInstantMessage im)
|
private bool UndeliveredMessage(GridInstantMessage im)
|
||||||
|
@ -335,11 +334,10 @@ namespace OpenSim.Services.HypergridService
|
||||||
&& (!im.fromGroup || (im.fromGroup && m_ForwardOfflineGroupMessages)))
|
&& (!im.fromGroup || (im.fromGroup && m_ForwardOfflineGroupMessages)))
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[HG IM SERVICE]: Message saved");
|
m_log.DebugFormat("[HG IM SERVICE]: Message saved");
|
||||||
return SynchronousRestObjectPoster.BeginPostObject<GridInstantMessage, bool>(
|
|
||||||
|
return SynchronousRestObjectRequester.MakeRequest<GridInstantMessage, bool>(
|
||||||
"POST", m_RestURL + "/SaveMessage/", im);
|
"POST", m_RestURL + "/SaveMessage/", im);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -83,9 +83,24 @@ namespace OpenSim.Services.UserAccountService
|
||||||
"create user",
|
"create user",
|
||||||
"create user [<first> [<last> [<pass> [<email>]]]]",
|
"create user [<first> [<last> [<pass> [<email>]]]]",
|
||||||
"Create a new user", HandleCreateUser);
|
"Create a new user", HandleCreateUser);
|
||||||
MainConsole.Instance.Commands.AddCommand("UserService", false, "reset user password",
|
|
||||||
|
MainConsole.Instance.Commands.AddCommand("UserService", false,
|
||||||
|
"reset user password",
|
||||||
"reset user password [<first> [<last> [<password>]]]",
|
"reset user password [<first> [<last> [<password>]]]",
|
||||||
"Reset a user password", HandleResetUserPassword);
|
"Reset a user password", HandleResetUserPassword);
|
||||||
|
|
||||||
|
MainConsole.Instance.Commands.AddCommand("UserService", false,
|
||||||
|
"set user level",
|
||||||
|
"set user level [<first> [<last> [<level>]]]",
|
||||||
|
"Set user level. If >= 200 and 'allow_grid_gods = true' in OpenSim.ini, "
|
||||||
|
+ "this account will be treated as god-moded. "
|
||||||
|
+ "It will also affect the 'login level' command. ",
|
||||||
|
HandleSetUserLevel);
|
||||||
|
|
||||||
|
MainConsole.Instance.Commands.AddCommand("UserService", false,
|
||||||
|
"show account",
|
||||||
|
"show account <first> <last>",
|
||||||
|
"Show account details for the given user", HandleShowAccount);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -318,6 +333,36 @@ namespace OpenSim.Services.UserAccountService
|
||||||
CreateUser(firstName, lastName, password, email);
|
CreateUser(firstName, lastName, password, email);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void HandleShowAccount(string module, string[] cmdparams)
|
||||||
|
{
|
||||||
|
if (cmdparams.Length != 4)
|
||||||
|
{
|
||||||
|
MainConsole.Instance.Output("Usage: show account <first-name> <last-name>");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string firstName = cmdparams[2];
|
||||||
|
string lastName = cmdparams[3];
|
||||||
|
|
||||||
|
UserAccount ua = GetUserAccount(UUID.Zero, firstName, lastName);
|
||||||
|
|
||||||
|
if (ua == null)
|
||||||
|
{
|
||||||
|
MainConsole.Instance.OutputFormat("No user named {0} {1}", firstName, lastName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MainConsole.Instance.OutputFormat("Name: {0}", ua.Name);
|
||||||
|
MainConsole.Instance.OutputFormat("ID: {0}", ua.PrincipalID);
|
||||||
|
MainConsole.Instance.OutputFormat("Title: {0}", ua.UserTitle);
|
||||||
|
MainConsole.Instance.OutputFormat("E-mail: {0}", ua.Email);
|
||||||
|
MainConsole.Instance.OutputFormat("Created: {0}", Utils.UnixTimeToDateTime(ua.Created));
|
||||||
|
MainConsole.Instance.OutputFormat("Level: {0}", ua.UserLevel);
|
||||||
|
MainConsole.Instance.OutputFormat("Flags: {0}", ua.UserFlags);
|
||||||
|
foreach (KeyValuePair<string, Object> kvp in ua.ServiceURLs)
|
||||||
|
MainConsole.Instance.OutputFormat("{0}: {1}", kvp.Key, kvp.Value);
|
||||||
|
}
|
||||||
|
|
||||||
protected void HandleResetUserPassword(string module, string[] cmdparams)
|
protected void HandleResetUserPassword(string module, string[] cmdparams)
|
||||||
{
|
{
|
||||||
string firstName;
|
string firstName;
|
||||||
|
@ -338,16 +383,58 @@ namespace OpenSim.Services.UserAccountService
|
||||||
|
|
||||||
UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName);
|
UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName);
|
||||||
if (account == null)
|
if (account == null)
|
||||||
m_log.ErrorFormat("[USER ACCOUNT SERVICE]: No such user");
|
{
|
||||||
|
MainConsole.Instance.OutputFormat("No such user as {0} {1}", firstName, lastName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
bool success = false;
|
bool success = false;
|
||||||
if (m_AuthenticationService != null)
|
if (m_AuthenticationService != null)
|
||||||
success = m_AuthenticationService.SetPassword(account.PrincipalID, newPassword);
|
success = m_AuthenticationService.SetPassword(account.PrincipalID, newPassword);
|
||||||
|
|
||||||
if (!success)
|
if (!success)
|
||||||
m_log.ErrorFormat("[USER ACCOUNT SERVICE]: Unable to reset password for account {0} {1}.",
|
MainConsole.Instance.OutputFormat("Unable to reset password for account {0} {1}.", firstName, lastName);
|
||||||
firstName, lastName);
|
|
||||||
else
|
else
|
||||||
m_log.InfoFormat("[USER ACCOUNT SERVICE]: Password reset for user {0} {1}", firstName, lastName);
|
MainConsole.Instance.OutputFormat("Password reset for user {0} {1}", firstName, lastName);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void HandleSetUserLevel(string module, string[] cmdparams)
|
||||||
|
{
|
||||||
|
string firstName;
|
||||||
|
string lastName;
|
||||||
|
string rawLevel;
|
||||||
|
int level;
|
||||||
|
|
||||||
|
if (cmdparams.Length < 4)
|
||||||
|
firstName = MainConsole.Instance.CmdPrompt("First name");
|
||||||
|
else firstName = cmdparams[3];
|
||||||
|
|
||||||
|
if (cmdparams.Length < 5)
|
||||||
|
lastName = MainConsole.Instance.CmdPrompt("Last name");
|
||||||
|
else lastName = cmdparams[4];
|
||||||
|
|
||||||
|
UserAccount account = GetUserAccount(UUID.Zero, firstName, lastName);
|
||||||
|
if (account == null) {
|
||||||
|
MainConsole.Instance.OutputFormat("No such user");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmdparams.Length < 6)
|
||||||
|
rawLevel = MainConsole.Instance.CmdPrompt("User level");
|
||||||
|
else rawLevel = cmdparams[5];
|
||||||
|
|
||||||
|
if(int.TryParse(rawLevel, out level) == false) {
|
||||||
|
MainConsole.Instance.OutputFormat("Invalid user level");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
account.UserLevel = level;
|
||||||
|
|
||||||
|
bool success = StoreUserAccount(account);
|
||||||
|
if (!success)
|
||||||
|
MainConsole.Instance.OutputFormat("Unable to set user level for account {0} {1}.", firstName, lastName);
|
||||||
|
else
|
||||||
|
MainConsole.Instance.OutputFormat("User level set for user {0} {1} to {2}", firstName, lastName, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
@ -36,6 +36,15 @@ namespace OpenSim.Tests.Common
|
||||||
{
|
{
|
||||||
public class AssetHelpers
|
public class AssetHelpers
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Create a notecard asset with a random uuids and dummy text.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static AssetBase CreateAsset()
|
||||||
|
{
|
||||||
|
return CreateAsset(UUID.Random(), AssetType.Notecard, "hello", UUID.Random());
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a notecard asset with a random uuid and dummy text.
|
/// Create a notecard asset with a random uuid and dummy text.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -341,9 +341,9 @@ namespace OpenSim.Tests.Common
|
||||||
/// <param name="scene"></param>
|
/// <param name="scene"></param>
|
||||||
/// <param name="agentId"></param>
|
/// <param name="agentId"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static TestClient AddRootAgent(Scene scene, UUID agentId)
|
public static TestClient AddClient(Scene scene, UUID agentId)
|
||||||
{
|
{
|
||||||
return AddRootAgent(scene, GenerateAgentData(agentId));
|
return AddClient(scene, GenerateAgentData(agentId));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -364,7 +364,7 @@ namespace OpenSim.Tests.Common
|
||||||
/// <param name="scene"></param>
|
/// <param name="scene"></param>
|
||||||
/// <param name="agentData"></param>
|
/// <param name="agentData"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static TestClient AddRootAgent(Scene scene, AgentCircuitData agentData)
|
public static TestClient AddClient(Scene scene, AgentCircuitData agentData)
|
||||||
{
|
{
|
||||||
string reason;
|
string reason;
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using OpenMetaverse;
|
||||||
|
|
||||||
namespace OpenSim.Tests.Common
|
namespace OpenSim.Tests.Common
|
||||||
{
|
{
|
||||||
|
@ -56,5 +57,15 @@ namespace OpenSim.Tests.Common
|
||||||
Console.WriteLine();
|
Console.WriteLine();
|
||||||
Console.WriteLine("===> In Test Method : {0} <===", stackTrace.GetFrame(1).GetMethod().Name);
|
Console.WriteLine("===> In Test Method : {0} <===", stackTrace.GetFrame(1).GetMethod().Name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Parse tail section into full UUID.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tail"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static UUID ParseTail(int tail)
|
||||||
|
{
|
||||||
|
return new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", tail));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -239,7 +239,7 @@ namespace OpenSim.Tools.Configger
|
||||||
config.Set("meshing", "Meshmerizer");
|
config.Set("meshing", "Meshmerizer");
|
||||||
config.Set("physical_prim", true);
|
config.Set("physical_prim", true);
|
||||||
config.Set("see_into_this_sim_from_neighbor", true);
|
config.Set("see_into_this_sim_from_neighbor", true);
|
||||||
config.Set("serverside_object_permissions", false);
|
config.Set("serverside_object_permissions", true);
|
||||||
config.Set("storage_plugin", "OpenSim.Data.SQLite.dll");
|
config.Set("storage_plugin", "OpenSim.Data.SQLite.dll");
|
||||||
config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3");
|
config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3");
|
||||||
config.Set("storage_prim_inventories", true);
|
config.Set("storage_prim_inventories", true);
|
||||||
|
|
|
@ -78,20 +78,19 @@
|
||||||
; DrawPrimOnMapTile = true
|
; DrawPrimOnMapTile = true
|
||||||
|
|
||||||
;# {NonPhysicalPrimMax} {} {Maximum size of nonphysical prims?} {} 256
|
;# {NonPhysicalPrimMax} {} {Maximum size of nonphysical prims?} {} 256
|
||||||
;; Maximum size for non-physical prims
|
;; Maximum size for non-physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonphysicalPrimMax!).
|
||||||
; NonPhysicalPrimMax = 256
|
; NonPhysicalPrimMax = 256
|
||||||
|
|
||||||
;# {PhysicalPrimMax} {} {Maximum size of physical prims?} {} 10
|
;# {PhysicalPrimMax} {} {Maximum size of physical prims?} {} 10
|
||||||
;; Maximum size where a prim can be physical
|
;; Maximum size where a prim can be physical. Affects resizing of existing prims. This can be overriden in the region config file.
|
||||||
; PhysicalPrimMax = 10
|
; PhysicalPrimMax = 10
|
||||||
|
|
||||||
;; Prevent the creation, import and rez of prims that exceed the
|
;; If a viewer attempts to rez a prim larger than the non-physical or physical prim max, clamp the dimensions to the appropriate maximum
|
||||||
;; maximum size.
|
;; This can be overriden in the region config file.
|
||||||
; ClampPrimSize = false
|
; ClampPrimSize = false
|
||||||
|
|
||||||
;# {AllowScriptCrossing} {} {Allow scripts to cross into this region} {true false} false
|
;# {AllowScriptCrossing} {} {Allow scripts to cross into this region} {true false} false
|
||||||
;; Allow scripts to cross region boundaries. These are recompiled on the
|
;; Allow scripts to keep running when they cross region boundaries, rather than being restarted. Script code is recompiled on the destination region and the state reloaded.
|
||||||
;; new region.
|
|
||||||
; AllowScriptCrossing = false
|
; AllowScriptCrossing = false
|
||||||
|
|
||||||
;# {TrustBinaries} {AllowScriptCrossing:true} {Accept compiled binary script code? (DANGEROUS!)} {true false} false
|
;# {TrustBinaries} {AllowScriptCrossing:true} {Accept compiled binary script code? (DANGEROUS!)} {true false} false
|
||||||
|
@ -173,7 +172,7 @@
|
||||||
;; permission checks (allowing anybody to copy
|
;; permission checks (allowing anybody to copy
|
||||||
;; any item, etc. This may not yet be implemented uniformally.
|
;; any item, etc. This may not yet be implemented uniformally.
|
||||||
;; If set to true, then all permissions checks are carried out
|
;; If set to true, then all permissions checks are carried out
|
||||||
; serverside_object_permissions = false
|
; serverside_object_permissions = true
|
||||||
|
|
||||||
;; This allows users with a UserLevel of 200 or more to assume god
|
;; This allows users with a UserLevel of 200 or more to assume god
|
||||||
;; powers in the regions in this simulator.
|
;; powers in the regions in this simulator.
|
||||||
|
@ -292,28 +291,31 @@
|
||||||
;; building's lights to possibly not be rendered.
|
;; building's lights to possibly not be rendered.
|
||||||
; DisableFacelights = "false"
|
; DisableFacelights = "false"
|
||||||
|
|
||||||
|
|
||||||
[ClientStack.LindenCaps]
|
[ClientStack.LindenCaps]
|
||||||
;; For the long list of capabilities, see OpenSimDefaults.ini
|
;; For the long list of capabilities, see OpenSimDefaults.ini
|
||||||
;; Here are the few ones you may want to change. Possible values
|
;; Here are the few ones you may want to change. Possible values
|
||||||
;; are:
|
;; are:
|
||||||
;; "" -- empty, capability disabled
|
;; "" -- empty, capability disabled
|
||||||
;; "localhost" -- capability enabled and served by the simulator
|
;; "localhost" -- capability enabled and served by the simulator
|
||||||
;; "<url>" -- capability enabled and served by some other server
|
;; "<url>" -- capability enabled and served by some other server
|
||||||
;;
|
;;
|
||||||
; These are enabled by default to localhost. Change if you see fit.
|
; These are enabled by default to localhost. Change if you see fit.
|
||||||
Cap_GetTexture = "localhost"
|
Cap_GetTexture = "localhost"
|
||||||
Cap_GetMesh = "localhost"
|
Cap_GetMesh = "localhost"
|
||||||
; This is disabled by default. Change if you see fit. Note that
|
; This is disabled by default. Change if you see fit. Note that
|
||||||
; serving this cap from the simulators may lead to poor performace.
|
; serving this cap from the simulators may lead to poor performace.
|
||||||
Cap_WebFetchInventoryDescendents = ""
|
Cap_WebFetchInventoryDescendents = ""
|
||||||
|
|
||||||
|
|
||||||
[SimulatorFeatures]
|
[SimulatorFeatures]
|
||||||
; Experimental new information sent in SimulatorFeatures cap for Kokua viewers
|
; Experimental new information sent in SimulatorFeatures cap for Kokua viewers
|
||||||
; meant to override the MapImage and search server url given at login, and varying
|
; meant to override the MapImage and search server url given at login, and varying
|
||||||
; on a sim-basis.
|
; on a sim-basis.
|
||||||
; Viewers that don't understand it, will ignore it
|
; Viewers that don't understand it, will ignore it
|
||||||
;MapImageServerURI = "http://127.0.0.1:9000/
|
;MapImageServerURI = "http://127.0.0.1:9000/
|
||||||
;SearchServerURI = "http://127.0.0.1:9000/
|
;SearchServerURI = "http://127.0.0.1:9000/
|
||||||
|
|
||||||
|
|
||||||
[Chat]
|
[Chat]
|
||||||
;# {whisper_distance} {} {Distance at which a whisper is heard, in meters?} {} 10
|
;# {whisper_distance} {} {Distance at which a whisper is heard, in meters?} {} 10
|
||||||
|
@ -443,8 +445,8 @@
|
||||||
;; to ConfigurableWind and uncomment the following.
|
;; to ConfigurableWind and uncomment the following.
|
||||||
; avg_strength = 5.0
|
; avg_strength = 5.0
|
||||||
; avg_direction = 0.0
|
; avg_direction = 0.0
|
||||||
; var_strength = 0.0
|
; var_strength = 5.0
|
||||||
; var_direction = 0.0
|
; var_direction = 30.0
|
||||||
; rate_change = 1.0
|
; rate_change = 1.0
|
||||||
|
|
||||||
;# {strength} {enabled:true wind_plugin:SimpleRandomWind} {Wind strength?} {} 1.0
|
;# {strength} {enabled:true wind_plugin:SimpleRandomWind} {Wind strength?} {} 1.0
|
||||||
|
@ -650,6 +652,7 @@
|
||||||
;; If using a remote connector, specify the server URL
|
;; If using a remote connector, specify the server URL
|
||||||
; FreeswitchServiceURL = http://my.grid.server:8004/fsapi
|
; FreeswitchServiceURL = http://my.grid.server:8004/fsapi
|
||||||
|
|
||||||
|
|
||||||
[Groups]
|
[Groups]
|
||||||
;# {Enabled} {} {Enable groups?} {true false} false
|
;# {Enabled} {} {Enable groups?} {true false} false
|
||||||
;; Enables the groups module
|
;; Enables the groups module
|
||||||
|
@ -707,11 +710,13 @@
|
||||||
;; Enable media on a prim facilities
|
;; Enable media on a prim facilities
|
||||||
; Enabled = true;
|
; Enabled = true;
|
||||||
|
|
||||||
|
|
||||||
[PrimLimitsModule]
|
[PrimLimitsModule]
|
||||||
;# {EnforcePrimLimits} {} {Enforce parcel prim limits} {true false} false
|
;# {EnforcePrimLimits} {} {Enforce parcel prim limits} {true false} false
|
||||||
;; Enable parcel prim limits. Off by default to emulate pre-existing behavior.
|
;; Enable parcel prim limits. Off by default to emulate pre-existing behavior.
|
||||||
; EnforcePrimLimits = false
|
; EnforcePrimLimits = false
|
||||||
|
|
||||||
|
|
||||||
[Architecture]
|
[Architecture]
|
||||||
;# {Include-Architecture} {} {Choose one of the following architectures} {config-include/Standalone.ini config-include/StandaloneHypergrid.ini config-include/Grid.ini config-include/GridHypergrid.ini config-include/SimianGrid.ini config-include/HyperSimianGrid.ini} config-include/Standalone.ini
|
;# {Include-Architecture} {} {Choose one of the following architectures} {config-include/Standalone.ini config-include/StandaloneHypergrid.ini config-include/Grid.ini config-include/GridHypergrid.ini config-include/SimianGrid.ini config-include/HyperSimianGrid.ini} config-include/Standalone.ini
|
||||||
;; Uncomment one of the following includes as required. For instance, to create a standalone OpenSim,
|
;; Uncomment one of the following includes as required. For instance, to create a standalone OpenSim,
|
||||||
|
|
|
@ -14,10 +14,13 @@
|
||||||
; Place to create a PID file
|
; Place to create a PID file
|
||||||
; PIDFile = "/tmp/my.pid"
|
; PIDFile = "/tmp/my.pid"
|
||||||
|
|
||||||
|
; Console commands run at startup
|
||||||
startup_console_commands_file = "startup_commands.txt"
|
startup_console_commands_file = "startup_commands.txt"
|
||||||
|
|
||||||
|
; Console commands run on shutdown
|
||||||
shutdown_console_commands_file = "shutdown_commands.txt"
|
shutdown_console_commands_file = "shutdown_commands.txt"
|
||||||
|
|
||||||
; To run a script every few minutes, set the script filename here
|
; Console commands run every 20 minutes
|
||||||
; timer_Script = "filename"
|
; timer_Script = "filename"
|
||||||
|
|
||||||
; ##
|
; ##
|
||||||
|
@ -70,12 +73,17 @@
|
||||||
; Use terrain texture for maptiles if true, use shaded green if false
|
; Use terrain texture for maptiles if true, use shaded green if false
|
||||||
TextureOnMapTile = false
|
TextureOnMapTile = false
|
||||||
|
|
||||||
; Maximum total size, and maximum size where a prim can be physical
|
; Maximum size of non physical prims. Affects resizing of existing prims. This can be overriden in the region config file (as NonphysicalPrimMax!).
|
||||||
NonPhysicalPrimMax = 256
|
NonPhysicalPrimMax = 256
|
||||||
PhysicalPrimMax = 10 ; (I think this was moved to the Regions.ini!)
|
|
||||||
|
; Maximum size of physical prims. Affects resizing of existing prims. This can be overriden in the region config file.
|
||||||
|
PhysicalPrimMax = 10
|
||||||
|
|
||||||
|
; If a viewer attempts to rez a prim larger than the non-physical or physical prim max, clamp the dimensions to the appropriate maximum
|
||||||
|
; This can be overriden in the region config file.
|
||||||
ClampPrimSize = false
|
ClampPrimSize = false
|
||||||
|
|
||||||
; Allow scripts to cross region boundaries. These are recompiled on the new region.
|
; Allow scripts to keep running when they cross region boundaries, rather than being restarted. Script code is recompiled on the destination region and the state reloaded.
|
||||||
AllowScriptCrossing = false
|
AllowScriptCrossing = false
|
||||||
|
|
||||||
; Allow compiled script binary code to cross region boundaries.
|
; Allow compiled script binary code to cross region boundaries.
|
||||||
|
@ -94,7 +102,7 @@
|
||||||
; neighbors on each side for a total of 49 regions in view. Warning, unless
|
; neighbors on each side for a total of 49 regions in view. Warning, unless
|
||||||
; all the regions have the same drawdistance, you will end up with strange
|
; all the regions have the same drawdistance, you will end up with strange
|
||||||
; effects because the agents that get closed may be inconsistent.
|
; effects because the agents that get closed may be inconsistent.
|
||||||
; DefaultDrawDistance = 255.0
|
DefaultDrawDistance = 255.0
|
||||||
|
|
||||||
; If you have only one region in an instance, or to avoid the many bugs
|
; If you have only one region in an instance, or to avoid the many bugs
|
||||||
; that you can trigger in modules by restarting a region, set this to
|
; that you can trigger in modules by restarting a region, set this to
|
||||||
|
@ -102,7 +110,7 @@
|
||||||
; This is meant to be used on systems where some external system like
|
; This is meant to be used on systems where some external system like
|
||||||
; Monit will restart any instance that exits, thereby making the shutdown
|
; Monit will restart any instance that exits, thereby making the shutdown
|
||||||
; into a restart.
|
; into a restart.
|
||||||
;InworldRestartShutsDown = false
|
InworldRestartShutsDown = false
|
||||||
|
|
||||||
; ##
|
; ##
|
||||||
; ## PRIM STORAGE
|
; ## PRIM STORAGE
|
||||||
|
@ -227,7 +235,6 @@
|
||||||
|
|
||||||
; If enabled, enableFlySlow will change the primary fly state to
|
; If enabled, enableFlySlow will change the primary fly state to
|
||||||
; FLYSLOW, and the "always run" state will be the regular fly.
|
; FLYSLOW, and the "always run" state will be the regular fly.
|
||||||
|
|
||||||
enableflyslow = false
|
enableflyslow = false
|
||||||
|
|
||||||
; PreJump is an additional animation state, but it probably
|
; PreJump is an additional animation state, but it probably
|
||||||
|
@ -236,7 +243,6 @@
|
||||||
|
|
||||||
; This is commented so it will come on automatically once it's
|
; This is commented so it will come on automatically once it's
|
||||||
; supported.
|
; supported.
|
||||||
|
|
||||||
; enableprejump = true
|
; enableprejump = true
|
||||||
|
|
||||||
; Simulator Stats URI
|
; Simulator Stats URI
|
||||||
|
@ -265,6 +271,7 @@
|
||||||
DelayBeforeAppearanceSave = 5
|
DelayBeforeAppearanceSave = 5
|
||||||
DelayBeforeAppearanceSend = 2
|
DelayBeforeAppearanceSend = 2
|
||||||
|
|
||||||
|
|
||||||
[SMTP]
|
[SMTP]
|
||||||
enabled=false
|
enabled=false
|
||||||
|
|
||||||
|
@ -504,6 +511,10 @@
|
||||||
; Distance in meters that shouts should travel. Default is 100m
|
; Distance in meters that shouts should travel. Default is 100m
|
||||||
shout_distance = 100
|
shout_distance = 100
|
||||||
|
|
||||||
|
[EntityTransfer]
|
||||||
|
; The maximum distance in regions that an agent is allowed to teleport along the x or y axis
|
||||||
|
; This is set to 4095 because current viewers can't handle teleports that are greater than this distance
|
||||||
|
max_distance = 4095
|
||||||
|
|
||||||
[Messaging]
|
[Messaging]
|
||||||
; Control which region module is used for instant messaging.
|
; Control which region module is used for instant messaging.
|
||||||
|
@ -855,11 +866,6 @@
|
||||||
;exclude_list=User 1,User 2,User 3
|
;exclude_list=User 1,User 2,User 3
|
||||||
|
|
||||||
|
|
||||||
[CMS]
|
|
||||||
enabled = false
|
|
||||||
;channel = 345
|
|
||||||
|
|
||||||
|
|
||||||
; The following settings control the progression of daytime
|
; The following settings control the progression of daytime
|
||||||
; in the Sim. The defaults are the same as the commented out settings
|
; in the Sim. The defaults are the same as the commented out settings
|
||||||
[Sun]
|
[Sun]
|
||||||
|
@ -1120,6 +1126,12 @@
|
||||||
;; Path to script assemblies
|
;; Path to script assemblies
|
||||||
; ScriptEnginesPath = "ScriptEngines"
|
; ScriptEnginesPath = "ScriptEngines"
|
||||||
|
|
||||||
|
; Whether to delete previously compiled scripts when the sim starts. If you disable this
|
||||||
|
; then startup will be faster. However, then it becomes your responsibility to delete the
|
||||||
|
; compiled scripts if OpenSim has changed enough that previously compiled scripts are no
|
||||||
|
; longer compatible.
|
||||||
|
DeleteScriptsOnStartup = true
|
||||||
|
|
||||||
|
|
||||||
[OpenGridProtocol]
|
[OpenGridProtocol]
|
||||||
;These are the settings for the Open Grid Protocol.. the Agent Domain, Region Domain, you know..
|
;These are the settings for the Open Grid Protocol.. the Agent Domain, Region Domain, you know..
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Place .ini files here to have them picked up automatically
|
|
|
@ -19,9 +19,12 @@
|
||||||
; 0 to disable
|
; 0 to disable
|
||||||
HitRateDisplay = 100
|
HitRateDisplay = 100
|
||||||
|
|
||||||
; Set to false for disk cache only.
|
; Set to false for no memory cache
|
||||||
MemoryCacheEnabled = false
|
MemoryCacheEnabled = false
|
||||||
|
|
||||||
|
; Set to false for no file cache
|
||||||
|
FileCacheEnabled = true
|
||||||
|
|
||||||
; How long {in hours} to keep assets cached in memory, .5 == 30 minutes
|
; How long {in hours} to keep assets cached in memory, .5 == 30 minutes
|
||||||
; Optimization: for VPS or limited memory system installs set Timeout to .016 (1 minute)
|
; Optimization: for VPS or limited memory system installs set Timeout to .016 (1 minute)
|
||||||
; increases performance without large memory impact
|
; increases performance without large memory impact
|
||||||
|
|
|
@ -28,19 +28,19 @@
|
||||||
AssetLoaderArgs = "assets/AssetSets.xml"
|
AssetLoaderArgs = "assets/AssetSets.xml"
|
||||||
|
|
||||||
;
|
;
|
||||||
; change this to your grid-wide asset server
|
; Change this to your grid-wide asset server. Do not add a slash to the end of any of these addresses.
|
||||||
;
|
;
|
||||||
AssetServerURI = "http://myassetserver.com:8003"
|
AssetServerURI = "http://myassetserver.com:8003"
|
||||||
|
|
||||||
[InventoryService]
|
[InventoryService]
|
||||||
;
|
;
|
||||||
; change this to your grid-wide inventory server
|
; Change this to your grid-wide inventory server
|
||||||
;
|
;
|
||||||
InventoryServerURI = "http://myinventoryserver.com:8003"
|
InventoryServerURI = "http://myinventoryserver.com:8003"
|
||||||
|
|
||||||
[GridService]
|
[GridService]
|
||||||
;
|
;
|
||||||
; change this to your grid-wide grid server
|
; Change this to your grid-wide grid server
|
||||||
;
|
;
|
||||||
GridServerURI = "http://mygridserver.com:8003"
|
GridServerURI = "http://mygridserver.com:8003"
|
||||||
;AllowHypergridMapSearch = true
|
;AllowHypergridMapSearch = true
|
||||||
|
@ -49,51 +49,51 @@
|
||||||
; MapTileDirectory = "./maptiles"
|
; MapTileDirectory = "./maptiles"
|
||||||
|
|
||||||
; === HG ONLY ===
|
; === HG ONLY ===
|
||||||
;; change this to the address of your Gatekeeper service
|
;; Change this to the address of your Gatekeeper service
|
||||||
;; (usually bundled with the rest of the services in one
|
;; (usually bundled with the rest of the services in one
|
||||||
;; Robust server in port 8002, but not always)
|
;; Robust server in port 8002, but not always)
|
||||||
Gatekeeper="http://mygridserver.com:8002"
|
Gatekeeper="http://mygridserver.com:8002"
|
||||||
|
|
||||||
[Messaging]
|
[Messaging]
|
||||||
; === HG ONLY ===
|
; === HG ONLY ===
|
||||||
;; change this to the address of your Gatekeeper service
|
;; Change this to the address of your Gatekeeper service
|
||||||
;; (usually bundled with the rest of the services in one
|
;; (usually bundled with the rest of the services in one
|
||||||
;; Robust server in port 8002, but not always)
|
;; Robust server in port 8002, but not always)
|
||||||
Gatekeeper = "http://mygridserver.com:8002"
|
Gatekeeper = "http://mygridserver.com:8002"
|
||||||
|
|
||||||
[AvatarService]
|
[AvatarService]
|
||||||
;
|
;
|
||||||
; change this to your grid-wide grid server
|
; Change this to your grid-wide grid server
|
||||||
;
|
;
|
||||||
AvatarServerURI = "http://mygridserver.com:8003"
|
AvatarServerURI = "http://mygridserver.com:8003"
|
||||||
|
|
||||||
[PresenceService]
|
[PresenceService]
|
||||||
;
|
;
|
||||||
; change this to your grid-wide presence server
|
; Change this to your grid-wide presence server
|
||||||
;
|
;
|
||||||
PresenceServerURI = "http://mygridserver.com:8003"
|
PresenceServerURI = "http://mygridserver.com:8003"
|
||||||
|
|
||||||
[UserAccountService]
|
[UserAccountService]
|
||||||
;
|
;
|
||||||
; change this to your grid-wide user accounts server
|
; Change this to your grid-wide user accounts server
|
||||||
;
|
;
|
||||||
UserAccountServerURI = "http://mygridserver.com:8003"
|
UserAccountServerURI = "http://mygridserver.com:8003"
|
||||||
|
|
||||||
[GridUserService]
|
[GridUserService]
|
||||||
;
|
;
|
||||||
; change this to your grid-wide user accounts server
|
; Change this to your grid-wide user accounts server
|
||||||
;
|
;
|
||||||
GridUserServerURI = "http://mygridserver.com:8003"
|
GridUserServerURI = "http://mygridserver.com:8003"
|
||||||
|
|
||||||
[AuthenticationService]
|
[AuthenticationService]
|
||||||
;
|
;
|
||||||
; change this to your grid-wide authentication server
|
; Change this to your grid-wide authentication server
|
||||||
;
|
;
|
||||||
AuthenticationServerURI = "http://mygridserver.com:8003"
|
AuthenticationServerURI = "http://mygridserver.com:8003"
|
||||||
|
|
||||||
[FriendsService]
|
[FriendsService]
|
||||||
;
|
;
|
||||||
; change this to your grid-wide friends server
|
; Change this to your grid-wide friends server
|
||||||
;
|
;
|
||||||
FriendsServerURI = "http://mygridserver.com:8003"
|
FriendsServerURI = "http://mygridserver.com:8003"
|
||||||
|
|
||||||
|
@ -104,10 +104,10 @@
|
||||||
; accessible from other grids
|
; accessible from other grids
|
||||||
;
|
;
|
||||||
ProfileServerURI = "http://mygridserver.com:8002/user"
|
ProfileServerURI = "http://mygridserver.com:8002/user"
|
||||||
Gatekeeper = "http://mygridserver.com:8002"
|
Gatekeeper = "http://mygridserver.com:8002"
|
||||||
;; If you want to protect your assets from being copied by foreign visitors
|
;; If you want to protect your assets from being copied by foreign visitors
|
||||||
;; uncomment the next line. You may want to do this on sims that have licensed content.
|
;; uncomment the next line. You may want to do this on sims that have licensed content.
|
||||||
; OutboundPermission = False
|
; OutboundPermission = False
|
||||||
|
|
||||||
[UserAgentService]
|
[UserAgentService]
|
||||||
;
|
;
|
||||||
|
|
|
@ -63,9 +63,6 @@
|
||||||
;;--- For MySql region storage (alternative)
|
;;--- For MySql region storage (alternative)
|
||||||
;StorageProvider = "OpenSim.Data.MySQL.dll:MySqlRegionData"
|
;StorageProvider = "OpenSim.Data.MySQL.dll:MySqlRegionData"
|
||||||
|
|
||||||
;; With hypergrid, perform distance check for the creation of a linked region
|
|
||||||
; Check4096 = true
|
|
||||||
|
|
||||||
;; Directory for map tile images of remote regions
|
;; Directory for map tile images of remote regions
|
||||||
; MapTileDirectory = "./maptiles"
|
; MapTileDirectory = "./maptiles"
|
||||||
|
|
||||||
|
|
23
prebuild.xml
23
prebuild.xml
|
@ -2988,6 +2988,8 @@
|
||||||
<Files>
|
<Files>
|
||||||
<!-- SADLY the way this works means you need to keep adding these paths -->
|
<!-- SADLY the way this works means you need to keep adding these paths -->
|
||||||
<Match path="Agent/TextureSender/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="Agent/TextureSender/Tests" pattern="*.cs" recurse="true"/>
|
||||||
|
<Match path="Asset/Tests" pattern="*.cs" recurse="true"/>
|
||||||
|
<Match path="Avatar/AvatarFactory/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="Avatar/Inventory/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="Framework/InventoryAccess/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="Framework/InventoryAccess/Tests" pattern="*.cs" recurse="true"/>
|
||||||
<Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="World/Archiver/Tests" pattern="*.cs" recurse="true"/>
|
||||||
|
@ -3032,6 +3034,7 @@
|
||||||
<Reference name="OpenSim.Region.CoreModules"/>
|
<Reference name="OpenSim.Region.CoreModules"/>
|
||||||
<Reference name="OpenSim.Region.OptionalModules"/>
|
<Reference name="OpenSim.Region.OptionalModules"/>
|
||||||
<Reference name="OpenSim.Region.Physics.Manager"/>
|
<Reference name="OpenSim.Region.Physics.Manager"/>
|
||||||
|
<Reference name="OpenSim.Services.AvatarService"/>
|
||||||
<Reference name="OpenSim.Services.Interfaces"/>
|
<Reference name="OpenSim.Services.Interfaces"/>
|
||||||
|
|
||||||
<!-- Unit tests -->
|
<!-- Unit tests -->
|
||||||
|
@ -3055,6 +3058,7 @@
|
||||||
<Files>
|
<Files>
|
||||||
<!-- SADLY the way this works means you need to keep adding these paths -->
|
<!-- SADLY the way this works means you need to keep adding these paths -->
|
||||||
<Match path="Avatar/XmlRpcGroups/Tests" pattern="*.cs" recurse="true"/>
|
<Match path="Avatar/XmlRpcGroups/Tests" pattern="*.cs" recurse="true"/>
|
||||||
|
<Match path="World/NPC/Tests" pattern="*.cs" recurse="true"/>
|
||||||
</Files>
|
</Files>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
||||||
|
@ -3197,31 +3201,32 @@
|
||||||
TODO: this is kind of lame, we basically build a duplicate
|
TODO: this is kind of lame, we basically build a duplicate
|
||||||
assembly but with tests added in, just because we can't resolve cross-bin-dir-refs.
|
assembly but with tests added in, just because we can't resolve cross-bin-dir-refs.
|
||||||
-->
|
-->
|
||||||
<Project frameworkVersion="v3_5" name="OpenSim.Region.Physics.OdePlugin.Tests" path="OpenSim/Region/Physics/OdePlugin" type="Library">
|
<Project frameworkVersion="v3_5" name="OpenSim.Region.Physics.OdePlugin.Tests" path="OpenSim/Region/Physics/OdePlugin/Tests" type="Library">
|
||||||
<Configuration name="Debug">
|
<Configuration name="Debug">
|
||||||
<Options>
|
<Options>
|
||||||
<OutputPath>../../../../bin/</OutputPath>
|
<OutputPath>../../../../../bin/</OutputPath>
|
||||||
</Options>
|
</Options>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
<Configuration name="Release">
|
<Configuration name="Release">
|
||||||
<Options>
|
<Options>
|
||||||
<OutputPath>../../../../bin/</OutputPath>
|
<OutputPath>../../../../../bin/</OutputPath>
|
||||||
</Options>
|
</Options>
|
||||||
</Configuration>
|
</Configuration>
|
||||||
|
|
||||||
<ReferencePath>../../../../bin/</ReferencePath>
|
<ReferencePath>../../../../../bin/</ReferencePath>
|
||||||
<Reference name="System"/>
|
<Reference name="System"/>
|
||||||
<Reference name="System.Core"/>
|
<Reference name="System.Core"/>
|
||||||
<Reference name="OpenMetaverseTypes" path="../../../../bin/"/>
|
<Reference name="OpenMetaverseTypes" path="../../../../../bin/"/>
|
||||||
<Reference name="Nini" path="../../../../bin/"/>
|
<Reference name="Nini" path="../../../../../bin/"/>
|
||||||
<Reference name="OpenSim.Framework"/>
|
<Reference name="OpenSim.Framework"/>
|
||||||
<Reference name="OpenSim.Framework.Console"/>
|
<Reference name="OpenSim.Framework.Console"/>
|
||||||
<Reference name="OpenSim.Region.CoreModules"/>
|
<Reference name="OpenSim.Region.CoreModules"/>
|
||||||
<Reference name="OpenSim.Region.Framework"/>
|
<Reference name="OpenSim.Region.Framework"/>
|
||||||
<Reference name="OpenSim.Region.Physics.Manager"/>
|
<Reference name="OpenSim.Region.Physics.Manager"/>
|
||||||
<Reference name="Ode.NET" path="../../../../bin/"/>
|
<Reference name="OpenSim.Region.Physics.OdePlugin" path="../../../../../bin/Physics/"/>
|
||||||
<Reference name="nunit.framework" path="../../../../bin/"/>
|
<Reference name="Ode.NET" path="../../../../../bin/"/>
|
||||||
<Reference name="log4net" path="../../../../bin/"/>
|
<Reference name="nunit.framework" path="../../../../../bin/"/>
|
||||||
|
<Reference name="log4net" path="../../../../../bin/"/>
|
||||||
|
|
||||||
<Files>
|
<Files>
|
||||||
<Match pattern="*.cs" recurse="true"/>
|
<Match pattern="*.cs" recurse="true"/>
|
||||||
|
|
Loading…
Reference in New Issue