diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 1 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 123 |
2 files changed, 103 insertions, 21 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index da2c069..27ef4c9 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -4584,6 +4584,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4584 | } | 4584 | } |
4585 | 4585 | ||
4586 | Quaternion rot = Quaternion.Slerp(RotationOffset,APIDTarget,1.0f/(float)m_APIDIterations); | 4586 | Quaternion rot = Quaternion.Slerp(RotationOffset,APIDTarget,1.0f/(float)m_APIDIterations); |
4587 | rot.Normalize(); | ||
4587 | UpdateRotation(rot); | 4588 | UpdateRotation(rot); |
4588 | 4589 | ||
4589 | m_APIDIterations--; | 4590 | m_APIDIterations--; |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index c86084c..5a1fdf9 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -341,8 +341,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
341 | prim_geom = geom; | 341 | prim_geom = geom; |
342 | //Console.WriteLine("SetGeom to " + prim_geom + " for " + Name); | 342 | //Console.WriteLine("SetGeom to " + prim_geom + " for " + Name); |
343 | 343 | ||
344 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 344 | if (m_assetFailed) |
345 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 345 | { |
346 | d.GeomSetCategoryBits(prim_geom, 0); | ||
347 | d.GeomSetCollideBits(prim_geom, BadAssetColideBits()); | ||
348 | } | ||
349 | else | ||
350 | { | ||
351 | |||
352 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
353 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
354 | } | ||
346 | 355 | ||
347 | _parent_scene.geom_name_map[prim_geom] = Name; | 356 | _parent_scene.geom_name_map[prim_geom] = Name; |
348 | _parent_scene.actor_name_map[prim_geom] = this; | 357 | _parent_scene.actor_name_map[prim_geom] = this; |
@@ -405,8 +414,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
405 | myrot.W = _orientation.W; | 414 | myrot.W = _orientation.W; |
406 | d.BodySetQuaternion(Body, ref myrot); | 415 | d.BodySetQuaternion(Body, ref myrot); |
407 | d.GeomSetBody(prim_geom, Body); | 416 | d.GeomSetBody(prim_geom, Body); |
408 | m_collisionCategories |= CollisionCategories.Body; | 417 | |
409 | m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); | 418 | if (m_assetFailed) |
419 | { | ||
420 | d.GeomSetCategoryBits(prim_geom, 0); | ||
421 | d.GeomSetCollideBits(prim_geom, BadAssetColideBits()); | ||
422 | } | ||
423 | else | ||
424 | { | ||
425 | m_collisionCategories |= CollisionCategories.Body; | ||
426 | m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); | ||
427 | } | ||
410 | 428 | ||
411 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 429 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); |
412 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 430 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
@@ -778,8 +796,16 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
778 | m_collisionCategories &= ~CollisionCategories.Body; | 796 | m_collisionCategories &= ~CollisionCategories.Body; |
779 | m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); | 797 | m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); |
780 | 798 | ||
781 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 799 | if (m_assetFailed) |
782 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 800 | { |
801 | d.GeomSetCategoryBits(prim_geom, 0); | ||
802 | d.GeomSetCollideBits(prim_geom, 0); | ||
803 | } | ||
804 | else | ||
805 | { | ||
806 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
807 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
808 | } | ||
783 | 809 | ||
784 | d.BodyDestroy(Body); | 810 | d.BodyDestroy(Body); |
785 | lock (childrenPrim) | 811 | lock (childrenPrim) |
@@ -803,8 +829,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
803 | m_collisionCategories &= ~CollisionCategories.Body; | 829 | m_collisionCategories &= ~CollisionCategories.Body; |
804 | m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); | 830 | m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); |
805 | 831 | ||
806 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 832 | if (m_assetFailed) |
807 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 833 | { |
834 | d.GeomSetCategoryBits(prim_geom, 0); | ||
835 | d.GeomSetCollideBits(prim_geom, 0); | ||
836 | } | ||
837 | else | ||
838 | { | ||
839 | |||
840 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
841 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
842 | } | ||
808 | 843 | ||
809 | Body = IntPtr.Zero; | 844 | Body = IntPtr.Zero; |
810 | } | 845 | } |
@@ -816,6 +851,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
816 | 851 | ||
817 | private static Dictionary<IMesh, IntPtr> m_MeshToTriMeshMap = new Dictionary<IMesh, IntPtr>(); | 852 | private static Dictionary<IMesh, IntPtr> m_MeshToTriMeshMap = new Dictionary<IMesh, IntPtr>(); |
818 | 853 | ||
854 | public int BadAssetColideBits() | ||
855 | { | ||
856 | return (m_isphysical ? (int)CollisionCategories.Land : 0); | ||
857 | } | ||
858 | |||
819 | private void setMesh(OdeScene parent_scene, IMesh mesh) | 859 | private void setMesh(OdeScene parent_scene, IMesh mesh) |
820 | { | 860 | { |
821 | // m_log.DebugFormat("[ODE PRIM]: Setting mesh on {0} to {1}", Name, mesh); | 861 | // m_log.DebugFormat("[ODE PRIM]: Setting mesh on {0} to {1}", Name, mesh); |
@@ -1094,8 +1134,16 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1094 | prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); | 1134 | prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); |
1095 | 1135 | ||
1096 | //Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name); | 1136 | //Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name); |
1097 | d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories); | 1137 | if (prm.m_assetFailed) |
1098 | d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); | 1138 | { |
1139 | d.GeomSetCategoryBits(prm.prim_geom, 0); | ||
1140 | d.GeomSetCollideBits(prm.prim_geom, prm.BadAssetColideBits()); | ||
1141 | } | ||
1142 | else | ||
1143 | { | ||
1144 | d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories); | ||
1145 | d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags); | ||
1146 | } | ||
1099 | 1147 | ||
1100 | d.Quaternion quat = new d.Quaternion(); | 1148 | d.Quaternion quat = new d.Quaternion(); |
1101 | quat.W = prm._orientation.W; | 1149 | quat.W = prm._orientation.W; |
@@ -1140,10 +1188,18 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1140 | m_collisionCategories |= CollisionCategories.Body; | 1188 | m_collisionCategories |= CollisionCategories.Body; |
1141 | m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); | 1189 | m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); |
1142 | 1190 | ||
1143 | //Console.WriteLine("GeomSetCategoryBits 2: " + prim_geom + " - " + (int)m_collisionCategories + " for " + Name); | 1191 | if (m_assetFailed) |
1144 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 1192 | { |
1145 | //Console.WriteLine(" Post GeomSetCategoryBits 2"); | 1193 | d.GeomSetCategoryBits(prim_geom, 0); |
1146 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 1194 | d.GeomSetCollideBits(prim_geom, BadAssetColideBits()); |
1195 | } | ||
1196 | else | ||
1197 | { | ||
1198 | //Console.WriteLine("GeomSetCategoryBits 2: " + prim_geom + " - " + (int)m_collisionCategories + " for " + Name); | ||
1199 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
1200 | //Console.WriteLine(" Post GeomSetCategoryBits 2"); | ||
1201 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
1202 | } | ||
1147 | 1203 | ||
1148 | d.Quaternion quat2 = new d.Quaternion(); | 1204 | d.Quaternion quat2 = new d.Quaternion(); |
1149 | quat2.W = _orientation.W; | 1205 | quat2.W = _orientation.W; |
@@ -1304,8 +1360,16 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1304 | disableBodySoft(); | 1360 | disableBodySoft(); |
1305 | } | 1361 | } |
1306 | 1362 | ||
1307 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 1363 | if (m_assetFailed) |
1308 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 1364 | { |
1365 | d.GeomSetCategoryBits(prim_geom, 0); | ||
1366 | d.GeomSetCollideBits(prim_geom, 0); | ||
1367 | } | ||
1368 | else | ||
1369 | { | ||
1370 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
1371 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
1372 | } | ||
1309 | 1373 | ||
1310 | if (IsPhysical) | 1374 | if (IsPhysical) |
1311 | { | 1375 | { |
@@ -1326,8 +1390,16 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1326 | if (m_collidesWater) | 1390 | if (m_collidesWater) |
1327 | m_collisionFlags |= CollisionCategories.Water; | 1391 | m_collisionFlags |= CollisionCategories.Water; |
1328 | 1392 | ||
1329 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 1393 | if (m_assetFailed) |
1330 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 1394 | { |
1395 | d.GeomSetCategoryBits(prim_geom, 0); | ||
1396 | d.GeomSetCollideBits(prim_geom, BadAssetColideBits()); | ||
1397 | } | ||
1398 | else | ||
1399 | { | ||
1400 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | ||
1401 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
1402 | } | ||
1331 | 1403 | ||
1332 | if (IsPhysical) | 1404 | if (IsPhysical) |
1333 | { | 1405 | { |
@@ -1504,6 +1576,8 @@ Console.WriteLine("CreateGeom:"); | |||
1504 | // m_log.Debug(m_localID); | 1576 | // m_log.Debug(m_localID); |
1505 | if (mesh == null) | 1577 | if (mesh == null) |
1506 | CheckMeshAsset(); | 1578 | CheckMeshAsset(); |
1579 | else | ||
1580 | m_assetFailed = false; | ||
1507 | } | 1581 | } |
1508 | 1582 | ||
1509 | #if SPAM | 1583 | #if SPAM |
@@ -2007,6 +2081,8 @@ Console.WriteLine(" JointCreateFixed"); | |||
2007 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical); | 2081 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical); |
2008 | if (mesh == null) | 2082 | if (mesh == null) |
2009 | CheckMeshAsset(); | 2083 | CheckMeshAsset(); |
2084 | else | ||
2085 | m_assetFailed = false; | ||
2010 | } | 2086 | } |
2011 | 2087 | ||
2012 | } | 2088 | } |
@@ -2060,9 +2136,12 @@ Console.WriteLine(" JointCreateFixed"); | |||
2060 | m_collisionFlags &= ~CollisionCategories.Water; | 2136 | m_collisionFlags &= ~CollisionCategories.Water; |
2061 | } | 2137 | } |
2062 | 2138 | ||
2063 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 2139 | if (m_assetFailed) |
2064 | } | 2140 | d.GeomSetCollideBits(prim_geom, BadAssetColideBits()); |
2141 | else | ||
2065 | 2142 | ||
2143 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | ||
2144 | } | ||
2066 | /// <summary> | 2145 | /// <summary> |
2067 | /// Change prim in response to a shape taint. | 2146 | /// Change prim in response to a shape taint. |
2068 | /// </summary> | 2147 | /// </summary> |
@@ -2110,6 +2189,8 @@ Console.WriteLine(" JointCreateFixed"); | |||
2110 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical); | 2189 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical); |
2111 | if (mesh == null) | 2190 | if (mesh == null) |
2112 | CheckMeshAsset(); | 2191 | CheckMeshAsset(); |
2192 | else | ||
2193 | m_assetFailed = false; | ||
2113 | } | 2194 | } |
2114 | 2195 | ||
2115 | CreateGeom(m_targetSpace, mesh); | 2196 | CreateGeom(m_targetSpace, mesh); |
@@ -3278,7 +3359,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
3278 | 3359 | ||
3279 | _pbs.SculptData = new byte[asset.Data.Length]; | 3360 | _pbs.SculptData = new byte[asset.Data.Length]; |
3280 | asset.Data.CopyTo(_pbs.SculptData, 0); | 3361 | asset.Data.CopyTo(_pbs.SculptData, 0); |
3281 | m_assetFailed = false; | 3362 | // m_assetFailed = false; |
3282 | m_taintshape = true; | 3363 | m_taintshape = true; |
3283 | _parent_scene.AddPhysicsActorTaint(this); | 3364 | _parent_scene.AddPhysicsActorTaint(this); |
3284 | } | 3365 | } |