diff options
Diffstat (limited to 'libs/ode-0.16.1/ode/src/objects.h')
-rw-r--r-- | libs/ode-0.16.1/ode/src/objects.h | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/libs/ode-0.16.1/ode/src/objects.h b/libs/ode-0.16.1/ode/src/objects.h new file mode 100644 index 0000000..0e7d34f --- /dev/null +++ b/libs/ode-0.16.1/ode/src/objects.h @@ -0,0 +1,206 @@ +/************************************************************************* + * * + * Open Dynamics Engine, Copyright (C) 2001,2002 Russell L. Smith. * + * All rights reserved. Email: russ@q12.org Web: www.q12.org * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of EITHER: * + * (1) The GNU Lesser General Public License as published by the Free * + * Software Foundation; either version 2.1 of the License, or (at * + * your option) any later version. The text of the GNU Lesser * + * General Public License is included with this library in the * + * file LICENSE.TXT. * + * (2) The BSD-style license that is included with this library in * + * the file LICENSE-BSD.TXT. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files * + * LICENSE.TXT and LICENSE-BSD.TXT for more details. * + * * + *************************************************************************/ + +// object, body, and world structs. + + +#ifndef _ODE__PRIVATE_OBJECTS_H_ +#define _ODE__PRIVATE_OBJECTS_H_ + + +#include <ode/common.h> +#include <ode/memory.h> +#include <ode/mass.h> +#include "error.h" +#include "array.h" +#include "common.h" +#include "threading_base.h" + + +struct dxJointNode; +class dxStepWorkingMemory; +class dxWorldProcessContext; + + +// some body flags + +enum { + dxBodyFlagFiniteRotation = 1, // use finite rotations + dxBodyFlagFiniteRotationAxis = 2, // use finite rotations only along axis + dxBodyDisabled = 4, // body is disabled + dxBodyNoGravity = 8, // body is not influenced by gravity + dxBodyAutoDisable = 16, // enable auto-disable on body + dxBodyLinearDamping = 32, // use linear damping + dxBodyAngularDamping = 64, // use angular damping + dxBodyMaxAngularSpeed = 128,// use maximum angular speed + dxBodyGyroscopic = 256 // use gyroscopic term +}; + + +// base class that does correct object allocation / deallocation + +struct dBase { + void *operator new (size_t size) { return dAlloc (size); } + void *operator new (size_t, void *p) { return p; } + void operator delete (void *ptr, size_t size) { dFree (ptr,size); } + void *operator new[] (size_t size) { return dAlloc (size); } + void operator delete[] (void *ptr, size_t size) { dFree (ptr,size); } +}; + + +// base class for bodies and joints + +struct dObject : public dBase { + dxWorld *world; // world this object is in + dObject *next; // next object of this type in list + dObject **tome; // pointer to previous object's next ptr + int tag; // used by dynamics algorithms + void *userdata; // user settable data + + explicit dObject(dxWorld *w): world(w), next(NULL), tome(NULL), tag(0), userdata(NULL) {} + virtual ~dObject(); +}; + + +// auto disable parameters +struct dxAutoDisable { + dReal idle_time; // time the body needs to be idle to auto-disable it + int idle_steps; // steps the body needs to be idle to auto-disable it + unsigned int average_samples; // size of the average_lvel and average_avel buffers + dReal linear_average_threshold; // linear (squared) average velocity threshold + dReal angular_average_threshold; // angular (squared) average velocity threshold + + dxAutoDisable() {} + explicit dxAutoDisable(void *); +}; + + +// damping parameters +struct dxDampingParameters { + dReal linear_scale; // multiply the linear velocity by (1 - scale) + dReal angular_scale; // multiply the angular velocity by (1 - scale) + dReal linear_threshold; // linear (squared) average speed threshold + dReal angular_threshold; // angular (squared) average speed threshold + + dxDampingParameters() {} + explicit dxDampingParameters(void *); +}; + + +// quick-step parameters +struct dxQuickStepParameters { + int num_iterations; // number of SOR iterations to perform + dReal w; // the SOR over-relaxation parameter + + dxQuickStepParameters() {} + explicit dxQuickStepParameters(void *); +}; + + +// contact generation parameters +struct dxContactParameters { + dReal max_vel; // maximum correcting velocity + dReal min_depth; // thickness of 'surface layer' + + dxContactParameters() {} + explicit dxContactParameters(void *); +}; + +// position vector and rotation matrix for geometry objects that are not +// connected to bodies. +struct dxPosR { + dVector3 pos; + dMatrix3 R; +}; + +struct dxBody : public dObject { + dxJointNode *firstjoint; // list of attached joints + unsigned flags; // some dxBodyFlagXXX flags + dGeomID geom; // first collision geom associated with body + dMass mass; // mass parameters about POR + dMatrix3 invI; // inverse of mass.I + dReal invMass; // 1 / mass.mass + dxPosR posr; // position and orientation of point of reference + dQuaternion q; // orientation quaternion + dVector3 lvel,avel; // linear and angular velocity of POR + dVector3 facc,tacc; // force and torque accumulators + dVector3 finite_rot_axis; // finite rotation axis, unit length or 0=none + + // auto-disable information + dxAutoDisable adis; // auto-disable parameters + dReal adis_timeleft; // time left to be idle + int adis_stepsleft; // steps left to be idle + dVector3* average_lvel_buffer; // buffer for the linear average velocity calculation + dVector3* average_avel_buffer; // buffer for the angular average velocity calculation + unsigned int average_counter; // counter/index to fill the average-buffers + int average_ready; // indicates ( with = 1 ), if the Body's buffers are ready for average-calculations + + void (*moved_callback)(dxBody*); // let the user know the body moved + dxDampingParameters dampingp; // damping parameters, depends on flags + dReal max_angular_speed; // limit the angular velocity to this magnitude + + dxBody(dxWorld *w); +}; + + +struct dxWorld : public dBase, public dxThreadingBase, private dxIThreadingDefaultImplProvider { + dxBody *firstbody; // body linked list + dxJoint *firstjoint; // joint linked list + int nb,nj; // number of bodies and joints in lists + dVector3 gravity; // gravity vector (m/s/s) + dReal global_erp; // global error reduction parameter + dReal global_cfm; // global constraint force mixing parameter + dxAutoDisable adis; // auto-disable parameters + int body_flags; // flags for new bodies + unsigned islands_max_threads; // maximum threads to allocate for island processing + dxStepWorkingMemory *wmem; // Working memory object for dWorldStep/dWorldQuickStep + + dxQuickStepParameters qs; + dxContactParameters contactp; + dxDampingParameters dampingp; // damping parameters + dReal max_angular_speed; // limit the angular velocity to this magnitude + + void* userdata; + + dxWorld(); + virtual ~dxWorld(); // Compilers issue warnings if a class with virtual methods does not have a virtual destructor :( + + void assignThreadingImpl(const dxThreadingFunctionsInfo *functions_info, dThreadingImplementationID threading_impl); + + unsigned calculateIslandProcessingMaxThreadCount(unsigned *ptrOut_activeThreadCount=NULL) const + { + unsigned activeThreadCount, *ptrActiveThreadCountToUse = ptrOut_activeThreadCount != NULL ? &activeThreadCount : NULL; + unsigned limitedCount = calculateThreadingLimitedThreadCount(islands_max_threads, false, ptrActiveThreadCountToUse); + if (ptrOut_activeThreadCount != NULL) { + *ptrOut_activeThreadCount = dMACRO_MAX(activeThreadCount, 1U); + } + return dMACRO_MAX(limitedCount, 1U); + } + + dxWorldProcessContext *unsafeGetWorldProcessingContext() const; + +private: // dxIThreadingDefaultImplProvider + virtual const dxThreadingFunctionsInfo *retrieveThreadingDefaultImpl(dThreadingImplementationID &out_defaultImpl); +}; + + +#endif // #ifndef _ODE__PRIVATE_OBJECTS_H_ |