diff --git a/lib/hkStubs/CMakeLists.txt b/lib/hkStubs/CMakeLists.txt index 613502a6..2c3d8c4b 100644 --- a/lib/hkStubs/CMakeLists.txt +++ b/lib/hkStubs/CMakeLists.txt @@ -107,6 +107,7 @@ add_library(hkStubs OBJECT Havok/Physics2012/Dynamics/Common/hkpMaterial.h Havok/Physics2012/Dynamics/Common/hkpProperty.h Havok/Physics2012/Dynamics/Constraint/hkpConstraintInstance.h + Havok/Physics2012/Dynamics/Constraint/hkpConstraintOwner.h Havok/Physics2012/Dynamics/Entity/hkpEntity.h Havok/Physics2012/Dynamics/Entity/hkpRigidBody.h Havok/Physics2012/Dynamics/Entity/hkpRigidBodyCinfo.h diff --git a/lib/hkStubs/Havok/Common/Base/Math/hkMath.h b/lib/hkStubs/Havok/Common/Base/Math/hkMath.h index b928b610..18362756 100644 --- a/lib/hkStubs/Havok/Common/Base/Math/hkMath.h +++ b/lib/hkStubs/Havok/Common/Base/Math/hkMath.h @@ -14,3 +14,12 @@ #include #include + +namespace hkMath { + +template +HK_FORCE_INLINE T1 max2(T1 x, T2 y) { + return x > static_cast(y) ? x : static_cast(y); +} + +} // namespace hkMath diff --git a/lib/hkStubs/Havok/Physics/Constraint/Data/hkpConstraintInfo.h b/lib/hkStubs/Havok/Physics/Constraint/Data/hkpConstraintInfo.h index f5febd76..c7edeeba 100644 --- a/lib/hkStubs/Havok/Physics/Constraint/Data/hkpConstraintInfo.h +++ b/lib/hkStubs/Havok/Physics/Constraint/Data/hkpConstraintInfo.h @@ -5,8 +5,32 @@ struct hkpConstraintInfo { HK_DECLARE_CLASS_ALLOCATOR(hkpConstraintInfo) + inline void add(int schemaSize, int numSolverResults, int numSolverTempElems); + inline void add(const hkpConstraintInfo& delta); + inline void sub(const hkpConstraintInfo& delta); + int m_maxSizeOfSchema; int m_sizeOfSchemas; int m_numSolverResults; int m_numSolverElemTemps; }; + +inline void hkpConstraintInfo::add(int schemaSize, int numSolverResults, int numSolverTempElems) { + m_sizeOfSchemas += schemaSize; + m_numSolverResults += numSolverResults; + m_numSolverElemTemps += numSolverTempElems; +} + +inline void hkpConstraintInfo::add(const hkpConstraintInfo& delta) { + m_maxSizeOfSchema = hkMath::max2(m_maxSizeOfSchema, delta.m_maxSizeOfSchema); + m_maxSizeOfSchema = hkMath::max2(m_maxSizeOfSchema, delta.m_sizeOfSchemas); + m_sizeOfSchemas += delta.m_sizeOfSchemas; + m_numSolverResults += delta.m_numSolverResults; + m_numSolverElemTemps += delta.m_numSolverElemTemps; +} + +inline void hkpConstraintInfo::sub(const hkpConstraintInfo& delta) { + m_sizeOfSchemas -= delta.m_sizeOfSchemas; + m_numSolverResults -= delta.m_numSolverResults; + m_numSolverElemTemps -= delta.m_numSolverElemTemps; +} diff --git a/lib/hkStubs/Havok/Physics2012/Dynamics/Constraint/hkpConstraintOwner.h b/lib/hkStubs/Havok/Physics2012/Dynamics/Constraint/hkpConstraintOwner.h new file mode 100644 index 00000000..4ad43e2f --- /dev/null +++ b/lib/hkStubs/Havok/Physics2012/Dynamics/Constraint/hkpConstraintOwner.h @@ -0,0 +1,39 @@ +#pragma once + +#include +#include + +class hkpConstraintOwner : public hkReferencedObject { +public: + HK_DECLARE_CLASS_ALLOCATOR(hkpConstraintOwner) + + inline void addConstraintInfo(hkpConstraintInstance* constraint, hkpConstraintInfo& delta); + inline void subConstraintInfo(hkpConstraintInstance* constraint, hkpConstraintInfo& delta); + + virtual void addConstraintToCriticalLockedIsland(hkpConstraintInstance* constraint) {} + virtual void removeConstraintFromCriticalLockedIsland(hkpConstraintInstance* constraint) {} + virtual void addCallbackRequest(hkpConstraintInstance* constraint, int request) {} + virtual void checkAccessRw() {} + + hkpConstraintInfo m_constraintInfo; +}; + +inline void hkpConstraintOwner::addConstraintInfo(hkpConstraintInstance* constraint, + hkpConstraintInfo& delta) { + if (!constraint->m_internal) + return; + + m_constraintInfo.add(delta); + constraint->m_internal->addConstraintInfo(delta); + m_constraintInfo.m_maxSizeOfSchema = + hkMath::max2(m_constraintInfo.m_maxSizeOfSchema, constraint->m_internal->m_sizeOfSchemas); +} + +inline void hkpConstraintOwner::subConstraintInfo(hkpConstraintInstance* constraint, + hkpConstraintInfo& delta) { + if (!constraint->m_internal) + return; + + m_constraintInfo.sub(delta); + constraint->m_internal->subConstraintInfo(delta); +}