X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=world.c;h=9a032bb20173555cfa3d7ca0f56b0bf95448a176;hp=85bc599027fb8187b2acdfe20651a4b103b1689b;hb=a252b31c07fa820178ab39c13e95c354b86107e6;hpb=f68ef7b22979928fb6b8d2ba6b28e14c4caeb7c2 diff --git a/world.c b/world.c index 85bc5990..9a032bb2 100644 --- a/world.c +++ b/world.c @@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // world.c -- world query functions #include "quakedef.h" +#include "clvm_cmds.h" /* @@ -313,6 +314,15 @@ void World_LinkEdict(world_t *world, prvm_edict_t *ent, const vec3_t mins, const // physics engine support //============================================================================ +#ifndef ODE_STATIC +#define ODE_DYNAMIC 1 +#endif + +#if defined(ODE_STATIC) || defined(ODE_DYNAMIC) +#define USEODE 1 +#endif + +#ifdef USEODE cvar_t physics_ode_quadtree_depth = {0, "physics_ode_quadtree_depth","5", "desired subdivision level of quadtree culling space"}; cvar_t physics_ode_contactsurfacelayer = {0, "physics_ode_contactsurfacelayer","0", "allows objects to overlap this many units to reduce jitter"}; cvar_t physics_ode_worldquickstep = {0, "physics_ode_worldquickstep","1", "use dWorldQuickStep rather than dWorldStepFast1 or dWorldStep"}; @@ -322,6 +332,8 @@ cvar_t physics_ode_worldstepfast_iterations = {0, "physics_ode_worldstepfast_ite cvar_t physics_ode_contact_mu = {0, "physics_ode_contact_mu", "1", "contact solver mu parameter - friction pyramid approximation 1 (see ODE User Guide)"}; cvar_t physics_ode_contact_erp = {0, "physics_ode_contact_erp", "0.96", "contact solver erp parameter - Error Restitution Percent (see ODE User Guide)"}; cvar_t physics_ode_contact_cfm = {0, "physics_ode_contact_cfm", "0", "contact solver cfm parameter - Constraint Force Mixing (see ODE User Guide)"}; +cvar_t physics_ode_world_erp = {0, "physics_ode_world_erp", "-1", "world solver erp parameter - Error Restitution Percent (see ODE User Guide); use defaults when set to -1"}; +cvar_t physics_ode_world_cfm = {0, "physics_ode_world_cfm", "-1", "world solver cfm parameter - Constraint Force Mixing (see ODE User Guide); not touched when -1"}; cvar_t physics_ode_iterationsperframe = {0, "physics_ode_iterationsperframe", "4", "divisor for time step, runs multiple physics steps per frame"}; cvar_t physics_ode_movelimit = {0, "physics_ode_movelimit", "0.5", "clamp velocity if a single move would exceed this percentage of object thickness, to prevent flying through walls"}; cvar_t physics_ode_spinlimit = {0, "physics_ode_spinlimit", "10000", "reset spin velocity if it gets too large"}; @@ -329,20 +341,12 @@ cvar_t physics_ode_spinlimit = {0, "physics_ode_spinlimit", "10000", "reset spin // LordHavoc: this large chunk of definitions comes from the ODE library // include files. -//#ifndef ODE_STATIC -//#define ODE_DYNAMIC 1 -//#endif - -#if defined(ODE_STATIC) || defined(ODE_DYNAMIC) -#define USEODE 1 -#endif - -#ifdef USEODE #ifdef ODE_STATIC #include "ode/ode.h" #else #ifdef WINAPI -#define ODE_API WINAPI +// ODE does not use WINAPI +#define ODE_API #else #define ODE_API #endif @@ -476,427 +480,428 @@ typedef void dNearCallback (void *data, dGeomID o1, dGeomID o2); #define dSAP_AXES_ZXY ((2)|(0<<2)|(1<<4)) #define dSAP_AXES_ZYX ((2)|(1<<2)|(0<<4)) -ODE_API const char* (*dGetConfiguration)(void); -ODE_API int (*dCheckConfiguration)( const char* token ); -ODE_API int (*dInitODE2)(unsigned int uiInitFlags); -ODE_API int (*dAllocateODEDataForThread)(unsigned int uiAllocateFlags); -ODE_API void (*dCleanupODEAllDataForThread)(void); -ODE_API void (*dCloseODE)(void); - -//ODE_API int (*dMassCheck)(const dMass *m); -//ODE_API void (*dMassSetZero)(dMass *); -//ODE_API void (*dMassSetParameters)(dMass *, dReal themass, dReal cgx, dReal cgy, dReal cgz, dReal I11, dReal I22, dReal I33, dReal I12, dReal I13, dReal I23); -//ODE_API void (*dMassSetSphere)(dMass *, dReal density, dReal radius); -ODE_API void (*dMassSetSphereTotal)(dMass *, dReal total_mass, dReal radius); -//ODE_API void (*dMassSetCapsule)(dMass *, dReal density, int direction, dReal radius, dReal length); -ODE_API void (*dMassSetCapsuleTotal)(dMass *, dReal total_mass, int direction, dReal radius, dReal length); -//ODE_API void (*dMassSetCylinder)(dMass *, dReal density, int direction, dReal radius, dReal length); -//ODE_API void (*dMassSetCylinderTotal)(dMass *, dReal total_mass, int direction, dReal radius, dReal length); -//ODE_API void (*dMassSetBox)(dMass *, dReal density, dReal lx, dReal ly, dReal lz); -ODE_API void (*dMassSetBoxTotal)(dMass *, dReal total_mass, dReal lx, dReal ly, dReal lz); -//ODE_API void (*dMassSetTrimesh)(dMass *, dReal density, dGeomID g); -//ODE_API void (*dMassSetTrimeshTotal)(dMass *m, dReal total_mass, dGeomID g); -//ODE_API void (*dMassAdjust)(dMass *, dReal newmass); -//ODE_API void (*dMassTranslate)(dMass *, dReal x, dReal y, dReal z); -//ODE_API void (*dMassRotate)(dMass *, const dMatrix3 R); -//ODE_API void (*dMassAdd)(dMass *a, const dMass *b); +//const char* (ODE_API *dGetConfiguration)(void); +//int (ODE_API *dCheckConfiguration)( const char* token ); +int (ODE_API *dInitODE)(void); +//int (ODE_API *dInitODE2)(unsigned int uiInitFlags); +//int (ODE_API *dAllocateODEDataForThread)(unsigned int uiAllocateFlags); +//void (ODE_API *dCleanupODEAllDataForThread)(void); +void (ODE_API *dCloseODE)(void); + +//int (ODE_API *dMassCheck)(const dMass *m); +//void (ODE_API *dMassSetZero)(dMass *); +//void (ODE_API *dMassSetParameters)(dMass *, dReal themass, dReal cgx, dReal cgy, dReal cgz, dReal I11, dReal I22, dReal I33, dReal I12, dReal I13, dReal I23); +//void (ODE_API *dMassSetSphere)(dMass *, dReal density, dReal radius); +void (ODE_API *dMassSetSphereTotal)(dMass *, dReal total_mass, dReal radius); +//void (ODE_API *dMassSetCapsule)(dMass *, dReal density, int direction, dReal radius, dReal length); +void (ODE_API *dMassSetCapsuleTotal)(dMass *, dReal total_mass, int direction, dReal radius, dReal length); +//void (ODE_API *dMassSetCylinder)(dMass *, dReal density, int direction, dReal radius, dReal length); +//void (ODE_API *dMassSetCylinderTotal)(dMass *, dReal total_mass, int direction, dReal radius, dReal length); +//void (ODE_API *dMassSetBox)(dMass *, dReal density, dReal lx, dReal ly, dReal lz); +void (ODE_API *dMassSetBoxTotal)(dMass *, dReal total_mass, dReal lx, dReal ly, dReal lz); +//void (ODE_API *dMassSetTrimesh)(dMass *, dReal density, dGeomID g); +//void (ODE_API *dMassSetTrimeshTotal)(dMass *m, dReal total_mass, dGeomID g); +//void (ODE_API *dMassAdjust)(dMass *, dReal newmass); +//void (ODE_API *dMassTranslate)(dMass *, dReal x, dReal y, dReal z); +//void (ODE_API *dMassRotate)(dMass *, const dMatrix3 R); +//void (ODE_API *dMassAdd)(dMass *a, const dMass *b); // -ODE_API dWorldID (*dWorldCreate)(void); -ODE_API void (*dWorldDestroy)(dWorldID world); -ODE_API void (*dWorldSetGravity)(dWorldID, dReal x, dReal y, dReal z); -//ODE_API void (*dWorldGetGravity)(dWorldID, dVector3 gravity); -//ODE_API void (*dWorldSetERP)(dWorldID, dReal erp); -//ODE_API dReal (*dWorldGetERP)(dWorldID); -//ODE_API void (*dWorldSetCFM)(dWorldID, dReal cfm); -//ODE_API dReal (*dWorldGetCFM)(dWorldID); -ODE_API void (*dWorldStep)(dWorldID, dReal stepsize); -//ODE_API void (*dWorldImpulseToForce)(dWorldID, dReal stepsize, dReal ix, dReal iy, dReal iz, dVector3 force); -ODE_API void (*dWorldQuickStep)(dWorldID w, dReal stepsize); -ODE_API void (*dWorldSetQuickStepNumIterations)(dWorldID, int num); -//ODE_API int (*dWorldGetQuickStepNumIterations)(dWorldID); -//ODE_API void (*dWorldSetQuickStepW)(dWorldID, dReal over_relaxation); -//ODE_API dReal (*dWorldGetQuickStepW)(dWorldID); -//ODE_API void (*dWorldSetContactMaxCorrectingVel)(dWorldID, dReal vel); -//ODE_API dReal (*dWorldGetContactMaxCorrectingVel)(dWorldID); -ODE_API void (*dWorldSetContactSurfaceLayer)(dWorldID, dReal depth); -//ODE_API dReal (*dWorldGetContactSurfaceLayer)(dWorldID); -ODE_API void (*dWorldStepFast1)(dWorldID, dReal stepsize, int maxiterations); -//ODE_API void (*dWorldSetAutoEnableDepthSF1)(dWorldID, int autoEnableDepth); -//ODE_API int (*dWorldGetAutoEnableDepthSF1)(dWorldID); -//ODE_API dReal (*dWorldGetAutoDisableLinearThreshold)(dWorldID); -//ODE_API void (*dWorldSetAutoDisableLinearThreshold)(dWorldID, dReal linear_threshold); -//ODE_API dReal (*dWorldGetAutoDisableAngularThreshold)(dWorldID); -//ODE_API void (*dWorldSetAutoDisableAngularThreshold)(dWorldID, dReal angular_threshold); -//ODE_API dReal (*dWorldGetAutoDisableLinearAverageThreshold)(dWorldID); -//ODE_API void (*dWorldSetAutoDisableLinearAverageThreshold)(dWorldID, dReal linear_average_threshold); -//ODE_API dReal (*dWorldGetAutoDisableAngularAverageThreshold)(dWorldID); -//ODE_API void (*dWorldSetAutoDisableAngularAverageThreshold)(dWorldID, dReal angular_average_threshold); -//ODE_API int (*dWorldGetAutoDisableAverageSamplesCount)(dWorldID); -//ODE_API void (*dWorldSetAutoDisableAverageSamplesCount)(dWorldID, unsigned int average_samples_count ); -//ODE_API int (*dWorldGetAutoDisableSteps)(dWorldID); -//ODE_API void (*dWorldSetAutoDisableSteps)(dWorldID, int steps); -//ODE_API dReal (*dWorldGetAutoDisableTime)(dWorldID); -//ODE_API void (*dWorldSetAutoDisableTime)(dWorldID, dReal time); -//ODE_API int (*dWorldGetAutoDisableFlag)(dWorldID); -//ODE_API void (*dWorldSetAutoDisableFlag)(dWorldID, int do_auto_disable); -//ODE_API dReal (*dWorldGetLinearDampingThreshold)(dWorldID w); -//ODE_API void (*dWorldSetLinearDampingThreshold)(dWorldID w, dReal threshold); -//ODE_API dReal (*dWorldGetAngularDampingThreshold)(dWorldID w); -//ODE_API void (*dWorldSetAngularDampingThreshold)(dWorldID w, dReal threshold); -//ODE_API dReal (*dWorldGetLinearDamping)(dWorldID w); -//ODE_API void (*dWorldSetLinearDamping)(dWorldID w, dReal scale); -//ODE_API dReal (*dWorldGetAngularDamping)(dWorldID w); -//ODE_API void (*dWorldSetAngularDamping)(dWorldID w, dReal scale); -//ODE_API void (*dWorldSetDamping)(dWorldID w, dReal linear_scale, dReal angular_scale); -//ODE_API dReal (*dWorldGetMaxAngularSpeed)(dWorldID w); -//ODE_API void (*dWorldSetMaxAngularSpeed)(dWorldID w, dReal max_speed); -//ODE_API dReal (*dBodyGetAutoDisableLinearThreshold)(dBodyID); -//ODE_API void (*dBodySetAutoDisableLinearThreshold)(dBodyID, dReal linear_average_threshold); -//ODE_API dReal (*dBodyGetAutoDisableAngularThreshold)(dBodyID); -//ODE_API void (*dBodySetAutoDisableAngularThreshold)(dBodyID, dReal angular_average_threshold); -//ODE_API int (*dBodyGetAutoDisableAverageSamplesCount)(dBodyID); -//ODE_API void (*dBodySetAutoDisableAverageSamplesCount)(dBodyID, unsigned int average_samples_count); -//ODE_API int (*dBodyGetAutoDisableSteps)(dBodyID); -//ODE_API void (*dBodySetAutoDisableSteps)(dBodyID, int steps); -//ODE_API dReal (*dBodyGetAutoDisableTime)(dBodyID); -//ODE_API void (*dBodySetAutoDisableTime)(dBodyID, dReal time); -//ODE_API int (*dBodyGetAutoDisableFlag)(dBodyID); -//ODE_API void (*dBodySetAutoDisableFlag)(dBodyID, int do_auto_disable); -//ODE_API void (*dBodySetAutoDisableDefaults)(dBodyID); -//ODE_API dWorldID (*dBodyGetWorld)(dBodyID); -ODE_API dBodyID (*dBodyCreate)(dWorldID); -ODE_API void (*dBodyDestroy)(dBodyID); -ODE_API void (*dBodySetData)(dBodyID, void *data); -//ODE_API void * (*dBodyGetData)(dBodyID); -ODE_API void (*dBodySetPosition)(dBodyID, dReal x, dReal y, dReal z); -ODE_API void (*dBodySetRotation)(dBodyID, const dMatrix3 R); -//ODE_API void (*dBodySetQuaternion)(dBodyID, const dQuaternion q); -ODE_API void (*dBodySetLinearVel)(dBodyID, dReal x, dReal y, dReal z); -ODE_API void (*dBodySetAngularVel)(dBodyID, dReal x, dReal y, dReal z); -ODE_API const dReal * (*dBodyGetPosition)(dBodyID); -//ODE_API void (*dBodyCopyPosition)(dBodyID body, dVector3 pos); -ODE_API const dReal * (*dBodyGetRotation)(dBodyID); -//ODE_API void (*dBodyCopyRotation)(dBodyID, dMatrix3 R); -//ODE_API const dReal * (*dBodyGetQuaternion)(dBodyID); -//ODE_API void (*dBodyCopyQuaternion)(dBodyID body, dQuaternion quat); -ODE_API const dReal * (*dBodyGetLinearVel)(dBodyID); -ODE_API const dReal * (*dBodyGetAngularVel)(dBodyID); -ODE_API void (*dBodySetMass)(dBodyID, const dMass *mass); -//ODE_API void (*dBodyGetMass)(dBodyID, dMass *mass); -//ODE_API void (*dBodyAddForce)(dBodyID, dReal fx, dReal fy, dReal fz); -//ODE_API void (*dBodyAddTorque)(dBodyID, dReal fx, dReal fy, dReal fz); -//ODE_API void (*dBodyAddRelForce)(dBodyID, dReal fx, dReal fy, dReal fz); -//ODE_API void (*dBodyAddRelTorque)(dBodyID, dReal fx, dReal fy, dReal fz); -//ODE_API void (*dBodyAddForceAtPos)(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); -//ODE_API void (*dBodyAddForceAtRelPos)(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); -//ODE_API void (*dBodyAddRelForceAtPos)(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); -//ODE_API void (*dBodyAddRelForceAtRelPos)(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); -//ODE_API const dReal * (*dBodyGetForce)(dBodyID); -//ODE_API const dReal * (*dBodyGetTorque)(dBodyID); -//ODE_API void (*dBodySetForce)(dBodyID b, dReal x, dReal y, dReal z); -//ODE_API void (*dBodySetTorque)(dBodyID b, dReal x, dReal y, dReal z); -//ODE_API void (*dBodyGetRelPointPos)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); -//ODE_API void (*dBodyGetRelPointVel)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); -//ODE_API void (*dBodyGetPointVel)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); -//ODE_API void (*dBodyGetPosRelPoint)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); -//ODE_API void (*dBodyVectorToWorld)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); -//ODE_API void (*dBodyVectorFromWorld)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); -//ODE_API void (*dBodySetFiniteRotationMode)(dBodyID, int mode); -//ODE_API void (*dBodySetFiniteRotationAxis)(dBodyID, dReal x, dReal y, dReal z); -//ODE_API int (*dBodyGetFiniteRotationMode)(dBodyID); -//ODE_API void (*dBodyGetFiniteRotationAxis)(dBodyID, dVector3 result); -//ODE_API int (*dBodyGetNumJoints)(dBodyID b); -//ODE_API dJointID (*dBodyGetJoint)(dBodyID, int index); -//ODE_API void (*dBodySetDynamic)(dBodyID); -//ODE_API void (*dBodySetKinematic)(dBodyID); -//ODE_API int (*dBodyIsKinematic)(dBodyID); -//ODE_API void (*dBodyEnable)(dBodyID); -//ODE_API void (*dBodyDisable)(dBodyID); -//ODE_API int (*dBodyIsEnabled)(dBodyID); -//ODE_API void (*dBodySetGravityMode)(dBodyID b, int mode); -//ODE_API int (*dBodyGetGravityMode)(dBodyID b); -//ODE_API void (*dBodySetMovedCallback)(dBodyID b, void(*callback)(dBodyID)); -//ODE_API dGeomID (*dBodyGetFirstGeom)(dBodyID b); -//ODE_API dGeomID (*dBodyGetNextGeom)(dGeomID g); -//ODE_API void (*dBodySetDampingDefaults)(dBodyID b); -//ODE_API dReal (*dBodyGetLinearDamping)(dBodyID b); -//ODE_API void (*dBodySetLinearDamping)(dBodyID b, dReal scale); -//ODE_API dReal (*dBodyGetAngularDamping)(dBodyID b); -//ODE_API void (*dBodySetAngularDamping)(dBodyID b, dReal scale); -//ODE_API void (*dBodySetDamping)(dBodyID b, dReal linear_scale, dReal angular_scale); -//ODE_API dReal (*dBodyGetLinearDampingThreshold)(dBodyID b); -//ODE_API void (*dBodySetLinearDampingThreshold)(dBodyID b, dReal threshold); -//ODE_API dReal (*dBodyGetAngularDampingThreshold)(dBodyID b); -//ODE_API void (*dBodySetAngularDampingThreshold)(dBodyID b, dReal threshold); -//ODE_API dReal (*dBodyGetMaxAngularSpeed)(dBodyID b); -//ODE_API void (*dBodySetMaxAngularSpeed)(dBodyID b, dReal max_speed); -//ODE_API int (*dBodyGetGyroscopicMode)(dBodyID b); -//ODE_API void (*dBodySetGyroscopicMode)(dBodyID b, int enabled); -//ODE_API dJointID (*dJointCreateBall)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreateHinge)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreateSlider)(dWorldID, dJointGroupID); -ODE_API dJointID (*dJointCreateContact)(dWorldID, dJointGroupID, const dContact *); -//ODE_API dJointID (*dJointCreateHinge2)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreateUniversal)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreatePR)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreatePU)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreatePiston)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreateFixed)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreateNull)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreateAMotor)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreateLMotor)(dWorldID, dJointGroupID); -//ODE_API dJointID (*dJointCreatePlane2D)(dWorldID, dJointGroupID); -//ODE_API void (*dJointDestroy)(dJointID); -ODE_API dJointGroupID (*dJointGroupCreate)(int max_size); -ODE_API void (*dJointGroupDestroy)(dJointGroupID); -ODE_API void (*dJointGroupEmpty)(dJointGroupID); -//ODE_API int (*dJointGetNumBodies)(dJointID); -ODE_API void (*dJointAttach)(dJointID, dBodyID body1, dBodyID body2); -//ODE_API void (*dJointEnable)(dJointID); -//ODE_API void (*dJointDisable)(dJointID); -//ODE_API int (*dJointIsEnabled)(dJointID); -//ODE_API void (*dJointSetData)(dJointID, void *data); -//ODE_API void * (*dJointGetData)(dJointID); -//ODE_API dJointType (*dJointGetType)(dJointID); -//ODE_API dBodyID (*dJointGetBody)(dJointID, int index); -//ODE_API void (*dJointSetFeedback)(dJointID, dJointFeedback *); -//ODE_API dJointFeedback *(*dJointGetFeedback)(dJointID); -//ODE_API void (*dJointSetBallAnchor)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetBallAnchor2)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetBallParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointSetHingeAnchor)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetHingeAnchorDelta)(dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); -//ODE_API void (*dJointSetHingeAxis)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetHingeAxisOffset)(dJointID j, dReal x, dReal y, dReal z, dReal angle); -//ODE_API void (*dJointSetHingeParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointAddHingeTorque)(dJointID joint, dReal torque); -//ODE_API void (*dJointSetSliderAxis)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetSliderAxisDelta)(dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); -//ODE_API void (*dJointSetSliderParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointAddSliderForce)(dJointID joint, dReal force); -//ODE_API void (*dJointSetHinge2Anchor)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetHinge2Axis1)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetHinge2Axis2)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetHinge2Param)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointAddHinge2Torques)(dJointID joint, dReal torque1, dReal torque2); -//ODE_API void (*dJointSetUniversalAnchor)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetUniversalAxis1)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetUniversalAxis1Offset)(dJointID, dReal x, dReal y, dReal z, dReal offset1, dReal offset2); -//ODE_API void (*dJointSetUniversalAxis2)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetUniversalAxis2Offset)(dJointID, dReal x, dReal y, dReal z, dReal offset1, dReal offset2); -//ODE_API void (*dJointSetUniversalParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointAddUniversalTorques)(dJointID joint, dReal torque1, dReal torque2); -//ODE_API void (*dJointSetPRAnchor)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetPRAxis1)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetPRAxis2)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetPRParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointAddPRTorque)(dJointID j, dReal torque); -//ODE_API void (*dJointSetPUAnchor)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetPUAnchorOffset)(dJointID, dReal x, dReal y, dReal z, dReal dx, dReal dy, dReal dz); -//ODE_API void (*dJointSetPUAxis1)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetPUAxis2)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetPUAxis3)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetPUAxisP)(dJointID id, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetPUParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointAddPUTorque)(dJointID j, dReal torque); -//ODE_API void (*dJointSetPistonAnchor)(dJointID, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetPistonAnchorOffset)(dJointID j, dReal x, dReal y, dReal z, dReal dx, dReal dy, dReal dz); -//ODE_API void (*dJointSetPistonParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointAddPistonForce)(dJointID joint, dReal force); -//ODE_API void (*dJointSetFixed)(dJointID); -//ODE_API void (*dJointSetFixedParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointSetAMotorNumAxes)(dJointID, int num); -//ODE_API void (*dJointSetAMotorAxis)(dJointID, int anum, int rel, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetAMotorAngle)(dJointID, int anum, dReal angle); -//ODE_API void (*dJointSetAMotorParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointSetAMotorMode)(dJointID, int mode); -//ODE_API void (*dJointAddAMotorTorques)(dJointID, dReal torque1, dReal torque2, dReal torque3); -//ODE_API void (*dJointSetLMotorNumAxes)(dJointID, int num); -//ODE_API void (*dJointSetLMotorAxis)(dJointID, int anum, int rel, dReal x, dReal y, dReal z); -//ODE_API void (*dJointSetLMotorParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointSetPlane2DXParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointSetPlane2DYParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointSetPlane2DAngleParam)(dJointID, int parameter, dReal value); -//ODE_API void (*dJointGetBallAnchor)(dJointID, dVector3 result); -//ODE_API void (*dJointGetBallAnchor2)(dJointID, dVector3 result); -//ODE_API dReal (*dJointGetBallParam)(dJointID, int parameter); -//ODE_API void (*dJointGetHingeAnchor)(dJointID, dVector3 result); -//ODE_API void (*dJointGetHingeAnchor2)(dJointID, dVector3 result); -//ODE_API void (*dJointGetHingeAxis)(dJointID, dVector3 result); -//ODE_API dReal (*dJointGetHingeParam)(dJointID, int parameter); -//ODE_API dReal (*dJointGetHingeAngle)(dJointID); -//ODE_API dReal (*dJointGetHingeAngleRate)(dJointID); -//ODE_API dReal (*dJointGetSliderPosition)(dJointID); -//ODE_API dReal (*dJointGetSliderPositionRate)(dJointID); -//ODE_API void (*dJointGetSliderAxis)(dJointID, dVector3 result); -//ODE_API dReal (*dJointGetSliderParam)(dJointID, int parameter); -//ODE_API void (*dJointGetHinge2Anchor)(dJointID, dVector3 result); -//ODE_API void (*dJointGetHinge2Anchor2)(dJointID, dVector3 result); -//ODE_API void (*dJointGetHinge2Axis1)(dJointID, dVector3 result); -//ODE_API void (*dJointGetHinge2Axis2)(dJointID, dVector3 result); -//ODE_API dReal (*dJointGetHinge2Param)(dJointID, int parameter); -//ODE_API dReal (*dJointGetHinge2Angle1)(dJointID); -//ODE_API dReal (*dJointGetHinge2Angle1Rate)(dJointID); -//ODE_API dReal (*dJointGetHinge2Angle2Rate)(dJointID); -//ODE_API void (*dJointGetUniversalAnchor)(dJointID, dVector3 result); -//ODE_API void (*dJointGetUniversalAnchor2)(dJointID, dVector3 result); -//ODE_API void (*dJointGetUniversalAxis1)(dJointID, dVector3 result); -//ODE_API void (*dJointGetUniversalAxis2)(dJointID, dVector3 result); -//ODE_API dReal (*dJointGetUniversalParam)(dJointID, int parameter); -//ODE_API void (*dJointGetUniversalAngles)(dJointID, dReal *angle1, dReal *angle2); -//ODE_API dReal (*dJointGetUniversalAngle1)(dJointID); -//ODE_API dReal (*dJointGetUniversalAngle2)(dJointID); -//ODE_API dReal (*dJointGetUniversalAngle1Rate)(dJointID); -//ODE_API dReal (*dJointGetUniversalAngle2Rate)(dJointID); -//ODE_API void (*dJointGetPRAnchor)(dJointID, dVector3 result); -//ODE_API dReal (*dJointGetPRPosition)(dJointID); -//ODE_API dReal (*dJointGetPRPositionRate)(dJointID); -//ODE_API dReal (*dJointGetPRAngle)(dJointID); -//ODE_API dReal (*dJointGetPRAngleRate)(dJointID); -//ODE_API void (*dJointGetPRAxis1)(dJointID, dVector3 result); -//ODE_API void (*dJointGetPRAxis2)(dJointID, dVector3 result); -//ODE_API dReal (*dJointGetPRParam)(dJointID, int parameter); -//ODE_API void (*dJointGetPUAnchor)(dJointID, dVector3 result); -//ODE_API dReal (*dJointGetPUPosition)(dJointID); -//ODE_API dReal (*dJointGetPUPositionRate)(dJointID); -//ODE_API void (*dJointGetPUAxis1)(dJointID, dVector3 result); -//ODE_API void (*dJointGetPUAxis2)(dJointID, dVector3 result); -//ODE_API void (*dJointGetPUAxis3)(dJointID, dVector3 result); -//ODE_API void (*dJointGetPUAxisP)(dJointID id, dVector3 result); -//ODE_API void (*dJointGetPUAngles)(dJointID, dReal *angle1, dReal *angle2); -//ODE_API dReal (*dJointGetPUAngle1)(dJointID); -//ODE_API dReal (*dJointGetPUAngle1Rate)(dJointID); -//ODE_API dReal (*dJointGetPUAngle2)(dJointID); -//ODE_API dReal (*dJointGetPUAngle2Rate)(dJointID); -//ODE_API dReal (*dJointGetPUParam)(dJointID, int parameter); -//ODE_API dReal (*dJointGetPistonPosition)(dJointID); -//ODE_API dReal (*dJointGetPistonPositionRate)(dJointID); -//ODE_API dReal (*dJointGetPistonAngle)(dJointID); -//ODE_API dReal (*dJointGetPistonAngleRate)(dJointID); -//ODE_API void (*dJointGetPistonAnchor)(dJointID, dVector3 result); -//ODE_API void (*dJointGetPistonAnchor2)(dJointID, dVector3 result); -//ODE_API void (*dJointGetPistonAxis)(dJointID, dVector3 result); -//ODE_API dReal (*dJointGetPistonParam)(dJointID, int parameter); -//ODE_API int (*dJointGetAMotorNumAxes)(dJointID); -//ODE_API void (*dJointGetAMotorAxis)(dJointID, int anum, dVector3 result); -//ODE_API int (*dJointGetAMotorAxisRel)(dJointID, int anum); -//ODE_API dReal (*dJointGetAMotorAngle)(dJointID, int anum); -//ODE_API dReal (*dJointGetAMotorAngleRate)(dJointID, int anum); -//ODE_API dReal (*dJointGetAMotorParam)(dJointID, int parameter); -//ODE_API int (*dJointGetAMotorMode)(dJointID); -//ODE_API int (*dJointGetLMotorNumAxes)(dJointID); -//ODE_API void (*dJointGetLMotorAxis)(dJointID, int anum, dVector3 result); -//ODE_API dReal (*dJointGetLMotorParam)(dJointID, int parameter); -//ODE_API dReal (*dJointGetFixedParam)(dJointID, int parameter); -//ODE_API dJointID (*dConnectingJoint)(dBodyID, dBodyID); -//ODE_API int (*dConnectingJointList)(dBodyID, dBodyID, dJointID*); -ODE_API int (*dAreConnected)(dBodyID, dBodyID); -ODE_API int (*dAreConnectedExcluding)(dBodyID body1, dBodyID body2, int joint_type); +dWorldID (ODE_API *dWorldCreate)(void); +void (ODE_API *dWorldDestroy)(dWorldID world); +void (ODE_API *dWorldSetGravity)(dWorldID, dReal x, dReal y, dReal z); +void (ODE_API *dWorldGetGravity)(dWorldID, dVector3 gravity); +//void (ODE_API *dWorldSetERP)(dWorldID, dReal erp); +//dReal (ODE_API *dWorldGetERP)(dWorldID); +//void (ODE_API *dWorldSetCFM)(dWorldID, dReal cfm); +//dReal (ODE_API *dWorldGetCFM)(dWorldID); +void (ODE_API *dWorldStep)(dWorldID, dReal stepsize); +//void (ODE_API *dWorldImpulseToForce)(dWorldID, dReal stepsize, dReal ix, dReal iy, dReal iz, dVector3 force); +void (ODE_API *dWorldQuickStep)(dWorldID w, dReal stepsize); +void (ODE_API *dWorldSetQuickStepNumIterations)(dWorldID, int num); +//int (ODE_API *dWorldGetQuickStepNumIterations)(dWorldID); +//void (ODE_API *dWorldSetQuickStepW)(dWorldID, dReal over_relaxation); +//dReal (ODE_API *dWorldGetQuickStepW)(dWorldID); +//void (ODE_API *dWorldSetContactMaxCorrectingVel)(dWorldID, dReal vel); +//dReal (ODE_API *dWorldGetContactMaxCorrectingVel)(dWorldID); +void (ODE_API *dWorldSetContactSurfaceLayer)(dWorldID, dReal depth); +//dReal (ODE_API *dWorldGetContactSurfaceLayer)(dWorldID); +void (ODE_API *dWorldStepFast1)(dWorldID, dReal stepsize, int maxiterations); +//void (ODE_API *dWorldSetAutoEnableDepthSF1)(dWorldID, int autoEnableDepth); +//int (ODE_API *dWorldGetAutoEnableDepthSF1)(dWorldID); +//dReal (ODE_API *dWorldGetAutoDisableLinearThreshold)(dWorldID); +//void (ODE_API *dWorldSetAutoDisableLinearThreshold)(dWorldID, dReal linear_threshold); +//dReal (ODE_API *dWorldGetAutoDisableAngularThreshold)(dWorldID); +//void (ODE_API *dWorldSetAutoDisableAngularThreshold)(dWorldID, dReal angular_threshold); +//dReal (ODE_API *dWorldGetAutoDisableLinearAverageThreshold)(dWorldID); +//void (ODE_API *dWorldSetAutoDisableLinearAverageThreshold)(dWorldID, dReal linear_average_threshold); +//dReal (ODE_API *dWorldGetAutoDisableAngularAverageThreshold)(dWorldID); +//void (ODE_API *dWorldSetAutoDisableAngularAverageThreshold)(dWorldID, dReal angular_average_threshold); +//int (ODE_API *dWorldGetAutoDisableAverageSamplesCount)(dWorldID); +//void (ODE_API *dWorldSetAutoDisableAverageSamplesCount)(dWorldID, unsigned int average_samples_count ); +//int (ODE_API *dWorldGetAutoDisableSteps)(dWorldID); +//void (ODE_API *dWorldSetAutoDisableSteps)(dWorldID, int steps); +//dReal (ODE_API *dWorldGetAutoDisableTime)(dWorldID); +//void (ODE_API *dWorldSetAutoDisableTime)(dWorldID, dReal time); +//int (ODE_API *dWorldGetAutoDisableFlag)(dWorldID); +//void (ODE_API *dWorldSetAutoDisableFlag)(dWorldID, int do_auto_disable); +//dReal (ODE_API *dWorldGetLinearDampingThreshold)(dWorldID w); +//void (ODE_API *dWorldSetLinearDampingThreshold)(dWorldID w, dReal threshold); +//dReal (ODE_API *dWorldGetAngularDampingThreshold)(dWorldID w); +//void (ODE_API *dWorldSetAngularDampingThreshold)(dWorldID w, dReal threshold); +//dReal (ODE_API *dWorldGetLinearDamping)(dWorldID w); +//void (ODE_API *dWorldSetLinearDamping)(dWorldID w, dReal scale); +//dReal (ODE_API *dWorldGetAngularDamping)(dWorldID w); +//void (ODE_API *dWorldSetAngularDamping)(dWorldID w, dReal scale); +//void (ODE_API *dWorldSetDamping)(dWorldID w, dReal linear_scale, dReal angular_scale); +//dReal (ODE_API *dWorldGetMaxAngularSpeed)(dWorldID w); +//void (ODE_API *dWorldSetMaxAngularSpeed)(dWorldID w, dReal max_speed); +//dReal (ODE_API *dBodyGetAutoDisableLinearThreshold)(dBodyID); +//void (ODE_API *dBodySetAutoDisableLinearThreshold)(dBodyID, dReal linear_average_threshold); +//dReal (ODE_API *dBodyGetAutoDisableAngularThreshold)(dBodyID); +//void (ODE_API *dBodySetAutoDisableAngularThreshold)(dBodyID, dReal angular_average_threshold); +//int (ODE_API *dBodyGetAutoDisableAverageSamplesCount)(dBodyID); +//void (ODE_API *dBodySetAutoDisableAverageSamplesCount)(dBodyID, unsigned int average_samples_count); +//int (ODE_API *dBodyGetAutoDisableSteps)(dBodyID); +//void (ODE_API *dBodySetAutoDisableSteps)(dBodyID, int steps); +//dReal (ODE_API *dBodyGetAutoDisableTime)(dBodyID); +//void (ODE_API *dBodySetAutoDisableTime)(dBodyID, dReal time); +//int (ODE_API *dBodyGetAutoDisableFlag)(dBodyID); +//void (ODE_API *dBodySetAutoDisableFlag)(dBodyID, int do_auto_disable); +//void (ODE_API *dBodySetAutoDisableDefaults)(dBodyID); +//dWorldID (ODE_API *dBodyGetWorld)(dBodyID); +dBodyID (ODE_API *dBodyCreate)(dWorldID); +void (ODE_API *dBodyDestroy)(dBodyID); +void (ODE_API *dBodySetData)(dBodyID, void *data); +void * (ODE_API *dBodyGetData)(dBodyID); +void (ODE_API *dBodySetPosition)(dBodyID, dReal x, dReal y, dReal z); +void (ODE_API *dBodySetRotation)(dBodyID, const dMatrix3 R); +//void (ODE_API *dBodySetQuaternion)(dBodyID, const dQuaternion q); +void (ODE_API *dBodySetLinearVel)(dBodyID, dReal x, dReal y, dReal z); +void (ODE_API *dBodySetAngularVel)(dBodyID, dReal x, dReal y, dReal z); +const dReal * (ODE_API *dBodyGetPosition)(dBodyID); +//void (ODE_API *dBodyCopyPosition)(dBodyID body, dVector3 pos); +const dReal * (ODE_API *dBodyGetRotation)(dBodyID); +//void (ODE_API *dBodyCopyRotation)(dBodyID, dMatrix3 R); +//const dReal * (ODE_API *dBodyGetQuaternion)(dBodyID); +//void (ODE_API *dBodyCopyQuaternion)(dBodyID body, dQuaternion quat); +const dReal * (ODE_API *dBodyGetLinearVel)(dBodyID); +const dReal * (ODE_API *dBodyGetAngularVel)(dBodyID); +void (ODE_API *dBodySetMass)(dBodyID, const dMass *mass); +//void (ODE_API *dBodyGetMass)(dBodyID, dMass *mass); +//void (ODE_API *dBodyAddForce)(dBodyID, dReal fx, dReal fy, dReal fz); +//void (ODE_API *dBodyAddTorque)(dBodyID, dReal fx, dReal fy, dReal fz); +//void (ODE_API *dBodyAddRelForce)(dBodyID, dReal fx, dReal fy, dReal fz); +//void (ODE_API *dBodyAddRelTorque)(dBodyID, dReal fx, dReal fy, dReal fz); +//void (ODE_API *dBodyAddForceAtPos)(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); +//void (ODE_API *dBodyAddForceAtRelPos)(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); +//void (ODE_API *dBodyAddRelForceAtPos)(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); +//void (ODE_API *dBodyAddRelForceAtRelPos)(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz); +//const dReal * (ODE_API *dBodyGetForce)(dBodyID); +//const dReal * (ODE_API *dBodyGetTorque)(dBodyID); +//void (ODE_API *dBodySetForce)(dBodyID b, dReal x, dReal y, dReal z); +//void (ODE_API *dBodySetTorque)(dBodyID b, dReal x, dReal y, dReal z); +//void (ODE_API *dBodyGetRelPointPos)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); +//void (ODE_API *dBodyGetRelPointVel)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); +//void (ODE_API *dBodyGetPointVel)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); +//void (ODE_API *dBodyGetPosRelPoint)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); +//void (ODE_API *dBodyVectorToWorld)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); +//void (ODE_API *dBodyVectorFromWorld)(dBodyID, dReal px, dReal py, dReal pz, dVector3 result); +//void (ODE_API *dBodySetFiniteRotationMode)(dBodyID, int mode); +//void (ODE_API *dBodySetFiniteRotationAxis)(dBodyID, dReal x, dReal y, dReal z); +//int (ODE_API *dBodyGetFiniteRotationMode)(dBodyID); +//void (ODE_API *dBodyGetFiniteRotationAxis)(dBodyID, dVector3 result); +//int (ODE_API *dBodyGetNumJoints)(dBodyID b); +//dJointID (ODE_API *dBodyGetJoint)(dBodyID, int index); +//void (ODE_API *dBodySetDynamic)(dBodyID); +//void (ODE_API *dBodySetKinematic)(dBodyID); +//int (ODE_API *dBodyIsKinematic)(dBodyID); +//void (ODE_API *dBodyEnable)(dBodyID); +//void (ODE_API *dBodyDisable)(dBodyID); +//int (ODE_API *dBodyIsEnabled)(dBodyID); +void (ODE_API *dBodySetGravityMode)(dBodyID b, int mode); +int (ODE_API *dBodyGetGravityMode)(dBodyID b); +//void (*dBodySetMovedCallback)(dBodyID b, void(ODE_API *callback)(dBodyID)); +//dGeomID (ODE_API *dBodyGetFirstGeom)(dBodyID b); +//dGeomID (ODE_API *dBodyGetNextGeom)(dGeomID g); +//void (ODE_API *dBodySetDampingDefaults)(dBodyID b); +//dReal (ODE_API *dBodyGetLinearDamping)(dBodyID b); +//void (ODE_API *dBodySetLinearDamping)(dBodyID b, dReal scale); +//dReal (ODE_API *dBodyGetAngularDamping)(dBodyID b); +//void (ODE_API *dBodySetAngularDamping)(dBodyID b, dReal scale); +//void (ODE_API *dBodySetDamping)(dBodyID b, dReal linear_scale, dReal angular_scale); +//dReal (ODE_API *dBodyGetLinearDampingThreshold)(dBodyID b); +//void (ODE_API *dBodySetLinearDampingThreshold)(dBodyID b, dReal threshold); +//dReal (ODE_API *dBodyGetAngularDampingThreshold)(dBodyID b); +//void (ODE_API *dBodySetAngularDampingThreshold)(dBodyID b, dReal threshold); +//dReal (ODE_API *dBodyGetMaxAngularSpeed)(dBodyID b); +//void (ODE_API *dBodySetMaxAngularSpeed)(dBodyID b, dReal max_speed); +//int (ODE_API *dBodyGetGyroscopicMode)(dBodyID b); +//void (ODE_API *dBodySetGyroscopicMode)(dBodyID b, int enabled); +//dJointID (ODE_API *dJointCreateBall)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreateHinge)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreateSlider)(dWorldID, dJointGroupID); +dJointID (ODE_API *dJointCreateContact)(dWorldID, dJointGroupID, const dContact *); +//dJointID (ODE_API *dJointCreateHinge2)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreateUniversal)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreatePR)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreatePU)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreatePiston)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreateFixed)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreateNull)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreateAMotor)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreateLMotor)(dWorldID, dJointGroupID); +//dJointID (ODE_API *dJointCreatePlane2D)(dWorldID, dJointGroupID); +//void (ODE_API *dJointDestroy)(dJointID); +dJointGroupID (ODE_API *dJointGroupCreate)(int max_size); +void (ODE_API *dJointGroupDestroy)(dJointGroupID); +void (ODE_API *dJointGroupEmpty)(dJointGroupID); +//int (ODE_API *dJointGetNumBodies)(dJointID); +void (ODE_API *dJointAttach)(dJointID, dBodyID body1, dBodyID body2); +//void (ODE_API *dJointEnable)(dJointID); +//void (ODE_API *dJointDisable)(dJointID); +//int (ODE_API *dJointIsEnabled)(dJointID); +//void (ODE_API *dJointSetData)(dJointID, void *data); +//void * (ODE_API *dJointGetData)(dJointID); +//dJointType (ODE_API *dJointGetType)(dJointID); +//dBodyID (ODE_API *dJointGetBody)(dJointID, int index); +//void (ODE_API *dJointSetFeedback)(dJointID, dJointFeedback *); +//dJointFeedback *(ODE_API *dJointGetFeedback)(dJointID); +//void (ODE_API *dJointSetBallAnchor)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetBallAnchor2)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetBallParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointSetHingeAnchor)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetHingeAnchorDelta)(dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); +//void (ODE_API *dJointSetHingeAxis)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetHingeAxisOffset)(dJointID j, dReal x, dReal y, dReal z, dReal angle); +//void (ODE_API *dJointSetHingeParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointAddHingeTorque)(dJointID joint, dReal torque); +//void (ODE_API *dJointSetSliderAxis)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetSliderAxisDelta)(dJointID, dReal x, dReal y, dReal z, dReal ax, dReal ay, dReal az); +//void (ODE_API *dJointSetSliderParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointAddSliderForce)(dJointID joint, dReal force); +//void (ODE_API *dJointSetHinge2Anchor)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetHinge2Axis1)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetHinge2Axis2)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetHinge2Param)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointAddHinge2Torques)(dJointID joint, dReal torque1, dReal torque2); +//void (ODE_API *dJointSetUniversalAnchor)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetUniversalAxis1)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetUniversalAxis1Offset)(dJointID, dReal x, dReal y, dReal z, dReal offset1, dReal offset2); +//void (ODE_API *dJointSetUniversalAxis2)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetUniversalAxis2Offset)(dJointID, dReal x, dReal y, dReal z, dReal offset1, dReal offset2); +//void (ODE_API *dJointSetUniversalParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointAddUniversalTorques)(dJointID joint, dReal torque1, dReal torque2); +//void (ODE_API *dJointSetPRAnchor)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetPRAxis1)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetPRAxis2)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetPRParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointAddPRTorque)(dJointID j, dReal torque); +//void (ODE_API *dJointSetPUAnchor)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetPUAnchorOffset)(dJointID, dReal x, dReal y, dReal z, dReal dx, dReal dy, dReal dz); +//void (ODE_API *dJointSetPUAxis1)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetPUAxis2)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetPUAxis3)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetPUAxisP)(dJointID id, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetPUParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointAddPUTorque)(dJointID j, dReal torque); +//void (ODE_API *dJointSetPistonAnchor)(dJointID, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetPistonAnchorOffset)(dJointID j, dReal x, dReal y, dReal z, dReal dx, dReal dy, dReal dz); +//void (ODE_API *dJointSetPistonParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointAddPistonForce)(dJointID joint, dReal force); +//void (ODE_API *dJointSetFixed)(dJointID); +//void (ODE_API *dJointSetFixedParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointSetAMotorNumAxes)(dJointID, int num); +//void (ODE_API *dJointSetAMotorAxis)(dJointID, int anum, int rel, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetAMotorAngle)(dJointID, int anum, dReal angle); +//void (ODE_API *dJointSetAMotorParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointSetAMotorMode)(dJointID, int mode); +//void (ODE_API *dJointAddAMotorTorques)(dJointID, dReal torque1, dReal torque2, dReal torque3); +//void (ODE_API *dJointSetLMotorNumAxes)(dJointID, int num); +//void (ODE_API *dJointSetLMotorAxis)(dJointID, int anum, int rel, dReal x, dReal y, dReal z); +//void (ODE_API *dJointSetLMotorParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointSetPlane2DXParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointSetPlane2DYParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointSetPlane2DAngleParam)(dJointID, int parameter, dReal value); +//void (ODE_API *dJointGetBallAnchor)(dJointID, dVector3 result); +//void (ODE_API *dJointGetBallAnchor2)(dJointID, dVector3 result); +//dReal (ODE_API *dJointGetBallParam)(dJointID, int parameter); +//void (ODE_API *dJointGetHingeAnchor)(dJointID, dVector3 result); +//void (ODE_API *dJointGetHingeAnchor2)(dJointID, dVector3 result); +//void (ODE_API *dJointGetHingeAxis)(dJointID, dVector3 result); +//dReal (ODE_API *dJointGetHingeParam)(dJointID, int parameter); +//dReal (ODE_API *dJointGetHingeAngle)(dJointID); +//dReal (ODE_API *dJointGetHingeAngleRate)(dJointID); +//dReal (ODE_API *dJointGetSliderPosition)(dJointID); +//dReal (ODE_API *dJointGetSliderPositionRate)(dJointID); +//void (ODE_API *dJointGetSliderAxis)(dJointID, dVector3 result); +//dReal (ODE_API *dJointGetSliderParam)(dJointID, int parameter); +//void (ODE_API *dJointGetHinge2Anchor)(dJointID, dVector3 result); +//void (ODE_API *dJointGetHinge2Anchor2)(dJointID, dVector3 result); +//void (ODE_API *dJointGetHinge2Axis1)(dJointID, dVector3 result); +//void (ODE_API *dJointGetHinge2Axis2)(dJointID, dVector3 result); +//dReal (ODE_API *dJointGetHinge2Param)(dJointID, int parameter); +//dReal (ODE_API *dJointGetHinge2Angle1)(dJointID); +//dReal (ODE_API *dJointGetHinge2Angle1Rate)(dJointID); +//dReal (ODE_API *dJointGetHinge2Angle2Rate)(dJointID); +//void (ODE_API *dJointGetUniversalAnchor)(dJointID, dVector3 result); +//void (ODE_API *dJointGetUniversalAnchor2)(dJointID, dVector3 result); +//void (ODE_API *dJointGetUniversalAxis1)(dJointID, dVector3 result); +//void (ODE_API *dJointGetUniversalAxis2)(dJointID, dVector3 result); +//dReal (ODE_API *dJointGetUniversalParam)(dJointID, int parameter); +//void (ODE_API *dJointGetUniversalAngles)(dJointID, dReal *angle1, dReal *angle2); +//dReal (ODE_API *dJointGetUniversalAngle1)(dJointID); +//dReal (ODE_API *dJointGetUniversalAngle2)(dJointID); +//dReal (ODE_API *dJointGetUniversalAngle1Rate)(dJointID); +//dReal (ODE_API *dJointGetUniversalAngle2Rate)(dJointID); +//void (ODE_API *dJointGetPRAnchor)(dJointID, dVector3 result); +//dReal (ODE_API *dJointGetPRPosition)(dJointID); +//dReal (ODE_API *dJointGetPRPositionRate)(dJointID); +//dReal (ODE_API *dJointGetPRAngle)(dJointID); +//dReal (ODE_API *dJointGetPRAngleRate)(dJointID); +//void (ODE_API *dJointGetPRAxis1)(dJointID, dVector3 result); +//void (ODE_API *dJointGetPRAxis2)(dJointID, dVector3 result); +//dReal (ODE_API *dJointGetPRParam)(dJointID, int parameter); +//void (ODE_API *dJointGetPUAnchor)(dJointID, dVector3 result); +//dReal (ODE_API *dJointGetPUPosition)(dJointID); +//dReal (ODE_API *dJointGetPUPositionRate)(dJointID); +//void (ODE_API *dJointGetPUAxis1)(dJointID, dVector3 result); +//void (ODE_API *dJointGetPUAxis2)(dJointID, dVector3 result); +//void (ODE_API *dJointGetPUAxis3)(dJointID, dVector3 result); +//void (ODE_API *dJointGetPUAxisP)(dJointID id, dVector3 result); +//void (ODE_API *dJointGetPUAngles)(dJointID, dReal *angle1, dReal *angle2); +//dReal (ODE_API *dJointGetPUAngle1)(dJointID); +//dReal (ODE_API *dJointGetPUAngle1Rate)(dJointID); +//dReal (ODE_API *dJointGetPUAngle2)(dJointID); +//dReal (ODE_API *dJointGetPUAngle2Rate)(dJointID); +//dReal (ODE_API *dJointGetPUParam)(dJointID, int parameter); +//dReal (ODE_API *dJointGetPistonPosition)(dJointID); +//dReal (ODE_API *dJointGetPistonPositionRate)(dJointID); +//dReal (ODE_API *dJointGetPistonAngle)(dJointID); +//dReal (ODE_API *dJointGetPistonAngleRate)(dJointID); +//void (ODE_API *dJointGetPistonAnchor)(dJointID, dVector3 result); +//void (ODE_API *dJointGetPistonAnchor2)(dJointID, dVector3 result); +//void (ODE_API *dJointGetPistonAxis)(dJointID, dVector3 result); +//dReal (ODE_API *dJointGetPistonParam)(dJointID, int parameter); +//int (ODE_API *dJointGetAMotorNumAxes)(dJointID); +//void (ODE_API *dJointGetAMotorAxis)(dJointID, int anum, dVector3 result); +//int (ODE_API *dJointGetAMotorAxisRel)(dJointID, int anum); +//dReal (ODE_API *dJointGetAMotorAngle)(dJointID, int anum); +//dReal (ODE_API *dJointGetAMotorAngleRate)(dJointID, int anum); +//dReal (ODE_API *dJointGetAMotorParam)(dJointID, int parameter); +//int (ODE_API *dJointGetAMotorMode)(dJointID); +//int (ODE_API *dJointGetLMotorNumAxes)(dJointID); +//void (ODE_API *dJointGetLMotorAxis)(dJointID, int anum, dVector3 result); +//dReal (ODE_API *dJointGetLMotorParam)(dJointID, int parameter); +//dReal (ODE_API *dJointGetFixedParam)(dJointID, int parameter); +//dJointID (ODE_API *dConnectingJoint)(dBodyID, dBodyID); +//int (ODE_API *dConnectingJointList)(dBodyID, dBodyID, dJointID*); +int (ODE_API *dAreConnected)(dBodyID, dBodyID); +int (ODE_API *dAreConnectedExcluding)(dBodyID body1, dBodyID body2, int joint_type); // -ODE_API dSpaceID (*dSimpleSpaceCreate)(dSpaceID space); -ODE_API dSpaceID (*dHashSpaceCreate)(dSpaceID space); -ODE_API dSpaceID (*dQuadTreeSpaceCreate)(dSpaceID space, const dVector3 Center, const dVector3 Extents, int Depth); -ODE_API dSpaceID (*dSweepAndPruneSpaceCreate)( dSpaceID space, int axisorder ); -ODE_API void (*dSpaceDestroy)(dSpaceID); -//ODE_API void (*dHashSpaceSetLevels)(dSpaceID space, int minlevel, int maxlevel); -//ODE_API void (*dHashSpaceGetLevels)(dSpaceID space, int *minlevel, int *maxlevel); -//ODE_API void (*dSpaceSetCleanup)(dSpaceID space, int mode); -//ODE_API int (*dSpaceGetCleanup)(dSpaceID space); -//ODE_API void (*dSpaceSetSublevel)(dSpaceID space, int sublevel); -//ODE_API int (*dSpaceGetSublevel)(dSpaceID space); -//ODE_API void (*dSpaceSetManualCleanup)(dSpaceID space, int mode); -//ODE_API int (*dSpaceGetManualCleanup)(dSpaceID space); -//ODE_API void (*dSpaceAdd)(dSpaceID, dGeomID); -//ODE_API void (*dSpaceRemove)(dSpaceID, dGeomID); -//ODE_API int (*dSpaceQuery)(dSpaceID, dGeomID); -//ODE_API void (*dSpaceClean)(dSpaceID); -//ODE_API int (*dSpaceGetNumGeoms)(dSpaceID); -//ODE_API dGeomID (*dSpaceGetGeom)(dSpaceID, int i); -//ODE_API int (*dSpaceGetClass)(dSpaceID space); +dSpaceID (ODE_API *dSimpleSpaceCreate)(dSpaceID space); +dSpaceID (ODE_API *dHashSpaceCreate)(dSpaceID space); +dSpaceID (ODE_API *dQuadTreeSpaceCreate)(dSpaceID space, const dVector3 Center, const dVector3 Extents, int Depth); +//dSpaceID (ODE_API *dSweepAndPruneSpaceCreate)( dSpaceID space, int axisorder ); +void (ODE_API *dSpaceDestroy)(dSpaceID); +//void (ODE_API *dHashSpaceSetLevels)(dSpaceID space, int minlevel, int maxlevel); +//void (ODE_API *dHashSpaceGetLevels)(dSpaceID space, int *minlevel, int *maxlevel); +//void (ODE_API *dSpaceSetCleanup)(dSpaceID space, int mode); +//int (ODE_API *dSpaceGetCleanup)(dSpaceID space); +//void (ODE_API *dSpaceSetSublevel)(dSpaceID space, int sublevel); +//int (ODE_API *dSpaceGetSublevel)(dSpaceID space); +//void (ODE_API *dSpaceSetManualCleanup)(dSpaceID space, int mode); +//int (ODE_API *dSpaceGetManualCleanup)(dSpaceID space); +//void (ODE_API *dSpaceAdd)(dSpaceID, dGeomID); +//void (ODE_API *dSpaceRemove)(dSpaceID, dGeomID); +//int (ODE_API *dSpaceQuery)(dSpaceID, dGeomID); +//void (ODE_API *dSpaceClean)(dSpaceID); +//int (ODE_API *dSpaceGetNumGeoms)(dSpaceID); +//dGeomID (ODE_API *dSpaceGetGeom)(dSpaceID, int i); +//int (ODE_API *dSpaceGetClass)(dSpaceID space); // -ODE_API void (*dGeomDestroy)(dGeomID geom); -//ODE_API void (*dGeomSetData)(dGeomID geom, void* data); -//ODE_API void * (*dGeomGetData)(dGeomID geom); -ODE_API void (*dGeomSetBody)(dGeomID geom, dBodyID body); -ODE_API dBodyID (*dGeomGetBody)(dGeomID geom); -//ODE_API void (*dGeomSetPosition)(dGeomID geom, dReal x, dReal y, dReal z); -ODE_API void (*dGeomSetRotation)(dGeomID geom, const dMatrix3 R); -//ODE_API void (*dGeomSetQuaternion)(dGeomID geom, const dQuaternion Q); -//ODE_API const dReal * (*dGeomGetPosition)(dGeomID geom); -//ODE_API void (*dGeomCopyPosition)(dGeomID geom, dVector3 pos); -//ODE_API const dReal * (*dGeomGetRotation)(dGeomID geom); -//ODE_API void (*dGeomCopyRotation)(dGeomID geom, dMatrix3 R); -//ODE_API void (*dGeomGetQuaternion)(dGeomID geom, dQuaternion result); -//ODE_API void (*dGeomGetAABB)(dGeomID geom, dReal aabb[6]); -ODE_API int (*dGeomIsSpace)(dGeomID geom); -//ODE_API dSpaceID (*dGeomGetSpace)(dGeomID); -//ODE_API int (*dGeomGetClass)(dGeomID geom); -//ODE_API void (*dGeomSetCategoryBits)(dGeomID geom, unsigned long bits); -//ODE_API void (*dGeomSetCollideBits)(dGeomID geom, unsigned long bits); -//ODE_API unsigned long (*dGeomGetCategoryBits)(dGeomID); -//ODE_API unsigned long (*dGeomGetCollideBits)(dGeomID); -//ODE_API void (*dGeomEnable)(dGeomID geom); -//ODE_API void (*dGeomDisable)(dGeomID geom); -//ODE_API int (*dGeomIsEnabled)(dGeomID geom); -//ODE_API void (*dGeomSetOffsetPosition)(dGeomID geom, dReal x, dReal y, dReal z); -//ODE_API void (*dGeomSetOffsetRotation)(dGeomID geom, const dMatrix3 R); -//ODE_API void (*dGeomSetOffsetQuaternion)(dGeomID geom, const dQuaternion Q); -//ODE_API void (*dGeomSetOffsetWorldPosition)(dGeomID geom, dReal x, dReal y, dReal z); -//ODE_API void (*dGeomSetOffsetWorldRotation)(dGeomID geom, const dMatrix3 R); -//ODE_API void (*dGeomSetOffsetWorldQuaternion)(dGeomID geom, const dQuaternion); -//ODE_API void (*dGeomClearOffset)(dGeomID geom); -//ODE_API int (*dGeomIsOffset)(dGeomID geom); -//ODE_API const dReal * (*dGeomGetOffsetPosition)(dGeomID geom); -//ODE_API void (*dGeomCopyOffsetPosition)(dGeomID geom, dVector3 pos); -//ODE_API const dReal * (*dGeomGetOffsetRotation)(dGeomID geom); -//ODE_API void (*dGeomCopyOffsetRotation)(dGeomID geom, dMatrix3 R); -//ODE_API void (*dGeomGetOffsetQuaternion)(dGeomID geom, dQuaternion result); -ODE_API int (*dCollide)(dGeomID o1, dGeomID o2, int flags, dContactGeom *contact, int skip); +void (ODE_API *dGeomDestroy)(dGeomID geom); +//void (ODE_API *dGeomSetData)(dGeomID geom, void* data); +//void * (ODE_API *dGeomGetData)(dGeomID geom); +void (ODE_API *dGeomSetBody)(dGeomID geom, dBodyID body); +dBodyID (ODE_API *dGeomGetBody)(dGeomID geom); +//void (ODE_API *dGeomSetPosition)(dGeomID geom, dReal x, dReal y, dReal z); +void (ODE_API *dGeomSetRotation)(dGeomID geom, const dMatrix3 R); +//void (ODE_API *dGeomSetQuaternion)(dGeomID geom, const dQuaternion Q); +//const dReal * (ODE_API *dGeomGetPosition)(dGeomID geom); +//void (ODE_API *dGeomCopyPosition)(dGeomID geom, dVector3 pos); +//const dReal * (ODE_API *dGeomGetRotation)(dGeomID geom); +//void (ODE_API *dGeomCopyRotation)(dGeomID geom, dMatrix3 R); +//void (ODE_API *dGeomGetQuaternion)(dGeomID geom, dQuaternion result); +//void (ODE_API *dGeomGetAABB)(dGeomID geom, dReal aabb[6]); +int (ODE_API *dGeomIsSpace)(dGeomID geom); +//dSpaceID (ODE_API *dGeomGetSpace)(dGeomID); +//int (ODE_API *dGeomGetClass)(dGeomID geom); +//void (ODE_API *dGeomSetCategoryBits)(dGeomID geom, unsigned long bits); +//void (ODE_API *dGeomSetCollideBits)(dGeomID geom, unsigned long bits); +//unsigned long (ODE_API *dGeomGetCategoryBits)(dGeomID); +//unsigned long (ODE_API *dGeomGetCollideBits)(dGeomID); +//void (ODE_API *dGeomEnable)(dGeomID geom); +//void (ODE_API *dGeomDisable)(dGeomID geom); +//int (ODE_API *dGeomIsEnabled)(dGeomID geom); +//void (ODE_API *dGeomSetOffsetPosition)(dGeomID geom, dReal x, dReal y, dReal z); +//void (ODE_API *dGeomSetOffsetRotation)(dGeomID geom, const dMatrix3 R); +//void (ODE_API *dGeomSetOffsetQuaternion)(dGeomID geom, const dQuaternion Q); +//void (ODE_API *dGeomSetOffsetWorldPosition)(dGeomID geom, dReal x, dReal y, dReal z); +//void (ODE_API *dGeomSetOffsetWorldRotation)(dGeomID geom, const dMatrix3 R); +//void (ODE_API *dGeomSetOffsetWorldQuaternion)(dGeomID geom, const dQuaternion); +//void (ODE_API *dGeomClearOffset)(dGeomID geom); +//int (ODE_API *dGeomIsOffset)(dGeomID geom); +//const dReal * (ODE_API *dGeomGetOffsetPosition)(dGeomID geom); +//void (ODE_API *dGeomCopyOffsetPosition)(dGeomID geom, dVector3 pos); +//const dReal * (ODE_API *dGeomGetOffsetRotation)(dGeomID geom); +//void (ODE_API *dGeomCopyOffsetRotation)(dGeomID geom, dMatrix3 R); +//void (ODE_API *dGeomGetOffsetQuaternion)(dGeomID geom, dQuaternion result); +int (ODE_API *dCollide)(dGeomID o1, dGeomID o2, int flags, dContactGeom *contact, int skip); // -ODE_API void (*dSpaceCollide)(dSpaceID space, void *data, dNearCallback *callback); -ODE_API void (*dSpaceCollide2)(dGeomID space1, dGeomID space2, void *data, dNearCallback *callback); +void (ODE_API *dSpaceCollide)(dSpaceID space, void *data, dNearCallback *callback); +void (ODE_API *dSpaceCollide2)(dGeomID space1, dGeomID space2, void *data, dNearCallback *callback); // -ODE_API dGeomID (*dCreateSphere)(dSpaceID space, dReal radius); -//ODE_API void (*dGeomSphereSetRadius)(dGeomID sphere, dReal radius); -//ODE_API dReal (*dGeomSphereGetRadius)(dGeomID sphere); -//ODE_API dReal (*dGeomSpherePointDepth)(dGeomID sphere, dReal x, dReal y, dReal z); +dGeomID (ODE_API *dCreateSphere)(dSpaceID space, dReal radius); +//void (ODE_API *dGeomSphereSetRadius)(dGeomID sphere, dReal radius); +//dReal (ODE_API *dGeomSphereGetRadius)(dGeomID sphere); +//dReal (ODE_API *dGeomSpherePointDepth)(dGeomID sphere, dReal x, dReal y, dReal z); // -//ODE_API dGeomID (*dCreateConvex)(dSpaceID space, dReal *_planes, unsigned int _planecount, dReal *_points, unsigned int _pointcount,unsigned int *_polygons); -//ODE_API void (*dGeomSetConvex)(dGeomID g, dReal *_planes, unsigned int _count, dReal *_points, unsigned int _pointcount,unsigned int *_polygons); +//dGeomID (ODE_API *dCreateConvex)(dSpaceID space, dReal *_planes, unsigned int _planecount, dReal *_points, unsigned int _pointcount,unsigned int *_polygons); +//void (ODE_API *dGeomSetConvex)(dGeomID g, dReal *_planes, unsigned int _count, dReal *_points, unsigned int _pointcount,unsigned int *_polygons); // -ODE_API dGeomID (*dCreateBox)(dSpaceID space, dReal lx, dReal ly, dReal lz); -//ODE_API void (*dGeomBoxSetLengths)(dGeomID box, dReal lx, dReal ly, dReal lz); -//ODE_API void (*dGeomBoxGetLengths)(dGeomID box, dVector3 result); -//ODE_API dReal (*dGeomBoxPointDepth)(dGeomID box, dReal x, dReal y, dReal z); -//ODE_API dReal (*dGeomBoxPointDepth)(dGeomID box, dReal x, dReal y, dReal z); +dGeomID (ODE_API *dCreateBox)(dSpaceID space, dReal lx, dReal ly, dReal lz); +//void (ODE_API *dGeomBoxSetLengths)(dGeomID box, dReal lx, dReal ly, dReal lz); +//void (ODE_API *dGeomBoxGetLengths)(dGeomID box, dVector3 result); +//dReal (ODE_API *dGeomBoxPointDepth)(dGeomID box, dReal x, dReal y, dReal z); +//dReal (ODE_API *dGeomBoxPointDepth)(dGeomID box, dReal x, dReal y, dReal z); // -//ODE_API dGeomID (*dCreatePlane)(dSpaceID space, dReal a, dReal b, dReal c, dReal d); -//ODE_API void (*dGeomPlaneSetParams)(dGeomID plane, dReal a, dReal b, dReal c, dReal d); -//ODE_API void (*dGeomPlaneGetParams)(dGeomID plane, dVector4 result); -//ODE_API dReal (*dGeomPlanePointDepth)(dGeomID plane, dReal x, dReal y, dReal z); +//dGeomID (ODE_API *dCreatePlane)(dSpaceID space, dReal a, dReal b, dReal c, dReal d); +//void (ODE_API *dGeomPlaneSetParams)(dGeomID plane, dReal a, dReal b, dReal c, dReal d); +//void (ODE_API *dGeomPlaneGetParams)(dGeomID plane, dVector4 result); +//dReal (ODE_API *dGeomPlanePointDepth)(dGeomID plane, dReal x, dReal y, dReal z); // -ODE_API dGeomID (*dCreateCapsule)(dSpaceID space, dReal radius, dReal length); -//ODE_API void (*dGeomCapsuleSetParams)(dGeomID ccylinder, dReal radius, dReal length); -//ODE_API void (*dGeomCapsuleGetParams)(dGeomID ccylinder, dReal *radius, dReal *length); -//ODE_API dReal (*dGeomCapsulePointDepth)(dGeomID ccylinder, dReal x, dReal y, dReal z); +dGeomID (ODE_API *dCreateCapsule)(dSpaceID space, dReal radius, dReal length); +//void (ODE_API *dGeomCapsuleSetParams)(dGeomID ccylinder, dReal radius, dReal length); +//void (ODE_API *dGeomCapsuleGetParams)(dGeomID ccylinder, dReal *radius, dReal *length); +//dReal (ODE_API *dGeomCapsulePointDepth)(dGeomID ccylinder, dReal x, dReal y, dReal z); // -//ODE_API dGeomID (*dCreateCylinder)(dSpaceID space, dReal radius, dReal length); -//ODE_API void (*dGeomCylinderSetParams)(dGeomID cylinder, dReal radius, dReal length); -//ODE_API void (*dGeomCylinderGetParams)(dGeomID cylinder, dReal *radius, dReal *length); +//dGeomID (ODE_API *dCreateCylinder)(dSpaceID space, dReal radius, dReal length); +//void (ODE_API *dGeomCylinderSetParams)(dGeomID cylinder, dReal radius, dReal length); +//void (ODE_API *dGeomCylinderGetParams)(dGeomID cylinder, dReal *radius, dReal *length); // -//ODE_API dGeomID (*dCreateRay)(dSpaceID space, dReal length); -//ODE_API void (*dGeomRaySetLength)(dGeomID ray, dReal length); -//ODE_API dReal (*dGeomRayGetLength)(dGeomID ray); -//ODE_API void (*dGeomRaySet)(dGeomID ray, dReal px, dReal py, dReal pz, dReal dx, dReal dy, dReal dz); -//ODE_API void (*dGeomRayGet)(dGeomID ray, dVector3 start, dVector3 dir); +//dGeomID (ODE_API *dCreateRay)(dSpaceID space, dReal length); +//void (ODE_API *dGeomRaySetLength)(dGeomID ray, dReal length); +//dReal (ODE_API *dGeomRayGetLength)(dGeomID ray); +//void (ODE_API *dGeomRaySet)(dGeomID ray, dReal px, dReal py, dReal pz, dReal dx, dReal dy, dReal dz); +//void (ODE_API *dGeomRayGet)(dGeomID ray, dVector3 start, dVector3 dir); // -ODE_API dGeomID (*dCreateGeomTransform)(dSpaceID space); -ODE_API void (*dGeomTransformSetGeom)(dGeomID g, dGeomID obj); -//ODE_API dGeomID (*dGeomTransformGetGeom)(dGeomID g); -ODE_API void (*dGeomTransformSetCleanup)(dGeomID g, int mode); -//ODE_API int (*dGeomTransformGetCleanup)(dGeomID g); -//ODE_API void (*dGeomTransformSetInfo)(dGeomID g, int mode); -//ODE_API int (*dGeomTransformGetInfo)(dGeomID g); +dGeomID (ODE_API *dCreateGeomTransform)(dSpaceID space); +void (ODE_API *dGeomTransformSetGeom)(dGeomID g, dGeomID obj); +//dGeomID (ODE_API *dGeomTransformGetGeom)(dGeomID g); +void (ODE_API *dGeomTransformSetCleanup)(dGeomID g, int mode); +//int (ODE_API *dGeomTransformGetCleanup)(dGeomID g); +//void (ODE_API *dGeomTransformSetInfo)(dGeomID g, int mode); +//int (ODE_API *dGeomTransformGetInfo)(dGeomID g); enum { TRIMESH_FACE_NORMALS }; typedef int dTriCallback(dGeomID TriMesh, dGeomID RefObject, int TriangleIndex); @@ -904,48 +909,49 @@ typedef void dTriArrayCallback(dGeomID TriMesh, dGeomID RefObject, const int* Tr typedef int dTriRayCallback(dGeomID TriMesh, dGeomID Ray, int TriangleIndex, dReal u, dReal v); typedef int dTriTriMergeCallback(dGeomID TriMesh, int FirstTriangleIndex, int SecondTriangleIndex); -ODE_API dTriMeshDataID (*dGeomTriMeshDataCreate)(void); -ODE_API void (*dGeomTriMeshDataDestroy)(dTriMeshDataID g); -//ODE_API void (*dGeomTriMeshDataSet)(dTriMeshDataID g, int data_id, void* in_data); -//ODE_API void* (*dGeomTriMeshDataGet)(dTriMeshDataID g, int data_id); -//ODE_API void (*dGeomTriMeshSetLastTransform)( (*dGeomID g, dMatrix4 last_trans ); -//ODE_API dReal* (*dGeomTriMeshGetLastTransform)( (*dGeomID g ); -ODE_API void (*dGeomTriMeshDataBuildSingle)(dTriMeshDataID g, const void* Vertices, int VertexStride, int VertexCount, const void* Indices, int IndexCount, int TriStride); -//ODE_API void (*dGeomTriMeshDataBuildSingle1)(dTriMeshDataID g, const void* Vertices, int VertexStride, int VertexCount, const void* Indices, int IndexCount, int TriStride, const void* Normals); -//ODE_API void (*dGeomTriMeshDataBuildDouble)(dTriMeshDataID g, const void* Vertices, int VertexStride, int VertexCount, const void* Indices, int IndexCount, int TriStride); -//ODE_API void (*dGeomTriMeshDataBuildDouble1)(dTriMeshDataID g, const void* Vertices, int VertexStride, int VertexCount, const void* Indices, int IndexCount, int TriStride, const void* Normals); -//ODE_API void (*dGeomTriMeshDataBuildSimple)(dTriMeshDataID g, const dReal* Vertices, int VertexCount, const dTriIndex* Indices, int IndexCount); -//ODE_API void (*dGeomTriMeshDataBuildSimple1)(dTriMeshDataID g, const dReal* Vertices, int VertexCount, const dTriIndex* Indices, int IndexCount, const int* Normals); -//ODE_API void (*dGeomTriMeshDataPreprocess)(dTriMeshDataID g); -//ODE_API void (*dGeomTriMeshDataGetBuffer)(dTriMeshDataID g, unsigned char** buf, int* bufLen); -//ODE_API void (*dGeomTriMeshDataSetBuffer)(dTriMeshDataID g, unsigned char* buf); -//ODE_API void (*dGeomTriMeshSetCallback)(dGeomID g, dTriCallback* Callback); -//ODE_API dTriCallback* (*dGeomTriMeshGetCallback)(dGeomID g); -//ODE_API void (*dGeomTriMeshSetArrayCallback)(dGeomID g, dTriArrayCallback* ArrayCallback); -//ODE_API dTriArrayCallback* (*dGeomTriMeshGetArrayCallback)(dGeomID g); -//ODE_API void (*dGeomTriMeshSetRayCallback)(dGeomID g, dTriRayCallback* Callback); -//ODE_API dTriRayCallback* (*dGeomTriMeshGetRayCallback)(dGeomID g); -//ODE_API void (*dGeomTriMeshSetTriMergeCallback)(dGeomID g, dTriTriMergeCallback* Callback); -//ODE_API dTriTriMergeCallback* (*dGeomTriMeshGetTriMergeCallback)(dGeomID g); -ODE_API dGeomID (*dCreateTriMesh)(dSpaceID space, dTriMeshDataID Data, dTriCallback* Callback, dTriArrayCallback* ArrayCallback, dTriRayCallback* RayCallback); -//ODE_API void (*dGeomTriMeshSetData)(dGeomID g, dTriMeshDataID Data); -//ODE_API dTriMeshDataID (*dGeomTriMeshGetData)(dGeomID g); -//ODE_API void (*dGeomTriMeshEnableTC)(dGeomID g, int geomClass, int enable); -//ODE_API int (*dGeomTriMeshIsTCEnabled)(dGeomID g, int geomClass); -//ODE_API void (*dGeomTriMeshClearTCCache)(dGeomID g); -//ODE_API dTriMeshDataID (*dGeomTriMeshGetTriMeshDataID)(dGeomID g); -//ODE_API void (*dGeomTriMeshGetTriangle)(dGeomID g, int Index, dVector3* v0, dVector3* v1, dVector3* v2); -//ODE_API void (*dGeomTriMeshGetPoint)(dGeomID g, int Index, dReal u, dReal v, dVector3 Out); -//ODE_API int (*dGeomTriMeshGetTriangleCount )(dGeomID g); -//ODE_API void (*dGeomTriMeshDataUpdate)(dTriMeshDataID g); +dTriMeshDataID (ODE_API *dGeomTriMeshDataCreate)(void); +void (ODE_API *dGeomTriMeshDataDestroy)(dTriMeshDataID g); +//void (ODE_API *dGeomTriMeshDataSet)(dTriMeshDataID g, int data_id, void* in_data); +//void* (ODE_API *dGeomTriMeshDataGet)(dTriMeshDataID g, int data_id); +//void (*dGeomTriMeshSetLastTransform)( (ODE_API *dGeomID g, dMatrix4 last_trans ); +//dReal* (*dGeomTriMeshGetLastTransform)( (ODE_API *dGeomID g ); +void (ODE_API *dGeomTriMeshDataBuildSingle)(dTriMeshDataID g, const void* Vertices, int VertexStride, int VertexCount, const void* Indices, int IndexCount, int TriStride); +//void (ODE_API *dGeomTriMeshDataBuildSingle1)(dTriMeshDataID g, const void* Vertices, int VertexStride, int VertexCount, const void* Indices, int IndexCount, int TriStride, const void* Normals); +//void (ODE_API *dGeomTriMeshDataBuildDouble)(dTriMeshDataID g, const void* Vertices, int VertexStride, int VertexCount, const void* Indices, int IndexCount, int TriStride); +//void (ODE_API *dGeomTriMeshDataBuildDouble1)(dTriMeshDataID g, const void* Vertices, int VertexStride, int VertexCount, const void* Indices, int IndexCount, int TriStride, const void* Normals); +//void (ODE_API *dGeomTriMeshDataBuildSimple)(dTriMeshDataID g, const dReal* Vertices, int VertexCount, const dTriIndex* Indices, int IndexCount); +//void (ODE_API *dGeomTriMeshDataBuildSimple1)(dTriMeshDataID g, const dReal* Vertices, int VertexCount, const dTriIndex* Indices, int IndexCount, const int* Normals); +//void (ODE_API *dGeomTriMeshDataPreprocess)(dTriMeshDataID g); +//void (ODE_API *dGeomTriMeshDataGetBuffer)(dTriMeshDataID g, unsigned char** buf, int* bufLen); +//void (ODE_API *dGeomTriMeshDataSetBuffer)(dTriMeshDataID g, unsigned char* buf); +//void (ODE_API *dGeomTriMeshSetCallback)(dGeomID g, dTriCallback* Callback); +//dTriCallback* (ODE_API *dGeomTriMeshGetCallback)(dGeomID g); +//void (ODE_API *dGeomTriMeshSetArrayCallback)(dGeomID g, dTriArrayCallback* ArrayCallback); +//dTriArrayCallback* (ODE_API *dGeomTriMeshGetArrayCallback)(dGeomID g); +//void (ODE_API *dGeomTriMeshSetRayCallback)(dGeomID g, dTriRayCallback* Callback); +//dTriRayCallback* (ODE_API *dGeomTriMeshGetRayCallback)(dGeomID g); +//void (ODE_API *dGeomTriMeshSetTriMergeCallback)(dGeomID g, dTriTriMergeCallback* Callback); +//dTriTriMergeCallback* (ODE_API *dGeomTriMeshGetTriMergeCallback)(dGeomID g); +dGeomID (ODE_API *dCreateTriMesh)(dSpaceID space, dTriMeshDataID Data, dTriCallback* Callback, dTriArrayCallback* ArrayCallback, dTriRayCallback* RayCallback); +//void (ODE_API *dGeomTriMeshSetData)(dGeomID g, dTriMeshDataID Data); +//dTriMeshDataID (ODE_API *dGeomTriMeshGetData)(dGeomID g); +//void (ODE_API *dGeomTriMeshEnableTC)(dGeomID g, int geomClass, int enable); +//int (ODE_API *dGeomTriMeshIsTCEnabled)(dGeomID g, int geomClass); +//void (ODE_API *dGeomTriMeshClearTCCache)(dGeomID g); +//dTriMeshDataID (ODE_API *dGeomTriMeshGetTriMeshDataID)(dGeomID g); +//void (ODE_API *dGeomTriMeshGetTriangle)(dGeomID g, int Index, dVector3* v0, dVector3* v1, dVector3* v2); +//void (ODE_API *dGeomTriMeshGetPoint)(dGeomID g, int Index, dReal u, dReal v, dVector3 Out); +//int (ODE_API *dGeomTriMeshGetTriangleCount )(dGeomID g); +//void (ODE_API *dGeomTriMeshDataUpdate)(dTriMeshDataID g); static dllfunction_t odefuncs[] = { - {"dGetConfiguration", (void **) &dGetConfiguration}, - {"dCheckConfiguration", (void **) &dCheckConfiguration}, - {"dInitODE2", (void **) &dInitODE2}, - {"dAllocateODEDataForThread", (void **) &dAllocateODEDataForThread}, - {"dCleanupODEAllDataForThread", (void **) &dCleanupODEAllDataForThread}, +// {"dGetConfiguration", (void **) &dGetConfiguration}, +// {"dCheckConfiguration", (void **) &dCheckConfiguration}, + {"dInitODE", (void **) &dInitODE}, +// {"dInitODE2", (void **) &dInitODE2}, +// {"dAllocateODEDataForThread", (void **) &dAllocateODEDataForThread}, +// {"dCleanupODEAllDataForThread", (void **) &dCleanupODEAllDataForThread}, {"dCloseODE", (void **) &dCloseODE}, // {"dMassCheck", (void **) &dMassCheck}, // {"dMassSetZero", (void **) &dMassSetZero}, @@ -968,7 +974,7 @@ static dllfunction_t odefuncs[] = {"dWorldCreate", (void **) &dWorldCreate}, {"dWorldDestroy", (void **) &dWorldDestroy}, {"dWorldSetGravity", (void **) &dWorldSetGravity}, -// {"dWorldGetGravity", (void **) &dWorldGetGravity}, + {"dWorldGetGravity", (void **) &dWorldGetGravity}, // {"dWorldSetERP", (void **) &dWorldSetERP}, // {"dWorldGetERP", (void **) &dWorldGetERP}, // {"dWorldSetCFM", (void **) &dWorldSetCFM}, @@ -1031,7 +1037,7 @@ static dllfunction_t odefuncs[] = {"dBodyCreate", (void **) &dBodyCreate}, {"dBodyDestroy", (void **) &dBodyDestroy}, {"dBodySetData", (void **) &dBodySetData}, -// {"dBodyGetData", (void **) &dBodyGetData}, + {"dBodyGetData", (void **) &dBodyGetData}, {"dBodySetPosition", (void **) &dBodySetPosition}, {"dBodySetRotation", (void **) &dBodySetRotation}, // {"dBodySetQuaternion", (void **) &dBodySetQuaternion}, @@ -1077,8 +1083,8 @@ static dllfunction_t odefuncs[] = // {"dBodyEnable", (void **) &dBodyEnable}, // {"dBodyDisable", (void **) &dBodyDisable}, // {"dBodyIsEnabled", (void **) &dBodyIsEnabled}, -// {"dBodySetGravityMode", (void **) &dBodySetGravityMode}, -// {"dBodyGetGravityMode", (void **) &dBodyGetGravityMode}, + {"dBodySetGravityMode", (void **) &dBodySetGravityMode}, + {"dBodyGetGravityMode", (void **) &dBodyGetGravityMode}, // {"dBodySetMovedCallback", (void **) &dBodySetMovedCallback}, // {"dBodyGetFirstGeom", (void **) &dBodyGetFirstGeom}, // {"dBodyGetNextGeom", (void **) &dBodyGetNextGeom}, @@ -1259,7 +1265,7 @@ static dllfunction_t odefuncs[] = {"dSimpleSpaceCreate", (void **) &dSimpleSpaceCreate}, {"dHashSpaceCreate", (void **) &dHashSpaceCreate}, {"dQuadTreeSpaceCreate", (void **) &dQuadTreeSpaceCreate}, - {"dSweepAndPruneSpaceCreate", (void **) &dSweepAndPruneSpaceCreate}, +// {"dSweepAndPruneSpaceCreate", (void **) &dSweepAndPruneSpaceCreate}, {"dSpaceDestroy", (void **) &dSpaceDestroy}, // {"dHashSpaceSetLevels", (void **) &dHashSpaceSetLevels}, // {"dHashSpaceGetLevels", (void **) &dHashSpaceGetLevels}, @@ -1395,7 +1401,7 @@ dllhandle_t ode_dll = NULL; static void World_Physics_Init(void) { #ifdef USEODE -#ifndef ODE_STATIC +#ifdef ODE_DYNAMIC const char* dllnames [] = { # if defined(WIN64) @@ -1420,17 +1426,20 @@ static void World_Physics_Init(void) Cvar_RegisterVariable(&physics_ode_contact_mu); Cvar_RegisterVariable(&physics_ode_contact_erp); Cvar_RegisterVariable(&physics_ode_contact_cfm); + Cvar_RegisterVariable(&physics_ode_world_erp); + Cvar_RegisterVariable(&physics_ode_world_cfm); Cvar_RegisterVariable(&physics_ode_iterationsperframe); Cvar_RegisterVariable(&physics_ode_movelimit); Cvar_RegisterVariable(&physics_ode_spinlimit); -#ifndef ODE_STATIC +#ifdef ODE_DYNAMIC // Load the DLL if (Sys_LoadLibrary (dllnames, &ode_dll, odefuncs)) #endif { - dInitODE2(0); -#ifndef ODE_STATIC + dInitODE(); +// dInitODE2(0); +#ifdef ODE_DNYAMIC # ifdef dSINGLE if (!dCheckConfiguration("ODE_single_precision")) # else @@ -1442,7 +1451,7 @@ static void World_Physics_Init(void) # else Con_Printf("ode library not compiled for double precision - incompatible! Not using ODE physics.\n"); # endif - Sys_UnloadLibrary(ode_dll); + Sys_UnloadLibrary(&ode_dll); ode_dll = NULL; } #endif @@ -1453,13 +1462,13 @@ static void World_Physics_Init(void) static void World_Physics_Shutdown(void) { #ifdef USEODE -#ifndef ODE_STATIC +#ifdef ODE_DYNAMIC if (ode_dll) #endif { dCloseODE(); -#ifndef ODE_STATIC - Sys_UnloadLibrary(ode_dll); +#ifdef ODE_DYNAMIC + Sys_UnloadLibrary(&ode_dll); ode_dll = NULL; #endif } @@ -1472,7 +1481,7 @@ static void World_Physics_EnableODE(world_t *world) dVector3 center, extents; if (world->physics.ode) return; -#ifndef ODE_STATIC +#ifdef ODE_DYNAMIC if (!ode_dll) return; #endif @@ -1482,7 +1491,10 @@ static void World_Physics_EnableODE(world_t *world) world->physics.ode_world = dWorldCreate(); world->physics.ode_space = dQuadTreeSpaceCreate(NULL, center, extents, bound(1, physics_ode_quadtree_depth.integer, 10)); world->physics.ode_contactgroup = dJointGroupCreate(0); - // we don't currently set dWorldSetCFM or dWorldSetERP because the defaults seem fine + if(physics_ode_world_erp.value >= 0) + dWorldSetERP(world->physics.ode_world, physics_ode_world_erp.value); + if(physics_ode_world_cfm.value >= 0) + dWorldSetCFM(world->physics.ode_world, physics_ode_world_cfm.value); } #endif @@ -1508,17 +1520,51 @@ static void World_Physics_End(world_t *world) #endif } -void World_Physics_RemoveFromEntity(world_t *world, prvm_edict_t *ed) +void World_Physics_RemoveJointFromEntity(world_t *world, prvm_edict_t *ed) { + ed->priv.server->ode_joint_type = 0; #ifdef USEODE + if(ed->priv.server->ode_joint) + dJointDestroy((dJointID)ed->priv.server->ode_joint); + ed->priv.server->ode_joint = NULL; +#endif +} + +void World_Physics_RemoveFromEntity(world_t *world, prvm_edict_t *ed) +{ // entity is not physics controlled, free any physics data + prvm_edict_t *ed2; ed->priv.server->ode_physics = false; +#ifdef USEODE if (ed->priv.server->ode_geom) dGeomDestroy((dGeomID)ed->priv.server->ode_geom); ed->priv.server->ode_geom = NULL; if (ed->priv.server->ode_body) + { + dJointID j; + dBodyID b1, b2; + while(dBodyGetNumJoints((dBodyID)ed->priv.server->ode_body)) + { + j = dBodyGetJoint((dBodyID)ed->priv.server->ode_body, 0); + ed2 = (prvm_edict_t *) dJointGetData(j); + b1 = dJointGetBody(j, 0); + b2 = dJointGetBody(j, 1); + if(b1 == (dBodyID)ed->priv.server->ode_body) + { + b1 = 0; + ed2->priv.server->ode_joint_enemy = 0; + } + if(b2 == (dBodyID)ed->priv.server->ode_body) + { + b2 = 0; + ed2->priv.server->ode_joint_aiment = 0; + } + dJointAttach(j, b1, b2); + } dBodyDestroy((dBodyID)ed->priv.server->ode_body); + } ed->priv.server->ode_body = NULL; +#endif if (ed->priv.server->ode_vertex3f) Mem_Free(ed->priv.server->ode_vertex3f); ed->priv.server->ode_vertex3f = NULL; @@ -1527,7 +1573,6 @@ void World_Physics_RemoveFromEntity(world_t *world, prvm_edict_t *ed) Mem_Free(ed->priv.server->ode_element3i); ed->priv.server->ode_element3i = NULL; ed->priv.server->ode_numtriangles = 0; -#endif } #ifdef USEODE @@ -1542,16 +1587,36 @@ static void World_Physics_Frame_BodyToEntity(world_t *world, prvm_edict_t *ed) matrix4x4_t bodymatrix; matrix4x4_t entitymatrix; prvm_eval_t *val; + vec3_t angles; + vec3_t avelocity; vec3_t forward, left, up; vec3_t origin; vec3_t spinvelocity; vec3_t velocity; + int jointtype; if (!body) return; val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.movetype); movetype = (int)val->_float; if (movetype != MOVETYPE_PHYSICS) + { + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.jointtype);if (val) jointtype = (int)val->_float; + switch(jointtype) + { + // TODO feed back data from physics + case JOINTTYPE_POINT: + break; + case JOINTTYPE_HINGE: + break; + case JOINTTYPE_SLIDER: + break; + case JOINTTYPE_UNIVERSAL: + break; + case JOINTTYPE_HINGE2: + break; + } return; + } // store the physics engine data into the entity o = dBodyGetPosition(body); r = dBodyGetRotation(body); @@ -1572,13 +1637,136 @@ static void World_Physics_Frame_BodyToEntity(world_t *world, prvm_edict_t *ed) Matrix4x4_FromVectors(&bodymatrix, forward, left, up, origin); Matrix4x4_Concat(&entitymatrix, &bodymatrix, &ed->priv.server->ode_offsetimatrix); Matrix4x4_ToVectors(&entitymatrix, forward, left, up, origin); + + AnglesFromVectors(angles, forward, up, false); + VectorSet(avelocity, RAD2DEG(spinvelocity[PITCH]), RAD2DEG(spinvelocity[ROLL]), RAD2DEG(spinvelocity[YAW])); + + { + float pitchsign = 1; + if(!strcmp(prog->name, "server")) // FIXME some better way? + { + pitchsign = SV_GetPitchSign(ed); + } + else if(!strcmp(prog->name, "client")) + { + pitchsign = CL_GetPitchSign(ed); + } + angles[PITCH] *= pitchsign; + avelocity[PITCH] *= pitchsign; + } + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.origin);if (val) VectorCopy(origin, val->vector); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_forward);if (val) VectorCopy(forward, val->vector); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_left);if (val) VectorCopy(left, val->vector); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_up);if (val) VectorCopy(up, val->vector); val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.velocity);if (val) VectorCopy(velocity, val->vector); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.spinvelocity);if (val) VectorCopy(spinvelocity, val->vector); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.angles);if (val) AnglesFromVectors(val->vector, forward, up, true); + //val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_forward);if (val) VectorCopy(forward, val->vector); + //val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_left);if (val) VectorCopy(left, val->vector); + //val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_up);if (val) VectorCopy(up, val->vector); + //val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.spinvelocity);if (val) VectorCopy(spinvelocity, val->vector); + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.angles);if (val) VectorCopy(angles, val->vector); + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.avelocity);if (val) VectorCopy(avelocity, val->vector); + + // values for BodyFromEntity to check if the qc modified anything later + VectorCopy(origin, ed->priv.server->ode_origin); + VectorCopy(velocity, ed->priv.server->ode_velocity); + VectorCopy(angles, ed->priv.server->ode_angles); + VectorCopy(avelocity, ed->priv.server->ode_avelocity); + ed->priv.server->ode_gravity = dBodyGetGravityMode(body); +} + +static void World_Physics_Frame_JointFromEntity(world_t *world, prvm_edict_t *ed) +{ + dJointID j = 0; + dBodyID b1 = 0; + dBodyID b2 = 0; + int movetype = 0; + int jointtype = 0; + int enemy = 0, aiment = 0; + vec3_t origin, velocity, angles, forward, left, up; + prvm_eval_t *val; + VectorClear(origin); + VectorClear(velocity); + VectorClear(angles); + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.movetype);if (val) movetype = (int)val->_float; + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.jointtype);if (val) jointtype = (int)val->_float; + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.enemy);if (val) enemy = val->_int; + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.aiment);if (val) aiment = val->_int; + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.origin);if (val) VectorCopy(val->vector, origin); + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.velocity);if (val) VectorCopy(val->vector, velocity); + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.angles);if (val) VectorCopy(val->vector, angles); + if(movetype == MOVETYPE_PHYSICS) + jointtype = 0; // can't have both + if(enemy <= 0 || enemy >= prog->num_edicts || prog->edicts[enemy].priv.required->free || prog->edicts[enemy].priv.server->ode_body == 0) + enemy = 0; + if(aiment <= 0 || aiment >= prog->num_edicts || prog->edicts[aiment].priv.required->free || prog->edicts[aiment].priv.server->ode_body == 0) + aiment = 0; + if(jointtype == ed->priv.server->ode_joint_type && VectorCompare(origin, ed->priv.server->ode_joint_origin) && VectorCompare(velocity, ed->priv.server->ode_joint_velocity) && VectorCompare(angles, ed->priv.server->ode_joint_angles) && enemy == ed->priv.server->ode_joint_enemy && aiment == ed->priv.server->ode_joint_aiment) + return; // nothing to do + AngleVectorsFLU(angles, forward, left, up); + switch(jointtype) + { + case JOINTTYPE_POINT: + j = dJointCreateBall(world->physics.ode_world, 0); + break; + case JOINTTYPE_HINGE: + j = dJointCreateHinge(world->physics.ode_world, 0); + break; + case JOINTTYPE_SLIDER: + j = dJointCreateSlider(world->physics.ode_world, 0); + break; + case JOINTTYPE_UNIVERSAL: + j = dJointCreateUniversal(world->physics.ode_world, 0); + break; + case JOINTTYPE_HINGE2: + j = dJointCreateHinge2(world->physics.ode_world, 0); + break; + case 0: + default: + // no joint + j = 0; + break; + } + ed->priv.server->ode_joint = (void *) j; + ed->priv.server->ode_joint_type = jointtype; + ed->priv.server->ode_joint_enemy = enemy; + ed->priv.server->ode_joint_aiment = aiment; + VectorCopy(origin, ed->priv.server->ode_joint_origin); + VectorCopy(velocity, ed->priv.server->ode_joint_velocity); + VectorCopy(angles, ed->priv.server->ode_joint_angles); + if(j) + { + dJointSetData(j, (void *) ed); + if(enemy) + b1 = (dBodyID)prog->edicts[enemy].priv.server->ode_body; + if(aiment) + b2 = (dBodyID)prog->edicts[aiment].priv.server->ode_body; + dJointAttach(j, b1, b2); + switch(jointtype) + { + case JOINTTYPE_POINT: + dJointSetBallAnchor(j, origin[0], origin[1], origin[2]); + break; + case JOINTTYPE_HINGE: + dJointSetHingeAnchor(j, origin[0], origin[1], origin[2]); + dJointSetHingeAxis(j, forward[0], forward[1], forward[2]); + break; + case JOINTTYPE_SLIDER: + dJointSetSliderAxis(j, forward[0], forward[1], forward[2]); + break; + case JOINTTYPE_UNIVERSAL: + dJointSetUniversalAnchor(j, origin[0], origin[1], origin[2]); + dJointSetUniversalAxis1(j, forward[0], forward[1], forward[2]); + dJointSetUniversalAxis2(j, up[0], up[1], up[2]); + break; + case JOINTTYPE_HINGE2: + dJointSetHinge2Anchor(j, origin[0], origin[1], origin[2]); + dJointSetHinge2Axis1(j, forward[0], forward[1], forward[2]); + dJointSetHinge2Axis2(j, velocity[0], velocity[1], velocity[2]); + break; + case 0: + default: + Host_Error("what? but above the joint was valid...\n"); + break; + } + } } static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) @@ -1595,14 +1783,15 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) int *oe; int axisindex; int modelindex = 0; - int movetype; + int movetype = MOVETYPE_NONE; int numtriangles; int numvertices; - int solid; + int solid = SOLID_NOT; int triangleindex; int vertexindex; mempool_t *mempool; prvm_eval_t *val; + qboolean modified = false; vec3_t angles; vec3_t avelocity; vec3_t entmaxs; @@ -1620,20 +1809,23 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) vec_t massval = 1.0f; vec_t movelimit; vec_t radius; + vec_t scale = 1.0f; vec_t spinlimit; -#ifndef ODE_STATIC + qboolean gravity; +#ifdef ODE_DYNAMIC if (!ode_dll) return; #endif - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.solid); - solid = (int)val->_float; - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.movetype); - movetype = (int)val->_float; + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.solid);if (val) solid = (int)val->_float; + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.movetype);if (val) movetype = (int)val->_float; + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.movetype);if (val && val->_float) scale = val->_float; + modelindex = 0; switch(solid) { case SOLID_BSP: val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.modelindex); - modelindex = (int)val->_float; + if (val) + modelindex = (int)val->_float; if (world == &sv.world && modelindex >= 1 && modelindex < MAX_MODELS) { model = sv.models[modelindex]; @@ -1652,8 +1844,8 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) } if (model) { - VectorCopy(model->normalmins, entmins); - VectorCopy(model->normalmaxs, entmaxs); + VectorScale(model->normalmins, scale, entmins); + VectorScale(model->normalmaxs, scale, entmaxs); val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.mass);if (val) massval = val->_float; } else @@ -1697,6 +1889,7 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) || ed->priv.server->ode_mass != massval || ed->priv.server->ode_modelindex != modelindex) { + modified = true; World_Physics_RemoveFromEntity(world, ed); ed->priv.server->ode_physics = true; VectorCopy(entmins, ed->priv.server->ode_mins); @@ -1761,8 +1954,6 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) ed->priv.server->ode_geom = (void *)dCreateTriMesh(world->physics.ode_space, dataID, NULL, NULL, NULL); dGeomSetBody(ed->priv.server->ode_geom, body); dMassSetBoxTotal(&mass, massval, geomsize[0], geomsize[1], geomsize[2]); - dBodySetMass(body, &mass); - dBodySetData(body, (void*)ed); break; case SOLID_BBOX: case SOLID_SLIDEBOX: @@ -1774,7 +1965,6 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) dMassSetBoxTotal(&mass, massval, geomsize[0], geomsize[1], geomsize[2]); dGeomSetBody(ed->priv.server->ode_geom, body); dBodySetMass(body, &mass); - dBodySetData(body, (void*)ed); break; case SOLID_PHYSICS_SPHERE: Matrix4x4_CreateTranslate(&ed->priv.server->ode_offsetmatrix, geomcenter[0], geomcenter[1], geomcenter[2]); @@ -1812,7 +2002,6 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) dMassSetCapsuleTotal(&mass, massval, axisindex+1, radius, length); dGeomSetBody(ed->priv.server->ode_geom, body); dBodySetMass(body, &mass); - dBodySetData(body, (void*)ed); break; default: Sys_Error("World_Physics_BodyFromEntity: unrecognized solid value %i was accepted by filter\n", solid); @@ -1822,36 +2011,41 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) // get current data from entity VectorClear(origin); - VectorClear(forward); - VectorClear(left); - VectorClear(up); VectorClear(velocity); - VectorClear(spinvelocity); + //VectorClear(forward); + //VectorClear(left); + //VectorClear(up); + //VectorClear(spinvelocity); + VectorClear(angles); + VectorClear(avelocity); + gravity = true; val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.origin);if (val) VectorCopy(val->vector, origin); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_forward);if (val) VectorCopy(val->vector, forward); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_left);if (val) VectorCopy(val->vector, left); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_up);if (val) VectorCopy(val->vector, up); val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.velocity);if (val) VectorCopy(val->vector, velocity); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.spinvelocity);if (val) VectorCopy(val->vector, spinvelocity); + //val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_forward);if (val) VectorCopy(val->vector, forward); + //val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_left);if (val) VectorCopy(val->vector, left); + //val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.axis_up);if (val) VectorCopy(val->vector, up); + //val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.spinvelocity);if (val) VectorCopy(val->vector, spinvelocity); + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.angles);if (val) VectorCopy(val->vector, angles); + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.avelocity);if (val) VectorCopy(val->vector, avelocity); + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.gravity);if (val) { if(val->_float != 0.0f && val->_float < 0.5f) gravity = false; } + if(ed == prog->edicts) + gravity = false; // compatibility for legacy entities - switch (solid) + //if (!VectorLength2(forward) || solid == SOLID_BSP) { - case SOLID_BSP: - //VectorClear(velocity); - VectorClear(angles); - VectorClear(avelocity); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.angles);if (val) VectorCopy(val->vector, angles); - val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.velocity);if (val) VectorCopy(val->vector, avelocity); AngleVectorsFLU(angles, forward, left, up); // convert single-axis rotations in avelocity to spinvelocity // FIXME: untested math - check signs - VectorSet(spinvelocity, avelocity[PITCH] * ((float)M_PI / 180.0f), avelocity[ROLL] * ((float)M_PI / 180.0f), avelocity[YAW] * ((float)M_PI / 180.0f)); - break; + VectorSet(spinvelocity, DEG2RAD(avelocity[PITCH]), DEG2RAD(avelocity[ROLL]), DEG2RAD(avelocity[YAW])); + } + + // compatibility for legacy entities + switch (solid) + { case SOLID_BBOX: case SOLID_SLIDEBOX: case SOLID_CORPSE: - //VectorClear(velocity); VectorSet(forward, 1, 0, 0); VectorSet(left, 0, 1, 0); VectorSet(up, 0, 0, 1); @@ -1859,17 +2053,21 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) break; } + // we must prevent NANs... test = VectorLength2(origin) + VectorLength2(forward) + VectorLength2(left) + VectorLength2(up) + VectorLength2(velocity) + VectorLength2(spinvelocity); if (IS_NAN(test)) { - Con_Printf("Fixing NAN values on entity %i : .classname = \"%s\" .origin = '%f %f %f' .axis_forward = '%f %f %f' .axis_left = '%f %f %f' .axis_up = '%f %f %f' .velocity = '%f %f %f' .spinvelocity = '%f %f %f'\n", PRVM_NUM_FOR_EDICT(ed), PRVM_GetString(PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.classname)->string), origin[0], origin[1], origin[2], forward[0], forward[1], forward[2], left[0], left[1], left[2], up[0], up[1], up[2], velocity[0], velocity[1], velocity[2], spinvelocity[0], spinvelocity[1], spinvelocity[2]); + modified = true; + //Con_Printf("Fixing NAN values on entity %i : .classname = \"%s\" .origin = '%f %f %f' .velocity = '%f %f %f' .axis_forward = '%f %f %f' .axis_left = '%f %f %f' .axis_up = %f %f %f' .spinvelocity = '%f %f %f'\n", PRVM_NUM_FOR_EDICT(ed), PRVM_GetString(PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.classname)->string), origin[0], origin[1], origin[2], velocity[0], velocity[1], velocity[2], forward[0], forward[1], forward[2], left[0], left[1], left[2], up[0], up[1], up[2], spinvelocity[0], spinvelocity[1], spinvelocity[2]); + Con_Printf("Fixing NAN values on entity %i : .classname = \"%s\" .origin = '%f %f %f' .velocity = '%f %f %f' .angles = '%f %f %f' .avelocity = '%f %f %f'\n", PRVM_NUM_FOR_EDICT(ed), PRVM_GetString(PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.classname)->string), origin[0], origin[1], origin[2], velocity[0], velocity[1], velocity[2], angles[0], angles[1], angles[2], avelocity[0], avelocity[1], avelocity[2]); test = VectorLength2(origin); if (IS_NAN(test)) VectorClear(origin); test = VectorLength2(forward) * VectorLength2(left) * VectorLength2(up); if (IS_NAN(test)) { + VectorSet(angles, 0, 0, 0); VectorSet(forward, 1, 0, 0); VectorSet(left, 0, 1, 0); VectorSet(up, 0, 0, 1); @@ -1880,6 +2078,7 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) test = VectorLength2(spinvelocity); if (IS_NAN(test)) { + VectorClear(avelocity); VectorClear(spinvelocity); } } @@ -1889,10 +2088,12 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) test = VectorLength2(velocity); if (test > movelimit*movelimit) { + modified = true; // scale down linear velocity to the movelimit // scale down angular velocity the same amount for consistency f = movelimit / sqrt(test); VectorScale(velocity, f, velocity); + VectorScale(avelocity, f, avelocity); VectorScale(spinvelocity, f, spinvelocity); } @@ -1900,15 +2101,42 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) spinlimit = physics_ode_spinlimit.value; test = VectorLength2(spinvelocity); if (test > spinlimit) + { + modified = true; + VectorClear(avelocity); VectorClear(spinvelocity); + } + + // check if the qc edited any position data + if (!VectorCompare(origin, ed->priv.server->ode_origin) + || !VectorCompare(velocity, ed->priv.server->ode_velocity) + || !VectorCompare(angles, ed->priv.server->ode_angles) + || !VectorCompare(avelocity, ed->priv.server->ode_avelocity) + || gravity != ed->priv.server->ode_gravity) + modified = true; - // store the values into the physics engine + // store the qc values into the physics engine body = ed->priv.server->ode_body; - if (body) + if (body && modified) { dVector3 r[3]; matrix4x4_t entitymatrix; matrix4x4_t bodymatrix; + + { + float pitchsign = 1; + if(!strcmp(prog->name, "server")) // FIXME some better way? + { + pitchsign = SV_GetPitchSign(ed); + } + else if(!strcmp(prog->name, "client")) + { + pitchsign = CL_GetPitchSign(ed); + } + angles[PITCH] *= pitchsign; + avelocity[PITCH] *= pitchsign; + } + Matrix4x4_FromVectors(&entitymatrix, forward, left, up, origin); Matrix4x4_Concat(&bodymatrix, &entitymatrix, &ed->priv.server->ode_offsetmatrix); Matrix4x4_ToVectors(&bodymatrix, forward, left, up, origin); @@ -1926,6 +2154,8 @@ static void World_Physics_Frame_BodyFromEntity(world_t *world, prvm_edict_t *ed) dBodySetRotation(body, r[0]); dBodySetLinearVel(body, velocity[0], velocity[1], velocity[2]); dBodySetAngularVel(body, spinvelocity[0], spinvelocity[1], spinvelocity[2]); + dBodySetGravityMode(body, gravity); + dBodySetData(body, (void*)ed); // setting body to NULL makes an immovable object if (movetype != MOVETYPE_PHYSICS) dGeomSetBody(ed->priv.server->ode_geom, 0); @@ -1942,6 +2172,13 @@ static void nearCallback (void *data, dGeomID o1, dGeomID o2) dJointID c; int i; int numcontacts; + prvm_eval_t *val; + float bouncefactor1 = 0.0f; + float bouncestop1 = 60.0f / 800.0f; + float bouncefactor2 = 0.0f; + float bouncestop2 = 60.0f / 800.0f; + dVector3 grav; + prvm_edict_t *ed; if (dGeomIsSpace(o1) || dGeomIsSpace(o2)) { @@ -1965,15 +2202,67 @@ static void nearCallback (void *data, dGeomID o1, dGeomID o2) if (b1 && b2 && dAreConnectedExcluding(b1, b2, dJointTypeContact)) return; + if(b1) + { + ed = (prvm_edict_t *) dBodyGetData(b1); + if(ed) + { + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.bouncefactor); + if (val!=0 && val->_float) + bouncefactor1 = val->_float; + + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.bouncestop); + if (val!=0 && val->_float) + bouncestop1 = val->_float; + } + } + + if(b2) + { + ed = (prvm_edict_t *) dBodyGetData(b2); + if(ed) + { + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.bouncefactor); + if (val!=0 && val->_float) + bouncefactor2 = val->_float; + + val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.bouncestop); + if (val!=0 && val->_float) + bouncestop2 = val->_float; + } + } + + // merge bounce factors and bounce stop + if(bouncefactor2 > 0) + { + if(bouncefactor1 > 0) + { + // TODO possibly better logic to merge bounce factor data? + if(bouncestop2 < bouncestop1) + bouncestop1 = bouncestop2; + if(bouncefactor2 > bouncefactor1) + bouncefactor1 = bouncefactor2; + } + else + { + bouncestop1 = bouncestop2; + bouncefactor1 = bouncefactor2; + } + } + dWorldGetGravity(world->physics.ode_world, grav); + bouncestop1 *= fabs(grav[2]); + // generate contact points between the two non-space geoms numcontacts = dCollide(o1, o2, MAX_CONTACTS, &(contact[0].geom), sizeof(contact[0])); // add these contact points to the simulation for (i = 0;i < numcontacts;i++) { - contact[i].surface.mode = (physics_ode_contact_mu.value != -1 ? dContactApprox1 : 0) | (physics_ode_contact_erp.value != -1 ? dContactSoftERP : 0) | (physics_ode_contact_cfm.value != -1 ? dContactSoftCFM : 0); + contact[i].surface.mode = (physics_ode_contact_mu.value != -1 ? dContactApprox1 : 0) | (physics_ode_contact_erp.value != -1 ? dContactSoftERP : 0) | (physics_ode_contact_cfm.value != -1 ? dContactSoftCFM : 0) | (bouncefactor1 > 0 ? dContactBounce : 0); contact[i].surface.mu = physics_ode_contact_mu.value; contact[i].surface.soft_erp = physics_ode_contact_erp.value; contact[i].surface.soft_cfm = physics_ode_contact_cfm.value; + contact[i].surface.bounce = bouncefactor1; + contact[i].surface.bounce_vel = bouncestop1; c = dJointCreateContact(world->physics.ode_world, world->physics.ode_contactgroup, contact + i); dJointAttach(c, b1, b2); } @@ -1990,9 +2279,15 @@ void World_Physics_Frame(world_t *world, double frametime, double gravity) // copy physics properties from entities to physics engine if (prog) + { for (i = 0, ed = prog->edicts + i;i < prog->num_edicts;i++, ed++) if (!prog->edicts[i].priv.required->free) World_Physics_Frame_BodyFromEntity(world, ed); + // oh, and it must be called after all bodies were created + for (i = 0, ed = prog->edicts + i;i < prog->num_edicts;i++, ed++) + if (!prog->edicts[i].priv.required->free) + World_Physics_Frame_JointFromEntity(world, ed); + } world->physics.ode_iterations = bound(1, physics_ode_iterationsperframe.integer, 1000); world->physics.ode_step = frametime / world->physics.ode_iterations;