| 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 |  | 
| 30 |  | 
| 31 | #ifndef PX_SERIALIZATION_H | 
| 32 | #define PX_SERIALIZATION_H | 
| 33 | /** \addtogroup extensions | 
| 34 |   @{ | 
| 35 | */ | 
| 36 |  | 
| 37 | #include "PxPhysXConfig.h" | 
| 38 | #include "common/PxBase.h" | 
| 39 | #include "cooking/PxCooking.h" | 
| 40 | #include "foundation/PxIO.h" | 
| 41 | #include "common/PxTolerancesScale.h" | 
| 42 | #include "common/PxTypeInfo.h" | 
| 43 | #include "common/PxStringTable.h" | 
| 44 |  | 
| 45 | /** | 
| 46 | PX_BINARY_SERIAL_VERSION is used to version the PhysX binary data and meta data. The global unique identifier of the PhysX SDK needs to match  | 
| 47 | the one in the data and meta data, otherwise they are considered incompatible. A 32 character wide GUID can be generated with https://www.guidgenerator.com/ for example.  | 
| 48 | */ | 
| 49 | #define PX_BINARY_SERIAL_VERSION "77E92B17A4084033A0FDB51332D5A6BB" | 
| 50 |  | 
| 51 |  | 
| 52 | #if !PX_DOXYGEN | 
| 53 | namespace physx | 
| 54 | { | 
| 55 | #endif | 
| 56 |  | 
| 57 | 	class PxBinaryConverter; | 
| 58 |  | 
| 59 | /** | 
| 60 | \brief Utility functions for serialization | 
| 61 |  | 
| 62 | @see PxCollection, PxSerializationRegistry | 
| 63 | */ | 
| 64 | class PxSerialization | 
| 65 | { | 
| 66 | public: | 
| 67 | 	/** | 
| 68 | 	\brief Additional PxScene and PxPhysics options stored in XML serialized data. | 
| 69 |  | 
| 70 | 	The PxXmlMiscParameter parameter can be serialized and deserialized along with PxCollection instances (XML only). | 
| 71 | 	This is for application use only and has no impact on how objects are serialized or deserialized.  | 
| 72 | 	@see PxSerialization::createCollectionFromXml, PxSerialization::serializeCollectionToXml | 
| 73 | 	*/ | 
| 74 | 	struct PxXmlMiscParameter | 
| 75 | 	{ | 
| 76 | 		/** | 
| 77 | 		\brief Up vector for the scene reference coordinate system. | 
| 78 | 		*/ | 
| 79 | 		PxVec3				upVector; | 
| 80 |  | 
| 81 | 		/** | 
| 82 | 		\brief Tolerances scale to be used for the scene. | 
| 83 | 		*/ | 
| 84 | 		PxTolerancesScale	scale; | 
| 85 | 		 | 
| 86 | 		PxXmlMiscParameter() : upVector(0) {} | 
| 87 | 		PxXmlMiscParameter(PxVec3& inUpVector, PxTolerancesScale inScale) : upVector(inUpVector), scale(inScale) {} | 
| 88 | 	}; | 
| 89 |  | 
| 90 | 	/** | 
| 91 | 	\brief Returns whether the collection is serializable with the externalReferences collection. | 
| 92 |  | 
| 93 | 	Some definitions to explain whether a collection can be serialized or not: | 
| 94 |  | 
| 95 | 	For definitions of <b>requires</b> and <b>complete</b> see #PxSerialization::complete | 
| 96 |  | 
| 97 | 	A serializable object is <b>subordinate</b> if it cannot be serialized on its own | 
| 98 | 	The following objects are subordinate: | 
| 99 | 	- articulation links | 
| 100 | 	- articulation joints | 
| 101 | 	- joints | 
| 102 |  | 
| 103 | 	A collection C can be serialized with external references collection D iff | 
| 104 | 	- C is complete relative to D (no dangling references) | 
| 105 | 	- Every object in D required by an object in C has a valid ID (no unnamed references) | 
| 106 | 	- Every subordinate object in C is required by another object in C (no orphans) | 
| 107 |  | 
| 108 | 	\param[in] collection Collection to be checked | 
| 109 | 	\param[in] sr PxSerializationRegistry instance with information about registered classes. | 
| 110 | 	\param[in] externalReferences the external References collection | 
| 111 | 	\return  Whether the collection is serializable | 
| 112 | 	@see PxSerialization::complete, PxSerialization::serializeCollectionToBinary, PxSerialization::serializeCollectionToXml, PxSerializationRegistry | 
| 113 | 	*/ | 
| 114 | 	static	bool			isSerializable(PxCollection& collection, PxSerializationRegistry& sr, const PxCollection* externalReferences = NULL); | 
| 115 |  | 
| 116 | 	/** | 
| 117 | 	\brief Adds to a collection all objects such that it can be successfully serialized. | 
| 118 | 	 | 
| 119 | 	A collection C is complete relative to an other collection D if every object required by C is either in C or D. | 
| 120 | 	This function adds objects to a collection, such that it becomes complete with respect to the exceptFor collection. | 
| 121 | 	Completeness is needed for serialization. See #PxSerialization::serializeCollectionToBinary,  | 
| 122 | 	#PxSerialization::serializeCollectionToXml. | 
| 123 |  | 
| 124 | 	Sdk objects require other sdk object according to the following rules:  | 
| 125 | 	 - joints require their actors and constraint | 
| 126 | 	 - rigid actors require their shapes | 
| 127 | 	 - shapes require their material(s) and mesh (triangle mesh, convex mesh or height field), if any | 
| 128 | 	 - articulations require their links and joints | 
| 129 | 	 - aggregates require their actors | 
| 130 |  | 
| 131 | 	If followJoints is specified another rule is added: | 
| 132 | 	 - actors require their joints | 
| 133 | 	 | 
| 134 | 	Specifying followJoints will make whole jointed actor chains being added to the collection. Following chains  | 
| 135 | 	is interrupted whenever a object in exceptFor is encountered. | 
| 136 |  | 
| 137 | 	\param[in,out] collection Collection which is completed | 
| 138 | 	\param[in] sr PxSerializationRegistry instance with information about registered classes. | 
| 139 | 	\param[in] exceptFor Optional exemption collection | 
| 140 | 	\param[in] followJoints Specifies whether joints should be added for jointed actors | 
| 141 | 	@see PxCollection, PxSerialization::serializeCollectionToBinary, PxSerialization::serializeCollectionToXml, PxSerializationRegistry | 
| 142 | 	*/ | 
| 143 | 	static	void			complete(PxCollection& collection, PxSerializationRegistry& sr, const PxCollection* exceptFor = NULL, bool followJoints = false); | 
| 144 | 	 | 
| 145 | 	/** | 
| 146 | 	\brief Creates PxSerialObjectId values for unnamed objects in a collection. | 
| 147 |  | 
| 148 | 	Creates PxSerialObjectId names for unnamed objects in a collection starting at a base value and incrementing,  | 
| 149 | 	skipping values that are already assigned to objects in the collection. | 
| 150 |  | 
| 151 | 	\param[in,out] collection Collection for which names are created | 
| 152 | 	\param[in] base Start address for PxSerialObjectId names | 
| 153 | 	@see PxCollection | 
| 154 | 	*/ | 
| 155 | 	static	void			createSerialObjectIds(PxCollection& collection, const PxSerialObjectId base); | 
| 156 | 			 | 
| 157 | 	/** | 
| 158 | 	\brief Creates a PxCollection from XML data. | 
| 159 |  | 
| 160 | 	\param inputData The input data containing the XML collection. | 
| 161 | 	\param cooking PxCooking instance used for sdk object instantiation. | 
| 162 | 	\param sr PxSerializationRegistry instance with information about registered classes. | 
| 163 | 	\param externalRefs PxCollection used to resolve external references. | 
| 164 | 	\param stringTable PxStringTable instance used for storing object names. | 
| 165 | 	\param outArgs Optional parameters of physics and scene deserialized from XML. See #PxSerialization::PxXmlMiscParameter | 
| 166 | 	\return a pointer to a PxCollection if successful or NULL if it failed. | 
| 167 |  | 
| 168 | 	@see PxCollection, PxSerializationRegistry, PxInputData, PxStringTable, PxCooking, PxSerialization::PxXmlMiscParameter | 
| 169 | 	*/ | 
| 170 | 	static	PxCollection*	createCollectionFromXml(PxInputData& inputData, PxCooking& cooking, PxSerializationRegistry& sr, const PxCollection* externalRefs = NULL, PxStringTable* stringTable = NULL, PxXmlMiscParameter* outArgs = NULL); | 
| 171 | 	 | 
| 172 | 	/** | 
| 173 | 	\brief Deserializes a PxCollection from memory. | 
| 174 |  | 
| 175 | 	Creates a collection from memory. If the collection has external dependencies another collection  | 
| 176 | 	can be provided to resolve these. | 
| 177 |  | 
| 178 | 	The memory block provided has to be 128 bytes aligned and contain a contiguous serialized collection as written | 
| 179 | 	by PxSerialization::serializeCollectionToBinary. The contained binary data needs to be compatible with the current binary format version | 
| 180 | 	which is defined by "PX_PHYSICS_VERSION_MAJOR.PX_PHYSICS_VERSION_MINOR.PX_PHYSICS_VERSION_BUGFIX-PX_BINARY_SERIAL_VERSION". | 
| 181 | 	For a list of compatible sdk releases refer to the documentation of PX_BINARY_SERIAL_VERSION. | 
| 182 |  | 
| 183 | 	\param[in] memBlock Pointer to memory block containing the serialized collection | 
| 184 | 	\param[in] sr PxSerializationRegistry instance with information about registered classes. | 
| 185 | 	\param[in] externalRefs Collection to resolve external dependencies | 
| 186 |  | 
| 187 | 	@see PxCollection, PxSerialization::complete, PxSerialization::serializeCollectionToBinary, PxSerializationRegistry, PX_BINARY_SERIAL_VERSION | 
| 188 | 	*/ | 
| 189 | 	static	PxCollection*	createCollectionFromBinary(void* memBlock, PxSerializationRegistry& sr, const PxCollection* externalRefs = NULL); | 
| 190 |  | 
| 191 | 	/** | 
| 192 | 	\brief Serializes a physics collection to an XML output stream. | 
| 193 |  | 
| 194 | 	The collection to be serialized needs to be complete @see PxSerialization.complete. | 
| 195 | 	Optionally the XML may contain meshes in binary cooked format for fast loading. It does this when providing a valid non-null PxCooking pointer. | 
| 196 |  | 
| 197 | 	\note Serialization of objects in a scene that is simultaneously being simulated is not supported and leads to undefined behavior.  | 
| 198 |  | 
| 199 | 	\param outputStream Stream to save collection to. | 
| 200 | 	\param collection PxCollection instance which is serialized. The collection needs to be complete with respect to the externalRefs collection. | 
| 201 | 	\param sr PxSerializationRegistry instance with information about registered classes. | 
| 202 | 	\param cooking Optional pointer to cooking instance. If provided, cooked mesh data is cached for fast loading. | 
| 203 | 	\param externalRefs Collection containing external references. | 
| 204 | 	\param inArgs Optional parameters of physics and scene serialized to XML along with the collection. See #PxSerialization::PxXmlMiscParameter | 
| 205 | 	\return true if the collection is successfully serialized. | 
| 206 |  | 
| 207 | 	@see PxCollection, PxOutputStream, PxSerializationRegistry, PxCooking, PxSerialization::PxXmlMiscParameter | 
| 208 | 	*/ | 
| 209 | 	static	bool			serializeCollectionToXml(PxOutputStream& outputStream, PxCollection& collection,  PxSerializationRegistry& sr, PxCooking* cooking = NULL, const PxCollection* externalRefs = NULL, PxXmlMiscParameter* inArgs = NULL); | 
| 210 | 	 | 
| 211 | 	/** | 
| 212 | 	\brief Serializes a collection to a binary stream. | 
| 213 |  | 
| 214 | 	Serializes a collection to a stream. In order to resolve external dependencies the externalReferences collection has to be provided.  | 
| 215 | 	Optionally names of objects that where set for example with #PxActor::setName are serialized along with the objects. | 
| 216 |  | 
| 217 | 	The collection can be successfully serialized if isSerializable(collection) returns true. See #isSerializable. | 
| 218 |  | 
| 219 | 	The implementation of the output stream needs to fulfill the requirements on the memory block input taken by | 
| 220 | 	PxSerialization::createCollectionFromBinary. | 
| 221 |  | 
| 222 | 	\note Serialization of objects in a scene that is simultaneously being simulated is not supported and leads to undefined behavior.  | 
| 223 |  | 
| 224 | 	\param[out] outputStream into which the collection is serialized | 
| 225 | 	\param[in] collection Collection to be serialized | 
| 226 | 	\param[in] sr PxSerializationRegistry instance with information about registered classes. | 
| 227 | 	\param[in] externalRefs Collection used to resolve external dependencies | 
| 228 | 	\param[in] exportNames Specifies whether object names are serialized | 
| 229 | 	\return Whether serialization was successful | 
| 230 |  | 
| 231 | 	@see PxCollection, PxOutputStream, PxSerialization::complete, PxSerialization::createCollectionFromBinary, PxSerializationRegistry | 
| 232 | 	*/ | 
| 233 | 	static	bool			serializeCollectionToBinary(PxOutputStream& outputStream, PxCollection& collection, PxSerializationRegistry& sr, const PxCollection* externalRefs = NULL, bool exportNames = false ); | 
| 234 |  | 
| 235 | 	/** | 
| 236 | 	\brief Serializes a collection to a binary stream. | 
| 237 |  | 
| 238 | 	Convenience function that serializes a collection to a stream while rebasing memory addresses and handles | 
| 239 | 	to achieve a deterministic output, independent of the PhysX runtime environment the objects have been created in.  | 
| 240 |  | 
| 241 | 	The same functionality can be achieved by manually | 
| 242 | 	- creating a binary data stream with PxSerialization::serializeCollectionToBinary | 
| 243 | 	- producing the binary meta data of the current runtime platform with PxSerialization::dumpBinaryMetaData | 
| 244 | 	- converting the binary data stream with the PxBinaryConverter, using the binary meta for both source and destination | 
| 245 |  | 
| 246 | 	@see PxSerialization::serializeCollectionToBinary, PxSerialization::dumpBinaryMetaData, PxBinaryConverter | 
| 247 | 	*/ | 
| 248 | 	static bool				serializeCollectionToBinaryDeterministic(PxOutputStream& outputStream, PxCollection& collection, PxSerializationRegistry& sr, const PxCollection* externalRefs = NULL, bool exportNames = false); | 
| 249 |  | 
| 250 | 	/**  | 
| 251 | 	\brief Dumps the binary meta-data to a stream. | 
| 252 |  | 
| 253 | 	A meta-data file contains information about the SDK's internal classes and about custom user types ready  | 
| 254 | 	for serialization. Such a file is needed to convert binary-serialized data from one platform to another (re-targeting).  | 
| 255 | 	The converter needs meta-data files for the source and target platforms to perform conversions. | 
| 256 |  | 
| 257 | 	Custom user types can be supported with PxSerializationRegistry::registerBinaryMetaDataCallback (see the guide for more information).  | 
| 258 | 	 | 
| 259 | 	\param[out] outputStream Stream to write meta data to	 | 
| 260 | 	\param[in] sr PxSerializationRegistry instance with information about registered classes used for conversion. | 
| 261 | 	 | 
| 262 | 	@see PxOutputStream, PxSerializationRegistry | 
| 263 | 	*/ | 
| 264 | 	static	void			dumpBinaryMetaData(PxOutputStream& outputStream, PxSerializationRegistry& sr); | 
| 265 |  | 
| 266 | 	/** | 
| 267 | 	\brief Creates binary converter for re-targeting binary-serialized data. | 
| 268 | 	 | 
| 269 | 	\return Binary converter instance. | 
| 270 | 	*/ | 
| 271 | 	static PxBinaryConverter* createBinaryConverter(); | 
| 272 |  | 
| 273 | 	/** | 
| 274 | 	\brief Creates an application managed registry for serialization. | 
| 275 | 	 | 
| 276 | 	\param[in] physics Physics SDK to generate create serialization registry | 
| 277 | 	 | 
| 278 | 	\return PxSerializationRegistry instance. | 
| 279 |  | 
| 280 | 	@see PxSerializationRegistry | 
| 281 | 	*/ | 
| 282 | 	static PxSerializationRegistry* createSerializationRegistry(PxPhysics& physics);	 | 
| 283 | }; | 
| 284 |  | 
| 285 | #if !PX_DOXYGEN | 
| 286 | } // namespace physx | 
| 287 | #endif | 
| 288 |  | 
| 289 | /** @} */ | 
| 290 | #endif | 
| 291 |  |