Ability to grab objects in the world for debugging
	- Need access to viewport, camera inside simulation and input (cache from rendering? RenderDevice store camera? compute camera from projection & camera matrix?)

Debug attaching joints between objects and "World"

Network

World_inPrimitive.cpp

World::getIntersectingParts()

Joint limits on stick man

Explosion example

"NoRotate" joint using amotor

MD2 pose

Sound effects

balancing & levitating stick man demo

Physics: set motor goals

Only draw invisible objects on request

Move Joint, Part to dojo::_internal.


Mouse selection of objects in the world

Easy way to get relative velocities in collision callback

DApplet wrapper
 - Expand default DApplet to call simulation and graphics

Switch to dGeomOffsetXXX instead of transform geoms

BSP  [Alex]: 
  - render
    - Projection matrix -> camera
    - Tone mapping (adjustBrightness)
    - cframe
    - VAR
  - Shaders
  
Way of directly playing back mocap w/o using forces.
  (direct velocities?)

Put complicated objects in their own dSpaces

MD2
 - only apply friction forces when on the ground
 - set velocity when rotating, not arbitrary force
 - tune speed
 - Pose
 - Control

Rolling friction

Particle system
  ODE-style collision masks

Multiple physics shapes per Part
 Approximate Cylinder-Cylinder collision with tricks

Investigate temporal coherence for trimesh

Why is rendering with shaders so slow?
  - Probably need to optimize shader state changes

Popups:
	Physics debugger
	- open
	- close 
	- make buttons work
		Show current physics time
		Show forces
		Show torques
		Show velocities
		Show contacts
		Show dspaces
    rendering mode

	Graphics profiler
		tone map
      
Physics Stability
  Sort contacts by depth
  Enforce maximum penetration depth

Splash lights

Shadows

Relative forces and torques
  
VC6 project

Scene graph viewer

Slider joint

Trigger example
  
Rag-doll (mostly done)
   Set joint limits, friction

Stepper motors

Drop shadows in physics mode

Camera object

Audio

Network

Bug: Tone-map filter is not smooth
Bug: Tone-map seems to prefer red

Shadows (trapezoidal shadow maps)

Heightfield terrain

Remove non-public parts of API from include dir

Look into http://www.cegui.org.uk/modules/news/
Look at DANCE by Ari Schapiro

-------------------------------------------------------

Current specs:

* "Scratch" demo showing how to make basic interactive objects.
  Contains two animated Q2 characters in a Q3 world,
  an orange ball and several crates.  The keyboard drives the
  player character.  The character can kick the ball; when the 
  ball hits a crate it is removed from the world.  A simple 
  3rd person follow-camera is attached to the player character.
  The game starts paused; press F5 to start (or F10 to single-step
  the physics).  Press TAB to access the debug camera, which 
  can be freely flown.  ESC quits.

* Physics
 - Up to 100 simultaneously simulated parts in motion at any time
 - Build objects out of fast sphere, box, cylinder, plane, and capsule proxies
 - Arbitrary triangle mesh for world geometry
 - Ball, Hinge/Axle, Universal joints
 - Joint limits
 - Joints between static and dynamic geometry
 - Sleeping
 - Balancing and levitation helper forces
 - Fast ray casts
 - Controllable damping, constraint error, and constraint force for stability
 - Physics debugging mode
    - Pause physics
    - Single step simulation
    - View collision proxies
    - View awake/sleeping
 - Stock objects
    - Crate
    - Ball
    - Rag doll
    - Ground plane
    - Quake3 map
    - Quake2 character
    - Camera
    - Motion capture humanoid

* UI library w/ LUA bindings

* Events
 - Collision
 - Simulation
 - Logic (AI)

* File formats: 
  3DS, IFS, PLY2, MD2, BSP, PPM,  
  JPG, PNG, PCX, BMP, TGA, ICO, 
  WAV, OGG, MP3

* Rendering
 - Parallax bump mapping
 - Hemisphere lighting
 - Tone mapping
 - Profiling stats
     - Memory use
     - State changes
     - Card and driver
     - Rendered object count

* Input
 - Analog or digital joystick, keyboard, mouse, dance pad (via PlayStation->USB)
 - First Person (WASD + mouse/joystick) controller

* Audio

Dojo mailing list:
acrice@gmail.com, grosser@cs.brown.edu, cjenkins@cs.brown.edu, pwrotek@cs.brown.edu
p222h@aol.com, corey.taylor@gmail.com









windows xp drivers for ArToolkit for Sony Eyetoy:
http://www.hitlabnz.org/fileman_store/Eyetoy_SLEH-00031.zip



ROLLING FRICTION:
Using angular damping may look correct in most situations, but physically it 
isn't (at least you have to check whether the body is touching some surface 
or not to avoid the damping in mid-air). Some while ago i have implemented 
an estimation of rolling resistance by changing the contact point a bit 
further to the direction of the movement. It works pretty well. This code 
fraction comes into nearcallback, just before creating the contact joint.
I have tried two versions; their results are quite similar, but the second 
one is simpler.

#ifdef ROLLING_RESISTANCE
// The basic method for rolling resistance: shift contact point a bit 
forward to get some torque against rolling
// The normal should also be changed; we don't do that yet, but that seems 
unnecessary
// it could be limited to shapes with curved surfaces (sphere, capsule, 
cylinder)
// and/or the factor should be set in the geom or body
// Unsolved issue: spheres still keep their spin around the 'vertical' axis, 
althought they do stop rolling
{
dReal rrfactor = 0.01f;
int j;
//method a:
/* dReal bq[4], dq[4];
dVector3 p1,p2,p3;
dMatrix3 bR;
dWtoDQ (b1->avel,b1->q,dq);
for (j=0; j<4; j++) bq[j] = b1->q[j] + 0.5*dq[j]*rrfactor;
dNormalize4 (bq);
dQtoR (bq,bR);
for (j=0; j<3; j++) p1[j] = nc->geom.pos[j] - b1->pos[j];
dMULTIPLY1_331 (p2,b1->R,p1);
dMULTIPLY0_331 (p3,bR,p2);
for (j=0; j<3; j++) nc->geom.pos[j] -= p3[j] - p1[j];
if (b2)
{
dWtoDQ (b2->avel,b2->q,dq);
for (j=0; j<4; j++) bq[j] = b2->q[j] + 0.5*dq[j]*rrfactor;
dNormalize4 (bq);
dQtoR (bq,bR);
for (j=0; j<3; j++) p1[j] = nc->geom.pos[j] - b2->pos[j];
dMULTIPLY1_331 (p2,b2->R,p1);
dMULTIPLY0_331 (p3,bR,p2);
for (j=0; j<3; j++) nc->geom.pos[j] -= p3[j] - p1[j];
}
*/
//method b:
dVector3 p1,p2;
const dReal *bp = dBodyGetPosition(b1);
const dReal *av = dBodyGetAngularVel(b1);
for (j=0; j<3; j++) p1[j] = nc->geom.pos[j] - bp[j];
dCROSS(p2, =, av, p1);
for (j=0; j<3; j++) nc->geom.pos[j] -= p2[j]*rrfactor;
if (b2)
{
bp = dBodyGetPosition(b2);
for (j=0; j<3; j++) p1[j] = nc->geom.pos[j] - bp[j];
av = dBodyGetAngularVel(b2);
dCROSS(p2, =, av, p1);
for (j=0; j<3; j++) nc->geom.pos[j] -= p2[j]*rrfactor;
}
}
#endif //ROLLING_RESISTANCE 