Changelog
This page will try to keep track of changes at least between releases and the previous release. In contrast with the file CHANGELOG, this page won't need every up to date little change, but we can explain changes in more detail (why the change is good for ...) It is a quick summary of what changed. When there are major changes, pages explaining about how to migrate the users' code should be needed.
Contents
Changes for 0.13.1
This is mostly a bugfix release:
- The new implicit gyroscopic forces introduced in 0.13 were computed incorrectly, it should give more correct results now (thanks to Szabolcs Deak for reporting it).
New features:
- New macro:
dODE_VERSION
(issue #24). - New function:
dJointGetHinge2Angle2
(issue #12). - New function:
dWorldSetData
/dWorldGetData
(issue #21). - New functions:
dGeomRay[S|G]etFirstContact
,dGeomRay[S|G]etBackfaceCull
(issue #9); these supersede functionsdGeomRay[S|G]etParams
, which are now deprecated.
Changes for 0.13
New features:
- Stable, implicit gyroscopic forces (patch #185 by Joseph Cooper). Bodies with gyroscopic forces won't gain energy anymore.
- New joint: transmission joint (patch #182 by Dimitris Papavasiliou).
- Contacts now have rolling friction (patch #184 by Joseph Cooper).
- Removed the need for defining dSINGLE/dDOUBLE; this is stored now in the generated ode/precision.h header.
- New joint: Double Ball (AKA "distance joint").
- New joint: Double Hinge.
- Threaded execution support interface added. Optional built-in threading implementation added. Internal threading implementation is excluded by default and to be used, it must be enabled with configure/premake: --disable-threading-intf (--no-threading-intf for Windows/Premake). This allows disabling threading interface support.
Bug fixes
- Joint feedback forces application fixed in QuickStep implementation
- Bug #89 by Luc: (dJointAddSliderForce() adds a zero force when the parent body is NULL)
- Bug #88 by Luc: heightfield data assigned to a wrong field in dGeomHeightfieldSetHeightfieldData
- Fixed cylinder AABB computation.
- Removed ALLOCA calls from dHashSpace; it should not depend on stack size limits anymore.
- Bugs in AMotor joint (patch #181)
- Bugs in PU joint (patch #186)
- Fixed issue with friction and non-friction constraints being intermixed during constraints random reordering in QuickStep.
- Fixed matrix inversion bug (patch #183).
- Fixed issue with some kinds of joints (Ball, DBall, DHinge, Fixed) might overwrite world ERP value with their custom ERP during getInfo2() call and that inappropriate value would then be passed to subsequent joints in solver instead of world ERP.
- Fixed issues reported in patches #151 and #22 (collisions with SAPSpace and QuadTreeSpace might not work because geometries list was misused in them).
- Fixed IsPointInPolygon in convex.cpp (patch #160 by Janis Rucis)
- Fixed zero comparisons in OPCODE to use relative error instead of absolute epsilon value (found by Bill Sellers)
- Fixed dhinge's last constraint to properly handle rotations.
- Fixed plane2d joint: uninitialized variables (reported by Dimitris Papavasiliou)
- Bug #80 by Georg Martius: better handling of capsule-box with deep penetrations.
- Fixed zero-mu issues: now either mu or mu2 can be set to zero.
Other changes
- Public headers cleaned to cause less pollution of typedefs and macros.
Changes for 0.12
- Added python bindings, contributed by Gideon Klompje.
- Integrated libccd from Daniel Fiser, provides new colliders based on GJK, EPA and MPR. Now cylinders can collide with cylinders!
- New functions have been added:
- dWorldUseSharedWorkingMemory()
- dWorldCleanupWorkingMemory()
- dWorldSetStepMemoryReservationPolicy()
- dWorldSetStepMemoryManager()
- dGeomLowLevelControl(): change/query OPCODE trimesh-sphere contact merging behavior at runtime.
- dGeomGetRelPointPos() (patch #2991622)
- dGeomGetPosRelPoint() (patch #2991622)
- dGeomVectorToWorld() (patch #2991622)
- dGeomVectorFromWorld() (patch #2991622)
- dWorldStepFast1 API removed along with dWorld[Get/Set]AutoEnableDepthSF1
- dWorldStep() and dWorldQuickStep() have been changed to return boolean success status, and avoid allocation on stack.
- dInitODE2() changed to automatically call AllocateODEDataForThread(dAllocateFlagBasicData) after library initialization.
- Made sure neither dSINGLE or dDOUBLE is defined by default; the user should always explicitly specify the precision.
- Fixed a bug in dGeomCopyOffsetRotation().
- Macros changed to static inline functions in odemath.h and related files.
- Improvement for trimesh-plane collision.
- odecpp classes changed to be inheritable and easily expandable
- QuadTreeSpace implementation corrected to avoid object-block relation ambiguity due to numeric errors.
- Fixed bug affecting disabled joints and dWorldStep.
- Added extern "C" wrapper to dWorldExportDIF().
- Fixed bug #2937076: don't try to build demos if drawstuff is disabled.
- Applied patch #2931174 to make demos work for recent MacOS.
- Applied patch #2931177 to fix the demos' framerate on X11.
- Applied patch #2995450 to generate up to four contacts for box-plane collision test and fix contact depths.
- Applied patch #3030783 to fix drawstuff dimensions being ignored in OSX GLUT port.
- Applied patch #3429454: fix compilation on some platforms.
- Heightfield zone boundaries calculation code fixed to also consider whole next cell after the AABB if the AABB ends exactly at the cell boundary.
- New demo: demo_tracks.
- Fixed a box-capsule bug: more reasonable normal for deep penetrations.
- Many internal fixes to world stepping and collision detection code.
Changes for 0.11.1
- Made the new trimesh collider the default.
- Added a "-texturepath" option to drawstuff.
- Heightfield rotation fixed to avoid NaNs while rotating infinite MIN/MAX heights.
- Incorrect parameter order fixed on contact merging in Sphere-Trimesh collisions.
- Fixed bug #2685170: use the C99 __func__ instead of __FUNCTION__ when a C99 implementation is available.
- Remove unused code in demo_joints.cpp.
- Fix bug in collision categories in demo_jointPU.
- Added a possibility to initialize/close ODE multiple times recursively has been added. Also, now a call to dSpaceSetManualCleanup() is required for each space right after creation if ODE has been initialized in thread data manual cleanup mode.
- Thread local data has been cleaned up from OPCODE and OdeTls.
- New house of cards demo, which stresses the friction handling stability.
Changes for 0.11
This release contains many joint-related bug fixes, and some new features like kinematic bodies, better convex-convex collision detection and some extra functions.
- Fix bug: Fix problem when attaching no body to a joint.
- Fix problem with dJointGetUniversalAngle2 when the joint is attached to only a body 2. The sign was inverted.
- Fix bug reported by Tilman: dxJointPU::getInfo1 was setting twice the limit of limot1 to zero and not limot2.
- Fixed a bug in dSpaceCollide2: if both geoms are not in spaces they would not have valid AABBs.
- Swapped geometries returned in contacts for OPCODE Trimesh-Plane collisions as they were returned in unnatural order being different from that in GIMPACT
- Fixed an inverted sign problem on positions of joints PU and PR.
- Fix bug: when a slider, piston, pu or pr joint had only one body attached to position 2, dJointAttach(jId, 0, bId). The body was not push in the right direction to move back between the limits.
- Fix bug in dJointGetPUAxis2: the axis was not multiplied with the the rotation matrix of the good body.
- Fix bug if there is only one body on the PU joint the axis returned was not the right one.
- New functions: dJointSetUniversalAxis1Offset and dJointSetUniversalAxis2Offset.
- New functions: dJointEnable, dJointDisable, dJointIsEnabled (patch #2454764).
- New functions: dGeomTriMeshSetTriMergeCallback/dGeomTriMeshGetTriMergeCallback.
- New function: void dJointSetPUAnchorOffset (deprecating dJointSetPUAnchorDelta).
- New functions: dJointGetPRAngle and dJointGetPRAngleRate.
- New functions: dBodyGetGyroscopicMode and dBodySetGyroscopicMode (patch #2019242).
- Applied patch #2538046: Heightfield AABB bounds patch.
- Applied patch #2381592, which adds support for Kinematic Bodies.
- Applied a patch to make GIMPACT trimesh-ray collisions to be consistent with those in OPCODE (bug #2214623).
- Applied a patch to make side1, side2 fields of contact structure be always initialized.
- Applied patch #2158425: This patch enable GIMPACT to work on 64-bit machine.
- Applied patch #2080674: Improved dBodySetRotation; now exact rotation matrices are preserved until the next simulation step.
- Enable the motor on the rotoide part of the PR joint.
- Added Blender script to create ODE convex geoms under tools.
- Convex-Convex collision detection code is finally (nearly) stable.
Changes for 0.10.1
This is a bugfix release, so you shouldn't expect anything to stop working from 0.10.
- New function: dJointSetPistonAnchorOffset
- Add new function dJointSetHingeAxisDelta
- Fix problem with dJointGetPistonPosition and dJointGetPistonPositionRate when the joint is attached to only a body 2. The sign was inversed.
- Update the slider joint to have the same behavior as the other joint when there is only a body2 attached to it.
- Rename the new function dJointSetHingeAxisDelta to dJointSetHingeAxisOffset. This will remove confusion with the old function dJointSetHingeAnchorDelta.
- Bug fix: Max Correcting Vel behavior is now the same as before 0.10.
Changes for 0.10
- New functions: dInitODE2(), dAllocateODEDataForThread(), dCleanupODEAllDataForThread(). This adds support for ability to run collision detection from multiple threads for separate spaces.
- New functions: dCheckConfiguration(), dGetConfiguration(), to test how ODE was compiled.
- New function: dJointGetNumBodies (patch #1901550).
- New function: dSpaceGetClass (patch #1901637).
- New function: dSetColliderOverride(), to register custom collision handling functions.
- Added damping and MaxAngularVel() functions.
- Applied patch #1335202: Contact Joint Motion (see demo_motion.cpp).
- Applied patch #1851394: support for GIMPACT with double precision, dCollide fix.
- Applied patch #1813079 (moved callback).
- Added possibility to collide a space of lower sublevel as a geometry against another space of a higher level with dSpaceCollide2. dSpaceSetSublevel/dSpaceGetSublevel are used for sublevel assignment/retrieval.
- Fixed a bug in dJointXXXGetInfo. The value in limot.limit was not always updated. (Ex: If hi and lo limit were changed).
- New Joint: Prismatic Universal (patch #1828454).
- New Joint: Piston, with demo.
- Disabled building shared library by default with autotools. ODE shouldn't be installed as a system library.
- Fixed drawstuff build issues on OSX.
- Removed release and debug flags for configure.in: CPPFLAGS, CFLAGS, CXXFLAGS should be set by the user to their liking, respecting autotools policies.
- Added 'Sweep and Prune' collision space.
- Optimizations, many bug fixes, and code cleanup.
Changes from 0.8 to 0.9
- New Feature: CONTACTS_UNIMPORTANT flag added for dCollide() to allow canceling any contact improvements and return any contacts found as soon as possible
- New feature: Add erp/cfm parameters to fixed and ball joint. SF PATCH 1478244
- Assert on zero normalizations, add dSafeNormalize. Added boolean result for dNormalize3() and dNormalize4() so that normalization success could be checked
- SF Patch 1808007: fix gimpact compiler warning
- Apply SF patch 1800579: dGeomTriMeshSetData does not work with GIMPACT
- Fix: heightfield collision could return less contacts than was possible
- Fix: the deepest contact might be not selected if there was a lack of contact slots in trimesh-trimesh and trimesh-box cases (function exited immediately and did not check for possible contact coincidences).
- Improvement: optimizations for GIMPACT versions of trimesh-capsule, trimesh-trimesh, trimesh-plane, trimesh-sphere
- Improvement: dCollideConvexPlane optimized
- Fix: cylinder-box collision did not respect requested contact count limit
- Fix SF issue 1729096 by adding dMassSetTrimeshTotal
- Apply SF patch 1685107: Enforce 1 contact request
- Apply SF Patch 1697014: Update JointPR code
- Catch SF BUG 1621938: gimpact only does stride 12.
- patch 1769851 by Jon Watte: recalc aabb when new setting new data
- Added Richard Barrington's model loader for XNA (to be used with ODE.NET)
- 1586733 collision_trimesh_trimesh.cpp OPCODE fix Added Francisco Leon's alternate trimesh-trimesh collider.
- 1691402 Heighfield performance patch patch
- 1696933 Fix bug in dWorldExportDIF when joint in "limbo"
- Renamed "tests" to "demos" and split out unit test project. Updated premake scripts and Visual Studio files; automake files still need to be updated.
- Make building demos optional. SF patch 1650563
- lib64 fixes, SF patch 1646598
- Warn against using double precision with gimpact
- Many more bug fixes and optimizations.
Changes from 0.7 to 0.8
- New Rotoide - Prismatic Joint
- Optimisation when dGYROSCOPIC is disabled (default)
- dJointGetUniversalAngles to efficiently get both angles at once.
Changes from 0.6 to 0.7
- New heightfield primitive for terrains.
- Trimesh-Plane collision.
- Ray-Cylinder collision.
- Integration of the plane-2d joint.
- Improved support for convex hulls.
- Fix for joint limit handling.
- Half-space optimisation for axis aligned planes.
Changes from 0.5 to 0.6
- Added flat-capped cylinders.
- CCylinder has been renamed as Capsule.
- Added support for geom offsets.
- Improved stepping function (dWorldQuickStep)
- Much improved support for trimesh collision shapes
- Added support for 64-bit systems
- Started support for convex hulls
- New and improved build system
- Lots of bug fixes, stability, and performance improvements
Geom Offset Overview
Geom offsets allow geom objects to be offset from a body's position. This is useful for cases where an object has an offset centre of mass, or is made up out of several geoms each with their own local position. Native support for geom offsets means that the geomTransform container is now obselete.
The real advantage over geomTransform is that there is a much easier interface for setting, getting, and modifying a geom's offset from its body. The elimination of geomTransform simplifies callbacks which no longer have to special case that geom class type. In terms of performance, the new code has a negligible performance difference and a memory improvement compared to using a geomTransform.
Geom Offset and Bodies
An offset only makes sense for geoms which are connected to bodies. It is an error to attempt to set an offset for a geom which is not connected to a body. When a geom is disconnected from a body, any offset will be automatically eliminated. Thus, the possible states a geom can be in are:
- Geom
- Geom on body
- Geom on body, with an offset
To create an offset, just call on of the geomSetOffset functions. The offset will be automatically created if it does not yet exist. Geom offsets are normally set by specifying the offset in local coordinates. An extra set of functions are provided to allow an offset to be determined by providing world coordinates and subtracting them from the current body position. These second set of functions, geomSetOffsetWorldPosition(),etc, allow the user to essentially say "keep the body where it is, and move its geom to this position in the world".
Geom Offset API
This is defined in the doxygen documentation.
Geom Offset affect on existing API
The following functions have been updated such that they transparently work with offsets.
void dGeomSetPosition (dGeomID, dReal x, dReal y, dReal z) void dGeomSetRotation (dGeomID, const dMatrix3 R) void dGeomSetQuaternion (dGeomID, const dQuaternion) const dReal * dGeomGetPosition (dGeomID) const dReal * dGeomGetRotation (dGeomID) void dGeomGetQuaternion (dGeomID, dQuaternion result) void dGeomGetAABB (dGeomID, dReal aabb[6])
The functions that get a geom's position will return its final position in world coordinates. If a geom is offset, it is no longer true that dGeomGetPosition()==dBodyGetPosition(). Instead, each will return its own world position, with the geom being offset from the body.
The functions that set a geom's position will move the body to the position such that the geom will have the position passed in. So if the geom has a positional offset of (0,0,1), and we call dGeomSetPosition(g,10,10,10), the end result will be the body's position being set to (10,10,9). As such, either dGeomSetPosition or dBodySetPosition can be used, depending on which is more convenient. The other position is automatically updated.
Geom Offset and geomTransform
GeomTransforms are still supported, and all existing code transparently works. When writing new code, however, it is far easier to work with geoms and offsets.
The change eliminates a large amount of special casing needed to do when working with geomTransforms. Setting an offset is trivial, and does not require inserting or removing new GeomTransforms from spaces. There is no need to special case getting an offset geom's world position, or setting an offset geom's world position.
It is especially useful in the collide callback. The old way required getting the object as the real geom (but without being able to easily grab its Transform, or even its body!), or as its Transform (forcing special casing code to extract the real geom in that case).
Changes previous to 0.5 version
Version 0.5 is largely anterior to this Wiki. It is the first version to see widespread use in many GPL and commercial programs. The complete changelog is listed in changelog.txt file in the root ODE directory.