diff options
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs | 82 |
1 files changed, 73 insertions, 9 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs b/OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs index 12b623d..b61e1c5 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEVehicleSettings.cs | |||
@@ -54,7 +54,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
54 | private IntPtr m_body = IntPtr.Zero; | 54 | private IntPtr m_body = IntPtr.Zero; |
55 | private IntPtr m_jointGroup = IntPtr.Zero; | 55 | private IntPtr m_jointGroup = IntPtr.Zero; |
56 | private IntPtr m_aMotor = IntPtr.Zero; | 56 | private IntPtr m_aMotor = IntPtr.Zero; |
57 | private IntPtr m_lMotor = IntPtr.Zero; | 57 | private IntPtr m_lMotor1 = IntPtr.Zero; |
58 | private IntPtr m_lMotor2 = IntPtr.Zero; | ||
59 | private IntPtr m_lMotor3 = IntPtr.Zero; | ||
58 | 60 | ||
59 | // Vehicle properties | 61 | // Vehicle properties |
60 | private Quaternion m_referenceFrame = Quaternion.Identity; | 62 | private Quaternion m_referenceFrame = Quaternion.Identity; |
@@ -80,9 +82,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
80 | private float m_linearMotorTimescale = 0; | 82 | private float m_linearMotorTimescale = 0; |
81 | private float m_verticalAttractionEfficiency = 0; | 83 | private float m_verticalAttractionEfficiency = 0; |
82 | private float m_verticalAttractionTimescale = 0; | 84 | private float m_verticalAttractionTimescale = 0; |
83 | private Vector3 m_lastVector = Vector3.Zero; | 85 | private Vector3 m_lastLinearVelocityVector = Vector3.Zero; |
84 | private VehicleFlag m_flags = (VehicleFlag) 0; | 86 | private VehicleFlag m_flags = (VehicleFlag) 0; |
85 | 87 | ||
88 | private bool m_LinearMotorSetLastFrame = false; | ||
89 | |||
86 | 90 | ||
87 | 91 | ||
88 | 92 | ||
@@ -169,6 +173,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
169 | break; | 173 | break; |
170 | case Vehicle.LINEAR_MOTOR_DIRECTION: | 174 | case Vehicle.LINEAR_MOTOR_DIRECTION: |
171 | m_linearMotorDirection = new Vector3(pValue, pValue, pValue); | 175 | m_linearMotorDirection = new Vector3(pValue, pValue, pValue); |
176 | m_LinearMotorSetLastFrame = true; | ||
172 | break; | 177 | break; |
173 | case Vehicle.LINEAR_MOTOR_OFFSET: | 178 | case Vehicle.LINEAR_MOTOR_OFFSET: |
174 | m_linearMotorOffset = new Vector3(pValue, pValue, pValue); | 179 | m_linearMotorOffset = new Vector3(pValue, pValue, pValue); |
@@ -187,6 +192,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
187 | break; | 192 | break; |
188 | case Vehicle.ANGULAR_MOTOR_DIRECTION: | 193 | case Vehicle.ANGULAR_MOTOR_DIRECTION: |
189 | m_angularMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z); | 194 | m_angularMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z); |
195 | m_LinearMotorSetLastFrame = true; | ||
190 | break; | 196 | break; |
191 | case Vehicle.LINEAR_FRICTION_TIMESCALE: | 197 | case Vehicle.LINEAR_FRICTION_TIMESCALE: |
192 | m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); | 198 | m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); |
@@ -247,6 +253,25 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
247 | 253 | ||
248 | m_body = pBody; | 254 | m_body = pBody; |
249 | m_parentScene = pParentScene; | 255 | m_parentScene = pParentScene; |
256 | if (m_jointGroup == IntPtr.Zero) | ||
257 | m_jointGroup = d.JointGroupCreate(3); | ||
258 | |||
259 | if (pBody != IntPtr.Zero) | ||
260 | { | ||
261 | |||
262 | if (m_lMotor1 == IntPtr.Zero) | ||
263 | { | ||
264 | d.BodySetAutoDisableFlag(Body, false); | ||
265 | m_lMotor1 = d.JointCreateLMotor(pParentScene.world, m_jointGroup); | ||
266 | d.JointSetLMotorNumAxes(m_lMotor1, 1); | ||
267 | d.JointAttach(m_lMotor1, Body, IntPtr.Zero); | ||
268 | } | ||
269 | |||
270 | Vector3 dirNorm = m_lastLinearVelocityVector; | ||
271 | dirNorm.Normalize(); | ||
272 | //d.JointSetLMotorAxis(m_lMotor1, 0, 1, dirNorm.X, dirNorm.Y, dirNorm.Z); | ||
273 | //d.JointSetLMotorParam(m_lMotor1, (int)dParam.Vel, m_lastLinearVelocityVector.Length()); | ||
274 | } | ||
250 | } | 275 | } |
251 | 276 | ||
252 | internal void Reset() | 277 | internal void Reset() |
@@ -439,15 +464,54 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
439 | private void LinearMotor(float pTimestep) | 464 | private void LinearMotor(float pTimestep) |
440 | { | 465 | { |
441 | 466 | ||
442 | /* | 467 | if (!m_linearMotorDirection.ApproxEquals(Vector3.Zero, 0.01f)) |
443 | float decayval = (m_linearMotorDecayTimescale * pTimestep); | 468 | { |
444 | m_linearMotorDirection *= decayval; | 469 | Vector3 addAmount = m_linearMotorDirection/(m_linearMotorTimescale/pTimestep); |
445 | m_lastVector += m_linearMotorDirection | 470 | m_lastLinearVelocityVector += (addAmount*10); |
471 | |||
472 | // This will work temporarily, but we really need to compare speed on an axis | ||
473 | if (Math.Abs(m_lastLinearVelocityVector.X) > Math.Abs(m_linearMotorDirection.X)) | ||
474 | m_lastLinearVelocityVector.X = m_linearMotorDirection.X; | ||
475 | if (Math.Abs(m_lastLinearVelocityVector.Y) > Math.Abs(m_linearMotorDirection.Y)) | ||
476 | m_lastLinearVelocityVector.Y = m_linearMotorDirection.Y; | ||
477 | if (Math.Abs(m_lastLinearVelocityVector.Z) > Math.Abs(m_linearMotorDirection.Z)) | ||
478 | m_lastLinearVelocityVector.Z = m_linearMotorDirection.Z; | ||
479 | //System.Console.WriteLine("add: " + addAmount); | ||
480 | |||
481 | m_linearMotorDirection -= (m_linearMotorDirection*new Vector3(1, 1, 1)/ | ||
482 | (m_linearMotorDecayTimescale/pTimestep)) * 0.10f; | ||
483 | //Console.WriteLine("actual: " + m_linearMotorDirection); | ||
484 | } | ||
485 | //System.Console.WriteLine(m_linearMotorDirection + " " + m_lastLinearVelocityVector); | ||
446 | 486 | ||
487 | SetMotorProperties(); | ||
447 | 488 | ||
448 | m_lin | 489 | Vector3 decayamount = new Vector3(1,1,1)/(m_linearFrictionTimescale/pTimestep); |
449 | m_lastVector | 490 | m_lastLinearVelocityVector -= m_lastLinearVelocityVector * decayamount; |
450 | * */ | 491 | |
492 | //m_linearMotorDirection *= decayamount; | ||
493 | |||
494 | } | ||
495 | |||
496 | private void SetMotorProperties() | ||
497 | { | ||
498 | Vector3 dirNorm = m_lastLinearVelocityVector; | ||
499 | dirNorm.Normalize(); | ||
500 | |||
501 | d.Mass objMass; | ||
502 | d.BodyGetMass(Body, out objMass); | ||
503 | d.Quaternion rot = d.BodyGetQuaternion(Body); | ||
504 | Quaternion rotq = new Quaternion(rot.X, rot.Y, rot.Z, rot.W); | ||
505 | dirNorm *= rotq; | ||
506 | if (m_lMotor1 != IntPtr.Zero) | ||
507 | { | ||
508 | |||
509 | d.JointSetLMotorAxis(m_lMotor1, 0, 1, dirNorm.X, dirNorm.Y, dirNorm.Z); | ||
510 | d.JointSetLMotorParam(m_lMotor1, (int)dParam.Vel, m_linearMotorDirection.Length()); | ||
511 | |||
512 | d.JointSetLMotorParam(m_lMotor1, (int)dParam.FMax, 35f * objMass.mass); | ||
513 | } | ||
514 | |||
451 | } | 515 | } |
452 | } | 516 | } |
453 | } | 517 | } |