diff options
Diffstat (limited to 'OpenSim/Region/Environment/Scenes')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | 58 | ||||
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 62 |
2 files changed, 120 insertions, 0 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index fabf276..cc99929 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -1466,6 +1466,64 @@ namespace OpenSim.Region.Environment.Scenes | |||
1466 | } | 1466 | } |
1467 | } | 1467 | } |
1468 | 1468 | ||
1469 | public void applyAngularImpulse(PhysicsVector impulse) | ||
1470 | { | ||
1471 | // We check if rootpart is null here because scripts don't delete if you delete the host. | ||
1472 | // This means that unfortunately, we can pass a null physics actor to Simulate! | ||
1473 | // Make sure we don't do that! | ||
1474 | SceneObjectPart rootpart = m_rootPart; | ||
1475 | if (rootpart != null) | ||
1476 | { | ||
1477 | if (rootpart.PhysActor != null) | ||
1478 | { | ||
1479 | if (!IsAttachment) | ||
1480 | { | ||
1481 | rootpart.PhysActor.AddAngularForce(impulse, true); | ||
1482 | m_scene.PhysicsScene.AddPhysicsActorTaint(rootpart.PhysActor); | ||
1483 | } | ||
1484 | } | ||
1485 | } | ||
1486 | } | ||
1487 | |||
1488 | public void setAngularImpulse(PhysicsVector impulse) | ||
1489 | { | ||
1490 | // We check if rootpart is null here because scripts don't delete if you delete the host. | ||
1491 | // This means that unfortunately, we can pass a null physics actor to Simulate! | ||
1492 | // Make sure we don't do that! | ||
1493 | SceneObjectPart rootpart = m_rootPart; | ||
1494 | if (rootpart != null) | ||
1495 | { | ||
1496 | if (rootpart.PhysActor != null) | ||
1497 | { | ||
1498 | if (!IsAttachment) | ||
1499 | { | ||
1500 | rootpart.PhysActor.Torque = impulse; | ||
1501 | m_scene.PhysicsScene.AddPhysicsActorTaint(rootpart.PhysActor); | ||
1502 | } | ||
1503 | } | ||
1504 | } | ||
1505 | } | ||
1506 | |||
1507 | public Vector3 GetTorque() | ||
1508 | { | ||
1509 | // We check if rootpart is null here because scripts don't delete if you delete the host. | ||
1510 | // This means that unfortunately, we can pass a null physics actor to Simulate! | ||
1511 | // Make sure we don't do that! | ||
1512 | SceneObjectPart rootpart = m_rootPart; | ||
1513 | if (rootpart != null) | ||
1514 | { | ||
1515 | if (rootpart.PhysActor != null) | ||
1516 | { | ||
1517 | if (!IsAttachment) | ||
1518 | { | ||
1519 | PhysicsVector torque = rootpart.PhysActor.Torque; | ||
1520 | return new Vector3(torque.X, torque.Y, torque.Z); | ||
1521 | } | ||
1522 | } | ||
1523 | } | ||
1524 | return Vector3.Zero; | ||
1525 | } | ||
1526 | |||
1469 | public void moveToTarget(Vector3 target, float tau) | 1527 | public void moveToTarget(Vector3 target, float tau) |
1470 | { | 1528 | { |
1471 | SceneObjectPart rootpart = m_rootPart; | 1529 | SceneObjectPart rootpart = m_rootPart; |
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index efc9289..5a43df6 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -1180,6 +1180,68 @@ if (m_shape != null) { | |||
1180 | } | 1180 | } |
1181 | } | 1181 | } |
1182 | 1182 | ||
1183 | |||
1184 | /// <summary> | ||
1185 | /// hook to the physics scene to apply angular impulse | ||
1186 | /// This is sent up to the group, which then finds the root prim | ||
1187 | /// and applies the force on the root prim of the group | ||
1188 | /// </summary> | ||
1189 | /// <param name="impulsei">Vector force</param> | ||
1190 | /// <param name="localGlobalTF">true for the local frame, false for the global frame</param> | ||
1191 | public void ApplyAngularImpulse(Vector3 impulsei, bool localGlobalTF) | ||
1192 | { | ||
1193 | PhysicsVector impulse = new PhysicsVector(impulsei.X, impulsei.Y, impulsei.Z); | ||
1194 | |||
1195 | if (localGlobalTF) | ||
1196 | { | ||
1197 | Quaternion grot = GetWorldRotation(); | ||
1198 | Quaternion AXgrot = grot; | ||
1199 | Vector3 AXimpulsei = impulsei; | ||
1200 | Vector3 newimpulse = AXimpulsei * AXgrot; | ||
1201 | impulse = new PhysicsVector(newimpulse.X, newimpulse.Y, newimpulse.Z); | ||
1202 | } | ||
1203 | |||
1204 | if (m_parentGroup != null) | ||
1205 | { | ||
1206 | m_parentGroup.applyAngularImpulse(impulse); | ||
1207 | } | ||
1208 | } | ||
1209 | |||
1210 | /// <summary> | ||
1211 | /// hook to the physics scene to apply angular impulse | ||
1212 | /// This is sent up to the group, which then finds the root prim | ||
1213 | /// and applies the force on the root prim of the group | ||
1214 | /// </summary> | ||
1215 | /// <param name="impulsei">Vector force</param> | ||
1216 | /// <param name="localGlobalTF">true for the local frame, false for the global frame</param> | ||
1217 | public void SetAngularImpulse(Vector3 impulsei, bool localGlobalTF) | ||
1218 | { | ||
1219 | PhysicsVector impulse = new PhysicsVector(impulsei.X, impulsei.Y, impulsei.Z); | ||
1220 | |||
1221 | if (localGlobalTF) | ||
1222 | { | ||
1223 | Quaternion grot = GetWorldRotation(); | ||
1224 | Quaternion AXgrot = grot; | ||
1225 | Vector3 AXimpulsei = impulsei; | ||
1226 | Vector3 newimpulse = AXimpulsei * AXgrot; | ||
1227 | impulse = new PhysicsVector(newimpulse.X, newimpulse.Y, newimpulse.Z); | ||
1228 | } | ||
1229 | |||
1230 | if (m_parentGroup != null) | ||
1231 | { | ||
1232 | m_parentGroup.setAngularImpulse(impulse); | ||
1233 | } | ||
1234 | } | ||
1235 | |||
1236 | public Vector3 GetTorque() | ||
1237 | { | ||
1238 | if (m_parentGroup != null) | ||
1239 | { | ||
1240 | m_parentGroup.GetTorque(); | ||
1241 | } | ||
1242 | return Vector3.Zero; | ||
1243 | } | ||
1244 | |||
1183 | /// <summary> | 1245 | /// <summary> |
1184 | /// Apply physics to this part. | 1246 | /// Apply physics to this part. |
1185 | /// </summary> | 1247 | /// </summary> |