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