From 9634f9b0505f231b808ca6e10bb0b77f949e81fc Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Thu, 23 May 2013 00:07:37 -0400 Subject: [PATCH] PhysX conversion code validation at compile-time Seriously? Offsetof has been around for a long time, and eap added a compiler_assert for his crazy netcode. There's no excuse for that to be happening at runtime. --- .../Plasma/PubUtilLib/plPhysX/plPXConvert.cpp | 48 +++++-------------- .../Plasma/PubUtilLib/plPhysX/plPXConvert.h | 1 - .../PubUtilLib/plPhysX/plSimulationMgr.cpp | 8 ---- 3 files changed, 12 insertions(+), 45 deletions(-) diff --git a/Sources/Plasma/PubUtilLib/plPhysX/plPXConvert.cpp b/Sources/Plasma/PubUtilLib/plPhysX/plPXConvert.cpp index 8f484329..58a46723 100644 --- a/Sources/Plasma/PubUtilLib/plPhysX/plPXConvert.cpp +++ b/Sources/Plasma/PubUtilLib/plPhysX/plPXConvert.cpp @@ -39,44 +39,20 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com Mead, WA 99021 *==LICENSE==*/ -#include "plPXConvert.h" - -bool plPXConvert::Validate() -{ - NxVec3 nxVec; - hsVector3 plVec; - - int nxVecXOffset = ((char*)&nxVec.x) - ((char*)&nxVec); - int nxVecYOffset = ((char*)&nxVec.y) - ((char*)&nxVec); - int nxVecZOffset = ((char*)&nxVec.z) - ((char*)&nxVec); - int plVecXOffset = ((char*)&plVec.fX) - ((char*)&plVec); - int plVecYOffset = ((char*)&plVec.fY) - ((char*)&plVec); - int plVecZOffset = ((char*)&plVec.fZ) - ((char*)&plVec); - - NxQuat nxQuat; - hsQuat plQuat; - - int nxQuatXOffset = ((char*)&nxQuat.x) - ((char*)&nxQuat); - int nxQuatYOffset = ((char*)&nxQuat.y) - ((char*)&nxQuat); - int nxQuatZOffset = ((char*)&nxQuat.z) - ((char*)&nxQuat); - int nxQuatWOffset = ((char*)&nxQuat.w) - ((char*)&nxQuat); +#include "plPXConvert.h" - int plQuatXOffset = ((char*)&plQuat.fX) - ((char*)&plQuat); - int plQuatYOffset = ((char*)&plQuat.fY) - ((char*)&plQuat); - int plQuatZOffset = ((char*)&plQuat.fZ) - ((char*)&plQuat); - int plQuatWOffset = ((char*)&plQuat.fW) - ((char*)&plQuat); +#define CHECK_OFFSET(NxCls, NxMem, hsCls, hsMem) \ + static_assert(offsetof(NxCls, NxMem) == offsetof(hsCls, hsMem), \ + "PhysX Conversion Failure: "#NxCls " and " #hsCls " offsets do not match for " #NxMem "!"); - bool offsetsOK = - nxVecXOffset == plVecXOffset && - nxVecYOffset == plVecYOffset && - nxVecZOffset == plVecZOffset && - nxQuatXOffset == plQuatXOffset && - nxQuatYOffset == plQuatYOffset && - nxQuatZOffset == plQuatZOffset && - nxQuatWOffset == plQuatWOffset; +CHECK_OFFSET(NxVec3, x, hsScalarTriple, fX); +CHECK_OFFSET(NxVec3, y, hsScalarTriple, fY); +CHECK_OFFSET(NxVec3, z, hsScalarTriple, fZ); - hsAssert(offsetsOK, "PhysX or Plasma offsets have changed, need to rewrite conversion code"); +CHECK_OFFSET(NxQuat, x, hsQuat, fX); +CHECK_OFFSET(NxQuat, y, hsQuat, fY); +CHECK_OFFSET(NxQuat, z, hsQuat, fZ); +CHECK_OFFSET(NxQuat, w, hsQuat, fW); +#undef CHECK_OFFSET - return offsetsOK; -} diff --git a/Sources/Plasma/PubUtilLib/plPhysX/plPXConvert.h b/Sources/Plasma/PubUtilLib/plPhysX/plPXConvert.h index b1f0cd37..ac42898f 100644 --- a/Sources/Plasma/PubUtilLib/plPhysX/plPXConvert.h +++ b/Sources/Plasma/PubUtilLib/plPhysX/plPXConvert.h @@ -73,7 +73,6 @@ namespace plPXConvert inline void Matrix(const hsMatrix44& fromMat, NxMat34& toMat) { toMat.setRowMajor44(&fromMat.fMap[0][0]); } inline void Matrix(const NxMat34& fromMat, hsMatrix44& toMat) { toMat.NotIdentity(); fromMat.getRowMajor44(&toMat.fMap[0][0]); } - bool Validate(); }; #endif // plPXConvert_h_inc \ No newline at end of file diff --git a/Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.cpp b/Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.cpp index 309aebe1..da06038d 100644 --- a/Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.cpp +++ b/Sources/Plasma/PubUtilLib/plPhysX/plSimulationMgr.cpp @@ -301,14 +301,6 @@ bool plSimulationMgr::InitSimulation() fSDK->getFoundationSDK().getRemoteDebugger()->connect("localhost", 5425); #endif - if ( !plPXConvert::Validate() ) - { -#ifndef PLASMA_EXTERNAL_RELEASE - hsMessageBox("Ageia's PhysX or Plasma offsets have changed, need to rewrite conversion code.","PhysX Error",hsMBoxOk); -#endif - return false; // client will handle this and ask user to install - } - return true; }