![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
Public Member Functions | |
RayIntersectSets (OrientedBoxTreeTool *tool_ptr, const double *ray_point, const double *unit_ray_dir, const double tolerance, OrientedBoxTreeTool::IntersectSearchWindow &win, unsigned int *ray_tri_test_count, OrientedBoxTreeTool::IntRegCtxt &intRegCallback) | |
virtual ErrorCode | visit (EntityHandle node, int depth, bool &descend) |
Visit a node in the tree during a traversal. | |
virtual ErrorCode | leaf (EntityHandle node) |
Process a leaf node during tree traversal. | |
Private Attributes | |
OrientedBoxTreeTool * | tool |
const CartVect | ray_origin |
const CartVect | ray_direction |
OrientedBoxTreeTool::IntersectSearchWindow & | search_win |
const double | tol |
OrientedBoxTreeTool::IntRegCtxt & | int_reg_callback |
int * | surfTriOrient |
int | surfTriOrient_val |
unsigned int * | raytri_test_count |
EntityHandle | lastSet |
int | lastSetDepth |
Definition at line 888 of file OrientedBoxTreeTool.cpp.
moab::RayIntersectSets::RayIntersectSets | ( | OrientedBoxTreeTool * | tool_ptr, |
const double * | ray_point, | ||
const double * | unit_ray_dir, | ||
const double | tolerance, | ||
OrientedBoxTreeTool::IntersectSearchWindow & | win, | ||
unsigned int * | ray_tri_test_count, | ||
OrientedBoxTreeTool::IntRegCtxt & | intRegCallback | ||
) | [inline] |
Definition at line 911 of file OrientedBoxTreeTool.cpp.
: tool( tool_ptr ), ray_origin( ray_point ), ray_direction( unit_ray_dir ), search_win( win ), tol( tolerance ),
int_reg_callback( intRegCallback ), surfTriOrient_val( 0 ), raytri_test_count( ray_tri_test_count ),
lastSet( 0 ), lastSetDepth( 0 )
{
// specified orientation should be 1 or -1, indicating ray and surface
// normal in the same or opposite directions, respectively.
if( int_reg_callback.getDesiredOrient() )
{
surfTriOrient = &surfTriOrient_val;
}
else
{
surfTriOrient = NULL;
}
// check the limits
if( search_win.first )
{
assert( 0 <= *( search_win.first ) );
}
if( search_win.second )
{
assert( 0 >= *( search_win.second ) );
}
};
ErrorCode moab::RayIntersectSets::leaf | ( | EntityHandle | node | ) | [virtual] |
Process a leaf node during tree traversal.
Implements moab::OrientedBoxTreeTool::Op.
Definition at line 981 of file OrientedBoxTreeTool.cpp.
References ErrorCode, MB_SUCCESS, MBTRI, NONE, moab::GeomUtil::plucker_ray_tri_intersect(), t, and moab::TYPE_FROM_HANDLE().
{
assert( lastSet );
if( !lastSet ) // if no surface has been visited yet, something's messed up.
return MB_FAILURE;
#ifndef MB_OBB_USE_VECTOR_QUERIES
Range tris;
#ifdef MB_OBB_USE_TYPE_QUERIES
ErrorCode rval = tool->get_moab_instance()->get_entities_by_type( node, MBTRI, tris );
#else
ErrorCode rval = tool->get_moab_instance()->get_entities_by_handle( node, tris );
#endif
#else
std::vector< EntityHandle > tris;
ErrorCode rval = tool->get_moab_instance()->get_entities_by_handle( node, tris );
#endif
assert( MB_SUCCESS == rval );
if( MB_SUCCESS != rval ) return rval;
#ifndef MB_OBB_USE_VECTOR_QUERIES
for( Range::iterator t = tris.begin(); t != tris.end(); ++t )
#else
for( std::vector< EntityHandle >::iterator t = tris.begin(); t != tris.end(); ++t )
#endif
{
#ifndef MB_OBB_USE_TYPE_QUERIES
if( TYPE_FROM_HANDLE( *t ) != MBTRI ) continue;
#endif
const EntityHandle* conn;
int num_conn;
rval = tool->get_moab_instance()->get_connectivity( *t, conn, num_conn, true );
assert( MB_SUCCESS == rval );
if( MB_SUCCESS != rval ) return rval;
CartVect coords[3];
rval = tool->get_moab_instance()->get_coords( conn, 3, coords[0].array() );
assert( MB_SUCCESS == rval );
if( MB_SUCCESS != rval ) return rval;
if( raytri_test_count ) *raytri_test_count += 1;
double int_dist;
GeomUtil::intersection_type int_type = GeomUtil::NONE;
if( GeomUtil::plucker_ray_tri_intersect( coords, ray_origin, ray_direction, int_dist, search_win.first,
search_win.second, surfTriOrient, &int_type ) )
{
int_reg_callback.register_intersection( lastSet, *t, int_dist, search_win, int_type );
}
}
return MB_SUCCESS;
}
ErrorCode moab::RayIntersectSets::visit | ( | EntityHandle | node, |
int | depth, | ||
bool & | descend | ||
) | [virtual] |
Visit a node in the tree during a traversal.
This method is called for each node in the tree visited during a pre-order traversal.
node | The EntityHandle for the entity set for the tree node. |
depth | The current depth in the tree. |
descend | Output: if false, traversal will skip children of the current node, or if the current node is a leaf, the 'leaf' method will not be called. |
Implements moab::OrientedBoxTreeTool::Op.
Definition at line 949 of file OrientedBoxTreeTool.cpp.
References moab::Range::begin(), moab::OrientedBoxTreeTool::box(), moab::Range::empty(), ErrorCode, moab::OrientedBox::intersect_ray(), MB_SUCCESS, MBENTITYSET, and moab::Range::size().
{
OrientedBox box;
ErrorCode rval = tool->box( node, box );
assert( MB_SUCCESS == rval );
if( MB_SUCCESS != rval ) return rval;
descend = box.intersect_ray( ray_origin, ray_direction, tol, search_win.first, search_win.second );
if( lastSet && depth <= lastSetDepth ) lastSet = 0;
if( descend && !lastSet )
{
Range tmp_sets;
rval = tool->get_moab_instance()->get_entities_by_type( node, MBENTITYSET, tmp_sets );
assert( MB_SUCCESS == rval );
if( MB_SUCCESS != rval ) return rval;
if( !tmp_sets.empty() )
{
if( tmp_sets.size() > 1 ) return MB_FAILURE;
lastSet = *tmp_sets.begin();
lastSetDepth = depth;
rval = int_reg_callback.update_orient( lastSet, surfTriOrient );
if( MB_SUCCESS != rval ) return rval;
}
}
return MB_SUCCESS;
}
Definition at line 899 of file OrientedBoxTreeTool.cpp.
EntityHandle moab::RayIntersectSets::lastSet [private] |
Definition at line 907 of file OrientedBoxTreeTool.cpp.
int moab::RayIntersectSets::lastSetDepth [private] |
Definition at line 908 of file OrientedBoxTreeTool.cpp.
const CartVect moab::RayIntersectSets::ray_direction [private] |
Definition at line 894 of file OrientedBoxTreeTool.cpp.
const CartVect moab::RayIntersectSets::ray_origin [private] |
Definition at line 893 of file OrientedBoxTreeTool.cpp.
unsigned int* moab::RayIntersectSets::raytri_test_count [private] |
Definition at line 906 of file OrientedBoxTreeTool.cpp.
Definition at line 895 of file OrientedBoxTreeTool.cpp.
int* moab::RayIntersectSets::surfTriOrient [private] |
Definition at line 902 of file OrientedBoxTreeTool.cpp.
int moab::RayIntersectSets::surfTriOrient_val [private] |
Definition at line 903 of file OrientedBoxTreeTool.cpp.
const double moab::RayIntersectSets::tol [private] |
Definition at line 896 of file OrientedBoxTreeTool.cpp.
OrientedBoxTreeTool* moab::RayIntersectSets::tool [private] |
Definition at line 892 of file OrientedBoxTreeTool.cpp.