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 <RE/RE_VertexArray.h>
17 
18 #ifdef USE_VULKAN
19 class GR_InstanceBuffer;
20 typedef UT_UniquePtr<GR_InstanceBuffer> GR_InstanceBufferPtr;
21 #endif
22 
24 {
25 public:
26  GR_PrimPacked(const GR_RenderInfo *info,
27  const char *cache_name,
28  const GT_PrimitiveHandle &packed_prim,
29  const GT_PrimitiveHandle &instanced_prim,
30  const GU_ConstDetailHandle &instanced_gdp,
31  int prim_index = -1);
32 
33  ~GR_PrimPacked() override;
34 
35  const char *className() const override { return "GR_PrimPacked"; }
36 
38  { return GR_BASE_PRIM_PACKED; }
40  { return myInstancedPrim; }
41 
42  const GT_PrimitiveHandle &instancePrim() const { return myInstancedPrim; }
43  const GT_PrimitiveHandle &packedPrim() const { return myPackedPrim; }
44 
45  void setPackedPrim(const GT_PrimitiveHandle &packed_prim);
46  void setInstancedPrim(const GT_PrimitiveHandle &instance,
47  const GU_ConstDetailHandle &inst_gdp);
48  void setPrimIndex(int pindex)
49  { myPrimIndex = pindex; }
50 
52  int geo_type,
53  const GT_PrimitiveHandle &ph,
54  const GEO_Primitive *prim) override;
55 
57  const GT_PrimitiveHandle &primh,
58  const GR_UpdateParms &p) override;
59 
63  const GR_DrawParms &dp,
64  const UT_Matrix4D &proj_view,
65  const UT_Matrix4D &object,
66  const UT_Vector2F &min_proj_size,
67  bool &visible,
68  bool &defer) override;
69 
71  GR_RenderMode render_mode,
73  GR_DrawParms dp) override;
74 
76  GR_Decoration decor,
77  const GR_DecorationParms &parms) override;
79  const GR_DisplayOption *opt,
80  unsigned int pick_type,
81  GR_PickStyle pick_style,
82  bool has_pick_map) override;
83 
84  bool checkForTransformChange();
85 
86  // Delegate these to the child prim.
87  GR_DispOptChange displayOptionChange(
88  const GR_DisplayOption &opts,
89  bool first_init) override;
90  bool updateOnViewChange(
91  const GR_DisplayOption &) const override;
92  void viewUpdate(
94  const GR_ViewUpdateParms &parms) override;
95  bool needsGLStateCheck(
96  const GR_DisplayOption &opts) const override;
97  bool checkGLState(
99  const GR_DisplayOption &opt) override;
100  bool setup(const GR_DisplayOption *) override;
101  void cleanup(RE_RenderContext r) override;
102 
103  bool requiresAlphaPass() const override;
104  const GA_Primitive *getGAPrimitive(const GU_Detail *gdp,
105  exint primitive_id) const override;
106  exint getGAVertex(const GU_Detail *gdp,
107  exint vertex_id) const override;
109  bool renderInAlphaPass(GR_AlphaPass a) override;
110  bool inViewFrustum(
111  const UT_Matrix4D &objviewproj,
112  const UT_BoundingBoxD *bbox = nullptr) override;
113  bool isRasterizedInView(
114  const UT_Matrix4F &objviewproj,
115  const UT_Vector2F &min_proj_size,
116  const UT_BoundingBoxF *bbox) override;
117  bool getBoundingBox(UT_BoundingBoxD &bbox) const override;
118 
119  exint getNumGLPrimitives(const GR_DisplayOption *) override;
120  void retirePrimitive() override;
121 
122  GR_SelectMode getSelectionMode(const GU_Detail &gdp,
124 
125  void setPickID(GA_Index prim_id, GA_Index point_id);
126 
127  void setInstanceHookPrim(GR_Primitive *prim);
128 
129  bool isPrimVisible() const override
130  { return myPrimVisible; }
131  void setPrimVisible(bool v)
132  { myPrimVisible = v; }
133 
134 protected:
135  virtual int getNumInstances() const { return 1; }
136  virtual UT_Matrix4D getTransform(int ) const
137  { return myInstancePrimTransform; }
138  virtual bool isFragment() const { return false; }
139  virtual bool getSingleTransform(UT_Matrix4D &mat) const
140  { mat = myInstancePrimTransform; return true; }
141 
142  bool updateCacheName(const GT_PrimitiveHandle &iph,
143  const GR_UpdateParms &p,
144  bool fallback);
145  void updateInstanceGeometry(RE_RenderContext r,
146  const GT_PrimitiveHandle &container_prim,
147  const GR_UpdateParms &p,
148  bool build_anchors,
149  GR_UpdateReason full_update);
150 
151  bool fetchBoundingBox(UT_BoundingBoxD &bbox) const;
152  virtual void buildAnchorsGL3(RE_RenderContext r,
153  const GR_UpdateParms &p,
154  GR_UpdateReason full_reason,
155  const GT_PrimitiveHandle &xforms);
156  void buildPickID(const GT_PrimitiveHandle &pid);
157  RE_Geometry *buildPickBBox(RE_RenderContext r) const;
158  void buildInstPrimTransform();
159 
160  // Given the packed geometry handle and the update reason for the packed
161  // primitive, determine the update reason for the packed geometry.
162  GR_UpdateReason checkForPackedGeoChanges(const GT_PrimitiveHandle &ph,
163  GR_UpdateReason reason);
164  GR_UpdateParms checkForPackedMaterialAssignment(const GR_UpdateParms &p);
165 
166  void updateLightLinking();
167  void updateLinkMap(const UT_StringRef &attrib_name,
168  UT_StringMap<int> &link_map,
169  UT_StringArray &list,
170  bool &has_link);
171  bool setLightLinkMask(GR_DrawParms &dp,
172  int &prev_mask) const;
173  void restoreLightLinkMask(GR_DrawParms &dp,
174  int prev_mask) const;
175 
176 
177  // Packed primitive
182 
183  // Instanced (contained) primitive
195 #ifdef USE_VULKAN
196  GR_InstanceBufferPtr myColorBuf;
197 #endif
198 
206 
213 
219 #ifdef USE_VULKAN
220  GR_InstanceBufferPtr mySelectionBuf;
221 #endif
225 
228 
234 
236  mutable bool myCachedBBoxValid;
237 
238  // light linking in lops
245 
246  // For GR_PrimPacked only
248 
251 
253  // --------
254 };
255 
257 {
258 public:
260  const char *cache_name,
261  const GT_PrimitiveHandle &packed_prim,
262  const GT_PrimitiveHandle &instanced_prim,
263  const GU_ConstDetailHandle &instanced_gdp)
264  : GR_PrimPacked(info, cache_name,packed_prim,instanced_prim,instanced_gdp)
265  {}
266 
267 
268  const char *className() const override { return "GR_PrimPackedMesh"; }
269 
271  { return GR_BASE_PRIM_PACKED_MESH; }
272 };
273 
274 
277  bool first_init)
278 {
279  if(myInstance)
280  return myInstance->checkDisplayOptionChange(opts);
281  return DISPLAY_UNCHANGED;
282 }
283 
284 inline bool
286 {
287  if(myInstance)
288  return myInstance->updateOnViewChange(opt);
289  return false;
290 }
291 
292 inline void
294 {
295  if(myInstance)
296  myInstance->viewUpdate(r, parms);
297 }
298 
299 inline bool
301 {
302  if(myInstance)
303  return myInstance->needsGLStateCheck(opts);
304  return false;
305 }
306 
307 inline bool
309 {
310  if(myInstance)
311  return myInstance->checkGLState(r,opts);
312  return false;
313 }
314 
315 inline bool
317 {
318  if(myInstance)
319  return myInstance->setup(d);
320  return false;
321 }
322 
323 inline void
325 {
326  if(myInstance)
327  myInstance->cleanup(r);
328 }
329 
330 
331 inline bool
333 {
334  if(myInstance)
335  return myInstance->requiresAlphaPass();
336  return false;
337 }
338 
339 inline const GA_Primitive *
341  exint primitive_id) const
342 {
343  if(myInstance)
344  return myInstance->getGAPrimitive(gdp, primitive_id);
345  return NULL;
346 }
347 
348 inline exint
350  exint vertex_id) const
351 {
352  if(myInstance)
353  return myInstance->getGAVertex(gdp, vertex_id);
354  return exint(-1);
355 }
356 
357 inline RE_Geometry *
359 {
360  return NULL;
361 }
362 
363 inline bool
365 {
366  if(myInstance)
367  return myInstance->renderInAlphaPass(a);
368  return true;
369 }
370 
371 inline bool
373  const UT_BoundingBoxD *bbox)
374 {
375  if(myInstance)
376  return myInstance->inViewFrustum(objviewproj, bbox);
377  // if no instance, no point in rendering nothing, so cull
378  return false;
379 }
380 
381 inline bool
383  const UT_Vector2F &min_proj_size,
384  const UT_BoundingBoxF *bbox)
385 {
386  if(myInstance)
387  return myInstance->isRasterizedInView(objviewproj, min_proj_size,bbox);
388  // if no instance, no point in rendering nothing, so cull
389  return false;
390 }
391 
392 inline bool
394 {
395  return myInstance ? myInstance->getBoundingBox(bbox) : false;
396 }
397 
398 inline exint
400 {
401  return myInstance ? myInstance->getNumGLPrimitives(opt) : 0;
402 }
403 
404 #endif
405 
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:39
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:35
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:37
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:42
GR_SelectMode mySelectMode
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:43
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:48
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