#include "NvBlastExtSerialization.h" #include "BlastSerialization.h" #include #include "PxPhysicsVersion.h" #include "PxConvexMeshGeometryDTO.h" #include "NvBlastExtDefs.h" // This is terrible. physx::PxPhysics* g_Physics = nullptr; std::shared_ptr getCooking() { physx::PxCookingParams cookingParams(g_Physics->getTolerancesScale()); cookingParams.buildGPUData = true; std::shared_ptr m_Cooking = std::shared_ptr(PxCreateCooking(PX_PHYSICS_VERSION, g_Physics->getFoundation(), cookingParams), [=](physx::PxCooking* cooking) { cooking->release(); }); NVBLASTEXT_CHECK_ERROR(m_Cooking, "Error: failed to create PhysX Cooking\n", return nullptr); return m_Cooking; } extern "C" { NVBLAST_API void setPhysXSDK(physx::PxPhysics* physXSDK) { g_Physics = physXSDK; } NVBLAST_API NvBlastAsset* deserializeAsset(const unsigned char* input, uint32_t size) { return Nv::Blast::BlastSerialization::deserialize(input, size); } NVBLAST_API NvBlastAsset* deserializeAssetFromStream(std::istream &inputStream) { return Nv::Blast::BlastSerialization::deserializeFromStream(inputStream); } NVBLAST_API bool serializeAssetIntoStream(const NvBlastAsset *asset, std::ostream &outputStream) { return Nv::Blast::BlastSerialization::serializeIntoStream(reinterpret_cast(asset), outputStream); } NVBLAST_API bool serializeAssetIntoNewBuffer(const NvBlastAsset *asset, unsigned char **outBuffer, uint32_t &outSize) { return Nv::Blast::BlastSerialization::serializeIntoNewBuffer(reinterpret_cast(asset), outBuffer, outSize); } NVBLAST_API bool serializeAssetIntoExistingBuffer(const NvBlastAsset *asset, unsigned char *buffer, uint32_t maxSize, uint32_t &usedSize) { return Nv::Blast::BlastSerialization::serializeIntoExistingBuffer(reinterpret_cast(asset), buffer, maxSize, usedSize); } ////////////////////////////////////////////////////////////////////////// // TkAsset ////////////////////////////////////////////////////////////////////////// NVBLAST_API Nv::Blast::TkAsset* deserializeTkAsset(const unsigned char* input, uint32_t size) { return Nv::Blast::BlastSerialization::deserialize(input, size); } NVBLAST_API Nv::Blast::TkAsset* deserializeTkAssetFromStream(std::istream &inputStream) { return Nv::Blast::BlastSerialization::deserializeFromStream(inputStream); } NVBLAST_API bool serializeTkAssetIntoStream(const Nv::Blast::TkAsset *asset, std::ostream &outputStream) { return Nv::Blast::BlastSerialization::serializeIntoStream(reinterpret_cast(asset), outputStream); } NVBLAST_API bool serializeTkAssetIntoNewBuffer(const Nv::Blast::TkAsset *asset, unsigned char **outBuffer, uint32_t &outSize) { return Nv::Blast::BlastSerialization::serializeIntoNewBuffer(reinterpret_cast(asset), outBuffer, outSize); } NVBLAST_API bool serializeTkAssetIntoExistingBuffer(const Nv::Blast::TkAsset *asset, unsigned char *buffer, uint32_t maxSize, uint32_t &usedSize) { return Nv::Blast::BlastSerialization::serializeIntoExistingBuffer(reinterpret_cast(asset), buffer, maxSize, usedSize); } ////////////////////////////////////////////////////////////////////////// // ExtPxAsset ////////////////////////////////////////////////////////////////////////// NVBLAST_API Nv::Blast::ExtPxAsset* deserializeExtPxAsset(const unsigned char* input, uint32_t size) { NVBLAST_ASSERT(g_Physics != nullptr); return Nv::Blast::BlastSerialization::deserialize(input, size); } NVBLAST_API Nv::Blast::ExtPxAsset* deserializeExtPxAssetFromStream(std::istream &inputStream) { NVBLAST_ASSERT(g_Physics != nullptr); return Nv::Blast::BlastSerialization::deserializeFromStream(inputStream); } NVBLAST_API bool serializeExtPxAssetIntoStream(const Nv::Blast::ExtPxAsset *asset, std::ostream &outputStream) { NVBLAST_ASSERT(g_Physics != nullptr); auto cooking = getCooking(); PxConvexMeshGeometryDTO::Cooking = cooking.get(); PxConvexMeshGeometryDTO::Physics = g_Physics; return Nv::Blast::BlastSerialization::serializeIntoStream(reinterpret_cast(asset), outputStream); } NVBLAST_API bool serializeExtPxAssetIntoNewBuffer(const Nv::Blast::ExtPxAsset *asset, unsigned char **outBuffer, uint32_t &outSize) { NVBLAST_ASSERT(g_Physics != nullptr); auto cooking = getCooking(); PxConvexMeshGeometryDTO::Cooking = cooking.get(); PxConvexMeshGeometryDTO::Physics = g_Physics; return Nv::Blast::BlastSerialization::serializeIntoNewBuffer(reinterpret_cast(asset), outBuffer, outSize); } NVBLAST_API bool serializeExtPxAssetIntoExistingBuffer(const Nv::Blast::ExtPxAsset *asset, unsigned char *buffer, uint32_t maxSize, uint32_t &usedSize) { NVBLAST_ASSERT(g_Physics != nullptr); auto cooking = getCooking(); PxConvexMeshGeometryDTO::Cooking = cooking.get(); PxConvexMeshGeometryDTO::Physics = g_Physics; return Nv::Blast::BlastSerialization::serializeIntoExistingBuffer(reinterpret_cast(asset), buffer, maxSize, usedSize); } }