public void Destroy() { if (shapesDictionary.Count != 0) { Log.Warning("ODEPhysicsWorld: OnShutdownLibrary: shapesDictionary.Count != 0."); } if (neoAxisAdditionsID != IntPtr.Zero) { Ode.NeoAxisAdditions_Shutdown(neoAxisAdditionsID); neoAxisAdditionsID = IntPtr.Zero; } if (rayCastGeomID != dGeomID.Zero) { Ode.dGeomDestroy(rayCastGeomID); rayCastGeomID = dGeomID.Zero; } if (rootSpaceID != dSpaceID.Zero) { Ode.dSpaceDestroy(rootSpaceID); rootSpaceID = dSpaceID.Zero; } if (worldID != dWorldID.Zero) { Ode.dWorldDestroy(worldID); worldID = dWorldID.Zero; } if (contactJointGroupID != dJointGroupID.Zero) { Ode.dJointGroupDestroy(contactJointGroupID); contactJointGroupID = dJointGroupID.Zero; } }
public extern static void DoSimulationStep( dNeoAxisAdditionsID additions, out int collisionEventCount, out IntPtr collisionEvents );
public extern static bool DoCCDCast( dNeoAxisAdditionsID additions, dBodyID checkBodyID, int contactGroup, out float minDistance );
public extern static void DoVolumeCast( dNeoAxisAdditionsID additions, dGeomID volumeCastGeomID, int contactGroup, out int count, out IntPtr data );
public extern static void DoRayCastPiercing( dNeoAxisAdditionsID additions, int contactGroup, out int count, out IntPtr data );
public extern static void SetupContactGroups( dNeoAxisAdditionsID additions, int group0, int group1, [MarshalAs( UnmanagedType.U1 )] bool makeContacts );
public extern static void NeoAxisAdditions_Shutdown( dNeoAxisAdditionsID additions );
public void Create() { MaxIterationCount = ODEPhysicsWorld.Instance.defaultMaxIterationCount; worldID = Ode.dWorldCreate(); //Ode.dVector3 center = new Ode.dVector3( 0, 0, 0 ); //Ode.dVector3 extents = new Ode.dVector3( 1000, 1000, 1000 ); //rootSpaceID = Ode.dQuadTreeSpaceCreate( dSpaceID.Zero, ref center, ref extents, 10 ); rootSpaceID = Ode.dHashSpaceCreate(dSpaceID.Zero); Ode.dHashSpaceSetLevels(rootSpaceID, ODEPhysicsWorld.Instance.hashSpaceMinLevel, ODEPhysicsWorld.Instance.hashSpaceMaxLevel); // Create the ODE contact joint group. contactJointGroupID = Ode.dJointGroupCreate(0); // Set the ODE global CFM value that will be used by all Joints // (including contacts). This affects normal Joint constraint // operation and Joint limits. The user cannot adjust CFM, but // they can adjust ERP (a.k.a. bounciness/restitution) for materials // (i.e. contact settings) and Joint limits. Ode.dWorldSetCFM(worldID, Defines.globalCFM); // Set the ODE global ERP value. This will only be used for Joints // under normal conditions, not at their limits. Also, it will not // affect contacts at all since they use material properties to // calculate ERP. Ode.dWorldSetERP(worldID, 0.5f * (Defines.maxERP + Defines.minERP)); Ode.dWorldSetContactSurfaceLayer(worldID, Defines.surfaceLayer); //MaxIterationCount = maxIterationCount; //ray for RayCast rayCastGeomID = Ode.dCreateRay(rootSpaceID, 1); Ode.dGeomSetData(rayCastGeomID, IntPtr.Zero); rayCastResultDistanceComparer = new Comparison <RayCastResult>(SortRayCastResultsMethod); unsafe { Ode.CheckEnumAndStructuresSizes(sizeof(Ode.CollisionEventData), sizeof(Ode.RayCastResult)); } neoAxisAdditionsID = Ode.NeoAxisAdditions_Init(Defines.maxContacts, Defines.minERP, Defines.maxERP, Defines.maxFriction, Defines.bounceThreshold, worldID, rootSpaceID, rayCastGeomID, contactJointGroupID); UpdateMaxIterationCount(); UpdateGravity(); UpdateMaxAngularSpeed(); for (int group0 = 0; group0 < 32; group0++) { for (int group1 = 0; group1 < 32; group1++) { OnUpdateContactGroups(group0, group1, IsContactGroupsContactable(group0, group1)); } } }
public void Create() { MaxIterationCount = ODEPhysicsWorld.Instance.defaultMaxIterationCount; worldID = Ode.dWorldCreate(); //Ode.dVector3 center = new Ode.dVector3( 0, 0, 0 ); //Ode.dVector3 extents = new Ode.dVector3( 1000, 1000, 1000 ); //rootSpaceID = Ode.dQuadTreeSpaceCreate( dSpaceID.Zero, ref center, ref extents, 10 ); rootSpaceID = Ode.dHashSpaceCreate( dSpaceID.Zero ); Ode.dHashSpaceSetLevels( rootSpaceID, ODEPhysicsWorld.Instance.hashSpaceMinLevel, ODEPhysicsWorld.Instance.hashSpaceMaxLevel ); // Create the ODE contact joint group. contactJointGroupID = Ode.dJointGroupCreate( 0 ); // Set the ODE global CFM value that will be used by all Joints // (including contacts). This affects normal Joint constraint // operation and Joint limits. The user cannot adjust CFM, but // they can adjust ERP (a.k.a. bounciness/restitution) for materials // (i.e. contact settings) and Joint limits. Ode.dWorldSetCFM( worldID, Defines.globalCFM ); // Set the ODE global ERP value. This will only be used for Joints // under normal conditions, not at their limits. Also, it will not // affect contacts at all since they use material properties to // calculate ERP. Ode.dWorldSetERP( worldID, 0.5f * ( Defines.maxERP + Defines.minERP ) ); Ode.dWorldSetContactSurfaceLayer( worldID, Defines.surfaceLayer ); //MaxIterationCount = maxIterationCount; //ray for RayCast rayCastGeomID = Ode.dCreateRay( rootSpaceID, 1 ); Ode.dGeomSetData( rayCastGeomID, IntPtr.Zero ); rayCastResultDistanceComparer = new Comparison<RayCastResult>( SortRayCastResultsMethod ); unsafe { Ode.CheckEnumAndStructuresSizes( sizeof( Ode.CollisionEventData ), sizeof( Ode.RayCastResult ) ); } neoAxisAdditionsID = Ode.NeoAxisAdditions_Init( Defines.maxContacts, Defines.minERP, Defines.maxERP, Defines.maxFriction, Defines.bounceThreshold, worldID, rootSpaceID, rayCastGeomID, contactJointGroupID ); UpdateMaxIterationCount(); UpdateGravity(); UpdateMaxAngularSpeed(); for( int group0 = 0; group0 < 32; group0++ ) for( int group1 = 0; group1 < 32; group1++ ) OnUpdateContactGroups( group0, group1, IsContactGroupsContactable( group0, group1 ) ); }
public void Destroy() { if( shapesDictionary.Count != 0 ) Log.Warning( "ODEPhysicsWorld: OnShutdownLibrary: shapesDictionary.Count != 0." ); if( neoAxisAdditionsID != IntPtr.Zero ) { Ode.NeoAxisAdditions_Shutdown( neoAxisAdditionsID ); neoAxisAdditionsID = IntPtr.Zero; } if( rayCastGeomID != dGeomID.Zero ) { Ode.dGeomDestroy( rayCastGeomID ); rayCastGeomID = dGeomID.Zero; } if( rootSpaceID != dSpaceID.Zero ) { Ode.dSpaceDestroy( rootSpaceID ); rootSpaceID = dSpaceID.Zero; } if( worldID != dWorldID.Zero ) { Ode.dWorldDestroy( worldID ); worldID = dWorldID.Zero; } if( contactJointGroupID != dJointGroupID.Zero ) { Ode.dJointGroupDestroy( contactJointGroupID ); contactJointGroupID = dJointGroupID.Zero; } }