aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
authorMelanie2013-01-26 01:56:23 +0000
committerMelanie2013-01-26 01:56:23 +0000
commite28c042dce141954477baa1a3babad9ce2a80e58 (patch)
tree000f7091deb70abb6b8574d4107e91e259255f40 /OpenSim/Region
parentMerge branch 'master' into careminster (diff)
parent* This adds llVolumeDetect functionality to the C# implementation of BulletSim. (diff)
downloadopensim-SC_OLD-e28c042dce141954477baa1a3babad9ce2a80e58.zip
opensim-SC_OLD-e28c042dce141954477baa1a3babad9ce2a80e58.tar.gz
opensim-SC_OLD-e28c042dce141954477baa1a3babad9ce2a80e58.tar.bz2
opensim-SC_OLD-e28c042dce141954477baa1a3babad9ce2a80e58.tar.xz
Merge branch 'master' into careminster
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs10
-rw-r--r--OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs52
-rw-r--r--OpenSim/Region/OptionalModules/Scripting/JsonStore/Tests/JsonStoreScriptModuleTests.cs145
-rw-r--r--OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs2
-rw-r--r--OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs2
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs202
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs11
8 files changed, 307 insertions, 119 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs b/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs
index f6e1d39..6bf50d2 100644
--- a/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs
@@ -41,7 +41,7 @@ using System.Linq.Expressions;
41namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms 41namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
42{ 42{
43 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "ScriptModuleCommsModule")] 43 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "ScriptModuleCommsModule")]
44 class ScriptModuleCommsModule : INonSharedRegionModule, IScriptModuleComms 44 public class ScriptModuleCommsModule : INonSharedRegionModule, IScriptModuleComms
45 { 45 {
46 private static readonly ILog m_log = 46 private static readonly ILog m_log =
47 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 47 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
diff --git a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
index 7b235ae..9fc2daf 100644
--- a/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Objects/Commands/ObjectCommandsModule.cs
@@ -592,11 +592,11 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
592 cdl.AddRow( 592 cdl.AddRow(
593 "LightColor", 593 "LightColor",
594 string.Format("<{0},{1},{2},{3}>", s.LightColorR, s.LightColorB, s.LightColorG, s.LightColorA)); 594 string.Format("<{0},{1},{2},{3}>", s.LightColorR, s.LightColorB, s.LightColorG, s.LightColorA));
595 cdl.AddRow("FlexiDrag", s.LightCutoff); 595 cdl.AddRow("LightCutoff", s.LightCutoff);
596 cdl.AddRow("FlexiDrag", s.LightEntry); 596 cdl.AddRow("LightEntry", s.LightEntry);
597 cdl.AddRow("FlexiDrag", s.LightFalloff); 597 cdl.AddRow("LightFalloff", s.LightFalloff);
598 cdl.AddRow("FlexiDrag", s.LightIntensity); 598 cdl.AddRow("LightIntensity", s.LightIntensity);
599 cdl.AddRow("FlexiDrag", s.LightRadius); 599 cdl.AddRow("LightRadius", s.LightRadius);
600 cdl.AddRow("Media", string.Format("{0} entries", s.Media != null ? s.Media.Count.ToString() : "n/a")); 600 cdl.AddRow("Media", string.Format("{0} entries", s.Media != null ? s.Media.Count.ToString() : "n/a"));
601 cdl.AddRow("PathBegin", s.PathBegin); 601 cdl.AddRow("PathBegin", s.PathBegin);
602 cdl.AddRow("PathEnd", s.PathEnd); 602 cdl.AddRow("PathEnd", s.PathEnd);
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs
index 0c175ca..b9dcfea 100644
--- a/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/JsonStoreScriptModule.cs
@@ -92,12 +92,12 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
92 } 92 }
93 catch (Exception e) 93 catch (Exception e)
94 { 94 {
95 m_log.ErrorFormat("[JsonStoreScripts] initialization error: {0}",e.Message); 95 m_log.ErrorFormat("[JsonStoreScripts]: initialization error: {0}", e.Message);
96 return; 96 return;
97 } 97 }
98 98
99 if (m_enabled) 99 if (m_enabled)
100 m_log.DebugFormat("[JsonStoreScripts] module is enabled"); 100 m_log.DebugFormat("[JsonStoreScripts]: module is enabled");
101 } 101 }
102 102
103 // ----------------------------------------------------------------- 103 // -----------------------------------------------------------------
@@ -150,7 +150,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
150 m_comms = m_scene.RequestModuleInterface<IScriptModuleComms>(); 150 m_comms = m_scene.RequestModuleInterface<IScriptModuleComms>();
151 if (m_comms == null) 151 if (m_comms == null)
152 { 152 {
153 m_log.ErrorFormat("[JsonStoreScripts] ScriptModuleComms interface not defined"); 153 m_log.ErrorFormat("[JsonStoreScripts]: ScriptModuleComms interface not defined");
154 m_enabled = false; 154 m_enabled = false;
155 return; 155 return;
156 } 156 }
@@ -158,40 +158,40 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
158 m_store = m_scene.RequestModuleInterface<IJsonStoreModule>(); 158 m_store = m_scene.RequestModuleInterface<IJsonStoreModule>();
159 if (m_store == null) 159 if (m_store == null)
160 { 160 {
161 m_log.ErrorFormat("[JsonStoreScripts] JsonModule interface not defined"); 161 m_log.ErrorFormat("[JsonStoreScripts]: JsonModule interface not defined");
162 m_enabled = false; 162 m_enabled = false;
163 return; 163 return;
164 } 164 }
165 165
166 try 166 try
167 { 167 {
168 m_comms.RegisterScriptInvocation(this,"JsonCreateStore"); 168 m_comms.RegisterScriptInvocation(this, "JsonCreateStore");
169 m_comms.RegisterScriptInvocation(this,"JsonDestroyStore"); 169 m_comms.RegisterScriptInvocation(this, "JsonDestroyStore");
170 170
171 m_comms.RegisterScriptInvocation(this,"JsonReadNotecard"); 171 m_comms.RegisterScriptInvocation(this, "JsonReadNotecard");
172 m_comms.RegisterScriptInvocation(this,"JsonWriteNotecard"); 172 m_comms.RegisterScriptInvocation(this, "JsonWriteNotecard");
173 173
174 m_comms.RegisterScriptInvocation(this,"JsonTestPath"); 174 m_comms.RegisterScriptInvocation(this, "JsonTestPath");
175 m_comms.RegisterScriptInvocation(this,"JsonTestPathJson"); 175 m_comms.RegisterScriptInvocation(this, "JsonTestPathJson");
176 176
177 m_comms.RegisterScriptInvocation(this,"JsonGetValue"); 177 m_comms.RegisterScriptInvocation(this, "JsonGetValue");
178 m_comms.RegisterScriptInvocation(this,"JsonGetValueJson"); 178 m_comms.RegisterScriptInvocation(this, "JsonGetValueJson");
179 179
180 m_comms.RegisterScriptInvocation(this,"JsonTakeValue"); 180 m_comms.RegisterScriptInvocation(this, "JsonTakeValue");
181 m_comms.RegisterScriptInvocation(this,"JsonTakeValueJson"); 181 m_comms.RegisterScriptInvocation(this, "JsonTakeValueJson");
182 182
183 m_comms.RegisterScriptInvocation(this,"JsonReadValue"); 183 m_comms.RegisterScriptInvocation(this, "JsonReadValue");
184 m_comms.RegisterScriptInvocation(this,"JsonReadValueJson"); 184 m_comms.RegisterScriptInvocation(this, "JsonReadValueJson");
185 185
186 m_comms.RegisterScriptInvocation(this,"JsonSetValue"); 186 m_comms.RegisterScriptInvocation(this, "JsonSetValue");
187 m_comms.RegisterScriptInvocation(this,"JsonSetValueJson"); 187 m_comms.RegisterScriptInvocation(this, "JsonSetValueJson");
188 188
189 m_comms.RegisterScriptInvocation(this,"JsonRemoveValue"); 189 m_comms.RegisterScriptInvocation(this, "JsonRemoveValue");
190 } 190 }
191 catch (Exception e) 191 catch (Exception e)
192 { 192 {
193 // See http://opensimulator.org/mantis/view.php?id=5971 for more information 193 // See http://opensimulator.org/mantis/view.php?id=5971 for more information
194 m_log.WarnFormat("[JsonStroreScripts] script method registration failed; {0}",e.Message); 194 m_log.WarnFormat("[JsonStoreScripts]: script method registration failed; {0}", e.Message);
195 m_enabled = false; 195 m_enabled = false;
196 } 196 }
197 } 197 }
@@ -354,7 +354,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
354 } 354 }
355 catch (Exception e) 355 catch (Exception e)
356 { 356 {
357 m_log.InfoFormat("[JsonStoreScripts] unable to retrieve value; {0}",e.ToString()); 357 m_log.InfoFormat("[JsonStoreScripts]: unable to retrieve value; {0}",e.ToString());
358 } 358 }
359 359
360 DispatchValue(scriptID,reqID,String.Empty); 360 DispatchValue(scriptID,reqID,String.Empty);
@@ -389,7 +389,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
389 } 389 }
390 catch (Exception e) 390 catch (Exception e)
391 { 391 {
392 m_log.InfoFormat("[JsonStoreScripts] unable to retrieve value; {0}",e.ToString()); 392 m_log.InfoFormat("[JsonStoreScripts]: unable to retrieve value; {0}",e.ToString());
393 } 393 }
394 394
395 DispatchValue(scriptID,reqID,String.Empty); 395 DispatchValue(scriptID,reqID,String.Empty);
@@ -421,7 +421,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
421 if (a.Type != (sbyte)AssetType.Notecard) 421 if (a.Type != (sbyte)AssetType.Notecard)
422 GenerateRuntimeError(String.Format("Invalid notecard asset {0}",assetID)); 422 GenerateRuntimeError(String.Format("Invalid notecard asset {0}",assetID));
423 423
424 m_log.DebugFormat("[JsonStoreScripts] read notecard in context {0}",storeID); 424 m_log.DebugFormat("[JsonStoreScripts]: read notecard in context {0}",storeID);
425 425
426 try 426 try
427 { 427 {
@@ -432,7 +432,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
432 } 432 }
433 catch (Exception e) 433 catch (Exception e)
434 { 434 {
435 m_log.WarnFormat("[JsonStoreScripts] Json parsing failed; {0}",e.Message); 435 m_log.WarnFormat("[JsonStoreScripts]: Json parsing failed; {0}",e.Message);
436 } 436 }
437 437
438 GenerateRuntimeError(String.Format("Json parsing failed for {0}",assetID.ToString())); 438 GenerateRuntimeError(String.Format("Json parsing failed for {0}",assetID.ToString()));
@@ -495,4 +495,4 @@ namespace OpenSim.Region.OptionalModules.Scripting.JsonStore
495 m_comms.DispatchReply(scriptID,1,assetID.ToString(),reqID.ToString()); 495 m_comms.DispatchReply(scriptID,1,assetID.ToString(),reqID.ToString());
496 } 496 }
497 } 497 }
498} 498} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/Scripting/JsonStore/Tests/JsonStoreScriptModuleTests.cs b/OpenSim/Region/OptionalModules/Scripting/JsonStore/Tests/JsonStoreScriptModuleTests.cs
new file mode 100644
index 0000000..397dd93
--- /dev/null
+++ b/OpenSim/Region/OptionalModules/Scripting/JsonStore/Tests/JsonStoreScriptModuleTests.cs
@@ -0,0 +1,145 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using System.Text;
32using log4net;
33using Nini.Config;
34using NUnit.Framework;
35using OpenMetaverse;
36using OpenSim.Framework;
37using OpenSim.Region.CoreModules.Scripting.ScriptModuleComms;
38using OpenSim.Region.Framework.Scenes;
39using OpenSim.Region.ScriptEngine.Shared;
40using OpenSim.Region.ScriptEngine.Shared.Api;
41using OpenSim.Services.Interfaces;
42using OpenSim.Tests.Common;
43using OpenSim.Tests.Common.Mock;
44
45namespace OpenSim.Region.OptionalModules.Scripting.JsonStore.Tests
46{
47 /// <summary>
48 /// Tests for inventory functions in LSL
49 /// </summary>
50 [TestFixture]
51 public class LSL_ApiInventoryTests : OpenSimTestCase
52 {
53 private Scene m_scene;
54 private MockScriptEngine m_engine;
55 private ScriptModuleCommsModule m_smcm;
56
57 [SetUp]
58 public override void SetUp()
59 {
60 base.SetUp();
61
62 TestHelpers.EnableLogging();
63
64 IConfigSource configSource = new IniConfigSource();
65 IConfig jsonStoreConfig = configSource.AddConfig("JsonStore");
66 jsonStoreConfig.Set("Enabled", "true");
67
68 m_engine = new MockScriptEngine();
69 m_smcm = new ScriptModuleCommsModule();
70 JsonStoreModule jsm = new JsonStoreModule();
71 JsonStoreScriptModule jssm = new JsonStoreScriptModule();
72
73 m_scene = new SceneHelpers().SetupScene();
74 SceneHelpers.SetupSceneModules(m_scene, configSource, m_engine, m_smcm, jsm, jssm);
75 }
76
77// [Test]
78 public void TestJsonCreateStore()
79 {
80 TestHelpers.InMethod();
81// TestHelpers.EnableLogging();
82
83 UUID storeId = (UUID)m_smcm.InvokeOperation(UUID.Zero, UUID.Zero, "JsonCreateStore", new object[] { "{}" });
84
85 Assert.That(storeId, Is.Not.EqualTo(UUID.Zero));
86 }
87
88// [Test]
89 public void TestJsonGetValue()
90 {
91 TestHelpers.InMethod();
92// TestHelpers.EnableLogging();
93
94 UUID storeId
95 = (UUID)m_smcm.InvokeOperation(
96 UUID.Zero, UUID.Zero, "JsonCreateStore", new object[] { "{ 'Hello' : 'World' }" });
97
98 string value
99 = (string)m_smcm.InvokeOperation(
100 UUID.Zero, UUID.Zero, "JsonGetValue", new object[] { storeId, "Hello" });
101
102 Assert.That(value, Is.EqualTo("World"));
103 }
104
105// [Test]
106 public void TestJsonTestPath()
107 {
108 TestHelpers.InMethod();
109// TestHelpers.EnableLogging();
110
111 UUID storeId
112 = (UUID)m_smcm.InvokeOperation(
113 UUID.Zero, UUID.Zero, "JsonCreateStore", new object[] { "{ 'Hello' : 'World' }" });
114
115 int result
116 = (int)m_smcm.InvokeOperation(
117 UUID.Zero, UUID.Zero, "JsonTestPath", new object[] { storeId, "Hello" });
118
119 Assert.That(result, Is.EqualTo(1));
120 }
121
122// [Test]
123 public void TestJsonSetValue()
124 {
125 TestHelpers.InMethod();
126// TestHelpers.EnableLogging();
127
128 UUID storeId
129 = (UUID)m_smcm.InvokeOperation(
130 UUID.Zero, UUID.Zero, "JsonCreateStore", new object[] { "{ }" });
131
132 int result
133 = (int)m_smcm.InvokeOperation(
134 UUID.Zero, UUID.Zero, "JsonSetValue", new object[] { storeId, "Hello", "World" });
135
136 Assert.That(result, Is.EqualTo(1));
137
138 string value
139 = (string)m_smcm.InvokeOperation(
140 UUID.Zero, UUID.Zero, "JsonGetValue", new object[] { storeId, "Hello" });
141
142 Assert.That(value, Is.EqualTo("World"));
143 }
144 }
145} \ No newline at end of file
diff --git a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
index 365fd78..34362af 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/Tests/NPCModuleTests.cs
@@ -74,6 +74,8 @@ namespace OpenSim.Region.OptionalModules.World.NPC.Tests
74 [SetUp] 74 [SetUp]
75 public void Init() 75 public void Init()
76 { 76 {
77 base.SetUp();
78
77 IConfigSource config = new IniConfigSource(); 79 IConfigSource config = new IniConfigSource();
78 config.AddConfig("NPC"); 80 config.AddConfig("NPC");
79 config.Configs["NPC"].Set("Enabled", "true"); 81 config.Configs["NPC"].Set("Enabled", "true");
diff --git a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs
index 12169ab..5fb74b0 100644
--- a/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs
+++ b/OpenSim/Region/OptionalModules/World/SceneCommands/SceneCommandsModule.cs
@@ -48,7 +48,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
48 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "SceneCommandsModule")] 48 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "SceneCommandsModule")]
49 public class SceneCommandsModule : ISceneCommandsModule, INonSharedRegionModule 49 public class SceneCommandsModule : ISceneCommandsModule, INonSharedRegionModule
50 { 50 {
51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 51// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52 52
53 private Scene m_scene; 53 private Scene m_scene;
54 54
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs b/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs
index f63d83c..04e77b8 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSAPIXNA.cs
@@ -137,6 +137,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
137 internal int LastEntityProperty = 0; 137 internal int LastEntityProperty = 0;
138 138
139 internal EntityProperties[] UpdatedObjects; 139 internal EntityProperties[] UpdatedObjects;
140 internal Dictionary<uint, GhostObject> specialCollisionObjects;
140 141
141 private static int m_collisionsThisFrame; 142 private static int m_collisionsThisFrame;
142 private BSScene PhysicsScene { get; set; } 143 private BSScene PhysicsScene { get; set; }
@@ -158,7 +159,13 @@ private sealed class BulletConstraintXNA : BulletConstraint
158 { 159 {
159 DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world; 160 DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
160 RigidBody body = ((BulletBodyXNA)pBody).rigidBody; 161 RigidBody body = ((BulletBodyXNA)pBody).rigidBody;
161 world.RemoveRigidBody(body); 162 CollisionObject collisionObject = ((BulletBodyXNA)pBody).body;
163 if (body != null)
164 world.RemoveRigidBody(body);
165 else if (collisionObject != null)
166 world.RemoveCollisionObject(collisionObject);
167 else
168 return false;
162 return true; 169 return true;
163 } 170 }
164 171
@@ -182,7 +189,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
182 189
183 public override void SetRestitution(BulletBody pCollisionObject, float pRestitution) 190 public override void SetRestitution(BulletBody pCollisionObject, float pRestitution)
184 { 191 {
185 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 192 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
186 collisionObject.SetRestitution(pRestitution); 193 collisionObject.SetRestitution(pRestitution);
187 } 194 }
188 195
@@ -219,13 +226,13 @@ private sealed class BulletConstraintXNA : BulletConstraint
219 226
220 public override void SetCcdMotionThreshold(BulletBody pCollisionObject, float pccdMotionThreashold) 227 public override void SetCcdMotionThreshold(BulletBody pCollisionObject, float pccdMotionThreashold)
221 { 228 {
222 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 229 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
223 collisionObject.SetCcdMotionThreshold(pccdMotionThreashold); 230 collisionObject.SetCcdMotionThreshold(pccdMotionThreashold);
224 } 231 }
225 232
226 public override void SetCcdSweptSphereRadius(BulletBody pCollisionObject, float pCcdSweptSphereRadius) 233 public override void SetCcdSweptSphereRadius(BulletBody pCollisionObject, float pCcdSweptSphereRadius)
227 { 234 {
228 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 235 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
229 collisionObject.SetCcdSweptSphereRadius(pCcdSweptSphereRadius); 236 collisionObject.SetCcdSweptSphereRadius(pCcdSweptSphereRadius);
230 } 237 }
231 238
@@ -262,7 +269,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
262 } 269 }
263 else 270 else
264 { 271 {
265 world.AddCollisionObject(rbody); 272 world.AddCollisionObject(cbody);
266 } 273 }
267 cbody.SetWorldTransform(origPos); 274 cbody.SetWorldTransform(origPos);
268 275
@@ -303,7 +310,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
303 310
304 public override bool SetCollisionGroupMask(BulletBody pCollisionObject, uint pGroup, uint pMask) 311 public override bool SetCollisionGroupMask(BulletBody pCollisionObject, uint pGroup, uint pMask)
305 { 312 {
306 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 313 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
307 collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup; 314 collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup;
308 collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup; 315 collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup;
309 if ((uint) collisionObject.GetBroadphaseHandle().m_collisionFilterGroup == 0) 316 if ((uint) collisionObject.GetBroadphaseHandle().m_collisionFilterGroup == 0)
@@ -390,7 +397,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
390 397
391 public override void SetTranslation(BulletBody pCollisionObject, Vector3 _position, Quaternion _orientation) 398 public override void SetTranslation(BulletBody pCollisionObject, Vector3 _position, Quaternion _orientation)
392 { 399 {
393 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 400 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
394 IndexedVector3 vposition = new IndexedVector3(_position.X, _position.Y, _position.Z); 401 IndexedVector3 vposition = new IndexedVector3(_position.X, _position.Y, _position.Z);
395 IndexedQuaternion vquaternion = new IndexedQuaternion(_orientation.X, _orientation.Y, _orientation.Z, 402 IndexedQuaternion vquaternion = new IndexedQuaternion(_orientation.X, _orientation.Y, _orientation.Z,
396 _orientation.W); 403 _orientation.W);
@@ -418,8 +425,11 @@ private sealed class BulletConstraintXNA : BulletConstraint
418 public override void SetMassProps(BulletBody pBody, float pphysMass, Vector3 plocalInertia) 425 public override void SetMassProps(BulletBody pBody, float pphysMass, Vector3 plocalInertia)
419 { 426 {
420 RigidBody body = (pBody as BulletBodyXNA).rigidBody; 427 RigidBody body = (pBody as BulletBodyXNA).rigidBody;
421 IndexedVector3 inertia = new IndexedVector3(plocalInertia.X, plocalInertia.Y, plocalInertia.Z); 428 if (body != null) // Can't set mass props on collision object.
422 body.SetMassProps(pphysMass, inertia); 429 {
430 IndexedVector3 inertia = new IndexedVector3(plocalInertia.X, plocalInertia.Y, plocalInertia.Z);
431 body.SetMassProps(pphysMass, inertia);
432 }
423 } 433 }
424 434
425 435
@@ -432,7 +442,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
432 442
433 public override void SetFriction(BulletBody pCollisionObject, float _currentFriction) 443 public override void SetFriction(BulletBody pCollisionObject, float _currentFriction)
434 { 444 {
435 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 445 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
436 collisionObject.SetFriction(_currentFriction); 446 collisionObject.SetFriction(_currentFriction);
437 } 447 }
438 448
@@ -459,7 +469,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
459 469
460 public override CollisionFlags RemoveFromCollisionFlags(BulletBody pCollisionObject, CollisionFlags pcollisionFlags) 470 public override CollisionFlags RemoveFromCollisionFlags(BulletBody pCollisionObject, CollisionFlags pcollisionFlags)
461 { 471 {
462 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 472 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
463 CollisionFlags existingcollisionFlags = (CollisionFlags)(uint)collisionObject.GetCollisionFlags(); 473 CollisionFlags existingcollisionFlags = (CollisionFlags)(uint)collisionObject.GetCollisionFlags();
464 existingcollisionFlags &= ~pcollisionFlags; 474 existingcollisionFlags &= ~pcollisionFlags;
465 collisionObject.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags)(uint)existingcollisionFlags); 475 collisionObject.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags)(uint)existingcollisionFlags);
@@ -494,8 +504,11 @@ private sealed class BulletConstraintXNA : BulletConstraint
494 public override void SetGravity(BulletBody pBody, Vector3 pGravity) 504 public override void SetGravity(BulletBody pBody, Vector3 pGravity)
495 { 505 {
496 RigidBody body = (pBody as BulletBodyXNA).rigidBody; 506 RigidBody body = (pBody as BulletBodyXNA).rigidBody;
497 IndexedVector3 gravity = new IndexedVector3(pGravity.X, pGravity.Y, pGravity.Z); 507 if (body != null) // Can't set collisionobject.set gravity
498 body.SetGravity(gravity); 508 {
509 IndexedVector3 gravity = new IndexedVector3(pGravity.X, pGravity.Y, pGravity.Z);
510 body.SetGravity(gravity);
511 }
499 } 512 }
500 513
501 public override bool DestroyConstraint(BulletWorld pWorld, BulletConstraint pConstraint) 514 public override bool DestroyConstraint(BulletWorld pWorld, BulletConstraint pConstraint)
@@ -733,7 +746,8 @@ private sealed class BulletConstraintXNA : BulletConstraint
733 public override void UpdateInertiaTensor(BulletBody pBody) 746 public override void UpdateInertiaTensor(BulletBody pBody)
734 { 747 {
735 RigidBody body = (pBody as BulletBodyXNA).rigidBody; 748 RigidBody body = (pBody as BulletBodyXNA).rigidBody;
736 body.UpdateInertiaTensor(); 749 if (body != null) // can't update inertia tensor on CollisionObject
750 body.UpdateInertiaTensor();
737 } 751 }
738 752
739 public override void RecalculateCompoundShapeLocalAabb(BulletShape pCompoundShape) 753 public override void RecalculateCompoundShapeLocalAabb(BulletShape pCompoundShape)
@@ -770,7 +784,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
770 784
771 public override CollisionObjectTypes GetBodyType(BulletBody pCollisionObject) 785 public override CollisionObjectTypes GetBodyType(BulletBody pCollisionObject)
772 { 786 {
773 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody; 787 CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
774 return (CollisionObjectTypes)(int) collisionObject.GetInternalType(); 788 return (CollisionObjectTypes)(int) collisionObject.GetInternalType();
775 } 789 }
776 790
@@ -889,7 +903,18 @@ private sealed class BulletConstraintXNA : BulletConstraint
889 world.RemoveRigidBody(bo); 903 world.RemoveRigidBody(bo);
890 } 904 }
891 } 905 }
892 906 if (co != null)
907 {
908 if (co.GetUserPointer() != null)
909 {
910 uint localId = (uint) co.GetUserPointer();
911 if (specialCollisionObjects.ContainsKey(localId))
912 {
913 specialCollisionObjects.Remove(localId);
914 }
915 }
916 }
917
893 } 918 }
894 919
895 public override void Shutdown(BulletWorld pWorld) 920 public override void Shutdown(BulletWorld pWorld)
@@ -1050,7 +1075,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1050 Vector3 worldExtent = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionHeight); 1075 Vector3 worldExtent = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionHeight);
1051 m_maxCollisions = maxCollisions; 1076 m_maxCollisions = maxCollisions;
1052 m_maxUpdatesPerFrame = maxUpdates; 1077 m_maxUpdatesPerFrame = maxUpdates;
1053 1078 specialCollisionObjects = new Dictionary<uint, GhostObject>();
1054 1079
1055 return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null)); 1080 return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null));
1056 } 1081 }
@@ -1310,6 +1335,12 @@ private sealed class BulletConstraintXNA : BulletConstraint
1310 CollisionShape shape = (pShape as BulletShapeXNA).shape; 1335 CollisionShape shape = (pShape as BulletShapeXNA).shape;
1311 gObj.SetCollisionShape(shape); 1336 gObj.SetCollisionShape(shape);
1312 gObj.SetUserPointer(pLocalID); 1337 gObj.SetUserPointer(pLocalID);
1338
1339 if (specialCollisionObjects.ContainsKey(pLocalID))
1340 specialCollisionObjects[pLocalID] = gObj;
1341 else
1342 specialCollisionObjects.Add(pLocalID, gObj);
1343
1313 // TODO: Add to Special CollisionObjects! 1344 // TODO: Add to Special CollisionObjects!
1314 return new BulletBodyXNA(pLocalID, gObj); 1345 return new BulletBodyXNA(pLocalID, gObj);
1315 } 1346 }
@@ -1399,7 +1430,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1399 } 1430 }
1400 1431
1401 public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) { 1432 public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) {
1402 /* TODO */ 1433
1403 if (cShape == null) 1434 if (cShape == null)
1404 return null; 1435 return null;
1405 CompoundShape compoundShape = (cShape as BulletShapeXNA).shape as CompoundShape; 1436 CompoundShape compoundShape = (cShape as BulletShapeXNA).shape as CompoundShape;
@@ -1407,7 +1438,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1407 BulletShape retShape = new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType())); 1438 BulletShape retShape = new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType()));
1408 1439
1409 1440
1410 return null; 1441 return retShape;
1411 } 1442 }
1412 1443
1413 public BSPhysicsShapeType BSShapeTypeFromBroadPhaseNativeType(BroadphaseNativeTypes pin) 1444 public BSPhysicsShapeType BSShapeTypeFromBroadPhaseNativeType(BroadphaseNativeTypes pin)
@@ -1802,26 +1833,29 @@ private sealed class BulletConstraintXNA : BulletConstraint
1802 numSimSteps = world.StepSimulation(timeStep, m_maxSubSteps, m_fixedTimeStep); 1833 numSimSteps = world.StepSimulation(timeStep, m_maxSubSteps, m_fixedTimeStep);
1803 int updates = 0; 1834 int updates = 0;
1804 1835
1805 1836 PersistentManifold contactManifold;
1806 1837 CollisionObject objA;
1838 CollisionObject objB;
1839 ManifoldPoint manifoldPoint;
1840 PairCachingGhostObject pairCachingGhostObject;
1807 1841
1808 m_collisionsThisFrame = 0; 1842 m_collisionsThisFrame = 0;
1809 int numManifolds = world.GetDispatcher().GetNumManifolds(); 1843 int numManifolds = world.GetDispatcher().GetNumManifolds();
1810 for (int j = 0; j < numManifolds; j++) 1844 for (int j = 0; j < numManifolds; j++)
1811 { 1845 {
1812 PersistentManifold contactManifold = world.GetDispatcher().GetManifoldByIndexInternal(j); 1846 contactManifold = world.GetDispatcher().GetManifoldByIndexInternal(j);
1813 int numContacts = contactManifold.GetNumContacts(); 1847 int numContacts = contactManifold.GetNumContacts();
1814 if (numContacts == 0) 1848 if (numContacts == 0)
1815 continue; 1849 continue;
1816 1850
1817 CollisionObject objA = contactManifold.GetBody0() as CollisionObject; 1851 objA = contactManifold.GetBody0() as CollisionObject;
1818 CollisionObject objB = contactManifold.GetBody1() as CollisionObject; 1852 objB = contactManifold.GetBody1() as CollisionObject;
1819 1853
1820 ManifoldPoint manifoldPoint = contactManifold.GetContactPoint(0); 1854 manifoldPoint = contactManifold.GetContactPoint(0);
1821 IndexedVector3 contactPoint = manifoldPoint.GetPositionWorldOnB(); 1855 //IndexedVector3 contactPoint = manifoldPoint.GetPositionWorldOnB();
1822 IndexedVector3 contactNormal = -manifoldPoint.m_normalWorldOnB; // make relative to A 1856 // IndexedVector3 contactNormal = -manifoldPoint.m_normalWorldOnB; // make relative to A
1823 1857
1824 RecordCollision(this, objA, objB, contactPoint, contactNormal,manifoldPoint.GetDistance()); 1858 RecordCollision(this, objA, objB, manifoldPoint.GetPositionWorldOnB(), -manifoldPoint.m_normalWorldOnB, manifoldPoint.GetDistance());
1825 m_collisionsThisFrame ++; 1859 m_collisionsThisFrame ++;
1826 if (m_collisionsThisFrame >= 9999999) 1860 if (m_collisionsThisFrame >= 9999999)
1827 break; 1861 break;
@@ -1829,12 +1863,19 @@ private sealed class BulletConstraintXNA : BulletConstraint
1829 1863
1830 } 1864 }
1831 1865
1832 updatedEntityCount = LastEntityProperty; 1866 foreach (GhostObject ghostObject in specialCollisionObjects.Values)
1833 updatedEntities = UpdatedObjects; 1867 {
1834 1868 pairCachingGhostObject = ghostObject as PairCachingGhostObject;
1869 if (pairCachingGhostObject != null)
1870 {
1871 RecordGhostCollisions(pairCachingGhostObject);
1872 }
1835 1873
1874 }
1836 1875
1837 1876
1877 updatedEntityCount = LastEntityProperty;
1878 updatedEntities = UpdatedObjects;
1838 1879
1839 collidersCount = LastCollisionDesc; 1880 collidersCount = LastCollisionDesc;
1840 colliders = UpdatedCollisions; 1881 colliders = UpdatedCollisions;
@@ -1860,60 +1901,49 @@ private sealed class BulletConstraintXNA : BulletConstraint
1860 } 1901 }
1861 public void RecordGhostCollisions(PairCachingGhostObject obj) 1902 public void RecordGhostCollisions(PairCachingGhostObject obj)
1862 { 1903 {
1863 /* 1904 IOverlappingPairCache cache = obj.GetOverlappingPairCache();
1864 *void BulletSim::RecordGhostCollisions(btPairCachingGhostObject* obj) 1905 ObjectArray<BroadphasePair> pairs = cache.GetOverlappingPairArray();
1865{ 1906
1866 btManifoldArray manifoldArray; 1907 DiscreteDynamicsWorld world = (PhysicsScene.World as BulletWorldXNA).world;
1867 btBroadphasePairArray& pairArray = obj->getOverlappingPairCache()->getOverlappingPairArray(); 1908 PersistentManifoldArray manifoldArray = new PersistentManifoldArray();
1868 int numPairs = pairArray.size(); 1909 BroadphasePair collisionPair;
1869 1910 PersistentManifold contactManifold;
1870 // For all the pairs of sets of contact points 1911
1871 for (int i=0; i < numPairs; i++) 1912 CollisionObject objA;
1872 { 1913 CollisionObject objB;
1873 if (m_collisionsThisFrame >= m_maxCollisionsPerFrame) 1914
1874 break; 1915 ManifoldPoint pt;
1875 1916
1876 manifoldArray.clear(); 1917 int numPairs = pairs.Count;
1877 const btBroadphasePair& pair = pairArray[i]; 1918
1878 1919 for (int i = 0; i < numPairs; i++)
1879 // The real representation is over in the world pair cache 1920 {
1880 btBroadphasePair* collisionPair = m_worldData.dynamicsWorld->getPairCache()->findPair(pair.m_pProxy0,pair.m_pProxy1); 1921 manifoldArray.Clear();
1881 if (!collisionPair) 1922 if (LastCollisionDesc < UpdatedCollisions.Length)
1882 continue; 1923 break;
1883 1924 collisionPair = world.GetPairCache().FindPair(pairs[i].m_pProxy0, pairs[i].m_pProxy1);
1884 if (collisionPair->m_algorithm) 1925 if (collisionPair == null)
1885 collisionPair->m_algorithm->getAllContactManifolds(manifoldArray); 1926 continue;
1886 1927
1887 // The collision pair has sets of collision points (manifolds) 1928 collisionPair.m_algorithm.GetAllContactManifolds(manifoldArray);
1888 for (int j=0; j < manifoldArray.size(); j++) 1929 for (int j = 0; j < manifoldArray.Count; j++)
1889 { 1930 {
1890 btPersistentManifold* contactManifold = manifoldArray[j]; 1931 contactManifold = manifoldArray[j];
1891 int numContacts = contactManifold->getNumContacts(); 1932 int numContacts = contactManifold.GetNumContacts();
1892 1933 objA = contactManifold.GetBody0() as CollisionObject;
1893 const btCollisionObject* objA = static_cast<const btCollisionObject*>(contactManifold->getBody0()); 1934 objB = contactManifold.GetBody1() as CollisionObject;
1894 const btCollisionObject* objB = static_cast<const btCollisionObject*>(contactManifold->getBody1()); 1935 for (int p = 0; p < numContacts; p++)
1895 1936 {
1896 // TODO: this is a more thurough check than the regular collision code -- 1937 pt = contactManifold.GetContactPoint(p);
1897 // here we find the penetrating contact in the manifold but for regular 1938 if (pt.GetDistance() < 0.0f)
1898 // collisions we assume the first point in the manifold is good enough. 1939 {
1899 // Decide of this extra checking is required or if first point is good enough. 1940 RecordCollision(this, objA, objB, pt.GetPositionWorldOnA(), -pt.m_normalWorldOnB,pt.GetDistance());
1900 for (int p=0; p < numContacts; p++) 1941 break;
1901 { 1942 }
1902 const btManifoldPoint& pt = contactManifold->getContactPoint(p); 1943 }
1903 // If a penetrating contact, this is a hit 1944 }
1904 if (pt.getDistance()<0.f) 1945 }
1905 { 1946
1906 const btVector3& contactPoint = pt.getPositionWorldOnA();
1907 const btVector3& normalOnA = -pt.m_normalWorldOnB;
1908 RecordCollision(objA, objB, contactPoint, normalOnA, pt.getDistance());
1909 // Only one contact point for each set of colliding objects
1910 break;
1911 }
1912 }
1913 }
1914 }
1915}
1916 */
1917 } 1947 }
1918 private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration) 1948 private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration)
1919 { 1949 {
@@ -1934,7 +1964,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
1934 contactNormal = -contactNormal; 1964 contactNormal = -contactNormal;
1935 } 1965 }
1936 1966
1937 ulong collisionID = ((ulong) idA << 32) | idB; 1967 //ulong collisionID = ((ulong) idA << 32) | idB;
1938 1968
1939 CollisionDesc cDesc = new CollisionDesc() 1969 CollisionDesc cDesc = new CollisionDesc()
1940 { 1970 {
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index f1ef449..7ad7c89 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -158,6 +158,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
158 get { return (Type != Vehicle.TYPE_NONE && Prim.IsPhysicallyActive); } 158 get { return (Type != Vehicle.TYPE_NONE && Prim.IsPhysicallyActive); }
159 } 159 }
160 160
161 // Return 'true' if this a vehicle that should be sitting on the ground
162 public bool IsGroundVehicle
163 {
164 get { return (Type == Vehicle.TYPE_CAR || Type == Vehicle.TYPE_SLED); }
165 }
166
161 #region Vehicle parameter setting 167 #region Vehicle parameter setting
162 internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) 168 internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue)
163 { 169 {
@@ -1176,6 +1182,11 @@ namespace OpenSim.Region.Physics.BulletSPlugin
1176 private void ApplyGravity(float pTimeStep) 1182 private void ApplyGravity(float pTimeStep)
1177 { 1183 {
1178 Vector3 appliedGravity = m_VehicleGravity * m_vehicleMass; 1184 Vector3 appliedGravity = m_VehicleGravity * m_vehicleMass;
1185
1186 // Hack to reduce downward force if the vehicle is probably sitting on the ground
1187 if (Prim.IsColliding && IsGroundVehicle)
1188 appliedGravity *= 0.2f;
1189
1179 VehicleAddForce(appliedGravity); 1190 VehicleAddForce(appliedGravity);
1180 1191
1181 VDetailLog("{0}, MoveLinear,applyGravity,vehGrav={1},appliedForce-{2}", 1192 VDetailLog("{0}, MoveLinear,applyGravity,vehGrav={1},appliedForce-{2}",