Changelog
From ODE Wiki
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.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
- Removed code duplication for dNormalize() and dSafeNormalize() and made dNormalize() to be a wrapper.
- Added macro to mark variable as used (to avoid "unused variable" compiler warning)
- Assert on zero normalizations, add dSafeNormalize
- Improvement: Improved vector normalization in three functions.
- Fix: Added checking for the success of edge plane generation.
- Improvement: 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: Changed dummy normal generation to contact removal for the case when several contacts completely compensate each other
- Fix: fixed contact normal averaging for contacts with matching position and depth
- Fix: Fixed assertion condition to allow larger computational error
- Fix: tempPlaneBuffer might be not initialized completely on reallocation (introduced in Revision #1258)
- Remove assert triggered by demo_plane2d in single precision
- Fix --disable-debug flag
- Changed alloca to ALLOCA in collision_space.cpp and quickstep.cpp.
- Add erp/cfm parameters to fixed and ball joint. SF PATCH 1478244
- Cosmetic: unused variable removed
- Improvement: Changed numeric constant to ODE style to avoid compiler warning
- Fix: memory corruption due to improper resolution of fix #1224 (had not noticed that dxHeightfield::tempPlaneBuffer elements could be swapped)
- Improvement: added small alignment for element count in temporary buffer allocations (allocation with reserve) to minimize possible reallocations
- Improvement: assertion check for array boundary violation added
- Improvement: validation for zero element count added in temporary buffers
- Ask for at least 1 contact in demos
- Improvement: changed some immediate constants, types and functions to be in ODE style
- Cosmetic: Cosmetic: changed some inlined code to ODE utility function calls
- Cosmetic: Cosmetic: changed some inlined code to ODE utility function calls
- Improvement: unnecessary variable removed
- Cosmetic: changed some inlined code to ODE utility function calls
- Improvement: changed variable type from float to dReal to prevent possible loss of precision in future
- Improvement: changed immediate 0xffff to NUMC_MASK in code that extracts maximal contact count from flags parameter of dCollide()
- Feature: CONTACTS_UNIMPORTANT flag added for dCollide() to allow canceling any contact improvements and return any contacts found as soon as possible
- Rewritten hash table management algorithm to make the following fixes:
- Fix: program did not search for key match if hash table bucket was full
- Fix: only lower 8 bits of 32 bits available were used for hash table bucket selection
- Fix: possible loss of input because of converting of input coordinate values to integers
- Improvement: better bit distribution in hash value
- Fix: different contacts could be merged together because of hash collision unchecked
- Also, the new implementation allowed the following fix:
- Fix: the rest of contacts were ignored if all contact slots were already occupied instead of trying to merge them with some of matching previous contacts
- Fix: heightfield collision could return less contacts than was possible
- Improvement: Some minor algorithm improvements
- Improvement: Added consistent assertion checks on entry to each collider function.
- Improvement: Moved all contact buffer full checks from beginnings of the blocks to follow the code that does actual contact generation.
- Improvement: Removed checks for zero contact count limit from all the collider functions and added single check on entry to dCollide() instead.
- 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
- Cosmetic: variable name changed to be in positive form
- Improvement: unnecessary casting from real to int and backwards from int to real removed
- Improvement: commented debug code
- Fix: fixed printf() parameter types in it
- Improvement: unnecessary memory allocations/deletions removed
- Improvement: expression optimized
- Fix: incapsulation violation removed
- Cosmetic: conditional define removed
- Incomplete correction: commented explicit casts to float type on assignment to OPCODE structures
- Improvement: avoiding duplicate expression evaluation in macros
- Cosmetic: unnecessary references to int removed
- Cosmetic: moved expression into a local variable to match style of other similar functions
- Cosmetic: semicolons added after macro to conform to C-style syntax
- Fix: dxHeightfield::tempHeightBuffer[i] memory never released (wrong condition "xSize < x" in for-loop of dxHeightfield::resetHeightBuffer)
- Fix: dxHeightfield::tempPlaneBuffer[i] memory never released on reallocation (only master memory block was deleted)
- Improvement: Made height and plane temporary buffers to be allocated with a single memory block for all the cells
- Fix: cylinder-box collision did not respect requested contact count limit
- Fix: side1 member of ContactGeom was not assigned in GIMPACT version of trimesh-box collision checking
- Cosmetic: note added to indicate a potential issue when several contacts completely compensate each other
- Fix: least contact depth was selected instead of deepest one during merging
- dFloor() definition added
- Fix SF issue 1729096 by adding dMassSetTrimeshTotal
- update license year
- Add all functions from rotation.h
- Added joint parameters
- Updated OdeModelProcessor from Richard Barrington.
- Explain licensing of contributions in README
- Tweaks to release scripts to reflect latest svn host names
- Apply SF patch 1685107: Enforce 1 contact request
- Apply SF Patch 1697014: Update JointPR code
- Catch SF BUG 1621938: gimpact only does stride 12.
- Fixed typo, added asserts
- Fix build instructions
- bumped version nr to 0.8.1-rc1
- patch 1769851 by Jon Watte: recalc aabb when new setting new data
- Add some comments and try to understand the gimpact stack
- Fixed disabling in hash space. SF bug 1693383
- Added Richard Barrington's model loader for XNA (to be used with ODE.NET)
- Fixed warning (in VS2005): Conversion from 'time_t' to 'unsigned int', possible loss of data.
- Update project files to support new trimesh collider
- 1586733 collision_trimesh_trimesh.cpp OPCODE fix Added Francisco Leon's alternate trimesh-trimesh collider. "#define dTRIMESH_OPCODE_USE_NEW_TRIMESH_TRIMESH_COLLIDER 1" to activate it (default off) See mailing list for details.
- Fix for int assigned to float without cast warning.
- Removed makefile.am reference to "odecpp_old.h"
- 1699009 odemath.h dVALIDATEVEC4(v) macro
- 1667375 Really small optimization in joint.cpp
- 1691402 Heighfield performance patch patch
- Fix two bug introduced in last patch and reported in mailing list :
- Ray segfault on tagential cases
- XZ oriented terrain that was letting object falling through and made the reporter uses previous implementation.
- 1696933 Fix bug in dWorldExportDIF when joint in "limbo"
- Patch to fix NULL pointer dereference for 'limbo' joints, by Remi Ricard
- PRGetInfo2, remove unused variable 'int i' to fix compiler warning.
- removed old cruft
- Added unit tests
- ode/test renamed to ode/demo
- 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 tests optional. SF patch 1650563
- lib64 fixes, SF patch 1646598
- added test_jointPR (sf patch 1654464)
- Warn against using double precision with gimpact
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.

