Plasma Engine  2.0
Loading...
Searching...
No Matches
ScriptCoroutine.h
1#pragma once
2
3#include <Core/CoreDLL.h>
4
5#include <Core/Scripting/ScriptRTTI.h>
6
8
10
16{
17 PL_DECLARE_HANDLE_TYPE(plScriptCoroutineHandle, plScriptCoroutineId);
18};
19
20PL_DECLARE_REFLECTABLE_TYPE(PL_CORE_DLL, plScriptCoroutineHandle);
21PL_DECLARE_CUSTOM_VARIANT_TYPE(plScriptCoroutineHandle);
22
34class PL_CORE_DLL plScriptCoroutine
35{
36public:
38 virtual ~plScriptCoroutine();
39
40 plScriptCoroutineHandle GetHandle() { return plScriptCoroutineHandle(m_Id); }
41
42 plStringView GetName() const { return m_sName; }
43
44 plScriptInstance* GetScriptInstance() { return m_pInstance; }
45 const plScriptInstance* GetScriptInstance() const { return m_pInstance; }
46
47 plScriptWorldModule* GetScriptWorldModule() { return m_pOwnerModule; }
48 const plScriptWorldModule* GetScriptWorldModule() const { return m_pOwnerModule; }
49
50 struct Result
51 {
52 struct State
53 {
54 using StorageType = plUInt8;
55
56 enum Enum
57 {
58 Invalid,
59 Running,
60 Completed,
61 Failed,
62
63 Default = Invalid,
64 };
65 };
66
67 static PL_ALWAYS_INLINE Result Running(plTime maxDelay = plTime::MakeZero()) { return {State::Running, maxDelay}; }
68 static PL_ALWAYS_INLINE Result Completed() { return {State::Completed}; }
69 static PL_ALWAYS_INLINE Result Failed() { return {State::Failed}; }
70
71 plEnum<State> m_State;
72 plTime m_MaxDelay = plTime::MakeZero();
73 };
74
75 virtual void StartWithVarargs(plArrayPtr<plVariant> arguments) = 0;
76 virtual void Stop() {}
77 virtual Result Update(plTime deltaTimeSinceLastUpdate) = 0;
78
79 void UpdateAndSchedule(plTime deltaTimeSinceLastUpdate = plTime::MakeZero());
80
81private:
82 friend class plScriptWorldModule;
83 void Initialize(plScriptCoroutineId id, plStringView sName, plScriptInstance& inout_instance, plScriptWorldModule& inout_ownerModule);
84 void Deinitialize();
85
86 static const plAbstractFunctionProperty* GetUpdateFunctionProperty();
87
89 plHashedString m_sName;
90 plScriptInstance* m_pInstance = nullptr;
91 plScriptWorldModule* m_pOwnerModule = nullptr;
92};
93
94PL_DECLARE_REFLECTABLE_TYPE(PL_CORE_DLL, plScriptCoroutine);
95
97template <typename Derived, class... Args>
99{
100private:
101 template <std::size_t... I>
102 PL_ALWAYS_INLINE void StartImpl(plArrayPtr<plVariant> arguments, std::index_sequence<I...>)
103 {
104 static_cast<Derived*>(this)->Start(plVariantAdapter<typename getArgument<I, Args...>::Type>(arguments[I])...);
105 }
106
107 virtual void StartWithVarargs(plArrayPtr<plVariant> arguments) override
108 {
109 StartImpl(arguments, std::make_index_sequence<sizeof...(Args)>{});
110 }
111};
112
118{
119 using StorageType = plUInt8;
120
121 enum Enum
122 {
126
127 Default = StopOther
128 };
129};
130
131PL_DECLARE_REFLECTABLE_TYPE(PL_CORE_DLL, plScriptCoroutineCreationMode);
132
138class PL_CORE_DLL plScriptCoroutineRTTI : public plRTTI, public plRefCountingImpl
139{
140public:
143
144private:
145 plString m_sTypeNameStorage;
146 plUniquePtr<plRTTIAllocator> m_pAllocatorStorage;
147};
148
151{
152public:
155
157 virtual const plRTTI* GetReturnType() const override { return nullptr; }
158 virtual plBitflags<plPropertyFlags> GetReturnFlags() const override { return plPropertyFlags::Void; }
159 virtual plUInt32 GetArgumentCount() const override { return 0; }
160 virtual const plRTTI* GetArgumentType(plUInt32 uiParamIndex) const override { return nullptr; }
161 virtual plBitflags<plPropertyFlags> GetArgumentFlags(plUInt32 uiParamIndex) const override { return plPropertyFlags::Void; }
162
163 virtual void Execute(void* pInstance, plArrayPtr<plVariant> arguments, plVariant& out_returnValue) const override;
164
165protected:
168};
169
172{
173public:
176
177 static void Dispatch(plAbstractMessageHandler* pSelf, void* pInstance, plMessage& ref_msg);
178
179protected:
180 plHashedString m_sName;
183};
184
186template <>
188{
189 PL_ALWAYS_INLINE static plUInt32 Hash(plScriptCoroutineHandle value) { return plHashHelper<plUInt32>::Hash(value.GetInternalID().m_Data); }
190
191 PL_ALWAYS_INLINE static bool Equal(plScriptCoroutineHandle a, plScriptCoroutineHandle b) { return a == b; }
192};
193
195PL_ALWAYS_INLINE void operator<<(plStreamWriter& inout_stream, const plScriptCoroutineHandle& hValue) {}
196PL_ALWAYS_INLINE void operator>>(plStreamReader& inout_stream, plScriptCoroutineHandle& ref_hValue) {}
The base class for a property that represents a function.
Definition AbstractProperty.h:535
The base class for all message handlers that a type provides.
Definition MessageHandler.h:12
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
This class is optimized to take nearly no memory (sizeof(void*)) and to allow very fast checks whethe...
Definition HashedString.h:25
Base class for all message types. Each message type has it's own id which is used to dispatch message...
Definition Message.h:22
This class holds information about reflected types. Each instance represents one type that is known t...
Definition RTTI.h:30
Definition RefCounted.h:7
A function property that creates an instance of the given coroutine type and starts it immediately.
Definition ScriptCoroutine.h:151
virtual plUInt32 GetArgumentCount() const override
Returns the number of arguments.
Definition ScriptCoroutine.h:159
virtual const plRTTI * GetArgumentType(plUInt32 uiParamIndex) const override
Returns the type of the given argument.
Definition ScriptCoroutine.h:160
virtual plFunctionType::Enum GetFunctionType() const override
Returns the type of function, see plFunctionPropertyType::Enum.
Definition ScriptCoroutine.h:156
virtual plBitflags< plPropertyFlags > GetArgumentFlags(plUInt32 uiParamIndex) const override
Returns the property flags of the given argument.
Definition ScriptCoroutine.h:161
virtual plBitflags< plPropertyFlags > GetReturnFlags() const override
Returns property flags of the return value.
Definition ScriptCoroutine.h:158
virtual const plRTTI * GetReturnType() const override
Returns the type of the return value.
Definition ScriptCoroutine.h:157
Base class of script coroutines.
Definition ScriptCoroutine.h:35
A message handler that creates an instance of the given coroutine type and starts it immediately.
Definition ScriptCoroutine.h:172
A coroutine type that stores a custom allocator.
Definition ScriptCoroutine.h:139
Definition ScriptRTTI.h:38
Definition ScriptRTTI.h:66
Definition ScriptRTTI.h:54
Definition ScriptWorldModule.h:13
A Shared ptr manages a shared object and destroys that object when no one references it anymore....
Definition SharedPtr.h:10
Interface for binary in (read) streams.
Definition Stream.h:22
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
Base class of coroutines which are implemented in C++ to allow automatic unpacking of the arguments f...
Definition ScriptCoroutine.h:99
A Unique ptr manages an object and destroys that object when it goes out of scope....
Definition UniquePtr.h:10
plVariant is a class that can store different types of variables, which is useful in situations where...
Definition Variant.h:44
Use getArgument<N, Args...>::Type to get the type of the Nth argument in Args.
Definition AbstractProperty.h:383
The plBitflags class allows you to work with type-safe bitflags.
Definition Bitflags.h:82
A custom enum implementation that allows to define the underlying storage type to control its memory ...
Definition Enum.h:37
Enum
Definition AbstractProperty.h:525
@ Member
A normal member function, a valid instance pointer must be provided to call.
Definition AbstractProperty.h:526
Helper struct to calculate the Hash of different types.
Definition HashingUtils.h:75
Definition ScriptCoroutine.h:53
Definition ScriptCoroutine.h:51
Mode that decides what should happen if a new coroutine is created while there is already another cor...
Definition ScriptCoroutine.h:118
Enum
Definition ScriptCoroutine.h:122
@ DontCreateNew
Don't create a new coroutine if there is already one running with the same name.
Definition ScriptCoroutine.h:124
@ AllowOverlap
Allow multiple overlapping coroutines with the same name.
Definition ScriptCoroutine.h:125
@ StopOther
Stop the other coroutine before creating a new one with the same name.
Definition ScriptCoroutine.h:123
A handle to a script coroutine which can be used to determine whether a coroutine is still running ev...
Definition ScriptCoroutine.h:16
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
Used to implicitly retrieve any value from an plVariant to be used as a function argument using the a...
Definition VariantAdapter.h:211