1//
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions
4// are met:
5// * Redistributions of source code must retain the above copyright
6// notice, this list of conditions and the following disclaimer.
7// * Redistributions in binary form must reproduce the above copyright
8// notice, this list of conditions and the following disclaimer in the
9// documentation and/or other materials provided with the distribution.
10// * Neither the name of NVIDIA CORPORATION nor the names of its
11// contributors may be used to endorse or promote products derived
12// from this software without specific prior written permission.
13//
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
15// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25//
26// Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
27// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
28// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
29#ifndef PX_REPX_SERIALIZER_H
30#define PX_REPX_SERIALIZER_H
31/** \addtogroup Serializers
32 @{
33*/
34
35#include "common/PxBase.h"
36#include "extensions/PxRepXSimpleType.h"
37
38#if !PX_DOXYGEN
39namespace physx
40{
41#endif
42
43 class XmlMemoryAllocator;
44 class XmlWriter;
45 class XmlReader;
46 class MemoryBuffer;
47
48 /**
49 \brief Serializer interface for RepX (Xml) serialization.
50
51 In order to serialize a class to RepX both a PxSerializer and
52 a PxRepXSerializer implementation are needed.
53
54 A repx Serializer provides the ability to capture a live
55 object to a descriptor or static state and the ability to
56 write that state out to a file. Objects allocated
57 by the Serializer using the allocator are freed when the
58 collection itself is freed.
59 SnRepXCoreSerializers.cpp implements a set of Serializers
60 for the core PhysX types.
61
62 \note Implementing a PxRepXSerializer is currently not practical without including the internal PhysXExtension header "SnRepXSerializerImpl.h".
63
64 @see PxSerializer, PX_NEW_REPX_SERIALIZER, PxSerializationRegistry::registerRepXSerializer
65 */
66 class PxRepXSerializer
67 {
68 protected:
69 virtual ~PxRepXSerializer(){}
70 public:
71
72 /**
73 \brief The type this Serializer is meant to operate on.
74 @see PxRepXObject::typeName
75 */
76 virtual const char* getTypeName() = 0;
77
78 /**
79 \brief Convert from a RepX object to a key-value pair hierarchy
80
81 \param[in] inLiveObject The object to convert to the passed in descriptor.
82 \param[in] inCollection The collection to use to find ids of references of this object.
83 \param[in] inWriter Interface to write data to.
84 \param[in] inTempBuffer used to for temporary allocations.
85 \param[in] inArgs The arguments used in create resources and objects.
86 */
87 virtual void objectToFile( const PxRepXObject& inLiveObject, PxCollection* inCollection, XmlWriter& inWriter, MemoryBuffer& inTempBuffer, PxRepXInstantiationArgs& inArgs ) = 0;
88
89 /**
90 \brief Convert from a descriptor to a live object. Must be an object of this Serializer type.
91
92 \param[in] inReader The inverse of the writer, a key-value pair database.
93 \param[in] inAllocator An allocator to use for temporary allocations. These will be freed after instantiation completes.
94 \param[in] inArgs The arguments used in create resources and objects.
95 \param[in] inCollection The collection used to find references.
96
97 \return The new live object. It can be an invalid object if the instantiation cannot take place.
98 */
99 virtual PxRepXObject fileToObject( XmlReader& inReader, XmlMemoryAllocator& inAllocator, PxRepXInstantiationArgs& inArgs, PxCollection* inCollection ) = 0;
100
101 };
102
103#if !PX_DOXYGEN
104} // namespace physx
105#endif
106
107/**
108\brief Inline helper template function to create PxRepXObject from TDataType type supporting PxTypeInfo<TDataType>::name.
109*/
110template<typename TDataType>
111PX_INLINE physx::PxRepXObject PxCreateRepXObject(const TDataType* inType, const physx::PxSerialObjectId inId)
112{
113 return physx::PxRepXObject(physx::PxTypeInfo<TDataType>::name(), inType, inId);
114}
115
116/**
117\brief Inline helper function to create PxRepXObject from a PxBase instance.
118*/
119PX_INLINE physx::PxRepXObject PxCreateRepXObject(const physx::PxBase* inType, const physx::PxSerialObjectId inId)
120{
121 PX_ASSERT(inType);
122 return physx::PxRepXObject(inType->getConcreteTypeName(), inType, inId);
123}
124
125/**
126\brief Inline helper template function to create PxRepXObject form TDataType type using inType pointer as a PxSerialObjectId id.
127*/
128template<typename TDataType>
129PX_INLINE physx::PxRepXObject PxCreateRepXObject(const TDataType* inType)
130{
131 return PxCreateRepXObject(inType, static_cast<physx::PxSerialObjectId>(reinterpret_cast<size_t>(inType)));
132}
133
134/**
135\brief Preprocessor macro for RepX serializer creation.
136*/
137#define PX_NEW_REPX_SERIALIZER(T) \
138 *PX_PLACEMENT_NEW(PxGetFoundation().getAllocatorCallback().allocate(sizeof(T), "PxRepXSerializer", __FILE__, __LINE__ ), T)(PxGetFoundation().getAllocatorCallback())
139
140/**
141\brief Preprocessor Macro to simplify RepX serializer delete.
142*/
143#define PX_DELETE_REPX_SERIALIZER(x) \
144 { PxRepXSerializer* s = x; if (s) { PxGetFoundation().getAllocatorCallback().deallocate(s); } }
145
146
147/** @} */
148#endif // PX_REPX_SERIALIZER_H
149

source code of qtquick3dphysics/src/3rdparty/PhysX/include/extensions/PxRepXSerializer.h