Merge branch 'master' into careminster

Conflicts:
	OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
avinationmerge
Melanie 2013-02-07 01:40:11 +00:00
commit 375114bea3
10 changed files with 152 additions and 29 deletions

View File

@ -73,6 +73,14 @@ namespace OpenSim.Framework
m_map = (OSDMap)OSDParser.DeserializeLLSDXml(rawXml); m_map = (OSDMap)OSDParser.DeserializeLLSDXml(rawXml);
} }
// WARNING: this is temporary for experimentation only, it will be removed!!!!
public OSDMap TopLevelMap
{
get { return m_map; }
set { m_map = value; }
}
public void ReadXml(XmlReader reader) public void ReadXml(XmlReader reader)
{ {
ReadXml(reader.ReadInnerXml()); ReadXml(reader.ReadInnerXml());
@ -168,6 +176,10 @@ namespace OpenSim.Framework
} }
} }
/// <summary>
/// Validate the key used for storing separate data stores.
/// </summary>
/// <param name='key'></param>
private static void ValidateKey(string key) private static void ValidateKey(string key)
{ {
if (key.Length < MIN_STORE_NAME_LENGTH) if (key.Length < MIN_STORE_NAME_LENGTH)
@ -189,6 +201,7 @@ namespace OpenSim.Framework
public void Add(KeyValuePair<string, OSDMap> kvp) public void Add(KeyValuePair<string, OSDMap> kvp)
{ {
ValidateKey(kvp.Key);
lock (this) lock (this)
m_map.Add(kvp.Key, kvp.Value); m_map.Add(kvp.Key, kvp.Value);
} }

View File

@ -45,6 +45,7 @@ using System.Text.RegularExpressions;
using System.Xml; using System.Xml;
using System.Threading; using System.Threading;
using log4net; using log4net;
using log4net.Appender;
using Nini.Config; using Nini.Config;
using Nwc.XmlRpc; using Nwc.XmlRpc;
using OpenMetaverse; using OpenMetaverse;
@ -828,9 +829,22 @@ namespace OpenSim.Framework
return "."; return ".";
} }
public static string logFile()
{
foreach (IAppender appender in LogManager.GetRepository().GetAppenders())
{
if (appender is FileAppender)
{
return ((FileAppender)appender).File;
}
}
return "./OpenSim.log";
}
public static string logDir() public static string logDir()
{ {
return "."; return Path.GetDirectoryName(logFile());
} }
// From: http://coercedcode.blogspot.com/2008/03/c-generate-unique-filenames-within.html // From: http://coercedcode.blogspot.com/2008/03/c-generate-unique-filenames-within.html

View File

@ -35,6 +35,7 @@ namespace OpenSim.Region.Framework.Interfaces
public interface IJsonStoreModule public interface IJsonStoreModule
{ {
bool AttachObjectStore(UUID objectID);
bool CreateStore(string value, ref UUID result); bool CreateStore(string value, ref UUID result);
bool DestroyStore(UUID storeID); bool DestroyStore(UUID storeID);
bool TestStore(UUID storeID); bool TestStore(UUID storeID);

View File

@ -49,7 +49,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
private static readonly ILog m_log = private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private OSD m_ValueStore; protected virtual OSD ValueStore { get; set; }
protected class TakeValueCallbackClass protected class TakeValueCallbackClass
{ {
@ -108,17 +108,18 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
/// ///
/// </summary> /// </summary>
// ----------------------------------------------------------------- // -----------------------------------------------------------------
public JsonStore() : this("") {} public JsonStore()
public JsonStore(string value)
{ {
m_TakeStore = new List<TakeValueCallbackClass>(); m_TakeStore = new List<TakeValueCallbackClass>();
m_ReadStore = new List<TakeValueCallbackClass>(); m_ReadStore = new List<TakeValueCallbackClass>();
}
public JsonStore(string value)
{
if (String.IsNullOrEmpty(value)) if (String.IsNullOrEmpty(value))
m_ValueStore = new OSDMap(); ValueStore = new OSDMap();
else else
m_ValueStore = OSDParser.DeserializeJson(value); ValueStore = OSDParser.DeserializeJson(value);
} }
// ----------------------------------------------------------------- // -----------------------------------------------------------------
@ -129,7 +130,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
public bool TestPath(string expr, bool useJson) public bool TestPath(string expr, bool useJson)
{ {
Stack<string> path = ParsePathExpression(expr); Stack<string> path = ParsePathExpression(expr);
OSD result = ProcessPathExpression(m_ValueStore,path); OSD result = ProcessPathExpression(ValueStore,path);
if (result == null) if (result == null)
return false; return false;
@ -148,7 +149,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
public bool GetValue(string expr, out string value, bool useJson) public bool GetValue(string expr, out string value, bool useJson)
{ {
Stack<string> path = ParsePathExpression(expr); Stack<string> path = ParsePathExpression(expr);
OSD result = ProcessPathExpression(m_ValueStore,path); OSD result = ProcessPathExpression(ValueStore,path);
return ConvertOutputValue(result,out value,useJson); return ConvertOutputValue(result,out value,useJson);
} }
@ -184,7 +185,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
Stack<string> path = ParsePathExpression(expr); Stack<string> path = ParsePathExpression(expr);
string pexpr = PathExpressionToKey(path); string pexpr = PathExpressionToKey(path);
OSD result = ProcessPathExpression(m_ValueStore,path); OSD result = ProcessPathExpression(ValueStore,path);
if (result == null) if (result == null)
{ {
m_TakeStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback)); m_TakeStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback));
@ -215,7 +216,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
Stack<string> path = ParsePathExpression(expr); Stack<string> path = ParsePathExpression(expr);
string pexpr = PathExpressionToKey(path); string pexpr = PathExpressionToKey(path);
OSD result = ProcessPathExpression(m_ValueStore,path); OSD result = ProcessPathExpression(ValueStore,path);
if (result == null) if (result == null)
{ {
m_ReadStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback)); m_ReadStore.Add(new TakeValueCallbackClass(pexpr,useJson,cback));
@ -245,7 +246,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
Stack<string> path = ParsePathExpression(expr); Stack<string> path = ParsePathExpression(expr);
if (path.Count == 0) if (path.Count == 0)
{ {
m_ValueStore = ovalue; ValueStore = ovalue;
return true; return true;
} }
@ -254,7 +255,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
if (pexpr != "") if (pexpr != "")
pexpr += "."; pexpr += ".";
OSD result = ProcessPathExpression(m_ValueStore,path); OSD result = ProcessPathExpression(ValueStore,path);
if (result == null) if (result == null)
return false; return false;
@ -522,4 +523,41 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
return pkey; return pkey;
} }
} }
public class JsonObjectStore : JsonStore
{
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private Scene m_scene;
private UUID m_objectID;
protected override OSD ValueStore
{
get
{
SceneObjectPart sop = m_scene.GetSceneObjectPart(m_objectID);
if (sop == null)
{
// This is bad
return null;
}
return sop.DynAttrs.TopLevelMap;
}
// cannot set the top level
set
{
m_log.InfoFormat("[JsonStore] cannot set top level value in object store");
}
}
public JsonObjectStore(Scene scene, UUID oid) : base()
{
m_scene = scene;
m_objectID = oid;
}
}
} }

View File

@ -170,6 +170,34 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
#region ScriptInvocationInteface #region ScriptInvocationInteface
// -----------------------------------------------------------------
/// <summary>
///
/// </summary>
// -----------------------------------------------------------------
public bool AttachObjectStore(UUID objectID)
{
if (! m_enabled) return false;
SceneObjectPart sop = m_scene.GetSceneObjectPart(objectID);
if (sop == null)
{
m_log.InfoFormat("[JsonStore] unable to attach to unknown object; {0}",objectID);
return false;
}
lock (m_JsonValueStore)
{
if (m_JsonValueStore.ContainsKey(objectID))
return true;
JsonStore map = new JsonObjectStore(m_scene,objectID);
m_JsonValueStore.Add(objectID,map);
}
return true;
}
// ----------------------------------------------------------------- // -----------------------------------------------------------------
/// <summary> /// <summary>
/// ///

View File

@ -169,6 +169,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
m_comms.RegisterScriptInvocations(this); m_comms.RegisterScriptInvocations(this);
// m_comms.RegisterScriptInvocation(this, "JsonCreateStore"); // m_comms.RegisterScriptInvocation(this, "JsonCreateStore");
// m_comms.RegisterScriptInvocation(this, "JsonAttachObjectStore");
// m_comms.RegisterScriptInvocation(this, "JsonDestroyStore"); // m_comms.RegisterScriptInvocation(this, "JsonDestroyStore");
// m_comms.RegisterScriptInvocation(this, "JsonTestStore"); // m_comms.RegisterScriptInvocation(this, "JsonTestStore");
@ -214,6 +215,21 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
#endregion #endregion
#region ScriptInvocationInteface #region ScriptInvocationInteface
// -----------------------------------------------------------------
/// <summary>
///
/// </summary>
// -----------------------------------------------------------------
[ScriptInvocation]
public UUID JsonAttachObjectStore(UUID hostID, UUID scriptID)
{
UUID uuid = UUID.Zero;
if (! m_store.AttachObjectStore(hostID))
GenerateRuntimeError("Failed to create Json store");
return hostID;
}
// ----------------------------------------------------------------- // -----------------------------------------------------------------
/// <summary> /// <summary>
/// ///

View File

@ -220,7 +220,7 @@ public static class BSParam
(s) => { return BSParam.NumericBool(ShouldUseHullsForPhysicalObjects); }, (s) => { return BSParam.NumericBool(ShouldUseHullsForPhysicalObjects); },
(s,p,l,v) => { ShouldUseHullsForPhysicalObjects = BSParam.BoolNumeric(v); } ), (s,p,l,v) => { ShouldUseHullsForPhysicalObjects = BSParam.BoolNumeric(v); } ),
new ParameterDefn("ShouldRemoveZeroWidthTriangles", "If true, remove degenerate triangles from meshes", new ParameterDefn("ShouldRemoveZeroWidthTriangles", "If true, remove degenerate triangles from meshes",
ConfigurationParameters.numericFalse, ConfigurationParameters.numericTrue,
(s,cf,p,v) => { ShouldRemoveZeroWidthTriangles = cf.GetBoolean(p, BSParam.BoolNumeric(v)); }, (s,cf,p,v) => { ShouldRemoveZeroWidthTriangles = cf.GetBoolean(p, BSParam.BoolNumeric(v)); },
(s) => { return BSParam.NumericBool(ShouldRemoveZeroWidthTriangles); }, (s) => { return BSParam.NumericBool(ShouldRemoveZeroWidthTriangles); },
(s,p,l,v) => { ShouldRemoveZeroWidthTriangles = BSParam.BoolNumeric(v); } ), (s,p,l,v) => { ShouldRemoveZeroWidthTriangles = BSParam.BoolNumeric(v); } ),

View File

@ -75,6 +75,7 @@ public abstract class BSPhysObject : PhysicsActor
PhysicsScene = parentScene; PhysicsScene = parentScene;
LocalID = localID; LocalID = localID;
PhysObjectName = name; PhysObjectName = name;
Name = name; // PhysicsActor also has the name of the object. Someday consolidate.
TypeName = typeName; TypeName = typeName;
// We don't have any physical representation yet. // We don't have any physical representation yet.

View File

@ -608,7 +608,7 @@ public sealed class BSShapeCollection : IDisposable
// Since we're recreating new, get rid of the reference to the previous shape // Since we're recreating new, get rid of the reference to the previous shape
DereferenceShape(prim.PhysShape, shapeCallback); DereferenceShape(prim.PhysShape, shapeCallback);
newShape = CreatePhysicalMesh(prim.PhysObjectName, newMeshKey, prim.BaseShape, prim.Size, lod); newShape = CreatePhysicalMesh(prim, newMeshKey, prim.BaseShape, prim.Size, lod);
// Take evasive action if the mesh was not constructed. // Take evasive action if the mesh was not constructed.
newShape = VerifyMeshCreated(newShape, prim); newShape = VerifyMeshCreated(newShape, prim);
@ -619,7 +619,7 @@ public sealed class BSShapeCollection : IDisposable
return true; // 'true' means a new shape has been added to this prim return true; // 'true' means a new shape has been added to this prim
} }
private BulletShape CreatePhysicalMesh(string objName, System.UInt64 newMeshKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) private BulletShape CreatePhysicalMesh(BSPhysObject prim, System.UInt64 newMeshKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod)
{ {
BulletShape newShape = new BulletShape(); BulletShape newShape = new BulletShape();
@ -631,7 +631,7 @@ public sealed class BSShapeCollection : IDisposable
} }
else else
{ {
IMesh meshData = PhysicsScene.mesher.CreateMesh(objName, pbs, size, lod, IMesh meshData = PhysicsScene.mesher.CreateMesh(prim.PhysObjectName, pbs, size, lod,
true, true,
false, // say it is not physical so a bounding box is not built false, // say it is not physical so a bounding box is not built
false, // do not cache the mesh and do not use previously built versions false, // do not cache the mesh and do not use previously built versions
@ -653,18 +653,20 @@ public sealed class BSShapeCollection : IDisposable
realIndicesIndex = 0; realIndicesIndex = 0;
for (int tri = 0; tri < indices.Length; tri += 3) for (int tri = 0; tri < indices.Length; tri += 3)
{ {
// Compute displacements into vertex array for each vertex of the triangle
int v1 = indices[tri + 0] * 3; int v1 = indices[tri + 0] * 3;
int v2 = indices[tri + 1] * 3; int v2 = indices[tri + 1] * 3;
int v3 = indices[tri + 2] * 3; int v3 = indices[tri + 2] * 3;
if (!((verticesAsFloats[v1 + 0] == verticesAsFloats[v2 + 0] // Check to see if any two of the vertices are the same
if (!( ( verticesAsFloats[v1 + 0] == verticesAsFloats[v2 + 0]
&& verticesAsFloats[v1 + 1] == verticesAsFloats[v2 + 1] && verticesAsFloats[v1 + 1] == verticesAsFloats[v2 + 1]
&& verticesAsFloats[v1 + 2] == verticesAsFloats[v2 + 2]) && verticesAsFloats[v1 + 2] == verticesAsFloats[v2 + 2])
|| (verticesAsFloats[v2 + 0] == verticesAsFloats[v3 + 0] || ( verticesAsFloats[v2 + 0] == verticesAsFloats[v3 + 0]
&& verticesAsFloats[v2 + 1] == verticesAsFloats[v3 + 1] && verticesAsFloats[v2 + 1] == verticesAsFloats[v3 + 1]
&& verticesAsFloats[v2 + 2] == verticesAsFloats[v3 + 2]) && verticesAsFloats[v2 + 2] == verticesAsFloats[v3 + 2])
|| (verticesAsFloats[v1 + 0] == verticesAsFloats[v3 + 0] || ( verticesAsFloats[v1 + 0] == verticesAsFloats[v3 + 0]
&& verticesAsFloats[v1 + 1] == verticesAsFloats[v3 + 1] && verticesAsFloats[v1 + 1] == verticesAsFloats[v3 + 1]
&& verticesAsFloats[v1 + 2] == verticesAsFloats[v3 + 2])) && verticesAsFloats[v1 + 2] == verticesAsFloats[v3 + 2]) )
) )
{ {
// None of the vertices of the triangles are the same. This is a good triangle; // None of the vertices of the triangles are the same. This is a good triangle;
@ -678,8 +680,16 @@ public sealed class BSShapeCollection : IDisposable
DetailLog("{0},BSShapeCollection.CreatePhysicalMesh,origTri={1},realTri={2},numVerts={3}", DetailLog("{0},BSShapeCollection.CreatePhysicalMesh,origTri={1},realTri={2},numVerts={3}",
BSScene.DetailLogZero, indices.Length / 3, realIndicesIndex / 3, verticesAsFloats.Length / 3); BSScene.DetailLogZero, indices.Length / 3, realIndicesIndex / 3, verticesAsFloats.Length / 3);
newShape = PhysicsScene.PE.CreateMeshShape(PhysicsScene.World, if (realIndicesIndex != 0)
realIndicesIndex, indices, verticesAsFloats.Length/3, verticesAsFloats); {
newShape = PhysicsScene.PE.CreateMeshShape(PhysicsScene.World,
realIndicesIndex, indices, verticesAsFloats.Length / 3, verticesAsFloats);
}
else
{
PhysicsScene.Logger.ErrorFormat("{0} All mesh triangles degenerate. Prim {1} at {2} in {3}",
LogHeader, prim.PhysObjectName, prim.RawPosition, PhysicsScene.Name);
}
} }
} }
newShape.shapeKey = newMeshKey; newShape.shapeKey = newMeshKey;
@ -897,9 +907,11 @@ public sealed class BSShapeCollection : IDisposable
// If this mesh has an underlying asset and we have not failed getting it before, fetch the asset // If this mesh has an underlying asset and we have not failed getting it before, fetch the asset
if (prim.BaseShape.SculptEntry && !prim.LastAssetBuildFailed && prim.BaseShape.SculptTexture != OMV.UUID.Zero) if (prim.BaseShape.SculptEntry && !prim.LastAssetBuildFailed && prim.BaseShape.SculptTexture != OMV.UUID.Zero)
{ {
prim.LastAssetBuildFailed = true;
BSPhysObject xprim = prim;
DetailLog("{0},BSShapeCollection.VerifyMeshCreated,fetchAsset,lastFailed={1}", prim.LocalID, prim.LastAssetBuildFailed); DetailLog("{0},BSShapeCollection.VerifyMeshCreated,fetchAsset,lastFailed={1}", prim.LocalID, prim.LastAssetBuildFailed);
// This will prevent looping through this code as we keep trying to get the failed shape
prim.LastAssetBuildFailed = true;
BSPhysObject xprim = prim;
Util.FireAndForget(delegate Util.FireAndForget(delegate
{ {
RequestAssetDelegate assetProvider = PhysicsScene.RequestAssetMethod; RequestAssetDelegate assetProvider = PhysicsScene.RequestAssetMethod;
@ -910,7 +922,7 @@ public sealed class BSShapeCollection : IDisposable
{ {
bool assetFound = false; // DEBUG DEBUG bool assetFound = false; // DEBUG DEBUG
string mismatchIDs = String.Empty; // DEBUG DEBUG string mismatchIDs = String.Empty; // DEBUG DEBUG
if (yprim.BaseShape.SculptEntry) if (asset != null && yprim.BaseShape.SculptEntry)
{ {
if (yprim.BaseShape.SculptTexture.ToString() == asset.ID) if (yprim.BaseShape.SculptTexture.ToString() == asset.ID)
{ {

View File

@ -420,7 +420,7 @@ namespace OpenSim.Region.UserStatistics
Encoding encoding = Encoding.ASCII; Encoding encoding = Encoding.ASCII;
int sizeOfChar = encoding.GetByteCount("\n"); int sizeOfChar = encoding.GetByteCount("\n");
byte[] buffer = encoding.GetBytes("\n"); byte[] buffer = encoding.GetBytes("\n");
string logfile = Util.logDir() + "/" + "OpenSim.log"; string logfile = Util.logFile();
FileStream fs = new FileStream(logfile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); FileStream fs = new FileStream(logfile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Int64 tokenCount = 0; Int64 tokenCount = 0;
Int64 endPosition = fs.Length / sizeOfChar; Int64 endPosition = fs.Length / sizeOfChar;