From 443fc60cdf399a49832e787ca58c2644bef7e457 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Sat, 1 Apr 2017 17:49:17 +0100
Subject: store the physics inertia override in Mysql and add it to
serializer. run prebuild is required
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 20 ++++++++++---------
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 21 +++++++++++++++++++-
.../Scenes/Serialization/SceneObjectSerializer.cs | 23 +++++++++++++++++++++-
3 files changed, 53 insertions(+), 11 deletions(-)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 77658ef..719a5dd 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -5037,20 +5037,22 @@ namespace OpenSim.Region.Framework.Scenes
public void SetInertiaData(float TotalMass, Vector3 CenterOfMass, Vector3 Inertia, Vector4 aux )
{
- PhysicsActor pa = RootPart.PhysActor;
+ PhysicsInertiaData inertia = new PhysicsInertiaData();
+ inertia.TotalMass = TotalMass;
+ inertia.CenterOfMass = CenterOfMass;
+ inertia.Inertia = Inertia;
+ inertia.InertiaRotation = aux;
+
+ if(TotalMass < 0)
+ RootPart.PhysicsInertia = null;
+ else
+ RootPart.PhysicsInertia = new PhysicsInertiaData(inertia);
+ PhysicsActor pa = RootPart.PhysActor;
if(pa !=null)
- {
- PhysicsInertiaData inertia = new PhysicsInertiaData();
- inertia.TotalMass = TotalMass;
- inertia.CenterOfMass = CenterOfMass;
- inertia.Inertia = Inertia;
- inertia.InertiaRotation = aux;
pa.SetInertiaData(inertia);
- }
}
-
///
/// Set the user group to which this scene object belongs.
///
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index bf0e31b..46b7b86 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -406,6 +406,8 @@ namespace OpenSim.Region.Framework.Scenes
private SOPVehicle m_vehicleParams = null;
+ private PhysicsInertiaData m_physicsInertia;
+
public KeyframeMotion KeyframeMotion
{
get; set;
@@ -3548,6 +3550,18 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
Force = force;
}
+ public PhysicsInertiaData PhysicsInertia
+ {
+ get
+ {
+ return m_physicsInertia;
+ }
+ set
+ {
+ m_physicsInertia = value;
+ }
+ }
+
public SOPVehicle VehicleParams
{
get
@@ -4748,8 +4762,13 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
if (VolumeDetectActive) // change if not the default only
pa.SetVolumeDetect(1);
+
+ bool isroot = (m_localId == ParentGroup.RootPart.LocalId);
+
+ if(isroot && m_physicsInertia != null)
+ pa.SetInertiaData(m_physicsInertia);
- if (m_vehicleParams != null && m_localId == ParentGroup.RootPart.LocalId)
+ if (isroot && m_vehicleParams != null )
{
m_vehicleParams.SetVehicle(pa);
if(isPhysical && !isPhantom && m_vehicleParams.CameraDecoupled)
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index a12a401..87d1ace 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -453,9 +453,10 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
m_SOPXmlProcessors.Add("Torque", ProcessTorque);
m_SOPXmlProcessors.Add("VolumeDetectActive", ProcessVolumeDetectActive);
-
m_SOPXmlProcessors.Add("Vehicle", ProcessVehicle);
+ m_SOPXmlProcessors.Add("PhysicsInertia", ProcessPhysicsInertia);
+
m_SOPXmlProcessors.Add("RotationAxisLocks", ProcessRotationAxisLocks);
m_SOPXmlProcessors.Add("PhysicsShapeType", ProcessPhysicsShapeType);
m_SOPXmlProcessors.Add("Density", ProcessDensity);
@@ -781,6 +782,23 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
}
}
+ private static void ProcessPhysicsInertia(SceneObjectPart obj, XmlReader reader)
+ {
+ PhysicsInertiaData pdata = PhysicsInertiaData.FromXml2(reader);
+
+ if (pdata == null)
+ {
+ obj.PhysicsInertia = null;
+ m_log.DebugFormat(
+ "[SceneObjectSerializer]: Parsing PhysicsInertiaData for object part {0} {1} encountered errors. Please see earlier log entries.",
+ obj.Name, obj.UUID);
+ }
+ else
+ {
+ obj.PhysicsInertia = pdata;
+ }
+ }
+
private static void ProcessShape(SceneObjectPart obj, XmlReader reader)
{
List errorNodeNames;
@@ -1498,6 +1516,9 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
if (sop.VehicleParams != null)
sop.VehicleParams.ToXml2(writer);
+ if (sop.PhysicsInertia != null)
+ sop.PhysicsInertia.ToXml2(writer);
+
if(sop.RotationAxisLocks != 0)
writer.WriteElementString("RotationAxisLocks", sop.RotationAxisLocks.ToString().ToLower());
writer.WriteElementString("PhysicsShapeType", sop.PhysicsShapeType.ToString().ToLower());
--
cgit v1.1