diff options
Merge branch 'master' into bulletsim
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/ODEPrim.cs')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 279 |
1 files changed, 138 insertions, 141 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index b3045bd..924d7c2 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -61,6 +61,22 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
61 | { | 61 | { |
62 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 62 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
63 | 63 | ||
64 | private bool m_isphysical; | ||
65 | |||
66 | /// <summary> | ||
67 | /// Is this prim subject to physics? Even if not, it's still solid for collision purposes. | ||
68 | /// </summary> | ||
69 | public override bool IsPhysical | ||
70 | { | ||
71 | get { return m_isphysical; } | ||
72 | set | ||
73 | { | ||
74 | m_isphysical = value; | ||
75 | if (!m_isphysical) // Zero the remembered last velocity | ||
76 | m_lastVelocity = Vector3.Zero; | ||
77 | } | ||
78 | } | ||
79 | |||
64 | private Vector3 _position; | 80 | private Vector3 _position; |
65 | private Vector3 _velocity; | 81 | private Vector3 _velocity; |
66 | private Vector3 _torque; | 82 | private Vector3 _torque; |
@@ -138,12 +154,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
138 | private List<Vector3> m_forcelist = new List<Vector3>(); | 154 | private List<Vector3> m_forcelist = new List<Vector3>(); |
139 | private List<Vector3> m_angularforcelist = new List<Vector3>(); | 155 | private List<Vector3> m_angularforcelist = new List<Vector3>(); |
140 | 156 | ||
141 | private IMesh _mesh; | ||
142 | private PrimitiveBaseShape _pbs; | 157 | private PrimitiveBaseShape _pbs; |
143 | private OdeScene _parent_scene; | 158 | private OdeScene _parent_scene; |
159 | |||
160 | /// <summary> | ||
161 | /// The physics space which contains prim geometries | ||
162 | /// </summary> | ||
144 | public IntPtr m_targetSpace = IntPtr.Zero; | 163 | public IntPtr m_targetSpace = IntPtr.Zero; |
164 | |||
145 | public IntPtr prim_geom; | 165 | public IntPtr prim_geom; |
146 | public IntPtr prev_geom; | ||
147 | public IntPtr _triMeshData; | 166 | public IntPtr _triMeshData; |
148 | 167 | ||
149 | private IntPtr _linkJointGroup = IntPtr.Zero; | 168 | private IntPtr _linkJointGroup = IntPtr.Zero; |
@@ -153,7 +172,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
153 | private List<OdePrim> childrenPrim = new List<OdePrim>(); | 172 | private List<OdePrim> childrenPrim = new List<OdePrim>(); |
154 | 173 | ||
155 | private bool iscolliding; | 174 | private bool iscolliding; |
156 | private bool m_isphysical; | ||
157 | private bool m_isSelected; | 175 | private bool m_isSelected; |
158 | 176 | ||
159 | internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively | 177 | internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively |
@@ -188,7 +206,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
188 | internal int m_material = (int)Material.Wood; | 206 | internal int m_material = (int)Material.Wood; |
189 | 207 | ||
190 | public OdePrim(String primName, OdeScene parent_scene, Vector3 pos, Vector3 size, | 208 | public OdePrim(String primName, OdeScene parent_scene, Vector3 pos, Vector3 size, |
191 | Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode) | 209 | Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode) |
192 | { | 210 | { |
193 | Name = primName; | 211 | Name = primName; |
194 | m_vehicle = new ODEDynamics(); | 212 | m_vehicle = new ODEDynamics(); |
@@ -208,9 +226,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
208 | // m_tensor = parent_scene.bodyMotorJointMaxforceTensor; | 226 | // m_tensor = parent_scene.bodyMotorJointMaxforceTensor; |
209 | body_autodisable_frames = parent_scene.bodyFramesAutoDisable; | 227 | body_autodisable_frames = parent_scene.bodyFramesAutoDisable; |
210 | 228 | ||
211 | |||
212 | prim_geom = IntPtr.Zero; | 229 | prim_geom = IntPtr.Zero; |
213 | prev_geom = IntPtr.Zero; | ||
214 | 230 | ||
215 | if (!pos.IsFinite()) | 231 | if (!pos.IsFinite()) |
216 | { | 232 | { |
@@ -233,20 +249,21 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
233 | 249 | ||
234 | _orientation = rotation; | 250 | _orientation = rotation; |
235 | m_taintrot = _orientation; | 251 | m_taintrot = _orientation; |
236 | _mesh = mesh; | ||
237 | _pbs = pbs; | 252 | _pbs = pbs; |
238 | 253 | ||
239 | _parent_scene = parent_scene; | 254 | _parent_scene = parent_scene; |
240 | m_targetSpace = (IntPtr)0; | 255 | m_targetSpace = (IntPtr)0; |
241 | 256 | ||
242 | if (pos.Z < 0) | 257 | if (pos.Z < 0) |
243 | m_isphysical = false; | 258 | { |
259 | IsPhysical = false; | ||
260 | } | ||
244 | else | 261 | else |
245 | { | 262 | { |
246 | m_isphysical = pisPhysical; | 263 | IsPhysical = pisPhysical; |
247 | // If we're physical, we need to be in the master space for now. | 264 | // If we're physical, we need to be in the master space for now. |
248 | // linksets *should* be in a space together.. but are not currently | 265 | // linksets *should* be in a space together.. but are not currently |
249 | if (m_isphysical) | 266 | if (IsPhysical) |
250 | m_targetSpace = _parent_scene.space; | 267 | m_targetSpace = _parent_scene.space; |
251 | } | 268 | } |
252 | 269 | ||
@@ -289,7 +306,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
289 | // through it while it's selected | 306 | // through it while it's selected |
290 | m_collisionscore = 0; | 307 | m_collisionscore = 0; |
291 | 308 | ||
292 | if ((m_isphysical && !_zeroFlag) || !value) | 309 | if ((IsPhysical && !_zeroFlag) || !value) |
293 | { | 310 | { |
294 | m_taintselected = value; | 311 | m_taintselected = value; |
295 | _parent_scene.AddPhysicsActorTaint(this); | 312 | _parent_scene.AddPhysicsActorTaint(this); |
@@ -305,15 +322,21 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
305 | } | 322 | } |
306 | } | 323 | } |
307 | 324 | ||
325 | /// <summary> | ||
326 | /// Set a new geometry for this prim. | ||
327 | /// </summary> | ||
328 | /// <param name="geom"></param> | ||
308 | public void SetGeom(IntPtr geom) | 329 | public void SetGeom(IntPtr geom) |
309 | { | 330 | { |
310 | prev_geom = prim_geom; | ||
311 | prim_geom = geom; | 331 | prim_geom = geom; |
312 | //Console.WriteLine("SetGeom to " + prim_geom + " for " + Name); | 332 | //Console.WriteLine("SetGeom to " + prim_geom + " for " + Name); |
313 | if (prim_geom != IntPtr.Zero) | 333 | if (prim_geom != IntPtr.Zero) |
314 | { | 334 | { |
315 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 335 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); |
316 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 336 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
337 | |||
338 | _parent_scene.geom_name_map[prim_geom] = Name; | ||
339 | _parent_scene.actor_name_map[prim_geom] = this; | ||
317 | } | 340 | } |
318 | 341 | ||
319 | if (childPrim) | 342 | if (childPrim) |
@@ -332,7 +355,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
332 | { | 355 | { |
333 | if (!childPrim) | 356 | if (!childPrim) |
334 | { | 357 | { |
335 | if (m_isphysical && Body != IntPtr.Zero) | 358 | if (IsPhysical && Body != IntPtr.Zero) |
336 | { | 359 | { |
337 | d.BodyEnable(Body); | 360 | d.BodyEnable(Body); |
338 | if (m_vehicle.Type != Vehicle.TYPE_NONE) | 361 | if (m_vehicle.Type != Vehicle.TYPE_NONE) |
@@ -347,12 +370,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
347 | { | 370 | { |
348 | m_disabled = true; | 371 | m_disabled = true; |
349 | 372 | ||
350 | if (m_isphysical && Body != IntPtr.Zero) | 373 | if (IsPhysical && Body != IntPtr.Zero) |
351 | { | 374 | { |
352 | d.BodyDisable(Body); | 375 | d.BodyDisable(Body); |
353 | } | 376 | } |
354 | } | 377 | } |
355 | 378 | ||
379 | /// <summary> | ||
380 | /// Make a prim subject to physics. | ||
381 | /// </summary> | ||
356 | public void enableBody() | 382 | public void enableBody() |
357 | { | 383 | { |
358 | // Don't enable this body if we're a child prim | 384 | // Don't enable this body if we're a child prim |
@@ -728,6 +754,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
728 | } | 754 | } |
729 | } | 755 | } |
730 | 756 | ||
757 | /// <summary> | ||
758 | /// Stop a prim from being subject to physics. | ||
759 | /// </summary> | ||
731 | public void disableBody() | 760 | public void disableBody() |
732 | { | 761 | { |
733 | //this kills the body so things like 'mesh' can re-create it. | 762 | //this kills the body so things like 'mesh' can re-create it. |
@@ -778,6 +807,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
778 | Body = IntPtr.Zero; | 807 | Body = IntPtr.Zero; |
779 | } | 808 | } |
780 | } | 809 | } |
810 | |||
781 | m_disabled = true; | 811 | m_disabled = true; |
782 | m_collisionscore = 0; | 812 | m_collisionscore = 0; |
783 | } | 813 | } |
@@ -886,7 +916,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
886 | } | 916 | } |
887 | } | 917 | } |
888 | 918 | ||
889 | if (m_taintPhysics != m_isphysical && !(m_taintparent != _parent)) | 919 | if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent)) |
890 | changePhysicsStatus(timestep); | 920 | changePhysicsStatus(timestep); |
891 | 921 | ||
892 | if (!_size.ApproxEquals(m_taintsize, 0f)) | 922 | if (!_size.ApproxEquals(m_taintsize, 0f)) |
@@ -968,7 +998,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
968 | OdePrim obj = (OdePrim)m_taintparent; | 998 | OdePrim obj = (OdePrim)m_taintparent; |
969 | //obj.disableBody(); | 999 | //obj.disableBody(); |
970 | //Console.WriteLine("changelink calls ParentPrim"); | 1000 | //Console.WriteLine("changelink calls ParentPrim"); |
971 | obj.ParentPrim(this); | 1001 | obj.AddChildPrim(this); |
972 | 1002 | ||
973 | /* | 1003 | /* |
974 | if (obj.Body != (IntPtr)0 && Body != (IntPtr)0 && obj.Body != Body) | 1004 | if (obj.Body != (IntPtr)0 && Body != (IntPtr)0 && obj.Body != Body) |
@@ -1005,14 +1035,16 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1005 | } | 1035 | } |
1006 | 1036 | ||
1007 | _parent = m_taintparent; | 1037 | _parent = m_taintparent; |
1008 | m_taintPhysics = m_isphysical; | 1038 | m_taintPhysics = IsPhysical; |
1009 | } | 1039 | } |
1010 | 1040 | ||
1011 | // I'm the parent | 1041 | /// <summary> |
1012 | // prim is the child | 1042 | /// Add a child prim to this parent prim. |
1013 | public void ParentPrim(OdePrim prim) | 1043 | /// </summary> |
1044 | /// <param name="prim">Child prim</param> | ||
1045 | public void AddChildPrim(OdePrim prim) | ||
1014 | { | 1046 | { |
1015 | //Console.WriteLine("ParentPrim " + Name); | 1047 | //Console.WriteLine("AddChildPrim " + Name); |
1016 | if (this.m_localID != prim.m_localID) | 1048 | if (this.m_localID != prim.m_localID) |
1017 | { | 1049 | { |
1018 | if (Body == IntPtr.Zero) | 1050 | if (Body == IntPtr.Zero) |
@@ -1035,7 +1067,6 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1035 | d.MassSetZero(out m2); | 1067 | d.MassSetZero(out m2); |
1036 | d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z); | 1068 | d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z); |
1037 | 1069 | ||
1038 | |||
1039 | d.Quaternion quat = new d.Quaternion(); | 1070 | d.Quaternion quat = new d.Quaternion(); |
1040 | quat.W = prm._orientation.W; | 1071 | quat.W = prm._orientation.W; |
1041 | quat.X = prm._orientation.X; | 1072 | quat.X = prm._orientation.X; |
@@ -1105,6 +1136,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1105 | prm.Body = Body; | 1136 | prm.Body = Body; |
1106 | _parent_scene.addActivePrim(prm); | 1137 | _parent_scene.addActivePrim(prm); |
1107 | } | 1138 | } |
1139 | |||
1108 | m_collisionCategories |= CollisionCategories.Body; | 1140 | m_collisionCategories |= CollisionCategories.Body; |
1109 | m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); | 1141 | m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind); |
1110 | 1142 | ||
@@ -1113,7 +1145,6 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1113 | //Console.WriteLine(" Post GeomSetCategoryBits 2"); | 1145 | //Console.WriteLine(" Post GeomSetCategoryBits 2"); |
1114 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 1146 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
1115 | 1147 | ||
1116 | |||
1117 | d.Quaternion quat2 = new d.Quaternion(); | 1148 | d.Quaternion quat2 = new d.Quaternion(); |
1118 | quat2.W = _orientation.W; | 1149 | quat2.W = _orientation.W; |
1119 | quat2.X = _orientation.X; | 1150 | quat2.X = _orientation.X; |
@@ -1135,7 +1166,6 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1135 | d.BodySetAutoDisableFlag(Body, true); | 1166 | d.BodySetAutoDisableFlag(Body, true); |
1136 | d.BodySetAutoDisableSteps(Body, body_autodisable_frames); | 1167 | d.BodySetAutoDisableSteps(Body, body_autodisable_frames); |
1137 | 1168 | ||
1138 | |||
1139 | m_interpenetrationcount = 0; | 1169 | m_interpenetrationcount = 0; |
1140 | m_collisionscore = 0; | 1170 | m_collisionscore = 0; |
1141 | m_disabled = false; | 1171 | m_disabled = false; |
@@ -1146,7 +1176,9 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1146 | createAMotor(m_angularlock); | 1176 | createAMotor(m_angularlock); |
1147 | } | 1177 | } |
1148 | d.BodySetPosition(Body, Position.X, Position.Y, Position.Z); | 1178 | d.BodySetPosition(Body, Position.X, Position.Y, Position.Z); |
1149 | if (m_vehicle.Type != Vehicle.TYPE_NONE) m_vehicle.Enable(Body, _parent_scene); | 1179 | if (m_vehicle.Type != Vehicle.TYPE_NONE) |
1180 | m_vehicle.Enable(Body, _parent_scene); | ||
1181 | |||
1150 | _parent_scene.addActivePrim(this); | 1182 | _parent_scene.addActivePrim(this); |
1151 | } | 1183 | } |
1152 | } | 1184 | } |
@@ -1156,7 +1188,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1156 | 1188 | ||
1157 | private void ChildSetGeom(OdePrim odePrim) | 1189 | private void ChildSetGeom(OdePrim odePrim) |
1158 | { | 1190 | { |
1159 | //if (m_isphysical && Body != IntPtr.Zero) | 1191 | //if (IsPhysical && Body != IntPtr.Zero) |
1160 | lock (childrenPrim) | 1192 | lock (childrenPrim) |
1161 | { | 1193 | { |
1162 | foreach (OdePrim prm in childrenPrim) | 1194 | foreach (OdePrim prm in childrenPrim) |
@@ -1172,7 +1204,6 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1172 | } | 1204 | } |
1173 | disableBody(); | 1205 | disableBody(); |
1174 | 1206 | ||
1175 | |||
1176 | if (Body != IntPtr.Zero) | 1207 | if (Body != IntPtr.Zero) |
1177 | { | 1208 | { |
1178 | _parent_scene.remActivePrim(this); | 1209 | _parent_scene.remActivePrim(this); |
@@ -1183,10 +1214,9 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1183 | foreach (OdePrim prm in childrenPrim) | 1214 | foreach (OdePrim prm in childrenPrim) |
1184 | { | 1215 | { |
1185 | //Console.WriteLine("ChildSetGeom calls ParentPrim"); | 1216 | //Console.WriteLine("ChildSetGeom calls ParentPrim"); |
1186 | ParentPrim(prm); | 1217 | AddChildPrim(prm); |
1187 | } | 1218 | } |
1188 | } | 1219 | } |
1189 | |||
1190 | } | 1220 | } |
1191 | 1221 | ||
1192 | private void ChildDelink(OdePrim odePrim) | 1222 | private void ChildDelink(OdePrim odePrim) |
@@ -1223,7 +1253,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1223 | foreach (OdePrim prm in childrenPrim) | 1253 | foreach (OdePrim prm in childrenPrim) |
1224 | { | 1254 | { |
1225 | //Console.WriteLine("ChildDelink calls ParentPrim"); | 1255 | //Console.WriteLine("ChildDelink calls ParentPrim"); |
1226 | ParentPrim(prm); | 1256 | AddChildPrim(prm); |
1227 | } | 1257 | } |
1228 | } | 1258 | } |
1229 | } | 1259 | } |
@@ -1257,7 +1287,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1257 | // first 50 again. then the last 50 are disabled. then the first 50, which were just woken | 1287 | // first 50 again. then the last 50 are disabled. then the first 50, which were just woken |
1258 | // up, start simulating again, which in turn wakes up the last 50. | 1288 | // up, start simulating again, which in turn wakes up the last 50. |
1259 | 1289 | ||
1260 | if (m_isphysical) | 1290 | if (IsPhysical) |
1261 | { | 1291 | { |
1262 | disableBodySoft(); | 1292 | disableBodySoft(); |
1263 | } | 1293 | } |
@@ -1268,7 +1298,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1268 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 1298 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
1269 | } | 1299 | } |
1270 | 1300 | ||
1271 | if (m_isphysical) | 1301 | if (IsPhysical) |
1272 | { | 1302 | { |
1273 | disableBodySoft(); | 1303 | disableBodySoft(); |
1274 | } | 1304 | } |
@@ -1277,7 +1307,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1277 | { | 1307 | { |
1278 | m_collisionCategories = CollisionCategories.Geom; | 1308 | m_collisionCategories = CollisionCategories.Geom; |
1279 | 1309 | ||
1280 | if (m_isphysical) | 1310 | if (IsPhysical) |
1281 | m_collisionCategories |= CollisionCategories.Body; | 1311 | m_collisionCategories |= CollisionCategories.Body; |
1282 | 1312 | ||
1283 | m_collisionFlags = m_default_collisionFlags; | 1313 | m_collisionFlags = m_default_collisionFlags; |
@@ -1292,7 +1322,8 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1292 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); | 1322 | d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories); |
1293 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); | 1323 | d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); |
1294 | } | 1324 | } |
1295 | if (m_isphysical) | 1325 | |
1326 | if (IsPhysical) | ||
1296 | { | 1327 | { |
1297 | if (Body != IntPtr.Zero) | 1328 | if (Body != IntPtr.Zero) |
1298 | { | 1329 | { |
@@ -1311,7 +1342,7 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1311 | { | 1342 | { |
1312 | m_taintposition = _position; | 1343 | m_taintposition = _position; |
1313 | m_taintrot = _orientation; | 1344 | m_taintrot = _orientation; |
1314 | m_taintPhysics = m_isphysical; | 1345 | m_taintPhysics = IsPhysical; |
1315 | m_taintselected = m_isSelected; | 1346 | m_taintselected = m_isSelected; |
1316 | m_taintsize = _size; | 1347 | m_taintsize = _size; |
1317 | m_taintshape = false; | 1348 | m_taintshape = false; |
@@ -1320,14 +1351,19 @@ Console.WriteLine("ZProcessTaints for " + Name); | |||
1320 | m_taintVelocity = Vector3.Zero; | 1351 | m_taintVelocity = Vector3.Zero; |
1321 | } | 1352 | } |
1322 | 1353 | ||
1323 | public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh) | 1354 | /// <summary> |
1355 | /// Create a geometry for the given mesh in the given target space. | ||
1356 | /// </summary> | ||
1357 | /// <param name="m_targetSpace"></param> | ||
1358 | /// <param name="mesh">If null, then a mesh is used that is based on the profile shape data.</param> | ||
1359 | public void CreateGeom(IntPtr m_targetSpace, IMesh mesh) | ||
1324 | { | 1360 | { |
1325 | #if SPAM | 1361 | #if SPAM |
1326 | Console.WriteLine("CreateGeom:"); | 1362 | Console.WriteLine("CreateGeom:"); |
1327 | #endif | 1363 | #endif |
1328 | if (_mesh != null) | 1364 | if (mesh != null) |
1329 | { | 1365 | { |
1330 | setMesh(_parent_scene, _mesh); | 1366 | setMesh(_parent_scene, mesh); |
1331 | } | 1367 | } |
1332 | else | 1368 | else |
1333 | { | 1369 | { |
@@ -1400,6 +1436,39 @@ Console.WriteLine("CreateGeom:"); | |||
1400 | } | 1436 | } |
1401 | } | 1437 | } |
1402 | 1438 | ||
1439 | /// <summary> | ||
1440 | /// Remove the existing geom from this prim. | ||
1441 | /// </summary> | ||
1442 | /// <param name="m_targetSpace"></param> | ||
1443 | /// <param name="mesh">If null, then a mesh is used that is based on the profile shape data.</param> | ||
1444 | /// <returns>true if the geom was successfully removed, false if it was already gone or the remove failed.</returns> | ||
1445 | public bool RemoveGeom() | ||
1446 | { | ||
1447 | if (prim_geom != IntPtr.Zero) | ||
1448 | { | ||
1449 | try | ||
1450 | { | ||
1451 | _parent_scene.geom_name_map.Remove(prim_geom); | ||
1452 | _parent_scene.actor_name_map.Remove(prim_geom); | ||
1453 | d.GeomDestroy(prim_geom); | ||
1454 | prim_geom = IntPtr.Zero; | ||
1455 | } | ||
1456 | catch (System.AccessViolationException) | ||
1457 | { | ||
1458 | prim_geom = IntPtr.Zero; | ||
1459 | m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name); | ||
1460 | |||
1461 | return false; | ||
1462 | } | ||
1463 | |||
1464 | return true; | ||
1465 | } | ||
1466 | else | ||
1467 | { | ||
1468 | return false; | ||
1469 | } | ||
1470 | } | ||
1471 | |||
1403 | public void changeadd(float timestep) | 1472 | public void changeadd(float timestep) |
1404 | { | 1473 | { |
1405 | int[] iprimspaceArrItem = _parent_scene.calculateSpaceArrayItemFromPos(_position); | 1474 | int[] iprimspaceArrItem = _parent_scene.calculateSpaceArrayItemFromPos(_position); |
@@ -1410,15 +1479,14 @@ Console.WriteLine("CreateGeom:"); | |||
1410 | 1479 | ||
1411 | m_targetSpace = targetspace; | 1480 | m_targetSpace = targetspace; |
1412 | 1481 | ||
1413 | if (_mesh == null) | 1482 | IMesh mesh = null; |
1483 | |||
1484 | if (_parent_scene.needsMeshing(_pbs)) | ||
1414 | { | 1485 | { |
1415 | if (_parent_scene.needsMeshing(_pbs)) | 1486 | // Don't need to re-enable body.. it's done in SetMesh |
1416 | { | 1487 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, _parent_scene.meshSculptLOD, IsPhysical); |
1417 | // Don't need to re-enable body.. it's done in SetMesh | 1488 | // createmesh returns null when it's a shape that isn't a cube. |
1418 | _mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, _parent_scene.meshSculptLOD, IsPhysical); | 1489 | // m_log.Debug(m_localID); |
1419 | // createmesh returns null when it's a shape that isn't a cube. | ||
1420 | // m_log.Debug(m_localID); | ||
1421 | } | ||
1422 | } | 1490 | } |
1423 | 1491 | ||
1424 | lock (_parent_scene.OdeLock) | 1492 | lock (_parent_scene.OdeLock) |
@@ -1426,7 +1494,7 @@ Console.WriteLine("CreateGeom:"); | |||
1426 | #if SPAM | 1494 | #if SPAM |
1427 | Console.WriteLine("changeadd 1"); | 1495 | Console.WriteLine("changeadd 1"); |
1428 | #endif | 1496 | #endif |
1429 | CreateGeom(m_targetSpace, _mesh); | 1497 | CreateGeom(m_targetSpace, mesh); |
1430 | 1498 | ||
1431 | if (prim_geom != IntPtr.Zero) | 1499 | if (prim_geom != IntPtr.Zero) |
1432 | { | 1500 | { |
@@ -1439,15 +1507,12 @@ Console.WriteLine("changeadd 1"); | |||
1439 | d.GeomSetQuaternion(prim_geom, ref myrot); | 1507 | d.GeomSetQuaternion(prim_geom, ref myrot); |
1440 | } | 1508 | } |
1441 | 1509 | ||
1442 | if (m_isphysical && Body == IntPtr.Zero) | 1510 | if (IsPhysical && Body == IntPtr.Zero) |
1443 | { | 1511 | { |
1444 | enableBody(); | 1512 | enableBody(); |
1445 | } | 1513 | } |
1446 | } | 1514 | } |
1447 | 1515 | ||
1448 | _parent_scene.geom_name_map[prim_geom] = this.Name; | ||
1449 | _parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this; | ||
1450 | |||
1451 | changeSelectedStatus(timestep); | 1516 | changeSelectedStatus(timestep); |
1452 | 1517 | ||
1453 | m_taintadd = false; | 1518 | m_taintadd = false; |
@@ -1455,9 +1520,8 @@ Console.WriteLine("changeadd 1"); | |||
1455 | 1520 | ||
1456 | public void changemove(float timestep) | 1521 | public void changemove(float timestep) |
1457 | { | 1522 | { |
1458 | if (m_isphysical) | 1523 | if (IsPhysical) |
1459 | { | 1524 | { |
1460 | |||
1461 | if (!m_disabled && !m_taintremove && !childPrim) | 1525 | if (!m_disabled && !m_taintremove && !childPrim) |
1462 | { | 1526 | { |
1463 | if (Body == IntPtr.Zero) | 1527 | if (Body == IntPtr.Zero) |
@@ -1789,7 +1853,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
1789 | { | 1853 | { |
1790 | // KF: If this is a root prim do BodySet | 1854 | // KF: If this is a root prim do BodySet |
1791 | d.BodySetQuaternion(Body, ref myrot); | 1855 | d.BodySetQuaternion(Body, ref myrot); |
1792 | if (m_isphysical) | 1856 | if (IsPhysical) |
1793 | { | 1857 | { |
1794 | if (!m_angularlock.ApproxEquals(Vector3.One, 0f)) | 1858 | if (!m_angularlock.ApproxEquals(Vector3.One, 0f)) |
1795 | createAMotor(m_angularlock); | 1859 | createAMotor(m_angularlock); |
@@ -1826,7 +1890,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
1826 | 1890 | ||
1827 | public void changePhysicsStatus(float timestep) | 1891 | public void changePhysicsStatus(float timestep) |
1828 | { | 1892 | { |
1829 | if (m_isphysical == true) | 1893 | if (IsPhysical) |
1830 | { | 1894 | { |
1831 | if (Body == IntPtr.Zero) | 1895 | if (Body == IntPtr.Zero) |
1832 | { | 1896 | { |
@@ -1846,25 +1910,12 @@ Console.WriteLine(" JointCreateFixed"); | |||
1846 | { | 1910 | { |
1847 | if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim) | 1911 | if (_pbs.SculptEntry && _parent_scene.meshSculptedPrim) |
1848 | { | 1912 | { |
1849 | 1913 | RemoveGeom(); | |
1850 | 1914 | ||
1851 | if (prim_geom != IntPtr.Zero) | ||
1852 | { | ||
1853 | try | ||
1854 | { | ||
1855 | d.GeomDestroy(prim_geom); | ||
1856 | prim_geom = IntPtr.Zero; | ||
1857 | _mesh = null; | ||
1858 | } | ||
1859 | catch (System.AccessViolationException) | ||
1860 | { | ||
1861 | prim_geom = IntPtr.Zero; | ||
1862 | m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name); | ||
1863 | } | ||
1864 | } | ||
1865 | //Console.WriteLine("changePhysicsStatus for " + Name); | 1915 | //Console.WriteLine("changePhysicsStatus for " + Name); |
1866 | changeadd(2f); | 1916 | changeadd(2f); |
1867 | } | 1917 | } |
1918 | |||
1868 | if (childPrim) | 1919 | if (childPrim) |
1869 | { | 1920 | { |
1870 | if (_parent != null) | 1921 | if (_parent != null) |
@@ -1883,7 +1934,7 @@ Console.WriteLine(" JointCreateFixed"); | |||
1883 | changeSelectedStatus(timestep); | 1934 | changeSelectedStatus(timestep); |
1884 | 1935 | ||
1885 | resetCollisionAccounting(); | 1936 | resetCollisionAccounting(); |
1886 | m_taintPhysics = m_isphysical; | 1937 | m_taintPhysics = IsPhysical; |
1887 | } | 1938 | } |
1888 | 1939 | ||
1889 | public void changesize(float timestamp) | 1940 | public void changesize(float timestamp) |
@@ -1892,18 +1943,10 @@ Console.WriteLine(" JointCreateFixed"); | |||
1892 | m_log.DebugFormat("[ODE PRIM]: Called changesize"); | 1943 | m_log.DebugFormat("[ODE PRIM]: Called changesize"); |
1893 | #endif | 1944 | #endif |
1894 | 1945 | ||
1895 | string oldname = _parent_scene.geom_name_map[prim_geom]; | ||
1896 | |||
1897 | if (_size.X <= 0) _size.X = 0.01f; | 1946 | if (_size.X <= 0) _size.X = 0.01f; |
1898 | if (_size.Y <= 0) _size.Y = 0.01f; | 1947 | if (_size.Y <= 0) _size.Y = 0.01f; |
1899 | if (_size.Z <= 0) _size.Z = 0.01f; | 1948 | if (_size.Z <= 0) _size.Z = 0.01f; |
1900 | 1949 | ||
1901 | // Cleanup of old prim geometry | ||
1902 | if (_mesh != null) | ||
1903 | { | ||
1904 | // TODO: Cleanup meshing here | ||
1905 | } | ||
1906 | |||
1907 | //kill body to rebuild | 1950 | //kill body to rebuild |
1908 | if (IsPhysical && Body != IntPtr.Zero) | 1951 | if (IsPhysical && Body != IntPtr.Zero) |
1909 | { | 1952 | { |
@@ -1927,10 +1970,12 @@ Console.WriteLine(" JointCreateFixed"); | |||
1927 | d.SpaceRemove(m_targetSpace, prim_geom); | 1970 | d.SpaceRemove(m_targetSpace, prim_geom); |
1928 | } | 1971 | } |
1929 | 1972 | ||
1930 | d.GeomDestroy(prim_geom); | 1973 | RemoveGeom(); |
1931 | prim_geom = IntPtr.Zero; | 1974 | |
1932 | // we don't need to do space calculation because the client sends a position update also. | 1975 | // we don't need to do space calculation because the client sends a position update also. |
1933 | 1976 | ||
1977 | IMesh mesh = null; | ||
1978 | |||
1934 | // Construction of new prim | 1979 | // Construction of new prim |
1935 | if (_parent_scene.needsMeshing(_pbs)) | 1980 | if (_parent_scene.needsMeshing(_pbs)) |
1936 | { | 1981 | { |
@@ -1940,27 +1985,11 @@ Console.WriteLine(" JointCreateFixed"); | |||
1940 | meshlod = _parent_scene.MeshSculptphysicalLOD; | 1985 | meshlod = _parent_scene.MeshSculptphysicalLOD; |
1941 | // Don't need to re-enable body.. it's done in SetMesh | 1986 | // Don't need to re-enable body.. it's done in SetMesh |
1942 | 1987 | ||
1943 | IMesh mesh = null; | ||
1944 | |||
1945 | if (_parent_scene.needsMeshing(_pbs)) | 1988 | if (_parent_scene.needsMeshing(_pbs)) |
1946 | mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical); | 1989 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical); |
1947 | |||
1948 | #if SPAM | ||
1949 | Console.WriteLine("changesize 1"); | ||
1950 | #endif | ||
1951 | CreateGeom(m_targetSpace, mesh); | ||
1952 | } | ||
1953 | else | ||
1954 | { | ||
1955 | _mesh = null; | ||
1956 | |||
1957 | #if SPAM | ||
1958 | Console.WriteLine("changesize 2"); | ||
1959 | #endif | ||
1960 | |||
1961 | CreateGeom(m_targetSpace, _mesh); | ||
1962 | } | 1990 | } |
1963 | 1991 | ||
1992 | CreateGeom(m_targetSpace, mesh); | ||
1964 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); | 1993 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); |
1965 | d.Quaternion myrot = new d.Quaternion(); | 1994 | d.Quaternion myrot = new d.Quaternion(); |
1966 | myrot.X = _orientation.X; | 1995 | myrot.X = _orientation.X; |
@@ -1978,8 +2007,6 @@ Console.WriteLine("changesize 2"); | |||
1978 | d.BodyEnable(Body); | 2007 | d.BodyEnable(Body); |
1979 | } | 2008 | } |
1980 | 2009 | ||
1981 | _parent_scene.geom_name_map[prim_geom] = oldname; | ||
1982 | |||
1983 | changeSelectedStatus(timestamp); | 2010 | changeSelectedStatus(timestamp); |
1984 | if (childPrim) | 2011 | if (childPrim) |
1985 | { | 2012 | { |
@@ -2013,8 +2040,6 @@ Console.WriteLine("changesize 2"); | |||
2013 | 2040 | ||
2014 | public void changeshape(float timestamp) | 2041 | public void changeshape(float timestamp) |
2015 | { | 2042 | { |
2016 | string oldname = _parent_scene.geom_name_map[prim_geom]; | ||
2017 | |||
2018 | // Cleanup of old prim geometry and Bodies | 2043 | // Cleanup of old prim geometry and Bodies |
2019 | if (IsPhysical && Body != IntPtr.Zero) | 2044 | if (IsPhysical && Body != IntPtr.Zero) |
2020 | { | 2045 | { |
@@ -2031,23 +2056,17 @@ Console.WriteLine("changesize 2"); | |||
2031 | disableBody(); | 2056 | disableBody(); |
2032 | } | 2057 | } |
2033 | } | 2058 | } |
2034 | try | ||
2035 | { | ||
2036 | d.GeomDestroy(prim_geom); | ||
2037 | } | ||
2038 | catch (System.AccessViolationException) | ||
2039 | { | ||
2040 | prim_geom = IntPtr.Zero; | ||
2041 | m_log.ErrorFormat("[PHYSICS]: PrimGeom dead for {0}", Name); | ||
2042 | } | ||
2043 | 2059 | ||
2044 | prim_geom = IntPtr.Zero; | 2060 | RemoveGeom(); |
2061 | |||
2045 | // we don't need to do space calculation because the client sends a position update also. | 2062 | // we don't need to do space calculation because the client sends a position update also. |
2046 | if (_size.X <= 0) _size.X = 0.01f; | 2063 | if (_size.X <= 0) _size.X = 0.01f; |
2047 | if (_size.Y <= 0) _size.Y = 0.01f; | 2064 | if (_size.Y <= 0) _size.Y = 0.01f; |
2048 | if (_size.Z <= 0) _size.Z = 0.01f; | 2065 | if (_size.Z <= 0) _size.Z = 0.01f; |
2049 | // Construction of new prim | 2066 | // Construction of new prim |
2050 | 2067 | ||
2068 | IMesh mesh = null; | ||
2069 | |||
2051 | if (_parent_scene.needsMeshing(_pbs)) | 2070 | if (_parent_scene.needsMeshing(_pbs)) |
2052 | { | 2071 | { |
2053 | // Don't need to re-enable body.. it's done in CreateMesh | 2072 | // Don't need to re-enable body.. it's done in CreateMesh |
@@ -2057,22 +2076,10 @@ Console.WriteLine("changesize 2"); | |||
2057 | meshlod = _parent_scene.MeshSculptphysicalLOD; | 2076 | meshlod = _parent_scene.MeshSculptphysicalLOD; |
2058 | 2077 | ||
2059 | // createmesh returns null when it doesn't mesh. | 2078 | // createmesh returns null when it doesn't mesh. |
2060 | IMesh mesh = _parent_scene.mesher.CreateMesh(oldname, _pbs, _size, meshlod, IsPhysical); | 2079 | mesh = _parent_scene.mesher.CreateMesh(Name, _pbs, _size, meshlod, IsPhysical); |
2061 | #if SPAM | ||
2062 | Console.WriteLine("changeshape needed meshing"); | ||
2063 | #endif | ||
2064 | CreateGeom(m_targetSpace, mesh); | ||
2065 | } | ||
2066 | else | ||
2067 | { | ||
2068 | _mesh = null; | ||
2069 | |||
2070 | #if SPAM | ||
2071 | Console.WriteLine("changeshape not need meshing"); | ||
2072 | #endif | ||
2073 | CreateGeom(m_targetSpace, null); | ||
2074 | } | 2080 | } |
2075 | 2081 | ||
2082 | CreateGeom(m_targetSpace, mesh); | ||
2076 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); | 2083 | d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z); |
2077 | d.Quaternion myrot = new d.Quaternion(); | 2084 | d.Quaternion myrot = new d.Quaternion(); |
2078 | //myrot.W = _orientation.w; | 2085 | //myrot.W = _orientation.w; |
@@ -2093,7 +2100,6 @@ Console.WriteLine("changeshape not need meshing"); | |||
2093 | d.BodyEnable(Body); | 2100 | d.BodyEnable(Body); |
2094 | } | 2101 | } |
2095 | } | 2102 | } |
2096 | _parent_scene.geom_name_map[prim_geom] = oldname; | ||
2097 | 2103 | ||
2098 | changeSelectedStatus(timestamp); | 2104 | changeSelectedStatus(timestamp); |
2099 | if (childPrim) | 2105 | if (childPrim) |
@@ -2216,16 +2222,6 @@ Console.WriteLine("changeshape not need meshing"); | |||
2216 | m_taintVelocity = Vector3.Zero; | 2222 | m_taintVelocity = Vector3.Zero; |
2217 | } | 2223 | } |
2218 | 2224 | ||
2219 | public override bool IsPhysical | ||
2220 | { | ||
2221 | get { return m_isphysical; } | ||
2222 | set { | ||
2223 | m_isphysical = value; | ||
2224 | if (!m_isphysical) // Zero the remembered last velocity | ||
2225 | m_lastVelocity = Vector3.Zero; | ||
2226 | } | ||
2227 | } | ||
2228 | |||
2229 | public void setPrimForRemoval() | 2225 | public void setPrimForRemoval() |
2230 | { | 2226 | { |
2231 | m_taintremove = true; | 2227 | m_taintremove = true; |
@@ -2404,7 +2400,7 @@ Console.WriteLine("changeshape not need meshing"); | |||
2404 | { | 2400 | { |
2405 | get | 2401 | get |
2406 | { | 2402 | { |
2407 | if (!m_isphysical || Body == IntPtr.Zero) | 2403 | if (!IsPhysical || Body == IntPtr.Zero) |
2408 | return Vector3.Zero; | 2404 | return Vector3.Zero; |
2409 | 2405 | ||
2410 | return _torque; | 2406 | return _torque; |
@@ -2986,12 +2982,12 @@ Console.WriteLine("changeshape not need meshing"); | |||
2986 | public override void SubscribeEvents(int ms) | 2982 | public override void SubscribeEvents(int ms) |
2987 | { | 2983 | { |
2988 | m_eventsubscription = ms; | 2984 | m_eventsubscription = ms; |
2989 | _parent_scene.addCollisionEventReporting(this); | 2985 | _parent_scene.AddCollisionEventReporting(this); |
2990 | } | 2986 | } |
2991 | 2987 | ||
2992 | public override void UnSubscribeEvents() | 2988 | public override void UnSubscribeEvents() |
2993 | { | 2989 | { |
2994 | _parent_scene.remCollisionEventReporting(this); | 2990 | _parent_scene.RemoveCollisionEventReporting(this); |
2995 | m_eventsubscription = 0; | 2991 | m_eventsubscription = 0; |
2996 | } | 2992 | } |
2997 | 2993 | ||
@@ -2999,6 +2995,7 @@ Console.WriteLine("changeshape not need meshing"); | |||
2999 | { | 2995 | { |
3000 | if (CollisionEventsThisFrame == null) | 2996 | if (CollisionEventsThisFrame == null) |
3001 | CollisionEventsThisFrame = new CollisionEventUpdate(); | 2997 | CollisionEventsThisFrame = new CollisionEventUpdate(); |
2998 | |||
3002 | CollisionEventsThisFrame.addCollider(CollidedWith, contact); | 2999 | CollisionEventsThisFrame.addCollider(CollidedWith, contact); |
3003 | } | 3000 | } |
3004 | 3001 | ||