diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 8 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 39 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 162 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 16 |
4 files changed, 128 insertions, 97 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 29825a2..e488fe1 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -2163,12 +2163,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2163 | part.RemoveFromPhysics(); | 2163 | part.RemoveFromPhysics(); |
2164 | } | 2164 | } |
2165 | } | 2165 | } |
2166 | |||
2167 | // if (rootPart.PhysActor != null) | ||
2168 | // { | ||
2169 | // PhysicsScene.RemovePrim(rootPart.PhysActor); | ||
2170 | // rootPart.PhysActor = null; | ||
2171 | // } | ||
2172 | 2166 | ||
2173 | if (UnlinkSceneObject(group, false)) | 2167 | if (UnlinkSceneObject(group, false)) |
2174 | { | 2168 | { |
@@ -2572,7 +2566,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2572 | SceneObjectGroup grp = sceneObject; | 2566 | SceneObjectGroup grp = sceneObject; |
2573 | 2567 | ||
2574 | m_log.DebugFormat( | 2568 | m_log.DebugFormat( |
2575 | "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.GetFromItemID(), grp.UUID); | 2569 | "[ATTACHMENT]: Received attachment {0}, inworld asset id {1}", grp.FromItemID, grp.UUID); |
2576 | m_log.DebugFormat( | 2570 | m_log.DebugFormat( |
2577 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); | 2571 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); |
2578 | 2572 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 87fdc41..17f3be7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -571,7 +571,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
571 | set { m_LoopSoundSlavePrims = value; } | 571 | set { m_LoopSoundSlavePrims = value; } |
572 | } | 572 | } |
573 | 573 | ||
574 | // The UUID for the Region this Object is in. | 574 | /// <summary> |
575 | /// The UUID for the region this object is in. | ||
576 | /// </summary> | ||
575 | public UUID RegionUUID | 577 | public UUID RegionUUID |
576 | { | 578 | { |
577 | get | 579 | get |
@@ -584,6 +586,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
584 | } | 586 | } |
585 | } | 587 | } |
586 | 588 | ||
589 | /// <summary> | ||
590 | /// The item ID that this object was rezzed from, if applicable. | ||
591 | /// </summary> | ||
592 | /// <remarks> | ||
593 | /// If not applicable will be UUID.Zero | ||
594 | /// </remarks> | ||
595 | public UUID FromItemID { get; set; } | ||
596 | |||
597 | /// <summary> | ||
598 | /// The folder ID that this object was rezzed from, if applicable. | ||
599 | /// </summary> | ||
600 | /// <remarks> | ||
601 | /// If not applicable will be UUID.Zero | ||
602 | /// </remarks> | ||
603 | public UUID FromFolderID { get; set; } | ||
604 | |||
587 | #endregion | 605 | #endregion |
588 | 606 | ||
589 | // ~SceneObjectGroup() | 607 | // ~SceneObjectGroup() |
@@ -646,18 +664,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
646 | } | 664 | } |
647 | } | 665 | } |
648 | 666 | ||
649 | public void SetFromItemID(UUID AssetId) | ||
650 | { | ||
651 | SceneObjectPart[] parts = m_parts.GetArray(); | ||
652 | for (int i = 0; i < parts.Length; i++) | ||
653 | parts[i].FromItemID = AssetId; | ||
654 | } | ||
655 | |||
656 | public UUID GetFromItemID() | ||
657 | { | ||
658 | return m_rootPart.FromItemID; | ||
659 | } | ||
660 | |||
661 | /// <summary> | 667 | /// <summary> |
662 | /// Hooks this object up to the backup event so that it is persisted to the database when the update thread executes. | 668 | /// Hooks this object up to the backup event so that it is persisted to the database when the update thread executes. |
663 | /// </summary> | 669 | /// </summary> |
@@ -2687,6 +2693,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2687 | { | 2693 | { |
2688 | m_rootPart.AttachedPos = pos; | 2694 | m_rootPart.AttachedPos = pos; |
2689 | } | 2695 | } |
2696 | |||
2690 | if (RootPart.GetStatusSandbox()) | 2697 | if (RootPart.GetStatusSandbox()) |
2691 | { | 2698 | { |
2692 | if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10) | 2699 | if (Util.GetDistanceTo(RootPart.StatusSandboxPos, pos) > 10) |
@@ -2697,8 +2704,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2697 | ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false); | 2704 | ChatTypeEnum.DebugChannel, 0x7FFFFFFF, RootPart.AbsolutePosition, Name, UUID, false); |
2698 | } | 2705 | } |
2699 | } | 2706 | } |
2700 | AbsolutePosition = pos; | ||
2701 | 2707 | ||
2708 | AbsolutePosition = pos; | ||
2702 | HasGroupChanged = true; | 2709 | HasGroupChanged = true; |
2703 | } | 2710 | } |
2704 | 2711 | ||
@@ -3270,7 +3277,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3270 | 3277 | ||
3271 | public virtual string ExtraToXmlString() | 3278 | public virtual string ExtraToXmlString() |
3272 | { | 3279 | { |
3273 | return "<ExtraFromItemID>" + GetFromItemID().ToString() + "</ExtraFromItemID>"; | 3280 | return "<ExtraFromItemID>" + FromItemID.ToString() + "</ExtraFromItemID>"; |
3274 | } | 3281 | } |
3275 | 3282 | ||
3276 | public virtual void ExtraFromXmlString(string xmlstr) | 3283 | public virtual void ExtraFromXmlString(string xmlstr) |
@@ -3282,7 +3289,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3282 | UUID uuid = UUID.Zero; | 3289 | UUID uuid = UUID.Zero; |
3283 | UUID.TryParse(id, out uuid); | 3290 | UUID.TryParse(id, out uuid); |
3284 | 3291 | ||
3285 | SetFromItemID(uuid); | 3292 | FromItemID = uuid; |
3286 | } | 3293 | } |
3287 | 3294 | ||
3288 | #endregion | 3295 | #endregion |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 2b1fba0..046553b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -125,12 +125,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
125 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 125 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
126 | 126 | ||
127 | /// <value> | 127 | /// <value> |
128 | /// Is this sop a root part? | 128 | /// Is this a root part? |
129 | /// </value> | 129 | /// </value> |
130 | 130 | /// <remarks> | |
131 | /// This will return true even if the whole object is attached to an avatar. | ||
132 | /// </remarks> | ||
131 | public bool IsRoot | 133 | public bool IsRoot |
132 | { | 134 | { |
133 | get { return ParentGroup.RootPart == this; } | 135 | get { return ParentGroup.RootPart == this; } |
134 | } | 136 | } |
135 | 137 | ||
136 | #region Fields | 138 | #region Fields |
@@ -159,15 +161,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
159 | /// If another thread is simultaneously turning physics off on this part then this refernece could become | 161 | /// If another thread is simultaneously turning physics off on this part then this refernece could become |
160 | /// null at any time. | 162 | /// null at any time. |
161 | /// </remarks> | 163 | /// </remarks> |
162 | public PhysicsActor PhysActor | 164 | public PhysicsActor PhysActor { get; set; } |
163 | { | ||
164 | get { return m_physActor; } | ||
165 | set | ||
166 | { | ||
167 | // m_log.DebugFormat("[SOP]: PhysActor set to {0} for {1} {2}", value, Name, UUID); | ||
168 | m_physActor = value; | ||
169 | } | ||
170 | } | ||
171 | 165 | ||
172 | //Xantor 20080528 Sound stuff: | 166 | //Xantor 20080528 Sound stuff: |
173 | // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. | 167 | // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. |
@@ -187,10 +181,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
187 | public uint TimeStampLastActivity; // Will be used for AutoReturn | 181 | public uint TimeStampLastActivity; // Will be used for AutoReturn |
188 | 182 | ||
189 | public uint TimeStampTerse; | 183 | public uint TimeStampTerse; |
190 | |||
191 | public UUID FromItemID; | ||
192 | |||
193 | public UUID FromFolderID; | ||
194 | 184 | ||
195 | public int STATUS_ROTATE_X; | 185 | public int STATUS_ROTATE_X; |
196 | 186 | ||
@@ -266,7 +256,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
266 | 256 | ||
267 | private bool m_passTouches; | 257 | private bool m_passTouches; |
268 | 258 | ||
269 | private PhysicsActor m_physActor; | ||
270 | protected Vector3 m_acceleration; | 259 | protected Vector3 m_acceleration; |
271 | protected Vector3 m_angularVelocity; | 260 | protected Vector3 m_angularVelocity; |
272 | 261 | ||
@@ -1112,6 +1101,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1112 | } | 1101 | } |
1113 | } | 1102 | } |
1114 | 1103 | ||
1104 | /// <summary> | ||
1105 | /// The parent ID of this part. | ||
1106 | /// </summary> | ||
1107 | /// <remarks> | ||
1108 | /// If this is a root part which is not attached to an avatar then the value will be 0. | ||
1109 | /// If this is a root part which is attached to an avatar then the value is the local id of that avatar. | ||
1110 | /// If this is a child part then the value is the local ID of the root part. | ||
1111 | /// </remarks> | ||
1115 | public uint ParentID | 1112 | public uint ParentID |
1116 | { | 1113 | { |
1117 | get { return _parentID; } | 1114 | get { return _parentID; } |
@@ -1488,40 +1485,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
1488 | if (VolumeDetectActive) | 1485 | if (VolumeDetectActive) |
1489 | isPhantom = false; | 1486 | isPhantom = false; |
1490 | 1487 | ||
1491 | // Added clarification.. since A rigid body is an object that you can kick around, etc. | ||
1492 | bool RigidBody = isPhysical && !isPhantom; | ||
1493 | |||
1494 | // The only time the physics scene shouldn't know about the prim is if it's phantom or an attachment, which is phantom by definition | 1488 | // The only time the physics scene shouldn't know about the prim is if it's phantom or an attachment, which is phantom by definition |
1495 | // or flexible | 1489 | // or flexible |
1496 | if (!isPhantom && !ParentGroup.IsAttachment && !(Shape.PathCurve == (byte)Extrusion.Flexible)) | 1490 | if (!isPhantom && !ParentGroup.IsAttachment && !(Shape.PathCurve == (byte)Extrusion.Flexible)) |
1497 | { | 1491 | { |
1498 | try | 1492 | // Added clarification.. since A rigid body is an object that you can kick around, etc. |
1499 | { | 1493 | bool rigidBody = isPhysical && !isPhantom; |
1500 | PhysActor = ParentGroup.Scene.PhysicsScene.AddPrimShape( | ||
1501 | string.Format("{0}/{1}", Name, UUID), | ||
1502 | Shape, | ||
1503 | AbsolutePosition, | ||
1504 | Scale, | ||
1505 | RotationOffset, | ||
1506 | RigidBody, | ||
1507 | m_localId); | ||
1508 | } | ||
1509 | catch | ||
1510 | { | ||
1511 | m_log.ErrorFormat("[SCENE]: caught exception meshing object {0}. Object set to phantom.", m_uuid); | ||
1512 | PhysActor = null; | ||
1513 | } | ||
1514 | 1494 | ||
1515 | // Basic Physics can also return null as well as an exception catch. | 1495 | PhysicsActor pa = AddToPhysics(rigidBody); |
1516 | PhysicsActor pa = PhysActor; | ||
1517 | 1496 | ||
1518 | if (pa != null) | 1497 | if (pa != null) |
1519 | { | ||
1520 | pa.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info | ||
1521 | pa.SetMaterial(Material); | ||
1522 | DoPhysicsPropertyUpdate(RigidBody, true); | ||
1523 | pa.SetVolumeDetect(VolumeDetectActive ? 1 : 0); | 1498 | pa.SetVolumeDetect(VolumeDetectActive ? 1 : 0); |
1524 | } | ||
1525 | } | 1499 | } |
1526 | } | 1500 | } |
1527 | } | 1501 | } |
@@ -4322,41 +4296,36 @@ namespace OpenSim.Region.Framework.Scenes | |||
4322 | if (ParentGroup.Scene == null) | 4296 | if (ParentGroup.Scene == null) |
4323 | return; | 4297 | return; |
4324 | 4298 | ||
4325 | if (ParentGroup.Scene.CollidablePrims && PhysActor == null) | 4299 | if (ParentGroup.Scene.CollidablePrims && pa == null) |
4326 | { | 4300 | { |
4327 | // It's not phantom anymore. So make sure the physics engine get's knowledge of it | 4301 | pa = AddToPhysics(UsePhysics); |
4328 | PhysActor = ParentGroup.Scene.PhysicsScene.AddPrimShape( | ||
4329 | string.Format("{0}/{1}", Name, UUID), | ||
4330 | Shape, | ||
4331 | AbsolutePosition, | ||
4332 | Scale, | ||
4333 | RotationOffset, | ||
4334 | UsePhysics, | ||
4335 | m_localId); | ||
4336 | 4302 | ||
4337 | PhysActor.SetMaterial(Material); | 4303 | if (pa != null) |
4338 | DoPhysicsPropertyUpdate(UsePhysics, true); | ||
4339 | |||
4340 | if (!ParentGroup.IsDeleted) | ||
4341 | { | 4304 | { |
4342 | if (LocalId == ParentGroup.RootPart.LocalId) | 4305 | pa.SetMaterial(Material); |
4306 | DoPhysicsPropertyUpdate(UsePhysics, true); | ||
4307 | |||
4308 | if (!ParentGroup.IsDeleted) | ||
4343 | { | 4309 | { |
4344 | ParentGroup.CheckSculptAndLoad(); | 4310 | if (LocalId == ParentGroup.RootPart.LocalId) |
4311 | { | ||
4312 | ParentGroup.CheckSculptAndLoad(); | ||
4313 | } | ||
4314 | } | ||
4315 | |||
4316 | if ( | ||
4317 | ((AggregateScriptEvents & scriptEvents.collision) != 0) || | ||
4318 | ((AggregateScriptEvents & scriptEvents.collision_end) != 0) || | ||
4319 | ((AggregateScriptEvents & scriptEvents.collision_start) != 0) || | ||
4320 | ((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) || | ||
4321 | ((AggregateScriptEvents & scriptEvents.land_collision) != 0) || | ||
4322 | ((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) || | ||
4323 | (CollisionSound != UUID.Zero) | ||
4324 | ) | ||
4325 | { | ||
4326 | pa.OnCollisionUpdate += PhysicsCollision; | ||
4327 | pa.SubscribeEvents(1000); | ||
4345 | } | 4328 | } |
4346 | } | ||
4347 | |||
4348 | if ( | ||
4349 | ((AggregateScriptEvents & scriptEvents.collision) != 0) || | ||
4350 | ((AggregateScriptEvents & scriptEvents.collision_end) != 0) || | ||
4351 | ((AggregateScriptEvents & scriptEvents.collision_start) != 0) || | ||
4352 | ((AggregateScriptEvents & scriptEvents.land_collision_start) != 0) || | ||
4353 | ((AggregateScriptEvents & scriptEvents.land_collision) != 0) || | ||
4354 | ((AggregateScriptEvents & scriptEvents.land_collision_end) != 0) || | ||
4355 | (CollisionSound != UUID.Zero) | ||
4356 | ) | ||
4357 | { | ||
4358 | PhysActor.OnCollisionUpdate += PhysicsCollision; | ||
4359 | PhysActor.SubscribeEvents(1000); | ||
4360 | } | 4329 | } |
4361 | } | 4330 | } |
4362 | else // it already has a physical representation | 4331 | else // it already has a physical representation |
@@ -4418,7 +4387,52 @@ namespace OpenSim.Region.Framework.Scenes | |||
4418 | } | 4387 | } |
4419 | 4388 | ||
4420 | /// <summary> | 4389 | /// <summary> |
4421 | /// This removes the part from physics | 4390 | /// Adds this part to the physics scene. |
4391 | /// </summary> | ||
4392 | /// <remarks>This method also sets the PhysActor property.</remarks> | ||
4393 | /// <param name="rigidBody">Add this prim with a rigid body.</param> | ||
4394 | /// <returns> | ||
4395 | /// The physics actor. null if there was a failure. | ||
4396 | /// </returns> | ||
4397 | private PhysicsActor AddToPhysics(bool rigidBody) | ||
4398 | { | ||
4399 | PhysicsActor pa; | ||
4400 | |||
4401 | try | ||
4402 | { | ||
4403 | pa = ParentGroup.Scene.PhysicsScene.AddPrimShape( | ||
4404 | string.Format("{0}/{1}", Name, UUID), | ||
4405 | Shape, | ||
4406 | AbsolutePosition, | ||
4407 | Scale, | ||
4408 | RotationOffset, | ||
4409 | rigidBody, | ||
4410 | m_localId); | ||
4411 | } | ||
4412 | catch | ||
4413 | { | ||
4414 | m_log.ErrorFormat("[SCENE]: caught exception meshing object {0}. Object set to phantom.", m_uuid); | ||
4415 | pa = null; | ||
4416 | } | ||
4417 | |||
4418 | // FIXME: Ideally we wouldn't set the property here to reduce situations where threads changing physical | ||
4419 | // properties can stop on each other. However, DoPhysicsPropertyUpdate() currently relies on PhysActor | ||
4420 | // being set. | ||
4421 | PhysActor = pa; | ||
4422 | |||
4423 | // Basic Physics can also return null as well as an exception catch. | ||
4424 | if (pa != null) | ||
4425 | { | ||
4426 | pa.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info | ||
4427 | pa.SetMaterial(Material); | ||
4428 | DoPhysicsPropertyUpdate(rigidBody, true); | ||
4429 | } | ||
4430 | |||
4431 | return pa; | ||
4432 | } | ||
4433 | |||
4434 | /// <summary> | ||
4435 | /// This removes the part from the physics scene. | ||
4422 | /// </summary> | 4436 | /// </summary> |
4423 | /// <remarks> | 4437 | /// <remarks> |
4424 | /// This isn't the same as turning off physical, since even without being physical the prim has a physics | 4438 | /// This isn't the same as turning off physical, since even without being physical the prim has a physics |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 19dab32..a21c66f 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -3514,6 +3514,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
3514 | }); | 3514 | }); |
3515 | } | 3515 | } |
3516 | 3516 | ||
3517 | /// <summary> | ||
3518 | /// Gets the mass. | ||
3519 | /// </summary> | ||
3520 | /// <returns> | ||
3521 | /// The mass. | ||
3522 | /// </returns> | ||
3523 | public float GetMass() | ||
3524 | { | ||
3525 | PhysicsActor pa = PhysicsActor; | ||
3526 | |||
3527 | if (pa != null) | ||
3528 | return pa.Mass; | ||
3529 | else | ||
3530 | return 0; | ||
3531 | } | ||
3532 | |||
3517 | internal void PushForce(Vector3 impulse) | 3533 | internal void PushForce(Vector3 impulse) |
3518 | { | 3534 | { |
3519 | if (PhysicsActor != null) | 3535 | if (PhysicsActor != null) |