HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GR_Uniforms.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_Uniforms.h ( GR Library, C++)
7  *
8  * COMMENTS:
9  * Uniform parameters for rendering GR_GeoRenders
10  */
11 #ifndef GR_Uniforms_h
12 #define GR_Uniforms_h
13 
14 #include "GR_API.h"
15 
16 #include "GR_Defines.h"
17 #include "GR_DisplayOption.h"
18 #include "GR_TextureRef.h"
19 
20 #include <GU/GU_SelectType.h>
21 #include <GT/GT_RefineParms.h>
22 #include <GU/GU_DetailHandle.h>
23 
24 #include <RE/RE_Render.h>
25 #include <RE/RE_RenderContext.h>
26 #include <RE/RE_Material.h>
27 #include <RE/RE_CachedObject.h>
28 #include <RE/RE_OGLFramebuffer.h>
29 
30 #include <UT/UT_Matrix4.h>
31 #include <UT/UT_StringHolder.h>
32 #include <UT/UT_Map.h>
33 
34 class GR_MaterialGroups;
35 
36 class OP_Node;
37 
38 class RE_Render;
39 
40 class RV_Instance;
41 class RV_Render;
42 class RV_ShaderBlock;
43 class RV_ShaderProgram;
46 class RV_VKBuffer;
47 class RV_VKImage;
48 
49 // helper macro: check value before setting var, which also sets dirty flag
50 #define SET_GLOBAL(name, v) \
51  if (((const GR_Uniforms*)this)->globals().name != v) \
52  { globals().name = (v); } \
53 // end SET_GLOBAL
54 
55 /// set of parameters sent to GR_Primitive::update()
57 {
58 public:
60  GR_Uniforms();
61  ~GR_Uniforms();
62 
63  void copyUniforms(const GR_Uniforms* other)
64  {
65  UT_ASSERT(other);
66  objects() = other->objects();
67  globals() = other->globals();
68  }
69  exint pushObjectUniforms();
70  void popObjectUniforms(exint l=-1);
71 
72  // ~~~~~~~~~~~~~~~~
73  // RE Helpers
74 
75  // Init by copying values from RE_
76  // TODO: assign to rational defaults, or taken from DisplaySettings
77  // like in DM_VPortAgent::setupViewUniforms
78  void init(RE_RenderContext rc);
79 
80  // Helpers for pushing our CPU options int RE_
81  void pushToRE(RE_Render* r);
82  void popFromRE(RE_Render* r);
83  void assignRE(RE_Render* r);
84 
85  // ~~~~~~~~~~~~~~~~~
86  // RV Helpers
87  void assignRVBlock(
88  RV_Render *r,
89  RV_ShaderBlock *block,
90  const RV_ShaderProgram *opt_shr) const;
91 
92  void assignRVBindings(
93  RV_Render* r,
95  const RV_ShaderProgram* opt_shr) const;
96 
97  void assignRVGlobalBlock(RV_Render *r, RV_ShaderBlock *block) const;
98  bool bindRVGlobalBlock(RV_Render *r, const RV_ShaderProgramBase *shader);
99 
100  // ~~~~~~~~~~~~~~~~~~~
101  // Object Vars
102 
103  // Values that are expected to change for each object rendered
104  // Can be pushed/popped
105 
106  // Object Matrix
107  void setObjModelMatrix(const UT_Matrix4D &v, const UT_Matrix4D *inv = nullptr)
108  {
109  objects().myModel = v;
110 
111  // setup dependent matrices
112  if (inv)
113  {
114  objects().myInvModel = *inv;
115  }
116  else
117  {
118  objects().myInvModel = objects().myModel;
119  objects().myInvModel.invert();
120  }
121 
122  // ensure it's const, so it doesn't trigger update
123  const GlobalUniforms& global_var = ((const GR_Uniforms*)this)->globals();
124 
125  objects().myModelView = objects().myModel * global_var.myView;
126 
127  objects().myModelF = objects().myModel;
128  objects().myInvModelF = objects().myInvModel;
129  objects().myModelViewF = objects().myModelView;
130  }
131  const UT_Matrix4D &getObjModelMatrix() const { return objects().myModel; }
132  const UT_Matrix4D &getObjInvModelMatrix() const { return objects().myModel; }
133  const UT_Matrix3D &getObjNormalMatrix() const { return globals().myNormalMat; }
134  const UT_Matrix4D &getObjModelViewMatrix() const { return objects().myModelView; }
135 
137  {
138  globals().myView = v;
139 
140  // setup dependent matrices
141  globals().myInvView = globals().myView;
142  globals().myInvView.invert();
143 
144  globals().myNormalMat = globals().myView;
145  globals().myNormalMat.invert();
146  globals().myNormalMat.transpose();
147 
148  globals().myViewF = globals().myView;
149  globals().myInvViewF = globals().myInvView;
150  globals().myNormalMatF = globals().myNormalMat;
151  globals().myNormalMatFr1 = globals().myNormalMat[0];
152  globals().myNormalMatFr2 = globals().myNormalMat[1];
153  globals().myNormalMatFr3 = globals().myNormalMat[2];
154 
155  objects().myModelView = globals().myView * objects().myModel;
156  objects().myModelViewF = objects().myModelView;
157  }
158  const UT_Matrix4D &getViewMatrix() const { return globals().myView; }
159  const UT_Matrix4D &getInvViewMatrix() const { return globals().myInvView; }
160  const UT_Matrix3D &getNormalMatrix() const { return globals().myNormalMat; }
161 
162  // correct controls whether to apply OpenGL to Vulkan correction, to
163  // account for different coordinate spaces
164  void setProjectMatrix(const UT_Matrix4D &v, bool correct = true, bool is_ortho = false)
165  {
166  globals().myProjection = v;
167 
168  // setup dependent matrices
169  globals().myInvProjection = globals().myProjection;
170  globals().myInvProjection.invert();
171 
172  // NOTE: NDC space in Vulkan has a z-range of [0, 1] instead of [-1, 1]
173  // and a downward-facing y-direction. appending transform after
174  // projection matrix to correct for these
175  if(correct)
176  {
177  UT_Matrix4F correction(1.0f, 0.0f, 0.0f, 0.0f,
178  0.0f, 1.0f, 0.0f, 0.0f,
179  0.0f, 0.0f, 0.5f, 0.0f,
180  0.0f, 0.0f, 0.5f, 1.0f);
181  globals().myProjectionF =
182  UT_Matrix4F(globals().myProjection) * correction;
183  }
184  else
185  globals().myProjectionF = UT_Matrix4F(globals().myProjection);
186  globals().myInvProjectionF = globals().myProjectionF;
187  globals().myInvProjectionF.invert();
188  globals().myIsOrtho = is_ortho;
189  }
190  void useVulkanProjection(bool use_vk) { myUseVulkanProjection=use_vk; }
191  bool getUseVulkanProjection() const { return myUseVulkanProjection; }
192  const UT_Matrix4D &getProjectionMatrix() const { return globals().myProjection; }
193  const UT_Matrix4D &getInvProjectionMatrix() const { return globals().myInvProjection; }
194  bool getIsOrtho() const { return globals().myIsOrtho; }
195 
196  void setDepthRange(const UT_Vector2F &r) { SET_GLOBAL(myDepthRange, r); }
197  void setDepthProject(const UT_Vector2F &p) { SET_GLOBAL(myDepthProject, p); }
198  const UT_Vector2F &getDepthProject() const { return globals().myDepthProject; }
199 
200  void setShadowmapIndex(const int32 index) { SET_GLOBAL(myShadowmapIndex, index); }
201  int32 getShadowmapIndex() const { return globals().myShadowmapIndex; }
202 
203  // These are technically Vector3s, but GLSL expects Vector3s to be 4-byte
204  // aligned, so we add one more float for the C++ alignment to match the
205  // GLSL alignment.
207  void setCSMRegionInvExts(const CSMRegionInvExts &e) { SET_GLOBAL(myCSMRegionInvExts, e); }
208  const CSMRegionInvExts &getCSMRegionInvExts() const { return globals().myCSMRegionInvExts; }
209 
211  void setCSMRegionOffsets(const CSMRegionInvExts &e) { SET_GLOBAL(myCSMRegionOffsets, e); }
212  const CSMRegionInvExts &getCSMRegionOffsets() const { return globals().myCSMRegionOffsets; }
213 
214  void setObjWireColor(const UT_Vector4 &v) { objects().myWireColor = v; }
215  const UT_Vector4 &getObjWireColor() const { return objects().myWireColor; }
216 
217  void setObjWireframeColor(const UT_Vector4 &v) { objects().myWireframeColor = v; }
218  const UT_Vector4 &getObjWireframeColor() const { return objects().myWireframeColor; }
219 
220  void setObjWireThickness(const float &v) { objects().myWireThickness = v; }
221  float getObjWireThickness() const { return objects().myWireThickness; }
222 
223  void setObjConstColor(const UT_Vector4 &v) { objects().myConstColor = v; }
224  const UT_Vector4 &getObjConstColor() const { return objects().myConstColor; }
225 
227  {
228  objects().myConstColorMap = v;
229  objects().myConstColorEnableVK = v.isVulkan();
230  objects().myConstColorEnableGL = v.isGL();
231  }
232 
234  {
235  objects().myEmitColor = c;
236  }
237  void setObjGhosting(const UT_Vector4 &v, float gfact=0.5)
238  {
239  objects().myGhostColor = v;
240  objects().myGhostFactor = gfact;
241  objects().myHasGhosting = true;
242  }
243  const UT_Vector4 &getObjGhostColor() const { return objects().myGhostColor; }
244  float getObjGhostFactor() const { return objects().myGhostFactor; }
245 
246  void setObjBackfaceTint(const UT_Vector3 &v, float gfact=0.5)
247  {
248  objects().myBackfaceColor = UT_Vector4(v, gfact);
249  objects().myHasBackfaceTint = true;
250  }
251  const UT_Vector4 &getObjBackfaceColor() const { return objects().myBackfaceColor; }
252  float getObjBackfaceFactor() const { return objects().myBackfaceColor[3]; }
253 
254  void setObjSelectColor(const UT_Vector4 &v) { objects().mySelectColor = v; }
255  const UT_Vector4 &getObjSelectColor() const { return objects().mySelectColor; }
256 
257  void setObjSelectSecondaryColor(const UT_Vector4 &v) { objects().mySelectSecondaryColor = v; }
258  const UT_Vector4 &getObjSelectSecondaryColor() const { return objects().mySelectSecondaryColor; }
259 
260  void setObjSelectMode(int v) { objects().mySelectMode = v; }
261  int getObjSelectMode() const { return objects().mySelectMode; }
262 
263  void setObjSelectType(int v) { objects().mySelectType = v; }
264  int getObjSelectType() const { return objects().mySelectType; }
265 
266  void setObjSelectInstance(int v) { objects().mySelectInstance = v; }
267  int getObjSelectInstance() const { return objects().mySelectInstance; }
268 
269  void setObjFillSelection(int v) { objects().myFillSelection = v; }
270  int getObjFillSelection() const { return objects().myFillSelection; }
271 
272  void setObjPrimConstandID(int v) { objects().myPrimConstantID = v; }
273  int getObjPrimConstandID() const { return objects().myPrimConstantID; }
274 
275  void setObjDecorationScale(float v) { objects().myDecorationScale = v; }
276  float getObjDecorationScale() const { return objects().myDecorationScale; }
277 
279  { objects().myPickBaseID = v; }
281  { return objects().myPickBaseID; }
282 
284  { objects().myPickComponentID = v; }
286  { return objects().myPickComponentID; }
287 
289  {
290  objects().myColorRamp = v;
291  objects().myColorRampEnableVK = v.isVulkan();
292  objects().myColorRampEnableGL = v.isGL();
293 
294  objects().myColorRange = range;
295  }
296 
297  void setObjColorIgnoreGeo(bool v)
298  {
299  objects().myColorIgnoreGeo = v;
300  }
301  bool getObjColorIgnoreGeo() const
302  {
303  return objects().myColorIgnoreGeo;
304  }
305 
306  // Use -1 flag to force use of geo color, ignoring
307  // any per-material geo color disable
309  {
310  objects().myColorIgnoreGeo = -1;
311  }
312 
314  {
315  objects().myColorTransformMode = mode;
316  objects().myColorTransformRef = ref;
317  }
318 
320  {
321  objects().myUseInstancePrimId = v;
322  }
323 
325  { objects().myMaxLocatedId = v; }
326 
328  { return objects().myMaxLocatedId; }
329 
331  { objects().myMinLocatedId = v; }
332 
334  { return objects().myMinLocatedId; }
335 
336 
338  {
339  objects().myLocatedBufVK = buf;
340  objects().myUseLocatedBufVK = buf ? 1 : 0;
341  }
342 
344  {
345  UT_ASSERT(!buf || buf->getTextureType() == RE_TEXTURE_BUFFER);
346  objects().myLocatedBufGL = buf;
347  objects().myUseLocatedBufGL = buf ? 1 : 0;
348  }
349 
351  { objects().myLightingEnabled = v; }
352 
354  { return objects().myLightingEnabled; }
355 
357  { objects().myTexturesEnabled = v; }
358 
360  { return objects().myTexturesEnabled; }
361 
362  // Values which may be changed per-object
364  {
365 
366  #define VK_BLOCK_START (offsetof(ObjectUniforms, myModelF))
367  // begin VK block
370 
372  UT_Vector4F myBackfaceColor = UT_Vector4F(0,0,0,0);
376  UT_Vector4F myEmitColor = UT_Vector4F(0,0,0,0);
377 
378  int mySelectMode = 0;
379  int mySelectType = 0;
380  int mySelectInstance = 0;
381  int myFillSelection = 0;
382 
383  int myPrimConstantID = 0;
384  int myPrimInstanceBase = 0;
385 
388 
390  int32 myColorRampEnableVK = 0;
391  int32 myColorIgnoreGeo = 0;
392 
394  int32 myColorTransformMode = 0;
395 
396  // NOTE: only used in locate highlight rendering
397  int32 myUseInstancePrimId = 0;
398  int32 myMaxLocatedId = 0;
399  int32 myMinLocatedId = 0;
400  int32 myUseLocatedBufVK = 0;
401 
402  // NOTE: only used in pick buffer rendering
404  int32 myPickDepthPass = 0;
406 
407  int32 myConstColorEnableVK = 0;
408  int32 myLightMask = 0xFFFFFFFF;
409  int32 myLightingEnabled = 1;
410  int32 myTexturesEnabled = 1;
411 
412  // end VK block
413  #define VK_BLOCK_END (offsetof(ObjectUniforms, myTexturesEnabled )\
414  + sizeof(ObjectUniforms::myTexturesEnabled))
415 
416  // Ghosting
419 
420  bool myHasPrimLightMask = false;
421 
422  // Backface Tinting
423  bool myHasBackfaceTint = false;
424 
425  // Selection
427 
428  // Wire color
430 
431  // color mapping
432  int32 myConstColorEnableGL = 0;
434 
435  // Color Transform
436  int32 myColorRampEnableGL = 0;
438 
440 
444 
446 
447  RV_VKBuffer* myLocatedBufVK = nullptr;
448  RE_Texture* myLocatedBufGL = nullptr;
449  int32 myUseLocatedMap = 0; // redundant
450  int32 myUseLocatedBufGL = 0;
451  };
452  static constexpr int32 VkBlockSize = VK_BLOCK_END - VK_BLOCK_START;
453 
454  // ~~~~~~~~~~~~~
455  // Global Vars
456  //
457  // Values static across the whole render
458  // typically may be changed between passes of different types
459  // Can be set, but not push/popped
460 
461  void setEmission(float v) { SET_GLOBAL(myEmissionFactor, v); }
462  float getEmission() const { return globals().myEmissionFactor; }
463 
464  void setSpecular(float v) { SET_GLOBAL(mySpeculaFactor, v); }
465  float getSpecular() const { return globals().mySpeculaFactor; }
466 
467  void setDiffuse(float v) { SET_GLOBAL(myDiffuseFactor, v); }
468  float getDiffuse() const { return globals().myDiffuseFactor; }
469 
470  void setAmbient(float v) { SET_GLOBAL(myAmbientFactor, v); }
471  float getAmbient() const { return globals().myAmbientFactor; }
472 
473  void setAlphaPass(int v) { SET_GLOBAL(myAlphaPass, v); }
474  int getAlphaPass() const { return globals().myAlphaPass; }
475 
476  void setLightMask(unsigned mask) { objects().myLightMask = mask; }
477  unsigned getLightMask() const { return objects().myLightMask; }
478 
479  void setUseHeadlight(bool use_headlight)
480  { SET_GLOBAL(myUseHeadlight, (int32)use_headlight); }
481  bool useHeadlight() const { return globals().myUseHeadlight; }
484  float ambient,
485  float soft,
486  bool use_spec,
487  bool use_world_space)
488  {
489  SET_GLOBAL(myHeadlightDir, dir);
490  SET_GLOBAL(myHeadlightColor, color);
491  SET_GLOBAL(myHeadlightSpec, (int32)(use_spec?1:0));
492  SET_GLOBAL(myHeadlightWorldSpace, (int32)use_world_space);
493  SET_GLOBAL(myHeadlightAmbient, ambient);
494  SET_GLOBAL(myHeadlightSoft, soft);
495  }
496  UT_Vector3F headlightDir() { return globals().myHeadlightDir; }
497  UT_Vector3F headlightColor() { return globals().myHeadlightColor; }
498  void setUseFilllight(bool use_fill)
499  { SET_GLOBAL(myUseFilllight, (int32)use_fill); }
501  {
502  SET_GLOBAL(myFilllightDir, dir);
503  SET_GLOBAL(myFilllightColor, color);
504  }
505  UT_Vector3F filllightDir() { return globals().myFilllightDir; }
506  UT_Vector3F filllightColor() { return globals().myFilllightColor; }
507  void setUseBacklight(bool use_back)
508  { SET_GLOBAL(myUseBacklight, (int32)use_back); }
510  {
511  SET_GLOBAL(myBacklightDir, dir);
512  SET_GLOBAL(myBacklightColor, color);
513  }
514  UT_Vector3F backlightDir() { return globals().myBacklightDir; }
515  UT_Vector3F backlightColor() { return globals().myBacklightColor; }
516 
517 
518  void setEnvlightMapRotate(const UT_Vector3F &rot);
519  void setEnvlightMapTint(const UT_Vector3F &tint)
520  { SET_GLOBAL(myEnvlightTint, UT_Vector4F(tint, 1.0)); }
521  void setUseEnvlight(bool use_env)
522  { SET_GLOBAL(myUseEnvlight, (int32)use_env); }
523  bool useEnvlight() const { return globals().myUseEnvlight; }
524  UT_Matrix4F getEnvlightRotate() const { return globals().myEnvlightRotate; }
526  { return UT_Vector3F(globals().myEnvlightTint); }
527 #ifdef USE_VULKAN
528  RV_TextureRef &envlightMap() { return globals().myEnvlightMapRef; }
529  RV_TextureRef &bgenvMap() { return globals().myBGEnvMapRef; }
530 #endif
531 
532  void setHasPrimLightMask(bool m) { objects().myHasPrimLightMask = m; }
533  bool hasPrimLightMask() const { return objects().myHasPrimLightMask; }
534 
536  {
537  RENDER_MATERIAL = 0,
538  RENDER_CONST = 1,
539  RENDER_OTHER = 2,
540  };
542  { SET_GLOBAL(myRenderPass, v); }
544  { return RenderPass(globals().myRenderPass); }
545 
546  void setAlphaCutoff(float v) { SET_GLOBAL(myAlphaCutoff, v); }
547  float getAlphaCutoff() const { return globals().myAlphaCutoff; }
548 
549  void setCamView(const UT_Matrix4D& v) { globals().myCamView = v;}
550  const UT_Matrix4D &getCamView() const { return globals().myCamView;}
551 
552  void setCamProject(const UT_Matrix4D& v) { globals().myCamProject = v;}
553  const UT_Matrix4D &getCamProject() const { return globals().myCamProject;}
554 
555  void setScreenSize(const UT_Vector2& v) { SET_GLOBAL(myScreenSize, v); }
556  const UT_Vector2& getScreenSize() const { return globals().myScreenSize; }
557 
558  void setLODParms(const UT_Vector2& v) { SET_GLOBAL(myLODParms, v); }
559  const UT_Vector2& getLODParms() const { return globals().myLODParms; }
560 
561  void setPickArea(const UT_Vector4F& v) { SET_GLOBAL(myPickArea, v); }
562  const UT_Vector4F& getPickArea() const { return globals().myPickArea; }
563 
564  void setPickMap(GR_TextureRef v, bool use = true)
565  {
566  SET_GLOBAL(myPickMap, v);
567  SET_GLOBAL(myPickHasMapVK, (use && globals().myPickMap.isVulkan()));
568  SET_GLOBAL(myPickHasMapGL, (use && globals().myPickMap.isGL()));
569  }
570 
571  void setDepthMap(GR_TextureRef v, bool use = true)
572  {
573  SET_GLOBAL(myDepthMap, v);
574  SET_GLOBAL(myHasDepthMapVK, (use && globals().myDepthMap.isVulkan()));
575  SET_GLOBAL(myHasDepthMapGL, (use && globals().myDepthMap.isGL()));
576  }
577 
578  void setSnapDistances(const UT_Vector3i &v) { SET_GLOBAL(mySnapDistances, v);}
579  const UT_Vector3i &getSnapDistances() const { return globals().mySnapDistances;}
580 
581  void setSnapParms(int32 v) { SET_GLOBAL(mySnapParams, v);}
582  int32 getSnapParms() const { return globals().mySnapParams;}
583 
584  void setDecorationLocate(const UT_Vector4F& v) { SET_GLOBAL(myDecorLocate, v); }
585  const UT_Vector4F& getDecorationLocate() const { return globals().myDecorLocate; }
586 
587 
588  void print();
589 
590  // TODO: use these maybe ?
591  bool myIsGlobalUniformLocked = false;
593  {
594  myIsGlobalUniformLocked = true;
595  }
597  {
598  myIsGlobalUniformLocked = false;
599  }
600  bool myGlobalUniformDirty = true;
601 
602  #define UT_Vector2F_UBO alignas(8) UT_Vector2F
603  #define UT_Vector3F_UBO alignas(16) UT_Vector3F
604  #define UT_Vector4F_UBO alignas(16) UT_Vector4F
605  #define UT_Vector2i_UBO alignas(8) UT_Vector2i
606  #define UT_Vector3i_UBO alignas(16) UT_Vector3i
607  #define UT_Vector4i_UBO alignas(16) UT_Vector4i
608  #define UT_Matrix4F_UBO alignas(16) UT_Matrix4F
609 
611  {
612  #define VK_GLOBAL_BLOCK_START (offsetof(GlobalUniforms, myProjectionF))
613  // float versions for VK
616  UT_Vector3F_UBO myNormalMatFr1; // store `mat3` as 3 `vec3`s to match UBO spacing
623 
624  // Inverses (reciprocals) of the extents of the cascading shadowmap regions.
627 
628  // TODO: make this a push constant
630 
631  // Screen/Framebuffer info
634 
637  int32 myHasDepthMapVK = 0;
638 
639  // Enum code indicating whether or not inside a
640  // transparency rendering pass, or what kind of pass
641  int32 myRenderPass = RENDER_MATERIAL;
642  int32 myAlphaPass = 0;
643 
644  int32 myMaterialLayer = 0;
645  int32 myOnionSkinGroup = 0;
646 
647  fpreal32 SceneIOR = 1.0;
648 
649  // Multipliers for different aspects of lighting,
650  // typically 0.0 or 1.0
651  fpreal32 myEmissionFactor = 1.0;
652  fpreal32 myDiffuseFactor = 1.0;
653  fpreal32 myAmbientFactor = 1.0;
654  fpreal32 mySpeculaFactor = 1.0;
655 
657 
658  fpreal32 myAlphaCutoff = 1e-3;
659 
660  int32 myNumSamples = 4;
661 
662  int32 myIsOrtho = 0;
664 
665  // NOTE: only used in pick rendering
667  int32 myPickHasMapVK = 0;
668 
669  // NOTE: only used in snap rendering
671  int32 mySnapParams = 0;
672 
673  // NOTE: only used in decoration rendering
675  float myDecorOcclusionFade = 1.0;
676 
677  int32 myHeadlightWorldSpace = 0;
678  fpreal32 myHeadlightAmbient = 0.02;
679 
681  int32 myHeadlightSpec = 1;
683  int32 myUseHeadlight = 0;
684  fpreal32 myHeadlightSoft = 0.0;
685 
687  int32 myUseFilllight = 0;
689 
691  int32 myUseBacklight = 0;
693 
696  int32 myUseEnvlight = 0;
697 
698  #define VK_GLOBAL_BLOCK_END (offsetof(GlobalUniforms, myUseEnvlight ) \
699  + sizeof(GlobalUniforms::myUseEnvlight))
700 
702 
710 
711  // NOTE: only used in pick rendering
713  int32 myPickHasMapGL = 0;
714 
715  // NOTE: only used in shadow map rendering
717  int32 myHasDepthMapGL = 0;
718  fpreal32 myDepthBufferFar = 1.0;
719 
720 #ifdef USE_VULKAN
721  RV_TextureRef myEnvlightMapRef;
722  RV_TextureRef myBGEnvMapRef;
723 #endif
724  };
725  static constexpr int32 VkGlobalBlockSize = VK_GLOBAL_BLOCK_END
727 
728 #ifdef USE_VULKAN
729  static void initStaticResources(RV_Instance* inst);
730  static void cleanupStaticResources();
731 
732  static void prepareThreadedUniforms(exint num_threads);
733  static void returnThreadedUniforms();
734 
735  static GR_Uniforms* getForThread(int* level, int idx);
736  static void returnForThread(int* level);
737 #endif
738 
740  {
741  return myObjectUniforms.last();
742  }
743  const ObjectUniforms& objects() const
744  {
745  return myObjectUniforms.last();
746  }
747 
749  {
750  UT_ASSERT(!myIsGlobalUniformLocked);
751  myGlobalUniformDirty = true;
752  return myGlobalUniforms;
753  }
754  const GlobalUniforms& globals() const
755  {
756  return myGlobalUniforms;
757  }
758 
759 private:
760  UT_ValArray<ObjectUniforms> myObjectUniforms;
761  GlobalUniforms myGlobalUniforms;
762 
763  // ~~~~~~~~~~~~~~~
764  // RE Private Helpers
765 
766  // RE_Render stack helpers
767  bool myIsREPushed = false;
768 
769  // Ghosting setup taken form GUI_GeoRender::setupGhosting
770  struct RECachedState
771  {
772  bool useSampleMask;
773  int sampleMask;
774  bool multisample;
775  } myCachedREState;
776 
777  // Special handlers for ghosting state -- changes some Render state as well
778  // as pushing uniforms
779  void pushGhosting(RE_Render* r);
780  void assignGhosting(RE_Render* r);
781  void popGhosting(RE_Render* r);
782 
783 private:
784  bool myUseVulkanProjection = false;
785 #ifdef USE_VULKAN
786  struct gr_SetCache
787  {
788  // Array doing linear lookup, fine if number of sets small
789  // TODO: could do a hashmap
791  UT_Array<bool> myDirtyFlags;
792 
794  RV_Render *r,
795  int set_num,
797  bool* out_is_new_or_dirty);
798  };
799  gr_SetCache myGlobalSet;
800  UT_UniquePtr<RV_ShaderBlock> myPassInfoBlock;
801 #endif
802 };
803 
804 
805 #endif
void setObjColorForceUseGeo()
Definition: GR_Uniforms.h:308
A collection of Vulkan UBO, SSBO, and Image shader bindings (descriptor set)
const UT_Vector4 & getObjWireframeColor() const
Definition: GR_Uniforms.h:218
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glcorearb.h:2540
void setAlphaCutoff(float v)
Definition: GR_Uniforms.h:546
void setObjLocatedBuffer(RE_Texture *buf)
Definition: GR_Uniforms.h:343
UT_Vector3F headlightDir()
Definition: GR_Uniforms.h:496
UT_Vector3F filllightColor()
Definition: GR_Uniforms.h:506
int int32
Definition: SYS_Types.h:39
GLenum GLint * range
Definition: glcorearb.h:1925
const UT_Vector4 & getObjBackfaceColor() const
Definition: GR_Uniforms.h:251
void setObjFillSelection(int v)
Definition: GR_Uniforms.h:269
const UT_Matrix4D & getViewMatrix() const
Definition: GR_Uniforms.h:158
void setObjConstColorMap(GR_TextureRef v)
Definition: GR_Uniforms.h:226
void setPickMap(GR_TextureRef v, bool use=true)
Definition: GR_Uniforms.h:564
void setObjEmission(const UT_Vector4F &c)
Definition: GR_Uniforms.h:233
UT_Vector3F getEnvlightMapTint() const
Definition: GR_Uniforms.h:525
void setObjTexturesEnabled(int v)
Definition: GR_Uniforms.h:356
void setUseHeadlight(bool use_headlight)
Definition: GR_Uniforms.h:479
void setShadowmapIndex(const int32 index)
Definition: GR_Uniforms.h:200
const GLdouble * v
Definition: glcorearb.h:837
void setObjWireThickness(const float &v)
Definition: GR_Uniforms.h:220
bool getIsOrtho() const
Definition: GR_Uniforms.h:194
void setObjSelectColor(const UT_Vector4 &v)
Definition: GR_Uniforms.h:254
exint getObjMaxLocatedID() const
Definition: GR_Uniforms.h:327
void setLightMask(unsigned mask)
Definition: GR_Uniforms.h:476
CSMRegionInvExts myCSMRegionInvExts
Definition: GR_Uniforms.h:625
int getAlphaPass() const
Definition: GR_Uniforms.h:474
int getObjPrimConstandID() const
Definition: GR_Uniforms.h:273
const UT_Vector4F & getPickArea() const
Definition: GR_Uniforms.h:562
exint getObjMinLocatedID() const
Definition: GR_Uniforms.h:333
GA_API const UT_StringHolder rot
void setEnvlightMapTint(const UT_Vector3F &tint)
Definition: GR_Uniforms.h:519
void setObjColorRamp(GR_TextureRef v, UT_Vector2F range=UT_Vector2F())
Definition: GR_Uniforms.h:288
void setUseEnvlight(bool use_env)
Definition: GR_Uniforms.h:521
int getObjTexturesEnabled() const
Definition: GR_Uniforms.h:359
const UT_Matrix3D & getNormalMatrix() const
Definition: GR_Uniforms.h:160
int64 exint
Definition: SYS_Types.h:125
GLint level
Definition: glcorearb.h:108
void setObjMaxLocatedID(exint v)
Definition: GR_Uniforms.h:324
UT_Vector3F filllightDir()
Definition: GR_Uniforms.h:505
RenderPass getRenderPass() const
Definition: GR_Uniforms.h:543
void setObjPickBaseID(const UT_Vector3i &v)
Definition: GR_Uniforms.h:278
float getAmbient() const
Definition: GR_Uniforms.h:471
void copyUniforms(const GR_Uniforms *other)
Definition: GR_Uniforms.h:63
UT_Vector3i_UBO myCoverageMask
Definition: GR_Uniforms.h:656
Opaque reference to a texture stored in the RV_TextureCache.
Definition: RV_Type.h:203
const UT_Vector4 & getObjSelectSecondaryColor() const
Definition: GR_Uniforms.h:258
bool isGL() const
Definition: GR_TextureRef.h:38
UT_Matrix4F_UBO myCamViewF
Definition: GR_Uniforms.h:621
void setObjWireframeColor(const UT_Vector4 &v)
Definition: GR_Uniforms.h:217
void setObjGhosting(const UT_Vector4 &v, float gfact=0.5)
Definition: GR_Uniforms.h:237
void setObjColorTransform(int32 mode, UT_Vector3F ref=UT_Vector3F())
Definition: GR_Uniforms.h:313
const UT_Vector4 & getObjWireColor() const
Definition: GR_Uniforms.h:215
void useVulkanProjection(bool use_vk)
Definition: GR_Uniforms.h:190
UT_Matrix4F_UBO myCamProjectF
Definition: GR_Uniforms.h:622
void setObjSelectSecondaryColor(const UT_Vector4 &v)
Definition: GR_Uniforms.h:257
UT_Vector3F backlightDir()
Definition: GR_Uniforms.h:514
float getObjBackfaceFactor() const
Definition: GR_Uniforms.h:252
void setHasPrimLightMask(bool m)
Definition: GR_Uniforms.h:532
void setViewMatrix(const UT_Matrix4D &v)
Definition: GR_Uniforms.h:136
const UT_Matrix4D & getInvViewMatrix() const
Definition: GR_Uniforms.h:159
float fpreal32
Definition: SYS_Types.h:200
A class that manages material assignments to different groups of primitives.
Temporary container for either a RV_Render and an RE_Render.
GR_API bool createOrReuseSet(RV_Render *r, UT_UniquePtr< RV_ShaderVariableSet > &set, int set_num, const RV_ShaderProgramBase *shader, bool *created=nullptr, const char *name=nullptr)
void setAlphaPass(int v)
Definition: GR_Uniforms.h:473
void setUseBacklight(bool use_back)
Definition: GR_Uniforms.h:507
#define VK_BLOCK_END
Definition: GR_Uniforms.h:413
UT_Vector4F_UBO myDecorLocate
Definition: GR_Uniforms.h:674
UT_Vector4F_UBO myEnvlightTint
Definition: GR_Uniforms.h:695
void setEmission(float v)
Definition: GR_Uniforms.h:461
CSMRegionOffsets myCSMRegionOffsets
Definition: GR_Uniforms.h:626
void setBacklightParms(UT_Vector3F dir, UT_Vector3F color)
Definition: GR_Uniforms.h:509
UT_Vector3F_UBO myBacklightColor
Definition: GR_Uniforms.h:692
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
Definition: UT_UniquePtr.h:39
UT_Vector3F_UBO myHeadlightDir
Definition: GR_Uniforms.h:680
RE_TextureDimension getTextureType() const
#define SET_GLOBAL(name, v)
Definition: GR_Uniforms.h:50
#define UT_Vector2F_UBO
Definition: GR_Uniforms.h:602
void setPickArea(const UT_Vector4F &v)
Definition: GR_Uniforms.h:561
float getObjWireThickness() const
Definition: GR_Uniforms.h:221
UT_Vector3F backlightColor()
Definition: GR_Uniforms.h:515
void setUseFilllight(bool use_fill)
Definition: GR_Uniforms.h:498
void setSpecular(float v)
Definition: GR_Uniforms.h:464
#define VK_GLOBAL_BLOCK_START
Definition: GR_Uniforms.h:612
UT_Matrix4F_UBO myInvViewF
Definition: GR_Uniforms.h:620
GLfloat f
Definition: glcorearb.h:1926
UT_Vector4T< float > UT_Vector4
UT_Vector2F_UBO myLODParms
Definition: GR_Uniforms.h:633
const UT_Matrix4D & getObjModelMatrix() const
Definition: GR_Uniforms.h:131
std::array< T, N > UT_FixedArray
Definition: UT_FixedArray.h:19
float getEmission() const
Definition: GR_Uniforms.h:462
UT_Vector4F_UBO myPickArea
Definition: GR_Uniforms.h:666
bool getObjColorIgnoreGeo() const
Definition: GR_Uniforms.h:301
UT_Vector3F_UBO myBacklightDir
Definition: GR_Uniforms.h:690
void setDepthMap(GR_TextureRef v, bool use=true)
Definition: GR_Uniforms.h:571
void unlockGlobalUniforms()
Definition: GR_Uniforms.h:596
const UT_Vector3i & getSnapDistances() const
Definition: GR_Uniforms.h:579
GlobalUniforms & globals()
Definition: GR_Uniforms.h:748
GR_TextureRef myConstColorMap
Definition: GR_Uniforms.h:433
UT_Vector2F_UBO myScreenSize
Definition: GR_Uniforms.h:632
GLint ref
Definition: glcorearb.h:124
void setCSMRegionOffsets(const CSMRegionInvExts &e)
Definition: GR_Uniforms.h:211
UT_Vector3i getObjPickBaseID() const
Definition: GR_Uniforms.h:280
void lockGlobalUniforms()
Definition: GR_Uniforms.h:592
UT_Vector2F_UBO myDepthRange
Definition: GR_Uniforms.h:635
void setObjPickComponentID(const UT_Vector3i &v)
Definition: GR_Uniforms.h:283
constexpr auto set(type rhs) -> int
Definition: core.h:610
int getObjSelectInstance() const
Definition: GR_Uniforms.h:267
int32 getSnapParms() const
Definition: GR_Uniforms.h:582
const UT_Vector4 & getObjSelectColor() const
Definition: GR_Uniforms.h:255
UT_Vector3F headlightColor()
Definition: GR_Uniforms.h:497
void setCamView(const UT_Matrix4D &v)
Definition: GR_Uniforms.h:549
bool useEnvlight() const
Definition: GR_Uniforms.h:523
const UT_Matrix4D & getInvProjectionMatrix() const
Definition: GR_Uniforms.h:193
void setFilllightParms(UT_Vector3F dir, UT_Vector3F color)
Definition: GR_Uniforms.h:500
GLint GLuint mask
Definition: glcorearb.h:124
ObjectUniforms & objects()
Definition: GR_Uniforms.h:739
const UT_Vector2F & getDepthProject() const
Definition: GR_Uniforms.h:198
void setCSMRegionInvExts(const CSMRegionInvExts &e)
Definition: GR_Uniforms.h:207
UT_Matrix4T< fpreal32 > UT_Matrix4F
void setRenderPass(RenderPass v)
Definition: GR_Uniforms.h:541
#define GR_API
Definition: GR_API.h:10
UT_Matrix4F_UBO myInvProjectionF
Definition: GR_Uniforms.h:619
UT_Vector2F_UBO myDepthOffset
Definition: GR_Uniforms.h:663
const UT_Vector4 & getObjConstColor() const
Definition: GR_Uniforms.h:224
const GlobalUniforms & globals() const
Definition: GR_Uniforms.h:754
#define UT_Vector4F_UBO
Definition: GR_Uniforms.h:604
float getObjDecorationScale() const
Definition: GR_Uniforms.h:276
void setObjSelectMode(int v)
Definition: GR_Uniforms.h:260
bool getUseVulkanProjection() const
Definition: GR_Uniforms.h:191
void setProjectMatrix(const UT_Matrix4D &v, bool correct=true, bool is_ortho=false)
Definition: GR_Uniforms.h:164
float getSpecular() const
Definition: GR_Uniforms.h:465
void setAmbient(float v)
Definition: GR_Uniforms.h:470
void setObjUseInstancePrimId(int32 v)
Definition: GR_Uniforms.h:319
Handle to the main interface of Vulkan.
Definition: RV_Instance.h:44
void setCamProject(const UT_Matrix4D &v)
Definition: GR_Uniforms.h:552
int getObjSelectMode() const
Definition: GR_Uniforms.h:261
void setObjSelectType(int v)
Definition: GR_Uniforms.h:263
float getObjGhostFactor() const
Definition: GR_Uniforms.h:244
int32 getShadowmapIndex() const
Definition: GR_Uniforms.h:201
GLenum mode
Definition: glcorearb.h:99
void setObjWireColor(const UT_Vector4 &v)
Definition: GR_Uniforms.h:214
const UT_Vector2 & getLODParms() const
Definition: GR_Uniforms.h:559
bool isVulkan() const
Definition: GR_TextureRef.h:39
UT_Vector3T< fpreal32 > UT_Vector3F
#define UT_Vector3F_UBO
Definition: GR_Uniforms.h:603
const CSMRegionInvExts & getCSMRegionOffsets() const
Definition: GR_Uniforms.h:212
const UT_Vector4F & getDecorationLocate() const
Definition: GR_Uniforms.h:585
UT_FixedArray< UT_Vector4, 4 > CSMRegionInvExts
Definition: GR_Uniforms.h:206
float getAlphaCutoff() const
Definition: GR_Uniforms.h:547
GLuint shader
Definition: glcorearb.h:785
const UT_Matrix4D & getObjModelViewMatrix() const
Definition: GR_Uniforms.h:134
UT_Vector3F_UBO myHeadlightColor
Definition: GR_Uniforms.h:682
UT_Vector3F_UBO myNormalMatFr1
Definition: GR_Uniforms.h:616
#define VK_BLOCK_START
Definition: GR_Uniforms.h:366
UT_Vector2T< fpreal32 > UT_Vector2F
void setObjModelMatrix(const UT_Matrix4D &v, const UT_Matrix4D *inv=nullptr)
Definition: GR_Uniforms.h:107
const UT_Vector2 & getScreenSize() const
Definition: GR_Uniforms.h:556
void setObjColorIgnoreGeo(bool v)
Definition: GR_Uniforms.h:297
UT_Vector4T< fpreal32 > UT_Vector4F
GLuint color
Definition: glcorearb.h:1261
UT_Vector3F_UBO myFilllightDir
Definition: GR_Uniforms.h:686
#define UT_Vector3i_UBO
Definition: GR_Uniforms.h:606
const CSMRegionInvExts & getCSMRegionInvExts() const
Definition: GR_Uniforms.h:208
UT_Vector2F_UBO myDepthProject
Definition: GR_Uniforms.h:636
void setSnapDistances(const UT_Vector3i &v)
Definition: GR_Uniforms.h:578
#define VK_GLOBAL_BLOCK_END
Definition: GR_Uniforms.h:698
void setScreenSize(const UT_Vector2 &v)
Definition: GR_Uniforms.h:555
UT_Matrix4F_UBO myProjectionF
Definition: GR_Uniforms.h:614
const UT_Matrix4D & getProjectionMatrix() const
Definition: GR_Uniforms.h:192
GLuint index
Definition: glcorearb.h:786
UT_Vector3i getObjPickComponentID() const
Definition: GR_Uniforms.h:285
bool hasPrimLightMask() const
Definition: GR_Uniforms.h:533
void setDiffuse(float v)
Definition: GR_Uniforms.h:467
void setDepthProject(const UT_Vector2F &p)
Definition: GR_Uniforms.h:197
void setObjMinLocatedID(exint v)
Definition: GR_Uniforms.h:330
void setObjDecorationScale(float v)
Definition: GR_Uniforms.h:275
const UT_Matrix4D & getObjInvModelMatrix() const
Definition: GR_Uniforms.h:132
UT_Vector3F_UBO myFilllightColor
Definition: GR_Uniforms.h:688
const UT_Matrix4D & getCamProject() const
Definition: GR_Uniforms.h:553
const UT_Vector4 & getObjGhostColor() const
Definition: GR_Uniforms.h:243
unsigned getLightMask() const
Definition: GR_Uniforms.h:477
#define UT_ASSERT(ZZ)
Definition: UT_Assert.h:156
UT_Matrix4F getEnvlightRotate() const
Definition: GR_Uniforms.h:524
UT_Vector3i_UBO mySnapDistances
Definition: GR_Uniforms.h:670
GLboolean r
Definition: glcorearb.h:1222
set of parameters sent to GR_Primitive::update()
Definition: GR_Uniforms.h:56
void setObjSelectInstance(int v)
Definition: GR_Uniforms.h:266
A vulkan buffer object.
Definition: RV_VKBuffer.h:81
int getObjFillSelection() const
Definition: GR_Uniforms.h:270
UT_FixedArray< UT_Vector4, 4 > CSMRegionOffsets
Definition: GR_Uniforms.h:210
void setObjPrimConstandID(int v)
Definition: GR_Uniforms.h:272
UT_Vector3F_UBO myNormalMatFr3
Definition: GR_Uniforms.h:618
void setObjLocatedBuffer(RV_VKBuffer *buf)
Definition: GR_Uniforms.h:337
UT_Matrix4F_UBO myEnvlightRotate
Definition: GR_Uniforms.h:694
#define UT_Matrix4F_UBO
Definition: GR_Uniforms.h:608
FMT_INLINE void print(format_string< T...> fmt, T &&...args)
Definition: core.h:2903
int getObjSelectType() const
Definition: GR_Uniforms.h:264
void setSnapParms(int32 v)
Definition: GR_Uniforms.h:581
const UT_Matrix4D & getCamView() const
Definition: GR_Uniforms.h:550
const UT_Matrix3D & getObjNormalMatrix() const
Definition: GR_Uniforms.h:133
void setObjConstColor(const UT_Vector4 &v)
Definition: GR_Uniforms.h:223
float getDiffuse() const
Definition: GR_Uniforms.h:468
void setDecorationLocate(const UT_Vector4F &v)
Definition: GR_Uniforms.h:584
void setObjBackfaceTint(const UT_Vector3 &v, float gfact=0.5)
Definition: GR_Uniforms.h:246
void setLODParms(const UT_Vector2 &v)
Definition: GR_Uniforms.h:558
void setObjLightingEnabled(int v)
Definition: GR_Uniforms.h:350
void setDepthRange(const UT_Vector2F &r)
Definition: GR_Uniforms.h:196
const ObjectUniforms & objects() const
Definition: GR_Uniforms.h:743
bool useHeadlight() const
Definition: GR_Uniforms.h:481
void setHeadlightParms(UT_Vector3F dir, UT_Vector3F color, float ambient, float soft, bool use_spec, bool use_world_space)
Definition: GR_Uniforms.h:482
UT_Vector3F_UBO myNormalMatFr2
Definition: GR_Uniforms.h:617
int getObjLightingEnabled() const
Definition: GR_Uniforms.h:353