/*
 * Copyright (c) 2004-2009 Derelict Developers
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright
 *   notice, this list of conditions and the following disclaimer in the
 *   documentation and/or other materials provided with the distribution.
 *
 * * Neither the names 'Derelict', 'DerelictODE', nor the names of its contributors
 *   may be used to endorse or promote products derived from this software
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
module derelict.ode.odefuncs;

private
{
    import derelict.ode.odetypes;
    import derelict.util.loader;

    version(Tango)
    {
        import tango.stdc.stdio;
    }
    else
    {
        import std.c.stdio;
    }
}

private void load(SharedLib lib)
{
    bindFunc(dGetConfiguration)("dGetConfiguration", lib);
    bindFunc(dCheckConfiguration)("dCheckConfiguration", lib);
    bindFunc(dGeomDestroy)("dGeomDestroy", lib);
    bindFunc(dGeomSetData)("dGeomSetData", lib);
    bindFunc(dGeomGetData)("dGeomGetData", lib);
    bindFunc(dGeomSetBody)("dGeomSetBody", lib);
    bindFunc(dGeomGetBody)("dGeomGetBody", lib);
    bindFunc(dGeomSetPosition)("dGeomSetPosition", lib);
    bindFunc(dGeomSetRotation)("dGeomSetRotation", lib);
    bindFunc(dGeomSetQuaternion)("dGeomSetQuaternion", lib);
    bindFunc(dGeomGetPosition)("dGeomGetPosition", lib);
    bindFunc(dGeomCopyPosition)("dGeomCopyPosition", lib);
    bindFunc(dGeomGetRotation)("dGeomGetRotation", lib);
    bindFunc(dGeomCopyRotation)("dGeomCopyRotation", lib);
    bindFunc(dGeomGetQuaternion)("dGeomGetQuaternion", lib);
    bindFunc(dGeomGetAABB)("dGeomGetAABB", lib);
    bindFunc(dGeomIsSpace)("dGeomIsSpace", lib);
    bindFunc(dGeomGetSpace)("dGeomGetSpace", lib);
    bindFunc(dGeomGetClass)("dGeomGetClass", lib);
    bindFunc(dGeomSetCategoryBits)("dGeomSetCategoryBits", lib);
    bindFunc(dGeomSetCollideBits)("dGeomSetCollideBits", lib);
    bindFunc(dGeomGetCategoryBits)("dGeomGetCategoryBits", lib);
    bindFunc(dGeomGetCollideBits)("dGeomGetCollideBits", lib);
    bindFunc(dGeomEnable)("dGeomEnable", lib);
    bindFunc(dGeomDisable)("dGeomDisable", lib);
    bindFunc(dGeomIsEnabled)("dGeomIsEnabled", lib);
    bindFunc(dGeomSetOffsetPosition)("dGeomSetOffsetPosition", lib);
    bindFunc(dGeomSetOffsetRotation)("dGeomSetOffsetRotation", lib);
    bindFunc(dGeomSetOffsetQuaternion)("dGeomSetOffsetQuaternion", lib);
    bindFunc(dGeomSetOffsetWorldPosition)("dGeomSetOffsetWorldPosition", lib);
    bindFunc(dGeomSetOffsetWorldRotation)("dGeomSetOffsetWorldRotation", lib);
    bindFunc(dGeomSetOffsetWorldQuaternion)("dGeomSetOffsetWorldQuaternion", lib);
    bindFunc(dGeomClearOffset)("dGeomClearOffset", lib);
    bindFunc(dGeomIsOffset)("dGeomIsOffset", lib);
    bindFunc(dGeomGetOffsetPosition)("dGeomGetOffsetPosition", lib);
    bindFunc(dGeomCopyOffsetPosition)("dGeomCopyOffsetPosition", lib);
    bindFunc(dGeomGetOffsetRotation)("dGeomGetOffsetRotation", lib);
    bindFunc(dGeomGetOffsetQuaternion)("dGeomGetOffsetQuaternion", lib);
    bindFunc(dCollide)("dCollide", lib);
    bindFunc(dSpaceCollide)("dSpaceCollide", lib);
    bindFunc(dSpaceCollide2)("dSpaceCollide2", lib);
    bindFunc(dCreateSphere)("dCreateSphere", lib);
    bindFunc(dGeomSphereSetRadius)("dGeomSphereSetRadius", lib);
    bindFunc(dGeomSphereGetRadius)("dGeomSphereGetRadius", lib);
    bindFunc(dGeomSpherePointDepth)("dGeomSpherePointDepth", lib);
    bindFunc(dCreateConvex)("dCreateConvex", lib);
    bindFunc(dGeomSetConvex)("dGeomSetConvex", lib);
    bindFunc(dCreateBox)("dCreateBox", lib);
    bindFunc(dGeomBoxSetLengths)("dGeomBoxSetLengths", lib);
    bindFunc(dGeomBoxGetLengths)("dGeomBoxGetLengths", lib);
    bindFunc(dGeomBoxPointDepth)("dGeomBoxPointDepth", lib);
    bindFunc(dCreatePlane)("dCreatePlane", lib);
    bindFunc(dGeomPlaneSetParams)("dGeomPlaneSetParams", lib);
    bindFunc(dGeomPlaneGetParams)("dGeomPlaneGetParams", lib);
    bindFunc(dGeomPlanePointDepth)("dGeomPlanePointDepth", lib);
    bindFunc(dCreateCapsule)("dCreateCapsule", lib);
    bindFunc(dGeomCapsuleSetParams)("dGeomCapsuleSetParams", lib);
    bindFunc(dGeomCapsuleGetParams)("dGeomCapsuleGetParams", lib);
    bindFunc(dGeomCapsulePointDepth)("dGeomCapsulePointDepth", lib);
    bindFunc(dCreateCylinder)("dCreateCylinder", lib);
    bindFunc(dGeomCylinderSetParams)("dGeomCylinderSetParams", lib);
    bindFunc(dGeomCylinderGetParams)("dGeomCylinderGetParams", lib);
    bindFunc(dCreateRay)("dCreateRay", lib);
    bindFunc(dGeomRaySetLength)("dGeomRaySetLength", lib);
    bindFunc(dGeomRayGetLength)("dGeomRayGetLength", lib);
    bindFunc(dGeomRaySet)("dGeomRaySet", lib);
    bindFunc(dGeomRayGet)("dGeomRayGet", lib);
    bindFunc(dGeomRaySetParams)("dGeomRaySetParams", lib);
    bindFunc(dGeomRayGetParams)("dGeomRayGetParams", lib);
    bindFunc(dGeomRaySetClosestHit)("dGeomRaySetClosestHit", lib);
    bindFunc(dGeomRayGetClosestHit)("dGeomRayGetClosestHit", lib);
    bindFunc(dCreateGeomTransform)("dCreateGeomTransform", lib);
    bindFunc(dGeomTransformSetGeom)("dGeomTransformSetGeom", lib);
    bindFunc(dGeomTransformGetGeom)("dGeomTransformGetGeom", lib);
    bindFunc(dGeomTransformSetCleanup)("dGeomTransformSetCleanup", lib);
    bindFunc(dGeomTransformGetCleanup)("dGeomTransformGetCleanup", lib);
    bindFunc(dGeomTransformSetInfo)("dGeomTransformSetInfo", lib);
    bindFunc(dGeomTransformGetInfo)("dGeomTransformGetInfo", lib);
    bindFunc(dCreateHeightfield)("dCreateHeightfield", lib);
    bindFunc(dGeomHeightfieldDataCreate)("dGeomHeightfieldDataCreate", lib);
    bindFunc(dGeomHeightfieldDataDestroy)("dGeomHeightfieldDataDestroy", lib);
    bindFunc(dGeomHeightfieldDataBuildCallback)("dGeomHeightfieldDataBuildCallback", lib);
    bindFunc(dGeomHeightfieldDataBuildByte)("dGeomHeightfieldDataBuildByte", lib);
    bindFunc(dGeomHeightfieldDataBuildShort)("dGeomHeightfieldDataBuildShort", lib);
    bindFunc(dGeomHeightfieldDataBuildSingle)("dGeomHeightfieldDataBuildSingle", lib);
    bindFunc(dGeomHeightfieldDataBuildDouble)("dGeomHeightfieldDataBuildDouble", lib);
    bindFunc(dGeomHeightfieldDataSetBounds)("dGeomHeightfieldDataSetBounds", lib);
    bindFunc(dGeomHeightfieldSetHeightfieldData)("dGeomHeightfieldSetHeightfieldData", lib);
    bindFunc(dGeomHeightfieldGetHeightfieldData)("dGeomHeightfieldGetHeightfieldData", lib);
    bindFunc(dClosestLineSegmentPoints)("dClosestLineSegmentPoints", lib);
    bindFunc(dBoxTouchesBox)("dBoxTouchesBox", lib);
    bindFunc(dBoxBox)("dBoxBox", lib);
    bindFunc(dInfiniteAABB)("dInfiniteAABB", lib);
    bindFunc(dCreateGeomClass)("dCreateGeomClass", lib);
    bindFunc(dGeomGetClassData)("dGeomGetClassData", lib);
    bindFunc(dCreateGeom)("dCreateGeom", lib);
    bindFunc(dSetColliderOverride)("dSetColliderOverride", lib);

    // collision_space.h
    bindFunc(dSimpleSpaceCreate)("dSimpleSpaceCreate", lib);
    bindFunc(dHashSpaceCreate)("dHashSpaceCreate", lib);
    bindFunc(dQuadTreeSpaceCreate)("dQuadTreeSpaceCreate", lib);
    bindFunc(dSweepAndPruneSpaceCreate)("dSweepAndPruneSpaceCreate", lib);
    bindFunc(dSpaceDestroy)("dSpaceDestroy", lib);
    bindFunc(dHashSpaceSetLevels)("dHashSpaceSetLevels", lib);
    bindFunc(dHashSpaceGetLevels)("dHashSpaceGetLevels", lib);
    bindFunc(dSpaceSetCleanup)("dSpaceSetCleanup", lib);
    bindFunc(dSpaceGetCleanup)("dSpaceGetCleanup", lib);
    bindFunc(dSpaceSetSublevel)("dSpaceSetSublevel", lib);
    bindFunc(dSpaceGetSublevel)("dSpaceGetSublevel", lib);
    bindFunc(dSpaceAdd)("dSpaceAdd", lib);
    bindFunc(dSpaceRemove)("dSpaceRemove", lib);
    bindFunc(dSpaceQuery)("dSpaceQuery", lib);
    bindFunc(dSpaceClean)("dSpaceClean", lib);
    bindFunc(dSpaceGetNumGeoms)("dSpaceGetNumGeoms", lib);
    bindFunc(dSpaceGetGeom)("dSpaceGetGeom", lib);
    bindFunc(dSpaceGetClass)("dSpaceGetClass", lib);

    // collision_trimesh.h
    bindFunc(dGeomTriMeshDataCreate)("dGeomTriMeshDataCreate", lib);
    bindFunc(dGeomTriMeshDataDestroy)("dGeomTriMeshDataDestroy", lib);
    bindFunc(dGeomTriMeshDataSet)("dGeomTriMeshDataSet", lib);
    bindFunc(dGeomTriMeshDataGet)("dGeomTriMeshDataGet", lib);
    bindFunc(dGeomTriMeshSetLastTransform)("dGeomTriMeshSetLastTransform", lib);
    bindFunc(dGeomTriMeshGetLastTransform)("dGeomTriMeshGetLastTransform", lib);
    bindFunc(dGeomTriMeshDataBuildSingle)("dGeomTriMeshDataBuildSingle", lib);
    bindFunc(dGeomTriMeshDataBuildSingle1)("dGeomTriMeshDataBuildSingle1", lib);
    bindFunc(dGeomTriMeshDataBuildDouble)("dGeomTriMeshDataBuildDouble", lib);
    bindFunc(dGeomTriMeshDataBuildDouble1)("dGeomTriMeshDataBuildDouble1", lib);
    bindFunc(dGeomTriMeshDataBuildSimple)("dGeomTriMeshDataBuildSimple", lib);
    bindFunc(dGeomTriMeshDataBuildSimple1)("dGeomTriMeshDataBuildSimple1", lib);
    bindFunc(dGeomTriMeshDataPreprocess)("dGeomTriMeshDataPreprocess", lib);
    bindFunc(dGeomTriMeshDataGetBuffer)("dGeomTriMeshDataGetBuffer", lib);
    bindFunc(dGeomTriMeshDataSetBuffer)("dGeomTriMeshDataSetBuffer", lib);
    bindFunc(dGeomTriMeshSetCallback)("dGeomTriMeshSetCallback", lib);
    bindFunc(dGeomTriMeshGetCallback)("dGeomTriMeshGetCallback", lib);
    bindFunc(dGeomTriMeshSetArrayCallback)("dGeomTriMeshSetArrayCallback", lib);
    bindFunc(dGeomTriMeshGetArrayCallback)("dGeomTriMeshGetArrayCallback", lib);
    bindFunc(dGeomTriMeshSetRayCallback)("dGeomTriMeshSetRayCallback", lib);
    bindFunc(dGeomTriMeshGetRayCallback)("dGeomTriMeshGetRayCallback", lib);
    bindFunc(dGeomTriMeshSetTriMergeCallback)("dGeomTriMeshSetTriMergeCallback", lib);
    bindFunc(dGeomTriMeshGetTriMergeCallback)("dGeomTriMeshGetTriMergeCallback", lib);
    bindFunc(dCreateTriMesh)("dCreateTriMesh", lib);
    bindFunc(dGeomTriMeshSetData)("dGeomTriMeshSetData", lib);
    bindFunc(dGeomTriMeshGetData)("dGeomTriMeshGetData", lib);
    bindFunc(dGeomTriMeshEnableTC)("dGeomTriMeshEnableTC", lib);
    bindFunc(dGeomTriMeshIsTCEnabled)("dGeomTriMeshIsTCEnabled", lib);
    bindFunc(dGeomTriMeshClearTCCache)("dGeomTriMeshClearTCCache", lib);
    bindFunc(dGeomTriMeshGetTriMeshDataID)("dGeomTriMeshGetTriMeshDataID", lib);
    bindFunc(dGeomTriMeshGetTriangle)("dGeomTriMeshGetTriangle", lib);
    bindFunc(dGeomTriMeshGetPoint)("dGeomTriMeshGetPoint", lib);
    bindFunc(dGeomTriMeshGetTriangleCount)("dGeomTriMeshGetTriangleCount", lib);
    bindFunc(dGeomTriMeshDataUpdate)("dGeomTriMeshDataUpdate", lib);

    // error.h
    bindFunc(dSetErrorHandler)("dSetErrorHandler", lib);
    bindFunc(dSetDebugHandler)("dSetDebugHandler", lib);
    bindFunc(dSetMessageHandler)("dSetMessageHandler", lib);
    bindFunc(dGetErrorHandler)("dGetErrorHandler", lib);
    bindFunc(dGetDebugHandler)("dGetDebugHandler", lib);
    bindFunc(dGetMessageHandler)("dGetMessageHandler", lib);
    bindFunc(dError)("dError", lib);
    bindFunc(dDebug)("dDebug", lib);
    bindFunc(dMessage)("dMessage", lib);

    // mass.h
    bindFunc(dMassCheck)("dMassCheck", lib);
    bindFunc(dMassSetZero)("dMassSetZero", lib);
    bindFunc(dMassSetParameters)("dMassSetParameters", lib);
    bindFunc(dMassSetSphere)("dMassSetSphere", lib);
    bindFunc(dMassSetSphereTotal)("dMassSetSphereTotal", lib);
    bindFunc(dMassSetCapsule)("dMassSetCapsule", lib);
    bindFunc(dMassSetCapsuleTotal)("dMassSetCapsuleTotal", lib);
    bindFunc(dMassSetCylinder)("dMassSetCylinder", lib);
    bindFunc(dMassSetCylinderTotal)("dMassSetCylinderTotal", lib);
    bindFunc(dMassSetBox)("dMassSetBox", lib);
    bindFunc(dMassSetBoxTotal)("dMassSetBoxTotal", lib);
    bindFunc(dMassSetTrimesh)("dMassSetTrimesh", lib);
    bindFunc(dMassSetTrimeshTotal)("dMassSetTrimeshTotal", lib);
    bindFunc(dMassAdjust)("dMassAdjust", lib);
    bindFunc(dMassTranslate)("dMassTranslate", lib);
    bindFunc(dMassRotate)("dMassRotate", lib);
    bindFunc(dMassAdd)("dMassAdd", lib);

    // matrix.h
    bindFunc(dSetZero)("dSetZero", lib);
    bindFunc(dSetValue)("dSetValue", lib);
    bindFunc(dDot)("dDot", lib);
    bindFunc(dMultiply0)("dMultiply0", lib);
    bindFunc(dMultiply1)("dMultiply1", lib);
    bindFunc(dMultiply2)("dMultiply2", lib);
    bindFunc(dFactorCholesky)("dFactorCholesky", lib);
    bindFunc(dSolveCholesky)("dSolveCholesky", lib);
    bindFunc(dInvertPDMatrix)("dInvertPDMatrix", lib);
    bindFunc(dIsPositiveDefinite)("dIsPositiveDefinite", lib);
    bindFunc(dFactorLDLT)("dFactorLDLT", lib);
    bindFunc(dSolveL1)("dSolveL1", lib);
    bindFunc(dSolveL1T)("dSolveL1T", lib);
    bindFunc(dVectorScale)("dVectorScale", lib);
    bindFunc(dSolveLDLT)("dSolveLDLT", lib);
    bindFunc(dLDLTAddTL)("dLDLTAddTL", lib);
    bindFunc(dLDLTRemove)("dLDLTRemove", lib);
    bindFunc(dRemoveRowCol)("dRemoveRowCol", lib);

    // memory.h
    bindFunc(dSetAllocHandler)("dSetAllocHandler", lib);
    bindFunc(dSetReallocHandler)("dSetReallocHandler", lib);
    bindFunc(dSetFreeHandler)("dSetFreeHandler", lib);
    bindFunc(dGetAllocHandler)("dGetAllocHandler", lib);
    bindFunc(dGetReallocHandler)("dGetReallocHandler", lib);
    bindFunc(dGetFreeHandler)("dGetFreeHandler", lib);
    bindFunc(dAlloc)("dAlloc", lib);
    bindFunc(dRealloc)("dRealloc", lib);
    bindFunc(dFree)("dFree", lib);

    // misc.h
    bindFunc(dTestRand)("dTestRand", lib);
    bindFunc(dRand)("dRand", lib);
    bindFunc(dRandGetSeed)("dRandGetSeed", lib);
    bindFunc(dRandSetSeed)("dRandSetSeed", lib);
    bindFunc(dRandInt)("dRandInt", lib);
    bindFunc(dRandReal)("dRandReal", lib);
    bindFunc(dPrintMatrix)("dPrintMatrix", lib);
    bindFunc(dMakeRandomVector)("dMakeRandomVector", lib);
    bindFunc(dMakeRandomMatrix)("dMakeRandomMatrix", lib);
    bindFunc(dClearUpperTriangle)("dClearUpperTriangle", lib);
    bindFunc(dMaxDifference)("dMaxDifference", lib);
    bindFunc(dMaxDifferenceLowerTriangle)("dMaxDifferenceLowerTriangle", lib);

    // objects.h
    bindFunc(dWorldCreate)("dWorldCreate", lib);
    bindFunc(dWorldDestroy)("dWorldDestroy", lib);
    bindFunc(dWorldSetGravity)("dWorldSetGravity", lib);
    bindFunc(dWorldGetGravity)("dWorldGetGravity", lib);
    bindFunc(dWorldSetERP)("dWorldSetERP", lib);
    bindFunc(dWorldGetERP)("dWorldGetERP", lib);
    bindFunc(dWorldSetCFM)("dWorldSetCFM", lib);
    bindFunc(dWorldGetCFM)("dWorldGetCFM", lib);
    bindFunc(dWorldStep)("dWorldStep", lib);
    bindFunc(dWorldImpulseToForce)("dWorldImpulseToForce", lib);
    bindFunc(dWorldQuickStep)("dWorldQuickStep", lib);
    bindFunc(dWorldSetQuickStepNumIterations)("dWorldSetQuickStepNumIterations", lib);
    bindFunc(dWorldGetQuickStepNumIterations)("dWorldGetQuickStepNumIterations", lib);
    bindFunc(dWorldSetQuickStepW)("dWorldSetQuickStepW", lib);
    bindFunc(dWorldGetQuickStepW)("dWorldGetQuickStepW", lib);
    bindFunc(dWorldSetContactMaxCorrectingVel)("dWorldSetContactMaxCorrectingVel", lib);
    bindFunc(dWorldGetContactMaxCorrectingVel)("dWorldGetContactMaxCorrectingVel", lib);
    bindFunc(dWorldSetContactSurfaceLayer)("dWorldSetContactSurfaceLayer", lib);
    bindFunc(dWorldGetContactSurfaceLayer)("dWorldGetContactSurfaceLayer", lib);
    bindFunc(dWorldStepFast1)("dWorldStepFast1", lib);
    bindFunc(dWorldSetAutoEnableDepthSF1)("dWorldSetAutoEnableDepthSF1", lib);
    bindFunc(dWorldGetAutoEnableDepthSF1)("dWorldGetAutoEnableDepthSF1", lib);
    bindFunc(dWorldGetAutoDisableLinearThreshold)("dWorldGetAutoDisableLinearThreshold", lib);
    bindFunc(dWorldSetAutoDisableLinearThreshold)("dWorldSetAutoDisableLinearThreshold", lib);
    bindFunc(dWorldGetAutoDisableAngularThreshold)("dWorldGetAutoDisableAngularThreshold", lib);
    bindFunc(dWorldSetAutoDisableAngularThreshold)("dWorldSetAutoDisableAngularThreshold", lib);
    bindFunc(dWorldGetAutoDisableAverageSamplesCount)("dWorldGetAutoDisableAverageSamplesCount", lib);
    bindFunc(dWorldSetAutoDisableAverageSamplesCount)("dWorldSetAutoDisableAverageSamplesCount", lib);
    bindFunc(dWorldGetAutoDisableSteps)("dWorldGetAutoDisableSteps", lib);
    bindFunc(dWorldSetAutoDisableSteps)("dWorldSetAutoDisableSteps", lib);
    bindFunc(dWorldGetAutoDisableTime)("dWorldGetAutoDisableTime", lib);
    bindFunc(dWorldSetAutoDisableTime)("dWorldSetAutoDisableTime", lib);
    bindFunc(dWorldGetAutoDisableFlag)("dWorldGetAutoDisableFlag", lib);
    bindFunc(dWorldSetAutoDisableFlag)("dWorldSetAutoDisableFlag", lib);
    bindFunc(dWorldGetLinearDampingThreshold)("dWorldGetLinearDampingThreshold", lib);
    bindFunc(dWorldSetLinearDampingThreshold)("dWorldSetLinearDampingThreshold", lib);
    bindFunc(dWorldGetAngularDampingThreshold)("dWorldGetAngularDampingThreshold", lib);
    bindFunc(dWorldSetAngularDampingThreshold)("dWorldSetAngularDampingThreshold", lib);
    bindFunc(dWorldGetLinearDamping)("dWorldGetLinearDamping", lib);
    bindFunc(dWorldSetLinearDamping)("dWorldSetLinearDamping", lib);
    bindFunc(dWorldGetAngularDamping)("dWorldGetAngularDamping", lib);
    bindFunc(dWorldSetAngularDamping)("dWorldSetAngularDamping", lib);
    bindFunc(dWorldSetDamping)("dWorldSetDamping", lib);
    bindFunc(dWorldGetMaxAngularSpeed)("dWorldGetMaxAngularSpeed", lib);
    bindFunc(dWorldSetMaxAngularSpeed)("dWorldSetMaxAngularSpeed", lib);
    bindFunc(dBodyGetAutoDisableLinearThreshold)("dBodyGetAutoDisableLinearThreshold", lib);
    bindFunc(dBodySetAutoDisableLinearThreshold)("dBodySetAutoDisableLinearThreshold", lib);
    bindFunc(dBodyGetAutoDisableAngularThreshold)("dBodyGetAutoDisableAngularThreshold", lib);
    bindFunc(dBodySetAutoDisableAngularThreshold)("dBodySetAutoDisableAngularThreshold", lib);
    bindFunc(dBodyGetAutoDisableAverageSamplesCount)("dBodyGetAutoDisableAverageSamplesCount", lib);
    bindFunc(dBodySetAutoDisableAverageSamplesCount)("dBodySetAutoDisableAverageSamplesCount", lib);
    bindFunc(dBodyGetAutoDisableSteps)("dBodyGetAutoDisableSteps", lib);
    bindFunc(dBodySetAutoDisableSteps)("dBodySetAutoDisableSteps", lib);
    bindFunc(dBodyGetAutoDisableTime)("dBodyGetAutoDisableTime", lib);
    bindFunc(dBodySetAutoDisableTime)("dBodySetAutoDisableTime", lib);
    bindFunc(dBodyGetAutoDisableFlag)("dBodyGetAutoDisableFlag", lib);
    bindFunc(dBodySetAutoDisableFlag)("dBodySetAutoDisableFlag", lib);
    bindFunc(dBodySetAutoDisableDefaults)("dBodySetAutoDisableDefaults", lib);
    bindFunc(dBodyGetWorld)("dBodyGetWorld", lib);
    bindFunc(dBodyCreate)("dBodyCreate", lib);
    bindFunc(dBodyDestroy)("dBodyDestroy", lib);
    bindFunc(dBodySetData)("dBodySetData", lib);
    bindFunc(dBodyGetData)("dBodyGetData", lib);
    bindFunc(dBodySetPosition)("dBodySetPosition", lib);
    bindFunc(dBodySetRotation)("dBodySetRotation", lib);
    bindFunc(dBodySetQuaternion)("dBodySetQuaternion", lib);
    bindFunc(dBodySetLinearVel)("dBodySetLinearVel", lib);
    bindFunc(dBodySetAngularVel)("dBodySetAngularVel", lib);
    bindFunc(dBodyGetPosition)("dBodyGetPosition", lib);
    bindFunc(dBodyCopyPosition)("dBodyCopyPosition", lib);
    bindFunc(dBodyGetRotation)("dBodyGetRotation", lib);
    bindFunc(dBodyCopyRotation)("dBodyCopyRotation", lib);
    bindFunc(dBodyGetQuaternion)("dBodyGetQuaternion", lib);
    bindFunc(dBodyCopyQuaternion)("dBodyCopyQuaternion", lib);
    bindFunc(dBodyGetLinearVel)("dBodyGetLinearVel", lib);
    bindFunc(dBodyGetAngularVel)("dBodyGetAngularVel", lib);
    bindFunc(dBodySetMass)("dBodySetMass", lib);
    bindFunc(dBodyGetMass)("dBodyGetMass", lib);
    bindFunc(dBodyAddForce)("dBodyAddForce", lib);
    bindFunc(dBodyAddTorque)("dBodyAddTorque", lib);
    bindFunc(dBodyAddRelForce)("dBodyAddRelForce", lib);
    bindFunc(dBodyAddRelTorque)("dBodyAddRelTorque", lib);
    bindFunc(dBodyAddForceAtPos)("dBodyAddForceAtPos", lib);
    bindFunc(dBodyAddForceAtRelPos)("dBodyAddForceAtRelPos", lib);
    bindFunc(dBodyAddRelForceAtPos)("dBodyAddRelForceAtPos", lib);
    bindFunc(dBodyAddRelForceAtRelPos)("dBodyAddRelForceAtRelPos", lib);
    bindFunc(dBodyGetForce)("dBodyGetForce", lib);
    bindFunc(dBodyGetTorque)("dBodyGetTorque", lib);
    bindFunc(dBodySetForce)("dBodySetForce", lib);
    bindFunc(dBodySetTorque)("dBodySetTorque", lib);
    bindFunc(dBodyGetRelPointPos)("dBodyGetRelPointPos", lib);
    bindFunc(dBodyGetRelPointVel)("dBodyGetRelPointVel", lib);
    bindFunc(dBodyGetPointVel)("dBodyGetPointVel", lib);
    bindFunc(dBodyGetPosRelPoint)("dBodyGetPosRelPoint", lib);
    bindFunc(dBodyVectorToWorld)("dBodyVectorToWorld", lib);
    bindFunc(dBodyVectorFromWorld)("dBodyVectorFromWorld", lib);
    bindFunc(dBodySetFiniteRotationMode)("dBodySetFiniteRotationMode", lib);
    bindFunc(dBodySetFiniteRotationAxis)("dBodySetFiniteRotationAxis", lib);
    bindFunc(dBodyGetFiniteRotationMode)("dBodyGetFiniteRotationMode", lib);
    bindFunc(dBodyGetFiniteRotationAxis)("dBodyGetFiniteRotationAxis", lib);
    bindFunc(dBodyGetNumJoints)("dBodyGetNumJoints", lib);
    bindFunc(dBodyGetJoint)("dBodyGetJoint", lib);
    bindFunc(dBodySetDynamic)("dBodySetDynamic", lib);
    bindFunc( dBodySetKinematic)("dBodySetKinematic", lib);
    bindFunc(dBodyIsKinematic)("dBodyIsKinematic", lib);
    bindFunc(dBodyEnable)("dBodyEnable", lib);
    bindFunc(dBodyDisable)("dBodyDisable", lib);
    bindFunc(dBodyIsEnabled)("dBodyIsEnabled", lib);
    bindFunc(dBodySetGravityMode)("dBodySetGravityMode", lib);
    bindFunc(dBodyGetGravityMode)("dBodyGetGravityMode", lib);
    bindFunc(dBodySetMovedCallback)("dBodySetMovedCallback", lib);
    bindFunc(dBodyGetFirstGeom)("dBodyGetFirstGeom", lib);
    bindFunc(dBodyGetNextGeom)("dBodyGetNextGeom", lib);
    bindFunc(dBodySetDampingDefaults)("dBodySetDampingDefaults", lib);
    bindFunc(dBodyGetLinearDamping)("dBodyGetLinearDamping", lib);
    bindFunc(dBodySetLinearDamping)("dBodySetLinearDamping", lib);
    bindFunc(dBodyGetAngularDamping)("dBodyGetAngularDamping", lib);
    bindFunc(dBodySetAngularDamping)("dBodySetAngularDamping", lib);
    bindFunc(dBodySetDamping)("dBodySetDamping", lib);
    bindFunc(dBodyGetLinearDampingThreshold)("dBodyGetLinearDampingThreshold", lib);
    bindFunc(dBodySetLinearDampingThreshold)("dBodySetLinearDampingThreshold", lib);
    bindFunc(dBodyGetAngularDampingThreshold)("dBodyGetAngularDampingThreshold", lib);
    bindFunc(dBodySetAngularDampingThreshold)("dBodySetAngularDampingThreshold", lib);
    bindFunc(dBodyGetMaxAngularSpeed)("dBodyGetMaxAngularSpeed", lib);
    bindFunc(dBodySetMaxAngularSpeed)("dBodySetMaxAngularSpeed", lib);
    bindFunc(dBodyGetGyroscopicMode)("dBodyGetGyroscopicMode", lib);
    bindFunc(dBodySetGyroscopicMode)("dBodySetGyroscopicMode", lib);
    bindFunc(dJointCreateBall)("dJointCreateBall", lib);
    bindFunc(dJointCreateHinge)("dJointCreateHinge", lib);
    bindFunc(dJointCreateSlider)("dJointCreateSlider", lib);
    bindFunc(dJointCreateContact)("dJointCreateContact", lib);
    bindFunc(dJointCreateHinge2)("dJointCreateHinge2", lib);
    bindFunc(dJointCreateUniversal)("dJointCreateUniversal", lib);
    bindFunc(dJointCreatePR)("dJointCreatePR", lib);
    bindFunc(dJointCreatePU)("dJointCreatePU", lib);
    bindFunc(dJointCreatePiston)("dJointCreatePiston", lib);
    bindFunc(dJointCreateFixed)("dJointCreateFixed", lib);
    bindFunc(dJointCreateNull)("dJointCreateNull", lib);
    bindFunc(dJointCreateAMotor)("dJointCreateAMotor", lib);
    bindFunc(dJointCreateLMotor)("dJointCreateLMotor", lib);
    bindFunc(dJointCreatePlane2D)("dJointCreatePlane2D", lib);
    bindFunc(dJointDestroy)("dJointDestroy", lib);
    bindFunc(dJointGroupCreate)("dJointGroupCreate", lib);
    bindFunc(dJointGroupDestroy)("dJointGroupDestroy", lib);
    bindFunc(dJointGroupEmpty)("dJointGroupEmpty", lib);
    bindFunc(dJointGetNumBodies)("dJointGetNumBodies", lib);
    bindFunc(dJointAttach)("dJointAttach", lib);
    bindFunc(dJointEnable)("dJointEnable", lib);
    bindFunc(dJointDisable)("dJointDisable", lib);
    bindFunc(dJointIsEnabled)("dJointIsEnabled", lib);
    bindFunc(dJointSetData)("dJointSetData", lib);
    bindFunc(dJointGetData)("dJointGetData", lib);
    bindFunc(dJointGetType)("dJointGetType", lib);
    bindFunc(dJointGetBody)("dJointGetBody", lib);
    bindFunc(dJointSetFeedback)("dJointSetFeedback", lib);
    bindFunc(dJointGetFeedback)("dJointGetFeedback", lib);
    bindFunc(dJointSetBallAnchor)("dJointSetBallAnchor", lib);
    bindFunc(dJointSetBallAnchor2)("dJointSetBallAnchor2", lib);
    bindFunc(dJointSetBallParam)("dJointSetBallParam", lib);
    bindFunc(dJointSetHingeAnchor)("dJointSetHingeAnchor", lib);
    bindFunc(dJointSetHingeAnchorDelta)("dJointSetHingeAnchorDelta", lib);
    bindFunc(dJointSetHingeAxis)("dJointSetHingeAxis", lib);
    bindFunc(dJointSetHingeAxisOffset)("dJointSetHingeAxisOffset", lib);
    bindFunc(dJointSetHingeParam)("dJointSetHingeParam", lib);
    bindFunc(dJointAddHingeTorque)("dJointAddHingeTorque", lib);
    bindFunc(dJointSetSliderAxis)("dJointSetSliderAxis", lib);
    bindFunc(dJointSetSliderAxisDelta)("dJointSetSliderAxisDelta", lib);
    bindFunc(dJointSetSliderParam)("dJointSetSliderParam", lib);
    bindFunc(dJointAddSliderForce)("dJointAddSliderForce", lib);
    bindFunc(dJointSetHinge2Anchor)("dJointSetHinge2Anchor", lib);
    bindFunc(dJointSetHinge2Axis1)("dJointSetHinge2Axis1", lib);
    bindFunc(dJointSetHinge2Axis2)("dJointSetHinge2Axis2", lib);
    bindFunc(dJointSetHinge2Param)("dJointSetHinge2Param", lib);
    bindFunc(dJointAddHinge2Torques)("dJointAddHinge2Torques", lib);
    bindFunc(dJointSetUniversalAnchor)("dJointSetUniversalAnchor", lib);
    bindFunc(dJointSetUniversalAxis1)("dJointSetUniversalAxis1", lib);
    bindFunc(dJointSetUniversalAxis1Offset)("dJointSetUniversalAxis1Offset", lib);
    bindFunc(dJointSetUniversalAxis2)("dJointSetUniversalAxis2", lib);
    bindFunc(dJointSetUniversalAxis2Offset)("dJointSetUniversalAxis2Offset", lib);
    bindFunc(dJointSetUniversalParam)("dJointSetUniversalParam", lib);
    bindFunc(dJointAddUniversalTorques)("dJointAddUniversalTorques", lib);
    bindFunc(dJointSetPRAnchor)("dJointSetPRAnchor", lib);
    bindFunc(dJointSetPRAxis1)("dJointSetPRAxis1", lib);
    bindFunc(dJointSetPRAxis2)("dJointSetPRAxis2", lib);
    bindFunc(dJointSetPRParam)("dJointSetPRParam", lib);
    bindFunc(dJointAddPRTorque)("dJointAddPRTorque", lib);
    bindFunc(dJointSetPUAnchor)("dJointSetPUAnchor", lib);
    bindFunc(dJointSetPUAnchorOffset)("dJointSetPUAnchorOffset", lib);
    bindFunc(dJointSetPUAxis1)("dJointSetPUAxis1", lib);
    bindFunc(dJointSetPUAxis2)("dJointSetPUAxis2", lib);
    bindFunc(dJointSetPUAxis3)("dJointSetPUAxis3", lib);
    bindFunc(dJointSetPUAxisP)("dJointSetPUAxisP", lib);
    bindFunc(dJointSetPUParam)("dJointSetPUParam", lib);
    bindFunc(dJointSetPistonAnchor)("dJointSetPistonAnchor", lib);
    bindFunc(dJointSetPistonAnchorOffset)("dJointSetPistonAnchorOffset", lib);
    bindFunc(dJointSetPistonAxis)("dJointSetPistonAxis", lib);
    bindFunc(dJointSetPistonParam)("dJointSetPistonParam", lib);
    bindFunc(dJointAddPistonForce)("dJointAddPistonForce", lib);
    bindFunc(dJointSetFixed)("dJointSetFixed", lib);
    bindFunc(dJointSetFixedParam)("dJointSetFixedParam", lib);
    bindFunc(dJointSetAMotorNumAxes)("dJointSetAMotorNumAxes", lib);
    bindFunc(dJointSetAMotorAxis)("dJointSetAMotorAxis", lib);
    bindFunc(dJointSetAMotorAngle)("dJointSetAMotorAngle", lib);
    bindFunc(dJointSetAMotorParam)("dJointSetAMotorParam", lib);
    bindFunc(dJointSetAMotorMode)("dJointSetAMotorMode", lib);
    bindFunc(dJointAddAMotorTorques)("dJointAddAMotorTorques", lib);
    bindFunc(dJointSetLMotorNumAxes)("dJointSetLMotorNumAxes", lib);
    bindFunc(dJointSetLMotorAxis)("dJointSetLMotorAxis", lib);
    bindFunc(dJointSetLMotorParam)("dJointSetLMotorParam", lib);
    bindFunc(dJointSetPlane2DXParam)("dJointSetPlane2DXParam", lib);
    bindFunc(dJointSetPlane2DYParam)("dJointSetPlane2DYParam", lib);
    bindFunc(dJointSetPlane2DAngleParam)("dJointSetPlane2DAngleParam", lib);
    bindFunc(dJointGetBallAnchor)("dJointGetBallAnchor", lib);
    bindFunc(dJointGetBallAnchor2)("dJointGetBallAnchor2", lib);
    bindFunc(dJointGetBallParam)("dJointGetBallParam", lib);
    bindFunc(dJointGetHingeAnchor)("dJointGetHingeAnchor", lib);
    bindFunc(dJointGetHingeAnchor2)("dJointGetHingeAnchor2", lib);
    bindFunc(dJointGetHingeAxis)("dJointGetHingeAxis", lib);
    bindFunc(dJointGetHingeParam)("dJointGetHingeParam", lib);
    bindFunc(dJointGetHingeAngle)("dJointGetHingeAngle", lib);
    bindFunc(dJointGetHingeAngleRate)("dJointGetHingeAngleRate", lib);
    bindFunc(dJointGetSliderPosition)("dJointGetSliderPosition", lib);
    bindFunc(dJointGetSliderPositionRate)("dJointGetSliderPositionRate", lib);
    bindFunc(dJointGetSliderAxis)("dJointGetSliderAxis", lib);
    bindFunc(dJointGetSliderParam)("dJointGetSliderParam", lib);
    bindFunc(dJointGetHinge2Anchor)("dJointGetHinge2Anchor", lib);
    bindFunc(dJointGetHinge2Anchor2)("dJointGetHinge2Anchor2", lib);
    bindFunc(dJointGetHinge2Axis1)("dJointGetHinge2Axis1", lib);
    bindFunc(dJointGetHinge2Axis2)("dJointGetHinge2Axis2", lib);
    bindFunc(dJointGetHinge2Param)("dJointGetHinge2Param", lib);
    bindFunc(dJointGetHinge2Angle1)("dJointGetHinge2Angle1", lib);
    bindFunc(dJointGetHinge2Angle1Rate)("dJointGetHinge2Angle1Rate", lib);
    bindFunc(dJointGetHinge2Angle2Rate)("dJointGetHinge2Angle2Rate", lib);
    bindFunc(dJointGetUniversalAnchor)("dJointGetUniversalAnchor", lib);
    bindFunc(dJointGetUniversalAnchor2)("dJointGetUniversalAnchor2", lib);
    bindFunc(dJointGetUniversalAxis1)("dJointGetUniversalAxis1", lib);
    bindFunc(dJointGetUniversalAxis2)("dJointGetUniversalAxis2", lib);
    bindFunc(dJointGetUniversalParam)("dJointGetUniversalParam", lib);
    bindFunc(dJointGetUniversalAngles)("dJointGetUniversalAngles", lib);
    bindFunc(dJointGetUniversalAngle1)("dJointGetUniversalAngle1", lib);
    bindFunc(dJointGetUniversalAngle2)("dJointGetUniversalAngle2", lib);
    bindFunc(dJointGetUniversalAngle1Rate)("dJointGetUniversalAngle1Rate", lib);
    bindFunc(dJointGetUniversalAngle2Rate)("dJointGetUniversalAngle2Rate", lib);
    bindFunc(dJointGetPRAnchor)("dJointGetPRAnchor", lib);
    bindFunc(dJointGetPRPosition)("dJointGetPRPosition", lib);
    bindFunc(dJointGetPRPositionRate)("dJointGetPRPositionRate", lib);
    bindFunc(dJointGetPRAngle)("dJointGetPRAngle", lib);
    bindFunc(dJointGetPRAngleRate)("dJointGetPRAngleRate", lib);
    bindFunc(dJointGetPRAxis1)("dJointGetPRAxis1", lib);
    bindFunc(dJointGetPRAxis2)("dJointGetPRAxis2", lib);
    bindFunc(dJointGetPRParam)("dJointGetPRParam", lib);
    bindFunc(dJointGetPUAnchor)("dJointGetPUAnchor", lib);
    bindFunc(dJointGetPUPosition)("dJointGetPUPosition", lib);
    bindFunc(dJointGetPUPositionRate)("dJointGetPUPositionRate", lib);
    bindFunc(dJointGetPUAxis1)("dJointGetPUAxis1", lib);
    bindFunc(dJointGetPUAxis2)("dJointGetPUAxis2", lib);
    bindFunc(dJointGetPUAxis3)("dJointGetPUAxis3", lib);
    bindFunc(dJointGetPUAxisP)("dJointGetPUAxisP", lib);
    bindFunc(dJointGetPUAngles)("dJointGetPUAngles", lib);
    bindFunc(dJointGetPUAngle1)("dJointGetPUAngle1", lib);
    bindFunc(dJointGetPUAngle1Rate)("dJointGetPUAngle1Rate", lib);
    bindFunc(dJointGetPUAngle2)("dJointGetPUAngle2", lib);
    bindFunc(dJointGetPUAngle2Rate)("dJointGetPUAngle2Rate", lib);
    bindFunc(dJointGetPUParam)("dJointGetPUParam", lib);
    bindFunc(dJointGetPistonPosition)("dJointGetPistonPosition", lib);
    bindFunc(dJointGetPistonPositionRate)("dJointGetPistonPositionRate", lib);
    bindFunc(dJointGetPistonAngle)("dJointGetPistonAngle", lib);
    bindFunc(dJointGetPistonAngleRate)("dJointGetPistonAngleRate", lib);
    bindFunc(dJointGetPistonAnchor)("dJointGetPistonAnchor", lib);
    bindFunc(dJointGetPistonAnchor2)("dJointGetPistonAnchor2", lib);
    bindFunc(dJointGetPistonAxis)("dJointGetPistonAxis", lib);
    bindFunc(dJointGetPistonParam)("dJointGetPistonParam", lib);
    bindFunc(dJointGetAMotorNumAxes)("dJointGetAMotorNumAxes", lib);
    bindFunc(dJointGetAMotorAxis)("dJointGetAMotorAxis", lib);
    bindFunc(dJointGetAMotorAxisRel)("dJointGetAMotorAxisRel", lib);
    bindFunc(dJointGetAMotorAngle)("dJointGetAMotorAngle", lib);
    bindFunc(dJointGetAMotorAngleRate)("dJointGetAMotorAngleRate", lib);
    bindFunc(dJointGetAMotorParam)("dJointGetAMotorParam", lib);
    bindFunc(dJointGetAMotorMode)("dJointGetAMotorMode", lib);
    bindFunc(dJointGetLMotorNumAxes)("dJointGetLMotorNumAxes", lib);
    bindFunc(dJointGetLMotorAxis)("dJointGetLMotorAxis", lib);
    bindFunc(dJointGetLMotorParam)("dJointGetLMotorParam", lib);
    bindFunc(dJointGetFixedParam)("dJointGetFixedParam", lib);
    bindFunc(dConnectingJoint)("dConnectingJoint", lib);
    bindFunc(dConnectingJointList)("dConnectingJointList", lib);
    bindFunc(dAreConnected)("dAreConnected", lib);
    bindFunc(dAreConnectedExcluding)("dAreConnectedExcluding", lib);

    // odeinit.h
    bindFunc(dInitODE)("dInitODE", lib);
    bindFunc(dInitODE2)("dInitODE2", lib);
    bindFunc(dAllocateODEDataForThread)("dAllocateODEDataForThread", lib);
    bindFunc(dCleanupODEAllDataForThread)("dCleanupODEAllDataForThread", lib);
    bindFunc(dCloseODE)("dCloseODE", lib);

    // rotation.h
    bindFunc(dRSetIdentity)("dRSetIdentity", lib);
    bindFunc(dRFromAxisAndAngle)("dRFromAxisAndAngle", lib);
    bindFunc(dRFromEulerAngles)("dRFromEulerAngles", lib);
    bindFunc(dRFrom2Axes)("dRFrom2Axes", lib);
    bindFunc(dRFromZAxis)("dRFromZAxis", lib);
    bindFunc(dQSetIdentity)("dQSetIdentity", lib);
    bindFunc(dQFromAxisAndAngle)("dQFromAxisAndAngle", lib);
    bindFunc(dQMultiply0)("dQMultiply0", lib);
    bindFunc(dQMultiply1)("dQMultiply1", lib);
    bindFunc(dQMultiply2)("dQMultiply2", lib);
    bindFunc(dQMultiply3)("dQMultiply3", lib);
    bindFunc(dRfromQ)("dRfromQ", lib);
    bindFunc(dQfromR)("dQfromR", lib);
    bindFunc(dDQfromW)("dDQfromW", lib);

    // timer.h
    bindFunc(dStopwatchReset)("dStopwatchReset", lib);
    bindFunc(dStopwatchStart)("dStopwatchStart", lib);
    bindFunc(dStopwatchStop)("dStopwatchStop", lib);
    bindFunc(dStopwatchTime)("dStopwatchTime", lib);
    bindFunc(dTimerStart)("dTimerStart", lib);
    bindFunc(dTimerNow)("dTimerNow", lib);
    bindFunc(dTimerEnd)("dTimerEnd", lib);
    bindFunc(dTimerReport)("dTimerReport", lib);
    bindFunc(dTimerTicksPerSecond)("dTimerTicksPerSecond", lib);
    bindFunc(dTimerResolution)("dTimerResolution", lib);

    // defined in interface, present in ODE source, but consistently fails to load
    // bindFunc(dWorldExportDIF)("dWorldExportDIF", lib);
}

GenericLoader DerelictODE;
static this() {
    version(DerelictODE_DoublePrecision)
    {
        char[] winlib = "ode_double.dll";
        char[] linlib = "libode_double.so";
    }
    else
    {
        char[] winlib = "ode_single.dll";
        char[] linlib = "ode_double.dll";
    }
    DerelictODE.setup(
        winlib ~ ", ode.dll",
        linlib ~ ", libode.so, libode.so.0, libode.so.0.8.0",
        "",
        &load
    );
}

extern(C)
{
    // common.h
    char* function() dGetConfiguration;
    int function(in char*) dCheckConfiguration;

    // collision.h
    void function(dGeomID) dGeomDestroy;
    void function(dGeomID, void*) dGeomSetData;
    void* function(dGeomID) dGeomGetData;
    void function(dGeomID, dBodyID) dGeomSetBody;
    dBodyID function(dGeomID) dGeomGetBody;
    void function(dGeomID, dReal, dReal, dReal) dGeomSetPosition;
    void function(dGeomID, in dMatrix3) dGeomSetRotation;
    void function(dGeomID, in dQuaternion) dGeomSetQuaternion;
    dReal* function(dGeomID) dGeomGetPosition;
    void function(dGeomID, dVector3) dGeomCopyPosition;
    dReal* function(dGeomID)  dGeomGetRotation;
    void function(dGeomID, dMatrix3) dGeomCopyRotation;
    void function(dGeomID, dQuaternion) dGeomGetQuaternion;
    void function(dGeomID, dReal[6]) dGeomGetAABB;
    int function(dGeomID) dGeomIsSpace;
    dSpaceID function(dGeomID) dGeomGetSpace;
    int function(dGeomID) dGeomGetClass;
    void function(dGeomID, uint) dGeomSetCategoryBits;
    void function(dGeomID, uint) dGeomSetCollideBits;
    uint function(dGeomID) dGeomGetCategoryBits;
    uint function(dGeomID) dGeomGetCollideBits;
    void function(dGeomID) dGeomEnable;
    void function(dGeomID) dGeomDisable;
    int function(dGeomID) dGeomIsEnabled;
    void function(dGeomID, dReal, dReal, dReal) dGeomSetOffsetPosition;
    void function(dGeomID, in dMatrix3) dGeomSetOffsetRotation;
    void function(dGeomID, in dQuaternion) dGeomSetOffsetQuaternion;
    void function(dGeomID, dReal, dReal, dReal) dGeomSetOffsetWorldPosition;
    void function(dGeomID, in dMatrix3) dGeomSetOffsetWorldRotation;
    void function(dGeomID, int dQuaternion) dGeomSetOffsetWorldQuaternion;
    void function(dGeomID) dGeomClearOffset;
    int function(dGeomID) dGeomIsOffset;
    dReal* function(dGeomID) dGeomGetOffsetPosition;
    void function(dGeomID, dVector3) dGeomCopyOffsetPosition;
    dReal* function(dGeomID) dGeomGetOffsetRotation;
    void function(dGeomID, dQuaternion) dGeomGetOffsetQuaternion;
    int function(dGeomID, dGeomID, int, dContactGeom*, int) dCollide;
    void function(dSpaceID, void*, dNearCallback) dSpaceCollide;
    void function(dGeomID, dGeomID, void*, dNearCallback) dSpaceCollide2;
    dGeomID function(dSpaceID, dReal) dCreateSphere;
    void function(dGeomID, dReal) dGeomSphereSetRadius;
    dReal function(dGeomID) dGeomSphereGetRadius;
    dReal function(dGeomID, dReal, dReal, dReal) dGeomSpherePointDepth;
    dGeomID function(dSpaceID, dReal*, uint, dReal*, uint, uint*) dCreateConvex;
    void function(dGeomID, dReal*, uint, dReal*, uint, uint*) dGeomSetConvex;
    dGeomID function(dSpaceID, dReal, dReal, dReal) dCreateBox;
    void function(dGeomID, dReal, dReal, dReal) dGeomBoxSetLengths;
    void function(dGeomID, dVector3) dGeomBoxGetLengths;
    dReal function(dGeomID, dReal, dReal, dReal) dGeomBoxPointDepth;
    dGeomID function(dSpaceID, dReal, dReal, dReal, dReal) dCreatePlane;
    void function(dGeomID, dReal, dReal, dReal, dReal) dGeomPlaneSetParams;
    void function(dGeomID, dVector4) dGeomPlaneGetParams;
    dReal function(dGeomID, dReal, dReal, dReal) dGeomPlanePointDepth;
    dGeomID function(dSpaceID, dReal, dReal) dCreateCapsule;
    void function(dGeomID, dReal, dReal) dGeomCapsuleSetParams;
    void function(dGeomID, dReal*, dReal*) dGeomCapsuleGetParams;
    dReal function(dGeomID, dReal, dReal, dReal) dGeomCapsulePointDepth;
    dGeomID function(dSpaceID, dReal, dReal) dCreateCylinder;
    void function(dGeomID, dReal, dReal) dGeomCylinderSetParams;
    void function(dGeomID, dReal*, dReal*) dGeomCylinderGetParams;
    dGeomID function(dSpaceID, dReal) dCreateRay;
    void function(dGeomID, dReal) dGeomRaySetLength;
    dReal function(dGeomID) dGeomRayGetLength;
    void function(dGeomID, dReal, dReal, dReal, dReal, dReal, dReal) dGeomRaySet;
    void function(dGeomID, dVector3, dVector3) dGeomRayGet;
    void function(dGeomID, int, int) dGeomRaySetParams;
    void function(dGeomID, int*, int*) dGeomRayGetParams;
    void function(dGeomID, int) dGeomRaySetClosestHit;
    int function(dGeomID) dGeomRayGetClosestHit;
    dGeomID function(dSpaceID) dCreateGeomTransform;
    void function(dGeomID, dGeomID) dGeomTransformSetGeom;
    dGeomID function(dGeomID) dGeomTransformGetGeom;
    void function(dGeomID, int) dGeomTransformSetCleanup;
    int function(dGeomID) dGeomTransformGetCleanup;
    void function(dGeomID, int) dGeomTransformSetInfo;
    int function(dGeomID) dGeomTransformGetInfo;
    dGeomID function(dSpaceID, dHeightfieldDataID, int) dCreateHeightfield;
    dHeightfieldDataID function() dGeomHeightfieldDataCreate;
    void function(dHeightfieldDataID) dGeomHeightfieldDataDestroy;
    void function(dHeightfieldDataID, void*, dHeightfieldGetHeight, dReal, dReal, int, int, dReal, dReal, dReal, int) dGeomHeightfieldDataBuildCallback;
    void function(dHeightfieldDataID, in ubyte*, int, dReal, dReal, int, int, dReal, dReal, dReal, int) dGeomHeightfieldDataBuildByte;
    void function(dHeightfieldDataID, in short*, int, dReal, dReal, int, int, dReal, dReal, dReal, int) dGeomHeightfieldDataBuildShort;
    void function(dHeightfieldDataID, in float*, int, dReal, dReal, int, int, dReal, dReal, dReal, int) dGeomHeightfieldDataBuildSingle;
    void function(dHeightfieldDataID, in double*, int, dReal, dReal, int, int, dReal, dReal, dReal, int) dGeomHeightfieldDataBuildDouble;
    void function(dHeightfieldDataID, dReal, dReal) dGeomHeightfieldDataSetBounds;
    void function(dGeomID, dHeightfieldDataID) dGeomHeightfieldSetHeightfieldData;
    dHeightfieldDataID function(dGeomID) dGeomHeightfieldGetHeightfieldData;
    void function(in dVector3, in dVector3, in dVector3, in dVector3, dVector3, dVector3) dClosestLineSegmentPoints;
    int function(in dVector3, in dMatrix3, in dVector3, in dVector3, in dMatrix3, in dVector3) dBoxTouchesBox;
    int function(in dVector3, in dMatrix3, in dVector3, in dVector3, in dMatrix3, in dVector3, dVector3, dReal*, int*, int, dContactGeom*, int) dBoxBox;
    void function(dGeomID, dReal[6]) dInfiniteAABB;
    int function(in dGeomClass*) dCreateGeomClass;
    void* function(dGeomID) dGeomGetClassData;
    dGeomID function(int) dCreateGeom;
    void function(int, int, dColliderFn) dSetColliderOverride;

    alias dCreateCapsule dCreateCCylinder;
    alias dGeomCapsuleSetParams dGeomCCylinderSetParams;
    alias dGeomCapsuleGetParams dGeomCCylinderGetParams;
    alias dGeomCapsulePointDepth dGeomCCylinderPointDepth;

    // collision_space.h
    dSpaceID function(dSpaceID) dSimpleSpaceCreate;
    dSpaceID function(dSpaceID) dHashSpaceCreate;
    dSpaceID function(dSpaceID, in dVector3, in dVector3, int) dQuadTreeSpaceCreate;
    dSpaceID function(dSpaceID, int) dSweepAndPruneSpaceCreate;
    void function(dSpaceID) dSpaceDestroy;
    void function(dSpaceID, int, int) dHashSpaceSetLevels;
    void function(dSpaceID, int*, int*) dHashSpaceGetLevels;
    void function(dSpaceID, int) dSpaceSetCleanup;
    int function(dSpaceID) dSpaceGetCleanup;
    void function(dSpaceID, int) dSpaceSetSublevel;
    int function(dSpaceID) dSpaceGetSublevel;
    void function(dSpaceID, dGeomID) dSpaceAdd;
    void function(dSpaceID, dGeomID) dSpaceRemove;
    int function(dSpaceID, dGeomID) dSpaceQuery;
    void function(dSpaceID) dSpaceClean;
    int function(dSpaceID) dSpaceGetNumGeoms;
    dGeomID function(dSpaceID, int) dSpaceGetGeom;
    int function(dSpaceID) dSpaceGetClass;

    // collision_trimesh.h
    dTriMeshDataID function() dGeomTriMeshDataCreate;
    void function(dTriMeshDataID) dGeomTriMeshDataDestroy;
    void function(dTriMeshDataID, int, void*) dGeomTriMeshDataSet;
    void* function(dTriMeshDataID, int) dGeomTriMeshDataGet;
    void function(dGeomID, dMatrix4) dGeomTriMeshSetLastTransform;
    dReal* function(dGeomID) dGeomTriMeshGetLastTransform;
    void function(dTriMeshDataID, in void*, int, int, in void*, int, int) dGeomTriMeshDataBuildSingle;
    void function(dTriMeshDataID, in void*, int, int, in void*, int, int, in void*) dGeomTriMeshDataBuildSingle1;
    void function(dTriMeshDataID, in void*, int, int, in void*, int, int) dGeomTriMeshDataBuildDouble;
    void function(dTriMeshDataID, in void*, int, int, in void*, int, int, in void*) dGeomTriMeshDataBuildDouble1;
    void function(dTriMeshDataID, in dReal*, int, in dTriIndex*, int) dGeomTriMeshDataBuildSimple;
    void function(dTriMeshDataID, in dReal*, int, in dTriIndex*, int, in int*) dGeomTriMeshDataBuildSimple1;
    void function(dTriMeshDataID) dGeomTriMeshDataPreprocess;
    void function(dTriMeshDataID, ubyte**, int*) dGeomTriMeshDataGetBuffer;
    void function(dTriMeshDataID, ubyte*) dGeomTriMeshDataSetBuffer;
    void function(dGeomID, dTriCallback) dGeomTriMeshSetCallback;
    dTriCallback function(dGeomID) dGeomTriMeshGetCallback;
    void function(dGeomID, dTriArrayCallback) dGeomTriMeshSetArrayCallback;
    dTriArrayCallback function(dGeomID) dGeomTriMeshGetArrayCallback;
    void function(dGeomID, dTriRayCallback) dGeomTriMeshSetRayCallback;
    dTriRayCallback function(dGeomID) dGeomTriMeshGetRayCallback;
    void function(dGeomID, dTriTriMergeCallback) dGeomTriMeshSetTriMergeCallback;
    dTriTriMergeCallback function(dGeomID) dGeomTriMeshGetTriMergeCallback;
    dGeomID function(dSpaceID, dTriMeshDataID, dTriCallback, dTriArrayCallback, dTriRayCallback) dCreateTriMesh;
    void function(dGeomID, dTriMeshDataID) dGeomTriMeshSetData;
    dTriMeshDataID function(dGeomID) dGeomTriMeshGetData;
    void function(dGeomID, int, int) dGeomTriMeshEnableTC;
    int function(dGeomID, int) dGeomTriMeshIsTCEnabled;
    void function(dGeomID) dGeomTriMeshClearTCCache;
    dTriMeshDataID function(dGeomID) dGeomTriMeshGetTriMeshDataID;
    void function(dGeomID, int, dVector3*, dVector3*, dVector3*) dGeomTriMeshGetTriangle;
    void function(dGeomID, int, dReal, dReal, dVector3) dGeomTriMeshGetPoint;
    int function(dGeomID) dGeomTriMeshGetTriangleCount;
    void function(dTriMeshDataID) dGeomTriMeshDataUpdate;

    // error.h
    void function(dMessageFunction) dSetErrorHandler;
    void function(dMessageFunction) dSetDebugHandler;
    void function(dMessageFunction) dSetMessageHandler;
    dMessageFunction function() dGetErrorHandler;
    dMessageFunction function() dGetDebugHandler;
    dMessageFunction function() dGetMessageHandler;
    void function(int, in char*, ...) dError;
    void function(int, in char*, ...) dDebug;
    void function(int, in char*, ...) dMessage;

    // mass.h
    int function(in dMass*) dMassCheck;
    void function(dMass*) dMassSetZero;
    void function(dMass*, dReal, dReal, dReal, dReal, dReal, dReal, dReal, dReal, dReal, dReal) dMassSetParameters;
    void function(dMass*, dReal, dReal) dMassSetSphere;
    void function(dMass*, dReal, dReal) dMassSetSphereTotal;
    void function(dMass*, dReal, int, dReal, dReal) dMassSetCapsule;
    void function(dMass*, dReal, int, dReal, dReal) dMassSetCapsuleTotal;
    void function(dMass*, dReal, int, dReal, dReal) dMassSetCylinder;
    void function(dMass*, dReal, int, dReal, dReal) dMassSetCylinderTotal;
    void function(dMass*, dReal, dReal, dReal, dReal) dMassSetBox;
    void function(dMass*, dReal, dReal, dReal, dReal) dMassSetBoxTotal;
    void function(dMass*, dReal, dGeomID) dMassSetTrimesh;
    void function(dMass*, dReal, dGeomID) dMassSetTrimeshTotal;
    void function(dMass*, dReal) dMassAdjust;
    void function(dMass*, dReal, dReal, dReal) dMassTranslate;
    void function(dMass*, in dMatrix3) dMassRotate;
    void function(dMass*, in dMass*) dMassAdd;

    // matrix.h
    void function(dReal*, int) dSetZero;
    void function(dReal*, int, dReal) dSetValue;
    dReal function(in dReal*, in dReal*, int) dDot;
    void function(dReal*, in dReal*, in dReal*, int, int, int) dMultiply0;
    void function(dReal*, in dReal*, in dReal*, int, int, int) dMultiply1;
    void function(dReal*, in dReal*, in dReal*, int, int, int) dMultiply2;
    int function(dReal*, int) dFactorCholesky;
    void function(in dReal*, dReal*, int) dSolveCholesky;
    int function(in dReal*, dReal*, int) dInvertPDMatrix;
    int function(in dReal*, int) dIsPositiveDefinite;
    void function(dReal*, dReal*, int, int) dFactorLDLT;
    void function(in dReal*, dReal*, int, int) dSolveL1;
    void function(in dReal*, dReal*, int, int) dSolveL1T;
    void function(dReal*, in dReal*, int) dVectorScale;
    void function(in dReal*, in dReal*, dReal*, int, int) dSolveLDLT;
    void function(dReal*, dReal*, in dReal*, int, int) dLDLTAddTL;
    void function(dReal**, in int*, dReal*, dReal*, int, int, int, int) dLDLTRemove;
    void function(dReal*, int, int, int) dRemoveRowCol;

    // memory.h
    void function(dAllocFunction) dSetAllocHandler;
    void function(dReallocFunction) dSetReallocHandler;
    void function(dFreeFunction) dSetFreeHandler;
    dAllocFunction function() dGetAllocHandler;
    dReallocFunction function() dGetReallocHandler;
    dFreeFunction function() dGetFreeHandler;
    void* function(size_t) dAlloc;
    void* function(void*, size_t, size_t) dRealloc;
    void function(void*, size_t) dFree;

    // misc.h
    int function() dTestRand;
    uint function() dRand;
    uint function() dRandGetSeed;
    void function(uint) dRandSetSeed;
    int function(int) dRandInt;
    dReal function() dRandReal;
    void function(in dReal*, int, int, char*, FILE*) dPrintMatrix;
    void function(dReal, int, dReal) dMakeRandomVector;
    void function(dReal*, int, int, dReal) dMakeRandomMatrix;
    void function(dReal*, int) dClearUpperTriangle;
    dReal function(in dReal*, in dReal*, int, int) dMaxDifference;
    dReal function(in dReal*, in dReal*, int) dMaxDifferenceLowerTriangle;

    // objects.h
    dWorldID function() dWorldCreate;
    void function(dWorldID) dWorldDestroy;
    void function(dWorldID, dReal, dReal, dReal) dWorldSetGravity;
    void function(dWorldID, dVector3) dWorldGetGravity;
    void function(dWorldID, dReal) dWorldSetERP;
    dReal function(dWorldID) dWorldGetERP;
    void function(dWorldID, dReal) dWorldSetCFM;
    dReal function(dWorldID) dWorldGetCFM;
    void function(dWorldID, dReal) dWorldStep;
    void function(dWorldID, dReal, dReal, dReal, dReal, dVector3) dWorldImpulseToForce;
    void function(dWorldID, dReal) dWorldQuickStep;
    void function(dWorldID, int) dWorldSetQuickStepNumIterations;
    int function(dWorldID) dWorldGetQuickStepNumIterations;
    void function(dWorldID, dReal) dWorldSetQuickStepW;
    dReal function(dWorldID) dWorldGetQuickStepW;
    void function(dWorldID, dReal) dWorldSetContactMaxCorrectingVel;
    dReal function(dWorldID) dWorldGetContactMaxCorrectingVel;
    void function(dWorldID, dReal) dWorldSetContactSurfaceLayer;
    dReal function(dWorldID) dWorldGetContactSurfaceLayer;
    void function(dWorldID, dReal, int) dWorldStepFast1;
    void function(dWorldID, int) dWorldSetAutoEnableDepthSF1;
    int function(dWorldID) dWorldGetAutoEnableDepthSF1;
    dReal function(dWorldID) dWorldGetAutoDisableLinearThreshold;
    void function(dWorldID, dReal) dWorldSetAutoDisableLinearThreshold;
    dReal function(dWorldID) dWorldGetAutoDisableAngularThreshold;
    void function(dWorldID, dReal) dWorldSetAutoDisableAngularThreshold;
    int function(dWorldID) dWorldGetAutoDisableAverageSamplesCount;
    void function(dWorldID, uint) dWorldSetAutoDisableAverageSamplesCount;
    int function(dWorldID) dWorldGetAutoDisableSteps;
    void function(dWorldID, int) dWorldSetAutoDisableSteps;
    dReal function(dWorldID) dWorldGetAutoDisableTime;
    void function(dWorldID, dReal) dWorldSetAutoDisableTime;
    int function(dWorldID) dWorldGetAutoDisableFlag;
    void function(dWorldID, int) dWorldSetAutoDisableFlag;
    dReal function(dWorldID) dWorldGetLinearDampingThreshold;
    void function(dWorldID, dReal) dWorldSetLinearDampingThreshold;
    dReal function(dWorldID) dWorldGetAngularDampingThreshold;
    void function(dWorldID, dReal) dWorldSetAngularDampingThreshold;
    dReal function(dWorldID) dWorldGetLinearDamping;
    void function(dWorldID, dReal) dWorldSetLinearDamping;
    dReal function(dWorldID) dWorldGetAngularDamping;
    void function(dWorldID, dReal) dWorldSetAngularDamping;
    void function(dWorldID, dReal, dReal) dWorldSetDamping;
    dReal function(dWorldID) dWorldGetMaxAngularSpeed;
    void function(dWorldID, dReal) dWorldSetMaxAngularSpeed;
    dReal function(dBodyID) dBodyGetAutoDisableLinearThreshold;
    void function(dBodyID, dReal) dBodySetAutoDisableLinearThreshold;
    dReal function(dBodyID) dBodyGetAutoDisableAngularThreshold;
    void function(dBodyID, dReal) dBodySetAutoDisableAngularThreshold;
    int function(dBodyID) dBodyGetAutoDisableAverageSamplesCount;
    void function(dBodyID, uint) dBodySetAutoDisableAverageSamplesCount;
    int function(dBodyID) dBodyGetAutoDisableSteps;
    void function(dBodyID, int) dBodySetAutoDisableSteps;
    dReal function(dBodyID) dBodyGetAutoDisableTime;
    void function(dBodyID, dReal) dBodySetAutoDisableTime;
    int function(dBodyID) dBodyGetAutoDisableFlag;
    void function(dBodyID, int) dBodySetAutoDisableFlag;
    void function(dBodyID) dBodySetAutoDisableDefaults;
    dWorldID function(dBodyID) dBodyGetWorld;
    dBodyID function(dWorldID) dBodyCreate;
    void function(dBodyID) dBodyDestroy;
    void function(dBodyID, void*) dBodySetData;
    void* function(dBodyID) dBodyGetData;
    void function(dBodyID, dReal, dReal, dReal) dBodySetPosition;
    void function(dBodyID, in dMatrix3) dBodySetRotation;
    void function(dBodyID, in dQuaternion) dBodySetQuaternion;
    void function(dBodyID, dReal, dReal, dReal) dBodySetLinearVel;
    void function(dBodyID, dReal, dReal, dReal) dBodySetAngularVel;
    dReal* function(dBodyID) dBodyGetPosition;
    void function(dBodyID, dVector3) dBodyCopyPosition;
    dReal* function(dBodyID) dBodyGetRotation;
    void function(dBodyID, dMatrix3) dBodyCopyRotation;
    dReal* function(dBodyID) dBodyGetQuaternion;
    void function(dBodyID, dQuaternion) dBodyCopyQuaternion;
    dReal* function(dBodyID) dBodyGetLinearVel;
    dReal* function(dBodyID) dBodyGetAngularVel;
    void function(dBodyID, in dMass*) dBodySetMass;
    void function(dBodyID, dMass*) dBodyGetMass;
    void function(dBodyID, dReal, dReal, dReal) dBodyAddForce;
    void function(dBodyID, dReal, dReal, dReal) dBodyAddTorque;
    void function(dBodyID, dReal, dReal, dReal) dBodyAddRelForce;
    void function(dBodyID, dReal, dReal, dReal) dBodyAddRelTorque;
    void function(dBodyID, dReal, dReal, dReal, dReal, dReal, dReal) dBodyAddForceAtPos;
    void function(dBodyID, dReal, dReal, dReal, dReal, dReal, dReal) dBodyAddForceAtRelPos;
    void function(dBodyID, dReal, dReal, dReal, dReal, dReal, dReal) dBodyAddRelForceAtPos;
    void function(dBodyID, dReal, dReal, dReal, dReal, dReal, dReal) dBodyAddRelForceAtRelPos;
    dReal* function(dBodyID) dBodyGetForce;
    dReal* function(dBodyID) dBodyGetTorque;
    void function(dBodyID, dReal, dReal, dReal) dBodySetForce;
    void function(dBodyID, dReal, dReal, dReal) dBodySetTorque;
    void function(dBodyID, dReal, dReal, dReal, dVector3) dBodyGetRelPointPos;
    void function(dBodyID, dReal, dReal, dReal, dVector3) dBodyGetRelPointVel;
    void function(dBodyID, dReal, dReal, dReal, dVector3) dBodyGetPointVel;
    void function(dBodyID, dReal, dReal, dReal, dVector3) dBodyGetPosRelPoint;
    void function(dBodyID, dReal, dReal, dReal, dVector3) dBodyVectorToWorld;
    void function(dBodyID, dReal, dReal, dReal, dVector3) dBodyVectorFromWorld;
    void function(dBodyID, int) dBodySetFiniteRotationMode;
    void function(dBodyID, dReal, dReal, dReal) dBodySetFiniteRotationAxis;
    int function(dBodyID) dBodyGetFiniteRotationMode;
    void function(dBodyID, dVector3) dBodyGetFiniteRotationAxis;
    int function(dBodyID) dBodyGetNumJoints;
    dJointID function(dBodyID) dBodyGetJoint;
    void function(dBodyID) dBodySetDynamic;
    void function(dBodyID) dBodySetKinematic;
    int function(dBodyID) dBodyIsKinematic;
    void function(dBodyID) dBodyEnable;
    void function(dBodyID) dBodyDisable;
    int function(dBodyID) dBodyIsEnabled;
    void function(dBodyID, int) dBodySetGravityMode;
    int function(dBodyID) dBodyGetGravityMode;
    void function(dBodyID, void (*callback)(dBodyID)) dBodySetMovedCallback;
    dGeomID function(dBodyID) dBodyGetFirstGeom;
    dGeomID function(dGeomID) dBodyGetNextGeom;
    void function(dBodyID) dBodySetDampingDefaults;
    dReal function(dBodyID) dBodyGetLinearDamping;
    void function(dBodyID, dReal) dBodySetLinearDamping;
    dReal function(dBodyID) dBodyGetAngularDamping;
    void function(dBodyID, dReal) dBodySetAngularDamping;
    void function(dBodyID, dReal, dReal) dBodySetDamping;
    dReal function(dBodyID) dBodyGetLinearDampingThreshold;
    void function(dBodyID, dReal) dBodySetLinearDampingThreshold;
    dReal function(dBodyID) dBodyGetAngularDampingThreshold;
    void function(dBodyID, dReal) dBodySetAngularDampingThreshold;
    dReal function(dBodyID) dBodyGetMaxAngularSpeed;
    void function(dBodyID, dReal) dBodySetMaxAngularSpeed;
    int function(dBodyID) dBodyGetGyroscopicMode;
    void function(dBodyID, int) dBodySetGyroscopicMode;
    dJointID function(dWorldID, dJointGroupID) dJointCreateBall;
    dJointID function(dWorldID, dJointGroupID) dJointCreateHinge;
    dJointID function(dWorldID, dJointGroupID) dJointCreateSlider;
    dJointID function(dWorldID, dJointGroupID, in dContact*) dJointCreateContact;
    dJointID function(dWorldID, dJointGroupID) dJointCreateHinge2;
    dJointID function(dWorldID, dJointGroupID) dJointCreateUniversal;
    dJointID function(dWorldID, dJointGroupID) dJointCreatePR;
    dJointID function(dWorldID, dJointGroupID) dJointCreatePU;
    dJointID function(dWorldID, dJointGroupID) dJointCreatePiston;
    dJointID function(dWorldID, dJointGroupID) dJointCreateFixed;
    dJointID function(dWorldID, dJointGroupID) dJointCreateNull;
    dJointID function(dWorldID, dJointGroupID) dJointCreateAMotor;
    dJointID function(dWorldID, dJointGroupID) dJointCreateLMotor;
    dJointID function(dWorldID, dJointGroupID) dJointCreatePlane2D;
    void function(dJointID) dJointDestroy;
    dJointGroupID function(int) dJointGroupCreate;
    void function(dJointGroupID) dJointGroupDestroy;
    void function(dJointGroupID) dJointGroupEmpty;
    int function(dJointID) dJointGetNumBodies;
    void function(dJointID, dBodyID, dBodyID) dJointAttach;
    void function(dJointID) dJointEnable;
    void function(dJointID) dJointDisable;
    int function(dJointID) dJointIsEnabled;
    void function(dJointID, void*) dJointSetData;
    void* function(dJointID) dJointGetData;
    dJointType function(dJointID) dJointGetType;
    dBodyID function(dJointID, int) dJointGetBody;
    void function(dJointID, dJointFeedback*) dJointSetFeedback;
    dJointFeedback* function(dJointID) dJointGetFeedback;
    void function(dJointID, dReal, dReal, dReal) dJointSetBallAnchor;
    void function(dJointID, dReal, dReal, dReal) dJointSetBallAnchor2;
    void function(dJointID, int, dReal) dJointSetBallParam;
    void function(dJointID, dReal, dReal, dReal) dJointSetHingeAnchor;
    void function(dJointID, dReal, dReal, dReal, dReal, dReal, dReal) dJointSetHingeAnchorDelta;
    void function(dJointID, dReal, dReal, dReal) dJointSetHingeAxis;
    void function(dJointID, dReal, dReal, dReal, dReal) dJointSetHingeAxisOffset;
    void function(dJointID, int, dReal) dJointSetHingeParam;
    void function(dJointID, dReal) dJointAddHingeTorque;
    void function(dJointID, dReal, dReal, dReal) dJointSetSliderAxis;
    void function(dJointID, dReal, dReal, dReal, dReal, dReal, dReal) dJointSetSliderAxisDelta;
    void function(dJointID, int, dReal) dJointSetSliderParam;
    void function(dJointID, dReal) dJointAddSliderForce;
    void function(dJointID, dReal, dReal, dReal) dJointSetHinge2Anchor;
    void function(dJointID, dReal, dReal, dReal) dJointSetHinge2Axis1;
    void function(dJointID, dReal, dReal, dReal) dJointSetHinge2Axis2;
    void function(dJointID, int, dReal) dJointSetHinge2Param;
    void function(dJointID, dReal, dReal) dJointAddHinge2Torques;
    void function(dJointID, dReal, dReal, dReal) dJointSetUniversalAnchor;
    void function(dJointID, dReal, dReal, dReal) dJointSetUniversalAxis1;
    void function(dJointID, dReal, dReal, dReal, dReal, dReal) dJointSetUniversalAxis1Offset;
    void function(dJointID, dReal, dReal, dReal) dJointSetUniversalAxis2;
    void function(dJointID, dReal, dReal, dReal, dReal, dReal) dJointSetUniversalAxis2Offset;
    void function(dJointID, int, dReal) dJointSetUniversalParam;
    void function(dJointID, dReal, dReal) dJointAddUniversalTorques;
    void function(dJointID, dReal, dReal, dReal) dJointSetPRAnchor;
    void function(dJointID, dReal, dReal, dReal) dJointSetPRAxis1;
    void function(dJointID, dReal, dReal, dReal) dJointSetPRAxis2;
    void function(dJointID, int, dReal) dJointSetPRParam;
    void function(dJointID, dReal) dJointAddPRTorque;
    void function(dJointID, dReal, dReal, dReal) dJointSetPUAnchor;
    void function(dJointID, dReal, dReal, dReal, dReal, dReal, dReal) dJointSetPUAnchorOffset;
    void function(dJointID, dReal, dReal, dReal) dJointSetPUAxis1;
    void function(dJointID, dReal, dReal, dReal) dJointSetPUAxis2;
    void function(dJointID, dReal, dReal, dReal) dJointSetPUAxis3;
    void function(dJointID, dReal, dReal, dReal) dJointSetPUAxisP;
    void function(dJointID, int, dReal) dJointSetPUParam;
    void function(dJointID, dReal, dReal, dReal) dJointSetPistonAnchor;
    void function(dJointID, dReal, dReal, dReal, dReal, dReal, dReal) dJointSetPistonAnchorOffset;
    void function(dJointID, dReal, dReal, dReal) dJointSetPistonAxis;
    void function(dJointID, int, dReal) dJointSetPistonParam;
    void function(dJointID, dReal) dJointAddPistonForce;
    void function(dJointID) dJointSetFixed;
    void function(dJointID, int, dReal) dJointSetFixedParam;
    void function(dJointID, int) dJointSetAMotorNumAxes;
    void function(dJointID, int, int, dReal, dReal, dReal) dJointSetAMotorAxis;
    void function(dJointID, int, dReal) dJointSetAMotorAngle;
    void function(dJointID, int, dReal) dJointSetAMotorParam;
    void function(dJointID, int) dJointSetAMotorMode;
    void function(dJointID, dReal, dReal, dReal) dJointAddAMotorTorques;
    void function(dJointID, int) dJointSetLMotorNumAxes;
    void function(dJointID, int, int, dReal, dReal, dReal) dJointSetLMotorAxis;
    void function(dJointID, int, dReal) dJointSetLMotorParam;
    void function(dJointID, int, dReal) dJointSetPlane2DXParam;
    void function(dJointID, int, dReal) dJointSetPlane2DYParam;
    void function(dJointID, int, dReal) dJointSetPlane2DAngleParam;
    void function(dJointID, dVector3) dJointGetBallAnchor;
    void function(dJointID, dVector3) dJointGetBallAnchor2;
    dReal function(dJointID, int) dJointGetBallParam;
    void function(dJointID, dVector3) dJointGetHingeAnchor;
    void function(dJointID, dVector3) dJointGetHingeAnchor2;
    void function(dJointID, dVector3) dJointGetHingeAxis;
    dReal function(dJointID, int) dJointGetHingeParam;
    dReal function(dJointID) dJointGetHingeAngle;
    dReal function(dJointID) dJointGetHingeAngleRate;
    dReal function(dJointID) dJointGetSliderPosition;
    dReal function(dJointID) dJointGetSliderPositionRate;
    void function(dJointID, dVector3) dJointGetSliderAxis;
    dReal function(dJointID, int) dJointGetSliderParam;
    void function(dJointID, dVector3) dJointGetHinge2Anchor;
    void function(dJointID, dVector3) dJointGetHinge2Anchor2;
    void function(dJointID, dVector3) dJointGetHinge2Axis1;
    void function(dJointID, dVector3) dJointGetHinge2Axis2;
    dReal function(dJointID, int) dJointGetHinge2Param;
    dReal function(dJointID) dJointGetHinge2Angle1;
    dReal function(dJointID) dJointGetHinge2Angle1Rate;
    dReal function(dJointID) dJointGetHinge2Angle2Rate;
    void function(dJointID, dVector3) dJointGetUniversalAnchor;
    void function(dJointID, dVector3) dJointGetUniversalAnchor2;
    void function(dJointID, dVector3) dJointGetUniversalAxis1;
    void function(dJointID, dVector3) dJointGetUniversalAxis2;
    dReal function(dJointID, int) dJointGetUniversalParam;
    void function(dJointID, dReal*, dReal*) dJointGetUniversalAngles;
    dReal function(dJointID) dJointGetUniversalAngle1;
    dReal function(dJointID) dJointGetUniversalAngle2;
    dReal function(dJointID) dJointGetUniversalAngle1Rate;
    dReal function(dJointID) dJointGetUniversalAngle2Rate;
    void function(dJointID, dVector3) dJointGetPRAnchor;
    dReal function(dJointID) dJointGetPRPosition;
    dReal function(dJointID) dJointGetPRPositionRate;
    dReal function(dJointID) dJointGetPRAngle;
    dReal function(dJointID) dJointGetPRAngleRate;
    void function(dJointID, dVector3) dJointGetPRAxis1;
    void function(dJointID, dVector3) dJointGetPRAxis2;
    dReal function(dJointID, int) dJointGetPRParam;
    void function(dJointID, dVector3) dJointGetPUAnchor;
    dReal function(dJointID) dJointGetPUPosition;
    dReal function(dJointID) dJointGetPUPositionRate;
    void function(dJointID, dVector3) dJointGetPUAxis1;
    void function(dJointID, dVector3) dJointGetPUAxis2;
    void function(dJointID, dVector3) dJointGetPUAxis3;
    void function(dJointID, dVector3) dJointGetPUAxisP;
    void function(dJointID, dReal*, dReal*) dJointGetPUAngles;
    dReal function(dJointID) dJointGetPUAngle1;
    dReal function(dJointID) dJointGetPUAngle1Rate;
    dReal function(dJointID) dJointGetPUAngle2;
    dReal function(dJointID) dJointGetPUAngle2Rate;
    dReal function(dJointID, int) dJointGetPUParam;
    dReal function(dJointID) dJointGetPistonPosition;
    dReal function(dJointID) dJointGetPistonPositionRate;
    dReal function(dJointID) dJointGetPistonAngle;
    dReal function(dJointID) dJointGetPistonAngleRate;
    void function(dJointID, dVector3) dJointGetPistonAnchor;
    void function(dJointID, dVector3) dJointGetPistonAnchor2;
    void function(dJointID, dVector3) dJointGetPistonAxis;
    dReal function(dJointID, int) dJointGetPistonParam;
    int function(dJointID) dJointGetAMotorNumAxes;
    void function(dJointID, int, dVector3) dJointGetAMotorAxis;
    int function(dJointID, int) dJointGetAMotorAxisRel;
    dReal function(dJointID, int) dJointGetAMotorAngle;
    dReal function(dJointID, int) dJointGetAMotorAngleRate;
    dReal function(dJointID, int) dJointGetAMotorParam;
    int function(dJointID) dJointGetAMotorMode;
    int function(dJointID) dJointGetLMotorNumAxes;
    void function(dJointID, int, dVector3) dJointGetLMotorAxis;
    dReal function(dJointID, int) dJointGetLMotorParam;
    dReal function(dJointID, int) dJointGetFixedParam;
    dJointID function(dBodyID, dBodyID) dConnectingJoint;
    int function(dBodyID, dBodyID, dJointID*) dConnectingJointList;
    int function(dBodyID, dBodyID) dAreConnected;
    int function(dBodyID, dBodyID, int) dAreConnectedExcluding;

    // odeinit.h
    void function() dInitODE;
    int function(uint) dInitODE2;
    int function(uint) dAllocateODEDataForThread;
    void function() dCleanupODEAllDataForThread;
    void function() dCloseODE;

    // rotation.h
    void function(dMatrix3) dRSetIdentity;
    void function(dMatrix3, dReal, dReal, dReal, dReal) dRFromAxisAndAngle;
    void function(dMatrix3, dReal, dReal, dReal) dRFromEulerAngles;
    void function(dMatrix3, dReal, dReal, dReal, dReal, dReal, dReal) dRFrom2Axes;
    void function(dMatrix3, dReal, dReal, dReal) dRFromZAxis;
    void function(dQuaternion) dQSetIdentity;
    void function(dQuaternion, dReal, dReal, dReal, dReal) dQFromAxisAndAngle;
    void function(dQuaternion, in dQuaternion, in dQuaternion) dQMultiply0;
    void function(dQuaternion, in dQuaternion, in dQuaternion) dQMultiply1;
    void function(dQuaternion, in dQuaternion, in dQuaternion) dQMultiply2;
    void function(dQuaternion, in dQuaternion, in dQuaternion) dQMultiply3;
    void function(dMatrix3, in dQuaternion) dRfromQ;
    void function(dQuaternion, in dMatrix3) dQfromR;
    void function(dReal[4], in dVector3, in dQuaternion) dDQfromW;

    // timer.h
    void function(dStopwatch*) dStopwatchReset;
    void function(dStopwatch*) dStopwatchStart;
    void function(dStopwatch*) dStopwatchStop;
    double function(dStopwatch*) dStopwatchTime;
    void function(in char*) dTimerStart;
    void function(in char*) dTimerNow;
    void function() dTimerEnd;
    void function(FILE*, int) dTimerReport;
    double function() dTimerTicksPerSecond;
    double function() dTimerResolution;

    // void function(dWorldID, FILE*, in char*) dWorldExportDIF;
}