Plasma Engine  2.0
Loading...
Searching...
No Matches
VisualScriptCompiler.h
1#pragma once
2
3#include <EditorPluginVisualScript/VisualScriptGraph/VisualScriptGraph.h>
4
6{
7public:
10
11 void InitModule(plStringView sBaseClassName, plStringView sScriptClassName);
12
13 plResult AddFunction(plStringView sName, const plDocumentObject* pEntryObject, const plDocumentObject* pParentObject = nullptr);
14
15 plResult Compile(plStringView sDebugAstOutputPath = plStringView());
16
25
27 {
29
30 plResult Serialize(plStreamWriter& inout_stream) const;
31
32 plString m_sBaseClassName;
33 plString m_sScriptClassName;
35
36 plVisualScriptDataDescription m_InstanceDataDesc;
37 plVisualScriptInstanceDataMapping m_InstanceDataMapping;
38
39 plVisualScriptDataDescription m_ConstantDataDesc;
40 plVisualScriptDataStorage m_ConstantDataStorage;
41 };
42
43 const CompiledModule& GetCompiledModule() const { return m_Module; }
44
45 struct AstNode;
46
47 struct DataInput
48 {
49 PL_DECLARE_POD_TYPE();
50
51 AstNode* m_pSourceNode = nullptr;
52 plUInt32 m_uiId = 0;
53 plUInt8 m_uiSourcePinIndex = 0;
55 };
56
58 {
59 plSmallArray<AstNode*, 3> m_TargetNodes;
60 plUInt32 m_uiId = 0;
62 };
63
64 struct AstNode
65 {
67 plEnum<plVisualScriptDataType> m_DeductedDataType;
68 bool m_bImplicitExecution = false;
69
70 plHashedString m_sTargetTypeName;
71 plVariant m_Value;
72
76 };
77
78#if PL_ENABLED(PL_PLATFORM_64BIT)
79 static_assert(sizeof(AstNode) == 256);
80#endif
81
82private:
84
85 PL_ALWAYS_INLINE static plStringView GetNiceTypeName(const plDocumentObject* pObject)
86 {
87 return plVisualScriptNodeManager::GetNiceTypeName(pObject);
88 }
89
90 PL_ALWAYS_INLINE plVisualScriptDataType::Enum GetDeductedType(const plDocumentObject* pObject) const
91 {
92 return m_pManager->GetDeductedType(pObject);
93 }
94
95 plUInt32 GetPinId(const plVisualScriptPin* pPin);
96 DataOutput& GetDataOutput(const DataInput& dataInput);
97 AstNode& CreateAstNode(plVisualScriptNodeDescription::Type::Enum type, plVisualScriptDataType::Enum deductedDataType = plVisualScriptDataType::Invalid, bool bImplicitExecution = false);
98 PL_ALWAYS_INLINE AstNode& CreateAstNode(plVisualScriptNodeDescription::Type::Enum type, bool bImplicitExecution)
99 {
100 return CreateAstNode(type, plVisualScriptDataType::Invalid, bImplicitExecution);
101 }
102
103 void AddDataInput(AstNode& node, AstNode* pSourceNode, plUInt8 uiSourcePinIndex, plVisualScriptDataType::Enum dataType);
104 void AddDataOutput(AstNode& node, plVisualScriptDataType::Enum dataType);
105
106 struct DefaultInput
107 {
108 AstNode* m_pSourceNode = nullptr;
109 plUInt8 m_uiSourcePinIndex = 0;
110 };
111
112 DefaultInput GetDefaultPointerInput(const plRTTI* pDataType);
113 AstNode* CreateConstantNode(const plVariant& value);
114 AstNode* CreateJumpNode(AstNode* pTargetNode);
115
116 DataOffset GetInstanceDataOffset(plHashedString sName, plVisualScriptDataType::Enum dataType);
117
118 struct ConnectionType
119 {
120 enum Enum
121 {
122 Execution,
123 Data,
124 };
125 };
126
127 struct Connection
128 {
129 AstNode* m_pSource = nullptr;
130 AstNode* m_pTarget = nullptr;
131 ConnectionType::Enum m_Type = ConnectionType::Execution;
132 plUInt32 m_uiSourcePinIndex = 0;
133 };
134
135 AstNode* BuildAST(const plDocumentObject* pEntryNode);
136 void MarkAsCoroutine(AstNode* pEntryAstNode);
137 plResult ReplaceUnsupportedNodes(AstNode* pEntryAstNode);
138 plResult ReplaceLoop(Connection& connection);
139 plResult InsertTypeConversions(AstNode* pEntryAstNode);
140 plResult InlineConstants(AstNode* pEntryAstNode);
141 plResult InlineVariables(AstNode* pEntryAstNode);
142 plResult BuildDataStack(AstNode* pEntryAstNode, plDynamicArray<AstNode*>& out_Stack);
143 plResult BuildDataExecutions(AstNode* pEntryAstNode);
144 plResult FillDataOutputConnections(AstNode* pEntryAstNode);
145 plResult AssignLocalVariables(AstNode* pEntryAstNode, plVisualScriptDataDescription& inout_localDataDesc);
146 plResult BuildNodeDescriptions(AstNode* pEntryAstNode, plDynamicArray<plVisualScriptNodeDescription>& out_NodeDescriptions);
147
148 struct ConnectionHasher
149 {
150 static plUInt32 Hash(const Connection& c);
151 static bool Equal(const Connection& a, const Connection& b);
152 };
153
154 enum class VisitorResult
155 {
156 Continue,
157 Skip,
158 Stop,
159 Error,
160 };
161
162 using AstNodeVisitorFunc = plDelegate<VisitorResult(Connection& connection)>;
163 plResult TraverseExecutionConnections(AstNode* pEntryAstNode, AstNodeVisitorFunc func, bool bDeduplicate = true);
164 plResult TraverseDataConnections(AstNode* pEntryAstNode, AstNodeVisitorFunc func, bool bDeduplicate = true, bool bClearReportedConnections = true);
165 plResult TraverseAllConnections(AstNode* pEntryAstNode, AstNodeVisitorFunc func, bool bDeduplicate = true);
166
167 plResult FinalizeDataOffsets();
168 plResult FinalizeConstantData();
169
170 void DumpAST(AstNode* pEntryAstNode, plStringView sOutputPath, plStringView sFunctionName, plStringView sSuffix);
171 void DumpGraph(plArrayPtr<const plVisualScriptNodeDescription> nodeDescriptions, plStringView sOutputPath, plStringView sFunctionName, plStringView sSuffix);
172
173 const plVisualScriptNodeManager* m_pManager = nullptr;
174
175 plDeque<AstNode> m_AstNodes;
176 plHybridArray<AstNode*, 8> m_EntryAstNodes;
178
179 plHashSet<Connection, ConnectionHasher> m_ReportedConnections;
180
182 plUInt32 m_uiNextPinId = 0;
183
184 struct DataDesc
185 {
186 PL_DECLARE_POD_TYPE();
187
188 DataOffset m_DataOffset;
189 plUInt32 m_uiUsageCounter = 0;
190 };
191
192 plHashTable<plUInt32, DataDesc> m_PinIdToDataDesc;
193
194 plHashTable<plVariant, plUInt32> m_ConstantDataToIndex;
195
196 CompiledModule m_Module;
197};
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
Definition Deque.h:270
Definition DocumentObjectBase.h:11
Definition DynamicArray.h:81
Definition HashSet.h:191
Definition HashTable.h:333
This class is optimized to take nearly no memory (sizeof(void*)) and to allow very fast checks whethe...
Definition HashedString.h:25
A hybrid array uses in-place storage to handle the first few elements without any allocation....
Definition HybridArray.h:12
This class holds information about reflected types. Each instance represents one type that is known t...
Definition RTTI.h:30
Definition SmallArray.h:219
Interface for binary out (write) streams.
Definition Stream.h:107
plStringView represent a read-only sub-string of a larger string, as it can store a dedicated string ...
Definition StringView.h:34
plVariant is a class that can store different types of variables, which is useful in situations where...
Definition Variant.h:44
Definition VisualScriptCompiler.h:6
Definition VisualScriptData.h:91
Definition VisualScriptGraph.h:41
Definition VisualScriptGraph.h:7
A generic delegate class which supports static functions and member functions.
Definition Delegate.h:76
A custom enum implementation that allows to define the underlying storage type to control its memory ...
Definition Enum.h:37
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54
Definition VisualScriptCompiler.h:65
Definition VisualScriptCompiler.h:18
Definition VisualScriptCompiler.h:27
Definition VisualScriptCompiler.h:48
Definition VisualScriptCompiler.h:58
Definition VisualScriptData.h:10
Definition VisualScriptData.h:8