Hook up Keyframe motion to almost everything. Failing to cross a sim border
may yield unexpected results in some cases. No database persistence yet,cpu-performance
parent
e1d98c9e4c
commit
81ad9255b5
|
@ -2247,6 +2247,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
// move out of the region creating an infinite loop of failed attempts to cross
|
// move out of the region creating an infinite loop of failed attempts to cross
|
||||||
grp.UpdatePrimFlags(grp.RootPart.LocalId,false,grp.IsTemporary,grp.IsPhantom,false);
|
grp.UpdatePrimFlags(grp.RootPart.LocalId,false,grp.IsTemporary,grp.IsPhantom,false);
|
||||||
|
|
||||||
|
if (grp.RootPart.KeyframeMotion != null)
|
||||||
|
grp.RootPart.KeyframeMotion.CrossingFailure();
|
||||||
|
|
||||||
grp.ScheduleGroupForFullUpdate();
|
grp.ScheduleGroupForFullUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -357,6 +357,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
|
|
||||||
foreach (SceneObjectGroup objectGroup in objlist)
|
foreach (SceneObjectGroup objectGroup in objlist)
|
||||||
{
|
{
|
||||||
|
if (objectGroup.RootPart.KeyframeMotion != null)
|
||||||
|
objectGroup.RootPart.KeyframeMotion.Stop();
|
||||||
|
objectGroup.RootPart.KeyframeMotion = null;
|
||||||
// Vector3 inventoryStoredPosition = new Vector3
|
// Vector3 inventoryStoredPosition = new Vector3
|
||||||
// (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
|
// (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize)
|
||||||
// ? 250
|
// ? 250
|
||||||
|
|
|
@ -2364,6 +2364,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
foreach (SceneObjectPart part in partList)
|
foreach (SceneObjectPart part in partList)
|
||||||
{
|
{
|
||||||
|
if (part.KeyframeMotion != null)
|
||||||
|
{
|
||||||
|
part.KeyframeMotion.Delete();
|
||||||
|
part.KeyframeMotion = null;
|
||||||
|
}
|
||||||
|
|
||||||
if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0))
|
if (part.IsJoint() && ((part.Flags & PrimFlags.Physics) != 0))
|
||||||
{
|
{
|
||||||
PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed?
|
PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed?
|
||||||
|
@ -2705,6 +2711,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// before we restart the scripts, or else some functions won't work.
|
// before we restart the scripts, or else some functions won't work.
|
||||||
newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject));
|
newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject));
|
||||||
newObject.ResumeScripts();
|
newObject.ResumeScripts();
|
||||||
|
|
||||||
|
if (newObject.RootPart.KeyframeMotion != null)
|
||||||
|
newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Do this as late as possible so that listeners have full access to the incoming object
|
// Do this as late as possible so that listeners have full access to the incoming object
|
||||||
|
|
|
@ -1645,6 +1645,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="childPrims"></param>
|
/// <param name="childPrims"></param>
|
||||||
protected internal void LinkObjects(SceneObjectPart root, List<SceneObjectPart> children)
|
protected internal void LinkObjects(SceneObjectPart root, List<SceneObjectPart> children)
|
||||||
{
|
{
|
||||||
|
if (root.KeyframeMotion != null)
|
||||||
|
{
|
||||||
|
root.KeyframeMotion.Stop();
|
||||||
|
root.KeyframeMotion = null;
|
||||||
|
}
|
||||||
|
|
||||||
SceneObjectGroup parentGroup = root.ParentGroup;
|
SceneObjectGroup parentGroup = root.ParentGroup;
|
||||||
if (parentGroup == null) return;
|
if (parentGroup == null) return;
|
||||||
|
|
||||||
|
@ -1722,6 +1728,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
if (part != null)
|
if (part != null)
|
||||||
{
|
{
|
||||||
|
if (part.KeyframeMotion != null)
|
||||||
|
{
|
||||||
|
part.KeyframeMotion.Stop();
|
||||||
|
part.KeyframeMotion = null;
|
||||||
|
}
|
||||||
if (part.ParentGroup.PrimCount != 1) // Skip single
|
if (part.ParentGroup.PrimCount != 1) // Skip single
|
||||||
{
|
{
|
||||||
if (part.LinkNum < 2) // Root
|
if (part.LinkNum < 2) // Root
|
||||||
|
|
|
@ -455,6 +455,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|| Scene.TestBorderCross(val, Cardinals.S))
|
|| Scene.TestBorderCross(val, Cardinals.S))
|
||||||
&& !IsAttachmentCheckFull() && (!Scene.LoadingPrims))
|
&& !IsAttachmentCheckFull() && (!Scene.LoadingPrims))
|
||||||
{
|
{
|
||||||
|
if (m_rootPart.KeyframeMotion != null)
|
||||||
|
m_rootPart.KeyframeMotion.StartCrossingCheck();
|
||||||
|
|
||||||
m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
|
m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -578,6 +581,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
childPa.Selected = value;
|
childPa.Selected = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (RootPart.KeyframeMotion != null)
|
||||||
|
RootPart.KeyframeMotion.Selected = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1551,6 +1556,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
newPart.DoPhysicsPropertyUpdate(originalPartPa.IsPhysical, true);
|
newPart.DoPhysicsPropertyUpdate(originalPartPa.IsPhysical, true);
|
||||||
}
|
}
|
||||||
|
if (part.KeyframeMotion != null)
|
||||||
|
newPart.KeyframeMotion = part.KeyframeMotion.Copy(dupe);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userExposed)
|
if (userExposed)
|
||||||
|
@ -1578,6 +1585,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public void ScriptSetPhysicsStatus(bool usePhysics)
|
public void ScriptSetPhysicsStatus(bool usePhysics)
|
||||||
{
|
{
|
||||||
|
if (usePhysics)
|
||||||
|
{
|
||||||
|
if (RootPart.KeyframeMotion != null)
|
||||||
|
RootPart.KeyframeMotion.Stop();
|
||||||
|
RootPart.KeyframeMotion = null;
|
||||||
|
}
|
||||||
UpdatePrimFlags(RootPart.LocalId, usePhysics, IsTemporary, IsPhantom, IsVolumeDetect);
|
UpdatePrimFlags(RootPart.LocalId, usePhysics, IsTemporary, IsPhantom, IsVolumeDetect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -354,6 +354,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
private UUID m_collisionSound;
|
private UUID m_collisionSound;
|
||||||
private float m_collisionSoundVolume;
|
private float m_collisionSoundVolume;
|
||||||
|
|
||||||
|
private KeyframeMotion m_keyframeMotion = null;
|
||||||
|
|
||||||
|
public KeyframeMotion KeyframeMotion
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion Fields
|
#endregion Fields
|
||||||
|
|
||||||
// ~SceneObjectPart()
|
// ~SceneObjectPart()
|
||||||
|
@ -1799,6 +1806,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Array.Copy(Shape.ExtraParams, extraP, extraP.Length);
|
Array.Copy(Shape.ExtraParams, extraP, extraP.Length);
|
||||||
dupe.Shape.ExtraParams = extraP;
|
dupe.Shape.ExtraParams = extraP;
|
||||||
|
|
||||||
|
// safeguard actual copy is done in sog.copy
|
||||||
|
dupe.KeyframeMotion = null;
|
||||||
dupe.PayPrice = (int[])PayPrice.Clone();
|
dupe.PayPrice = (int[])PayPrice.Clone();
|
||||||
|
|
||||||
dupe.DynAttrs.CopyFrom(DynAttrs);
|
dupe.DynAttrs.CopyFrom(DynAttrs);
|
||||||
|
@ -2001,6 +2010,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
if (UsePhysics)
|
if (UsePhysics)
|
||||||
{
|
{
|
||||||
|
if (ParentGroup.RootPart.KeyframeMotion != null)
|
||||||
|
ParentGroup.RootPart.KeyframeMotion.Stop();
|
||||||
|
ParentGroup.RootPart.KeyframeMotion = null;
|
||||||
ParentGroup.Scene.AddPhysicalPrim(1);
|
ParentGroup.Scene.AddPhysicalPrim(1);
|
||||||
|
|
||||||
pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate;
|
pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate;
|
||||||
|
@ -4327,6 +4339,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
if (isPhysical)
|
if (isPhysical)
|
||||||
{
|
{
|
||||||
|
if (ParentGroup.RootPart.KeyframeMotion != null)
|
||||||
|
ParentGroup.RootPart.KeyframeMotion.Stop();
|
||||||
|
ParentGroup.RootPart.KeyframeMotion = null;
|
||||||
ParentGroup.Scene.AddPhysicalPrim(1);
|
ParentGroup.Scene.AddPhysicalPrim(1);
|
||||||
|
|
||||||
pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate;
|
pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate;
|
||||||
|
|
|
@ -262,6 +262,12 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
sr.Close();
|
sr.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
XmlNodeList keymotion = doc.GetElementsByTagName("KeyframeMotion");
|
||||||
|
if (keymotion.Count > 0)
|
||||||
|
sceneObject.RootPart.KeyframeMotion = KeyframeMotion.FromData(sceneObject, Convert.FromBase64String(keymotion[0].InnerText));
|
||||||
|
else
|
||||||
|
sceneObject.RootPart.KeyframeMotion = null;
|
||||||
|
|
||||||
// Script state may, or may not, exist. Not having any, is NOT
|
// Script state may, or may not, exist. Not having any, is NOT
|
||||||
// ever a problem.
|
// ever a problem.
|
||||||
sceneObject.LoadScriptState(doc);
|
sceneObject.LoadScriptState(doc);
|
||||||
|
@ -1182,6 +1188,16 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
|
||||||
});
|
});
|
||||||
|
|
||||||
writer.WriteEndElement();
|
writer.WriteEndElement();
|
||||||
|
|
||||||
|
if (sog.RootPart.KeyframeMotion != null)
|
||||||
|
{
|
||||||
|
Byte[] data = sog.RootPart.KeyframeMotion.Serialize();
|
||||||
|
|
||||||
|
writer.WriteStartElement(String.Empty, "KeyframeMotion", String.Empty);
|
||||||
|
writer.WriteBase64(data, 0, data.Length);
|
||||||
|
writer.WriteEndElement();
|
||||||
|
}
|
||||||
|
|
||||||
writer.WriteEndElement();
|
writer.WriteEndElement();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7296,6 +7296,146 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void llSetKeyframedMotion(LSL_List frames, LSL_List options)
|
||||||
|
{
|
||||||
|
SceneObjectGroup group = m_host.ParentGroup;
|
||||||
|
|
||||||
|
if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical)
|
||||||
|
return;
|
||||||
|
if (group.IsAttachment)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (frames.Data.Length > 0) // We are getting a new motion
|
||||||
|
{
|
||||||
|
if (group.RootPart.KeyframeMotion != null)
|
||||||
|
group.RootPart.KeyframeMotion.Delete();
|
||||||
|
group.RootPart.KeyframeMotion = null;
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
|
KeyframeMotion.PlayMode mode = KeyframeMotion.PlayMode.Forward;
|
||||||
|
KeyframeMotion.DataFormat data = KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation;
|
||||||
|
|
||||||
|
while (idx < options.Data.Length)
|
||||||
|
{
|
||||||
|
int option = (int)options.GetLSLIntegerItem(idx++);
|
||||||
|
int remain = options.Data.Length - idx;
|
||||||
|
|
||||||
|
switch (option)
|
||||||
|
{
|
||||||
|
case ScriptBaseClass.KFM_MODE:
|
||||||
|
if (remain < 1)
|
||||||
|
break;
|
||||||
|
int modeval = (int)options.GetLSLIntegerItem(idx++);
|
||||||
|
switch(modeval)
|
||||||
|
{
|
||||||
|
case ScriptBaseClass.KFM_FORWARD:
|
||||||
|
mode = KeyframeMotion.PlayMode.Forward;
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_REVERSE:
|
||||||
|
mode = KeyframeMotion.PlayMode.Reverse;
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_LOOP:
|
||||||
|
mode = KeyframeMotion.PlayMode.Loop;
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_PING_PONG:
|
||||||
|
mode = KeyframeMotion.PlayMode.PingPong;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_DATA:
|
||||||
|
if (remain < 1)
|
||||||
|
break;
|
||||||
|
int dataval = (int)options.GetLSLIntegerItem(idx++);
|
||||||
|
data = (KeyframeMotion.DataFormat)dataval;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
group.RootPart.KeyframeMotion = new KeyframeMotion(group, mode, data);
|
||||||
|
|
||||||
|
idx = 0;
|
||||||
|
|
||||||
|
int elemLength = 2;
|
||||||
|
if (data == (KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation))
|
||||||
|
elemLength = 3;
|
||||||
|
|
||||||
|
List<KeyframeMotion.Keyframe> keyframes = new List<KeyframeMotion.Keyframe>();
|
||||||
|
while (idx < frames.Data.Length)
|
||||||
|
{
|
||||||
|
int remain = frames.Data.Length - idx;
|
||||||
|
|
||||||
|
if (remain < elemLength)
|
||||||
|
break;
|
||||||
|
|
||||||
|
KeyframeMotion.Keyframe frame = new KeyframeMotion.Keyframe();
|
||||||
|
frame.Position = null;
|
||||||
|
frame.Rotation = null;
|
||||||
|
|
||||||
|
if ((data & KeyframeMotion.DataFormat.Translation) != 0)
|
||||||
|
{
|
||||||
|
LSL_Types.Vector3 tempv = frames.GetVector3Item(idx++);
|
||||||
|
frame.Position = new Vector3((float)tempv.x, (float)tempv.y, (float)tempv.z);
|
||||||
|
}
|
||||||
|
if ((data & KeyframeMotion.DataFormat.Rotation) != 0)
|
||||||
|
{
|
||||||
|
LSL_Types.Quaternion tempq = frames.GetQuaternionItem(idx++);
|
||||||
|
Quaternion q = new Quaternion((float)tempq.x, (float)tempq.y, (float)tempq.z, (float)tempq.s);
|
||||||
|
q.Normalize();
|
||||||
|
frame.Rotation = q;
|
||||||
|
}
|
||||||
|
|
||||||
|
float tempf = (float)frames.GetLSLFloatItem(idx++);
|
||||||
|
frame.TimeMS = (int)(tempf * 1000.0f);
|
||||||
|
|
||||||
|
keyframes.Add(frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
group.RootPart.KeyframeMotion.SetKeyframes(keyframes.ToArray());
|
||||||
|
group.RootPart.KeyframeMotion.Start();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (group.RootPart.KeyframeMotion == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (options.Data.Length == 0)
|
||||||
|
{
|
||||||
|
group.RootPart.KeyframeMotion.Stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int code = (int)options.GetLSLIntegerItem(0);
|
||||||
|
|
||||||
|
int idx = 0;
|
||||||
|
|
||||||
|
while (idx < options.Data.Length)
|
||||||
|
{
|
||||||
|
int option = (int)options.GetLSLIntegerItem(idx++);
|
||||||
|
int remain = options.Data.Length - idx;
|
||||||
|
|
||||||
|
switch (option)
|
||||||
|
{
|
||||||
|
case ScriptBaseClass.KFM_COMMAND:
|
||||||
|
int cmd = (int)options.GetLSLIntegerItem(idx++);
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case ScriptBaseClass.KFM_CMD_PLAY:
|
||||||
|
group.RootPart.KeyframeMotion.Start();
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_CMD_STOP:
|
||||||
|
group.RootPart.KeyframeMotion.Stop();
|
||||||
|
break;
|
||||||
|
case ScriptBaseClass.KFM_CMD_PAUSE:
|
||||||
|
group.RootPart.KeyframeMotion.Pause();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected LSL_List SetPrimParams(SceneObjectPart part, LSL_List rules, string originFunc, ref uint rulesParsed)
|
protected LSL_List SetPrimParams(SceneObjectPart part, LSL_List rules, string originFunc, ref uint rulesParsed)
|
||||||
{
|
{
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
|
|
|
@ -427,6 +427,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
||||||
void print(string str);
|
void print(string str);
|
||||||
|
|
||||||
void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules, string originFunc);
|
void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules, string originFunc);
|
||||||
|
void llSetKeyframedMotion(LSL_List frames, LSL_List options);
|
||||||
LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
|
LSL_List GetPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -748,6 +748,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||||
public static readonly LSLInteger RCERR_SIM_PERF_LOW = -2;
|
public static readonly LSLInteger RCERR_SIM_PERF_LOW = -2;
|
||||||
public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = 3;
|
public static readonly LSLInteger RCERR_CAST_TIME_EXCEEDED = 3;
|
||||||
|
|
||||||
|
public const int KFM_MODE = 1;
|
||||||
|
public const int KFM_LOOP = 1;
|
||||||
|
public const int KFM_REVERSE = 3;
|
||||||
|
public const int KFM_FORWARD = 0;
|
||||||
|
public const int KFM_PING_PONG = 2;
|
||||||
|
public const int KFM_DATA = 2;
|
||||||
|
public const int KFM_TRANSLATION = 2;
|
||||||
|
public const int KFM_ROTATION = 1;
|
||||||
|
public const int KFM_COMMAND = 0;
|
||||||
|
public const int KFM_CMD_PLAY = 0;
|
||||||
|
public const int KFM_CMD_STOP = 1;
|
||||||
|
public const int KFM_CMD_PAUSE = 2;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// process name parameter as regex
|
/// process name parameter as regex
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -554,6 +554,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||||
return m_LSL_Functions.llGetLinkNumberOfSides(link);
|
return m_LSL_Functions.llGetLinkNumberOfSides(link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void llSetKeyframedMotion(LSL_List frames, LSL_List options)
|
||||||
|
{
|
||||||
|
m_LSL_Functions.llSetKeyframedMotion(frames, options);
|
||||||
|
}
|
||||||
|
|
||||||
public LSL_Integer llGetListEntryType(LSL_List src, int index)
|
public LSL_Integer llGetListEntryType(LSL_List src, int index)
|
||||||
{
|
{
|
||||||
return m_LSL_Functions.llGetListEntryType(src, index);
|
return m_LSL_Functions.llGetListEntryType(src, index);
|
||||||
|
|
Loading…
Reference in New Issue