MeVisLabToolboxReference
MeVisLab/Standard/Sources/Inventor/SoCSO/SoView2DCSOEditor/SoCSOEditorTools.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00002 //----------------------------------------------------------------------------------
00004 
00009 //----------------------------------------------------------------------------------
00010 
00011 #ifndef __SoView2DCSOEditorTools_H
00012 #define __SoView2DCSOEditorTools_H
00013 
00014 #include <CSOBase/CSOBoundingBox.h>
00015 #include <mlLinearAlgebra.h>
00016 #include <SoCSODefines.h>
00017 
00018 class View2DSliceList;
00019 class SoCSOTransform;
00020 class SoView2DCSOExtensibleEditor;
00021 
00022 namespace ml {
00023   class CSO;
00024 }
00025 
00026 namespace SoCSOEditorTools 
00027 {
00028   enum RelativeSlicePosition 
00029   {
00030     SLICE_BELOW = 0,
00031     SLICE_IN    = 1,
00032     SLICE_ABOVE = 2
00033   };
00034 
00035   struct PathPointSlicePosition
00036   {
00037     ml::Vector3 position;
00038     RelativeSlicePosition slicePosition;
00039   };
00040 
00042   ml::CSOBoundingBox computeSlabBoundingBox(float deviceX, float deviceY, View2DSliceList* slicelist);
00044   ml::CSOBoundingBox computeSlabBoundingBox(int voxelZ, View2DSliceList* slicelist);
00046   bool isOnCurrentSlice(ml::CSO* cso, const CSODrawView2DInfos& view2DInfos);
00048   bool isOnCurrentSlice(ml::CSO* cso, View2DSliceList* slicelist, const ml::Vector3& sliceNormalWorld, SoCSOTransform* csoTransform);
00050   bool isApproximatelyParallel(ml::CSO*cso, View2DSliceList* slicelist, float epsilon=-1);
00053   void fillWorldSliceCrossings(const CSODrawCSOInfos& csoInfos, const CSODrawView2DInfos& view2DInfos, 
00054                                std::vector<CSOSliceCrossing>& belowSlicePositions, 
00055                                std::vector<CSOSliceCrossing>& inSlicePositions, 
00056                                std::vector<CSOSliceCrossing>& aboveSlicePositions);
00059   void getWorldSlicePlanes(const CSODrawView2DInfos& view2DInfos, ml::Plane& topPlane, ml::Plane& bottomPlane);
00060 
00062   void fillCrossingsOnePlaneCrossed(const ml::Plane& plane, const ml::Vector3& lastPosition, const ml::Vector3& currentPosition,
00063                                     CSOSliceCrossing& sliceCrossings, std::vector<CSOSliceCrossing>* crossings[3], 
00064                                     int lastSlicePosition);
00066   void fillCrossingsBothPlanesCrossed(const ml::Plane& topPlane, const ml::Plane& bottomPlane, 
00067                                       const ml::Vector3& lastPosition, const ml::Vector3& currentPosition, int relativePosition, 
00068                                       CSOSliceCrossing &sliceCrossings, std::vector<CSOSliceCrossing>* crossings[3]);
00070   void fillWorldToVoxelMatrix(const CSODrawView2DInfos& view2DInfos, ml::Matrix4& worldToVoxelMatrix);
00072   void fillWorldToVoxelMatrix(const SbMatrix& inventorMatrix, ml::Matrix4& worldToVoxelMatrix);
00074   void fillVoxelToWorldMatrix(const CSODrawView2DInfos& view2DInfos, ml::Matrix4& voxelToWorldMatrix);
00076   bool isAbovePlane(const ml::Vector3& worldPosition, const ml::Plane& plane);
00078   bool evaluateHitPoint(const ml::Vector3& worldPosition, View2DSliceList* slicelist, ml::CSOList* csoList, 
00079                         const ml::CSOBoundingBox& slabBB, const std::string& subType, SoView2DCSOExtensibleEditor* editor,
00080                         bool testSeedPoints,
00081                         ml::CSO*& localHitCSO, ml::CSOSeedPoint*& localHitSeedPoint, 
00082                         ml::CSOPathPoints*& localHitPathPoints, float& distance);
00083 
00085   bool isEligibleForPicking(ml::CSO* cso, ml::CSOList* csoList, const std::string& subType, View2DSliceList* slicelist, SoView2DCSOExtensibleEditor* editor);
00087   float getSquaredDeviceDistance(const ml::Vector3& worldPosition, View2DSliceList* slicelist, float dMouseX, float dMouseY);
00089   bool isOnSameSlab(const ml::CSOBoundingBox& slabBB, const ml::CSOBoundingBox& csoBB);
00091   bool areOnSamePlane(ml::CSO* cso1, ml::CSO* cso2, float epsilon=0.00001f);
00093   bool areOnSamePlane(ml::CSO* cso, const ml::Vector3& position, const ml::Vector3& normal, float epsilon=0.00001f);
00094 }
00095 
00096 
00097 
00098 #endif // __SoView2DCSOEditorTools_H