MeVisLabToolboxReference
|
00001 // **InsertLicense** code 00002 //---------------------------------------------------------------------------------- 00004 00009 //---------------------------------------------------------------------------------- 00010 00011 #ifndef __CSOModifyProcessor_H 00012 #define __CSOModifyProcessor_H 00013 00014 00015 #include "SoCSOSystem.h" 00016 #include "CSOProcessor/CSOProcessor.h" 00017 00018 ML_START_NAMESPACE 00019 00021 00023 enum ModProcLimitUnits { 00024 ModProcLimitNumPoints = 0, 00025 ModProcLimitSMM = 1, 00026 ModProcLimitSCM = 2, 00027 ModProcLimitSM = 3 00028 }; 00029 00030 enum ModCSOSelectionMode { 00031 ModSelectAll = 0, 00032 ModSelectCSOs = 1, 00033 ModSelectGroups = 2 00034 }; 00035 00037 00039 class SOCSO_EXPORT CSOModifyProcessor : public CSOProcessor 00040 { 00041 00042 public: 00043 00045 CSOModifyProcessor(); 00046 00049 virtual bool process(CSOEvalEventView2DInfos view2DInfos, CSOEvalEventCSOInfos csoInfos); 00050 00053 virtual bool needsMemoryImage(); 00054 00056 virtual bool isCurrentlyGenerating(); 00058 virtual bool isCurrentlyEditing(); 00060 virtual bool couldCloseCSO(); 00061 00063 virtual void resetInteractionState(); 00065 virtual void triggerSetMouseCursor(SoView2D* view2d, bool shouldSetMouseCursor); 00066 00067 protected: 00068 00070 virtual ~CSOModifyProcessor(); 00072 virtual void activateAttachments(); 00074 virtual void handleNotification(Field* field); 00075 00076 private: 00077 00078 /* FIELDS */ 00079 00081 FloatField* _limitValueFld; 00083 EnumField* _limitUnitFld; 00085 EnumField* _editableModeFld; 00087 StringField* _editableCSOsFld; 00088 00089 /* MEMBER VARIABLES */ 00090 00092 CSOList* _csoList; 00094 Vector3 _currentHitPointWorld; 00096 int _timePoint; 00098 CSO* _mainModificatorCSO; 00100 CSO* _helperModificatorCSO; 00102 bool _isCurrentlyEditing; 00104 std::vector<unsigned int> _selectedIDs; 00106 bool _interactOnlyOnSelectedCSOs; 00107 00108 /* DATA STRUCTURES */ 00109 00110 typedef std::vector<Vector3> PosVector; 00111 00113 struct CSOAndPositions { 00114 CSO* cso; 00115 PosVector* posVector; 00116 }; 00118 struct CrossingIndices { 00119 int modifyIndex; 00120 int csoAllIndex; 00121 Vector3 crossingPoint; 00122 }; 00124 struct EntryExitSegment { 00125 EntryExitSegment() { entryIndex = exitIndex = -1; } 00126 int entryIndex; 00127 int exitIndex; 00128 }; 00129 00130 /* METHODS */ 00131 00134 bool _computeCrossingsAndPerformSplit(View2DSliceList* slicelist); 00137 void _collectSegments(const std::vector<Vector3>& clipee, 00138 const std::vector<Vector3>& clipper, 00139 bool insideOutsideValue, 00140 std::vector<PosVector>& positionSegments, 00141 std::vector<EntryExitSegment>& eeSegments); 00143 bool _segmentsAreCrossing(const Vector3& start0, const Vector3& end0, const Vector3& start1, const Vector3& end1, Vector3& crossingPoint); 00145 float _getScreenDistance(View2DSliceList* slicelist, const Vector3& worldPos1, const Vector3& worldPos2); 00147 void _parseSelection(); 00149 bool _isEditable(CSO* cso); 00150 00151 ML_MODULE_CLASS_HEADER(CSOModifyProcessor); 00152 }; 00153 00155 00156 00157 ML_END_NAMESPACE 00158 00159 00160 #endif //__CSOModifyProcessor_H 00161