text: // This THREEx helper provide various basic functions for ```THREE.Geometry```.
  // It is able to scale, translate, center a geometry. Other functions may be
  // added soon.
  // The API is chained for convenience.
  //
  // ## Scale 
  // To make the geometry twice larger in ```y```
  
  // ```
  //   var scale = new THREE.Vector3(1,2,1);
  //   THREEx.GeometryUtils.scale(geometry, scale);
  // ```
  
  // ## Translate
  // To make the geometry move 100 further in ```x```
  
  // ```
  //   var translation = new THREE.Vector3(100,0,0);
  //   THREEx.GeometryUtils.translate(geometry, translation);
  // ```
  
  // ## Center
  // To center the geometry on its middle point
  
  // ```
  //   THREEx.GeometryUtils.center(geometry);
  // ```
  
  // ## middlePoint
  // To compute the middle point of a geometry
  
  // ```
  //   THREEx.GeometryUtils.middlePoint(geometry);
  // ```
  
  // # Code
  
  //
  
  /** @namespace */
  var THREEx		= THREEx 		|| {};
  THREEx.GeometryUtils	= THREEx.GeometryUtils	|| {};
  
  // TODO
  // - chained API
  // - possibility a matrix to reduce computation ?
  
  /**
   * Change the scale of a geometry
   * 
   * @params {THREE.Geometry} geometry the geometry to compute on
   * @params {THREE.Vector3} scale the middlepoint of the geometry
  */
  THREEx.GeometryUtils.scale	= function(geometry, scale)
  {
  	// change all geometry.vertices
  	for(var i = 0; i < geometry.vertices.length; i++) {
  		var vertex	= geometry.vertices[i];
  		vertex.multiply(scale); 
  	}
  	
  	// mark the vertices as dirty
  	geometry.__dirtyVertices = true;
  
  	// return this, to get chained API	
  	return this;
  }
  
  THREEx.GeometryUtils.translate	= function(geometry, delta)
  {
  	// change all geometry.vertices
  	for(var i = 0; i < geometry.vertices.length; i++) {
  		var vertex	= geometry.vertices[i];
  		vertex.add(delta); 
  	}
  
  	// mark the vertices as dirty
  	geometry.__dirtyVertices = true;
  	// return this, to get chained API	
  	return this;
  }
  
  /**
   * Compute the "middlePoint" aka the point at the middle of the boundingBox
   * 
   * @params {THREE.Geometry} the geometry to compute on
   * @returns {THREE.Vector3} the middlepoint of the geometry
  */
  THREEx.GeometryUtils.middlePoint	= function(geometry)
  {
  	// compute bounding box
  	geometry.computeBoundingBox();
  
  	// compute middle
  	var middle	= new THREE.Vector3()
  	middle.x	= ( geometry.boundingBox.x[ 1 ] + geometry.boundingBox.x[ 0 ] ) / 2;
  	middle.y	= ( geometry.boundingBox.y[ 1 ] + geometry.boundingBox.y[ 0 ] ) / 2;
  	middle.z	= ( geometry.boundingBox.z[ 1 ] + geometry.boundingBox.z[ 0 ] ) / 2;
  
  	// return the just computed middle
  	return middle;
  }
  
  /**
   * Center the geometry on its middlepoint
  */
  THREEx.GeometryUtils.center	= function(geometry, noX, noY, noZ)
  {
  	// compute delta
  	var delta	= this.middlePoint(geometry).negate();
  	if( noX )	delta.x	= 0;
  	if( noY )	delta.y	= 0;
  	if( noZ )	delta.z	= 0;
  
  	return this.translate(geometry, delta)
  }
  
  /**
   * Initial version of attachement
   * - geometry2 is the one which is moved
   * - TODO make something more flexible... especially on the attachement config
  */
  THREEx.GeometryUtils.attachRightLeft	= function(geometry1, geometry2, delta)
  {
  	if( delta === undefined )	delta	= 0;
  	// compute bounding box
  	geometry1.computeBoundingBox();
  	geometry2.computeBoundingBox();
  	
  	var maxX1	= geometry1.boundingBox.x[ 1 ]
  	var minX2	= geometry2.boundingBox.x[ 0 ];
  
  	var vector	= new THREE.Vector3();
  	vector.x	= maxX1+ (-minX2) + delta;
  
  	this.translate(geometry2, vector);
  	
  	return this;
  }
  