Logo Search packages:      
Sourcecode: blender version File versions  Download package

CylinderShape.cpp

/*
 * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies.
 * Erwin Coumans makes no representations about the suitability 
 * of this software for any purpose.  
 * It is provided "as is" without express or implied warranty.
 */

#include "CylinderShape.h"
#include "SimdPoint3.h"

CylinderShape::CylinderShape (const SimdVector3& halfExtents)
:BoxShape(halfExtents)
{

}


CylinderShapeX::CylinderShapeX (const SimdVector3& halfExtents)
:CylinderShape(halfExtents)
{
}


CylinderShapeZ::CylinderShapeZ (const SimdVector3& halfExtents)
:CylinderShape(halfExtents)
{
}



SimdVector3 CylinderLocalSupportX(const SimdVector3& halfExtents,const SimdVector3& v) 
{
const int cylinderUpAxis = 0;
const int XX = 1;
const int YY = 0;
const int ZZ = 2;

      //mapping depends on how cylinder local orientation is
      // extents of the cylinder is: X,Y is for radius, and Z for height


      float radius = halfExtents[XX];
      float halfHeight = halfExtents[cylinderUpAxis];


    SimdVector3 tmp;
      SimdScalar d ;

    SimdScalar s = SimdSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
    if (s != SimdScalar(0.0))
      {
        d = radius / s;  
            tmp[XX] = v[XX] * d;
            tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
            tmp[ZZ] = v[ZZ] * d;
            return tmp;
      }
    else
      {
          tmp[XX] = radius;
            tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
            tmp[ZZ] = SimdScalar(0.0);
            return tmp;
    }


}






SimdVector3 CylinderLocalSupportY(const SimdVector3& halfExtents,const SimdVector3& v) 
{

const int cylinderUpAxis = 1;
const int XX = 0;
const int YY = 1;
const int ZZ = 2;


      float radius = halfExtents[XX];
      float halfHeight = halfExtents[cylinderUpAxis];


    SimdVector3 tmp;
      SimdScalar d ;

    SimdScalar s = SimdSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
    if (s != SimdScalar(0.0))
      {
        d = radius / s;  
            tmp[XX] = v[XX] * d;
            tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
            tmp[ZZ] = v[ZZ] * d;
            return tmp;
      }
    else
      {
          tmp[XX] = radius;
            tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
            tmp[ZZ] = SimdScalar(0.0);
            return tmp;
    }

}

SimdVector3 CylinderLocalSupportZ(const SimdVector3& halfExtents,const SimdVector3& v) 
{
const int cylinderUpAxis = 2;
const int XX = 0;
const int YY = 2;
const int ZZ = 1;

      //mapping depends on how cylinder local orientation is
      // extents of the cylinder is: X,Y is for radius, and Z for height


      float radius = halfExtents[XX];
      float halfHeight = halfExtents[cylinderUpAxis];


    SimdVector3 tmp;
      SimdScalar d ;

    SimdScalar s = SimdSqrt(v[XX] * v[XX] + v[ZZ] * v[ZZ]);
    if (s != SimdScalar(0.0))
      {
        d = radius / s;  
            tmp[XX] = v[XX] * d;
            tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
            tmp[ZZ] = v[ZZ] * d;
            return tmp;
      }
    else
      {
          tmp[XX] = radius;
            tmp[YY] = v[YY] < 0.0 ? -halfHeight : halfHeight;
            tmp[ZZ] = SimdScalar(0.0);
            return tmp;
    }


}

SimdVector3 CylinderShapeX::LocalGetSupportingVertexWithoutMargin(const SimdVector3& vec)const
{
      return CylinderLocalSupportX(GetHalfExtents(),vec);
}
SimdVector3 CylinderShapeZ::LocalGetSupportingVertexWithoutMargin(const SimdVector3& vec)const
{
      return CylinderLocalSupportZ(GetHalfExtents(),vec);
}
SimdVector3 CylinderShape::LocalGetSupportingVertexWithoutMargin(const SimdVector3& vec)const
{
      return CylinderLocalSupportY(GetHalfExtents(),vec);
}








Generated by  Doxygen 1.6.0   Back to index