aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/ODEPrim.cs')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs589
1 files changed, 323 insertions, 266 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 4581d22..864ea80 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -1,4 +1,15 @@
1/* 1/*
2 * Revised August 26 2009 by Kitto Flora. ODEDynamics.cs replaces
3 * ODEVehicleSettings.cs. It and ODEPrim.cs are re-organised:
4 * ODEPrim.cs contains methods dealing with Prim editing, Prim
5 * characteristics and Kinetic motion.
6 * ODEDynamics.cs contains methods dealing with Prim Physical motion
7 * (dynamics) and the associated settings. Old Linear and angular
8 * motors for dynamic motion have been replace with MoveLinear()
9 * and MoveAngular(); 'Physical' is used only to switch ODE dynamic
10 * simualtion on/off; VEHICAL_TYPE_NONE/VEHICAL_TYPE_<other> is to
11 * switch between 'VEHICLE' parameter use and general dynamics
12 * settings use.
2 * Copyright (c) Contributors, http://opensimulator.org/ 13 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 14 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 15 *
@@ -72,6 +83,9 @@ namespace OpenSim.Region.Physics.OdePlugin
72 private float PID_G = 25f; 83 private float PID_G = 25f;
73 private bool m_usePID = false; 84 private bool m_usePID = false;
74 85
86 // KF: These next 7 params apply to llSetHoverHeight(float height, integer water, float tau),
87 // and are for non-VEHICLES only.
88
75 private float m_PIDHoverHeight = 0f; 89 private float m_PIDHoverHeight = 0f;
76 private float m_PIDHoverTau = 0f; 90 private float m_PIDHoverTau = 0f;
77 private bool m_useHoverPID = false; 91 private bool m_useHoverPID = false;
@@ -79,6 +93,7 @@ namespace OpenSim.Region.Physics.OdePlugin
79 private float m_targetHoverHeight = 0f; 93 private float m_targetHoverHeight = 0f;
80 private float m_groundHeight = 0f; 94 private float m_groundHeight = 0f;
81 private float m_waterHeight = 0f; 95 private float m_waterHeight = 0f;
96 private float m_buoyancy = 0f; //KF: m_buoyancy should be set by llSetBuoyancy() for non-vehicle.
82 97
83 // private float m_tensor = 5f; 98 // private float m_tensor = 5f;
84 private int body_autodisable_frames = 20; 99 private int body_autodisable_frames = 20;
@@ -146,8 +161,6 @@ namespace OpenSim.Region.Physics.OdePlugin
146 public int m_roundsUnderMotionThreshold = 0; 161 public int m_roundsUnderMotionThreshold = 0;
147 private int m_crossingfailures = 0; 162 private int m_crossingfailures = 0;
148 163
149 public float m_buoyancy = 0f;
150
151 public bool outofBounds = false; 164 public bool outofBounds = false;
152 private float m_density = 10.000006836f; // Aluminum g/cm3; 165 private float m_density = 10.000006836f; // Aluminum g/cm3;
153 166
@@ -155,7 +168,8 @@ namespace OpenSim.Region.Physics.OdePlugin
155 private bool m_lastUpdateSent = false; 168 private bool m_lastUpdateSent = false;
156 169
157 public IntPtr Body = (IntPtr) 0; 170 public IntPtr Body = (IntPtr) 0;
158 private String m_primName; 171 public String m_primName;
172// private String m_primName;
159 private PhysicsVector _target_velocity; 173 private PhysicsVector _target_velocity;
160 public d.Mass pMass; 174 public d.Mass pMass;
161 175
@@ -166,7 +180,7 @@ namespace OpenSim.Region.Physics.OdePlugin
166 180
167 public volatile bool childPrim = false; 181 public volatile bool childPrim = false;
168 182
169 private ODEVehicleSettings m_vehicle; 183 private ODEDynamics m_vehicle;
170 184
171 internal int m_material = (int)Material.Wood; 185 internal int m_material = (int)Material.Wood;
172 186
@@ -174,7 +188,7 @@ namespace OpenSim.Region.Physics.OdePlugin
174 Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode) 188 Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode)
175 { 189 {
176 _target_velocity = new PhysicsVector(0, 0, 0); 190 _target_velocity = new PhysicsVector(0, 0, 0);
177 m_vehicle = new ODEVehicleSettings(); 191 m_vehicle = new ODEDynamics();
178 //gc = GCHandle.Alloc(prim_geom, GCHandleType.Pinned); 192 //gc = GCHandle.Alloc(prim_geom, GCHandleType.Pinned);
179 ode = dode; 193 ode = dode;
180 _velocity = new PhysicsVector(); 194 _velocity = new PhysicsVector();
@@ -267,6 +281,8 @@ namespace OpenSim.Region.Physics.OdePlugin
267 public override bool Selected 281 public override bool Selected
268 { 282 {
269 set { 283 set {
284
285
270 // This only makes the object not collidable if the object 286 // This only makes the object not collidable if the object
271 // is physical or the object is modified somehow *IN THE FUTURE* 287 // is physical or the object is modified somehow *IN THE FUTURE*
272 // without this, if an avatar selects prim, they can walk right 288 // without this, if an avatar selects prim, they can walk right
@@ -282,6 +298,7 @@ namespace OpenSim.Region.Physics.OdePlugin
282 m_taintselected = value; 298 m_taintselected = value;
283 m_isSelected = value; 299 m_isSelected = value;
284 } 300 }
301 if(m_isSelected) disableBodySoft();
285 } 302 }
286 } 303 }
287 304
@@ -289,6 +306,7 @@ namespace OpenSim.Region.Physics.OdePlugin
289 { 306 {
290 prev_geom = prim_geom; 307 prev_geom = prim_geom;
291 prim_geom = geom; 308 prim_geom = geom;
309//Console.WriteLine("SetGeom to " + prim_geom + " for " + m_primName);
292 if (prim_geom != IntPtr.Zero) 310 if (prim_geom != IntPtr.Zero)
293 { 311 {
294 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); 312 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
@@ -300,6 +318,7 @@ namespace OpenSim.Region.Physics.OdePlugin
300 if (_parent != null && _parent is OdePrim) 318 if (_parent != null && _parent is OdePrim)
301 { 319 {
302 OdePrim parent = (OdePrim)_parent; 320 OdePrim parent = (OdePrim)_parent;
321//Console.WriteLine("SetGeom calls ChildSetGeom");
303 parent.ChildSetGeom(this); 322 parent.ChildSetGeom(this);
304 } 323 }
305 } 324 }
@@ -315,7 +334,8 @@ namespace OpenSim.Region.Physics.OdePlugin
315 if (m_isphysical && Body != IntPtr.Zero) 334 if (m_isphysical && Body != IntPtr.Zero)
316 { 335 {
317 d.BodyEnable(Body); 336 d.BodyEnable(Body);
318 m_vehicle.Enable(Body, _parent_scene); 337 if (m_vehicle.Type != Vehicle.TYPE_NONE)
338 m_vehicle.Enable(Body, _parent_scene);
319 } 339 }
320 340
321 m_disabled = false; 341 m_disabled = false;
@@ -329,7 +349,6 @@ namespace OpenSim.Region.Physics.OdePlugin
329 if (m_isphysical && Body != IntPtr.Zero) 349 if (m_isphysical && Body != IntPtr.Zero)
330 { 350 {
331 d.BodyDisable(Body); 351 d.BodyDisable(Body);
332 m_vehicle.Disable();
333 } 352 }
334 } 353 }
335 354
@@ -359,6 +378,9 @@ namespace OpenSim.Region.Physics.OdePlugin
359 378
360 d.BodySetAutoDisableFlag(Body, true); 379 d.BodySetAutoDisableFlag(Body, true);
361 d.BodySetAutoDisableSteps(Body, body_autodisable_frames); 380 d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
381
382 // disconnect from world gravity so we can apply buoyancy
383 d.BodySetGravityMode (Body, false);
362 384
363 m_interpenetrationcount = 0; 385 m_interpenetrationcount = 0;
364 m_collisionscore = 0; 386 m_collisionscore = 0;
@@ -705,13 +727,8 @@ namespace OpenSim.Region.Physics.OdePlugin
705 break; 727 break;
706 } 728 }
707 } 729 }
708
709
710
711
712
713 return returnMass; 730 return returnMass;
714 } 731 }// end CalculateMass
715 732
716 #endregion 733 #endregion
717 734
@@ -737,7 +754,6 @@ namespace OpenSim.Region.Physics.OdePlugin
737 if (Body != IntPtr.Zero) 754 if (Body != IntPtr.Zero)
738 { 755 {
739 _parent_scene.remActivePrim(this); 756 _parent_scene.remActivePrim(this);
740 m_vehicle.Destroy();
741 m_collisionCategories &= ~CollisionCategories.Body; 757 m_collisionCategories &= ~CollisionCategories.Body;
742 m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); 758 m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land);
743 759
@@ -827,6 +843,7 @@ namespace OpenSim.Region.Physics.OdePlugin
827 { 843 {
828 if (prim_geom == IntPtr.Zero) 844 if (prim_geom == IntPtr.Zero)
829 { 845 {
846//Console.WriteLine(" setMesh 1");
830 SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null)); 847 SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null));
831 } 848 }
832 } 849 }
@@ -848,19 +865,35 @@ namespace OpenSim.Region.Physics.OdePlugin
848 865
849 public void ProcessTaints(float timestep) 866 public void ProcessTaints(float timestep)
850 { 867 {
868//Console.WriteLine("ProcessTaints for " + m_primName );
851 if (m_taintadd) 869 if (m_taintadd)
852 { 870 {
853 changeadd(timestep); 871 changeadd(timestep);
854 } 872 }
873
855 if (prim_geom != IntPtr.Zero) 874 if (prim_geom != IntPtr.Zero)
856 { 875 {
857 if (!_position.IsIdentical(m_taintposition,0f)) 876 if (!_position.IsIdentical(m_taintposition,0f))
858 changemove(timestep); 877 changemove(timestep);
859 878
860 if (m_taintrot != _orientation) 879 if (m_taintrot != _orientation)
861 rotate(timestep); 880 {
881 if(childPrim && IsPhysical) // For physical child prim...
882 {
883 rotate(timestep);
884 // KF: ODE will also rotate the parent prim!
885 // so rotate the root back to where it was
886 OdePrim parent = (OdePrim)_parent;
887 parent.rotate(timestep);
888 }
889 else
890 {
891 //Just rotate the prim
892 rotate(timestep);
893 }
894 }
862 // 895 //
863 896
864 if (m_taintPhysics != m_isphysical && !(m_taintparent != _parent)) 897 if (m_taintPhysics != m_isphysical && !(m_taintparent != _parent))
865 changePhysicsStatus(timestep); 898 changePhysicsStatus(timestep);
866 // 899 //
@@ -899,8 +932,7 @@ namespace OpenSim.Region.Physics.OdePlugin
899 932
900 if (!m_angularlock.IsIdentical(m_taintAngularLock,0)) 933 if (!m_angularlock.IsIdentical(m_taintAngularLock,0))
901 changeAngularLock(timestep); 934 changeAngularLock(timestep);
902 935
903
904 } 936 }
905 else 937 else
906 { 938 {
@@ -932,11 +964,6 @@ namespace OpenSim.Region.Physics.OdePlugin
932 Amotor = IntPtr.Zero; 964 Amotor = IntPtr.Zero;
933 } 965 }
934 } 966 }
935
936 if (m_vehicle.Type != Vehicle.TYPE_NONE)
937 {
938 m_vehicle.Reset();
939 }
940 } 967 }
941 } 968 }
942 // Store this for later in case we get turned into a separate body 969 // Store this for later in case we get turned into a separate body
@@ -954,7 +981,7 @@ namespace OpenSim.Region.Physics.OdePlugin
954 { 981 {
955 OdePrim obj = (OdePrim)m_taintparent; 982 OdePrim obj = (OdePrim)m_taintparent;
956 //obj.disableBody(); 983 //obj.disableBody();
957 984//Console.WriteLine("changelink calls ParentPrim");
958 obj.ParentPrim(this); 985 obj.ParentPrim(this);
959 986
960 /* 987 /*
@@ -972,6 +999,8 @@ namespace OpenSim.Region.Physics.OdePlugin
972 // destroy link 999 // destroy link
973 else if (_parent != null && m_taintparent == null) 1000 else if (_parent != null && m_taintparent == null)
974 { 1001 {
1002//Console.WriteLine(" changelink B");
1003
975 if (_parent is OdePrim) 1004 if (_parent is OdePrim)
976 { 1005 {
977 OdePrim obj = (OdePrim)_parent; 1006 OdePrim obj = (OdePrim)_parent;
@@ -988,7 +1017,7 @@ namespace OpenSim.Region.Physics.OdePlugin
988 m_linkJoint = (IntPtr)0; 1017 m_linkJoint = (IntPtr)0;
989 */ 1018 */
990 } 1019 }
991 1020
992 _parent = m_taintparent; 1021 _parent = m_taintparent;
993 m_taintPhysics = m_isphysical; 1022 m_taintPhysics = m_isphysical;
994 } 1023 }
@@ -997,6 +1026,7 @@ namespace OpenSim.Region.Physics.OdePlugin
997 // prim is the child 1026 // prim is the child
998 public void ParentPrim(OdePrim prim) 1027 public void ParentPrim(OdePrim prim)
999 { 1028 {
1029//Console.WriteLine("ParentPrim " + m_primName);
1000 if (this.m_localID != prim.m_localID) 1030 if (this.m_localID != prim.m_localID)
1001 { 1031 {
1002 if (Body == IntPtr.Zero) 1032 if (Body == IntPtr.Zero)
@@ -1010,6 +1040,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1010 { 1040 {
1011 if (!childrenPrim.Contains(prim)) 1041 if (!childrenPrim.Contains(prim))
1012 { 1042 {
1043//Console.WriteLine("childrenPrim.Add " + prim);
1013 childrenPrim.Add(prim); 1044 childrenPrim.Add(prim);
1014 1045
1015 foreach (OdePrim prm in childrenPrim) 1046 foreach (OdePrim prm in childrenPrim)
@@ -1033,6 +1064,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1033 } 1064 }
1034 foreach (OdePrim prm in childrenPrim) 1065 foreach (OdePrim prm in childrenPrim)
1035 { 1066 {
1067
1036 prm.m_collisionCategories |= CollisionCategories.Body; 1068 prm.m_collisionCategories |= CollisionCategories.Body;
1037 prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); 1069 prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
1038 1070
@@ -1041,7 +1073,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1041 m_log.Warn("[PHYSICS]: Unable to link one of the linkset elements. No geom yet"); 1073 m_log.Warn("[PHYSICS]: Unable to link one of the linkset elements. No geom yet");
1042 continue; 1074 continue;
1043 } 1075 }
1044 1076//Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + m_primName);
1045 d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories); 1077 d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories);
1046 d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); 1078 d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags);
1047 1079
@@ -1086,11 +1118,12 @@ namespace OpenSim.Region.Physics.OdePlugin
1086 prm.Body = Body; 1118 prm.Body = Body;
1087 _parent_scene.addActivePrim(prm); 1119 _parent_scene.addActivePrim(prm);
1088 } 1120 }
1089
1090 m_collisionCategories |= CollisionCategories.Body; 1121 m_collisionCategories |= CollisionCategories.Body;
1091 m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); 1122 m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
1092 1123
1124//Console.WriteLine("GeomSetCategoryBits 2: " + prim_geom + " - " + (int)m_collisionCategories + " for " + m_primName);
1093 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); 1125 d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
1126//Console.WriteLine(" Post GeomSetCategoryBits 2");
1094 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); 1127 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
1095 1128
1096 1129
@@ -1126,7 +1159,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1126 createAMotor(m_angularlock); 1159 createAMotor(m_angularlock);
1127 } 1160 }
1128 d.BodySetPosition(Body, Position.X, Position.Y, Position.Z); 1161 d.BodySetPosition(Body, Position.X, Position.Y, Position.Z);
1129 m_vehicle.Enable(Body, _parent_scene); 1162 if (m_vehicle.Type != Vehicle.TYPE_NONE) m_vehicle.Enable(Body, _parent_scene);
1130 _parent_scene.addActivePrim(this); 1163 _parent_scene.addActivePrim(this);
1131 } 1164 }
1132 } 1165 }
@@ -1163,6 +1196,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1163 { 1196 {
1164 foreach (OdePrim prm in childrenPrim) 1197 foreach (OdePrim prm in childrenPrim)
1165 { 1198 {
1199//Console.WriteLine("ChildSetGeom calls ParentPrim");
1166 ParentPrim(prm); 1200 ParentPrim(prm);
1167 } 1201 }
1168 } 1202 }
@@ -1189,6 +1223,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1189 1223
1190 lock (childrenPrim) 1224 lock (childrenPrim)
1191 { 1225 {
1226 //Console.WriteLine("childrenPrim.Remove " + odePrim);
1192 childrenPrim.Remove(odePrim); 1227 childrenPrim.Remove(odePrim);
1193 } 1228 }
1194 1229
@@ -1206,6 +1241,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1206 { 1241 {
1207 foreach (OdePrim prm in childrenPrim) 1242 foreach (OdePrim prm in childrenPrim)
1208 { 1243 {
1244//Console.WriteLine("ChildDelink calls ParentPrim");
1209 ParentPrim(prm); 1245 ParentPrim(prm);
1210 } 1246 }
1211 } 1247 }
@@ -1290,7 +1326,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1290 1326
1291 resetCollisionAccounting(); 1327 resetCollisionAccounting();
1292 m_isSelected = m_taintselected; 1328 m_isSelected = m_taintselected;
1293 } 1329 }//end changeSelectedStatus
1294 1330
1295 public void ResetTaints() 1331 public void ResetTaints()
1296 { 1332 {
@@ -1307,6 +1343,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1307 1343
1308 public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh) 1344 public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh)
1309 { 1345 {
1346//Console.WriteLine("CreateGeom:");
1310 if (_mesh != null) 1347 if (_mesh != null)
1311 { 1348 {
1312 setMesh(_parent_scene, _mesh); 1349 setMesh(_parent_scene, _mesh);
@@ -1322,6 +1359,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1322 _parent_scene.waitForSpaceUnlock(m_targetSpace); 1359 _parent_scene.waitForSpaceUnlock(m_targetSpace);
1323 try 1360 try
1324 { 1361 {
1362//Console.WriteLine(" CreateGeom 1");
1325 SetGeom(d.CreateSphere(m_targetSpace, _size.X / 2)); 1363 SetGeom(d.CreateSphere(m_targetSpace, _size.X / 2));
1326 } 1364 }
1327 catch (AccessViolationException) 1365 catch (AccessViolationException)
@@ -1336,6 +1374,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1336 _parent_scene.waitForSpaceUnlock(m_targetSpace); 1374 _parent_scene.waitForSpaceUnlock(m_targetSpace);
1337 try 1375 try
1338 { 1376 {
1377//Console.WriteLine(" CreateGeom 2");
1339 SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); 1378 SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z));
1340 } 1379 }
1341 catch (AccessViolationException) 1380 catch (AccessViolationException)
@@ -1351,6 +1390,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1351 _parent_scene.waitForSpaceUnlock(m_targetSpace); 1390 _parent_scene.waitForSpaceUnlock(m_targetSpace);
1352 try 1391 try
1353 { 1392 {
1393//Console.WriteLine(" CreateGeom 3");
1354 SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); 1394 SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z));
1355 } 1395 }
1356 catch (AccessViolationException) 1396 catch (AccessViolationException)
@@ -1367,6 +1407,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1367 _parent_scene.waitForSpaceUnlock(m_targetSpace); 1407 _parent_scene.waitForSpaceUnlock(m_targetSpace);
1368 try 1408 try
1369 { 1409 {
1410//Console.WriteLine(" CreateGeom 4");
1370 SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z)); 1411 SetGeom(d.CreateBox(m_targetSpace, _size.X, _size.Y, _size.Z));
1371 } 1412 }
1372 catch (AccessViolationException) 1413 catch (AccessViolationException)
@@ -1403,6 +1444,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1403 1444
1404 lock (_parent_scene.OdeLock) 1445 lock (_parent_scene.OdeLock)
1405 { 1446 {
1447//Console.WriteLine("changeadd 1");
1406 CreateGeom(m_targetSpace, _mesh); 1448 CreateGeom(m_targetSpace, _mesh);
1407 1449
1408 if (prim_geom != IntPtr.Zero) 1450 if (prim_geom != IntPtr.Zero)
@@ -1458,6 +1500,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1458 OdePrim odParent = (OdePrim)_parent; 1500 OdePrim odParent = (OdePrim)_parent;
1459 if (Body != (IntPtr)0 && odParent.Body != (IntPtr)0 && Body != odParent.Body) 1501 if (Body != (IntPtr)0 && odParent.Body != (IntPtr)0 && Body != odParent.Body)
1460 { 1502 {
1503// KF: Fixed Joints were removed? Anyway - this Console.WriteLine does not show up, so routine is not used??
1504Console.WriteLine(" JointCreateFixed");
1461 m_linkJoint = d.JointCreateFixed(_parent_scene.world, _linkJointGroup); 1505 m_linkJoint = d.JointCreateFixed(_parent_scene.world, _linkJointGroup);
1462 d.JointAttach(m_linkJoint, Body, odParent.Body); 1506 d.JointAttach(m_linkJoint, Body, odParent.Body);
1463 d.JointSetFixed(m_linkJoint); 1507 d.JointSetFixed(m_linkJoint);
@@ -1511,239 +1555,236 @@ namespace OpenSim.Region.Physics.OdePlugin
1511 float fz = 0; 1555 float fz = 0;
1512 1556
1513 1557
1514 if (IsPhysical && Body != IntPtr.Zero && !m_isSelected) 1558 if (IsPhysical && (Body != IntPtr.Zero) && !m_isSelected && !childPrim) // KF: Only move root prims.
1515 { 1559 {
1516 if (d.BodyIsEnabled(Body) && !m_angularlock.IsIdentical(PhysicsVector.Zero, 0.003f)) 1560 if (m_vehicle.Type != Vehicle.TYPE_NONE)
1517 { 1561 {
1518 d.Vector3 avel2 = d.BodyGetAngularVel(Body); 1562 // 'VEHICLES' are dealt with in ODEDynamics.cs
1519 if (m_angularlock.X == 1) 1563 m_vehicle.Step(timestep, _parent_scene);
1520 avel2.X = 0; 1564 }
1521 if (m_angularlock.Y == 1) 1565 else
1522 avel2.Y = 0; 1566 {
1523 if (m_angularlock.Z == 1) 1567 // NON-'VEHICLES' are dealt with here
1524 avel2.Z = 0; 1568 if (d.BodyIsEnabled(Body) && !m_angularlock.IsIdentical(PhysicsVector.Zero, 0.003f))
1525 d.BodySetAngularVel(Body, avel2.X, avel2.Y, avel2.Z); 1569 {
1526 } 1570 d.Vector3 avel2 = d.BodyGetAngularVel(Body);
1527 //float PID_P = 900.0f; 1571 if (m_angularlock.X == 1)
1528 1572 avel2.X = 0;
1529 float m_mass = CalculateMass(); 1573 if (m_angularlock.Y == 1)
1530 1574 avel2.Y = 0;
1531 fz = 0f; 1575 if (m_angularlock.Z == 1)
1576 avel2.Z = 0;
1577 d.BodySetAngularVel(Body, avel2.X, avel2.Y, avel2.Z);
1578 }
1579 //float PID_P = 900.0f;
1580
1581 float m_mass = CalculateMass();
1582
1583// fz = 0f;
1532 //m_log.Info(m_collisionFlags.ToString()); 1584 //m_log.Info(m_collisionFlags.ToString());
1533 1585
1534 if (m_buoyancy != 0) 1586
1535 { 1587 //KF: m_buoyancy should be set by llSetBuoyancy() for non-vehicle.
1536 if (m_buoyancy > 0) 1588 // would come from SceneObjectPart.cs, public void SetBuoyancy(float fvalue) , PhysActor.Buoyancy = fvalue; ??
1537 { 1589 // m_buoyancy: (unlimited value) <0=Falls fast; 0=1g; 1=0g; >1 = floats up
1538 fz = (((-1 * _parent_scene.gravityz) * m_buoyancy) * m_mass); 1590 // gravityz multiplier = 1 - m_buoyancy
1539 1591 fz = _parent_scene.gravityz * (1.0f - m_buoyancy) * m_mass;
1540 //d.Vector3 l_velocity = d.BodyGetLinearVel(Body); 1592
1541 //m_log.Info("Using Buoyancy: " + buoyancy + " G: " + (_parent_scene.gravityz * m_buoyancy) + "mass:" + m_mass + " Pos: " + Position.ToString()); 1593 if (m_usePID)
1542 } 1594 {
1543 else 1595 // KF - this is for object move? eg. llSetPos() ?
1544 { 1596 //if (!d.BodyIsEnabled(Body))
1545 fz = (-1 * (((-1 * _parent_scene.gravityz) * (-1 * m_buoyancy)) * m_mass)); 1597 //d.BodySetForce(Body, 0f, 0f, 0f);
1546 } 1598 // If we're using the PID controller, then we have no gravity
1547 } 1599 //fz = (-1 * _parent_scene.gravityz) * m_mass; //KF: ?? Prims have no global gravity,so simply...
1548 1600 fz = 0f;
1549 if (m_usePID) 1601
1550 { 1602 // no lock; for now it's only called from within Simulate()
1551 1603
1552 //if (!d.BodyIsEnabled(Body)) 1604 // If the PID Controller isn't active then we set our force
1553 //d.BodySetForce(Body, 0f, 0f, 0f); 1605 // calculating base velocity to the current position
1554 // If we're using the PID controller, then we have no gravity 1606
1555 fz = (-1 * _parent_scene.gravityz) * m_mass; 1607 if ((m_PIDTau < 1) && (m_PIDTau != 0))
1556 1608 {
1557 // no lock; for now it's only called from within Simulate() 1609 //PID_G = PID_G / m_PIDTau;
1558 1610 m_PIDTau = 1;
1559 // If the PID Controller isn't active then we set our force 1611 }
1560 // calculating base velocity to the current position 1612
1561 1613 if ((PID_G - m_PIDTau) <= 0)
1562 if ((m_PIDTau < 1) && (m_PIDTau != 0)) 1614 {
1563 { 1615 PID_G = m_PIDTau + 1;
1564 //PID_G = PID_G / m_PIDTau; 1616 }
1565 m_PIDTau = 1; 1617 //PidStatus = true;
1566 } 1618
1567 1619 // PhysicsVector vec = new PhysicsVector();
1568 if ((PID_G - m_PIDTau) <= 0) 1620 d.Vector3 vel = d.BodyGetLinearVel(Body);
1569 { 1621
1570 PID_G = m_PIDTau + 1; 1622 d.Vector3 pos = d.BodyGetPosition(Body);
1571 } 1623 _target_velocity =
1572 //PidStatus = true; 1624 new PhysicsVector(
1573 1625 (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep),
1574 // PhysicsVector vec = new PhysicsVector(); 1626 (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep),
1575 d.Vector3 vel = d.BodyGetLinearVel(Body); 1627 (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep)
1576 1628 );
1577 d.Vector3 pos = d.BodyGetPosition(Body); 1629
1578 _target_velocity = 1630 // if velocity is zero, use position control; otherwise, velocity control
1579 new PhysicsVector( 1631
1580 (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep), 1632 if (_target_velocity.IsIdentical(PhysicsVector.Zero,0.1f))
1581 (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep), 1633 {
1582 (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep) 1634 // keep track of where we stopped. No more slippin' & slidin'
1583 ); 1635
1584 1636 // We only want to deactivate the PID Controller if we think we want to have our surrogate
1585 // if velocity is zero, use position control; otherwise, velocity control 1637 // react to the physics scene by moving it's position.
1586 1638 // Avatar to Avatar collisions
1587 if (_target_velocity.IsIdentical(PhysicsVector.Zero,0.1f)) 1639 // Prim to avatar collisions
1588 { 1640
1589 // keep track of where we stopped. No more slippin' & slidin' 1641 //fx = (_target_velocity.X - vel.X) * (PID_D) + (_zeroPosition.X - pos.X) * (PID_P * 2);
1590 1642 //fy = (_target_velocity.Y - vel.Y) * (PID_D) + (_zeroPosition.Y - pos.Y) * (PID_P * 2);
1591 // We only want to deactivate the PID Controller if we think we want to have our surrogate 1643 //fz = fz + (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P;
1592 // react to the physics scene by moving it's position. 1644 d.BodySetPosition(Body, m_PIDTarget.X, m_PIDTarget.Y, m_PIDTarget.Z);
1593 // Avatar to Avatar collisions 1645 d.BodySetLinearVel(Body, 0, 0, 0);
1594 // Prim to avatar collisions 1646 d.BodyAddForce(Body, 0, 0, fz);
1595 1647 return;
1596 //fx = (_target_velocity.X - vel.X) * (PID_D) + (_zeroPosition.X - pos.X) * (PID_P * 2); 1648 }
1597 //fy = (_target_velocity.Y - vel.Y) * (PID_D) + (_zeroPosition.Y - pos.Y) * (PID_P * 2); 1649 else
1598 //fz = fz + (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P; 1650 {
1599 d.BodySetPosition(Body, m_PIDTarget.X, m_PIDTarget.Y, m_PIDTarget.Z); 1651 _zeroFlag = false;
1600 d.BodySetLinearVel(Body, 0, 0, 0); 1652
1601 d.BodyAddForce(Body, 0, 0, fz); 1653 // We're flying and colliding with something
1602 return; 1654 fx = ((_target_velocity.X) - vel.X) * (PID_D);
1603 } 1655 fy = ((_target_velocity.Y) - vel.Y) * (PID_D);
1604 else 1656
1605 { 1657 // vec.Z = (_target_velocity.Z - vel.Z) * PID_D + (_zeroPosition.Z - pos.Z) * PID_P;
1606 _zeroFlag = false; 1658
1607 1659 fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass);
1608 // We're flying and colliding with something 1660 }
1609 fx = ((_target_velocity.X) - vel.X) * (PID_D); 1661 } // end if (m_usePID)
1610 fy = ((_target_velocity.Y) - vel.Y) * (PID_D); 1662
1611 1663 // Hover PID Controller needs to be mutually exlusive to MoveTo PID controller
1612 // vec.Z = (_target_velocity.Z - vel.Z) * PID_D + (_zeroPosition.Z - pos.Z) * PID_P; 1664 if (m_useHoverPID && !m_usePID)
1613 1665 {
1614 fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); 1666 // If we're using the PID controller, then we have no gravity
1615 } 1667 fz = (-1 * _parent_scene.gravityz) * m_mass;
1616 } 1668
1617 1669 // no lock; for now it's only called from within Simulate()
1618 // Hover PID Controller needs to be mutually exlusive to MoveTo PID controller 1670
1619 if (m_useHoverPID && !m_usePID) 1671 // If the PID Controller isn't active then we set our force
1620 { 1672 // calculating base velocity to the current position
1621 // If we're using the PID controller, then we have no gravity 1673
1622 fz = (-1 * _parent_scene.gravityz) * m_mass; 1674 if ((m_PIDTau < 1))
1623 1675 {
1624 // no lock; for now it's only called from within Simulate() 1676 PID_G = PID_G / m_PIDTau;
1625 1677 }
1626 // If the PID Controller isn't active then we set our force 1678
1627 // calculating base velocity to the current position 1679 if ((PID_G - m_PIDTau) <= 0)
1628 1680 {
1629 if ((m_PIDTau < 1)) 1681 PID_G = m_PIDTau + 1;
1630 { 1682 }
1631 PID_G = PID_G / m_PIDTau;
1632 }
1633
1634 if ((PID_G - m_PIDTau) <= 0)
1635 {
1636 PID_G = m_PIDTau + 1;
1637 }
1638 1683
1639 1684
1640 // Where are we, and where are we headed? 1685 // Where are we, and where are we headed?
1641 d.Vector3 pos = d.BodyGetPosition(Body); 1686 d.Vector3 pos = d.BodyGetPosition(Body);
1642 d.Vector3 vel = d.BodyGetLinearVel(Body); 1687 d.Vector3 vel = d.BodyGetLinearVel(Body);
1643 1688
1644 // determine what our target height really is based on HoverType 1689
1645 switch (m_PIDHoverType) 1690 // Non-Vehicles have a limited set of Hover options.
1646 { 1691 // determine what our target height really is based on HoverType
1647 case PIDHoverType.Absolute: 1692 switch (m_PIDHoverType)
1648 m_targetHoverHeight = m_PIDHoverHeight; 1693 {
1649 break; 1694 case PIDHoverType.Ground:
1650 case PIDHoverType.Ground: 1695 m_groundHeight = _parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y);
1651 m_groundHeight = _parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y); 1696 m_targetHoverHeight = m_groundHeight + m_PIDHoverHeight;
1652 m_targetHoverHeight = m_groundHeight + m_PIDHoverHeight; 1697 break;
1653 break; 1698 case PIDHoverType.GroundAndWater:
1654 case PIDHoverType.GroundAndWater: 1699 m_groundHeight = _parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y);
1655 m_groundHeight = _parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y); 1700 m_waterHeight = _parent_scene.GetWaterLevel();
1656 m_waterHeight = _parent_scene.GetWaterLevel(); 1701 if (m_groundHeight > m_waterHeight)
1657 if (m_groundHeight > m_waterHeight) 1702 {
1658 { 1703 m_targetHoverHeight = m_groundHeight + m_PIDHoverHeight;
1659 m_targetHoverHeight = m_groundHeight + m_PIDHoverHeight; 1704 }
1660 } 1705 else
1661 else 1706 {
1662 { 1707 m_targetHoverHeight = m_waterHeight + m_PIDHoverHeight;
1663 m_targetHoverHeight = m_waterHeight + m_PIDHoverHeight; 1708 }
1664 } 1709 break;
1665 break; 1710
1666 case PIDHoverType.Water: 1711 } // end switch (m_PIDHoverType)
1667 m_waterHeight = _parent_scene.GetWaterLevel(); 1712
1668 m_targetHoverHeight = m_waterHeight + m_PIDHoverHeight; 1713
1669 break; 1714 _target_velocity =
1670 } 1715 new PhysicsVector(0.0f, 0.0f,
1671 1716 (m_targetHoverHeight - pos.Z) * ((PID_G - m_PIDHoverTau) * timestep)
1672 1717 );
1673 _target_velocity = 1718
1674 new PhysicsVector(0.0f, 0.0f, 1719 // if velocity is zero, use position control; otherwise, velocity control
1675 (m_targetHoverHeight - pos.Z) * ((PID_G - m_PIDHoverTau) * timestep) 1720
1676 ); 1721 if (_target_velocity.IsIdentical(PhysicsVector.Zero, 0.1f))
1677 1722 {
1678 // if velocity is zero, use position control; otherwise, velocity control 1723 // keep track of where we stopped. No more slippin' & slidin'
1679 1724
1680 if (_target_velocity.IsIdentical(PhysicsVector.Zero, 0.1f)) 1725 // We only want to deactivate the PID Controller if we think we want to have our surrogate
1681 { 1726 // react to the physics scene by moving it's position.
1682 // keep track of where we stopped. No more slippin' & slidin' 1727 // Avatar to Avatar collisions
1683 1728 // Prim to avatar collisions
1684 // We only want to deactivate the PID Controller if we think we want to have our surrogate 1729
1685 // react to the physics scene by moving it's position. 1730 d.BodySetPosition(Body, pos.X, pos.Y, m_targetHoverHeight);
1686 // Avatar to Avatar collisions 1731 d.BodySetLinearVel(Body, vel.X, vel.Y, 0);
1687 // Prim to avatar collisions 1732 d.BodyAddForce(Body, 0, 0, fz);
1688 1733 return;
1689 d.BodySetPosition(Body, pos.X, pos.Y, m_targetHoverHeight); 1734 }
1690 d.BodySetLinearVel(Body, vel.X, vel.Y, 0); 1735 else
1691 d.BodyAddForce(Body, 0, 0, fz); 1736 {
1692 return; 1737 _zeroFlag = false;
1693 } 1738
1694 else 1739 // We're flying and colliding with something
1695 { 1740 fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass);
1696 _zeroFlag = false; 1741 }
1697 1742 }
1698 // We're flying and colliding with something 1743
1699 fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); 1744 fx *= m_mass;
1700 } 1745 fy *= m_mass;
1701 } 1746 //fz *= m_mass;
1702 1747
1703 fx *= m_mass; 1748 fx += m_force.X;
1704 fy *= m_mass; 1749 fy += m_force.Y;
1705 //fz *= m_mass; 1750 fz += m_force.Z;
1706 1751
1707 fx += m_force.X; 1752 //m_log.Info("[OBJPID]: X:" + fx.ToString() + " Y:" + fy.ToString() + " Z:" + fz.ToString());
1708 fy += m_force.Y; 1753 if (fx != 0 || fy != 0 || fz != 0)
1709 fz += m_force.Z; 1754 {
1710 1755 //m_taintdisable = true;
1711 //m_log.Info("[OBJPID]: X:" + fx.ToString() + " Y:" + fy.ToString() + " Z:" + fz.ToString()); 1756 //base.RaiseOutOfBounds(Position);
1712 if (fx != 0 || fy != 0 || fz != 0) 1757 //d.BodySetLinearVel(Body, fx, fy, 0f);
1713 { 1758 if (!d.BodyIsEnabled(Body))
1714 //m_taintdisable = true; 1759 {
1715 //base.RaiseOutOfBounds(Position); 1760 // A physical body at rest on a surface will auto-disable after a while,
1716 //d.BodySetLinearVel(Body, fx, fy, 0f); 1761 // this appears to re-enable it incase the surface it is upon vanishes,
1717 if (!d.BodyIsEnabled(Body)) 1762 // and the body should fall again.
1718 { 1763 d.BodySetLinearVel(Body, 0f, 0f, 0f);
1719 d.BodySetLinearVel(Body, 0f, 0f, 0f); 1764 d.BodySetForce(Body, 0, 0, 0);
1720 d.BodySetForce(Body, 0, 0, 0); 1765 enableBodySoft();
1721 enableBodySoft(); 1766 }
1722 } 1767
1723 1768 // 35x10 = 350n times the mass per second applied maximum.
1724 // 35x10 = 350n times the mass per second applied maximum. 1769 float nmax = 35f * m_mass;
1725 float nmax = 35f * m_mass; 1770 float nmin = -35f * m_mass;
1726 float nmin = -35f * m_mass;
1727 1771
1728 1772
1729 if (fx > nmax) 1773 if (fx > nmax)
1730 fx = nmax; 1774 fx = nmax;
1731 if (fx < nmin) 1775 if (fx < nmin)
1732 fx = nmin; 1776 fx = nmin;
1733 if (fy > nmax) 1777 if (fy > nmax)
1734 fy = nmax; 1778 fy = nmax;
1735 if (fy < nmin) 1779 if (fy < nmin)
1736 fy = nmin; 1780 fy = nmin;
1737 d.BodyAddForce(Body, fx, fy, fz); 1781 d.BodyAddForce(Body, fx, fy, fz);
1738 } 1782 }
1739 if (m_vehicle.Body == IntPtr.Zero && m_vehicle.Type != Vehicle.TYPE_NONE) 1783 }
1740 m_vehicle.Enable(Body, _parent_scene);
1741
1742 m_vehicle.Step(timestep);
1743 } 1784 }
1744 else 1785 else
1745 { 1786 { // is not physical, or is not a body or is selected
1746 // _zeroPosition = d.BodyGetPosition(Body); 1787 // _zeroPosition = d.BodyGetPosition(Body);
1747 return; 1788 return;
1748 } 1789 }
1749 } 1790 }
@@ -1757,14 +1798,22 @@ namespace OpenSim.Region.Physics.OdePlugin
1757 myrot.Y = _orientation.Y; 1798 myrot.Y = _orientation.Y;
1758 myrot.Z = _orientation.Z; 1799 myrot.Z = _orientation.Z;
1759 myrot.W = _orientation.W; 1800 myrot.W = _orientation.W;
1760 d.GeomSetQuaternion(prim_geom, ref myrot); 1801 if (Body != IntPtr.Zero)
1761 if (m_isphysical && Body != IntPtr.Zero)
1762 { 1802 {
1803 // KF: If this is a root prim do BodySet
1763 d.BodySetQuaternion(Body, ref myrot); 1804 d.BodySetQuaternion(Body, ref myrot);
1764 if (!m_angularlock.IsIdentical(new PhysicsVector(1, 1, 1), 0)) 1805 if (m_isphysical)
1765 createAMotor(m_angularlock); 1806 {
1807 if (!m_angularlock.IsIdentical(new PhysicsVector(1, 1, 1), 0))
1808 createAMotor(m_angularlock);
1809 }
1810 }
1811 else
1812 {
1813 // daughter prim, do Geom set
1814 d.GeomSetQuaternion(prim_geom, ref myrot);
1766 } 1815 }
1767 1816
1768 resetCollisionAccounting(); 1817 resetCollisionAccounting();
1769 m_taintrot = _orientation; 1818 m_taintrot = _orientation;
1770 } 1819 }
@@ -1826,7 +1875,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1826 m_log.Error("[PHYSICS]: PrimGeom dead"); 1875 m_log.Error("[PHYSICS]: PrimGeom dead");
1827 } 1876 }
1828 } 1877 }
1829 1878//Console.WriteLine("changePhysicsStatus for " + m_primName );
1830 changeadd(2f); 1879 changeadd(2f);
1831 } 1880 }
1832 if (childPrim) 1881 if (childPrim)
@@ -1904,7 +1953,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1904 mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical); 1953 mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
1905 1954
1906 //IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical); 1955 //IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical);
1907 1956//Console.WriteLine("changesize 1");
1908 CreateGeom(m_targetSpace, mesh); 1957 CreateGeom(m_targetSpace, mesh);
1909 1958
1910 1959
@@ -1912,6 +1961,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1912 else 1961 else
1913 { 1962 {
1914 _mesh = null; 1963 _mesh = null;
1964//Console.WriteLine("changesize 2");
1915 CreateGeom(m_targetSpace, _mesh); 1965 CreateGeom(m_targetSpace, _mesh);
1916 } 1966 }
1917 1967
@@ -2018,6 +2068,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2018 else 2068 else
2019 { 2069 {
2020 _mesh = null; 2070 _mesh = null;
2071//Console.WriteLine("changeshape");
2021 CreateGeom(m_targetSpace, null); 2072 CreateGeom(m_targetSpace, null);
2022 } 2073 }
2023 2074
@@ -2359,7 +2410,9 @@ namespace OpenSim.Region.Physics.OdePlugin
2359 set 2410 set
2360 { 2411 {
2361 if (QuaternionIsFinite(value)) 2412 if (QuaternionIsFinite(value))
2413 {
2362 _orientation = value; 2414 _orientation = value;
2415 }
2363 else 2416 else
2364 m_log.Warn("[PHYSICS]: Got NaN quaternion Orientation from Scene in Object"); 2417 m_log.Warn("[PHYSICS]: Got NaN quaternion Orientation from Scene in Object");
2365 2418
@@ -2578,12 +2631,16 @@ namespace OpenSim.Region.Physics.OdePlugin
2578 //outofBounds = true; 2631 //outofBounds = true;
2579 } 2632 }
2580 2633
2634 float Adiff = 1.0f - Math.Abs(Quaternion.Dot(m_lastorientation, l_orientation));
2635//Console.WriteLine("Adiff " + m_primName + " = " + Adiff);
2581 if ((Math.Abs(m_lastposition.X - l_position.X) < 0.02) 2636 if ((Math.Abs(m_lastposition.X - l_position.X) < 0.02)
2582 && (Math.Abs(m_lastposition.Y - l_position.Y) < 0.02) 2637 && (Math.Abs(m_lastposition.Y - l_position.Y) < 0.02)
2583 && (Math.Abs(m_lastposition.Z - l_position.Z) < 0.02) 2638 && (Math.Abs(m_lastposition.Z - l_position.Z) < 0.02)
2584 && (1.0 - Math.Abs(Quaternion.Dot(m_lastorientation, l_orientation)) < 0.01)) 2639// && (1.0 - Math.Abs(Quaternion.Dot(m_lastorientation, l_orientation)) < 0.01))
2640 && (1.0 - Math.Abs(Quaternion.Dot(m_lastorientation, l_orientation)) < 0.0001)) // KF 0.01 is far to large
2585 { 2641 {
2586 _zeroFlag = true; 2642 _zeroFlag = true;
2643//Console.WriteLine("ZFT 2");
2587 m_throttleUpdates = false; 2644 m_throttleUpdates = false;
2588 } 2645 }
2589 else 2646 else