HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GR_PrimPacked.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_PrimPacked.h (GR Library, C++)
7  *
8  * COMMENTS:
9  */
10 #ifndef __GR_PrimPacked__
11 #define __GR_PrimPacked__
12 
13 #include "GR_Primitive.h"
14 #include "GR_MaterialGroups.h"
15 
16 #include <UT/UT_UniquePtr.h>
17 #include <RE/RE_VertexArray.h>
18 
19 #ifdef USE_VULKAN
20 class GR_InstanceBuffer;
21 class GR_GeoRender;
22 typedef UT_UniquePtr<GR_InstanceBuffer> GR_InstanceBufferPtr;
23 #endif
24 
26 {
27 public:
28  GR_PrimPacked(const GR_RenderInfo *info,
29  const char *cache_name,
30  const GT_PrimitiveHandle &packed_prim,
31  const GT_PrimitiveHandle &instanced_prim,
32  const GU_ConstDetailHandle &instanced_gdp,
33  int prim_index = -1);
34 
35  ~GR_PrimPacked() override;
36 
37  const char *className() const override { return "GR_PrimPacked"; }
38 
40  { return GR_BASE_PRIM_PACKED; }
42  { return myInstancedPrim; }
43 
44  const GT_PrimitiveHandle &instancePrim() const { return myInstancedPrim; }
45  const GT_PrimitiveHandle &packedPrim() const { return myPackedPrim; }
46 
47  void setPackedPrim(const GT_PrimitiveHandle &packed_prim);
48  void setInstancedPrim(const GT_PrimitiveHandle &instance,
49  const GU_ConstDetailHandle &inst_gdp);
50  void setPrimIndex(int pindex)
51  { myPrimIndex = pindex; }
52 
54  int geo_type,
55  const GT_PrimitiveHandle &ph,
56  const GEO_Primitive *prim) override;
57 
59  const GT_PrimitiveHandle &primh,
60  const GR_UpdateParms &p) override;
61 
65  const GR_DrawParms &dp,
66  const UT_Matrix4D &proj_view,
67  const UT_Matrix4D &object,
68  const UT_Vector2F &min_proj_size,
69  bool &visible,
70  bool &defer) override;
71 
73  GR_RenderMode render_mode,
75  GR_DrawParms dp) override;
76 
78  GR_Decoration decor,
79  const GR_DecorationParms &parms) override;
81  const GR_DisplayOption *opt,
82  unsigned int pick_type,
83  GR_PickStyle pick_style,
84  bool has_pick_map) override;
85 
86  bool checkForTransformChange();
87 
88  // Delegate these to the child prim.
89  GR_DispOptChange displayOptionChange(
90  const GR_DisplayOption &opts,
91  bool first_init) override;
92  bool updateOnViewChange(
93  const GR_DisplayOption &) const override;
94  void viewUpdate(
96  const GR_ViewUpdateParms &parms) override;
97  bool needsGLStateCheck(
98  const GR_DisplayOption &opts) const override;
99  bool checkGLState(
101  const GR_DisplayOption &opt) override;
102  bool setup(const GR_DisplayOption *) override;
103  void cleanup(RE_RenderContext r) override;
104 
105  bool requiresAlphaPass() const override;
106  const GA_Primitive *getGAPrimitive(const GU_Detail *gdp,
107  exint primitive_id) const override;
108  exint getGAVertex(const GU_Detail *gdp,
109  exint vertex_id) const override;
111  bool renderInAlphaPass(GR_AlphaPass a) override;
112  bool inViewFrustum(
113  const UT_Matrix4D &objviewproj,
114  const UT_BoundingBoxD *bbox = nullptr) override;
115  bool isRasterizedInView(
116  const UT_Matrix4F &objviewproj,
117  const UT_Vector2F &min_proj_size,
118  const UT_BoundingBoxF *bbox) override;
119  bool getBoundingBox(UT_BoundingBoxD &bbox) const override;
120 
121  exint getNumGLPrimitives(const GR_DisplayOption *) override;
122  void retirePrimitive() override;
123 
124  GR_SelectMode getSelectionMode(const GU_Detail &gdp,
126 
127  void setPickID(GA_Index prim_id, GA_Index point_id);
128 
129  void setInstanceHookPrim(GR_Primitive *prim);
130 
131  bool isPrimVisible() const override
132  { return myPrimVisible; }
133  void setPrimVisible(bool v)
134  { myPrimVisible = v; }
135 
136 
137  bool supportsParallelDraw() const override;
138 
139  bool supportsParallelUpdate() const override;
140 
141  void getGeoRenders(
142  UT_Array<GR_GeoRender *> &renders) override;
143 
144 protected:
145  virtual int getNumInstances() const { return 1; }
146  virtual UT_Matrix4D getTransform(int ) const
147  { return myInstancePrimTransform; }
148  virtual bool isFragment() const { return false; }
149  virtual bool getSingleTransform(UT_Matrix4D &mat) const
150  { mat = myInstancePrimTransform; return true; }
151 
152  bool updateCacheName(const GT_PrimitiveHandle &iph,
153  const GR_UpdateParms &p,
154  bool fallback);
155  void updateInstanceGeometry(RE_RenderContext r,
156  const GT_PrimitiveHandle &container_prim,
157  const GR_UpdateParms &p,
158  bool build_anchors,
159  GR_UpdateReason full_update);
160 
161  bool fetchBoundingBox(UT_BoundingBoxD &bbox) const;
162  virtual void buildAnchorsGL3(RE_RenderContext r,
163  const GR_UpdateParms &p,
164  GR_UpdateReason full_reason,
165  const GT_PrimitiveHandle &xforms);
166  void buildPickID(const GT_PrimitiveHandle &pid);
167  RE_Geometry *buildPickBBox(RE_RenderContext r) const;
168  void buildInstPrimTransform();
169 
170  // Given the packed geometry handle and the update reason for the packed
171  // primitive, determine the update reason for the packed geometry.
172  GR_UpdateReason checkForPackedGeoChanges(const GT_PrimitiveHandle &ph,
173  GR_UpdateReason reason);
174  GR_UpdateParms checkForPackedMaterialAssignment(const GR_UpdateParms &p);
175 
176  void updateLightLinking();
177  void updateLinkMap(const UT_StringRef &attrib_name,
178  UT_StringMap<int> &link_map,
179  UT_StringArray &list,
180  bool &has_link);
181  bool setLightLinkMask(RE_RenderContext rc,
182  GR_DrawParms &dp,
183  int &prev_mask) const;
184  void restoreLightLinkMask(RE_RenderContext rc,
185  GR_DrawParms &dp,
186  int prev_mask) const;
187  void buildInstancedColor(RE_RenderContext r,
188  const GR_UpdateParms &p);
189 
190 
191  // Packed primitive
198 
199  // Instanced (contained) primitive
211 #ifdef USE_VULKAN
212  GR_InstanceBufferPtr myColorBuf;
213 #endif
214 
222 
229 
235 #ifdef USE_VULKAN
236  GR_InstanceBufferPtr mySelectionBuf;
237 #endif
241 
244 
250 
252  mutable bool myCachedBBoxValid;
253 
254  // light linking in lops
261 
262  // For GR_PrimPacked only
264 
267 
269  // --------
270 };
271 
273 {
274 public:
276  const char *cache_name,
277  const GT_PrimitiveHandle &packed_prim,
278  const GT_PrimitiveHandle &instanced_prim,
279  const GU_ConstDetailHandle &instanced_gdp)
280  : GR_PrimPacked(info, cache_name,packed_prim,instanced_prim,instanced_gdp)
281  {}
282 
283 
284  const char *className() const override { return "GR_PrimPackedMesh"; }
285 
287  { return GR_BASE_PRIM_PACKED_MESH; }
288 };
289 
290 
293  bool first_init)
294 {
295  if(myInstance)
296  return myInstance->checkDisplayOptionChange(opts);
297  return DISPLAY_UNCHANGED;
298 }
299 
300 inline bool
302 {
303  if(myInstance)
304  return myInstance->updateOnViewChange(opt);
305  return false;
306 }
307 
308 inline void
310 {
311  if(myInstance)
312  myInstance->viewUpdate(r, parms);
313 }
314 
315 inline bool
317 {
318  if(myInstance)
319  return myInstance->needsGLStateCheck(opts);
320  return false;
321 }
322 
323 inline bool
325 {
326  if(myInstance)
327  return myInstance->checkGLState(r,opts);
328  return false;
329 }
330 
331 inline bool
333 {
334  if(myInstance)
335  return myInstance->setup(d);
336  return false;
337 }
338 
339 inline void
341 {
342  if(myInstance)
343  myInstance->cleanup(r);
344 }
345 
346 
347 inline bool
349 {
350  if(myInstance)
351  return myInstance->requiresAlphaPass();
352  return false;
353 }
354 
355 inline const GA_Primitive *
357  exint primitive_id) const
358 {
359  if(myInstance)
360  return myInstance->getGAPrimitive(gdp, primitive_id);
361  return NULL;
362 }
363 
364 inline exint
366  exint vertex_id) const
367 {
368  if(myInstance)
369  return myInstance->getGAVertex(gdp, vertex_id);
370  return exint(-1);
371 }
372 
373 inline RE_Geometry *
375 {
376  return NULL;
377 }
378 
379 inline bool
381 {
382  if(myInstance)
383  return myInstance->renderInAlphaPass(a);
384  return true;
385 }
386 
387 inline bool
389  const UT_BoundingBoxD *bbox)
390 {
391  if(myInstance)
392  return myInstance->inViewFrustum(objviewproj, bbox);
393  // if no instance, no point in rendering nothing, so cull
394  return false;
395 }
396 
397 inline bool
399  const UT_Vector2F &min_proj_size,
400  const UT_BoundingBoxF *bbox)
401 {
402  if(myInstance)
403  return myInstance->isRasterizedInView(objviewproj, min_proj_size,bbox);
404  // if no instance, no point in rendering nothing, so cull
405  return false;
406 }
407 
408 inline bool
410 {
411  return myInstance ? myInstance->getBoundingBox(bbox) : false;
412 }
413 
414 inline exint
416 {
417  return myInstance ? myInstance->getNumGLPrimitives(opt) : 0;
418 }
419 
420 #endif
421 
GT_API const UT_StringHolder selection
virtual bool inViewFrustum(const UT_Matrix4D &objviewproj, const UT_BoundingBoxD *bbox=nullptr)
Definition: GR_Primitive.h:211
virtual bool getSingleTransform(UT_Matrix4D &mat) const
GLbitfield flags
Definition: glcorearb.h:1596
virtual void render(RE_RenderContext r, GR_RenderMode render_mode, GR_RenderFlags flags, GR_DrawParms dp)=0
bool isRasterizedInView(const UT_Matrix4F &objviewproj, const UT_Vector2F &min_proj_size, const UT_BoundingBoxF *bbox) override
void cleanup(RE_RenderContext r) override
virtual bool updateOnViewChange(const GR_DisplayOption &) const
If this primitive requires an update when the view changes, return true.
Definition: GR_Primitive.h:124
virtual exint getNumGLPrimitives(const GR_DisplayOption *)
virtual bool requiresAlphaPass() const
Return true if this primitive requires an alpha pass.
Definition: GR_Primitive.h:230
Unsorted map container.
Definition: UT_Map.h:109
UT_IntArray myBBoxInstances
RE_VertexArray * myColorVA
int64 myInstancedDetailID
int64 myInstancedDetailCacheCount
const GA_Primitive * getGAPrimitive(const GU_Detail *gdp, exint primitive_id) const override
bool needsGLStateCheck(const GR_DisplayOption &opts) const override
Set of parameters sent to GR_Primitive::viewUpdate().
RE_VertexArray * mySelectionVA
GR_PrimitivePtr myInstance
const GLdouble * v
Definition: glcorearb.h:837
GT_DataArrayHandle myPointIDs
bool myPrimTypeChanged
virtual bool supportsParallelDraw() const
Definition: GR_Primitive.h:271
GA_Index myPrimID
RE_VertexArrayRef myCenterPointP
bool myIsConsolidatedMesh
void viewUpdate(RE_RenderContext r, const GR_ViewUpdateParms &parms) override
bool myQueuedDrawValid
GT_PrimitiveHandle myPackedPrim
A collection of vertex arrays defining a geometry object. This class acts as a wrapper around multipl...
Definition: RE_Geometry.h:52
int64 exint
Definition: SYS_Types.h:125
UT_Vector3F myInstancePoint
GT_API const UT_StringHolder cache_name
exint getNumGLPrimitives(const GR_DisplayOption *) override
GR_SelectMode myPointSelectMode
GLboolean GLboolean GLboolean GLboolean a
Definition: glcorearb.h:1222
UT_UniquePtr< GR_GeoRender > myCenterPrimsGeo
GR_Decoration
Definition: GR_Defines.h:164
GR_PrimPackedMesh(const GR_RenderInfo *info, const char *cache_name, const GT_PrimitiveHandle &packed_prim, const GT_PrimitiveHandle &instanced_prim, const GU_ConstDetailHandle &instanced_gdp)
GR_AlphaPass
Definition: GR_Defines.h:123
A class that manages material assignments to different groups of primitives.
RE_CacheVersion myCenterPointCacheVersion
Temporary container for either a RV_Render and an RE_Render.
bool setup(const GR_DisplayOption *) override
virtual void getGeoRenders(UT_Array< GR_GeoRender * > &renders)
Definition: GR_Primitive.h:349
virtual void viewUpdate(RE_RenderContext r, const GR_ViewUpdateParms &parms)
Definition: GR_Primitive.h:134
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
Definition: UT_UniquePtr.h:39
void setPrimVisible(bool v)
set of parameters sent to GR_Primitive::update()
GT_DataArrayHandle myPrimIDs
UT_BoundingBox * myAssignedBBox
GT_PrimitiveHandle getInstancePrim() const override
Definition: GR_PrimPacked.h:41
GT_API const UT_StringHolder point_id
virtual int renderPick(RE_RenderContext r, const GR_DisplayOption *opt, unsigned int pick_type, GR_PickStyle pick_style, bool has_pick_map)=0
UT_StringArray myShadowMasks
virtual void checkForDeferredDraw(RE_RenderContext r, GR_RenderMode mode, GR_RenderFlags flags, const GR_DrawParms &dp, const UT_Matrix4D &proj_view, const UT_Matrix4D &object, const UT_Vector2F &min_proj_size, bool &visible, bool &defer)
bool requiresAlphaPass() const override
Return true if this primitive requires an alpha pass.
virtual const GA_Primitive * getGAPrimitive(const GU_Detail *gdp, exint primitive_id) const
bool isPrimVisible() const override
GR_RenderMode
Definition: GR_Defines.h:48
UT_Map< int, UT_IntArray > myMaterialGroups
GR_BasePrimType
Definition: GR_Defines.h:368
RE_VertexArrayRef myCenterPrimP
const char * className() const override
Return a string version of this class's name.
Definition: GR_PrimPacked.h:37
virtual UT_Matrix4D getTransform(int) const
RE_VertexArrayRef myCenterPrimInstMat
virtual bool needsGLStateCheck(const GR_DisplayOption &opts) const
Definition: GR_Primitive.h:160
virtual bool renderInAlphaPass(GR_AlphaPass a)
Return true if this primitive renders in the specified alpha pass.
virtual void retirePrimitive()
Called when a node is no longer actively displayed, but still cached.
UT_StringMap< int > myShadowMaskMap
GT_API const UT_StringHolder primitive_id
bool updateOnViewChange(const GR_DisplayOption &) const override
If this primitive requires an update when the view changes, return true.
bool checkGLState(RE_RenderContext r, const GR_DisplayOption &opt) override
GR_BasePrimType getBasePrimType() const override
The base primitive type is usually NORMAL unless this is a packed type.
Definition: GR_PrimPacked.h:39
RE_Geometry * myCenterPrims
virtual RE_Geometry * getDecorationGeometry()
Definition: GR_Primitive.h:326
bool myPrimSwappedFlag
UT_StringArray myLightLinks
#define GR_API
Definition: GR_API.h:10
GR_UpdateReason
Definition: GR_Defines.h:314
long long int64
Definition: SYS_Types.h:116
virtual bool getBoundingBox(UT_BoundingBoxD &bbox) const
Returns the bounding box of this primitive if it can be determined.
Definition: GR_Primitive.h:240
GA_Index myOverridePrimID
virtual void cleanup(RE_RenderContext r)
Definition: GR_Primitive.h:197
UT_Matrix4D myInstancePrimTransform
virtual void renderDecoration(RE_RenderContext r, GR_Decoration decor, const GR_DecorationParms &parms)
virtual bool setup(const GR_DisplayOption *)
Definition: GR_Primitive.h:195
UT_StringMap< int > myLightLinkMap
virtual bool isRasterizedInView(const UT_Matrix4F &objviewproj, const UT_Vector2F &min_proj_size, const UT_BoundingBoxF *bbox=nullptr)
UT_Matrix4D myBBoxTransform
GR_PrimAcceptResult
Definition: GR_Defines.h:361
GR_RenderFlags
Definition: GR_Defines.h:88
RE_VertexArrayRef myCenterPointInstMat
GA_Size GA_Index
Define the strictness of GA_Offset/GA_Index.
Definition: GA_Types.h:640
UT_SharedPtr< GU_Selection > GU_SelectionHandle
UT_BoundingBoxD myCachedBBox
GA_Index myOverridePointID
GLdouble t
Definition: glad.h:2397
GT_PrimitiveType myInstancedPrimType
GU_ConstDetailHandle myInstancedDetail
GLenum mode
Definition: glcorearb.h:99
GT_PrimitiveType
GR_DispOptChange displayOptionChange(const GR_DisplayOption &opts, bool first_init) override
virtual GR_PrimAcceptResult acceptPrimitive(GT_PrimitiveType t, int geo_type, const GT_PrimitiveHandle &ph, const GEO_Primitive *prim)=0
GA_API const UT_StringHolder parms
GT_DataArrayHandle myLODMask
bool myCachedBBoxValid
virtual int getNumInstances() const
UT_IntArray myPointInstances
virtual bool isFragment() const
virtual bool checkGLState(RE_RenderContext r, const GR_DisplayOption &opts)
Definition: GR_Primitive.h:162
virtual void update(RE_RenderContext r, const GT_PrimitiveHandle &primh, const GR_UpdateParms &p)=0
const GT_PrimitiveHandle & instancePrim() const
Definition: GR_PrimPacked.h:44
GR_SelectMode mySelectMode
UT_UniquePtr< GR_GeoRender > myCenterPointsGeo
RE_Geometry * getDecorationGeometry() override
Simple class for a mutli-integer cache tag.
bool getBoundingBox(UT_BoundingBoxD &bbox) const override
Returns the bounding box of this primitive if it can be determined.
int64 myPackedPVersion
GLboolean r
Definition: glcorearb.h:1222
exint getGAVertex(const GU_Detail *gdp, exint vertex_id) const override
virtual bool supportsParallelUpdate() const
Definition: GR_Primitive.h:275
GT_PrimitiveHandle myInstancedPrim
const GT_PrimitiveHandle & packedPrim() const
Definition: GR_PrimPacked.h:45
GT_DataArrayHandle myPickIDs
const char * className() const override
Return a string version of this class's name.
bool renderInAlphaPass(GR_AlphaPass a) override
Return true if this primitive renders in the specified alpha pass.
GT_API const UT_StringHolder vertex_id
virtual GR_DispOptChange displayOptionChange(const GR_DisplayOption &opts, bool first_init)
int64 myPrimUniqueID
GR_MaterialGroups myMatGroups
int64 myAlembicVersion
bool inViewFrustum(const UT_Matrix4D &objviewproj, const UT_BoundingBoxD *bbox=nullptr) override
void setPrimIndex(int pindex)
Definition: GR_PrimPacked.h:50
RE_Geometry * myCenterPoints
GR_SelectMode
Definition: GR_Defines.h:243
virtual exint getGAVertex(const GU_Detail *gdp, exint vertex_id) const
GR_BasePrimType getBasePrimType() const override
The base primitive type is usually NORMAL unless this is a packed type.
GR_PickStyle
Definition: GR_Defines.h:254