Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
ObjectStream.h
Go to the documentation of this file.
1// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
9#include <Jolt/Core/RTTI.h>
12
13#ifdef JPH_OBJECT_STREAM
14
16
19{
20public:
22 enum class EStreamType
23 {
24 Text,
25 Binary,
26 };
27
28protected:
30 virtual ~ObjectStream() = default;
31
34
35 static constexpr int sVersion = 1;
36 static constexpr int sRevision = 0;
37 static constexpr Identifier sNullIdentifier = 0;
38};
39
42{
43public:
45 virtual bool ReadDataType(EOSDataType &outType) = 0;
46 virtual bool ReadName(String &outName) = 0;
47 virtual bool ReadIdentifier(Identifier &outIdentifier) = 0;
48 virtual bool ReadCount(uint32 &outCount) = 0;
49
51 virtual bool ReadPrimitiveData(uint8 &outPrimitive) = 0;
52 virtual bool ReadPrimitiveData(uint16 &outPrimitive) = 0;
53 virtual bool ReadPrimitiveData(int &outPrimitive) = 0;
54 virtual bool ReadPrimitiveData(uint32 &outPrimitive) = 0;
55 virtual bool ReadPrimitiveData(uint64 &outPrimitive) = 0;
56 virtual bool ReadPrimitiveData(float &outPrimitive) = 0;
57 virtual bool ReadPrimitiveData(double &outPrimitive) = 0;
58 virtual bool ReadPrimitiveData(bool &outPrimitive) = 0;
59 virtual bool ReadPrimitiveData(String &outPrimitive) = 0;
60 virtual bool ReadPrimitiveData(Float3 &outPrimitive) = 0;
61 virtual bool ReadPrimitiveData(Float4 &outPrimitive) = 0;
62 virtual bool ReadPrimitiveData(Double3 &outPrimitive) = 0;
63 virtual bool ReadPrimitiveData(Vec3 &outPrimitive) = 0;
64 virtual bool ReadPrimitiveData(DVec3 &outPrimitive) = 0;
65 virtual bool ReadPrimitiveData(Vec4 &outPrimitive) = 0;
66 virtual bool ReadPrimitiveData(UVec4 &outPrimitive) = 0;
67 virtual bool ReadPrimitiveData(Quat &outPrimitive) = 0;
68 virtual bool ReadPrimitiveData(Mat44 &outPrimitive) = 0;
69 virtual bool ReadPrimitiveData(DMat44 &outPrimitive) = 0;
70
72 virtual bool ReadClassData(const char *inClassName, void *inInstance) = 0;
73 virtual bool ReadPointerData(const RTTI *inRTTI, void **inPointer, int inRefCountOffset = -1) = 0;
74};
75
78{
79public:
81 virtual void WriteDataType(EOSDataType inType) = 0;
82 virtual void WriteName(const char *inName) = 0;
83 virtual void WriteIdentifier(Identifier inIdentifier) = 0;
84 virtual void WriteCount(uint32 inCount) = 0;
85
87 virtual void WritePrimitiveData(const uint8 &inPrimitive) = 0;
88 virtual void WritePrimitiveData(const uint16 &inPrimitive) = 0;
89 virtual void WritePrimitiveData(const int &inPrimitive) = 0;
90 virtual void WritePrimitiveData(const uint32 &inPrimitive) = 0;
91 virtual void WritePrimitiveData(const uint64 &inPrimitive) = 0;
92 virtual void WritePrimitiveData(const float &inPrimitive) = 0;
93 virtual void WritePrimitiveData(const double &inPrimitive) = 0;
94 virtual void WritePrimitiveData(const bool &inPrimitive) = 0;
95 virtual void WritePrimitiveData(const String &inPrimitive) = 0;
96 virtual void WritePrimitiveData(const Float3 &inPrimitive) = 0;
97 virtual void WritePrimitiveData(const Float4 &inPrimitive) = 0;
98 virtual void WritePrimitiveData(const Double3 &inPrimitive) = 0;
99 virtual void WritePrimitiveData(const Vec3 &inPrimitive) = 0;
100 virtual void WritePrimitiveData(const DVec3 &inPrimitive) = 0;
101 virtual void WritePrimitiveData(const Vec4 &inPrimitive) = 0;
102 virtual void WritePrimitiveData(const UVec4 &inPrimitive) = 0;
103 virtual void WritePrimitiveData(const Quat &inPrimitive) = 0;
104 virtual void WritePrimitiveData(const Mat44 &inPrimitive) = 0;
105 virtual void WritePrimitiveData(const DMat44 &inPrimitive) = 0;
106
108 virtual void WritePointerData(const RTTI *inRTTI, const void *inPointer) = 0;
109 virtual void WriteClassData(const RTTI *inRTTI, const void *inInstance) = 0;
110
112 virtual void HintNextItem() { /* Default is do nothing */ }
113 virtual void HintIndentUp() { /* Default is do nothing */ }
114 virtual void HintIndentDown() { /* Default is do nothing */ }
115};
116
117// Define macro to declare functions for a specific primitive type
118#define JPH_DECLARE_PRIMITIVE(name) \
119 JPH_EXPORT bool OSIsType(name *, int inArrayDepth, EOSDataType inDataType, const char *inClassName); \
120 JPH_EXPORT bool OSReadData(IObjectStreamIn &ioStream, name &outPrimitive); \
121 JPH_EXPORT void OSWriteDataType(IObjectStreamOut &ioStream, name *); \
122 JPH_EXPORT void OSWriteData(IObjectStreamOut &ioStream, const name &inPrimitive);
123
124// This file uses the JPH_DECLARE_PRIMITIVE macro to define all types
126
127// Define serialization templates
128template <class T, class A>
129bool OSIsType(Array<T, A> *, int inArrayDepth, EOSDataType inDataType, const char *inClassName)
130{
131 return (inArrayDepth > 0 && OSIsType(static_cast<T *>(nullptr), inArrayDepth - 1, inDataType, inClassName));
132}
133
134template <class T, uint N>
135bool OSIsType(StaticArray<T, N> *, int inArrayDepth, EOSDataType inDataType, const char *inClassName)
136{
137 return (inArrayDepth > 0 && OSIsType(static_cast<T *>(nullptr), inArrayDepth - 1, inDataType, inClassName));
138}
139
140template <class T, uint N>
141bool OSIsType(T (*)[N], int inArrayDepth, EOSDataType inDataType, const char *inClassName)
142{
143 return (inArrayDepth > 0 && OSIsType(static_cast<T *>(nullptr), inArrayDepth - 1, inDataType, inClassName));
144}
145
146template <class T>
147bool OSIsType(Ref<T> *, int inArrayDepth, EOSDataType inDataType, const char *inClassName)
148{
149 return OSIsType(static_cast<T *>(nullptr), inArrayDepth, inDataType, inClassName);
150}
151
152template <class T>
153bool OSIsType(RefConst<T> *, int inArrayDepth, EOSDataType inDataType, const char *inClassName)
154{
155 return OSIsType(static_cast<T *>(nullptr), inArrayDepth, inDataType, inClassName);
156}
157
159template <class T, class A>
160bool OSReadData(IObjectStreamIn &ioStream, Array<T, A> &inArray)
161{
162 bool continue_reading = true;
163
164 // Read array length
165 uint32 array_length;
166 continue_reading = ioStream.ReadCount(array_length);
167
168 // Read array items
169 if (continue_reading)
170 {
171 inArray.clear();
172 inArray.resize(array_length);
173 for (uint32 el = 0; el < array_length && continue_reading; ++el)
174 continue_reading = OSReadData(ioStream, inArray[el]);
175 }
176
177 return continue_reading;
178}
179
181template <class T, uint N>
183{
184 bool continue_reading = true;
185
186 // Read array length
187 uint32 array_length;
188 continue_reading = ioStream.ReadCount(array_length);
189
190 // Check if we can fit this many elements
191 if (array_length > N)
192 return false;
193
194 // Read array items
195 if (continue_reading)
196 {
197 inArray.clear();
198 inArray.resize(array_length);
199 for (uint32 el = 0; el < array_length && continue_reading; ++el)
200 continue_reading = OSReadData(ioStream, inArray[el]);
201 }
202
203 return continue_reading;
204}
205
207template <class T, uint N>
208bool OSReadData(IObjectStreamIn &ioStream, T (&inArray)[N])
209{
210 bool continue_reading = true;
211
212 // Read array length
213 uint32 array_length;
214 continue_reading = ioStream.ReadCount(array_length);
215 if (array_length != N)
216 return false;
217
218 // Read array items
219 for (uint32 el = 0; el < N && continue_reading; ++el)
220 continue_reading = OSReadData(ioStream, inArray[el]);
221
222 return continue_reading;
223}
224
226template <class T>
227bool OSReadData(IObjectStreamIn &ioStream, Ref<T> &inRef)
228{
229 return ioStream.ReadPointerData(JPH_RTTI(T), inRef.InternalGetPointer(), T::sInternalGetRefCountOffset());
230}
231
232template <class T>
234{
235 return ioStream.ReadPointerData(JPH_RTTI(T), inRef.InternalGetPointer(), T::sInternalGetRefCountOffset());
236}
237
238// Define serialization templates for dynamic arrays
239template <class T, class A>
241{
243 OSWriteDataType(ioStream, static_cast<T *>(nullptr));
244}
245
246template <class T, class A>
247void OSWriteData(IObjectStreamOut &ioStream, const Array<T, A> &inArray)
248{
249 // Write size of array
250 ioStream.HintNextItem();
251 ioStream.WriteCount(static_cast<uint32>(inArray.size()));
252
253 // Write data in array
254 ioStream.HintIndentUp();
255 for (const T &v : inArray)
256 OSWriteData(ioStream, v);
257 ioStream.HintIndentDown();
258}
259
261template <class T, uint N>
263{
265 OSWriteDataType(ioStream, static_cast<T *>(nullptr));
266}
267
268template <class T, uint N>
269void OSWriteData(IObjectStreamOut &ioStream, const StaticArray<T, N> &inArray)
270{
271 // Write size of array
272 ioStream.HintNextItem();
273 ioStream.WriteCount(inArray.size());
274
275 // Write data in array
276 ioStream.HintIndentUp();
277 for (const typename StaticArray<T, N>::value_type &v : inArray)
278 OSWriteData(ioStream, v);
279 ioStream.HintIndentDown();
280}
281
283template <class T, uint N>
284void OSWriteDataType(IObjectStreamOut &ioStream, T (*)[N])
285{
287 OSWriteDataType(ioStream, static_cast<T *>(nullptr));
288}
289
290template <class T, uint N>
291void OSWriteData(IObjectStreamOut &ioStream, const T (&inArray)[N])
292{
293 // Write size of array
294 ioStream.HintNextItem();
295 ioStream.WriteCount(uint32(N));
296
297 // Write data in array
298 ioStream.HintIndentUp();
299 for (const T &v : inArray)
300 OSWriteData(ioStream, v);
301 ioStream.HintIndentDown();
302}
303
305template <class T>
307{
308 OSWriteDataType(ioStream, static_cast<T *>(nullptr));
309}
310
311template <class T>
312void OSWriteData(IObjectStreamOut &ioStream, const Ref<T> &inRef)
313{
314 if (inRef != nullptr)
315 ioStream.WritePointerData(GetRTTI(inRef.GetPtr()), inRef.GetPtr());
316 else
317 ioStream.WritePointerData(nullptr, nullptr);
318}
319
320template <class T>
322{
323 OSWriteDataType(ioStream, static_cast<T *>(nullptr));
324}
325
326template <class T>
327void OSWriteData(IObjectStreamOut &ioStream, const RefConst<T> &inRef)
328{
329 if (inRef != nullptr)
330 ioStream.WritePointerData(GetRTTI(inRef.GetPtr()), inRef.GetPtr());
331 else
332 ioStream.WritePointerData(nullptr, nullptr);
333}
334
336
337#endif // JPH_OBJECT_STREAM
std::uint8_t uint8
Definition Core.h:493
#define JPH_EXPORT
Definition Core.h:275
std::uint64_t uint64
Definition Core.h:496
#define JPH_NAMESPACE_END
Definition Core.h:419
std::uint32_t uint32
Definition Core.h:495
#define JPH_NAMESPACE_BEGIN
Definition Core.h:413
std::uint16_t uint16
Definition Core.h:494
bool OSIsType(Array< T, A > *, int inArrayDepth, EOSDataType inDataType, const char *inClassName)
Definition ObjectStream.h:129
bool OSReadData(IObjectStreamIn &ioStream, Array< T, A > &inArray)
Define serialization templates for dynamic arrays.
Definition ObjectStream.h:160
void OSWriteData(IObjectStreamOut &ioStream, const Array< T, A > &inArray)
Definition ObjectStream.h:247
void OSWriteDataType(IObjectStreamOut &ioStream, Array< T, A > *)
Definition ObjectStream.h:240
#define JPH_RTTI(class_name)
Definition RTTI.h:319
std::basic_string< char, std::char_traits< char >, STLAllocator< char > > String
Definition STLAllocator.h:107
EOSDataType
Data type.
Definition SerializableAttribute.h:17
@ Array
Used in attribute declaration, indicates that this is an array of objects.
Definition Array.h:36
void resize(size_type inNewSize)
Resize array to new length.
Definition Array.h:197
size_type size() const
Returns amount of elements in the array.
Definition Array.h:397
void clear()
Destruct all elements and set length to zero.
Definition Array.h:222
Holds a 4x4 matrix of floats with the last column consisting of doubles.
Definition DMat44.h:13
Definition DVec3.h:14
Class that holds 3 doubles. Used as a storage class. Convert to DVec3 for calculations.
Definition Double3.h:13
Class that holds 3 floats. Used as a storage class. Convert to Vec3 for calculations.
Definition Float3.h:13
Class that holds 4 float values. Convert to Vec4 to perform calculations.
Definition Float4.h:11
Interface class for reading from an object stream.
Definition ObjectStream.h:42
virtual bool ReadPrimitiveData(Quat &outPrimitive)=0
virtual bool ReadDataType(EOSDataType &outType)=0
virtual bool ReadPrimitiveData(double &outPrimitive)=0
virtual bool ReadPrimitiveData(Float4 &outPrimitive)=0
virtual bool ReadPointerData(const RTTI *inRTTI, void **inPointer, int inRefCountOffset=-1)=0
virtual bool ReadPrimitiveData(Vec3 &outPrimitive)=0
virtual bool ReadPrimitiveData(String &outPrimitive)=0
virtual bool ReadPrimitiveData(uint64 &outPrimitive)=0
virtual bool ReadIdentifier(Identifier &outIdentifier)=0
virtual bool ReadPrimitiveData(Float3 &outPrimitive)=0
virtual bool ReadPrimitiveData(uint32 &outPrimitive)=0
virtual bool ReadPrimitiveData(float &outPrimitive)=0
virtual bool ReadPrimitiveData(DMat44 &outPrimitive)=0
virtual bool ReadPrimitiveData(int &outPrimitive)=0
virtual bool ReadName(String &outName)=0
virtual bool ReadPrimitiveData(Mat44 &outPrimitive)=0
virtual bool ReadPrimitiveData(DVec3 &outPrimitive)=0
virtual bool ReadCount(uint32 &outCount)=0
virtual bool ReadPrimitiveData(uint16 &outPrimitive)=0
virtual bool ReadClassData(const char *inClassName, void *inInstance)=0
virtual bool ReadPrimitiveData(Double3 &outPrimitive)=0
virtual bool ReadPrimitiveData(UVec4 &outPrimitive)=0
virtual bool ReadPrimitiveData(uint8 &outPrimitive)=0
virtual bool ReadPrimitiveData(Vec4 &outPrimitive)=0
virtual bool ReadPrimitiveData(bool &outPrimitive)=0
Interface class for writing to an object stream.
Definition ObjectStream.h:78
virtual void WritePrimitiveData(const int &inPrimitive)=0
virtual void WritePrimitiveData(const float &inPrimitive)=0
virtual void WritePrimitiveData(const Vec3 &inPrimitive)=0
virtual void WritePointerData(const RTTI *inRTTI, const void *inPointer)=0
virtual void WritePrimitiveData(const DVec3 &inPrimitive)=0
virtual void WritePrimitiveData(const String &inPrimitive)=0
virtual void WritePrimitiveData(const Quat &inPrimitive)=0
virtual void WritePrimitiveData(const uint8 &inPrimitive)=0
virtual void WritePrimitiveData(const Float3 &inPrimitive)=0
virtual void WritePrimitiveData(const Mat44 &inPrimitive)=0
virtual void WritePrimitiveData(const DMat44 &inPrimitive)=0
virtual void WritePrimitiveData(const uint32 &inPrimitive)=0
virtual void WriteClassData(const RTTI *inRTTI, const void *inInstance)=0
virtual void WriteIdentifier(Identifier inIdentifier)=0
virtual void WritePrimitiveData(const Vec4 &inPrimitive)=0
virtual void WriteDataType(EOSDataType inType)=0
virtual void WriteCount(uint32 inCount)=0
virtual void WriteName(const char *inName)=0
virtual void HintNextItem()
Definition ObjectStream.h:112
virtual void WritePrimitiveData(const uint16 &inPrimitive)=0
virtual void WritePrimitiveData(const Float4 &inPrimitive)=0
virtual void HintIndentUp()
Definition ObjectStream.h:113
virtual void WritePrimitiveData(const bool &inPrimitive)=0
virtual void WritePrimitiveData(const double &inPrimitive)=0
virtual void HintIndentDown()
Definition ObjectStream.h:114
virtual void WritePrimitiveData(const UVec4 &inPrimitive)=0
virtual void WritePrimitiveData(const uint64 &inPrimitive)=0
virtual void WritePrimitiveData(const Double3 &inPrimitive)=0
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition Mat44.h:13
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition NonCopyable.h:11
Base class for object stream input and output streams.
Definition ObjectStream.h:19
uint32 Identifier
Identifier for objects.
Definition ObjectStream.h:33
virtual ~ObjectStream()=default
Destructor.
EStreamType
Stream type.
Definition ObjectStream.h:23
Definition Quat.h:33
Definition RTTI.h:122
Definition Reference.h:163
const T * GetPtr() const
Get pointer.
Definition Reference.h:197
void ** InternalGetPointer()
INTERNAL HELPER FUNCTION USED BY SERIALIZATION.
Definition Reference.h:206
Definition Reference.h:107
T * GetPtr() const
Get pointer.
Definition Reference.h:135
void ** InternalGetPointer()
INTERNAL HELPER FUNCTION USED BY SERIALIZATION.
Definition Reference.h:144
Simple variable length array backed by a fixed size buffer.
Definition StaticArray.h:14
void clear()
Destruct all elements and set length to zero.
Definition StaticArray.h:52
T value_type
Definition StaticArray.h:16
size_type size() const
Returns amount of elements in the array.
Definition StaticArray.h:89
void resize(size_type inNewSize)
Resize array to new length.
Definition StaticArray.h:101
Definition UVec4.h:12
Definition Vec3.h:17
Definition Vec4.h:14