NewtonWorldRayFilterCallback

From Newton Wiki
Jump to: navigation, search

NewtonWorldRayFilterCallback

typedef dFloat (*NewtonWorldRayFilterCallback)(const NewtonBody* const body, const NewtonCollision* const shapeHit, const dFloat* const hitContact, const dFloat* const hitNormal, dLong collisionID, void* const userData, dFloat intersectParam)

Usage

This callback is used with NewtonWorldRayCast to perform user-customized raycasting. It's called for each intersection point.

Parameters

  • shapeHit NewtonCollision*
  • hitContact dFloat* - coordinates of the raycast hit (in world space)
  • hitNormal dFloat* - normal of an intersection point
  • collisionID dLong - convex primitive collision ID or face ID (shapeID) for collision trees
  • userData void* - pointer passed to NewtonWorldRayCast
  • intersectParam dFloat - distance between raycast origin and end at which intersection occurs. intersectionPoint = p0 + intersetParam*(p1-p0). intersetParam is in range [0..1]

Return

  • return the distance (0.0 to 1.0) above which Newton won't search anymore for intersection points, return the intersectParam value for example, to make newton immediately stop searching for new hits.

Remarks

  • This is not a library function, but a callback event.

Examples

Using NewtonWorldRayFilterCallback you can customize raycasting behaviour:

Find nearest point on body given in userData:

   float __intersetParam;
   VECTOR3 __intersetNorm;
   
   float _cdecl callbackFilter(const NewtonBody* body, const float* hitNormal, int collisionID, void* userData, float intersetParam)
   {
       if( (void*)body == userData || (!userData) ) 
       {
               __intersetParam = intersetParam;
               CopyVector( __intersetNorm, hitNormal );
       }
       
       return intersetParam;
   }


Find nearest point in the world:

   float __intersetParam;
   VECTOR3 __intersetNorm;
   
   float _cdecl callbackFilter(const NewtonBody* body, const float* hitNormal, int collisionID, void* userData, float intersetParam)
   {
       __intersetParam = intersetParam;
       CopyVector( __intersetNorm, hitNormal );
       
       return intersetParam;
   }


Find all intersection points in the world:

   vector<float> __intersetParams;
   vector<VECTOR3> __intersetNorms;
    
   float _cdecl callbackFilter(const NewtonBody* body, const float* hitNormal, int collisionID, void* userData, float intersetParam)
   {
       __intersetParams.push_back( intersetParam );
       __intersetNorms.push_back( VECTOR3(hitNormal) );
               
       return 1;
   }


See also

NewtonCollisionRayCast NewtonWorldRayCast