aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ode-0.9/ode/TODO
diff options
context:
space:
mode:
authordan miller2007-10-19 05:20:07 +0000
committerdan miller2007-10-19 05:20:07 +0000
commitfca74b0bf0a0833f5701e9c0de7b3bc15b2233dd (patch)
tree51bcae7a1b8381a6bf6fd8025a7de1e30fe0045d /libraries/ode-0.9/ode/TODO
parentresubmitting ode (diff)
downloadopensim-SC_OLD-fca74b0bf0a0833f5701e9c0de7b3bc15b2233dd.zip
opensim-SC_OLD-fca74b0bf0a0833f5701e9c0de7b3bc15b2233dd.tar.gz
opensim-SC_OLD-fca74b0bf0a0833f5701e9c0de7b3bc15b2233dd.tar.bz2
opensim-SC_OLD-fca74b0bf0a0833f5701e9c0de7b3bc15b2233dd.tar.xz
dont ask
Diffstat (limited to 'libraries/ode-0.9/ode/TODO')
-rw-r--r--libraries/ode-0.9/ode/TODO698
1 files changed, 0 insertions, 698 deletions
diff --git a/libraries/ode-0.9/ode/TODO b/libraries/ode-0.9/ode/TODO
deleted file mode 100644
index cf6cdaa..0000000
--- a/libraries/ode-0.9/ode/TODO
+++ /dev/null
@@ -1,698 +0,0 @@
1
2@@@'s
3
4
5TODO for COLLISION
6------------------
7
8box-box collision: adjust generated face-face contact points by depth/2 to
9be more fair.
10
11what happens when a GeomTransform's encapsulated object is manipulated,
12e.g. position changed. should this be disallowed? should a GeomTransform
13behave like a space and propagate dirtyness upwards?
14
15make sure that when we are using a large space for static environmental geoms,
16that there is not excessive AABB computation when geoms are added/removed from
17the space. the space AABB is pretty much guaranteed to cover everything, so
18there's no need to compute/test the AABB in this case.
19
20hash space: implement collide2() efficiently instead of the current
21simple-space-like brute-force approach.
22
23hash space: incremental scheme, so we dont have to rebuild the data structures
24for geoms that don't move.
25
26disabled geoms (remove from all collision considerations) ... isn't this the
27same as just taking it out of its enclosing group/space?
28
29integrate:
30 dRay
31 triangle collider - get latest tri collider code from erwin
32 erwin's quadtree space
33
34tests:
35 all aspects of collision API
36
37 dGeomSetBody(0) maintains body-geom linked list properly.
38
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.
43
44 test C interface support for making new classes.
45 make sure the dxGeom::aabbTest() function behaves as advertised.
46
47 testing for contact point consistency: test for things that
48 would cause the dynamics to fail or become unstable
49
50 test for: small adjustment in geom position causes a big jump in the
51 contact point set (bad for dynamics).
52
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.
57
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.
61
62 check that contact points are in the collision volume
63
64 all existing space tests, and more.
65
66demos:
67 test_buggy: make a terrain out of non-moving geoms. use heirarchical
68 groups to get efficient collision, even with the simple space.
69
70go though the new collision docs and make sure the behavior that is described
71there is actually implemented.
72
73multi-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.
77
78 make sure we prevent multiple collision callbacks for the same pair
79
80 better virtual address function.
81
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.
87
88collision 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.
92
93
94
95TODO BEFORE NEXT RELEASE
96------------------------
97
98g++ needed for compiling tests using gcc 3.2 ? what is the problem?
99
100add joint feedback info from lambda, so that we can get motor forces etc.
101need a way to map constraint indexes to what they mean.
102
103track down and fix the occasional popping/jumping problem in test_boxstack,
104especially when boxes are piled on top of each other. find out if this is
105caused by a configuration singularity or whether there is a bug in LCP.
106i need to add some kind of diagnostic tool to help resolve these kinds of
107problems.
108
109fixup ground plane jitter and shadow jumping in drawstuff.
110
111the inertias/COMs don't appear to be totally correct for the boxstack demo.
112fix up, and add a mode that shows the effective mass box (for a given density).
113
114Improve box-box collision, especially for face-face contact (3 contact points).
115Improve cylinder-box collision (2 contact points).
116
117windows DLL building and unix shared libs. libtool?
118also MSVC project files.
119
120dBodyGetPointVel()
121
122contrib directory - all stuff in ~/3/ode
123
124functions 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()
133
134this 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;
137needs to be replaced. sometimes we want no collision when both bodies are 0,
138but this wont work for geomgroup-to-environment. avoid stupid stuff like
139 dGeomSetBody (geom_group, (dBodyID) 1);
140this also causes "failed-to-report" errors in the space test.
141
142Expose type-specific collision functions?
143
144Automatic code optimization process.
145
146joint limit spongyness: interacts with powered joints badly, because when the
147limit is reached full power is applied. fix or doc.
148
149various hinge2 functions may not function correctly if axis1 and axis2 are not
150perpendicular. in particular the getAngle() and getAngleRate() functions
151probably will give bogus answers.
152
153slow step function will not respect the joint getinfo2 functions calling
154addTorque() because it reads the force/torque accumulators before the
155getinfo2 functions are called.
156
157spaces need multiple lists of objects that can never overlap. objects in these
158lists are never tested against each other.
159
160deleting a body a joint is attached to should adjust the joint to only have
161one body attached. currently the connected joints have *both* their body
162attachments removed. BUT, dont do this if the dJOINT_TWOBODIES flag is set
163on the joint.
164
165document error, mem and math functions.
166
167Web pages
168 credits section
169 projects using ODE
170
171update C++ interface? use SWIG?
172
173collision exclusion groups - exclude if obj1.n == obj2.n ?
174
175make sure the amotor joint can be used with just one body. at the moment it
176only allows two-body attachments.
177
178implement dJointGetAMotorAngleRate()
179
180erwin says: Should the GeomGroup have a cleanupmode as the GeomTransform has?
181
182erwin says: http://q12.org/pipermail/ode/2002-January/000766.html
183 and http://q12.org/pipermail/ode/2001-December/000753.html
184
185rename duplicate filenames (object.h?) - some environments can't handle this.
186
187naming inconsistency: dCreateSphere() should be dSphereCreate() (etc...) to
188match the rest of the API.
189
190
191TODO
192----
193
194joint allocation in joint groups. allocation size should be rounded up using
195dEFFICIENT_SIZE, to properly align all the data members.
196
197all dAlloc() allocations should be aligned using dEFFICIENT_SIZE() ???
198
199automatic body & joint disabling / enabling.
200
201sometimes getting LCP infinite loops.
202
203function to get the entire island of bodies/joints
204
205joints:
206 hinge2 joint - implement trail, i.e. non-convergent steering and wheel
207 axes.
208
209 erp individually settable for each joint?
210
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
225
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.
231
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.
236
237 hinge2 suspension:
238 suspension limits
239 suspension limit restitution and spongyness??
240
241use autoconf? set paths in makefile?
242
243no-arg init functions, for andy
244
245explore: do joint parameters need to be set for the joint to be setup
246correctly, or should set some proper body-dependent params when it is
247attached? this is only really an issue for joints that have no parameters to
248set, such as the fixed joint.
249
250dAlloc() should take an arena parameters which is stored in dWorld.
251
252debugging mode should use dASSERT2 that prints a descriptive error message
253on error, not just the file:line or function. use dASSERT for internal
254consistency checking.
255
256when vectors and matrices are initialized, we must ensure that the padding
257elements are set to 0. this is going to be a problem everywhere!
258
259don't use 3-vectors anywhere. use SIMD friendly 4-vectors.
260
261make sure all data in body/joint etc objects is aligned well for single
262precision SIMD (i.e. all vectors start on a 16 byte boundary).
263
264think about more complicated uses of collision, e.g. a single geom representing
265an articulated structure.
266
267bodyGroup? (like joint group but for bodies). systemGroup?
268
269check the overhead of resizing Array<>s as elements are pushed on to them.
270
271replace alloca() with dPushFrame(), dPopFrame(), and dAlloca() ? allow for
272the possibility of allocating in non-stack memory ?
273
274make sure that we can set mass parameters with non-zero center of mass.
275if this is done after the body position is set, the position is adjusted.
276if this is done before the body position is set, what do we do when the
277pos is set? does the pos always refer to the center of mass from the user's
278point of view?
279
280consider splitting solver into functions, which can be optimized separately.
281might make things go faster.
282
283faster code for islands with a single body? faster code for dynamically
284symmetric bodies?
285
286rotation.cpp functions that set matrices should also set padding elements.
287
288lcp solver must return (L,d) and some other information, so we can re-solve
289for other right hand sides later on, but using the same complimentarity
290solution so there are no integrator discontinuities.
291
292dSetZero() - make fast inline functions for fixed n e.g. (1-4).
293
294need proper `sticky' friction, i.e. compensation for numerical slip.
295
296on windows, make sure gcc-compiles libs can be linked with VC++ apps. need
297to make sure some C++ runtime bits are present?
298
299kill all references to dArray<> (in geom.cpp).
300
301need testing code to test all joints with body-to-static-env
302
303copy stack.cpp, memory.cpp stuff to reuse
304
305dFactorLDLT() is not so efficient for matrix sizes < block size, e.g.
306redundant calls, zero loads, adds etc
307
308contacts: cheaper friction: viscous friction? one step delay friction force.
309
310in geom.cpp, for objects that are never meant to collide, dCollide() will
311always try to find the collider functions, which wastes a bit of time.
312
313geom.cpp:dCollideG() - handle special case of colliding 2 groups more
314efficiently.
315
316timer reporting function:
317 void timerReport (void (*printFunction)(char *, ...));
318
319disabled bodies stored in a separate list, so they are never traversed at all,
320for speed when there are many disabled bodies.
321
322
323MAYBE
324-----
325
326new implementation for joint groups that is not so system dependent.
327maybe individual contacts are reusable? in this case contact information
328should be settable in the contact joints. max_size arg is really annoying.
329
330consider making anchor,axis, (everything) into a joint parameter and setting
331them with a consistent interface. also consider overload the joint functions
332so they are not distinguished by joint type??
333
334collision memory optimizations?
335
336collision: support for persistent contact information?
337
338multiply 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.
342
343height fields
344
345pre-converted collision data -- Creating a hash space and associated
346opcode tree structures may take significant amounts of time for a
347large world with many 10s of thousands of triangles. Any chance of
348pre-building that off-line and passing a memory block pointer to the
349collision system?
350
351putting objects in multiple spaces -- If it was possible to add
352objects to more than one space, you could do collision queries other
353than 1vsN and NvsN. That flexibility might be useful when you want to
354only collide against a subset of the space. For example, a camera
355system may want to collide some rays with occlusion walls but the
356occlusion walls may also need to be in the game-level space to bounce
357against.
358
359
360ALWAYS
361------
362
363make sure functions check their arguments in debug mode (e.g. using dASSERT).
364make sure joint/geom functions check for the specific object type.
365
366vectors alloca()ed on the stack must have the correct alignment, use ALLOCA16.
367
368library should have no global constructors, as it might be used with C linkage.
369
370use `const' in function arguments. blah.
371
372
373
374DON'T BOTHER
375------------
376
377warning if user tries to set mass params with nonzero center of mass.
378
379
380
381DONE
382----
383
384check: when contact attached with (body1,0) and (0,body1), check that polarity
385on depth and error info is okay for the two cases.
386
387set a better convention for which is the 1st and 2nd body in a joint, because
388sometimes we get things swapped (because of the way the joint nodes are used).
389
390hinge and prismatic, attachment to static environment.
391
392turn macros into C++ inline functions? what about C users?
393
394remove `space' argument to geom creation functions? make user add it?
395or just remove it from dCreateGeom() ? <-- did this one.
396
397test_chain should be in C, not C++. but first must remove global constructors.
398
399add more functionality to C++ interface - dMass, dSpace, dGeom
400
401there should be functions to delete groups of bodies/joints in one go - this
402will be more efficient than deleting them one at a time, because less
403partitioning tests will be needed.
404
405should we expose body and joint object structures so that the user can
406explicitly allocate them locally, or e.g. on the stack? makes allocating
407temporary contact constraints easier. NO --> helps data hiding and therefore
408library binary compatability.
409
410joints:
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
416
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
423
424 optional hinge2 suspension: - DONE
425 alignment of B&S part to given axis - DONE
426 global framework for giving epsilon and gamma - DONE
427
428 toss away r-motor, make power & stuff specific to joint - DONE
429 it's just easier that way
430
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
435
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
439
440 contact slip - DONE
441 contact erp & cfm parameters (not just "softness") - DONE
442
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.
446
447 joint limit spongyness: erp and cfm for joint set from world (global)
448 values when joint created. - DONE
449
450 joint limit restitution - DONE
451
452check inertia transformations, e.g. by applying steering torque to a thin
453wheel --> actually, i made test_I
454
455more 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)
459
460check that J*vnew=c (slow step already does this, but it doesn't equal zero
461for some reason! - actually, when LCP constraint limits are reached, it wont!)
462
463tons of things in lcp.cpp (@@@), especially speed optimizations. also, we
464wanted to do index block switching and index block updates to take advantage
465of the outer product trick ... but this is not worth the effort i think.
466
467lcp.cpp: if lo=hi=0, check operation. can we switch from NL <-> NH without
468going through C? --> done.
469
470andy says: still having trouble with those resource files..
471drawstuff.res doesn't seem to build or be found under cygwin gcc.
472
473DOC how bodies and geoms associated then resolved in contact callback ... not
474really necessary.
475
476fix the "memory leak" in geom.cpp
477
478library should have no global constructors, as it might be used with C linkage.
479 --> as long as test_chain1 works, there are none.
480
481DOC cfm, the derivation and what it means.
482 --> partially done, could be better
483
484joint "get type" function
485
486andy says: in ode/src/error.cpp _snprintf() and _vsnprintf() are missing
487in 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.
493
494build on linux - assumptions made about location of X11 lib, opengl etc.
495
496implement: dBodyAddForceAtPos,dBodyAddRelForceAtPos,dBodyAddRelForceAtRelPos,
497 dBodyGetPointPos,dBodyGetPointVel,dBodyGetPointRelVel
498
499dJointAttach(), allow both bodies to be 0 to put the joint into limbo.
500
501space near-callback should be given potentially intersecting objects 100 at a
502time instead of 1 at a time, to save on calling costs ... which are trivial,
503so we don't bother to do this.
504
505doccer: @func{} also refs second etc function in function *list*.
506
507make sure joints can return 0 from GetInfo1, i.e. no constraints or "inactive"
508joint, and the step functions will handle it.
509
510when attaching contact with (0,body), instead of setting the reverse flag
511on the joint and checking it in getInfo2(), we should just reverse the normal
512straight away ... ?
513 --> trouble is, dJointAttach() knows nothing about what kind of joint
514 it is attaching.
515
516hinge2 needs to be attached to two bodies for it to work, make sure this is
517always the case. --> assertion added in dJointAttach().
518
519if two joints connect to the same two bodies, check that the fast solver
520works! -> it should.
521
522functions to get all the joints/bodies a body/joint is connected to.
523
524If I don't have the GCC libraries installed, HUGE_VALF is undefined.
525
526fix capped cylinder - capped cylinder collision so that two contacts can
527be generated.
528
529transformation geometry object.
530
531joint groups should also be destroyed by destroying the world --> naaahhh.
532
533DONT DO THIS: body/joint creators with world = 0 --> not inserted into any
534world. allow bodies/joints to be detached from a world (this is what happens
535to 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?
540
541body & joint disabling / enabling
542
543start a change log.
544
545collision flags - 0xffff mask.
546
547dBodyGetFiniteRotationMode() / ...Axis()
548
549dBodyAddForceAtRelPos()
550
551ball & socket joint limits and motors.
552
553auto-build env on windows: 3 compilers, debug/release, short/double =
55412 combinations --> auto logs.
555
556handle infinities better: HUGE_VALF is not commanly defined, it seems.
557get rid of the __USE_ISOC9X macro in common.h
558perhaps just use a "big" number instead of the actual IEEE infinity, it's
559more portable anyway.
560 --> new config system
561
562dCloseODE() - tidy up *all* allocated memory, esp in geom.cpp. used to keep
563leak detectors happy.
564
565extra API to get lambda and J'*lambda from last timestep.
566
567better stack implementation that is not so system dependent. but how will
568we do dynamic page allocation? do we even need to?
569
570
571all collision files will now be collision_*, not geom_*
572
573check exported global symbols - no C++ mangling.
574
575rename dSphere etc to dxSphere etc.
576
577C interface support for making new classes.
578
579make sure DLL-ized stuff preserved ... but class numbers should no longer be
580exported.
581
582point geom ( = sphere of radius 0 )
583
584geoms stored in doubly linked lists in space (fast removal).
585
586bodies need to keep geoms pointers and call dGeomMoved() in dBodySetPosition()
587etc and world step. PROBLEM: links dynamics and collision together too much,
588makes it hard to extract ODE collision ... unless we say: dGeomMoved() and
589dGeomID must be supplied by the new collision library!
590
591dCollide() should take spaces as arguments - it should call dSpaceCollide2()
592with its own callback that puts all found contacts in the array, stopping
593when there is no more space left in the array.
594
595dxSpace::getGeom() - the geom numbers will change as geoms are dirtied - find
596some other numbering scheme, or document this behavior.
597
598the 'placeable' property - objects that should not ever be attached to bodies
599should flag an error when setBody etc are called.
600
601dGeomSetBody(0) - DOC: the position and orientation of the body will be
602preserved. in this case the geom should NOT be dirtied (dGeomMoved() should
603not be called).
604
605DOC: dGeomGetBodyNext() as part of dynamics/collision interface
606
607groups/spaces are subclasses of geom.
608
609groups/spaces can contain other groups/spaces. geom can be owned by a
610group/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
616
617groups/spaces can be told that some objects never move, i.e. that the objects
618are locked. should we lock the whole space?
619 locking: the AABB for the object is not recalculated
620
621groups/spaces can be told that the internal contents self-intersect or not.
622actually an old ODE group is the equivalent of an old ODE simple space.
623 - just call dCollide() or not.
624
625the group doesn't get passed to the space callback any more ... only the
626intersecting geoms get passed? maybe the callback can initiate the extra
627intersection tests itself? (because we want programmable flexibility to
628determine what gets intersected and what doesn't)
629 - NO
630
631infrastructure to indicate when an object has moved (and thus its AABB needs
632to be recalculated)
633
634space enumeration functions. make sure that there are no additions or deletions
635while enumeration is taking place.
636 - documented the behavior, didn't disallow it
637
638cache the AABB in the dxGeom? (for non-moving objects) - perhaps keep a
639pointer to separately allocated space? ... no
640
641DOC: dGeomGetClass() is a first-class geom function, not in the "User
642defined classes" section. it returns a constant that can be checked
643against dSphereClass etc.
644
645remove dxGeom dependence on dBodyID? ... not yet
646
647dBase -> dxBase
648
649allow a geom to be inserted into multiple spaces? need this to optimize some
650kinds of tests ... no
651
652update docs.
653
654make CHECK_NOT_LOCKED an assert.
655
656DOC: "Calling these functions on a non-placeable geom results in a
657runtime error." ...in the debug build only?
658
659non-placeable geoms should not allocate dxPosR. perhaps pass a dGeom
660constructor arg that says 'placeable' or not - this also sets the
661GEOM_PLACEABLE flag.
662
663GeomTransform:
664 final_pos and final_R valid if no GEOM_AABB_BAD flag!!!
665 fix up this code, esp use of ComputeTX().
666
667Space incompatibilities: no dSpaceDestroy(), dGeomDestroy() does not
668take a dSpaceID ... dSpaceDestroy() added.
669
670GeomGroup 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.
675
676simple space optimization: we should keep the precomputed AABB for the
677non-moving geoms around, so that when the other geoms move we can just
678compute the AABBs for those geoms and then combine it with the non-moving AABB.
679 --> too hard!
680
681collision build options: old and new
682
683tidyups 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).
688
689porting guide:
690 ODE list email
691
692 dGeomGetSpaceAABB() deleted
693
694 dGeomGetClass (geom_group); used to return a unique type for
695 GeomGroups, but now it returns dSimpleSpaceID.
696
697tidyups: update DLL declarations.
698