aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/Linden
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack/Linden')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs221
1 files changed, 154 insertions, 67 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index f835e56..c7fc827 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -11518,183 +11518,269 @@ 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);
11580 11613
11581 handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; 11614 handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
11615
11582 if (handlerUpdatePrimSinglePosition != null) 11616 if (handlerUpdatePrimSinglePosition != null)
11583 { 11617 {
11584 handlerUpdatePrimSinglePosition(localId, pos11, this); 11618 handlerUpdatePrimSinglePosition(localId, apos, this);
11585 } 11619 }
11620 part.IgnoreUndoUpdate = false;
11586 } 11621 }
11587 break; 11622 break;
11588 11623
11589 case 9: 11624 case 0x15: //uniform scale and position
11590 Vector3 pos2 = new Vector3(block.Data, 0); 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);
11637 handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
11638 if (handlerUpdatePrimSinglePosition != null)
11639 {
11640 handlerUpdatePrimSinglePosition(localId, apos, this);
11641 }
11642
11643 part.IgnoreUndoUpdate = false;
11644 }
11645 break;
11646
11647// now group related (bit 4)
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 Vector3 scale5 = 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, scale5, this);
11689 handlerUpdatePrimScale(localId, scale6, this); 11774 handlerUpdateVector = OnUpdatePrimGroupPosition;
11690 handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition; 11775
11691 if (handlerUpdatePrimSinglePosition != null) 11776 if (handlerUpdateVector != null)
11692 { 11777 {
11693 handlerUpdatePrimSinglePosition(localId, pos6, this); 11778 handlerUpdateVector(localId, apos, this);
11694 } 11779 }
11695 11780
11696 part.IgnoreUndoUpdate = false; 11781 part.IgnoreUndoUpdate = false;
11697 } 11782 }
11783
11698 break; 11784 break;
11699 11785
11700 default: 11786 default:
@@ -11704,6 +11790,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11704 11790
11705// for (int j = 0; j < parts.Length; j++) 11791// for (int j = 0; j < parts.Length; j++)
11706// parts[j].IgnoreUndoUpdate = false; 11792// parts[j].IgnoreUndoUpdate = false;
11793
11707 } 11794 }
11708 } 11795 }
11709 } 11796 }