aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/PhysicsModules/UbitOde/ODEModule.cs88
-rw-r--r--OpenSim/Region/PhysicsModules/UbitOde/OdeScene.cs122
2 files changed, 113 insertions, 97 deletions
diff --git a/OpenSim/Region/PhysicsModules/UbitOde/ODEModule.cs b/OpenSim/Region/PhysicsModules/UbitOde/ODEModule.cs
new file mode 100644
index 0000000..7c3c688
--- /dev/null
+++ b/OpenSim/Region/PhysicsModules/UbitOde/ODEModule.cs
@@ -0,0 +1,88 @@
1using System;
2using System.Reflection;
3using log4net;
4using Nini.Config;
5using Mono.Addins;
6using OdeAPI;
7using OpenSim.Framework;
8using OpenSim.Region.Framework.Scenes;
9using OpenSim.Region.Framework.Interfaces;
10
11namespace OpenSim.Region.PhysicsModule.UbitOde
12{
13 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UBITODEPhysicsScene")]
14 class UbitOdeModule : INonSharedRegionModule
15 {
16 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
17
18 private bool m_Enabled = false;
19 private IConfigSource m_config;
20 private ODEScene m_scene;
21 private bool OdeUbitLib;
22
23 #region INonSharedRegionModule
24
25 public string Name
26 {
27 get { return "UbitODE"; }
28 }
29
30 public Type ReplaceableInterface
31 {
32 get { return null; }
33 }
34
35 public void Initialise(IConfigSource source)
36 {
37 IConfig config = source.Configs["Startup"];
38 if (config != null)
39 {
40 string physics = config.GetString("physics", string.Empty);
41 if (physics == Name)
42 {
43 m_config = source;
44 m_Enabled = true;
45 }
46 }
47 }
48
49 public void Close()
50 {
51 }
52
53 public void AddRegion(Scene scene)
54 {
55 if (!m_Enabled)
56 return;
57
58 if (Util.IsWindows())
59 Util.LoadArchSpecificWindowsDll("ode.dll");
60
61 // Initializing ODE only when a scene is created allows alternative ODE plugins to co-habit (according to
62 // http://opensimulator.org/mantis/view.php?id=2750).
63 d.InitODE();
64
65 string ode_config = d.GetConfiguration();
66 if (ode_config != null && ode_config != "")
67 {
68 m_log.InfoFormat("[UbitODE] ode library configuration: {0}", ode_config);
69
70 if (ode_config.Contains("ODE_Ubit"))
71 {
72 OdeUbitLib = true;
73 }
74 }
75
76 m_scene = new ODEScene(scene, m_config, Name, OdeUbitLib);
77 }
78
79 public void RemoveRegion(Scene scene)
80 {
81 }
82
83 public void RegionLoaded(Scene scene)
84 {
85 }
86 #endregion
87 }
88}
diff --git a/OpenSim/Region/PhysicsModules/UbitOde/OdeScene.cs b/OpenSim/Region/PhysicsModules/UbitOde/OdeScene.cs
index 8d3066d..58eb4b5 100644
--- a/OpenSim/Region/PhysicsModules/UbitOde/OdeScene.cs
+++ b/OpenSim/Region/PhysicsModules/UbitOde/OdeScene.cs
@@ -165,16 +165,13 @@ namespace OpenSim.Region.PhysicsModule.UbitOde
165 public Object arg; 165 public Object arg;
166 } 166 }
167 167
168 168 public class ODEScene : PhysicsScene
169 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UBITODEPhysicsScene")]
170 public class ODEScene : PhysicsScene, INonSharedRegionModule
171 { 169 {
172 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 170 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
173 171
174 private bool m_Enabled = false; 172 public bool m_odeUbitLib = false;
175
176 public bool OdeUbitLib = false;
177 public bool m_suportCombine = false; // mega suport not tested 173 public bool m_suportCombine = false; // mega suport not tested
174 public Scene m_frameWorkScene = null;
178 175
179// private int threadid = 0; 176// private int threadid = 0;
180 177
@@ -327,112 +324,43 @@ namespace OpenSim.Region.PhysicsModule.UbitOde
327 } 324 }
328 } 325 }
329 */ 326 */
330 #region INonSharedRegionModule 327
331 328 public ODEScene(Scene pscene, IConfigSource psourceconfig, string pname, bool podeUbitLib)
332 public string Name
333 {
334 get { return "UbitODE"; }
335 }
336
337 public Type ReplaceableInterface
338 {
339 get { return null; }
340 }
341
342 public void Initialise(IConfigSource source)
343 {
344 // TODO: Move this out of Startup
345 IConfig config = source.Configs["Startup"];
346 if (config != null)
347 {
348 string physics = config.GetString("physics", string.Empty);
349 if (physics == Name)
350 {
351 m_config = source;
352 m_Enabled = true;
353 }
354 }
355 }
356
357 public void Close()
358 {
359 }
360
361 public void AddRegion(Scene scene)
362 { 329 {
363 if (!m_Enabled)
364 return;
365
366 EngineType = Name;
367 PhysicsSceneName = EngineType + "/" + scene.RegionInfo.RegionName;
368
369 OdeLock = new Object(); 330 OdeLock = new Object();
370 331
371 // We do this so that OpenSimulator on Windows loads the correct native ODE library depending on whether 332 EngineType = pname;
372 // it's running as a 32-bit process or a 64-bit one. By invoking LoadLibary here, later DLLImports 333 PhysicsSceneName = EngineType + "/" + pscene.RegionInfo.RegionName;
373 // will find it already loaded later on.
374 //
375 // This isn't necessary for other platforms (e.g. Mac OSX and Linux) since the DLL used can be
376 // controlled in Ode.NET.dll.config
377 if (Util.IsWindows())
378 Util.LoadArchSpecificWindowsDll("ode.dll");
379
380 // Initializing ODE only when a scene is created allows alternative ODE plugins to co-habit (according to
381 // http://opensimulator.org/mantis/view.php?id=2750).
382 d.InitODE();
383
384 string ode_config = d.GetConfiguration();
385 if (ode_config != null && ode_config != "")
386 {
387 m_log.InfoFormat("[UbitODE] ode library configuration: {0}", ode_config);
388
389 if (ode_config.Contains("ODE_Ubit"))
390 {
391 OdeUbitLib = true;
392 }
393 }
394 334
395 Vector3 extent = new Vector3(scene.RegionInfo.RegionSizeX, scene.RegionInfo.RegionSizeY, scene.RegionInfo.RegionSizeZ); 335 m_config = psourceconfig;
336 m_odeUbitLib = podeUbitLib;
337 m_frameWorkScene = pscene;
396 338
397 mesher = scene.RequestModuleInterface<IMesher>(); 339 mesher = m_frameWorkScene.RequestModuleInterface<IMesher>();
398 if (mesher == null) 340 if (mesher == null)
399 { 341 {
400 m_log.WarnFormat("[UbitODE] No mesher. module disabled"); 342 m_log.WarnFormat("[UbitODE] No mesher. module disabled");
401 m_Enabled = false;
402 return; 343 return;
403 } 344 }
404 345
405 scene.RegisterModuleInterface<PhysicsScene>(this); 346 m_frameWorkScene.RegisterModuleInterface<PhysicsScene>(this);
406 347
407 Initialization(extent); 348 Initialization();
408 349
409 base.Initialise(scene.PhysicsRequestAsset, 350 base.Initialise(m_frameWorkScene.PhysicsRequestAsset,
410 (scene.Heightmap != null ? scene.Heightmap.GetFloatsSerialised() : new float[scene.RegionInfo.RegionSizeX * scene.RegionInfo.RegionSizeY]), 351 (m_frameWorkScene.Heightmap != null ? m_frameWorkScene.Heightmap.GetFloatsSerialised() : new float[m_frameWorkScene.RegionInfo.RegionSizeX * m_frameWorkScene.RegionInfo.RegionSizeY]),
411 (float)scene.RegionInfo.RegionSettings.WaterHeight); 352 (float)m_frameWorkScene.RegionInfo.RegionSettings.WaterHeight);
412 353
413 354
414 scene.PhysicsEnabled = true; 355 m_frameWorkScene.PhysicsEnabled = true;
415 }
416
417 public void RemoveRegion(Scene scene)
418 {
419// if (!m_Enabled)
420// return;
421 } 356 }
422 357
423 public void RegionLoaded(Scene scene)
424 {
425// if (!m_Enabled)
426// return;
427 }
428 #endregion
429
430 /// <summary> 358 /// <summary>
431 /// Initiailizes the scene 359 /// Initiailizes the scene
432 /// Sets many properties that ODE requires to be stable 360 /// Sets many properties that ODE requires to be stable
433 /// These settings need to be tweaked 'exactly' right or weird stuff happens. 361 /// These settings need to be tweaked 'exactly' right or weird stuff happens.
434 /// </summary> 362 /// </summary>
435 private void Initialization(Vector3 regionExtent) 363 private void Initialization()
436 { 364 {
437 // checkThread(); 365 // checkThread();
438 SimulationLock = new Object(); 366 SimulationLock = new Object();
@@ -441,10 +369,10 @@ namespace OpenSim.Region.PhysicsModule.UbitOde
441 369
442 m_rayCastManager = new ODERayCastRequestManager(this); 370 m_rayCastManager = new ODERayCastRequestManager(this);
443 371
444 WorldExtents.X = regionExtent.X; 372 WorldExtents.X = m_frameWorkScene.RegionInfo.RegionSizeX;
445 m_regionWidth = (uint)regionExtent.X; 373 m_regionWidth = (uint)WorldExtents.X;
446 WorldExtents.Y = regionExtent.Y; 374 WorldExtents.Y = m_frameWorkScene.RegionInfo.RegionSizeY;
447 m_regionHeight = (uint)regionExtent.Y; 375 m_regionHeight = (uint)WorldExtents.Y;
448 376
449 m_suportCombine = false; 377 m_suportCombine = false;
450 378
@@ -1995,7 +1923,7 @@ namespace OpenSim.Region.PhysicsModule.UbitOde
1995 int regsizeY = (int)m_regionHeight + 3; // map size see setterrain number of samples 1923 int regsizeY = (int)m_regionHeight + 3; // map size see setterrain number of samples
1996 int regsize = regsizeX; 1924 int regsize = regsizeX;
1997 1925
1998 if (OdeUbitLib) 1926 if (m_odeUbitLib)
1999 { 1927 {
2000 if (x < regsizeX - 1) 1928 if (x < regsizeX - 1)
2001 { 1929 {
@@ -2139,7 +2067,7 @@ namespace OpenSim.Region.PhysicsModule.UbitOde
2139 int ystep = regsizeX; 2067 int ystep = regsizeX;
2140 bool firstTri = false; 2068 bool firstTri = false;
2141 2069
2142 if (OdeUbitLib) 2070 if (m_odeUbitLib)
2143 { 2071 {
2144 if (x < regsizeX - 1) 2072 if (x < regsizeX - 1)
2145 { 2073 {
@@ -2251,7 +2179,7 @@ namespace OpenSim.Region.PhysicsModule.UbitOde
2251 2179
2252 public void SetTerrain(float[] heightMap, Vector3 pOffset) 2180 public void SetTerrain(float[] heightMap, Vector3 pOffset)
2253 { 2181 {
2254 if (OdeUbitLib) 2182 if (m_odeUbitLib)
2255 UbitSetTerrain(heightMap, pOffset); 2183 UbitSetTerrain(heightMap, pOffset);
2256 else 2184 else
2257 OriSetTerrain(heightMap, pOffset); 2185 OriSetTerrain(heightMap, pOffset);