#include "physics.hpp" #include "node.hpp" namespace Nif { /// Non-record data types void bhkWorldObjCInfoProperty::read(NIFStream *nif) { mData = nif->getUInt(); mSize = nif->getUInt(); mCapacityAndFlags = nif->getUInt(); } void bhkWorldObjectCInfo::read(NIFStream *nif) { nif->skip(4); // Unused mPhaseType = static_cast(nif->getChar()); nif->skip(3); // Unused mProperty.read(nif); } void HavokMaterial::read(NIFStream *nif) { if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB_OLD) nif->skip(4); // Unknown mMaterial = nif->getUInt(); } void HavokFilter::read(NIFStream *nif) { mLayer = nif->getChar(); mFlags = nif->getChar(); mGroup = nif->getUShort(); } void hkSubPartData::read(NIFStream *nif) { mHavokFilter.read(nif); mNumVertices = nif->getUInt(); 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 if (size) nif->getChars(mData, size); } void bhkEntityCInfo::read(NIFStream *nif) { mResponseType = static_cast(nif->getChar()); nif->skip(1); // Unused mProcessContactDelay = nif->getUShort(); } void TriangleData::read(NIFStream *nif) { for (int i = 0; i < 3; i++) mTriangle[i] = nif->getUShort(); mWeldingInfo = nif->getUShort(); if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB) mNormal = nif->getVector3(); } /// Record types void bhkCollisionObject::read(NIFStream *nif) { NiCollisionObject::read(nif); mFlags = nif->getUShort(); mBody.read(nif); } void bhkWorldObject::read(NIFStream *nif) { mShape.read(nif); if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB_OLD) nif->skip(4); // Unknown mHavokFilter.read(nif); mWorldObjectInfo.read(nif); } void bhkWorldObject::post(NIFFile *nif) { mShape.post(nif); } void bhkEntity::read(NIFStream *nif) { bhkWorldObject::read(nif); mInfo.read(nif); } void bhkBvTreeShape::read(NIFStream *nif) { mShape.read(nif); } void bhkBvTreeShape::post(NIFFile *nif) { mShape.post(nif); } void bhkMoppBvTreeShape::read(NIFStream *nif) { bhkBvTreeShape::read(nif); nif->skip(12); // Unused mScale = nif->getFloat(); mMopp.read(nif); } void bhkNiTriStripsShape::read(NIFStream *nif) { mHavokMaterial.read(nif); mRadius = nif->getFloat(); nif->skip(20); // Unused mGrowBy = nif->getUInt(); if (nif->getVersion() >= NIFStream::generateVersion(10,1,0,0)) mScale = nif->getVector4(); mData.read(nif); unsigned int numFilters = nif->getUInt(); nif->getUInts(mFilters, numFilters); } void bhkNiTriStripsShape::post(NIFFile *nif) { mData.post(nif); } void bhkPackedNiTriStripsShape::read(NIFStream *nif) { if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB) { mSubshapes.resize(nif->getUShort()); for (hkSubPartData& subshape : mSubshapes) subshape.read(nif); } mUserData = nif->getUInt(); nif->skip(4); // Unused mRadius = nif->getFloat(); nif->skip(4); // Unused mScale = nif->getVector4(); nif->skip(20); // Duplicates of the two previous fields mData.read(nif); } void bhkPackedNiTriStripsShape::post(NIFFile *nif) { mData.post(nif); } void hkPackedNiTriStripsData::read(NIFStream *nif) { unsigned int numTriangles = nif->getUInt(); mTriangles.resize(numTriangles); for (unsigned int i = 0; i < numTriangles; i++) mTriangles[i].read(nif); unsigned int numVertices = nif->getUInt(); bool compressed = false; if (nif->getVersion() >= NIFFile::NIFVersion::VER_BGS) compressed = nif->getBoolean(); if (!compressed) nif->getVector3s(mVertices, numVertices); else nif->skip(6 * numVertices); // Half-precision vectors are not currently supported if (nif->getVersion() >= NIFFile::NIFVersion::VER_BGS) { mSubshapes.resize(nif->getUShort()); for (hkSubPartData& subshape : mSubshapes) subshape.read(nif); } } } // Namespace