diff options
author | Justin Clark-Casey (justincc) | 2012-04-03 05:50:13 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-04-03 05:51:38 +0100 |
commit | 746829967315cc82560a855a4772e45888bf8fbe (patch) | |
tree | 1e21d5c27101cb505a4ac4bcdf6e356f2e409d52 /OpenSim | |
parent | Implement bulk inventory update over CAPS (not recursive by design, (diff) | |
download | opensim-SC-746829967315cc82560a855a4772e45888bf8fbe.zip opensim-SC-746829967315cc82560a855a4772e45888bf8fbe.tar.gz opensim-SC-746829967315cc82560a855a4772e45888bf8fbe.tar.bz2 opensim-SC-746829967315cc82560a855a4772e45888bf8fbe.tar.xz |
Eliminate race condition where many callers would check SOP.PhysicsActor != null then assume it was still not null in later code.
Another thread could come and turn off physics for a part (null PhysicsActor) at any point.
Had to turn off localCopy on warp3D CoreModules section in prebuild.xml since on current nant this copies all DLLs in bin/ which can be a very large number with compiled DLLs
No obvious reason for doing that copy - nothing else does it.
Diffstat (limited to '')
5 files changed, 208 insertions, 154 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 427a49d..86e10d4 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -36,6 +36,7 @@ using OpenSim.Framework.Capabilities; | |||
36 | using OpenSim.Framework.Client; | 36 | using OpenSim.Framework.Client; |
37 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
38 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
39 | using OpenSim.Region.Physics.Manager; | ||
39 | using OpenSim.Services.Interfaces; | 40 | using OpenSim.Services.Interfaces; |
40 | 41 | ||
41 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; | 42 | using GridRegion = OpenSim.Services.Interfaces.GridRegion; |
@@ -1803,10 +1804,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
1803 | { | 1804 | { |
1804 | if (!grp.IsDeleted) | 1805 | if (!grp.IsDeleted) |
1805 | { | 1806 | { |
1806 | if (grp.RootPart.PhysActor != null) | 1807 | PhysicsActor pa = grp.RootPart.PhysActor; |
1807 | { | 1808 | if (pa != null) |
1808 | grp.RootPart.PhysActor.CrossingFailure(); | 1809 | pa.CrossingFailure(); |
1809 | } | ||
1810 | } | 1810 | } |
1811 | 1811 | ||
1812 | m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: Prim crossing failed for {0}", grp); | 1812 | m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: Prim crossing failed for {0}", grp); |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 06f7c0f..29825a2 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -642,10 +642,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
642 | 642 | ||
643 | #endregion Region Settings | 643 | #endregion Region Settings |
644 | 644 | ||
645 | MainConsole.Instance.Commands.AddCommand("Estates", false, "reload estate", | ||
646 | "reload estate", | ||
647 | "Reload the estate data", HandleReloadEstate); | ||
648 | |||
649 | //Bind Storage Manager functions to some land manager functions for this scene | 645 | //Bind Storage Manager functions to some land manager functions for this scene |
650 | EventManager.OnLandObjectAdded += | 646 | EventManager.OnLandObjectAdded += |
651 | new EventManager.LandObjectAdded(simDataService.StoreLandObject); | 647 | new EventManager.LandObjectAdded(simDataService.StoreLandObject); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 8a05772..0098add 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -306,7 +306,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
306 | if (rot != null) | 306 | if (rot != null) |
307 | sceneObject.UpdateGroupRotationR((Quaternion)rot); | 307 | sceneObject.UpdateGroupRotationR((Quaternion)rot); |
308 | 308 | ||
309 | if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero) | 309 | PhysicsActor pa = sceneObject.RootPart.PhysActor; |
310 | if (pa != null && pa.IsPhysical && vel != Vector3.Zero) | ||
310 | { | 311 | { |
311 | sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false); | 312 | sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false); |
312 | sceneObject.Velocity = vel; | 313 | sceneObject.Velocity = vel; |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 04b3766..87fdc41 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -523,16 +523,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
523 | { | 523 | { |
524 | m_isSelected = value; | 524 | m_isSelected = value; |
525 | // Tell physics engine that group is selected | 525 | // Tell physics engine that group is selected |
526 | if (m_rootPart.PhysActor != null) | 526 | |
527 | PhysicsActor pa = m_rootPart.PhysActor; | ||
528 | if (pa != null) | ||
527 | { | 529 | { |
528 | m_rootPart.PhysActor.Selected = value; | 530 | pa.Selected = value; |
531 | |||
529 | // Pass it on to the children. | 532 | // Pass it on to the children. |
530 | SceneObjectPart[] parts = m_parts.GetArray(); | 533 | SceneObjectPart[] parts = m_parts.GetArray(); |
531 | for (int i = 0; i < parts.Length; i++) | 534 | for (int i = 0; i < parts.Length; i++) |
532 | { | 535 | { |
533 | SceneObjectPart child = parts[i]; | 536 | SceneObjectPart child = parts[i]; |
534 | if (child.PhysActor != null) | 537 | |
535 | child.PhysActor.Selected = value; | 538 | PhysicsActor childPa = child.PhysActor; |
539 | if (childPa != null) | ||
540 | childPa.Selected = value; | ||
536 | } | 541 | } |
537 | } | 542 | } |
538 | } | 543 | } |
@@ -1478,7 +1483,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1478 | } | 1483 | } |
1479 | 1484 | ||
1480 | // Need to duplicate the physics actor as well | 1485 | // Need to duplicate the physics actor as well |
1481 | if (part.PhysActor != null && userExposed) | 1486 | PhysicsActor originalPartPa = part.PhysActor; |
1487 | if (originalPartPa != null && userExposed) | ||
1482 | { | 1488 | { |
1483 | PrimitiveBaseShape pbs = newPart.Shape; | 1489 | PrimitiveBaseShape pbs = newPart.Shape; |
1484 | 1490 | ||
@@ -1489,10 +1495,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1489 | newPart.AbsolutePosition, | 1495 | newPart.AbsolutePosition, |
1490 | newPart.Scale, | 1496 | newPart.Scale, |
1491 | newPart.RotationOffset, | 1497 | newPart.RotationOffset, |
1492 | part.PhysActor.IsPhysical, | 1498 | originalPartPa.IsPhysical, |
1493 | newPart.LocalId); | 1499 | newPart.LocalId); |
1494 | 1500 | ||
1495 | newPart.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true); | 1501 | newPart.DoPhysicsPropertyUpdate(originalPartPa.IsPhysical, true); |
1496 | } | 1502 | } |
1497 | } | 1503 | } |
1498 | 1504 | ||
@@ -1564,45 +1570,53 @@ namespace OpenSim.Region.Framework.Scenes | |||
1564 | } | 1570 | } |
1565 | else | 1571 | else |
1566 | { | 1572 | { |
1567 | if (RootPart.PhysActor != null) | 1573 | PhysicsActor pa = RootPart.PhysActor; |
1574 | |||
1575 | if (pa != null) | ||
1568 | { | 1576 | { |
1569 | RootPart.PhysActor.AddForce(impulse, true); | 1577 | pa.AddForce(impulse, true); |
1570 | m_scene.PhysicsScene.AddPhysicsActorTaint(RootPart.PhysActor); | 1578 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
1571 | } | 1579 | } |
1572 | } | 1580 | } |
1573 | } | 1581 | } |
1574 | 1582 | ||
1575 | public void applyAngularImpulse(Vector3 impulse) | 1583 | public void applyAngularImpulse(Vector3 impulse) |
1576 | { | 1584 | { |
1577 | if (RootPart.PhysActor != null) | 1585 | PhysicsActor pa = RootPart.PhysActor; |
1586 | |||
1587 | if (pa != null) | ||
1578 | { | 1588 | { |
1579 | if (!IsAttachment) | 1589 | if (!IsAttachment) |
1580 | { | 1590 | { |
1581 | RootPart.PhysActor.AddAngularForce(impulse, true); | 1591 | pa.AddAngularForce(impulse, true); |
1582 | m_scene.PhysicsScene.AddPhysicsActorTaint(RootPart.PhysActor); | 1592 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
1583 | } | 1593 | } |
1584 | } | 1594 | } |
1585 | } | 1595 | } |
1586 | 1596 | ||
1587 | public void setAngularImpulse(Vector3 impulse) | 1597 | public void setAngularImpulse(Vector3 impulse) |
1588 | { | 1598 | { |
1589 | if (RootPart.PhysActor != null) | 1599 | PhysicsActor pa = RootPart.PhysActor; |
1600 | |||
1601 | if (pa != null) | ||
1590 | { | 1602 | { |
1591 | if (!IsAttachment) | 1603 | if (!IsAttachment) |
1592 | { | 1604 | { |
1593 | RootPart.PhysActor.Torque = impulse; | 1605 | pa.Torque = impulse; |
1594 | m_scene.PhysicsScene.AddPhysicsActorTaint(RootPart.PhysActor); | 1606 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
1595 | } | 1607 | } |
1596 | } | 1608 | } |
1597 | } | 1609 | } |
1598 | 1610 | ||
1599 | public Vector3 GetTorque() | 1611 | public Vector3 GetTorque() |
1600 | { | 1612 | { |
1601 | if (RootPart.PhysActor != null) | 1613 | PhysicsActor pa = RootPart.PhysActor; |
1614 | |||
1615 | if (pa != null) | ||
1602 | { | 1616 | { |
1603 | if (!IsAttachment) | 1617 | if (!IsAttachment) |
1604 | { | 1618 | { |
1605 | Vector3 torque = RootPart.PhysActor.Torque; | 1619 | Vector3 torque = pa.Torque; |
1606 | return torque; | 1620 | return torque; |
1607 | } | 1621 | } |
1608 | } | 1622 | } |
@@ -1622,19 +1636,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
1622 | } | 1636 | } |
1623 | else | 1637 | else |
1624 | { | 1638 | { |
1625 | if (RootPart.PhysActor != null) | 1639 | PhysicsActor pa = RootPart.PhysActor; |
1640 | |||
1641 | if (pa != null) | ||
1626 | { | 1642 | { |
1627 | RootPart.PhysActor.PIDTarget = target; | 1643 | pa.PIDTarget = target; |
1628 | RootPart.PhysActor.PIDTau = tau; | 1644 | pa.PIDTau = tau; |
1629 | RootPart.PhysActor.PIDActive = true; | 1645 | pa.PIDActive = true; |
1630 | } | 1646 | } |
1631 | } | 1647 | } |
1632 | } | 1648 | } |
1633 | 1649 | ||
1634 | public void stopMoveToTarget() | 1650 | public void stopMoveToTarget() |
1635 | { | 1651 | { |
1636 | if (RootPart.PhysActor != null) | 1652 | PhysicsActor pa = RootPart.PhysActor; |
1637 | RootPart.PhysActor.PIDActive = false; | 1653 | |
1654 | if (pa != null) | ||
1655 | pa.PIDActive = false; | ||
1638 | } | 1656 | } |
1639 | 1657 | ||
1640 | /// <summary> | 1658 | /// <summary> |
@@ -1645,18 +1663,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
1645 | /// <param name="tau">Number of seconds over which to reach target</param> | 1663 | /// <param name="tau">Number of seconds over which to reach target</param> |
1646 | public void SetHoverHeight(float height, PIDHoverType hoverType, float tau) | 1664 | public void SetHoverHeight(float height, PIDHoverType hoverType, float tau) |
1647 | { | 1665 | { |
1648 | if (RootPart.PhysActor != null) | 1666 | PhysicsActor pa = RootPart.PhysActor; |
1667 | |||
1668 | if (pa != null) | ||
1649 | { | 1669 | { |
1650 | if (height != 0f) | 1670 | if (height != 0f) |
1651 | { | 1671 | { |
1652 | RootPart.PhysActor.PIDHoverHeight = height; | 1672 | pa.PIDHoverHeight = height; |
1653 | RootPart.PhysActor.PIDHoverType = hoverType; | 1673 | pa.PIDHoverType = hoverType; |
1654 | RootPart.PhysActor.PIDTau = tau; | 1674 | pa.PIDTau = tau; |
1655 | RootPart.PhysActor.PIDHoverActive = true; | 1675 | pa.PIDHoverActive = true; |
1656 | } | 1676 | } |
1657 | else | 1677 | else |
1658 | { | 1678 | { |
1659 | RootPart.PhysActor.PIDHoverActive = false; | 1679 | pa.PIDHoverActive = false; |
1660 | } | 1680 | } |
1661 | } | 1681 | } |
1662 | } | 1682 | } |
@@ -2094,10 +2114,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2094 | linkPart.ParentID = 0; | 2114 | linkPart.ParentID = 0; |
2095 | linkPart.LinkNum = 0; | 2115 | linkPart.LinkNum = 0; |
2096 | 2116 | ||
2097 | if (linkPart.PhysActor != null) | 2117 | PhysicsActor linkPartPa = linkPart.PhysActor; |
2098 | { | 2118 | |
2099 | m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor); | 2119 | if (linkPartPa != null) |
2100 | } | 2120 | m_scene.PhysicsScene.RemovePrim(linkPartPa); |
2101 | 2121 | ||
2102 | // We need to reset the child part's position | 2122 | // We need to reset the child part's position |
2103 | // ready for life as a separate object after being a part of another object | 2123 | // ready for life as a separate object after being a part of another object |
@@ -2188,17 +2208,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
2188 | { | 2208 | { |
2189 | if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) | 2209 | if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) |
2190 | { | 2210 | { |
2191 | if (m_rootPart.PhysActor != null) | 2211 | PhysicsActor pa = m_rootPart.PhysActor; |
2212 | |||
2213 | if (pa != null) | ||
2192 | { | 2214 | { |
2193 | if (m_rootPart.PhysActor.IsPhysical) | 2215 | if (pa.IsPhysical) |
2194 | { | 2216 | { |
2195 | if (!m_rootPart.BlockGrab) | 2217 | if (!m_rootPart.BlockGrab) |
2196 | { | 2218 | { |
2197 | Vector3 llmoveforce = pos - AbsolutePosition; | 2219 | Vector3 llmoveforce = pos - AbsolutePosition; |
2198 | Vector3 grabforce = llmoveforce; | 2220 | Vector3 grabforce = llmoveforce; |
2199 | grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; | 2221 | grabforce = (grabforce / 10) * pa.Mass; |
2200 | m_rootPart.PhysActor.AddForce(grabforce, true); | 2222 | pa.AddForce(grabforce, true); |
2201 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); | 2223 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2202 | } | 2224 | } |
2203 | } | 2225 | } |
2204 | else | 2226 | else |
@@ -2228,9 +2250,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2228 | { | 2250 | { |
2229 | if (m_scene.EventManager.TriggerGroupSpinStart(UUID)) | 2251 | if (m_scene.EventManager.TriggerGroupSpinStart(UUID)) |
2230 | { | 2252 | { |
2231 | if (m_rootPart.PhysActor != null) | 2253 | PhysicsActor pa = m_rootPart.PhysActor; |
2254 | |||
2255 | if (pa != null) | ||
2232 | { | 2256 | { |
2233 | if (m_rootPart.PhysActor.IsPhysical) | 2257 | if (pa.IsPhysical) |
2234 | { | 2258 | { |
2235 | m_rootPart.IsWaitingForFirstSpinUpdatePacket = true; | 2259 | m_rootPart.IsWaitingForFirstSpinUpdatePacket = true; |
2236 | } | 2260 | } |
@@ -2271,12 +2295,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2271 | // but it will result in over-shoot or under-shoot of the target orientation. | 2295 | // but it will result in over-shoot or under-shoot of the target orientation. |
2272 | // For the end user, this means that ctrl+shift+drag can be used for relative, | 2296 | // For the end user, this means that ctrl+shift+drag can be used for relative, |
2273 | // but not absolute, adjustments of orientation for physical prims. | 2297 | // but not absolute, adjustments of orientation for physical prims. |
2274 | |||
2275 | if (m_scene.EventManager.TriggerGroupSpin(UUID, newOrientation)) | 2298 | if (m_scene.EventManager.TriggerGroupSpin(UUID, newOrientation)) |
2276 | { | 2299 | { |
2277 | if (m_rootPart.PhysActor != null) | 2300 | PhysicsActor pa = m_rootPart.PhysActor; |
2301 | |||
2302 | if (pa != null) | ||
2278 | { | 2303 | { |
2279 | if (m_rootPart.PhysActor.IsPhysical) | 2304 | if (pa.IsPhysical) |
2280 | { | 2305 | { |
2281 | if (m_rootPart.IsWaitingForFirstSpinUpdatePacket) | 2306 | if (m_rootPart.IsWaitingForFirstSpinUpdatePacket) |
2282 | { | 2307 | { |
@@ -2302,9 +2327,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2302 | 2327 | ||
2303 | //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis); | 2328 | //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis); |
2304 | Vector3 spinforce = new Vector3(rotationAxis.X, rotationAxis.Y, rotationAxis.Z); | 2329 | Vector3 spinforce = new Vector3(rotationAxis.X, rotationAxis.Y, rotationAxis.Z); |
2305 | spinforce = (spinforce/8) * m_rootPart.PhysActor.Mass; // 8 is an arbitrary torque scaling factor | 2330 | spinforce = (spinforce/8) * pa.Mass; // 8 is an arbitrary torque scaling factor |
2306 | m_rootPart.PhysActor.AddAngularForce(spinforce,true); | 2331 | pa.AddAngularForce(spinforce,true); |
2307 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); | 2332 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2308 | } | 2333 | } |
2309 | } | 2334 | } |
2310 | else | 2335 | else |
@@ -2478,8 +2503,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2478 | { | 2503 | { |
2479 | part.UpdateShape(shapeBlock); | 2504 | part.UpdateShape(shapeBlock); |
2480 | 2505 | ||
2481 | if (part.PhysActor != null) | 2506 | PhysicsActor pa = m_rootPart.PhysActor; |
2482 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); | 2507 | |
2508 | if (pa != null) | ||
2509 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); | ||
2483 | } | 2510 | } |
2484 | } | 2511 | } |
2485 | 2512 | ||
@@ -2502,7 +2529,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2502 | scale.Y = Math.Min(scale.Y, Scene.m_maxNonphys); | 2529 | scale.Y = Math.Min(scale.Y, Scene.m_maxNonphys); |
2503 | scale.Z = Math.Min(scale.Z, Scene.m_maxNonphys); | 2530 | scale.Z = Math.Min(scale.Z, Scene.m_maxNonphys); |
2504 | 2531 | ||
2505 | if (RootPart.PhysActor != null && RootPart.PhysActor.IsPhysical) | 2532 | PhysicsActor pa = m_rootPart.PhysActor; |
2533 | |||
2534 | if (pa != null && pa.IsPhysical) | ||
2506 | { | 2535 | { |
2507 | scale.X = Math.Min(scale.X, Scene.m_maxPhys); | 2536 | scale.X = Math.Min(scale.X, Scene.m_maxPhys); |
2508 | scale.Y = Math.Min(scale.Y, Scene.m_maxPhys); | 2537 | scale.Y = Math.Min(scale.Y, Scene.m_maxPhys); |
@@ -2528,7 +2557,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2528 | float f = 1.0f; | 2557 | float f = 1.0f; |
2529 | float a = 1.0f; | 2558 | float a = 1.0f; |
2530 | 2559 | ||
2531 | if (RootPart.PhysActor != null && RootPart.PhysActor.IsPhysical) | 2560 | if (pa != null && pa.IsPhysical) |
2532 | { | 2561 | { |
2533 | if (oldSize.X * x > m_scene.m_maxPhys) | 2562 | if (oldSize.X * x > m_scene.m_maxPhys) |
2534 | { | 2563 | { |
@@ -2893,10 +2922,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2893 | 2922 | ||
2894 | m_rootPart.StoreUndoState(); | 2923 | m_rootPart.StoreUndoState(); |
2895 | m_rootPart.UpdateRotation(rot); | 2924 | m_rootPart.UpdateRotation(rot); |
2896 | if (m_rootPart.PhysActor != null) | 2925 | |
2926 | PhysicsActor pa = m_rootPart.PhysActor; | ||
2927 | |||
2928 | if (pa != null) | ||
2897 | { | 2929 | { |
2898 | m_rootPart.PhysActor.Orientation = m_rootPart.RotationOffset; | 2930 | pa.Orientation = m_rootPart.RotationOffset; |
2899 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); | 2931 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2900 | } | 2932 | } |
2901 | 2933 | ||
2902 | SceneObjectPart[] parts = m_parts.GetArray(); | 2934 | SceneObjectPart[] parts = m_parts.GetArray(); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 439b718..2b1fba0 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -151,6 +151,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
151 | public int[] PayPrice = {-2,-2,-2,-2,-2}; | 151 | public int[] PayPrice = {-2,-2,-2,-2,-2}; |
152 | 152 | ||
153 | [XmlIgnore] | 153 | [XmlIgnore] |
154 | /// <summary> | ||
155 | /// The representation of this part in the physics scene. | ||
156 | /// </summary> | ||
157 | /// <remarks> | ||
158 | /// If you use this property more than once in a section of code then you must take a reference and use that. | ||
159 | /// If another thread is simultaneously turning physics off on this part then this refernece could become | ||
160 | /// null at any time. | ||
161 | /// </remarks> | ||
154 | public PhysicsActor PhysActor | 162 | public PhysicsActor PhysActor |
155 | { | 163 | { |
156 | get { return m_physActor; } | 164 | get { return m_physActor; } |
@@ -522,10 +530,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
522 | set | 530 | set |
523 | { | 531 | { |
524 | m_name = value; | 532 | m_name = value; |
525 | if (PhysActor != null) | 533 | |
526 | { | 534 | PhysicsActor pa = PhysActor; |
527 | PhysActor.SOPName = value; | 535 | |
528 | } | 536 | if (pa != null) |
537 | pa.SOPName = value; | ||
529 | } | 538 | } |
530 | } | 539 | } |
531 | 540 | ||
@@ -535,10 +544,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
535 | set | 544 | set |
536 | { | 545 | { |
537 | m_material = (Material)value; | 546 | m_material = (Material)value; |
538 | if (PhysActor != null) | 547 | |
539 | { | 548 | PhysicsActor pa = PhysActor; |
540 | PhysActor.SetMaterial((int)value); | 549 | |
541 | } | 550 | if (pa != null) |
551 | pa.SetMaterial((int)value); | ||
542 | } | 552 | } |
543 | } | 553 | } |
544 | 554 | ||
@@ -669,9 +679,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
669 | // If this is a linkset, we don't want the physics engine mucking up our group position here. | 679 | // If this is a linkset, we don't want the physics engine mucking up our group position here. |
670 | PhysicsActor actor = PhysActor; | 680 | PhysicsActor actor = PhysActor; |
671 | if (actor != null && ParentID == 0) | 681 | if (actor != null && ParentID == 0) |
672 | { | ||
673 | m_groupPosition = actor.Position; | 682 | m_groupPosition = actor.Position; |
674 | } | ||
675 | 683 | ||
676 | if (ParentGroup.IsAttachment) | 684 | if (ParentGroup.IsAttachment) |
677 | { | 685 | { |
@@ -979,7 +987,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
979 | if (Shape.SculptEntry) | 987 | if (Shape.SculptEntry) |
980 | CheckSculptAndLoad(); | 988 | CheckSculptAndLoad(); |
981 | else | 989 | else |
982 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 990 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); |
983 | } | 991 | } |
984 | } | 992 | } |
985 | } | 993 | } |
@@ -1505,12 +1513,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1505 | } | 1513 | } |
1506 | 1514 | ||
1507 | // Basic Physics can also return null as well as an exception catch. | 1515 | // Basic Physics can also return null as well as an exception catch. |
1508 | if (PhysActor != null) | 1516 | PhysicsActor pa = PhysActor; |
1517 | |||
1518 | if (pa != null) | ||
1509 | { | 1519 | { |
1510 | PhysActor.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info | 1520 | pa.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info |
1511 | PhysActor.SetMaterial(Material); | 1521 | pa.SetMaterial(Material); |
1512 | DoPhysicsPropertyUpdate(RigidBody, true); | 1522 | DoPhysicsPropertyUpdate(RigidBody, true); |
1513 | PhysActor.SetVolumeDetect(VolumeDetectActive ? 1 : 0); | 1523 | pa.SetVolumeDetect(VolumeDetectActive ? 1 : 0); |
1514 | } | 1524 | } |
1515 | } | 1525 | } |
1516 | } | 1526 | } |
@@ -1731,23 +1741,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
1731 | } | 1741 | } |
1732 | else | 1742 | else |
1733 | { | 1743 | { |
1734 | if (PhysActor != null) | 1744 | PhysicsActor pa = PhysActor; |
1745 | |||
1746 | if (pa != null) | ||
1735 | { | 1747 | { |
1736 | if (UsePhysics != PhysActor.IsPhysical || isNew) | 1748 | if (UsePhysics != pa.IsPhysical || isNew) |
1737 | { | 1749 | { |
1738 | if (PhysActor.IsPhysical) // implies UsePhysics==false for this block | 1750 | if (pa.IsPhysical) // implies UsePhysics==false for this block |
1739 | { | 1751 | { |
1740 | if (!isNew) | 1752 | if (!isNew) |
1741 | ParentGroup.Scene.RemovePhysicalPrim(1); | 1753 | ParentGroup.Scene.RemovePhysicalPrim(1); |
1742 | 1754 | ||
1743 | PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; | 1755 | pa.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate; |
1744 | PhysActor.OnOutOfBounds -= PhysicsOutOfBounds; | 1756 | pa.OnOutOfBounds -= PhysicsOutOfBounds; |
1745 | PhysActor.delink(); | 1757 | pa.delink(); |
1746 | 1758 | ||
1747 | if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints && (!isNew)) | 1759 | if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints && (!isNew)) |
1748 | { | 1760 | { |
1749 | // destroy all joints connected to this now deactivated body | 1761 | // destroy all joints connected to this now deactivated body |
1750 | ParentGroup.Scene.PhysicsScene.RemoveAllJointsConnectedToActorThreadLocked(PhysActor); | 1762 | ParentGroup.Scene.PhysicsScene.RemoveAllJointsConnectedToActorThreadLocked(pa); |
1751 | } | 1763 | } |
1752 | 1764 | ||
1753 | // stop client-side interpolation of all joint proxy objects that have just been deleted | 1765 | // stop client-side interpolation of all joint proxy objects that have just been deleted |
@@ -1766,7 +1778,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1766 | //RotationalVelocity = new Vector3(0, 0, 0); | 1778 | //RotationalVelocity = new Vector3(0, 0, 0); |
1767 | } | 1779 | } |
1768 | 1780 | ||
1769 | PhysActor.IsPhysical = UsePhysics; | 1781 | pa.IsPhysical = UsePhysics; |
1770 | 1782 | ||
1771 | // If we're not what we're supposed to be in the physics scene, recreate ourselves. | 1783 | // If we're not what we're supposed to be in the physics scene, recreate ourselves. |
1772 | //m_parentGroup.Scene.PhysicsScene.RemovePrim(PhysActor); | 1784 | //m_parentGroup.Scene.PhysicsScene.RemovePrim(PhysActor); |
@@ -1779,13 +1791,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
1779 | { | 1791 | { |
1780 | ParentGroup.Scene.AddPhysicalPrim(1); | 1792 | ParentGroup.Scene.AddPhysicalPrim(1); |
1781 | 1793 | ||
1782 | PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; | 1794 | pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate; |
1783 | PhysActor.OnOutOfBounds += PhysicsOutOfBounds; | 1795 | pa.OnOutOfBounds += PhysicsOutOfBounds; |
1784 | if (ParentID != 0 && ParentID != LocalId) | 1796 | if (ParentID != 0 && ParentID != LocalId) |
1785 | { | 1797 | { |
1786 | if (ParentGroup.RootPart.PhysActor != null) | 1798 | PhysicsActor parentPa = ParentGroup.RootPart.PhysActor; |
1799 | |||
1800 | if (parentPa != null) | ||
1787 | { | 1801 | { |
1788 | PhysActor.link(ParentGroup.RootPart.PhysActor); | 1802 | pa.link(parentPa); |
1789 | } | 1803 | } |
1790 | } | 1804 | } |
1791 | } | 1805 | } |
@@ -1797,7 +1811,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1797 | if (Shape.SculptEntry) | 1811 | if (Shape.SculptEntry) |
1798 | CheckSculptAndLoad(); | 1812 | CheckSculptAndLoad(); |
1799 | else | 1813 | else |
1800 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 1814 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
1801 | } | 1815 | } |
1802 | } | 1816 | } |
1803 | } | 1817 | } |
@@ -1908,24 +1922,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
1908 | 1922 | ||
1909 | public Vector3 GetGeometricCenter() | 1923 | public Vector3 GetGeometricCenter() |
1910 | { | 1924 | { |
1911 | if (PhysActor != null) | 1925 | PhysicsActor pa = PhysActor; |
1912 | return new Vector3(PhysActor.CenterOfMass.X, PhysActor.CenterOfMass.Y, PhysActor.CenterOfMass.Z); | 1926 | |
1927 | if (pa != null) | ||
1928 | return new Vector3(pa.CenterOfMass.X, pa.CenterOfMass.Y, pa.CenterOfMass.Z); | ||
1913 | else | 1929 | else |
1914 | return new Vector3(0, 0, 0); | 1930 | return new Vector3(0, 0, 0); |
1915 | } | 1931 | } |
1916 | 1932 | ||
1917 | public float GetMass() | 1933 | public float GetMass() |
1918 | { | 1934 | { |
1919 | if (PhysActor != null) | 1935 | PhysicsActor pa = PhysActor; |
1920 | return PhysActor.Mass; | 1936 | |
1937 | if (pa != null) | ||
1938 | return pa.Mass; | ||
1921 | else | 1939 | else |
1922 | return 0; | 1940 | return 0; |
1923 | } | 1941 | } |
1924 | 1942 | ||
1925 | public Vector3 GetForce() | 1943 | public Vector3 GetForce() |
1926 | { | 1944 | { |
1927 | if (PhysActor != null) | 1945 | PhysicsActor pa = PhysActor; |
1928 | return PhysActor.Force; | 1946 | |
1947 | if (pa != null) | ||
1948 | return pa.Force; | ||
1929 | else | 1949 | else |
1930 | return Vector3.Zero; | 1950 | return Vector3.Zero; |
1931 | } | 1951 | } |
@@ -2556,9 +2576,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2556 | 2576 | ||
2557 | public void PhysicsRequestingTerseUpdate() | 2577 | public void PhysicsRequestingTerseUpdate() |
2558 | { | 2578 | { |
2559 | if (PhysActor != null) | 2579 | PhysicsActor pa = PhysActor; |
2580 | |||
2581 | if (pa != null) | ||
2560 | { | 2582 | { |
2561 | Vector3 newpos = new Vector3(PhysActor.Position.GetBytes(), 0); | 2583 | Vector3 newpos = new Vector3(pa.Position.GetBytes(), 0); |
2562 | 2584 | ||
2563 | if (ParentGroup.Scene.TestBorderCross(newpos, Cardinals.N) | 2585 | if (ParentGroup.Scene.TestBorderCross(newpos, Cardinals.N) |
2564 | | ParentGroup.Scene.TestBorderCross(newpos, Cardinals.S) | 2586 | | ParentGroup.Scene.TestBorderCross(newpos, Cardinals.S) |
@@ -2570,6 +2592,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2570 | } | 2592 | } |
2571 | //ParentGroup.RootPart.m_groupPosition = newpos; | 2593 | //ParentGroup.RootPart.m_groupPosition = newpos; |
2572 | } | 2594 | } |
2595 | |||
2573 | ScheduleTerseUpdate(); | 2596 | ScheduleTerseUpdate(); |
2574 | } | 2597 | } |
2575 | 2598 | ||
@@ -2660,7 +2683,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2660 | scale.Y = Math.Min(scale.Y, ParentGroup.Scene.m_maxNonphys); | 2683 | scale.Y = Math.Min(scale.Y, ParentGroup.Scene.m_maxNonphys); |
2661 | scale.Z = Math.Min(scale.Z, ParentGroup.Scene.m_maxNonphys); | 2684 | scale.Z = Math.Min(scale.Z, ParentGroup.Scene.m_maxNonphys); |
2662 | 2685 | ||
2663 | if (PhysActor != null && PhysActor.IsPhysical) | 2686 | PhysicsActor pa = PhysActor; |
2687 | |||
2688 | if (pa != null && pa.IsPhysical) | ||
2664 | { | 2689 | { |
2665 | scale.X = Math.Min(scale.X, ParentGroup.Scene.m_maxPhys); | 2690 | scale.X = Math.Min(scale.X, ParentGroup.Scene.m_maxPhys); |
2666 | scale.Y = Math.Min(scale.Y, ParentGroup.Scene.m_maxPhys); | 2691 | scale.Y = Math.Min(scale.Y, ParentGroup.Scene.m_maxPhys); |
@@ -2809,12 +2834,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2809 | m_shape.SculptData = texture.Data; | 2834 | m_shape.SculptData = texture.Data; |
2810 | } | 2835 | } |
2811 | 2836 | ||
2812 | if (PhysActor != null) | 2837 | PhysicsActor pa = PhysActor; |
2838 | |||
2839 | if (pa != null) | ||
2813 | { | 2840 | { |
2814 | // Update the physics actor with the new loaded sculpt data and set the taint signal. | 2841 | // Update the physics actor with the new loaded sculpt data and set the taint signal. |
2815 | PhysActor.Shape = m_shape; | 2842 | pa.Shape = m_shape; |
2816 | 2843 | ||
2817 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 2844 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2818 | } | 2845 | } |
2819 | } | 2846 | } |
2820 | } | 2847 | } |
@@ -3072,10 +3099,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
3072 | 3099 | ||
3073 | public void SetBuoyancy(float fvalue) | 3100 | public void SetBuoyancy(float fvalue) |
3074 | { | 3101 | { |
3075 | if (PhysActor != null) | 3102 | PhysicsActor pa = PhysActor; |
3076 | { | 3103 | |
3077 | PhysActor.Buoyancy = fvalue; | 3104 | if (pa != null) |
3078 | } | 3105 | pa.Buoyancy = fvalue; |
3079 | } | 3106 | } |
3080 | 3107 | ||
3081 | public void SetDieAtEdge(bool p) | 3108 | public void SetDieAtEdge(bool p) |
@@ -3088,57 +3115,50 @@ namespace OpenSim.Region.Framework.Scenes | |||
3088 | 3115 | ||
3089 | public void SetFloatOnWater(int floatYN) | 3116 | public void SetFloatOnWater(int floatYN) |
3090 | { | 3117 | { |
3091 | if (PhysActor != null) | 3118 | PhysicsActor pa = PhysActor; |
3092 | { | 3119 | |
3093 | if (floatYN == 1) | 3120 | if (pa != null) |
3094 | { | 3121 | pa.FloatOnWater = floatYN == 1; |
3095 | PhysActor.FloatOnWater = true; | ||
3096 | } | ||
3097 | else | ||
3098 | { | ||
3099 | PhysActor.FloatOnWater = false; | ||
3100 | } | ||
3101 | } | ||
3102 | } | 3122 | } |
3103 | 3123 | ||
3104 | public void SetForce(Vector3 force) | 3124 | public void SetForce(Vector3 force) |
3105 | { | 3125 | { |
3106 | if (PhysActor != null) | 3126 | PhysicsActor pa = PhysActor; |
3107 | { | 3127 | |
3108 | PhysActor.Force = force; | 3128 | if (pa != null) |
3109 | } | 3129 | pa.Force = force; |
3110 | } | 3130 | } |
3111 | 3131 | ||
3112 | public void SetVehicleType(int type) | 3132 | public void SetVehicleType(int type) |
3113 | { | 3133 | { |
3114 | if (PhysActor != null) | 3134 | PhysicsActor pa = PhysActor; |
3115 | { | 3135 | |
3116 | PhysActor.VehicleType = type; | 3136 | if (pa != null) |
3117 | } | 3137 | pa.VehicleType = type; |
3118 | } | 3138 | } |
3119 | 3139 | ||
3120 | public void SetVehicleFloatParam(int param, float value) | 3140 | public void SetVehicleFloatParam(int param, float value) |
3121 | { | 3141 | { |
3122 | if (PhysActor != null) | 3142 | PhysicsActor pa = PhysActor; |
3123 | { | 3143 | |
3124 | PhysActor.VehicleFloatParam(param, value); | 3144 | if (pa != null) |
3125 | } | 3145 | pa.VehicleFloatParam(param, value); |
3126 | } | 3146 | } |
3127 | 3147 | ||
3128 | public void SetVehicleVectorParam(int param, Vector3 value) | 3148 | public void SetVehicleVectorParam(int param, Vector3 value) |
3129 | { | 3149 | { |
3130 | if (PhysActor != null) | 3150 | PhysicsActor pa = PhysActor; |
3131 | { | 3151 | |
3132 | PhysActor.VehicleVectorParam(param, value); | 3152 | if (pa != null) |
3133 | } | 3153 | pa.VehicleVectorParam(param, value); |
3134 | } | 3154 | } |
3135 | 3155 | ||
3136 | public void SetVehicleRotationParam(int param, Quaternion rotation) | 3156 | public void SetVehicleRotationParam(int param, Quaternion rotation) |
3137 | { | 3157 | { |
3138 | if (PhysActor != null) | 3158 | PhysicsActor pa = PhysActor; |
3139 | { | 3159 | |
3140 | PhysActor.VehicleRotationParam(param, rotation); | 3160 | if (pa != null) |
3141 | } | 3161 | pa.VehicleRotationParam(param, rotation); |
3142 | } | 3162 | } |
3143 | 3163 | ||
3144 | /// <summary> | 3164 | /// <summary> |
@@ -4226,6 +4246,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4226 | if ((UsePhysics == wasUsingPhysics) && (wasTemporary == SetTemporary) && (wasPhantom == SetPhantom) && (SetVD == wasVD)) | 4246 | if ((UsePhysics == wasUsingPhysics) && (wasTemporary == SetTemporary) && (wasPhantom == SetPhantom) && (SetVD == wasVD)) |
4227 | return; | 4247 | return; |
4228 | 4248 | ||
4249 | PhysicsActor pa = PhysActor; | ||
4250 | |||
4229 | // Special cases for VD. VD can only be called from a script | 4251 | // Special cases for VD. VD can only be called from a script |
4230 | // and can't be combined with changes to other states. So we can rely | 4252 | // and can't be combined with changes to other states. So we can rely |
4231 | // that... | 4253 | // that... |
@@ -4241,8 +4263,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
4241 | { | 4263 | { |
4242 | SetVD = false; // Switch it of for the course of this routine | 4264 | SetVD = false; // Switch it of for the course of this routine |
4243 | VolumeDetectActive = false; // and also permanently | 4265 | VolumeDetectActive = false; // and also permanently |
4244 | if (PhysActor != null) | 4266 | |
4245 | PhysActor.SetVolumeDetect(0); // Let physics know about it too | 4267 | if (pa != null) |
4268 | pa.SetVolumeDetect(0); // Let physics know about it too | ||
4246 | } | 4269 | } |
4247 | else | 4270 | else |
4248 | { | 4271 | { |
@@ -4357,9 +4380,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
4357 | // Defensive programming calls for a check here. | 4380 | // Defensive programming calls for a check here. |
4358 | // Better would be throwing an exception that could be catched by a unit test as the internal | 4381 | // Better would be throwing an exception that could be catched by a unit test as the internal |
4359 | // logic should make sure, this Physactor is always here. | 4382 | // logic should make sure, this Physactor is always here. |
4360 | if (this.PhysActor != null) | 4383 | if (pa != null) |
4361 | { | 4384 | { |
4362 | PhysActor.SetVolumeDetect(1); | 4385 | pa.SetVolumeDetect(1); |
4363 | AddFlag(PrimFlags.Phantom); // We set this flag also if VD is active | 4386 | AddFlag(PrimFlags.Phantom); // We set this flag also if VD is active |
4364 | this.VolumeDetectActive = true; | 4387 | this.VolumeDetectActive = true; |
4365 | } | 4388 | } |
@@ -4368,11 +4391,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4368 | { | 4391 | { |
4369 | // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like | 4392 | // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like |
4370 | // (mumbles, well, at least if you have infinte CPU powers :-)) | 4393 | // (mumbles, well, at least if you have infinte CPU powers :-)) |
4371 | PhysicsActor pa = this.PhysActor; | ||
4372 | if (pa != null) | 4394 | if (pa != null) |
4373 | { | ||
4374 | PhysActor.SetVolumeDetect(0); | 4395 | PhysActor.SetVolumeDetect(0); |
4375 | } | ||
4376 | 4396 | ||
4377 | this.VolumeDetectActive = false; | 4397 | this.VolumeDetectActive = false; |
4378 | } | 4398 | } |
@@ -4385,6 +4405,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4385 | { | 4405 | { |
4386 | RemFlag(PrimFlags.TemporaryOnRez); | 4406 | RemFlag(PrimFlags.TemporaryOnRez); |
4387 | } | 4407 | } |
4408 | |||
4388 | // m_log.Debug("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString()); | 4409 | // m_log.Debug("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString()); |
4389 | 4410 | ||
4390 | if (ParentGroup != null) | 4411 | if (ParentGroup != null) |
@@ -4453,10 +4474,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
4453 | m_shape.PathTwist = shapeBlock.PathTwist; | 4474 | m_shape.PathTwist = shapeBlock.PathTwist; |
4454 | m_shape.PathTwistBegin = shapeBlock.PathTwistBegin; | 4475 | m_shape.PathTwistBegin = shapeBlock.PathTwistBegin; |
4455 | 4476 | ||
4456 | if (PhysActor != null) | 4477 | PhysicsActor pa = PhysActor; |
4478 | |||
4479 | if (pa != null) | ||
4457 | { | 4480 | { |
4458 | PhysActor.Shape = m_shape; | 4481 | pa.Shape = m_shape; |
4459 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 4482 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa); |
4460 | } | 4483 | } |
4461 | 4484 | ||
4462 | // This is what makes vehicle trailers work | 4485 | // This is what makes vehicle trailers work |
@@ -4598,6 +4621,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
4598 | objectflagupdate |= (uint) PrimFlags.AllowInventoryDrop; | 4621 | objectflagupdate |= (uint) PrimFlags.AllowInventoryDrop; |
4599 | } | 4622 | } |
4600 | 4623 | ||
4624 | PhysicsActor pa = PhysActor; | ||
4625 | |||
4601 | if ( | 4626 | if ( |
4602 | ((AggregateScriptEvents & scriptEvents.collision) != 0) || | 4627 | ((AggregateScriptEvents & scriptEvents.collision) != 0) || |
4603 | ((AggregateScriptEvents & scriptEvents.collision_end) != 0) || | 4628 | ((AggregateScriptEvents & scriptEvents.collision_end) != 0) || |
@@ -4609,18 +4634,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
4609 | ) | 4634 | ) |
4610 | { | 4635 | { |
4611 | // subscribe to physics updates. | 4636 | // subscribe to physics updates. |
4612 | if (PhysActor != null) | 4637 | if (pa != null) |
4613 | { | 4638 | { |
4614 | PhysActor.OnCollisionUpdate += PhysicsCollision; | 4639 | pa.OnCollisionUpdate += PhysicsCollision; |
4615 | PhysActor.SubscribeEvents(1000); | 4640 | pa.SubscribeEvents(1000); |
4616 | } | 4641 | } |
4617 | } | 4642 | } |
4618 | else | 4643 | else |
4619 | { | 4644 | { |
4620 | if (PhysActor != null) | 4645 | if (pa != null) |
4621 | { | 4646 | { |
4622 | PhysActor.UnSubscribeEvents(); | 4647 | pa.UnSubscribeEvents(); |
4623 | PhysActor.OnCollisionUpdate -= PhysicsCollision; | 4648 | pa.OnCollisionUpdate -= PhysicsCollision; |
4624 | } | 4649 | } |
4625 | } | 4650 | } |
4626 | 4651 | ||