HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HOM_Module.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  * COMMENTS:
7  * This class is not directly wrapped by swig. However, when creating
8  * the swig wrapper modules we wrap each of the methods of this class
9  * in functions in $SHC/HOM/HOM_TopLevel.h. This way, the methods of this
10  * class appear as the top-level parts of the hou module.
11  * Note that this also means SWIGOUT(%newobject fooMethod;) directives are
12  * not here but in HOM_TopLevel.h instead.
13  */
14 
15 #ifndef __HOM_Module_h__
16 #define __HOM_Module_h__
17 
18 #include "HOM_API.h"
19 #include "HOM_BinaryString.h"
20 #include "HOM_Defines.h"
21 #include "HOM_Errors.h"
22 #include "HOM_ElemPtr.h"
23 #include "HOM_EnumModules.h"
25 #include <UT/UT_Lock.h>
26 #include <UT/UT_NonCopyable.h>
27 #include <UT/UT_Notifier.h>
28 #include <UT/UT_TaskLock.h>
29 #include <UT/UT_Thread.h>
30 #include <UT/UT_UniquePtr.h>
31 #include <UT/UT_OptionEntry.h>
32 #include <SYS/SYS_Types.h>
33 #include <typeinfo>
34 #include <string>
35 #include <vector>
36 #include <map>
37 #include <hboost/any.hpp>
38 
39 class OP_Node;
40 class STORUI_OrboltURLHandler;
41 
43 class HOM_AgentClip;
45 class HOM_AgentLayer;
46 class HOM_AgentMetadata;
47 class HOM_AgentRig;
48 class HOM_AgentShape;
53 class HOM_ApexNode;
55 class HOM_ApexStickyNote;
57 class HOM_AttribDataId;
58 class HOM_anim;
59 class HOM_anonstats;
60 class HOM_audio;
62 class HOM_ChannelPrim;
63 class HOM_ChopNode;
64 class HOM_Clip;
65 class HOM_clone;
66 class HOM_Color;
67 class HOM_crowds;
69 class HOM_Drawable2D;
70 class HOM_SimpleDrawable;
71 class HOM_dop;
72 class HOM_DopData;
73 class HOM_DopSimulation;
74 class HOM_Edge;
75 class HOM_EnumValue;
79 class HOM_GadgetContext;
80 class HOM_GadgetDrawable;
81 class HOM_galleries;
82 class HOM_Geometry;
85 class HOM_GUDetailHandle;
86 class HOM_Handle;
87 class HOM_hda;
88 class HOM_HDADefinition;
89 class HOM_HDAModule;
90 class HOM_HDAOptions;
91 class HOM_hipFile;
92 class HOM_hmath;
93 class HOM_ik;
94 class HOM_ImageLayer;
97 class HOM_Keyframe;
99 class HOM_logging;
103 class HOM_lop;
109 class HOM_Matrix4;
111 class HOM_NanoVDB;
112 class HOM_NetworkBox;
113 class HOM_NetworkDot;
115 class HOM_Node;
116 class HOM_NodeBundle;
117 class HOM_NodeConnection;
118 class HOM_NodeType;
121 class HOM_PaneTab;
122 class HOM_Parm;
123 class HOM_ParmTemplate;
125 class HOM_ParmTuple;
126 class HOM_perfMon;
128 class HOM_pypanel;
129 class HOM_playbar;
131 class HOM_Point;
132 class HOM_Prim;
133 class HOM_properties;
134 class HOM_qt;
135 class HOM_Ramp;
137 class HOM_RedrawBlock;
138 #ifndef SWIG
140 #endif
141 class HOM_SceneViewer;
143 class HOM_Selection;
145 class HOM_shelves;
146 class HOM_StickyNote;
147 class HOM_StringKeyframe;
149 class HOM_styles;
150 class HOM_StyleSheet;
152 class HOM_takes;
153 class HOM_text;
154 class HOM_TextDrawable;
156 class HOM_ui;
157 class HOM_hotkeys;
158 class HOM_UIEvent;
159 class HOM_UIEventDevice;
160 class HOM_undos;
161 class HOM_Vector3;
162 class HOM_Vertex;
163 class HOM_VexContext;
164 class HOM_ViewerEvent;
166 class HOM_ViewerDragger;
172 class HOM_ViewerStateMenu;
176 
177 // See also OP_HOM_SESSION_MODULE_CPIO_NAME
178 #define HOM_SESSION_MODULE_NAME "hou.session"
179 
180 // Use this function to access the HOM module from C++ in Houdini. This
181 // is equivalent to writing "hou" in python. It will only throw an exception
182 // if the python module could not be imported, which should not happen.
183 class HOM_Module;
185 
187 {
188 public:
189  static void setHOMCreator(void (*homCreator)());
190 
191  virtual ~HOM_Module() {}
192 
193  virtual std::vector<std::string> _getArgumentAutoComplete(
194  const char *method_name, const char *arguments,
195  bool meta_info_only = false) = 0;
196 
197  // This method is called by the expression editor to force autocompletion
198  // to be relative to the node containing the expression. It is not
199  // wrapped by swig.
200  virtual void setRelativeNodeForAutoComplete(OP_Node *node) = 0;
201 
202  virtual HOM_ui& ui() = 0;
203  virtual HOM_qt& qt() = 0;
204  virtual HOM_hotkeys& hotkeys() = 0;
205  virtual HOM_audio& audio() = 0;
206  virtual bool isUIAvailable() = 0;
207  virtual bool _isExperimentalActive() = 0;
208  virtual bool _isCurrentThreadHoldingHOMLock() = 0;
209 
210  virtual HOM_galleries& galleries() = 0;
211  virtual HOM_hda& hda() = 0;
212  virtual HOM_hipFile& hipFile() = 0;
213  virtual HOM_perfMon& perfMon() = 0;
214  virtual HOM_playbar& playbar() = 0;
215  virtual HOM_pypanel& pypanel() = 0;
216  virtual HOM_hmath& hmath() = 0;
217  virtual HOM_dop& dop() = 0;
218  virtual HOM_properties& properties() = 0;
219  virtual HOM_shelves& shelves() = 0;
220  virtual HOM_styles& styles() = 0;
221  virtual HOM_takes& takes() = 0;
222  virtual HOM_undos& undos() = 0;
223  virtual HOM_viewportVisualizers& viewportVisualizers() = 0;
224  virtual HOM_anim& anim() = 0;
225  virtual HOM_anonstats& anonstats() = 0;
226  virtual HOM_clone& clone() = 0;
227  virtual HOM_crowds& crowds() = 0;
228  virtual HOM_ik& ik() = 0;
229  virtual HOM_logging& logging() = 0;
230  virtual HOM_lop& lop() = 0;
231  virtual HOM_text& text() = 0;
232 
233  virtual bool _assertWrapper(
234  const char *file, int linenum, const char *function,
235  const char *condition, const char *reason) = 0;
236 
237  virtual void exit(int exit_code=0, bool suppress_save_prompt=false) = 0;
238 
239  // isExiting() will return true if the program is actually Houdini (not
240  // mplay) and the UI queue is closed. This method is wrapped by swig, but
241  // only so houdiniInterpreter can call it.
242  virtual bool isExiting() = 0;
243 
244  virtual void addPreloadIcon(const char *name, int w, int h) = 0;
245  virtual void rasterizePreloadIcons() = 0;
246 
247  virtual std::string applicationName() = 0;
248  virtual std::vector<int> applicationVersion(bool include_patch=false) = 0;
249  virtual std::string applicationVersionString() = 0;
250  virtual std::string applicationCompilationDate() = 0;
251  virtual std::string applicationPlatformInfo() = 0;
252  virtual std::map<std::string, std::string> vdbVersionInfo() = 0;
253  virtual int hdkAPIVersion() = 0;
254  virtual HOM_EnumValue &licenseCategory() = 0;
255  virtual bool isApprentice() = 0;
256  virtual void releaseLicense() = 0;
257 
258  // Threading controls
259  virtual int maxThreads() = 0;
260  virtual void setMaxThreads(int max_threads) = 0;
261 
262  // These methods return a new HOM_Node object.
263  virtual HOM_Node* root() = 0;
264  virtual HOM_Node* pwd() = 0;
265  virtual HOM_Node* parent() = 0;
266 
267  virtual void setPwd(HOM_Node &newpwd) = 0;
268  virtual void cd(const char *path) = 0;
269 
270  // Calling phm() is a shortcut for calling pwd().hdaModule().
271  virtual HOM_HDAModule* phm() = 0;
272 
273  // This method returns a new HOM_DopNetNode object or None.
274  virtual HOM_Node* currentDopNet() = 0;
275  virtual void setCurrentDopNet(HOM_Node &dopnet) = 0;
276 
277  // Gets or sets the simulation enabled state.
278  virtual bool simulationEnabled() = 0;
279  virtual void setSimulationEnabled(bool enabled) = 0;
280 
281  // These methods return a new HOM_Node object or null if the node couldn't
282  // be found.
283  virtual HOM_Node *node(const char *path) = 0;
284  virtual HOM_NetworkMovableItem* item(const char *path) = 0;
285 
286  virtual std::vector<HOM_ElemPtr<HOM_Node> > nodes(const std::vector<std::string> &paths) = 0;
287  virtual std::vector<HOM_ElemPtr<HOM_NetworkMovableItem> > items(const std::vector<std::string> &paths) = 0;
288 
289  virtual HOM_Node *nodeBySessionId(int session_id) = 0;
290  virtual HOM_NetworkBox *networkBoxBySessionId(int session_id) = 0;
291  virtual HOM_StickyNote *stickyNoteBySessionId(int session_id) = 0;
292  virtual HOM_SubnetIndirectInput *subnetIndirectInputBySessionId(
293  int64 session_id) = 0;
294  virtual HOM_NetworkDot *networkDotBySessionId(int session_id) = 0;
295  virtual HOM_NetworkMovableItem *itemBySessionId(
296  HOM_EnumValue &item_type, int64 session_id) = 0;
297  virtual HOM_NodeConnection *nodeConnectionBySessionId(
298  int node_session_id, int input_index) = 0;
299 
300  // Functions for APEX nodes.
301  virtual HOM_ApexNode *createApexRootNode() = 0;
302  virtual HOM_ApexNode *apexNodeBySessionId(
303  int64 session_id) = 0;
304  virtual HOM_ApexNodeConnection *apexNodeConnectionBySessionId(
305  int64 session_id) = 0;
306  virtual HOM_ApexStickyNote *apexStickyNoteBySessionId(
307  int64 session_id) = 0;
308 
309  // Functions for configuring default colors on network elements.
310  virtual HOM_Color defaultColor(HOM_EnumValue &color_item) = 0;
311  virtual void setDefaultColor(HOM_EnumValue &color_item, HOM_Color *color) = 0;
312 
313  // Return HOM_Nodes for all selected nodes in the session.
314  virtual std::vector<HOM_ElemPtr<HOM_Node> > selectedNodes(
315  bool include_hidden = false) = 0;
316  virtual std::vector<HOM_ElemPtr<HOM_NetworkMovableItem> > selectedItems(
317  bool include_hidden = false) = 0;
318  virtual std::vector<HOM_ElemPtr<HOM_NodeConnection> > selectedConnections() = 0;
319  virtual void clearAllSelected() = 0;
320 
321  // Copy nodes to and paste from clipboard.
322  virtual void copyNodesToClipboard(const std::vector<HOM_Node *> &nodes) = 0;
323  virtual void pasteNodesFromClipboard(HOM_Node &destination_node) = 0;
324 
325  // These methods return new HOM_Parm/HOM_ParmTuple objects or null if the
326  // parm couldn't be found.
327  virtual HOM_Parm* parm(const char *path) = 0;
328  SWIGOUT(%ignore newParm;)
329  virtual HOM_Parm* newParm(OP_Node &node, int parm_index, int vector_index) = 0;
330  virtual HOM_ParmTuple* parmTuple(const char *path) = 0;
331  virtual HOM_Parm *evaluatingParm() = 0;
332 
333  // The next methods are not wrapped by swig, and are used
334  // by the HOM_ChannelList to manage geometry channel collections.
335  // These are necessary as the HOM_ChannelList does not have
336  // an implementation at the HOMF level, and cannot directly access
337  // Nodes, GU_Details or the MOT_GeometryChannelManager.
338 
339  // This method asks the MOT_GeometryChannelManager for a new
340  // geometry channel collection name, ensuring uniqueness.
341  SWIGOUT(%ignore reserveNewGeometryCollectionName;)
342  virtual UT_StringHolder reserveNewGeometryCollectionName() = 0;
343  // This method accesses the GU_Detail to get the names of geometry channels,
344  // so they can be stored in the HOM_ChannelList.
345  SWIGOUT(%ignore geometryChannelNames;)
346  virtual UT_StringArray geometryChannelNames(
348 
349  // Returns the path of a node from its unique id.
350  // Used by the HOM_ChannelList.
351  SWIGOUT(%ignore getNodePathFromNodeId;)
352  virtual UT_StringHolder getNodePathFromNodeId(int id) = 0;
353 
354  // Fetch the list of channel primitives in a geometry. Used
355  // by HOM_ChannelList to display channel primitives added to the
356  // channel list
357  SWIGOUT(%ignore getChannelPrims;)
358  virtual std::vector<HOM_ElemPtr<HOM_ChannelPrim>> getChannelPrims(
359  HOM_GUDetailHandle *gdh,
360  const UT_StringHolder &pattern) = 0;
361 
362  virtual HOM_ScriptEvalContext * newScriptEvalContext(HOM_Node &node) = 0;
363  virtual HOM_ScriptEvalContext * newScriptEvalContext(HOM_Parm &parm) = 0;
364 
365  // Access to the contents of the parm clipboard
366  virtual std::vector< std::map<std::string, std::string> >
367  parmClipboardContents() = 0;
368 
369  // These methods return a new HOM_NodeType object or null if it couldn't
370  // be found.
371  virtual HOM_NodeType *nodeType(
372  HOM_NodeTypeCategory &category, const char *name) = 0;
373  virtual HOM_NodeType *nodeType(const char *name) = 0;
374 
375  virtual HOM_NodeType *preferredNodeType(
376  const char *name, HOM_Node *parentNode = NULL) = 0;
377 
378  virtual HOM_NodeTypeCategory &objNodeTypeCategory() = 0;
379  virtual HOM_NodeTypeCategory &sopNodeTypeCategory() = 0;
380  virtual HOM_NodeTypeCategory &dopNodeTypeCategory() = 0;
381  virtual HOM_NodeTypeCategory &cop2NodeTypeCategory() = 0;
382  virtual HOM_NodeTypeCategory &copNodeTypeCategory() = 0;
383  virtual HOM_NodeTypeCategory &shopNodeTypeCategory() = 0;
384  virtual HOM_NodeTypeCategory &vopNodeTypeCategory() = 0;
385  virtual HOM_NodeTypeCategory &ropNodeTypeCategory() = 0;
386  virtual HOM_NodeTypeCategory &chopNodeTypeCategory() = 0;
387  virtual HOM_NodeTypeCategory &topNodeTypeCategory() = 0;
388  virtual HOM_NodeTypeCategory &lopNodeTypeCategory() = 0;
389  virtual HOM_NodeTypeCategory &cop2NetNodeTypeCategory() = 0;
390  virtual HOM_NodeTypeCategory &vopNetNodeTypeCategory() = 0;
391  virtual HOM_NodeTypeCategory &chopNetNodeTypeCategory() = 0;
392  virtual HOM_NodeTypeCategory &topNetNodeTypeCategory() = 0;
393  virtual HOM_NodeTypeCategory &managerNodeTypeCategory() = 0;
394  virtual HOM_NodeTypeCategory &rootNodeTypeCategory() = 0;
395  virtual HOM_NodeTypeCategory &dataNodeTypeCategory() = 0;
396  virtual std::map<std::string, HOM_NodeTypeCategory *>
397  nodeTypeCategories() = 0;
398  virtual HOM_NodeTypeCategory &apexNodeTypeCategory() = 0;
399 
400  virtual std::vector<HOM_ElemPtr<HOM_Node> > copyNodesTo(
401  const std::vector<HOM_Node *> &nodes,
402  HOM_Node &destination_node) = 0;
403  virtual std::vector<HOM_ElemPtr<HOM_Node> > moveNodesTo(
404  const std::vector<HOM_Node *> &nodes,
405  HOM_Node &destination_node) = 0;
406 
407  virtual HOM_NodeBundle *addNodeBundle(const char *name = NULL) = 0;
408  virtual std::vector<HOM_ElemPtr<HOM_NodeBundle> > nodeBundles() = 0;
409  virtual std::vector<HOM_ElemPtr<HOM_NodeBundle> > selectedNodeBundles() = 0;
410  virtual HOM_NodeBundle *nodeBundle(const char *name) = 0;
411 
412  virtual HOM_HDADefinition *hdaDefinition(
413  HOM_NodeTypeCategory &category, const char *name,
414  const char *file_path) = 0;
415 
416  // Note that getTimeWithoutAddingDependency is not wrapped by swig.
417  virtual fpreal getTimeWithoutAddingDependency() = 0;
418  virtual double time() = 0;
419  virtual void setTime(double time) = 0;
420  virtual double frame(bool full_precision=false) = 0;
421  virtual int intFrame() = 0;
422  virtual void setFrame(double frame) = 0;
423  virtual double fps() = 0;
424  virtual void setFps(
425  double fps,
426  bool modify_frame_count = true,
427  bool preserve_keyframes = false,
428  bool preserve_frame_start = false)
429  = 0;
430  virtual double timeToFrame(double time, bool full_precision=false) = 0;
431  virtual double frameToTime(double frame) = 0;
432 
433  /// Private methods for ensuring that the current eval context
434  /// (including global time) is in-sync with the main thread's eval
435  /// context.
436  virtual void _syncFromMainContext() = 0;
437  virtual void _syncToMainContext() = 0;
438 
439  // Computes a scale factor given units
440  virtual fpreal scaleFromMKS(const char *units) = 0;
441  virtual fpreal scaleToMKS(const char *units) = 0;
442 
443  virtual double bezier() = 0;
444  virtual double constant() = 0;
445  virtual double cubic() = 0;
446  virtual double cycle(double start_frame, double end_frame) = 0;
447  virtual double cyclet(double start_time, double end_time) = 0;
448  virtual double cycleoffset(double start_frame, double end_frame) = 0;
449  virtual double cycleoffsett(double start_time, double end_time) = 0;
450  virtual double ease() = 0;
451  virtual double easein() = 0;
452  virtual double easeinp(double ease_speed) = 0;
453  virtual double easeout() = 0;
454  virtual double easeoutp(double ease_speed) = 0;
455  virtual double easep(double ease_bias) = 0;
456  virtual double linear() = 0;
457  virtual double match() = 0;
458  virtual double matchin() = 0;
459  virtual double matchout() = 0;
460  virtual double qlinear() = 0;
461  virtual double quintic() = 0;
462  virtual double repeat(double start_frame, double end_frame) = 0;
463  virtual double repeatt(double start_time, double end_time) = 0;
464  virtual double spline() = 0;
465  virtual double vmatch() = 0;
466  virtual double vmatchin() = 0;
467  virtual double vmatchout() = 0;
468 
469  virtual std::string chopExportConflictResolutionPattern() = 0;
470  virtual void setChopExportConflictResolutionPattern( const char *pattern) = 0;
471 
472  virtual std::vector<HOM_ElemPtr<HOM_VexContext> >
473  vexContexts() = 0;
474 
475  virtual HOM_VexContext* vexContextForShaderType(HOM_EnumValue &shader_type) = 0;
476 
477  virtual HOM_VexContext* vexContextForNodeTypeCategory(
478  HOM_NodeTypeCategory &node_type_category) = 0;
479 
480  virtual std::string helpServerUrl() = 0;
481 
482  virtual std::string hscriptCommandHelp(const char *command_name) = 0;
483 
484  // This method returns a pair of strings: one for stdout and one for
485  // stderr.
486  virtual std::vector<std::string> hscript(const char *command) = 0;
487 
488  // Compare if two numbers are almost equal.
489  virtual bool almostEqual(double x, double y) = 0;
490 
491  virtual std::vector<std::pair<HOM_ElemPtr<HOM_Parm>, std::string> >
492  fileReferences(
493  const char *project_dir_variable="HIP", bool include_all_refs=true) = 0;
494 
495  // Find files in $HOUDINI_PATH.
496  virtual std::string findFile(const char *file_name) = 0;
497  virtual std::vector<std::string> findFiles(
498  const char *file_name) = 0;
499  virtual std::vector<std::string> findFilesWithExtension(
500  const char *file_extension, const char *subdirectory = NULL) = 0;
501 
502  // Find directories in $HOUDINI_PATH.
503  virtual std::string findDirectory(const char *directory_name) = 0;
504  virtual std::vector<std::string> findDirectories(
505  const char *directory_name) = 0;
506 
507  virtual std::vector<std::string> houdiniPath(const char *pathvar = nullptr) = 0;
508 
509  virtual std::string homeHoudiniDirectory() = 0;
510 
511  virtual std::string readFile(const char *file_path) = 0;
512  virtual HOM_BinaryString readBinaryFile(const char *file_path) = 0;
513 
514  virtual std::map<std::string, HOM_BinaryString> loadIndexDataFromString(
515  const char *data, int length) = 0;
516 
517  virtual std::map<std::string, HOM_BinaryString> loadIndexDataFromFile(
518  const char *file_path) = 0;
519 
520  virtual HOM_BinaryString saveIndexDataToString(
521  const std::map<std::string, HOM_BinaryString> &index_data) = 0;
522 
523  virtual void saveIndexDataToFile(
524  const char *file_path,
525  const std::map<std::string, HOM_BinaryString> &index_data) = 0;
526 
527  // Note that, when wrapped by swig, this function takes a single string
528  // parameter.
529  virtual std::vector<std::pair<std::string, HOM_BinaryString> >
530  loadCPIODataFromString(const char *data, int length) = 0;
531 
532  virtual HOM_BinaryString saveCPIODataToString(
533  const std::vector<std::pair<std::string, HOM_BinaryString> >
534  &data) = 0;
535 
536  // These 3 methods are not wrapped by swig. They are used to notify
537  // interested parties that a change to the module source code was made and
538  // that they should forcefully update to match the change. The third
539  // is used to load the session module source from a hip file, even though
540  // that source might generate an exception.
541  virtual UT_NotifierImpl<int> &getSessionModuleSourceForceUpdateNotifier()=0;
542  virtual void forceUpdateFromSessionModuleSource() = 0;
543  virtual void forceSetSessionModuleSource(const char *source) = 0;
544 
545  virtual void setSessionModuleSource(const char *source) = 0;
546  virtual void appendSessionModuleSource(const char *source) = 0;
547  virtual std::string sessionModuleSource() = 0;
548  // This method is not wrapped by swig:
549  virtual int sessionModuleSourceChangeCount() = 0;
550 
551  // This static method lets you know if the HOM implementation is set,
552  // so you can check if it's safe to call the HOM() function. This method
553  // should only be called in rare cases.
554  static bool isImplementationSet()
555  { return theImplementation != NULL; }
556 
557  // Evaluates a parameter as if it was an OPpath parameter
558  virtual std::string chsop(const char *path) = 0;
559 
560  // Evaluates a parameter as if it was an OPlist parameter
561  virtual std::string chsoplist(const char *path) = 0;
562 
563  // Sorts a list of node paths using topological order from the graph.
564  virtual std::vector<std::string>
565  sortedNodePaths(const std::vector<std::string> &paths) = 0;
566 
567  // Sorts a list of HOM_Node using topological order from the graph.
568  virtual std::vector<HOM_ElemPtr<HOM_Node> >
569  sortedNodes(const std::vector<HOM_Node*> &nodes) = 0;
570 
571  // deprecated in favour of hou.text.patternMatch
572  virtual int patternMatch(
573  const char *pattern, const char *str,
574  bool ignore_case = false,
575  bool path_match = false) = 0;
576 
577  // hscriptExpression() will return different types, according to
578  // the return value of the expression.
579  virtual hboost::any hscriptExpression(const char *expression) = 0;
580  virtual double hscriptFloatExpression(const char *expression) = 0;
581  virtual std::string hscriptStringExpression(const char *expression) = 0;
582  virtual std::vector<double>hscriptVectorExpression(
583  const char *expression) = 0;
584  virtual std::vector<std::vector<double> > hscriptMatrixExpression(
585  const char *expression) = 0;
586 
587  virtual hboost::any lvar(const char *name) = 0;
588 
589  virtual char *getEnvConfigValue(
590  const char *name, const char *default_value=NULL) = 0;
591 
592  virtual char *getenv(const char *name, const char *default_value=NULL) = 0;
593 
594  virtual void putenv(const char *name, const char *value) = 0;
595 
596  virtual void unsetenv(const char *name) = 0;
597 
598  virtual void allowEnvironmentToOverwriteVariable(
599  const char *name, bool onoff) = 0;
600 
601  virtual void *expressionGlobals() = 0;
602 
603  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
604 
605  // This method is used to interact with the global interrupt object.
606  virtual bool updateProgressAndCheckForInterrupt(int percentage=-1) = 0;
607 
608  virtual std::map<std::string, hboost::any> runVex(
609  const char *vex_file,
610  const std::map<std::string, hboost::any> &inputs,
611  const char *precision = "32") = 0;
612 
613  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
614 
615  virtual void saveImageDataToFile(
616  const std::vector<float> &color_and_alpha_data,
617  int width, int height,
618  const char *file_name,
619  bool flip_vertical = false) = 0;
620 
621  virtual void saveImageDataToFile(
622  const std::string &color_and_alpha_data,
623  int width, int height,
624  const char *file_name,
625  bool flip_vertical = false) = 0;
626 
627  virtual HOM_BinaryString loadImageDataFromFile(
628  const char *image_file_name,
629  HOM_EnumValue &image_depth = HOM_imageDepth::Int8) = 0;
630 
631  virtual std::vector<int> imageResolution(const char *image_file_name) = 0;
632 
633  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
634 
635  virtual HOM_EnumValue &updateModeSetting() = 0;
636  virtual void setUpdateMode(HOM_EnumValue &mode) = 0;
637 
638  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
639 
640  virtual HOM_OrboltURLHandler *orboltURLHandler() = 0;
641 
642  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
643 
644  virtual void *opaqueRunCallbackAndCatchCrashes(void *opaque_callback) = 0;
645 
646  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
647 
648  // These methods are used to grant functions defined in an asset's
649  // PythonModule enhanced privileges. They are not wrapped by swig.
650  virtual void pushAccessPrivilege(const char *key) = 0;
651  virtual void popAccessPrivilege(const char *key) = 0;
652 
653  virtual std::string currentPythonModuleKey() = 0;
654 
655  virtual void registerAccessPrivilegePyClient(void *opaque_python_object) = 0;
656 
657  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
658 
659  // These methods are used to instantiate HOMF objects from the HOM
660  // library level. They are not wrapped by swig.
661  virtual HOM_FloatParmTemplate *newFloatParmTemplate(
662  const char *name,
663  const char *label,
664  int num_components,
665  const std::vector<double> &default_value,
666  double min, double max,
667  bool min_is_strict, bool max_is_strict,
668  HOM_EnumValue &look,
669  HOM_EnumValue &naming_scheme,
670  const char *disable_when,
671  bool is_hidden,
672  bool is_label_hidden,
673  bool join_with_next,
674  const char *help,
675  const char *script_callback,
676  HOM_EnumValue &script_callback_language,
677  const std::map<std::string, std::string> &tags,
678  const std::map<HOM_EnumValue *, std::string> &conditionals,
679  const std::vector<std::string> &default_expression,
680  const std::vector<HOM_EnumValue *> &default_expression_language) = 0;
681 
682  virtual HOM_IntParmTemplate *newIntParmTemplate(
683  const char *name,
684  const char *label,
685  int num_components,
686  const std::vector<int64> &default_value,
687  int64 min, int64 max,
688  bool min_is_strict, bool max_is_strict,
689  HOM_EnumValue &look,
690  HOM_EnumValue &naming_scheme,
691  const std::vector<std::string> &menu_items,
692  const std::vector<std::string> &menu_labels,
693  const std::vector<std::string> &icon_names,
694  const std::string &item_generator_script,
695  HOM_EnumValue *item_generator_script_language,
696  HOM_EnumValue &menu_type,
697  bool menu_use_token,
698  const char *disable_when,
699  bool is_hidden,
700  bool is_label_hidden,
701  bool join_with_next,
702  const char *help,
703  const char *script_callback,
704  HOM_EnumValue &script_callback_language,
705  const std::map<std::string, std::string> &tags,
706  const std::map<HOM_EnumValue *, std::string> &conditionals,
707  const std::vector<std::string> &default_expression,
708  const std::vector<HOM_EnumValue *> &default_expression_language) = 0;
709 
710  virtual HOM_StringParmTemplate *newStringParmTemplate(
711  const char *name,
712  const char *label,
713  int num_components,
714  const std::vector<std::string> &default_value,
715  HOM_EnumValue &naming_scheme,
716  HOM_EnumValue &string_type,
717  HOM_EnumValue &file_type,
718  const std::vector<std::string> &menu_items,
719  const std::vector<std::string> &menu_labels,
720  const std::vector<std::string> &icon_names,
721  const std::string &item_generator_script,
722  HOM_EnumValue *item_generator_script_language,
723  HOM_EnumValue &menu_type,
724  const char *disable_when,
725  bool is_hidden,
726  bool is_label_hidden,
727  bool join_with_next,
728  const char *help,
729  const char *script_callback,
730  HOM_EnumValue &script_callback_language,
731  const std::map<std::string, std::string> &tags,
732  const std::map<HOM_EnumValue *, std::string> &conditionals,
733  const std::vector<std::string> &default_expression,
734  const std::vector<HOM_EnumValue *> &default_expression_language) = 0;
735 
736  virtual HOM_DataParmTemplate *newDataParmTemplate(
737  const char *name,
738  const char *label,
739  int num_components,
740  HOM_EnumValue &look,
741  HOM_EnumValue &naming_scheme,
742  HOM_EnumValue &data_parm_type,
743  const char *disable_when,
744  bool is_hidden,
745  bool is_label_hidden,
746  bool join_with_next,
747  const char *help,
748  const char *script_callback,
749  HOM_EnumValue &script_callback_language,
750  const std::map<std::string, std::string> &tags,
751  const std::map<HOM_EnumValue *, std::string> &conditionals,
752  const std::vector<std::string> &default_expression,
753  const std::vector<HOM_EnumValue *> &default_expression_language) = 0;
754 
755  virtual HOM_ToggleParmTemplate *newToggleParmTemplate(
756  const char *name,
757  const char *label,
758  bool default_value,
759  const char *disable_when,
760  bool is_hidden,
761  bool is_label_hidden,
762  bool join_with_next,
763  const char *help,
764  const char *script_callback,
765  HOM_EnumValue &script_callback_language,
766  const std::map<std::string, std::string> &tags,
767  const std::map<HOM_EnumValue *, std::string> &conditionals,
768  const std::string &default_expression,
769  const HOM_EnumValue &default_expression_language) = 0;
770 
771  virtual HOM_MenuParmTemplate *newMenuParmTemplate(
772  const char *name,
773  const char *label,
774  const std::vector<std::string> &menu_items,
775  const std::vector<std::string> &menu_labels,
776  int64 default_value,
777  const std::vector<std::string> &icon_names,
778  const std::string &item_generator_script,
779  HOM_EnumValue *item_generator_script_language,
780  HOM_EnumValue &menu_type,
781  bool menu_use_token,
782  const char *disable_when,
783  bool is_hidden,
784  bool is_label_hidden,
785  bool join_with_next,
786  const char *help,
787  const char *script_callback,
788  HOM_EnumValue &script_callback_language,
789  const std::map<std::string, std::string> &tags,
790  const std::map<HOM_EnumValue *, std::string> &conditionals,
791  const std::string &default_expression,
792  const HOM_EnumValue &default_expression_language,
793  bool store_default_value_as_string,
794  bool is_button_strip,
795  bool strip_uses_icons
796  ) = 0;
797 
798  virtual HOM_ButtonParmTemplate *newButtonParmTemplate(
799  const char *name,
800  const char *label,
801  const char *disable_when,
802  bool is_hidden,
803  bool is_label_hidden,
804  bool join_with_next,
805  const char *help,
806  const char *script_callback,
807  HOM_EnumValue &script_callback_language,
808  const std::map<std::string, std::string> &tags,
809  const std::map<HOM_EnumValue *, std::string> &conditionals ) = 0;
810 
811  virtual HOM_LabelParmTemplate *newLabelParmTemplate(
812  const char *name,
813  const char *label,
814  const std::vector<std::string> &column_labels,
815  HOM_EnumValue &label_parm_type,
816  bool is_hidden,
817  bool is_label_hidden,
818  bool join_with_next,
819  const char *help,
820  const std::map<std::string, std::string> &tags,
821  const std::map<HOM_EnumValue *, std::string> &conditionals) = 0;
822 
823  virtual HOM_SeparatorParmTemplate *newSeparatorParmTemplate(
824  const char *name,
825  bool is_hidden,
826  const std::map<std::string, std::string> &tags,
827  const std::map<HOM_EnumValue *, std::string> &conditionals) = 0;
828 
829  virtual HOM_FolderSetParmTemplate *newFolderSetParmTemplate(
830  const char *name,
831  const std::vector<std::string> &folder_names,
832  HOM_EnumValue &folder_type,
833  const std::map<std::string, std::string> &tags) = 0;
834 
835  virtual HOM_FolderParmTemplate *newFolderParmTemplate(
836  const char *name,
837  const char *label,
838  const std::vector<HOM_ParmTemplate *> &parm_templates,
839  HOM_EnumValue &folder_type,
840  int default_value,
841  bool is_hidden,
842  bool ends_tab_group,
843  const char *script_callback,
844  HOM_EnumValue &script_callback_language,
845  const std::map<std::string, std::string> &tags,
846  const std::map<HOM_EnumValue *, std::string> &conditionals,
847  const std::map<HOM_EnumValue *, std::string> &tab_conditionals) = 0;
848 
849  virtual HOM_RampParmTemplate *newRampParmTemplate(
850  const char *name,
851  const char *label,
852  HOM_EnumValue &ramp_parm_type,
853  int default_value,
854  HOM_EnumValue *default_basis,
855  bool show_controls,
856  HOM_EnumValue *color_type,
857  const char *disable_when,
858  bool is_hidden,
859  const char *help,
860  const char *script_callback,
861  HOM_EnumValue &script_callback_language,
862  const std::map<std::string, std::string> &tags,
863  const std::map<HOM_EnumValue *, std::string> &conditionals,
864  const std::string &default_expression,
865  const HOM_EnumValue &default_expression_language) = 0;
866 
867  virtual HOM_ParmTemplateGroup *newParmTemplateGroup(
868  const std::vector<HOM_ParmTemplate *> &parm_templates) = 0;
869 
870  virtual HOM_PerfMonRecordOptions *newPerfMonRecordOptions(
871  bool cook_stats, bool pdg_cook_stats, bool solve_stats,
872  bool draw_stats, bool gpu_draw_stats, bool viewport_stats,
873  bool script_stats, bool render_stats, bool thread_stats,
874  bool frame_stats, bool memory_stats, bool errors,
875  bool pane_stats) = 0;
876 
877  virtual HOM_Keyframe *newKeyframe() = 0;
878  virtual HOM_Keyframe *newKeyframe(double value) = 0;
879  virtual HOM_Keyframe *newKeyframe(double value, double time) = 0;
880  virtual HOM_Keyframe *newKeyframe(const HOM_Keyframe &keyframe) = 0;
881 
882  virtual HOM_StringKeyframe *newStringKeyframe() = 0;
883  virtual HOM_StringKeyframe *newStringKeyframe(
884  const std::string &value, HOM_EnumValue &language) = 0;
885  virtual HOM_StringKeyframe *newStringKeyframe(
886  const std::string &value, double time, HOM_EnumValue &language) = 0;
887  virtual HOM_StringKeyframe *newStringKeyframe(
888  const HOM_StringKeyframe &string_keyframe) = 0;
889 
890  virtual HOM_HDAOptions *newHDAOptions() = 0;
891  virtual HOM_LopViewportLoadMasks *newLopViewportLoadMasks() = 0;
892  virtual HOM_LopExpansionState *newLopExpansionState() = 0;
893  virtual HOM_LopViewportOverrides *newLopViewportOverrides() = 0;
894  virtual HOM_LopInstanceIdRule *newLopInstanceIdRule() = 0;
895  virtual HOM_LopSelectionRule *newLopSelectionRule(
896  const char *pattern = nullptr) = 0;
897 
898  virtual HOM_InterruptableOperation *newInterruptableOperation(
899  const char *operation_name, const char *long_operation_name,
900  bool open_interrupt_dialog, int timeout_ms) = 0;
901 
902  virtual HOM_RedrawBlock *newRedrawBlock() = 0;
903 #ifndef SWIG
904  virtual HOM_RedrawResumeBlock *newRedrawResumeBlock() = 0;
905 #endif
906 
907  virtual HOM_StyleSheet *newStyleSheet() = 0;
908  virtual HOM_StyleSheet *newStyleSheet(const char *json_text) = 0;
909 
910  virtual HOM_Selection *newSelection(HOM_EnumValue &selection_type,
911  HOM_Geometry *geo, const char *selection_string) = 0;
912  virtual HOM_Selection *newSelection(
913  const std::vector<HOM_EnumValue *> &selection_types,
914  HOM_Geometry *geo, const char *selection_string) = 0;
915  virtual HOM_Selection *newSelection(
916  const std::vector<HOM_Prim *> &prims) = 0;
917  virtual HOM_Selection *newSelection(
918  const std::vector<HOM_Point *> &points) = 0;
919  virtual HOM_Selection *newSelection(
920  const std::vector<HOM_Vertex *> &vertices) = 0;
921  virtual HOM_Selection *newSelection(
922  const std::vector<HOM_Edge *> &edges) = 0;
923 
924  // This method returns a new HOM_Geometry object.
925  virtual HOM_Geometry *newGeometry(HOM_Geometry *geo = nullptr,
926  bool clone_data_ids = false) = 0;
927  // This method returns a new HOM_ImageLayer object.
928  virtual HOM_ImageLayer *newImageLayer(HOM_ImageLayer *layer = nullptr) = 0;
929  // This method returns a new HOM_NanoVDB object.
930  virtual HOM_NanoVDB *newNanoVDB(HOM_NanoVDB *vdb = nullptr) = 0;
931 
932  virtual HOM_GeometryRayCache *newGeometryRayCache() = 0;
933 
934  virtual HOM_DopSimulation *newDopSimulation() = 0;
935 
936  virtual HOM_Clip *newClip() = 0;
937 
938  virtual HOM_AgentDefinition *newAgentDefinition(
939  const HOM_AgentRig *rig, const HOM_AgentShapeLibrary *shapelib) = 0;
940 
941  virtual HOM_AgentClip *newAgentClip(
942  const char *name, const char *path, const HOM_AgentRig &rig,
943  bool keep_external_ref, bool delay_load) = 0;
944 
945  virtual HOM_AgentClip *newAgentClip(
946  const char *name, HOM_ChopNode &chop, const HOM_AgentRig &rig,
947  double frame) = 0;
948 
949  virtual HOM_AgentClip *newAgentClip(
950  const char *name, const HOM_AgentRig &rig, int sample_count) = 0;
951 
952  virtual HOM_AgentClip *newAgentClip(
953  const HOM_AgentClip &clip, const HOM_AgentRig &rig,
954  const char *name) = 0;
955 
956  virtual HOM_AgentClip *newAgentClip(
957  const char *name,
958  void *stage,
959  const char *prim_path,
960  const HOM_AgentRig &rig) = 0;
961 
962  virtual HOM_AgentRig *newAgentRig(const char *path, bool keep_external_ref) = 0;
963 
964  virtual HOM_AgentRig *newAgentRig(
965  const char *name, const std::vector<std::string> &transform_names,
966  const std::vector<std::vector<int>> &hierarchy) = 0;
967 
968  virtual HOM_AgentTransformGroup *newAgentTransformGroup(
969  const char *path, const HOM_AgentRig &rig,
970  bool keep_external_ref = true) = 0;
971 
972  virtual HOM_AgentTransformGroup *newAgentTransformGroup(
973  const char *name, const std::vector<int> &transforms,
974  const HOM_AgentRig &rig, const std::vector<double> &weights,
975  const std::vector<int> &channels) = 0;
976 
977  virtual HOM_AgentShapeLibrary *newAgentShapeLibrary() = 0;
978  virtual HOM_AgentShapeLibrary *newAgentShapeLibrary(
979  HOM_Geometry &geometry, const char *name) = 0;
980  virtual HOM_AgentShapeLibrary *newAgentShapeLibrary(
981  const char *path, bool keep_external_ref) = 0;
982 
983  virtual HOM_AgentShapeBinding *
984  newAgentShapeBinding(int transform, const HOM_AgentShape &shape,
985  bool deforming, double bounds_scale) = 0;
986 
987  virtual HOM_AgentShapeBinding *
988  newAgentShapeBinding(int transform, const HOM_AgentShape &shape,
989  const HOM_AgentShapeDeformer *deformer,
990  const HOM_Vector3 &bounds_scale) = 0;
991 
992  virtual HOM_AgentShapeDeformer *
993  newAgentShapeDeformer(const char *name) = 0;
994 
995  virtual HOM_AgentShapeDeformer *
996  newAgentShapeDeformer(const HOM_EnumValue &deformer_type) = 0;
997 
998  virtual HOM_AgentLayer *newAgentLayer(
999  const char *name, const HOM_AgentRig &rig,
1000  const HOM_AgentShapeLibrary &shapelib,
1001  const std::vector<HOM_AgentShapeBinding *> &shape_bindings,
1002  const HOM_AgentLayer *source_layer = 0) = 0;
1003 
1004  virtual HOM_AgentLayer *
1005  newAgentLayer(const char *path, const HOM_AgentRig &rig,
1006  const HOM_AgentShapeLibrary &shapelib,
1007  bool keep_external_ref = true) = 0;
1008 
1009  virtual HOM_AgentMetadata *newAgentMetadata(
1010  const char *path,
1011  bool keep_external_ref = true) = 0;
1012  virtual HOM_AgentMetadata *newAgentMetadata(
1013  const std::map<std::string, hboost::any> &data) = 0;
1014 
1015  virtual bool compareNode(const char *path, const char *dest = NULL) = 0;
1016  virtual bool compareNodeBackup(const char *path, int index,
1017  const char *dest = NULL) = 0;
1018  virtual bool compareHDA(const char *path_left, const char *path_right,
1019  const char *dest = NULL) = 0;
1020  virtual bool compareHDABackup(const char *path, int index,
1021  const char *dest = NULL) = 0;
1022  virtual bool compareHip(const char *dest = NULL) = 0;
1023  virtual bool compareHipBackup(int index, const char *dest = NULL) = 0;
1024 
1025  virtual bool hasContextOption(const char *opt) = 0;
1026  virtual UT_OptionEntryPtr contextOption(const char *opt) = 0;
1027  virtual std::vector<std::string> contextOptionNames() = 0;
1028  virtual void setContextOption(const char *opt, const char *value) =0;
1029  virtual void setContextOption(const char *opt, double value) = 0;
1030  virtual void removeContextOption(const char *opt) = 0;
1031  virtual std::string contextOptionConfig(const char *opt) = 0;
1032  virtual void setContextOptionConfig(const char *opt,
1033  const char *config) = 0;
1034  virtual bool isAutoContextOption(const char *opt) = 0;
1035  virtual bool isAutoContextOptionOverridden(const char *opt) = 0;
1036 
1037  SWIGOUT(%ignore addOpaqueContextOptionChangeCallback;)
1038  virtual void addOpaqueContextOptionChangeCallback(void *callback) = 0;
1039  SWIGOUT(%ignore removeOpaqueContextOptionChangeCallback;)
1040  virtual void removeOpaqueContextOptionChangeCallback(void *callback) = 0;
1041  virtual void removeAllContextOptionChangeCallbacks() = 0;
1042  SWIGOUT(%ignore opaqueContextOptionChangeCallbacks;)
1043  virtual std::vector<void *> opaqueContextOptionChangeCallbacks() = 0;
1044 
1045  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1046 
1047  // This method is called when orbolt_url runs. It is not wrapped by swig.
1048  virtual void setOrboltURLHandler(
1049  STORUI_OrboltURLHandler &orbolt_url_handler) = 0;
1050 
1051  // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1052 
1053  // These methods are used to help debug HOM to make sure no objects
1054  // get allocated that don't get deallocated.
1055  virtual void constructObject(void *pointer, const std::type_info &type) = 0;
1056  virtual void destructObject(void *pointer, const std::type_info &type) = 0;
1057  virtual std::map<std::string, int> objectCounts() = 0;
1058 
1059  // Preferences
1060  virtual std::vector<std::string> getPreferenceNames() = 0;
1061  SWIGOUT(%kwargs getPreference;)
1062  virtual std::string getPreference(const char *name, const char* registry_name = nullptr) = 0;
1063  SWIGOUT(%kwargs setPreference;)
1064  virtual bool setPreference(const char *name, const char* value, const char* registry_name = nullptr) = 0;
1065  virtual bool addPreference(const char *name, const char* value) = 0;
1066  virtual bool removePreference(const char *name) = 0;
1067  virtual void refreshPreferences() = 0;
1068  virtual void savePreferences(const char* registry_name) = 0;
1069  virtual void loadPreferences(const char* registry_name) = 0;
1070  SWIGOUT(%kwargs createPreferenceRegistry;)
1071  virtual void createPreferenceRegistry(const char* registry_name, const char* file_name,
1072  std::map<std::string, hboost::any> prefs, const char* prefix_name = nullptr, bool binary = false) = 0;
1073  SWIGOUT(%kwargs refreshPreferenceRegistry;)
1074  virtual void refreshPreferenceRegistry(const char* registry_name, std::map<std::string, hboost::any> new_prefs,
1075  bool clear_existing = false) = 0;
1076 
1077  virtual HOM_ViewerStateTemplate * newViewerStateTemplate(
1078  std::string const & type_name,
1079  std::string const & label,
1080  HOM_NodeTypeCategory const & category,
1081  std::vector<HOM_NodeTypeCategory*> const & contexts) = 0;
1082 
1083  virtual HOM_ViewerHandleTemplate * newViewerHandleTemplate(
1084  std::string const & type_name,
1085  std::string const & label,
1086  std::vector<HOM_NodeTypeCategory*> const & categories) = 0;
1087 
1088  virtual HOM_ViewerStateMenu * newViewerStateMenu(std::string const & handle, std::string const & label) = 0;
1089 
1090  virtual HOM_PluginHotkeyDefinitions * newPluginHotkeyDefinitions() = 0;
1091 
1092  virtual HOM_Drawable2D * newDrawable2D(HOM_PaneTab& hpanetab, HOM_EnumValue const & type,
1093  std::string const & name, std::string const & label, bool pickable,
1094  std::map<std::string, hboost::any> const & params) = 0;
1095 
1096  virtual HOM_SimpleDrawable * newSimpleDrawable( HOM_SceneViewer& scene_viewer, HOM_EnumValue const &prim_type, std::string const &name) = 0;
1097  virtual HOM_SimpleDrawable * newSimpleDrawable( HOM_SceneViewer& scene_viewer, HOM_Geometry const &geometry, std::string const &name) = 0;
1098 
1099  virtual HOM_ViewerHandleDragger * newViewerHandleDragger(std::string const & name) = 0;
1100  virtual HOM_ViewerStateDragger * newViewerStateDragger(std::string const & name, HOM_Matrix4 const & xform, HOM_Matrix4 const & inv_xform) = 0;
1101 
1102  virtual HOM_UIEvent * newUIEvent( int64 val, int64 val2 ) = 0;
1103  virtual HOM_ViewerEvent * newViewerEvent( HOM_SceneViewer& sceneViewer, int64 val, int64 val2 ) = 0;
1104  virtual HOM_UIEventDevice * newUIEventDevice(int64 val, int64 val2, int64 val3) = 0;
1105 
1106  virtual HOM_Handle * newHandle(HOM_PaneTab& scene_viewer, std::string const &name ) = 0;
1107  virtual HOM_ViewerHandleContext * newViewerHandleContext(int64 val) = 0;
1108 
1109  virtual HOM_ViewerStateContext * newViewerStateContext(int64 val) = 0;
1110 
1111  virtual HOM_TextDrawable * newTextDrawable(
1112  HOM_SceneViewer& scene_viewer,
1113  std::string const & name,
1114  std::map<std::string, hboost::any> const & params,
1115  std::string const & label) = 0;
1116 
1117  virtual HOM_GeometryDrawable * newGeometryDrawable(
1118  HOM_SceneViewer& scene_viewer,
1119  HOM_EnumValue const & geo_type,
1120  std::string const & name,
1121  HOM_Geometry * geometry,
1122  std::map<std::string, hboost::any> const & params,
1123  std::string const & label) = 0;
1124 
1125  virtual HOM_GeometryDrawableGroup* newGeometryDrawableGroup(std::string const & name, std::string const & label) = 0;
1126 
1127  virtual HOM_GadgetDrawable * newGadgetDrawable(int64 widget, int64 gadget_context) = 0;
1128 
1129  virtual void startHoudiniEngineDebugger(unsigned short port) = 0;
1130  virtual void startHoudiniEngineDebugger(const char *pipe_name) = 0;
1131 
1132  virtual HOM_GeometrySelection * newGeometrySelection() = 0;
1133  virtual HOM_GeometrySelection * newGeometrySelection(int64 val) = 0;
1134 
1135  virtual HOM_logging_MemorySink * newMemorySink() = 0;
1136  virtual HOM_logging_FileSink * newFileSink(const char *filepath) = 0;
1137 
1138  virtual HOM_BinaryString convertClipData(HOM_BinaryString data,
1139  bool from_binary,
1140  bool from_blosc_compression,
1141  bool to_binary,
1142  bool to_blosc_compression) = 0;
1143 
1144  virtual HOM_BinaryString convertKeyframesToClipData(
1145  const std::map<std::string, std::vector<HOM_Keyframe *>> &keyframe_map,
1146  bool binary = true, bool use_blosc_compression = true) = 0;
1147 
1148  virtual std::string _clipInfo(HOM_BinaryString data, bool binary = true,
1149  bool blosc_compressed = true) = 0;
1150 
1151  virtual std::vector<HOM_ElemPtr<HOM_Node> > _nodesFromOPNodeList(int64 val) = 0;
1152  virtual std::vector<HOM_ElemPtr<HOM_DopData> >
1153  _dopDataList(int64 val) = 0;
1154  virtual std::vector<std::pair<HOM_ElemPtr<HOM_DopData>, HOM_ElemPtr<HOM_GeometrySelection> > >
1155  _dopDataPointList(int64 val) = 0;
1156  virtual std::vector<std::pair<HOM_ElemPtr<HOM_DopData>, HOM_ElemPtr<HOM_GeometrySelection> > >
1157  _dopDataPolyList(int64 val) = 0;
1158 
1159  virtual HOM_AttribDataId * newAttribDataId() = 0;
1160 
1161  virtual std::string userName(bool alpha=true) = 0;
1162 
1163  virtual std::string machineName(bool alpha=true) = 0;
1164 
1165  virtual HOM_GeometryDrawable * _newGeometryDrawable(int64 val) = 0;
1166 
1167  virtual HOM_Node * createAnimationLayers(const std::string &path) = 0;
1168  virtual HOM_Node * addAnimationLayer(HOM_Node &layermixer, const std::string &layername) = 0;
1169  virtual bool removeAnimationLayer(HOM_Node &layermixer, const std::string &layername, bool merge=false) = 0;
1170  virtual HOM_Node* createAnimationClip(const std::string &path, bool set_export) = 0;
1171 
1172  virtual void* _sceneViewerWindow(int64 val) = 0;
1173 
1174  virtual HOM_ImageLayer *_lookupImageLayer(int64 key) const = 0;
1175  virtual HOM_NanoVDB *_lookupNanoVDB(int64 key) const = 0;
1176  virtual HOM_Ramp *_lookupRamp(int64 key) const = 0;
1177  virtual HOM_Geometry *_lookupGeometry(int64 key) const = 0;
1178 
1179  virtual std::vector<std::string> _prioritizePatternMatches(
1180  const std::vector<std::string> & items,
1181  const std::vector<std::string> & patterns) const = 0;
1182 
1183  virtual void registerOpdefPath(
1184  const std::string &path,
1185  const std::string &server_name,
1186  const std::string &port_name)
1187  = 0;
1188 
1189  virtual std::vector<std::string> videoEncoders(
1190  HOM_EnumValue const &driver, const bool available=false) = 0;
1191 
1192  void _debugAssert(bool v, const std::string &message);
1193 
1194 private:
1195  // HOMF_Module::createHOMModule() uses this to create the HOM_Module.
1196  static void (*theHOMCreator)();
1197 
1198  // A subclass of HOM_Module in the HOMF library will define the
1199  // implementation of HOM. Importing the python module will set the
1200  // implementation, so this function should only be called by HOMF_Module::
1201  // createHOMModule().
1202  friend class HOMF_Module;
1203  static void setImplementation(HOM_Module* implementation);
1204 
1205  // We could add a static method to access the implementation, but we
1206  // want to make it easy to access the HOM module from C++. So, the
1207  // global function HOM() needs access to the implementation.
1208  friend HOM_API HOM_Module& HOM();
1209  static HOM_Module *theImplementation;
1210 };
1211 
1212 
1213 // Use this function to automatically delete objects for functions that
1214 // return new objects. This lets you, for example, write code like
1215 // HOMdel(HOM().findNode("/obj/geo1"))->setName("geo2")
1216 template <typename T>
1218 { return UT_UniquePtr<T>(hom_object); }
1219 
1220 
1221 // This lock is used to synchronize HOM scripts running in a separate
1222 // thread and Houdini. Houdini's UI queue will give up the lock when it's
1223 // waiting for events and reacquire it when it handles an event.
1224 //
1225 // Note that this lock allows multiple threads in the same thread group to hold
1226 // it at the same time. By default, a thread started from Houdini is added to
1227 // the group containing the main thread. This way, since Houdini started the
1228 // thread, we can be confident that it will use other locks to synchronize
1229 // access to Houdini. This approach allows, for example, a volume SOP to
1230 // cook using multiple threads, evaluating Python in each thread while the
1231 // main thread holds the HOM lock, without deadlocking and without allowing
1232 // non-Houdini threads to acquire the HOM lock. (Note that the GIL will
1233 // synchronize access to Python's internals.)
1236 {
1237  // This is not thread-safe but should be ok because HOMgetLock() is called
1238  // pretty early on during startup when there is only one thread executing.
1239  if (!HOM_theHOMLock)
1240  HOM_theHOMLock = new UT_TaskRootLock();
1241 
1242  UT_ASSERT(HOM_theHOMLock);
1243  return *HOM_theHOMLock;
1244 }
1245 
1246 // The HOM implementation uses the HOM_AutoLock to make sure Houdini isn't busy
1247 // when they make calls into the Houdini libraries. Note that constructing
1248 // a HOM_AutoLock will release the python global interpreter lock (GIL) if
1249 // it was held before acquiring the HOM lock. This way, other python threads
1250 // can run if it needs to block waiting for the HOM lock.
1252 {
1253 public:
1255  {
1256  if (!HOMgetLock().hasLock())
1257  {
1258  HOMgetLock().lock();
1259  myLocked = true;
1260  }
1261  else
1262  myLocked = false;
1263  }
1264 
1266  {
1267  if (myLocked)
1268  HOMgetLock().unlock();
1269  }
1270 
1271 private:
1272 
1273  // It is important that we release the python global interpreter lock
1274  // (GIL) for the duration of waiting for, acquiring and holding onto
1275  // the HOM lock. This gives other threads that are either blocked
1276  // on the GIL or that will try to acquire the GIL a chance to continue
1277  // execution.
1278  //
1279  // If the current thread needs to access the Python API,
1280  // then it should explicitly acquire the GIL by creating a
1281  // PY_InterpreterAutoLock object. The PY_InterpreterAutoLock must be
1282  // constructed *after* the HOM_AutoLock or it will have no effect.
1283  //
1284  // This prevents deadlocks that occur when the current thread
1285  // spawns other threads which access the Python API and try to
1286  // acquire the GIL.
1287  //
1288  // Note that we will reacquire the GIL when the HOM auto lock is destructed.
1289  PY_InterpreterAutoUnlock myPyInterpAutoUnlock;
1290 
1291  // Boolean to determine if the auto lock actually locked the HOM lock.
1292  bool myLocked;
1293 };
1294 
1295 // The HOM implementation uses HOM_AutoUnlock to allow the main thread to
1296 // run while waiting for something to happen. Constructing a HOM_AutoUnlock
1297 // instance will release the HOM lock but not the Python GIL. When it's
1298 // destructed it will reacquire the HOM lock. Since it releases the HOM lock,
1299 // it's important that a HOM_AutoLock was already created in a containing
1300 // scope.
1301 //
1302 // Use HOM_AutoUnlock in conjunction with PY_InterpreterAutoUnlock to
1303 // also release the Python GIL. Be sure to create the HOM_AutoUnlock *after*
1304 // the PY_InterpreterAutoUnlock, so that when the auto locks are destructed
1305 // the HOM lock is reacquired before the Python GIL. Otherwise, it will grab
1306 // the GIL and then try to grab the HOM lock, and if another thread with the
1307 // HOM lock tries to run Python we'll end up with deadlock.
1309 {
1310 public:
1312  {
1313  if (HOMgetLock().hasLock())
1314  {
1315  HOMgetLock().unlock();
1316  myUnlocked = true;
1317  }
1318  else
1319  {
1320  myUnlocked = false;
1321  }
1322  }
1323 
1325  {
1326  if (myUnlocked)
1327  HOMgetLock().lock();
1328  }
1329 
1330 private:
1331  bool myUnlocked;
1332 };
1333 
1334 
1335 // These macros are used to help detect memory leaks when debugging is enabled.
1336 #ifdef HOM_DEBUG
1337 #define HOM_CONSTRUCT_OBJECT(pointer) \
1338  HOM().constructObject(pointer, typeid(*pointer));
1339 #define HOM_DESTRUCT_OBJECT(pointer) \
1340  HOM().destructObject(pointer, typeid(*pointer));
1341 #else
1342 #define HOM_CONSTRUCT_OBJECT(pointer)
1343 #define HOM_DESTRUCT_OBJECT(pointer)
1344 #endif
1345 
1346 // NOTE: These typedefs cannot actually be used in any method declaration
1347 // that SWIG needs to generate code for because it doesn't understand
1348 // them.
1349 // gcc gets a parse error if we try to give a default map value in the
1350 // signature, and the typedef avoids the error.
1351 typedef std::map<std::string, std::string> HOM_StdMapStringString;
1352 typedef std::map<HOM_EnumValue *, std::string> HOM_StdMapEnumString;
1353 
1354 
1355 // Houdini will call HOMextendLibrary() in HDK dso's so the user can install
1356 // C++ HOM extensions.
1357 extern "C" {
1359 }
1360 
1361 #endif //__HOM_Module_h__
GLuint GLsizei const GLchar * message
Definition: glcorearb.h:2543
std::string ignore_case(std::string item)
Helper function to allow ignore_case to be passed to IsMember or Transform.
Definition: CLI11.h:3456
GLuint GLsizei const GLchar * label
Definition: glcorearb.h:2545
GLdouble GLdouble GLint GLint const GLdouble * points
Definition: glad.h:2676
#define SYS_VISIBILITY_EXPORT
void
Definition: png.h:1083
UT_TaskRootLock & HOMgetLock()
Definition: HOM_Module.h:1235
GT_API const UT_StringHolder time
const GLdouble * v
Definition: glcorearb.h:837
GLsizei const GLfloat * value
Definition: glcorearb.h:824
const GLuint GLenum const void * binary
Definition: glcorearb.h:1924
GLsizei const GLchar *const * path
Definition: glcorearb.h:3341
#define SWIGOUT(x)
Definition: HOM_Defines.h:24
UT_UniquePtr< T > HOMdel(T *hom_object)
Definition: HOM_Module.h:1217
Definition: HOM_ik.h:21
GLuint GLsizei GLsizei * length
Definition: glcorearb.h:795
ImageBuf OIIO_API min(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
IMATH_HOSTDEVICE IMATH_CONSTEXPR14 Quat< T > spline(const Quat< T > &q0, const Quat< T > &q1, const Quat< T > &q2, const Quat< T > &q3, T t) IMATH_NOEXCEPT
Definition: ImathQuat.h:576
GLint y
Definition: glcorearb.h:103
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glcorearb.h:2539
std::string help(const App *app, const Error &e)
Printout the full help string on error (if this fn is set, the old default for CLI11) ...
Definition: CLI11.h:8978
GLenum const GLfloat * params
Definition: glcorearb.h:105
GLenum GLuint GLint GLint layer
Definition: glcorearb.h:1299
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
Definition: UT_UniquePtr.h:39
Definition: HOM_qt.h:21
GLint GLsizei GLsizei height
Definition: glcorearb.h:103
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glcorearb.h:108
UT_TaskLockT< false > UT_TaskRootLock
Definition: UT_TaskLock.h:289
HOM_API UT_TaskRootLock * HOM_theHOMLock
bool any(const vbool4 &v)
Definition: simd.h:3600
#define HOM_API
Definition: HOM_API.h:13
void ignore(T const &) VULKAN_HPP_NOEXCEPT
Definition: vulkan.hpp:6508
virtual ~HOM_Module()
Definition: HOM_Module.h:191
constexpr std::enable_if< I< type_count_base< T >::value, int >::type tuple_type_size(){return subtype_count< typename std::tuple_element< I, T >::type >::value+tuple_type_size< T, I+1 >);}template< typename T > struct type_count< T, typename std::enable_if< is_tuple_like< T >::value >::type >{static constexpr int value{tuple_type_size< T, 0 >)};};template< typename T > struct subtype_count{static constexpr int value{is_mutable_container< T >::value?expected_max_vector_size:type_count< T >::value};};template< typename T, typename Enable=void > struct type_count_min{static const int value{0};};template< typename T >struct type_count_min< T, typename std::enable_if<!is_mutable_container< T >::value &&!is_tuple_like< T >::value &&!is_wrapper< T >::value &&!is_complex< T >::value &&!std::is_void< T >::value >::type >{static constexpr int value{type_count< T >::value};};template< typename T > struct type_count_min< T, typename std::enable_if< is_complex< T >::value >::type >{static constexpr int value{1};};template< typename T >struct type_count_min< T, typename std::enable_if< is_wrapper< T >::value &&!is_complex< T >::value &&!is_tuple_like< T >::value >::type >{static constexpr int value{subtype_count_min< typename T::value_type >::value};};template< typename T, std::size_t I >constexpr typename std::enable_if< I==type_count_base< T >::value, int >::type tuple_type_size_min(){return 0;}template< typename T, std::size_t I > constexpr typename std::enable_if< I< type_count_base< T >::value, int >::type tuple_type_size_min(){return subtype_count_min< typename std::tuple_element< I, T >::type >::value+tuple_type_size_min< T, I+1 >);}template< typename T > struct type_count_min< T, typename std::enable_if< is_tuple_like< T >::value >::type >{static constexpr int value{tuple_type_size_min< T, 0 >)};};template< typename T > struct subtype_count_min{static constexpr int value{is_mutable_container< T >::value?((type_count< T >::value< expected_max_vector_size)?type_count< T >::value:0):type_count_min< T >::value};};template< typename T, typename Enable=void > struct expected_count{static const int value{0};};template< typename T >struct expected_count< T, typename std::enable_if<!is_mutable_container< T >::value &&!is_wrapper< T >::value &&!std::is_void< T >::value >::type >{static constexpr int value{1};};template< typename T > struct expected_count< T, typename std::enable_if< is_mutable_container< T >::value >::type >{static constexpr int value{expected_max_vector_size};};template< typename T >struct expected_count< T, typename std::enable_if<!is_mutable_container< T >::value &&is_wrapper< T >::value >::type >{static constexpr int value{expected_count< typename T::value_type >::value};};enum class object_category:int{char_value=1, integral_value=2, unsigned_integral=4, enumeration=6, boolean_value=8, floating_point=10, number_constructible=12, double_constructible=14, integer_constructible=16, string_assignable=23, string_constructible=24, other=45, wrapper_value=50, complex_number=60, tuple_value=70, container_value=80,};template< typename T, typename Enable=void > struct classify_object{static constexpr object_category value{object_category::other};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_integral< T >::value &&!std::is_same< T, char >::value &&std::is_signed< T >::value &&!is_bool< T >::value &&!std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::integral_value};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_integral< T >::value &&std::is_unsigned< T >::value &&!std::is_same< T, char >::value &&!is_bool< T >::value >::type >{static constexpr object_category value{object_category::unsigned_integral};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_same< T, char >::value &&!std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::char_value};};template< typename T > struct classify_object< T, typename std::enable_if< is_bool< T >::value >::type >{static constexpr object_category value{object_category::boolean_value};};template< typename T > struct classify_object< T, typename std::enable_if< std::is_floating_point< T >::value >::type >{static constexpr object_category value{object_category::floating_point};};template< typename T >struct classify_object< T, typename std::enable_if<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&std::is_assignable< T &, std::string >::value >::type >{static constexpr object_category value{object_category::string_assignable};};template< typename T >struct classify_object< T, typename std::enable_if<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&!std::is_assignable< T &, std::string >::value &&(type_count< T >::value==1)&&std::is_constructible< T, std::string >::value >::type >{static constexpr object_category value{object_category::string_constructible};};template< typename T > struct classify_object< T, typename std::enable_if< std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::enumeration};};template< typename T > struct classify_object< T, typename std::enable_if< is_complex< T >::value >::type >{static constexpr object_category value{object_category::complex_number};};template< typename T > struct uncommon_type{using type=typename std::conditional<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&!std::is_assignable< T &, std::string >::value &&!std::is_constructible< T, std::string >::value &&!is_complex< T >::value &&!is_mutable_container< T >::value &&!std::is_enum< T >::value, std::true_type, std::false_type >::type;static constexpr bool value=type::value;};template< typename T >struct classify_object< T, typename std::enable_if<(!is_mutable_container< T >::value &&is_wrapper< T >::value &&!is_tuple_like< T >::value &&uncommon_type< T >::value)>::type >{static constexpr object_category value{object_category::wrapper_value};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&is_direct_constructible< T, double >::value &&is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::number_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&!is_direct_constructible< T, double >::value &&is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::integer_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&is_direct_constructible< T, double >::value &&!is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::double_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< is_tuple_like< T >::value &&((type_count< T >::value >=2 &&!is_wrapper< T >::value)||(uncommon_type< T >::value &&!is_direct_constructible< T, double >::value &&!is_direct_constructible< T, int >::value)||(uncommon_type< T >::value &&type_count< T >::value >=2))>::type >{static constexpr object_category value{object_category::tuple_value};};template< typename T > struct classify_object< T, typename std::enable_if< is_mutable_container< T >::value >::type >{static constexpr object_category value{object_category::container_value};};template< typename T, enable_if_t< classify_object< T >::value==object_category::char_value, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"CHAR";}template< typename T, enable_if_t< classify_object< T >::value==object_category::integral_value||classify_object< T >::value==object_category::integer_constructible, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"INT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::unsigned_integral, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"UINT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::floating_point||classify_object< T >::value==object_category::number_constructible||classify_object< T >::value==object_category::double_constructible, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"FLOAT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::enumeration, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"ENUM";}template< typename T, enable_if_t< classify_object< T >::value==object_category::boolean_value, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"BOOLEAN";}template< typename T, enable_if_t< classify_object< T >::value==object_category::complex_number, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"COMPLEX";}template< typename T, enable_if_t< classify_object< T >::value >=object_category::string_assignable &&classify_object< T >::value<=object_category::other, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"TEXT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value >=2, detail::enabler >=detail::dummy >std::string type_name();template< typename T, enable_if_t< classify_object< T >::value==object_category::container_value||classify_object< T >::value==object_category::wrapper_value, detail::enabler >=detail::dummy >std::string type_name();template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value==1, detail::enabler >=detail::dummy >inline std::string type_name(){return type_name< typename std::decay< typename std::tuple_element< 0, T >::type >::type >);}template< typename T, std::size_t I >inline typename std::enable_if< I==type_count_base< T >::value, std::string >::type tuple_name(){return std::string{};}template< typename T, std::size_t I >inline typename std::enable_if<(I< type_count_base< T >::value), std::string >::type tuple_name(){auto str=std::string{type_name< typename std::decay< typename std::tuple_element< I, T >::type >::type >)}+ ','+tuple_name< T, I+1 >);if(str.back()== ',') str.pop_back();return str;}template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value >=2, detail::enabler > > std::string type_name()
Recursively generate the tuple type name.
Definition: CLI11.h:1729
GLsizei GLsizei GLchar * source
Definition: glcorearb.h:803
Definition: HOM_ui.h:47
long long int64
Definition: SYS_Types.h:116
GLfloat GLfloat GLfloat alpha
Definition: glcorearb.h:112
GLuint const GLchar * name
Definition: glcorearb.h:786
GLushort pattern
Definition: glad.h:2583
GA_API const UT_StringHolder transform
GLint GLenum GLint x
Definition: glcorearb.h:409
Attempt to access an object that no longer exists in Houdini Invalid output Invalid type The attempted operation failed Node initialization script failed Failed to modify node or parameter because of a permission error Possible causes include locked takes
Definition: HOM_Errors.h:191
GLenum mode
Definition: glcorearb.h:99
GLfloat units
Definition: glcorearb.h:408
GLenum GLint GLint * precision
Definition: glcorearb.h:1925
std::map< HOM_EnumValue *, std::string > HOM_StdMapEnumString
Definition: HOM_Module.h:1352
std::string OIIO_UTIL_API repeat(string_view str, int n)
Repeat a string formed by concatenating str n times.
OIIO_API string_view getenv(string_view name, string_view defaultval)
GLfloat GLfloat GLfloat GLfloat h
Definition: glcorearb.h:2002
SYS_VISIBILITY_EXPORT void HOMextendLibrary()
GLenum void ** pointer
Definition: glcorearb.h:810
GLuint color
Definition: glcorearb.h:1261
fpreal64 fpreal
Definition: SYS_Types.h:278
GLuint index
Definition: glcorearb.h:786
GLuint GLfloat * val
Definition: glcorearb.h:1608
ImageBuf OIIO_API max(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
virtual bool readFile(GA_Detail &g, const char *filename, const GA_LoadOptions *opts, UT_StringArray *errors) const
Class which defines an I/O interface to save/load geometry.
GLint GLsizei width
Definition: glcorearb.h:103
GLubyte GLubyte GLubyte GLubyte w
Definition: glcorearb.h:857
#define UT_ASSERT(ZZ)
Definition: UT_Assert.h:156
SYS_VISIBILITY_EXPORT void newHandle(BM_ResourceManager *m)
void unlock()
Definition: UT_TaskLock.h:261
OutGridT XformOp bool bool MergePolicy merge
HOM_API HOM_Module & HOM()
IMATH_INTERNAL_NAMESPACE_HEADER_ENTER IMATH_HOSTDEVICE IMATH_CONSTEXPR14 T clip(const T &p, const Box< T > &box) IMATH_NOEXCEPT
Definition: ImathBoxAlgo.h:29
static bool isImplementationSet()
Definition: HOM_Module.h:554
std::map< std::string, std::string > HOM_StdMapStringString
Definition: HOM_Module.h:1351
UT_UniquePtr< UT_OptionEntry > UT_OptionEntryPtr
Definition: format.h:1821
ImageBuf OIIO_API channels(const ImageBuf &src, int nchannels, cspan< int > channelorder, cspan< float > channelvalues={}, cspan< std::string > newchannelnames={}, bool shuffle_channel_names=false, int nthreads=0)