diff options
Diffstat (limited to 'PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary')
4 files changed, 134 insertions, 2 deletions
diff --git a/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX.cpp b/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX.cpp index 78dc3a78..a2b91b4c 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX.cpp @@ -103,6 +103,16 @@ bool Sn::ConvX::setMetaData(PxInputStream& srcMetaData, PxInputStream& dstMetaDa return true; } +bool Sn::ConvX::compareMetaData() const +{ + if (!mMetaData_Src || !mMetaData_Dst) { + Ps::getFoundation().error(PxErrorCode::eINVALID_OPERATION, __FILE__, __LINE__, + "PxBinaryConverter: metadata not defined. Call PxBinaryConverter::setMetaData first.\n"); + return false; + } + + return mMetaData_Src->compare(*mMetaData_Dst); +} bool Sn::ConvX::convert(PxInputStream& srcStream, PxU32 srcSize, PxOutputStream& targetStream) { diff --git a/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX.h b/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX.h index 604aba0a..c30bcdda 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX.h +++ b/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX.h @@ -79,6 +79,7 @@ namespace Sn { PX_FORCE_INLINE bool verboseMode() const { return mReportMode==PxConverterReportMode::eVERBOSE; } virtual bool setMetaData(PxInputStream& srcMetaData, PxInputStream& dstMetaData); + virtual bool compareMetaData() const; virtual bool convert(PxInputStream& srcStream, PxU32 srcSize, PxOutputStream& targetStream); private: diff --git a/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX_MetaData.cpp b/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX_MetaData.cpp index cc5465db..b9cb5ce1 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX_MetaData.cpp +++ b/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX_MetaData.cpp @@ -496,7 +496,7 @@ bool MetaData::load(PxInputStream& inputStream, MetaDataType type) { if(!mEntries[i].mName) { - mConvX.displayMessage(PxErrorCode::eDEBUG_INFO, "Found class: %s\n", mEntries[i].mType); + mConvX.displayMessage(PxErrorCode::eDEBUG_INFO, "Found class: %s\n", mEntries[i].mType); currentClass = addNewClass(mEntries[i].mType, mEntries[i].mSize); if(mEntries[i].mFlags & PxMetaDataFlag::eVIRTUAL) @@ -703,6 +703,126 @@ bool MetaData::load(PxInputStream& inputStream, MetaDataType type) return true; } +namespace +{ + //tool functions for MetaData::compare + + bool str_equal(const char* src, const char* dst) + { + if (src == dst) + return true; + + if (src != NULL && dst != NULL) + return strcmp(src, dst) == 0; + + return false; + } + + const char* str_print(const char* str) + { + return str != NULL ? str : "(nullptr)"; + } +} + +#define COMPARE_METADATA_BOOL_MD(type, src, dst, field) if ((src).field != (dst).field) \ + { mConvX.displayMessage(PxErrorCode::eDEBUG_INFO, "%s::%s missmatch: src %s dst %s\n", #type, #field, (src).field?"true":"false", (dst).field?"true":"false"); isEquivalent = false; } +#define COMPARE_METADATA_INT_MD(type, src, dst, field) if ((src).field != (dst).field) \ + { mConvX.displayMessage(PxErrorCode::eDEBUG_INFO, "%s::%s missmatch: src %d dst %d\n", #type, #field, (src).field, (dst).field); isEquivalent = false; } +#define COMPARE_METADATA_STRING_MD(type, src, dst, field) \ + if (!str_equal((src).field, (dst).field)) \ + { \ + mConvX.displayMessage(PxErrorCode::eDEBUG_INFO, "%s::%s missmatch: src %s dst %s\n", #type, #field, str_print((src).field), str_print((dst).field)); \ + isEquivalent = false; \ + } + +bool MetaData::compare(const MetaData& dst) const +{ + bool isEquivalent = true; + + //mType + COMPARE_METADATA_BOOL_MD(MetaData, *this, dst, mFlip) + COMPARE_METADATA_INT_MD(MetaData, *this, dst, mVersion) + COMPARE_METADATA_INT_MD(MetaData, *this, dst, mBinaryVersion) + //mBuildNumber + COMPARE_METADATA_INT_MD(MetaData, *this, dst, mSizeOfPtr) + COMPARE_METADATA_INT_MD(MetaData, *this, dst, mPlatformTag) + COMPARE_METADATA_INT_MD(MetaData, *this, dst, mGaussMapLimit) + COMPARE_METADATA_INT_MD(MetaData, *this, dst, mNbEntries) + + //find classes missing in dst + for (PxU32 i = 0; i<mMetaClasses.size(); i++) + { + MetaClass* mcSrc = mMetaClasses[i]; + MetaClass* mcDst = dst.getMetaClass(mcSrc->mClassName); + + if (mcDst == NULL) + { + mConvX.displayMessage(PxErrorCode::eDEBUG_INFO, "dst is missing meta class %s", mcSrc->mClassName); + } + } + + //find classes missing in src + for (PxU32 i = 0; i<dst.mMetaClasses.size(); i++) + { + MetaClass* mcDst = dst.mMetaClasses[i]; + MetaClass* mcSrc = getMetaClass(mcDst->mClassName); + + if (mcSrc == NULL) + { + mConvX.displayMessage(PxErrorCode::eDEBUG_INFO, "dst is missing meta class %s", mcSrc->mClassName); + } + } + + //compare classes present in src and dst + for (PxU32 i = 0; i<mMetaClasses.size(); i++) + { + const char* className = mMetaClasses[i]->mClassName; + MetaClass* mcSrc = getMetaClass(className); + MetaClass* mcDst = dst.getMetaClass(className); + if (mcSrc != NULL && mcDst != NULL) + { + COMPARE_METADATA_INT_MD(MetaClass, *mcSrc, *mcDst, mCallback) + COMPARE_METADATA_INT_MD(MetaClass, *mcSrc, *mcDst, mMaster) //should be 0 for both anyway + COMPARE_METADATA_STRING_MD(MetaClass, *mcSrc, *mcDst, mClassName) + COMPARE_METADATA_INT_MD(MetaClass, *mcSrc, *mcDst, mSize) + COMPARE_METADATA_INT_MD(MetaClass, *mcSrc, *mcDst, mDepth) + + COMPARE_METADATA_INT_MD(MetaClass, *mcSrc, *mcDst, mBaseClasses.size()) + if (mcSrc->mBaseClasses.size() == mcDst->mBaseClasses.size()) + { + for (PxU32 b = 0; b < mcSrc->mBaseClasses.size(); b++) + { + COMPARE_METADATA_STRING_MD(PxMetaDataEntry, mcSrc->mBaseClasses[b], mcDst->mBaseClasses[b], mName); + } + } + + COMPARE_METADATA_INT_MD(MetaClass, *mcSrc, *mcDst, mFields.size()) + if (mcSrc->mFields.size() == mcDst->mFields.size()) + { + for (PxU32 f = 0; f < mcSrc->mFields.size(); f++) + { + PxMetaDataEntry srcMde = mcSrc->mFields[f]; + PxMetaDataEntry dstMde = mcDst->mFields[f]; + + COMPARE_METADATA_STRING_MD(PxMetaDataEntry, srcMde, dstMde, mType) + COMPARE_METADATA_STRING_MD(PxMetaDataEntry, srcMde, dstMde, mName) + COMPARE_METADATA_INT_MD(PxMetaDataEntry, srcMde, dstMde, mOffset) + COMPARE_METADATA_INT_MD(PxMetaDataEntry, srcMde, dstMde, mSize) + COMPARE_METADATA_INT_MD(PxMetaDataEntry, srcMde, dstMde, mCount) + COMPARE_METADATA_INT_MD(PxMetaDataEntry, srcMde, dstMde, mOffsetSize) + COMPARE_METADATA_INT_MD(PxMetaDataEntry, srcMde, dstMde, mFlags) + COMPARE_METADATA_INT_MD(PxMetaDataEntry, srcMde, dstMde, mAlignment) + } + } + } + } + return isEquivalent; +} + +#undef COMPARE_METADATA_BOOL_MD +#undef COMPARE_METADATA_INT_MD +#undef COMPARE_METADATA_STRING_MD + /////////////////////////////////////////////////////////////////////////////// void ConvX::releaseMetaData() @@ -838,4 +958,3 @@ PxU64 physx::Sn::peek(int size, const char* buffer, int flags) return PxU64(-1); } - diff --git a/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX_MetaData.h b/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX_MetaData.h index 4accc4a5..54d5260f 100644 --- a/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX_MetaData.h +++ b/PhysX_3.4/Source/PhysXExtensions/src/serialization/Binary/SnConvX_MetaData.h @@ -146,6 +146,8 @@ namespace physx { namespace Sn { MetaClass* getMetaClass(const char* name) const; MetaClass* getMetaClass(PxConcreteType::Enum concreteType) const; MetaClass* addNewClass(const char* name, int size, MetaClass* master=NULL, ConvertCallback callback=NULL); + + bool compare(const MetaData& candidate) const; private: MetaData& operator=(const MetaData&); Sn::ConvX& mConvX; |