Plasma Engine  2.0
Loading...
Searching...
No Matches
VisualScript_inl.h
1
2// static
3template <typename T, plUInt32 Size>
5{
6 if (a.GetCount() > Size)
7 {
8 inout_uiAdditionalDataSize = plMemoryUtils::AlignSize<plUInt32>(inout_uiAdditionalDataSize, PL_ALIGNMENT_OF(T));
9 inout_uiAdditionalDataSize += a.GetCount() * sizeof(T);
10 }
11}
12
13// static
14template <typename T, plUInt32 Size>
15void plVisualScriptGraphDescription::EmbeddedArrayOrPointer<T, Size>::AddAdditionalDataSize(plUInt32 uiSize, plUInt32 uiAlignment, plUInt32& inout_uiAdditionalDataSize)
16{
17 if (uiSize > Size * sizeof(T))
18 {
19 inout_uiAdditionalDataSize = plMemoryUtils::AlignSize<plUInt32>(inout_uiAdditionalDataSize, uiAlignment);
20 inout_uiAdditionalDataSize += uiSize;
21 }
22}
23
24template <typename T, plUInt32 Size>
25T* plVisualScriptGraphDescription::EmbeddedArrayOrPointer<T, Size>::Init(plUInt8 uiCount, plUInt8*& inout_pAdditionalData)
26{
27 if (uiCount <= Size)
28 {
29 return m_Embedded;
30 }
31
32 inout_pAdditionalData = plMemoryUtils::AlignForwards(inout_pAdditionalData, PL_ALIGNMENT_OF(T));
33 m_Ptr = reinterpret_cast<T*>(inout_pAdditionalData);
34 inout_pAdditionalData += uiCount * sizeof(T);
35 return m_Ptr;
36}
37
38template <typename T, plUInt32 Size>
39plResult plVisualScriptGraphDescription::EmbeddedArrayOrPointer<T, Size>::ReadFromStream(plUInt8& out_uiCount, plStreamReader& inout_stream, plUInt8*& inout_pAdditionalData)
40{
41 plUInt16 uiCount = 0;
42 inout_stream >> uiCount;
43
44 if (uiCount > plMath::MaxValue<plUInt8>())
45 {
46 return PL_FAILURE;
47 }
48 out_uiCount = static_cast<plUInt8>(uiCount);
49
50 T* pTargetPtr = Init(out_uiCount, inout_pAdditionalData);
51 const plUInt64 uiNumBytesToRead = uiCount * sizeof(T);
52 if (inout_stream.ReadBytes(pTargetPtr, uiNumBytesToRead) != uiNumBytesToRead)
53 return PL_FAILURE;
54
55 return PL_SUCCESS;
56}
57
59
60PL_ALWAYS_INLINE plUInt32 plVisualScriptGraphDescription::Node::GetExecutionIndex(plUInt32 uiSlot) const
61{
62 if (uiSlot < m_NumExecutionIndices)
63 {
64 return m_NumExecutionIndices <= PL_ARRAY_SIZE(m_ExecutionIndices.m_Embedded) ? m_ExecutionIndices.m_Embedded[uiSlot] : m_ExecutionIndices.m_Ptr[uiSlot];
65 }
66
67 return plInvalidIndex;
68}
69
70PL_ALWAYS_INLINE plVisualScriptGraphDescription::DataOffset plVisualScriptGraphDescription::Node::GetInputDataOffset(plUInt32 uiSlot) const
71{
72 if (uiSlot < m_NumInputDataOffsets)
73 {
74 return m_NumInputDataOffsets <= PL_ARRAY_SIZE(m_InputDataOffsets.m_Embedded) ? m_InputDataOffsets.m_Embedded[uiSlot] : m_InputDataOffsets.m_Ptr[uiSlot];
75 }
76
77 return {};
78}
79
80PL_ALWAYS_INLINE plVisualScriptGraphDescription::DataOffset plVisualScriptGraphDescription::Node::GetOutputDataOffset(plUInt32 uiSlot) const
81{
82 if (uiSlot < m_NumOutputDataOffsets)
83 {
84 return m_NumOutputDataOffsets <= PL_ARRAY_SIZE(m_OutputDataOffsets.m_Embedded) ? m_OutputDataOffsets.m_Embedded[uiSlot] : m_OutputDataOffsets.m_Ptr[uiSlot];
85 }
86
87 return {};
88}
89
90template <typename T>
91PL_ALWAYS_INLINE const T& plVisualScriptGraphDescription::Node::GetUserData() const
92{
93 PL_ASSERT_DEBUG(m_UserDataByteSize >= sizeof(T), "Invalid data");
94 return *reinterpret_cast<const T*>(m_UserDataByteSize <= sizeof(m_UserData.m_Embedded) ? m_UserData.m_Embedded : m_UserData.m_Ptr);
95}
96
97template <typename T>
98T& plVisualScriptGraphDescription::Node::InitUserData(plUInt8*& inout_pAdditionalData, plUInt32 uiByteSize /*= sizeof(T)*/)
99{
100 m_UserDataByteSize = uiByteSize;
101 auto pUserData = m_UserData.Init(uiByteSize / sizeof(plUInt32), inout_pAdditionalData);
102 PL_CHECK_ALIGNMENT(pUserData, PL_ALIGNMENT_OF(T));
103 return *reinterpret_cast<T*>(pUserData);
104}
105
107
108PL_ALWAYS_INLINE const plVisualScriptGraphDescription::Node* plVisualScriptGraphDescription::GetNode(plUInt32 uiIndex) const
109{
110 return uiIndex < m_Nodes.GetCount() ? &m_Nodes.GetPtr()[uiIndex] : nullptr;
111}
112
113PL_ALWAYS_INLINE bool plVisualScriptGraphDescription::IsCoroutine() const
114{
115 auto entryNodeType = GetNode(0)->m_Type;
116 return entryNodeType == plVisualScriptNodeDescription::Type::EntryCall_Coroutine || entryNodeType == plVisualScriptNodeDescription::Type::MessageHandler_Coroutine;
117}
118
119PL_ALWAYS_INLINE const plSharedPtr<const plVisualScriptDataDescription>& plVisualScriptGraphDescription::GetLocalDataDesc() const
120{
121 return m_pLocalDataDesc;
122}
123
125
126template <typename T>
127PL_FORCE_INLINE const T& plVisualScriptExecutionContext::GetData(DataOffset dataOffset) const
128{
129 return m_DataStorage[dataOffset.m_uiSource]->GetData<T>(dataOffset);
130}
131
132template <typename T>
133PL_FORCE_INLINE T& plVisualScriptExecutionContext::GetWritableData(DataOffset dataOffset)
134{
135 PL_ASSERT_DEBUG(dataOffset.IsConstant() == false, "Can't write to constant data");
136 return m_DataStorage[dataOffset.m_uiSource]->GetWritableData<T>(dataOffset);
137}
138
139template <typename T>
140PL_FORCE_INLINE void plVisualScriptExecutionContext::SetData(DataOffset dataOffset, const T& value)
141{
142 PL_ASSERT_DEBUG(dataOffset.IsConstant() == false, "Outputs can't set constant data");
143 return m_DataStorage[dataOffset.m_uiSource]->SetData<T>(dataOffset, value);
144}
145
146PL_FORCE_INLINE plTypedPointer plVisualScriptExecutionContext::GetPointerData(DataOffset dataOffset)
147{
148 PL_ASSERT_DEBUG(dataOffset.IsConstant() == false, "Pointers can't be constant data");
149 return m_DataStorage[dataOffset.m_uiSource]->GetPointerData(dataOffset, m_uiExecutionCounter);
150}
151
152template <typename T>
153PL_FORCE_INLINE void plVisualScriptExecutionContext::SetPointerData(DataOffset dataOffset, T ptr, const plRTTI* pType)
154{
155 PL_ASSERT_DEBUG(dataOffset.IsConstant() == false, "Pointers can't be constant data");
156 m_DataStorage[dataOffset.m_uiSource]->SetPointerData(dataOffset, ptr, pType, m_uiExecutionCounter);
157}
158
159PL_FORCE_INLINE plVariant plVisualScriptExecutionContext::GetDataAsVariant(DataOffset dataOffset, const plRTTI* pExpectedType) const
160{
161 return m_DataStorage[dataOffset.m_uiSource]->GetDataAsVariant(dataOffset, pExpectedType, m_uiExecutionCounter);
162}
163
164PL_FORCE_INLINE void plVisualScriptExecutionContext::SetDataFromVariant(DataOffset dataOffset, const plVariant& value)
165{
166 PL_ASSERT_DEBUG(dataOffset.IsConstant() == false, "Outputs can't set constant data");
167 return m_DataStorage[dataOffset.m_uiSource]->SetDataFromVariant(dataOffset, value, m_uiExecutionCounter);
168}
169
170PL_ALWAYS_INLINE void plVisualScriptExecutionContext::SetCurrentCoroutine(plScriptCoroutine* pCoroutine)
171{
172 m_pCurrentCoroutine = pCoroutine;
173}
174
175inline plTime plVisualScriptExecutionContext::GetDeltaTimeSinceLastExecution()
176{
177 PL_ASSERT_DEBUG(m_pDesc->IsCoroutine(), "Delta time is only valid for coroutines");
178 return m_DeltaTimeSinceLastExecution;
179}
This class encapsulates an array and it's size. It is recommended to use this class instead of plain ...
Definition ArrayPtr.h:37
PL_ALWAYS_INLINE plUInt32 GetCount() const
Returns the number of elements in the array.
Definition ArrayPtr.h:142
static T * AlignForwards(T *pPtr, size_t uiAlignment)
Aligns the pointer ptr by moving its address forwards to the next multiple of uiAlignment.
static T AlignSize(T uiSize, T uiAlignment)
Aligns the given size uiSize by rounding up to the next multiple of the size.
This class holds information about reflected types. Each instance represents one type that is known t...
Definition RTTI.h:30
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
Interface for binary in (read) streams.
Definition Stream.h:22
virtual plUInt64 ReadBytes(void *pReadBuffer, plUInt64 uiBytesToRead)=0
Reads a raw number of bytes into the read buffer, this is the only method which has to be implemented...
plVariant is a class that can store different types of variables, which is useful in situations where...
Definition Variant.h:44
constexpr TYPE MaxValue()
Returns the largest possible positive value (that is not infinity).
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54
The time class encapsulates a double value storing the time in seconds.
Definition Time.h:12
A typed raw pointer.
Definition TypedPointer.h:13
Definition VisualScriptData.h:10
Definition VisualScript.h:187