/**
 *  This function does prism intersection tests with the terrain.
 *
 *  @param source       The source of the prism.
 *  @param extent       The end point to test.
 *  @param pCallback    The terrain collision callback.
 */
bool TerrainHeightMap1::collide
( 
    WorldTriangle       const &source, 
    Vector3             const &extent,
    TerrainCollisionCallback *pCallback 
) const
{
	BW_GUARD;
	BoundingBox bb;
	bb.addBounds(source.v0());
	bb.addBounds(source.v1());
	bb.addBounds(source.v2());

	Vector3 delta = extent - source.v0();

	bb.addBounds(extent);
	bb.addBounds(source.v1() + delta);
	bb.addBounds(source.v2() + delta);

	return hmCollide(source, extent, bb.minBounds().x, bb.minBounds().z,
		bb.maxBounds().x, bb.maxBounds().z, pCallback);
}
void ChunkExitPortal::edBounds( BoundingBox & bbRet ) const
{
	BW_GUARD;
	const std::vector<Vector2> & points = portal_.points;
	bbRet = BoundingBox::s_insideOut_;

	// first find the average in portal space again
	Vector2 avg( 0.f, 0.f );
	for (uint i = 0; i < points.size(); i++)
		avg += points[i];
	avg /= float( points.size() );

	// now build up the bounding box (also in portal space)
	for (uint i = 0; i < points.size(); i++)
	{
		const Vector2 & apt = points[i];
		bbRet.addBounds( Vector3( apt.x - avg.x, apt.y - avg.y, 0.f ) );
	}

	// and add a bit of depth
	bbRet.addBounds( Vector3( 0.f, 0.f, 0.2f ) );
}
/**
 *	We want to add up everyone's bounding boxes
 */
void PyModelNode::boundingBoxAcc( BoundingBox & bb )
{
	BW_GUARD;
	if (attachments_.empty()) return;

	BoundingBox tbb = BoundingBox::s_insideOut_;
	for (PyAttachments::iterator it = attachments_.begin();
		it != attachments_.end();
		it++)
	{
		(*it)->boundingBoxAcc( tbb );
	}

	// PyModel wants world-coord bbs from us
	if (!(tbb == BoundingBox::s_insideOut_))
	{
		tbb.transformBy( lastWorldTransform_ );
		bb.addBounds( tbb );
	}
}