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
10#include <Jolt/Core/RTTI.h>
11
13
16{
17public:
19 enum class EStreamType
20 {
21 Text,
22 Binary,
23 };
24
25protected:
27 virtual ~ObjectStream() = default;
28
31
32 static constexpr int sVersion = 1;
33 static constexpr int sRevision = 0;
34 static constexpr Identifier sNullIdentifier = 0;
35};
36
39{
40public:
42 virtual bool ReadDataType(EOSDataType &outType) = 0;
43 virtual bool ReadName(String &outName) = 0;
44 virtual bool ReadIdentifier(Identifier &outIdentifier) = 0;
45 virtual bool ReadCount(uint32 &outCount) = 0;
46
48 virtual bool ReadPrimitiveData(uint8 &outPrimitive) = 0;
49 virtual bool ReadPrimitiveData(uint16 &outPrimitive) = 0;
50 virtual bool ReadPrimitiveData(int &outPrimitive) = 0;
51 virtual bool ReadPrimitiveData(uint32 &outPrimitive) = 0;
52 virtual bool ReadPrimitiveData(uint64 &outPrimitive) = 0;
53 virtual bool ReadPrimitiveData(float &outPrimitive) = 0;
54 virtual bool ReadPrimitiveData(double &outPrimitive) = 0;
55 virtual bool ReadPrimitiveData(bool &outPrimitive) = 0;
56 virtual bool ReadPrimitiveData(String &outPrimitive) = 0;
57 virtual bool ReadPrimitiveData(Float3 &outPrimitive) = 0;
58 virtual bool ReadPrimitiveData(Double3 &outPrimitive) = 0;
59 virtual bool ReadPrimitiveData(Vec3 &outPrimitive) = 0;
60 virtual bool ReadPrimitiveData(DVec3 &outPrimitive) = 0;
61 virtual bool ReadPrimitiveData(Vec4 &outPrimitive) = 0;
62 virtual bool ReadPrimitiveData(Quat &outPrimitive) = 0;
63 virtual bool ReadPrimitiveData(Mat44 &outPrimitive) = 0;
64 virtual bool ReadPrimitiveData(DMat44 &outPrimitive) = 0;
65
67 virtual bool ReadClassData(const char *inClassName, void *inInstance) = 0;
68 virtual bool ReadPointerData(const RTTI *inRTTI, void **inPointer, int inRefCountOffset = -1) = 0;
69};
70
73{
74public:
76 virtual void WriteDataType(EOSDataType inType) = 0;
77 virtual void WriteName(const char *inName) = 0;
78 virtual void WriteIdentifier(Identifier inIdentifier) = 0;
79 virtual void WriteCount(uint32 inCount) = 0;
80
82 virtual void WritePrimitiveData(const uint8 &inPrimitive) = 0;
83 virtual void WritePrimitiveData(const uint16 &inPrimitive) = 0;
84 virtual void WritePrimitiveData(const int &inPrimitive) = 0;
85 virtual void WritePrimitiveData(const uint32 &inPrimitive) = 0;
86 virtual void WritePrimitiveData(const uint64 &inPrimitive) = 0;
87 virtual void WritePrimitiveData(const float &inPrimitive) = 0;
88 virtual void WritePrimitiveData(const double &inPrimitive) = 0;
89 virtual void WritePrimitiveData(const bool &inPrimitive) = 0;
90 virtual void WritePrimitiveData(const String &inPrimitive) = 0;
91 virtual void WritePrimitiveData(const Float3 &inPrimitive) = 0;
92 virtual void WritePrimitiveData(const Double3 &inPrimitive) = 0;
93 virtual void WritePrimitiveData(const Vec3 &inPrimitive) = 0;
94 virtual void WritePrimitiveData(const DVec3 &inPrimitive) = 0;
95 virtual void WritePrimitiveData(const Vec4 &inPrimitive) = 0;
96 virtual void WritePrimitiveData(const Quat &inPrimitive) = 0;
97 virtual void WritePrimitiveData(const Mat44 &inPrimitive) = 0;
98 virtual void WritePrimitiveData(const DMat44 &inPrimitive) = 0;
99
101 virtual void WritePointerData(const RTTI *inRTTI, const void *inPointer) = 0;
102 virtual void WriteClassData(const RTTI *inRTTI, const void *inInstance) = 0;
103
105 virtual void HintNextItem() { /* Default is do nothing */ }
106 virtual void HintIndentUp() { /* Default is do nothing */ }
107 virtual void HintIndentDown() { /* Default is do nothing */ }
108};
109
110// Define macro to declare functions for a specific primitive type
111#define JPH_DECLARE_PRIMITIVE(name) \
112 bool OSIsType(name *, int inArrayDepth, EOSDataType inDataType, const char *inClassName); \
113 bool OSReadData(IObjectStreamIn &ioStream, name &outPrimitive); \
114 void OSWriteDataType(IObjectStreamOut &ioStream, name *); \
115 void OSWriteData(IObjectStreamOut &ioStream, const name &inPrimitive);
116
117// This file uses the JPH_DECLARE_PRIMITIVE macro to define all types
119
120// Define serialization templates
121template <class T>
122bool OSIsType(Array<T> *, int inArrayDepth, EOSDataType inDataType, const char *inClassName)
123{
124 return (inArrayDepth > 0 && OSIsType((T *)nullptr, inArrayDepth - 1, inDataType, inClassName));
125}
126
127template <class T, uint N>
128bool OSIsType(StaticArray<T, N> *, int inArrayDepth, EOSDataType inDataType, const char *inClassName)
129{
130 return (inArrayDepth > 0 && OSIsType((T *)nullptr, inArrayDepth - 1, inDataType, inClassName));
131}
132
133template <class T, uint N>
134bool OSIsType(T (*)[N], int inArrayDepth, EOSDataType inDataType, const char *inClassName)
135{
136 return (inArrayDepth > 0 && OSIsType((T *)nullptr, inArrayDepth - 1, inDataType, inClassName));
137}
138
139template <class T>
140bool OSIsType(Ref<T> *, int inArrayDepth, EOSDataType inDataType, const char *inClassName)
141{
142 return OSIsType((T *)nullptr, inArrayDepth, inDataType, inClassName);
143}
144
145template <class T>
146bool OSIsType(RefConst<T> *, int inArrayDepth, EOSDataType inDataType, const char *inClassName)
147{
148 return OSIsType((T *)nullptr, inArrayDepth, inDataType, inClassName);
149}
150
152template <class T>
153bool OSReadData(IObjectStreamIn &ioStream, Array<T> &inArray)
154{
155 bool continue_reading = true;
156
157 // Read array length
158 uint32 array_length;
159 continue_reading = ioStream.ReadCount(array_length);
160
161 // Read array items
162 if (continue_reading)
163 {
164 inArray.resize(array_length);
165 for (uint32 el = 0; el < array_length && continue_reading; ++el)
166 continue_reading = OSReadData(ioStream, inArray[el]);
167 }
168
169 return continue_reading;
170}
171
173template <class T, uint N>
175{
176 bool continue_reading = true;
177
178 // Read array length
179 uint32 array_length;
180 continue_reading = ioStream.ReadCount(array_length);
181
182 // Check if we can fit this many elements
183 if (array_length > N)
184 return false;
185
186 // Read array items
187 if (continue_reading)
188 {
189 inArray.resize(array_length);
190 for (uint32 el = 0; el < array_length && continue_reading; ++el)
191 continue_reading = OSReadData(ioStream, inArray[el]);
192 }
193
194 return continue_reading;
195}
196
198template <class T, uint N>
199bool OSReadData(IObjectStreamIn &ioStream, T (&inArray)[N])
200{
201 bool continue_reading = true;
202
203 // Read array length
204 uint32 array_length;
205 continue_reading = ioStream.ReadCount(array_length);
206 if (array_length != N)
207 return false;
208
209 // Read array items
210 for (uint32 el = 0; el < N && continue_reading; ++el)
211 continue_reading = OSReadData(ioStream, inArray[el]);
212
213 return continue_reading;
214}
215
217template <class T>
218bool OSReadData(IObjectStreamIn &ioStream, Ref<T> &inRef)
219{
220 return ioStream.ReadPointerData(JPH_RTTI(T), inRef.InternalGetPointer(), T::sInternalGetRefCountOffset());
221}
222
223template <class T>
225{
226 return ioStream.ReadPointerData(JPH_RTTI(T), inRef.InternalGetPointer(), T::sInternalGetRefCountOffset());
227}
228
229// Define serialization templates for dynamic arrays
230template <class T>
232{
234 OSWriteDataType(ioStream, (T *)nullptr);
235}
236
237template <class T>
238void OSWriteData(IObjectStreamOut &ioStream, const Array<T> &inArray)
239{
240 // Write size of array
241 ioStream.HintNextItem();
242 ioStream.WriteCount((uint32)inArray.size());
243
244 // Write data in array
245 ioStream.HintIndentUp();
246 for (const T &v : inArray)
247 OSWriteData(ioStream, v);
248 ioStream.HintIndentDown();
249}
250
252template <class T, uint N>
254{
256 OSWriteDataType(ioStream, (T *)nullptr);
257}
258
259template <class T, uint N>
260void OSWriteData(IObjectStreamOut &ioStream, const StaticArray<T, N> &inArray)
261{
262 // Write size of array
263 ioStream.HintNextItem();
264 ioStream.WriteCount(inArray.size());
265
266 // Write data in array
267 ioStream.HintIndentUp();
268 for (const typename StaticArray<T, N>::value_type &v : inArray)
269 OSWriteData(ioStream, v);
270 ioStream.HintIndentDown();
271}
272
274template <class T, uint N>
275void OSWriteDataType(IObjectStreamOut &ioStream, T (*)[N])
276{
278 OSWriteDataType(ioStream, (T *)nullptr);
279}
280
281template <class T, uint N>
282void OSWriteData(IObjectStreamOut &ioStream, const T (&inArray)[N])
283{
284 // Write size of array
285 ioStream.HintNextItem();
286 ioStream.WriteCount((uint32)N);
287
288 // Write data in array
289 ioStream.HintIndentUp();
290 for (const T &v : inArray)
291 OSWriteData(ioStream, v);
292 ioStream.HintIndentDown();
293}
294
296template <class T>
298{
299 OSWriteDataType(ioStream, (T *)nullptr);
300}
301
302template <class T>
303void OSWriteData(IObjectStreamOut &ioStream, const Ref<T> &inRef)
304{
305 if (inRef != nullptr)
306 ioStream.WritePointerData(GetRTTI(inRef.GetPtr()), inRef.GetPtr());
307 else
308 ioStream.WritePointerData(nullptr, nullptr);
309}
310
311template <class T>
313{
314 OSWriteDataType(ioStream, (T *)nullptr);
315}
316
317template <class T>
318void OSWriteData(IObjectStreamOut &ioStream, const RefConst<T> &inRef)
319{
320 if (inRef != nullptr)
321 ioStream.WritePointerData(GetRTTI(inRef.GetPtr()), inRef.GetPtr());
322 else
323 ioStream.WritePointerData(nullptr, nullptr);
324}
325
uint32_t uint32
Definition: Core.h:312
#define JPH_NAMESPACE_END
Definition: Core.h:240
uint8_t uint8
Definition: Core.h:310
uint16_t uint16
Definition: Core.h:311
uint64_t uint64
Definition: Core.h:313
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:234
bool OSIsType(Array< T > *, int inArrayDepth, EOSDataType inDataType, const char *inClassName)
Definition: ObjectStream.h:122
void OSWriteData(IObjectStreamOut &ioStream, const Array< T > &inArray)
Definition: ObjectStream.h:238
bool OSReadData(IObjectStreamIn &ioStream, Array< T > &inArray)
Define serialization templates for dynamic arrays.
Definition: ObjectStream.h:153
void OSWriteDataType(IObjectStreamOut &ioStream, Array< T > *)
Definition: ObjectStream.h:231
#define JPH_RTTI(class_name)
Definition: RTTI.h:315
std::basic_string< char, std::char_traits< char >, STLAllocator< char > > String
Definition: STLAllocator.h:82
std::vector< T, STLAllocator< T > > Array
Definition: STLAllocator.h:81
EOSDataType
Data type.
Definition: SerializableAttribute.h:15
@ Array
Used in attribute declaration, indicates that this is an array of objects.
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
Interface class for reading from an object stream.
Definition: ObjectStream.h:39
virtual bool ReadPrimitiveData(Quat &outPrimitive)=0
virtual bool ReadDataType(EOSDataType &outType)=0
virtual bool ReadPrimitiveData(double &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(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:73
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:105
virtual void WritePrimitiveData(const uint16 &inPrimitive)=0
virtual void HintIndentUp()
Definition: ObjectStream.h:106
virtual void WritePrimitiveData(const bool &inPrimitive)=0
virtual void WritePrimitiveData(const double &inPrimitive)=0
virtual void HintIndentDown()
Definition: ObjectStream.h:107
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
Base class for object stream input and output streams.
Definition: ObjectStream.h:16
uint32 Identifier
Identifier for objects.
Definition: ObjectStream.h:30
virtual ~ObjectStream()=default
Constructor.
EStreamType
Stream type.
Definition: ObjectStream.h:20
static constexpr int sRevision
Definition: ObjectStream.h:33
static constexpr int sVersion
Definition: ObjectStream.h:32
static constexpr Identifier sNullIdentifier
Definition: ObjectStream.h:34
Definition: Quat.h:33
Definition: RTTI.h:122
Definition: Reference.h:154
const T * GetPtr() const
Get pointer.
Definition: Reference.h:188
void ** InternalGetPointer()
INTERNAL HELPER FUNCTION USED BY SERIALIZATION.
Definition: Reference.h:191
Definition: Reference.h:101
T * GetPtr() const
Get pointer.
Definition: Reference.h:131
void ** InternalGetPointer()
INTERNAL HELPER FUNCTION USED BY SERIALIZATION.
Definition: Reference.h:135
Simple variable length array backed by a fixed size buffer.
Definition: StaticArray.h:12
T value_type
Definition: StaticArray.h:14
size_type size() const
Returns amount of elements in the array.
Definition: StaticArray.h:87
void resize(size_type inNewSize)
Resize array to new length.
Definition: StaticArray.h:99
Definition: Vec3.h:16
Definition: Vec4.h:14