HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
VEX_GeoCommand.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: VEX_GeoCommand.h ( VEX Library, C++)
7  *
8  * COMMENTS: Generic commands and queues to store geometry
9  * edit operations
10  */
11 
12 #ifndef __VEX_GeoCommand__
13 #define __VEX_GeoCommand__
14 
15 #include "VEX_API.h"
16 #include "VEX_Types.h"
17 #include <UT/UT_Array.h>
18 #include <UT/UT_IntArray.h>
19 #include <UT/UT_Map.h>
20 #include <UT/UT_NonCopyable.h>
21 #include <UT/UT_PageArray.h>
22 #include <UT/UT_SharedString.h>
23 #include <UT/UT_StringHolder.h>
24 #include <UT/UT_StringMap.h>
25 #include <UT/UT_StringSet.h>
26 #include <UT/UT_Vector3.h>
27 #include <UT/UT_VectorTypes.h>
28 
29 #include <variant>
30 
31 // Do NOT use VEX_API here for template classes with all code in the header!
32 
33 enum class VEX_GeoMode
34 {
35  SET,
36  ADD,
37  MAX,
38  MIN,
39  MULTIPLY,
40  TOGGLE,
41  APPEND,
42 
43  INVALID
44 };
45 enum class VEX_GeoPrimType
46 {
47  POLY_OPEN,
49  TET,
50  SPHERE,
51  CIRCLE,
52  TUBE,
53  METABALL,
54  METASQUAD,
56  PACKEDDISK,
57  HEX,
58  CHANNEL,
59  PLANE,
60 
61  INVALID
62 };
63 enum class VEX_GeoDictType
64 {
65  DETAIL,
67  PRIM,
69  PRIMGROUP,
70  POINT,
71  POINTGROUP,
72  VERTEX,
74  EDGEGROUP,
75 
76  INVALID
77 };
78 enum class VEX_GeoTypeInfo
79 {
80  NOCHANGE = -1,
81  NONE = 0,
82  POINT,
83  HPOINT,
84  VECTOR,
85  NORMAL,
86  COLOR,
87  TRANSFORM,
88  QUATERNION,
89  INDEXPAIR,
93 };
94 
96 {
97  InsertKey,
98  DestroyKey,
99  Clear,
100  SetKeyValue,
101  SetKeySlope,
102  SetKeyAccel,
103 
104  Invalid
105 };
106 
107 // These must match the order of the definitions in $SHS/vex/include/chprim_util.h
109 {
110  In,
111  Out,
112  InOut
113 };
114 
115 namespace VEX_Geo
116 {
117  VEX_API VEX_GeoMode modeFromString(const char*);
121 
122 } // namespace VEX_Geo
123 
125 {
126 public:
127  VEX_GeoCommand(exint srcelem) { mySourceElem = srcelem; }
128  VEX_GeoCommand(): mySourceElem(-1) {}
129 
130  exint elem() const { return mySourceElem; }
131 
132 protected:
134 };
135 
136 template <VEX_Precision PREC>
138 {
139 public:
141  : VEX_GeoCommand(srcelem)
142  , myType(primtype)
143  {
144  }
146 
147  VEX_GeoPrimType type() const { return myType; }
148 
149 protected:
151 };
152 
153 template <VEX_Precision PREC>
155 {
156 public:
158  : VEX_GeoCommand(srcelem)
159  , myPos(pos)
160  , mySrcPt(-1)
161  {
162  }
164  : VEX_GeoCommand(srcelem)
165  , myPos(0.0, 0.0, 0.0)
166  , mySrcPt(srcpt)
167  {
168  }
170 
171  VEXvec3<PREC> pos() const { return myPos; }
172  VEXint<PREC> srcpt() const { return mySrcPt; }
173 
174 protected:
175  // Ideally we'd union, but C++ makes this frustrating.
178 };
179 
180 template <VEX_Precision PREC>
182 {
183 public:
186  : VEX_GeoCommand(srcelem)
187  , myPrimNum(primnum)
188  , myPtNum(ptnum)
189  {
190  }
192 
193  VEXint<PREC> primnum() const { return myPrimNum; }
194  VEXint<PREC> ptnum() const { return myPtNum; }
195 
196 protected:
199 };
200 
201 template <VEX_Precision PREC>
203 {
204 public:
206  : VEX_GeoCommand(srcelem)
207  , myObjID(obj_id)
208  {
209  }
211 
212  VEXint<PREC> objID() const { return myObjID; }
213 
214 protected:
216 };
217 
218 namespace VEX_DataObjID
219 {
220  static SYS_FORCE_INLINE void initID(int32 &id) { id = -1; }
221  static SYS_FORCE_INLINE bool isValidID(int32 id) { return id >= 0; }
222 
223  static SYS_FORCE_INLINE void initID(int64 &id) { id = -1; }
224  static SYS_FORCE_INLINE bool isValidID(int64 id) { return id >= 0; }
225 
226  static SYS_FORCE_INLINE void initID(UT_StringHolder &id) { id.clear(); }
227  static SYS_FORCE_INLINE bool isValidID(const UT_StringHolder &id)
228  { return id.isstring(); }
229 
230  static SYS_FORCE_INLINE void initID(UT_OptionsHolder &id) { id.clear(); }
231  static SYS_FORCE_INLINE bool isValidID(const UT_OptionsHolder &id)
232  { return !id.isEmpty(); }
233 };
234 
235 template <VEX_Precision PREC, typename OBJ_ID, typename SEC_ID, typename T>
237 {
238 public:
240  exint srcelem, const OBJ_ID &obj_id, const SEC_ID &sec_id,
242  : VEX_GeoCommand(srcelem)
243  , myObjID(obj_id)
244  , mySecID(sec_id)
245  , myMode(mode)
246  , myData(data)
247  {
248  }
250  : mySecID(-1)
252  , myData(T())
253  {
254  VEX_DataObjID::initID(myObjID);
255  }
256 
257  const OBJ_ID & objID() const { return myObjID; }
258  const SEC_ID & secID() const { return mySecID; }
259  VEX_GeoMode mode() const { return myMode; }
260  T data() const { return myData; }
261 
262 protected:
263  OBJ_ID myObjID;
264  SEC_ID mySecID;
267 };
268 
269 template <VEX_Precision PREC, typename T>
272 template <VEX_Precision PREC, typename T>
275 
276 template <VEX_Precision PREC>
278 {
279 public:
281  exint srcelem, VEXint<PREC> primnum,
282  VEXint<PREC> vtxidx, VEXint<PREC> newptnum)
283  : VEX_GeoCommand(srcelem)
284  , myPrimNum(primnum)
285  , myVtxIdx(vtxidx)
286  , myPtNum(newptnum)
287  {
288  }
290 
291  // -1 for primnum implies a linear vertex
292  VEXint<PREC> primnum() const { return myPrimNum; }
293  VEXint<PREC> vtxidx() const { return myVtxIdx; }
294  VEXint<PREC> ptnum() const { return myPtNum; }
295 
296 protected:
297  VEXint<PREC> myPrimNum, myVtxIdx, myPtNum;
298 };
299 
300 template <VEX_Precision PREC>
302 {
303 public:
305  const VEXfloat<PREC> &value,
306  VEXint<PREC> channelidx)
307  : VEX_GeoCommand(srcelem),
308  myPrimNum(primnum),
309  myValue(value),
310  myChannelIdx(channelidx)
311  {
312  }
313 
315  : myPrimNum(-1), myValue(0.0), myChannelIdx(-1)
316  {
317  }
318 
319  VEXint<PREC> primnum() const { return myPrimNum; }
320  VEXfloat<PREC> value() const { return myValue; }
321  VEXint<PREC> channelIdx() const { return myChannelIdx; }
322 
323 private:
324  VEXint<PREC> myPrimNum;
325  VEXfloat<PREC> myValue;
326  VEXint<PREC> myChannelIdx;
327 };
328 
329 template <VEX_Precision PREC>
331 {
332 public:
334  const VEXmat4<PREC> &xform, VEXint<PREC> xformidx, bool worldspace)
335  : VEX_GeoCommand(srcelem),
336  myPrimNum(primnum),
337  myData(SingleEdit(xform, xformidx)),
338  myWorldSpace(worldspace)
339  {
340  }
342  const UT_Array<VEXmat4<PREC>> &xforms, bool worldspace)
343  : VEX_GeoCommand(srcelem),
344  myPrimNum(primnum),
346  myWorldSpace(worldspace)
347  {
348  }
350 
351  VEXint<PREC> primnum() const { return myPrimNum; }
352  const VEXmat4<PREC> &xform() const
353  {
354  UT_ASSERT(myData.index() == 0);
355  return std::get<SingleEdit>(myData).first;
356  }
357  VEXint<PREC> xformidx() const
358  {
359  UT_ASSERT(myData.index() == 0);
360  return std::get<SingleEdit>(myData).second;
361  }
363  {
364  UT_ASSERT(myData.index() == 1);
365  return std::get<FullEdit>(myData);
366  }
367  bool worldspace() const { return myWorldSpace; }
368 
369  bool isSingleEdit() const { return myData.index() == 0; }
370 
371 protected:
372  typedef std::pair<VEXmat4<PREC>,VEXint<PREC>> SingleEdit;
374 
375  VEXint<PREC> myPrimNum;
376  // Allow setting a single transform or setting all of them
377  std::variant<SingleEdit, FullEdit> myData;
379 };
380 
381 template <VEX_Precision PREC>
383 {
384 public:
386  const UT_Array<VEXint<PREC>> &clipids,
389  const UT_Array<VEXint<PREC>> &clipxformgroupids,
390  const UT_Array<VEXint<PREC>> &cliplayerids,
391  const UT_Array<VEXint<PREC>> &cliplayermodes,
393  const UT_Array<VEXint<PREC>> &cliplayerparents)
394  : VEX_GeoCommand(srcelem),
395  myPrimNum(primnum),
404  {
405  }
406 
407  VEX_GeoCommandAgentClipEdit() = default;
412 
413  const VEXint<PREC> primnum() const { return myPrimNum; }
414  const UT_Array<VEXint<PREC>> &clipids() const { return myClipIds; }
415  const UT_Array<VEXfloat<PREC>> &cliptimes() const { return myClipTimes; }
422 
423 protected:
424  VEXint<PREC> myPrimNum;
433 };
434 
435 template <VEX_Precision PREC>
437 {
438 public:
440  const UT_Array<VEXint<PREC>> &layer_ids, bool is_collision)
441  : VEX_GeoCommand(srcelem),
442  myPrimNum(primnum),
443  myLayerIds(layer_ids),
444  myIsCollision(is_collision)
445  {
446  }
447  VEX_GeoCommandAgentLayerEdit() = default;
448 
449  VEXint<PREC> primnum() const { return myPrimNum; }
450  const UT_Array<VEXint<PREC>> &layerIds() const { return myLayerIds; }
451  bool isCollision() const { return myIsCollision; }
452 
453 private:
454  VEXint<PREC> myPrimNum = -1;
455  UT_Array<VEXint<PREC>> myLayerIds;
456  bool myIsCollision = false;
457 };
458 
459 class CL_Clip;
460 
461 template <VEX_Precision PREC>
463 {
464 public:
466  exint srcelem,
467  VEXint<PREC> primnum,
468  const UT_StringHolder &clip_name,
469  const UT_StringHolder &clip_path,
470  bool keep_ref)
471  : VEX_GeoCommand(srcelem)
472  , myPrimNum(primnum)
473  , myClipName(clip_name)
474  , myClipPath(clip_path)
475  , myKeepRef(keep_ref)
476  {
477  }
479  : VEX_GeoCommand()
480  , myPrimNum(-1)
481  , myClipName()
482  , myClipPath()
483  , myKeepRef(true)
484  {
485  }
486 
487  VEXint<PREC> primnum() const { return myPrimNum; }
488 
489  VEXint<PREC> myPrimNum;
492  bool myKeepRef;
493 };
494 
495 template <VEX_Precision PREC>
497 {
498 public:
500  exint srcelem,
501  VEXint<PREC> primnum,
502  VEX_GeoPrimChannelOperation operation,
503  float time = 0.0,
504  float value = 0.0,
506  : VEX_GeoCommand(srcelem)
507  , myPrimNum(primnum)
508  , myOperation(operation)
509  , myTime(time)
510  , myValue(value)
511  , myHalf(half)
512  {
513  }
515  : VEX_GeoCommand()
516  , myPrimNum(-1)
518  , myTime(0)
519  , myValue(0)
521  {
522  }
523 
524  VEXint<PREC> primnum() const { return myPrimNum; }
525 
526  VEXint<PREC> myPrimNum;
528  float myTime;
529  float myValue;
531 };
532 
533 template <VEX_Precision PREC, typename OBJ_ID, typename SEC_ID>
535 {
536 public:
537  //
538  // A variant of all VEXint,VEXfloat,VEXvecN,VEXmatN types
540  {
541  public:
542  DefaultValue() { memset(f, 0, sizeof(VEXfloat<PREC>)*16); i = 0; }
543 
544  void set(VEXint<PREC> v) { i = v; }
545  void set(VEXfloat<PREC> v) { f[0] = v; }
546  void set(VEXvec2<PREC> v) { memcpy(f, &v, sizeof(v)); }
547  void set(VEXvec3<PREC> v) { memcpy(f, &v, sizeof(v)); }
548  void set(VEXvec4<PREC> v) { memcpy(f, &v, sizeof(v)); }
549  void set(VEXmat2<PREC> v) { memcpy(f, &v, sizeof(v)); }
550  void set(VEXmat3<PREC> v) { memcpy(f, &v, sizeof(v)); }
551  void set(VEXmat4<PREC> v) { memcpy(f, &v, sizeof(v)); }
552 
554  VEXint<PREC> i;
555  };
556 
558  const UT_StringHolder &name);
559  // This constructor is only used for the VEX_UsdEdit incarnation of
560  // this class. This avoids having to define a subclass and introducing
561  // virtual function calls. The path is used to group and sort USD edits
562  // according to their location in the scene graph tree, rather than just
563  // using the attribute name or metadata key (which are supplied in the
564  // name parameter).
566  const UT_StringHolder &path,
567  const UT_StringHolder &name);
568  ~VEX_AttribEdit();
569 
571 
572  void setTypeInfo(exint srcelem,
573  const char *typeinfo);
574 
575  void addAttribute(exint srcelem,
576  VEX_Type type,
577  bool isarray,
578  const DefaultValue &value);
579 
580  void appendEdit(exint srcelem,
581  const OBJ_ID &obj_id,
582  const SEC_ID &sec_id,
584  VEXfloat<PREC> data);
585  void appendEdit(exint srcelem,
586  const OBJ_ID &obj_id,
587  const SEC_ID &sec_id,
588  VEX_GeoMode mode,
589  VEXint<PREC> data);
590  void appendEdit(exint srcelem,
591  const OBJ_ID &obj_id,
592  const SEC_ID &sec_id,
593  VEX_GeoMode mode,
594  VEXvec2<PREC> data);
595  void appendEdit(exint srcelem,
596  const OBJ_ID &obj_id,
597  const SEC_ID &sec_id,
598  VEX_GeoMode mode,
599  VEXvec3<PREC> data);
600  void appendEdit(exint srcelem,
601  const OBJ_ID &obj_id,
602  const SEC_ID &sec_id,
603  VEX_GeoMode mode,
604  VEXvec4<PREC> data);
605  void appendEdit(exint srcelem,
606  const OBJ_ID &obj_id,
607  const SEC_ID &sec_id,
608  VEX_GeoMode mode,
609  VEXmat2<PREC> data);
610  void appendEdit(exint srcelem,
611  const OBJ_ID &obj_id,
612  const SEC_ID &sec_id,
613  VEX_GeoMode mode,
614  VEXmat3<PREC> data);
615  void appendEdit(exint srcelem,
616  const OBJ_ID &obj_id,
617  const SEC_ID &sec_id,
618  VEX_GeoMode mode,
619  VEXmat4<PREC> data);
620  void appendEdit(exint srcelem,
621  const OBJ_ID &obj_id,
622  const SEC_ID &sec_id,
623  VEX_GeoMode mode,
624  const char *data);
625  void appendEdit(exint srcelem,
626  const OBJ_ID &obj_id,
627  const SEC_ID &sec_id,
628  VEX_GeoMode mode,
629  UT_OptionsHolder dict);
630  void appendEdit(exint srcelem,
631  const OBJ_ID &obj_id,
632  const SEC_ID &sec_id,
633  VEX_GeoMode mode,
634  const UT_Array<VEXfloat<PREC>> *data);
635  void appendEdit(exint srcelem,
636  const OBJ_ID &obj_id,
637  const SEC_ID &sec_id,
638  VEX_GeoMode mode,
639  const UT_Array<VEXvec2<PREC>> *data);
640  void appendEdit(exint srcelem,
641  const OBJ_ID &obj_id,
642  const SEC_ID &sec_id,
643  VEX_GeoMode mode,
644  const UT_Array<VEXvec3<PREC>> *data);
645  void appendEdit(exint srcelem,
646  const OBJ_ID &obj_id,
647  const SEC_ID &sec_id,
648  VEX_GeoMode mode,
649  const UT_Array<VEXvec4<PREC>> *data);
650  void appendEdit(exint srcelem,
651  const OBJ_ID &obj_id,
652  const SEC_ID &sec_id,
653  VEX_GeoMode mode,
654  const UT_Array<VEXmat2<PREC>> *data);
655  void appendEdit(exint srcelem,
656  const OBJ_ID &obj_id,
657  const SEC_ID &sec_id,
658  VEX_GeoMode mode,
659  const UT_Array<VEXmat3<PREC>> *data);
660  void appendEdit(exint srcelem,
661  const OBJ_ID &obj_id,
662  const SEC_ID &sec_id,
663  VEX_GeoMode mode,
664  const UT_Array<VEXmat4<PREC>> *data);
665  void appendEdit(exint srcelem,
666  const OBJ_ID &obj_id,
667  const SEC_ID &sec_id,
668  VEX_GeoMode mode,
669  const UT_Array<VEXint<PREC>> *data);
670  void appendEdit(exint srcelem,
671  const OBJ_ID &obj_id,
672  const SEC_ID &sec_id,
673  VEX_GeoMode mode,
674  const UT_Array<const char *> *data);
675  void appendEdit(exint srcelem,
676  const OBJ_ID &obj_id,
677  const SEC_ID &sec_id,
678  VEX_GeoMode mode,
679  const UT_Array<UT_OptionsHolder> *data);
680 
681 
682  // This may steal the command list from the source!
683  void merge(VEX_AttribEdit &src);
684 
685  void sort();
686 
687  void clear();
688 
689  // These convert our command list to the specified type.
690  //
691  // If the stored VEX_Type matches the return type, the result will be
692  // valid. Otherwise nullptr is returned.
693 
694  // Functions:
695  // fCmd, iCmd, v2Cmd, v3Cmd, v4Cmd, m2Cmd, m3Cmd, m4Cmd, sCmd, dCmd
696  // afCmd, aiCmd, av2Cmd, av3Cmd, av4Cmd, am2Cmd, am3Cmd, am4Cmd, asCmd, adCmd
697 #define VEX_GEOATTRIBEDIT_CASE(vtype, type, name, isarray) \
698  UT_Array<VEX_DataCommandAttribEdit<PREC, OBJ_ID, SEC_ID, type>> * \
699  name##Cmd() \
700  {\
701  if (myType == vtype && myIsArray == isarray)\
702  return (UT_Array<VEX_DataCommandAttribEdit<PREC, OBJ_ID, SEC_ID, type>>*) myCmdList;\
703  return nullptr;\
704  }
705 #define VEX_GEOATTRIBEDIT_CASE_DIRECT(ty, name) \
706  VEX_GEOATTRIBEDIT_CASE(VEX_VexTypeResolver<VEX##ty<PREC>>::type,VEX##ty<PREC>,name,false)
707 #define VEX_GEOATTRIBEDIT_CASE_ARRAY(ty, name) \
708  VEX_GEOATTRIBEDIT_CASE(VEX_VexTypeResolver<VEX##ty<PREC>>::type,const UT_Array<VEX##ty<PREC>>*,name,true)
709 
718 
719  VEX_GEOATTRIBEDIT_CASE(VEX_TYPE_STRING, const char*, s, false)
721 
730 
731  VEX_GEOATTRIBEDIT_CASE(VEX_TYPE_STRING, const UT_Array<const char*>*, as, true)
732  VEX_GEOATTRIBEDIT_CASE(VEX_TYPE_DICT, const UT_Array<UT_OptionsHolder>*, ad, true)
733 
734 #undef VEX_GEOATTRIBEDIT_CASE_ARRAY
735 #undef VEX_GEOATTRIBEDIT_CASE_DIRECT
736 #undef VEX_GEOATTRIBEDIT_CASE
737 
738  VEX_GeoDictType dict() const { return myDict; }
739  const UT_StringHolder &name() const { return myName; }
740  VEX_Type type() const { return myType; }
741  bool isArray() const { return myIsArray; }
742  bool shouldcreate() const { return myDoCreate; }
743  VEX_GeoTypeInfo typeinfo() const { return myTypeInfo; }
744  const DefaultValue &defaultValue() const { return myDefValue; }
745 
746  // The path component is only used by USD edits, to hold the primitive or
747  // property path so that we can sort the edits and apply them in the order
748  // of the scene graph hierarchy.
749  const UT_StringHolder &path() const { return myPath; }
750 
751 protected:
752  // The earliest proc that refered to us.
758  bool myIsArray;
759  // The proc that set the typeinfo.
760  // Because we are logically overwriting, it makes sense for this
761  // to be the last person to set it!
764 
765  void *myCmdList;
766  // The proc that marked us for creation
769  DefaultValue myDefValue;
770 };
771 
773 {
774 public:
777  };
779  const UT_StringRef &path,
780  const UT_StringRef &name,
782  : myDict(dict),
783  myPath(UTmakeUnsafeRef(path)),
784  myName(UTmakeUnsafeRef(name))
785  { }
787  const UT_StringHolder &path,
788  const UT_StringHolder &name)
789  : myDict(dict),
790  myPath(path),
791  myName(name)
792  { }
793 
794  bool operator==(const VEX_AttribEditId &other) const
795  {
796  return myDict == other.myDict &&
797  myPath == other.myPath &&
798  myName == other.myName;
799  }
800 
804 };
805 VEX_API std::size_t hash_value(const VEX_AttribEditId &id);
807 
808 template <VEX_Precision PREC>
810 template <VEX_Precision PREC>
812 
813 template <VEX_Precision PREC>
815 {
816 public:
818  exint srcelem,
819  VEXint<PREC> ptnum0, VEXint<PREC> ptnum1,
820  VEXint<PREC> data)
821  : VEX_GeoCommand(srcelem)
822  , myPtNum0(ptnum0)
823  , myPtNum1(ptnum1)
824  , myData(data)
825  {
826  }
828  : VEX_GeoCommand(), myPtNum0(-1) , myPtNum1(-1), myData(-1)
829  {}
830 
831  VEXint<PREC> ptNum0() const { return myPtNum0; }
832  VEXint<PREC> ptNum1() const { return myPtNum1; }
833  VEXint<PREC> data() const { return myData; }
834 
835 protected:
836  VEXint<PREC> myPtNum0;
837  VEXint<PREC> myPtNum1;
838  VEXint<PREC> myData;
839 };
840 
841 template <VEX_Precision PREC>
843 {
844 public:
845  VEX_GeoEdgeGroupEdit(const UT_StringHolder &groupname): myGroupName(groupname) {}
846 
847  const UT_StringHolder &groupName() const { return myGroupName; }
848 
849  const UT_Array<VEX_GeoCommandEdgeGroupEdit<PREC>> &cmd() const { return myCmdList; }
850 
851  void appendEdit(exint srcelem,
852  VEXint<PREC> ptnum0,
853  VEXint<PREC> ptnum1,
854  VEXint<PREC> data);
855 
856  void merge(VEX_GeoEdgeGroupEdit &src);
857 
858  void sort();
859 
860 protected:
863 };
864 
865 template <VEX_Precision PREC>
867 {
868 public:
872 
873  // Converts the given string to one in our string table, ensuring
874  // the pointer remains valid and avoids duplication.
875  const char *hardenString(const char *str);
876 
877  // Creates a new array which is owned by this queue. Does
878  // not de-duplicate, but will return 0 for empty lists.
879  const UT_Array<VEXfloat<PREC>> *hardenArray(const UT_Array<VEXfloat<PREC>> &arr);
880  const UT_Array<VEXvec2<PREC>> *hardenArray(const UT_Array<VEXvec2<PREC>> &arr);
881  const UT_Array<VEXvec3<PREC>> *hardenArray(const UT_Array<VEXvec3<PREC>> &arr);
882  const UT_Array<VEXvec4<PREC>> *hardenArray(const UT_Array<VEXvec4<PREC>> &arr);
883  const UT_Array<VEXmat2<PREC>> *hardenArray(const UT_Array<VEXmat2<PREC>> &arr);
884  const UT_Array<VEXmat3<PREC>> *hardenArray(const UT_Array<VEXmat3<PREC>> &arr);
885  const UT_Array<VEXmat4<PREC>> *hardenArray(const UT_Array<VEXmat4<PREC>> &arr);
886  const UT_Array<VEXint<PREC>> *hardenArray(const UT_Array<VEXint<PREC>> &arr);
887  // ALSO hardens the contents:
888  const UT_Array<const char *> *hardenArray(const UT_Array<const char *> &arr);
889 
890  const UT_Array<UT_OptionsHolder> *hardenArray(const UT_Array<UT_OptionsHolder> &arr);
891 
892  // Merges the src into us. Note that the result may still
893  // reference strings in the stringtable of src, so src must *not*
894  // be deleted until the queue is processed!
895  // This also may destroy src in the merging if stealing is more
896  // efficient.
897  void merge(VEX_GeoCommandQueue &src);
898  // Ensure our commands are in srcelem order.
899  void sort();
900 
901  bool isEmpty() const
902  {
903  return myPointAdd.isEmpty() &&
904  myPrimAdd.isEmpty() &&
905  myVertexAdd.isEmpty() &&
906  myVertexRewire.isEmpty() &&
907  myAttribEdit.isEmpty() &&
908  myUsdEdit.isEmpty() &&
909  myEdgeGroupEdit.isEmpty() &&
910  myAgentChannelEdit.isEmpty() &&
911  myAgentXformEdit.isEmpty() &&
912  myAgentClipEdit.isEmpty() &&
913  myAgentLayerEdit.isEmpty() &&
914  myAgentAddClip.isEmpty() &&
915  myPrimChannelEdit.isEmpty() &&
916  myPointRemove.isEmpty() &&
917  myPointWithPrimRemove.isEmpty() &&
918  myPrimRemove.isEmpty() &&
919  myPrimWithPointRemove.isEmpty() &&
920  myVertexRemove.isEmpty() &&
921  myLocalVariables.empty() &&
922  !myNewVisualizers &&
923  !myAttribRemoval[(int)VEX_GeoDictType::DETAIL] &&
924  !myAttribRemoval[(int)VEX_GeoDictType::PRIM] &&
925  !myAttribRemoval[(int)VEX_GeoDictType::PRIMGROUP] &&
926  !myAttribRemoval[(int)VEX_GeoDictType::POINT] &&
927  !myAttribRemoval[(int)VEX_GeoDictType::POINTGROUP] &&
928  !myAttribRemoval[(int)VEX_GeoDictType::VERTEX] &&
929  !myAttribRemoval[(int)VEX_GeoDictType::VERTEXGROUP] &&
930  !myAttribRemoval[(int)VEX_GeoDictType::EDGEGROUP]
931  ;
932  }
933 
934  // These return the new element number *relative* to the srcelem!
935  VEXint<PREC> addPrim(exint srcelem, VEX_GeoPrimType primtype);
936  VEXint<PREC> addPoint(exint srcelem, VEXvec3<PREC> pos);
937  VEXint<PREC> addPoint(exint srcelem, VEXint<PREC> srcpt);
938  VEXint<PREC> addVertex(exint srcelem, VEXint<PREC> primnum,
939  VEXint<PREC> ptnum);
940 
941  void setEdgeGroup(
942  exint srcelem,
943  const UT_StringHolder &groupname,
944  VEXint<PREC> ptnum0, VEXint<PREC> ptnum1,
945  VEXint<PREC> data);
946 
947  void addLocalVariable(exint srcelem, const char *attrib, const char *local);
948  void addVisualizer(const UT_StringHolder &visualizer);
949 
950  // If the given primnum is -1, it will treat vtxidx as a linear vertex
951  void rewireVertex( exint srcelem, VEXint<PREC> primum,
952  VEXint<PREC> vtxidx, VEXint<PREC> ptnum);
953 
954  void removeAttrib(VEX_GeoDictType owner, const UT_StringHolder &name);
955  void removePoint(exint srcelem, VEXint<PREC> ptnum, bool includeprims);
956  void removePrim(exint srcelem, VEXint<PREC> primnum, bool includepoints);
957  void removeVertex(exint srcelem, VEXint<PREC> primnum);
958 
959  void setAgentChannelValue(exint srcelem, VEXint<PREC> primnum,
960  VEXfloat<PREC> value,
961  VEXint<PREC> channelidx);
962 
963  void setAgentTransform(exint srcelem, VEXint<PREC> primnum,
964  const VEXmat4<PREC> &xform, VEXint<PREC> xformidx,
965  bool worldspace);
966 
967  void setAgentTransforms(exint srcelem, VEXint<PREC> primnum,
968  const UT_Array<VEXmat4<PREC>> &xforms,
969  bool worldspace);
970 
971  void setAgentClips(exint srcelem, VEXint<PREC> primnum,
972  const UT_Array<VEXint<PREC>> &clipids,
973  const UT_Array<VEXfloat<PREC>> &cliptimes,
974  const UT_Array<VEXfloat<PREC>> &clipweights,
975  const UT_Array<VEXint<PREC>> &clipxformgroupids,
976  const UT_Array<VEXint<PREC>> &cliplayerids,
977  const UT_Array<VEXint<PREC>> &cliplayermodes,
978  const UT_Array<VEXfloat<PREC>> &cliplayerweights,
979  const UT_Array<VEXint<PREC>> &cliplayerparents);
980 
981  void setAgentLayers(exint srcelem, VEXint<PREC> primnum,
982  const UT_Array<VEXint<PREC>> &layer_ids,
983  bool is_collision);
984 
985  void agentAddClip(
986  exint srcelem,
987  VEXint<PREC> primnum,
988  const UT_StringHolder &clip_name,
989  const UT_StringHolder &clip,
990  const bool keep_ref);
991 
992  void primChannelInsertKey(exint srcelem,
993  VEXint<PREC> primnum,
994  float time);
995 
996  void primChannelDestroyKey(exint srcelem,
997  VEXint<PREC> primnum,
998  float time);
999 
1000  void primChannelClear(exint srcelem, VEXint<PREC> primnum);
1001 
1002  void primChannelSetKeyValue(exint srcelem, VEXint<PREC> primnum,
1003  float time, float value,
1005 
1006  void primChannelSetKeySlope(exint srcelem, VEXint<PREC> primnum,
1007  float time, float slope,
1009 
1010  void primChannelSetKeyAccel(exint srcelem, VEXint<PREC> primnum,
1011  float time, float accel,
1013 
1015  const UT_StringRef &name);
1016  VEX_GeoAttribEdit<PREC> *findOrCreateEdit(VEX_GeoDictType dict,
1017  const UT_StringRef &name);
1018 
1019  // Finds a list of VEX edits to the given primitive (or property) path and
1020  // name (could be a property or metadata item). We need to store the path
1021  // as well as the name for USD edits so that we apply the edits walking
1022  // down the scene graph hierarchy. This ensures that edits to attribs on
1023  // a prim will occur after the prim has been created, or edits to metadata
1024  // on a property will occur after the property has been created.
1025  VEX_UsdEdit<PREC> *findOrCreateUsdEdit(VEX_GeoDictType dict,
1026  const UT_StringRef &path,
1027  const UT_StringRef &name);
1028 
1029  /// NOTE: This should not be its own type, this should be embedded
1030  /// in findEdit using the proper VEX_GeoDictType!
1031  VEX_GeoEdgeGroupEdit<PREC> *findOrCreateEdgeGroupEdit(
1032  const UT_StringHolder &groupname);
1033 
1034  // Creators
1038  // Requested local variables.
1040  {
1042  const char *local; // hardened!
1043  };
1045 
1048 
1049  // Edits
1061 
1063 
1064  // Destructors
1065  // Note we don't have to sort these. We do need to track
1066  // the source element to be able to lookup the relevant point
1067  // or primitive number, however.
1073 
1074  typedef UT_PageArray<
1075  /* DATA_T */ VEXint<PREC>,
1076  /* TSIZE */ 1,
1077  /* TABLEHARDENED (owns its data) */ true,
1078  /* PAGESHARDENED */ false,
1079  /* THEPAGEBITS (2^10 tuples/page) */ 10,
1080  /* INDEX_T */ exint
1085 
1086  exint myNumPrim, myNumPoint, myNumVertex;
1087 
1088 private:
1089  UT_SharedString *myStrings;
1090  UT_Array< UT_Array<VEXint<PREC>> *> myIntArrays;
1091  UT_Array< UT_Array<VEXfloat<PREC>> *> myFloatArrays;
1092  UT_Array< UT_Array<VEXvec2<PREC>> *> myV2Arrays;
1093  UT_Array< UT_Array<VEXvec3<PREC>> *> myV3Arrays;
1094  UT_Array< UT_Array<VEXvec4<PREC>> *> myV4Arrays;
1095  UT_Array< UT_Array<VEXmat2<PREC>> *> myM2Arrays;
1096  UT_Array< UT_Array<VEXmat3<PREC>> *> myM3Arrays;
1097  UT_Array< UT_Array<VEXmat4<PREC>> *> myM4Arrays;
1098  UT_Array< UT_Array<const char *> *> myCstArrays;
1099  UT_Array< UT_Array<UT_OptionsHolder> *> myDictArrays;
1100 };
1101 
1107 
1113 
1114 #endif
exint elem() const
VEX_GeoCommandAgentAddClip(exint srcelem, VEXint< PREC > primnum, const UT_StringHolder &clip_name, const UT_StringHolder &clip_path, bool keep_ref)
VEX_Type
VEX variable types.
Definition: VEX_VexTypes.h:18
UT_Array< VEX_GeoCommandPrimAdd< PREC > > myPrimAdd
GLint first
Definition: glcorearb.h:405
const UT_Array< VEXfloat< PREC > > & clipweights() const
#define VEX_GEOATTRIBEDIT_CASE_ARRAY(ty, name)
typedef int(APIENTRYP RE_PFNGLXSWAPINTERVALSGIPROC)(int)
VEX_GeoCommandAgentClipEdit(exint srcelem, VEXint< PREC > primnum, const UT_Array< VEXint< PREC >> &clipids, const UT_Array< VEXfloat< PREC >> &cliptimes, const UT_Array< VEXfloat< PREC >> &clipweights, const UT_Array< VEXint< PREC >> &clipxformgroupids, const UT_Array< VEXint< PREC >> &cliplayerids, const UT_Array< VEXint< PREC >> &cliplayermodes, const UT_Array< VEXfloat< PREC >> &cliplayerweights, const UT_Array< VEXint< PREC >> &cliplayerparents)
UT_Array< VEX_GeoCommandAgentXformEdit< PREC > > myAgentXformEdit
const char * local
void set(VEXmat3< PREC > v)
int int32
Definition: SYS_Types.h:39
VEXint< PREC > primnum() const
VEX_GeoCommandAgentXformEdit(exint srcelem, VEXint< PREC > primnum, const UT_Array< VEXmat4< PREC >> &xforms, bool worldspace)
UT_StringMap< VariableEntry > myLocalVariables
UT_Array< VEX_GeoEdgeGroupEdit< PREC > * > myEdgeGroupEdit
const UT_Array< VEXint< PREC > > & cliplayerids() const
VEX_GeoCommandAgentLayerEdit(exint srcelem, VEXint< PREC > primnum, const UT_Array< VEXint< PREC >> &layer_ids, bool is_collision)
GA_API const UT_StringHolder accel
UT_StringHolder myName
imath_half_bits_t half
if we're in a C-only context, alias the half bits type to half
Definition: half.h:268
void set(VEXint< PREC > v)
void
Definition: png.h:1083
const SEC_ID & secID() const
UT_PageArray< VEXint< PREC >, 1, true, false, 10, exint > BlockArray
GT_API const UT_StringHolder time
const OBJ_ID & objID() const
const GLdouble * v
Definition: glcorearb.h:837
std::pair< VEXmat4< PREC >, VEXint< PREC > > SingleEdit
GLsizei const GLfloat * value
Definition: glcorearb.h:824
VEXint< PREC > primnum() const
VEX_Type type() const
VEXint< PREC > primnum() const
GLsizei const GLchar *const * path
Definition: glcorearb.h:3341
VEX_GeoEdgeGroupEdit(const UT_StringHolder &groupname)
UT_Array< VEX_GeoCommandEdgeGroupEdit< PREC > > myCmdList
UT_StringSet * myNewVisualizers
UT_Array< VEXint< PREC > > myClipXformGroupIds
int64 exint
Definition: SYS_Types.h:125
constexpr VEX_Precision VEX_64
Definition: VEX_PodTypes.h:31
std::variant< SingleEdit, FullEdit > myData
UT_Array< VEXfloat< PREC > > myClipTimes
VEX_API VEX_GeoPrimType typeFromString(const char *)
GLdouble s
Definition: glad.h:3009
UT_Array< VEXint< PREC > > myClipLayerIds
VEX_GeoCommandPrimAdd(exint srcelem, VEX_GeoPrimType primtype)
VEXint< PREC > ptnum() const
VEX_GeoCommandPointAdd(exint srcelem, VEXint< PREC > srcpt)
UT_Array< VEX_GeoCommandAgentChannelEdit< PREC > > myAgentChannelEdit
PUGI__FN void sort(I begin, I end, const Pred &pred)
Definition: pugixml.cpp:7550
#define VEX_GEOATTRIBEDIT_CASE_DIRECT(ty, name)
const UT_StringHolder & name() const
GLfloat GLfloat GLfloat v2
Definition: glcorearb.h:818
#define VEX_API
Definition: VEX_API.h:14
const UT_StringHolder & groupName() const
VEX_GeoDictType dict() const
GLfloat GLfloat GLfloat GLfloat v3
Definition: glcorearb.h:819
VEX_GeoCommandAgentChannelEdit(exint srcelem, VEXint< PREC > primnum, const VEXfloat< PREC > &value, VEXint< PREC > channelidx)
typename VEX_PrecisionResolver< P >::vec3_type VEXvec3
Definition: VEX_PodTypes.h:70
exint elem
VEX_GeoTypeInfo typeinfo() const
UT_Array< VEX_GeoCommandObjectRemove< PREC > > myPrimRemove
VEXint< PREC > primnum() const
#define VEX_GEOATTRIBEDIT_CASE(vtype, type, name, isarray)
void set(VEXmat4< PREC > v)
VEXint< PREC > data() const
UT_Array< VEXmat4< PREC > > FullEdit
UT_Array< VEXint< PREC > > myClipLayerParents
bool isEmpty() const
VEX_GeoDictType
UT_Array< VEX_UsdEdit< PREC > * > myUsdEdit
VEX_AttribEditIndexMap myUsdEditIndexMap
UT_Array< VEX_GeoCommandAgentClipEdit< PREC > > myAgentClipEdit
void set(VEXfloat< PREC > v)
VEX_GeoCommandEdgeGroupEdit(exint srcelem, VEXint< PREC > ptnum0, VEXint< PREC > ptnum1, VEXint< PREC > data)
VEX_GeoTypeInfo
GLfloat f
Definition: glcorearb.h:1926
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glcorearb.h:108
VEXint< PREC > xformidx() const
UT_StringHolder myGroupName
const UT_Array< VEX_GeoCommandEdgeGroupEdit< PREC > > & cmd() const
VEXfloat< PREC > value() const
DefaultValue myDefValue
VEX_GeoCommand(exint srcelem)
bool shouldcreate() const
UT_StringHolder myPath
VEX_GeoCommandAgentXformEdit(exint srcelem, VEXint< PREC > primnum, const VEXmat4< PREC > &xform, VEXint< PREC > xformidx, bool worldspace)
VEX_GeoCommandObjectRemove(exint srcelem, VEXint< PREC > obj_id)
VEXint< PREC > primnum() const
typename VEX_PrecisionResolver< P >::float_type VEXfloat
Definition: VEX_PodTypes.h:67
void set(VEXmat2< PREC > v)
VEX_GeoMode
SYS_FORCE_INLINE const UT_StringHolder & UTmakeUnsafeRef(const UT_StringRef &ref)
Convert a UT_StringRef into a UT_StringHolder that is a shallow reference.
#define SYS_FORCE_INLINE
Definition: SYS_Inline.h:45
VEXint< PREC > primnum() const
#define UT_NON_COPYABLE(CLASS)
Define deleted copy constructor and assignment operator inside a class.
VEXint< PREC > myPrimNum
VEX_GeoDictType myDict
UT_Array< VEX_GeoCommandPrimChannelEdit< PREC > > myPrimChannelEdit
UT_Array< VEX_GeoCommandPointAdd< PREC > > myPointAdd
long long int64
Definition: SYS_Types.h:116
VEX_AttribEditIndexMap myAttribEditIndexMap
VEXint< PREC > srcpt() const
UT_Array< VEXint< PREC > > myClipIds
VEX_GeoPrimType myType
constexpr VEX_Precision VEX_32
Definition: VEX_PodTypes.h:30
typename VEX_PrecisionResolver< P >::mat4_type VEXmat4
Definition: VEX_PodTypes.h:74
const VEXmat4< PREC > & xform() const
GLuint const GLchar * name
Definition: glcorearb.h:786
VEX_API std::size_t hash_value(const VEX_AttribEditId &id)
const UT_Array< VEXint< PREC > > & clipxformgroupids() const
VEXint< PREC > ptNum0() const
VEX_GeoCommandPrimChannelEdit(exint srcelem, VEXint< PREC > primnum, VEX_GeoPrimChannelOperation operation, float time=0.0, float value=0.0, VEX_GeoPrimChannelKeyHalf half=VEX_GeoPrimChannelKeyHalf::InOut)
void set(VEXvec2< PREC > v)
VEX_GeoPrimChannelKeyHalf
VEXint< PREC > ptNum1() const
const UT_Array< VEXint< PREC > > & layerIds() const
UT_Array< VEX_GeoCommandObjectRemove< PREC > > myVertexRemove
const UT_Array< VEXint< PREC > > & cliplayermodes() const
GLenum mode
Definition: glcorearb.h:99
VEX_DataCommandAttribEdit(exint srcelem, const OBJ_ID &obj_id, const SEC_ID &sec_id, VEX_GeoMode mode, T data)
VEX_EXTERN_TEMPLATE(VEX_AttribEdit< VEX_32, VEXint< VEX_32 >, VEXint< VEX_32 >>)
VEX_API VEX_GeoMode modeFromString(const char *)
typename VEX_PrecisionResolver< P >::mat2_type VEXmat2
Definition: VEX_PodTypes.h:72
VEXint< PREC > primnum() const
UT_StringHolder myName
VEX_GeoTypeInfo myTypeInfo
typename VEX_PrecisionResolver< P >::vec2_type VEXvec2
Definition: VEX_PodTypes.h:69
VEX_GeoCommandPointAdd(exint srcelem, VEXvec3< PREC > pos)
VEX_AttribEditId(VEX_GeoDictType dict, const UT_StringRef &path, const UT_StringRef &name, UseUnsafeStringsType)
const UT_Array< VEXfloat< PREC > > & cliplayerweights() const
VEXint< PREC > ptnum() const
UT_Array< VEX_GeoCommandVertexAdd< PREC > > myVertexAdd
UT_Array< VEXint< PREC > > myClipLayerModes
UT_Array< VEXfloat< PREC > > myClipLayerWeights
const UT_Array< VEXmat4< PREC > > & xforms() const
bool operator==(const VEX_AttribEditId &other) const
UT_Array< VEX_GeoCommandObjectRemove< PREC > > myPointWithPrimRemove
VEXvec3< PREC > myPos
VEX_GeoPrimType type() const
UT_Array< VEX_GeoCommandVertexRewire< PREC > > myVertexRewire
VEX_AttribEditId(VEX_GeoDictType dict, const UT_StringHolder &path, const UT_StringHolder &name)
VEXint< PREC > mySrcPt
UT_Array< VEX_GeoCommandObjectRemove< PREC > > myPrimWithPointRemove
typename VEX_PrecisionResolver< P >::vec4_type VEXvec4
Definition: VEX_PodTypes.h:71
UT_StringHolder myPath
GU_API void xform(CE_Context &context, bool recompile, int npts, const cl::Buffer &outPos, const cl::Buffer &inPos, const cl::Buffer &surfacexform, const cl::Buffer *grp=nullptr)
UT_Array< VEX_GeoCommandAgentLayerEdit< PREC > > myAgentLayerEdit
VEXint< PREC > channelIdx() const
UT_Array< VEXfloat< PREC > > myClipWeights
typename VEX_PrecisionResolver< P >::int_type VEXint
Definition: VEX_PodTypes.h:68
VEXint< PREC > vtxidx() const
VEX_API VEX_GeoDictType dictFromString(const char *)
const UT_StringHolder & path() const
VEX_GeoCommandVertexAdd(exint srcelem, VEXint< PREC > primnum, VEXint< PREC > ptnum)
#define UT_ASSERT(ZZ)
Definition: UT_Assert.h:165
const UT_Array< VEXint< PREC > > & clipids() const
const VEXint< PREC > primnum() const
VEX_GeoPrimType
const UT_Array< VEXfloat< PREC > > & cliptimes() const
UT_Array< VEX_GeoCommandAgentAddClip< PREC > > myAgentAddClip
OutGridT XformOp bool bool MergePolicy merge
const DefaultValue & defaultValue() const
VEX_GeoPrimChannelKeyHalf myHalf
void set(VEXvec4< PREC > v)
bool isArray() const
const UT_Array< VEXint< PREC > > & cliplayerparents() const
VEX_GeoPrimChannelOperation
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER IMATH_HOSTDEVICE IMATH_CONSTEXPR14 T clip(const T &p, const Box< T > &box) IMATH_NOEXCEPT
Definition: ImathBoxAlgo.h:29
typename VEX_PrecisionResolver< P >::mat3_type VEXmat3
Definition: VEX_PodTypes.h:73
VEXvec3< PREC > pos() const
UT_Array< VEX_GeoAttribEdit< PREC > * > myAttribEdit
UT_Array< VEX_GeoCommandObjectRemove< PREC > > myPointRemove
VEX_GeoMode mode() const
VEX_GeoCommandAgentClipEdit & operator=(const VEX_GeoCommandAgentClipEdit &)=default
VEX_GeoCommandVertexRewire(exint srcelem, VEXint< PREC > primnum, VEXint< PREC > vtxidx, VEXint< PREC > newptnum)
VEX_GeoPrimChannelOperation myOperation
void set(VEXvec3< PREC > v)
Definition: format.h:1821
VEXint< PREC > objID() const
VEX_GeoDictType myDict
GLenum src
Definition: glcorearb.h:1793
VEX_API VEX_GeoTypeInfo typeinfoFromString(const char *)