00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00046 #ifndef __vtkCellPicker_h
00047 #define __vtkCellPicker_h
00048
00049 #include "vtkPicker.h"
00050
00051 class vtkMapper;
00052 class vtkTexture;
00053 class vtkAbstractVolumeMapper;
00054 class vtkImageActor;
00055 class vtkPlaneCollection;
00056 class vtkPiecewiseFunction;
00057 class vtkDataArray;
00058 class vtkDoubleArray;
00059 class vtkIdList;
00060 class vtkCell;
00061 class vtkGenericCell;
00062 class vtkImageData;
00063 class vtkAbstractCellLocator;
00064 class vtkCollection;
00065
00066 class VTK_RENDERING_EXPORT vtkCellPicker : public vtkPicker
00067 {
00068 public:
00069 static vtkCellPicker *New();
00070 vtkTypeMacro(vtkCellPicker, vtkPicker);
00071 void PrintSelf(ostream& os, vtkIndent indent);
00072
00074
00078 virtual int Pick(double selectionX, double selectionY, double selectionZ,
00079 vtkRenderer *renderer);
00081
00089 void AddLocator(vtkAbstractCellLocator *locator);
00090
00094 void RemoveLocator(vtkAbstractCellLocator *locator);
00095
00097 void RemoveAllLocators();
00098
00100
00106 vtkSetMacro(VolumeOpacityIsovalue, double);
00107 vtkGetMacro(VolumeOpacityIsovalue, double);
00109
00111
00115 vtkSetMacro(UseVolumeGradientOpacity, int);
00116 vtkBooleanMacro(UseVolumeGradientOpacity, int);
00117 vtkGetMacro(UseVolumeGradientOpacity, int);
00119
00121
00132 vtkSetMacro(PickClippingPlanes, int);
00133 vtkBooleanMacro(PickClippingPlanes, int);
00134 vtkGetMacro(PickClippingPlanes, int);
00136
00138
00144 vtkGetMacro(ClippingPlaneId, int);
00146
00148
00151 vtkGetVectorMacro(PickNormal, double, 3);
00153
00155
00157 vtkGetVector3Macro(MapperNormal, double);
00159
00161
00163 vtkGetVector3Macro(PointIJK, int);
00165
00167
00170 vtkGetVector3Macro(CellIJK, int);
00172
00174
00176 vtkGetMacro(PointId, vtkIdType);
00178
00180
00181 vtkGetMacro(CellId, vtkIdType);
00183
00185
00187 vtkGetMacro(SubId, int);
00189
00191
00194 vtkGetVector3Macro(PCoords, double);
00196
00199 vtkTexture *GetTexture() { return this->Texture; };
00200
00202
00210 vtkSetMacro(PickTextureData, int);
00211 vtkBooleanMacro(PickTextureData, int);
00212 vtkGetMacro(PickTextureData, int);
00214
00215 protected:
00216 vtkCellPicker();
00217 ~vtkCellPicker();
00218
00219 void Initialize();
00220
00221 virtual void ResetPickInfo();
00222
00223 virtual double IntersectWithLine(double p1[3], double p2[3], double tol,
00224 vtkAssemblyPath *path, vtkProp3D *p,
00225 vtkAbstractMapper3D *m);
00226
00227 virtual double IntersectActorWithLine(const double p1[3], const double p2[3],
00228 double t1, double t2, double tol,
00229 vtkProp3D *prop, vtkMapper *mapper);
00230
00231 virtual double IntersectVolumeWithLine(const double p1[3],
00232 const double p2[3],
00233 double t1, double t2,
00234 vtkProp3D *prop,
00235 vtkAbstractVolumeMapper *mapper);
00236
00237 virtual double IntersectImageActorWithLine(const double p1[3],
00238 const double p2[3],
00239 double t1, double t2,
00240 vtkImageActor *imageActor);
00241
00242 virtual double IntersectProp3DWithLine(const double p1[3],
00243 const double p2[3],
00244 double t1, double t2, double tol,
00245 vtkProp3D *prop,
00246 vtkAbstractMapper3D *mapper);
00247
00248 static int ClipLineWithPlanes(vtkPlaneCollection *planes,
00249 const double p1[3], const double p2[3],
00250 double &t1, double &t2, int& planeId);
00251
00252 static int ClipLineWithExtent(const int extent[6],
00253 const double x1[3], const double x2[3],
00254 double &t1, double &t2, int &planeId);
00255
00256 static int ComputeSurfaceNormal(vtkDataSet *data, vtkCell *cell,
00257 const double *weights, double normal[3]);
00258
00259 static int ComputeSurfaceTCoord(vtkDataSet *data, vtkCell *cell,
00260 const double *weights, double tcoord[3]);
00261
00262 static int HasSubCells(int cellType);
00263
00264 static int GetNumberOfSubCells(vtkIdList *pointIds, int cellType);
00265
00266 static void GetSubCell(vtkDataSet *data, vtkIdList *pointIds, int subId,
00267 int cellType, vtkGenericCell *cell);
00268
00269 static void SubCellFromCell(vtkGenericCell *cell, int subId);
00270
00271 void SetImageDataPickInfo(const double x[3], const int extent[6]);
00272
00273 double ComputeVolumeOpacity(const int xi[3], const double pcoords[3],
00274 vtkImageData *data, vtkDataArray *scalars,
00275 vtkPiecewiseFunction *scalarOpacity,
00276 vtkPiecewiseFunction *gradientOpacity);
00277
00278 vtkCollection *Locators;
00279
00280 double VolumeOpacityIsovalue;
00281 int UseVolumeGradientOpacity;
00282 int PickClippingPlanes;
00283 int ClippingPlaneId;
00284
00285 vtkIdType PointId;
00286 vtkIdType CellId;
00287 int SubId;
00288 double PCoords[3];
00289
00290 int PointIJK[3];
00291 int CellIJK[3];
00292
00293 double PickNormal[3];
00294 double MapperNormal[3];
00295
00296 vtkTexture *Texture;
00297 int PickTextureData;
00298
00299 private:
00300 void ResetCellPickerInfo();
00301
00302 vtkGenericCell *Cell;
00303 vtkIdList *PointIds;
00304 vtkDoubleArray *Gradients;
00305
00306 private:
00307 vtkCellPicker(const vtkCellPicker&);
00308 void operator=(const vtkCellPicker&);
00309 };
00310
00311 #endif
00312
00313