Plasma Engine  2.0
Loading...
Searching...
No Matches
VisualScript.h
1#pragma once
2
3#include <Core/Scripting/ScriptCoroutine.h>
4#include <VisualScriptPlugin/Runtime/VisualScriptData.h>
5
8
9struct PL_VISUALSCRIPTPLUGIN_DLL plVisualScriptNodeDescription
10{
13 struct PL_VISUALSCRIPTPLUGIN_DLL Type
14 {
15 using StorageType = plUInt8;
16
17 enum Enum
18 {
19 Invalid,
20 EntryCall,
21 EntryCall_Coroutine,
22 MessageHandler,
23 MessageHandler_Coroutine,
24 ReflectedFunction,
25 GetReflectedProperty,
26 SetReflectedProperty,
27 InplaceCoroutine,
28 GetScriptOwner,
29 SendMessage,
30
31 FirstBuiltin,
32
33 Builtin_Constant, // Editor only
34 Builtin_GetVariable, // Editor only
35 Builtin_SetVariable,
36 Builtin_IncVariable,
37 Builtin_DecVariable,
38
39 Builtin_Branch,
40 Builtin_Switch,
41 Builtin_WhileLoop, // Editor only
42 Builtin_ForLoop, // Editor only
43 Builtin_ForEachLoop, // Editor only
44 Builtin_ReverseForEachLoop, // Editor only
45 Builtin_Break, // Editor only
46 Builtin_Jump, // Editor only
47
48 Builtin_And,
49 Builtin_Or,
50 Builtin_Not,
51 Builtin_Compare,
52 Builtin_CompareExec, // Editor only
53 Builtin_IsValid,
54 Builtin_Select,
55
56 Builtin_Add,
57 Builtin_Subtract,
58 Builtin_Multiply,
59 Builtin_Divide,
60 Builtin_Expression,
61
62 Builtin_ToBool,
63 Builtin_ToByte,
64 Builtin_ToInt,
65 Builtin_ToInt64,
66 Builtin_ToFloat,
67 Builtin_ToDouble,
68 Builtin_ToString,
69 Builtin_String_Format,
70 Builtin_ToHashedString,
71 Builtin_ToVariant,
72 Builtin_Variant_ConvertTo,
73
74 Builtin_MakeArray,
75 Builtin_Array_GetElement,
76 Builtin_Array_SetElement,
77 Builtin_Array_GetCount,
78 Builtin_Array_IsEmpty,
79 Builtin_Array_Clear,
80 Builtin_Array_Contains,
81 Builtin_Array_IndexOf,
82 Builtin_Array_Insert,
83 Builtin_Array_PushBack,
84 Builtin_Array_Remove,
85 Builtin_Array_RemoveAt,
86
87 Builtin_TryGetComponentOfBaseType,
88
89 Builtin_StartCoroutine,
90 Builtin_StopCoroutine,
91 Builtin_StopAllCoroutines,
92 Builtin_WaitForAll,
93 Builtin_WaitForAny,
94 Builtin_Yield,
95
96 LastBuiltin,
97
98 Count,
99 Default = Invalid
100 };
101
102 PL_ALWAYS_INLINE static bool IsEntry(Enum type) { return type >= EntryCall && type <= MessageHandler_Coroutine; }
103 PL_ALWAYS_INLINE static bool IsLoop(Enum type) { return type >= Builtin_WhileLoop && type <= Builtin_ReverseForEachLoop; }
104
105 PL_ALWAYS_INLINE static bool MakesOuterCoroutine(Enum type) { return type == InplaceCoroutine || (type >= Builtin_WaitForAll && type <= Builtin_Yield); }
106
107 PL_ALWAYS_INLINE static bool IsBuiltin(Enum type) { return type > FirstBuiltin && type < LastBuiltin; }
108
109 static Enum GetConversionType(plVisualScriptDataType::Enum targetDataType);
110
111 static const char* GetName(Enum type);
112 };
113
115
116 plEnum<Type> m_Type;
117 plEnum<plVisualScriptDataType> m_DeductedDataType;
118 plSmallArray<plUInt16, 4> m_ExecutionIndices;
119 plSmallArray<DataOffset, 4> m_InputDataOffsets;
120 plSmallArray<DataOffset, 2> m_OutputDataOffsets;
121
122 plHashedString m_sTargetTypeName;
123
124 plVariant m_Value;
125
126 void AppendUserDataName(plStringBuilder& out_sResult) const;
127};
128
129class PL_VISUALSCRIPTPLUGIN_DLL plVisualScriptGraphDescription : public plRefCounted
130{
131 PL_DISALLOW_COPY_AND_ASSIGN(plVisualScriptGraphDescription);
132
133public:
136
137 static plResult Serialize(plArrayPtr<const plVisualScriptNodeDescription> nodes, const plVisualScriptDataDescription& localDataDesc, plStreamWriter& inout_stream);
138 plResult Deserialize(plStreamReader& inout_stream);
139
140 template <typename T, plUInt32 Size>
142 {
143 union
144 {
145 T m_Embedded[Size] = {};
146 T* m_Ptr;
147 };
148
149 static void AddAdditionalDataSize(plArrayPtr<const T> a, plUInt32& inout_uiAdditionalDataSize);
150 static void AddAdditionalDataSize(plUInt32 uiSize, plUInt32 uiAlignment, plUInt32& inout_uiAdditionalDataSize);
151
152 T* Init(plUInt8 uiCount, plUInt8*& inout_pAdditionalData);
153 plResult ReadFromStream(plUInt8& out_uiCount, plStreamReader& inout_stream, plUInt8*& inout_pAdditionalData);
154 };
155
157 {
158 struct State
159 {
160 enum Enum
161 {
162 Completed = 0,
163 ContinueLater = -1,
164
165 Error = -100,
166 };
167 };
168
169 static PL_ALWAYS_INLINE ExecResult Completed() { return {0}; }
170 static PL_ALWAYS_INLINE ExecResult RunNext(int iExecSlot) { return {iExecSlot}; }
171 static PL_ALWAYS_INLINE ExecResult ContinueLater(plTime maxDelay) { return {State::ContinueLater, maxDelay}; }
172 static PL_ALWAYS_INLINE ExecResult Error() { return {State::Error}; }
173
174 int m_NextExecAndState = 0;
175 plTime m_MaxDelay = plTime::MakeZero();
176 };
177
178 struct Node;
179 using ExecuteFunction = ExecResult (*)(plVisualScriptExecutionContext& inout_context, const Node& node);
181 using ExecutionIndicesArray = EmbeddedArrayOrPointer<plUInt16, 4>;
182 using InputDataOffsetsArray = EmbeddedArrayOrPointer<DataOffset, 4>;
183 using OutputDataOffsetsArray = EmbeddedArrayOrPointer<DataOffset, 2>;
184 using UserDataArray = EmbeddedArrayOrPointer<plUInt32, 4>;
185
186 struct Node
187 {
188 ExecuteFunction m_Function = nullptr;
189#if PL_ENABLED(PL_PLATFORM_32BIT)
190 plUInt32 m_uiPadding = 0;
191#endif
192
193 ExecutionIndicesArray m_ExecutionIndices;
194 InputDataOffsetsArray m_InputDataOffsets;
195 OutputDataOffsetsArray m_OutputDataOffsets;
196 UserDataArray m_UserData;
197
199 plUInt8 m_NumExecutionIndices;
200 plUInt8 m_NumInputDataOffsets;
201 plUInt8 m_NumOutputDataOffsets;
202
203 plUInt16 m_UserDataByteSize;
204 plEnum<plVisualScriptDataType> m_DeductedDataType;
205 plUInt8 m_Reserved = 0;
206
207 plUInt32 GetExecutionIndex(plUInt32 uiSlot) const;
208 DataOffset GetInputDataOffset(plUInt32 uiSlot) const;
209 DataOffset GetOutputDataOffset(plUInt32 uiSlot) const;
210
211 template <typename T>
212 const T& GetUserData() const;
213
214 template <typename T>
215 T& InitUserData(plUInt8*& inout_pAdditionalData, plUInt32 uiByteSize = sizeof(T));
216 };
217
218 const Node* GetNode(plUInt32 uiIndex) const;
219
220 bool IsCoroutine() const;
221 plScriptMessageDesc GetMessageDesc() const;
222
223 const plSharedPtr<const plVisualScriptDataDescription>& GetLocalDataDesc() const;
224
225private:
227 plBlob m_Storage;
228
230};
231
232
233class PL_VISUALSCRIPTPLUGIN_DLL plVisualScriptExecutionContext
234{
235public:
238
239 void Initialize(plVisualScriptInstance& inout_instance, plVisualScriptDataStorage& inout_localDataStorage, plArrayPtr<plVariant> arguments);
240 void Deinitialize();
241
243 ExecResult Execute(plTime deltaTimeSinceLastExecution);
244
245 plVisualScriptInstance& GetInstance() { return *m_pInstance; }
246
248
249 template <typename T>
250 const T& GetData(DataOffset dataOffset) const;
251
252 template <typename T>
253 T& GetWritableData(DataOffset dataOffset);
254
255 template <typename T>
256 void SetData(DataOffset dataOffset, const T& value);
257
258 plTypedPointer GetPointerData(DataOffset dataOffset);
259
260 template <typename T>
261 void SetPointerData(DataOffset dataOffset, T ptr, const plRTTI* pType = nullptr);
262
263 plVariant GetDataAsVariant(DataOffset dataOffset, const plRTTI* pExpectedType) const;
264 void SetDataFromVariant(DataOffset dataOffset, const plVariant& value);
265
266 plScriptCoroutine* GetCurrentCoroutine() { return m_pCurrentCoroutine; }
267 void SetCurrentCoroutine(plScriptCoroutine* pCoroutine);
268
269 plTime GetDeltaTimeSinceLastExecution();
270
271private:
273 plVisualScriptInstance* m_pInstance = nullptr;
274 plUInt32 m_uiCurrentNode = 0;
275 plUInt32 m_uiExecutionCounter = 0;
276 plTime m_DeltaTimeSinceLastExecution;
277
278 plVisualScriptDataStorage* m_DataStorage[DataOffset::Source::Count] = {};
279
280 plScriptCoroutine* m_pCurrentCoroutine = nullptr;
281};
282
284{
285 using StorageType = plUInt8;
286
287 enum Enum
288 {
292
293 Default = Direct
294 };
295};
296
297PL_DECLARE_REFLECTABLE_TYPE(PL_VISUALSCRIPTPLUGIN_DLL, plVisualScriptSendMessageMode);
298
299#include <VisualScriptPlugin/Runtime/VisualScript_inl.h>
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
plBlob allows to store simple binary data larger than 4GB. This storage class is used by plImage to a...
Definition Blob.h:319
This class is optimized to take nearly no memory (sizeof(void*)) and to allow very fast checks whethe...
Definition HashedString.h:25
This class holds information about reflected types. Each instance represents one type that is known t...
Definition RTTI.h:30
Base class for reference counted objects.
Definition RefCounted.h:52
Base class of script coroutines.
Definition ScriptCoroutine.h:35
A Shared ptr manages a shared object and destroys that object when no one references it anymore....
Definition SharedPtr.h:10
Definition SmallArray.h:219
Interface for binary in (read) streams.
Definition Stream.h:22
Interface for binary out (write) streams.
Definition Stream.h:107
plStringBuilder is a class that is meant for creating and modifying strings.
Definition StringBuilder.h:35
plVariant is a class that can store different types of variables, which is useful in situations where...
Definition Variant.h:44
Definition VisualScriptData.h:91
Definition VisualScript.h:234
Definition VisualScript.h:130
Definition VisualScriptInstance.h:8
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 ScriptRTTI.h:48
The time class encapsulates a double value storing the time in seconds.
Definition Time.h:12
PL_ALWAYS_INLINE static constexpr plTime MakeZero()
Creates an instance of plTime that was initialized with zero.
Definition Time.h:42
A typed raw pointer.
Definition TypedPointer.h:13
Definition VisualScriptData.h:10
Definition VisualScriptData.h:8
Definition VisualScript.h:157
Definition VisualScript.h:187
Native node types for visual script graphs. Editor only types are not supported at runtime and will b...
Definition VisualScript.h:14
Definition VisualScript.h:10
Definition VisualScript.h:284
Enum
Definition VisualScript.h:288
@ Recursive
Send the message to the target game object and its children.
Definition VisualScript.h:290
@ Event
Send the message as event.
Definition VisualScript.h:291
@ Direct
Directly send the message to the target game object.
Definition VisualScript.h:289