aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2013-02-07 23:09:47 +0000
committerJustin Clark-Casey (justincc)2013-02-07 23:09:47 +0000
commit9e17dc3daa04644c1a565d819a614c02022bdeed (patch)
tree014eb8cec88c68b2dedde009a508dde3b5b52aca /OpenSim/Region
parentFix a recent regression in e17392a where JsonSetValue() stopped working (prob... (diff)
parentPlumb the path from the client to the extra physics params and back (diff)
downloadopensim-SC-9e17dc3daa04644c1a565d819a614c02022bdeed.zip
opensim-SC-9e17dc3daa04644c1a565d819a614c02022bdeed.tar.gz
opensim-SC-9e17dc3daa04644c1a565d819a614c02022bdeed.tar.bz2
opensim-SC-9e17dc3daa04644c1a565d819a614c02022bdeed.tar.xz
Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs35
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs8
-rw-r--r--OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs20
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs59
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEventQueue.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs25
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs6
-rw-r--r--OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs5
-rw-r--r--OpenSim/Region/OptionalModules/Example/WebSocketEchoTest/WebSocketEchoModule.cs174
-rwxr-xr-xOpenSim/Region/OptionalModules/PhysicsParameters/PhysicsParameters.cs19
-rw-r--r--OpenSim/Region/OptionalModules/Scripting/JsonStore/Tests/JsonStoreScriptModuleTests.cs61
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs5
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSParam.cs36
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs1
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSScene.cs41
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs28
-rwxr-xr-xOpenSim/Region/Physics/Manager/IPhysicsParameters.cs6
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs2
-rw-r--r--OpenSim/Region/UserStatistics/WebStatsModule.cs2
20 files changed, 474 insertions, 68 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index 568e216..1af61db 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -96,6 +96,8 @@ namespace OpenSim.Region.ClientStack.Linden
96 // private static readonly string m_fetchInventoryPath = "0006/"; 96 // private static readonly string m_fetchInventoryPath = "0006/";
97 private static readonly string m_copyFromNotecardPath = "0007/"; 97 private static readonly string m_copyFromNotecardPath = "0007/";
98 // private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule. 98 // private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule.
99 private static readonly string m_getObjectPhysicsDataPath = "0101/";
100 /* 0102 - 0103 RESERVED */
99 private static readonly string m_UpdateAgentInformationPath = "0500/"; 101 private static readonly string m_UpdateAgentInformationPath = "0500/";
100 102
101 // These are callbacks which will be setup by the scene so that we can update scene data when we 103 // These are callbacks which will be setup by the scene so that we can update scene data when we
@@ -204,6 +206,8 @@ namespace OpenSim.Region.ClientStack.Linden
204 m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req); 206 m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req);
205 m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req); 207 m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req);
206 m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req); 208 m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req);
209 IRequestHandler getObjectPhysicsDataHandler = new RestStreamHandler("POST", capsBase + m_getObjectPhysicsDataPath, GetObjectPhysicsData);
210 m_HostCapsObj.RegisterHandler("GetObjectPhysicsData", getObjectPhysicsDataHandler);
207 IRequestHandler UpdateAgentInformationHandler = new RestStreamHandler("POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation); 211 IRequestHandler UpdateAgentInformationHandler = new RestStreamHandler("POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation);
208 m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler); 212 m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler);
209 213
@@ -873,6 +877,37 @@ namespace OpenSim.Region.ClientStack.Linden
873 return LLSDHelpers.SerialiseLLSDReply(response); 877 return LLSDHelpers.SerialiseLLSDReply(response);
874 } 878 }
875 879
880 public string GetObjectPhysicsData(string request, string path,
881 string param, IOSHttpRequest httpRequest,
882 IOSHttpResponse httpResponse)
883 {
884 OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request);
885 OSDMap resp = new OSDMap();
886 OSDArray object_ids = (OSDArray)req["object_ids"];
887
888 for (int i = 0 ; i < object_ids.Count ; i++)
889 {
890 UUID uuid = object_ids[i].AsUUID();
891
892 SceneObjectPart obj = m_Scene.GetSceneObjectPart(uuid);
893 if (obj != null)
894 {
895 OSDMap object_data = new OSDMap();
896
897 object_data["PhysicsShapeType"] = obj.PhysicsShapeType;
898 object_data["Density"] = obj.Density;
899 object_data["Friction"] = obj.Friction;
900 object_data["Restitution"] = obj.Restitution;
901 object_data["GravityMultiplier"] = obj.GravityModifier;
902
903 resp[uuid.ToString()] = object_data;
904 }
905 }
906
907 string response = OSDParser.SerializeLLSDXmlString(resp);
908 return response;
909 }
910
876 public string UpdateAgentInformation(string request, string path, 911 public string UpdateAgentInformation(string request, string path,
877 string param, IOSHttpRequest httpRequest, 912 string param, IOSHttpRequest httpRequest,
878 IOSHttpResponse httpResponse) 913 IOSHttpResponse httpResponse)
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
index 4d2c0f2..3cc3950 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs
@@ -807,5 +807,13 @@ namespace OpenSim.Region.ClientStack.Linden
807 { 807 {
808 return EventQueueHelper.BuildEvent(eventName, eventBody); 808 return EventQueueHelper.BuildEvent(eventName, eventBody);
809 } 809 }
810
811 public void partPhysicsProperties(uint localID, byte physhapetype,
812 float density, float friction, float bounce, float gravmod,UUID avatarID)
813 {
814 OSD item = EventQueueHelper.partPhysicsProperties(localID, physhapetype,
815 density, friction, bounce, gravmod);
816 Enqueue(item, avatarID);
817 }
810 } 818 }
811} 819}
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs
index 3f49aba..dab727f 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueHelper.cs
@@ -395,5 +395,25 @@ namespace OpenSim.Region.ClientStack.Linden
395 return message; 395 return message;
396 } 396 }
397 397
398 public static OSD partPhysicsProperties(uint localID, byte physhapetype,
399 float density, float friction, float bounce, float gravmod)
400 {
401
402 OSDMap physinfo = new OSDMap(6);
403 physinfo["LocalID"] = localID;
404 physinfo["Density"] = density;
405 physinfo["Friction"] = friction;
406 physinfo["GravityMultiplier"] = gravmod;
407 physinfo["Restitution"] = bounce;
408 physinfo["PhysicsShapeType"] = (int)physhapetype;
409
410 OSDArray array = new OSDArray(1);
411 array.Add(physinfo);
412
413 OSDMap llsdBody = new OSDMap(1);
414 llsdBody.Add("ObjectData", array);
415
416 return BuildEvent("ObjectPhysicsProperties", llsdBody);
417 }
398 } 418 }
399} 419}
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 88b64f5..bd4a2d1 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -2627,6 +2627,34 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2627 } 2627 }
2628 } 2628 }
2629 2629
2630 public void SendPartPhysicsProprieties(ISceneEntity entity)
2631 {
2632 SceneObjectPart part = (SceneObjectPart)entity;
2633 if (part != null && AgentId != UUID.Zero)
2634 {
2635 try
2636 {
2637 IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
2638 if (eq != null)
2639 {
2640 uint localid = part.LocalId;
2641 byte physshapetype = part.PhysicsShapeType;
2642 float density = part.Density;
2643 float friction = part.Friction;
2644 float bounce = part.Restitution;
2645 float gravmod = part.GravityModifier;
2646 eq.partPhysicsProperties(localid, physshapetype, density, friction, bounce, gravmod,AgentId);
2647 }
2648 }
2649 catch (Exception ex)
2650 {
2651 m_log.Error("Unable to send part Physics Proprieties - exception: " + ex.ToString());
2652 }
2653 part.UpdatePhysRequired = false;
2654 }
2655 }
2656
2657
2630 2658
2631 public void SendGroupNameReply(UUID groupLLUID, string GroupName) 2659 public void SendGroupNameReply(UUID groupLLUID, string GroupName)
2632 { 2660 {
@@ -7035,10 +7063,33 @@ namespace OpenSim.Region.ClientStack.LindenUDP
7035 // 46,47,48 are special positions within the packet 7063 // 46,47,48 are special positions within the packet
7036 // This may change so perhaps we need a better way 7064 // This may change so perhaps we need a better way
7037 // of storing this (OMV.FlagUpdatePacket.UsePhysics,etc?) 7065 // of storing this (OMV.FlagUpdatePacket.UsePhysics,etc?)
7038 bool UsePhysics = (data[46] != 0) ? true : false; 7066 /*
7039 bool IsTemporary = (data[47] != 0) ? true : false; 7067 bool UsePhysics = (data[46] != 0) ? true : false;
7040 bool IsPhantom = (data[48] != 0) ? true : false; 7068 bool IsTemporary = (data[47] != 0) ? true : false;
7041 handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, this); 7069 bool IsPhantom = (data[48] != 0) ? true : false;
7070 handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, this);
7071 */
7072 bool UsePhysics = flags.AgentData.UsePhysics;
7073 bool IsPhantom = flags.AgentData.IsPhantom;
7074 bool IsTemporary = flags.AgentData.IsTemporary;
7075 ObjectFlagUpdatePacket.ExtraPhysicsBlock[] blocks = flags.ExtraPhysics;
7076 ExtraPhysicsData physdata = new ExtraPhysicsData();
7077
7078 if (blocks == null || blocks.Length == 0)
7079 {
7080 physdata.PhysShapeType = PhysShapeType.invalid;
7081 }
7082 else
7083 {
7084 ObjectFlagUpdatePacket.ExtraPhysicsBlock phsblock = blocks[0];
7085 physdata.PhysShapeType = (PhysShapeType)phsblock.PhysicsShapeType;
7086 physdata.Bounce = phsblock.Restitution;
7087 physdata.Density = phsblock.Density;
7088 physdata.Friction = phsblock.Friction;
7089 physdata.GravitationModifier = phsblock.GravityMultiplier;
7090 }
7091
7092 handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, physdata, this);
7042 } 7093 }
7043 return true; 7094 return true;
7044 } 7095 }
diff --git a/OpenSim/Region/Framework/Interfaces/IEventQueue.cs b/OpenSim/Region/Framework/Interfaces/IEventQueue.cs
index bfa5d17..5512642 100644
--- a/OpenSim/Region/Framework/Interfaces/IEventQueue.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEventQueue.cs
@@ -59,5 +59,7 @@ namespace OpenSim.Region.Framework.Interfaces
59 void GroupMembership(AgentGroupDataUpdatePacket groupUpdate, UUID avatarID); 59 void GroupMembership(AgentGroupDataUpdatePacket groupUpdate, UUID avatarID);
60 OSD ScriptRunningEvent(UUID objectID, UUID itemID, bool running, bool mono); 60 OSD ScriptRunningEvent(UUID objectID, UUID itemID, bool running, bool mono);
61 OSD BuildEvent(string eventName, OSD eventBody); 61 OSD BuildEvent(string eventName, OSD eventBody);
62 void partPhysicsProperties(uint localID, byte physhapetype, float density, float friction, float bounce, float gravmod, UUID avatarID);
63
62 } 64 }
63} 65}
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index a4383fd..a84f6d3 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1408,7 +1408,7 @@ namespace OpenSim.Region.Framework.Scenes
1408 /// <param name="SetPhantom"></param> 1408 /// <param name="SetPhantom"></param>
1409 /// <param name="remoteClient"></param> 1409 /// <param name="remoteClient"></param>
1410 protected internal void UpdatePrimFlags( 1410 protected internal void UpdatePrimFlags(
1411 uint localID, bool UsePhysics, bool SetTemporary, bool SetPhantom, IClientAPI remoteClient) 1411 uint localID, bool UsePhysics, bool SetTemporary, bool SetPhantom, ExtraPhysicsData PhysData, IClientAPI remoteClient)
1412 { 1412 {
1413 SceneObjectGroup group = GetGroupByPrim(localID); 1413 SceneObjectGroup group = GetGroupByPrim(localID);
1414 if (group != null) 1414 if (group != null)
@@ -1416,7 +1416,28 @@ namespace OpenSim.Region.Framework.Scenes
1416 if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId)) 1416 if (m_parentScene.Permissions.CanEditObject(group.UUID, remoteClient.AgentId))
1417 { 1417 {
1418 // VolumeDetect can't be set via UI and will always be off when a change is made there 1418 // VolumeDetect can't be set via UI and will always be off when a change is made there
1419 group.UpdatePrimFlags(localID, UsePhysics, SetTemporary, SetPhantom, false); 1419 // now only change volume dtc if phantom off
1420
1421 if (PhysData.PhysShapeType == PhysShapeType.invalid) // check for extraPhysics data
1422 {
1423 bool vdtc;
1424 if (SetPhantom) // if phantom keep volumedtc
1425 vdtc = group.RootPart.VolumeDetectActive;
1426 else // else turn it off
1427 vdtc = false;
1428
1429 group.UpdatePrimFlags(localID, UsePhysics, SetTemporary, SetPhantom, vdtc);
1430 }
1431 else
1432 {
1433 SceneObjectPart part = GetSceneObjectPart(localID);
1434 if (part != null)
1435 {
1436 part.UpdateExtraPhysics(PhysData);
1437 if (part.UpdatePhysRequired)
1438 remoteClient.SendPartPhysicsProprieties(part);
1439 }
1440 }
1420 } 1441 }
1421 } 1442 }
1422 } 1443 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 55b5462..cd40b29 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1042,6 +1042,7 @@ namespace OpenSim.Region.Framework.Scenes
1042 } 1042 }
1043 1043
1044 public UpdateRequired UpdateFlag { get; set; } 1044 public UpdateRequired UpdateFlag { get; set; }
1045 public bool UpdatePhysRequired { get; set; }
1045 1046
1046 /// <summary> 1047 /// <summary>
1047 /// Used for media on a prim. 1048 /// Used for media on a prim.
@@ -1390,7 +1391,7 @@ namespace OpenSim.Region.Framework.Scenes
1390 public float Density { get; set; } 1391 public float Density { get; set; }
1391 public float GravityModifier { get; set; } 1392 public float GravityModifier { get; set; }
1392 public float Friction { get; set; } 1393 public float Friction { get; set; }
1393 public float Bounciness { get; set; } 1394 public float Restitution { get; set; }
1394 1395
1395 #endregion Public Properties with only Get 1396 #endregion Public Properties with only Get
1396 1397
@@ -3964,8 +3965,8 @@ namespace OpenSim.Region.Framework.Scenes
3964 GravityModifier = physdata.GravitationModifier; 3965 GravityModifier = physdata.GravitationModifier;
3965 if(Friction != physdata.Friction) 3966 if(Friction != physdata.Friction)
3966 Friction = physdata.Friction; 3967 Friction = physdata.Friction;
3967 if(Bounciness != physdata.Bounce) 3968 if(Restitution != physdata.Bounce)
3968 Bounciness = physdata.Bounce; 3969 Restitution = physdata.Bounce;
3969 } 3970 }
3970 /// <summary> 3971 /// <summary>
3971 /// Update the flags on this prim. This covers properties such as phantom, physics and temporary. 3972 /// Update the flags on this prim. This covers properties such as phantom, physics and temporary.
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index 78229fe..39420a6 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -618,7 +618,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
618 618
619 private static void ProcessBounce(SceneObjectPart obj, XmlTextReader reader) 619 private static void ProcessBounce(SceneObjectPart obj, XmlTextReader reader)
620 { 620 {
621 obj.Bounciness = reader.ReadElementContentAsFloat("Bounce", String.Empty); 621 obj.Restitution = reader.ReadElementContentAsFloat("Bounce", String.Empty);
622 } 622 }
623 623
624 private static void ProcessGravityModifier(SceneObjectPart obj, XmlTextReader reader) 624 private static void ProcessGravityModifier(SceneObjectPart obj, XmlTextReader reader)
@@ -1295,8 +1295,8 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
1295 writer.WriteElementString("Density", sop.Density.ToString().ToLower()); 1295 writer.WriteElementString("Density", sop.Density.ToString().ToLower());
1296 if (sop.Friction != 0.6f) 1296 if (sop.Friction != 0.6f)
1297 writer.WriteElementString("Friction", sop.Friction.ToString().ToLower()); 1297 writer.WriteElementString("Friction", sop.Friction.ToString().ToLower());
1298 if (sop.Bounciness != 0.5f) 1298 if (sop.Restitution != 0.5f)
1299 writer.WriteElementString("Bounce", sop.Bounciness.ToString().ToLower()); 1299 writer.WriteElementString("Bounce", sop.Restitution.ToString().ToLower());
1300 if (sop.GravityModifier != 1.0f) 1300 if (sop.GravityModifier != 1.0f)
1301 writer.WriteElementString("GravityModifier", sop.GravityModifier.ToString().ToLower()); 1301 writer.WriteElementString("GravityModifier", sop.GravityModifier.ToString().ToLower());
1302 1302
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
index 781539a..0ac56fa 100644
--- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
+++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs
@@ -1678,5 +1678,10 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
1678 public void SendPlacesReply(UUID queryID, UUID transactionID, PlacesReplyData[] data) 1678 public void SendPlacesReply(UUID queryID, UUID transactionID, PlacesReplyData[] data)
1679 { 1679 {
1680 } 1680 }
1681
1682 public void SendPartPhysicsProprieties(ISceneEntity entity)
1683 {
1684 }
1685
1681 } 1686 }
1682} 1687}
diff --git a/OpenSim/Region/OptionalModules/Example/WebSocketEchoTest/WebSocketEchoModule.cs b/OpenSim/Region/OptionalModules/Example/WebSocketEchoTest/WebSocketEchoModule.cs
new file mode 100644
index 0000000..112ba4e
--- /dev/null
+++ b/OpenSim/Region/OptionalModules/Example/WebSocketEchoTest/WebSocketEchoModule.cs
@@ -0,0 +1,174 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using OpenSim.Framework.Servers;
32using Mono.Addins;
33using log4net;
34using Nini.Config;
35using OpenSim.Region.Framework.Interfaces;
36using OpenSim.Region.Framework.Scenes;
37
38using OpenSim.Framework.Servers.HttpServer;
39
40
41namespace OpenSim.Region.OptionalModules.WebSocketEchoModule
42{
43
44 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "WebSocketEchoModule")]
45 public class WebSocketEchoModule : ISharedRegionModule
46 {
47 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
48 private bool enabled;
49 public string Name { get { return "WebSocketEchoModule"; } }
50
51 public Type ReplaceableInterface { get { return null; } }
52
53
54 private HashSet<WebSocketHttpServerHandler> _activeHandlers = new HashSet<WebSocketHttpServerHandler>();
55
56 public void Initialise(IConfigSource pConfig)
57 {
58 enabled =(pConfig.Configs["WebSocketEcho"] != null);
59 if (enabled)
60 m_log.DebugFormat("[WebSocketEchoModule]: INITIALIZED MODULE");
61 }
62
63 /// <summary>
64 /// This method sets up the callback to WebSocketHandlerCallback below when a HTTPRequest comes in for /echo
65 /// </summary>
66 public void PostInitialise()
67 {
68 if (enabled)
69 MainServer.Instance.AddWebSocketHandler("/echo", WebSocketHandlerCallback);
70 }
71
72 // This gets called by BaseHttpServer and gives us an opportunity to set things on the WebSocket handler before we turn it on
73 public void WebSocketHandlerCallback(string path, WebSocketHttpServerHandler handler)
74 {
75 SubscribeToEvents(handler);
76 handler.SetChunksize(8192);
77 handler.NoDelay_TCP_Nagle = true;
78 handler.HandshakeAndUpgrade();
79 }
80
81 //These are our normal events
82 public void SubscribeToEvents(WebSocketHttpServerHandler handler)
83 {
84 handler.OnClose += HandlerOnOnClose;
85 handler.OnText += HandlerOnOnText;
86 handler.OnUpgradeCompleted += HandlerOnOnUpgradeCompleted;
87 handler.OnData += HandlerOnOnData;
88 handler.OnPong += HandlerOnOnPong;
89 }
90
91 public void UnSubscribeToEvents(WebSocketHttpServerHandler handler)
92 {
93 handler.OnClose -= HandlerOnOnClose;
94 handler.OnText -= HandlerOnOnText;
95 handler.OnUpgradeCompleted -= HandlerOnOnUpgradeCompleted;
96 handler.OnData -= HandlerOnOnData;
97 handler.OnPong -= HandlerOnOnPong;
98 }
99
100 private void HandlerOnOnPong(object sender, PongEventArgs pongdata)
101 {
102 m_log.Info("[WebSocketEchoModule]: Got a pong.. ping time: " + pongdata.PingResponseMS);
103 }
104
105 private void HandlerOnOnData(object sender, WebsocketDataEventArgs data)
106 {
107 WebSocketHttpServerHandler obj = sender as WebSocketHttpServerHandler;
108 obj.SendData(data.Data);
109 m_log.Info("[WebSocketEchoModule]: We received a bunch of ugly non-printable bytes");
110 obj.SendPingCheck();
111 }
112
113
114 private void HandlerOnOnUpgradeCompleted(object sender, UpgradeCompletedEventArgs completeddata)
115 {
116 WebSocketHttpServerHandler obj = sender as WebSocketHttpServerHandler;
117 _activeHandlers.Add(obj);
118 }
119
120 private void HandlerOnOnText(object sender, WebsocketTextEventArgs text)
121 {
122 WebSocketHttpServerHandler obj = sender as WebSocketHttpServerHandler;
123 obj.SendMessage(text.Data);
124 m_log.Info("[WebSocketEchoModule]: We received this: " + text.Data);
125 }
126
127 // Remove the references to our handler
128 private void HandlerOnOnClose(object sender, CloseEventArgs closedata)
129 {
130 WebSocketHttpServerHandler obj = sender as WebSocketHttpServerHandler;
131 UnSubscribeToEvents(obj);
132
133 lock (_activeHandlers)
134 _activeHandlers.Remove(obj);
135 obj.Dispose();
136 }
137
138 // Shutting down.. so shut down all sockets.
139 // Note.. this should be done outside of an ienumerable if you're also hook to the close event.
140 public void Close()
141 {
142 if (!enabled)
143 return;
144
145 // We convert this to a for loop so we're not in in an IEnumerable when the close
146 //call triggers an event which then removes item from _activeHandlers that we're enumerating
147 WebSocketHttpServerHandler[] items = new WebSocketHttpServerHandler[_activeHandlers.Count];
148 _activeHandlers.CopyTo(items);
149
150 for (int i = 0; i < items.Length; i++)
151 {
152 items[i].Close(string.Empty);
153 items[i].Dispose();
154 }
155 _activeHandlers.Clear();
156 MainServer.Instance.RemoveWebSocketHandler("/echo");
157 }
158
159 public void AddRegion(Scene scene)
160 {
161 m_log.DebugFormat("[WebSocketEchoModule]: REGION {0} ADDED", scene.RegionInfo.RegionName);
162 }
163
164 public void RemoveRegion(Scene scene)
165 {
166 m_log.DebugFormat("[WebSocketEchoModule]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
167 }
168
169 public void RegionLoaded(Scene scene)
170 {
171 m_log.DebugFormat("[WebSocketEchoModule]: REGION {0} LOADED", scene.RegionInfo.RegionName);
172 }
173 }
174} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/PhysicsParameters/PhysicsParameters.cs b/OpenSim/Region/OptionalModules/PhysicsParameters/PhysicsParameters.cs
index 40f7fbc..3083a33 100755
--- a/OpenSim/Region/OptionalModules/PhysicsParameters/PhysicsParameters.cs
+++ b/OpenSim/Region/OptionalModules/PhysicsParameters/PhysicsParameters.cs
@@ -146,7 +146,7 @@ namespace OpenSim.Region.OptionalModules.PhysicsParameters
146 { 146 {
147 foreach (PhysParameterEntry ppe in physScene.GetParameterList()) 147 foreach (PhysParameterEntry ppe in physScene.GetParameterList())
148 { 148 {
149 float val = 0.0f; 149 string val = string.Empty;
150 if (physScene.GetPhysicsParameter(ppe.name, out val)) 150 if (physScene.GetPhysicsParameter(ppe.name, out val))
151 { 151 {
152 WriteOut(" {0}/{1} = {2}", scene.RegionInfo.RegionName, ppe.name, val); 152 WriteOut(" {0}/{1} = {2}", scene.RegionInfo.RegionName, ppe.name, val);
@@ -159,7 +159,7 @@ namespace OpenSim.Region.OptionalModules.PhysicsParameters
159 } 159 }
160 else 160 else
161 { 161 {
162 float val = 0.0f; 162 string val = string.Empty;
163 if (physScene.GetPhysicsParameter(parm, out val)) 163 if (physScene.GetPhysicsParameter(parm, out val))
164 { 164 {
165 WriteOut(" {0}/{1} = {2}", scene.RegionInfo.RegionName, parm, val); 165 WriteOut(" {0}/{1} = {2}", scene.RegionInfo.RegionName, parm, val);
@@ -185,21 +185,12 @@ namespace OpenSim.Region.OptionalModules.PhysicsParameters
185 return; 185 return;
186 } 186 }
187 string parm = "xxx"; 187 string parm = "xxx";
188 float val = 0f; 188 string valparm = String.Empty;
189 uint localID = (uint)PhysParameterEntry.APPLY_TO_NONE; // set default value 189 uint localID = (uint)PhysParameterEntry.APPLY_TO_NONE; // set default value
190 try 190 try
191 { 191 {
192 parm = cmdparms[2]; 192 parm = cmdparms[2];
193 string valparm = cmdparms[3].ToLower(); 193 valparm = cmdparms[3].ToLower();
194 if (valparm == "true")
195 val = PhysParameterEntry.NUMERIC_TRUE;
196 else
197 {
198 if (valparm == "false")
199 val = PhysParameterEntry.NUMERIC_FALSE;
200 else
201 val = float.Parse(valparm, Culture.NumberFormatInfo);
202 }
203 if (cmdparms.Length > 4) 194 if (cmdparms.Length > 4)
204 { 195 {
205 if (cmdparms[4].ToLower() == "all") 196 if (cmdparms[4].ToLower() == "all")
@@ -224,7 +215,7 @@ namespace OpenSim.Region.OptionalModules.PhysicsParameters
224 IPhysicsParameters physScene = scene.PhysicsScene as IPhysicsParameters; 215 IPhysicsParameters physScene = scene.PhysicsScene as IPhysicsParameters;
225 if (physScene != null) 216 if (physScene != null)
226 { 217 {
227 if (!physScene.SetPhysicsParameter(parm, val, localID)) 218 if (!physScene.SetPhysicsParameter(parm, valparm, localID))
228 { 219 {
229 WriteError("Failed set of parameter '{0}' for region '{1}'", parm, scene.RegionInfo.RegionName); 220 WriteError("Failed set of parameter '{0}' for region '{1}'", parm, scene.RegionInfo.RegionName);
230 } 221 }
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/Tests/JsonStoreScriptModuleTests.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/Tests/JsonStoreScriptModuleTests.cs
index eddae38..aea94ea 100644
--- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/Tests/JsonStoreScriptModuleTests.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/Tests/JsonStoreScriptModuleTests.cs
@@ -54,6 +54,22 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore.Tests
54 private MockScriptEngine m_engine; 54 private MockScriptEngine m_engine;
55 private ScriptModuleCommsModule m_smcm; 55 private ScriptModuleCommsModule m_smcm;
56 56
57 [TestFixtureSetUp]
58 public void FixtureInit()
59 {
60 // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
61 Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
62 }
63
64 [TestFixtureTearDown]
65 public void TearDown()
66 {
67 // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
68 // threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
69 // tests really shouldn't).
70 Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
71 }
72
57 [SetUp] 73 [SetUp]
58 public override void SetUp() 74 public override void SetUp()
59 { 75 {
@@ -85,7 +101,12 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore.Tests
85 101
86 private object InvokeOp(string name, params object[] args) 102 private object InvokeOp(string name, params object[] args)
87 { 103 {
88 return m_smcm.InvokeOperation(UUID.Zero, UUID.Zero, name, args); 104 return InvokeOpOnHost(name, UUID.Zero, args);
105 }
106
107 private object InvokeOpOnHost(string name, UUID hostId, params object[] args)
108 {
109 return m_smcm.InvokeOperation(hostId, UUID.Zero, name, args);
89 } 110 }
90 111
91 [Test] 112 [Test]
@@ -193,6 +214,44 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore.Tests
193 Assert.That(value, Is.EqualTo("Times")); 214 Assert.That(value, Is.EqualTo("Times"));
194 } 215 }
195 216
217 /// <summary>
218 /// Test for reading and writing json to a notecard
219 /// </summary>
220 /// <remarks>
221 /// TODO: Really needs to test correct receipt of the link_message event. Could do this by directly fetching
222 /// it via the MockScriptEngine or perhaps by a dummy script instance.
223 /// </remarks>
224 [Test]
225 public void TestJsonWriteReadNotecard()
226 {
227 TestHelpers.InMethod();
228 TestHelpers.EnableLogging();
229
230 string notecardName = "nc1";
231
232 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, TestHelpers.ParseTail(0x1));
233 m_scene.AddSceneObject(so);
234
235 UUID storeId = (UUID)InvokeOp("JsonCreateStore", "{ 'Hello':'World' }");
236
237 // Write notecard
238 UUID writeNotecardRequestId = (UUID)InvokeOpOnHost("JsonWriteNotecard", so.UUID, storeId, "/", notecardName);
239 Assert.That(writeNotecardRequestId, Is.Not.EqualTo(UUID.Zero));
240
241 TaskInventoryItem nc1Item = so.RootPart.Inventory.GetInventoryItem(notecardName);
242 Assert.That(nc1Item, Is.Not.Null);
243
244 // TODO: Should probably independently check the contents.
245
246 // Read notecard
247 UUID receivingStoreId = (UUID)InvokeOp("JsonCreateStore", "{ 'Hello':'World' }");
248 UUID readNotecardRequestId = (UUID)InvokeOpOnHost("JsonReadNotecard", so.UUID, receivingStoreId, "/", notecardName);
249 Assert.That(readNotecardRequestId, Is.Not.EqualTo(UUID.Zero));
250
251 string value = (string)InvokeOp("JsonGetValue", storeId, "Hello");
252 Assert.That(value, Is.EqualTo("World"));
253 }
254
196 public object DummyTestMethod(object o1, object o2, object o3, object o4, object o5) { return null; } 255 public object DummyTestMethod(object o1, object o2, object o3, object o4, object o5) { return null; }
197 } 256 }
198} \ No newline at end of file 257} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
index 5ea2bcd..6bd27f0 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs
@@ -1234,5 +1234,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC
1234 public void SendPlacesReply(UUID queryID, UUID transactionID, PlacesReplyData[] data) 1234 public void SendPlacesReply(UUID queryID, UUID transactionID, PlacesReplyData[] data)
1235 { 1235 {
1236 } 1236 }
1237
1238 public void SendPartPhysicsProprieties(ISceneEntity entity)
1239 {
1240 }
1241
1237 } 1242 }
1238} 1243}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
index 306928a..601c78c 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
@@ -220,7 +220,7 @@ public static class BSParam
220 (s) => { return BSParam.NumericBool(ShouldUseHullsForPhysicalObjects); }, 220 (s) => { return BSParam.NumericBool(ShouldUseHullsForPhysicalObjects); },
221 (s,p,l,v) => { ShouldUseHullsForPhysicalObjects = BSParam.BoolNumeric(v); } ), 221 (s,p,l,v) => { ShouldUseHullsForPhysicalObjects = BSParam.BoolNumeric(v); } ),
222 new ParameterDefn("ShouldRemoveZeroWidthTriangles", "If true, remove degenerate triangles from meshes", 222 new ParameterDefn("ShouldRemoveZeroWidthTriangles", "If true, remove degenerate triangles from meshes",
223 ConfigurationParameters.numericFalse, 223 ConfigurationParameters.numericTrue,
224 (s,cf,p,v) => { ShouldRemoveZeroWidthTriangles = cf.GetBoolean(p, BSParam.BoolNumeric(v)); }, 224 (s,cf,p,v) => { ShouldRemoveZeroWidthTriangles = cf.GetBoolean(p, BSParam.BoolNumeric(v)); },
225 (s) => { return BSParam.NumericBool(ShouldRemoveZeroWidthTriangles); }, 225 (s) => { return BSParam.NumericBool(ShouldRemoveZeroWidthTriangles); },
226 (s,p,l,v) => { ShouldRemoveZeroWidthTriangles = BSParam.BoolNumeric(v); } ), 226 (s,p,l,v) => { ShouldRemoveZeroWidthTriangles = BSParam.BoolNumeric(v); } ),
@@ -641,24 +641,6 @@ public static class BSParam
641 return (b == ConfigurationParameters.numericTrue ? true : false); 641 return (b == ConfigurationParameters.numericTrue ? true : false);
642 } 642 }
643 643
644 private static void ResetBroadphasePoolTainted(BSScene pPhysScene, float v)
645 {
646 BSScene physScene = pPhysScene;
647 physScene.TaintedObject("BSParam.ResetBroadphasePoolTainted", delegate()
648 {
649 physScene.PE.ResetBroadphasePool(physScene.World);
650 });
651 }
652
653 private static void ResetConstraintSolverTainted(BSScene pPhysScene, float v)
654 {
655 BSScene physScene = pPhysScene;
656 physScene.TaintedObject("BSParam.ResetConstraintSolver", delegate()
657 {
658 physScene.PE.ResetConstraintSolver(physScene.World);
659 });
660 }
661
662 // Search through the parameter definitions and return the matching 644 // Search through the parameter definitions and return the matching
663 // ParameterDefn structure. 645 // ParameterDefn structure.
664 // Case does not matter as names are compared after converting to lower case. 646 // Case does not matter as names are compared after converting to lower case.
@@ -722,6 +704,22 @@ public static class BSParam
722 } 704 }
723 } 705 }
724 706
707 private static void ResetBroadphasePoolTainted(BSScene pPhysScene, float v)
708 {
709 BSScene physScene = pPhysScene;
710 physScene.TaintedObject("BSParam.ResetBroadphasePoolTainted", delegate()
711 {
712 physScene.PE.ResetBroadphasePool(physScene.World);
713 });
714 }
725 715
716 private static void ResetConstraintSolverTainted(BSScene pPhysScene, float v)
717 {
718 BSScene physScene = pPhysScene;
719 physScene.TaintedObject("BSParam.ResetConstraintSolver", delegate()
720 {
721 physScene.PE.ResetConstraintSolver(physScene.World);
722 });
723 }
726} 724}
727} 725}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
index 823402b..ec25aa9 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
@@ -75,6 +75,7 @@ public abstract class BSPhysObject : PhysicsActor
75 PhysicsScene = parentScene; 75 PhysicsScene = parentScene;
76 LocalID = localID; 76 LocalID = localID;
77 PhysObjectName = name; 77 PhysObjectName = name;
78 Name = name; // PhysicsActor also has the name of the object. Someday consolidate.
78 TypeName = typeName; 79 TypeName = typeName;
79 80
80 // We don't have any physical representation yet. 81 // We don't have any physical representation yet.
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
index 6cd72f2..f8a0c1e 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
@@ -876,14 +876,39 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
876 // will use the next time since it's pinned and shared memory. 876 // will use the next time since it's pinned and shared memory.
877 // Some of the values require calling into the physics engine to get the new 877 // Some of the values require calling into the physics engine to get the new
878 // value activated ('terrainFriction' for instance). 878 // value activated ('terrainFriction' for instance).
879 public bool SetPhysicsParameter(string parm, float val, uint localID) 879 public bool SetPhysicsParameter(string parm, string val, uint localID)
880 { 880 {
881 bool ret = false; 881 bool ret = false;
882
883 float valf = 0f;
884 if (val.ToLower() == "true")
885 {
886 valf = PhysParameterEntry.NUMERIC_TRUE;
887 }
888 else
889 {
890 if (val.ToLower() == "false")
891 {
892 valf = PhysParameterEntry.NUMERIC_FALSE;
893 }
894 else
895 {
896 try
897 {
898 valf = float.Parse(val);
899 }
900 catch
901 {
902 valf = 0f;
903 }
904 }
905 }
906
882 BSParam.ParameterDefn theParam; 907 BSParam.ParameterDefn theParam;
883 if (BSParam.TryGetParameter(parm, out theParam)) 908 if (BSParam.TryGetParameter(parm, out theParam))
884 { 909 {
885 // Set the value in the C# code 910 // Set the value in the C# code
886 theParam.setter(this, parm, localID, val); 911 theParam.setter(this, parm, localID, valf);
887 912
888 // Optionally set the parameter in the unmanaged code 913 // Optionally set the parameter in the unmanaged code
889 if (theParam.onObject != null) 914 if (theParam.onObject != null)
@@ -898,16 +923,16 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
898 case PhysParameterEntry.APPLY_TO_NONE: 923 case PhysParameterEntry.APPLY_TO_NONE:
899 // This will cause a call into the physical world if some operation is specified (SetOnObject). 924 // This will cause a call into the physical world if some operation is specified (SetOnObject).
900 objectIDs.Add(TERRAIN_ID); 925 objectIDs.Add(TERRAIN_ID);
901 TaintedUpdateParameter(parm, objectIDs, val); 926 TaintedUpdateParameter(parm, objectIDs, valf);
902 break; 927 break;
903 case PhysParameterEntry.APPLY_TO_ALL: 928 case PhysParameterEntry.APPLY_TO_ALL:
904 lock (PhysObjects) objectIDs = new List<uint>(PhysObjects.Keys); 929 lock (PhysObjects) objectIDs = new List<uint>(PhysObjects.Keys);
905 TaintedUpdateParameter(parm, objectIDs, val); 930 TaintedUpdateParameter(parm, objectIDs, valf);
906 break; 931 break;
907 default: 932 default:
908 // setting only one localID 933 // setting only one localID
909 objectIDs.Add(localID); 934 objectIDs.Add(localID);
910 TaintedUpdateParameter(parm, objectIDs, val); 935 TaintedUpdateParameter(parm, objectIDs, valf);
911 break; 936 break;
912 } 937 }
913 } 938 }
@@ -942,14 +967,14 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
942 967
943 // Get parameter. 968 // Get parameter.
944 // Return 'false' if not able to get the parameter. 969 // Return 'false' if not able to get the parameter.
945 public bool GetPhysicsParameter(string parm, out float value) 970 public bool GetPhysicsParameter(string parm, out string value)
946 { 971 {
947 float val = 0f; 972 string val = String.Empty;
948 bool ret = false; 973 bool ret = false;
949 BSParam.ParameterDefn theParam; 974 BSParam.ParameterDefn theParam;
950 if (BSParam.TryGetParameter(parm, out theParam)) 975 if (BSParam.TryGetParameter(parm, out theParam))
951 { 976 {
952 val = theParam.getter(this); 977 val = theParam.getter(this).ToString();
953 ret = true; 978 ret = true;
954 } 979 }
955 value = val; 980 value = val;
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
index fe0f984..15747c9 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs
@@ -608,7 +608,7 @@ public sealed class BSShapeCollection : IDisposable
608 // Since we're recreating new, get rid of the reference to the previous shape 608 // Since we're recreating new, get rid of the reference to the previous shape
609 DereferenceShape(prim.PhysShape, shapeCallback); 609 DereferenceShape(prim.PhysShape, shapeCallback);
610 610
611 newShape = CreatePhysicalMesh(prim.PhysObjectName, newMeshKey, prim.BaseShape, prim.Size, lod); 611 newShape = CreatePhysicalMesh(prim, newMeshKey, prim.BaseShape, prim.Size, lod);
612 // Take evasive action if the mesh was not constructed. 612 // Take evasive action if the mesh was not constructed.
613 newShape = VerifyMeshCreated(newShape, prim); 613 newShape = VerifyMeshCreated(newShape, prim);
614 614
@@ -619,7 +619,7 @@ public sealed class BSShapeCollection : IDisposable
619 return true; // 'true' means a new shape has been added to this prim 619 return true; // 'true' means a new shape has been added to this prim
620 } 620 }
621 621
622 private BulletShape CreatePhysicalMesh(string objName, System.UInt64 newMeshKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) 622 private BulletShape CreatePhysicalMesh(BSPhysObject prim, System.UInt64 newMeshKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod)
623 { 623 {
624 BulletShape newShape = new BulletShape(); 624 BulletShape newShape = new BulletShape();
625 625
@@ -631,7 +631,7 @@ public sealed class BSShapeCollection : IDisposable
631 } 631 }
632 else 632 else
633 { 633 {
634 IMesh meshData = PhysicsScene.mesher.CreateMesh(objName, pbs, size, lod, 634 IMesh meshData = PhysicsScene.mesher.CreateMesh(prim.PhysObjectName, pbs, size, lod,
635 false, // say it is not physical so a bounding box is not built 635 false, // say it is not physical so a bounding box is not built
636 false // do not cache the mesh and do not use previously built versions 636 false // do not cache the mesh and do not use previously built versions
637 ); 637 );
@@ -651,18 +651,20 @@ public sealed class BSShapeCollection : IDisposable
651 realIndicesIndex = 0; 651 realIndicesIndex = 0;
652 for (int tri = 0; tri < indices.Length; tri += 3) 652 for (int tri = 0; tri < indices.Length; tri += 3)
653 { 653 {
654 // Compute displacements into vertex array for each vertex of the triangle
654 int v1 = indices[tri + 0] * 3; 655 int v1 = indices[tri + 0] * 3;
655 int v2 = indices[tri + 1] * 3; 656 int v2 = indices[tri + 1] * 3;
656 int v3 = indices[tri + 2] * 3; 657 int v3 = indices[tri + 2] * 3;
657 if (!((verticesAsFloats[v1 + 0] == verticesAsFloats[v2 + 0] 658 // Check to see if any two of the vertices are the same
659 if (!( ( verticesAsFloats[v1 + 0] == verticesAsFloats[v2 + 0]
658 && verticesAsFloats[v1 + 1] == verticesAsFloats[v2 + 1] 660 && verticesAsFloats[v1 + 1] == verticesAsFloats[v2 + 1]
659 && verticesAsFloats[v1 + 2] == verticesAsFloats[v2 + 2]) 661 && verticesAsFloats[v1 + 2] == verticesAsFloats[v2 + 2])
660 || (verticesAsFloats[v2 + 0] == verticesAsFloats[v3 + 0] 662 || ( verticesAsFloats[v2 + 0] == verticesAsFloats[v3 + 0]
661 && verticesAsFloats[v2 + 1] == verticesAsFloats[v3 + 1] 663 && verticesAsFloats[v2 + 1] == verticesAsFloats[v3 + 1]
662 && verticesAsFloats[v2 + 2] == verticesAsFloats[v3 + 2]) 664 && verticesAsFloats[v2 + 2] == verticesAsFloats[v3 + 2])
663 || (verticesAsFloats[v1 + 0] == verticesAsFloats[v3 + 0] 665 || ( verticesAsFloats[v1 + 0] == verticesAsFloats[v3 + 0]
664 && verticesAsFloats[v1 + 1] == verticesAsFloats[v3 + 1] 666 && verticesAsFloats[v1 + 1] == verticesAsFloats[v3 + 1]
665 && verticesAsFloats[v1 + 2] == verticesAsFloats[v3 + 2])) 667 && verticesAsFloats[v1 + 2] == verticesAsFloats[v3 + 2]) )
666 ) 668 )
667 { 669 {
668 // None of the vertices of the triangles are the same. This is a good triangle; 670 // None of the vertices of the triangles are the same. This is a good triangle;
@@ -676,8 +678,16 @@ public sealed class BSShapeCollection : IDisposable
676 DetailLog("{0},BSShapeCollection.CreatePhysicalMesh,origTri={1},realTri={2},numVerts={3}", 678 DetailLog("{0},BSShapeCollection.CreatePhysicalMesh,origTri={1},realTri={2},numVerts={3}",
677 BSScene.DetailLogZero, indices.Length / 3, realIndicesIndex / 3, verticesAsFloats.Length / 3); 679 BSScene.DetailLogZero, indices.Length / 3, realIndicesIndex / 3, verticesAsFloats.Length / 3);
678 680
679 newShape = PhysicsScene.PE.CreateMeshShape(PhysicsScene.World, 681 if (realIndicesIndex != 0)
680 realIndicesIndex, indices, verticesAsFloats.Length/3, verticesAsFloats); 682 {
683 newShape = PhysicsScene.PE.CreateMeshShape(PhysicsScene.World,
684 realIndicesIndex, indices, verticesAsFloats.Length / 3, verticesAsFloats);
685 }
686 else
687 {
688 PhysicsScene.Logger.ErrorFormat("{0} All mesh triangles degenerate. Prim {1} at {2} in {3}",
689 LogHeader, prim.PhysObjectName, prim.RawPosition, PhysicsScene.Name);
690 }
681 } 691 }
682 } 692 }
683 newShape.shapeKey = newMeshKey; 693 newShape.shapeKey = newMeshKey;
diff --git a/OpenSim/Region/Physics/Manager/IPhysicsParameters.cs b/OpenSim/Region/Physics/Manager/IPhysicsParameters.cs
index b8676ba..31a397c 100755
--- a/OpenSim/Region/Physics/Manager/IPhysicsParameters.cs
+++ b/OpenSim/Region/Physics/Manager/IPhysicsParameters.cs
@@ -60,14 +60,14 @@ namespace OpenSim.Region.Physics.Manager
60 60
61 // Set parameter on a specific or all instances. 61 // Set parameter on a specific or all instances.
62 // Return 'false' if not able to set the parameter. 62 // Return 'false' if not able to set the parameter.
63 bool SetPhysicsParameter(string parm, float value, uint localID); 63 bool SetPhysicsParameter(string parm, string value, uint localID);
64 64
65 // Get parameter. 65 // Get parameter.
66 // Return 'false' if not able to get the parameter. 66 // Return 'false' if not able to get the parameter.
67 bool GetPhysicsParameter(string parm, out float value); 67 bool GetPhysicsParameter(string parm, out string value);
68 68
69 // Get parameter from a particular object 69 // Get parameter from a particular object
70 // TODO: 70 // TODO:
71 // bool GetPhysicsParameter(string parm, out float value, uint localID); 71 // bool GetPhysicsParameter(string parm, out string value, uint localID);
72 } 72 }
73} 73}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 64052ae..be6ac0a 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -7602,7 +7602,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7602 7602
7603 ExtraPhysicsData physdata = new ExtraPhysicsData(); 7603 ExtraPhysicsData physdata = new ExtraPhysicsData();
7604 physdata.Density = part.Density; 7604 physdata.Density = part.Density;
7605 physdata.Bounce = part.Bounciness; 7605 physdata.Bounce = part.Restitution;
7606 physdata.GravitationModifier = part.GravityModifier; 7606 physdata.GravitationModifier = part.GravityModifier;
7607 physdata.PhysShapeType = (PhysShapeType)shape_type; 7607 physdata.PhysShapeType = (PhysShapeType)shape_type;
7608 7608
diff --git a/OpenSim/Region/UserStatistics/WebStatsModule.cs b/OpenSim/Region/UserStatistics/WebStatsModule.cs
index 438ef48..b98b762 100644
--- a/OpenSim/Region/UserStatistics/WebStatsModule.cs
+++ b/OpenSim/Region/UserStatistics/WebStatsModule.cs
@@ -420,7 +420,7 @@ namespace OpenSim.Region.UserStatistics
420 Encoding encoding = Encoding.ASCII; 420 Encoding encoding = Encoding.ASCII;
421 int sizeOfChar = encoding.GetByteCount("\n"); 421 int sizeOfChar = encoding.GetByteCount("\n");
422 byte[] buffer = encoding.GetBytes("\n"); 422 byte[] buffer = encoding.GetBytes("\n");
423 string logfile = Util.logDir() + "/" + "OpenSim.log"; 423 string logfile = Util.logFile();
424 FileStream fs = new FileStream(logfile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 424 FileStream fs = new FileStream(logfile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
425 Int64 tokenCount = 0; 425 Int64 tokenCount = 0;
426 Int64 endPosition = fs.Length / sizeOfChar; 426 Int64 endPosition = fs.Length / sizeOfChar;