aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorTeravus Ovares2008-12-14 14:30:28 +0000
committerTeravus Ovares2008-12-14 14:30:28 +0000
commit8ad6f575ebc23f0c7b282b9ec2543bce26287e54 (patch)
treeab424abb19a070cce386a5013b3d5452dbdf9bc2
parentAdded ATTACH_HUD_* constants fixes Mantis #2823 (diff)
downloadopensim-SC-8ad6f575ebc23f0c7b282b9ec2543bce26287e54.zip
opensim-SC-8ad6f575ebc23f0c7b282b9ec2543bce26287e54.tar.gz
opensim-SC-8ad6f575ebc23f0c7b282b9ec2543bce26287e54.tar.bz2
opensim-SC-8ad6f575ebc23f0c7b282b9ec2543bce26287e54.tar.xz
* Implements the torque/Rotational Impulse methods in the PhysicsAPI and the ODEPlugin and pipes them to their respective LSL method.
* NBody will need to be updated, this is an API change. Torque property and AddAngularForce
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs58
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.cs62
-rw-r--r--OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs10
-rw-r--r--OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs8
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsActor.cs13
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODECharacter.cs11
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs83
-rw-r--r--OpenSim/Region/Physics/POSPlugin/POSCharacter.cs10
-rw-r--r--OpenSim/Region/Physics/POSPlugin/POSPrim.cs10
-rw-r--r--OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs18
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs12
11 files changed, 287 insertions, 8 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>
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs
index 9954798..013c9cf 100644
--- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs
+++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs
@@ -381,6 +381,12 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
381 set { _velocity = value; } 381 set { _velocity = value; }
382 } 382 }
383 383
384 public override PhysicsVector Torque
385 {
386 get { return PhysicsVector.Zero; }
387 set { return; }
388 }
389
384 public override float CollisionScore 390 public override float CollisionScore
385 { 391 {
386 get { return 0f; } 392 get { return 0f; }
@@ -426,6 +432,10 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
426 { 432 {
427 } 433 }
428 434
435 public override void AddAngularForce(PhysicsVector force, bool pushforce)
436 {
437 }
438
429 public override void SetMomentum(PhysicsVector momentum) 439 public override void SetMomentum(PhysicsVector momentum)
430 { 440 {
431 } 441 }
diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs
index 20c556f..4f1afdd 100644
--- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs
+++ b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs
@@ -1134,6 +1134,14 @@ namespace OpenSim.Region.Physics.BulletXPlugin
1134 public override void AddForce(PhysicsVector force, bool pushforce) 1134 public override void AddForce(PhysicsVector force, bool pushforce)
1135 { 1135 {
1136 } 1136 }
1137 public override PhysicsVector Torque
1138 {
1139 get { return PhysicsVector.Zero; }
1140 set { return; }
1141 }
1142 public override void AddAngularForce(PhysicsVector force, bool pushforce)
1143 {
1144 }
1137 1145
1138 public override void SetMomentum(PhysicsVector momentum) 1146 public override void SetMomentum(PhysicsVector momentum)
1139 { 1147 {
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
index 3c094ad..fd02057 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -185,6 +185,7 @@ namespace OpenSim.Region.Physics.Manager
185 public abstract PhysicsVector GeometricCenter { get; } 185 public abstract PhysicsVector GeometricCenter { get; }
186 public abstract PhysicsVector CenterOfMass { get; } 186 public abstract PhysicsVector CenterOfMass { get; }
187 public abstract PhysicsVector Velocity { get; set; } 187 public abstract PhysicsVector Velocity { get; set; }
188 public abstract PhysicsVector Torque { get; set; }
188 public abstract float CollisionScore { get; set;} 189 public abstract float CollisionScore { get; set;}
189 public abstract PhysicsVector Acceleration { get; } 190 public abstract PhysicsVector Acceleration { get; }
190 public abstract Quaternion Orientation { get; set; } 191 public abstract Quaternion Orientation { get; set; }
@@ -204,6 +205,7 @@ namespace OpenSim.Region.Physics.Manager
204 public abstract bool PIDActive { set;} 205 public abstract bool PIDActive { set;}
205 public abstract float PIDTau { set; } 206 public abstract float PIDTau { set; }
206 public abstract void AddForce(PhysicsVector force, bool pushforce); 207 public abstract void AddForce(PhysicsVector force, bool pushforce);
208 public abstract void AddAngularForce(PhysicsVector force, bool pushforce);
207 public abstract void SetMomentum(PhysicsVector momentum); 209 public abstract void SetMomentum(PhysicsVector momentum);
208 public abstract void SubscribeEvents(int ms); 210 public abstract void SubscribeEvents(int ms);
209 public abstract void UnSubscribeEvents(); 211 public abstract void UnSubscribeEvents();
@@ -331,6 +333,12 @@ namespace OpenSim.Region.Physics.Manager
331 set { return; } 333 set { return; }
332 } 334 }
333 335
336 public override PhysicsVector Torque
337 {
338 get { return PhysicsVector.Zero; }
339 set { return; }
340 }
341
334 public override float CollisionScore 342 public override float CollisionScore
335 { 343 {
336 get { return 0f; } 344 get { return 0f; }
@@ -404,6 +412,11 @@ namespace OpenSim.Region.Physics.Manager
404 { 412 {
405 } 413 }
406 414
415 public override void AddAngularForce(PhysicsVector force, bool pushforce)
416 {
417
418 }
419
407 public override PhysicsVector RotationalVelocity 420 public override PhysicsVector RotationalVelocity
408 { 421 {
409 get { return PhysicsVector.Zero; } 422 get { return PhysicsVector.Zero; }
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index de09691..f2906cf 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -605,6 +605,12 @@ namespace OpenSim.Region.Physics.OdePlugin
605 } 605 }
606 } 606 }
607 607
608 public override PhysicsVector Torque
609 {
610 get { return PhysicsVector.Zero; }
611 set { return; }
612 }
613
608 public override float CollisionScore 614 public override float CollisionScore
609 { 615 {
610 get { return 0f; } 616 get { return 0f; }
@@ -665,6 +671,11 @@ namespace OpenSim.Region.Physics.OdePlugin
665 //m_lastUpdateSent = false; 671 //m_lastUpdateSent = false;
666 } 672 }
667 673
674 public override void AddAngularForce(PhysicsVector force, bool pushforce)
675 {
676
677 }
678
668 /// <summary> 679 /// <summary>
669 /// After all of the forces add up with 'add force' we apply them with doForce 680 /// After all of the forces add up with 'add force' we apply them with doForce
670 /// </summary> 681 /// </summary>
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index eeef893..6f5abfa 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -47,6 +47,7 @@ namespace OpenSim.Region.Physics.OdePlugin
47 47
48 public PhysicsVector _position; 48 public PhysicsVector _position;
49 private PhysicsVector _velocity; 49 private PhysicsVector _velocity;
50 private PhysicsVector _torque = new PhysicsVector(0,0,0);
50 private PhysicsVector m_lastVelocity = new PhysicsVector(0.0f, 0.0f, 0.0f); 51 private PhysicsVector m_lastVelocity = new PhysicsVector(0.0f, 0.0f, 0.0f);
51 private PhysicsVector m_lastposition = new PhysicsVector(0.0f, 0.0f, 0.0f); 52 private PhysicsVector m_lastposition = new PhysicsVector(0.0f, 0.0f, 0.0f);
52 private PhysicsVector m_rotationalVelocity; 53 private PhysicsVector m_rotationalVelocity;
@@ -56,7 +57,8 @@ namespace OpenSim.Region.Physics.OdePlugin
56 private Quaternion _orientation; 57 private Quaternion _orientation;
57 private PhysicsVector m_taintposition; 58 private PhysicsVector m_taintposition;
58 private PhysicsVector m_taintsize; 59 private PhysicsVector m_taintsize;
59 private PhysicsVector m_taintVelocity = PhysicsVector.Zero; 60 private PhysicsVector m_taintVelocity = new PhysicsVector(0, 0, 0);
61 private PhysicsVector m_taintTorque = new PhysicsVector(0, 0, 0);
60 private Quaternion m_taintrot; 62 private Quaternion m_taintrot;
61 private PhysicsVector m_angularlock = new PhysicsVector(1f, 1f, 1f); 63 private PhysicsVector m_angularlock = new PhysicsVector(1f, 1f, 1f);
62 private PhysicsVector m_taintAngularLock = new PhysicsVector(1f, 1f, 1f); 64 private PhysicsVector m_taintAngularLock = new PhysicsVector(1f, 1f, 1f);
@@ -102,8 +104,10 @@ namespace OpenSim.Region.Physics.OdePlugin
102 private CollisionLocker ode; 104 private CollisionLocker ode;
103 105
104 private bool m_taintforce = false; 106 private bool m_taintforce = false;
107 private bool m_taintaddangularforce = false;
105 private PhysicsVector m_force = new PhysicsVector(0.0f, 0.0f, 0.0f); 108 private PhysicsVector m_force = new PhysicsVector(0.0f, 0.0f, 0.0f);
106 private List<PhysicsVector> m_forcelist = new List<PhysicsVector>(); 109 private List<PhysicsVector> m_forcelist = new List<PhysicsVector>();
110 private List<PhysicsVector> m_angularforcelist = new List<PhysicsVector>();
107 111
108 private IMesh _mesh; 112 private IMesh _mesh;
109 private PrimitiveBaseShape _pbs; 113 private PrimitiveBaseShape _pbs;
@@ -838,6 +842,12 @@ namespace OpenSim.Region.Physics.OdePlugin
838 if (m_taintforce) 842 if (m_taintforce)
839 changeAddForce(timestep); 843 changeAddForce(timestep);
840 844
845 if (m_taintaddangularforce)
846 changeAddAngularForce(timestep);
847
848 if (!m_taintTorque.IsIdentical(PhysicsVector.Zero, 0.001f))
849 changeSetTorque(timestep);
850
841 if (m_taintdisable) 851 if (m_taintdisable)
842 changedisable(timestep); 852 changedisable(timestep);
843 853
@@ -2058,6 +2068,49 @@ namespace OpenSim.Region.Physics.OdePlugin
2058 2068
2059 } 2069 }
2060 2070
2071
2072
2073 public void changeSetTorque(float timestamp)
2074 {
2075 if (!m_isSelected)
2076 {
2077 if (IsPhysical && Body != IntPtr.Zero)
2078 {
2079 d.BodySetTorque(Body, m_taintTorque.X, m_taintTorque.Y, m_taintTorque.Z);
2080 }
2081 }
2082
2083 m_taintTorque = new PhysicsVector(0, 0, 0);
2084 }
2085
2086 public void changeAddAngularForce(float timestamp)
2087 {
2088 if (!m_isSelected)
2089 {
2090 lock (m_angularforcelist)
2091 {
2092 //m_log.Info("[PHYSICS]: dequeing forcelist");
2093 if (IsPhysical)
2094 {
2095 PhysicsVector iforce = new PhysicsVector();
2096 for (int i = 0; i < m_angularforcelist.Count; i++)
2097 {
2098 iforce = iforce + (m_angularforcelist[i] * 100);
2099 }
2100 d.BodyEnable(Body);
2101 d.BodyAddTorque(Body, iforce.X, iforce.Y, iforce.Z);
2102
2103 }
2104 m_angularforcelist.Clear();
2105 }
2106
2107 m_collisionscore = 0;
2108 m_interpenetrationcount = 0;
2109 }
2110
2111 m_taintaddangularforce = false;
2112 }
2113
2061 private void changevelocity(float timestep) 2114 private void changevelocity(float timestep)
2062 { 2115 {
2063 if (!m_isSelected) 2116 if (!m_isSelected)
@@ -2070,7 +2123,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2070 d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); 2123 d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z);
2071 } 2124 }
2072 } 2125 }
2073 2126
2074 //resetCollisionAccounting(); 2127 //resetCollisionAccounting();
2075 } 2128 }
2076 m_taintVelocity = PhysicsVector.Zero; 2129 m_taintVelocity = PhysicsVector.Zero;
@@ -2216,6 +2269,23 @@ namespace OpenSim.Region.Physics.OdePlugin
2216 } 2269 }
2217 } 2270 }
2218 2271
2272 public override PhysicsVector Torque
2273 {
2274 get
2275 {
2276 if (!m_isphysical || Body == IntPtr.Zero)
2277 return new PhysicsVector(0,0,0);
2278
2279 return _torque;
2280 }
2281
2282 set
2283 {
2284 m_taintTorque = value;
2285 _parent_scene.AddPhysicsActorTaint(this);
2286 }
2287 }
2288
2219 public override float CollisionScore 2289 public override float CollisionScore
2220 { 2290 {
2221 get { return m_collisionscore; } 2291 get { return m_collisionscore; }
@@ -2252,6 +2322,12 @@ namespace OpenSim.Region.Physics.OdePlugin
2252 //m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString()); 2322 //m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString());
2253 } 2323 }
2254 2324
2325 public override void AddAngularForce(PhysicsVector force, bool pushforce)
2326 {
2327 m_angularforcelist.Add(force);
2328 m_taintaddangularforce = true;
2329 }
2330
2255 public override PhysicsVector RotationalVelocity 2331 public override PhysicsVector RotationalVelocity
2256 { 2332 {
2257 get 2333 get
@@ -2323,7 +2399,8 @@ namespace OpenSim.Region.Physics.OdePlugin
2323 d.Quaternion ori = d.BodyGetQuaternion(Body); 2399 d.Quaternion ori = d.BodyGetQuaternion(Body);
2324 d.Vector3 vel = d.BodyGetLinearVel(Body); 2400 d.Vector3 vel = d.BodyGetLinearVel(Body);
2325 d.Vector3 rotvel = d.BodyGetAngularVel(Body); 2401 d.Vector3 rotvel = d.BodyGetAngularVel(Body);
2326 2402 d.Vector3 torque = d.BodyGetTorque(Body);
2403 _torque.setValues(torque.X, torque.Y, torque.Z);
2327 PhysicsVector l_position = new PhysicsVector(); 2404 PhysicsVector l_position = new PhysicsVector();
2328 2405
2329 // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) 2406 // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!)
diff --git a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
index ab66d4c..4230a57 100644
--- a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
+++ b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs
@@ -211,6 +211,12 @@ namespace OpenSim.Region.Physics.POSPlugin
211 set { _target_velocity = value; } 211 set { _target_velocity = value; }
212 } 212 }
213 213
214 public override PhysicsVector Torque
215 {
216 get { return PhysicsVector.Zero; }
217 set { return; }
218 }
219
214 public override float CollisionScore 220 public override float CollisionScore
215 { 221 {
216 get { return 0f; } 222 get { return 0f; }
@@ -255,6 +261,10 @@ namespace OpenSim.Region.Physics.POSPlugin
255 { 261 {
256 } 262 }
257 263
264 public override void AddAngularForce(PhysicsVector force, bool pushforce)
265 {
266 }
267
258 public override void SetMomentum(PhysicsVector momentum) 268 public override void SetMomentum(PhysicsVector momentum)
259 { 269 {
260 } 270 }
diff --git a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
index fdd095f..bf96c35 100644
--- a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
+++ b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs
@@ -211,6 +211,16 @@ namespace OpenSim.Region.Physics.POSPlugin
211 { 211 {
212 } 212 }
213 213
214 public override void AddAngularForce(PhysicsVector force, bool pushforce)
215 {
216 }
217
218 public override PhysicsVector Torque
219 {
220 get { return PhysicsVector.Zero; }
221 set { return; }
222 }
223
214 public override void SetMomentum(PhysicsVector momentum) 224 public override void SetMomentum(PhysicsVector momentum)
215 { 225 {
216 } 226 }
diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
index 940c9bc..6502827 100644
--- a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
+++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs
@@ -417,6 +417,14 @@ namespace OpenSim.Region.Physics.PhysXPlugin
417 public override void AddForce(PhysicsVector force, bool pushforce) 417 public override void AddForce(PhysicsVector force, bool pushforce)
418 { 418 {
419 } 419 }
420 public override PhysicsVector Torque
421 {
422 get { return PhysicsVector.Zero; }
423 set { return; }
424 }
425 public override void AddAngularForce(PhysicsVector force, bool pushforce)
426 {
427 }
420 428
421 public override void link(PhysicsActor obj) 429 public override void link(PhysicsActor obj)
422 { 430 {
@@ -625,6 +633,12 @@ namespace OpenSim.Region.Physics.PhysXPlugin
625 set { _velocity = value; } 633 set { _velocity = value; }
626 } 634 }
627 635
636 public override PhysicsVector Torque
637 {
638 get { return PhysicsVector.Zero; }
639 set { return; }
640 }
641
628 public override float CollisionScore 642 public override float CollisionScore
629 { 643 {
630 get { return 0f; } 644 get { return 0f; }
@@ -666,6 +680,10 @@ namespace OpenSim.Region.Physics.PhysXPlugin
666 { 680 {
667 } 681 }
668 682
683 public override void AddAngularForce(PhysicsVector force, bool pushforce)
684 {
685 }
686
669 public override void SetMomentum(PhysicsVector momentum) 687 public override void SetMomentum(PhysicsVector momentum)
670 { 688 {
671 } 689 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 68b92a4..84def93 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1951,26 +1951,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1951 public void llApplyRotationalImpulse(LSL_Vector force, int local) 1951 public void llApplyRotationalImpulse(LSL_Vector force, int local)
1952 { 1952 {
1953 m_host.AddScriptLPS(1); 1953 m_host.AddScriptLPS(1);
1954 NotImplemented("llApplyRotationalImpulse"); 1954 m_host.ApplyAngularImpulse(new Vector3((float)force.x, (float)force.y, (float)force.z), local != 0);
1955
1955 } 1956 }
1956 1957
1957 public void llSetTorque(LSL_Vector torque, int local) 1958 public void llSetTorque(LSL_Vector torque, int local)
1958 { 1959 {
1959 m_host.AddScriptLPS(1); 1960 m_host.AddScriptLPS(1);
1960 NotImplemented("llSetTorque"); 1961 m_host.SetAngularImpulse(new Vector3((float)torque.x, (float)torque.y, (float)torque.z), local != 0);
1961 } 1962 }
1962 1963
1963 public LSL_Vector llGetTorque() 1964 public LSL_Vector llGetTorque()
1964 { 1965 {
1965 m_host.AddScriptLPS(1); 1966 m_host.AddScriptLPS(1);
1966 NotImplemented("llGetTorque"); 1967 Vector3 torque = m_host.GetTorque();
1967 return new LSL_Vector(); 1968 return new LSL_Vector(torque.X,torque.Y,torque.Z);
1968 } 1969 }
1969 1970
1970 public void llSetForceAndTorque(LSL_Vector force, LSL_Vector torque, int local) 1971 public void llSetForceAndTorque(LSL_Vector force, LSL_Vector torque, int local)
1971 { 1972 {
1972 m_host.AddScriptLPS(1); 1973 m_host.AddScriptLPS(1);
1973 NotImplemented("llSetForceAndTorque"); 1974 llSetForce(force, local);
1975 llSetTorque(torque, local);
1974 } 1976 }
1975 1977
1976 public LSL_Vector llGetVel() 1978 public LSL_Vector llGetVel()