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 protected:
137  virtual int getNumInstances() const { return 1; }
138  virtual UT_Matrix4D getTransform(int ) const
139  { return myInstancePrimTransform; }
140  virtual bool isFragment() const { return false; }
141  virtual bool getSingleTransform(UT_Matrix4D &mat) const
142  { mat = myInstancePrimTransform; return true; }
143 
144  bool updateCacheName(const GT_PrimitiveHandle &iph,
145  const GR_UpdateParms &p,
146  bool fallback);
147  void updateInstanceGeometry(RE_RenderContext r,
148  const GT_PrimitiveHandle &container_prim,
149  const GR_UpdateParms &p,
150  bool build_anchors,
151  GR_UpdateReason full_update);
152 
153  bool fetchBoundingBox(UT_BoundingBoxD &bbox) const;
154  virtual void buildAnchorsGL3(RE_RenderContext r,
155  const GR_UpdateParms &p,
156  GR_UpdateReason full_reason,
157  const GT_PrimitiveHandle &xforms);
158  void buildPickID(const GT_PrimitiveHandle &pid);
159  RE_Geometry *buildPickBBox(RE_RenderContext r) const;
160  void buildInstPrimTransform();
161 
162  // Given the packed geometry handle and the update reason for the packed
163  // primitive, determine the update reason for the packed geometry.
164  GR_UpdateReason checkForPackedGeoChanges(const GT_PrimitiveHandle &ph,
165  GR_UpdateReason reason);
166  GR_UpdateParms checkForPackedMaterialAssignment(const GR_UpdateParms &p);
167 
168  void updateLightLinking();
169  void updateLinkMap(const UT_StringRef &attrib_name,
170  UT_StringMap<int> &link_map,
171  UT_StringArray &list,
172  bool &has_link);
173  bool setLightLinkMask(GR_DrawParms &dp,
174  int &prev_mask) const;
175  void restoreLightLinkMask(GR_DrawParms &dp,
176  int prev_mask) const;
177 
178 
179  // Packed primitive
185 
186  // Instanced (contained) primitive
198 #ifdef USE_VULKAN
199  GR_InstanceBufferPtr myColorBuf;
200 #endif
201 
209 
216 
222 #ifdef USE_VULKAN
223  GR_InstanceBufferPtr mySelectionBuf;
224 #endif
228 
231 
237 
239  mutable bool myCachedBBoxValid;
240 
241  // light linking in lops
248 
249  // For GR_PrimPacked only
251 
254 
256  // --------
257 };
258 
260 {
261 public:
263  const char *cache_name,
264  const GT_PrimitiveHandle &packed_prim,
265  const GT_PrimitiveHandle &instanced_prim,
266  const GU_ConstDetailHandle &instanced_gdp)
267  : GR_PrimPacked(info, cache_name,packed_prim,instanced_prim,instanced_gdp)
268  {}
269 
270 
271  const char *className() const override { return "GR_PrimPackedMesh"; }
272 
274  { return GR_BASE_PRIM_PACKED_MESH; }
275 };
276 
277 
280  bool first_init)
281 {
282  if(myInstance)
283  return myInstance->checkDisplayOptionChange(opts);
284  return DISPLAY_UNCHANGED;
285 }
286 
287 inline bool
289 {
290  if(myInstance)
291  return myInstance->updateOnViewChange(opt);
292  return false;
293 }
294 
295 inline void
297 {
298  if(myInstance)
299  myInstance->viewUpdate(r, parms);
300 }
301 
302 inline bool
304 {
305  if(myInstance)
306  return myInstance->needsGLStateCheck(opts);
307  return false;
308 }
309 
310 inline bool
312 {
313  if(myInstance)
314  return myInstance->checkGLState(r,opts);
315  return false;
316 }
317 
318 inline bool
320 {
321  if(myInstance)
322  return myInstance->setup(d);
323  return false;
324 }
325 
326 inline void
328 {
329  if(myInstance)
330  myInstance->cleanup(r);
331 }
332 
333 
334 inline bool
336 {
337  if(myInstance)
338  return myInstance->requiresAlphaPass();
339  return false;
340 }
341 
342 inline const GA_Primitive *
344  exint primitive_id) const
345 {
346  if(myInstance)
347  return myInstance->getGAPrimitive(gdp, primitive_id);
348  return NULL;
349 }
350 
351 inline exint
353  exint vertex_id) const
354 {
355  if(myInstance)
356  return myInstance->getGAVertex(gdp, vertex_id);
357  return exint(-1);
358 }
359 
360 inline RE_Geometry *
362 {
363  return NULL;
364 }
365 
366 inline bool
368 {
369  if(myInstance)
370  return myInstance->renderInAlphaPass(a);
371  return true;
372 }
373 
374 inline bool
376  const UT_BoundingBoxD *bbox)
377 {
378  if(myInstance)
379  return myInstance->inViewFrustum(objviewproj, bbox);
380  // if no instance, no point in rendering nothing, so cull
381  return false;
382 }
383 
384 inline bool
386  const UT_Vector2F &min_proj_size,
387  const UT_BoundingBoxF *bbox)
388 {
389  if(myInstance)
390  return myInstance->isRasterizedInView(objviewproj, min_proj_size,bbox);
391  // if no instance, no point in rendering nothing, so cull
392  return false;
393 }
394 
395 inline bool
397 {
398  return myInstance ? myInstance->getBoundingBox(bbox) : false;
399 }
400 
401 inline exint
403 {
404  return myInstance ? myInstance->getNumGLPrimitives(opt) : 0;
405 }
406 
407 #endif
408 
GT_API const UT_StringHolder selection
virtual bool inViewFrustum(const UT_Matrix4D &objviewproj, const UT_BoundingBoxD *bbox=nullptr)
Definition: GR_Primitive.h:204
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:223
Unsorted map container.
Definition: UT_Map.h:107
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
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:53
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
GR_Decoration
Definition: GR_Defines.h:151
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:117
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 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:47
UT_Map< int, UT_IntArray > myMaterialGroups
GR_BasePrimType
Definition: GR_Defines.h:352
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:311
bool myPrimSwappedFlag
UT_StringArray myLightLinks
#define GR_API
Definition: GR_API.h:10
GR_UpdateReason
Definition: GR_Defines.h:300
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:233
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:345
GR_RenderFlags
Definition: GR_Defines.h:85
RE_VertexArrayRef myCenterPointInstMat
GA_Size GA_Index
Define the strictness of GA_Offset/GA_Index.
Definition: GA_Types.h:635
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
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
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:229
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:240