mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 16:26:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			257 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			257 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
 |