Merge branch 'master' into careminster
Conflicts: OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.csavinationmerge
commit
375114bea3
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
///
|
///
|
||||||
|
|
|
@ -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>
|
||||||
///
|
///
|
||||||
|
|
|
@ -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); } ),
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue