MeVisLabToolboxReference
MeVisLab/Standard/Sources/Inventor/SoCSO/SoView2DCSOEditor/SoView2DCSOExtensibleEditor/SoCSOEditorExtension.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00002 //----------------------------------------------------------------------------------
00005 
00010 //----------------------------------------------------------------------------------
00011 
00012 
00013 #ifndef __SoCSOEditorExtension_H
00014 #define __SoCSOEditorExtension_H
00015 
00016 #include <SoCSOSystem.h>
00017 
00018 #include "SoCSOVisualizationSettings.h"
00019 
00020 #include <Inventor/nodes/SoNode.h>
00021 #include <Inventor/sensors/SoFieldSensor.h>
00022 
00023 #include <View2DPosition.h>
00024 #include <SoView2D.h>
00025 #include <SoViewerProxy.h>
00026 
00027 
00029 
00030 class SoView2DCSOExtensibleEditor;
00031 
00034 class SOCSO_EXPORT SoCSOEditorExtension : public SoNode
00035 {
00036   SO_NODE_HEADER(SoCSOEditorExtension);
00037 
00038 protected:
00040   SoCSOEditorExtension();
00042   ~SoCSOEditorExtension();
00043 
00044 public: 
00045 
00047   void setExtensibleEditor(SoView2DCSOExtensibleEditor* extensibleEditor) { _editor = extensibleEditor; }
00048 
00050   virtual void startDrawing(View2DSliceList* ) {}
00051 
00053   virtual void draw(const CSODrawCSOInfos& csoInfos, const CSODrawView2DInfos& view2DInfos, const CSODrawSliceInformation& sliceInfo, SoView2DCSOExtensibleEditor* editor);
00054 
00056   static void initClass();
00057   
00058   virtual void createStartPressAt(const SoPointerPosition& pos) = 0;
00059   virtual void createDragMoveTo(const SoPointerPosition& pos) = 0;
00060   // returns whether to continue with this action
00061   virtual bool createEndPress(int clickCount) = 0;
00062   
00063   virtual void selectAndMoveStartPressAt(const SoPointerPosition& pos) = 0;
00064   virtual void selectAndMoveDragMoveTo(const SoPointerPosition& pos) = 0;
00065   virtual SoPointingAction* selectAndMoveEndPress(int clickCount) = 0;
00066 
00067   virtual void insertSeedPointStartPressAt(const SoPointerPosition& ) {}
00068   virtual void insertSeedPointDragMoveTo(const SoPointerPosition& ) {}
00069   virtual SoPointingAction* insertSeedPointEndPress(int ) { return NULL; }
00070 
00072   virtual void pointerPosition(const SoPointerPosition& ) {}
00074   virtual void pointerLeftWindow() {}
00075 
00077   virtual bool isCreationAllowed() const { return allowCreation.getValue() == 1; }
00079   virtual bool isModificationAllowed() const { return allowModification.getValue() == 1; }
00081   virtual bool shouldRenderCSOs() const { return shouldRender.getValue(); }
00083   virtual bool canCreateCSOs() const { return false; }
00084 
00085   SbString getCreatorExtensionId() const { return extensionId.getValue(); }
00086   void setActiveCSOList(ml::CSOList* hitCSOList);
00087   void setSelectAndMoveInformation(ml::CSOList* hitCSOList, ml::CSO* hitCSO, ml::CSOSeedPoint* hitSeedPoint, 
00088                                    ml::CSOPathPoints* hitPathPoints, float hitDistance);
00089   void setCSOUnderMouse(ml::CSO* cso) { _csoUnderMouse = cso; }
00090 
00092   virtual SbString getSubType() const { return _subType; }
00094   virtual bool shouldRenderSpecific(ml::CSO* cso) const;
00097   virtual bool shouldRenderGeneral(ml::CSO*) const { return false; }
00099   virtual bool isDefaultRenderer() const { return false; }
00100 
00102   virtual void resetCache() {}
00103 
00105   virtual void cancel() {}
00107   virtual int cursorShape() const { return SoViewerProxy::CROSS_CURSOR; }
00109   virtual bool deleteSeedPoint(ml::CSO* cso, ml::CSOSeedPoint* );
00112   ml::CSOSeedPoint* getPreviousSeedPoint(ml::CSOSeedPoint* seedPoint) const;
00113 
00115   SoSFString extensionId;
00117   SoSFBool allowCreation;
00119   SoSFBool allowModification;
00121   SoSFBool allowSeedPointInteraction;
00123   SoSFBool shouldRender;
00126   SoSFMLBase inVisualizationSettings;
00127 
00130   virtual  bool evaluateHitPoint(const ml::Vector3& worldPosition, View2DSliceList* slicelist, ml::CSOList* csoList, 
00131                                  const ml::CSOBoundingBox& slabBB, SoView2DCSOExtensibleEditor* editor,
00132                                  ml::CSO*& localHitCSO, ml::CSOSeedPoint*& localHitSeedPoint, 
00133                                  ml::CSOPathPoints*& localHitPathPoints, float& distance);
00134 
00135 
00136 protected:
00137 
00138   SoView2DCSOExtensibleEditor* _editor;
00139 
00141   ml::CSOList*       _hitCSOList;
00142   ml::CSO*           _hitCSO;
00143   ml::CSOSeedPoint*  _hitSeedPoint;
00144   ml::CSOPathPoints* _hitPathPoints;  
00145   float              _hitDistance;
00146   ml::CSO*           _csoUnderMouse;
00147   
00149   void sendCSONotificationRepaint();
00151   void sendCSONotificationMove();
00153   void sendCSONotificationFinishInteraction();
00155   void sendCSONotificationResetInteractionState();
00157   void sendCSONotificationInsertSeedPoint();
00159   void sendCSONotificationNewCSOStarted();
00160 
00164   void setExtensionIdAsSubType() { _subType = extensionId.getValue().getString(); }
00165 
00167   virtual void setCreationData(const SoPointerPosition& pos, ml::CSO* newCSO);
00168 
00169   SoFieldSensor* _extensionIdSensor;
00170   static void extensionIdCB(void* data, SoDataSensor* );
00171 
00174   ml::CSOVisualizationSettings* getVisualizationSettings();
00175 
00177   ml::CSOVisualizationSettings _visualizationSettings;
00178 
00183   SbString _subType;
00184   
00186   void drawPathPoints(const CSODrawCSOInfos& csoInfos, const CSODrawView2DInfos& view2DInfos, const CSODrawSliceInformation& drawSliceInfo, const SbVec2f& shadowOffsetDevice, SoView2DCSOExtensibleEditor* editor);
00188   void renderPathPoints(const CSOPathPointsRenderSettings& renderSettings, const CSODrawCSOInfos& csoInfos, const CSODrawView2DInfos& view2DInfos, const std::vector<CSOSliceCrossing>& pathPointsLists);
00189 
00191   void drawPathAndCrossingPoints(const CSODrawCSOInfos& csoInfos, const CSODrawView2DInfos& view2DInfos, const SbVec2f& shadowOffsetDevice, const std::vector<CSOSliceCrossing>& pathAndCrossingPoints);
00192 
00194   void drawSeedPoints(const CSODrawCSOInfos& csoInfos, const CSODrawView2DInfos& view2DInfos, const CSODrawSliceInformation& drawSliceInfo, SoView2DCSOExtensibleEditor* editor);
00195 
00197   void drawFixedSizeCircleAt(float deviceX, float deviceY);
00198 
00200   void glVertex2fForVector3(const CSODrawView2DInfos& view2DInfos, const ml::Vector3& position, const SbVec2f& deviceOffset);
00203   void mapWorldToDeviceViaVoxel(const CSODrawView2DInfos& view2DInfos, const ml::Vector3& position, float& deviceX, float& deviceY);
00204 
00207   ml::Vector3 getTransformedPosition(const CSODrawView2DInfos& view2DInfos, const ml::Vector3& position);
00208 
00210   void mapWorldToDevice(const SoPointerPosition& pos, const ml::Vector3& worldPosition, float& deviceX, float& deviceY);
00212   ml::Vector3 mapDeviceToWorld(const SoPointerPosition& pos, float deviceX, float deviceY);
00214   ml::Vector3 mapWorldToVoxel(const SoPointerPosition& pos, const ml::Vector3& worldPosition);
00216   ml::Vector3 mapVoxelToWorld(const SoPointerPosition& pos, const ml::Vector3& voxelPosition);
00217 
00219   SbVec2f nonShadowOffset() const { return SbVec2f(0,0); }
00221   SbVec2f shadowOffset() const { return SbVec2f(1,1); }
00222 
00224   void setupGLForCSO(const CSODrawCSOInfos& csoInfos);
00226   void setupGLAntiAlias();
00228   void restoreGLAntiAlias();
00230   void setupGLShadow(float generalAlpha=1.0f);
00232   void glSetAlpha(float alpha);
00234   float getDepthAlpha(int maxSliceDistance, int currentSliceDistance) const;
00235 };
00236 
00238 
00239 #endif // __SoCSOEditorExtension_H