From fca8c82232a42191270cb8d18dba6b54d382a2c2 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 26 Feb 2012 18:11:38 +0100
Subject: Move KeyframeMotion from SOG to SOP because we can't persist it any
other way because SOG doesn't technically exist in the DB
---
.../InventoryAccess/InventoryAccessModule.cs | 6 ++---
OpenSim/Region/Framework/Scenes/Scene.cs | 4 ++--
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 11 +++++++++
.../Region/Framework/Scenes/SceneObjectGroup.cs | 26 +++++++++-------------
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 14 +++++++++---
.../Scenes/Serialization/SceneObjectSerializer.cs | 8 +++----
.../Shared/Api/Implementation/LSL_Api.cs | 22 +++++++++---------
7 files changed, 52 insertions(+), 39 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 098123a..192d55f 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -355,11 +355,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
foreach (SceneObjectGroup objectGroup in objlist)
{
- if (objectGroup.KeyframeMotion != null)
- objectGroup.KeyframeMotion.Stop();
+ if (objectGroup.RootPart.KeyframeMotion != null)
+ objectGroup.RootPart.KeyframeMotion.Stop();
objectGroup.RootPart.SetForce(Vector3.Zero);
objectGroup.RootPart.SetAngularImpulse(Vector3.Zero, false);
- objectGroup.KeyframeMotion = null;
+ objectGroup.RootPart.KeyframeMotion = null;
Vector3 inventoryStoredPosition = new Vector3
(((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index c20da4b..11a41aa 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2421,8 +2421,8 @@ namespace OpenSim.Region.Framework.Scenes
if (newPosition != Vector3.Zero)
newObject.RootPart.GroupPosition = newPosition;
- if (newObject.KeyframeMotion != null)
- newObject.KeyframeMotion.UpdateSceneObject(newObject);
+ if (newObject.RootPart.KeyframeMotion != null)
+ newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject);
if (!AddSceneObject(newObject))
{
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 5a7f124..a320601 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1731,6 +1731,12 @@ namespace OpenSim.Region.Framework.Scenes
///
protected internal void LinkObjects(SceneObjectPart root, List children)
{
+ if (root.KeyframeMotion != null)
+ {
+ root.KeyframeMotion.Stop();
+ root.KeyframeMotion = null;
+ }
+
SceneObjectGroup parentGroup = root.ParentGroup;
if (parentGroup == null) return;
@@ -1823,6 +1829,11 @@ namespace OpenSim.Region.Framework.Scenes
{
if (part != null)
{
+ if (part.KeyframeMotion != null)
+ {
+ part.KeyframeMotion.Stop();
+ part.KeyframeMotion = null;
+ }
if (part.ParentGroup.PrimCount != 1) // Skip single
{
if (part.LinkNum < 2) // Root
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index e509d4e..fefae9d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -114,12 +114,6 @@ namespace OpenSim.Region.Framework.Scenes
private Random m_rand;
private bool m_suspendUpdates;
private List m_linkedAvatars = new List();
- private KeyframeMotion m_keyframeMotion = null;
-
- public KeyframeMotion KeyframeMotion
- {
- get; set;
- }
public bool areUpdatesSuspended
{
@@ -726,8 +720,8 @@ namespace OpenSim.Region.Framework.Scenes
child.PhysActor.Selected = value;
}
}
- if (KeyframeMotion != null)
- KeyframeMotion.Selected = value;
+ if (RootPart.KeyframeMotion != null)
+ RootPart.KeyframeMotion.Selected = value;
}
}
@@ -1829,11 +1823,6 @@ namespace OpenSim.Region.Framework.Scenes
// Name, UUID, m_scene.RegionInfo.RegionName);
SceneObjectGroup backup_group = Copy(false);
- if (KeyframeMotion != null)
- {
- backup_group.KeyframeMotion = KeyframeMotion.FromData(backup_group, KeyframeMotion.Serialize());
- KeyframeMotion.UpdateSceneObject(this);
- }
backup_group.RootPart.Velocity = RootPart.Velocity;
backup_group.RootPart.Acceleration = RootPart.Acceleration;
backup_group.RootPart.AngularVelocity = RootPart.AngularVelocity;
@@ -1846,6 +1835,11 @@ namespace OpenSim.Region.Framework.Scenes
backup_group.ForEachPart(delegate(SceneObjectPart part)
{
+ if (part.KeyframeMotion != null)
+ {
+ part.KeyframeMotion = KeyframeMotion.FromData(backup_group, part.KeyframeMotion.Serialize());
+ part.KeyframeMotion.UpdateSceneObject(this);
+ }
part.Inventory.ProcessInventoryBackup(datastore);
});
@@ -2001,9 +1995,9 @@ namespace OpenSim.Region.Framework.Scenes
{
if (usePhysics)
{
- if (KeyframeMotion != null)
- KeyframeMotion.Stop();
- KeyframeMotion = null;
+ if (RootPart.KeyframeMotion != null)
+ RootPart.KeyframeMotion.Stop();
+ RootPart.KeyframeMotion = null;
}
UpdatePrimFlags(RootPart.LocalId, usePhysics, IsTemporary, IsPhantom, IsVolumeDetect);
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 0728042..ea3d716 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -315,6 +315,14 @@ namespace OpenSim.Region.Framework.Scenes
private SOPVehicle m_vehicle = null;
+ private KeyframeMotion m_keyframeMotion = null;
+
+ public KeyframeMotion KeyframeMotion
+ {
+ get; set;
+ }
+
+
#endregion Fields
// ~SceneObjectPart()
@@ -1924,9 +1932,9 @@ namespace OpenSim.Region.Framework.Scenes
{
if (UsePhysics)
{
- if (ParentGroup.KeyframeMotion != null)
- ParentGroup.KeyframeMotion.Stop();
- ParentGroup.KeyframeMotion = null;
+ if (ParentGroup.RootPart.KeyframeMotion != null)
+ ParentGroup.RootPart.KeyframeMotion.Stop();
+ ParentGroup.RootPart.KeyframeMotion = null;
ParentGroup.Scene.AddPhysicalPrim(1);
PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate;
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index 118a63a..51a3320 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -246,9 +246,9 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
XmlNodeList keymotion = doc.GetElementsByTagName("KeyframeMotion");
if (keymotion.Count > 0)
- sceneObject.KeyframeMotion = KeyframeMotion.FromData(sceneObject, Convert.FromBase64String(keymotion[0].InnerText));
+ sceneObject.RootPart.KeyframeMotion = KeyframeMotion.FromData(sceneObject, Convert.FromBase64String(keymotion[0].InnerText));
else
- sceneObject.KeyframeMotion = null;
+ sceneObject.RootPart.KeyframeMotion = null;
// Script state may, or may not, exist. Not having any, is NOT
// ever a problem.
@@ -1174,9 +1174,9 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
writer.WriteEndElement();
- if (sog.KeyframeMotion != null)
+ if (sog.RootPart.KeyframeMotion != null)
{
- Byte[] data = sog.KeyframeMotion.Serialize();
+ Byte[] data = sog.RootPart.KeyframeMotion.Serialize();
writer.WriteStartElement(String.Empty, "KeyframeMotion", String.Empty);
writer.WriteBase64(data, 0, data.Length);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index e4ab14f..e9f9c2d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -11908,9 +11908,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (frames.Data.Length > 0) // We are getting a new motion
{
- if (group.KeyframeMotion != null)
- group.KeyframeMotion.Stop();
- group.KeyframeMotion = null;
+ if (group.RootPart.KeyframeMotion != null)
+ group.RootPart.KeyframeMotion.Stop();
+ group.RootPart.KeyframeMotion = null;
int idx = 0;
@@ -11953,7 +11953,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
- group.KeyframeMotion = new KeyframeMotion(group, mode, data);
+ group.RootPart.KeyframeMotion = new KeyframeMotion(group, mode, data);
idx = 0;
@@ -11990,17 +11990,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
keyframes.Add(frame);
}
- group.KeyframeMotion.SetKeyframes(keyframes.ToArray());
- group.KeyframeMotion.Start();
+ group.RootPart.KeyframeMotion.SetKeyframes(keyframes.ToArray());
+ group.RootPart.KeyframeMotion.Start();
}
else
{
- if (group.KeyframeMotion == null)
+ if (group.RootPart.KeyframeMotion == null)
return;
if (options.Data.Length == 0)
{
- group.KeyframeMotion.Stop();
+ group.RootPart.KeyframeMotion.Stop();
return;
}
@@ -12020,13 +12020,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
switch (cmd)
{
case ScriptBaseClass.KFM_CMD_PLAY:
- group.KeyframeMotion.Start();
+ group.RootPart.KeyframeMotion.Start();
break;
case ScriptBaseClass.KFM_CMD_STOP:
- group.KeyframeMotion.Stop();
+ group.RootPart.KeyframeMotion.Stop();
break;
case ScriptBaseClass.KFM_CMD_PAUSE:
- group.KeyframeMotion.Pause();
+ group.RootPart.KeyframeMotion.Pause();
break;
}
break;
--
cgit v1.1
From e5e5b94cbe6076f74d5ad2358d020f7d4f7ac18f Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 26 Feb 2012 21:16:24 +0100
Subject: Make llSetKeyframedMotion prims waut at the borders of down sims and
try again periodically.
---
.../Framework/EntityTransfer/EntityTransferModule.cs | 6 ++++++
OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | 12 ++++++++++++
2 files changed, 18 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 2498705..60a8f86 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -1746,6 +1746,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (grp.RootPart.PhysActor != null)
{
grp.RootPart.PhysActor.CrossingFailure();
+ if (grp.RootPart.KeyframeMotion != null)
+ {
+ grp.RootPart.Velocity = Vector3.Zero;
+ grp.RootPart.KeyframeMotion.CrossingFailure();
+ grp.SendGroupRootTerseUpdate();
+ }
}
}
diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
index bf18f4d..b7b0d27 100644
--- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
+++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
@@ -406,5 +406,17 @@ namespace OpenSim.Region.Framework.Scenes
m_group = tmp;
return ms.ToArray();
}
+
+ public void CrossingFailure()
+ {
+ // The serialization has stopped the timer, so let's wait a moment
+ // then retry the crossing. We'll get back here if it fails.
+ Util.FireAndForget(delegate (object x)
+ {
+ Thread.Sleep(60000);
+ if (m_running)
+ m_timer.Start();
+ });
+ }
}
}
--
cgit v1.1