aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/CollisionSounds.cs334
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs108
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs133
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsActor.cs2
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs83
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs128
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs119
8 files changed, 564 insertions, 345 deletions
diff --git a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs
index 5d43027..81ca9f1 100644
--- a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs
+++ b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs
@@ -33,67 +33,116 @@ using OpenSim.Framework;
33 33
34namespace OpenSim.Region.Framework.Scenes 34namespace OpenSim.Region.Framework.Scenes
35{ 35{
36 public static class CollisionSounds 36 public struct CollisionForSoundInfo
37 { 37 {
38 // defines for cases 38 public uint colliderID;
39 // only know one UUID for now (woodflesh) 39 public Vector3 position;
40 public float relativeVel;
41 }
40 42
43 public static class CollisionSounds
44 {
41 private const int MaxMaterials = 7; 45 private const int MaxMaterials = 7;
42 // part part 46 // part part
47/*
48 private static UUID snd_StoneStone = new UUID("be7295c0-a158-11e1-b3dd-0800200c9a66");
49 private static UUID snd_StoneMetal = new UUID("be7295c0-a158-11e1-b3dd-0800201c9a66");
50 private static UUID snd_StoneGlass = new UUID("be7295c0-a158-11e1-b3dd-0800202c9a66");
51 private static UUID snd_StoneWood = new UUID("be7295c0-a158-11e1-b3dd-0800203c9a66");
52 private static UUID snd_StoneFlesh = new UUID("be7295c0-a158-11e1-b3dd-0800204c9a66");
53 private static UUID snd_StonePlastic = new UUID("be7295c0-a158-11e1-b3dd-0800205c9a66");
54 private static UUID snd_StoneRubber = new UUID("be7295c0-a158-11e1-b3dd-0800206c9a66");
55
56 private static UUID snd_MetalStone = new UUID("be7295c0-a158-11e1-b3dd-0801200c9a66");
57 private static UUID snd_MetalMetal = new UUID("be7295c0-a158-11e1-b3dd-0801201c9a66");
58 private static UUID snd_MetalGlass = new UUID("be7295c0-a158-11e1-b3dd-0801202c9a66");
59 private static UUID snd_MetalWood = new UUID("be7295c0-a158-11e1-b3dd-0801203c9a66");
60 private static UUID snd_MetalFlesh = new UUID("be7295c0-a158-11e1-b3dd-0801204c9a66");
61 private static UUID snd_MetalPlastic = new UUID("be7295c0-a158-11e1-b3dd-0801205c9a66");
62 private static UUID snd_MetalRubber = new UUID("be7295c0-a158-11e1-b3dd-0801206c9a66");
63
64 private static UUID snd_GlassStone = new UUID("be7295c0-a158-11e1-b3dd-0802200c9a66");
65 private static UUID snd_GlassMetal = new UUID("be7295c0-a158-11e1-b3dd-0802201c9a66");
66 private static UUID snd_GlassGlass = new UUID("be7295c0-a158-11e1-b3dd-0802202c9a66");
67 private static UUID snd_GlassWood = new UUID("be7295c0-a158-11e1-b3dd-0802203c9a66");
68 private static UUID snd_GlassFlesh = new UUID("be7295c0-a158-11e1-b3dd-0802204c9a66");
69 private static UUID snd_GlassPlastic = new UUID("be7295c0-a158-11e1-b3dd-0802205c9a66");
70 private static UUID snd_GlassRubber = new UUID("be7295c0-a158-11e1-b3dd-0802206c9a66");
71
72 private static UUID snd_WoodStone = new UUID("be7295c0-a158-11e1-b3dd-0803200c9a66");
73 private static UUID snd_WoodMetal = new UUID("be7295c0-a158-11e1-b3dd-0803201c9a66");
74 private static UUID snd_WoodGlass = new UUID("be7295c0-a158-11e1-b3dd-0803202c9a66");
75 private static UUID snd_WoodWood = new UUID("be7295c0-a158-11e1-b3dd-0803203c9a66");
76 private static UUID snd_WoodFlesh = new UUID("be7295c0-a158-11e1-b3dd-0803204c9a66");
77 private static UUID snd_WoodPlastic = new UUID("be7295c0-a158-11e1-b3dd-0803205c9a66");
78 private static UUID snd_WoodRubber = new UUID("be7295c0-a158-11e1-b3dd-0803206c9a66");
79
80 private static UUID snd_FleshStone = new UUID("be7295c0-a158-11e1-b3dd-0804200c9a66");
81 private static UUID snd_FleshMetal = new UUID("be7295c0-a158-11e1-b3dd-0804201c9a66");
82 private static UUID snd_FleshGlass = new UUID("be7295c0-a158-11e1-b3dd-0804202c9a66");
83 private static UUID snd_FleshWood = new UUID("be7295c0-a158-11e1-b3dd-0804203c9a66");
84 private static UUID snd_FleshFlesh = new UUID("be7295c0-a158-11e1-b3dd-0804204c9a66");
85 private static UUID snd_FleshPlastic = new UUID("be7295c0-a158-11e1-b3dd-0804205c9a66");
86 private static UUID snd_FleshRubber = new UUID("be7295c0-a158-11e1-b3dd-0804206c9a66");
87
88 private static UUID snd_PlasticStone = new UUID("be7295c0-a158-11e1-b3dd-0805200c9a66");
89 private static UUID snd_PlasticMetal = new UUID("be7295c0-a158-11e1-b3dd-0805201c9a66");
90 private static UUID snd_PlasticGlass = new UUID("be7295c0-a158-11e1-b3dd-0805202c9a66");
91 private static UUID snd_PlasticWood = new UUID("be7295c0-a158-11e1-b3dd-0805203c9a66");
92 private static UUID snd_PlasticFlesh = new UUID("be7295c0-a158-11e1-b3dd-0805204c9a66");
93 private static UUID snd_PlasticPlastic = new UUID("be7295c0-a158-11e1-b3dd-0805205c9a66");
94 private static UUID snd_PlasticRubber = new UUID("be7295c0-a158-11e1-b3dd-0805206c9a66");
95
96 private static UUID snd_RubberStone = new UUID("be7295c0-a158-11e1-b3dd-0806200c9a66");
97 private static UUID snd_RubberMetal = new UUID("be7295c0-a158-11e1-b3dd-0806201c9a66");
98 private static UUID snd_RubberGlass = new UUID("be7295c0-a158-11e1-b3dd-0806202c9a66");
99 private static UUID snd_RubberWood = new UUID("be7295c0-a158-11e1-b3dd-0806203c9a66");
100 private static UUID snd_RubberFlesh = new UUID("be7295c0-a158-11e1-b3dd-0806204c9a66");
101 private static UUID snd_RubberPlastic = new UUID("be7295c0-a158-11e1-b3dd-0806205c9a66");
102 private static UUID snd_RubberRubber = new UUID("be7295c0-a158-11e1-b3dd-0806206c9a66");
103
104 // terrain part
105 private static UUID snd_TerrainStone = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
106 private static UUID snd_TerrainMetal = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
107 private static UUID snd_TerrainGlass = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
108 private static UUID snd_TerrainWood = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
109 private static UUID snd_TerrainFlesh = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
110 private static UUID snd_TerrainPlastic = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
111 private static UUID snd_TerrainRubber = new UUID("be7295c0-a158-11e1-b3dd-0807200c9a66");
112*/
43 private static UUID snd_StoneStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 113 private static UUID snd_StoneStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
44 private static UUID snd_StoneMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 114 private static UUID snd_StoneMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
45 private static UUID snd_StoneGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 115 private static UUID snd_StoneGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
46 private static UUID snd_StoneWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 116 private static UUID snd_StoneWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
47 private static UUID snd_StoneFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 117 private static UUID snd_StoneFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
48 private static UUID snd_StonePlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 118 private static UUID snd_StonePlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
49 private static UUID snd_StoneRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 119 private static UUID snd_StoneRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
50 120
51 private static UUID snd_MetalStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 121 private static UUID snd_MetalMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
52 private static UUID snd_MetalMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 122 private static UUID snd_MetalGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
53 private static UUID snd_MetalGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 123 private static UUID snd_MetalWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
54 private static UUID snd_MetalWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 124 private static UUID snd_MetalFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
55 private static UUID snd_MetalFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 125 private static UUID snd_MetalPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
56 private static UUID snd_MetalPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 126 private static UUID snd_MetalRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
57 private static UUID snd_MetalRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 127
58 128 private static UUID snd_GlassGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
59 private static UUID snd_GlassStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 129 private static UUID snd_GlassWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
60 private static UUID snd_GlassMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 130 private static UUID snd_GlassFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
61 private static UUID snd_GlassGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 131 private static UUID snd_GlassPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
62 private static UUID snd_GlassWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 132 private static UUID snd_GlassRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
63 private static UUID snd_GlassFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 133
64 private static UUID snd_GlassPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 134 private static UUID snd_WoodWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
65 private static UUID snd_GlassRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 135 private static UUID snd_WoodFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
66 136 private static UUID snd_WoodPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
67 private static UUID snd_WoodStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 137 private static UUID snd_WoodRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
68 private static UUID snd_WoodMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 138
69 private static UUID snd_WoodGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 139 private static UUID snd_FleshFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
70 private static UUID snd_WoodWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 140 private static UUID snd_FleshPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
71 private static UUID snd_WoodFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 141 private static UUID snd_FleshRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
72 private static UUID snd_WoodPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 142
73 private static UUID snd_WoodRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 143 private static UUID snd_PlasticPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
74 144 private static UUID snd_PlasticRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
75 private static UUID snd_FleshStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 145
76 private static UUID snd_FleshMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
77 private static UUID snd_FleshGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
78 private static UUID snd_FleshWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
79 private static UUID snd_FleshFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
80 private static UUID snd_FleshPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
81 private static UUID snd_FleshRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
82
83 private static UUID snd_PlasticStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
84 private static UUID snd_PlasticMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
85 private static UUID snd_PlasticGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
86 private static UUID snd_PlasticWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
87 private static UUID snd_PlasticFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
88 private static UUID snd_PlasticPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
89 private static UUID snd_PlasticRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
90
91 private static UUID snd_RubberStone = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
92 private static UUID snd_RubberMetal = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
93 private static UUID snd_RubberGlass = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
94 private static UUID snd_RubberWood = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
95 private static UUID snd_RubberFlesh = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
96 private static UUID snd_RubberPlastic = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
97 private static UUID snd_RubberRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a"); 146 private static UUID snd_RubberRubber = new UUID("c80260ba-41fd-8a46-768a-6bf236360e3a");
98 147
99 // terrain part 148 // terrain part
@@ -114,7 +163,8 @@ namespace OpenSim.Region.Framework.Scenes
114 snd_TerrainPlastic, 163 snd_TerrainPlastic,
115 snd_TerrainRubber 164 snd_TerrainRubber
116 }; 165 };
117 166/*
167 //full assimetric sounds
118 public static UUID[] m_PartPart = { 168 public static UUID[] m_PartPart = {
119 snd_StoneStone, snd_StoneMetal, snd_StoneGlass, snd_StoneWood, snd_StoneFlesh, snd_StonePlastic, snd_StoneRubber, 169 snd_StoneStone, snd_StoneMetal, snd_StoneGlass, snd_StoneWood, snd_StoneFlesh, snd_StonePlastic, snd_StoneRubber,
120 snd_MetalStone, snd_MetalMetal, snd_MetalGlass, snd_MetalWood, snd_MetalFlesh, snd_MetalPlastic, snd_MetalRubber, 170 snd_MetalStone, snd_MetalMetal, snd_MetalGlass, snd_MetalWood, snd_MetalFlesh, snd_MetalPlastic, snd_MetalRubber,
@@ -124,10 +174,21 @@ namespace OpenSim.Region.Framework.Scenes
124 snd_PlasticStone, snd_PlasticMetal, snd_PlasticGlass, snd_PlasticWood, snd_PlasticFlesh, snd_PlasticPlastic, snd_PlasticRubber, 174 snd_PlasticStone, snd_PlasticMetal, snd_PlasticGlass, snd_PlasticWood, snd_PlasticFlesh, snd_PlasticPlastic, snd_PlasticRubber,
125 snd_RubberStone, snd_RubberMetal, snd_RubberGlass, snd_RubberWood, snd_RubberFlesh, snd_RubberPlastic, snd_RubberRubber 175 snd_RubberStone, snd_RubberMetal, snd_RubberGlass, snd_RubberWood, snd_RubberFlesh, snd_RubberPlastic, snd_RubberRubber
126 }; 176 };
127 177*/
128 public static void PartCollisionSound(SceneObjectPart part,List<uint> Colliders) 178 // simetric sounds
179 public static UUID[] m_PartPart = {
180 snd_StoneStone, snd_StoneMetal, snd_StoneGlass, snd_StoneWood, snd_StoneFlesh, snd_StonePlastic, snd_StoneRubber,
181 snd_StoneMetal, snd_MetalMetal, snd_MetalGlass, snd_MetalWood, snd_MetalFlesh, snd_MetalPlastic, snd_MetalRubber,
182 snd_StoneGlass, snd_MetalGlass, snd_GlassGlass, snd_GlassWood, snd_GlassFlesh, snd_GlassPlastic, snd_GlassRubber,
183 snd_StoneWood, snd_MetalWood, snd_GlassWood, snd_WoodWood, snd_WoodFlesh, snd_WoodPlastic, snd_WoodRubber,
184 snd_StoneFlesh, snd_MetalFlesh, snd_GlassFlesh, snd_WoodFlesh, snd_FleshFlesh, snd_FleshPlastic, snd_FleshRubber,
185 snd_StonePlastic, snd_MetalPlastic, snd_GlassPlastic, snd_WoodPlastic, snd_FleshPlastic, snd_PlasticPlastic, snd_PlasticRubber,
186 snd_StoneRubber, snd_MetalRubber, snd_GlassRubber, snd_WoodRubber, snd_FleshRubber, snd_PlasticRubber, snd_RubberRubber
187 };
188
189 public static void PartCollisionSound(SceneObjectPart part, List<CollisionForSoundInfo> collidersinfolist)
129 { 190 {
130 if(Colliders.Count == 0 || part == null) 191 if (collidersinfolist.Count == 0 || part == null)
131 return; 192 return;
132 193
133 if (part.VolumeDetectActive || (part.Flags & PrimFlags.Physics) == 0) 194 if (part.VolumeDetectActive || (part.Flags & PrimFlags.Physics) == 0)
@@ -136,121 +197,161 @@ namespace OpenSim.Region.Framework.Scenes
136 if (part.ParentGroup == null) 197 if (part.ParentGroup == null)
137 return; 198 return;
138 199
139 if (part.CollisionSound == part.invalidCollisionSoundUUID) 200 if (part.CollisionSoundType < 0)
140 return; 201 return;
141 202
142 UUID soundID; 203 float volume = 0.0f;
143 int otherMaterial; 204 bool HaveSound = false;
144 205
145 Vector3 position = part.AbsolutePosition; 206 UUID soundID = part.CollisionSound;
146 207
147 if (part.CollisionSound != UUID.Zero) 208 if (part.CollisionSoundType > 0)
148 { 209 {
149 if (part.CollisionSoundVolume > 0.0f) 210 // soundID = part.CollisionSound;
150 part.SendCollisionSound(part.CollisionSound, part.CollisionSoundVolume, position); 211 volume = part.CollisionSoundVolume;
151 return; 212 if (volume == 0.0f)
213 return;
214 HaveSound = true;
152 } 215 }
153 216
154 int thisMaterial = (int) part.Material; 217 bool doneownsound = false;
218
219 int thisMaterial = (int)part.Material;
155 if (thisMaterial >= MaxMaterials) 220 if (thisMaterial >= MaxMaterials)
156 thisMaterial = 3; 221 thisMaterial = 3;
157
158 int thisMatScaled = thisMaterial * MaxMaterials; 222 int thisMatScaled = thisMaterial * MaxMaterials;
159 int index;
160 223
161 bool doneownsound = false; 224 CollisionForSoundInfo colInfo;
225 uint id;
162 226
163 foreach (uint Id in Colliders) 227 for(int i = 0; i< collidersinfolist.Count; i++)
164 { 228 {
165 if (Id == 0) 229 colInfo = collidersinfolist[i];
230
231 id = colInfo.colliderID;
232 if (id == 0) // terrain collision
166 { 233 {
167 if (!doneownsound) 234 if (!doneownsound)
168 { 235 {
169 soundID = m_TerrainPart[thisMaterial]; 236 if (!HaveSound)
170 part.SendCollisionSound(soundID, 1.0, position); 237 {
238 volume = Math.Abs(colInfo.relativeVel);
239 if (volume < 0.2f)
240 continue;
241
242 volume *= volume * .0625f; // 4m/s == full volume
243 if (volume > 1.0f)
244 volume = 1.0f;
245
246 soundID = m_TerrainPart[thisMaterial];
247 }
248 part.SendCollisionSound(soundID, volume, colInfo.position);
171 doneownsound = true; 249 doneownsound = true;
172 } 250 }
173 continue; 251 continue;
174 } 252 }
175 253
176 SceneObjectPart otherPart = part.ParentGroup.Scene.GetSceneObjectPart(Id); 254 SceneObjectPart otherPart = part.ParentGroup.Scene.GetSceneObjectPart(id);
177 if (otherPart != null) 255 if (otherPart != null)
178 { 256 {
179 if (otherPart.CollisionSound == part.invalidCollisionSoundUUID || otherPart.VolumeDetectActive) 257 if (otherPart.CollisionSoundType < 0 || otherPart.VolumeDetectActive)
180 continue; 258 continue;
181 if (otherPart.CollisionSound != UUID.Zero) 259
182 otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, position); 260 if (!HaveSound)
183 else
184 { 261 {
185 otherMaterial = (int)otherPart.Material; 262 if (otherPart.CollisionSoundType > 0)
186 if (otherMaterial >= MaxMaterials) 263 {
187 otherMaterial = 3; 264 soundID = otherPart.CollisionSound;
188 index = thisMatScaled + otherMaterial; 265 volume = otherPart.CollisionSoundVolume;
189 soundID = m_PartPart[index]; 266 if (volume == 0.0f)
190 if (doneownsound) 267 continue;
191 otherPart.SendCollisionSound(soundID, 1.0, position); 268 }
192 else 269 else
193 { 270 {
194 part.SendCollisionSound(soundID, 1.0, position); 271 volume = Math.Abs(colInfo.relativeVel);
195 doneownsound = true; 272 if (volume < 0.2f)
273 continue;
274
275 volume *= volume * .0625f; // 4m/s == full volume
276 if (volume > 1.0f)
277 volume = 1.0f;
278
279 int otherMaterial = (int)otherPart.Material;
280 if (otherMaterial >= MaxMaterials)
281 otherMaterial = 3;
282
283 soundID = m_PartPart[thisMatScaled + otherMaterial];
196 } 284 }
197 } 285 }
198 } 286
199/* avatars get notification let them trigger the sound 287 if (doneownsound)
200 else if (!doneownsound) 288 otherPart.SendCollisionSound(soundID, volume, colInfo.position);
201 { 289 else
202 ScenePresence av = part.ParentGroup.Scene.GetScenePresence(Id);
203 if (av != null && (!av.IsChildAgent))
204 { 290 {
205 index = thisMatScaled + 4; // flesh 291 part.SendCollisionSound(soundID, volume, colInfo.position);
206 soundID = m_PartPart[index];
207 part.SendCollisionSound(soundID, 1.0);
208 doneownsound = true; 292 doneownsound = true;
209 } 293 }
210 } 294 }
211 */
212 } 295 }
213 } 296 }
214 297
215 public static void AvatarCollisionSound(ScenePresence av, List<uint> Colliders) 298 public static void AvatarCollisionSound(ScenePresence av, List<CollisionForSoundInfo> collidersinfolist)
216 { 299 {
217 if (Colliders.Count == 0 || av == null) 300 if (collidersinfolist.Count == 0 || av == null)
218 return; 301 return;
219 302
220 UUID soundID; 303 UUID soundID;
221 int otherMaterial; 304 int otherMaterial;
222 305
223 int thisMaterial = 3; 306 int thisMaterial = 4; // flesh
224 307
225 int thisMatScaled = thisMaterial * MaxMaterials; 308 int thisMatScaled = thisMaterial * MaxMaterials;
226 int index;
227// bool doneownsound = false;
228 309
229 Vector3 position = av.AbsolutePosition; 310 // bool doneownsound = false;
230 311
231 foreach (uint Id in Colliders) 312 CollisionForSoundInfo colInfo;
313 uint id;
314 float volume;
315
316 for(int i = 0; i< collidersinfolist.Count; i++)
232 { 317 {
233 if (Id == 0) 318 colInfo = collidersinfolist[i];
319
320 id = colInfo.colliderID;
321
322 if (id == 0) // no terrain collision sounds for now
234 { 323 {
235 continue; 324 continue;
325// volume = Math.Abs(colInfo.relativeVel);
326// if (volume < 0.2f)
327// continue;
328
236 } 329 }
237 330
238 SceneObjectPart otherPart = av.Scene.GetSceneObjectPart(Id); 331 SceneObjectPart otherPart = av.Scene.GetSceneObjectPart(id);
239 if (otherPart != null) 332 if (otherPart != null)
240 { 333 {
241 if (otherPart.CollisionSound == otherPart.invalidCollisionSoundUUID) 334 if (otherPart.CollisionSoundType < 0)
242 continue; 335 continue;
243 if (otherPart.CollisionSound != UUID.Zero) 336 if (otherPart.CollisionSoundType > 0 && otherPart.CollisionSoundVolume > 0f)
244 otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, position); 337 otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, colInfo.position);
245 else 338 else
246 { 339 {
340 volume = Math.Abs(colInfo.relativeVel);
341 if (volume < 0.2f)
342 continue;
343
344 volume *= volume * .0625f; // 4m/s == full volume
345 if (volume > 1.0f)
346 volume = 1.0f;
247 otherMaterial = (int)otherPart.Material; 347 otherMaterial = (int)otherPart.Material;
248 if (otherMaterial >= MaxMaterials) 348 if (otherMaterial >= MaxMaterials)
249 otherMaterial = 3; 349 otherMaterial = 3;
250 index = thisMatScaled + otherMaterial; 350
251 soundID = m_PartPart[index]; 351 soundID = m_PartPart[thisMatScaled + otherMaterial];
252 otherPart.SendCollisionSound(soundID, 1.0, position); 352 otherPart.SendCollisionSound(soundID, volume, colInfo.position);
253 } 353 }
354 continue;
254 } 355 }
255/* 356/*
256 else if (!doneownsound) 357 else if (!doneownsound)
@@ -266,6 +367,5 @@ namespace OpenSim.Region.Framework.Scenes
266 */ 367 */
267 } 368 }
268 } 369 }
269
270 } 370 }
271} \ No newline at end of file 371}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 5328ddc..46a7e3d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -3763,7 +3763,7 @@ namespace OpenSim.Region.Framework.Scenes
3763 } 3763 }
3764 if ((change & ObjectChangeType.Position) != 0) 3764 if ((change & ObjectChangeType.Position) != 0)
3765 { 3765 {
3766 if (m_scene.Permissions.CanObjectEntry(group.UUID, false, data.position)) 3766 if (IsAttachment || m_scene.Permissions.CanObjectEntry(group.UUID, false, data.position))
3767 UpdateGroupPosition(data.position); 3767 UpdateGroupPosition(data.position);
3768 updateType = updatetype.groupterse; 3768 updateType = updatetype.groupterse;
3769 } 3769 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 221a32b..749b281 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -329,11 +329,13 @@ namespace OpenSim.Region.Framework.Scenes
329 private Vector3 m_cameraAtOffset; 329 private Vector3 m_cameraAtOffset;
330 private bool m_forceMouselook; 330 private bool m_forceMouselook;
331 331
332 // TODO: Collision sound should have default. 332
333 // 0 for default collision sounds, -1 for script disabled sound 1 for script defined sound
334 private sbyte m_collisionSoundType;
333 private UUID m_collisionSound; 335 private UUID m_collisionSound;
334 private float m_collisionSoundVolume; 336 private float m_collisionSoundVolume;
335 337
336 private DateTime LastColSoundSentTime; 338 private int LastColSoundSentTime;
337 339
338 340
339 private SOPVehicle m_vehicle = null; 341 private SOPVehicle m_vehicle = null;
@@ -374,7 +376,7 @@ namespace OpenSim.Region.Framework.Scenes
374 // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from 376 // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from
375 // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log 377 // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log
376 m_inventory = new SceneObjectPartInventory(this); 378 m_inventory = new SceneObjectPartInventory(this);
377 LastColSoundSentTime = DateTime.UtcNow; 379 LastColSoundSentTime = Util.EnvironmentTickCount();
378 } 380 }
379 381
380 /// <summary> 382 /// <summary>
@@ -1353,12 +1355,39 @@ namespace OpenSim.Region.Framework.Scenes
1353 1355
1354 public UUID invalidCollisionSoundUUID = new UUID("ffffffff-ffff-ffff-ffff-ffffffffffff"); 1356 public UUID invalidCollisionSoundUUID = new UUID("ffffffff-ffff-ffff-ffff-ffffffffffff");
1355 1357
1358 // 0 for default collision sounds, -1 for script disabled sound 1 for script defined sound
1359 // runtime thing.. do not persist
1360 [XmlIgnore]
1361 public sbyte CollisionSoundType
1362 {
1363 get
1364 {
1365 return m_collisionSoundType;
1366 }
1367 set
1368 {
1369 m_collisionSoundType = value;
1370 if (value == -1)
1371 m_collisionSound = invalidCollisionSoundUUID;
1372 else if (value == 0)
1373 m_collisionSound = UUID.Zero;
1374 }
1375 }
1376
1356 public UUID CollisionSound 1377 public UUID CollisionSound
1357 { 1378 {
1358 get { return m_collisionSound; } 1379 get { return m_collisionSound; }
1359 set 1380 set
1360 { 1381 {
1361 m_collisionSound = value; 1382 m_collisionSound = value;
1383
1384 if (value == invalidCollisionSoundUUID)
1385 m_collisionSoundType = -1;
1386 else if (value == UUID.Zero)
1387 m_collisionSoundType = 0;
1388 else
1389 m_collisionSoundType = 1;
1390
1362 aggregateScriptEvents(); 1391 aggregateScriptEvents();
1363 } 1392 }
1364 } 1393 }
@@ -1586,7 +1615,10 @@ namespace OpenSim.Region.Framework.Scenes
1586 } 1615 }
1587 } 1616 }
1588 else if (PhysActor == null) 1617 else if (PhysActor == null)
1618 {
1589 ApplyPhysics((uint)Flags, VolumeDetectActive, false); 1619 ApplyPhysics((uint)Flags, VolumeDetectActive, false);
1620 UpdatePhysicsSubscribedEvents();
1621 }
1590 else 1622 else
1591 { 1623 {
1592 PhysActor.PhysicsShapeType = m_physicsShapeType; 1624 PhysActor.PhysicsShapeType = m_physicsShapeType;
@@ -2646,13 +2678,42 @@ namespace OpenSim.Region.Framework.Scenes
2646 2678
2647 else 2679 else
2648 { 2680 {
2681 List<CollisionForSoundInfo> soundinfolist = new List<CollisionForSoundInfo>();
2682
2649 // calculate things that started colliding this time 2683 // calculate things that started colliding this time
2650 // and build up list of colliders this time 2684 // and build up list of colliders this time
2651 foreach (uint localid in collissionswith.Keys) 2685 if (!VolumeDetectActive && CollisionSoundType >= 0)
2686 {
2687 CollisionForSoundInfo soundinfo;
2688 ContactPoint curcontact;
2689
2690 foreach (uint id in collissionswith.Keys)
2691 {
2692 thisHitColliders.Add(id);
2693 if (!m_lastColliders.Contains(id))
2694 {
2695 startedColliders.Add(id);
2696
2697 curcontact = collissionswith[id];
2698 if (Math.Abs(curcontact.RelativeSpeed) > 0.2)
2699 {
2700 soundinfo = new CollisionForSoundInfo();
2701 soundinfo.colliderID = id;
2702 soundinfo.position = curcontact.Position;
2703 soundinfo.relativeVel = curcontact.RelativeSpeed;
2704 soundinfolist.Add(soundinfo);
2705 }
2706 }
2707 }
2708 }
2709 else
2652 { 2710 {
2653 thisHitColliders.Add(localid); 2711 foreach (uint id in collissionswith.Keys)
2654 if (!m_lastColliders.Contains(localid)) 2712 {
2655 startedColliders.Add(localid); 2713 thisHitColliders.Add(id);
2714 if (!m_lastColliders.Contains(id))
2715 startedColliders.Add(id);
2716 }
2656 } 2717 }
2657 2718
2658 // calculate things that ended colliding 2719 // calculate things that ended colliding
@@ -2669,17 +2730,14 @@ namespace OpenSim.Region.Framework.Scenes
2669 // remove things that ended colliding from the last colliders list 2730 // remove things that ended colliding from the last colliders list
2670 foreach (uint localID in endedColliders) 2731 foreach (uint localID in endedColliders)
2671 m_lastColliders.Remove(localID); 2732 m_lastColliders.Remove(localID);
2672 }
2673
2674 // play the sound.
2675 2733
2676 bool IsNotVolumeDtc = !VolumeDetectActive; 2734 // play sounds.
2677 2735 if (soundinfolist.Count > 0)
2678 if (IsNotVolumeDtc && startedColliders.Count > 0 && CollisionSound != invalidCollisionSoundUUID) 2736 CollisionSounds.PartCollisionSound(this, soundinfolist);
2679 CollisionSounds.PartCollisionSound(this, startedColliders); 2737 }
2680 2738
2681 SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart); 2739 SendCollisionEvent(scriptEvents.collision_start, startedColliders, ParentGroup.Scene.EventManager.TriggerScriptCollidingStart);
2682 if (IsNotVolumeDtc) 2740 if (!VolumeDetectActive)
2683 SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding); 2741 SendCollisionEvent(scriptEvents.collision , m_lastColliders , ParentGroup.Scene.EventManager.TriggerScriptColliding);
2684 SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd); 2742 SendCollisionEvent(scriptEvents.collision_end , endedColliders , ParentGroup.Scene.EventManager.TriggerScriptCollidingEnd);
2685 2743
@@ -3224,8 +3282,8 @@ namespace OpenSim.Region.Framework.Scenes
3224 if (volume < 0) 3282 if (volume < 0)
3225 volume = 0; 3283 volume = 0;
3226 3284
3227 DateTime now = DateTime.UtcNow; 3285 int now = Util.EnvironmentTickCount();
3228 if((now - LastColSoundSentTime).Milliseconds < 200) // reduce rate to 5 per sec per part ?? 3286 if(Util.EnvironmentTickCountSubtract(now,LastColSoundSentTime) <200)
3229 return; 3287 return;
3230 3288
3231 LastColSoundSentTime = now; 3289 LastColSoundSentTime = now;
@@ -4623,7 +4681,15 @@ namespace OpenSim.Region.Framework.Scenes
4623 /// </remarks> 4681 /// </remarks>
4624 public void RemoveFromPhysics() 4682 public void RemoveFromPhysics()
4625 { 4683 {
4626 ParentGroup.Scene.PhysicsScene.RemovePrim(PhysActor); 4684 PhysicsActor pa = PhysActor;
4685 if (pa != null)
4686 {
4687 pa.OnCollisionUpdate -= PhysicsCollision;
4688 pa.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate;
4689 pa.OnOutOfBounds -= PhysicsOutOfBounds;
4690
4691 ParentGroup.Scene.PhysicsScene.RemovePrim(pa);
4692 }
4627 PhysActor = null; 4693 PhysActor = null;
4628 } 4694 }
4629 4695
@@ -4792,7 +4858,8 @@ namespace OpenSim.Region.Framework.Scenes
4792 4858
4793 pa.OnCollisionUpdate -= PhysicsCollision; 4859 pa.OnCollisionUpdate -= PhysicsCollision;
4794 4860
4795 bool hassound = ( CollisionSound != invalidCollisionSoundUUID); 4861 bool hassound = (CollisionSoundType >= 0 && !VolumeDetectActive);
4862
4796 scriptEvents CombinedEvents = AggregateScriptEvents; 4863 scriptEvents CombinedEvents = AggregateScriptEvents;
4797 4864
4798 // merge with root part 4865 // merge with root part
@@ -4801,10 +4868,7 @@ namespace OpenSim.Region.Framework.Scenes
4801 4868
4802 // submit to this part case 4869 // submit to this part case
4803 if (VolumeDetectActive) 4870 if (VolumeDetectActive)
4804 {
4805 CombinedEvents &= PhyscicsVolumeDtcSubsEvents; 4871 CombinedEvents &= PhyscicsVolumeDtcSubsEvents;
4806 hassound = false;
4807 }
4808 else if ((Flags & PrimFlags.Phantom) != 0) 4872 else if ((Flags & PrimFlags.Phantom) != 0)
4809 CombinedEvents &= PhyscicsPhantonSubsEvents; 4873 CombinedEvents &= PhyscicsPhantonSubsEvents;
4810 else 4874 else
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index e0872d0..225d4c9 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2043,7 +2043,7 @@ namespace OpenSim.Region.Framework.Scenes
2043// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); 2043// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied);
2044 2044
2045 if (PhysicsActor != null) 2045 if (PhysicsActor != null)
2046 m_sitAvatarHeight = PhysicsActor.Size.Z; 2046 m_sitAvatarHeight = PhysicsActor.Size.Z * 0.5f;
2047 2047
2048 bool canSit = false; 2048 bool canSit = false;
2049 pos = part.AbsolutePosition + offset; 2049 pos = part.AbsolutePosition + offset;
@@ -4287,6 +4287,7 @@ namespace OpenSim.Region.Framework.Scenes
4287 4287
4288 private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata) 4288 private void RaiseCollisionScriptEvents(Dictionary<uint, ContactPoint> coldata)
4289 { 4289 {
4290 /*
4290 lock(m_collisionEventLock) 4291 lock(m_collisionEventLock)
4291 { 4292 {
4292 if (m_collisionEventFlag) 4293 if (m_collisionEventFlag)
@@ -4296,76 +4297,106 @@ namespace OpenSim.Region.Framework.Scenes
4296 4297
4297 Util.FireAndForget(delegate(object x) 4298 Util.FireAndForget(delegate(object x)
4298 { 4299 {
4300 */
4299 try 4301 try
4300 { 4302 {
4301 List<uint> thisHitColliders = new List<uint>(); 4303 List<uint> thisHitColliders = new List<uint>();
4302 List<uint> endedColliders = new List<uint>(); 4304 List<uint> endedColliders = new List<uint>();
4303 List<uint> startedColliders = new List<uint>(); 4305 List<uint> startedColliders = new List<uint>();
4306 List<CollisionForSoundInfo> soundinfolist = new List<CollisionForSoundInfo>();
4307 CollisionForSoundInfo soundinfo;
4308 ContactPoint curcontact;
4304 4309
4305 foreach (uint localid in coldata.Keys) 4310 if (coldata.Count == 0)
4306 { 4311 {
4307 thisHitColliders.Add(localid); 4312 if (m_lastColliders.Count == 0)
4308 if (!m_lastColliders.Contains(localid)) 4313 return; // nothing to do
4309 { 4314
4310 startedColliders.Add(localid); 4315 foreach (uint localID in m_lastColliders)
4311 }
4312 //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
4313 }
4314
4315 // calculate things that ended colliding
4316 foreach (uint localID in m_lastColliders)
4317 {
4318 if (!thisHitColliders.Contains(localID))
4319 { 4316 {
4320 endedColliders.Add(localID); 4317 endedColliders.Add(localID);
4321 } 4318 }
4322 } 4319 m_lastColliders.Clear();
4323 //add the items that started colliding this time to the last colliders list.
4324 foreach (uint localID in startedColliders)
4325 {
4326 m_lastColliders.Add(localID);
4327 }
4328 // remove things that ended colliding from the last colliders list
4329 foreach (uint localID in endedColliders)
4330 {
4331 m_lastColliders.Remove(localID);
4332 } 4320 }
4333 4321
4334 // do event notification 4322 else
4335 if (startedColliders.Count > 0)
4336 { 4323 {
4337 CollisionSounds.AvatarCollisionSound(this, startedColliders); 4324 foreach (uint id in coldata.Keys)
4338
4339 ColliderArgs StartCollidingMessage = new ColliderArgs();
4340 List<DetectedObject> colliding = new List<DetectedObject>();
4341 foreach (uint localId in startedColliders)
4342 { 4325 {
4343 if (localId == 0) 4326 thisHitColliders.Add(id);
4344 continue; 4327 if (!m_lastColliders.Contains(id))
4328 {
4329 startedColliders.Add(id);
4330 curcontact = coldata[id];
4331 if (Math.Abs(curcontact.RelativeSpeed) > 0.2)
4332 {
4333 soundinfo = new CollisionForSoundInfo();
4334 soundinfo.colliderID = id;
4335 soundinfo.position = curcontact.Position;
4336 soundinfo.relativeVel = curcontact.RelativeSpeed;
4337 soundinfolist.Add(soundinfo);
4338 }
4339 }
4340 //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
4341 }
4345 4342
4346 SceneObjectPart obj = Scene.GetSceneObjectPart(localId); 4343 // calculate things that ended colliding
4347 string data = ""; 4344 foreach (uint localID in m_lastColliders)
4348 if (obj != null) 4345 {
4346 if (!thisHitColliders.Contains(localID))
4349 { 4347 {
4350 DetectedObject detobj = new DetectedObject(); 4348 endedColliders.Add(localID);
4351 detobj.keyUUID = obj.UUID;
4352 detobj.nameStr = obj.Name;
4353 detobj.ownerUUID = obj.OwnerID;
4354 detobj.posVector = obj.AbsolutePosition;
4355 detobj.rotQuat = obj.GetWorldRotation();
4356 detobj.velVector = obj.Velocity;
4357 detobj.colliderType = 0;
4358 detobj.groupUUID = obj.GroupID;
4359 colliding.Add(detobj);
4360 } 4349 }
4361 } 4350 }
4351 //add the items that started colliding this time to the last colliders list.
4352 foreach (uint localID in startedColliders)
4353 {
4354 m_lastColliders.Add(localID);
4355 }
4356 // remove things that ended colliding from the last colliders list
4357 foreach (uint localID in endedColliders)
4358 {
4359 m_lastColliders.Remove(localID);
4360 }
4362 4361
4363 if (colliding.Count > 0) 4362 if (soundinfolist.Count > 0)
4363 CollisionSounds.AvatarCollisionSound(this, soundinfolist);
4364
4365 // do event notification
4366 if (startedColliders.Count > 0)
4364 { 4367 {
4365 StartCollidingMessage.Colliders = colliding;
4366 4368
4367 foreach (SceneObjectGroup att in GetAttachments()) 4369 ColliderArgs StartCollidingMessage = new ColliderArgs();
4368 Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage); 4370 List<DetectedObject> colliding = new List<DetectedObject>();
4371 foreach (uint localId in startedColliders)
4372 {
4373 if (localId == 0)
4374 continue;
4375
4376 SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
4377 string data = "";
4378 if (obj != null)
4379 {
4380 DetectedObject detobj = new DetectedObject();
4381 detobj.keyUUID = obj.UUID;
4382 detobj.nameStr = obj.Name;
4383 detobj.ownerUUID = obj.OwnerID;
4384 detobj.posVector = obj.AbsolutePosition;
4385 detobj.rotQuat = obj.GetWorldRotation();
4386 detobj.velVector = obj.Velocity;
4387 detobj.colliderType = 0;
4388 detobj.groupUUID = obj.GroupID;
4389 colliding.Add(detobj);
4390 }
4391 }
4392
4393 if (colliding.Count > 0)
4394 {
4395 StartCollidingMessage.Colliders = colliding;
4396
4397 foreach (SceneObjectGroup att in GetAttachments())
4398 Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage);
4399 }
4369 } 4400 }
4370 } 4401 }
4371 4402
@@ -4446,7 +4477,7 @@ namespace OpenSim.Region.Framework.Scenes
4446 { 4477 {
4447 m_collisionEventFlag = false; 4478 m_collisionEventFlag = false;
4448 } 4479 }
4449 }); 4480// });
4450 } 4481 }
4451 4482
4452 private void TeleportFlagsDebug() { 4483 private void TeleportFlagsDebug() {
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
index b66d7f1..fb90887 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -59,12 +59,14 @@ namespace OpenSim.Region.Physics.Manager
59 public Vector3 Position; 59 public Vector3 Position;
60 public Vector3 SurfaceNormal; 60 public Vector3 SurfaceNormal;
61 public float PenetrationDepth; 61 public float PenetrationDepth;
62 public float RelativeSpeed;
62 63
63 public ContactPoint(Vector3 position, Vector3 surfaceNormal, float penetrationDepth) 64 public ContactPoint(Vector3 position, Vector3 surfaceNormal, float penetrationDepth)
64 { 65 {
65 Position = position; 66 Position = position;
66 SurfaceNormal = surfaceNormal; 67 SurfaceNormal = surfaceNormal;
67 PenetrationDepth = penetrationDepth; 68 PenetrationDepth = penetrationDepth;
69 RelativeSpeed = 0f; // for now let this one be set explicity
68 } 70 }
69 } 71 }
70 72
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
index b0711d7..1084b0e 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs
@@ -128,9 +128,10 @@ namespace OpenSim.Region.Physics.OdePlugin
128 public d.Mass ShellMass; 128 public d.Mass ShellMass;
129// public bool collidelock = false; 129// public bool collidelock = false;
130 130
131 private bool m_haseventsubscription = false;
132 public int m_eventsubscription = 0; 131 public int m_eventsubscription = 0;
133 private CollisionEventUpdate CollisionEventsThisFrame = new CollisionEventUpdate(); 132 private int m_cureventsubscription = 0;
133 private CollisionEventUpdate CollisionEventsThisFrame = null;
134 private bool SentEmptyCollisionsEvent;
134 135
135 // unique UUID of this character object 136 // unique UUID of this character object
136 public UUID m_uuid; 137 public UUID m_uuid;
@@ -239,7 +240,7 @@ namespace OpenSim.Region.Physics.OdePlugin
239 240
240 public override bool IsPhysical 241 public override bool IsPhysical
241 { 242 {
242 get { return false; } 243 get { return m_isPhysical; }
243 set { return; } 244 set { return; }
244 } 245 }
245 246
@@ -783,8 +784,6 @@ namespace OpenSim.Region.Physics.OdePlugin
783 784
784 // the Amotor still lets avatar rotation to drift during colisions 785 // the Amotor still lets avatar rotation to drift during colisions
785 // so force it back to identity 786 // so force it back to identity
786
787
788 787
789 d.Quaternion qtmp; 788 d.Quaternion qtmp;
790 qtmp.W = 1; 789 qtmp.W = 1;
@@ -903,6 +902,7 @@ namespace OpenSim.Region.Physics.OdePlugin
903 contact.SurfaceNormal.X = 0f; 902 contact.SurfaceNormal.X = 0f;
904 contact.SurfaceNormal.Y = 0f; 903 contact.SurfaceNormal.Y = 0f;
905 contact.SurfaceNormal.Z = -1f; 904 contact.SurfaceNormal.Z = -1f;
905 contact.RelativeSpeed = -vel.Z;
906 AddCollisionEvent(0, contact); 906 AddCollisionEvent(0, contact);
907 907
908 vec.Z *= 0.5f; 908 vec.Z *= 0.5f;
@@ -1119,47 +1119,71 @@ namespace OpenSim.Region.Physics.OdePlugin
1119 1119
1120 public override void SubscribeEvents(int ms) 1120 public override void SubscribeEvents(int ms)
1121 { 1121 {
1122 m_requestedUpdateFrequency = ms;
1123 m_eventsubscription = ms; 1122 m_eventsubscription = ms;
1124 _parent_scene.AddCollisionEventReporting(this); 1123 m_cureventsubscription = 0;
1125 m_haseventsubscription = true; 1124 if (CollisionEventsThisFrame == null)
1125 CollisionEventsThisFrame = new CollisionEventUpdate();
1126 SentEmptyCollisionsEvent = false;
1126 } 1127 }
1127 1128
1128 public override void UnSubscribeEvents() 1129 public override void UnSubscribeEvents()
1129 { 1130 {
1130 m_haseventsubscription = false; 1131 if (CollisionEventsThisFrame != null)
1131 _parent_scene.RemoveCollisionEventReporting(this); 1132 {
1132 m_requestedUpdateFrequency = 0; 1133 CollisionEventsThisFrame.Clear();
1134 CollisionEventsThisFrame = null;
1135 }
1133 m_eventsubscription = 0; 1136 m_eventsubscription = 0;
1134 } 1137 }
1135 1138
1136 public void AddCollisionEvent(uint CollidedWith, ContactPoint contact) 1139 public void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
1137 { 1140 {
1138 if (m_haseventsubscription) 1141 if (CollisionEventsThisFrame == null)
1139 { 1142 CollisionEventsThisFrame = new CollisionEventUpdate();
1140 // m_log.DebugFormat( 1143 CollisionEventsThisFrame.AddCollider(CollidedWith, contact);
1141 // "[PHYSICS]: Adding collision event for {0}, collidedWith {1}, contact {2}", "", CollidedWith, contact);
1142
1143 CollisionEventsThisFrame.AddCollider(CollidedWith, contact);
1144 }
1145 } 1144 }
1146 1145
1147 public void SendCollisions() 1146 public void SendCollisions()
1148 { 1147 {
1149 if (m_haseventsubscription && m_eventsubscription > m_requestedUpdateFrequency) 1148 if (CollisionEventsThisFrame == null)
1149 return;
1150
1151 if (m_cureventsubscription < m_eventsubscription)
1152 return;
1153
1154 m_cureventsubscription = 0;
1155
1156 int ncolisions = CollisionEventsThisFrame.m_objCollisionList.Count;
1157
1158 if (!SentEmptyCollisionsEvent || ncolisions > 0)
1150 { 1159 {
1151 if (CollisionEventsThisFrame != null) 1160 base.SendCollisionUpdate(CollisionEventsThisFrame);
1161
1162 if (ncolisions == 0)
1152 { 1163 {
1153 base.SendCollisionUpdate(CollisionEventsThisFrame); 1164 SentEmptyCollisionsEvent = true;
1165 _parent_scene.RemoveCollisionEventReporting(this);
1154 } 1166 }
1155 CollisionEventsThisFrame = new CollisionEventUpdate(); 1167 else
1156 m_eventsubscription = 0; 1168 {
1157 } 1169 SentEmptyCollisionsEvent = false;
1170 CollisionEventsThisFrame.Clear();
1171 }
1172 }
1173 }
1174
1175 internal void AddCollisionFrameTime(int t)
1176 {
1177 // protect it from overflow crashing
1178 if (m_cureventsubscription < 50000)
1179 m_cureventsubscription += t;
1158 } 1180 }
1159 1181
1160 public override bool SubscribedEvents() 1182 public override bool SubscribedEvents()
1161 { 1183 {
1162 return m_haseventsubscription; 1184 if (m_eventsubscription > 0)
1185 return true;
1186 return false;
1163 } 1187 }
1164 1188
1165 private void changePhysicsStatus(bool NewStatus) 1189 private void changePhysicsStatus(bool NewStatus)
@@ -1465,14 +1489,5 @@ namespace OpenSim.Region.Physics.OdePlugin
1465 { 1489 {
1466 _parent_scene.AddChange((PhysicsActor)this, what, arg); 1490 _parent_scene.AddChange((PhysicsActor)this, what, arg);
1467 } 1491 }
1468
1469
1470 internal void AddCollisionFrameTime(int p)
1471 {
1472 // protect it from overflow crashing
1473 if (m_eventsubscription + p >= int.MaxValue)
1474 m_eventsubscription = 0;
1475 m_eventsubscription += p;
1476 }
1477 } 1492 }
1478} 1493}
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
index 5db4f17..62fd279 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs
@@ -477,58 +477,58 @@ namespace OpenSim.Region.Physics.OdePlugin
477 477
478 // if(childPrim) we only know about physical linksets 478 // if(childPrim) we only know about physical linksets
479 return Ptot; 479 return Ptot;
480 /* 480/*
481 float tmass = _mass; 481 float tmass = _mass;
482 Ptot *= tmass; 482 Ptot *= tmass;
483 483
484 float m; 484 float m;
485 485
486 foreach (OdePrim prm in childrenPrim) 486 foreach (OdePrim prm in childrenPrim)
487 { 487 {
488 m = prm._mass; 488 m = prm._mass;
489 Ptot += prm.CenterOfMass * m; 489 Ptot += prm.CenterOfMass * m;
490 tmass += m; 490 tmass += m;
491 } 491 }
492 492
493 if (tmass == 0) 493 if (tmass == 0)
494 tmass = 0; 494 tmass = 0;
495 else 495 else
496 tmass = 1.0f / tmass; 496 tmass = 1.0f / tmass;
497 497
498 Ptot *= tmass; 498 Ptot *= tmass;
499 return Ptot; 499 return Ptot;
500 */ 500*/
501 } 501 }
502 else 502 else
503 return _position; 503 return _position;
504 } 504 }
505 } 505 }
506 } 506 }
507 /* 507/*
508 public override Vector3 PrimOOBsize 508 public override Vector3 PrimOOBsize
509 { 509 {
510 get 510 get
511 { 511 {
512 return primOOBsize; 512 return primOOBsize;
513 } 513 }
514 } 514 }
515 515
516 public override Vector3 PrimOOBoffset 516 public override Vector3 PrimOOBoffset
517 { 517 {
518 get 518 get
519 { 519 {
520 return primOOBoffset; 520 return primOOBoffset;
521 } 521 }
522 } 522 }
523 523
524 public override float PrimOOBRadiusSQ 524 public override float PrimOOBRadiusSQ
525 { 525 {
526 get 526 get
527 { 527 {
528 return primOOBradiusSQ; 528 return primOOBradiusSQ;
529 } 529 }
530 } 530 }
531 */ 531*/
532 public override PrimitiveBaseShape Shape 532 public override PrimitiveBaseShape Shape
533 { 533 {
534 set 534 set
@@ -582,7 +582,7 @@ namespace OpenSim.Region.Physics.OdePlugin
582 if (value.IsFinite()) 582 if (value.IsFinite())
583 { 583 {
584 AddChange(changes.Velocity, value); 584 AddChange(changes.Velocity, value);
585 // _velocity = value; 585// _velocity = value;
586 586
587 } 587 }
588 else 588 else
@@ -937,12 +937,10 @@ namespace OpenSim.Region.Physics.OdePlugin
937 if (CollisionEventsThisFrame == null) 937 if (CollisionEventsThisFrame == null)
938 CollisionEventsThisFrame = new CollisionEventUpdate(); 938 CollisionEventsThisFrame = new CollisionEventUpdate();
939 SentEmptyCollisionsEvent = false; 939 SentEmptyCollisionsEvent = false;
940 _parent_scene.AddCollisionEventReporting(this);
941 } 940 }
942 941
943 public override void UnSubscribeEvents() 942 public override void UnSubscribeEvents()
944 { 943 {
945 _parent_scene.RemoveCollisionEventReporting(this);
946 if (CollisionEventsThisFrame != null) 944 if (CollisionEventsThisFrame != null)
947 { 945 {
948 CollisionEventsThisFrame.Clear(); 946 CollisionEventsThisFrame.Clear();
@@ -975,7 +973,10 @@ namespace OpenSim.Region.Physics.OdePlugin
975 base.SendCollisionUpdate(CollisionEventsThisFrame); 973 base.SendCollisionUpdate(CollisionEventsThisFrame);
976 974
977 if (ncolisions == 0) 975 if (ncolisions == 0)
976 {
978 SentEmptyCollisionsEvent = true; 977 SentEmptyCollisionsEvent = true;
978 _parent_scene.RemoveCollisionEventReporting(this);
979 }
979 else 980 else
980 { 981 {
981 SentEmptyCollisionsEvent = false; 982 SentEmptyCollisionsEvent = false;
@@ -986,11 +987,10 @@ namespace OpenSim.Region.Physics.OdePlugin
986 987
987 internal void AddCollisionFrameTime(int t) 988 internal void AddCollisionFrameTime(int t)
988 { 989 {
989 // protect it from overflow crashing 990 if (m_cureventsubscription < 50000)
990 if (m_cureventsubscription + t >= int.MaxValue) 991 m_cureventsubscription += t;
991 m_cureventsubscription = 0;
992 m_cureventsubscription += t;
993 } 992 }
993
994 public override bool SubscribedEvents() 994 public override bool SubscribedEvents()
995 { 995 {
996 if (m_eventsubscription > 0) 996 if (m_eventsubscription > 0)
@@ -1735,8 +1735,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1735 1735
1736 d.BodySetAutoDisableFlag(Body, true); 1736 d.BodySetAutoDisableFlag(Body, true);
1737 d.BodySetAutoDisableSteps(Body, body_autodisable_frames); 1737 d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
1738 // d.BodySetLinearDampingThreshold(Body, 0.01f); 1738// d.BodySetLinearDampingThreshold(Body, 0.01f);
1739 // d.BodySetAngularDampingThreshold(Body, 0.001f); 1739// d.BodySetAngularDampingThreshold(Body, 0.001f);
1740 d.BodySetDamping(Body, .002f, .002f); 1740 d.BodySetDamping(Body, .002f, .002f);
1741 1741
1742 if (m_targetSpace != IntPtr.Zero) 1742 if (m_targetSpace != IntPtr.Zero)
@@ -2966,7 +2966,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2966 givefakepos--; 2966 givefakepos--;
2967 if (givefakepos < 0) 2967 if (givefakepos < 0)
2968 givefakepos = 0; 2968 givefakepos = 0;
2969 // changeSelectedStatus(); 2969// changeSelectedStatus();
2970 resetCollisionAccounting(); 2970 resetCollisionAccounting();
2971 } 2971 }
2972 2972
@@ -2981,14 +2981,14 @@ namespace OpenSim.Region.Physics.OdePlugin
2981 { 2981 {
2982 _orientation = newOri; 2982 _orientation = newOri;
2983 } 2983 }
2984 /* 2984/*
2985 else if (m_forcePosOrRotation && _orientation != newOri && Body != IntPtr.Zero) 2985 else if (m_forcePosOrRotation && _orientation != newOri && Body != IntPtr.Zero)
2986 { 2986 {
2987 FixInertia(_position, newOri); 2987 FixInertia(_position, newOri);
2988 if (!d.BodyIsEnabled(Body)) 2988 if (!d.BodyIsEnabled(Body))
2989 d.BodyEnable(Body); 2989 d.BodyEnable(Body);
2990 } 2990 }
2991 */ 2991*/
2992 } 2992 }
2993 else 2993 else
2994 { 2994 {
@@ -3939,12 +3939,12 @@ namespace OpenSim.Region.Physics.OdePlugin
3939 changevelocity((Vector3)arg); 3939 changevelocity((Vector3)arg);
3940 break; 3940 break;
3941 3941
3942 // case changes.Acceleration: 3942// case changes.Acceleration:
3943 // changeacceleration((Vector3)arg); 3943// changeacceleration((Vector3)arg);
3944 // break; 3944// break;
3945 // case changes.AngVelocity: 3945// case changes.AngVelocity:
3946 // changeangvelocity((Vector3)arg); 3946// changeangvelocity((Vector3)arg);
3947 // break; 3947// break;
3948 3948
3949 case changes.Force: 3949 case changes.Force:
3950 changeForce((Vector3)arg); 3950 changeForce((Vector3)arg);
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index ddfdea4..bfcfd21 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -190,6 +190,7 @@ namespace OpenSim.Region.Physics.OdePlugin
190 190
191 public float ODE_STEPSIZE = 0.020f; 191 public float ODE_STEPSIZE = 0.020f;
192 public float HalfOdeStep = 0.01f; 192 public float HalfOdeStep = 0.01f;
193 public int odetimestepMS = 20; // rounded
193 private float metersInSpace = 25.6f; 194 private float metersInSpace = 25.6f;
194 private float m_timeDilation = 1.0f; 195 private float m_timeDilation = 1.0f;
195 196
@@ -247,6 +248,7 @@ namespace OpenSim.Region.Physics.OdePlugin
247 /// A list of actors that should receive collision events. 248 /// A list of actors that should receive collision events.
248 /// </summary> 249 /// </summary>
249 private readonly List<PhysicsActor> _collisionEventPrim = new List<PhysicsActor>(); 250 private readonly List<PhysicsActor> _collisionEventPrim = new List<PhysicsActor>();
251 private readonly List<PhysicsActor> _collisionEventPrimRemove = new List<PhysicsActor>();
250 252
251 private readonly HashSet<OdeCharacter> _badCharacter = new HashSet<OdeCharacter>(); 253 private readonly HashSet<OdeCharacter> _badCharacter = new HashSet<OdeCharacter>();
252 public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>(); 254 public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>();
@@ -489,6 +491,7 @@ namespace OpenSim.Region.Physics.OdePlugin
489 } 491 }
490 492
491 HalfOdeStep = ODE_STEPSIZE * 0.5f; 493 HalfOdeStep = ODE_STEPSIZE * 0.5f;
494 odetimestepMS = (int)(1000.0f * ODE_STEPSIZE +0.5f);
492 495
493 ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf); 496 ContactgeomsArray = Marshal.AllocHGlobal(contactsPerCollision * d.ContactGeom.unmanagedSizeOf);
494 GlobalContactsArray = GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf); 497 GlobalContactsArray = GlobalContactsArray = Marshal.AllocHGlobal(maxContactsbeforedeath * d.Contact.unmanagedSizeOf);
@@ -1064,7 +1067,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1064 obj2LocalID = 0; 1067 obj2LocalID = 0;
1065 bool p1events = p1.SubscribedEvents(); 1068 bool p1events = p1.SubscribedEvents();
1066 bool p2events = p2.SubscribedEvents(); 1069 bool p2events = p2.SubscribedEvents();
1067 1070
1068 if (p1.IsVolumeDtc) 1071 if (p1.IsVolumeDtc)
1069 p2events = false; 1072 p2events = false;
1070 if (p2.IsVolumeDtc) 1073 if (p2.IsVolumeDtc)
@@ -1073,6 +1076,21 @@ namespace OpenSim.Region.Physics.OdePlugin
1073 if (!(p2events || p1events)) 1076 if (!(p2events || p1events))
1074 return; 1077 return;
1075 1078
1079 if (p1events)
1080 AddCollisionEventReporting(p1);
1081
1082 if (p2events)
1083 AddCollisionEventReporting(p2);
1084
1085 Vector3 vel = Vector3.Zero;
1086 if (p2 != null && p2.IsPhysical)
1087 vel = p2.Velocity;
1088
1089 if (p1 != null && p1.IsPhysical)
1090 vel -= p1.Velocity;
1091
1092 contact.RelativeSpeed = Vector3.Dot(vel, contact.SurfaceNormal);
1093
1076 switch ((ActorTypes)p1.PhysicsActorType) 1094 switch ((ActorTypes)p1.PhysicsActorType)
1077 { 1095 {
1078 case ActorTypes.Agent: 1096 case ActorTypes.Agent:
@@ -1246,20 +1264,14 @@ namespace OpenSim.Region.Physics.OdePlugin
1246 } 1264 }
1247 1265
1248 #endregion 1266 #endregion
1249
1250
1251
1252 /// <summary> 1267 /// <summary>
1253 /// Add actor to the list that should receive collision events in the simulate loop. 1268 /// Add actor to the list that should receive collision events in the simulate loop.
1254 /// </summary> 1269 /// </summary>
1255 /// <param name="obj"></param> 1270 /// <param name="obj"></param>
1256 public void AddCollisionEventReporting(PhysicsActor obj) 1271 public void AddCollisionEventReporting(PhysicsActor obj)
1257 { 1272 {
1258 lock (_collisionEventPrim) 1273 if (!_collisionEventPrim.Contains(obj))
1259 { 1274 _collisionEventPrim.Add(obj);
1260 if (!_collisionEventPrim.Contains(obj))
1261 _collisionEventPrim.Add(obj);
1262 }
1263 } 1275 }
1264 1276
1265 /// <summary> 1277 /// <summary>
@@ -1268,13 +1280,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1268 /// <param name="obj"></param> 1280 /// <param name="obj"></param>
1269 public void RemoveCollisionEventReporting(PhysicsActor obj) 1281 public void RemoveCollisionEventReporting(PhysicsActor obj)
1270 { 1282 {
1271 lock (_collisionEventPrim) 1283 if (_collisionEventPrim.Contains(obj) && !_collisionEventPrimRemove.Contains(obj))
1272 { 1284 _collisionEventPrimRemove.Add(obj);
1273 if (_collisionEventPrim.Contains(obj))
1274 _collisionEventPrim.Remove(obj);
1275 }
1276 } 1285 }
1277 1286
1287
1278 #region Add/Remove Entities 1288 #region Add/Remove Entities
1279 1289
1280 public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) 1290 public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying)
@@ -1463,6 +1473,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1463 { 1473 {
1464// lock (OdeLock) 1474// lock (OdeLock)
1465 { 1475 {
1476
1466 OdePrim p = (OdePrim)prim; 1477 OdePrim p = (OdePrim)prim;
1467 p.setPrimForRemoval(); 1478 p.setPrimForRemoval();
1468 } 1479 }
@@ -1818,7 +1829,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1818 { 1829 {
1819 int ttmpstart = Util.EnvironmentTickCount(); 1830 int ttmpstart = Util.EnvironmentTickCount();
1820 int ttmp; 1831 int ttmp;
1821 int ttmp2;
1822 1832
1823 while(ChangesQueue.Dequeue(out item)) 1833 while(ChangesQueue.Dequeue(out item))
1824 { 1834 {
@@ -1840,11 +1850,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1840 if (ttmp > 20) 1850 if (ttmp > 20)
1841 break; 1851 break;
1842 } 1852 }
1843
1844 ttmp2 = Util.EnvironmentTickCountSubtract(ttmpstart);
1845 if (ttmp2 > 50)
1846 ttmp2 = 0;
1847
1848 } 1853 }
1849 1854
1850 // Move characters 1855 // Move characters
@@ -1881,53 +1886,55 @@ namespace OpenSim.Region.Physics.OdePlugin
1881 1886
1882 collision_optimized(); 1887 collision_optimized();
1883 1888
1884 lock (_collisionEventPrim) 1889 foreach (PhysicsActor obj in _collisionEventPrim)
1885 { 1890 {
1886 foreach (PhysicsActor obj in _collisionEventPrim) 1891 if (obj == null)
1892 continue;
1893
1894 switch ((ActorTypes)obj.PhysicsActorType)
1887 { 1895 {
1888 if (obj == null) 1896 case ActorTypes.Agent:
1889 continue; 1897 OdeCharacter cobj = (OdeCharacter)obj;
1898 cobj.AddCollisionFrameTime((int)(odetimestepMS));
1899 cobj.SendCollisions();
1900 break;
1890 1901
1891 switch ((ActorTypes)obj.PhysicsActorType) 1902 case ActorTypes.Prim:
1892 { 1903 OdePrim pobj = (OdePrim)obj;
1893 case ActorTypes.Agent: 1904 if (pobj.Body == IntPtr.Zero || (d.BodyIsEnabled(pobj.Body) && !pobj.m_outbounds))
1894 OdeCharacter cobj = (OdeCharacter)obj; 1905 {
1895 cobj.AddCollisionFrameTime((int)(ODE_STEPSIZE*1000.0f)); 1906 pobj.AddCollisionFrameTime((int)(odetimestepMS));
1896 cobj.SendCollisions(); 1907 pobj.SendCollisions();
1897 break; 1908 }
1898 1909 break;
1899 case ActorTypes.Prim:
1900 OdePrim pobj = (OdePrim)obj;
1901 if (pobj.Body == IntPtr.Zero || (d.BodyIsEnabled(pobj.Body) && !pobj.m_outbounds))
1902 {
1903 pobj.AddCollisionFrameTime((int)(ODE_STEPSIZE * 1000.0f));
1904 pobj.SendCollisions();
1905 }
1906 break;
1907 }
1908 } 1910 }
1909 } 1911 }
1910 1912
1913 foreach (PhysicsActor obj in _collisionEventPrimRemove)
1914 _collisionEventPrim.Remove(obj);
1915
1916 _collisionEventPrimRemove.Clear();
1917
1911 // do a ode simulation step 1918 // do a ode simulation step
1912 d.WorldQuickStep(world, ODE_STEPSIZE); 1919 d.WorldQuickStep(world, ODE_STEPSIZE);
1913 d.JointGroupEmpty(contactgroup); 1920 d.JointGroupEmpty(contactgroup);
1914 1921
1915 // update managed ideia of physical data and do updates to core 1922 // update managed ideia of physical data and do updates to core
1916 /* 1923 /*
1917 lock (_characters) 1924 lock (_characters)
1918 { 1925 {
1919 foreach (OdeCharacter actor in _characters) 1926 foreach (OdeCharacter actor in _characters)
1920 { 1927 {
1921 if (actor != null) 1928 if (actor != null)
1922 { 1929 {
1923 if (actor.bad) 1930 if (actor.bad)
1924 m_log.WarnFormat("[PHYSICS]: BAD Actor {0} in _characters list was not removed?", actor.m_uuid); 1931 m_log.WarnFormat("[PHYSICS]: BAD Actor {0} in _characters list was not removed?", actor.m_uuid);
1925 1932
1926 actor.UpdatePositionAndVelocity(); 1933 actor.UpdatePositionAndVelocity();
1927 } 1934 }
1928 } 1935 }
1929 } 1936 }
1930 */ 1937 */
1931 1938
1932 lock (_activegroups) 1939 lock (_activegroups)
1933 { 1940 {