diff options
author | Robert Adams | 2013-08-09 10:59:10 -0700 |
---|---|---|
committer | Robert Adams | 2013-09-11 09:11:52 -0700 |
commit | 455d36c4c70a55c5d48dc1410b8729929fafedf6 (patch) | |
tree | 2dad264f9a7c319cba213cfe486b38c6b0dca182 /OpenSim/Region/OptionalModules/Scripting | |
parent | BulletSim: update C++ HACD parameters to values that handle enclosed hollow s... (diff) | |
download | opensim-SC_OLD-455d36c4c70a55c5d48dc1410b8729929fafedf6.zip opensim-SC_OLD-455d36c4c70a55c5d48dc1410b8729929fafedf6.tar.gz opensim-SC_OLD-455d36c4c70a55c5d48dc1410b8729929fafedf6.tar.bz2 opensim-SC_OLD-455d36c4c70a55c5d48dc1410b8729929fafedf6.tar.xz |
BulletSim: add physChangeLinkParams to set individual parameters on link constraints. Not fully functional. Remove double definition of ExtendedPhysics parameters by having BulletSim reference the optional module (addition to prebuild.xml and usings).
Diffstat (limited to 'OpenSim/Region/OptionalModules/Scripting')
-rwxr-xr-x | OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs | 265 |
1 files changed, 171 insertions, 94 deletions
diff --git a/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs b/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs index 278e9e7..baf5a5b 100755 --- a/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs +++ b/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs | |||
@@ -36,6 +36,7 @@ using OpenSim.Region.CoreModules; | |||
36 | using OpenSim.Region.Framework; | 36 | using OpenSim.Region.Framework; |
37 | using OpenSim.Region.Framework.Interfaces; | 37 | using OpenSim.Region.Framework.Interfaces; |
38 | using OpenSim.Region.Framework.Scenes; | 38 | using OpenSim.Region.Framework.Scenes; |
39 | using OpenSim.Region.Physics.Manager; | ||
39 | 40 | ||
40 | using Mono.Addins; | 41 | using Mono.Addins; |
41 | using Nini.Config; | 42 | using Nini.Config; |
@@ -62,9 +63,8 @@ public class ExtendedPhysics : INonSharedRegionModule | |||
62 | public const string PhysFunctGetLinksetType = "BulletSim.GetLinksetType"; | 63 | public const string PhysFunctGetLinksetType = "BulletSim.GetLinksetType"; |
63 | public const string PhysFunctSetLinksetType = "BulletSim.SetLinksetType"; | 64 | public const string PhysFunctSetLinksetType = "BulletSim.SetLinksetType"; |
64 | public const string PhysFunctChangeLinkFixed = "BulletSim.ChangeLinkFixed"; | 65 | public const string PhysFunctChangeLinkFixed = "BulletSim.ChangeLinkFixed"; |
65 | public const string PhysFunctChangeLinkHinge = "BulletSim.ChangeLinkHinge"; | 66 | public const string PhysFunctChangeLinkType = "BulletSim.ChangeLinkType"; |
66 | public const string PhysFunctChangeLinkSpring = "BulletSim.ChangeLinkSpring"; | 67 | public const string PhysFunctChangeLinkParams = "BulletSim.ChangeLinkParams"; |
67 | public const string PhysFunctChangeLinkSlider = "BulletSim.ChangeLinkSlider"; | ||
68 | 68 | ||
69 | // ============================================================= | 69 | // ============================================================= |
70 | 70 | ||
@@ -200,7 +200,7 @@ public class ExtendedPhysics : INonSharedRegionModule | |||
200 | 200 | ||
201 | if (rootPart != null) | 201 | if (rootPart != null) |
202 | { | 202 | { |
203 | Physics.Manager.PhysicsActor rootPhysActor = rootPart.PhysActor; | 203 | PhysicsActor rootPhysActor = rootPart.PhysActor; |
204 | if (rootPhysActor != null) | 204 | if (rootPhysActor != null) |
205 | { | 205 | { |
206 | if (rootPhysActor.IsPhysical) | 206 | if (rootPhysActor.IsPhysical) |
@@ -219,7 +219,7 @@ public class ExtendedPhysics : INonSharedRegionModule | |||
219 | containingGroup.UpdateGroupPosition(containingGroup.AbsolutePosition); | 219 | containingGroup.UpdateGroupPosition(containingGroup.AbsolutePosition); |
220 | containingGroup.UpdateGroupRotationR(containingGroup.GroupRotation); | 220 | containingGroup.UpdateGroupRotationR(containingGroup.GroupRotation); |
221 | 221 | ||
222 | ret = (int)rootPhysActor.Extension(PhysFunctSetLinksetType, linksetType); | 222 | ret = MakeIntError(rootPhysActor.Extension(PhysFunctSetLinksetType, linksetType)); |
223 | Thread.Sleep(150); // longer than one heartbeat tick | 223 | Thread.Sleep(150); // longer than one heartbeat tick |
224 | 224 | ||
225 | containingGroup.ScriptSetPhysicsStatus(true); | 225 | containingGroup.ScriptSetPhysicsStatus(true); |
@@ -228,7 +228,7 @@ public class ExtendedPhysics : INonSharedRegionModule | |||
228 | { | 228 | { |
229 | // Non-physical linksets don't have a physical instantiation so there is no state to | 229 | // Non-physical linksets don't have a physical instantiation so there is no state to |
230 | // worry about being updated. | 230 | // worry about being updated. |
231 | ret = (int)rootPhysActor.Extension(PhysFunctSetLinksetType, linksetType); | 231 | ret = MakeIntError(rootPhysActor.Extension(PhysFunctSetLinksetType, linksetType)); |
232 | } | 232 | } |
233 | } | 233 | } |
234 | else | 234 | else |
@@ -267,10 +267,10 @@ public class ExtendedPhysics : INonSharedRegionModule | |||
267 | 267 | ||
268 | if (rootPart != null) | 268 | if (rootPart != null) |
269 | { | 269 | { |
270 | Physics.Manager.PhysicsActor rootPhysActor = rootPart.PhysActor; | 270 | PhysicsActor rootPhysActor = rootPart.PhysActor; |
271 | if (rootPhysActor != null) | 271 | if (rootPhysActor != null) |
272 | { | 272 | { |
273 | ret = (int)rootPhysActor.Extension(PhysFunctGetLinksetType); | 273 | ret = MakeIntError(rootPhysActor.Extension(PhysFunctGetLinksetType)); |
274 | } | 274 | } |
275 | else | 275 | else |
276 | { | 276 | { |
@@ -291,148 +291,225 @@ public class ExtendedPhysics : INonSharedRegionModule | |||
291 | return ret; | 291 | return ret; |
292 | } | 292 | } |
293 | 293 | ||
294 | [ScriptConstant] | ||
295 | public static int PHYS_LINK_TYPE_FIXED = 1234; | ||
296 | [ScriptConstant] | ||
297 | public static int PHYS_LINK_TYPE_HINGE = 4; | ||
298 | [ScriptConstant] | ||
299 | public static int PHYS_LINK_TYPE_SPRING = 9; | ||
300 | [ScriptConstant] | ||
301 | public static int PHYS_LINK_TYPE_6DOF = 6; | ||
302 | [ScriptConstant] | ||
303 | public static int PHYS_LINK_TYPE_SLIDER = 7; | ||
304 | |||
305 | // physChangeLinkType(integer linkNum, integer typeCode) | ||
306 | [ScriptInvocation] | ||
307 | public int physChangeLinkType(UUID hostID, UUID scriptID, int linkNum, int typeCode) | ||
308 | { | ||
309 | int ret = -1; | ||
310 | if (!Enabled) return ret; | ||
311 | |||
312 | PhysicsActor rootPhysActor; | ||
313 | PhysicsActor childPhysActor; | ||
314 | |||
315 | if (GetRootAndChildPhysActors(hostID, linkNum, out rootPhysActor, out childPhysActor)) | ||
316 | { | ||
317 | ret = MakeIntError(rootPhysActor.Extension(PhysFunctChangeLinkType, childPhysActor, typeCode)); | ||
318 | } | ||
319 | |||
320 | return ret; | ||
321 | } | ||
322 | |||
294 | // physChangeLinkFixed(integer linkNum) | 323 | // physChangeLinkFixed(integer linkNum) |
295 | // Change the link between the root and the linkNum into a fixed, static physical connection. | 324 | // Change the link between the root and the linkNum into a fixed, static physical connection. |
296 | // This needs to change 'linkNum' into the physical object because lower level code has | ||
297 | // no access to the link numbers. | ||
298 | [ScriptInvocation] | 325 | [ScriptInvocation] |
299 | public int physChangeLinkFixed(UUID hostID, UUID scriptID, int linkNum) | 326 | public int physChangeLinkFixed(UUID hostID, UUID scriptID, int linkNum) |
300 | { | 327 | { |
301 | int ret = -1; | 328 | int ret = -1; |
302 | if (!Enabled) return ret; | 329 | if (!Enabled) return ret; |
303 | 330 | ||
304 | // The part that is requesting the change. | 331 | PhysicsActor rootPhysActor; |
305 | SceneObjectPart requestingPart = BaseScene.GetSceneObjectPart(hostID); | 332 | PhysicsActor childPhysActor; |
333 | |||
334 | if (GetRootAndChildPhysActors(hostID, linkNum, out rootPhysActor, out childPhysActor)) | ||
335 | { | ||
336 | ret = MakeIntError(rootPhysActor.Extension(PhysFunctChangeLinkType, childPhysActor, PHYS_LINK_TYPE_FIXED)); | ||
337 | } | ||
338 | |||
339 | return ret; | ||
340 | } | ||
341 | |||
342 | // Code for specifying params. | ||
343 | // The choice if 14400 is arbitrary and only serves to catch parameter code misuse. | ||
344 | public static int PHYS_PARAM_MIN = 14401; | ||
345 | [ScriptConstant] | ||
346 | public static int PHYS_PARAM_FRAMEINA_LOC = 14401; | ||
347 | [ScriptConstant] | ||
348 | public static int PHYS_PARAM_FRAMEINA_ROT = 14402; | ||
349 | [ScriptConstant] | ||
350 | public static int PHYS_PARAM_FRAMEINB_LOC = 14403; | ||
351 | [ScriptConstant] | ||
352 | public static int PHYS_PARAM_FRAMEINB_ROT = 14404; | ||
353 | [ScriptConstant] | ||
354 | public static int PHYS_PARAM_LINEAR_LIMIT_LOW = 14405; | ||
355 | [ScriptConstant] | ||
356 | public static int PHYS_PARAM_LINEAR_LIMIT_HIGH = 14406; | ||
357 | [ScriptConstant] | ||
358 | public static int PHYS_PARAM_ANGULAR_LIMIT_LOW = 14407; | ||
359 | [ScriptConstant] | ||
360 | public static int PHYS_PARAM_ANGULAR_LIMIT_HIGH = 14408; | ||
361 | [ScriptConstant] | ||
362 | public static int PHYS_PARAM_USE_FRAME_OFFSET = 14409; | ||
363 | [ScriptConstant] | ||
364 | public static int PHYS_PARAM_ENABLE_TRANSMOTOR = 14410; | ||
365 | [ScriptConstant] | ||
366 | public static int PHYS_PARAM_TRANSMOTOR_MAXVEL = 14411; | ||
367 | [ScriptConstant] | ||
368 | public static int PHYS_PARAM_TRANSMOTOR_MAXFORCE = 14412; | ||
369 | [ScriptConstant] | ||
370 | public static int PHYS_PARAM_CFM = 14413; | ||
371 | [ScriptConstant] | ||
372 | public static int PHYS_PARAM_ERP = 14414; | ||
373 | [ScriptConstant] | ||
374 | public static int PHYS_PARAM_SOLVER_ITERATIONS = 14415; | ||
375 | [ScriptConstant] | ||
376 | public static int PHYS_PARAM_SPRING_DAMPING = 14416; | ||
377 | [ScriptConstant] | ||
378 | public static int PHYS_PARAM_SPRING_STIFFNESS = 14417; | ||
379 | public static int PHYS_PARAM_MAX = 14417; | ||
306 | 380 | ||
381 | // physChangeLinkParams(integer linkNum, [ PHYS_PARAM_*, value, PHYS_PARAM_*, value, ...]) | ||
382 | [ScriptInvocation] | ||
383 | public int physChangeLinkParams(UUID hostID, UUID scriptID, int linkNum, object[] parms) | ||
384 | { | ||
385 | int ret = -1; | ||
386 | if (!Enabled) return ret; | ||
387 | |||
388 | PhysicsActor rootPhysActor; | ||
389 | PhysicsActor childPhysActor; | ||
390 | |||
391 | if (GetRootAndChildPhysActors(hostID, linkNum, out rootPhysActor, out childPhysActor)) | ||
392 | { | ||
393 | ret = MakeIntError(rootPhysActor.Extension(PhysFunctChangeLinkParams, childPhysActor, parms)); | ||
394 | } | ||
395 | |||
396 | return ret; | ||
397 | } | ||
398 | |||
399 | private bool GetRootPhysActor(UUID hostID, out PhysicsActor rootPhysActor) | ||
400 | { | ||
401 | SceneObjectGroup containingGroup; | ||
402 | SceneObjectPart rootPart; | ||
403 | return GetRootPhysActor(hostID, out containingGroup, out rootPart, out rootPhysActor); | ||
404 | } | ||
405 | |||
406 | private bool GetRootPhysActor(UUID hostID, out SceneObjectGroup containingGroup, out SceneObjectPart rootPart, out PhysicsActor rootPhysActor) | ||
407 | { | ||
408 | bool ret = false; | ||
409 | rootPhysActor = null; | ||
410 | containingGroup = null; | ||
411 | rootPart = null; | ||
412 | |||
413 | SceneObjectPart requestingPart; | ||
414 | |||
415 | requestingPart = BaseScene.GetSceneObjectPart(hostID); | ||
307 | if (requestingPart != null) | 416 | if (requestingPart != null) |
308 | { | 417 | { |
309 | // The type is is always on the root of a linkset. | 418 | // The type is is always on the root of a linkset. |
310 | SceneObjectGroup containingGroup = requestingPart.ParentGroup; | 419 | containingGroup = requestingPart.ParentGroup; |
311 | SceneObjectPart rootPart = containingGroup.RootPart; | 420 | if (containingGroup != null && !containingGroup.IsDeleted) |
312 | |||
313 | if (rootPart != null) | ||
314 | { | 421 | { |
315 | Physics.Manager.PhysicsActor rootPhysActor = rootPart.PhysActor; | 422 | rootPart = containingGroup.RootPart; |
316 | if (rootPhysActor != null) | 423 | if (rootPart != null) |
317 | { | 424 | { |
318 | SceneObjectPart linkPart = containingGroup.GetLinkNumPart(linkNum); | 425 | rootPhysActor = rootPart.PhysActor; |
319 | if (linkPart != null) | 426 | if (rootPhysActor != null) |
320 | { | 427 | { |
321 | Physics.Manager.PhysicsActor linkPhysActor = linkPart.PhysActor; | 428 | ret = true; |
322 | if (linkPhysActor != null) | ||
323 | { | ||
324 | ret = (int)rootPhysActor.Extension(PhysFunctChangeLinkFixed, linkNum, linkPhysActor); | ||
325 | } | ||
326 | else | ||
327 | { | ||
328 | m_log.WarnFormat("{0} physChangeLinkFixed: Link part has no physical actor. rootName={1}, hostID={2}, linknum={3}", | ||
329 | LogHeader, rootPart.Name, hostID, linkNum); | ||
330 | } | ||
331 | } | 429 | } |
332 | else | 430 | else |
333 | { | 431 | { |
334 | m_log.WarnFormat("{0} physChangeLinkFixed: Could not find linknum part. rootName={1}, hostID={2}, linknum={3}", | 432 | m_log.WarnFormat("{0} GetRootAndChildPhysActors: Root part does not have a physics actor. rootName={1}, hostID={2}", |
335 | LogHeader, rootPart.Name, hostID, linkNum); | 433 | LogHeader, rootPart.Name, hostID); |
336 | } | 434 | } |
337 | } | 435 | } |
338 | else | 436 | else |
339 | { | 437 | { |
340 | m_log.WarnFormat("{0} physChangeLinkFixed: Root part does not have a physics actor. rootName={1}, hostID={2}", | 438 | m_log.WarnFormat("{0} GetRootAndChildPhysActors: Root part does not exist. RequestingPartName={1}, hostID={2}", |
341 | LogHeader, rootPart.Name, hostID); | 439 | LogHeader, requestingPart.Name, hostID); |
342 | } | 440 | } |
343 | } | 441 | } |
344 | else | 442 | else |
345 | { | 443 | { |
346 | m_log.WarnFormat("{0} physChangeLinkFixed: Root part does not exist. RequestingPartName={1}, hostID={2}", | 444 | m_log.WarnFormat("{0} GetRootAndChildPhysActors: Containing group missing or deleted. hostID={1}", LogHeader, hostID); |
347 | LogHeader, requestingPart.Name, hostID); | ||
348 | } | 445 | } |
349 | } | 446 | } |
350 | else | 447 | else |
351 | { | 448 | { |
352 | m_log.WarnFormat("{0} physGetLinsetType: cannot find script object in scene. hostID={1}", LogHeader, hostID); | 449 | m_log.WarnFormat("{0} GetRootAndChildPhysActors: cannot find script object in scene. hostID={1}", LogHeader, hostID); |
353 | } | 450 | } |
451 | |||
354 | return ret; | 452 | return ret; |
355 | } | 453 | } |
356 | 454 | ||
357 | [ScriptInvocation] | 455 | // Find the root and child PhysActors based on the linkNum. |
358 | public int physChangeLinkHinge(UUID hostID, UUID scriptID, int linkNum) | 456 | // Return 'true' if both are found and returned. |
457 | private bool GetRootAndChildPhysActors(UUID hostID, int linkNum, out PhysicsActor rootPhysActor, out PhysicsActor childPhysActor) | ||
359 | { | 458 | { |
360 | return -1; | 459 | bool ret = false; |
361 | } | 460 | rootPhysActor = null; |
461 | childPhysActor = null; | ||
362 | 462 | ||
363 | [ScriptInvocation] | 463 | SceneObjectGroup containingGroup; |
364 | public int physChangeLinkSpring(UUID hostID, UUID scriptID, int linkNum, | 464 | SceneObjectPart rootPart; |
365 | Vector3 frameInAloc, Quaternion frameInArot, | ||
366 | Vector3 frameInBloc, Quaternion frameInBrot, | ||
367 | Vector3 linearLimitLow, Vector3 linearLimitHigh, | ||
368 | Vector3 angularLimitLow, Vector3 angularLimitHigh | ||
369 | ) | ||
370 | { | ||
371 | int ret = -1; | ||
372 | if (!Enabled) return ret; | ||
373 | 465 | ||
374 | // The part that is requesting the change. | 466 | if (GetRootPhysActor(hostID, out containingGroup, out rootPart, out rootPhysActor)) |
375 | SceneObjectPart requestingPart = BaseScene.GetSceneObjectPart(hostID); | ||
376 | |||
377 | if (requestingPart != null) | ||
378 | { | 467 | { |
379 | // The type is is always on the root of a linkset. | 468 | SceneObjectPart linkPart = containingGroup.GetLinkNumPart(linkNum); |
380 | SceneObjectGroup containingGroup = requestingPart.ParentGroup; | 469 | if (linkPart != null) |
381 | SceneObjectPart rootPart = containingGroup.RootPart; | ||
382 | |||
383 | if (rootPart != null) | ||
384 | { | 470 | { |
385 | Physics.Manager.PhysicsActor rootPhysActor = rootPart.PhysActor; | 471 | childPhysActor = linkPart.PhysActor; |
386 | if (rootPhysActor != null) | 472 | if (childPhysActor != null) |
387 | { | 473 | { |
388 | SceneObjectPart linkPart = containingGroup.GetLinkNumPart(linkNum); | 474 | ret = true; |
389 | if (linkPart != null) | ||
390 | { | ||
391 | Physics.Manager.PhysicsActor linkPhysActor = linkPart.PhysActor; | ||
392 | if (linkPhysActor != null) | ||
393 | { | ||
394 | ret = (int)rootPhysActor.Extension(PhysFunctChangeLinkSpring, linkNum, linkPhysActor, | ||
395 | frameInAloc, frameInArot, | ||
396 | frameInBloc, frameInBrot, | ||
397 | linearLimitLow, linearLimitHigh, | ||
398 | angularLimitLow, angularLimitHigh | ||
399 | ); | ||
400 | } | ||
401 | else | ||
402 | { | ||
403 | m_log.WarnFormat("{0} physChangeLinkFixed: Link part has no physical actor. rootName={1}, hostID={2}, linknum={3}", | ||
404 | LogHeader, rootPart.Name, hostID, linkNum); | ||
405 | } | ||
406 | } | ||
407 | else | ||
408 | { | ||
409 | m_log.WarnFormat("{0} physChangeLinkFixed: Could not find linknum part. rootName={1}, hostID={2}, linknum={3}", | ||
410 | LogHeader, rootPart.Name, hostID, linkNum); | ||
411 | } | ||
412 | } | 475 | } |
413 | else | 476 | else |
414 | { | 477 | { |
415 | m_log.WarnFormat("{0} physChangeLinkFixed: Root part does not have a physics actor. rootName={1}, hostID={2}", | 478 | m_log.WarnFormat("{0} GetRootAndChildPhysActors: Link part has no physical actor. rootName={1}, hostID={2}, linknum={3}", |
416 | LogHeader, rootPart.Name, hostID); | 479 | LogHeader, rootPart.Name, hostID, linkNum); |
417 | } | 480 | } |
418 | } | 481 | } |
419 | else | 482 | else |
420 | { | 483 | { |
421 | m_log.WarnFormat("{0} physChangeLinkFixed: Root part does not exist. RequestingPartName={1}, hostID={2}", | 484 | m_log.WarnFormat("{0} GetRootAndChildPhysActors: Could not find linknum part. rootName={1}, hostID={2}, linknum={3}", |
422 | LogHeader, requestingPart.Name, hostID); | 485 | LogHeader, rootPart.Name, hostID, linkNum); |
423 | } | 486 | } |
424 | } | 487 | } |
425 | else | 488 | else |
426 | { | 489 | { |
427 | m_log.WarnFormat("{0} physGetLinsetType: cannot find script object in scene. hostID={1}", LogHeader, hostID); | 490 | m_log.WarnFormat("{0} GetRootAndChildPhysActors: Root part does not have a physics actor. rootName={1}, hostID={2}", |
491 | LogHeader, rootPart.Name, hostID); | ||
428 | } | 492 | } |
493 | |||
429 | return ret; | 494 | return ret; |
430 | } | 495 | } |
431 | 496 | ||
432 | [ScriptInvocation] | 497 | // Extension() returns an object. Convert that object into the integer error we expect to return. |
433 | public int physChangeLinkSlider(UUID hostID, UUID scriptID, int linkNum) | 498 | private int MakeIntError(object extensionRet) |
434 | { | 499 | { |
435 | return 0; | 500 | int ret = -1; |
501 | if (extensionRet != null) | ||
502 | { | ||
503 | try | ||
504 | { | ||
505 | ret = (int)extensionRet; | ||
506 | } | ||
507 | catch | ||
508 | { | ||
509 | ret = -1; | ||
510 | } | ||
511 | } | ||
512 | return ret; | ||
436 | } | 513 | } |
437 | } | 514 | } |
438 | } | 515 | } |