VTK
vtkHardwareSelector.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkHardwareSelector.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
64 #ifndef vtkHardwareSelector_h
65 #define vtkHardwareSelector_h
66 
67 #include "vtkRenderingCoreModule.h" // For export macro
68 #include "vtkObject.h"
69 
70 #include <string> // for std::string
71 
72 class vtkRenderer;
73 class vtkRenderWindow;
74 class vtkSelection;
75 class vtkProp;
76 class vtkTextureObject;
77 
78 class VTKRENDERINGCORE_EXPORT vtkHardwareSelector : public vtkObject
79 {
80 public:
82 
86  {
87  bool Valid;
88  int ProcessID;
89  int PropID;
91  unsigned int CompositeID;
94  Valid(false),
95  ProcessID(-1),
96  Prop(NULL),
97  CompositeID(0),
98  AttributeID(-1) {}
99  };
101 
102 public:
103  static vtkHardwareSelector* New();
105  void PrintSelf(ostream& os, vtkIndent indent);
106 
108 
111  virtual void SetRenderer(vtkRenderer*);
112  vtkGetObjectMacro(Renderer, vtkRenderer);
114 
116 
119  vtkSetVector4Macro(Area, unsigned int);
120  vtkGetVector4Macro(Area, unsigned int);
122 
124 
134  vtkSetMacro(FieldAssociation, int);
135  vtkGetMacro(FieldAssociation, int);
137 
139 
144  vtkSetMacro(UseProcessIdFromData, bool);
145  vtkGetMacro(UseProcessIdFromData, bool);
147 
152  vtkSelection* Select();
153 
155 
168  virtual bool CaptureBuffers();
169  PixelInformation GetPixelInformation(const unsigned int display_position[2])
170  { return this->GetPixelInformation(display_position, 0); }
171  PixelInformation GetPixelInformation(const unsigned int display_position[2], int maxDist)
172  { unsigned int temp[2]; return this->GetPixelInformation(display_position, maxDist, temp); }
173  PixelInformation GetPixelInformation(const unsigned int display_position[2],
174  int maxDist, unsigned int selected_position[2]);
176  { this->ReleasePixBuffers(); }
178 
183  virtual void RenderCompositeIndex(unsigned int index);
184 
188  virtual void RenderAttributeId(vtkIdType attribid);
189 
194  virtual void RenderProcessId(unsigned int processid);
195 
200  int Render(vtkRenderer* renderer, vtkProp** propArray, int propArrayCount);
201 
203 
207  virtual void BeginRenderProp();
208  virtual void EndRenderProp();
210 
212 
216  vtkSetMacro(ProcessID, int);
217  vtkGetMacro(ProcessID, int);
219 
221 
224  vtkGetVector3Macro(PropColorValue,float);
225  vtkSetVector3Macro(PropColorValue,float);
227 
229 
232  vtkGetMacro(CurrentPass, int);
234 
244  { return GenerateSelection(this->Area); }
245  virtual vtkSelection* GenerateSelection(unsigned int r[4])
246  { return GenerateSelection(r[0], r[1], r[2], r[3]); }
247  virtual vtkSelection* GenerateSelection(
248  unsigned int x1, unsigned int y1,
249  unsigned int x2, unsigned int y2);
250 
257  virtual vtkSelection* GeneratePolygonSelection(
258  int* polygonPoints, vtkIdType count);
259 
264  vtkProp* GetPropFromID(int id);
265 
267  {
274  MAX_KNOWN_PASS = ID_HIGH16,
275  MIN_KNOWN_PASS = PROCESS_PASS
276  };
277 
281  std::string PassTypeToString(PassTypes type);
282 
283  static void Convert(int id, float tcoord[3])
284  {
285  tcoord[0] = static_cast<float>((id & 0xff)/255.0);
286  tcoord[1] = static_cast<float>(((id & 0xff00) >> 8)/255.0);
287  tcoord[2] = static_cast<float>(((id & 0xff0000) >> 16)/255.0);
288  }
289 
290 protected:
293 
294  // Used to notify subclasses when a capture pass is occuring.
295  virtual void PreCapturePass(int pass) { (void)pass; }
296  virtual void PostCapturePass(int pass) { (void)pass; }
297 
298  // Called internally before and after each prop is rendered
299  // for device specific configuration/preparation etc.
300  virtual void BeginRenderProp(vtkRenderWindow *) = 0;
301  virtual void EndRenderProp(vtkRenderWindow *) = 0;
302 
303  int Convert(unsigned long offset, unsigned char* pb)
304  {
305  if (!pb)
306  {
307  return 0;
308  }
309  offset = offset * 3;
310  unsigned char rgb[3];
311  rgb[0] = pb[offset];
312  rgb[1] = pb[offset+1];
313  rgb[2] = pb[offset+2];
314  int val = 0;
315  val |= rgb[2];
316  val = val << 8;
317  val |= rgb[1];
318  val = val << 8;
319  val |= rgb[0];
320  return val;
321  }
322 
324 
327  int Convert(unsigned int pos[2], unsigned char* pb)
328  { return this->Convert(pos[0], pos[1], pb); }
329  int Convert(int xx, int yy, unsigned char* pb)
330  {
331  if (!pb)
332  {
333  return 0;
334  }
335  int offset = (yy * static_cast<int>(this->Area[2]-this->Area[0]+1) + xx) * 3;
336  unsigned char rgb[3];
337  rgb[0] = pb[offset];
338  rgb[1] = pb[offset+1];
339  rgb[2] = pb[offset+2];
340  int val = 0;
341  val |= rgb[2];
342  val = val << 8;
343  val |= rgb[1];
344  val = val << 8;
345  val |= rgb[0];
346  return val;
347  }
349 
350  vtkIdType GetID(int low24, int mid24, int high16)
351  {
352  vtkIdType val = 0;
353  val |= high16;
354  val = val << 24;
355  val |= mid24;
356  val = val << 24;
357  val |= low24;
358  return val;
359  }
360 
364  virtual bool PassRequired(int pass);
365 
371  bool IsPropHit(int propid);
372 
376  virtual int GetPropID(int idx, vtkProp* vtkNotUsed(prop))
377  { return idx; }
378 
379  virtual void BeginSelection();
380  virtual void EndSelection();
381 
382  virtual void SavePixelBuffer(int passNo);
383  void BuildPropHitList(unsigned char* rgbData);
384 
386 
389  void ReleasePixBuffers();
391  unsigned int Area[4];
396 
397  // At most 10 passes.
398  unsigned char* PixBuffer[10];
402  int PropID;
403  float PropColorValue[3];
404 
405 private:
406  vtkHardwareSelector(const vtkHardwareSelector&) VTK_DELETE_FUNCTION;
407  void operator=(const vtkHardwareSelector&) VTK_DELETE_FUNCTION;
408 
409  class vtkInternals;
410  vtkInternals* Internals;
411 
412 };
413 
414 #endif
415 
416 
abstract superclass for all actors, volumes and annotations
Definition: vtkProp.h:50
virtual void PostCapturePass(int pass)
abstract base class for most VTK objects
Definition: vtkObject.h:59
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
Struct used to return information about a pixel location.
virtual void PreCapturePass(int pass)
vtkIdType MaxAttributeId
Clears all pixel buffers.
PixelInformation GetPixelInformation(const unsigned int display_position[2], int maxDist)
It is possible to use the vtkHardwareSelector for a custom picking.
abstract specification for renderers
Definition: vtkRenderer.h:63
virtual vtkSelection * GenerateSelection(unsigned int r[4])
A node in a selection tree.
Definition: vtkSelection.h:43
int vtkIdType
Definition: vtkType.h:287
bool UseProcessIdFromData
Clears all pixel buffers.
int FieldAssociation
Clears all pixel buffers.
a simple class to control print indentation
Definition: vtkIndent.h:39
virtual int GetPropID(int idx, vtkProp *vtkNotUsed(prop))
Return a unique ID for the prop.
static void Convert(int id, float tcoord[3])
void ClearBuffers()
It is possible to use the vtkHardwareSelector for a custom picking.
int Convert(int xx, int yy, unsigned char *pb)
pos must be relative to the lower-left corner of this->Area.
vtkSetMacro(IgnoreDriverBugs, bool)
When set known driver bugs are ignored during driver feature detection.
abstracts an OpenGL texture object.
vtkIdType GetID(int low24, int mid24, int high16)
create a window for renderers to draw into
vtkRenderer * Renderer
Clears all pixel buffers.
PixelInformation GetPixelInformation(const unsigned int display_position[2])
It is possible to use the vtkHardwareSelector for a custom picking.
virtual vtkSelection * GenerateSelection()
Generates the vtkSelection from pixel buffers.
manager for OpenGL-based selection.
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
int Convert(unsigned long offset, unsigned char *pb)
int Convert(unsigned int pos[2], unsigned char *pb)
pos must be relative to the lower-left corner of this->Area.