TODO 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. @@@'s
  2. TODO for COLLISION
  3. ------------------
  4. box-box collision: adjust generated face-face contact points by depth/2 to
  5. be more fair.
  6. what happens when a GeomTransform's encapsulated object is manipulated,
  7. e.g. position changed. should this be disallowed? should a GeomTransform
  8. behave like a space and propagate dirtyness upwards?
  9. make sure that when we are using a large space for static environmental geoms,
  10. that there is not excessive AABB computation when geoms are added/removed from
  11. the space. the space AABB is pretty much guaranteed to cover everything, so
  12. there's no need to compute/test the AABB in this case.
  13. hash space: implement collide2() efficiently instead of the current
  14. simple-space-like brute-force approach.
  15. hash space: incremental scheme, so we dont have to rebuild the data structures
  16. for geoms that don't move.
  17. disabled geoms (remove from all collision considerations) ... isn't this the
  18. same as just taking it out of its enclosing group/space?
  19. integrate:
  20. dRay
  21. triangle collider - get latest tri collider code from erwin
  22. erwin's quadtree space
  23. tests:
  24. all aspects of collision API
  25. dGeomSetBody(0) maintains body-geom linked list properly.
  26. simple space: instantiate lots of non-moving geoms (i.e. environmental
  27. geoms and make sure that we're still able to collide efficiently.
  28. make sure AABB computation is efficient, or can be made efficient
  29. through proper use of the API.
  30. test C interface support for making new classes.
  31. make sure the dxGeom::aabbTest() function behaves as advertised.
  32. testing for contact point consistency: test for things that
  33. would cause the dynamics to fail or become unstable
  34. test for: small adjustment in geom position causes a big jump in the
  35. contact point set (bad for dynamics).
  36. test for: if contact constraints observed then it's impossible
  37. (or hard) to move the objects so that the penetration is
  38. increased. relax this when only a subset of the contact points are
  39. returned.
  40. test for consistency, e.g. the boundary of geoms X and Y can
  41. be defined by intersecting with a point, so test the intersection of X
  42. and Y by comparing with the point tests.
  43. check that contact points are in the collision volume
  44. all existing space tests, and more.
  45. demos:
  46. test_buggy: make a terrain out of non-moving geoms. use heirarchical
  47. groups to get efficient collision, even with the simple space.
  48. go though the new collision docs and make sure the behavior that is described
  49. there is actually implemented.
  50. multi-resolution hash table:
  51. the current implementation rebuilds a new hash table each time
  52. collide() is called. we don't keep any state between calls. this is
  53. wasteful if there are unmoving objects in the space.
  54. make sure we prevent multiple collision callbacks for the same pair
  55. better virtual address function.
  56. the collision search can perhaps be optimized - as we search
  57. chains we can come across other candidate intersections at
  58. other levels, perhaps we should do the intersection check
  59. straight away? --> save on list searching time only, which is
  60. not too significant.
  61. collision docs:
  62. optimization guide: whenever a single geom changes in a simple space,
  63. the space AABB has to be recomputed by examining EVERY geom.
  64. document this, or find a better behavior.
  65. TODO BEFORE NEXT RELEASE
  66. ------------------------
  67. g++ needed for compiling tests using gcc 3.2 ? what is the problem?
  68. add joint feedback info from lambda, so that we can get motor forces etc.
  69. need a way to map constraint indexes to what they mean.
  70. track down and fix the occasional popping/jumping problem in test_boxstack,
  71. especially when boxes are piled on top of each other. find out if this is
  72. caused by a configuration singularity or whether there is a bug in LCP.
  73. i need to add some kind of diagnostic tool to help resolve these kinds of
  74. problems.
  75. fixup ground plane jitter and shadow jumping in drawstuff.
  76. the inertias/COMs don't appear to be totally correct for the boxstack demo.
  77. fix up, and add a mode that shows the effective mass box (for a given density).
  78. Improve box-box collision, especially for face-face contact (3 contact points).
  79. Improve cylinder-box collision (2 contact points).
  80. windows DLL building and unix shared libs. libtool?
  81. also MSVC project files.
  82. dBodyGetPointVel()
  83. contrib directory - all stuff in ~/3/ode
  84. functions to allow systems to be copied/cloned
  85. dBodyTransplant (b, world)
  86. dTransplantIsland (b, world)
  87. dBodyCopy (bdest, bsrc)
  88. dJointCopy (jdest, jsrc) -- what about body connections?
  89. dCloneBody()
  90. dCloneJoint()
  91. dCloseBodyAndJointList()
  92. dCloneIsland()
  93. this collision rule:
  94. // no contacts if both geoms on the same body, and the body is not 0
  95. if (g1->body == g2->body && g1->body) return 0;
  96. needs to be replaced. sometimes we want no collision when both bodies are 0,
  97. but this wont work for geomgroup-to-environment. avoid stupid stuff like
  98. dGeomSetBody (geom_group, (dBodyID) 1);
  99. this also causes "failed-to-report" errors in the space test.
  100. Expose type-specific collision functions?
  101. Automatic code optimization process.
  102. joint limit spongyness: interacts with powered joints badly, because when the
  103. limit is reached full power is applied. fix or doc.
  104. various hinge2 functions may not function correctly if axis1 and axis2 are not
  105. perpendicular. in particular the getAngle() and getAngleRate() functions
  106. probably will give bogus answers.
  107. slow step function will not respect the joint getinfo2 functions calling
  108. addTorque() because it reads the force/torque accumulators before the
  109. getinfo2 functions are called.
  110. spaces need multiple lists of objects that can never overlap. objects in these
  111. lists are never tested against each other.
  112. deleting a body a joint is attached to should adjust the joint to only have
  113. one body attached. currently the connected joints have *both* their body
  114. attachments removed. BUT, dont do this if the dJOINT_TWOBODIES flag is set
  115. on the joint.
  116. document error, mem and math functions.
  117. Web pages
  118. credits section
  119. projects using ODE
  120. update C++ interface? use SWIG?
  121. collision exclusion groups - exclude if obj1.n == obj2.n ?
  122. make sure the amotor joint can be used with just one body. at the moment it
  123. only allows two-body attachments.
  124. implement dJointGetAMotorAngleRate()
  125. erwin says: Should the GeomGroup have a cleanupmode as the GeomTransform has?
  126. erwin says: http://q12.org/pipermail/ode/2002-January/000766.html
  127. and http://q12.org/pipermail/ode/2001-December/000753.html
  128. rename duplicate filenames (object.h?) - some environments can't handle this.
  129. naming inconsistency: dCreateSphere() should be dSphereCreate() (etc...) to
  130. match the rest of the API.
  131. TODO
  132. ----
  133. joint allocation in joint groups. allocation size should be rounded up using
  134. dEFFICIENT_SIZE, to properly align all the data members.
  135. all dAlloc() allocations should be aligned using dEFFICIENT_SIZE() ???
  136. automatic body & joint disabling / enabling.
  137. sometimes getting LCP infinite loops.
  138. function to get the entire island of bodies/joints
  139. joints:
  140. hinge2 joint - implement trail, i.e. non-convergent steering and wheel
  141. axes.
  142. erp individually settable for each joint?
  143. more joints:
  144. angular3 (constrian full angle not position)
  145. fixed path 1 (point must follow fixed path, etc etc)
  146. - other fixed path joints.
  147. linear a (point in 1 body fixed to plane of other)
  148. linear b (point in 1 body fixed to line on other)
  149. linear c (line in 1 body fixed to plane on other)
  150. linear d (line in 1 body fixed to line on other) - like
  151. prismatic but orientation along line can change
  152. Relative-Path-Relative-Oriention Joint (set all dofs of 2
  153. bodies relative to each other)
  154. spring (with natural length)
  155. universal (2 kinds)
  156. various angular relationships
  157. when attaching joints to static env, provision to move attachment
  158. point (e.g. give it a linear/angular velocity). this can be used
  159. instead of a FPFO joint on a body in many cases.
  160. also do this with contacts to static env, to allow for contacts to
  161. *moving* objects in the static env.
  162. interpretation of erp: is it (1) the error reduction per timestep,
  163. (2) or a time constant independent of timestep?? if it's (2) then
  164. perhaps this should be universal - this is already the meaning for
  165. the suspension.
  166. hinge2 suspension:
  167. suspension limits
  168. suspension limit restitution and spongyness??
  169. use autoconf? set paths in makefile?
  170. no-arg init functions, for andy
  171. explore: do joint parameters need to be set for the joint to be setup
  172. correctly, or should set some proper body-dependent params when it is
  173. attached? this is only really an issue for joints that have no parameters to
  174. set, such as the fixed joint.
  175. dAlloc() should take an arena parameters which is stored in dWorld.
  176. debugging mode should use dASSERT2 that prints a descriptive error message
  177. on error, not just the file:line or function. use dASSERT for internal
  178. consistency checking.
  179. when vectors and matrices are initialized, we must ensure that the padding
  180. elements are set to 0. this is going to be a problem everywhere!
  181. don't use 3-vectors anywhere. use SIMD friendly 4-vectors.
  182. make sure all data in body/joint etc objects is aligned well for single
  183. precision SIMD (i.e. all vectors start on a 16 byte boundary).
  184. think about more complicated uses of collision, e.g. a single geom representing
  185. an articulated structure.
  186. bodyGroup? (like joint group but for bodies). systemGroup?
  187. check the overhead of resizing Array<>s as elements are pushed on to them.
  188. replace alloca() with dPushFrame(), dPopFrame(), and dAlloca() ? allow for
  189. the possibility of allocating in non-stack memory ?
  190. make sure that we can set mass parameters with non-zero center of mass.
  191. if this is done after the body position is set, the position is adjusted.
  192. if this is done before the body position is set, what do we do when the
  193. pos is set? does the pos always refer to the center of mass from the user's
  194. point of view?
  195. consider splitting solver into functions, which can be optimized separately.
  196. might make things go faster.
  197. faster code for islands with a single body? faster code for dynamically
  198. symmetric bodies?
  199. rotation.cpp functions that set matrices should also set padding elements.
  200. lcp solver must return (L,d) and some other information, so we can re-solve
  201. for other right hand sides later on, but using the same complimentarity
  202. solution so there are no integrator discontinuities.
  203. dSetZero() - make fast inline functions for fixed n e.g. (1-4).
  204. need proper `sticky' friction, i.e. compensation for numerical slip.
  205. on windows, make sure gcc-compiles libs can be linked with VC++ apps. need
  206. to make sure some C++ runtime bits are present?
  207. kill all references to dArray<> (in geom.cpp).
  208. need testing code to test all joints with body-to-static-env
  209. copy stack.cpp, memory.cpp stuff to reuse
  210. dFactorLDLT() is not so efficient for matrix sizes < block size, e.g.
  211. redundant calls, zero loads, adds etc
  212. contacts: cheaper friction: viscous friction? one step delay friction force.
  213. in geom.cpp, for objects that are never meant to collide, dCollide() will
  214. always try to find the collider functions, which wastes a bit of time.
  215. geom.cpp:dCollideG() - handle special case of colliding 2 groups more
  216. efficiently.
  217. timer reporting function:
  218. void timerReport (void (*printFunction)(char *, ...));
  219. disabled bodies stored in a separate list, so they are never traversed at all,
  220. for speed when there are many disabled bodies.
  221. MAYBE
  222. -----
  223. new implementation for joint groups that is not so system dependent.
  224. maybe individual contacts are reusable? in this case contact information
  225. should be settable in the contact joints. max_size arg is really annoying.
  226. consider making anchor,axis, (everything) into a joint parameter and setting
  227. them with a consistent interface. also consider overload the joint functions
  228. so they are not distinguished by joint type??
  229. collision memory optimizations?
  230. collision: support for persistent contact information?
  231. multiply reference tri list data so that it can be cloned
  232. if the tri-list geoms could support rot/pos
  233. transformations then we could have several tri-lists pointing to the
  234. same vertex information.
  235. height fields
  236. pre-converted collision data -- Creating a hash space and associated
  237. opcode tree structures may take significant amounts of time for a
  238. large world with many 10s of thousands of triangles. Any chance of
  239. pre-building that off-line and passing a memory block pointer to the
  240. collision system?
  241. putting objects in multiple spaces -- If it was possible to add
  242. objects to more than one space, you could do collision queries other
  243. than 1vsN and NvsN. That flexibility might be useful when you want to
  244. only collide against a subset of the space. For example, a camera
  245. system may want to collide some rays with occlusion walls but the
  246. occlusion walls may also need to be in the game-level space to bounce
  247. against.
  248. ALWAYS
  249. ------
  250. make sure functions check their arguments in debug mode (e.g. using dASSERT).
  251. make sure joint/geom functions check for the specific object type.
  252. vectors alloca()ed on the stack must have the correct alignment, use ALLOCA16.
  253. library should have no global constructors, as it might be used with C linkage.
  254. use `const' in function arguments. blah.
  255. DON'T BOTHER
  256. ------------
  257. warning if user tries to set mass params with nonzero center of mass.
  258. DONE
  259. ----
  260. check: when contact attached with (body1,0) and (0,body1), check that polarity
  261. on depth and error info is okay for the two cases.
  262. set a better convention for which is the 1st and 2nd body in a joint, because
  263. sometimes we get things swapped (because of the way the joint nodes are used).
  264. hinge and prismatic, attachment to static environment.
  265. turn macros into C++ inline functions? what about C users?
  266. remove `space' argument to geom creation functions? make user add it?
  267. or just remove it from dCreateGeom() ? <-- did this one.
  268. test_chain should be in C, not C++. but first must remove global constructors.
  269. add more functionality to C++ interface - dMass, dSpace, dGeom
  270. there should be functions to delete groups of bodies/joints in one go - this
  271. will be more efficient than deleting them one at a time, because less
  272. partitioning tests will be needed.
  273. should we expose body and joint object structures so that the user can
  274. explicitly allocate them locally, or e.g. on the stack? makes allocating
  275. temporary contact constraints easier. NO --> helps data hiding and therefore
  276. library binary compatability.
  277. joints:
  278. hinge & slider - DONE
  279. measure angle, rate - DONE
  280. power - DONE
  281. joint limits - DONE
  282. mixed powered+limited joints, powering away from limit - DONE
  283. hinge2 - DONE
  284. steering angle and rate measurement - DONE
  285. steering limits - DONE
  286. steering motor - DONE
  287. wheel motor - DONE
  288. wheel angle rate measurement - DONE
  289. optional hinge2 suspension: - DONE
  290. alignment of B&S part to given axis - DONE
  291. global framework for giving epsilon and gamma - DONE
  292. toss away r-motor, make power & stuff specific to joint - DONE
  293. it's just easier that way
  294. joint code reuse: - DONE
  295. use standard functions to set velocity (c), limits (lo,hi),
  296. spongyness (epsilon) etc, this prevents these functions from
  297. proliferating
  298. implicit spring framework - actually allow joints to return a value `k'
  299. such that J*vnew = c + k*f, where f = force needed to achieve
  300. vnew - DONE
  301. contact slip - DONE
  302. contact erp & cfm parameters (not just "softness") - DONE
  303. hinge2: when we lock back wheels along the steering axis, there is no
  304. error correction if they get out of alignment - DONE, just use high
  305. and low limits.
  306. joint limit spongyness: erp and cfm for joint set from world (global)
  307. values when joint created. - DONE
  308. joint limit restitution - DONE
  309. check inertia transformations, e.g. by applying steering torque to a thin
  310. wheel --> actually, i made test_I
  311. more comprehensive random number comparisons between slow and fast methods.
  312. - random PD inertia (not just diagonal).
  313. - random velocity
  314. - random joint error (make joints then move bodies a bit)
  315. check that J*vnew=c (slow step already does this, but it doesn't equal zero
  316. for some reason! - actually, when LCP constraint limits are reached, it wont!)
  317. tons of things in lcp.cpp (@@@), especially speed optimizations. also, we
  318. wanted to do index block switching and index block updates to take advantage
  319. of the outer product trick ... but this is not worth the effort i think.
  320. lcp.cpp: if lo=hi=0, check operation. can we switch from NL <-> NH without
  321. going through C? --> done.
  322. andy says: still having trouble with those resource files..
  323. drawstuff.res doesn't seem to build or be found under cygwin gcc.
  324. DOC how bodies and geoms associated then resolved in contact callback ... not
  325. really necessary.
  326. fix the "memory leak" in geom.cpp
  327. library should have no global constructors, as it might be used with C linkage.
  328. --> as long as test_chain1 works, there are none.
  329. DOC cfm, the derivation and what it means.
  330. --> partially done, could be better
  331. joint "get type" function
  332. andy says: in ode/src/error.cpp _snprintf() and _vsnprintf() are missing
  333. in testode: finite and isnan are missing. copysign is missing
  334. russ: okay here's the problem: i have Makefile.platform files for
  335. VC++, MinGW, but not Cygwin. Cygwin uses the unix-like functions
  336. for everything, but the VC++/MinGW configs assumes the MS C-runtime
  337. functions. this is easy to fix, except i need to install Cygwin
  338. which is a pain to do over MinGW. argh.
  339. build on linux - assumptions made about location of X11 lib, opengl etc.
  340. implement: dBodyAddForceAtPos,dBodyAddRelForceAtPos,dBodyAddRelForceAtRelPos,
  341. dBodyGetPointPos,dBodyGetPointVel,dBodyGetPointRelVel
  342. dJointAttach(), allow both bodies to be 0 to put the joint into limbo.
  343. space near-callback should be given potentially intersecting objects 100 at a
  344. time instead of 1 at a time, to save on calling costs ... which are trivial,
  345. so we don't bother to do this.
  346. doccer: @func{} also refs second etc function in function *list*.
  347. make sure joints can return 0 from GetInfo1, i.e. no constraints or "inactive"
  348. joint, and the step functions will handle it.
  349. when attaching contact with (0,body), instead of setting the reverse flag
  350. on the joint and checking it in getInfo2(), we should just reverse the normal
  351. straight away ... ?
  352. --> trouble is, dJointAttach() knows nothing about what kind of joint
  353. it is attaching.
  354. hinge2 needs to be attached to two bodies for it to work, make sure this is
  355. always the case. --> assertion added in dJointAttach().
  356. if two joints connect to the same two bodies, check that the fast solver
  357. works! -> it should.
  358. functions to get all the joints/bodies a body/joint is connected to.
  359. If I don't have the GCC libraries installed, HUGE_VALF is undefined.
  360. fix capped cylinder - capped cylinder collision so that two contacts can
  361. be generated.
  362. transformation geometry object.
  363. joint groups should also be destroyed by destroying the world --> naaahhh.
  364. DONT DO THIS: body/joint creators with world = 0 --> not inserted into any
  365. world. allow bodies/joints to be detached from a world (this is what happens
  366. to grouped joints when a world is destroyed).
  367. can bodies and joints be linked together when not attached to world??
  368. what happens when we have an island of b/j, some of which are not in
  369. world? soln: dont keep lists of b/j in the world, just infer it from
  370. the islands?
  371. body & joint disabling / enabling
  372. start a change log.
  373. collision flags - 0xffff mask.
  374. dBodyGetFiniteRotationMode() / ...Axis()
  375. dBodyAddForceAtRelPos()
  376. ball & socket joint limits and motors.
  377. auto-build env on windows: 3 compilers, debug/release, short/double =
  378. 12 combinations --> auto logs.
  379. handle infinities better: HUGE_VALF is not commanly defined, it seems.
  380. get rid of the __USE_ISOC9X macro in common.h
  381. perhaps just use a "big" number instead of the actual IEEE infinity, it's
  382. more portable anyway.
  383. --> new config system
  384. dCloseODE() - tidy up *all* allocated memory, esp in geom.cpp. used to keep
  385. leak detectors happy.
  386. extra API to get lambda and J'*lambda from last timestep.
  387. better stack implementation that is not so system dependent. but how will
  388. we do dynamic page allocation? do we even need to?
  389. all collision files will now be collision_*, not geom_*
  390. check exported global symbols - no C++ mangling.
  391. rename dSphere etc to dxSphere etc.
  392. C interface support for making new classes.
  393. make sure DLL-ized stuff preserved ... but class numbers should no longer be
  394. exported.
  395. point geom ( = sphere of radius 0 )
  396. geoms stored in doubly linked lists in space (fast removal).
  397. bodies need to keep geoms pointers and call dGeomMoved() in dBodySetPosition()
  398. etc and world step. PROBLEM: links dynamics and collision together too much,
  399. makes it hard to extract ODE collision ... unless we say: dGeomMoved() and
  400. dGeomID must be supplied by the new collision library!
  401. dCollide() should take spaces as arguments - it should call dSpaceCollide2()
  402. with its own callback that puts all found contacts in the array, stopping
  403. when there is no more space left in the array.
  404. dxSpace::getGeom() - the geom numbers will change as geoms are dirtied - find
  405. some other numbering scheme, or document this behavior.
  406. the 'placeable' property - objects that should not ever be attached to bodies
  407. should flag an error when setBody etc are called.
  408. dGeomSetBody(0) - DOC: the position and orientation of the body will be
  409. preserved. in this case the geom should NOT be dirtied (dGeomMoved() should
  410. not be called).
  411. DOC: dGeomGetBodyNext() as part of dynamics/collision interface
  412. groups/spaces are subclasses of geom.
  413. groups/spaces can contain other groups/spaces. geom can be owned by a
  414. group/space. collision handling:
  415. geom-geom : standard collision function
  416. geom-group : special space code
  417. group-group : n^2 tests (or n space tests) - hard to optimize because
  418. of disjoint space representations.
  419. group internal : normal space internal-collision code
  420. groups/spaces can be told that some objects never move, i.e. that the objects
  421. are locked. should we lock the whole space?
  422. locking: the AABB for the object is not recalculated
  423. groups/spaces can be told that the internal contents self-intersect or not.
  424. actually an old ODE group is the equivalent of an old ODE simple space.
  425. - just call dCollide() or not.
  426. the group doesn't get passed to the space callback any more ... only the
  427. intersecting geoms get passed? maybe the callback can initiate the extra
  428. intersection tests itself? (because we want programmable flexibility to
  429. determine what gets intersected and what doesn't)
  430. - NO
  431. infrastructure to indicate when an object has moved (and thus its AABB needs
  432. to be recalculated)
  433. space enumeration functions. make sure that there are no additions or deletions
  434. while enumeration is taking place.
  435. - documented the behavior, didn't disallow it
  436. cache the AABB in the dxGeom? (for non-moving objects) - perhaps keep a
  437. pointer to separately allocated space? ... no
  438. DOC: dGeomGetClass() is a first-class geom function, not in the "User
  439. defined classes" section. it returns a constant that can be checked
  440. against dSphereClass etc.
  441. remove dxGeom dependence on dBodyID? ... not yet
  442. dBase -> dxBase
  443. allow a geom to be inserted into multiple spaces? need this to optimize some
  444. kinds of tests ... no
  445. update docs.
  446. make CHECK_NOT_LOCKED an assert.
  447. DOC: "Calling these functions on a non-placeable geom results in a
  448. runtime error." ...in the debug build only?
  449. non-placeable geoms should not allocate dxPosR. perhaps pass a dGeom
  450. constructor arg that says 'placeable' or not - this also sets the
  451. GEOM_PLACEABLE flag.
  452. GeomTransform:
  453. final_pos and final_R valid if no GEOM_AABB_BAD flag!!!
  454. fix up this code, esp use of ComputeTX().
  455. Space incompatibilities: no dSpaceDestroy(), dGeomDestroy() does not
  456. take a dSpaceID ... dSpaceDestroy() added.
  457. GeomGroup incompatibilities:
  458. dCollide() used to take a GeomGroup and would return all the contact
  459. points for all the intersecting objects. now you have to call
  460. dSpaceCollide2() and get a callback for each one.
  461. need to provide old behavior.
  462. simple space optimization: we should keep the precomputed AABB for the
  463. non-moving geoms around, so that when the other geoms move we can just
  464. compute the AABBs for those geoms and then combine it with the non-moving AABB.
  465. --> too hard!
  466. collision build options: old and new
  467. tidyups for collision:
  468. * rationalize what stuff goes in what source files, and file names
  469. * minimize set of header files that all collision* sources use - after
  470. all changes.
  471. * update ode-cpp stuff (C++ interface header files).
  472. porting guide:
  473. ODE list email
  474. dGeomGetSpaceAABB() deleted
  475. dGeomGetClass (geom_group); used to return a unique type for
  476. GeomGroups, but now it returns dSimpleSpaceID.
  477. tidyups: update DLL declarations.