diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | 222 |
1 files changed, 189 insertions, 33 deletions
diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index 646403f..2b95a4c 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | |||
@@ -292,14 +292,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
292 | 292 | ||
293 | private void StartTimer() | 293 | private void StartTimer() |
294 | { | 294 | { |
295 | KeyframeTimer.Add(this); | 295 | lock (m_frames) |
296 | m_timerStopped = false; | 296 | { |
297 | KeyframeTimer.Add(this); | ||
298 | m_timerStopped = false; | ||
299 | } | ||
297 | } | 300 | } |
298 | 301 | ||
299 | private void StopTimer() | 302 | private void StopTimer() |
300 | { | 303 | { |
301 | m_timerStopped = true; | 304 | lock (m_frames) |
302 | KeyframeTimer.Remove(this); | 305 | m_timerStopped = true; |
303 | } | 306 | } |
304 | 307 | ||
305 | public static KeyframeMotion FromData(SceneObjectGroup grp, Byte[] data) | 308 | public static KeyframeMotion FromData(SceneObjectGroup grp, Byte[] data) |
@@ -348,6 +351,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
348 | m_group = grp; | 351 | m_group = grp; |
349 | m_scene = grp.Scene; | 352 | m_scene = grp.Scene; |
350 | 353 | ||
354 | <<<<<<< HEAD | ||
351 | Vector3 grppos = grp.AbsolutePosition; | 355 | Vector3 grppos = grp.AbsolutePosition; |
352 | Vector3 offset = grppos - m_serializedPosition; | 356 | Vector3 offset = grppos - m_serializedPosition; |
353 | // avoid doing it more than once | 357 | // avoid doing it more than once |
@@ -366,6 +370,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
366 | k.StartPosition += offset; | 370 | k.StartPosition += offset; |
367 | k.Position += offset; | 371 | k.Position += offset; |
368 | m_frames[i]=k; | 372 | m_frames[i]=k; |
373 | ======= | ||
374 | lock (m_frames) | ||
375 | { | ||
376 | Vector3 grppos = grp.AbsolutePosition; | ||
377 | Vector3 offset = grppos - m_serializedPosition; | ||
378 | // avoid doing it more than once | ||
379 | // current this will happen draging a prim to other region | ||
380 | m_serializedPosition = grppos; | ||
381 | |||
382 | m_basePosition += offset; | ||
383 | m_currentFrame.Position += offset; | ||
384 | |||
385 | m_nextPosition += offset; | ||
386 | |||
387 | for (int i = 0; i < m_frames.Count; i++) | ||
388 | { | ||
389 | Keyframe k = m_frames[i]; | ||
390 | k.Position += offset; | ||
391 | m_frames[i] = k; | ||
392 | } | ||
393 | >>>>>>> avn/ubitvar | ||
369 | } | 394 | } |
370 | 395 | ||
371 | if (m_running) | 396 | if (m_running) |
@@ -410,25 +435,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
410 | m_keyframes.CopyTo(newmotion.m_keyframes, 0); | 435 | m_keyframes.CopyTo(newmotion.m_keyframes, 0); |
411 | } | 436 | } |
412 | 437 | ||
413 | newmotion.m_frames = new List<Keyframe>(m_frames); | 438 | lock (m_frames) |
439 | { | ||
440 | newmotion.m_frames = new List<Keyframe>(m_frames); | ||
414 | 441 | ||
415 | newmotion.m_basePosition = m_basePosition; | 442 | newmotion.m_basePosition = m_basePosition; |
416 | newmotion.m_baseRotation = m_baseRotation; | 443 | newmotion.m_baseRotation = m_baseRotation; |
417 | 444 | ||
418 | if (m_selected) | 445 | if (m_selected) |
419 | newmotion.m_serializedPosition = m_serializedPosition; | ||
420 | else | ||
421 | { | ||
422 | if (m_group != null) | ||
423 | newmotion.m_serializedPosition = m_group.AbsolutePosition; | ||
424 | else | ||
425 | newmotion.m_serializedPosition = m_serializedPosition; | 446 | newmotion.m_serializedPosition = m_serializedPosition; |
426 | } | 447 | else |
448 | { | ||
449 | if (m_group != null) | ||
450 | newmotion.m_serializedPosition = m_group.AbsolutePosition; | ||
451 | else | ||
452 | newmotion.m_serializedPosition = m_serializedPosition; | ||
453 | } | ||
427 | 454 | ||
428 | newmotion.m_currentFrame = m_currentFrame; | 455 | newmotion.m_currentFrame = m_currentFrame; |
429 | 456 | ||
430 | newmotion.m_iterations = m_iterations; | 457 | newmotion.m_iterations = m_iterations; |
431 | newmotion.m_running = m_running; | 458 | newmotion.m_running = m_running; |
459 | } | ||
432 | 460 | ||
433 | if (m_running && !m_waitingCrossing) | 461 | if (m_running && !m_waitingCrossing) |
434 | StartTimer(); | 462 | StartTimer(); |
@@ -458,19 +486,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
458 | } | 486 | } |
459 | else | 487 | else |
460 | { | 488 | { |
461 | m_running = false; | ||
462 | StopTimer(); | 489 | StopTimer(); |
490 | m_running = false; | ||
463 | } | 491 | } |
464 | } | 492 | } |
465 | 493 | ||
466 | public void Stop() | 494 | public void Stop() |
467 | { | 495 | { |
496 | StopTimer(); | ||
468 | m_running = false; | 497 | m_running = false; |
469 | m_isCrossing = false; | 498 | m_isCrossing = false; |
470 | m_waitingCrossing = false; | 499 | m_waitingCrossing = false; |
471 | 500 | ||
472 | StopTimer(); | ||
473 | |||
474 | m_basePosition = m_group.AbsolutePosition; | 501 | m_basePosition = m_group.AbsolutePosition; |
475 | m_baseRotation = m_group.GroupRotation; | 502 | m_baseRotation = m_group.GroupRotation; |
476 | 503 | ||
@@ -483,14 +510,34 @@ namespace OpenSim.Region.Framework.Scenes | |||
483 | 510 | ||
484 | public void Pause() | 511 | public void Pause() |
485 | { | 512 | { |
486 | m_running = false; | ||
487 | StopTimer(); | 513 | StopTimer(); |
514 | m_running = false; | ||
488 | 515 | ||
489 | m_group.RootPart.Velocity = Vector3.Zero; | 516 | m_group.RootPart.Velocity = Vector3.Zero; |
490 | m_group.RootPart.AngularVelocity = Vector3.Zero; | 517 | m_group.RootPart.AngularVelocity = Vector3.Zero; |
491 | m_group.SendGroupRootTerseUpdate(); | 518 | m_group.SendGroupRootTerseUpdate(); |
492 | // m_group.RootPart.ScheduleTerseUpdate(); | 519 | // m_group.RootPart.ScheduleTerseUpdate(); |
520 | } | ||
493 | 521 | ||
522 | public void Suspend() | ||
523 | { | ||
524 | lock (m_frames) | ||
525 | { | ||
526 | if (m_timerStopped) | ||
527 | return; | ||
528 | m_timerStopped = true; | ||
529 | } | ||
530 | } | ||
531 | |||
532 | public void Resume() | ||
533 | { | ||
534 | lock (m_frames) | ||
535 | { | ||
536 | if (!m_timerStopped) | ||
537 | return; | ||
538 | if (m_running && !m_waitingCrossing) | ||
539 | StartTimer(); | ||
540 | } | ||
494 | } | 541 | } |
495 | 542 | ||
496 | private void GetNextList() | 543 | private void GetNextList() |
@@ -581,6 +628,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
581 | 628 | ||
582 | pos = (Vector3)k.Position; | 629 | pos = (Vector3)k.Position; |
583 | rot = (Quaternion)k.Rotation; | 630 | rot = (Quaternion)k.Rotation; |
631 | |||
584 | } | 632 | } |
585 | 633 | ||
586 | m_basePosition = pos; | 634 | m_basePosition = pos; |
@@ -592,15 +640,41 @@ namespace OpenSim.Region.Framework.Scenes | |||
592 | 640 | ||
593 | public void OnTimer(double tickDuration) | 641 | public void OnTimer(double tickDuration) |
594 | { | 642 | { |
643 | if (!Monitor.TryEnter(m_frames)) | ||
644 | return; | ||
645 | if (m_timerStopped) | ||
646 | KeyframeTimer.Remove(this); | ||
647 | else | ||
648 | DoOnTimer(tickDuration); | ||
649 | Monitor.Exit(m_frames); | ||
650 | } | ||
651 | |||
652 | private void Done() | ||
653 | { | ||
654 | KeyframeTimer.Remove(this); | ||
655 | m_timerStopped = true; | ||
656 | m_running = false; | ||
657 | m_isCrossing = false; | ||
658 | m_waitingCrossing = false; | ||
659 | |||
660 | m_basePosition = m_group.AbsolutePosition; | ||
661 | m_baseRotation = m_group.GroupRotation; | ||
662 | |||
663 | m_group.RootPart.Velocity = Vector3.Zero; | ||
664 | m_group.RootPart.AngularVelocity = Vector3.Zero; | ||
665 | m_group.SendGroupRootTerseUpdate(); | ||
666 | // m_group.RootPart.ScheduleTerseUpdate(); | ||
667 | m_frames.Clear(); | ||
668 | } | ||
669 | |||
670 | private void DoOnTimer(double tickDuration) | ||
671 | { | ||
595 | if (m_skipLoops > 0) | 672 | if (m_skipLoops > 0) |
596 | { | 673 | { |
597 | m_skipLoops--; | 674 | m_skipLoops--; |
598 | return; | 675 | return; |
599 | } | 676 | } |
600 | 677 | ||
601 | if (m_timerStopped) // trap events still in air even after a timer.stop | ||
602 | return; | ||
603 | |||
604 | if (m_group == null) | 678 | if (m_group == null) |
605 | return; | 679 | return; |
606 | 680 | ||
@@ -612,7 +686,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
612 | { | 686 | { |
613 | m_group.RootPart.Velocity = Vector3.Zero; | 687 | m_group.RootPart.Velocity = Vector3.Zero; |
614 | m_group.SendGroupRootTerseUpdate(); | 688 | m_group.SendGroupRootTerseUpdate(); |
615 | |||
616 | } | 689 | } |
617 | return; | 690 | return; |
618 | } | 691 | } |
@@ -635,6 +708,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
635 | 708 | ||
636 | if (m_frames.Count == 0) | 709 | if (m_frames.Count == 0) |
637 | { | 710 | { |
711 | <<<<<<< HEAD | ||
638 | if (!m_running) return; | 712 | if (!m_running) return; |
639 | 713 | ||
640 | GetNextList(); | 714 | GetNextList(); |
@@ -656,11 +730,33 @@ namespace OpenSim.Region.Framework.Scenes | |||
656 | 730 | ||
657 | return; | 731 | return; |
658 | } | 732 | } |
733 | ======= | ||
734 | lock (m_frames) | ||
735 | { | ||
736 | GetNextList(); | ||
659 | 737 | ||
660 | m_currentFrame = m_frames[0]; | 738 | if (m_frames.Count == 0) |
661 | m_currentFrame.TimeMS += (int)tickDuration; | 739 | { |
740 | Done(); | ||
741 | Scene scene = m_group.Scene; | ||
662 | 742 | ||
743 | IScriptModule[] scriptModules = scene.RequestModuleInterfaces<IScriptModule>(); | ||
744 | foreach (IScriptModule m in scriptModules) | ||
745 | { | ||
746 | if (m == null) | ||
747 | continue; | ||
748 | m.PostObjectEvent(m_group.RootPart.UUID, "moving_end", new object[0]); | ||
749 | } | ||
750 | >>>>>>> avn/ubitvar | ||
751 | |||
752 | return; | ||
753 | } | ||
754 | |||
755 | m_currentFrame = m_frames[0]; | ||
756 | m_currentFrame.TimeMS += (int)tickDuration; | ||
757 | } | ||
663 | //force a update on a keyframe transition | 758 | //force a update on a keyframe transition |
759 | m_nextPosition = m_group.AbsolutePosition; | ||
664 | update = true; | 760 | update = true; |
665 | } | 761 | } |
666 | 762 | ||
@@ -681,9 +777,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
681 | // m_group.UpdateGroupRotationR((Quaternion)m_currentFrame.Rotation); | 777 | // m_group.UpdateGroupRotationR((Quaternion)m_currentFrame.Rotation); |
682 | 778 | ||
683 | m_group.RootPart.RotationOffset = (Quaternion)m_currentFrame.Rotation; | 779 | m_group.RootPart.RotationOffset = (Quaternion)m_currentFrame.Rotation; |
684 | m_frames.RemoveAt(0); | 780 | |
685 | if (m_frames.Count > 0) | 781 | lock (m_frames) |
686 | m_currentFrame = m_frames[0]; | 782 | { |
783 | m_frames.RemoveAt(0); | ||
784 | if (m_frames.Count > 0) | ||
785 | m_currentFrame = m_frames[0]; | ||
786 | } | ||
687 | 787 | ||
688 | update = true; | 788 | update = true; |
689 | } | 789 | } |
@@ -695,14 +795,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
695 | Vector3 positionThisStep = m_currentFrame.StartPosition + (m_currentFrame.Position.Value - m_currentFrame.StartPosition) * completed; | 795 | Vector3 positionThisStep = m_currentFrame.StartPosition + (m_currentFrame.Position.Value - m_currentFrame.StartPosition) * completed; |
696 | Vector3 motionThisStep = positionThisStep - m_group.AbsolutePosition; | 796 | Vector3 motionThisStep = positionThisStep - m_group.AbsolutePosition; |
697 | 797 | ||
798 | <<<<<<< HEAD | ||
698 | float mag = Vector3.Mag(motionThisStep); | 799 | float mag = Vector3.Mag(motionThisStep); |
699 | 800 | ||
700 | if ((mag >= 0.02f) || lastStep) | 801 | if ((mag >= 0.02f) || lastStep) |
701 | { | 802 | { |
702 | m_nextPosition = m_group.AbsolutePosition + motionThisStep; | 803 | m_nextPosition = m_group.AbsolutePosition + motionThisStep; |
703 | m_group.AbsolutePosition = m_nextPosition; | 804 | m_group.AbsolutePosition = m_nextPosition; |
805 | ======= | ||
806 | m_nextPosition = m_group.AbsolutePosition + motionThisFrame; | ||
807 | |||
808 | if (Vector3.Mag(motionThisFrame) >= 0.05f) | ||
809 | >>>>>>> avn/ubitvar | ||
704 | update = true; | 810 | update = true; |
705 | } | ||
706 | 811 | ||
707 | //int totalSteps = m_currentFrame.TimeTotal / (int)tickDuration; | 812 | //int totalSteps = m_currentFrame.TimeTotal / (int)tickDuration; |
708 | //m_log.DebugFormat("KeyframeMotion.OnTimer: step {0}/{1}, curPosition={2}, finalPosition={3}, motionThisStep={4} (scene {5})", | 813 | //m_log.DebugFormat("KeyframeMotion.OnTimer: step {0}/{1}, curPosition={2}, finalPosition={3}, motionThisStep={4} (scene {5})", |
@@ -714,6 +819,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
714 | 819 | ||
715 | Quaternion step = Quaternion.Slerp(m_currentFrame.StartRotation, (Quaternion)m_currentFrame.Rotation, completed); | 820 | Quaternion step = Quaternion.Slerp(m_currentFrame.StartRotation, (Quaternion)m_currentFrame.Rotation, completed); |
716 | step.Normalize(); | 821 | step.Normalize(); |
822 | <<<<<<< HEAD | ||
717 | /* use simpler change detection | 823 | /* use simpler change detection |
718 | * float angle = 0; | 824 | * float angle = 0; |
719 | 825 | ||
@@ -751,8 +857,45 @@ namespace OpenSim.Region.Framework.Scenes | |||
751 | || lastStep) | 857 | || lastStep) |
752 | // assuming w is a dependente var | 858 | // assuming w is a dependente var |
753 | 859 | ||
860 | ======= | ||
861 | /* use simpler change detection | ||
862 | * float angle = 0; | ||
863 | |||
864 | float aa = current.X * current.X + current.Y * current.Y + current.Z * current.Z + current.W * current.W; | ||
865 | float bb = step.X * step.X + step.Y * step.Y + step.Z * step.Z + step.W * step.W; | ||
866 | float aa_bb = aa * bb; | ||
867 | |||
868 | if (aa_bb == 0) | ||
869 | { | ||
870 | angle = 0; | ||
871 | } | ||
872 | else | ||
873 | { | ||
874 | float ab = current.X * step.X + | ||
875 | current.Y * step.Y + | ||
876 | current.Z * step.Z + | ||
877 | current.W * step.W; | ||
878 | float q = (ab * ab) / aa_bb; | ||
879 | |||
880 | if (q > 1.0f) | ||
881 | { | ||
882 | angle = 0; | ||
883 | } | ||
884 | else | ||
885 | { | ||
886 | angle = (float)Math.Acos(2 * q - 1); | ||
887 | } | ||
888 | } | ||
889 | |||
890 | if (angle > 0.01f) | ||
891 | */ | ||
892 | if (Math.Abs(step.X - current.X) > 0.001f | ||
893 | || Math.Abs(step.Y - current.Y) > 0.001f | ||
894 | || Math.Abs(step.Z - current.Z) > 0.001f) | ||
895 | // assuming w is a dependente var | ||
896 | >>>>>>> avn/ubitvar | ||
754 | { | 897 | { |
755 | // m_group.UpdateGroupRotationR(step); | 898 | // m_group.UpdateGroupRotationR(step); |
756 | m_group.RootPart.RotationOffset = step; | 899 | m_group.RootPart.RotationOffset = step; |
757 | 900 | ||
758 | //m_group.RootPart.UpdateAngularVelocity(m_currentFrame.AngularVelocity / 2); | 901 | //m_group.RootPart.UpdateAngularVelocity(m_currentFrame.AngularVelocity / 2); |
@@ -763,18 +906,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
763 | 906 | ||
764 | if (update) | 907 | if (update) |
765 | { | 908 | { |
909 | m_group.AbsolutePosition = m_nextPosition; | ||
766 | m_group.SendGroupRootTerseUpdate(); | 910 | m_group.SendGroupRootTerseUpdate(); |
767 | } | 911 | } |
768 | } | 912 | } |
769 | 913 | ||
770 | public Byte[] Serialize() | 914 | public Byte[] Serialize() |
771 | { | 915 | { |
916 | bool timerWasStopped; | ||
917 | lock (m_frames) | ||
918 | { | ||
919 | timerWasStopped = m_timerStopped; | ||
920 | } | ||
772 | StopTimer(); | 921 | StopTimer(); |
773 | 922 | ||
774 | SceneObjectGroup tmp = m_group; | 923 | SceneObjectGroup tmp = m_group; |
775 | m_group = null; | 924 | m_group = null; |
776 | if (!m_selected && tmp != null) | 925 | if (!m_selected && tmp != null) |
777 | m_serializedPosition = tmp.AbsolutePosition; | 926 | m_serializedPosition = tmp.AbsolutePosition; |
927 | <<<<<<< HEAD | ||
928 | ======= | ||
929 | fmt.Serialize(ms, this); | ||
930 | m_group = tmp; | ||
931 | if (!timerWasStopped && m_running && !m_waitingCrossing) | ||
932 | StartTimer(); | ||
933 | >>>>>>> avn/ubitvar | ||
778 | 934 | ||
779 | using (MemoryStream ms = new MemoryStream()) | 935 | using (MemoryStream ms = new MemoryStream()) |
780 | { | 936 | { |