#ifndef OPENMW_COMPONENTS_NIF_DATA_HPP #define OPENMW_COMPONENTS_NIF_DATA_HPP #include "nifkey.hpp" #include "niftypes.hpp" // NiTransform #include "node.hpp" #include "recordptr.hpp" namespace Nif { // Common ancestor for several data classes struct NiGeometryData : public Record { // Interpretation of Flags field differs depending on the version enum DataFlags { DataFlag_HasUV = 0x0001, DataFlag_NumUVsMask = 0x003F, DataFlag_HasTangents = 0x1000, }; int32_t mGroupId{ 0 }; uint16_t mNumVertices; uint8_t mKeepFlags{ 0 }; uint8_t mCompressFlags{ 0 }; std::vector mVertices; uint16_t mDataFlags{ 0 }; uint32_t mMaterialHash; std::vector mNormals, mTangents, mBitangents; osg::BoundingSpheref mBoundingSphere; std::vector mColors; std::vector> mUVList; uint16_t mConsistencyType; void read(NIFStream* nif) override; }; // Abstract struct NiTriBasedGeomData : public NiGeometryData { uint16_t mNumTriangles; void read(NIFStream* nif) override; }; struct NiTriShapeData : public NiTriBasedGeomData { // Triangles, three vertex indices per triangle std::vector mTriangles; std::vector> mMatchGroups; void read(NIFStream* nif) override; }; struct NiTriStripsData : public NiTriBasedGeomData { // Triangle strips, series of vertex indices. std::vector> mStrips; void read(NIFStream* nif) override; }; struct NiLinesData : public NiGeometryData { // Lines, series of indices that correspond to connected vertices. // NB: assumes <=65536 number of vertices std::vector mLines; void read(NIFStream* nif) override; }; struct NiPosData : public Record { Vector3KeyMapPtr mKeyList; void read(NIFStream* nif) override; }; struct NiUVData : public Record { std::array mKeyList; void read(NIFStream* nif) override; }; struct NiFloatData : public Record { FloatKeyMapPtr mKeyList; void read(NIFStream* nif) override; }; struct NiPixelFormat { enum class Format : uint32_t { RGB = 0, RGBA = 1, Palette = 2, PaletteAlpha = 3, BGR = 4, BGRA = 5, DXT1 = 6, DXT3 = 7, DXT5 = 8, }; struct ChannelData { enum class Type : uint32_t { Red = 0, Green = 1, Blue = 2, Alpha = 3, Compressed = 4, OffsetU = 5, OffsetV = 6, OffsetW = 7, OffsetQ = 8, Luma = 9, Height = 10, VectorX = 11, VectorY = 12, VectorZ = 13, Padding = 14, Intensity = 15, Index = 16, Depth = 17, Stencil = 18, Empty = 19, }; enum class Convention : uint32_t { NormInt = 0, Half = 1, Float = 2, Index = 3, Compressed = 4, Unknown = 5, Int = 6, }; Type mType; Convention mConvention; uint8_t mBitsPerChannel; bool mSigned; void read(NIFStream* nif); }; Format mFormat{ Format::RGB }; std::array mColorMasks; uint32_t mBitsPerPixel{ 0 }; uint32_t mPixelTiling{ 0 }; std::array mCompareBits; uint32_t mRendererHint{ 0 }; uint32_t mExtraData{ 0 }; uint8_t mFlags{ 0 }; bool mUseSrgb{ false }; std::array mChannels; void read(NIFStream* nif); }; struct NiPixelData : public Record { struct Mipmap { uint32_t mWidth, mHeight; uint32_t mOffset; }; NiPixelFormat mPixelFormat; NiPalettePtr mPalette; uint32_t mBytesPerPixel; std::vector mMipmaps; uint32_t mNumFaces{ 1 }; std::vector mData; void read(NIFStream* nif) override; void post(Reader& nif) override; }; struct NiColorData : public Record { Vector4KeyMapPtr mKeyMap; void read(NIFStream* nif) override; }; struct NiVisData : public Record { // TODO: investigate possible use of BoolKeyMap std::shared_ptr> mKeys; void read(NIFStream* nif) override; }; struct NiSkinInstance : public Record { NiSkinDataPtr mData; NiSkinPartitionPtr mPartitions; NiAVObjectPtr mRoot; NiAVObjectList mBones; void read(NIFStream* nif) override; void post(Reader& nif) override; const Nif::NiSkinPartition* getPartitions() const; }; struct BSDismemberSkinInstance : public NiSkinInstance { struct BodyPart { uint16_t mFlags; uint16_t mType; }; std::vector mParts; void read(NIFStream* nif) override; }; struct BSSkinInstance : Record { NiAVObjectPtr mRoot; BSSkinBoneDataPtr mData; NiAVObjectList mBones; std::vector mScales; void read(NIFStream* nif) override; void post(Reader& nif) override; }; struct NiSkinData : public Record { using VertWeight = std::pair; struct BoneInfo { NiTransform mTransform; osg::BoundingSpheref mBoundSphere; std::vector mWeights; }; NiTransform mTransform; std::vector mBones; NiSkinPartitionPtr mPartitions; void read(NIFStream* nif) override; void post(Reader& nif) override; }; struct BSSkinBoneData : Record { struct BoneInfo { osg::BoundingSpheref mBoundSphere; NiTransform mTransform; }; std::vector mBones; void read(NIFStream* nif) override; }; struct NiSkinPartition : public Record { struct Partition { std::vector mBones; std::vector mVertexMap; std::vector mWeights; std::vector> mStrips; std::vector mTriangles; std::vector mBoneIndices; BSVertexDesc mVertexDesc; std::vector mTrueTriangles; std::vector> mTrueStrips; uint8_t mLODLevel; bool mGlobalVB; void read(NIFStream* nif); }; std::vector mPartitions; unsigned int mDataSize; unsigned int mVertexSize; BSVertexDesc mVertexDesc; std::vector mVertexData; void read(NIFStream* nif) override; }; struct NiMorphData : public Record { struct MorphData { FloatKeyMapPtr mKeyFrames; std::vector mVertices; }; uint8_t mRelativeTargets; std::vector mMorphs; void read(NIFStream* nif) override; }; struct NiKeyframeData : public Record { QuaternionKeyMapPtr mRotations; // may be NULL FloatKeyMapPtr mXRotations; FloatKeyMapPtr mYRotations; FloatKeyMapPtr mZRotations; Vector3KeyMapPtr mTranslations; FloatKeyMapPtr mScales; enum class AxisOrder : uint32_t { Order_XYZ = 0, Order_XZY = 1, Order_YZX = 2, Order_YXZ = 3, Order_ZXY = 4, Order_ZYX = 5, Order_XYX = 6, Order_YZY = 7, Order_ZXZ = 8 }; AxisOrder mAxisOrder{ AxisOrder::Order_XYZ }; void read(NIFStream* nif) override; }; struct NiPalette : public Record { // 32-bit RGBA colors that correspond to 8-bit indices std::vector mColors; void read(NIFStream* nif) override; }; struct NiStringPalette : public Record { std::string mPalette; void read(NIFStream* nif) override; }; struct NiBoolData : public Record { BoolKeyMapPtr mKeyList; void read(NIFStream* nif) override; }; struct NiBSplineData : public Record { std::vector mFloatControlPoints; std::vector mCompactControlPoints; void read(NIFStream* nif) override; }; struct NiBSplineBasisData : public Record { uint32_t mNumControlPoints; void read(NIFStream* nif) override; }; struct NiAdditionalGeometryData : public Record { struct DataStream { uint32_t mType; uint32_t mUnitSize; uint32_t mTotalSize; uint32_t mStride; uint32_t mBlockIndex; uint32_t mBlockOffset; uint8_t mFlags; void read(NIFStream* nif); }; struct DataBlock { bool mValid; uint32_t mBlockSize; std::vector mBlockOffsets; std::vector mDataSizes; std::vector mData; uint32_t mShaderIndex; uint32_t mTotalSize; void read(NIFStream* nif, bool bsPacked); }; uint16_t mNumVertices; std::vector mBlockInfos; std::vector mBlocks; void read(NIFStream* nif); }; struct BSMultiBound : public Record { BSMultiBoundDataPtr mData; void read(NIFStream* nif) override; void post(Reader& nif) override; }; // Abstract struct BSMultiBoundData : public Record { }; struct BSMultiBoundAABB : public BSMultiBoundData { osg::Vec3f mPosition; osg::Vec3f mExtents; void read(NIFStream* nif) override; }; struct BSMultiBoundOBB : public BSMultiBoundData { osg::Vec3f mCenter; osg::Vec3f mSize; Nif::Matrix3 mRotation; void read(NIFStream* nif) override; }; struct BSMultiBoundSphere : public BSMultiBoundData { osg::BoundingSpheref mSphere; void read(NIFStream* nif) override; }; struct BSAnimNote : public Record { enum class Type : uint32_t { Invalid = 0, GrabIK = 1, LookIK = 2, }; Type mType; float mTime; uint32_t mArm; float mGain; uint32_t mState; void read(NIFStream* nif) override; }; struct BSAnimNotes : public Record { BSAnimNoteList mList; void read(NIFStream* nif) override; void post(Reader& nif) override; }; } #endif