RavEngine
Loading...
Searching...
No Matches
PxSerialFramework.h
1// Redistribution and use in source and binary forms, with or without
2// modification, are permitted provided that the following conditions
3// are met:
4// * Redistributions of source code must retain the above copyright
5// notice, this list of conditions and the following disclaimer.
6// * Redistributions in binary form must reproduce the above copyright
7// notice, this list of conditions and the following disclaimer in the
8// documentation and/or other materials provided with the distribution.
9// * Neither the name of NVIDIA CORPORATION nor the names of its
10// contributors may be used to endorse or promote products derived
11// from this software without specific prior written permission.
12//
13// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
14// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
17// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24//
25// Copyright (c) 2008-2022 NVIDIA Corporation. All rights reserved.
26// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
27// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
28
29#ifndef PX_SERIAL_FRAMEWORK_H
30#define PX_SERIAL_FRAMEWORK_H
31
36#include "common/PxPhysXCommonConfig.h"
37
38#if !PX_DOXYGEN
39namespace physx
40{
41#endif
42
43typedef PxU16 PxType;
44class PxBase;
45class PxSerializationContext;
46class PxRepXSerializer;
47class PxSerializer;
48class PxPhysics;
49class PxCollection;
50
52#define PX_SERIAL_ALIGN 16
53
55#define PX_SERIAL_FILE_ALIGN 128
56
58#define PX_SERIAL_OBJECT_ID_INVALID 0
59
61typedef PxU64 PxSerialObjectId;
62
64#define PX_SERIAL_REF_KIND_PTR_TYPE_BIT (1u<<31)
65
67#define PX_SERIAL_REF_KIND_PXBASE (0 | PX_SERIAL_REF_KIND_PTR_TYPE_BIT)
68
70#define PX_SERIAL_REF_KIND_MATERIAL_IDX (1)
71
73#define PX_MAKE_FOURCC(a, b, c, d) ( (a) | ((b)<<8) | ((c)<<16) | ((d)<<24) )
74
81{
82public:
83 virtual ~PxProcessPxBaseCallback() {}
84 virtual void process(PxBase&) = 0;
85};
86
87
99{
100public:
101
123 virtual void registerReference(PxBase& base, PxU32 kind, size_t reference) = 0;
124
128 virtual const PxCollection& getCollection() const = 0;
129
137 virtual void writeData(const void* data, PxU32 size) = 0;
138
146 virtual void alignData(PxU32 alignment = PX_SERIAL_ALIGN) = 0;
147
155 virtual void writeName(const char* name) = 0;
156
157protected:
158
160 virtual ~PxSerializationContext() {}
161};
162
163
174{
175public:
176
195 virtual PxBase* resolveReference(PxU32 kind, size_t reference) const = 0;
196
202 template<typename T>
203 void translatePxBase(T*& base) { if (base) { base = static_cast<T*>(resolveReference(PX_SERIAL_REF_KIND_PXBASE, size_t(base))); } }
204
212 PX_INLINE void readName(const char*& name)
213 {
214 PxU32 len = *reinterpret_cast<PxU32*>(mExtraDataAddress);
215 mExtraDataAddress += sizeof(len);
216 name = len ? reinterpret_cast<const char*>(mExtraDataAddress) : NULL;
217 mExtraDataAddress += len;
218 }
219
227 template<typename T>
228 PX_INLINE T* readExtraData(PxU32 count=1)
229 {
230 T* data = reinterpret_cast<T*>(mExtraDataAddress);
231 mExtraDataAddress += sizeof(T)*count;
232 return data;
233 }
234
242 template<typename T, PxU32 alignment>
243 PX_INLINE T* readExtraData(PxU32 count=1)
244 {
245 alignExtraData(alignment);
246 return readExtraData<T>(count);
247 }
248
256 PX_INLINE void alignExtraData(PxU32 alignment = PX_SERIAL_ALIGN)
257 {
258 size_t addr = size_t(mExtraDataAddress);
259 addr = (addr+alignment-1)&~size_t(alignment-1);
260 mExtraDataAddress = reinterpret_cast<PxU8*>(addr);
261 }
262
263protected:
264
266 virtual ~PxDeserializationContext() {}
267
268 PxU8* mExtraDataAddress;
269};
270
280
292{
293public:
294 /************************************************************************************************/
295
299
308 virtual void registerSerializer(PxType type, PxSerializer& serializer) = 0;
309
318 virtual PxSerializer* unregisterSerializer(PxType type) = 0;
319
332
341 virtual const PxSerializer* getSerializer(PxType type) const = 0;
342
344 /************************************************************************************************/
345
349
358 virtual void registerRepXSerializer(PxType type, PxRepXSerializer& serializer) = 0;
359
369
378 virtual PxRepXSerializer* getRepXSerializer(const char* typeName) const = 0;
379
381 /************************************************************************************************/
382
391 virtual void release() = 0;
392
393protected:
394 virtual ~PxSerializationRegistry(){}
395};
396
397#if !PX_DOXYGEN
398} // namespace physx
399#endif
400
402#endif
Base class for objects that can be members of a PxCollection.
Definition PxBase.h:73
Collection class for serialization.
Definition PxCollection.h:104
Binary deserialization context class.
Definition PxSerialFramework.h:174
virtual PxBase * resolveReference(PxU32 kind, size_t reference) const =0
Retrieves a pointer to a deserialized PxBase object given a corresponding deserialized reference valu...
PX_INLINE T * readExtraData(PxU32 count=1)
Function to read extra data during deserialization optionally aligning the extra data stream before r...
Definition PxSerialFramework.h:243
PX_INLINE void alignExtraData(PxU32 alignment=PX_SERIAL_ALIGN)
Function to align the extra data stream to a power of 2 alignment.
Definition PxSerialFramework.h:256
PX_INLINE T * readExtraData(PxU32 count=1)
Function to read extra data during deserialization.
Definition PxSerialFramework.h:228
PX_INLINE void readName(const char *&name)
Helper function to read a name from the extra data during deserialization.
Definition PxSerialFramework.h:212
void translatePxBase(T *&base)
Helper function to update PxBase pointer on deserialization.
Definition PxSerialFramework.h:203
Output stream class for I/O.
Definition PxIO.h:114
Callback class used to process PxBase objects.
Definition PxSerialFramework.h:81
Serializer interface for RepX (Xml) serialization.
Definition PxRepXSerializer.h:67
Binary serialization context class.
Definition PxSerialFramework.h:99
virtual void alignData(PxU32 alignment=PX_SERIAL_ALIGN)=0
Aligns the serialized data.
virtual void writeData(const void *data, PxU32 size)=0
Serializes object data and object extra data.
virtual const PxCollection & getCollection() const =0
Returns the collection that is being serialized.
virtual void writeName(const char *name)=0
Helper function to write a name to the extraData if serialization is configured to save names.
virtual void registerReference(PxBase &base, PxU32 kind, size_t reference)=0
Registers a reference value corresponding to a PxBase object.
Class serving as a registry for XML (RepX) and binary serializable types.
Definition PxSerialFramework.h:292
virtual void registerRepXSerializer(PxType type, PxRepXSerializer &serializer)=0
Register a RepX serializer for a concrete type.
virtual PxSerializer * unregisterSerializer(PxType type)=0
Unregister a serializer for a concrete type, and retrieves the corresponding serializer object.
virtual PxRepXSerializer * unregisterRepXSerializer(PxType type)=0
Unregister a RepX serializer for a concrete type, and retrieves the corresponding serializer object.
virtual PxRepXSerializer * getRepXSerializer(const char *typeName) const =0
Returns RepX serializer given the corresponding type name.
virtual const PxSerializer * getSerializer(PxType type) const =0
Returns PxSerializer corresponding to type.
virtual void release()=0
Releases PxSerializationRegistry instance.
virtual PX_DEPRECATED void registerBinaryMetaDataCallback(PxBinaryMetaDataCallback callback)=0
Register binary meta data callback.
virtual void registerSerializer(PxType type, PxSerializer &serializer)=0
Register a serializer for a concrete type.
Serialization interface class.
Definition PxSerializer.h:63
#define PX_INLINE
Definition PxPreprocessor.h:320
#define PX_DEPRECATED
Definition PxPreprocessor.h:418
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39
PxU64 PxSerialObjectId
ID type for PxBase objects in a PxCollection.
Definition PxSerialFramework.h:61
PX_DEPRECATED void(* PxBinaryMetaDataCallback)(PxOutputStream &stream)
Callback type for exporting binary meta data for a serializable type.
Definition PxSerialFramework.h:279