2012-03-19 23:38:44 +00:00
# include "trace.h"
# include <map>
2013-02-08 21:12:34 +00:00
# include <btBulletDynamicsCommon.h>
# include <btBulletCollisionCommon.h>
2013-02-07 05:47:09 +00:00
# include "physic.hpp"
2012-03-19 23:38:44 +00:00
2013-02-08 21:12:34 +00:00
enum traceWorldType
2012-03-19 23:38:44 +00:00
{
2013-02-08 21:12:34 +00:00
collisionWorldTrace = 1 ,
pickWorldTrace = 2 ,
bothWorldTrace = collisionWorldTrace | pickWorldTrace
} ;
2012-03-19 23:38:44 +00:00
2013-02-20 12:14:52 +00:00
void newtrace ( traceResults * results , const Ogre : : Vector3 & start , const Ogre : : Vector3 & end , const Ogre : : Vector3 & BBHalfExtents , bool isInterior , OEngine : : Physic : : PhysicEngine * enginePass ) //Traceobj was a Aedra Object
2012-03-19 23:38:44 +00:00
{
2013-02-08 21:12:34 +00:00
const btVector3 btstart ( start . x , start . y , start . z + BBHalfExtents . z ) ;
const btVector3 btend ( end . x , end . y , end . z + BBHalfExtents . z ) ;
2013-02-20 12:14:52 +00:00
const btQuaternion btrot ( 0.0f , 0.0f , 0.0f ) ; //y, x, z
2012-03-19 23:38:44 +00:00
2012-08-14 22:04:58 +00:00
const btBoxShape newshape ( btVector3 ( BBHalfExtents . x , BBHalfExtents . y , BBHalfExtents . z ) ) ;
2013-02-08 21:12:34 +00:00
//const btCapsuleShapeZ newshape(BBHalfExtents.x, BBHalfExtents.z * 2 - BBHalfExtents.x * 2);
const btTransform from ( btrot , btstart ) ;
const btTransform to ( btrot , btend ) ;
btCollisionWorld : : ClosestConvexResultCallback newTraceCallback ( btstart , btend ) ;
2013-03-08 22:46:25 +00:00
newTraceCallback . m_collisionFilterMask = OEngine : : Physic : : CollisionType_World ;
2013-02-08 21:12:34 +00:00
enginePass - > dynamicsWorld - > convexSweepTest ( & newshape , from , to , newTraceCallback ) ;
// Copy the hit data over to our trace results struct:
2013-02-20 12:14:52 +00:00
if ( newTraceCallback . hasHit ( ) )
2013-02-08 21:12:34 +00:00
{
2013-02-20 12:14:52 +00:00
const btVector3 & tracehitnormal = newTraceCallback . m_hitNormalWorld ;
results - > fraction = newTraceCallback . m_closestHitFraction ;
results - > planenormal = Ogre : : Vector3 ( tracehitnormal . x ( ) , tracehitnormal . y ( ) , tracehitnormal . z ( ) ) ;
results - > endpos = ( end - start ) * results - > fraction + start ;
2013-02-08 21:12:34 +00:00
}
else
{
2013-02-20 12:14:52 +00:00
results - > endpos = end ;
results - > planenormal = Ogre : : Vector3 ( 0.0f , 0.0f , 1.0f ) ;
results - > fraction = 1.0f ;
2013-02-08 21:12:34 +00:00
}
2012-03-19 23:38:44 +00:00
}