mirror of
https://github.com/opensim/opensim.git
synced 2026-08-05 08:55:56 +08:00
Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
This commit is contained in:
171
OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
Executable file
171
OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
Executable file
@@ -0,0 +1,171 @@
|
||||
/*
|
||||
* 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 copyrightD
|
||||
* 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.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.CoreModules;
|
||||
|
||||
using Mono.Addins;
|
||||
using Nini.Config;
|
||||
using log4net;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OpenSim.Region.OptionalModules.Scripting
|
||||
{
|
||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule")]
|
||||
public class ExtendedPhysics : INonSharedRegionModule
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private static string LogHeader = "[EXTENDED PHYSICS]";
|
||||
|
||||
private IConfig Configuration { get; set; }
|
||||
private bool Enabled { get; set; }
|
||||
private Scene BaseScene { get; set; }
|
||||
private IScriptModuleComms Comms { get; set; }
|
||||
|
||||
#region INonSharedRegionModule
|
||||
|
||||
public string Name { get { return this.GetType().Name; } }
|
||||
|
||||
public void Initialise(IConfigSource config)
|
||||
{
|
||||
BaseScene = null;
|
||||
Enabled = false;
|
||||
Configuration = null;
|
||||
Comms = null;
|
||||
|
||||
try
|
||||
{
|
||||
if ((Configuration = config.Configs["ExtendedPhysics"]) != null)
|
||||
{
|
||||
Enabled = Configuration.GetBoolean("Enabled", Enabled);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("{0} Initialization error: {0}", LogHeader, e);
|
||||
}
|
||||
|
||||
m_log.InfoFormat("{0} module {1} enabled", LogHeader, (Enabled ? "is" : "is not"));
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
if (BaseScene != null)
|
||||
{
|
||||
BaseScene.EventManager.OnObjectAddedToScene -= EventManager_OnObjectAddedToScene;
|
||||
BaseScene.EventManager.OnSceneObjectPartUpdated -= EventManager_OnSceneObjectPartUpdated;
|
||||
BaseScene = null;
|
||||
}
|
||||
}
|
||||
|
||||
public void AddRegion(Scene scene)
|
||||
{
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene scene)
|
||||
{
|
||||
if (BaseScene != null && BaseScene == scene)
|
||||
{
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene scene)
|
||||
{
|
||||
if (!Enabled) return;
|
||||
|
||||
BaseScene = scene;
|
||||
|
||||
Comms = BaseScene.RequestModuleInterface<IScriptModuleComms>();
|
||||
if (Comms == null)
|
||||
{
|
||||
m_log.WarnFormat("{0} ScriptModuleComms interface not defined", LogHeader);
|
||||
Enabled = false;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Register as LSL functions all the [ScriptInvocation] marked methods.
|
||||
Comms.RegisterScriptInvocations(this);
|
||||
|
||||
// When an object is modified, we might need to update its extended physics parameters
|
||||
BaseScene.EventManager.OnObjectAddedToScene += EventManager_OnObjectAddedToScene;
|
||||
BaseScene.EventManager.OnSceneObjectPartUpdated += EventManager_OnSceneObjectPartUpdated;
|
||||
|
||||
}
|
||||
|
||||
public Type ReplaceableInterface { get { return null; } }
|
||||
|
||||
#endregion // INonSharedRegionModule
|
||||
|
||||
private void EventManager_OnObjectAddedToScene(SceneObjectGroup obj)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
// Event generated when some property of a prim changes.
|
||||
private void EventManager_OnSceneObjectPartUpdated(SceneObjectPart sop, bool isFullUpdate)
|
||||
{
|
||||
}
|
||||
|
||||
[ScriptConstant]
|
||||
public static int PHYS_CENTER_OF_MASS = 1 << 0;
|
||||
|
||||
[ScriptConstant]
|
||||
public static int PHYS_LINKSET_TYPE_CONSTRAINT = 1;
|
||||
[ScriptConstant]
|
||||
public static int PHYS_LINKSET_TYPE_COMPOUND = 2;
|
||||
[ScriptConstant]
|
||||
public static int PHYS_LINKSET_TYPE_MANUAL = 3;
|
||||
|
||||
[ScriptInvocation]
|
||||
public string physGetEngineType(UUID hostID, UUID scriptID)
|
||||
{
|
||||
string ret = string.Empty;
|
||||
|
||||
if (BaseScene.PhysicsScene != null)
|
||||
{
|
||||
ret = BaseScene.PhysicsScene.EngineType;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
[ScriptInvocation]
|
||||
public void physSetLinksetType(UUID hostID, UUID scriptID, int linksetType)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -93,6 +93,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
// extract the internals of a has reference
|
||||
protected static Regex m_HashPattern = new Regex("{([^}]+)}");
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// This is a simple estimator for the size of the stored data, it
|
||||
/// is not precise, but should be close enough to implement reasonable
|
||||
/// limits on the storage space used
|
||||
/// </summary>
|
||||
// -----------------------------------------------------------------
|
||||
public int StringSpace { get; set; }
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
/// <summary>
|
||||
///
|
||||
@@ -110,6 +119,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
// -----------------------------------------------------------------
|
||||
public JsonStore()
|
||||
{
|
||||
StringSpace = 0;
|
||||
m_TakeStore = new List<TakeValueCallbackClass>();
|
||||
m_ReadStore = new List<TakeValueCallbackClass>();
|
||||
}
|
||||
@@ -135,7 +145,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
if (result == null)
|
||||
return false;
|
||||
|
||||
if (useJson || result.Type == OSDType.String)
|
||||
if (useJson || OSDBaseType(result.Type))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@@ -247,6 +257,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
if (path.Count == 0)
|
||||
{
|
||||
ValueStore = ovalue;
|
||||
StringSpace = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -278,8 +289,13 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
{
|
||||
string npkey = String.Format("[{0}]",amap.Count);
|
||||
|
||||
amap.Add(ovalue);
|
||||
InvokeNextCallback(pexpr + npkey);
|
||||
if (ovalue != null)
|
||||
{
|
||||
StringSpace += ComputeSizeOf(ovalue);
|
||||
|
||||
amap.Add(ovalue);
|
||||
InvokeNextCallback(pexpr + npkey);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -287,9 +303,14 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
if (0 <= aval && aval < amap.Count)
|
||||
{
|
||||
if (ovalue == null)
|
||||
{
|
||||
StringSpace -= ComputeSizeOf(amap[aval]);
|
||||
amap.RemoveAt(aval);
|
||||
}
|
||||
else
|
||||
{
|
||||
StringSpace -= ComputeSizeOf(amap[aval]);
|
||||
StringSpace += ComputeSizeOf(ovalue);
|
||||
amap[aval] = ovalue;
|
||||
InvokeNextCallback(pexpr + pkey);
|
||||
}
|
||||
@@ -313,6 +334,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
OSDMap hmap = result as OSDMap;
|
||||
if (ovalue != null)
|
||||
{
|
||||
StringSpace -= ComputeSizeOf(hmap[hkey]);
|
||||
StringSpace += ComputeSizeOf(ovalue);
|
||||
|
||||
hmap[hkey] = ovalue;
|
||||
InvokeNextCallback(pexpr + pkey);
|
||||
return true;
|
||||
@@ -321,6 +345,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
// this is the remove case
|
||||
if (hmap.ContainsKey(hkey))
|
||||
{
|
||||
StringSpace -= ComputeSizeOf(hmap[hkey]);
|
||||
hmap.Remove(hkey);
|
||||
return true;
|
||||
}
|
||||
@@ -506,7 +531,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
return true;
|
||||
}
|
||||
|
||||
if (result.Type == OSDType.String)
|
||||
if (OSDBaseType(result.Type))
|
||||
{
|
||||
value = result.AsString();
|
||||
return true;
|
||||
@@ -531,8 +556,54 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
|
||||
return pkey;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
// -----------------------------------------------------------------
|
||||
protected static bool OSDBaseType(OSDType type)
|
||||
{
|
||||
// Should be the list of base types for which AsString() returns
|
||||
// something useful
|
||||
if (type == OSDType.Boolean)
|
||||
return true;
|
||||
if (type == OSDType.Integer)
|
||||
return true;
|
||||
if (type == OSDType.Real)
|
||||
return true;
|
||||
if (type == OSDType.String)
|
||||
return true;
|
||||
if (type == OSDType.UUID)
|
||||
return true;
|
||||
if (type == OSDType.Date)
|
||||
return true;
|
||||
if (type == OSDType.URI)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
// -----------------------------------------------------------------
|
||||
protected static int ComputeSizeOf(OSD value)
|
||||
{
|
||||
string sval;
|
||||
|
||||
if (ConvertOutputValue(value,out sval,true))
|
||||
return sval.Length;
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------
|
||||
/// <summary>
|
||||
/// </summary>
|
||||
// -----------------------------------------------------------------
|
||||
public class JsonObjectStore : JsonStore
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
@@ -566,6 +637,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
{
|
||||
m_scene = scene;
|
||||
m_objectID = oid;
|
||||
|
||||
// the size limit is imposed on whatever is already in the store
|
||||
StringSpace = ComputeSizeOf(ValueStore);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,6 +54,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
|
||||
private IConfig m_config = null;
|
||||
private bool m_enabled = false;
|
||||
private bool m_enableObjectStore = false;
|
||||
private int m_maxStringSpace = Int32.MaxValue;
|
||||
|
||||
private Scene m_scene = null;
|
||||
|
||||
private Dictionary<UUID,JsonStore> m_JsonValueStore;
|
||||
@@ -90,6 +93,10 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
}
|
||||
|
||||
m_enabled = m_config.GetBoolean("Enabled", m_enabled);
|
||||
m_enableObjectStore = m_config.GetBoolean("EnableObjectStore", m_enableObjectStore);
|
||||
m_maxStringSpace = m_config.GetInt("MaxStringSpace", m_maxStringSpace);
|
||||
if (m_maxStringSpace == 0)
|
||||
m_maxStringSpace = Int32.MaxValue;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@@ -178,6 +185,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
public bool AttachObjectStore(UUID objectID)
|
||||
{
|
||||
if (! m_enabled) return false;
|
||||
if (! m_enableObjectStore) return false;
|
||||
|
||||
SceneObjectPart sop = m_scene.GetSceneObjectPart(objectID);
|
||||
if (sop == null)
|
||||
@@ -311,7 +319,16 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
|
||||
try
|
||||
{
|
||||
lock (map)
|
||||
{
|
||||
if (map.StringSpace > m_maxStringSpace)
|
||||
{
|
||||
m_log.WarnFormat("[JsonStore] {0} exceeded string size; {1} bytes used of {2} limit",
|
||||
storeID,map.StringSpace,m_maxStringSpace);
|
||||
return false;
|
||||
}
|
||||
|
||||
return map.SetValue(path,value,useJson);
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user