1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2024-12-28 18:18:52 +00:00
OpenMW/components/nif/extra.hpp
2023-11-08 13:38:14 +03:00

258 lines
5.8 KiB
C++

#ifndef OPENMW_COMPONENTS_NIF_EXTRA_HPP
#define OPENMW_COMPONENTS_NIF_EXTRA_HPP
#include "base.hpp"
#include "node.hpp"
namespace Nif
{
template <typename T>
struct TypedExtra : public Extra
{
T mData;
void read(NIFStream* nif) override
{
Extra::read(nif);
nif->read(mData);
}
};
template <typename T>
struct TypedVectorExtra : public Extra
{
std::vector<T> mData;
void read(NIFStream* nif) override
{
Extra::read(nif);
nif->readVector(mData, nif->get<uint32_t>());
}
};
using NiBooleanExtraData = TypedExtra<bool>;
using NiFloatExtraData = TypedExtra<float>;
using NiIntegerExtraData = TypedExtra<uint32_t>;
using NiStringExtraData = TypedExtra<std::string>;
using NiVectorExtraData = TypedExtra<osg::Vec4f>;
using BSDistantObjectExtraData = TypedExtra<uint32_t>;
using BSDistantObjectLargeRefExtraData = TypedExtra<bool>;
using NiBinaryExtraData = TypedVectorExtra<uint8_t>;
using NiFloatsExtraData = TypedVectorExtra<float>;
using NiIntegersExtraData = TypedVectorExtra<uint32_t>;
using BSEyeCenterExtraData = TypedVectorExtra<float>;
using BSPositionData = TypedVectorExtra<Misc::float16_t>;
using BSWArray = TypedVectorExtra<int32_t>;
// Distinct from NiBinaryExtraData, uses mRecordSize as its size
struct NiExtraData : public Extra
{
std::vector<uint8_t> mData;
void read(NIFStream* nif) override;
};
// != TypedVectorExtra<std::string>, doesn't use the string table
struct NiStringsExtraData : public Extra
{
std::vector<std::string> mData;
void read(NIFStream* nif) override;
};
struct NiVertWeightsExtraData : public Extra
{
void read(NIFStream* nif) override;
};
struct NiTextKeyExtraData : public Extra
{
struct TextKey
{
float mTime;
std::string mText;
};
std::vector<TextKey> mList;
void read(NIFStream* nif) override;
};
struct BSBound : public Extra
{
osg::Vec3f mCenter, mExtents;
void read(NIFStream* nif) override;
};
struct BSFurnitureMarker : public Extra
{
struct LegacyFurniturePosition
{
osg::Vec3f mOffset;
uint16_t mOrientation;
uint8_t mPositionRef;
void read(NIFStream* nif);
};
struct FurniturePosition
{
osg::Vec3f mOffset;
float mHeading;
uint16_t mType;
uint16_t mEntryPoint;
void read(NIFStream* nif);
};
std::vector<LegacyFurniturePosition> mLegacyMarkers;
std::vector<FurniturePosition> mMarkers;
void read(NIFStream* nif) override;
};
struct BSInvMarker : public Extra
{
osg::Quat mRotation;
float mScale;
void read(NIFStream* nif) override;
};
struct BSBehaviorGraphExtraData : public Extra
{
std::string mFile;
bool mControlsBaseSkeleton;
void read(NIFStream* nif) override;
};
struct BSBoneLODExtraData : public Extra
{
struct BoneLOD
{
uint32_t mDistance;
std::string mBone;
void read(NIFStream* nif);
};
std::vector<BoneLOD> mData;
void read(NIFStream* nif) override;
};
struct BSDecalPlacementVectorExtraData : public NiFloatExtraData
{
struct Block
{
std::vector<osg::Vec3f> mPoints;
std::vector<osg::Vec3f> mNormals;
void read(NIFStream* nif);
};
std::vector<Block> mBlocks;
void read(NIFStream* nif) override;
};
struct BSExtraData : NiExtraData
{
void read(NIFStream* nif) override {}
};
struct BSClothExtraData : BSExtraData
{
std::vector<uint8_t> mData;
void read(NIFStream* nif) override;
};
struct BSCollisionQueryProxyExtraData : BSExtraData
{
std::vector<uint8_t> mData;
void read(NIFStream* nif) override;
};
struct BSConnectPoint
{
struct Point
{
std::string mParent;
std::string mName;
NiQuatTransform mTransform;
void read(NIFStream* nif);
};
struct Parents : NiExtraData
{
std::vector<Point> mPoints;
void read(NIFStream* nif) override;
};
struct Children : NiExtraData
{
bool mSkinned;
std::vector<std::string> mPointNames;
void read(NIFStream* nif) override;
};
};
struct BSPackedGeomDataCombined
{
float mGrayscaleToPaletteScale;
NiTransform mTransform;
osg::BoundingSpheref mBoundingSphere;
void read(NIFStream* nif);
};
struct BSPackedGeomObject
{
uint32_t mFileHash;
uint32_t mDataOffset;
void read(NIFStream* nif);
};
struct BSPackedSharedGeomData
{
uint32_t mNumVertices;
uint32_t mLODLevels;
uint32_t mLOD0TriCount;
uint32_t mLOD0TriOffset;
uint32_t mLOD1TriCount;
uint32_t mLOD1TriOffset;
uint32_t mLOD2TriCount;
uint32_t mLOD2TriOffset;
std::vector<BSPackedGeomDataCombined> mCombined;
BSVertexDesc mVertexDesc;
void read(NIFStream* nif);
};
struct BSPackedCombinedSharedGeomDataExtra : NiExtraData
{
BSVertexDesc mVertexDesc;
uint32_t mNumVertices;
uint32_t mNumTriangles;
uint32_t mFlags1;
uint32_t mFlags2;
std::vector<BSPackedGeomObject> mObjects;
std::vector<BSPackedSharedGeomData> mObjectData;
void read(NIFStream* nif) override;
};
}
#endif