diff options
author | Robert Adams | 2013-01-09 22:45:01 -0800 |
---|---|---|
committer | Robert Adams | 2013-01-11 16:47:20 -0800 |
commit | 93adc4cb6689b156db4db315d44b5ba0ddcd65ac (patch) | |
tree | 0068e2e8bb2721f6f33e622ebb6f7535eb843518 /OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |
parent | Fix exception reporting in SceneObjectPart so it logs what the exception is r... (diff) | |
download | opensim-SC-93adc4cb6689b156db4db315d44b5ba0ddcd65ac.zip opensim-SC-93adc4cb6689b156db4db315d44b5ba0ddcd65ac.tar.gz opensim-SC-93adc4cb6689b156db4db315d44b5ba0ddcd65ac.tar.bz2 opensim-SC-93adc4cb6689b156db4db315d44b5ba0ddcd65ac.tar.xz |
BulletSim: Add IsSelected attribute to physical objects. Have vehicles check to see if physical before trying to step. Replace vehicle gravity application. Previously relying on Bullet to apply gravity but since vehicles over-ride the velocity calculation, gravity never had a chance to accelerate the body down. Added AddForceImpulse as well as AddForce for those who need to apply immediate velocity updates. Use the impulse to apply the linear motion.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 81 |
1 files changed, 61 insertions, 20 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 50ba343..02d06b4 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -204,6 +204,10 @@ public sealed class BSPrim : BSPhysObject | |||
204 | } | 204 | } |
205 | } | 205 | } |
206 | } | 206 | } |
207 | public override bool IsSelected | ||
208 | { | ||
209 | get { return _isSelected; } | ||
210 | } | ||
207 | public override void CrossingFailure() { return; } | 211 | public override void CrossingFailure() { return; } |
208 | 212 | ||
209 | // link me to the specified parent | 213 | // link me to the specified parent |
@@ -1153,33 +1157,70 @@ public sealed class BSPrim : BSPhysObject | |||
1153 | // This added force will only last the next simulation tick. | 1157 | // This added force will only last the next simulation tick. |
1154 | public void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) { | 1158 | public void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) { |
1155 | // for an object, doesn't matter if force is a pushforce or not | 1159 | // for an object, doesn't matter if force is a pushforce or not |
1156 | if (!IsStatic && force.IsFinite()) | 1160 | if (!IsStatic) |
1157 | { | 1161 | { |
1158 | float magnitude = force.Length(); | 1162 | if (force.IsFinite()) |
1159 | if (magnitude > BSParam.MaxAddForceMagnitude) | ||
1160 | { | 1163 | { |
1161 | // Force has a limit | 1164 | float magnitude = force.Length(); |
1162 | force = force / magnitude * BSParam.MaxAddForceMagnitude; | 1165 | if (magnitude > BSParam.MaxAddForceMagnitude) |
1163 | } | 1166 | { |
1167 | // Force has a limit | ||
1168 | force = force / magnitude * BSParam.MaxAddForceMagnitude; | ||
1169 | } | ||
1164 | 1170 | ||
1165 | OMV.Vector3 addForce = force; | 1171 | OMV.Vector3 addForce = force; |
1166 | // DetailLog("{0},BSPrim.addForce,call,force={1}", LocalID, addForce); | 1172 | // DetailLog("{0},BSPrim.addForce,call,force={1}", LocalID, addForce); |
1167 | 1173 | ||
1168 | PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddForce", delegate() | 1174 | PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddForce", delegate() |
1169 | { | ||
1170 | // Bullet adds this central force to the total force for this tick | ||
1171 | DetailLog("{0},BSPrim.addForce,taint,force={1}", LocalID, addForce); | ||
1172 | if (PhysBody.HasPhysicalBody) | ||
1173 | { | 1175 | { |
1174 | PhysicsScene.PE.ApplyCentralForce(PhysBody, addForce); | 1176 | // Bullet adds this central force to the total force for this tick |
1175 | ActivateIfPhysical(false); | 1177 | DetailLog("{0},BSPrim.addForce,taint,force={1}", LocalID, addForce); |
1176 | } | 1178 | if (PhysBody.HasPhysicalBody) |
1177 | }); | 1179 | { |
1180 | PhysicsScene.PE.ApplyCentralForce(PhysBody, addForce); | ||
1181 | ActivateIfPhysical(false); | ||
1182 | } | ||
1183 | }); | ||
1184 | } | ||
1185 | else | ||
1186 | { | ||
1187 | m_log.WarnFormat("{0}: AddForce: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID); | ||
1188 | return; | ||
1189 | } | ||
1178 | } | 1190 | } |
1179 | else | 1191 | } |
1192 | |||
1193 | public void AddForceImpulse(OMV.Vector3 impulse, bool pushforce, bool inTaintTime) { | ||
1194 | // for an object, doesn't matter if force is a pushforce or not | ||
1195 | if (!IsStatic) | ||
1180 | { | 1196 | { |
1181 | m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID); | 1197 | if (impulse.IsFinite()) |
1182 | return; | 1198 | { |
1199 | float magnitude = impulse.Length(); | ||
1200 | if (magnitude > BSParam.MaxAddForceMagnitude) | ||
1201 | { | ||
1202 | // Force has a limit | ||
1203 | impulse = impulse / magnitude * BSParam.MaxAddForceMagnitude; | ||
1204 | } | ||
1205 | |||
1206 | // DetailLog("{0},BSPrim.addForceImpulse,call,impulse={1}", LocalID, impulse); | ||
1207 | OMV.Vector3 addImpulse = impulse; | ||
1208 | PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddImpulse", delegate() | ||
1209 | { | ||
1210 | // Bullet adds this impulse immediately to the velocity | ||
1211 | DetailLog("{0},BSPrim.addForceImpulse,taint,impulseforce={1}", LocalID, addImpulse); | ||
1212 | if (PhysBody.HasPhysicalBody) | ||
1213 | { | ||
1214 | PhysicsScene.PE.ApplyCentralImpulse(PhysBody, addImpulse); | ||
1215 | ActivateIfPhysical(false); | ||
1216 | } | ||
1217 | }); | ||
1218 | } | ||
1219 | else | ||
1220 | { | ||
1221 | m_log.WarnFormat("{0}: AddForceImpulse: Got a NaN impulse applied to a prim. LocalID={1}", LogHeader, LocalID); | ||
1222 | return; | ||
1223 | } | ||
1183 | } | 1224 | } |
1184 | } | 1225 | } |
1185 | 1226 | ||