HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
PI_OpHandleLink.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: PI_OpHandleLink.h (PI Library, C++)
7  *
8  * COMMENTS:
9  *
10  * PI base class.
11  */
12 
13 #ifndef __PI_OpHandleLink__
14 #define __PI_OpHandleLink__
15 
16 #include "PI_API.h"
17 #include <OP/OP_Value.h>
18 #include <PRM/PRM_ChanState.h>
19 #include <PRM/PRM_Value.h>
20 #include <CH/CH_ExprLanguage.h>
21 
22 #include <UT/UT_Color.h>
23 #include <UT/UT_Function.h>
24 #include <UT/UT_IntArray.h>
25 #include <UT/UT_String.h>
26 #include <UT/UT_StringArray.h>
27 #include <UT/UT_SymbolTable.h>
28 #include <UT/UT_UndoManager.h>
29 #include <UT/UT_ValArray.h>
30 #include <UT/UT_VectorTypes.h>
31 
32 #include <hboost/any.hpp>
33 #include <iosfwd>
34 
35 
36 #define PI_SETTING_SHOWOPPATH "showoppath"
37 #define PI_SETTING_COLOR "color"
38 #define PI_SETTING_OWNEROP "ownerop"
39 #define PI_SETTING_OWNEROPGROUP "owneropgroup"
40 
41 class OP_Node;
42 class OP_Operator;
43 class CMD_Args;
44 class PI_SettingList;
45 class PI_PITemplate;
46 
48 {
49 public:
52 
53  struct LateBinding
54  {
55  // Interface to define the protocol for implementing handle late bindings
56  LateBinding() = default;
57  virtual ~LateBinding() = default;
58 
59  // Called when a handle change has started
60  virtual void beginHandleChange(PI_OpHandleLink const* pi, void* ui_event)
61  {
62  }
63 
64  // Called when a handle change has ended
65  virtual void endHandleChange(PI_OpHandleLink const* pi, void* ui_event)
66  {
67  }
68 
69  // read/write parm values
70  // Called when a dynamic handle changes
71  virtual bool toStateValues(PI_OpHandleLink*, void* ui_event) = 0;
72 
73  // Called when a state node changes
74  // NOTE: Callers can use `values` to hand data directly
75  // to the handle's callback.
76  virtual bool toHandleValues(PI_OpHandleLink*, void* values) = 0;
77 
78  // data accessors
79  virtual int getParmValue(PI_OpHandleLink const* pi, int pindex, int &val, int d=0) const = 0;
80  virtual int getParmValue(PI_OpHandleLink const* pi, int pindex, fpreal &val, fpreal d) const = 0;
81  virtual int getParmValue(PI_OpHandleLink const* pi, int pindex, UT_String &val, UT_String d=0) const = 0;
82  virtual int setParmValue(PI_OpHandleLink const* pi, int pindex, fpreal value, bool setkey) = 0;
83  virtual int setParmValue(PI_OpHandleLink const* pi, int pindex, int value, bool setkey) = 0;
84  virtual int setParmValue(PI_OpHandleLink const* pi, int pindex, UT_StringRef const& value) = 0;
85 
86  // Return true if the parm id refers to an enabled parm. False otherwise.
87  virtual bool isParmEnabled(PI_OpHandleLink const* pi, int pindex) const = 0;
88  };
89 
90  PI_OpHandleLink(const PI_PITemplate &templ);
91  virtual ~PI_OpHandleLink();
92 
93  // Methods to link a handle's parameter with an op's parameter.
94  // Return 1 on success, 0 if parm name is invalid. op_type_name tells the
95  // type of operator. Do not call these methods from the class c-tor.
96  int linkOpParmToHandleParm(const char *op_type,
97  const char *handle_parm_name,
98  const char *op_parm_name);
99 
100  // Activate the underlying handle parm, typically used when dynamic handle
101  // binding is in effect (see PI_OpHandleLink::HandleBinding)
102  int activateHandleParm(int pindex);
103 
104  // Disable the underlying handle parm
105  void disableHandleParm(int pindex);
106 
107  virtual int attach(OP_Node &node);
108  virtual int detach(OP_Node &node);
109  virtual void detachAll();
110 
111  void attachForKeyframe(OP_Node &node);
112  void detachForKeyframe(OP_Node &node);
113  void detachAllForKeyframe();
114 
115  // Hide all handle parameter parts except for the ones from handle_parms
116  // (starting from index `beg`).
117  void isolateHandleParms(int beg,
118  const UT_StringArray& handle_parms);
119 
120  void setShowOpPath(bool onoff);
121  virtual bool getShowOpPath() const;
122 
123  // The root description is the description for the PI that is set
124  // in the binding. Then the name of the first attached operator may
125  // be appended by the buildDecription function (which calls
126  // the virtual descriptionChanged in case a subclass needs to do
127  // something in responds to a description change).
128  void setRootDescription(const char *description);
129  const char *getRootDescription() const;
130  void buildDescription();
131  const char *getDescription() const;
132  virtual void descriptionChanged(const char* old_description);
133 
134  // The time overrides are used by the Motion Path PI to manipulate other PIs
135  // to modify parm values at a given time instead of at the current time
136  // in the animation timeline.
137  void setIsTimeOverride(bool is_time_override);
138  void setTimeOverrideTime(fpreal t);
139 
140  bool getIsTimeOverride() const
141  { return myIsTimeOverride; }
143  { return myTimeOverrideTime; }
144 
145  // Does this PI allow saving/loading from the per-op and/or last settings
146  // tables? By default, it allows using both tables.
148  { return myAllowUsingPerOpSettingsTable; }
150  { return myAllowUsingLastSettingsTable; }
152  { return myAllowUsingOpTypeSettings; }
154  { return myAllowUsingLastVisibilitySetting; }
155 
156  // When saving settings for this PI to the last settings table, we
157  // often only want PI's of this type to use these settings when they're
158  // attached to a specific type of operator. For example, the "xform"
159  // PI can be attached to many different types of sops. However, we
160  // don't want the last "xform" settings for the "copy" sop to be used
161  // the next time we put down an "xform" sop. This method returns that
162  // type of operator, if there are any restrictions, or null if there are
163  // no restrictions. The PI must be attached to at least one op when
164  // this method is called. By default, it returns null if this PI is
165  // attached to more than one op, or the type of the op if it is attached
166  // to exactly one. This method will also always return null if the
167  // myAllowUsingOpTypeSettings flag is false.
168  OP_Operator *lastSettingsOperatorTypeRestriction() const;
169 
170  // Return the op to which we're attached, or nil if we're detached.
171  OP_Node *getOpNode(int opnum = 0) const;
172  int getNumOps() const;
173  OP_Node *getKeyframeOpNode(int opnum = 0) const;
174  int getKeyframeNumOps() const;
175 
176  // Find out if we contain this node:
177  int hasOpNode(const OP_Node &node) const;
178  int hasKeyframeOpNode(const OP_Node &node) const;
179  OP_Node *findOpNode(int op_type, const char *op_name) const;
180 
181  // Update ourselves (and our handles) based on our ops parm values.
182  // values: optional user-defined data to pass to python dynamic
183  // handles.
184  void doUpdateFromOpParms(void* values=nullptr);
185  virtual void forceUpdateFromOpParms(void* values=nullptr);
186  virtual void updateOpParms();
187 
188  // Respond to a parameter change in the op. Called from the above
189  // function.
190  virtual void handleOpNodeChange(OP_Node &node);
191  virtual void handleOpUIChange(OP_Node & /*node*/)
192  { }
193  virtual int wantsOpNodeChange(const OP_Node & /*node*/) const
194  { return 0; }
195  virtual bool flagOpNodeChangeNeeded(OP_Node & /*node*/)
196  { return false; }
197 
198  // The user can dynamically change the bindings from the textport.
199  // We need to refresh the current handle link in the viewports
200  // because it could be affected. Return 0 if this handle has no bindings
201  // left.
202  virtual int refreshBindings(int op_type, const char *op_name);
203 
204  // These id values are used by the linking mechanism to determine if
205  // the pi for a particular linked parm exists already or not.
206  void id(int i);
207  int id() const;
208 
209  bool hasLinkedParms() const
210  { return myParmNames.entries() > 0; }
211 
212  // Returns a list of all parms bound to this handle.
213  const UT_StringArray &linkedParmNames(int opnum) const
214  { return *myParmNames(opnum); }
215  // These virtuals are similar to the linked... functions below.
216  // The difference is that these versions are used by the Key
217  // functions above. By ovrriding these, subclasses can make the
218  // above functions work for OP parms that are not linked to
219  // PI parms.
220  virtual const UT_StringArray &allParmNames(int opnum) const
221  { return *myParmNames(opnum); }
222 
223  // This gets the index of the operator that is actually bound
224  // to the specified index. If none is bound, -1 is returned.
225  int getOpnumForHandleParmIndex(int idx) const;
226 
227  // Query or set the active color of the PI:
228  const UT_Color &getActiveColor() const;
229  virtual void setActiveColor(const UT_Color &c);
230 
231  // Set accessibility state of the binding
232  void setBindingState(const bool active);
233 
234  virtual int isEqual(const PI_OpHandleLink &pi) const;
235  virtual int setEqual(const PI_OpHandleLink &pi);
236 
237  // An ethereal handle link is one that is invisible by nature.
238  bool ethereal() const;
239  const PI_PITemplate &getTemplate() const;
240  PI_PITemplate &getTemplate();
241 
242  int writeOptions(std::ostream &os, const char *baseCommand);
243  int runBindCommand(CMD_Args &args);
244  int runUnbindCommand(CMD_Args &args);
245 
246  // Functions used to handle menu functionality
247  void editChannels(int append_channels, int opnum=-1);
248  void findKey(int direction, int opnum=-1);
249  void setKeys(int opnum = -1,
250  int pindex_start = -1,
251  int pined_stop = -1,
252  const char *undo_str = 0);
253  void removeKeys(int opnum=-1);
254  void deleteChannels(int opnum=-1);
255  void lockParms(int opnum=-1);
256  void revertToDefaults(int opnum=-1);
257  void revertToFactoryDefaults(int opnum=-1);
258  void overwriteDefaults(int opnum=-1);
259 
260  // Load or save the settings for this PI. If specific_to_op is true
261  // in saveSettings() then the PI's settings will be saved in the per-op
262  // settings table instead of the last settings table.
263  virtual void loadSettings(const PI_SettingList &settings);
264  virtual void saveSettings(PI_SettingList &settings,
265  bool specific_to_op) const;
266 
267  // Save the settings for this PI.
268  virtual void saveSettingsToAppropriateLocation();
269 
270  // Load the settings for this PI from the per-op or last setting table.
271  // The PI _must_ be attached to its nodes when this method is called.
272  void loadSettingsFromTables(bool okay_to_use_last_settings);
273 
274  // Remove any settings this PI may have stored from the per-op and
275  // last setting tables.
276  void removeSettingsFromTables();
277 
279  {
280  public:
281  int myIndex;
283  };
284 
285  // This extracts the projection associated with this binding, if any,
286  // from the parmname. channel is set to the name of the channel
287  // which is bound.
288  static void extractProjection(UT_String &channel,
289  const char *parmname, fpreal &a, fpreal &b,
290  fpreal &c, fpreal &d);
291  static void extractChannelName(UT_String &channel,
292  const char *parmname)
293  {
294  fpreal dummy;
295  extractProjection(channel, parmname,
296  dummy, dummy,
297  dummy, dummy);
298  }
299 
300  void setLateBinding(LateBinding * binding);
301  bool hasLateBinding() const;
302  bool hasLateBinding(LateBinding const * binding) const;
303 
304  // Map a handle parm name to an index, or retrieve the index by the name.
305  // Indices must be non-negative. If the parm has not been mapped,
306  // findHandleParmIndex returns -1.
307  int findHandleParmIndex(const char *h_parm_name) const;
308 
309  // Allows the PI to react before being deleted.
310  virtual void onDeletion();
311 
312  // Returns the proxy pointer id that is used by other classes if they need
313  // to hold a pointer to an instance PI_OpHandleLink.
314  // (e.g. Use of BM_OpHandleLink by MPI_MotionPath)
315  int getProxyIndex() const { return myProxyIndex; }
316 
317  // Allow derived classes to detach and move a handle from its
318  // default position.
319  virtual bool handleDetach();
320  virtual bool handleIsDetached() const;
321  virtual bool handleIsDetachable() const;
322 
323  // Update the PI settings with a new set of setting values
324  void updateSettings(char const* setting_string);
325  virtual bool getSettingValue(char const* setting_name, hboost::any& out_value) const;
326 
327  // Call these methods to customize how their settings are saved.
329  { myAllowUsingPerOpSettingsTable = onoff; }
331  { myAllowUsingLastSettingsTable = onoff; }
333  { myAllowUsingOpTypeSettings = onoff; }
335  { myAllowUsingLastVisibilitySetting = onoff; }
336 
337  // Iterate over all parms
338  int iterateParms(int opnum, ReadParmFunc func) const;
339  int iterateParms(int opnum, ModifyParmFunc func, bool modify_locked=false);
340 
341  // Return the op parm name linked to pi_index
342  UT_StringHolder getOpParmName(int pindex) const;
343 
344  // Convenience method for descendants to get the current time.
345  virtual fpreal getTime() const;
346 
347  // Methods to get/set the op's parameter values. If the parameter has
348  // not been linked to an op parameter, these methods return 0. Otherwise,
349  // they return 1.
350  int getParmValue(int pindex, int &val, int d=0) const;
351  int getParmValue(int pindex, fpreal &val, fpreal d=0) const;
352  int getParmValue(int pindex, UT_String &val,
353  UT_String d=0) const;
354  int setParmValue(int pindex, int val, bool addkey=false);
355  int setParmValue(int pindex, fpreal val, bool addkey=false);
356  int setParmValue(int pindex, const UT_String &val,
357  CH_StringMeaning meaning);
358  int setOpParmValue(OP_Node *op, PRM_Parm *parm, int vecidx,
359  int val, bool addkey=false);
360  int setOpParmValue(OP_Node *op, PRM_Parm *parm, int vecidx,
361  fpreal val, bool addkey=false);
362  int setOpParmValue(OP_Node *op, PRM_Parm *parm, int vecidx,
363  const UT_String &val,
364  CH_StringMeaning meaning);
365 
366 protected:
367 
368  // Update ourselves (and our handles) based on our ops parm values.
369  virtual void updateFromOpParms();
370 
371  // Override this function to help decide which handles should be
372  // active when this PI is attached to an operator. This will be
373  // called if we successfully link to the given pindex.
374  //
375  // You should call the base class first and only proceed if it
376  // returns 1. I don't know the semantics of that - it's just how
377  // the old linkOpParm worked.
378  virtual int justLinked(int pindex);
379  virtual void justUnlinked(int pindex);
380 
381  virtual PI_Interest *getInputGroupInterests() const;
382 
383  // These methods add/remove interests in all of a PI's input group
384  // parameters. These methods are called when a node is attached or
385  // detached from the PI. They use the array of PI_Interests
386  // returned by getInputGroupInterests().
387  void addAllInputGroupInterests(int opnum);
388  void removeAllInputGroupInterests(int opnum);
389 
390  // Get the [pindex, pindex+3) parm values into a UT_Vector3R
391  void getParmVector3(int pindex, UT_Vector3R &v,
392  fpreal def = 0.0) const;
393 
394  int getParmInstValue(int pindex, const int *inst,
395  int &val, int d=0,
396  int nestlevel=1) const;
397  int getParmInstValue(int pindex, const int *inst,
398  fpreal &val, fpreal d=0,
399  int nestlevel=1) const;
400  int getParmInstValue(int pindex, const int *inst,
401  UT_String &val, UT_String d=0,
402  int nestlevel=1) const;
403  // Get the [pindex, pindex+3) parm values into a UT_Vector3R
404  void getParmInstVector3(int pindex, const int *inst,
405  UT_Vector3R &v,
406  fpreal def = 0.0) const;
407 
408  // Get the [pindex, pindex+3) parm values into a UT_Vector3R
409  void setParmVector3(int pindex, const UT_Vector3R &v);
410 
411  int setParmInstValue(int pindex, const int *inst,
412  int val, bool addkey=false,
413  int nestlevel=1);
414  int setParmInstValue(int pindex, const int *inst,
415  fpreal val, bool addkey=false,
416  int nestlevel=1);
417  int setParmInstValue(int pindex, const int *inst,
418  const UT_String &val,
419  CH_StringMeaning meaning,
420  int nestlevel=1);
421  void setParmInstVector3(int pindex, const int *inst,
422  const UT_Vector3R &v);
423 
424  int performParmCallback(int pindex, int theitem);
425 
426  // Methods to read or modify parm values given a pindex without adding keys
427  // Returns true if parm is read/modified, otherwise false
428  bool readParm(int pindex, ReadParmFunc f) const;
429  bool modifyParm(int pindex, ModifyParmFunc f, bool modify_locked=false);
430 
431  // copies the keyframe structure of pindex_from to pindex_dest, while
432  // leaving the value of pindex_dest constant.
433  void copyKeyStructure(int pindex_dest, int pindex_from);
434 
435  // returns true if the parameter is enabled (a la disableParms())
436  bool isParmEnabled(int pindex, int opnum = 0) const;
437 
438  // returns the parameter animation state.
439  PRM_ChanState getParmState(int pindex, int opnum = 0) const;
440 
441  // Functions to access the parameter index arrays.
442  int getLinkedParmCount() const
443  { return myParmNames.entries(); }
444 
445  // This function determines whether or not we should do an
446  // updateFromOpParms when the time changes.
447  // Returns true unless we have an input group interest, in which
448  // case the input group interest is enough to force the update,
449  // so we return false.
450  virtual int hasTimeInterest() const;
451  virtual void handleTimeChange();
452 
453  // These two functions are provided for all the PI based operations
454  // that need to manage an undo block that begins in one function
455  // but ends in another function (or another instance of the same
456  // function).
457  //
458  // However, they can only handle ONE block at a time. No nesting
459  // of calls to beginDistributedUndo!
460  void beginDistributedUndoBlock(const char *operation,
461  UT_UndoBlockType blocktype);
462  void endDistributedUndoBlock();
463 
464  // Returns true if we have called beginDistributedUndoBlock but have
465  // not yet called endDistributedUndoBlock; returns false otherwise.
466  bool inDistributedUndoBlock();
467 
468  // This virtual callback is called whenever one of our attached
469  // or attached-for-keyframe nodes is changed.
470  virtual void handleOpChange(OP_Node *op,
471  OP_EventType etype,
472  void *data);
473 
474  // Some functions for getting and setting our owner operator information.
475  // The owner operator is the operator that defines what space our handles
476  // should appear in and what SOP/group field we should be interested in.
477  virtual void setOwnerOp(const char *owner_op);
478  const UT_String &getOwnerOp() const;
479  OP_Node *getOwnerOpRelativeTo(OP_Node *node) const;
480  virtual void setOwnerOpGroup(const char *owner_op_group);
481  const UT_String &getOwnerOpGroup() const;
482 
483  // Return the channel name for our first input group interest.
484  const UT_StringHolder &getFirstInputGroupInterestName() const;
485 
486  // This helper function returns true if the parm channel_name is locked and
487  // false otherwise. This function will follow any channel references that
488  // this parm might have to determine the "true" locked status.
489  static bool isOpParmLocked(
490  const char *channel_name, OP_Node &op, fpreal time,
491  const PRM_Parm **ret_parm = NULL,
492  const OP_Node **ret_node = NULL);
493 
494  // Called by derived class to update the state values bind to a handle
495  void updateStateValues(void* ui_event);
496 
497  // Called when a handle change has started
498  void beginHandleChange(void* ui_event);
499 
500  // Called when a handle change has ended
501  void endHandleChange(void* ui_event);
502 
503  // Typically called from a derived class to allocate a proxy
504  void allocProxy(void* ptr);
505 
506  // Called from a derived class to free the PI proxy previously allocated
507  // with allocProxy().
508  void freeProxy();
509 
510  // Return the op parm label linked to pi_index
511  UT_StringHolder getOpParmLabel(int pi_index) const;
512 
513 private:
514  int linkOpParm(const char *op_type,
515  int pindex, const char *parmname);
516  void updateParmLockStatus( OP_Node &op );
517  UT_StringArray &opParmNames(const char *op_type);
518  void addParmNames(int opnum);
519  void removeParmNames(int opnum);
520 
521  void setKeysSingleOp(int opnum, int pindex = -1,
522  UT_String *names = NULL,
523  const char *name_prefix = NULL);
524  void removeKeysSingleOp(int opnum);
525  void deleteChannelsSingleOp(int opnum);
526  void lockParmsSingleOp(int opnum);
527  void revertToDefaultsSingleOp(int opnum);
528  void revertToFactoryDefaultsSingleOp(int opnum);
529  void overwriteDefaultsSingleOp(int opnum);
530 
531  // For a given pindex, add/remove interest's in the corresponding
532  // parameter's PRM_Value.
533  int addInputGroupInterest(int pindex,
534  PRM_ValueCallback callback,
535  int opnum);
536  int removeInputGroupInterest(int pindex,
537  PRM_ValueCallback callback,
538  int opnum);
539 
540  // Callback function to make sure we always know when one of our
541  // nodes is being deleted.
542  static void handleOpChangeCallback(OP_Node *op, void *callee,
543  OP_EventType etype, void *data);
544 
545  void clearOpTypeParmNamesMap();
546 
547  // used for updating handle values from a dynamic handle binding
548  // values: optional user-defined data for dynamic handles.
549  void updateHandleValues(void* values);
550 
551  PRM_Parm* getOpParmFromIndex(int pindex) const;
552 
553  const PI_PITemplate &myTemplate;
554  // This symbol table has as it's index the optype name, and as it's
555  // contents the cached UT_StringArrays which would correspond to that
556  // op's ParmNames.
557  UT_SymbolMap<UT_StringArray *> myOpTypeParmNames;
558 
559  // This is a translation from our PI parm index into the opnum.
560  UT_IntArray myOpnumForParmIndex;
561 
562  // This is indexed by the opnum and has the string array of op parms
563  // that correspond to that opnum. The index on the string array is
564  // the index into our PI parms.
565  UT_ValArray<UT_StringArray *> myParmNames;
566  UT_ValArray<OP_Node *> myOpNodes;
567  UT_ValArray<OP_Node *> myKeyframeOpNodes;
568  UT_StringArray myInputGroupInterests;
569  int myId;
570  const PI_Interest *myInterests;
571  UT_String myRootDescription;
572  UT_String myDescription;
573  UT_String myOwnerOp;
574  UT_String myOwnerOpGroup;
575 
576  UT_Color myActiveColor;
577 
578  int myDistributedUndoBlockLevel;
579  bool myAllowUsingPerOpSettingsTable;
580  bool myAllowUsingLastSettingsTable;
581  bool myAllowUsingOpTypeSettings;
582  bool myAllowUsingLastVisibilitySetting;
583  bool myShowOpPath;
584 
585  bool myIsTimeOverride;
586  fpreal myTimeOverrideTime;
587  LateBinding* myLateBinding;
588  int myProxyIndex;
589 };
590 
591 #endif
592 
PXL_API const char * getDescription(const ColorSpace *space)
Return the description of the color space.
CH_StringMeaning
GT_API const UT_StringHolder time
const GLdouble * v
Definition: glcorearb.h:837
IMF_EXPORT IMATH_NAMESPACE::V3f direction(const IMATH_NAMESPACE::Box2i &dataWindow, const IMATH_NAMESPACE::V2f &pixelPosition)
GLsizei const GLfloat * value
Definition: glcorearb.h:824
GLboolean GLboolean GLboolean GLboolean a
Definition: glcorearb.h:1222
#define PI_API
Definition: PI_API.h:10
GLfloat f
Definition: glcorearb.h:1926
bool any(const vbool4 &v)
Definition: simd.h:3600
PRM_ChanState
Definition: PRM_ChanState.h:14
UT_UndoBlockType
constexpr enabler dummy
An instance to use in EnableIf.
Definition: CLI11.h:985
GLuint id
Definition: glcorearb.h:655
std::function< T > UT_Function
Definition: UT_Function.h:37
GLboolean GLboolean GLboolean b
Definition: glcorearb.h:1222
void(* PRM_ValueCallback)(void *callee, void *value)
Definition: PRM_Value.h:22
that also have some descendant prim *whose name begins with which in turn has a child named baz where *the predicate active
GLdouble t
Definition: glad.h:2397
GLenum func
Definition: glcorearb.h:783
GLenum GLsizei GLsizei GLint * values
Definition: glcorearb.h:1602
__hostdev__ constexpr T pi()
Pi constant taken from Boost to match old behaviour.
Definition: NanoVDB.h:976
fpreal64 fpreal
Definition: SYS_Types.h:283
auto ptr(T p) -> const void *
Definition: format.h:4331
GLuint GLfloat * val
Definition: glcorearb.h:1608
OP_EventType
Definition: OP_Value.h:22
**If you just want to fire and args
Definition: thread.h:618
Definition: format.h:1821