diff options
author | Teravus Ovares | 2008-01-15 04:14:27 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-01-15 04:14:27 +0000 |
commit | 45e945616bfdab2ef57744670d3bb21acc1b3fcf (patch) | |
tree | c23956cef7294fc1f77062b41d63fdad3e19055e | |
parent | * Mother of all commits: (diff) | |
download | opensim-SC-45e945616bfdab2ef57744670d3bb21acc1b3fcf.zip opensim-SC-45e945616bfdab2ef57744670d3bb21acc1b3fcf.tar.gz opensim-SC-45e945616bfdab2ef57744670d3bb21acc1b3fcf.tar.bz2 opensim-SC-45e945616bfdab2ef57744670d3bb21acc1b3fcf.tar.xz |
* Pass 2 of collidable (non physical) linksets
* Linkset status is now persistent
* Tweaked a physics child prim positioning hack to generate less database saves
* Re-factored physics object creation calls into ApplyPhysics. To create a new physics representation of an object or linkset, it's only necessary to call *group*.ApplyPhysics(bool m_physicalPrim). *lbsa has been waiting for this refactoring*
* We have collidable linksets now. (they don't become phantom anymore)
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | 1 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/Scene.cs | 27 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | 22 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 22 |
4 files changed, 33 insertions, 39 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 31bd0b3..2fd4301 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs | |||
@@ -755,6 +755,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
755 | group.AbsolutePosition = pos; | 755 | group.AbsolutePosition = pos; |
756 | SceneObjectPart rootPart = group.GetChildPart(group.UUID); | 756 | SceneObjectPart rootPart = group.GetChildPart(group.UUID); |
757 | rootPart.ApplySanePermissions(); | 757 | rootPart.ApplySanePermissions(); |
758 | group.ApplyPhysics(m_physicalPrim); | ||
758 | //bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0)&& m_physicalPrim); | 759 | //bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0)&& m_physicalPrim); |
759 | //if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0) | 760 | //if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0) |
760 | //{ | 761 | //{ |
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 43486e8..86f43b3 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs | |||
@@ -908,17 +908,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
908 | SceneObjectPart rootPart = group.GetChildPart(group.UUID); | 908 | SceneObjectPart rootPart = group.GetChildPart(group.UUID); |
909 | rootPart.ApplySanePermissions(); | 909 | rootPart.ApplySanePermissions(); |
910 | 910 | ||
911 | bool UsePhysics = (((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Physics) > 0) && m_physicalPrim); | 911 | group.ApplyPhysics(m_physicalPrim); |
912 | if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0) | 912 | //rootPart.DoPhysicsPropertyUpdate(UsePhysics, true); |
913 | rootPart.PhysActor = PhysicsScene.AddPrimShape( | ||
914 | rootPart.Name, | ||
915 | rootPart.Shape, | ||
916 | new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, | ||
917 | rootPart.AbsolutePosition.Z), | ||
918 | new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), | ||
919 | new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, | ||
920 | rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics); | ||
921 | rootPart.DoPhysicsPropertyUpdate(UsePhysics, true); | ||
922 | } | 913 | } |
923 | 914 | ||
924 | MainLog.Instance.Verbose("SCENE", "Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)"); | 915 | MainLog.Instance.Verbose("SCENE", "Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)"); |
@@ -1054,19 +1045,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
1054 | //rootPart.ObjectFlags += (uint)LLObject.ObjectFlags.Phantom; | 1045 | //rootPart.ObjectFlags += (uint)LLObject.ObjectFlags.Phantom; |
1055 | } | 1046 | } |
1056 | // if not phantom, add to physics | 1047 | // if not phantom, add to physics |
1057 | bool UsePhysics = (((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Physics) > 0) && m_physicalPrim); | 1048 | sceneOb.ApplyPhysics(m_physicalPrim); |
1058 | if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0) | ||
1059 | { | ||
1060 | rootPart.PhysActor = | ||
1061 | PhysicsScene.AddPrimShape( | ||
1062 | rootPart.Name, | ||
1063 | rootPart.Shape, | ||
1064 | new PhysicsVector(pos.X, pos.Y, pos.Z), | ||
1065 | new PhysicsVector(shape.Scale.X, shape.Scale.Y, shape.Scale.Z), | ||
1066 | new Quaternion(), UsePhysics); | ||
1067 | // subscribe to physics events. | ||
1068 | rootPart.DoPhysicsPropertyUpdate(UsePhysics, true); | ||
1069 | } | ||
1070 | } | 1049 | } |
1071 | 1050 | ||
1072 | public void AddTree(LLVector3 scale, LLQuaternion rotation, LLVector3 position, | 1051 | public void AddTree(LLVector3 scale, LLQuaternion rotation, LLVector3 position, |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index ffc72c9..b591802 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -249,7 +249,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
249 | 249 | ||
250 | AttachToBackup(); | 250 | AttachToBackup(); |
251 | 251 | ||
252 | ApplyPhysics(); | 252 | ApplyPhysics(scene.m_physicalPrim); |
253 | 253 | ||
254 | ScheduleGroupForFullUpdate(); | 254 | ScheduleGroupForFullUpdate(); |
255 | } | 255 | } |
@@ -302,7 +302,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
302 | 302 | ||
303 | AttachToBackup(); | 303 | AttachToBackup(); |
304 | 304 | ||
305 | ApplyPhysics(); | 305 | ApplyPhysics(scene.m_physicalPrim); |
306 | 306 | ||
307 | ScheduleGroupForFullUpdate(); | 307 | ScheduleGroupForFullUpdate(); |
308 | } | 308 | } |
@@ -426,7 +426,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
426 | 426 | ||
427 | AttachToBackup(); | 427 | AttachToBackup(); |
428 | 428 | ||
429 | ApplyPhysics(); | 429 | //ApplyPhysics(scene.m_physicalPrim); |
430 | } | 430 | } |
431 | 431 | ||
432 | /// <summary> | 432 | /// <summary> |
@@ -1577,6 +1577,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
1577 | } | 1577 | } |
1578 | } | 1578 | } |
1579 | 1579 | ||
1580 | public void ResetChildPrimPhysicsPositions() | ||
1581 | { | ||
1582 | AbsolutePosition = AbsolutePosition; | ||
1583 | HasChanged = false; | ||
1584 | } | ||
1585 | |||
1580 | public LLUUID GetPartsFullID(uint localID) | 1586 | public LLUUID GetPartsFullID(uint localID) |
1581 | { | 1587 | { |
1582 | SceneObjectPart part = GetChildPart(localID); | 1588 | SceneObjectPart part = GetChildPart(localID); |
@@ -1649,18 +1655,22 @@ namespace OpenSim.Region.Environment.Scenes | |||
1649 | Text = text; | 1655 | Text = text; |
1650 | } | 1656 | } |
1651 | 1657 | ||
1652 | public void ApplyPhysics() | 1658 | public void ApplyPhysics(bool m_physicalPrim) |
1653 | { | 1659 | { |
1654 | if (m_parts.Count > 1) | 1660 | if (m_parts.Count > 1) |
1655 | { | 1661 | { |
1656 | foreach (SceneObjectPart parts in m_parts.Values) | 1662 | foreach (SceneObjectPart parts in m_parts.Values) |
1657 | { | 1663 | { |
1658 | parts.ApplyPhysics(); | 1664 | parts.ApplyPhysics(m_rootPart.ObjectFlags, m_physicalPrim); |
1665 | |||
1666 | // Hack to get the physics scene geometries in the right spot | ||
1667 | ResetChildPrimPhysicsPositions(); | ||
1668 | |||
1659 | } | 1669 | } |
1660 | } | 1670 | } |
1661 | else | 1671 | else |
1662 | { | 1672 | { |
1663 | m_rootPart.ApplyPhysics(); | 1673 | m_rootPart.ApplyPhysics(m_rootPart.ObjectFlags, m_physicalPrim); |
1664 | } | 1674 | } |
1665 | } | 1675 | } |
1666 | } | 1676 | } |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index f2594a9..468e2d0 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -261,7 +261,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
261 | try | 261 | try |
262 | { | 262 | { |
263 | // Hack to get the child prim to update positions in the physics engine | 263 | // Hack to get the child prim to update positions in the physics engine |
264 | ParentGroup.AbsolutePosition = ParentGroup.AbsolutePosition; | 264 | ParentGroup.ResetChildPrimPhysicsPositions(); |
265 | } | 265 | } |
266 | catch (System.NullReferenceException) | 266 | catch (System.NullReferenceException) |
267 | { | 267 | { |
@@ -646,14 +646,17 @@ namespace OpenSim.Region.Environment.Scenes | |||
646 | return newobject; | 646 | return newobject; |
647 | } | 647 | } |
648 | 648 | ||
649 | public void ApplyPhysics() | 649 | public void ApplyPhysics(uint rootObjectFlags, bool m_physicalPrim) |
650 | { | 650 | { |
651 | bool isPhysical = ((ObjectFlags & (uint) LLObject.ObjectFlags.Physics) != 0); | ||
652 | bool isPhantom = ((ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) != 0); | ||
653 | 651 | ||
654 | bool usePhysics = isPhysical && !isPhantom; | 652 | bool isPhysical = (((rootObjectFlags & (uint) LLObject.ObjectFlags.Physics) != 0) && m_physicalPrim); |
653 | bool isPhantom = ((rootObjectFlags & (uint) LLObject.ObjectFlags.Phantom) != 0); | ||
655 | 654 | ||
656 | if (usePhysics) | 655 | // Added clarification.. since A rigid body is an object that you can kick around, etc. |
656 | bool RigidBody = isPhysical && !isPhantom; | ||
657 | |||
658 | // The only time the physics scene shouldn't know about the prim is if it's phantom | ||
659 | if (!isPhantom) | ||
657 | { | 660 | { |
658 | PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( | 661 | PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( |
659 | Name, | 662 | Name, |
@@ -662,10 +665,11 @@ namespace OpenSim.Region.Environment.Scenes | |||
662 | AbsolutePosition.Z), | 665 | AbsolutePosition.Z), |
663 | new PhysicsVector(Scale.X, Scale.Y, Scale.Z), | 666 | new PhysicsVector(Scale.X, Scale.Y, Scale.Z), |
664 | new Quaternion(RotationOffset.W, RotationOffset.X, | 667 | new Quaternion(RotationOffset.W, RotationOffset.X, |
665 | RotationOffset.Y, RotationOffset.Z), usePhysics); | 668 | RotationOffset.Y, RotationOffset.Z), RigidBody); |
666 | } | ||
667 | 669 | ||
668 | DoPhysicsPropertyUpdate(usePhysics, true); | 670 | |
671 | DoPhysicsPropertyUpdate(RigidBody, true); | ||
672 | } | ||
669 | } | 673 | } |
670 | 674 | ||
671 | public void ApplyNextOwnerPermissions() | 675 | public void ApplyNextOwnerPermissions() |