/* maybe needed if ode uses tls private void checkThread() { int th = Thread.CurrentThread.ManagedThreadId; if(th != threadid) { threadid = th; d.AllocateODEDataForThread(~0U); } } */ /// <summary> /// Initiailizes the scene /// Sets many properties that ODE requires to be stable /// These settings need to be tweaked 'exactly' right or weird stuff happens. /// </summary> public OdeScene(string sceneIdentifier) { m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.ToString() + "." + sceneIdentifier); // checkThread(); Name = sceneIdentifier; OdeLock = new Object(); SimulationLock = new Object(); nearCallback = near; m_rayCastManager = new ODERayCastRequestManager(this); lock (OdeLock) { // Create the world and the first space try { world = d.WorldCreate(); TopSpace = d.HashSpaceCreate(IntPtr.Zero); // now the major subspaces ActiveSpace = d.HashSpaceCreate(TopSpace); StaticSpace = d.HashSpaceCreate(TopSpace); } catch { // i must RtC#FM } d.HashSpaceSetLevels(TopSpace, -2, 8); // cell sizes from .25 to 256 ?? need check what this really does d.HashSpaceSetLevels(ActiveSpace, -2, 8); d.HashSpaceSetLevels(StaticSpace, -2, 8); // demote to second level d.SpaceSetSublevel(ActiveSpace, 1); d.SpaceSetSublevel(StaticSpace, 1); contactgroup = d.JointGroupCreate(0); //contactgroup d.WorldSetAutoDisableFlag(world, false); #if USE_DRAWSTUFF Thread viewthread = new Thread(new ParameterizedThreadStart(startvisualization)); viewthread.Start(); #endif } _watermap = new float[258 * 258]; }
public override void Dispose() { m_rayCastManager.Dispose(); m_rayCastManager = null; lock (OdeLock) { lock (_prims) { foreach (OdePrim prm in _prims) { RemovePrim(prm); } } //foreach (OdeCharacter act in _characters) //{ //RemoveAvatar(act); //} d.WorldDestroy(world); //d.CloseODE(); } }
public override void Dispose() { m_rayCastManager.Dispose(); m_rayCastManager = null; lock (OdeLock) { lock (_prims) { foreach (OdePrim prm in _prims) { RemovePrim(prm); } } if (ContactgeomsArray != IntPtr.Zero) Marshal.FreeHGlobal(ContactgeomsArray); if (GlobalContactsArray != IntPtr.Zero) Marshal.FreeHGlobal(GlobalContactsArray); d.WorldDestroy(world); //d.CloseODE(); } }
/// <summary> /// Initiailizes the scene /// Sets many properties that ODE requires to be stable /// These settings need to be tweaked 'exactly' right or weird stuff happens. /// </summary> public OdeScene(CollisionLocker dode, string sceneIdentifier) { m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.ToString() + "." + sceneIdentifier); OdeLock = new Object(); ode = dode; nearCallback = near; triCallback = TriCallback; triArrayCallback = TriArrayCallback; m_rayCastManager = new ODERayCastRequestManager(this); lock (OdeLock) { // Create the world and the first space world = d.WorldCreate(); space = d.HashSpaceCreate(IntPtr.Zero); contactgroup = d.JointGroupCreate(0); //contactgroup d.WorldSetAutoDisableFlag(world, false); #if USE_DRAWSTUFF Thread viewthread = new Thread(new ParameterizedThreadStart(startvisualization)); viewthread.Start(); #endif } _watermap = new float[258 * 258]; // Zero out the prim spaces array (we split our space into smaller spaces so // we can hit test less. }