diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 123 |
1 files changed, 75 insertions, 48 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 11fd721..5f33452 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -725,16 +725,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
725 | { | 725 | { |
726 | m_isSelected = value; | 726 | m_isSelected = value; |
727 | // Tell physics engine that group is selected | 727 | // Tell physics engine that group is selected |
728 | if (m_rootPart.PhysActor != null) | 728 | |
729 | PhysicsActor pa = m_rootPart.PhysActor; | ||
730 | if (pa != null) | ||
729 | { | 731 | { |
730 | m_rootPart.PhysActor.Selected = value; | 732 | pa.Selected = value; |
733 | |||
731 | // Pass it on to the children. | 734 | // Pass it on to the children. |
732 | SceneObjectPart[] parts = m_parts.GetArray(); | 735 | SceneObjectPart[] parts = m_parts.GetArray(); |
733 | for (int i = 0; i < parts.Length; i++) | 736 | for (int i = 0; i < parts.Length; i++) |
734 | { | 737 | { |
735 | SceneObjectPart child = parts[i]; | 738 | SceneObjectPart child = parts[i]; |
736 | if (child.PhysActor != null) | 739 | |
737 | child.PhysActor.Selected = value; | 740 | PhysicsActor childPa = child.PhysActor; |
741 | if (childPa != null) | ||
742 | childPa.Selected = value; | ||
738 | } | 743 | } |
739 | } | 744 | } |
740 | if (RootPart.KeyframeMotion != null) | 745 | if (RootPart.KeyframeMotion != null) |
@@ -2166,22 +2171,26 @@ namespace OpenSim.Region.Framework.Scenes | |||
2166 | } | 2171 | } |
2167 | else | 2172 | else |
2168 | { | 2173 | { |
2169 | if (RootPart.PhysActor != null) | 2174 | PhysicsActor pa = RootPart.PhysActor; |
2175 | |||
2176 | if (pa != null) | ||
2170 | { | 2177 | { |
2171 | RootPart.PhysActor.AddForce(impulse, true); | 2178 | pa.AddForce(impulse, true); |
2172 | m_scene.PhysicsScene.AddPhysicsActorTaint(RootPart.PhysActor); | 2179 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2173 | } | 2180 | } |
2174 | } | 2181 | } |
2175 | } | 2182 | } |
2176 | 2183 | ||
2177 | public void applyAngularImpulse(Vector3 impulse) | 2184 | public void setAngularImpulse(Vector3 impulse) |
2178 | { | 2185 | { |
2179 | if (RootPart.PhysActor != null) | 2186 | PhysicsActor pa = RootPart.PhysActor; |
2187 | |||
2188 | if (pa != null) | ||
2180 | { | 2189 | { |
2181 | if (!IsAttachment) | 2190 | if (!IsAttachment) |
2182 | { | 2191 | { |
2183 | RootPart.PhysActor.AddAngularForce(impulse, true); | 2192 | pa.Torque = impulse; |
2184 | m_scene.PhysicsScene.AddPhysicsActorTaint(RootPart.PhysActor); | 2193 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2185 | } | 2194 | } |
2186 | } | 2195 | } |
2187 | } | 2196 | } |
@@ -2204,19 +2213,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
2204 | } | 2213 | } |
2205 | else | 2214 | else |
2206 | { | 2215 | { |
2207 | if (RootPart.PhysActor != null) | 2216 | PhysicsActor pa = RootPart.PhysActor; |
2217 | |||
2218 | if (pa != null) | ||
2208 | { | 2219 | { |
2209 | RootPart.PhysActor.PIDTarget = target; | 2220 | pa.PIDTarget = target; |
2210 | RootPart.PhysActor.PIDTau = tau; | 2221 | pa.PIDTau = tau; |
2211 | RootPart.PhysActor.PIDActive = true; | 2222 | pa.PIDActive = true; |
2212 | } | 2223 | } |
2213 | } | 2224 | } |
2214 | } | 2225 | } |
2215 | 2226 | ||
2216 | public void stopMoveToTarget() | 2227 | public void stopMoveToTarget() |
2217 | { | 2228 | { |
2218 | if (RootPart.PhysActor != null) | 2229 | PhysicsActor pa = RootPart.PhysActor; |
2219 | RootPart.PhysActor.PIDActive = false; | 2230 | |
2231 | if (pa != null) | ||
2232 | pa.PIDActive = false; | ||
2220 | } | 2233 | } |
2221 | 2234 | ||
2222 | public void rotLookAt(Quaternion target, float strength, float damping) | 2235 | public void rotLookAt(Quaternion target, float strength, float damping) |
@@ -2267,18 +2280,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
2267 | /// <param name="tau">Number of seconds over which to reach target</param> | 2280 | /// <param name="tau">Number of seconds over which to reach target</param> |
2268 | public void SetHoverHeight(float height, PIDHoverType hoverType, float tau) | 2281 | public void SetHoverHeight(float height, PIDHoverType hoverType, float tau) |
2269 | { | 2282 | { |
2270 | if (RootPart.PhysActor != null) | 2283 | PhysicsActor pa = RootPart.PhysActor; |
2284 | |||
2285 | if (pa != null) | ||
2271 | { | 2286 | { |
2272 | if (height != 0f) | 2287 | if (height != 0f) |
2273 | { | 2288 | { |
2274 | RootPart.PhysActor.PIDHoverHeight = height; | 2289 | pa.PIDHoverHeight = height; |
2275 | RootPart.PhysActor.PIDHoverType = hoverType; | 2290 | pa.PIDHoverType = hoverType; |
2276 | RootPart.PhysActor.PIDTau = tau; | 2291 | pa.PIDTau = tau; |
2277 | RootPart.PhysActor.PIDHoverActive = true; | 2292 | pa.PIDHoverActive = true; |
2278 | } | 2293 | } |
2279 | else | 2294 | else |
2280 | { | 2295 | { |
2281 | RootPart.PhysActor.PIDHoverActive = false; | 2296 | pa.PIDHoverActive = false; |
2282 | } | 2297 | } |
2283 | } | 2298 | } |
2284 | } | 2299 | } |
@@ -2771,10 +2786,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2771 | linkPart.ParentID = 0; | 2786 | linkPart.ParentID = 0; |
2772 | linkPart.LinkNum = 0; | 2787 | linkPart.LinkNum = 0; |
2773 | 2788 | ||
2774 | if (linkPart.PhysActor != null) | 2789 | PhysicsActor linkPartPa = linkPart.PhysActor; |
2775 | { | 2790 | |
2776 | m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor); | 2791 | if (linkPartPa != null) |
2777 | } | 2792 | m_scene.PhysicsScene.RemovePrim(linkPartPa); |
2778 | 2793 | ||
2779 | // We need to reset the child part's position | 2794 | // We need to reset the child part's position |
2780 | // ready for life as a separate object after being a part of another object | 2795 | // ready for life as a separate object after being a part of another object |
@@ -2875,17 +2890,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
2875 | { | 2890 | { |
2876 | if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) | 2891 | if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) |
2877 | { | 2892 | { |
2878 | if (m_rootPart.PhysActor != null) | 2893 | PhysicsActor pa = m_rootPart.PhysActor; |
2894 | |||
2895 | if (pa != null) | ||
2879 | { | 2896 | { |
2880 | if (m_rootPart.PhysActor.IsPhysical) | 2897 | if (pa.IsPhysical) |
2881 | { | 2898 | { |
2882 | if (!m_rootPart.BlockGrab) | 2899 | if (!m_rootPart.BlockGrab) |
2883 | { | 2900 | { |
2884 | Vector3 llmoveforce = pos - AbsolutePosition; | 2901 | Vector3 llmoveforce = pos - AbsolutePosition; |
2885 | Vector3 grabforce = llmoveforce; | 2902 | Vector3 grabforce = llmoveforce; |
2886 | grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; | 2903 | grabforce = (grabforce / 10) * pa.Mass; |
2887 | m_rootPart.PhysActor.AddForce(grabforce, true); | 2904 | pa.AddForce(grabforce, true); |
2888 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); | 2905 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2889 | } | 2906 | } |
2890 | } | 2907 | } |
2891 | else | 2908 | else |
@@ -2915,9 +2932,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2915 | { | 2932 | { |
2916 | if (m_scene.EventManager.TriggerGroupSpinStart(UUID)) | 2933 | if (m_scene.EventManager.TriggerGroupSpinStart(UUID)) |
2917 | { | 2934 | { |
2918 | if (m_rootPart.PhysActor != null) | 2935 | PhysicsActor pa = m_rootPart.PhysActor; |
2936 | |||
2937 | if (pa != null) | ||
2919 | { | 2938 | { |
2920 | if (m_rootPart.PhysActor.IsPhysical) | 2939 | if (pa.IsPhysical) |
2921 | { | 2940 | { |
2922 | m_rootPart.IsWaitingForFirstSpinUpdatePacket = true; | 2941 | m_rootPart.IsWaitingForFirstSpinUpdatePacket = true; |
2923 | } | 2942 | } |
@@ -2958,12 +2977,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2958 | // but it will result in over-shoot or under-shoot of the target orientation. | 2977 | // but it will result in over-shoot or under-shoot of the target orientation. |
2959 | // For the end user, this means that ctrl+shift+drag can be used for relative, | 2978 | // For the end user, this means that ctrl+shift+drag can be used for relative, |
2960 | // but not absolute, adjustments of orientation for physical prims. | 2979 | // but not absolute, adjustments of orientation for physical prims. |
2961 | |||
2962 | if (m_scene.EventManager.TriggerGroupSpin(UUID, newOrientation)) | 2980 | if (m_scene.EventManager.TriggerGroupSpin(UUID, newOrientation)) |
2963 | { | 2981 | { |
2964 | if (m_rootPart.PhysActor != null) | 2982 | PhysicsActor pa = m_rootPart.PhysActor; |
2983 | |||
2984 | if (pa != null) | ||
2965 | { | 2985 | { |
2966 | if (m_rootPart.PhysActor.IsPhysical) | 2986 | if (pa.IsPhysical) |
2967 | { | 2987 | { |
2968 | if (m_rootPart.IsWaitingForFirstSpinUpdatePacket) | 2988 | if (m_rootPart.IsWaitingForFirstSpinUpdatePacket) |
2969 | { | 2989 | { |
@@ -2989,9 +3009,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2989 | 3009 | ||
2990 | //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis); | 3010 | //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis); |
2991 | Vector3 spinforce = new Vector3(rotationAxis.X, rotationAxis.Y, rotationAxis.Z); | 3011 | Vector3 spinforce = new Vector3(rotationAxis.X, rotationAxis.Y, rotationAxis.Z); |
2992 | spinforce = (spinforce/8) * m_rootPart.PhysActor.Mass; // 8 is an arbitrary torque scaling factor | 3012 | spinforce = (spinforce/8) * pa.Mass; // 8 is an arbitrary torque scaling factor |
2993 | m_rootPart.PhysActor.AddAngularForce(spinforce,true); | 3013 | pa.AddAngularForce(spinforce,true); |
2994 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); | 3014 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
2995 | } | 3015 | } |
2996 | } | 3016 | } |
2997 | else | 3017 | else |
@@ -3199,8 +3219,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
3199 | { | 3219 | { |
3200 | part.UpdateShape(shapeBlock); | 3220 | part.UpdateShape(shapeBlock); |
3201 | 3221 | ||
3202 | if (part.PhysActor != null) | 3222 | PhysicsActor pa = m_rootPart.PhysActor; |
3203 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); | 3223 | |
3224 | if (pa != null) | ||
3225 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); | ||
3204 | } | 3226 | } |
3205 | } | 3227 | } |
3206 | 3228 | ||
@@ -3218,7 +3240,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3218 | scale.Y = Math.Min(scale.Y, Scene.m_maxNonphys); | 3240 | scale.Y = Math.Min(scale.Y, Scene.m_maxNonphys); |
3219 | scale.Z = Math.Min(scale.Z, Scene.m_maxNonphys); | 3241 | scale.Z = Math.Min(scale.Z, Scene.m_maxNonphys); |
3220 | 3242 | ||
3221 | if (RootPart.PhysActor != null && RootPart.PhysActor.IsPhysical) | 3243 | PhysicsActor pa = m_rootPart.PhysActor; |
3244 | |||
3245 | if (pa != null && pa.IsPhysical) | ||
3222 | { | 3246 | { |
3223 | scale.X = Math.Min(scale.X, Scene.m_maxPhys); | 3247 | scale.X = Math.Min(scale.X, Scene.m_maxPhys); |
3224 | scale.Y = Math.Min(scale.Y, Scene.m_maxPhys); | 3248 | scale.Y = Math.Min(scale.Y, Scene.m_maxPhys); |
@@ -3243,7 +3267,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3243 | float f = 1.0f; | 3267 | float f = 1.0f; |
3244 | float a = 1.0f; | 3268 | float a = 1.0f; |
3245 | 3269 | ||
3246 | if (RootPart.PhysActor != null && RootPart.PhysActor.IsPhysical) | 3270 | if (pa != null && pa.IsPhysical) |
3247 | { | 3271 | { |
3248 | if (oldSize.X * x > m_scene.m_maxPhys) | 3272 | if (oldSize.X * x > m_scene.m_maxPhys) |
3249 | { | 3273 | { |
@@ -3558,13 +3582,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
3558 | // needs to be called with phys building true | 3582 | // needs to be called with phys building true |
3559 | Quaternion axRot = rot; | 3583 | Quaternion axRot = rot; |
3560 | Quaternion oldParentRot = m_rootPart.RotationOffset; | 3584 | Quaternion oldParentRot = m_rootPart.RotationOffset; |
3561 | 3585 | ||
3562 | //Don't use UpdateRotation because it schedules an update prematurely | 3586 | //Don't use UpdateRotation because it schedules an update prematurely |
3563 | m_rootPart.RotationOffset = rot; | 3587 | m_rootPart.RotationOffset = rot; |
3564 | if (m_rootPart.PhysActor != null) | 3588 | |
3589 | PhysicsActor pa = m_rootPart.PhysActor; | ||
3590 | |||
3591 | if (pa != null) | ||
3565 | { | 3592 | { |
3566 | m_rootPart.PhysActor.Orientation = m_rootPart.RotationOffset; | 3593 | pa.Orientation = m_rootPart.RotationOffset; |
3567 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); | 3594 | m_scene.PhysicsScene.AddPhysicsActorTaint(pa); |
3568 | } | 3595 | } |
3569 | 3596 | ||
3570 | SceneObjectPart[] parts = m_parts.GetArray(); | 3597 | SceneObjectPart[] parts = m_parts.GetArray(); |