# THREEx.GeometryUtils.js

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.position.multiplySelf(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];
}```

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;
}

```