HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GR_PickRender.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  * NAME: GR_PickRender ( GR Library, C++)
7  *
8  * COMMENTS:
9  * Pure virutal base class for component picking
10  */
11 #ifndef GR_PickRender_h
12 #define GR_PickRender_h
13 
14 class GR_DisplayOption;
15 class GR_RenderInfo;
16 class GR_GeoRender;
17 
18 class RV_VKBuffer;
19 
20 #include "GR_API.h"
21 #include "GR_Defines.h"
22 #include "GR_GeoRender.h"
23 #include "GR_PickRecord.h"
24 
25 #include <UT/UT_VectorTypes.h>
26 #include <UT/UT_UniquePtr.h>
27 #include <GU/GU_SelectType.h>
28 
29 // --------------------------------------------------------------------------
30 
31 // Buffer used by GR_PickRender to store results of pick render
33 {
34 public:
35  virtual bool setSize(RE_RenderContext r,
36  int buffer_size,
37  int vector_size = 1,
38  bool inconclusive_stream_too = false) = 0;
39 
40  virtual bool getPickData(RE_RenderContext r,
41  int npicks,
42  const UT_Span<int32> &out_data) = 0;
43 
44  virtual int getVectorSize() const = 0;
45  virtual int getLength() const = 0;
46 
47  virtual GR_GeoRender::RenderType getRenderType() const = 0;
48 
49  virtual RV_VKBuffer* getVKBuffer() = 0;
50 
51  GR_PickBuffer() = default;
52 
53  GR_PickBuffer(const GR_PickBuffer&) = delete;
54  GR_PickBuffer(GR_PickBuffer&&) = delete;
55 
56  virtual ~GR_PickBuffer();
57 
58 private:
59 };
60 
61 // --------------------------------------------------------------------------
62 
64 {
65 public:
66  GR_PickRender() = default;
67  virtual ~GR_PickRender() = default;
68 
69  GR_PickRender(const GR_PickRender&) = delete;
70  GR_PickRender& operator=(const GR_PickRender&) = delete;
71 
72  GR_PickRender(GR_PickRender&&) = delete;
74 
75  // Fetch geometry data
76  virtual GR_GeoRender::RenderType getRenderType() const = 0;
77 
78  virtual bool isInstanced(int &num_inst) const = 0;
79 
80  virtual int getNumPoints() const = 0;
81 
82  virtual int getNumRenderPrims(int start_group, int end_group = -1) const = 0;
83 
84  virtual bool hasPointIDAttrib() const = 0;
85 
86  virtual bool hasPrimIDAttrib() const = 0;
87 
88  virtual bool hasVertIDAttrib() const = 0;
89 
90  virtual bool hasInstIDAttrib() const = 0;
91 
92  // Point picks
93  virtual int renderPoints(int connect_start,
94  int connect_num,
95  RE_PrimType real_prim_type,
96  int real_connect_start,
97  int real_connect_num,
98  GR_PickCompMode id_mode,
99  GR_PickStyle style,
100  bool has_pick_map,
101  GR_SelectMode select_mode,
102  int select_inst,
103  GR_PickBuffer *pick_buffer) = 0;
104 
105  // primitive picks
106  virtual int renderFacePrims(int connect_start,
107  int connect_num,
108  GR_PickCompMode id_mode,
109  GR_PickStyle style,
110  bool has_pick_map,
111  bool wireframe,
112  GR_SelectMode select_mode,
113  int select_inst,
114  GR_PickBuffer *pick_buffer) = 0;
115 
116  virtual int renderLinePrims(int connect_start,
117  int connect_num,
118  GR_PickCompMode id_mode,
119  GR_PickStyle style,
120  bool has_pick_map,
121  bool wireframe,
122  GR_SelectMode select_mode,
123  int select_inst,
124  GR_PickBuffer *pick_buffer) = 0;
125 
126  virtual int renderTetPrims(int connect_start,
127  int connect_num,
128  GR_PickCompMode id_mode,
129  GR_PickStyle style,
130  bool has_pick_map,
131  bool wireframe,
132  GR_SelectMode select_mode,
133  int select_inst,
134  GR_PickBuffer *pick_buffer) = 0;
135 
136  virtual int renderFaceDeformingPrims(int connect_start,
137  int connect_num,
138  GR_PickCompMode id_mode,
139  GR_PickStyle style,
140  bool has_pick_map,
141  bool wireframe,
142  GR_SelectMode select_mode,
143  int select_inst,
144  GR_PickBuffer *pick_buffer) = 0;
145 
146  virtual int renderSubDLinePrims(int connect_start,
147  int connect_num,
148  GR_PickCompMode id_mode,
149  GR_PickStyle style,
150  bool has_pick_map,
151  bool wireframe,
152  GR_SelectMode select_mode,
153  int select_inst,
154  GR_PickBuffer *pick_buffer,
155  UT_Vector2F lod_parms) = 0;
156 
157  // edge picks
158  virtual int renderFaceEdges(int connect_start,
159  int connect_num,
160  GR_PickCompMode point_id_mode,
161  bool midpoints,
162  GR_PickStyle style,
163  bool has_pick_map,
164  GR_SelectMode select_mode,
165  int select_inst,
166  GR_PickBuffer *pick_buffer) = 0;
167  virtual int renderMeshEdges(int connect_start,
168  int connect_num,
169  GR_PickCompMode point_id_mode,
170  bool midpoints,
171  GR_PickStyle style,
172  bool has_pick_map,
173  GR_SelectMode select_mode,
174  int select_inst,
175  GR_PickBuffer *pick_buffer) = 0;
176  virtual int renderLineEdges(int connect_start,
177  int connect_num,
178  GR_PickCompMode point_id_mode,
179  bool midpoints,
180  GR_PickStyle style,
181  bool has_pick_map,
182  bool wireframe,
183  GR_SelectMode select_mode,
184  int select_inst,
185  GR_PickBuffer *pick_buffer) = 0;
186 
187  // vertex picks
188  virtual int renderFaceVertices(int connect_start,
189  int connect_num,
190  GR_PickCompMode id_mode,
191  GR_PickStyle style,
192  bool has_pick_map,
193  GR_SelectMode select_mode,
194  int select_inst,
195  GR_PickBuffer *pick_buffer) = 0;
196 
197  virtual int renderLineVertices(int connect_start,
198  int connect_num,
199  GR_PickCompMode id_mode,
200  GR_PickStyle style,
201  bool has_pick_map,
202  GR_SelectMode select_mode,
203  int select_inst,
204  GR_PickBuffer *pick_buffer) = 0;
205  virtual int renderMeshVertices(int connect_start,
206  int connect_num,
207  GR_PickCompMode id_mode,
208  GR_PickStyle style,
209  bool has_pick_map,
210  GR_SelectMode select_mode,
211  int select_inst,
212  GR_PickBuffer *pick_buffer) = 0;
213  // Breakpoints
214  virtual int renderBreakpoints(int connect_start,
215  int connect_num,
216  GR_PickCompMode id_mode,
217  GR_PickStyle style,
218  bool has_pick_map,
219  bool wireframe,
220  GR_SelectMode select_mode,
221  int select_inst,
222  GR_PickBuffer *pick_buffer) = 0;
223 
224  // Guides
225  virtual int renderGuidePoints(int connect_start,
226  int connect_num,
227  GR_PickCompMode prim_id_mode,
228  GR_PickStyle style,
229  GR_SelectMode select_mode,
230  int select_inst) = 0;
231  virtual int renderGuideEdges(int connect_start,
232  int connect_num,
233  GR_PickCompMode prim_id_mode,
234  GR_PickStyle style,
235  GR_SelectMode select_mode,
236  int select_inst) = 0;
237 
238  // Normals
239  virtual int renderPointNormals(int connect_start,
240  int connect_num,
241  GR_PickCompMode id_mode,
242  GR_PickStyle style,
243  bool has_pick_map,
244  bool normalize) = 0;
245  virtual int renderFaceNormals(int connect_start,
246  int connect_num,
247  GR_PickStyle style,
248  bool has_pick_map) = 0;
249 
250  // converts raw ivec4 picks into GL-selection buffer picks, and returns
251  // the number of picks.
252  static int filterPicks(UT_Array<GR_PickRecord> &pick_records,
253  const int32 *raw_picks,
254  int num_raw_picks,
255  int vector_size,
256  const UT_Vector3i &base_id);
257 };
258 
259 // --------------------------------------------------------------------------
260 
261 class RV_Geometry;
262 class RV_VKBuffer;
263 
264 
266 {
267 public:
268  bool setSize(RE_RenderContext r, int buffer_size,
269  int vector_size = 1,
270  bool inconclusive_stream_too = false) override;
271 
273  int npicks,
274  const UT_Span<int32> &out_data) override;
275 
276  int getVectorSize() const override;
277  int getLength() const override;
278 
280  {
281  return GR_GeoRender::VULKAN;
282  }
283 
285  {
286  return myVkBuffer.get();
287  };
288 
289  void setNumPicks(exint n) { myNumPicks = n; }
290  exint getNumPicks() const { return myNumPicks; }
291 
292  GR_PickBufferVK();
293 
294  GR_PickBufferVK(const GR_PickBuffer&) = delete;
295  GR_PickBufferVK(GR_PickBuffer&&) = delete;
296 
297  ~GR_PickBufferVK() override;
298 
299 private:
300  UT_UniquePtr<RV_VKBuffer> myVkBuffer;
301  exint myEntries = 0;
302  exint myNumPicks = 0;
303 };
304 
305 // --------------------------------------------------------------------------
306 
308 {
309 public:
311  GR_Uniforms *u,
312  const GR_DisplayOption *opts,
313  const GR_RenderInfo *info,
314  RV_Geometry *geo,
315  GR_GeoRender *gr_geo = NULL);
316  ~GR_PickRenderVK() override;
317 
318  // Fetch geometry data
319  GR_GeoRender::RenderType getRenderType() const override;
320 
321  bool isInstanced(int &num_inst) const override;
322 
323  int getNumPoints() const override;
324 
325  int getNumRenderPrims(int start_group, int end_group = -1) const override;
326 
327  bool hasPointIDAttrib() const override;
328 
329  bool hasPrimIDAttrib() const override;
330 
331  bool hasVertIDAttrib() const override;
332 
333  bool hasInstIDAttrib() const override;
334 
335  // Point picks
336  int renderPoints(int connect_start,
337  int connect_num,
338  RE_PrimType real_prim_type,
339  int real_connect_start,
340  int real_connect_num,
341  GR_PickCompMode id_mode,
342  GR_PickStyle style,
343  bool has_pick_map,
344  GR_SelectMode select_mode,
345  int select_inst,
346  GR_PickBuffer *pick_buffer) override;
347 
348  // primitive picks
349  int renderFacePrims(int connect_start,
350  int connect_num,
351  GR_PickCompMode id_mode,
352  GR_PickStyle style,
353  bool has_pick_map,
354  bool wireframe,
355  GR_SelectMode select_mode,
356  int select_inst,
357  GR_PickBuffer *pick_buffer) override;
358 
359  int renderLinePrims(int connect_start,
360  int connect_num,
361  GR_PickCompMode id_mode,
362  GR_PickStyle style,
363  bool has_pick_map,
364  bool wireframe,
365  GR_SelectMode select_mode,
366  int select_inst,
367  GR_PickBuffer *pick_buffer) override;
368 
369  int renderTetPrims(int connect_start,
370  int connect_num,
371  GR_PickCompMode id_mode,
372  GR_PickStyle style,
373  bool has_pick_map,
374  bool wireframe,
375  GR_SelectMode select_mode,
376  int select_inst,
377  GR_PickBuffer *pick_buffer) override;
378 
379  int renderFaceDeformingPrims(int connect_start,
380  int connect_num,
381  GR_PickCompMode id_mode,
382  GR_PickStyle style,
383  bool has_pick_map,
384  bool wireframe,
385  GR_SelectMode select_mode,
386  int select_inst,
387  GR_PickBuffer *pick_buffer) override;
388  int renderFaceDeformingPrims(int connect_start,
389  int connect_num,
390  int instance_group,
391  GR_PickCompMode id_mode,
392  GR_PickStyle style,
393  bool has_pick_map,
394  bool wireframe,
395  GR_SelectMode select_mode,
396  int select_inst,
397  GR_PickBuffer *pick_buffer);
398 
399  int renderSubDLinePrims(int connect_start,
400  int connect_num,
401  GR_PickCompMode id_mode,
402  GR_PickStyle style,
403  bool has_pick_map,
404  bool wireframe,
405  GR_SelectMode select_mode,
406  int select_inst,
407  GR_PickBuffer *pick_buffer,
408  UT_Vector2F lod_parms) override;
409 
410  // must call with compatible shader already bound
411  int renderCustomPrims(int connect_start,
412  int connect_num,
413  int instance_group,
414  GR_PickCompMode id_mode,
415  GR_PickStyle style,
416  bool has_pick_map,
417  bool wireframe,
418  GR_SelectMode select_mode,
419  int select_inst,
420  GR_PickBuffer *pick_buffer);
421 
422  // edge picks
423  int renderFaceEdges(int connect_start,
424  int connect_num,
425  GR_PickCompMode point_id_mode,
426  bool midpoints,
427  GR_PickStyle style,
428  bool has_pick_map,
429  GR_SelectMode select_mode,
430  int select_inst,
431  GR_PickBuffer *pick_buffer) override;
432  int renderMeshEdges(int connect_start,
433  int connect_num,
434  GR_PickCompMode point_id_mode,
435  bool midpoints,
436  GR_PickStyle style,
437  bool has_pick_map,
438  GR_SelectMode select_mode,
439  int select_inst,
440  GR_PickBuffer *pick_buffer) override;
441  int renderLineEdges(int connect_start,
442  int connect_num,
443  GR_PickCompMode point_id_mode,
444  bool midpoints,
445  GR_PickStyle style,
446  bool has_pick_map,
447  bool wireframe,
448  GR_SelectMode select_mode,
449  int select_inst,
450  GR_PickBuffer *pick_buffer) override;
451 
452  // vertex picks
453  int renderFaceVertices(int connect_start,
454  int connect_num,
455  GR_PickCompMode id_mode,
456  GR_PickStyle style,
457  bool has_pick_map,
458  GR_SelectMode select_mode,
459  int select_inst,
460  GR_PickBuffer *pick_buffer) override;
461 
462  int renderLineVertices(int connect_start,
463  int connect_num,
464  GR_PickCompMode id_mode,
465  GR_PickStyle style,
466  bool has_pick_map,
467  GR_SelectMode select_mode,
468  int select_inst,
469  GR_PickBuffer *pick_buffer) override;
470  int renderMeshVertices(int connect_start,
471  int connect_num,
472  GR_PickCompMode id_mode,
473  GR_PickStyle style,
474  bool has_pick_map,
475  GR_SelectMode select_mode,
476  int select_inst,
477  GR_PickBuffer *pick_buffer) override;
478  // Breakpoints
479  int renderBreakpoints(int connect_start,
480  int connect_num,
481  GR_PickCompMode id_mode,
482  GR_PickStyle style,
483  bool has_pick_map,
484  bool wireframe,
485  GR_SelectMode select_mode,
486  int select_inst,
487  GR_PickBuffer *pick_buffer) override;
488 
489  // Guides
490  int renderGuidePoints(int connect_start,
491  int connect_num,
492  GR_PickCompMode prim_id_mode,
493  GR_PickStyle style,
494  GR_SelectMode select_mode,
495  int select_inst) override;
496  int renderGuideEdges(int connect_start,
497  int connect_num,
498  GR_PickCompMode prim_id_mode,
499  GR_PickStyle style,
500  GR_SelectMode select_mode,
501  int select_inst) override;
502 
503  // Normals
504  int renderPointNormals(int connect_start,
505  int connect_num,
506  GR_PickCompMode id_mode,
507  GR_PickStyle style,
508  bool has_pick_map,
509  bool normalize) override;
510  int renderFaceNormals(int connect_start,
511  int connect_num,
512  GR_PickStyle style,
513  bool has_pick_map) override;
514 
515 
516  static bool initShaders(RV_Instance* ri);
517  static void cleanupShaders();
518 protected:
519 
520  int pickFacesImpl(int connect_start,
521  int connect_num,
522  int instance_group,
523  GR_PickCompMode id_mode,
524  GR_PickStyle style,
525  bool has_pick_map,
526  bool wireframe,
527  GR_SelectMode select_mode,
528  int select_inst,
529  GR_PickBuffer *pick_buffer,
530  bool is_deforming);
531 
532  // Matches definition in `glH_PickInfo.blk`
533  struct PickInfo
534  {
535  int use_varying_id = 0;
536  int hide_selected = 0;
537  int pick_outside = 0;
538  int checkDepth = 0;
539  int pick_front_face = 0;
540  int pick_back_face = 0;
541  int avoid_edges = 0;
542  float vertex_offset = 0.f;
543  };
544 
545  int drawGeo(int connect_start,
546  int connect_num,
547  int inst_group,
548  GR_SelectMode select_mode,
549  int select_inst,
550  unsigned int pick_mode,
551  const PickInfo& pick_params,
552  GR_PickBuffer *pick_buffer = nullptr);
553 
554 
555 
563 
564 };
565 
566 #endif
GR_PickBuffer()=default
RV_Geometry * myGeo
int int32
Definition: SYS_Types.h:39
virtual bool setSize(RE_RenderContext r, int buffer_size, int vector_size=1, bool inconclusive_stream_too=false)=0
virtual bool isInstanced(int &num_inst) const =0
virtual RV_VKBuffer * getVKBuffer()=0
virtual int getNumPoints() const =0
virtual int getNumRenderPrims(int start_group, int end_group=-1) const =0
virtual bool hasPrimIDAttrib() const =0
int64 exint
Definition: SYS_Types.h:125
Object that represents drawable geometry. This object holds vertex, instancing and index buffers for ...
Definition: RV_Geometry.h:165
int getLength() const override
virtual int getVectorSize() const =0
UT_UniquePtr< RV_OverrideList > myOverrides
Temporary container for either a RV_Render and an RE_Render.
RV_VKBuffer * getVKBuffer() override
virtual bool getPickData(RE_RenderContext r, int npicks, const UT_Span< int32 > &out_data)=0
virtual int renderLineVertices(int connect_start, int connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
Definition: UT_UniquePtr.h:39
virtual int renderFaceDeformingPrims(int connect_start, int connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, bool wireframe, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
GLdouble n
Definition: glcorearb.h:2008
GR_GeoRender::RenderType getRenderType() const override
virtual bool hasVertIDAttrib() const =0
virtual int renderLinePrims(int connect_start, int connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, bool wireframe, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
virtual ~GR_PickBuffer()
const GR_DisplayOption * myOpts
bool getPickData(RE_RenderContext r, int npicks, const UT_Span< int32 > &out_data) override
RV_Render * myR
RV_API void cleanupShaders()
virtual bool hasPointIDAttrib() const =0
virtual int renderFaceNormals(int connect_start, int connect_num, GR_PickStyle style, bool has_pick_map)=0
#define GR_API
Definition: GR_API.h:10
~GR_PickBufferVK() override
void setNumPicks(exint n)
virtual int renderFaceVertices(int connect_start, int connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
virtual int renderPoints(int connect_start, int connect_num, RE_PrimType real_prim_type, int real_connect_start, int real_connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
virtual int renderGuidePoints(int connect_start, int connect_num, GR_PickCompMode prim_id_mode, GR_PickStyle style, GR_SelectMode select_mode, int select_inst)=0
virtual GR_GeoRender::RenderType getRenderType() const =0
Handle to the main interface of Vulkan.
Definition: RV_Instance.h:48
virtual int getLength() const =0
virtual GR_GeoRender::RenderType getRenderType() const =0
virtual int renderMeshEdges(int connect_start, int connect_num, GR_PickCompMode point_id_mode, bool midpoints, GR_PickStyle style, bool has_pick_map, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
virtual int renderPointNormals(int connect_start, int connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, bool normalize)=0
int getVectorSize() const override
RV_API bool initShaders(RV_Instance *inst)
virtual int renderSubDLinePrims(int connect_start, int connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, bool wireframe, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer, UT_Vector2F lod_parms)=0
GR_PickCompMode
Definition: GR_PickRecord.h:52
virtual int renderBreakpoints(int connect_start, int connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, bool wireframe, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
virtual int renderMeshVertices(int connect_start, int connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
LeafData & operator=(const LeafData &)=delete
virtual int renderLineEdges(int connect_start, int connect_num, GR_PickCompMode point_id_mode, bool midpoints, GR_PickStyle style, bool has_pick_map, bool wireframe, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
virtual bool hasInstIDAttrib() const =0
FMT_CONSTEXPR basic_fp< F > normalize(basic_fp< F > value)
Definition: format.h:1701
virtual int renderGuideEdges(int connect_start, int connect_num, GR_PickCompMode prim_id_mode, GR_PickStyle style, GR_SelectMode select_mode, int select_inst)=0
virtual int renderTetPrims(int connect_start, int connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, bool wireframe, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
const GR_RenderInfo * myInfo
exint getNumPicks() const
GLboolean r
Definition: glcorearb.h:1222
set of parameters sent to GR_Primitive::update()
Definition: GR_Uniforms.h:56
A vulkan buffer object.
Definition: RV_VKBuffer.h:75
GR_Uniforms * myU
virtual int renderFaceEdges(int connect_start, int connect_num, GR_PickCompMode point_id_mode, bool midpoints, GR_PickStyle style, bool has_pick_map, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
RE_PrimType
Definition: RE_Types.h:199
virtual int renderFacePrims(int connect_start, int connect_num, GR_PickCompMode id_mode, GR_PickStyle style, bool has_pick_map, bool wireframe, GR_SelectMode select_mode, int select_inst, GR_PickBuffer *pick_buffer)=0
GR_GeoRender * myGeoRender
GR_SelectMode
Definition: GR_Defines.h:246
bool setSize(RE_RenderContext r, int buffer_size, int vector_size=1, bool inconclusive_stream_too=false) override
GR_PickStyle
Definition: GR_Defines.h:257