mirror of
https://github.com/opensim/opensim.git
synced 2026-08-01 06:06:06 +08:00
Implement llSetKeyframedMotion. No persistence, no region crossing. Yet.
This commit is contained in:
@@ -11896,6 +11896,144 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
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.KeyframeMotion != null)
|
||||
group.KeyframeMotion.Stop();
|
||||
group.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.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++);
|
||||
frame.Rotation = new Quaternion((float)tempq.x, (float)tempq.y, (float)tempq.z, (float)tempq.s);
|
||||
}
|
||||
|
||||
float tempf = (float)frames.GetLSLFloatItem(idx++);
|
||||
frame.TimeMS = (int)(tempf * 1000.0f);
|
||||
|
||||
keyframes.Add(frame);
|
||||
}
|
||||
|
||||
group.KeyframeMotion.SetKeyframes(keyframes.ToArray());
|
||||
group.KeyframeMotion.Start();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (group.KeyframeMotion == null)
|
||||
return;
|
||||
|
||||
if (options.Data.Length == 0)
|
||||
{
|
||||
group.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.KeyframeMotion.Start();
|
||||
break;
|
||||
case ScriptBaseClass.KFM_CMD_STOP:
|
||||
group.KeyframeMotion.Stop();
|
||||
break;
|
||||
case ScriptBaseClass.KFM_CMD_PAUSE:
|
||||
group.KeyframeMotion.Pause();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class NotecardCache
|
||||
|
||||
@@ -415,5 +415,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
|
||||
|
||||
void SetPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
|
||||
LSL_List GetLinkPrimitiveParamsEx(LSL_Key prim, LSL_List rules);
|
||||
void llSetKeyframedMotion(LSL_List frames, LSL_List options);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -641,5 +641,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
public static readonly LSLInteger RCERR_UNKNOWN = -1;
|
||||
public static readonly LSLInteger RCERR_SIM_PERF_LOW = -2;
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1917,7 +1917,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
|
||||
|
||||
public LSL_Integer llGetLinkNumberOfSides(LSL_Integer link)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user