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 
18 class GR_InstanceBuffer;
21 
23 {
24 public:
25  GR_PrimPacked(const GR_RenderInfo *info,
26  const char *cache_name,
27  const GT_PrimitiveHandle &packed_prim,
28  const GT_PrimitiveHandle &instanced_prim,
29  const GU_ConstDetailHandle &instanced_gdp,
30  int prim_index = -1);
31 
32  ~GR_PrimPacked() override;
33 
34  const char *className() const override { return "GR_PrimPacked"; }
35 
37  { return GR_BASE_PRIM_PACKED; }
39  { return myInstancedPrim; }
40 
41  const GT_PrimitiveHandle &instancePrim() const { return myInstancedPrim; }
42  const GT_PrimitiveHandle &packedPrim() const { return myPackedPrim; }
43 
44  void setPackedPrim(const GT_PrimitiveHandle &packed_prim);
45  void setInstancedPrim(const GT_PrimitiveHandle &instance,
46  const GU_ConstDetailHandle &inst_gdp);
47  void setPrimIndex(int pindex)
48  { myPrimIndex = pindex; }
49 
51  int geo_type,
52  const GT_PrimitiveHandle &ph,
53  const GEO_Primitive *prim) override;
54 
56  const GT_PrimitiveHandle &primh,
57  const GR_UpdateParms &p) override;
58 
62  const GR_DrawParms &dp,
63  const UT_Matrix4D &proj_view,
64  const UT_Matrix4D &object,
65  const UT_Vector2F &min_proj_size,
66  bool &visible,
67  bool &defer) override;
68 
70  GR_RenderMode render_mode,
72  GR_DrawParms dp) override;
73 
75  GR_Decoration decor,
76  const GR_DecorationParms &parms) override;
78  const GR_DisplayOption *opt,
79  unsigned int pick_type,
80  GR_PickStyle pick_style,
81  bool has_pick_map) override;
82 
83  bool checkForTransformChange();
84 
85  // Delegate these to the child prim.
86  GR_DispOptChange displayOptionChange(
87  const GR_DisplayOption &opts,
88  bool first_init) override;
89  bool updateOnViewChange(
90  const GR_DisplayOption &) const override;
91  void viewUpdate(
93  const GR_ViewUpdateParms &parms) override;
94  bool needsGLStateCheck(
95  const GR_DisplayOption &opts) const override;
96  bool checkGLState(
98  const GR_DisplayOption &opt) override;
99  bool setup(const GR_DisplayOption *) override;
100  void cleanup(RE_RenderContext r) override;
101 
102  bool requiresAlphaPass() const override;
103  const GA_Primitive *getGAPrimitive(const GU_Detail *gdp,
104  exint primitive_id) const override;
105  exint getGAVertex(const GU_Detail *gdp,
106  exint vertex_id) const override;
107  bool renderInAlphaPass(GR_AlphaPass a) override;
108  bool inViewFrustum(
109  const UT_Matrix4D &objviewproj,
110  const UT_BoundingBoxD *bbox = nullptr) override;
111  bool isRasterizedInView(
112  const UT_Matrix4F &objviewproj,
113  const UT_Vector2F &min_proj_size,
114  const UT_BoundingBoxF *bbox) override;
115  bool getBoundingBox(UT_BoundingBoxD &bbox) const override;
116 
117  exint getNumGLPrimitives(const GR_DisplayOption *) override;
118  void retirePrimitive() override;
119 
120  GR_SelectMode getSelectionMode(const GU_Detail &gdp,
122 
123  void setPickID(GA_Index prim_id, GA_Index point_id);
124 
125  void setInstanceHookPrim(GR_Primitive *prim);
126 
127  bool isPrimVisible() const override
128  { return myPrimVisible; }
129  void setPrimVisible(bool v)
130  { myPrimVisible = v; }
131 
132 
133  bool supportsParallelDraw() const override;
134 
135  bool supportsParallelUpdate() const override;
136 
137  void getGeoRenders(
138  UT_Array<GR_GeoRender *> &renders) override;
139 
140 protected:
141  virtual int getNumInstances() const { return 1; }
142  virtual UT_Matrix4D getTransform(int ) const
143  { return myInstancePrimTransform; }
144  virtual bool isFragment() const { return false; }
145  virtual bool getSingleTransform(UT_Matrix4D &mat) const
146  { mat = myInstancePrimTransform; return true; }
147 
148  bool updateCacheName(const GT_PrimitiveHandle &iph,
149  const GR_UpdateParms &p,
150  bool fallback);
151  void updateInstanceGeometry(RE_RenderContext r,
152  const GT_PrimitiveHandle &container_prim,
153  const GR_UpdateParms &p,
154  bool build_anchors,
155  GR_UpdateReason full_update);
156 
157  bool fetchBoundingBox(UT_BoundingBoxD &bbox) const;
158  virtual void buildAnchors(RE_RenderContext r,
159  const GR_UpdateParms &p,
160  GR_UpdateReason full_reason,
161  const GT_PrimitiveHandle &xforms);
162  void buildPickID(const GT_PrimitiveHandle &pid);
163  RV_Geometry *buildPickBBox(RE_RenderContext r);
164  void buildInstPrimTransform();
165 
166  // Given the packed geometry handle and the update reason for the packed
167  // primitive, determine the update reason for the packed geometry.
168  GR_UpdateReason checkForPackedGeoChanges(const GT_PrimitiveHandle &ph,
169  GR_UpdateReason reason);
170  GR_UpdateParms checkForPackedMaterialAssignment(const GR_UpdateParms &p);
171 
172  void updateLightLinking();
173  void updateLinkMap(const UT_StringRef &attrib_name,
174  UT_StringMap<int> &link_map,
175  UT_StringArray &list,
176  bool &has_link);
177  bool setLightLinkMask(RE_RenderContext rc,
178  GR_DrawParms &dp,
179  int &prev_mask) const;
180  void restoreLightLinkMask(RE_RenderContext rc,
181  GR_DrawParms &dp,
182  int prev_mask) const;
183  void buildInstancedColor(RE_RenderContext r,
184  const GR_UpdateParms &p);
185 
186 
187  // Packed primitive
192 
193  // Instanced (contained) primitive
205 
213 
220 
225 
227 
230 
236 
238  mutable bool myCachedBBoxValid;
239 
240  // light linking in lops
247 
248  // For GR_PrimPacked only
250 
253 
255  // --------
256 };
257 
259 {
260 public:
262  const char *cache_name,
263  const GT_PrimitiveHandle &packed_prim,
264  const GT_PrimitiveHandle &instanced_prim,
265  const GU_ConstDetailHandle &instanced_gdp)
266  : GR_PrimPacked(info, cache_name,packed_prim,instanced_prim,instanced_gdp)
267  {}
268 
269 
270  const char *className() const override { return "GR_PrimPackedMesh"; }
271 
273  { return GR_BASE_PRIM_PACKED_MESH; }
274 };
275 
276 
279  bool first_init)
280 {
281  if(myInstance)
282  return myInstance->checkDisplayOptionChange(opts);
283  return DISPLAY_UNCHANGED;
284 }
285 
286 inline bool
288 {
289  if(myInstance)
290  return myInstance->updateOnViewChange(opt);
291  return false;
292 }
293 
294 inline void
296 {
297  if(myInstance)
298  myInstance->viewUpdate(r, parms);
299 }
300 
301 inline bool
303 {
304  if(myInstance)
305  return myInstance->needsGLStateCheck(opts);
306  return false;
307 }
308 
309 inline bool
311 {
312  if(myInstance)
313  return myInstance->checkGLState(r,opts);
314  return false;
315 }
316 
317 inline bool
319 {
320  if(myInstance)
321  return myInstance->setup(d);
322  return false;
323 }
324 
325 inline void
327 {
328  if(myInstance)
329  myInstance->cleanup(r);
330 }
331 
332 
333 inline bool
335 {
336  if(myInstance)
337  return myInstance->requiresAlphaPass();
338  return false;
339 }
340 
341 inline const GA_Primitive *
343  exint primitive_id) const
344 {
345  if(myInstance)
346  return myInstance->getGAPrimitive(gdp, primitive_id);
347  return NULL;
348 }
349 
350 inline exint
352  exint vertex_id) const
353 {
354  if(myInstance)
355  return myInstance->getGAVertex(gdp, vertex_id);
356  return exint(-1);
357 }
358 
359 inline bool
361 {
362  if(myInstance)
363  return myInstance->renderInAlphaPass(a);
364  return true;
365 }
366 
367 inline bool
369  const UT_BoundingBoxD *bbox)
370 {
371  if(myInstance)
372  return myInstance->inViewFrustum(objviewproj, bbox);
373  // if no instance, no point in rendering nothing, so cull
374  return false;
375 }
376 
377 inline bool
379  const UT_Vector2F &min_proj_size,
380  const UT_BoundingBoxF *bbox)
381 {
382  if(myInstance)
383  return myInstance->isRasterizedInView(objviewproj, min_proj_size,bbox);
384  // if no instance, no point in rendering nothing, so cull
385  return false;
386 }
387 
388 inline bool
390 {
391  return myInstance ? myInstance->getBoundingBox(bbox) : false;
392 }
393 
394 inline exint
396 {
397  return myInstance ? myInstance->getNumGLPrimitives(opt) : 0;
398 }
399 
400 #endif
401 
GT_API const UT_StringHolder selection
virtual bool inViewFrustum(const UT_Matrix4D &objviewproj, const UT_BoundingBoxD *bbox=nullptr)
Definition: GR_Primitive.h:198
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:123
GR_InstanceBufferPtr myColorBuf
virtual exint getNumGLPrimitives(const GR_DisplayOption *)
virtual bool requiresAlphaPass() const
Return true if this primitive requires an alpha pass.
Definition: GR_Primitive.h:217
Unsorted map container.
Definition: UT_Map.h:114
UT_UniquePtr< GR_InstanceBuffer > GR_InstanceBufferPtr
Definition: GR_PrimPacked.h:19
UT_IntArray myBBoxInstances
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().
GR_PrimitivePtr myInstance
const GLdouble * v
Definition: glcorearb.h:837
GT_DataArrayHandle myPointIDs
bool myPrimTypeChanged
virtual bool supportsParallelDraw() const
Definition: GR_Primitive.h:283
GA_Index myPrimID
bool myIsConsolidatedMesh
GR_InstanceBufferPtr mySelectionBuf
void viewUpdate(RE_RenderContext r, const GR_ViewUpdateParms &parms) override
bool myQueuedDrawValid
GT_PrimitiveHandle myPackedPrim
int64 exint
Definition: SYS_Types.h:125
UT_Vector3F myInstancePoint
GT_API const UT_StringHolder cache_name
exint getNumGLPrimitives(const GR_DisplayOption *) override
Object that represents drawable geometry. This object holds vertex, instancing and index buffers for ...
Definition: RV_Geometry.h:165
GR_SelectMode myPointSelectMode
GLboolean GLboolean GLboolean GLboolean a
Definition: glcorearb.h:1222
UT_UniquePtr< GR_GeoRender > myCenterPrimsGeo
GR_Decoration
Definition: GR_Defines.h:167
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:125
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.
UT_UniquePtr< RV_Geometry > myBoxGeo
bool setup(const GR_DisplayOption *) override
virtual void getGeoRenders(UT_Array< GR_GeoRender * > &renders)
Definition: GR_Primitive.h:357
virtual void viewUpdate(RE_RenderContext r, const GR_ViewUpdateParms &parms)
Definition: GR_Primitive.h:133
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:38
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:371
const char * className() const override
Return a string version of this class's name.
Definition: GR_PrimPacked.h:34
virtual UT_Matrix4D getTransform(int) const
virtual bool needsGLStateCheck(const GR_DisplayOption &opts) const
Definition: GR_Primitive.h:149
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:36
bool myPrimSwappedFlag
UT_StringArray myLightLinks
#define GR_API
Definition: GR_API.h:10
GR_UpdateReason
Definition: GR_Defines.h:317
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:234
GA_Index myOverridePrimID
virtual void cleanup(RE_RenderContext r)
Definition: GR_Primitive.h:186
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:184
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:364
GR_RenderFlags
Definition: GR_Defines.h:88
GA_Size GA_Index
Define the strictness of GA_Offset/GA_Index.
Definition: GA_Types.h:647
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:151
virtual void update(RE_RenderContext r, const GT_PrimitiveHandle &primh, const GR_UpdateParms &p)=0
const GT_PrimitiveHandle & instancePrim() const
Definition: GR_PrimPacked.h:41
GR_SelectMode mySelectMode
UT_UniquePtr< GR_GeoRender > myCenterPointsGeo
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:287
GT_PrimitiveHandle myInstancedPrim
const GT_PrimitiveHandle & packedPrim() const
Definition: GR_PrimPacked.h:42
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:47
GR_SelectMode
Definition: GR_Defines.h:246
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:257