aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Framework/Scenes/EventManager.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs19
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs96
3 files changed, 54 insertions, 63 deletions
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 8683599..6ff3049 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -1881,7 +1881,7 @@ namespace OpenSim.Region.Framework.Scenes
1881 catch (Exception e) 1881 catch (Exception e)
1882 { 1882 {
1883 m_log.ErrorFormat( 1883 m_log.ErrorFormat(
1884 "[EVENT MANAGER]: Delegate for TriggerOnAttach failed - continuing. {0} {1}", 1884 "[EVENT MANAGER]: Delegate for TriggerGroupMove failed - continuing. {0} {1}",
1885 e.Message, e.StackTrace); 1885 e.Message, e.StackTrace);
1886 } 1886 }
1887 } 1887 }
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index 4d491d1..d27af09 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -340,13 +340,11 @@ namespace OpenSim.Region.Framework.Scenes
340 obj.ObjectGrabHandler(localID, offsetPos, remoteClient); 340 obj.ObjectGrabHandler(localID, offsetPos, remoteClient);
341 341
342 // If the touched prim handles touches, deliver it 342 // If the touched prim handles touches, deliver it
343 // If not, deliver to root prim
344 if ((part.ScriptEvents & scriptEvents.touch_start) != 0) 343 if ((part.ScriptEvents & scriptEvents.touch_start) != 0)
345 EventManager.TriggerObjectGrab(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg); 344 EventManager.TriggerObjectGrab(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg);
346 345
347 // Deliver to the root prim if the touched prim doesn't handle touches 346 // Deliver to the root prim if the touched prim doesn't handle touches
348 // or if we're meant to pass on touches anyway. Don't send to root prim 347 // or if we're meant to pass on touches anyway.
349 // if prim touched is the root prim as we just did it
350 if (((part.ScriptEvents & scriptEvents.touch_start) == 0) || 348 if (((part.ScriptEvents & scriptEvents.touch_start) == 0) ||
351 (part.PassTouches && (part.LocalId != obj.RootPart.LocalId))) 349 (part.PassTouches && (part.LocalId != obj.RootPart.LocalId)))
352 { 350 {
@@ -381,12 +379,10 @@ namespace OpenSim.Region.Framework.Scenes
381 surfaceArg = surfaceArgs[0]; 379 surfaceArg = surfaceArgs[0];
382 380
383 // If the touched prim handles touches, deliver it 381 // If the touched prim handles touches, deliver it
384 // If not, deliver to root prim
385 if ((part.ScriptEvents & scriptEvents.touch) != 0) 382 if ((part.ScriptEvents & scriptEvents.touch) != 0)
386 EventManager.TriggerObjectGrabbing(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg); 383 EventManager.TriggerObjectGrabbing(part.LocalId, 0, part.OffsetPosition, remoteClient, surfaceArg);
387 // Deliver to the root prim if the touched prim doesn't handle touches 384 // Deliver to the root prim if the touched prim doesn't handle touches
388 // or if we're meant to pass on touches anyway. Don't send to root prim 385 // or if we're meant to pass on touches anyway.
389 // if prim touched is the root prim as we just did it
390 if (((part.ScriptEvents & scriptEvents.touch) == 0) || 386 if (((part.ScriptEvents & scriptEvents.touch) == 0) ||
391 (part.PassTouches && (part.LocalId != group.RootPart.LocalId))) 387 (part.PassTouches && (part.LocalId != group.RootPart.LocalId)))
392 { 388 {
@@ -400,18 +396,21 @@ namespace OpenSim.Region.Framework.Scenes
400 if (part == null) 396 if (part == null)
401 return; 397 return;
402 398
403 SceneObjectGroup obj = part.ParentGroup; 399 SceneObjectGroup grp = part.ParentGroup;
404 400
405 SurfaceTouchEventArgs surfaceArg = null; 401 SurfaceTouchEventArgs surfaceArg = null;
406 if (surfaceArgs != null && surfaceArgs.Count > 0) 402 if (surfaceArgs != null && surfaceArgs.Count > 0)
407 surfaceArg = surfaceArgs[0]; 403 surfaceArg = surfaceArgs[0];
408 404
409 // If the touched prim handles touches, deliver it 405 // If the touched prim handles touches, deliver it
410 // If not, deliver to root prim
411 if ((part.ScriptEvents & scriptEvents.touch_end) != 0) 406 if ((part.ScriptEvents & scriptEvents.touch_end) != 0)
412 EventManager.TriggerObjectDeGrab(part.LocalId, 0, remoteClient, surfaceArg); 407 EventManager.TriggerObjectDeGrab(part.LocalId, 0, remoteClient, surfaceArg);
413 else 408 // if not or PassTouchs, send it also to root.
414 EventManager.TriggerObjectDeGrab(obj.RootPart.LocalId, part.LocalId, remoteClient, surfaceArg); 409 if (((part.ScriptEvents & scriptEvents.touch_end) == 0) ||
410 (part.PassTouches && (part.LocalId != grp.RootPart.LocalId)))
411 {
412 EventManager.TriggerObjectDeGrab(grp.RootPart.LocalId, part.LocalId, remoteClient, surfaceArg);
413 }
415 } 414 }
416 415
417 public void ProcessScriptReset(IClientAPI remoteClient, UUID objectID, 416 public void ProcessScriptReset(IClientAPI remoteClient, UUID objectID,
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index b7c5b6b..00951d6 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -79,7 +79,8 @@ namespace OpenSim.Region.Framework.Scenes
79 touch_end = 536870912, 79 touch_end = 536870912,
80 touch_start = 2097152, 80 touch_start = 2097152,
81 transaction_result = 33554432, 81 transaction_result = 33554432,
82 object_rez = 4194304 82 object_rez = 4194304,
83 anytouch = touch | touch_end | touch_start
83 } 84 }
84 85
85 public struct scriptPosTarget 86 public struct scriptPosTarget
@@ -3497,34 +3498,26 @@ namespace OpenSim.Region.Framework.Scenes
3497 { 3498 {
3498 if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) 3499 if (m_scene.EventManager.TriggerGroupMove(UUID, pos))
3499 { 3500 {
3501 if (BlockGrabOverride)
3502 return;
3503
3500 SceneObjectPart part = GetPart(partID); 3504 SceneObjectPart part = GetPart(partID);
3501 3505
3502 if (part == null) 3506 if (part == null)
3503 return; 3507 return;
3504 3508
3509 if (part.BlockGrab)
3510 return;
3511
3505 PhysicsActor pa = m_rootPart.PhysActor; 3512 PhysicsActor pa = m_rootPart.PhysActor;
3506 3513
3507 if (pa != null) 3514 if (pa != null && pa.IsPhysical)
3508 { 3515 {
3509 if (pa.IsPhysical) 3516 // empirically convert distance diference to a impulse
3510 { 3517 Vector3 grabforce = pos - AbsolutePosition;
3511 if (!BlockGrabOverride && !part.BlockGrab) 3518 grabforce = grabforce * (pa.Mass * 0.1f);
3512 { 3519 pa.AddForce(grabforce, false);
3513/* Vector3 llmoveforce = pos - AbsolutePosition; 3520 m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
3514 Vector3 grabforce = llmoveforce;
3515 grabforce = (grabforce / 10) * pa.Mass;
3516 */
3517 // empirically convert distance diference to a impulse
3518 Vector3 grabforce = pos - AbsolutePosition;
3519 grabforce = grabforce * (pa.Mass/ 10.0f);
3520 pa.AddForce(grabforce, false);
3521 m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
3522 }
3523 }
3524 else
3525 {
3526 NonPhysicalGrabMovement(pos);
3527 }
3528 } 3521 }
3529 else 3522 else
3530 { 3523 {
@@ -3553,6 +3546,8 @@ namespace OpenSim.Region.Framework.Scenes
3553 /// <param name="remoteClient"></param> 3546 /// <param name="remoteClient"></param>
3554 public void SpinStart(IClientAPI remoteClient) 3547 public void SpinStart(IClientAPI remoteClient)
3555 { 3548 {
3549 if (BlockGrabOverride || m_rootPart.BlockGrab)
3550 return;
3556 if (m_scene.EventManager.TriggerGroupSpinStart(UUID)) 3551 if (m_scene.EventManager.TriggerGroupSpinStart(UUID))
3557 { 3552 {
3558 PhysicsActor pa = m_rootPart.PhysActor; 3553 PhysicsActor pa = m_rootPart.PhysActor;
@@ -3600,46 +3595,43 @@ namespace OpenSim.Region.Framework.Scenes
3600 // but it will result in over-shoot or under-shoot of the target orientation. 3595 // but it will result in over-shoot or under-shoot of the target orientation.
3601 // For the end user, this means that ctrl+shift+drag can be used for relative, 3596 // For the end user, this means that ctrl+shift+drag can be used for relative,
3602 // but not absolute, adjustments of orientation for physical prims. 3597 // but not absolute, adjustments of orientation for physical prims.
3598
3599 if (BlockGrabOverride || m_rootPart.BlockGrab)
3600 return;
3601
3603 if (m_scene.EventManager.TriggerGroupSpin(UUID, newOrientation)) 3602 if (m_scene.EventManager.TriggerGroupSpin(UUID, newOrientation))
3604 { 3603 {
3605 PhysicsActor pa = m_rootPart.PhysActor; 3604 PhysicsActor pa = m_rootPart.PhysActor;
3606 3605
3607 if (pa != null) 3606 if (pa != null && pa.IsPhysical)
3608 { 3607 {
3609 if (pa.IsPhysical) 3608 if (m_rootPart.IsWaitingForFirstSpinUpdatePacket)
3610 { 3609 {
3611 if (m_rootPart.IsWaitingForFirstSpinUpdatePacket) 3610 // first time initialization of "old" orientation for calculation of delta rotations
3612 { 3611 m_rootPart.SpinOldOrientation = newOrientation;
3613 // first time initialization of "old" orientation for calculation of delta rotations 3612 m_rootPart.IsWaitingForFirstSpinUpdatePacket = false;
3614 m_rootPart.SpinOldOrientation = newOrientation;
3615 m_rootPart.IsWaitingForFirstSpinUpdatePacket = false;
3616 }
3617 else
3618 {
3619 // save and update old orientation
3620 Quaternion old = m_rootPart.SpinOldOrientation;
3621 m_rootPart.SpinOldOrientation = newOrientation;
3622 //m_log.Error("[SCENE OBJECT GROUP]: Old orientation is " + old);
3623 //m_log.Error("[SCENE OBJECT GROUP]: Incoming new orientation is " + newOrientation);
3624
3625 // compute difference between previous old rotation and new incoming rotation
3626 Quaternion minimalRotationFromQ1ToQ2 = Quaternion.Inverse(old) * newOrientation;
3627
3628 float rotationAngle;
3629 Vector3 rotationAxis;
3630 minimalRotationFromQ1ToQ2.GetAxisAngle(out rotationAxis, out rotationAngle);
3631 rotationAxis.Normalize();
3632
3633 //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis);
3634 Vector3 spinforce = new Vector3(rotationAxis.X, rotationAxis.Y, rotationAxis.Z);
3635 spinforce = (spinforce/8) * pa.Mass; // 8 is an arbitrary torque scaling factor
3636 pa.AddAngularForce(spinforce,true);
3637 m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
3638 }
3639 } 3613 }
3640 else 3614 else
3641 { 3615 {
3642 NonPhysicalSpinMovement(newOrientation); 3616 // save and update old orientation
3617 Quaternion old = m_rootPart.SpinOldOrientation;
3618 m_rootPart.SpinOldOrientation = newOrientation;
3619 //m_log.Error("[SCENE OBJECT GROUP]: Old orientation is " + old);
3620 //m_log.Error("[SCENE OBJECT GROUP]: Incoming new orientation is " + newOrientation);
3621
3622 // compute difference between previous old rotation and new incoming rotation
3623 Quaternion minimalRotationFromQ1ToQ2 = Quaternion.Inverse(old) * newOrientation;
3624
3625 float rotationAngle;
3626 Vector3 rotationAxis;
3627 minimalRotationFromQ1ToQ2.GetAxisAngle(out rotationAxis, out rotationAngle);
3628 rotationAxis.Normalize();
3629
3630 //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis);
3631 Vector3 spinforce = new Vector3(rotationAxis.X, rotationAxis.Y, rotationAxis.Z);
3632 spinforce = (spinforce/8) * pa.Mass; // 8 is an arbitrary torque scaling factor
3633 pa.AddAngularForce(spinforce,true);
3634 m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
3643 } 3635 }
3644 } 3636 }
3645 else 3637 else