mirror of
https://github.com/wassname/pyrobolearn.git
synced 2026-10-04 13:00:30 +08:00
197 lines
8.0 KiB
C++
197 lines
8.0 KiB
C++
/*************************************************************************
|
|
* *
|
|
* 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 "threading_base.h"
|
|
|
|
class dxJointNode; // added by Brian
|
|
|
|
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 emit warnings if a class with virtual methods does not have a virtual destructor :(
|
|
|
|
static bool InitializeDefaultThreading();
|
|
static void FinalizeDefaultThreading();
|
|
|
|
void AssignThreadingImpl(const dxThreadingFunctionsInfo *functions_info, dThreadingImplementationID threading_impl);
|
|
unsigned GetThreadingIslandsMaxThreadsCount(unsigned *out_active_thread_count_ptr=NULL) const;
|
|
dxWorldProcessContext *UnsafeGetWorldProcessingContext() const;
|
|
|
|
private: // dxIThreadingDefaultImplProvider
|
|
virtual const dxThreadingFunctionsInfo *RetrieveThreadingDefaultImpl(dThreadingImplementationID &out_default_impl);
|
|
};
|
|
|
|
|
|
#endif // #ifndef _ODE__PRIVATE_OBJECTS_H_
|