16 #ifndef __OP_Operator_h__
17 #define __OP_Operator_h__
49 #define ENGLISH_NAME "englishname"
50 #define VOPNET_TAB_MENU_FLAG_NAME "tabmenuflag"
78 class OP_EventScriptPathCache;
81 #define OP_FLAG_NETWORK 0x01
82 #define OP_FLAG_GENERATOR 0x02
83 #define OP_FLAG_UNORDERED 0x04
84 #define OP_FLAG_SCRIPTDEF 0x08
85 #define OP_FLAG_MANAGER 0x10
86 #define OP_FLAG_PRIMARYSUBNET 0x20
87 #define OP_FLAG_OUTPUT 0x40
88 #define OP_FLAG_EDITABLE_INPUT_DATA 0x80
91 #define OP_MAX_INPUT_LABELS 4
94 #define OP_MULTI_INPUT_MAX 9999
98 #define OP_MAX_INDIRECT_INPUTS 500
101 #define OP_MULTI_OUTPUT_MAX 9999
107 typedef std::function<OP_Ptr(OP_Network *, const char *, OP_Operator *)>
OP_Constructor;
122 virtual void saveToDialogScript(std::ostream &os)
const = 0;
150 unsigned min_sources,
151 unsigned max_sources = 9999,
154 const char **inputlabels = 0,
156 const char *tab_submenu_path = 0);
162 unsigned min_sources,
163 unsigned max_sources = 9999,
166 const char **inputlabels = 0,
168 const char *tab_submenu_path = 0);
174 const char *child_table_name,
175 unsigned min_sources,
176 unsigned max_sources = 9999,
179 const char **inputlabels = 0,
181 const char *tab_submenu_path = 0);
187 const char *child_table_name,
188 unsigned min_sources,
189 unsigned max_sources = 9999,
192 const char **inputlabels = 0,
194 const char *tab_submenu_path = 0);
199 int getNumActiveNodes()
const;
200 OP_Node *getActiveNode(
int i)
const;
201 void nodeDestroyed(
OP_Node *node);
218 void getOriginalTableAndName(
UT_String &name)
const;
221 {
return myOTLDefinition.getName(); }
228 { myOTLDefinition.getTableAndName(name); }
230 { myOTLDefinition.getTableAndName(name); }
233 {
return myOTLDefinition.getLabel(); }
234 virtual UT_Color getDefaultColor()
const;
240 virtual bool getOpHelpURL(
UT_String &url);
241 virtual bool getOpTabSubMenuPath(
UT_String &tab_submenu_path);
242 void setOpTabSubMenuPath(
const char *tab_submenu_path);
247 bool hasPotentialEditableSubNodes();
250 void getDiveTarget(
UT_String &divetarget);
251 void getDescriptiveParmName(
UT_String &descrparm);
252 void getDefaultState(
UT_String &statename);
253 void getFunctionName(
UT_String &function_name);
254 void getSecondaryFunctionsNames(
267 void getHelpFileDirAndName(
UT_String & script_dir,
270 void getDefinitionSource(
UT_String &defsource)
const;
273 { ourLastHelpOp = 0; }
274 OP_Node *getDefiningNetwork()
const;
280 {
return myOTLDefinition.getIndexPath(); }
282 {
return myOTLDefinition.getIndexFile(); }
284 {
return myOTLDefinition.getIsSubnet(); }
290 {
return myVexContextType; }
292 {
return myRslContextType; }
294 {
return myOTLDefinition.getModTime(); }
296 {
return myOTLDefinition.getIsDummyDefinition(); }
300 {
return myOTLDefinition.getIsPython(); }
302 { myOTLDefinition.setIsPython(is_python); }
306 {
return myOTLDefinition.getExtraInfo(); }
308 {
return myOTLDefinition.getExtraInfoBuffer(); }
313 {
return myOTLDefinition; }
317 { myOTLLibrary = library; }
319 {
return myOTLLibrary; }
323 virtual bool hasSectionData(
const UT_StringRef &name)
const;
325 bool hasContentsSection();
329 {
return getOTLIndexFilePtr(check_timestamp).get(); }
342 virtual void clearOTLIndexFile();
348 FS_IndexFile *createOTLIndexFile(
bool reservedsectionsonly,
353 void getDefinitionSectionName(
UT_String §name)
const;
367 const char *opdef_or_oplib,
368 const char *section_name)
const;
370 const char *opdef_or_oplib,
376 void listContainedOperators(
UT_StringSet &contents_list);
380 const char *getIconName()
const;
381 void setIconName(
const char *name);
382 void setDefaultIconName();
386 {
return myOTLDefinition.getResolvedIcon(); }
391 return myOTLDefinition.resolveRelativeOpDefPath(
396 {
return myOTLDefinition.getMinInputs(); }
398 {
return myOTLDefinition.getMaxInputs(); }
406 { myOTLDefinition.setNumOrderedInputs(inputs); }
408 {
return myOTLDefinition.getNumOrderedInputs(); }
421 void setLegacyInputsMap(
const char *map);
422 void getLegacyInputsMap(
UT_String &map)
const;
430 return isManagementOp()
432 : myOTLDefinition.getMaxOutputs();
437 virtual bool hasLoadedParmTemplates()
const;
438 virtual int updateParmTemplates();
441 virtual void forceUpdateParmTemplates();
467 {
return myBaseOverrideLayout; }
470 {
return myObsoleteTemplates; }
472 { myObsoleteTemplates = tmpl; }
478 bool getOverrideLayoutParmTemplateFile(
500 bool isCustomDSO()
const;
526 return myCreatingNode;
530 return myChangingParmTemplates;
534 return myLoadingContentsSectionCount > 0;
538 myLoadingContentsSectionCount++;
542 myLoadingContentsSectionCount--;
550 return getNumActiveNodes() > 0 || myRefreshingLib;
554 OP_COMPARE_GEN_ENGLISH = 0,
555 OP_COMPARE_GEN_NAME = 1,
556 OP_COMPARE_ENGLISH = 2,
562 virtual int compareOperator(
const OP_Operator *other,
571 {
return myInputNames; }
574 {
return myInputLabels; }
577 {
return myInputReferences; }
578 virtual bool allowsInputNameEditing()
const;
583 {
return myOutputLabels; }
586 unsigned getPermissionMask()
const;
594 virtual bool wantsParametersAnimatable()
const;
597 virtual bool wantsInputEditor()
const;
600 virtual bool wantsParmOrderEditor()
const;
603 virtual bool wantsOutputNameEditor()
const;
606 virtual bool wantsParentInputs()
const;
610 {
return myInputDataEditorConfig; }
613 { myInputDataEditorConfig = config; }
614 void setInputDataEditorConfig(
619 virtual const char *getOperatorShortHelpString();
624 virtual void getOperatorSpecificInfoText(
int verbose,
636 virtual void fillInfoTreeOperatorSpecific(
UT_InfoTree &tree,
640 static int loadFromOpType(
const char *fname,
const char *savedir);
641 static int uninstallOpType(
const char *
path,
642 const char *tablename,
const char *opname,
643 const char *indexpath,
const char *indexfile);
645 static void removeHelpCardOverrides(
UT_FileUtil *fu,
646 const char *
path,
const char *tablename,
647 const char *opname,
int flags);
649 const char *
path,
const char *tablename,
650 const char *opname,
int flags);
652 const char *
path,
const char *tablename,
653 const char *opname,
int flags);
655 const char *
path,
const char *tablename,
656 const char *opname,
int flags);
658 static void getDefaultIconName(
const char *tablename,
665 const char *getTableName()
const;
681 void setDefinition(
const char *def);
683 void setEnglish(
const char *english);
687 void informOfTabMenuFlagChange();
691 virtual void setName(
const char *name);
702 void setMinInputs(
int inputs);
703 void setMaxInputs(
int inputs);
704 void setIsGenerator(
bool isgen);
708 void updatePresetInfo();
728 bool full_path =
false,
730 bool *node_deleted_by_script =
nullptr);
736 {
return myPythonModuleDicts; }
738 {
return myHasLoadedPythonModuleSection; }
739 void loadPythonModuleSection(
bool force=
false);
742 {
return myViewerStateModuleDicts; }
744 {
return myHasLoadedViewerStateModuleSection; }
745 void loadViewerStateModuleSection(
bool force=
false);
748 {
return myViewerHandleModuleDicts; }
750 {
return myHasLoadedViewerHandleModuleSection; }
751 void loadViewerHandleModuleSection(
bool force=
false);
754 void clearEventScriptPathCache();
757 void getCachedEventScriptPaths(
760 bool only_nonempty)
const;
766 {
return myIsThreadSafe; }
771 { myIsThreadSafe = is_safe; }
773 static const char *getCurrentPythonModuleKey();
774 static const OP_Operator *mapSecurityKeyToOperator(
const char *key);
775 static void registerPythonModuleKeyClient(
void *client);
776 static bool verifyPythonModuleKeyClient(
798 void notifyUpdateTemplatesSinksOfUpdate();
800 void notifyUpdateTemplatesSinksOfDelete();
803 void notifyActiveNodesOfTemplatesUpdate();
812 { myDescriptiveParmName = parm; }
814 void dirtyParmTemplatesLoaded();
816 virtual bool loadParmTemplatesSubclass();
819 bool loadAndCreateLayoutParmTemplates(
826 int base_controls_switcher_index,
827 int base_controls_insert_index,
828 int base_controls_switcher_page_num,
830 bool hide_default_parms);
871 void getContentSectionTypeNames(
UT_IStream &is,
875 static void handleDefiningNetworkChange(
OP_Node *caller,
887 bool &node_deleted_by_script,
889 void runHscriptEventScript(
891 const char *script_path,
894 const char *extra_args);
895 void runPythonEventScript(
897 const char *script_path,
899 const char *kwargs_dict,
901 const char *script_source);
903 void formatErrorSource(
910 OP_EventScriptPathCache *getEventScriptPathCache();
914 void loadOverrideLayoutParmTemplates();
916 void ensureParmTemplatesLoaded();
928 OP_EventScriptPathCache *myEventScriptPathCache;
930 bool myChangingParmTemplates;
931 bool myRefreshingLib;
932 bool myDestroyingSelf;
933 int myLoadingContentsSectionCount;
938 bool myHasLoadedPythonModuleSection;
941 bool myHasLoadedViewerStateModuleSection;
944 bool myHasLoadedViewerHandleModuleSection;
957 void updateCachedOpSectionData();
961 friend class SHOP_ScriptOperator;
965 static int ourLastHelpLevel;
967 static bool ourHelpIsHtml;
975 { removeAllTemplatesSinks(); }
979 { removeUpdateTemplatesSink(op); }
985 op->addUpdateTemplatesSink(
this);
986 myOperators.append(op, 1);
990 return myOperators.find(op) >= 0;
995 op->removeUpdateTemplatesSink(
this);
996 myOperators.findAndRemove(op);
1000 for(
int i = myOperators.entries(); i --> 0; )
1001 removeUpdateTemplatesSink(myOperators(i));
unsigned maxInputs() const
virtual ~OP_SpecificData()
unsigned minInputs() const
PRM_ScriptImports * myLayoutParmImports
int getVersion(int version)
std::function< OP_Ptr(OP_Network *, const char *, OP_Operator *)> OP_Constructor
GT_API const UT_StringHolder filename
virtual ~OP_UpdateTemplatesSink()
bool getScriptIsSubnet() const
UT_StringArray myInputLabels
const OP_OTLDefinition & getOTLDefinition() const
void setIsThreadSafe(bool is_safe)
void getTableAndName(UT_String &name) const
bool shouldPreserve() const
static void clearOperatorHelpCache()
CH_LocalVariable * myVariables
bool getScriptIsRsl() const
PRM_Template * myBaseOverrideLayout
GLsizei const GLfloat * value
GLsizei const GLchar *const * path
#define OP_FLAG_NETWORK
Flags passed to the contructor:
const UT_StringHolder & getExtraInfo() const
VEX_ContextType getVexContextType() const
int getVariableCount() const
OP_OTLDefinition myOTLDefinition
virtual void getRefreshPICommands(OP_Node *, std::ostream &)
bool isManagementOp() const
#define OP_FLAG_GENERATOR
GLboolean GLboolean GLboolean GLboolean a
void removeAllTemplatesSinks()
void removeUpdateTemplatesSink(OP_Operator *op)
bool resolveRelativeOpDefPath(UT_WorkBuffer &result, const char *path)
**But if you need a result
void setNumOrderedInputs(int inputs)
PY_EvaluationContext * getViewerHandleModuleDicts()
UT_StringArray myInputNames
UT_StringHolder myChildTableName
#define OP_FLAG_PRIMARYSUBNET
const UT_StringArray & getOutputLabels() const
bool hasLoadedViewerStateModuleSection() const
UT_Array< bool > myInputReferences
const UT_StringHolder & getName() const
virtual void updateExtraInfoBuffer(OP_ExtraInfoBuffer &b) const
bool myHasContentsSection
bool isScriptedOp() const
virtual bool getHDKHelp(UT_String &) const
const OP_ExtraInfoBuffer & getExtraInfoBuffer() const
GLint GLint GLsizei GLint GLenum GLenum type
const UT_StringHolder & getIndexFile() const
FS_IndexFile * getOTLIndexFile(bool check_timestamp=true)
#define OP_FLAG_SCRIPTDEF
virtual const OP_SpecificData * getOpSpecificData() const
static int operatorNameCompare(const OP_Operator *a, const OP_Operator *b)
std::shared_ptr< T > UT_SharedPtr
Wrapper around std::shared_ptr.
bool getIsPrimarySubnetType() const
bool isCreatingNode() const
bool hasLoadedViewerHandleModuleSection() const
int numOrderedInputs() const
void setInputDataEditorConfigEx(const OP_InputDataEditorConfigEx &config)
UT_DeepString myTabSubmenuPath
PRM_Template * myLayoutParmTemplates
bool hasLoadedPythonModuleSection() const
bool isChangingParmTemplates() const
bool operator<(const GU_TetrahedronFacet &a, const GU_TetrahedronFacet &b)
UT_StringHolder myOverriddenOperatorName
PY_EvaluationContext * getViewerStateModuleDicts()
void setScriptIsPython(bool is_python)
UT_StringArray myOutputLabels
time_t getModTime() const
GLuint const GLchar * name
bool isThreadSafe() const
const UT_StringArray & getInputLabels() const
Accessing operator inputs name, label, and reference flag.
RSL_ContextType getRslContextType() const
GLboolean GLboolean GLboolean b
void setDescriptiveParmName(const UT_StringHolder &parm)
void setObsoleteTemplates(PRM_Template *tmpl)
PRM_Template * getBaseOverrideLayoutParmTemplates()
void beginLoadingContentsSectionForNode()
GT_API const UT_StringHolder version
PRM_Template * myObsoleteTemplates
A map of string to various well defined value types.
void getTableAndName(UT_WorkBuffer &name) const
const UT_StringArray & getInputNames() const
Accessing operator inputs name, label, and reference flag.
GA_API const UT_StringHolder parms
Parameters for OP_Node::fillInfoTree()/OP_Node::fillInfoTreeNodeSpecific()
section HDK_USDHydraEventScripts USD a python event script is run This gives the render delegate the opportunity to perform any required external initialization or other renderer specific action that may be required The script is found by searching the HOUDINI_SCRIPT_PATH for a file named scene DelegateName_Events py Within this file should be two functions
UT_ValArray< OP_Operator * > OP_OperatorList
SIM_API const UT_StringHolder force
virtual unsigned maxOutputs()
bool hasTemplatesSink(OP_Operator *op)
#define OP_FLAG_UNORDERED
PRM_Template * myParmTemplates
void endLoadingContentsSectionForNode()
VEX_ContextType myVexContextType
OP_OTLLibrary * getOTLLibrary()
CH_LocalVariable * getVariables() const
virtual OP_SpecificData * getOpSpecificData()
const UT_StringHolder & getIndexPath() const
bool getScriptIsVex() const
RSL_ContextType
RenderMan shader context types.
#define OP_FLAG_EDITABLE_INPUT_DATA
bool myParmTemplatesLoaded
UT_SharedPtr< PRM_ScriptPage > myOverrideLayoutParmScriptPage
bool getIsDummyDefinition() const
virtual void operatorDeleted(OP_Operator *op)
const UT_Array< bool > & getInputAreReferences() const
Accessing operator inputs name, label, and reference flag.
PRM_ScriptImports * myImports
virtual PRM_Template * getObsoleteTemplates()
UT_StringHolder getResolvedIconName() const
Get icon name with opdef:.?section references resolved.
const OP_InputDataEditorConfigEx & getInputDataEditorConfigEx() const
PY_EvaluationContext * getPythonModuleDicts()
virtual const PRM_Template * getBaseParmTemplates()
void addUpdateTemplatesSink(OP_Operator *op)
bool getScriptIsPython() const
const UT_StringHolder & getEnglish() const
OP_InputDataEditorConfigEx myInputDataEditorConfig
RSL_ContextType myRslContextType
bool hasNodeLoadingContentsSection() const
bool unorderedInputs() const
void setOTLLibrary(OP_OTLLibrary *library)
bool hasEditableInputData() const