1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-10-15 21:16:33 +00:00

Modernize Bethesda Havok records

This commit is contained in:
Alexei Kotov 2023-09-01 00:00:37 +03:00
parent 087114e55b
commit 8a7e8a89ac
2 changed files with 238 additions and 166 deletions

View file

@ -12,15 +12,15 @@ namespace Nif
void bhkWorldObjCInfoProperty::read(NIFStream* nif) void bhkWorldObjCInfoProperty::read(NIFStream* nif)
{ {
mData = nif->getUInt(); nif->read(mData);
mSize = nif->getUInt(); nif->read(mSize);
mCapacityAndFlags = nif->getUInt(); nif->read(mCapacityAndFlags);
} }
void bhkWorldObjectCInfo::read(NIFStream* nif) void bhkWorldObjectCInfo::read(NIFStream* nif)
{ {
nif->skip(4); // Unused nif->skip(4); // Unused
mPhaseType = static_cast<BroadPhaseType>(nif->getChar()); mPhaseType = static_cast<BroadPhaseType>(nif->get<uint8_t>());
nif->skip(3); // Unused nif->skip(3); // Unused
mProperty.read(nif); mProperty.read(nif);
} }
@ -29,47 +29,47 @@ namespace Nif
{ {
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB_OLD) if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB_OLD)
nif->skip(4); // Unknown nif->skip(4); // Unknown
mMaterial = nif->getUInt(); nif->read(mMaterial);
} }
void HavokFilter::read(NIFStream* nif) void HavokFilter::read(NIFStream* nif)
{ {
mLayer = nif->getChar(); nif->read(mLayer);
mFlags = nif->getChar(); nif->read(mFlags);
mGroup = nif->getUShort(); nif->read(mGroup);
} }
void hkSubPartData::read(NIFStream* nif) void hkSubPartData::read(NIFStream* nif)
{ {
mHavokFilter.read(nif); mHavokFilter.read(nif);
mNumVertices = nif->getUInt(); nif->read(mNumVertices);
mHavokMaterial.read(nif); mHavokMaterial.read(nif);
} }
void hkpMoppCode::read(NIFStream* nif)
{
unsigned int size = nif->getUInt();
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0))
mOffset = nif->getVector4();
if (nif->getBethVersion() > NIFFile::BethVersion::BETHVER_FO3)
nif->getChar(); // MOPP data build type
nif->readVector(mData, size);
}
void bhkEntityCInfo::read(NIFStream* nif) void bhkEntityCInfo::read(NIFStream* nif)
{ {
mResponseType = static_cast<hkResponseType>(nif->getChar()); mResponseType = static_cast<hkResponseType>(nif->get<uint8_t>());
nif->skip(1); // Unused nif->skip(1); // Unused
mProcessContactDelay = nif->getUShort(); nif->read(mProcessContactDelay);
}
void hkpMoppCode::read(NIFStream* nif)
{
uint32_t dataSize;
nif->read(dataSize);
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0))
nif->read(mOffset);
if (nif->getBethVersion() > NIFFile::BethVersion::BETHVER_FO3)
nif->read(mBuildType);
nif->readVector(mData, dataSize);
} }
void TriangleData::read(NIFStream* nif) void TriangleData::read(NIFStream* nif)
{ {
for (int i = 0; i < 3; i++) nif->readArray(mTriangle);
mTriangle[i] = nif->getUShort(); nif->read(mWeldingInfo);
mWeldingInfo = nif->getUShort();
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB) if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
mNormal = nif->getVector3(); nif->read(mNormal);
} }
void bhkMeshMaterial::read(NIFStream* nif) void bhkMeshMaterial::read(NIFStream* nif)
@ -80,28 +80,27 @@ namespace Nif
void bhkQsTransform::read(NIFStream* nif) void bhkQsTransform::read(NIFStream* nif)
{ {
mTranslation = nif->getVector4(); nif->read(mTranslation);
mRotation = nif->getQuaternion(); nif->read(mRotation);
} }
void bhkCMSBigTri::read(NIFStream* nif) void bhkCMSBigTri::read(NIFStream* nif)
{ {
for (int i = 0; i < 3; i++) nif->readArray(mTriangle);
mTriangle[i] = nif->getUShort(); nif->read(mMaterial);
mMaterial = nif->getUInt(); nif->read(mWeldingInfo);
mWeldingInfo = nif->getUShort();
} }
void bhkCMSChunk::read(NIFStream* nif) void bhkCMSChunk::read(NIFStream* nif)
{ {
mTranslation = nif->getVector4(); nif->read(mTranslation);
mMaterialIndex = nif->getUInt(); nif->read(mMaterialIndex);
mReference = nif->getUShort(); nif->read(mReference);
mTransformIndex = nif->getUShort(); nif->read(mTransformIndex);
nif->readVector(mVertices, nif->getUInt()); nif->readVector(mVertices, nif->get<uint32_t>());
nif->readVector(mIndices, nif->getUInt()); nif->readVector(mIndices, nif->get<uint32_t>());
nif->readVector(mStrips, nif->getUInt()); nif->readVector(mStrips, nif->get<uint32_t>());
nif->readVector(mWeldingInfos, nif->getUInt()); nif->readVector(mWeldingInfos, nif->get<uint32_t>());
} }
void bhkRigidBodyCInfo::read(NIFStream* nif) void bhkRigidBodyCInfo::read(NIFStream* nif)
@ -115,64 +114,67 @@ namespace Nif
{ {
if (nif->getBethVersion() >= 83) if (nif->getBethVersion() >= 83)
nif->skip(4); // Unused nif->skip(4); // Unused
mResponseType = static_cast<hkResponseType>(nif->getChar()); mResponseType = static_cast<hkResponseType>(nif->get<uint8_t>());
nif->skip(1); // Unused nif->skip(1); // Unused
mProcessContactDelay = nif->getUShort(); nif->read(mProcessContactDelay);
} }
} }
if (nif->getBethVersion() < 83) if (nif->getBethVersion() < 83)
nif->skip(4); // Unused nif->skip(4); // Unused
mTranslation = nif->getVector4(); nif->read(mTranslation);
mRotation = nif->getQuaternion(); nif->read(mRotation);
mLinearVelocity = nif->getVector4(); nif->read(mLinearVelocity);
mAngularVelocity = nif->getVector4(); nif->read(mAngularVelocity);
// A bit hacky, but this is the only instance where a 3x3 matrix has padding.
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++)
for (int j = 0; j < 4; j++) {
mInertiaTensor[i][j] = nif->getFloat(); nif->read(mInertiaTensor.mValues[i], 3);
mCenter = nif->getVector4(); nif->skip(4); // Padding
mMass = nif->getFloat(); }
mLinearDamping = nif->getFloat(); nif->read(mCenter);
mAngularDamping = nif->getFloat(); nif->read(mMass);
nif->read(mLinearDamping);
nif->read(mAngularDamping);
if (nif->getBethVersion() >= 83) if (nif->getBethVersion() >= 83)
{ {
if (nif->getBethVersion() != NIFFile::BethVersion::BETHVER_FO4) if (nif->getBethVersion() != NIFFile::BethVersion::BETHVER_FO4)
mTimeFactor = nif->getFloat(); nif->read(mTimeFactor);
mGravityFactor = nif->getFloat(); nif->read(mGravityFactor);
} }
mFriction = nif->getFloat(); nif->read(mFriction);
if (nif->getBethVersion() >= 83) if (nif->getBethVersion() >= 83)
mRollingFrictionMult = nif->getFloat(); nif->read(mRollingFrictionMult);
mRestitution = nif->getFloat(); nif->read(mRestitution);
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0)) if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0))
{ {
mMaxLinearVelocity = nif->getFloat(); nif->read(mMaxLinearVelocity);
mMaxAngularVelocity = nif->getFloat(); nif->read(mMaxAngularVelocity);
if (nif->getBethVersion() != NIFFile::BethVersion::BETHVER_FO4) if (nif->getBethVersion() != NIFFile::BethVersion::BETHVER_FO4)
mPenetrationDepth = nif->getFloat(); nif->read(mPenetrationDepth);
} }
mMotionType = static_cast<hkMotionType>(nif->getChar()); mMotionType = static_cast<hkMotionType>(nif->get<uint8_t>());
if (nif->getBethVersion() < 83) if (nif->getBethVersion() < 83)
mDeactivatorType = static_cast<hkDeactivatorType>(nif->getChar()); mDeactivatorType = static_cast<hkDeactivatorType>(nif->get<uint8_t>());
else else
mEnableDeactivation = nif->getBoolean(); nif->read(mEnableDeactivation);
mSolverDeactivation = static_cast<hkSolverDeactivation>(nif->getChar()); mSolverDeactivation = static_cast<hkSolverDeactivation>(nif->get<uint8_t>());
if (nif->getBethVersion() == NIFFile::BethVersion::BETHVER_FO4) if (nif->getBethVersion() == NIFFile::BethVersion::BETHVER_FO4)
{ {
nif->skip(1); nif->skip(1);
mPenetrationDepth = nif->getFloat(); nif->read(mPenetrationDepth);
mTimeFactor = nif->getFloat(); nif->read(mTimeFactor);
nif->skip(4); nif->skip(4);
mResponseType = static_cast<hkResponseType>(nif->getChar()); mResponseType = static_cast<hkResponseType>(nif->get<uint8_t>());
nif->skip(1); // Unused nif->skip(1); // Unused
mProcessContactDelay = nif->getUShort(); nif->read(mProcessContactDelay);
} }
mQualityType = static_cast<hkQualityType>(nif->getChar()); mQualityType = static_cast<hkQualityType>(nif->get<uint8_t>());
if (nif->getBethVersion() >= 83) if (nif->getBethVersion() >= 83)
{ {
mAutoRemoveLevel = nif->getChar(); nif->read(mAutoRemoveLevel);
mResponseModifierFlags = nif->getChar(); nif->read(mResponseModifierFlags);
mNumContactPointShapeKeys = nif->getChar(); nif->read(mNumContactPointShapeKeys);
mForceCollidedOntoPPU = nif->getBoolean(); nif->read(mForceCollidedOntoPPU);
} }
if (nif->getBethVersion() == NIFFile::BethVersion::BETHVER_FO4) if (nif->getBethVersion() == NIFFile::BethVersion::BETHVER_FO4)
nif->skip(3); // Unused nif->skip(3); // Unused
@ -182,7 +184,7 @@ namespace Nif
void bhkConstraintCInfo::read(NIFStream* nif) void bhkConstraintCInfo::read(NIFStream* nif)
{ {
nif->get<unsigned int>(); // Number of entities, unused nif->get<uint32_t>(); // Number of entities, unused
mEntityA.read(nif); mEntityA.read(nif);
mEntityB.read(nif); mEntityB.read(nif);
@ -203,7 +205,7 @@ namespace Nif
nif->read(mDamping); nif->read(mDamping);
nif->read(mProportionalRecoveryVelocity); nif->read(mProportionalRecoveryVelocity);
nif->read(mConstantRecoveryVelocity); nif->read(mConstantRecoveryVelocity);
mEnabled = nif->getBoolean(); nif->read(mEnabled);
} }
void bhkVelocityConstraintMotor::read(NIFStream* nif) void bhkVelocityConstraintMotor::read(NIFStream* nif)
@ -212,8 +214,8 @@ namespace Nif
nif->read(mMaxForce); nif->read(mMaxForce);
nif->read(mTau); nif->read(mTau);
nif->read(mTargetVelocity); nif->read(mTargetVelocity);
mUseVelocityTarget = nif->getBoolean(); nif->read(mUseVelocityTarget);
mEnabled = nif->getBoolean(); nif->read(mEnabled);
} }
void bhkSpringDamperConstraintMotor::read(NIFStream* nif) void bhkSpringDamperConstraintMotor::read(NIFStream* nif)
@ -222,7 +224,7 @@ namespace Nif
nif->read(mMaxForce); nif->read(mMaxForce);
nif->read(mSpringConstant); nif->read(mSpringConstant);
nif->read(mSpringDamping); nif->read(mSpringDamping);
mEnabled = nif->getBoolean(); nif->read(mEnabled);
} }
void bhkConstraintMotorCInfo::read(NIFStream* nif) void bhkConstraintMotorCInfo::read(NIFStream* nif)
@ -335,7 +337,8 @@ namespace Nif
void bhkCollisionObject::read(NIFStream* nif) void bhkCollisionObject::read(NIFStream* nif)
{ {
NiCollisionObject::read(nif); NiCollisionObject::read(nif);
mFlags = nif->getUShort();
nif->read(mFlags);
mBody.read(nif); mBody.read(nif);
} }
@ -356,6 +359,7 @@ namespace Nif
void bhkEntity::read(NIFStream* nif) void bhkEntity::read(NIFStream* nif)
{ {
bhkWorldObject::read(nif); bhkWorldObject::read(nif);
mInfo.read(nif); mInfo.read(nif);
} }
@ -372,21 +376,26 @@ namespace Nif
void bhkMoppBvTreeShape::read(NIFStream* nif) void bhkMoppBvTreeShape::read(NIFStream* nif)
{ {
bhkBvTreeShape::read(nif); bhkBvTreeShape::read(nif);
nif->skip(12); // Unused nif->skip(12); // Unused
mScale = nif->getFloat(); nif->read(mScale);
mMopp.read(nif); mMopp.read(nif);
} }
void bhkNiTriStripsShape::read(NIFStream* nif) void bhkNiTriStripsShape::read(NIFStream* nif)
{ {
mHavokMaterial.read(nif); mHavokMaterial.read(nif);
mRadius = nif->getFloat(); nif->read(mRadius);
nif->skip(20); // Unused nif->skip(20); // Unused
mGrowBy = nif->getUInt(); nif->read(mGrowBy);
if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0)) if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0))
mScale = nif->getVector4(); nif->read(mScale);
readRecordList(nif, mData); readRecordList(nif, mData);
nif->readVector(mFilters, nif->getUInt()); uint32_t numFilters;
nif->read(numFilters);
mHavokFilters.resize(numFilters);
for (HavokFilter& filter : mHavokFilters)
filter.read(nif);
} }
void bhkNiTriStripsShape::post(Reader& nif) void bhkNiTriStripsShape::post(Reader& nif)
@ -398,15 +407,17 @@ namespace Nif
{ {
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB) if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
{ {
mSubshapes.resize(nif->getUShort()); uint16_t numSubshapes;
nif->read(numSubshapes);
mSubshapes.resize(numSubshapes);
for (hkSubPartData& subshape : mSubshapes) for (hkSubPartData& subshape : mSubshapes)
subshape.read(nif); subshape.read(nif);
} }
mUserData = nif->getUInt(); nif->read(mUserData);
nif->skip(4); // Unused nif->skip(4); // Unused
mRadius = nif->getFloat(); nif->read(mRadius);
nif->skip(4); // Unused nif->skip(4); // Unused
mScale = nif->getVector4(); nif->read(mScale);
nif->skip(20); // Duplicates of the two previous fields nif->skip(20); // Duplicates of the two previous fields
mData.read(nif); mData.read(nif);
} }
@ -418,22 +429,26 @@ namespace Nif
void hkPackedNiTriStripsData::read(NIFStream* nif) void hkPackedNiTriStripsData::read(NIFStream* nif)
{ {
unsigned int numTriangles = nif->getUInt(); uint32_t numTriangles;
nif->read(numTriangles);
mTriangles.resize(numTriangles); mTriangles.resize(numTriangles);
for (unsigned int i = 0; i < numTriangles; i++) for (uint32_t i = 0; i < numTriangles; i++)
mTriangles[i].read(nif); mTriangles[i].read(nif);
unsigned int numVertices = nif->getUInt(); uint32_t numVertices;
nif->read(numVertices);
bool compressed = false; bool compressed = false;
if (nif->getVersion() >= NIFFile::NIFVersion::VER_BGS) if (nif->getVersion() >= NIFFile::NIFVersion::VER_BGS)
compressed = nif->getBoolean(); nif->read(compressed);
if (!compressed) if (!compressed)
nif->readVector(mVertices, numVertices); nif->readVector(mVertices, numVertices);
else else
nif->skip(6 * numVertices); // Half-precision vectors are not currently supported nif->skip(6 * numVertices); // Half-precision vectors are not currently supported
if (nif->getVersion() >= NIFFile::NIFVersion::VER_BGS) if (nif->getVersion() >= NIFFile::NIFVersion::VER_BGS)
{ {
mSubshapes.resize(nif->getUShort()); uint16_t numSubshapes;
nif->read(numSubshapes);
mSubshapes.resize(numSubshapes);
for (hkSubPartData& subshape : mSubshapes) for (hkSubPartData& subshape : mSubshapes)
subshape.read(nif); subshape.read(nif);
} }
@ -447,23 +462,25 @@ namespace Nif
void bhkConvexShape::read(NIFStream* nif) void bhkConvexShape::read(NIFStream* nif)
{ {
bhkSphereRepShape::read(nif); bhkSphereRepShape::read(nif);
mRadius = nif->getFloat();
nif->read(mRadius);
} }
void bhkConvexVerticesShape::read(NIFStream* nif) void bhkConvexVerticesShape::read(NIFStream* nif)
{ {
bhkConvexShape::read(nif); bhkConvexShape::read(nif);
mVerticesProperty.read(nif); mVerticesProperty.read(nif);
mNormalsProperty.read(nif); mNormalsProperty.read(nif);
nif->readVector(mVertices, nif->getUInt()); nif->readVector(mVertices, nif->get<uint32_t>());
nif->readVector(mNormals, nif->getUInt()); nif->readVector(mNormals, nif->get<uint32_t>());
} }
void bhkConvexTransformShape::read(NIFStream* nif) void bhkConvexTransformShape::read(NIFStream* nif)
{ {
mShape.read(nif); mShape.read(nif);
mHavokMaterial.read(nif); mHavokMaterial.read(nif);
mRadius = nif->getFloat(); nif->read(mRadius);
nif->skip(8); // Unused nif->skip(8); // Unused
std::array<float, 16> mat; std::array<float, 16> mat;
nif->readArray(mat); nif->readArray(mat);
@ -478,19 +495,21 @@ namespace Nif
void bhkBoxShape::read(NIFStream* nif) void bhkBoxShape::read(NIFStream* nif)
{ {
bhkConvexShape::read(nif); bhkConvexShape::read(nif);
nif->skip(8); // Unused nif->skip(8); // Unused
mExtents = nif->getVector3(); nif->read(mExtents);
nif->skip(4); // Unused nif->skip(4); // Unused
} }
void bhkCapsuleShape::read(NIFStream* nif) void bhkCapsuleShape::read(NIFStream* nif)
{ {
bhkConvexShape::read(nif); bhkConvexShape::read(nif);
nif->skip(8); // Unused nif->skip(8); // Unused
mPoint1 = nif->getVector3(); nif->read(mPoint1);
mRadius1 = nif->getFloat(); nif->read(mRadius1);
mPoint2 = nif->getVector3(); nif->read(mPoint2);
mRadius2 = nif->getFloat(); nif->read(mRadius2);
} }
void bhkListShape::read(NIFStream* nif) void bhkListShape::read(NIFStream* nif)
@ -499,7 +518,8 @@ namespace Nif
mHavokMaterial.read(nif); mHavokMaterial.read(nif);
mChildShapeProperty.read(nif); mChildShapeProperty.read(nif);
mChildFilterProperty.read(nif); mChildFilterProperty.read(nif);
unsigned int numFilters = nif->getUInt(); uint32_t numFilters;
nif->read(numFilters);
mHavokFilters.resize(numFilters); mHavokFilters.resize(numFilters);
for (HavokFilter& filter : mHavokFilters) for (HavokFilter& filter : mHavokFilters)
filter.read(nif); filter.read(nif);
@ -508,12 +528,12 @@ namespace Nif
void bhkCompressedMeshShape::read(NIFStream* nif) void bhkCompressedMeshShape::read(NIFStream* nif)
{ {
mTarget.read(nif); mTarget.read(nif);
mUserData = nif->getUInt(); nif->read(mUserData);
mRadius = nif->getFloat(); nif->read(mRadius);
nif->getFloat(); // Unknown nif->skip(4); // Unknown
mScale = nif->getVector4(); nif->read(mScale);
nif->getFloat(); // Radius nif->skip(4); // Radius
nif->getVector4(); // Scale nif->skip(16); // Scale
mData.read(nif); mData.read(nif);
} }
@ -525,60 +545,66 @@ namespace Nif
void bhkCompressedMeshShapeData::read(NIFStream* nif) void bhkCompressedMeshShapeData::read(NIFStream* nif)
{ {
mBitsPerIndex = nif->getUInt(); nif->read(mBitsPerIndex);
mBitsPerWIndex = nif->getUInt(); nif->read(mBitsPerWIndex);
mMaskWIndex = nif->getUInt(); nif->read(mMaskWIndex);
mMaskIndex = nif->getUInt(); nif->read(mMaskIndex);
mError = nif->getFloat(); nif->read(mError);
mAabbMin = nif->getVector4(); nif->read(mAabbMin);
mAabbMax = nif->getVector4(); nif->read(mAabbMax);
mWeldingType = nif->getChar(); nif->read(mWeldingType);
mMaterialType = nif->getChar(); nif->read(mMaterialType);
nif->skip(nif->getUInt() * 4); // Unused nif->skip(nif->get<uint32_t>() * 4); // Unused
nif->skip(nif->getUInt() * 4); // Unused nif->skip(nif->get<uint32_t>() * 4); // Unused
nif->skip(nif->getUInt() * 4); // Unused nif->skip(nif->get<uint32_t>() * 4); // Unused
size_t numMaterials = nif->getUInt(); uint32_t numMaterials;
nif->read(numMaterials);
mMaterials.resize(numMaterials); mMaterials.resize(numMaterials);
for (bhkMeshMaterial& material : mMaterials) for (bhkMeshMaterial& material : mMaterials)
material.read(nif); material.read(nif);
nif->getUInt(); // Unused nif->skip(4); // Unused
size_t numTransforms = nif->getUInt();
uint32_t numTransforms;
nif->read(numTransforms);
mChunkTransforms.resize(numTransforms); mChunkTransforms.resize(numTransforms);
for (bhkQsTransform& transform : mChunkTransforms) for (bhkQsTransform& transform : mChunkTransforms)
transform.read(nif); transform.read(nif);
nif->readVector(mBigVerts, nif->getUInt()); nif->readVector(mBigVerts, nif->get<uint32_t>());
size_t numBigTriangles = nif->getUInt(); uint32_t numBigTriangles;
nif->read(numBigTriangles);
mBigTris.resize(numBigTriangles); mBigTris.resize(numBigTriangles);
for (bhkCMSBigTri& tri : mBigTris) for (bhkCMSBigTri& tri : mBigTris)
tri.read(nif); tri.read(nif);
size_t numChunks = nif->getUInt(); uint32_t numChunks;
nif->read(numChunks);
mChunks.resize(numChunks); mChunks.resize(numChunks);
for (bhkCMSChunk& chunk : mChunks) for (bhkCMSChunk& chunk : mChunks)
chunk.read(nif); chunk.read(nif);
nif->getUInt(); // Unused nif->skip(4); // Unused
} }
void bhkRigidBody::read(NIFStream* nif) void bhkRigidBody::read(NIFStream* nif)
{ {
bhkEntity::read(nif); bhkEntity::read(nif);
mInfo.read(nif); mInfo.read(nif);
readRecordList(nif, mConstraints); readRecordList(nif, mConstraints);
if (nif->getBethVersion() < 76) if (nif->getBethVersion() < 76)
mBodyFlags = nif->getUInt(); nif->read(mBodyFlags);
else else
mBodyFlags = nif->getUShort(); mBodyFlags = nif->get<uint16_t>();
} }
void bhkSimpleShapePhantom::read(NIFStream* nif) void bhkSimpleShapePhantom::read(NIFStream* nif)
{ {
bhkWorldObject::read(nif); bhkWorldObject::read(nif);
nif->skip(8); // Unused nif->skip(8); // Unused
std::array<float, 16> mat; std::array<float, 16> mat;
nif->readArray(mat); nif->readArray(mat);
@ -598,18 +624,21 @@ namespace Nif
void bhkRagdollConstraint::read(NIFStream* nif) void bhkRagdollConstraint::read(NIFStream* nif)
{ {
bhkConstraint::read(nif); bhkConstraint::read(nif);
mConstraint.read(nif); mConstraint.read(nif);
} }
void bhkHingeConstraint::read(NIFStream* nif) void bhkHingeConstraint::read(NIFStream* nif)
{ {
bhkConstraint::read(nif); bhkConstraint::read(nif);
mConstraint.read(nif); mConstraint.read(nif);
} }
void bhkLimitedHingeConstraint::read(NIFStream* nif) void bhkLimitedHingeConstraint::read(NIFStream* nif)
{ {
bhkConstraint::read(nif); bhkConstraint::read(nif);
mConstraint.read(nif); mConstraint.read(nif);
} }

View file

@ -1,6 +1,7 @@
#ifndef OPENMW_COMPONENTS_NIF_PHYSICS_HPP #ifndef OPENMW_COMPONENTS_NIF_PHYSICS_HPP
#define OPENMW_COMPONENTS_NIF_PHYSICS_HPP #define OPENMW_COMPONENTS_NIF_PHYSICS_HPP
#include "niftypes.hpp"
#include "record.hpp" #include "record.hpp"
#include "recordptr.hpp" #include "recordptr.hpp"
@ -23,9 +24,10 @@ namespace Nif
struct bhkWorldObjCInfoProperty struct bhkWorldObjCInfoProperty
{ {
unsigned int mData; uint32_t mData;
unsigned int mSize; uint32_t mSize;
unsigned int mCapacityAndFlags; uint32_t mCapacityAndFlags;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -41,28 +43,32 @@ namespace Nif
{ {
BroadPhaseType mPhaseType; BroadPhaseType mPhaseType;
bhkWorldObjCInfoProperty mProperty; bhkWorldObjCInfoProperty mProperty;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
struct HavokMaterial struct HavokMaterial
{ {
unsigned int mMaterial; uint32_t mMaterial;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
struct HavokFilter struct HavokFilter
{ {
unsigned char mLayer; uint8_t mLayer;
unsigned char mFlags; uint8_t mFlags;
unsigned short mGroup; uint16_t mGroup;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
struct hkSubPartData struct hkSubPartData
{ {
HavokMaterial mHavokMaterial; HavokMaterial mHavokMaterial;
unsigned int mNumVertices; uint32_t mNumVertices;
HavokFilter mHavokFilter; HavokFilter mHavokFilter;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -77,22 +83,26 @@ namespace Nif
struct bhkEntityCInfo struct bhkEntityCInfo
{ {
hkResponseType mResponseType; hkResponseType mResponseType;
unsigned short mProcessContactDelay; uint16_t mProcessContactDelay;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
struct hkpMoppCode struct hkpMoppCode
{ {
osg::Vec4f mOffset; osg::Vec4f mOffset;
std::vector<char> mData; uint8_t mBuildType;
std::vector<uint8_t> mData;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
struct TriangleData struct TriangleData
{ {
unsigned short mTriangle[3]; std::array<uint16_t, 3> mTriangle;
unsigned short mWeldingInfo; uint16_t mWeldingInfo;
osg::Vec3f mNormal; osg::Vec3f mNormal;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -100,6 +110,7 @@ namespace Nif
{ {
HavokMaterial mHavokMaterial; HavokMaterial mHavokMaterial;
HavokFilter mHavokFilter; HavokFilter mHavokFilter;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -107,27 +118,30 @@ namespace Nif
{ {
osg::Vec4f mTranslation; osg::Vec4f mTranslation;
osg::Quat mRotation; osg::Quat mRotation;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
struct bhkCMSBigTri struct bhkCMSBigTri
{ {
unsigned short mTriangle[3]; std::array<uint16_t, 3> mTriangle;
unsigned int mMaterial; uint32_t mMaterial;
unsigned short mWeldingInfo; uint16_t mWeldingInfo;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
struct bhkCMSChunk struct bhkCMSChunk
{ {
osg::Vec4f mTranslation; osg::Vec4f mTranslation;
unsigned int mMaterialIndex; uint32_t mMaterialIndex;
unsigned short mReference; uint16_t mReference;
unsigned short mTransformIndex; uint16_t mTransformIndex;
std::vector<unsigned short> mVertices; std::vector<uint16_t> mVertices;
std::vector<unsigned short> mIndices; std::vector<uint16_t> mIndices;
std::vector<unsigned short> mStrips; std::vector<uint16_t> mStrips;
std::vector<unsigned short> mWeldingInfos; std::vector<uint16_t> mWeldingInfos;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -180,12 +194,12 @@ namespace Nif
{ {
HavokFilter mHavokFilter; HavokFilter mHavokFilter;
hkResponseType mResponseType; hkResponseType mResponseType;
unsigned short mProcessContactDelay; uint16_t mProcessContactDelay;
osg::Vec4f mTranslation; osg::Vec4f mTranslation;
osg::Quat mRotation; osg::Quat mRotation;
osg::Vec4f mLinearVelocity; osg::Vec4f mLinearVelocity;
osg::Vec4f mAngularVelocity; osg::Vec4f mAngularVelocity;
float mInertiaTensor[3][4]; Matrix3 mInertiaTensor;
osg::Vec4f mCenter; osg::Vec4f mCenter;
float mMass; float mMass;
float mLinearDamping; float mLinearDamping;
@ -203,10 +217,11 @@ namespace Nif
bool mEnableDeactivation{ true }; bool mEnableDeactivation{ true };
hkSolverDeactivation mSolverDeactivation; hkSolverDeactivation mSolverDeactivation;
hkQualityType mQualityType; hkQualityType mQualityType;
unsigned char mAutoRemoveLevel; uint8_t mAutoRemoveLevel;
unsigned char mResponseModifierFlags; uint8_t mResponseModifierFlags;
unsigned char mNumContactPointShapeKeys; uint8_t mNumContactPointShapeKeys;
bool mForceCollidedOntoPPU; bool mForceCollidedOntoPPU;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -222,6 +237,7 @@ namespace Nif
bhkEntityPtr mEntityA; bhkEntityPtr mEntityA;
bhkEntityPtr mEntityB; bhkEntityPtr mEntityB;
ConstraintPriority mPriority; ConstraintPriority mPriority;
void read(NIFStream* nif); void read(NIFStream* nif);
void post(Reader& nif); void post(Reader& nif);
}; };
@ -242,6 +258,7 @@ namespace Nif
float mProportionalRecoveryVelocity; float mProportionalRecoveryVelocity;
float mConstantRecoveryVelocity; float mConstantRecoveryVelocity;
bool mEnabled; bool mEnabled;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -252,6 +269,7 @@ namespace Nif
float mTargetVelocity; float mTargetVelocity;
bool mUseVelocityTarget; bool mUseVelocityTarget;
bool mEnabled; bool mEnabled;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -261,6 +279,7 @@ namespace Nif
float mSpringConstant; float mSpringConstant;
float mSpringDamping; float mSpringDamping;
bool mEnabled; bool mEnabled;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -270,6 +289,7 @@ namespace Nif
bhkPositionConstraintMotor mPositionMotor; bhkPositionConstraintMotor mPositionMotor;
bhkVelocityConstraintMotor mVelocityMotor; bhkVelocityConstraintMotor mVelocityMotor;
bhkSpringDamperConstraintMotor mSpringDamperMotor; bhkSpringDamperConstraintMotor mSpringDamperMotor;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -289,6 +309,7 @@ namespace Nif
float mTwistMinAngle, mTwistMaxAngle; float mTwistMinAngle, mTwistMaxAngle;
float mMaxFriction; float mMaxFriction;
bhkConstraintMotorCInfo mMotor; bhkConstraintMotorCInfo mMotor;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -301,8 +322,10 @@ namespace Nif
osg::Vec4f mPerpAxis1; osg::Vec4f mPerpAxis1;
osg::Vec4f mPerpAxis2; osg::Vec4f mPerpAxis2;
}; };
HingeData mDataA; HingeData mDataA;
HingeData mDataB; HingeData mDataB;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -315,11 +338,13 @@ namespace Nif
osg::Vec4f mPerpAxis1; osg::Vec4f mPerpAxis1;
osg::Vec4f mPerpAxis2; osg::Vec4f mPerpAxis2;
}; };
HingeData mDataA; HingeData mDataA;
HingeData mDataB; HingeData mDataB;
float mMinAngle, mMaxAngle; float mMinAngle, mMaxAngle;
float mMaxFriction; float mMaxFriction;
bhkConstraintMotorCInfo mMotor; bhkConstraintMotorCInfo mMotor;
void read(NIFStream* nif); void read(NIFStream* nif);
}; };
@ -358,7 +383,7 @@ namespace Nif
// Bethesda Havok-specific collision object // Bethesda Havok-specific collision object
struct bhkCollisionObject : public NiCollisionObject struct bhkCollisionObject : public NiCollisionObject
{ {
unsigned short mFlags; uint16_t mFlags;
bhkWorldObjectPtr mBody; bhkWorldObjectPtr mBody;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
@ -375,6 +400,7 @@ namespace Nif
bhkShapePtr mShape; bhkShapePtr mShape;
HavokFilter mHavokFilter; HavokFilter mHavokFilter;
bhkWorldObjectCInfo mWorldObjectInfo; bhkWorldObjectCInfo mWorldObjectInfo;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
void post(Reader& nif) override; void post(Reader& nif) override;
}; };
@ -383,6 +409,7 @@ namespace Nif
struct bhkEntity : public bhkWorldObject struct bhkEntity : public bhkWorldObject
{ {
bhkEntityCInfo mInfo; bhkEntityCInfo mInfo;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
@ -391,6 +418,7 @@ namespace Nif
struct bhkBvTreeShape : public bhkShape struct bhkBvTreeShape : public bhkShape
{ {
bhkShapePtr mShape; bhkShapePtr mShape;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
void post(Reader& nif) override; void post(Reader& nif) override;
}; };
@ -400,6 +428,7 @@ namespace Nif
{ {
float mScale; float mScale;
hkpMoppCode mMopp; hkpMoppCode mMopp;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
@ -408,10 +437,11 @@ namespace Nif
{ {
HavokMaterial mHavokMaterial; HavokMaterial mHavokMaterial;
float mRadius; float mRadius;
unsigned int mGrowBy; uint32_t mGrowBy;
osg::Vec4f mScale{ 1.f, 1.f, 1.f, 0.f }; osg::Vec4f mScale{ 1.f, 1.f, 1.f, 0.f };
NiTriStripsDataList mData; NiTriStripsDataList mData;
std::vector<unsigned int> mFilters; std::vector<HavokFilter> mHavokFilters;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
void post(Reader& nif) override; void post(Reader& nif) override;
}; };
@ -420,7 +450,7 @@ namespace Nif
struct bhkPackedNiTriStripsShape : public bhkShapeCollection struct bhkPackedNiTriStripsShape : public bhkShapeCollection
{ {
std::vector<hkSubPartData> mSubshapes; std::vector<hkSubPartData> mSubshapes;
unsigned int mUserData; uint32_t mUserData;
float mRadius; float mRadius;
osg::Vec4f mScale; osg::Vec4f mScale;
hkPackedNiTriStripsDataPtr mData; hkPackedNiTriStripsDataPtr mData;
@ -435,6 +465,7 @@ namespace Nif
std::vector<TriangleData> mTriangles; std::vector<TriangleData> mTriangles;
std::vector<osg::Vec3f> mVertices; std::vector<osg::Vec3f> mVertices;
std::vector<hkSubPartData> mSubshapes; std::vector<hkSubPartData> mSubshapes;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
@ -442,6 +473,7 @@ namespace Nif
struct bhkSphereRepShape : public bhkShape struct bhkSphereRepShape : public bhkShape
{ {
HavokMaterial mHavokMaterial; HavokMaterial mHavokMaterial;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
@ -449,6 +481,7 @@ namespace Nif
struct bhkConvexShape : public bhkSphereRepShape struct bhkConvexShape : public bhkSphereRepShape
{ {
float mRadius; float mRadius;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
@ -459,6 +492,7 @@ namespace Nif
bhkWorldObjCInfoProperty mNormalsProperty; bhkWorldObjCInfoProperty mNormalsProperty;
std::vector<osg::Vec4f> mVertices; std::vector<osg::Vec4f> mVertices;
std::vector<osg::Vec4f> mNormals; std::vector<osg::Vec4f> mNormals;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
@ -468,6 +502,7 @@ namespace Nif
HavokMaterial mHavokMaterial; HavokMaterial mHavokMaterial;
float mRadius; float mRadius;
osg::Matrixf mTransform; osg::Matrixf mTransform;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
void post(Reader& nif) override; void post(Reader& nif) override;
}; };
@ -476,6 +511,7 @@ namespace Nif
struct bhkBoxShape : public bhkConvexShape struct bhkBoxShape : public bhkConvexShape
{ {
osg::Vec3f mExtents; osg::Vec3f mExtents;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
@ -499,28 +535,30 @@ namespace Nif
bhkWorldObjCInfoProperty mChildShapeProperty; bhkWorldObjCInfoProperty mChildShapeProperty;
bhkWorldObjCInfoProperty mChildFilterProperty; bhkWorldObjCInfoProperty mChildFilterProperty;
std::vector<HavokFilter> mHavokFilters; std::vector<HavokFilter> mHavokFilters;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
struct bhkCompressedMeshShape : public bhkShape struct bhkCompressedMeshShape : public bhkShape
{ {
NodePtr mTarget; NodePtr mTarget;
unsigned int mUserData; uint32_t mUserData;
float mRadius; float mRadius;
osg::Vec4f mScale; osg::Vec4f mScale;
bhkCompressedMeshShapeDataPtr mData; bhkCompressedMeshShapeDataPtr mData;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
void post(Reader& nif) override; void post(Reader& nif) override;
}; };
struct bhkCompressedMeshShapeData : public bhkRefObject struct bhkCompressedMeshShapeData : public bhkRefObject
{ {
unsigned int mBitsPerIndex, mBitsPerWIndex; uint32_t mBitsPerIndex, mBitsPerWIndex;
unsigned int mMaskWIndex, mMaskIndex; uint32_t mMaskWIndex, mMaskIndex;
float mError; float mError;
osg::Vec4f mAabbMin, mAabbMax; osg::Vec4f mAabbMin, mAabbMax;
char mWeldingType; uint8_t mWeldingType;
char mMaterialType; uint8_t mMaterialType;
std::vector<bhkMeshMaterial> mMaterials; std::vector<bhkMeshMaterial> mMaterials;
std::vector<bhkQsTransform> mChunkTransforms; std::vector<bhkQsTransform> mChunkTransforms;
std::vector<osg::Vec4f> mBigVerts; std::vector<osg::Vec4f> mBigVerts;
@ -534,7 +572,7 @@ namespace Nif
{ {
bhkRigidBodyCInfo mInfo; bhkRigidBodyCInfo mInfo;
bhkSerializableList mConstraints; bhkSerializableList mConstraints;
unsigned int mBodyFlags; uint32_t mBodyFlags;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
@ -542,6 +580,7 @@ namespace Nif
struct bhkSimpleShapePhantom : public bhkWorldObject struct bhkSimpleShapePhantom : public bhkWorldObject
{ {
osg::Matrixf mTransform; osg::Matrixf mTransform;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
@ -549,6 +588,7 @@ namespace Nif
struct bhkConstraint : public bhkSerializable struct bhkConstraint : public bhkSerializable
{ {
bhkConstraintCInfo mInfo; bhkConstraintCInfo mInfo;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
void post(Reader& nif) override; void post(Reader& nif) override;
}; };
@ -556,18 +596,21 @@ namespace Nif
struct bhkRagdollConstraint : public bhkConstraint struct bhkRagdollConstraint : public bhkConstraint
{ {
bhkRagdollConstraintCInfo mConstraint; bhkRagdollConstraintCInfo mConstraint;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
struct bhkHingeConstraint : public bhkConstraint struct bhkHingeConstraint : public bhkConstraint
{ {
bhkHingeConstraintCInfo mConstraint; bhkHingeConstraintCInfo mConstraint;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };
struct bhkLimitedHingeConstraint : public bhkConstraint struct bhkLimitedHingeConstraint : public bhkConstraint
{ {
bhkLimitedHingeConstraintCInfo mConstraint; bhkLimitedHingeConstraintCInfo mConstraint;
void read(NIFStream* nif) override; void read(NIFStream* nif) override;
}; };