diff options
Diffstat (limited to 'OpenSim/Region/Framework')
5 files changed, 64 insertions, 0 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 0743ce7..a9f8a85 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -2364,6 +2364,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2364 | 2364 | ||
2365 | foreach (SceneObjectPart part in partList) | 2365 | foreach (SceneObjectPart part in partList) |
2366 | { | 2366 | { |
2367 | if (part.KeyframeMotion != null) | ||
2368 | { | ||
2369 | part.KeyframeMotion.Delete(); | ||
2370 | part.KeyframeMotion = null; | ||
2371 | } | ||
2372 | |||
2367 | if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0)) | 2373 | if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0)) |
2368 | { | 2374 | { |
2369 | PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed? | 2375 | PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed? |
@@ -2705,6 +2711,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2705 | // before we restart the scripts, or else some functions won't work. | 2711 | // before we restart the scripts, or else some functions won't work. |
2706 | newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject)); | 2712 | newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject)); |
2707 | newObject.ResumeScripts(); | 2713 | newObject.ResumeScripts(); |
2714 | |||
2715 | if (newObject.RootPart.KeyframeMotion != null) | ||
2716 | newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject); | ||
2708 | } | 2717 | } |
2709 | 2718 | ||
2710 | // Do this as late as possible so that listeners have full access to the incoming object | 2719 | // Do this as late as possible so that listeners have full access to the incoming object |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index a84f6d3..bb7ae7f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -1645,6 +1645,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1645 | /// <param name="childPrims"></param> | 1645 | /// <param name="childPrims"></param> |
1646 | protected internal void LinkObjects(SceneObjectPart root, List<SceneObjectPart> children) | 1646 | protected internal void LinkObjects(SceneObjectPart root, List<SceneObjectPart> children) |
1647 | { | 1647 | { |
1648 | if (root.KeyframeMotion != null) | ||
1649 | { | ||
1650 | root.KeyframeMotion.Stop(); | ||
1651 | root.KeyframeMotion = null; | ||
1652 | } | ||
1653 | |||
1648 | SceneObjectGroup parentGroup = root.ParentGroup; | 1654 | SceneObjectGroup parentGroup = root.ParentGroup; |
1649 | if (parentGroup == null) return; | 1655 | if (parentGroup == null) return; |
1650 | 1656 | ||
@@ -1722,6 +1728,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1722 | { | 1728 | { |
1723 | if (part != null) | 1729 | if (part != null) |
1724 | { | 1730 | { |
1731 | if (part.KeyframeMotion != null) | ||
1732 | { | ||
1733 | part.KeyframeMotion.Stop(); | ||
1734 | part.KeyframeMotion = null; | ||
1735 | } | ||
1725 | if (part.ParentGroup.PrimCount != 1) // Skip single | 1736 | if (part.ParentGroup.PrimCount != 1) // Skip single |
1726 | { | 1737 | { |
1727 | if (part.LinkNum < 2) // Root | 1738 | if (part.LinkNum < 2) // Root |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index df23cc5..da80e4f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -455,6 +455,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
455 | || Scene.TestBorderCross(val, Cardinals.S)) | 455 | || Scene.TestBorderCross(val, Cardinals.S)) |
456 | && !IsAttachmentCheckFull() && (!Scene.LoadingPrims)) | 456 | && !IsAttachmentCheckFull() && (!Scene.LoadingPrims)) |
457 | { | 457 | { |
458 | if (m_rootPart.KeyframeMotion != null) | ||
459 | m_rootPart.KeyframeMotion.StartCrossingCheck(); | ||
460 | |||
458 | m_scene.CrossPrimGroupIntoNewRegion(val, this, true); | 461 | m_scene.CrossPrimGroupIntoNewRegion(val, this, true); |
459 | } | 462 | } |
460 | } | 463 | } |
@@ -578,6 +581,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
578 | childPa.Selected = value; | 581 | childPa.Selected = value; |
579 | } | 582 | } |
580 | } | 583 | } |
584 | if (RootPart.KeyframeMotion != null) | ||
585 | RootPart.KeyframeMotion.Selected = value; | ||
581 | } | 586 | } |
582 | } | 587 | } |
583 | 588 | ||
@@ -1551,6 +1556,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1551 | 1556 | ||
1552 | newPart.DoPhysicsPropertyUpdate(originalPartPa.IsPhysical, true); | 1557 | newPart.DoPhysicsPropertyUpdate(originalPartPa.IsPhysical, true); |
1553 | } | 1558 | } |
1559 | if (part.KeyframeMotion != null) | ||
1560 | newPart.KeyframeMotion = part.KeyframeMotion.Copy(dupe); | ||
1554 | } | 1561 | } |
1555 | 1562 | ||
1556 | if (userExposed) | 1563 | if (userExposed) |
@@ -1578,6 +1585,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1578 | 1585 | ||
1579 | public void ScriptSetPhysicsStatus(bool usePhysics) | 1586 | public void ScriptSetPhysicsStatus(bool usePhysics) |
1580 | { | 1587 | { |
1588 | if (usePhysics) | ||
1589 | { | ||
1590 | if (RootPart.KeyframeMotion != null) | ||
1591 | RootPart.KeyframeMotion.Stop(); | ||
1592 | RootPart.KeyframeMotion = null; | ||
1593 | } | ||
1581 | UpdatePrimFlags(RootPart.LocalId, usePhysics, IsTemporary, IsPhantom, IsVolumeDetect); | 1594 | UpdatePrimFlags(RootPart.LocalId, usePhysics, IsTemporary, IsPhantom, IsVolumeDetect); |
1582 | } | 1595 | } |
1583 | 1596 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index ea8c3c5..ff3f738 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -354,6 +354,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
354 | private UUID m_collisionSound; | 354 | private UUID m_collisionSound; |
355 | private float m_collisionSoundVolume; | 355 | private float m_collisionSoundVolume; |
356 | 356 | ||
357 | private KeyframeMotion m_keyframeMotion = null; | ||
358 | |||
359 | public KeyframeMotion KeyframeMotion | ||
360 | { | ||
361 | get; set; | ||
362 | } | ||
363 | |||
357 | #endregion Fields | 364 | #endregion Fields |
358 | 365 | ||
359 | // ~SceneObjectPart() | 366 | // ~SceneObjectPart() |
@@ -1799,6 +1806,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1799 | Array.Copy(Shape.ExtraParams, extraP, extraP.Length); | 1806 | Array.Copy(Shape.ExtraParams, extraP, extraP.Length); |
1800 | dupe.Shape.ExtraParams = extraP; | 1807 | dupe.Shape.ExtraParams = extraP; |
1801 | 1808 | ||
1809 | // safeguard actual copy is done in sog.copy | ||
1810 | dupe.KeyframeMotion = null; | ||
1802 | dupe.PayPrice = (int[])PayPrice.Clone(); | 1811 | dupe.PayPrice = (int[])PayPrice.Clone(); |
1803 | 1812 | ||
1804 | dupe.DynAttrs.CopyFrom(DynAttrs); | 1813 | dupe.DynAttrs.CopyFrom(DynAttrs); |
@@ -2001,6 +2010,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2001 | { | 2010 | { |
2002 | if (UsePhysics) | 2011 | if (UsePhysics) |
2003 | { | 2012 | { |
2013 | if (ParentGroup.RootPart.KeyframeMotion != null) | ||
2014 | ParentGroup.RootPart.KeyframeMotion.Stop(); | ||
2015 | ParentGroup.RootPart.KeyframeMotion = null; | ||
2004 | ParentGroup.Scene.AddPhysicalPrim(1); | 2016 | ParentGroup.Scene.AddPhysicalPrim(1); |
2005 | 2017 | ||
2006 | pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; | 2018 | pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; |
@@ -4327,6 +4339,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
4327 | 4339 | ||
4328 | if (isPhysical) | 4340 | if (isPhysical) |
4329 | { | 4341 | { |
4342 | if (ParentGroup.RootPart.KeyframeMotion != null) | ||
4343 | ParentGroup.RootPart.KeyframeMotion.Stop(); | ||
4344 | ParentGroup.RootPart.KeyframeMotion = null; | ||
4330 | ParentGroup.Scene.AddPhysicalPrim(1); | 4345 | ParentGroup.Scene.AddPhysicalPrim(1); |
4331 | 4346 | ||
4332 | pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; | 4347 | pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; |
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index 39420a6..3882b45 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs | |||
@@ -262,6 +262,12 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
262 | sr.Close(); | 262 | sr.Close(); |
263 | } | 263 | } |
264 | 264 | ||
265 | XmlNodeList keymotion = doc.GetElementsByTagName("KeyframeMotion"); | ||
266 | if (keymotion.Count > 0) | ||
267 | sceneObject.RootPart.KeyframeMotion = KeyframeMotion.FromData(sceneObject, Convert.FromBase64String(keymotion[0].InnerText)); | ||
268 | else | ||
269 | sceneObject.RootPart.KeyframeMotion = null; | ||
270 | |||
265 | // Script state may, or may not, exist. Not having any, is NOT | 271 | // Script state may, or may not, exist. Not having any, is NOT |
266 | // ever a problem. | 272 | // ever a problem. |
267 | sceneObject.LoadScriptState(doc); | 273 | sceneObject.LoadScriptState(doc); |
@@ -1182,6 +1188,16 @@ namespace OpenSim.Region.Framework.Scenes.Serialization | |||
1182 | }); | 1188 | }); |
1183 | 1189 | ||
1184 | writer.WriteEndElement(); | 1190 | writer.WriteEndElement(); |
1191 | |||
1192 | if (sog.RootPart.KeyframeMotion != null) | ||
1193 | { | ||
1194 | Byte[] data = sog.RootPart.KeyframeMotion.Serialize(); | ||
1195 | |||
1196 | writer.WriteStartElement(String.Empty, "KeyframeMotion", String.Empty); | ||
1197 | writer.WriteBase64(data, 0, data.Length); | ||
1198 | writer.WriteEndElement(); | ||
1199 | } | ||
1200 | |||
1185 | writer.WriteEndElement(); | 1201 | writer.WriteEndElement(); |
1186 | } | 1202 | } |
1187 | 1203 | ||