|
MOAB: Mesh Oriented datABase
(version 5.4.1)
|
Inheritance diagram for moab::RayIntersectSets:
Collaboration diagram for moab::RayIntersectSets: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.