docs: function getSupportFn( bodyA, bodyB ){
  
          var hash = Physics.util.pairHash( bodyA.uid, bodyB.uid )
              ,fn = supportFnStack[ hash ]
              ;
  
          if ( !fn ){
              fn = supportFnStack[ hash ] = function pairSupportFunction( searchDir ){
  
                  var tA = fn.tA
                      ,tB = fn.tB
                      ,vA = fn.tmpv1
                      ,vB = fn.tmpv2
                      ;
  
                  if ( fn.useCore ){
                      vA = bodyA.geometry.getFarthestCorePoint( searchDir.rotateInv( tA ), vA, fn.marginA );
                      vB = bodyB.geometry.getFarthestCorePoint( searchDir.rotate( tA ).rotateInv( tB ).negate(), vB, fn.marginB );
                  } else {
                      vA = bodyA.geometry.getFarthestHullPoint( searchDir.rotateInv( tA ), vA );
                      vB = bodyB.geometry.getFarthestHullPoint( searchDir.rotate( tA ).rotateInv( tB ).negate(), vB );
                  }
  
                  vA.vadd( bodyA.offset ).transform( tA );
                  vB.vadd( bodyB.offset ).transform( tB );
                  searchDir.negate().rotate( tB );
  
                  return {
                      a: vA.values(),
                      b: vB.values(),
                      pt: vA.vsub( vB ).values()
                  };
              };
  
              // transforms for coordinate transformations
              fn.tA = new Physics.transform();
              fn.tB = new Physics.transform();
  
              // temp vectors (used too frequently to justify scratchpad)
              fn.tmpv1 = new Physics.vector();
              fn.tmpv2 = new Physics.vector();
          }
  
          fn.useCore = false;
          fn.margin = 0;
          fn.tA.setRotation( bodyA.state.angular.pos ).setTranslation( bodyA.state.pos );
          fn.tB.setRotation( bodyB.state.angular.pos ).setTranslation( bodyB.state.pos );
          fn.bodyA = bodyA;
          fn.bodyB = bodyB;
  
          return fn;
      }