Fix incorrect value of axis intersection with segment inside of SelectMgr_AxisIntersector::raySegmentDistance().
Move camera definition to base intersector (it is not possible to set it for axis intersector, is is not applicable).
Add method Graphic3d_Camera::SetIdentityOrientation() to set camera parameters to make current orientation matrix identity one.
Remove all matrices from selection intersectors and frustum builder and use camera instead of them.
Fix missed axis tests in vselect grid.
Added new property Graphic3d_Camera::IsZeroToOneDepth() and OpenGl_Caps::useZeroToOneDepth
for activating [0,1] depth range instead of [-1,1] range using glClipControl() within OpenGL 4.5+.
Low-level selection algorithms has been improved to explicitly support 2D
transformation persistent objects. This patch generally touches:
1) SelectMgr_SelectableObjectSet - the lists of objects has been split onto three
subsets (regular, 3d-persistent, 2d-persistent). Each subset has individual BVH
tree. The algorithms are now have more flexibility to update only those trees
that is really required for actual camera state.
2) SelectMgr_ViewerSelector - explicitly supports Eye space selection operations
on BVH tree for 2d-persistent subset. Change of camera position does not
anymore affect acceleration data structure (BVH tree) of 2d-persistent selectable objects.
3) Other classes from SelectMgr have been fine-tuned to provide appropriate API.
Porting notes:
This patch touches very low-level selection classes. If the low-level features were used
the following modifications may need to be considered for porting:
1) Iteration over objects of SelectMgr_SelectableObjectSet should now
be implemented with corresponding Iterator class.
2) SelectMgr_BaseFrustum::ScaleAndTransform and derived classes return
Handle(SelectMgr_BaseFrustum) instead of NCollection_Handle<> type.
Small correction of test case for issue CR27739
1) Zoom persistence mode now fixes object in pixel coordinates and is independent on view size
2) Used gp_GTrsf instead of gp_Trsf SelectMgr_ViewerSelector to store Graphic3d_Mat4d
3) Zoom persisted objects changed behavior (become bigger) therefore test cases were updated according to new state.
4) Corrected scale for rectangular frustum
Updated test for manipulator
- initial transformation of triangulation is now applied to selecting frustum;
- switched from NCollection_Vec3 to gp collections to avoid conversions and usage of macros;
- calculation of frustum was refactored to reduce its build time;
- double pixel tolerances for selection were replaced by integer ones;
- switched to splitting along the main axis only in SelectMgr BVH selection primitive sets.
1) New Graphic3d_TransformPers structure for defining parameters and algorithm methods, featuring:
a) application of transformation to projection and world view matrices;
b) computation of model-world transformation of persistent object;
c) computation of transformed bounding box of persistent object.
2) Transform persistence algorithm does not make any changes to model-world transformation of object (deals with projection and world view matrices only), thus making possible to employ local transformation in a usual way.
3) Support of BVH selection for transform persistent objects (pan, rotate, zoom, trihedron persistence only).
4) Support efficient frustum culling for transform persistent objects (pan, rotate, zoom, trihedron persistence only).
5) Support of z-fitting algorithm for world-view space transform persistent objects (rotate, zoom persistence only).
6) Rewrite usage of transform persistence structures and utilities classes:
a) Replaced Graphic3d_CTransPers, TEL_TRANSFORM_PERSISTENCE by Graphic3d_TransformPers;
b) Move functions from OpenGl_Utils.hxx to Graphic3d_TransformUtils.hxx;
c) Extract matrix stack class from OpenGl_Utils.hxx to OpenGl_MatrixStack.hxx;
7) New class Graphic3d_WorldViewProjState to keep track of projection, world view matrices changes for a camera.
8) New test case bugs/vis/bug26344.
9) Renamed method Graphic3d_Camera::ModelViewState of to ::WorldViewState for consistency.
Remove classes Select3D_ISensitivePointSet and Select3D_BoundarySensitivePointSet; use Select3D_SensitivePoly directly for boundary selection.
Make last argument in Select3D_SensitiveFace non-default to ensure that value is always explicitly specified by the caller.
Inherit SelectMgr_FrustumBuilder from Standard_Transient to use normal Handle instead of NCollection_Handle.
Add test case bugs/vis/bug26146.
2 modes of rectangular selection are available: inclusion-only and overlap-allowing;
The modes can be switched using method AllowOverlapDetection from StdSelect_ViewerSelector3d;
BVH for sensitive entities now builds if there is more than max number of leafs in collection;
Added option -allowoverlap to command vselect;
Interactive rectangular selection in Draw is now available in 2 modes:
- if the user starts selection from upper corners, only fully included objects will be selected;
- if the user starts selection from lower corners, both partially and fully overlapped objects will be selected.
Redesign of selection mechanism:
- implemented 3-level BVH tree for selection;
- selection now calculates in 3D space;
- intersection tests were moved to SelectMgr_BaseFrustum descendants;
- removed .cdl files in Select3D and .cdl related to selection in MeshVS;
- SelectMgr_ViewerSelectors are now shared between local and global contexts;
- transformations of sensitive entities are now stored in SelectMgr_SelectableObject only. Sensitive entities are independent from transformations, it is applied to SelectMgr_SelectingVolumeManager instance only;
- connected and multiple connected interactive objects are now represented by their child objects only for SelectMgr_SelectionManager;
- if interactive object has child objects, they will be stored as separate objects in SelectMgr_SelectionManager now.
- test cases bugs/vis/bug24623_1, bug24623_2, bug24623_3, bug24623_4 to test performance and memory issues.