Plasma Engine  2.0
Loading...
Searching...
No Matches
VisualScriptNodeRegistry.h
1#pragma once
2
3#include <Foundation/Configuration/Singleton.h>
4#include <VisualScriptPlugin/Runtime/VisualScript.h>
5
8
10{
11 PL_DECLARE_SINGLETON(plVisualScriptNodeRegistry);
12
13public:
14 struct PinDesc
15 {
16 plHashedString m_sName;
17 plHashedString m_sDynamicPinProperty;
18 const plRTTI* m_pDataType = nullptr;
19
20 using DeductTypeFunc = plVisualScriptDataType::Enum (*)(const plVisualScriptPin& pin);
21 DeductTypeFunc m_DeductTypeFunc = nullptr;
22
23 plEnum<plVisualScriptDataType> m_ScriptDataType;
24 bool m_bRequired = false;
25 bool m_bSplitExecution = false;
26 bool m_bReplaceWithArray = false;
27
28 PL_ALWAYS_INLINE bool IsExecutionPin() const { return m_ScriptDataType == plVisualScriptDataType::Invalid; }
29 PL_ALWAYS_INLINE bool IsDataPin() const { return m_ScriptDataType != plVisualScriptDataType::Invalid; }
30
31 static plColor GetColorForScriptDataType(plVisualScriptDataType::Enum dataType);
32 plColor GetColor() const;
33 };
34
35 struct NodeDesc
36 {
37 plSmallArray<PinDesc, 4> m_InputPins;
38 plSmallArray<PinDesc, 4> m_OutputPins;
39 plHashedString m_sFilterByBaseClass;
40 const plRTTI* m_pTargetType = nullptr;
42
43 using DeductTypeFunc = plVisualScriptDataType::Enum (*)(const plDocumentObject* pObject, const plVisualScriptPin* pDisconnectedPin);
44 DeductTypeFunc m_DeductTypeFunc = nullptr;
45
47 bool m_bImplicitExecution = true;
48 bool m_bHasDynamicPins = false;
49
50 void AddInputExecutionPin(plStringView sName, const plHashedString& sDynamicPinProperty = plHashedString());
51 void AddOutputExecutionPin(plStringView sName, const plHashedString& sDynamicPinProperty = plHashedString(), bool bSplitExecution = false);
52
53 void AddInputDataPin(plStringView sName, const plRTTI* pDataType, plVisualScriptDataType::Enum scriptDataType, bool bRequired, const plHashedString& sDynamicPinProperty = plHashedString(), PinDesc::DeductTypeFunc deductTypeFunc = nullptr, bool bReplaceWithArray = false);
54 void AddOutputDataPin(plStringView sName, const plRTTI* pDataType, plVisualScriptDataType::Enum scriptDataType, const plHashedString& sDynamicPinProperty = plHashedString(), PinDesc::DeductTypeFunc deductTypeFunc = nullptr);
55
56 PL_ALWAYS_INLINE bool NeedsTypeDeduction() const { return m_DeductTypeFunc != nullptr; }
57 };
58
61
62 const plRTTI* GetNodeBaseType() const { return m_pBaseType; }
63 const plRTTI* GetVariableSetterType() const { return m_pSetVariableType; }
64 const plRTTI* GetVariableGetterType() const { return m_pGetVariableType; }
65 const NodeDesc* GetNodeDescForType(const plRTTI* pRtti) const { return m_TypeToNodeDescs.GetValue(pRtti); }
66
68 {
69 const plRTTI* m_pType = nullptr;
70 plStringView m_sTypeName;
71 plHashedString m_sCategory;
72 plUInt32 m_uiPropertyValuesStart;
73 plUInt32 m_uiPropertyValuesCount;
74 };
75
76 const plArrayPtr<const NodeCreationTemplate> GetNodeCreationTemplates() const { return m_NodeCreationTemplates; }
77 const plArrayPtr<const plNodePropertyValue> GetPropertyValues() const { return m_PropertyValues; }
78
79 static constexpr const char* s_szTypeNamePrefix = "VisualScriptNode_";
80 static constexpr plUInt32 s_uiTypeNamePrefixLength = plStringUtils::GetStringElementCount(s_szTypeNamePrefix);
81
82private:
83 void PhantomTypeRegistryEventHandler(const plPhantomRttiManagerEvent& e);
84 void UpdateNodeTypes();
85 void UpdateNodeType(const plRTTI* pRtti, bool bForceExpose = false);
86
87 plResult GetScriptDataType(const plRTTI* pRtti, plVisualScriptDataType::Enum& out_scriptDataType, plStringView sFunctionName = plStringView(), plStringView sArgName = plStringView());
88 plVisualScriptDataType::Enum GetScriptDataType(const plAbstractProperty* pProp);
89
90 template <typename T>
91 void AddInputDataPin(plReflectedTypeDescriptor& ref_typeDesc, NodeDesc& ref_nodeDesc, plStringView sName);
92 void AddInputDataPin_Any(plReflectedTypeDescriptor& ref_typeDesc, NodeDesc& ref_nodeDesc, plStringView sName, bool bRequired, bool bAddVariantProperty = false, PinDesc::DeductTypeFunc deductTypeFunc = nullptr);
93
94 template <typename T>
95 void AddOutputDataPin(NodeDesc& ref_nodeDesc, plStringView sName);
96
97 void CreateBuiltinTypes();
98 void CreateGetOwnerNodeType(const plRTTI* pRtti);
99 void CreateFunctionCallNodeType(const plRTTI* pRtti, const plHashedString& sCategory, const plAbstractFunctionProperty* pFunction, const plScriptableFunctionAttribute* pScriptableFunctionAttribute, bool bIsEntryFunction);
100 void CreateCoroutineNodeType(const plRTTI* pRtti);
101 void CreateMessageNodeTypes(const plRTTI* pRtti);
102 void CreateEnumNodeTypes(const plRTTI* pRtti);
103
104 void FillDesc(plReflectedTypeDescriptor& desc, const plRTTI* pRtti, const plColorGammaUB* pColorOverride = nullptr);
105 void FillDesc(plReflectedTypeDescriptor& desc, plStringView sTypeName, const plColorGammaUB& color);
106
107 const plRTTI* RegisterNodeType(plReflectedTypeDescriptor& typeDesc, NodeDesc&& nodeDesc, const plHashedString& sCategory);
108
109 const plRTTI* m_pBaseType = nullptr;
110 const plRTTI* m_pSetPropertyType = nullptr;
111 const plRTTI* m_pGetPropertyType = nullptr;
112 const plRTTI* m_pSetVariableType = nullptr;
113 const plRTTI* m_pGetVariableType = nullptr;
114 bool m_bBuiltinTypesCreated = false;
115 plMap<const plRTTI*, NodeDesc> m_TypeToNodeDescs;
116 plHashSet<const plRTTI*> m_ExposedTypes;
117
118 plDynamicArray<NodeCreationTemplate> m_NodeCreationTemplates;
120 plDeque<plString> m_PropertyNodeTypeNames;
121};
The base class for a property that represents a function.
Definition AbstractProperty.h:535
This is the base interface for all properties in the reflection system. It provides enough informatio...
Definition AbstractProperty.h:150
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
A 8bit per channel unsigned normalized (values interpreted as 0-1) color storage format that represen...
Definition Color8UNorm.h:99
plColor represents an RGBA color in linear color space. Values are stored as float,...
Definition Color.h:44
Definition Deque.h:270
Definition DocumentObjectBase.h:11
Definition DynamicArray.h:81
Definition HashSet.h:191
This class is optimized to take nearly no memory (sizeof(void*)) and to allow very fast checks whethe...
Definition HashedString.h:25
Definition Map.h:408
This class holds information about reflected types. Each instance represents one type that is known t...
Definition RTTI.h:30
Attribute to mark a function up to be exposed to the scripting system. Arguments specify the names of...
Definition PropertyAttributes.h:1006
Definition SmallArray.h:219
static constexpr plUInt32 GetStringElementCount(const T *pString)
Returns the number of elements of type T that the string contains, until it hits an element that is z...
Definition StringUtils_inl.h:45
plStringView represent a read-only sub-string of a larger string, as it can store a dedicated string ...
Definition StringView.h:34
Definition VisualScriptNodeRegistry.h:10
Definition VisualScriptGraph.h:7
A custom enum implementation that allows to define the underlying storage type to control its memory ...
Definition Enum.h:37
Definition DocumentNodeManager.h:105
Definition PhantomRttiManager.h:10
Stores the description of a reflected type in a serializable form. Used by plPhantomRttiManager to ad...
Definition ReflectedType.h:95
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54
Definition VisualScriptNodeRegistry.h:68
Definition VisualScriptNodeRegistry.h:36
Definition VisualScriptNodeRegistry.h:15