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