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  // get if `inst_group` exists, and returns number of instances.
324  // if inst_group is less than 0, calls into isInstanced, to get total
325  // instance cound accross all groups
326  bool hasInstanceGroup(int &num_inst, int inst_group) const;
327 
328  int getNumPoints() const override;
329 
330  int getNumRenderPrims(int start_group, int end_group = -1) const override;
331 
332  bool hasPointIDAttrib() const override;
333 
334  bool hasPrimIDAttrib() const override;
335 
336  bool hasVertIDAttrib() const override;
337 
338  bool hasInstIDAttrib() const override;
339 
340  // Point picks
341  int renderPoints(int connect_start,
342  int connect_num,
343  RE_PrimType real_prim_type,
344  int real_connect_start,
345  int real_connect_num,
346  GR_PickCompMode id_mode,
347  GR_PickStyle style,
348  bool has_pick_map,
349  GR_SelectMode select_mode,
350  int select_inst,
351  GR_PickBuffer *pick_buffer) override;
352 
353  // primitive picks
354  int renderFacePrims(int connect_start,
355  int connect_num,
356  GR_PickCompMode id_mode,
357  GR_PickStyle style,
358  bool has_pick_map,
359  bool wireframe,
360  GR_SelectMode select_mode,
361  int select_inst,
362  GR_PickBuffer *pick_buffer) override;
363 
364  int renderLinePrims(int connect_start,
365  int connect_num,
366  GR_PickCompMode id_mode,
367  GR_PickStyle style,
368  bool has_pick_map,
369  bool wireframe,
370  GR_SelectMode select_mode,
371  int select_inst,
372  GR_PickBuffer *pick_buffer) override;
373 
374  int renderTetPrims(int connect_start,
375  int connect_num,
376  GR_PickCompMode id_mode,
377  GR_PickStyle style,
378  bool has_pick_map,
379  bool wireframe,
380  GR_SelectMode select_mode,
381  int select_inst,
382  GR_PickBuffer *pick_buffer) override;
383 
384  int renderFaceDeformingPrims(int connect_start,
385  int connect_num,
386  GR_PickCompMode id_mode,
387  GR_PickStyle style,
388  bool has_pick_map,
389  bool wireframe,
390  GR_SelectMode select_mode,
391  int select_inst,
392  GR_PickBuffer *pick_buffer) override;
393  int renderFaceDeformingPrims(int connect_start,
394  int connect_num,
395  int instance_group,
396  GR_PickCompMode id_mode,
397  GR_PickStyle style,
398  bool has_pick_map,
399  bool wireframe,
400  GR_SelectMode select_mode,
401  int select_inst,
402  GR_PickBuffer *pick_buffer);
403 
404  int renderSubDLinePrims(int connect_start,
405  int connect_num,
406  GR_PickCompMode id_mode,
407  GR_PickStyle style,
408  bool has_pick_map,
409  bool wireframe,
410  GR_SelectMode select_mode,
411  int select_inst,
412  GR_PickBuffer *pick_buffer,
413  UT_Vector2F lod_parms) override;
414 
415  // must call with compatible shader already bound
416  int renderCustomPrims(int connect_start,
417  int connect_num,
418  int instance_group,
419  GR_PickCompMode id_mode,
420  GR_PickStyle style,
421  bool has_pick_map,
422  bool wireframe,
423  GR_SelectMode select_mode,
424  int select_inst,
425  GR_PickBuffer *pick_buffer);
426 
427  // edge picks
428  int renderFaceEdges(int connect_start,
429  int connect_num,
430  GR_PickCompMode point_id_mode,
431  bool midpoints,
432  GR_PickStyle style,
433  bool has_pick_map,
434  GR_SelectMode select_mode,
435  int select_inst,
436  GR_PickBuffer *pick_buffer) override;
437  int renderMeshEdges(int connect_start,
438  int connect_num,
439  GR_PickCompMode point_id_mode,
440  bool midpoints,
441  GR_PickStyle style,
442  bool has_pick_map,
443  GR_SelectMode select_mode,
444  int select_inst,
445  GR_PickBuffer *pick_buffer) override;
446  int renderLineEdges(int connect_start,
447  int connect_num,
448  GR_PickCompMode point_id_mode,
449  bool midpoints,
450  GR_PickStyle style,
451  bool has_pick_map,
452  bool wireframe,
453  GR_SelectMode select_mode,
454  int select_inst,
455  GR_PickBuffer *pick_buffer) override;
456 
457  // vertex picks
458  int renderFaceVertices(int connect_start,
459  int connect_num,
460  GR_PickCompMode id_mode,
461  GR_PickStyle style,
462  bool has_pick_map,
463  GR_SelectMode select_mode,
464  int select_inst,
465  GR_PickBuffer *pick_buffer) override;
466 
467  int renderLineVertices(int connect_start,
468  int connect_num,
469  GR_PickCompMode id_mode,
470  GR_PickStyle style,
471  bool has_pick_map,
472  GR_SelectMode select_mode,
473  int select_inst,
474  GR_PickBuffer *pick_buffer) override;
475  int renderMeshVertices(int connect_start,
476  int connect_num,
477  GR_PickCompMode id_mode,
478  GR_PickStyle style,
479  bool has_pick_map,
480  GR_SelectMode select_mode,
481  int select_inst,
482  GR_PickBuffer *pick_buffer) override;
483  // Breakpoints
484  int renderBreakpoints(int connect_start,
485  int connect_num,
486  GR_PickCompMode id_mode,
487  GR_PickStyle style,
488  bool has_pick_map,
489  bool wireframe,
490  GR_SelectMode select_mode,
491  int select_inst,
492  GR_PickBuffer *pick_buffer) override;
493 
494  // Guides
495  int renderGuidePoints(int connect_start,
496  int connect_num,
497  GR_PickCompMode prim_id_mode,
498  GR_PickStyle style,
499  GR_SelectMode select_mode,
500  int select_inst) override;
501  int renderGuideEdges(int connect_start,
502  int connect_num,
503  GR_PickCompMode prim_id_mode,
504  GR_PickStyle style,
505  GR_SelectMode select_mode,
506  int select_inst) override;
507 
508  // Normals
509  int renderPointNormals(int connect_start,
510  int connect_num,
511  GR_PickCompMode id_mode,
512  GR_PickStyle style,
513  bool has_pick_map,
514  bool normalize) override;
515  int renderFaceNormals(int connect_start,
516  int connect_num,
517  GR_PickStyle style,
518  bool has_pick_map) override;
519 
520 
521  static bool initShaders(RV_Instance* ri);
522  static void cleanupShaders();
523 protected:
524 
525  int pickFacesImpl(int connect_start,
526  int connect_num,
527  int instance_group,
528  GR_PickCompMode id_mode,
529  GR_PickStyle style,
530  bool has_pick_map,
531  bool wireframe,
532  GR_SelectMode select_mode,
533  int select_inst,
534  GR_PickBuffer *pick_buffer,
535  bool is_deforming);
536 
537  // Matches definition in `glH_PickInfo.blk`
538  struct PickInfo
539  {
540  int use_varying_id = 0;
541  int hide_selected = 0;
542  int pick_outside = 0;
543  int checkDepth = 0;
544  int pick_front_face = 0;
545  int pick_back_face = 0;
546  int avoid_edges = 0;
547  float vertex_offset = 0.f;
548  };
549 
550  int drawGeo(int connect_start,
551  int connect_num,
552  int inst_group,
553  GR_SelectMode select_mode,
554  int select_inst,
555  unsigned int pick_mode,
556  const PickInfo& pick_params,
557  GR_PickBuffer *pick_buffer = nullptr);
558 
559 
560 
568 
569 };
570 
571 #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:50
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