diff options
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/OdePlugin.cs')
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 260 |
1 files changed, 241 insertions, 19 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 1abedf5..178e6fd 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -123,6 +123,28 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
123 | Selected = 0x00000100 | 123 | Selected = 0x00000100 |
124 | } | 124 | } |
125 | 125 | ||
126 | /// <summary> | ||
127 | /// Material type for a primitive | ||
128 | /// </summary> | ||
129 | public enum Material : int | ||
130 | { | ||
131 | /// <summary></summary> | ||
132 | Stone = 0, | ||
133 | /// <summary></summary> | ||
134 | Metal = 1, | ||
135 | /// <summary></summary> | ||
136 | Glass = 2, | ||
137 | /// <summary></summary> | ||
138 | Wood = 3, | ||
139 | /// <summary></summary> | ||
140 | Flesh = 4, | ||
141 | /// <summary></summary> | ||
142 | Plastic = 5, | ||
143 | /// <summary></summary> | ||
144 | Rubber = 6 | ||
145 | |||
146 | } | ||
147 | |||
126 | public sealed class OdeScene : PhysicsScene | 148 | public sealed class OdeScene : PhysicsScene |
127 | { | 149 | { |
128 | private readonly ILog m_log; | 150 | private readonly ILog m_log; |
@@ -239,6 +261,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
239 | private d.Contact AvatarMovementprimContact; | 261 | private d.Contact AvatarMovementprimContact; |
240 | private d.Contact AvatarMovementTerrainContact; | 262 | private d.Contact AvatarMovementTerrainContact; |
241 | private d.Contact WaterContact; | 263 | private d.Contact WaterContact; |
264 | private d.Contact[,] m_materialContacts; | ||
242 | 265 | ||
243 | //Ckrinke: Comment out until used. We declare it, initialize it, but do not use it | 266 | //Ckrinke: Comment out until used. We declare it, initialize it, but do not use it |
244 | //Ckrinke private int m_randomizeWater = 200; | 267 | //Ckrinke private int m_randomizeWater = 200; |
@@ -319,6 +342,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
319 | _heightmap = new float[514*514]; | 342 | _heightmap = new float[514*514]; |
320 | _watermap = new float[258 * 258]; | 343 | _watermap = new float[258 * 258]; |
321 | 344 | ||
345 | |||
346 | |||
347 | |||
348 | |||
349 | |||
322 | // Zero out the prim spaces array (we split our space into smaller spaces so | 350 | // Zero out the prim spaces array (we split our space into smaller spaces so |
323 | // we can hit test less. | 351 | // we can hit test less. |
324 | } | 352 | } |
@@ -479,6 +507,131 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
479 | AvatarMovementTerrainContact.surface.bounce = mTerrainContactBounce; | 507 | AvatarMovementTerrainContact.surface.bounce = mTerrainContactBounce; |
480 | AvatarMovementTerrainContact.surface.soft_erp = mTerrainContactERP; | 508 | AvatarMovementTerrainContact.surface.soft_erp = mTerrainContactERP; |
481 | 509 | ||
510 | |||
511 | /* | ||
512 | <summary></summary> | ||
513 | Stone = 0, | ||
514 | /// <summary></summary> | ||
515 | Metal = 1, | ||
516 | /// <summary></summary> | ||
517 | Glass = 2, | ||
518 | /// <summary></summary> | ||
519 | Wood = 3, | ||
520 | /// <summary></summary> | ||
521 | Flesh = 4, | ||
522 | /// <summary></summary> | ||
523 | Plastic = 5, | ||
524 | /// <summary></summary> | ||
525 | Rubber = 6 | ||
526 | */ | ||
527 | |||
528 | m_materialContacts = new d.Contact[7,2]; | ||
529 | |||
530 | m_materialContacts[(int)Material.Stone, 0] = new d.Contact(); | ||
531 | m_materialContacts[(int)Material.Stone, 0].surface.mode |= d.ContactFlags.SoftERP; | ||
532 | m_materialContacts[(int)Material.Stone, 0].surface.mu = nmAvatarObjectContactFriction; | ||
533 | m_materialContacts[(int)Material.Stone, 0].surface.bounce = nmAvatarObjectContactBounce; | ||
534 | m_materialContacts[(int)Material.Stone, 0].surface.soft_cfm = 0.010f; | ||
535 | m_materialContacts[(int)Material.Stone, 0].surface.soft_erp = 0.010f; | ||
536 | |||
537 | m_materialContacts[(int)Material.Stone, 1] = new d.Contact(); | ||
538 | m_materialContacts[(int)Material.Stone, 1].surface.mode |= d.ContactFlags.SoftERP; | ||
539 | m_materialContacts[(int)Material.Stone, 1].surface.mu = mAvatarObjectContactFriction; | ||
540 | m_materialContacts[(int)Material.Stone, 1].surface.bounce = mAvatarObjectContactBounce; | ||
541 | m_materialContacts[(int)Material.Stone, 1].surface.soft_cfm = 0.010f; | ||
542 | m_materialContacts[(int)Material.Stone, 1].surface.soft_erp = 0.010f; | ||
543 | |||
544 | m_materialContacts[(int)Material.Metal, 0] = new d.Contact(); | ||
545 | m_materialContacts[(int)Material.Metal, 0].surface.mode |= d.ContactFlags.SoftERP; | ||
546 | m_materialContacts[(int)Material.Metal, 0].surface.mu = nmAvatarObjectContactFriction; | ||
547 | m_materialContacts[(int)Material.Metal, 0].surface.bounce = nmAvatarObjectContactBounce; | ||
548 | m_materialContacts[(int)Material.Metal, 0].surface.soft_cfm = 0.010f; | ||
549 | m_materialContacts[(int)Material.Metal, 0].surface.soft_erp = 0.010f; | ||
550 | |||
551 | m_materialContacts[(int)Material.Metal, 1] = new d.Contact(); | ||
552 | m_materialContacts[(int)Material.Metal, 1].surface.mode |= d.ContactFlags.SoftERP; | ||
553 | m_materialContacts[(int)Material.Metal, 1].surface.mu = mAvatarObjectContactFriction; | ||
554 | m_materialContacts[(int)Material.Metal, 1].surface.bounce = mAvatarObjectContactBounce; | ||
555 | m_materialContacts[(int)Material.Metal, 1].surface.soft_cfm = 0.010f; | ||
556 | m_materialContacts[(int)Material.Metal, 1].surface.soft_erp = 0.010f; | ||
557 | |||
558 | m_materialContacts[(int)Material.Glass, 0] = new d.Contact(); | ||
559 | m_materialContacts[(int)Material.Glass, 0].surface.mode |= d.ContactFlags.SoftERP; | ||
560 | m_materialContacts[(int)Material.Glass, 0].surface.mu = 1f; | ||
561 | m_materialContacts[(int)Material.Glass, 0].surface.bounce = 0.5f; | ||
562 | m_materialContacts[(int)Material.Glass, 0].surface.soft_cfm = 0.010f; | ||
563 | m_materialContacts[(int)Material.Glass, 0].surface.soft_erp = 0.010f; | ||
564 | |||
565 | /* | ||
566 | private float nmAvatarObjectContactFriction = 250f; | ||
567 | private float nmAvatarObjectContactBounce = 0.1f; | ||
568 | |||
569 | private float mAvatarObjectContactFriction = 75f; | ||
570 | private float mAvatarObjectContactBounce = 0.1f; | ||
571 | */ | ||
572 | m_materialContacts[(int)Material.Glass, 1] = new d.Contact(); | ||
573 | m_materialContacts[(int)Material.Glass, 1].surface.mode |= d.ContactFlags.SoftERP; | ||
574 | m_materialContacts[(int)Material.Glass, 1].surface.mu = 1f; | ||
575 | m_materialContacts[(int)Material.Glass, 1].surface.bounce = 0.5f; | ||
576 | m_materialContacts[(int)Material.Glass, 1].surface.soft_cfm = 0.010f; | ||
577 | m_materialContacts[(int)Material.Glass, 1].surface.soft_erp = 0.010f; | ||
578 | |||
579 | m_materialContacts[(int)Material.Wood, 0] = new d.Contact(); | ||
580 | m_materialContacts[(int)Material.Wood, 0].surface.mode |= d.ContactFlags.SoftERP; | ||
581 | m_materialContacts[(int)Material.Wood, 0].surface.mu = nmAvatarObjectContactFriction; | ||
582 | m_materialContacts[(int)Material.Wood, 0].surface.bounce = nmAvatarObjectContactBounce; | ||
583 | m_materialContacts[(int)Material.Wood, 0].surface.soft_cfm = 0.010f; | ||
584 | m_materialContacts[(int)Material.Wood, 0].surface.soft_erp = 0.010f; | ||
585 | |||
586 | m_materialContacts[(int)Material.Wood, 1] = new d.Contact(); | ||
587 | m_materialContacts[(int)Material.Wood, 1].surface.mode |= d.ContactFlags.SoftERP; | ||
588 | m_materialContacts[(int)Material.Wood, 1].surface.mu = mAvatarObjectContactFriction; | ||
589 | m_materialContacts[(int)Material.Wood, 1].surface.bounce = mAvatarObjectContactBounce; | ||
590 | m_materialContacts[(int)Material.Wood, 1].surface.soft_cfm = 0.010f; | ||
591 | m_materialContacts[(int)Material.Wood, 1].surface.soft_erp = 0.010f; | ||
592 | |||
593 | m_materialContacts[(int)Material.Flesh, 0] = new d.Contact(); | ||
594 | m_materialContacts[(int)Material.Flesh, 0].surface.mode |= d.ContactFlags.SoftERP; | ||
595 | m_materialContacts[(int)Material.Flesh, 0].surface.mu = nmAvatarObjectContactFriction; | ||
596 | m_materialContacts[(int)Material.Flesh, 0].surface.bounce = nmAvatarObjectContactBounce; | ||
597 | m_materialContacts[(int)Material.Flesh, 0].surface.soft_cfm = 0.010f; | ||
598 | m_materialContacts[(int)Material.Flesh, 0].surface.soft_erp = 0.010f; | ||
599 | |||
600 | m_materialContacts[(int)Material.Flesh, 1] = new d.Contact(); | ||
601 | m_materialContacts[(int)Material.Flesh, 1].surface.mode |= d.ContactFlags.SoftERP; | ||
602 | m_materialContacts[(int)Material.Flesh, 1].surface.mu = mAvatarObjectContactFriction; | ||
603 | m_materialContacts[(int)Material.Flesh, 1].surface.bounce = mAvatarObjectContactBounce; | ||
604 | m_materialContacts[(int)Material.Flesh, 1].surface.soft_cfm = 0.010f; | ||
605 | m_materialContacts[(int)Material.Flesh, 1].surface.soft_erp = 0.010f; | ||
606 | |||
607 | m_materialContacts[(int)Material.Plastic, 0] = new d.Contact(); | ||
608 | m_materialContacts[(int)Material.Plastic, 0].surface.mode |= d.ContactFlags.SoftERP; | ||
609 | m_materialContacts[(int)Material.Plastic, 0].surface.mu = nmAvatarObjectContactFriction; | ||
610 | m_materialContacts[(int)Material.Plastic, 0].surface.bounce = nmAvatarObjectContactBounce; | ||
611 | m_materialContacts[(int)Material.Plastic, 0].surface.soft_cfm = 0.010f; | ||
612 | m_materialContacts[(int)Material.Plastic, 0].surface.soft_erp = 0.010f; | ||
613 | |||
614 | m_materialContacts[(int)Material.Plastic, 1] = new d.Contact(); | ||
615 | m_materialContacts[(int)Material.Plastic, 1].surface.mode |= d.ContactFlags.SoftERP; | ||
616 | m_materialContacts[(int)Material.Plastic, 1].surface.mu = mAvatarObjectContactFriction; | ||
617 | m_materialContacts[(int)Material.Plastic, 1].surface.bounce = mAvatarObjectContactBounce; | ||
618 | m_materialContacts[(int)Material.Plastic, 1].surface.soft_cfm = 0.010f; | ||
619 | m_materialContacts[(int)Material.Plastic, 1].surface.soft_erp = 0.010f; | ||
620 | |||
621 | m_materialContacts[(int)Material.Rubber, 0] = new d.Contact(); | ||
622 | m_materialContacts[(int)Material.Rubber, 0].surface.mode |= d.ContactFlags.SoftERP; | ||
623 | m_materialContacts[(int)Material.Rubber, 0].surface.mu = nmAvatarObjectContactFriction; | ||
624 | m_materialContacts[(int)Material.Rubber, 0].surface.bounce = nmAvatarObjectContactBounce; | ||
625 | m_materialContacts[(int)Material.Rubber, 0].surface.soft_cfm = 0.010f; | ||
626 | m_materialContacts[(int)Material.Rubber, 0].surface.soft_erp = 0.010f; | ||
627 | |||
628 | m_materialContacts[(int)Material.Rubber, 1] = new d.Contact(); | ||
629 | m_materialContacts[(int)Material.Rubber, 1].surface.mode |= d.ContactFlags.SoftERP; | ||
630 | m_materialContacts[(int)Material.Rubber, 1].surface.mu = mAvatarObjectContactFriction; | ||
631 | m_materialContacts[(int)Material.Rubber, 1].surface.bounce = mAvatarObjectContactBounce; | ||
632 | m_materialContacts[(int)Material.Rubber, 1].surface.soft_cfm = 0.010f; | ||
633 | m_materialContacts[(int)Material.Rubber, 1].surface.soft_erp = 0.010f; | ||
634 | |||
482 | d.HashSpaceSetLevels(space, worldHashspaceLow, worldHashspaceHigh); | 635 | d.HashSpaceSetLevels(space, worldHashspaceLow, worldHashspaceHigh); |
483 | 636 | ||
484 | // Set the gravity,, don't disable things automatically (we set it explicitly on some things) | 637 | // Set the gravity,, don't disable things automatically (we set it explicitly on some things) |
@@ -869,13 +1022,63 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
869 | } | 1022 | } |
870 | else | 1023 | else |
871 | { | 1024 | { |
872 | // Use the non moving terrain contact | 1025 | if (p2.PhysicsActorType == (int)ActorTypes.Agent) |
873 | TerrainContact.geom = contacts[i]; | ||
874 | _perloopContact.Add(contacts[i]); | ||
875 | if (m_global_contactcount < maxContactsbeforedeath) | ||
876 | { | 1026 | { |
877 | joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); | 1027 | // Use the non moving terrain contact |
878 | m_global_contactcount++; | 1028 | TerrainContact.geom = contacts[i]; |
1029 | _perloopContact.Add(contacts[i]); | ||
1030 | if (m_global_contactcount < maxContactsbeforedeath) | ||
1031 | { | ||
1032 | joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); | ||
1033 | m_global_contactcount++; | ||
1034 | } | ||
1035 | } | ||
1036 | else | ||
1037 | { | ||
1038 | if (p2.PhysicsActorType == (int)ActorTypes.Prim && p1.PhysicsActorType == (int)ActorTypes.Prim) | ||
1039 | { | ||
1040 | // prim prim contact | ||
1041 | int pj294950 = 0; | ||
1042 | int movintYN = 0; | ||
1043 | // prim terrain contact | ||
1044 | if (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f) | ||
1045 | { | ||
1046 | movintYN = 1; | ||
1047 | } | ||
1048 | int material = ((OdePrim)p2).m_material; | ||
1049 | //m_log.DebugFormat("Material: {0}", material); | ||
1050 | m_materialContacts[material, movintYN].geom = contacts[i]; | ||
1051 | _perloopContact.Add(contacts[i]); | ||
1052 | |||
1053 | if (m_global_contactcount < maxContactsbeforedeath) | ||
1054 | { | ||
1055 | joint = d.JointCreateContact(world, contactgroup, ref m_materialContacts[material, movintYN]); | ||
1056 | m_global_contactcount++; | ||
1057 | |||
1058 | } | ||
1059 | |||
1060 | } | ||
1061 | else | ||
1062 | { | ||
1063 | |||
1064 | int movintYN = 0; | ||
1065 | // prim terrain contact | ||
1066 | if (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f) | ||
1067 | { | ||
1068 | movintYN = 1; | ||
1069 | } | ||
1070 | int material = ((OdePrim)p2).m_material; | ||
1071 | //m_log.DebugFormat("Material: {0}", material); | ||
1072 | m_materialContacts[material, movintYN].geom = contacts[i]; | ||
1073 | _perloopContact.Add(contacts[i]); | ||
1074 | |||
1075 | if (m_global_contactcount < maxContactsbeforedeath) | ||
1076 | { | ||
1077 | joint = d.JointCreateContact(world, contactgroup, ref m_materialContacts[material, movintYN]); | ||
1078 | m_global_contactcount++; | ||
1079 | |||
1080 | } | ||
1081 | } | ||
879 | } | 1082 | } |
880 | } | 1083 | } |
881 | //if (p2.PhysicsActorType == (int)ActorTypes.Prim) | 1084 | //if (p2.PhysicsActorType == (int)ActorTypes.Prim) |
@@ -885,13 +1088,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
885 | } | 1088 | } |
886 | else if (name1 == "Water" || name2 == "Water") | 1089 | else if (name1 == "Water" || name2 == "Water") |
887 | { | 1090 | { |
1091 | /* | ||
888 | if ((p2.PhysicsActorType == (int) ActorTypes.Prim)) | 1092 | if ((p2.PhysicsActorType == (int) ActorTypes.Prim)) |
889 | { | 1093 | { |
890 | } | 1094 | } |
891 | else | 1095 | else |
892 | { | 1096 | { |
893 | } | 1097 | } |
894 | 1098 | */ | |
895 | //WaterContact.surface.soft_cfm = 0.0000f; | 1099 | //WaterContact.surface.soft_cfm = 0.0000f; |
896 | //WaterContact.surface.soft_erp = 0.00000f; | 1100 | //WaterContact.surface.soft_erp = 0.00000f; |
897 | if (contacts[i].depth > 0.1f) | 1101 | if (contacts[i].depth > 0.1f) |
@@ -913,28 +1117,46 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
913 | { | 1117 | { |
914 | // we're colliding with prim or avatar | 1118 | // we're colliding with prim or avatar |
915 | // check if we're moving | 1119 | // check if we're moving |
916 | if ((p2.PhysicsActorType == (int) ActorTypes.Agent) && | 1120 | if ((p2.PhysicsActorType == (int)ActorTypes.Agent)) |
917 | (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) | ||
918 | { | 1121 | { |
919 | // Use the Movement prim contact | 1122 | if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) |
920 | AvatarMovementprimContact.geom = contacts[i]; | ||
921 | _perloopContact.Add(contacts[i]); | ||
922 | if (m_global_contactcount < maxContactsbeforedeath) | ||
923 | { | 1123 | { |
924 | joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementprimContact); | 1124 | // Use the Movement prim contact |
925 | m_global_contactcount++; | 1125 | AvatarMovementprimContact.geom = contacts[i]; |
1126 | _perloopContact.Add(contacts[i]); | ||
1127 | if (m_global_contactcount < maxContactsbeforedeath) | ||
1128 | { | ||
1129 | joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementprimContact); | ||
1130 | m_global_contactcount++; | ||
1131 | } | ||
1132 | } | ||
1133 | else | ||
1134 | { | ||
1135 | // Use the non movement contact | ||
1136 | contact.geom = contacts[i]; | ||
1137 | _perloopContact.Add(contacts[i]); | ||
1138 | |||
1139 | if (m_global_contactcount < maxContactsbeforedeath) | ||
1140 | { | ||
1141 | joint = d.JointCreateContact(world, contactgroup, ref contact); | ||
1142 | m_global_contactcount++; | ||
1143 | } | ||
926 | } | 1144 | } |
927 | } | 1145 | } |
928 | else | 1146 | else if (p2.PhysicsActorType == (int)ActorTypes.Prim) |
929 | { | 1147 | { |
930 | // Use the non movement contact | 1148 | //p1.PhysicsActorType |
931 | contact.geom = contacts[i]; | 1149 | int material = ((OdePrim)p2).m_material; |
1150 | |||
1151 | //m_log.DebugFormat("Material: {0}", material); | ||
1152 | m_materialContacts[material, 0].geom = contacts[i]; | ||
932 | _perloopContact.Add(contacts[i]); | 1153 | _perloopContact.Add(contacts[i]); |
933 | 1154 | ||
934 | if (m_global_contactcount < maxContactsbeforedeath) | 1155 | if (m_global_contactcount < maxContactsbeforedeath) |
935 | { | 1156 | { |
936 | joint = d.JointCreateContact(world, contactgroup, ref contact); | 1157 | joint = d.JointCreateContact(world, contactgroup, ref m_materialContacts[material, 0]); |
937 | m_global_contactcount++; | 1158 | m_global_contactcount++; |
1159 | |||
938 | } | 1160 | } |
939 | } | 1161 | } |
940 | } | 1162 | } |