147 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
Bullet Continuous Collision Detection and Physics Library
 | 
						|
Copyright (c) 2003-2009 Erwin Coumans  http://bulletphysics.org
 | 
						|
 | 
						|
This software is provided 'as-is', without any express or implied warranty.
 | 
						|
In no event will the authors be held liable for any damages arising from the use of this software.
 | 
						|
Permission is granted to anyone to use this software for any purpose, 
 | 
						|
including commercial applications, and to alter it and redistribute it freely, 
 | 
						|
subject to the following restrictions:
 | 
						|
 | 
						|
1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
 | 
						|
2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
 | 
						|
3. This notice may not be removed or altered from any source distribution.
 | 
						|
*/
 | 
						|
 | 
						|
#include "btConeShape.h"
 | 
						|
 | 
						|
 | 
						|
 | 
						|
btConeShape::btConeShape (btScalar radius,btScalar height): btConvexInternalShape (),
 | 
						|
m_radius (radius),
 | 
						|
m_height(height)
 | 
						|
{
 | 
						|
	m_shapeType = CONE_SHAPE_PROXYTYPE;
 | 
						|
	setConeUpIndex(1);
 | 
						|
	btVector3 halfExtents;
 | 
						|
	m_sinAngle = (m_radius / btSqrt(m_radius * m_radius + m_height * m_height));
 | 
						|
}
 | 
						|
 | 
						|
btConeShapeZ::btConeShapeZ (btScalar radius,btScalar height):
 | 
						|
btConeShape(radius,height)
 | 
						|
{
 | 
						|
	setConeUpIndex(2);
 | 
						|
}
 | 
						|
 | 
						|
btConeShapeX::btConeShapeX (btScalar radius,btScalar height):
 | 
						|
btConeShape(radius,height)
 | 
						|
{
 | 
						|
	setConeUpIndex(0);
 | 
						|
}
 | 
						|
 | 
						|
///choose upAxis index
 | 
						|
void	btConeShape::setConeUpIndex(int upIndex)
 | 
						|
{
 | 
						|
	switch (upIndex)
 | 
						|
	{
 | 
						|
	case 0:
 | 
						|
			m_coneIndices[0] = 1;
 | 
						|
			m_coneIndices[1] = 0;
 | 
						|
			m_coneIndices[2] = 2;
 | 
						|
		break;
 | 
						|
	case 1:
 | 
						|
			m_coneIndices[0] = 0;
 | 
						|
			m_coneIndices[1] = 1;
 | 
						|
			m_coneIndices[2] = 2;
 | 
						|
		break;
 | 
						|
	case 2:
 | 
						|
			m_coneIndices[0] = 0;
 | 
						|
			m_coneIndices[1] = 2;
 | 
						|
			m_coneIndices[2] = 1;
 | 
						|
		break;
 | 
						|
	default:
 | 
						|
		btAssert(0);
 | 
						|
	};
 | 
						|
	
 | 
						|
	m_implicitShapeDimensions[m_coneIndices[0]] = m_radius;
 | 
						|
	m_implicitShapeDimensions[m_coneIndices[1]] = m_height;
 | 
						|
	m_implicitShapeDimensions[m_coneIndices[2]] = m_radius;
 | 
						|
}
 | 
						|
 | 
						|
btVector3 btConeShape::coneLocalSupport(const btVector3& v) const
 | 
						|
{
 | 
						|
	
 | 
						|
	btScalar halfHeight = m_height * btScalar(0.5);
 | 
						|
 | 
						|
 if (v[m_coneIndices[1]] > v.length() * m_sinAngle)
 | 
						|
 {
 | 
						|
	btVector3 tmp;
 | 
						|
 | 
						|
	tmp[m_coneIndices[0]] = btScalar(0.);
 | 
						|
	tmp[m_coneIndices[1]] = halfHeight;
 | 
						|
	tmp[m_coneIndices[2]] = btScalar(0.);
 | 
						|
	return tmp;
 | 
						|
 }
 | 
						|
  else {
 | 
						|
    btScalar s = btSqrt(v[m_coneIndices[0]] * v[m_coneIndices[0]] + v[m_coneIndices[2]] * v[m_coneIndices[2]]);
 | 
						|
    if (s > SIMD_EPSILON) {
 | 
						|
      btScalar d = m_radius / s;
 | 
						|
	  btVector3 tmp;
 | 
						|
	  tmp[m_coneIndices[0]] = v[m_coneIndices[0]] * d;
 | 
						|
	  tmp[m_coneIndices[1]] = -halfHeight;
 | 
						|
	  tmp[m_coneIndices[2]] = v[m_coneIndices[2]] * d;
 | 
						|
	  return tmp;
 | 
						|
    }
 | 
						|
    else  {
 | 
						|
		btVector3 tmp;
 | 
						|
		tmp[m_coneIndices[0]] = btScalar(0.);
 | 
						|
		tmp[m_coneIndices[1]] = -halfHeight;
 | 
						|
		tmp[m_coneIndices[2]] = btScalar(0.);
 | 
						|
		return tmp;
 | 
						|
	}
 | 
						|
  }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
btVector3	btConeShape::localGetSupportingVertexWithoutMargin(const btVector3& vec) const
 | 
						|
{
 | 
						|
		return coneLocalSupport(vec);
 | 
						|
}
 | 
						|
 | 
						|
void	btConeShape::batchedUnitVectorGetSupportingVertexWithoutMargin(const btVector3* vectors,btVector3* supportVerticesOut,int numVectors) const
 | 
						|
{
 | 
						|
	for (int i=0;i<numVectors;i++)
 | 
						|
	{
 | 
						|
		const btVector3& vec = vectors[i];
 | 
						|
		supportVerticesOut[i] = coneLocalSupport(vec);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
btVector3	btConeShape::localGetSupportingVertex(const btVector3& vec)  const
 | 
						|
{
 | 
						|
	btVector3 supVertex = coneLocalSupport(vec);
 | 
						|
	if ( getMargin()!=btScalar(0.) )
 | 
						|
	{
 | 
						|
		btVector3 vecnorm = vec;
 | 
						|
		if (vecnorm .length2() < (SIMD_EPSILON*SIMD_EPSILON))
 | 
						|
		{
 | 
						|
			vecnorm.setValue(btScalar(-1.),btScalar(-1.),btScalar(-1.));
 | 
						|
		} 
 | 
						|
		vecnorm.normalize();
 | 
						|
		supVertex+= getMargin() * vecnorm;
 | 
						|
	}
 | 
						|
	return supVertex;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void	btConeShape::setLocalScaling(const btVector3& scaling)
 | 
						|
{
 | 
						|
	int axis = m_coneIndices[1];
 | 
						|
	int r1 = m_coneIndices[0];
 | 
						|
	int r2 = m_coneIndices[2];
 | 
						|
	m_height *= scaling[axis] / m_localScaling[axis];
 | 
						|
	m_radius *= (scaling[r1] / m_localScaling[r1] + scaling[r2] / m_localScaling[r2]) / 2;
 | 
						|
	m_sinAngle = (m_radius / btSqrt(m_radius * m_radius + m_height * m_height));
 | 
						|
	btConvexInternalShape::setLocalScaling(scaling);
 | 
						|
} |