diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 0b4b043..cd6092d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -7296,6 +7296,146 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7296 | } | 7296 | } |
7297 | } | 7297 | } |
7298 | 7298 | ||
7299 | public void llSetKeyframedMotion(LSL_List frames, LSL_List options) | ||
7300 | { | ||
7301 | SceneObjectGroup group = m_host.ParentGroup; | ||
7302 | |||
7303 | if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical) | ||
7304 | return; | ||
7305 | if (group.IsAttachment) | ||
7306 | return; | ||
7307 | |||
7308 | if (frames.Data.Length > 0) // We are getting a new motion | ||
7309 | { | ||
7310 | if (group.RootPart.KeyframeMotion != null) | ||
7311 | group.RootPart.KeyframeMotion.Delete(); | ||
7312 | group.RootPart.KeyframeMotion = null; | ||
7313 | |||
7314 | int idx = 0; | ||
7315 | |||
7316 | KeyframeMotion.PlayMode mode = KeyframeMotion.PlayMode.Forward; | ||
7317 | KeyframeMotion.DataFormat data = KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation; | ||
7318 | |||
7319 | while (idx < options.Data.Length) | ||
7320 | { | ||
7321 | int option = (int)options.GetLSLIntegerItem(idx++); | ||
7322 | int remain = options.Data.Length - idx; | ||
7323 | |||
7324 | switch (option) | ||
7325 | { | ||
7326 | case ScriptBaseClass.KFM_MODE: | ||
7327 | if (remain < 1) | ||
7328 | break; | ||
7329 | int modeval = (int)options.GetLSLIntegerItem(idx++); | ||
7330 | switch(modeval) | ||
7331 | { | ||
7332 | case ScriptBaseClass.KFM_FORWARD: | ||
7333 | mode = KeyframeMotion.PlayMode.Forward; | ||
7334 | break; | ||
7335 | case ScriptBaseClass.KFM_REVERSE: | ||
7336 | mode = KeyframeMotion.PlayMode.Reverse; | ||
7337 | break; | ||
7338 | case ScriptBaseClass.KFM_LOOP: | ||
7339 | mode = KeyframeMotion.PlayMode.Loop; | ||
7340 | break; | ||
7341 | case ScriptBaseClass.KFM_PING_PONG: | ||
7342 | mode = KeyframeMotion.PlayMode.PingPong; | ||
7343 | break; | ||
7344 | } | ||
7345 | break; | ||
7346 | case ScriptBaseClass.KFM_DATA: | ||
7347 | if (remain < 1) | ||
7348 | break; | ||
7349 | int dataval = (int)options.GetLSLIntegerItem(idx++); | ||
7350 | data = (KeyframeMotion.DataFormat)dataval; | ||
7351 | break; | ||
7352 | } | ||
7353 | } | ||
7354 | |||
7355 | group.RootPart.KeyframeMotion = new KeyframeMotion(group, mode, data); | ||
7356 | |||
7357 | idx = 0; | ||
7358 | |||
7359 | int elemLength = 2; | ||
7360 | if (data == (KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation)) | ||
7361 | elemLength = 3; | ||
7362 | |||
7363 | List<KeyframeMotion.Keyframe> keyframes = new List<KeyframeMotion.Keyframe>(); | ||
7364 | while (idx < frames.Data.Length) | ||
7365 | { | ||
7366 | int remain = frames.Data.Length - idx; | ||
7367 | |||
7368 | if (remain < elemLength) | ||
7369 | break; | ||
7370 | |||
7371 | KeyframeMotion.Keyframe frame = new KeyframeMotion.Keyframe(); | ||
7372 | frame.Position = null; | ||
7373 | frame.Rotation = null; | ||
7374 | |||
7375 | if ((data & KeyframeMotion.DataFormat.Translation) != 0) | ||
7376 | { | ||
7377 | LSL_Types.Vector3 tempv = frames.GetVector3Item(idx++); | ||
7378 | frame.Position = new Vector3((float)tempv.x, (float)tempv.y, (float)tempv.z); | ||
7379 | } | ||
7380 | if ((data & KeyframeMotion.DataFormat.Rotation) != 0) | ||
7381 | { | ||
7382 | LSL_Types.Quaternion tempq = frames.GetQuaternionItem(idx++); | ||
7383 | Quaternion q = new Quaternion((float)tempq.x, (float)tempq.y, (float)tempq.z, (float)tempq.s); | ||
7384 | q.Normalize(); | ||
7385 | frame.Rotation = q; | ||
7386 | } | ||
7387 | |||
7388 | float tempf = (float)frames.GetLSLFloatItem(idx++); | ||
7389 | frame.TimeMS = (int)(tempf * 1000.0f); | ||
7390 | |||
7391 | keyframes.Add(frame); | ||
7392 | } | ||
7393 | |||
7394 | group.RootPart.KeyframeMotion.SetKeyframes(keyframes.ToArray()); | ||
7395 | group.RootPart.KeyframeMotion.Start(); | ||
7396 | } | ||
7397 | else | ||
7398 | { | ||
7399 | if (group.RootPart.KeyframeMotion == null) | ||
7400 | return; | ||
7401 | |||
7402 | if (options.Data.Length == 0) | ||
7403 | { | ||
7404 | group.RootPart.KeyframeMotion.Stop(); | ||
7405 | return; | ||
7406 | } | ||
7407 | |||
7408 | int code = (int)options.GetLSLIntegerItem(0); | ||
7409 | |||
7410 | int idx = 0; | ||
7411 | |||
7412 | while (idx < options.Data.Length) | ||
7413 | { | ||
7414 | int option = (int)options.GetLSLIntegerItem(idx++); | ||
7415 | int remain = options.Data.Length - idx; | ||
7416 | |||
7417 | switch (option) | ||
7418 | { | ||
7419 | case ScriptBaseClass.KFM_COMMAND: | ||
7420 | int cmd = (int)options.GetLSLIntegerItem(idx++); | ||
7421 | switch (cmd) | ||
7422 | { | ||
7423 | case ScriptBaseClass.KFM_CMD_PLAY: | ||
7424 | group.RootPart.KeyframeMotion.Start(); | ||
7425 | break; | ||
7426 | case ScriptBaseClass.KFM_CMD_STOP: | ||
7427 | group.RootPart.KeyframeMotion.Stop(); | ||
7428 | break; | ||
7429 | case ScriptBaseClass.KFM_CMD_PAUSE: | ||
7430 | group.RootPart.KeyframeMotion.Pause(); | ||
7431 | break; | ||
7432 | } | ||
7433 | break; | ||
7434 | } | ||
7435 | } | ||
7436 | } | ||
7437 | } | ||
7438 | |||
7299 | protected LSL_List SetPrimParams(SceneObjectPart part, LSL_List rules, string originFunc, ref uint rulesParsed) | 7439 | protected LSL_List SetPrimParams(SceneObjectPart part, LSL_List rules, string originFunc, ref uint rulesParsed) |
7300 | { | 7440 | { |
7301 | int idx = 0; | 7441 | int idx = 0; |