diff options
author | Kitto Flora | 2011-01-04 21:36:09 +0000 |
---|---|---|
committer | Kitto Flora | 2011-01-04 21:36:09 +0000 |
commit | ba7a2277633804eb2d5e449efa0895e9f43a4ece (patch) | |
tree | 950d41b6bed87f6eccf295111b638d3138250993 /OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs | |
parent | Merge branch 'master' into careminster-presence-refactor (diff) | |
download | opensim-SC-ba7a2277633804eb2d5e449efa0895e9f43a4ece.zip opensim-SC-ba7a2277633804eb2d5e449efa0895e9f43a4ece.tar.gz opensim-SC-ba7a2277633804eb2d5e449efa0895e9f43a4ece.tar.bz2 opensim-SC-ba7a2277633804eb2d5e449efa0895e9f43a4ece.tar.xz |
Revise Materials properties; Fix Double-Click Autopilot; Allow non-script sit positions >= 0.1M; Add llLookAt(); Comment out spammy bad adjacent sim message.
Diffstat (limited to 'OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs')
-rw-r--r-- | OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs | 220 |
1 files changed, 83 insertions, 137 deletions
diff --git a/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs index e7455be..88f9658 100644 --- a/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/ChOdePlugin/OdePlugin.cs | |||
@@ -264,8 +264,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
264 | private readonly DoubleDictionary<Vector3, IntPtr, IntPtr> RegionTerrain = new DoubleDictionary<Vector3, IntPtr, IntPtr>(); | 264 | private readonly DoubleDictionary<Vector3, IntPtr, IntPtr> RegionTerrain = new DoubleDictionary<Vector3, IntPtr, IntPtr>(); |
265 | private readonly Dictionary<IntPtr,float[]> TerrainHeightFieldHeights = new Dictionary<IntPtr, float[]>(); | 265 | private readonly Dictionary<IntPtr,float[]> TerrainHeightFieldHeights = new Dictionary<IntPtr, float[]>(); |
266 | 266 | ||
267 | private d.Contact contact; | 267 | private d.Contact ContactCopy; // local copy that can be modified |
268 | private d.Contact TerrainContact; | 268 | private d.Contact TerrainContact; |
269 | private d.Contact AvatarStaticprimContact; // was 'contact' | ||
269 | private d.Contact AvatarMovementprimContact; | 270 | private d.Contact AvatarMovementprimContact; |
270 | private d.Contact AvatarMovementTerrainContact; | 271 | private d.Contact AvatarMovementTerrainContact; |
271 | private d.Contact WaterContact; | 272 | private d.Contact WaterContact; |
@@ -491,169 +492,140 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
491 | 492 | ||
492 | staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)]; | 493 | staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)]; |
493 | 494 | ||
494 | // Centeral contact friction and bounce // KF: This appears to be only for static AV on non-phys prim. | 495 | // Avatar static on a Prim parameters |
495 | contact.surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 496 | AvatarStaticprimContact.surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
496 | contact.surface.mu = 255.0f; | 497 | AvatarStaticprimContact.surface.mu = 255.0f; |
497 | contact.surface.bounce = 0.0f; | 498 | AvatarStaticprimContact.surface.bounce = 0.0f; |
498 | contact.surface.soft_cfm = 0.0f; | 499 | AvatarStaticprimContact.surface.soft_cfm = 0.0f; |
499 | contact.surface.soft_erp = 0.30f; // If this is too small static Av will fall through a sloping prim. 1.0 prevents fall-thru | 500 | AvatarStaticprimContact.surface.soft_erp = 0.30f; // If this is too small static Av will fall through a sloping prim. 1.0 prevents fall-thru |
500 | |||
501 | // Terrain contact friction and Bounce | ||
502 | // This is the *non* moving version. Use this when an avatar | ||
503 | // isn't moving to keep it in place better | ||
504 | /* TerrainContact.surface.mode |= d.ContactFlags.SoftERP; | ||
505 | TerrainContact.surface.mu = nmTerrainContactFriction; | ||
506 | TerrainContact.surface.bounce = nmTerrainContactBounce; | ||
507 | TerrainContact.surface.soft_erp = nmTerrainContactERP; */ | ||
508 | 501 | ||
509 | TerrainContact.surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 502 | // Avatar moving on a Prim parameters |
510 | TerrainContact.surface.mu = 255.0f; | ||
511 | TerrainContact.surface.bounce = 0.0f; | ||
512 | TerrainContact.surface.soft_cfm = 0.0f; | ||
513 | TerrainContact.surface.soft_erp = 0.05f; | ||
514 | |||
515 | WaterContact.surface.mode |= (d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM); | ||
516 | WaterContact.surface.mu = 0.0f; // No friction | ||
517 | WaterContact.surface.bounce = 0.0f; // No bounce | ||
518 | WaterContact.surface.soft_cfm = 0.010f; | ||
519 | WaterContact.surface.soft_erp = 0.010f; | ||
520 | |||
521 | // Prim contact friction and bounce | ||
522 | // THis is the moving version of friction and bounce | ||
523 | // Use this when an avatar comes in contact with a prim | ||
524 | AvatarMovementprimContact.surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 503 | AvatarMovementprimContact.surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
525 | AvatarMovementprimContact.surface.mu = 255.0f; | 504 | AvatarMovementprimContact.surface.mu = 255.0f; |
526 | AvatarMovementprimContact.surface.bounce = 0.0f; | 505 | AvatarMovementprimContact.surface.bounce = 0.0f; |
527 | AvatarMovementprimContact.surface.soft_cfm = 0.0f; // if this is 0.01 then prims become phantom to Avs! | 506 | AvatarMovementprimContact.surface.soft_cfm = 0.0f; // if this is 0.01 then prims become phantom to Avs! |
528 | AvatarMovementprimContact.surface.soft_erp = 0.3f; | 507 | AvatarMovementprimContact.surface.soft_erp = 0.3f; |
529 | 508 | ||
530 | // Terrain contact friction bounce and various error correcting calculations | 509 | // Static Avatar on Terrain parameters |
531 | // Use this when an avatar is in contact with the terrain and moving. | 510 | // Keeps Avatar in place better |
532 | /* | 511 | TerrainContact.surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
533 | AvatarMovementTerrainContact.surface.mode |= d.ContactFlags.SoftERP; | 512 | TerrainContact.surface.mu = 255.0f; |
534 | AvatarMovementTerrainContact.surface.mu = mTerrainContactFriction; | 513 | TerrainContact.surface.bounce = 0.0f; |
535 | AvatarMovementTerrainContact.surface.bounce = mTerrainContactBounce; | 514 | TerrainContact.surface.soft_cfm = 0.0f; |
536 | AvatarMovementTerrainContact.surface.soft_erp = mTerrainContactERP; | 515 | TerrainContact.surface.soft_erp = 0.05f; |
537 | */ | 516 | |
517 | // Moving Avatar on Terrain parameters | ||
538 | AvatarMovementTerrainContact.surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 518 | AvatarMovementTerrainContact.surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
539 | AvatarMovementTerrainContact.surface.mu = 75f; | 519 | AvatarMovementTerrainContact.surface.mu = 75f; |
540 | AvatarMovementTerrainContact.surface.bounce = 0.0f; | 520 | AvatarMovementTerrainContact.surface.bounce = 0.0f; |
541 | AvatarMovementTerrainContact.surface.soft_cfm = 0.0f; | 521 | AvatarMovementTerrainContact.surface.soft_cfm = 0.0f; |
542 | AvatarMovementTerrainContact.surface.soft_erp = 0.05f; | 522 | AvatarMovementTerrainContact.surface.soft_erp = 0.05f; |
543 | 523 | ||
544 | /* | 524 | // Avatar or prim the the water, this may not be used, possibly water is same as air? |
545 | <summary></summary> | 525 | WaterContact.surface.mode |= (d.ContactFlags.SoftERP | d.ContactFlags.SoftCFM); |
546 | Stone = 0, | 526 | WaterContact.surface.mu = 0.0f; // No friction |
547 | /// <summary></summary> | 527 | WaterContact.surface.bounce = 0.0f; // No bounce |
548 | Metal = 1, | 528 | WaterContact.surface.soft_cfm = 0.010f; |
549 | /// <summary></summary> | 529 | WaterContact.surface.soft_erp = 0.010f; |
550 | Glass = 2, | 530 | |
551 | /// <summary></summary> | ||
552 | Wood = 3, | ||
553 | /// <summary></summary> | ||
554 | Flesh = 4, | ||
555 | /// <summary></summary> | ||
556 | Plastic = 5, | ||
557 | /// <summary></summary> | ||
558 | Rubber = 6 | ||
559 | */ | ||
560 | 531 | ||
532 | // Prim static or moving on a prim, depends on material type | ||
561 | m_materialContacts = new d.Contact[7,2]; | 533 | m_materialContacts = new d.Contact[7,2]; |
562 | // V 1 = Sliding; 0 = static or fell onto | 534 | // V 1 = Sliding; 0 = static or fell onto |
563 | m_materialContacts[(int)Material.Stone, 0] = new d.Contact(); | 535 | m_materialContacts[(int)Material.Stone, 0] = new d.Contact(); |
564 | m_materialContacts[(int)Material.Stone, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 536 | m_materialContacts[(int)Material.Stone, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
565 | m_materialContacts[(int)Material.Stone, 0].surface.mu = 1.8f; // friction, 1 = slippery, 255 = no slip | 537 | m_materialContacts[(int)Material.Stone, 0].surface.mu = 60f; // friction, 1 = slippery, 255 = no slip |
566 | m_materialContacts[(int)Material.Stone, 0].surface.bounce = 0.0f; | 538 | m_materialContacts[(int)Material.Stone, 0].surface.bounce = 0.0f; |
567 | m_materialContacts[(int)Material.Stone, 0].surface.soft_cfm = 0.0f; | 539 | m_materialContacts[(int)Material.Stone, 0].surface.soft_cfm = 0.0f; |
568 | m_materialContacts[(int)Material.Stone, 0].surface.soft_erp = 0.50f; | 540 | m_materialContacts[(int)Material.Stone, 0].surface.soft_erp = 0.50f; // erp also changes friction, more erp=less friction |
569 | 541 | ||
570 | m_materialContacts[(int)Material.Stone, 1] = new d.Contact(); | 542 | m_materialContacts[(int)Material.Stone, 1] = new d.Contact(); |
571 | m_materialContacts[(int)Material.Stone, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 543 | m_materialContacts[(int)Material.Stone, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
572 | m_materialContacts[(int)Material.Stone, 1].surface.mu = 1.8f; | 544 | m_materialContacts[(int)Material.Stone, 1].surface.mu = 40f; |
573 | m_materialContacts[(int)Material.Stone, 1].surface.bounce = 0.0f; | 545 | m_materialContacts[(int)Material.Stone, 1].surface.bounce = 0.0f; |
574 | m_materialContacts[(int)Material.Stone, 1].surface.soft_cfm = 0.0f; | 546 | m_materialContacts[(int)Material.Stone, 1].surface.soft_cfm = 0.0f; |
575 | m_materialContacts[(int)Material.Stone, 1].surface.soft_erp = 0.50f; | 547 | m_materialContacts[(int)Material.Stone, 1].surface.soft_erp = 0.50f; |
576 | 548 | ||
577 | m_materialContacts[(int)Material.Metal, 0] = new d.Contact(); | 549 | m_materialContacts[(int)Material.Metal, 0] = new d.Contact(); |
578 | m_materialContacts[(int)Material.Metal, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 550 | m_materialContacts[(int)Material.Metal, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
579 | m_materialContacts[(int)Material.Metal, 0].surface.mu = 1.3f; | 551 | m_materialContacts[(int)Material.Metal, 0].surface.mu = 15f; |
580 | m_materialContacts[(int)Material.Metal, 0].surface.bounce = 0.2f; | 552 | m_materialContacts[(int)Material.Metal, 0].surface.bounce = 0.2f; |
581 | m_materialContacts[(int)Material.Metal, 0].surface.soft_cfm = 0.0f; | 553 | m_materialContacts[(int)Material.Metal, 0].surface.soft_cfm = 0.0f; |
582 | m_materialContacts[(int)Material.Metal, 0].surface.soft_erp = 0.50f; | 554 | m_materialContacts[(int)Material.Metal, 0].surface.soft_erp = 0.50f; |
583 | 555 | ||
584 | m_materialContacts[(int)Material.Metal, 1] = new d.Contact(); | 556 | m_materialContacts[(int)Material.Metal, 1] = new d.Contact(); |
585 | m_materialContacts[(int)Material.Metal, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 557 | m_materialContacts[(int)Material.Metal, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
586 | m_materialContacts[(int)Material.Metal, 1].surface.mu = 1.3f; | 558 | m_materialContacts[(int)Material.Metal, 1].surface.mu = 10f; |
587 | m_materialContacts[(int)Material.Metal, 1].surface.bounce = 0.2f; | 559 | m_materialContacts[(int)Material.Metal, 1].surface.bounce = 0.2f; |
588 | m_materialContacts[(int)Material.Metal, 1].surface.soft_cfm = 0.0f; | 560 | m_materialContacts[(int)Material.Metal, 1].surface.soft_cfm = 0.0f; |
589 | m_materialContacts[(int)Material.Metal, 1].surface.soft_erp = 0.50f; | 561 | m_materialContacts[(int)Material.Metal, 1].surface.soft_erp = 0.50f; |
590 | 562 | ||
591 | m_materialContacts[(int)Material.Glass, 0] = new d.Contact(); | 563 | m_materialContacts[(int)Material.Glass, 0] = new d.Contact(); |
592 | m_materialContacts[(int)Material.Glass, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 564 | m_materialContacts[(int)Material.Glass, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
593 | m_materialContacts[(int)Material.Glass, 0].surface.mu = 1f; | 565 | m_materialContacts[(int)Material.Glass, 0].surface.mu = 7.5f; |
594 | m_materialContacts[(int)Material.Glass, 0].surface.bounce = 0.0f; | 566 | m_materialContacts[(int)Material.Glass, 0].surface.bounce = 0.0f; |
595 | m_materialContacts[(int)Material.Glass, 0].surface.soft_cfm = 0.01f; | 567 | m_materialContacts[(int)Material.Glass, 0].surface.soft_cfm = 0.0f; |
596 | m_materialContacts[(int)Material.Glass, 0].surface.soft_erp = 0.50f; | 568 | m_materialContacts[(int)Material.Glass, 0].surface.soft_erp = 0.50f; |
597 | 569 | ||
598 | m_materialContacts[(int)Material.Glass, 1] = new d.Contact(); | 570 | m_materialContacts[(int)Material.Glass, 1] = new d.Contact(); |
599 | m_materialContacts[(int)Material.Glass, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 571 | m_materialContacts[(int)Material.Glass, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
600 | m_materialContacts[(int)Material.Glass, 1].surface.mu = 1f; | 572 | m_materialContacts[(int)Material.Glass, 1].surface.mu = 5f; |
601 | m_materialContacts[(int)Material.Glass, 1].surface.bounce = 0.0f; | 573 | m_materialContacts[(int)Material.Glass, 1].surface.bounce = 0.0f; |
602 | m_materialContacts[(int)Material.Glass, 1].surface.soft_cfm = 0.0f; | 574 | m_materialContacts[(int)Material.Glass, 1].surface.soft_cfm = 0.0f; |
603 | m_materialContacts[(int)Material.Glass, 1].surface.soft_erp = 0.30f; | 575 | m_materialContacts[(int)Material.Glass, 1].surface.soft_erp = 0.50f; |
604 | 576 | ||
605 | m_materialContacts[(int)Material.Wood, 0] = new d.Contact(); | 577 | m_materialContacts[(int)Material.Wood, 0] = new d.Contact(); |
606 | m_materialContacts[(int)Material.Wood, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 578 | m_materialContacts[(int)Material.Wood, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
607 | m_materialContacts[(int)Material.Wood, 0].surface.mu = 1.6f; | 579 | m_materialContacts[(int)Material.Wood, 0].surface.mu = 45f; |
608 | m_materialContacts[(int)Material.Wood, 0].surface.bounce = 0.1f; | 580 | m_materialContacts[(int)Material.Wood, 0].surface.bounce = 0.1f; |
609 | m_materialContacts[(int)Material.Wood, 0].surface.soft_cfm = 0.0f; | 581 | m_materialContacts[(int)Material.Wood, 0].surface.soft_cfm = 0.0f; |
610 | m_materialContacts[(int)Material.Wood, 0].surface.soft_erp = 0.50f; | 582 | m_materialContacts[(int)Material.Wood, 0].surface.soft_erp = 0.50f; |
611 | 583 | ||
612 | m_materialContacts[(int)Material.Wood, 1] = new d.Contact(); | 584 | m_materialContacts[(int)Material.Wood, 1] = new d.Contact(); |
613 | m_materialContacts[(int)Material.Wood, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 585 | m_materialContacts[(int)Material.Wood, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
614 | m_materialContacts[(int)Material.Wood, 1].surface.mu = 1.6f; | 586 | m_materialContacts[(int)Material.Wood, 1].surface.mu = 30f; |
615 | m_materialContacts[(int)Material.Wood, 1].surface.bounce = 0.1f; | 587 | m_materialContacts[(int)Material.Wood, 1].surface.bounce = 0.1f; |
616 | m_materialContacts[(int)Material.Wood, 1].surface.soft_cfm = 0.0f; | 588 | m_materialContacts[(int)Material.Wood, 1].surface.soft_cfm = 0.0f; |
617 | m_materialContacts[(int)Material.Wood, 1].surface.soft_erp = 0.50f; | 589 | m_materialContacts[(int)Material.Wood, 1].surface.soft_erp = 0.50f; |
618 | 590 | ||
619 | m_materialContacts[(int)Material.Flesh, 0] = new d.Contact(); | 591 | m_materialContacts[(int)Material.Flesh, 0] = new d.Contact(); |
620 | m_materialContacts[(int)Material.Flesh, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 592 | m_materialContacts[(int)Material.Flesh, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
621 | m_materialContacts[(int)Material.Flesh, 0].surface.mu = 2.0f; | 593 | m_materialContacts[(int)Material.Flesh, 0].surface.mu = 150f; |
622 | m_materialContacts[(int)Material.Flesh, 0].surface.bounce = 0.0f; | 594 | m_materialContacts[(int)Material.Flesh, 0].surface.bounce = 0.0f; |
623 | m_materialContacts[(int)Material.Flesh, 0].surface.soft_cfm = 0.0f; | 595 | m_materialContacts[(int)Material.Flesh, 0].surface.soft_cfm = 0.0f; |
624 | m_materialContacts[(int)Material.Flesh, 0].surface.soft_erp = 0.50f; | 596 | m_materialContacts[(int)Material.Flesh, 0].surface.soft_erp = 0.50f; |
625 | 597 | ||
626 | m_materialContacts[(int)Material.Flesh, 1] = new d.Contact(); | 598 | m_materialContacts[(int)Material.Flesh, 1] = new d.Contact(); |
627 | m_materialContacts[(int)Material.Flesh, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 599 | m_materialContacts[(int)Material.Flesh, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
628 | m_materialContacts[(int)Material.Flesh, 1].surface.mu = 2.0f; | 600 | m_materialContacts[(int)Material.Flesh, 1].surface.mu = 100f; |
629 | m_materialContacts[(int)Material.Flesh, 1].surface.bounce = 0.0f; | 601 | m_materialContacts[(int)Material.Flesh, 1].surface.bounce = 0.0f; |
630 | m_materialContacts[(int)Material.Flesh, 1].surface.soft_cfm = 0.0f; | 602 | m_materialContacts[(int)Material.Flesh, 1].surface.soft_cfm = 0.0f; |
631 | m_materialContacts[(int)Material.Flesh, 1].surface.soft_erp = 0.50f; | 603 | m_materialContacts[(int)Material.Flesh, 1].surface.soft_erp = 0.50f; |
632 | 604 | ||
633 | m_materialContacts[(int)Material.Plastic, 0] = new d.Contact(); | 605 | m_materialContacts[(int)Material.Plastic, 0] = new d.Contact(); |
634 | m_materialContacts[(int)Material.Plastic, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 606 | m_materialContacts[(int)Material.Plastic, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
635 | m_materialContacts[(int)Material.Plastic, 0].surface.mu = 1.5f; | 607 | m_materialContacts[(int)Material.Plastic, 0].surface.mu = 30f; |
636 | m_materialContacts[(int)Material.Plastic, 0].surface.bounce = 0.2f; | 608 | m_materialContacts[(int)Material.Plastic, 0].surface.bounce = 0.2f; |
637 | m_materialContacts[(int)Material.Plastic, 0].surface.soft_cfm = 0.0f; | 609 | m_materialContacts[(int)Material.Plastic, 0].surface.soft_cfm = 0.0f; |
638 | m_materialContacts[(int)Material.Plastic, 0].surface.soft_erp = 0.50f; | 610 | m_materialContacts[(int)Material.Plastic, 0].surface.soft_erp = 0.50f; |
639 | 611 | ||
640 | m_materialContacts[(int)Material.Plastic, 1] = new d.Contact(); | 612 | m_materialContacts[(int)Material.Plastic, 1] = new d.Contact(); |
641 | m_materialContacts[(int)Material.Plastic, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 613 | m_materialContacts[(int)Material.Plastic, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
642 | m_materialContacts[(int)Material.Plastic, 1].surface.mu = 1.5f; | 614 | m_materialContacts[(int)Material.Plastic, 1].surface.mu = 20f; |
643 | m_materialContacts[(int)Material.Plastic, 1].surface.bounce = 0.2f; | 615 | m_materialContacts[(int)Material.Plastic, 1].surface.bounce = 0.2f; |
644 | m_materialContacts[(int)Material.Plastic, 1].surface.soft_cfm = 0.0f; | 616 | m_materialContacts[(int)Material.Plastic, 1].surface.soft_cfm = 0.0f; |
645 | m_materialContacts[(int)Material.Plastic, 1].surface.soft_erp = 0.50f; | 617 | m_materialContacts[(int)Material.Plastic, 1].surface.soft_erp = 0.50f; |
646 | 618 | ||
647 | m_materialContacts[(int)Material.Rubber, 0] = new d.Contact(); | 619 | m_materialContacts[(int)Material.Rubber, 0] = new d.Contact(); |
648 | m_materialContacts[(int)Material.Rubber, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 620 | m_materialContacts[(int)Material.Rubber, 0].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
649 | m_materialContacts[(int)Material.Rubber, 0].surface.mu = 2.0f; | 621 | m_materialContacts[(int)Material.Rubber, 0].surface.mu = 150f; |
650 | m_materialContacts[(int)Material.Rubber, 0].surface.bounce = 0.7f; | 622 | m_materialContacts[(int)Material.Rubber, 0].surface.bounce = 0.7f; |
651 | m_materialContacts[(int)Material.Rubber, 0].surface.soft_cfm = 0.0f; | 623 | m_materialContacts[(int)Material.Rubber, 0].surface.soft_cfm = 0.0f; |
652 | m_materialContacts[(int)Material.Rubber, 0].surface.soft_erp = 0.50f; | 624 | m_materialContacts[(int)Material.Rubber, 0].surface.soft_erp = 0.50f; |
653 | 625 | ||
654 | m_materialContacts[(int)Material.Rubber, 1] = new d.Contact(); | 626 | m_materialContacts[(int)Material.Rubber, 1] = new d.Contact(); |
655 | m_materialContacts[(int)Material.Rubber, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; | 627 | m_materialContacts[(int)Material.Rubber, 1].surface.mode = d.ContactFlags.SoftCFM | d.ContactFlags.SoftERP | d.ContactFlags.Bounce; |
656 | m_materialContacts[(int)Material.Rubber, 1].surface.mu = 2.0f; | 628 | m_materialContacts[(int)Material.Rubber, 1].surface.mu = 100f; |
657 | m_materialContacts[(int)Material.Rubber, 1].surface.bounce = 0.7f; | 629 | m_materialContacts[(int)Material.Rubber, 1].surface.bounce = 0.7f; |
658 | m_materialContacts[(int)Material.Rubber, 1].surface.soft_cfm = 0.0f; | 630 | m_materialContacts[(int)Material.Rubber, 1].surface.soft_cfm = 0.0f; |
659 | m_materialContacts[(int)Material.Rubber, 1].surface.soft_erp = 0.50f; | 631 | m_materialContacts[(int)Material.Rubber, 1].surface.soft_erp = 0.50f; |
@@ -819,11 +791,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
819 | p2 = PANull; | 791 | p2 = PANull; |
820 | } | 792 | } |
821 | 793 | ||
822 | if((p1 is OdePrim ) && (p2 is OdePrim)){ | ||
823 | OdePrim t1 = (OdePrim)p1; | ||
824 | OdePrim t2 = (OdePrim)p2; | ||
825 | Console.WriteLine("Collision {0} {1}", t1.m_primName, t2.m_primName); | ||
826 | } | ||
827 | ContactPoint maxDepthContact = new ContactPoint(); | 794 | ContactPoint maxDepthContact = new ContactPoint(); |
828 | if (p1.CollisionScore + count >= float.MaxValue) | 795 | if (p1.CollisionScore + count >= float.MaxValue) |
829 | p1.CollisionScore = 0; | 796 | p1.CollisionScore = 0; |
@@ -847,7 +814,7 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
847 | 814 | ||
848 | //m_log.Warn("[CCOUNT]: " + count); | 815 | //m_log.Warn("[CCOUNT]: " + count); |
849 | IntPtr joint; | 816 | IntPtr joint; |
850 | // If we're colliding with terrain, use 'TerrainContact' instead of contact. | 817 | // If we're colliding with terrain, use 'TerrainContact' instead of AvatarStaticprimContact. |
851 | // allows us to have different settings | 818 | // allows us to have different settings |
852 | 819 | ||
853 | // We only need to test p2 for 'jump crouch purposes' | 820 | // We only need to test p2 for 'jump crouch purposes' |
@@ -898,9 +865,9 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
898 | //This is disabled at the moment only because it needs more tweaking | 865 | //This is disabled at the moment only because it needs more tweaking |
899 | //It will eventually be uncommented | 866 | //It will eventually be uncommented |
900 | /* | 867 | /* |
901 | if (contact.depth >= 1.00f) | 868 | if (AvatarStaticprimContact.depth >= 1.00f) |
902 | { | 869 | { |
903 | //m_log.Debug("[PHYSICS]: " + contact.depth.ToString()); | 870 | //m_log.Debug("[PHYSICS]: " + AvatarStaticprimContact.depth.ToString()); |
904 | } | 871 | } |
905 | 872 | ||
906 | //If you interpenetrate a prim with an agent | 873 | //If you interpenetrate a prim with an agent |
@@ -910,37 +877,37 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
910 | p2.PhysicsActorType == (int) ActorTypes.Prim)) | 877 | p2.PhysicsActorType == (int) ActorTypes.Prim)) |
911 | { | 878 | { |
912 | 879 | ||
913 | //contact.depth = contact.depth * 4.15f; | 880 | //AvatarStaticprimContact.depth = AvatarStaticprimContact.depth * 4.15f; |
914 | /* | 881 | /* |
915 | if (p2.PhysicsActorType == (int) ActorTypes.Agent) | 882 | if (p2.PhysicsActorType == (int) ActorTypes.Agent) |
916 | { | 883 | { |
917 | p2.CollidingObj = true; | 884 | p2.CollidingObj = true; |
918 | contact.depth = 0.003f; | 885 | AvatarStaticprimContact.depth = 0.003f; |
919 | p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f); | 886 | p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f); |
920 | OdeCharacter character = (OdeCharacter) p2; | 887 | OdeCharacter character = (OdeCharacter) p2; |
921 | character.SetPidStatus(true); | 888 | character.SetPidStatus(true); |
922 | contact.pos = new d.Vector3(contact.pos.X + (p1.Size.X / 2), contact.pos.Y + (p1.Size.Y / 2), contact.pos.Z + (p1.Size.Z / 2)); | 889 | AvatarStaticprimContact.pos = new d.Vector3(AvatarStaticprimContact.pos.X + (p1.Size.X / 2), AvatarStaticprimContact.pos.Y + (p1.Size.Y / 2), AvatarStaticprimContact.pos.Z + (p1.Size.Z / 2)); |
923 | 890 | ||
924 | } | 891 | } |
925 | else | 892 | else |
926 | { | 893 | { |
927 | 894 | ||
928 | //contact.depth = 0.0000000f; | 895 | //AvatarStaticprimContact.depth = 0.0000000f; |
929 | } | 896 | } |
930 | if (p1.PhysicsActorType == (int) ActorTypes.Agent) | 897 | if (p1.PhysicsActorType == (int) ActorTypes.Agent) |
931 | { | 898 | { |
932 | 899 | ||
933 | p1.CollidingObj = true; | 900 | p1.CollidingObj = true; |
934 | contact.depth = 0.003f; | 901 | AvatarStaticprimContact.depth = 0.003f; |
935 | p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f); | 902 | p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f); |
936 | contact.pos = new d.Vector3(contact.pos.X + (p2.Size.X / 2), contact.pos.Y + (p2.Size.Y / 2), contact.pos.Z + (p2.Size.Z / 2)); | 903 | AvatarStaticprimContact.pos = new d.Vector3(AvatarStaticprimContact.pos.X + (p2.Size.X / 2), AvatarStaticprimContact.pos.Y + (p2.Size.Y / 2), AvatarStaticprimContact.pos.Z + (p2.Size.Z / 2)); |
937 | OdeCharacter character = (OdeCharacter)p1; | 904 | OdeCharacter character = (OdeCharacter)p1; |
938 | character.SetPidStatus(true); | 905 | character.SetPidStatus(true); |
939 | } | 906 | } |
940 | else | 907 | else |
941 | { | 908 | { |
942 | 909 | ||
943 | //contact.depth = 0.0000000f; | 910 | //AvatarStaticprimContact.depth = 0.0000000f; |
944 | } | 911 | } |
945 | 912 | ||
946 | 913 | ||
@@ -965,7 +932,7 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
965 | //AddPhysicsActorTaint(p2); | 932 | //AddPhysicsActorTaint(p2); |
966 | //} | 933 | //} |
967 | 934 | ||
968 | //if (contact.depth >= 0.25f) | 935 | //if (AvatarStaticprimContact.depth >= 0.25f) |
969 | //{ | 936 | //{ |
970 | // Don't collide, one or both prim will expld. | 937 | // Don't collide, one or both prim will expld. |
971 | 938 | ||
@@ -983,13 +950,13 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
983 | //AddPhysicsActorTaint(p2); | 950 | //AddPhysicsActorTaint(p2); |
984 | //} | 951 | //} |
985 | 952 | ||
986 | //contact.depth = contact.depth / 8f; | 953 | //AvatarStaticprimContact.depth = AvatarStaticprimContact.depth / 8f; |
987 | //contact.normal = new d.Vector3(0, 0, 1); | 954 | //AvatarStaticprimContact.normal = new d.Vector3(0, 0, 1); |
988 | //} | 955 | //} |
989 | //if (op1.m_disabled || op2.m_disabled) | 956 | //if (op1.m_disabled || op2.m_disabled) |
990 | //{ | 957 | //{ |
991 | //Manually disabled objects stay disabled | 958 | //Manually disabled objects stay disabled |
992 | //contact.depth = 0f; | 959 | //AvatarStaticprimContact.depth = 0f; |
993 | //} | 960 | //} |
994 | #endregion | 961 | #endregion |
995 | } | 962 | } |
@@ -997,7 +964,7 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
997 | #endregion | 964 | #endregion |
998 | if (curContact.depth >= 1.00f) | 965 | if (curContact.depth >= 1.00f) |
999 | { | 966 | { |
1000 | //m_log.Info("[P]: " + contact.depth.ToString()); | 967 | //m_log.Info("[P]: " + AvatarStaticprimContact.depth.ToString()); |
1001 | if ((p2.PhysicsActorType == (int) ActorTypes.Agent && | 968 | if ((p2.PhysicsActorType == (int) ActorTypes.Agent && |
1002 | p1.PhysicsActorType == (int) ActorTypes.Unknown) || | 969 | p1.PhysicsActorType == (int) ActorTypes.Unknown) || |
1003 | (p1.PhysicsActorType == (int) ActorTypes.Agent && | 970 | (p1.PhysicsActorType == (int) ActorTypes.Agent && |
@@ -1067,15 +1034,16 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
1067 | if (!skipThisContact) | 1034 | if (!skipThisContact) |
1068 | { | 1035 | { |
1069 | // Add contact joints with materials params---------------------------------- | 1036 | // Add contact joints with materials params---------------------------------- |
1037 | // p1 is what is being hit, p2 is the physical object doing the hitting | ||
1070 | int material = (int) Material.Wood; | 1038 | int material = (int) Material.Wood; |
1071 | int movintYN = 0; // 1 = Sliding; 0 = static or fell onto | 1039 | int movintYN = 0; // 1 = Sliding; 0 = static or fell onto |
1040 | if (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f) movintYN = 1; | ||
1072 | 1041 | ||
1073 | // If we're colliding against terrain | 1042 | // If we're colliding against terrain |
1074 | if (name1 == "Terrain" || name2 == "Terrain") | 1043 | if (name1 == "Terrain" || name2 == "Terrain") |
1075 | { | 1044 | { |
1076 | // If we're moving | 1045 | // If we're moving |
1077 | if ((p2.PhysicsActorType == (int) ActorTypes.Agent) && | 1046 | if ((p2.PhysicsActorType == (int) ActorTypes.Agent) && (movintYN == 1)) |
1078 | (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) | ||
1079 | { | 1047 | { |
1080 | //$ Av walk/run on terrain (not falling) Use the Avatar movement terrain contact | 1048 | //$ Av walk/run on terrain (not falling) Use the Avatar movement terrain contact |
1081 | AvatarMovementTerrainContact.geom = curContact; | 1049 | AvatarMovementTerrainContact.geom = curContact; |
@@ -1103,13 +1071,9 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
1103 | { | 1071 | { |
1104 | if (p2.PhysicsActorType == (int)ActorTypes.Prim && p1.PhysicsActorType == (int)ActorTypes.Prim) | 1072 | if (p2.PhysicsActorType == (int)ActorTypes.Prim && p1.PhysicsActorType == (int)ActorTypes.Prim) |
1105 | { | 1073 | { |
1106 | //& THIS NEVER HAPPENS prim prim contact //kf Huh? In terrain contact? | 1074 | //& THIS NEVER HAPPENS? prim prim contact In terrain contact? |
1107 | // int pj294950 = 0; | 1075 | // int pj294950 = 0; |
1108 | // prim terrain contact | 1076 | // prim terrain contact |
1109 | if (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f) | ||
1110 | { | ||
1111 | movintYN = 1; | ||
1112 | } | ||
1113 | 1077 | ||
1114 | if (p2 is OdePrim) | 1078 | if (p2 is OdePrim) |
1115 | material = ((OdePrim)p2).m_material; | 1079 | material = ((OdePrim)p2).m_material; |
@@ -1128,34 +1092,31 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
1128 | else | 1092 | else |
1129 | { | 1093 | { |
1130 | //$ prim on terrain contact | 1094 | //$ prim on terrain contact |
1131 | if (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f) | ||
1132 | { | ||
1133 | movintYN = 1; | ||
1134 | } | ||
1135 | |||
1136 | if (p2 is OdePrim) | 1095 | if (p2 is OdePrim) |
1137 | material = ((OdePrim)p2).m_material; | 1096 | material = ((OdePrim)p2).m_material; |
1138 | //m_log.DebugFormat("Material: {0}", material); | 1097 | //m_log.DebugFormat("Material: {0}", material); |
1139 | m_materialContacts[material, movintYN].geom = curContact; | 1098 | m_materialContacts[material, movintYN].geom = curContact; |
1140 | _perloopContact.Add(curContact); | 1099 | _perloopContact.Add(curContact); |
1141 | 1100 | ||
1101 | ContactCopy = m_materialContacts[material, movintYN]; | ||
1102 | if(movintYN == 1) | ||
1103 | { | ||
1104 | // prevent excessive slide on terrain | ||
1105 | ContactCopy.surface.mu = m_materialContacts[material, movintYN].surface.mu * 30.0f; | ||
1106 | } | ||
1107 | |||
1142 | if (m_global_contactcount < maxContactsbeforedeath) | 1108 | if (m_global_contactcount < maxContactsbeforedeath) |
1143 | { | 1109 | { |
1144 | joint = d.JointCreateContact(world, contactgroup, ref m_materialContacts[material, movintYN]); | 1110 | joint = d.JointCreateContact(world, contactgroup, ref ContactCopy); |
1145 | m_global_contactcount++; | 1111 | m_global_contactcount++; |
1146 | |||
1147 | } | 1112 | } |
1148 | } | 1113 | } |
1149 | } | 1114 | } |
1150 | } | 1115 | } |
1151 | //if (p2.PhysicsActorType == (int)ActorTypes.Prim) | ||
1152 | //{ | ||
1153 | //m_log.Debug("[PHYSICS]: prim contacting with ground"); | ||
1154 | //} | ||
1155 | } | 1116 | } |
1156 | else if (name1 == "Water" || name2 == "Water") | 1117 | else if (name1 == "Water" || name2 == "Water") |
1157 | { | 1118 | { |
1158 | //$ This never happens! | 1119 | //$ This never happens! Perhaps water is treated like air? |
1159 | /* | 1120 | /* |
1160 | if ((p2.PhysicsActorType == (int) ActorTypes.Prim)) | 1121 | if ((p2.PhysicsActorType == (int) ActorTypes.Prim)) |
1161 | { | 1122 | { |
@@ -1169,8 +1130,8 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
1169 | if (curContact.depth > 0.1f) | 1130 | if (curContact.depth > 0.1f) |
1170 | { | 1131 | { |
1171 | curContact.depth *= 52; | 1132 | curContact.depth *= 52; |
1172 | //contact.normal = new d.Vector3(0, 0, 1); | 1133 | //AvatarStaticprimContact.normal = new d.Vector3(0, 0, 1); |
1173 | //contact.pos = new d.Vector3(0, 0, contact.pos.Z - 5f); | 1134 | //AvatarStaticprimContact.pos = new d.Vector3(0, 0, contact.pos.Z - 5f); |
1174 | } | 1135 | } |
1175 | WaterContact.geom = curContact; | 1136 | WaterContact.geom = curContact; |
1176 | _perloopContact.Add(curContact); | 1137 | _perloopContact.Add(curContact); |
@@ -1179,7 +1140,7 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
1179 | joint = d.JointCreateContact(world, contactgroup, ref WaterContact); | 1140 | joint = d.JointCreateContact(world, contactgroup, ref WaterContact); |
1180 | m_global_contactcount++; | 1141 | m_global_contactcount++; |
1181 | } | 1142 | } |
1182 | //m_log.Info("[PHYSICS]: Prim Water Contact" + contact.depth); | 1143 | //m_log.Info("[PHYSICS]: Prim Water Contact" + AvatarStaticprimContact.depth); |
1183 | } | 1144 | } |
1184 | else | 1145 | else |
1185 | { | 1146 | { |
@@ -1189,7 +1150,7 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
1189 | if ((p2.PhysicsActorType == (int)ActorTypes.Agent)) | 1150 | if ((p2.PhysicsActorType == (int)ActorTypes.Agent)) |
1190 | { | 1151 | { |
1191 | //$ Avatar on Prim or other Avatar | 1152 | //$ Avatar on Prim or other Avatar |
1192 | if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) | 1153 | if (movintYN == 1) |
1193 | { | 1154 | { |
1194 | // Use the AV Movement / prim contact | 1155 | // Use the AV Movement / prim contact |
1195 | AvatarMovementprimContact.geom = curContact; | 1156 | AvatarMovementprimContact.geom = curContact; |
@@ -1203,34 +1164,24 @@ if((p1 is OdePrim ) && (p2 is OdePrim)){ | |||
1203 | else | 1164 | else |
1204 | { | 1165 | { |
1205 | // Use the Av non movement / prim contact | 1166 | // Use the Av non movement / prim contact |
1206 | contact.geom = curContact; | 1167 | AvatarStaticprimContact.geom = curContact; |
1207 | _perloopContact.Add(curContact); | 1168 | _perloopContact.Add(curContact); |
1169 | ContactCopy = AvatarStaticprimContact; // local copy so we can change locally | ||
1208 | 1170 | ||
1209 | if (m_global_contactcount < maxContactsbeforedeath) | 1171 | if (m_global_contactcount < maxContactsbeforedeath) |
1210 | { | 1172 | { |
1211 | if (curContact.depth > 0.2) | 1173 | if (curContact.depth > 0.2) |
1212 | { // embedded, eject slowly | 1174 | { // embedded, eject slowly |
1213 | contact.surface.soft_erp = 0.1f; | 1175 | ContactCopy.surface.soft_erp = 0.1f; |
1214 | contact.surface.soft_cfm = 0.1f; | 1176 | ContactCopy.surface.soft_cfm = 0.1f; |
1215 | } | 1177 | } |
1216 | else | 1178 | else |
1217 | { // keep on the surface | 1179 | { // keep on the surface |
1218 | contact.surface.soft_erp = 0.3f; | 1180 | ContactCopy.surface.soft_erp = 0.3f; |
1219 | contact.surface.soft_cfm = 0.0f; | 1181 | ContactCopy.surface.soft_cfm = 0.0f; |
1220 | } | 1182 | } |
1221 | joint = d.JointCreateContact(world, contactgroup, ref contact); | 1183 | joint = d.JointCreateContact(world, contactgroup, ref ContactCopy); |
1222 | m_global_contactcount++; | 1184 | m_global_contactcount++; |
1223 | /* | ||
1224 | Console.WriteLine("Prim | Av collision 2 mode={0} mu={1} bounce={2} bv={3} erp={4} cfm={5} mot={6} depth={7}", | ||
1225 | contact.surface.mode, | ||
1226 | contact.surface.mu, | ||
1227 | contact.surface.bounce, | ||
1228 | contact.surface.bounce_vel, | ||
1229 | contact.surface.soft_erp, | ||
1230 | contact.surface.soft_cfm, | ||
1231 | contact.surface.motion1, | ||
1232 | curContact.depth); | ||
1233 | */ | ||
1234 | } | 1185 | } |
1235 | } | 1186 | } |
1236 | } | 1187 | } |
@@ -1241,16 +1192,11 @@ curContact.depth); | |||
1241 | 1192 | ||
1242 | if (p2 is OdePrim) material = ((OdePrim)p2).m_material; | 1193 | if (p2 is OdePrim) material = ((OdePrim)p2).m_material; |
1243 | //m_log.DebugFormat("Material: {0}", material); | 1194 | //m_log.DebugFormat("Material: {0}", material); |
1244 | |||
1245 | if (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f) | ||
1246 | { | ||
1247 | movintYN = 1; | ||
1248 | } | ||
1249 | 1195 | ||
1250 | m_materialContacts[material, movintYN].geom = curContact; | 1196 | m_materialContacts[material, movintYN].geom = curContact; |
1251 | _perloopContact.Add(curContact); | 1197 | _perloopContact.Add(curContact); |
1252 | 1198 | ||
1253 | if (m_global_contactcount < maxContactsbeforedeath) | 1199 | if (m_global_contactcount < maxContactsbeforedeath) |
1254 | { | 1200 | { |
1255 | joint = d.JointCreateContact(world, contactgroup, ref m_materialContacts[material, movintYN]); | 1201 | joint = d.JointCreateContact(world, contactgroup, ref m_materialContacts[material, movintYN]); |
1256 | m_global_contactcount++; | 1202 | m_global_contactcount++; |