diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 479 |
1 files changed, 235 insertions, 244 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index fa23fcd..b6fb5a4 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -236,6 +236,38 @@ namespace OpenSim.Region.Framework.Scenes | |||
236 | get { return m_rootPart.RotationOffset; } | 236 | get { return m_rootPart.RotationOffset; } |
237 | } | 237 | } |
238 | 238 | ||
239 | public Vector3 GroupScale | ||
240 | { | ||
241 | get | ||
242 | { | ||
243 | Vector3 minScale = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionSize); | ||
244 | Vector3 maxScale = Vector3.Zero; | ||
245 | Vector3 finalScale = new Vector3(0.5f, 0.5f, 0.5f); | ||
246 | |||
247 | SceneObjectPart[] parts = m_parts.GetArray(); | ||
248 | for (int i = 0; i < parts.Length; i++) | ||
249 | { | ||
250 | SceneObjectPart part = parts[i]; | ||
251 | Vector3 partscale = part.Scale; | ||
252 | Vector3 partoffset = part.OffsetPosition; | ||
253 | |||
254 | minScale.X = (partscale.X + partoffset.X < minScale.X) ? partscale.X + partoffset.X : minScale.X; | ||
255 | minScale.Y = (partscale.Y + partoffset.Y < minScale.Y) ? partscale.Y + partoffset.Y : minScale.Y; | ||
256 | minScale.Z = (partscale.Z + partoffset.Z < minScale.Z) ? partscale.Z + partoffset.Z : minScale.Z; | ||
257 | |||
258 | maxScale.X = (partscale.X + partoffset.X > maxScale.X) ? partscale.X + partoffset.X : maxScale.X; | ||
259 | maxScale.Y = (partscale.Y + partoffset.Y > maxScale.Y) ? partscale.Y + partoffset.Y : maxScale.Y; | ||
260 | maxScale.Z = (partscale.Z + partoffset.Z > maxScale.Z) ? partscale.Z + partoffset.Z : maxScale.Z; | ||
261 | } | ||
262 | |||
263 | finalScale.X = (minScale.X > maxScale.X) ? minScale.X : maxScale.X; | ||
264 | finalScale.Y = (minScale.Y > maxScale.Y) ? minScale.Y : maxScale.Y; | ||
265 | finalScale.Z = (minScale.Z > maxScale.Z) ? minScale.Z : maxScale.Z; | ||
266 | |||
267 | return finalScale; | ||
268 | } | ||
269 | } | ||
270 | |||
239 | public UUID GroupID | 271 | public UUID GroupID |
240 | { | 272 | { |
241 | get { return m_rootPart.GroupID; } | 273 | get { return m_rootPart.GroupID; } |
@@ -584,7 +616,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
584 | part.ParentID = m_rootPart.LocalId; | 616 | part.ParentID = m_rootPart.LocalId; |
585 | //m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID); | 617 | //m_log.DebugFormat("[SCENE]: Given local id {0} to part {1}, linknum {2}, parent {3} {4}", part.LocalId, part.UUID, part.LinkNum, part.ParentID, part.ParentUUID); |
586 | } | 618 | } |
587 | 619 | ||
588 | ApplyPhysics(m_scene.m_physicalPrim); | 620 | ApplyPhysics(m_scene.m_physicalPrim); |
589 | 621 | ||
590 | // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled | 622 | // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled |
@@ -592,34 +624,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
592 | //ScheduleGroupForFullUpdate(); | 624 | //ScheduleGroupForFullUpdate(); |
593 | } | 625 | } |
594 | 626 | ||
595 | public Vector3 GroupScale() | ||
596 | { | ||
597 | Vector3 minScale = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionSize); | ||
598 | Vector3 maxScale = Vector3.Zero; | ||
599 | Vector3 finalScale = new Vector3(0.5f, 0.5f, 0.5f); | ||
600 | |||
601 | SceneObjectPart[] parts = m_parts.GetArray(); | ||
602 | for (int i = 0; i < parts.Length; i++) | ||
603 | { | ||
604 | SceneObjectPart part = parts[i]; | ||
605 | Vector3 partscale = part.Scale; | ||
606 | Vector3 partoffset = part.OffsetPosition; | ||
607 | |||
608 | minScale.X = (partscale.X + partoffset.X < minScale.X) ? partscale.X + partoffset.X : minScale.X; | ||
609 | minScale.Y = (partscale.Y + partoffset.Y < minScale.Y) ? partscale.Y + partoffset.Y : minScale.Y; | ||
610 | minScale.Z = (partscale.Z + partoffset.Z < minScale.Z) ? partscale.Z + partoffset.Z : minScale.Z; | ||
611 | |||
612 | maxScale.X = (partscale.X + partoffset.X > maxScale.X) ? partscale.X + partoffset.X : maxScale.X; | ||
613 | maxScale.Y = (partscale.Y + partoffset.Y > maxScale.Y) ? partscale.Y + partoffset.Y : maxScale.Y; | ||
614 | maxScale.Z = (partscale.Z + partoffset.Z > maxScale.Z) ? partscale.Z + partoffset.Z : maxScale.Z; | ||
615 | } | ||
616 | |||
617 | finalScale.X = (minScale.X > maxScale.X) ? minScale.X : maxScale.X; | ||
618 | finalScale.Y = (minScale.Y > maxScale.Y) ? minScale.Y : maxScale.Y; | ||
619 | finalScale.Z = (minScale.Z > maxScale.Z) ? minScale.Z : maxScale.Z; | ||
620 | return finalScale; | ||
621 | |||
622 | } | ||
623 | public EntityIntersection TestIntersection(Ray hRay, bool frontFacesOnly, bool faceCenters) | 627 | public EntityIntersection TestIntersection(Ray hRay, bool frontFacesOnly, bool faceCenters) |
624 | { | 628 | { |
625 | // We got a request from the inner_scene to raytrace along the Ray hRay | 629 | // We got a request from the inner_scene to raytrace along the Ray hRay |
@@ -1141,6 +1145,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1141 | 1145 | ||
1142 | public virtual void OnGrabPart(SceneObjectPart part, Vector3 offsetPos, IClientAPI remoteClient) | 1146 | public virtual void OnGrabPart(SceneObjectPart part, Vector3 offsetPos, IClientAPI remoteClient) |
1143 | { | 1147 | { |
1148 | // m_log.DebugFormat( | ||
1149 | // "[SCENE OBJECT GROUP]: Processing OnGrabPart for {0} on {1} {2}, offsetPos {3}", | ||
1150 | // remoteClient.Name, part.Name, part.LocalId, offsetPos); | ||
1151 | |||
1144 | part.StoreUndoState(); | 1152 | part.StoreUndoState(); |
1145 | part.OnGrab(offsetPos, remoteClient); | 1153 | part.OnGrab(offsetPos, remoteClient); |
1146 | } | 1154 | } |
@@ -1463,17 +1471,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
1463 | // Need to duplicate the physics actor as well | 1471 | // Need to duplicate the physics actor as well |
1464 | if (part.PhysActor != null && userExposed) | 1472 | if (part.PhysActor != null && userExposed) |
1465 | { | 1473 | { |
1466 | PrimitiveBaseShape pbs = part.Shape; | 1474 | PrimitiveBaseShape pbs = newPart.Shape; |
1467 | 1475 | ||
1468 | newPart.PhysActor | 1476 | newPart.PhysActor |
1469 | = m_scene.PhysicsScene.AddPrimShape( | 1477 | = m_scene.PhysicsScene.AddPrimShape( |
1470 | part.LocalId, | 1478 | string.Format("{0}/{1}", newPart.Name, newPart.UUID), |
1471 | string.Format("{0}/{1}", part.Name, part.UUID), | ||
1472 | pbs, | 1479 | pbs, |
1473 | part.AbsolutePosition, | 1480 | newPart.AbsolutePosition, |
1474 | part.Scale, | 1481 | newPart.Scale, |
1475 | part.RotationOffset, | 1482 | newPart.RotationOffset, |
1476 | part.PhysActor.IsPhysical); | 1483 | part.PhysActor.IsPhysical, |
1484 | newPart.LocalId); | ||
1477 | 1485 | ||
1478 | newPart.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true); | 1486 | newPart.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true); |
1479 | } | 1487 | } |
@@ -2608,195 +2616,150 @@ namespace OpenSim.Region.Framework.Scenes | |||
2608 | #region Resize | 2616 | #region Resize |
2609 | 2617 | ||
2610 | /// <summary> | 2618 | /// <summary> |
2611 | /// Resize the given part | 2619 | /// Resize the entire group of prims. |
2612 | /// </summary> | 2620 | /// </summary> |
2613 | /// <param name="scale"></param> | 2621 | /// <param name="scale"></param> |
2614 | /// <param name="localID"></param> | 2622 | public void GroupResize(Vector3 scale) |
2615 | public void Resize(Vector3 scale, uint localID) | ||
2616 | { | 2623 | { |
2617 | if (scale.X > m_scene.m_maxNonphys) | 2624 | // m_log.DebugFormat( |
2618 | scale.X = m_scene.m_maxNonphys; | 2625 | // "[SCENE OBJECT GROUP]: Group resizing {0} {1} from {2} to {3}", Name, LocalId, RootPart.Scale, scale); |
2619 | if (scale.Y > m_scene.m_maxNonphys) | ||
2620 | scale.Y = m_scene.m_maxNonphys; | ||
2621 | if (scale.Z > m_scene.m_maxNonphys) | ||
2622 | scale.Z = m_scene.m_maxNonphys; | ||
2623 | 2626 | ||
2624 | SceneObjectPart part = GetChildPart(localID); | 2627 | RootPart.StoreUndoState(true); |
2625 | if (part != null) | ||
2626 | { | ||
2627 | part.Resize(scale); | ||
2628 | if (part.PhysActor != null) | ||
2629 | { | ||
2630 | if (part.PhysActor.IsPhysical) | ||
2631 | { | ||
2632 | if (scale.X > m_scene.m_maxPhys) | ||
2633 | scale.X = m_scene.m_maxPhys; | ||
2634 | if (scale.Y > m_scene.m_maxPhys) | ||
2635 | scale.Y = m_scene.m_maxPhys; | ||
2636 | if (scale.Z > m_scene.m_maxPhys) | ||
2637 | scale.Z = m_scene.m_maxPhys; | ||
2638 | } | ||
2639 | part.PhysActor.Size = scale; | ||
2640 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); | ||
2641 | } | ||
2642 | //if (part.UUID != m_rootPart.UUID) | ||
2643 | 2628 | ||
2644 | HasGroupChanged = true; | 2629 | scale.X = Math.Min(scale.X, Scene.m_maxNonphys); |
2645 | part.TriggerScriptChangedEvent(Changed.SCALE); | 2630 | scale.Y = Math.Min(scale.Y, Scene.m_maxNonphys); |
2646 | ScheduleGroupForFullUpdate(); | 2631 | scale.Z = Math.Min(scale.Z, Scene.m_maxNonphys); |
2647 | 2632 | ||
2648 | //if (part.UUID == m_rootPart.UUID) | 2633 | if (RootPart.PhysActor != null && RootPart.PhysActor.IsPhysical) |
2649 | //{ | 2634 | { |
2650 | //if (m_rootPart.PhysActor != null) | 2635 | scale.X = Math.Min(scale.X, Scene.m_maxPhys); |
2651 | //{ | 2636 | scale.Y = Math.Min(scale.Y, Scene.m_maxPhys); |
2652 | //m_rootPart.PhysActor.Size = | 2637 | scale.Z = Math.Min(scale.Z, Scene.m_maxPhys); |
2653 | //new PhysicsVector(m_rootPart.Scale.X, m_rootPart.Scale.Y, m_rootPart.Scale.Z); | ||
2654 | //m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); | ||
2655 | //} | ||
2656 | //} | ||
2657 | } | 2638 | } |
2658 | } | ||
2659 | 2639 | ||
2660 | public void GroupResize(Vector3 scale, uint localID) | 2640 | float x = (scale.X / RootPart.Scale.X); |
2661 | { | 2641 | float y = (scale.Y / RootPart.Scale.Y); |
2662 | SceneObjectPart part = GetChildPart(localID); | 2642 | float z = (scale.Z / RootPart.Scale.Z); |
2663 | if (part != null) | ||
2664 | { | ||
2665 | part.IgnoreUndoUpdate = true; | ||
2666 | if (scale.X > m_scene.m_maxNonphys) | ||
2667 | scale.X = m_scene.m_maxNonphys; | ||
2668 | if (scale.Y > m_scene.m_maxNonphys) | ||
2669 | scale.Y = m_scene.m_maxNonphys; | ||
2670 | if (scale.Z > m_scene.m_maxNonphys) | ||
2671 | scale.Z = m_scene.m_maxNonphys; | ||
2672 | if (part.PhysActor != null && part.PhysActor.IsPhysical) | ||
2673 | { | ||
2674 | if (scale.X > m_scene.m_maxPhys) | ||
2675 | scale.X = m_scene.m_maxPhys; | ||
2676 | if (scale.Y > m_scene.m_maxPhys) | ||
2677 | scale.Y = m_scene.m_maxPhys; | ||
2678 | if (scale.Z > m_scene.m_maxPhys) | ||
2679 | scale.Z = m_scene.m_maxPhys; | ||
2680 | } | ||
2681 | float x = (scale.X / part.Scale.X); | ||
2682 | float y = (scale.Y / part.Scale.Y); | ||
2683 | float z = (scale.Z / part.Scale.Z); | ||
2684 | 2643 | ||
2685 | SceneObjectPart[] parts; | 2644 | SceneObjectPart[] parts; |
2686 | if (x > 1.0f || y > 1.0f || z > 1.0f) | 2645 | if (x > 1.0f || y > 1.0f || z > 1.0f) |
2646 | { | ||
2647 | parts = m_parts.GetArray(); | ||
2648 | for (int i = 0; i < parts.Length; i++) | ||
2687 | { | 2649 | { |
2688 | parts = m_parts.GetArray(); | 2650 | SceneObjectPart obPart = parts[i]; |
2689 | for (int i = 0; i < parts.Length; i++) | 2651 | if (obPart.UUID != m_rootPart.UUID) |
2690 | { | 2652 | { |
2691 | SceneObjectPart obPart = parts[i]; | 2653 | // obPart.IgnoreUndoUpdate = true; |
2692 | if (obPart.UUID != m_rootPart.UUID) | 2654 | Vector3 oldSize = new Vector3(obPart.Scale); |
2655 | |||
2656 | float f = 1.0f; | ||
2657 | float a = 1.0f; | ||
2658 | |||
2659 | if (RootPart.PhysActor != null && RootPart.PhysActor.IsPhysical) | ||
2693 | { | 2660 | { |
2694 | obPart.IgnoreUndoUpdate = true; | 2661 | if (oldSize.X * x > m_scene.m_maxPhys) |
2695 | Vector3 oldSize = new Vector3(obPart.Scale); | 2662 | { |
2663 | f = m_scene.m_maxPhys / oldSize.X; | ||
2664 | a = f / x; | ||
2665 | x *= a; | ||
2666 | y *= a; | ||
2667 | z *= a; | ||
2668 | } | ||
2696 | 2669 | ||
2697 | float f = 1.0f; | 2670 | if (oldSize.Y * y > m_scene.m_maxPhys) |
2698 | float a = 1.0f; | 2671 | { |
2672 | f = m_scene.m_maxPhys / oldSize.Y; | ||
2673 | a = f / y; | ||
2674 | x *= a; | ||
2675 | y *= a; | ||
2676 | z *= a; | ||
2677 | } | ||
2699 | 2678 | ||
2700 | if (part.PhysActor != null && part.PhysActor.IsPhysical) | 2679 | if (oldSize.Z * z > m_scene.m_maxPhys) |
2701 | { | 2680 | { |
2702 | if (oldSize.X * x > m_scene.m_maxPhys) | 2681 | f = m_scene.m_maxPhys / oldSize.Z; |
2703 | { | 2682 | a = f / z; |
2704 | f = m_scene.m_maxPhys / oldSize.X; | 2683 | x *= a; |
2705 | a = f / x; | 2684 | y *= a; |
2706 | x *= a; | 2685 | z *= a; |
2707 | y *= a; | 2686 | } |
2708 | z *= a; | 2687 | } |
2709 | } | 2688 | else |
2710 | if (oldSize.Y * y > m_scene.m_maxPhys) | 2689 | { |
2711 | { | 2690 | if (oldSize.X * x > m_scene.m_maxNonphys) |
2712 | f = m_scene.m_maxPhys / oldSize.Y; | 2691 | { |
2713 | a = f / y; | 2692 | f = m_scene.m_maxNonphys / oldSize.X; |
2714 | x *= a; | 2693 | a = f / x; |
2715 | y *= a; | 2694 | x *= a; |
2716 | z *= a; | 2695 | y *= a; |
2717 | } | 2696 | z *= a; |
2718 | if (oldSize.Z * z > m_scene.m_maxPhys) | ||
2719 | { | ||
2720 | f = m_scene.m_maxPhys / oldSize.Z; | ||
2721 | a = f / z; | ||
2722 | x *= a; | ||
2723 | y *= a; | ||
2724 | z *= a; | ||
2725 | } | ||
2726 | } | 2697 | } |
2727 | else | 2698 | |
2699 | if (oldSize.Y * y > m_scene.m_maxNonphys) | ||
2728 | { | 2700 | { |
2729 | if (oldSize.X * x > m_scene.m_maxNonphys) | 2701 | f = m_scene.m_maxNonphys / oldSize.Y; |
2730 | { | 2702 | a = f / y; |
2731 | f = m_scene.m_maxNonphys / oldSize.X; | 2703 | x *= a; |
2732 | a = f / x; | 2704 | y *= a; |
2733 | x *= a; | 2705 | z *= a; |
2734 | y *= a; | 2706 | } |
2735 | z *= a; | 2707 | |
2736 | } | 2708 | if (oldSize.Z * z > m_scene.m_maxNonphys) |
2737 | if (oldSize.Y * y > m_scene.m_maxNonphys) | 2709 | { |
2738 | { | 2710 | f = m_scene.m_maxNonphys / oldSize.Z; |
2739 | f = m_scene.m_maxNonphys / oldSize.Y; | 2711 | a = f / z; |
2740 | a = f / y; | 2712 | x *= a; |
2741 | x *= a; | 2713 | y *= a; |
2742 | y *= a; | 2714 | z *= a; |
2743 | z *= a; | ||
2744 | } | ||
2745 | if (oldSize.Z * z > m_scene.m_maxNonphys) | ||
2746 | { | ||
2747 | f = m_scene.m_maxNonphys / oldSize.Z; | ||
2748 | a = f / z; | ||
2749 | x *= a; | ||
2750 | y *= a; | ||
2751 | z *= a; | ||
2752 | } | ||
2753 | } | 2715 | } |
2754 | obPart.IgnoreUndoUpdate = false; | ||
2755 | obPart.StoreUndoState(); | ||
2756 | } | 2716 | } |
2717 | |||
2718 | // obPart.IgnoreUndoUpdate = false; | ||
2757 | } | 2719 | } |
2758 | } | 2720 | } |
2721 | } | ||
2759 | 2722 | ||
2760 | Vector3 prevScale = part.Scale; | 2723 | Vector3 prevScale = RootPart.Scale; |
2761 | prevScale.X *= x; | 2724 | prevScale.X *= x; |
2762 | prevScale.Y *= y; | 2725 | prevScale.Y *= y; |
2763 | prevScale.Z *= z; | 2726 | prevScale.Z *= z; |
2764 | part.Resize(prevScale); | ||
2765 | 2727 | ||
2766 | parts = m_parts.GetArray(); | 2728 | // RootPart.IgnoreUndoUpdate = true; |
2767 | for (int i = 0; i < parts.Length; i++) | 2729 | RootPart.Resize(prevScale); |
2730 | // RootPart.IgnoreUndoUpdate = false; | ||
2731 | |||
2732 | parts = m_parts.GetArray(); | ||
2733 | for (int i = 0; i < parts.Length; i++) | ||
2734 | { | ||
2735 | SceneObjectPart obPart = parts[i]; | ||
2736 | |||
2737 | if (obPart.UUID != m_rootPart.UUID) | ||
2768 | { | 2738 | { |
2769 | SceneObjectPart obPart = parts[i]; | ||
2770 | obPart.IgnoreUndoUpdate = true; | 2739 | obPart.IgnoreUndoUpdate = true; |
2771 | if (obPart.UUID != m_rootPart.UUID) | ||
2772 | { | ||
2773 | Vector3 currentpos = new Vector3(obPart.OffsetPosition); | ||
2774 | currentpos.X *= x; | ||
2775 | currentpos.Y *= y; | ||
2776 | currentpos.Z *= z; | ||
2777 | Vector3 newSize = new Vector3(obPart.Scale); | ||
2778 | newSize.X *= x; | ||
2779 | newSize.Y *= y; | ||
2780 | newSize.Z *= z; | ||
2781 | obPart.Resize(newSize); | ||
2782 | obPart.UpdateOffSet(currentpos); | ||
2783 | } | ||
2784 | obPart.IgnoreUndoUpdate = false; | ||
2785 | obPart.StoreUndoState(); | ||
2786 | } | ||
2787 | 2740 | ||
2788 | if (part.PhysActor != null) | 2741 | Vector3 currentpos = new Vector3(obPart.OffsetPosition); |
2789 | { | 2742 | currentpos.X *= x; |
2790 | part.PhysActor.Size = prevScale; | 2743 | currentpos.Y *= y; |
2791 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); | 2744 | currentpos.Z *= z; |
2745 | |||
2746 | Vector3 newSize = new Vector3(obPart.Scale); | ||
2747 | newSize.X *= x; | ||
2748 | newSize.Y *= y; | ||
2749 | newSize.Z *= z; | ||
2750 | |||
2751 | obPart.Resize(newSize); | ||
2752 | obPart.UpdateOffSet(currentpos); | ||
2753 | |||
2754 | obPart.IgnoreUndoUpdate = false; | ||
2792 | } | 2755 | } |
2793 | 2756 | ||
2794 | part.IgnoreUndoUpdate = false; | 2757 | // obPart.IgnoreUndoUpdate = false; |
2795 | part.StoreUndoState(); | 2758 | // obPart.StoreUndoState(); |
2796 | HasGroupChanged = true; | ||
2797 | m_rootPart.TriggerScriptChangedEvent(Changed.SCALE); | ||
2798 | ScheduleGroupForTerseUpdate(); | ||
2799 | } | 2759 | } |
2760 | |||
2761 | // m_log.DebugFormat( | ||
2762 | // "[SCENE OBJECT GROUP]: Finished group resizing {0} {1} to {2}", Name, LocalId, RootPart.Scale); | ||
2800 | } | 2763 | } |
2801 | 2764 | ||
2802 | #endregion | 2765 | #endregion |
@@ -2809,9 +2772,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2809 | /// <param name="pos"></param> | 2772 | /// <param name="pos"></param> |
2810 | public void UpdateGroupPosition(Vector3 pos) | 2773 | public void UpdateGroupPosition(Vector3 pos) |
2811 | { | 2774 | { |
2812 | SceneObjectPart[] parts = m_parts.GetArray(); | 2775 | // m_log.DebugFormat("[SCENE OBJECT GROUP]: Updating group position on {0} {1} to {2}", Name, LocalId, pos); |
2813 | for (int i = 0; i < parts.Length; i++) | 2776 | |
2814 | parts[i].StoreUndoState(); | 2777 | RootPart.StoreUndoState(true); |
2778 | |||
2779 | // SceneObjectPart[] parts = m_parts.GetArray(); | ||
2780 | // for (int i = 0; i < parts.Length; i++) | ||
2781 | // parts[i].StoreUndoState(); | ||
2815 | 2782 | ||
2816 | if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) | 2783 | if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) |
2817 | { | 2784 | { |
@@ -2848,12 +2815,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
2848 | { | 2815 | { |
2849 | SceneObjectPart part = GetChildPart(localID); | 2816 | SceneObjectPart part = GetChildPart(localID); |
2850 | 2817 | ||
2851 | SceneObjectPart[] parts = m_parts.GetArray(); | 2818 | // SceneObjectPart[] parts = m_parts.GetArray(); |
2852 | for (int i = 0; i < parts.Length; i++) | 2819 | // for (int i = 0; i < parts.Length; i++) |
2853 | parts[i].StoreUndoState(); | 2820 | // parts[i].StoreUndoState(); |
2854 | 2821 | ||
2855 | if (part != null) | 2822 | if (part != null) |
2856 | { | 2823 | { |
2824 | // m_log.DebugFormat( | ||
2825 | // "[SCENE OBJECT GROUP]: Updating single position of {0} {1} to {2}", part.Name, part.LocalId, pos); | ||
2826 | |||
2827 | part.StoreUndoState(false); | ||
2828 | part.IgnoreUndoUpdate = true; | ||
2829 | |||
2857 | if (part.UUID == m_rootPart.UUID) | 2830 | if (part.UUID == m_rootPart.UUID) |
2858 | { | 2831 | { |
2859 | UpdateRootPosition(pos); | 2832 | UpdateRootPosition(pos); |
@@ -2864,18 +2837,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
2864 | } | 2837 | } |
2865 | 2838 | ||
2866 | HasGroupChanged = true; | 2839 | HasGroupChanged = true; |
2840 | part.IgnoreUndoUpdate = false; | ||
2867 | } | 2841 | } |
2868 | } | 2842 | } |
2869 | 2843 | ||
2870 | /// <summary> | 2844 | /// <summary> |
2871 | /// | 2845 | /// Update just the root prim position in a linkset |
2872 | /// </summary> | 2846 | /// </summary> |
2873 | /// <param name="pos"></param> | 2847 | /// <param name="pos"></param> |
2874 | private void UpdateRootPosition(Vector3 pos) | 2848 | public void UpdateRootPosition(Vector3 pos) |
2875 | { | 2849 | { |
2876 | SceneObjectPart[] parts = m_parts.GetArray(); | 2850 | // m_log.DebugFormat( |
2877 | for (int i = 0; i < parts.Length; i++) | 2851 | // "[SCENE OBJECT GROUP]: Updating root position of {0} {1} to {2}", Name, LocalId, pos); |
2878 | parts[i].StoreUndoState(); | 2852 | |
2853 | // SceneObjectPart[] parts = m_parts.GetArray(); | ||
2854 | // for (int i = 0; i < parts.Length; i++) | ||
2855 | // parts[i].StoreUndoState(); | ||
2879 | 2856 | ||
2880 | Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); | 2857 | Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z); |
2881 | Vector3 oldPos = | 2858 | Vector3 oldPos = |
@@ -2888,7 +2865,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2888 | axDiff *= Quaternion.Inverse(partRotation); | 2865 | axDiff *= Quaternion.Inverse(partRotation); |
2889 | diff = axDiff; | 2866 | diff = axDiff; |
2890 | 2867 | ||
2891 | parts = m_parts.GetArray(); | 2868 | SceneObjectPart[] parts = m_parts.GetArray(); |
2892 | for (int i = 0; i < parts.Length; i++) | 2869 | for (int i = 0; i < parts.Length; i++) |
2893 | { | 2870 | { |
2894 | SceneObjectPart obPart = parts[i]; | 2871 | SceneObjectPart obPart = parts[i]; |
@@ -2917,9 +2894,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2917 | /// <param name="rot"></param> | 2894 | /// <param name="rot"></param> |
2918 | public void UpdateGroupRotationR(Quaternion rot) | 2895 | public void UpdateGroupRotationR(Quaternion rot) |
2919 | { | 2896 | { |
2920 | SceneObjectPart[] parts = m_parts.GetArray(); | 2897 | // m_log.DebugFormat( |
2921 | for (int i = 0; i < parts.Length; i++) | 2898 | // "[SCENE OBJECT GROUP]: Updating group rotation R of {0} {1} to {2}", Name, LocalId, rot); |
2922 | parts[i].StoreUndoState(); | 2899 | |
2900 | // SceneObjectPart[] parts = m_parts.GetArray(); | ||
2901 | // for (int i = 0; i < parts.Length; i++) | ||
2902 | // parts[i].StoreUndoState(); | ||
2903 | |||
2904 | m_rootPart.StoreUndoState(true); | ||
2923 | 2905 | ||
2924 | m_rootPart.UpdateRotation(rot); | 2906 | m_rootPart.UpdateRotation(rot); |
2925 | 2907 | ||
@@ -2941,9 +2923,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
2941 | /// <param name="rot"></param> | 2923 | /// <param name="rot"></param> |
2942 | public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot) | 2924 | public void UpdateGroupRotationPR(Vector3 pos, Quaternion rot) |
2943 | { | 2925 | { |
2944 | SceneObjectPart[] parts = m_parts.GetArray(); | 2926 | // m_log.DebugFormat( |
2945 | for (int i = 0; i < parts.Length; i++) | 2927 | // "[SCENE OBJECT GROUP]: Updating group rotation PR of {0} {1} to {2}", Name, LocalId, rot); |
2946 | parts[i].StoreUndoState(); | 2928 | |
2929 | // SceneObjectPart[] parts = m_parts.GetArray(); | ||
2930 | // for (int i = 0; i < parts.Length; i++) | ||
2931 | // parts[i].StoreUndoState(); | ||
2932 | |||
2933 | RootPart.StoreUndoState(true); | ||
2934 | RootPart.IgnoreUndoUpdate = true; | ||
2947 | 2935 | ||
2948 | m_rootPart.UpdateRotation(rot); | 2936 | m_rootPart.UpdateRotation(rot); |
2949 | 2937 | ||
@@ -2958,6 +2946,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2958 | 2946 | ||
2959 | HasGroupChanged = true; | 2947 | HasGroupChanged = true; |
2960 | ScheduleGroupForTerseUpdate(); | 2948 | ScheduleGroupForTerseUpdate(); |
2949 | |||
2950 | RootPart.IgnoreUndoUpdate = false; | ||
2961 | } | 2951 | } |
2962 | 2952 | ||
2963 | /// <summary> | 2953 | /// <summary> |
@@ -2975,6 +2965,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2975 | 2965 | ||
2976 | if (part != null) | 2966 | if (part != null) |
2977 | { | 2967 | { |
2968 | // m_log.DebugFormat( | ||
2969 | // "[SCENE OBJECT GROUP]: Updating single rotation of {0} {1} to {2}", part.Name, part.LocalId, rot); | ||
2970 | |||
2978 | if (part.UUID == m_rootPart.UUID) | 2971 | if (part.UUID == m_rootPart.UUID) |
2979 | { | 2972 | { |
2980 | UpdateRootRotation(rot); | 2973 | UpdateRootRotation(rot); |
@@ -2996,6 +2989,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2996 | SceneObjectPart part = GetChildPart(localID); | 2989 | SceneObjectPart part = GetChildPart(localID); |
2997 | if (part != null) | 2990 | if (part != null) |
2998 | { | 2991 | { |
2992 | // m_log.DebugFormat( | ||
2993 | // "[SCENE OBJECT GROUP]: Updating single position and rotation of {0} {1} to {2}", | ||
2994 | // part.Name, part.LocalId, rot); | ||
2995 | |||
2996 | part.StoreUndoState(); | ||
2997 | part.IgnoreUndoUpdate = true; | ||
2998 | |||
2999 | if (part.UUID == m_rootPart.UUID) | 2999 | if (part.UUID == m_rootPart.UUID) |
3000 | { | 3000 | { |
3001 | UpdateRootRotation(rot); | 3001 | UpdateRootRotation(rot); |
@@ -3003,12 +3003,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
3003 | } | 3003 | } |
3004 | else | 3004 | else |
3005 | { | 3005 | { |
3006 | part.IgnoreUndoUpdate = true; | ||
3007 | part.UpdateRotation(rot); | 3006 | part.UpdateRotation(rot); |
3008 | part.OffsetPosition = pos; | 3007 | part.OffsetPosition = pos; |
3009 | part.IgnoreUndoUpdate = false; | ||
3010 | part.StoreUndoState(); | ||
3011 | } | 3008 | } |
3009 | |||
3010 | part.IgnoreUndoUpdate = false; | ||
3012 | } | 3011 | } |
3013 | } | 3012 | } |
3014 | 3013 | ||
@@ -3016,8 +3015,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
3016 | /// | 3015 | /// |
3017 | /// </summary> | 3016 | /// </summary> |
3018 | /// <param name="rot"></param> | 3017 | /// <param name="rot"></param> |
3019 | private void UpdateRootRotation(Quaternion rot) | 3018 | public void UpdateRootRotation(Quaternion rot) |
3020 | { | 3019 | { |
3020 | // m_log.DebugFormat( | ||
3021 | // "[SCENE OBJECT GROUP]: Updating root rotation of {0} {1} to {2}", | ||
3022 | // Name, LocalId, rot); | ||
3023 | |||
3021 | Quaternion axRot = rot; | 3024 | Quaternion axRot = rot; |
3022 | Quaternion oldParentRot = m_rootPart.RotationOffset; | 3025 | Quaternion oldParentRot = m_rootPart.RotationOffset; |
3023 | 3026 | ||
@@ -3045,20 +3048,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
3045 | newRot *= Quaternion.Inverse(axRot); | 3048 | newRot *= Quaternion.Inverse(axRot); |
3046 | prim.RotationOffset = newRot; | 3049 | prim.RotationOffset = newRot; |
3047 | prim.ScheduleTerseUpdate(); | 3050 | prim.ScheduleTerseUpdate(); |
3051 | prim.IgnoreUndoUpdate = false; | ||
3048 | } | 3052 | } |
3049 | } | 3053 | } |
3050 | 3054 | ||
3051 | for (int i = 0; i < parts.Length; i++) | 3055 | // for (int i = 0; i < parts.Length; i++) |
3052 | { | 3056 | // { |
3053 | SceneObjectPart childpart = parts[i]; | 3057 | // SceneObjectPart childpart = parts[i]; |
3054 | if (childpart != m_rootPart) | 3058 | // if (childpart != m_rootPart) |
3055 | { | 3059 | // { |
3056 | childpart.IgnoreUndoUpdate = false; | 3060 | //// childpart.IgnoreUndoUpdate = false; |
3057 | childpart.StoreUndoState(); | 3061 | //// childpart.StoreUndoState(); |
3058 | } | 3062 | // } |
3059 | } | 3063 | // } |
3060 | 3064 | ||
3061 | m_rootPart.ScheduleTerseUpdate(); | 3065 | m_rootPart.ScheduleTerseUpdate(); |
3066 | |||
3067 | // m_log.DebugFormat( | ||
3068 | // "[SCENE OBJECT GROUP]: Updated root rotation of {0} {1} to {2}", | ||
3069 | // Name, LocalId, rot); | ||
3062 | } | 3070 | } |
3063 | 3071 | ||
3064 | #endregion | 3072 | #endregion |
@@ -3313,23 +3321,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3313 | } | 3321 | } |
3314 | 3322 | ||
3315 | /// <summary> | 3323 | /// <summary> |
3316 | /// Handle an asset received asynchronously from the asset service. | ||
3317 | /// </summary> | ||
3318 | /// <param name="id"></param> | ||
3319 | /// <param name="sender"></param> | ||
3320 | /// <param name="asset"></param> | ||
3321 | protected void AssetReceived(string id, Object sender, AssetBase asset) | ||
3322 | { | ||
3323 | SceneObjectPart sop = (SceneObjectPart)sender; | ||
3324 | |||
3325 | if (sop != null) | ||
3326 | { | ||
3327 | if (asset != null) | ||
3328 | sop.SculptTextureCallback(asset.FullID, asset); | ||
3329 | } | ||
3330 | } | ||
3331 | |||
3332 | /// <summary> | ||
3333 | /// Set the user group to which this scene object belongs. | 3324 | /// Set the user group to which this scene object belongs. |
3334 | /// </summary> | 3325 | /// </summary> |
3335 | /// <param name="GroupID"></param> | 3326 | /// <param name="GroupID"></param> |