diff options
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 222 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 62 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/UndoState.cs | 18 |
4 files changed, 194 insertions, 112 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index f835e56..051c4fa 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -11518,183 +11518,270 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11518 | // } | 11518 | // } |
11519 | 11519 | ||
11520 | UpdatePrimGroupRotation handlerUpdatePrimGroupRotation; | 11520 | UpdatePrimGroupRotation handlerUpdatePrimGroupRotation; |
11521 | UpdateVector handlerUpdatePrimGroupScale; | ||
11522 | |||
11523 | Quaternion arot; | ||
11524 | Vector3 ascale; | ||
11525 | Vector3 apos; | ||
11526 | /*ubit from ll JIRA: | ||
11527 | * 0x01 position | ||
11528 | * 0x02 rotation | ||
11529 | * 0x04 scale | ||
11530 | |||
11531 | * 0x08 LINK_SET | ||
11532 | * 0x10 UNIFORM for scale | ||
11533 | */ | ||
11534 | |||
11521 | 11535 | ||
11522 | switch (block.Type) | 11536 | switch (block.Type) |
11523 | { | 11537 | { |
11524 | case 1: | 11538 | case 1: //change position sp |
11525 | Vector3 pos1 = new Vector3(block.Data, 0); | 11539 | apos = new Vector3(block.Data, 0); |
11526 | 11540 | ||
11527 | UpdateVector handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; | 11541 | UpdateVector handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; |
11528 | if (handlerUpdatePrimSinglePosition != null) | 11542 | if (handlerUpdatePrimSinglePosition != null) |
11529 | { | 11543 | { |
11544 | part.StoreUndoState(); | ||
11545 | part.IgnoreUndoUpdate = true; | ||
11546 | |||
11530 | // m_log.Debug("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z); | 11547 | // m_log.Debug("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z); |
11531 | handlerUpdatePrimSinglePosition(localId, pos1, this); | 11548 | handlerUpdatePrimSinglePosition(localId, apos, this); |
11549 | |||
11550 | part.IgnoreUndoUpdate = false; | ||
11532 | } | 11551 | } |
11533 | break; | 11552 | break; |
11534 | 11553 | ||
11535 | case 2: | 11554 | case 2: // rotation sp |
11536 | Quaternion rot1 = new Quaternion(block.Data, 0, true); | 11555 | arot = new Quaternion(block.Data, 0, true); |
11537 | 11556 | ||
11538 | UpdatePrimSingleRotation handlerUpdatePrimSingleRotation = OnUpdatePrimSingleRotation; | 11557 | UpdatePrimSingleRotation handlerUpdatePrimSingleRotation = OnUpdatePrimSingleRotation; |
11539 | if (handlerUpdatePrimSingleRotation != null) | 11558 | if (handlerUpdatePrimSingleRotation != null) |
11540 | { | 11559 | { |
11541 | // m_log.Info("new tab rotation is " + rot1.X + " , " + rot1.Y + " , " + rot1.Z + " , " + rot1.W); | 11560 | part.StoreUndoState(); |
11542 | handlerUpdatePrimSingleRotation(localId, rot1, this); | 11561 | part.IgnoreUndoUpdate = true; |
11562 | |||
11563 | handlerUpdatePrimSingleRotation(localId, arot, this); | ||
11564 | |||
11565 | part.IgnoreUndoUpdate = false; | ||
11543 | } | 11566 | } |
11544 | break; | 11567 | break; |
11545 | 11568 | ||
11546 | case 3: | 11569 | case 3: // position plus rotation |
11547 | Vector3 rotPos = new Vector3(block.Data, 0); | 11570 | apos = new Vector3(block.Data, 0); |
11548 | Quaternion rot2 = new Quaternion(block.Data, 12, true); | 11571 | arot = new Quaternion(block.Data, 12, true); |
11549 | 11572 | ||
11550 | UpdatePrimSingleRotationPosition handlerUpdatePrimSingleRotationPosition = OnUpdatePrimSingleRotationPosition; | 11573 | UpdatePrimSingleRotationPosition handlerUpdatePrimSingleRotationPosition = OnUpdatePrimSingleRotationPosition; |
11551 | if (handlerUpdatePrimSingleRotationPosition != null) | 11574 | if (handlerUpdatePrimSingleRotationPosition != null) |
11552 | { | 11575 | { |
11553 | // m_log.Debug("new mouse rotation position is " + rotPos.X + " , " + rotPos.Y + " , " + rotPos.Z); | 11576 | part.StoreUndoState(); |
11554 | // m_log.Info("new mouse rotation is " + rot2.X + " , " + rot2.Y + " , " + rot2.Z + " , " + rot2.W); | 11577 | part.IgnoreUndoUpdate = true; |
11555 | handlerUpdatePrimSingleRotationPosition(localId, rot2, rotPos, this); | 11578 | |
11579 | handlerUpdatePrimSingleRotationPosition(localId, arot, apos, this); | ||
11580 | |||
11581 | part.IgnoreUndoUpdate = false; | ||
11556 | } | 11582 | } |
11557 | break; | 11583 | break; |
11558 | 11584 | ||
11559 | case 4: | 11585 | case 4: // scale sp |
11560 | case 20: | 11586 | case 0x14: // uniform scale sp |
11561 | Vector3 scale4 = new Vector3(block.Data, 0); | 11587 | ascale = new Vector3(block.Data, 0); |
11562 | 11588 | ||
11563 | UpdateVector handlerUpdatePrimScale = OnUpdatePrimScale; | 11589 | UpdateVector handlerUpdatePrimScale = OnUpdatePrimScale; |
11564 | if (handlerUpdatePrimScale != null) | 11590 | if (handlerUpdatePrimScale != null) |
11565 | { | 11591 | { |
11566 | // m_log.Debug("new scale is " + scale4.X + " , " + scale4.Y + " , " + scale4.Z); | 11592 | part.StoreUndoState(); |
11567 | handlerUpdatePrimScale(localId, scale4, this); | 11593 | part.IgnoreUndoUpdate = true; |
11594 | |||
11595 | handlerUpdatePrimScale(localId, ascale, this); | ||
11596 | |||
11597 | part.IgnoreUndoUpdate = false; | ||
11568 | } | 11598 | } |
11569 | break; | 11599 | break; |
11570 | 11600 | ||
11571 | case 5: | 11601 | case 5: // scale and position sp |
11572 | Vector3 scale1 = new Vector3(block.Data, 12); | 11602 | apos = new Vector3(block.Data, 0); |
11573 | Vector3 pos11 = new Vector3(block.Data, 0); | 11603 | ascale = new Vector3(block.Data, 12); |
11604 | |||
11574 | 11605 | ||
11575 | handlerUpdatePrimScale = OnUpdatePrimScale; | 11606 | handlerUpdatePrimScale = OnUpdatePrimScale; |
11576 | if (handlerUpdatePrimScale != null) | 11607 | if (handlerUpdatePrimScale != null) |
11577 | { | 11608 | { |
11578 | // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); | 11609 | part.StoreUndoState(); |
11579 | handlerUpdatePrimScale(localId, scale1, this); | 11610 | part.IgnoreUndoUpdate = true; |
11611 | |||
11612 | handlerUpdatePrimScale(localId, ascale, this); | ||
11613 | |||
11614 | handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; | ||
11580 | 11615 | ||
11616 | if (handlerUpdatePrimSinglePosition != null) | ||
11617 | { | ||
11618 | handlerUpdatePrimSinglePosition(localId, apos, this); | ||
11619 | } | ||
11620 | part.IgnoreUndoUpdate = false; | ||
11621 | } | ||
11622 | break; | ||
11623 | |||
11624 | case 0x15: //uniform scale and position | ||
11625 | apos = new Vector3(block.Data, 0); | ||
11626 | ascale = new Vector3(block.Data, 12); | ||
11627 | |||
11628 | |||
11629 | handlerUpdatePrimScale = OnUpdatePrimScale; | ||
11630 | if (handlerUpdatePrimScale != null) | ||
11631 | { | ||
11632 | part.StoreUndoState(false); | ||
11633 | part.IgnoreUndoUpdate = true; | ||
11634 | |||
11635 | // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); | ||
11636 | handlerUpdatePrimScale(localId, ascale, this); | ||
11581 | handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; | 11637 | handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; |
11582 | if (handlerUpdatePrimSinglePosition != null) | 11638 | if (handlerUpdatePrimSinglePosition != null) |
11583 | { | 11639 | { |
11584 | handlerUpdatePrimSinglePosition(localId, pos11, this); | 11640 | handlerUpdatePrimSinglePosition(localId, apos, this); |
11585 | } | 11641 | } |
11642 | |||
11643 | part.IgnoreUndoUpdate = false; | ||
11586 | } | 11644 | } |
11587 | break; | 11645 | break; |
11588 | 11646 | ||
11589 | case 9: | 11647 | // now group related (bit 4) |
11590 | Vector3 pos2 = new Vector3(block.Data, 0); | 11648 | case 9: //( 8 + 1 )group position |
11649 | apos = new Vector3(block.Data, 0); | ||
11591 | 11650 | ||
11592 | UpdateVector handlerUpdateVector = OnUpdatePrimGroupPosition; | 11651 | UpdateVector handlerUpdateVector = OnUpdatePrimGroupPosition; |
11593 | 11652 | ||
11594 | if (handlerUpdateVector != null) | 11653 | if (handlerUpdateVector != null) |
11595 | { | 11654 | { |
11596 | handlerUpdateVector(localId, pos2, this); | 11655 | part.StoreUndoState(true); |
11656 | part.IgnoreUndoUpdate = true; | ||
11657 | |||
11658 | handlerUpdateVector(localId, apos, this); | ||
11659 | |||
11660 | part.IgnoreUndoUpdate = false; | ||
11597 | } | 11661 | } |
11598 | break; | 11662 | break; |
11599 | 11663 | ||
11600 | case 10: | 11664 | case 0x0A: // (8 + 2) group rotation |
11601 | Quaternion rot3 = new Quaternion(block.Data, 0, true); | 11665 | arot = new Quaternion(block.Data, 0, true); |
11602 | 11666 | ||
11603 | UpdatePrimRotation handlerUpdatePrimRotation = OnUpdatePrimGroupRotation; | 11667 | UpdatePrimRotation handlerUpdatePrimRotation = OnUpdatePrimGroupRotation; |
11604 | if (handlerUpdatePrimRotation != null) | 11668 | if (handlerUpdatePrimRotation != null) |
11605 | { | 11669 | { |
11606 | // Console.WriteLine("new rotation is " + rot3.X + " , " + rot3.Y + " , " + rot3.Z + " , " + rot3.W); | 11670 | // Console.WriteLine("new rotation is " + rot3.X + " , " + rot3.Y + " , " + rot3.Z + " , " + rot3.W); |
11607 | handlerUpdatePrimRotation(localId, rot3, this); | 11671 | part.StoreUndoState(true); |
11672 | part.IgnoreUndoUpdate = true; | ||
11673 | |||
11674 | handlerUpdatePrimRotation(localId, arot, this); | ||
11675 | |||
11676 | part.IgnoreUndoUpdate = false; | ||
11608 | } | 11677 | } |
11609 | break; | 11678 | break; |
11610 | 11679 | ||
11611 | case 11: | 11680 | case 0x0B: //( 8 + 2 + 1) group rotation and position |
11612 | Vector3 pos3 = new Vector3(block.Data, 0); | 11681 | apos = new Vector3(block.Data, 0); |
11613 | Quaternion rot4 = new Quaternion(block.Data, 12, true); | 11682 | arot = new Quaternion(block.Data, 12, true); |
11614 | 11683 | ||
11615 | handlerUpdatePrimGroupRotation = OnUpdatePrimGroupMouseRotation; | 11684 | handlerUpdatePrimGroupRotation = OnUpdatePrimGroupMouseRotation; |
11616 | if (handlerUpdatePrimGroupRotation != null) | 11685 | if (handlerUpdatePrimGroupRotation != null) |
11617 | { | 11686 | { |
11618 | // m_log.Debug("new rotation position is " + pos.X + " , " + pos.Y + " , " + pos.Z); | 11687 | // m_log.Debug("new rotation position is " + pos.X + " , " + pos.Y + " , " + pos.Z); |
11619 | // m_log.Debug("new group mouse rotation is " + rot4.X + " , " + rot4.Y + " , " + rot4.Z + " , " + rot4.W); | 11688 | // m_log.Debug("new group mouse rotation is " + rot4.X + " , " + rot4.Y + " , " + rot4.Z + " , " + rot4.W); |
11620 | handlerUpdatePrimGroupRotation(localId, pos3, rot4, this); | 11689 | part.StoreUndoState(true); |
11690 | part.IgnoreUndoUpdate = true; | ||
11691 | |||
11692 | handlerUpdatePrimGroupRotation(localId, apos, arot, this); | ||
11693 | |||
11694 | part.IgnoreUndoUpdate = false; | ||
11621 | } | 11695 | } |
11622 | break; | 11696 | break; |
11623 | case 12: | ||
11624 | case 28: | ||
11625 | Vector3 scale7 = new Vector3(block.Data, 0); | ||
11626 | 11697 | ||
11627 | UpdateVector handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale; | 11698 | case 0x0C: // (8 + 4) group scale |
11628 | if (handlerUpdatePrimGroupScale != null) | 11699 | // only afects root prim and only sent by viewer editor object tab scaling |
11700 | // mouse edition only allows uniform scaling | ||
11701 | // SL MAY CHANGE THIS in viewers | ||
11702 | |||
11703 | ascale = new Vector3(block.Data, 0); | ||
11704 | |||
11705 | handlerUpdatePrimScale = OnUpdatePrimScale; | ||
11706 | if (handlerUpdatePrimScale != null) | ||
11629 | { | 11707 | { |
11630 | // m_log.Debug("new scale is " + scale7.X + " , " + scale7.Y + " , " + scale7.Z); | 11708 | // m_log.Debug("new scale is " + scale7.X + " , " + scale7.Y + " , " + scale7.Z); |
11631 | handlerUpdatePrimGroupScale(localId, scale7, this); | 11709 | part.StoreUndoState(false); // <- SL Exception make it apply to root prim and not group |
11710 | part.IgnoreUndoUpdate = true; | ||
11711 | |||
11712 | handlerUpdatePrimScale(localId, ascale, this); | ||
11713 | |||
11714 | part.IgnoreUndoUpdate = false; | ||
11632 | } | 11715 | } |
11633 | break; | 11716 | break; |
11634 | 11717 | ||
11635 | case 13: | 11718 | case 0x0D: //(8 + 4 + 1) group scale and position |
11636 | Vector3 scale2 = new Vector3(block.Data, 12); | 11719 | // exception as above |
11637 | Vector3 pos4 = new Vector3(block.Data, 0); | ||
11638 | 11720 | ||
11721 | apos = new Vector3(block.Data, 0); | ||
11722 | ascale = new Vector3(block.Data, 12); | ||
11723 | |||
11639 | handlerUpdatePrimScale = OnUpdatePrimScale; | 11724 | handlerUpdatePrimScale = OnUpdatePrimScale; |
11640 | if (handlerUpdatePrimScale != null) | 11725 | if (handlerUpdatePrimScale != null) |
11641 | { | 11726 | { |
11642 | //m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); | 11727 | //m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); |
11643 | handlerUpdatePrimScale(localId, scale2, this); | 11728 | part.StoreUndoState(false); // <- make it apply to root prim and not group |
11729 | part.IgnoreUndoUpdate = true; | ||
11730 | |||
11731 | handlerUpdatePrimScale(localId, ascale, this); | ||
11644 | 11732 | ||
11645 | // Change the position based on scale (for bug number 246) | 11733 | // Change the position based on scale (for bug number 246) |
11646 | handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; | 11734 | handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; |
11647 | // m_log.Debug("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z); | 11735 | // m_log.Debug("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z); |
11648 | if (handlerUpdatePrimSinglePosition != null) | 11736 | if (handlerUpdatePrimSinglePosition != null) |
11649 | { | 11737 | { |
11650 | handlerUpdatePrimSinglePosition(localId, pos4, this); | 11738 | handlerUpdatePrimSinglePosition(localId, apos, this); |
11651 | } | 11739 | } |
11740 | |||
11741 | part.IgnoreUndoUpdate = false; | ||
11652 | } | 11742 | } |
11653 | break; | 11743 | break; |
11654 | 11744 | ||
11655 | case 29: | 11745 | case 0x1C: // (0x10 + 8 + 4 ) group scale UNIFORM |
11656 | Vector3 scale5 = new Vector3(block.Data, 12); | 11746 | ascale = new Vector3(block.Data, 0); |
11657 | Vector3 pos5 = new Vector3(block.Data, 0); | ||
11658 | 11747 | ||
11659 | handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale; | 11748 | handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale; |
11660 | if (handlerUpdatePrimGroupScale != null) | 11749 | if (handlerUpdatePrimGroupScale != null) |
11661 | { | 11750 | { |
11662 | // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); | 11751 | // m_log.Debug("new scale is " + scale7.X + " , " + scale7.Y + " , " + scale7.Z); |
11663 | part.StoreUndoState(true); | 11752 | part.StoreUndoState(true); |
11664 | part.IgnoreUndoUpdate = true; | 11753 | part.IgnoreUndoUpdate = true; |
11665 | handlerUpdatePrimGroupScale(localId, scale5, this); | ||
11666 | handlerUpdateVector = OnUpdatePrimGroupPosition; | ||
11667 | 11754 | ||
11668 | if (handlerUpdateVector != null) | 11755 | handlerUpdatePrimGroupScale(localId, ascale, this); |
11669 | { | ||
11670 | handlerUpdateVector(localId, pos5, this); | ||
11671 | } | ||
11672 | 11756 | ||
11673 | part.IgnoreUndoUpdate = false; | 11757 | part.IgnoreUndoUpdate = false; |
11674 | } | 11758 | } |
11675 | |||
11676 | break; | 11759 | break; |
11677 | 11760 | ||
11678 | case 21: | 11761 | case 0x1D: // (UNIFORM + GROUP + SCALE + POS) |
11679 | Vector3 scale6 = new Vector3(block.Data, 12); | 11762 | apos = new Vector3(block.Data, 0); |
11680 | Vector3 pos6 = new Vector3(block.Data, 0); | 11763 | ascale = new Vector3(block.Data, 12); |
11764 | |||
11681 | 11765 | ||
11682 | handlerUpdatePrimScale = OnUpdatePrimScale; | 11766 | handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale; |
11683 | if (handlerUpdatePrimScale != null) | 11767 | if (handlerUpdatePrimGroupScale != null) |
11684 | { | 11768 | { |
11685 | part.StoreUndoState(false); | 11769 | // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); |
11770 | part.StoreUndoState(true); | ||
11686 | part.IgnoreUndoUpdate = true; | 11771 | part.IgnoreUndoUpdate = true; |
11687 | 11772 | ||
11688 | // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z); | 11773 | handlerUpdatePrimGroupScale(localId, ascale, this); |
11689 | handlerUpdatePrimScale(localId, scale6, this); | 11774 | |
11690 | handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; | 11775 | handlerUpdateVector = OnUpdatePrimGroupPosition; |
11691 | if (handlerUpdatePrimSinglePosition != null) | 11776 | |
11777 | if (handlerUpdateVector != null) | ||
11692 | { | 11778 | { |
11693 | handlerUpdatePrimSinglePosition(localId, pos6, this); | 11779 | handlerUpdateVector(localId, apos, this); |
11694 | } | 11780 | } |
11695 | 11781 | ||
11696 | part.IgnoreUndoUpdate = false; | 11782 | part.IgnoreUndoUpdate = false; |
11697 | } | 11783 | } |
11784 | |||
11698 | break; | 11785 | break; |
11699 | 11786 | ||
11700 | default: | 11787 | default: |
@@ -11704,6 +11791,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
11704 | 11791 | ||
11705 | // for (int j = 0; j < parts.Length; j++) | 11792 | // for (int j = 0; j < parts.Length; j++) |
11706 | // parts[j].IgnoreUndoUpdate = false; | 11793 | // parts[j].IgnoreUndoUpdate = false; |
11794 | |||
11707 | } | 11795 | } |
11708 | } | 11796 | } |
11709 | } | 11797 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 038eaa4..2d71372 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -1569,7 +1569,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1569 | // "[SCENE OBJECT GROUP]: Processing OnGrabPart for {0} on {1} {2}, offsetPos {3}", | 1569 | // "[SCENE OBJECT GROUP]: Processing OnGrabPart for {0} on {1} {2}, offsetPos {3}", |
1570 | // remoteClient.Name, part.Name, part.LocalId, offsetPos); | 1570 | // remoteClient.Name, part.Name, part.LocalId, offsetPos); |
1571 | 1571 | ||
1572 | part.StoreUndoState(); | 1572 | // part.StoreUndoState(); |
1573 | part.OnGrab(offsetPos, remoteClient); | 1573 | part.OnGrab(offsetPos, remoteClient); |
1574 | } | 1574 | } |
1575 | 1575 | ||
@@ -3119,7 +3119,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3119 | { | 3119 | { |
3120 | // m_log.DebugFormat( | 3120 | // m_log.DebugFormat( |
3121 | // "[SCENE OBJECT GROUP]: Group resizing {0} {1} from {2} to {3}", Name, LocalId, RootPart.Scale, scale); | 3121 | // "[SCENE OBJECT GROUP]: Group resizing {0} {1} from {2} to {3}", Name, LocalId, RootPart.Scale, scale); |
3122 | RootPart.StoreUndoState(true); | 3122 | // RootPart.StoreUndoState(true); |
3123 | 3123 | ||
3124 | scale.X = Math.Min(scale.X, Scene.m_maxNonphys); | 3124 | scale.X = Math.Min(scale.X, Scene.m_maxNonphys); |
3125 | scale.Y = Math.Min(scale.Y, Scene.m_maxNonphys); | 3125 | scale.Y = Math.Min(scale.Y, Scene.m_maxNonphys); |
@@ -3230,7 +3230,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3230 | 3230 | ||
3231 | if (obPart.UUID != m_rootPart.UUID) | 3231 | if (obPart.UUID != m_rootPart.UUID) |
3232 | { | 3232 | { |
3233 | obPart.IgnoreUndoUpdate = true; | 3233 | // obPart.IgnoreUndoUpdate = true; |
3234 | 3234 | ||
3235 | Vector3 currentpos = new Vector3(obPart.OffsetPosition); | 3235 | Vector3 currentpos = new Vector3(obPart.OffsetPosition); |
3236 | currentpos.X *= x; | 3236 | currentpos.X *= x; |
@@ -3245,7 +3245,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3245 | obPart.Resize(newSize); | 3245 | obPart.Resize(newSize); |
3246 | obPart.UpdateOffSet(currentpos); | 3246 | obPart.UpdateOffSet(currentpos); |
3247 | 3247 | ||
3248 | obPart.IgnoreUndoUpdate = false; | 3248 | // obPart.IgnoreUndoUpdate = false; |
3249 | } | 3249 | } |
3250 | 3250 | ||
3251 | // obPart.IgnoreUndoUpdate = false; | 3251 | // obPart.IgnoreUndoUpdate = false; |
@@ -3270,7 +3270,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3270 | { | 3270 | { |
3271 | // m_log.DebugFormat("[SCENE OBJECT GROUP]: Updating group position on {0} {1} to {2}", Name, LocalId, pos); | 3271 | // m_log.DebugFormat("[SCENE OBJECT GROUP]: Updating group position on {0} {1} to {2}", Name, LocalId, pos); |
3272 | 3272 | ||
3273 | RootPart.StoreUndoState(true); | 3273 | // RootPart.StoreUndoState(true); |
3274 | 3274 | ||
3275 | // SceneObjectPart[] parts = m_parts.GetArray(); | 3275 | // SceneObjectPart[] parts = m_parts.GetArray(); |
3276 | // for (int i = 0; i < parts.Length; i++) | 3276 | // for (int i = 0; i < parts.Length; i++) |
@@ -3311,17 +3311,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
3311 | { | 3311 | { |
3312 | SceneObjectPart part = GetChildPart(localID); | 3312 | SceneObjectPart part = GetChildPart(localID); |
3313 | 3313 | ||
3314 | SceneObjectPart[] parts = m_parts.GetArray(); | 3314 | // SceneObjectPart[] parts = m_parts.GetArray(); |
3315 | for (int i = 0; i < parts.Length; i++) | 3315 | // for (int i = 0; i < parts.Length; i++) |
3316 | parts[i].StoreUndoState(); | 3316 | // parts[i].StoreUndoState(); |
3317 | 3317 | ||
3318 | if (part != null) | 3318 | if (part != null) |
3319 | { | 3319 | { |
3320 | // m_log.DebugFormat( | 3320 | // m_log.DebugFormat( |
3321 | // "[SCENE OBJECT GROUP]: Updating single position of {0} {1} to {2}", part.Name, part.LocalId, pos); | 3321 | // "[SCENE OBJECT GROUP]: Updating single position of {0} {1} to {2}", part.Name, part.LocalId, pos); |
3322 | 3322 | ||
3323 | part.StoreUndoState(false); | 3323 | // part.StoreUndoState(false); |
3324 | part.IgnoreUndoUpdate = true; | 3324 | // part.IgnoreUndoUpdate = true; |
3325 | 3325 | ||
3326 | // unlock parts position change | 3326 | // unlock parts position change |
3327 | if (m_rootPart.PhysActor != null) | 3327 | if (m_rootPart.PhysActor != null) |
@@ -3340,7 +3340,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3340 | m_rootPart.PhysActor.Building = false; | 3340 | m_rootPart.PhysActor.Building = false; |
3341 | 3341 | ||
3342 | HasGroupChanged = true; | 3342 | HasGroupChanged = true; |
3343 | part.IgnoreUndoUpdate = false; | 3343 | // part.IgnoreUndoUpdate = false; |
3344 | } | 3344 | } |
3345 | } | 3345 | } |
3346 | 3346 | ||
@@ -3377,16 +3377,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
3377 | } | 3377 | } |
3378 | 3378 | ||
3379 | //We have to set undoing here because otherwise an undo state will be saved | 3379 | //We have to set undoing here because otherwise an undo state will be saved |
3380 | if (!m_rootPart.Undoing) | 3380 | // if (!m_rootPart.Undoing) |
3381 | { | 3381 | // { |
3382 | m_rootPart.Undoing = true; | 3382 | // m_rootPart.Undoing = true; |
3383 | AbsolutePosition = newPos; | ||
3384 | m_rootPart.Undoing = false; | ||
3385 | } | ||
3386 | else | ||
3387 | { | ||
3388 | AbsolutePosition = newPos; | 3383 | AbsolutePosition = newPos; |
3389 | } | 3384 | // m_rootPart.Undoing = false; |
3385 | // } | ||
3386 | // else | ||
3387 | // { | ||
3388 | // AbsolutePosition = newPos; | ||
3389 | // } | ||
3390 | 3390 | ||
3391 | HasGroupChanged = true; | 3391 | HasGroupChanged = true; |
3392 | if (m_rootPart.Undoing) | 3392 | if (m_rootPart.Undoing) |
@@ -3416,9 +3416,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3416 | // for (int i = 0; i < parts.Length; i++) | 3416 | // for (int i = 0; i < parts.Length; i++) |
3417 | // parts[i].StoreUndoState(); | 3417 | // parts[i].StoreUndoState(); |
3418 | 3418 | ||
3419 | m_rootPart.StoreUndoState(true); | 3419 | // m_rootPart.StoreUndoState(true); |
3420 | 3420 | ||
3421 | m_rootPart.UpdateRotation(rot); | 3421 | // m_rootPart.UpdateRotation(rot); |
3422 | 3422 | ||
3423 | PhysicsActor actor = m_rootPart.PhysActor; | 3423 | PhysicsActor actor = m_rootPart.PhysActor; |
3424 | if (actor != null) | 3424 | if (actor != null) |
@@ -3445,8 +3445,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3445 | // for (int i = 0; i < parts.Length; i++) | 3445 | // for (int i = 0; i < parts.Length; i++) |
3446 | // parts[i].StoreUndoState(); | 3446 | // parts[i].StoreUndoState(); |
3447 | 3447 | ||
3448 | RootPart.StoreUndoState(true); | 3448 | // RootPart.StoreUndoState(true); |
3449 | RootPart.IgnoreUndoUpdate = true; | 3449 | // RootPart.IgnoreUndoUpdate = true; |
3450 | 3450 | ||
3451 | m_rootPart.UpdateRotation(rot); | 3451 | m_rootPart.UpdateRotation(rot); |
3452 | 3452 | ||
@@ -3462,7 +3462,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3462 | HasGroupChanged = true; | 3462 | HasGroupChanged = true; |
3463 | ScheduleGroupForTerseUpdate(); | 3463 | ScheduleGroupForTerseUpdate(); |
3464 | 3464 | ||
3465 | RootPart.IgnoreUndoUpdate = false; | 3465 | // RootPart.IgnoreUndoUpdate = false; |
3466 | } | 3466 | } |
3467 | 3467 | ||
3468 | /// <summary> | 3468 | /// <summary> |
@@ -3511,8 +3511,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3511 | // "[SCENE OBJECT GROUP]: Updating single position and rotation of {0} {1} to {2}", | 3511 | // "[SCENE OBJECT GROUP]: Updating single position and rotation of {0} {1} to {2}", |
3512 | // part.Name, part.LocalId, rot); | 3512 | // part.Name, part.LocalId, rot); |
3513 | 3513 | ||
3514 | part.StoreUndoState(); | 3514 | // part.StoreUndoState(); |
3515 | part.IgnoreUndoUpdate = true; | 3515 | // part.IgnoreUndoUpdate = true; |
3516 | 3516 | ||
3517 | if (m_rootPart.PhysActor != null) | 3517 | if (m_rootPart.PhysActor != null) |
3518 | m_rootPart.PhysActor.Building = true; | 3518 | m_rootPart.PhysActor.Building = true; |
@@ -3541,7 +3541,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3541 | if (m_rootPart.PhysActor != null) | 3541 | if (m_rootPart.PhysActor != null) |
3542 | m_rootPart.PhysActor.Building = false; | 3542 | m_rootPart.PhysActor.Building = false; |
3543 | 3543 | ||
3544 | part.IgnoreUndoUpdate = false; | 3544 | // part.IgnoreUndoUpdate = false; |
3545 | } | 3545 | } |
3546 | } | 3546 | } |
3547 | 3547 | ||
@@ -3557,7 +3557,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3557 | 3557 | ||
3558 | Quaternion axRot = rot; | 3558 | Quaternion axRot = rot; |
3559 | Quaternion oldParentRot = m_rootPart.RotationOffset; | 3559 | Quaternion oldParentRot = m_rootPart.RotationOffset; |
3560 | m_rootPart.StoreUndoState(); | 3560 | // m_rootPart.StoreUndoState(); |
3561 | 3561 | ||
3562 | //Don't use UpdateRotation because it schedules an update prematurely | 3562 | //Don't use UpdateRotation because it schedules an update prematurely |
3563 | m_rootPart.RotationOffset = rot; | 3563 | m_rootPart.RotationOffset = rot; |
@@ -3573,7 +3573,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3573 | SceneObjectPart prim = parts[i]; | 3573 | SceneObjectPart prim = parts[i]; |
3574 | if (prim.UUID != m_rootPart.UUID) | 3574 | if (prim.UUID != m_rootPart.UUID) |
3575 | { | 3575 | { |
3576 | prim.IgnoreUndoUpdate = true; | 3576 | // prim.IgnoreUndoUpdate = true; |
3577 | 3577 | ||
3578 | Quaternion NewRot = oldParentRot * prim.RotationOffset; | 3578 | Quaternion NewRot = oldParentRot * prim.RotationOffset; |
3579 | NewRot = Quaternion.Inverse(axRot) * NewRot; | 3579 | NewRot = Quaternion.Inverse(axRot) * NewRot; |
@@ -3585,7 +3585,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3585 | axPos *= Quaternion.Inverse(axRot); | 3585 | axPos *= Quaternion.Inverse(axRot); |
3586 | prim.OffsetPosition = axPos; | 3586 | prim.OffsetPosition = axPos; |
3587 | 3587 | ||
3588 | prim.IgnoreUndoUpdate = false; | 3588 | // prim.IgnoreUndoUpdate = false; |
3589 | } | 3589 | } |
3590 | } | 3590 | } |
3591 | 3591 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index cce606a..6622495 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -828,7 +828,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
828 | 828 | ||
829 | set | 829 | set |
830 | { | 830 | { |
831 | StoreUndoState(); | 831 | // StoreUndoState(); |
832 | m_rotationOffset = value; | 832 | m_rotationOffset = value; |
833 | 833 | ||
834 | PhysicsActor actor = PhysActor; | 834 | PhysicsActor actor = PhysActor; |
@@ -1007,7 +1007,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1007 | { | 1007 | { |
1008 | if (m_shape != null) | 1008 | if (m_shape != null) |
1009 | { | 1009 | { |
1010 | StoreUndoState(); | 1010 | // StoreUndoState(); |
1011 | 1011 | ||
1012 | m_shape.Scale = value; | 1012 | m_shape.Scale = value; |
1013 | 1013 | ||
diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs index 029c828..38474de 100644 --- a/OpenSim/Region/Framework/Scenes/UndoState.cs +++ b/OpenSim/Region/Framework/Scenes/UndoState.cs | |||
@@ -74,14 +74,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
74 | ForGroup = forGroup; | 74 | ForGroup = forGroup; |
75 | Position = part.ParentGroup.AbsolutePosition; | 75 | Position = part.ParentGroup.AbsolutePosition; |
76 | Rotation = part.RotationOffset; | 76 | Rotation = part.RotationOffset; |
77 | if (!forGroup) | 77 | Scale = part.Shape.Scale; |
78 | Scale = part.Shape.Scale; | ||
79 | else | ||
80 | Scale = Vector3.Zero; // until we fix it | ||
81 | } | 78 | } |
82 | else | 79 | else |
83 | { | 80 | { |
84 | ForGroup = false; // previus code implies only root parts can undo grp | 81 | ForGroup = false; // only root parts can undo grp |
85 | Position = part.OffsetPosition; | 82 | Position = part.OffsetPosition; |
86 | Rotation = part.RotationOffset; | 83 | Rotation = part.RotationOffset; |
87 | Scale = part.Shape.Scale; | 84 | Scale = part.Shape.Scale; |
@@ -108,9 +105,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
108 | return false; | 105 | return false; |
109 | if (Rotation != part.RotationOffset) | 106 | if (Rotation != part.RotationOffset) |
110 | return false; | 107 | return false; |
111 | if (ForGroup) | 108 | return Scale == part.Shape.Scale; |
112 | return true; // for now don't do grp scale | ||
113 | return (Scale == part.Shape.Scale); | ||
114 | } | 109 | } |
115 | else | 110 | else |
116 | { | 111 | { |
@@ -144,10 +139,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
144 | 139 | ||
145 | if (Scale != Vector3.Zero) | 140 | if (Scale != Vector3.Zero) |
146 | { | 141 | { |
147 | // if (ForGroup) | 142 | if (ForGroup) |
148 | // part.ParentGroup.GroupResize(Scale); | 143 | part.ParentGroup.GroupResize(Scale); |
149 | // else | 144 | else |
150 | if (!ForGroup) // we don't have grp scale for now | ||
151 | part.Resize(Scale); | 145 | part.Resize(Scale); |
152 | } | 146 | } |
153 | part.ParentGroup.ScheduleGroupForTerseUpdate(); | 147 | part.ParentGroup.ScheduleGroupForTerseUpdate(); |