diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 83 |
1 files changed, 80 insertions, 3 deletions
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!) |