mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 00:26:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			599 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			599 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#ifndef OPENMW_COMPONENTS_NIF_PROPERTY_HPP
 | 
						|
#define OPENMW_COMPONENTS_NIF_PROPERTY_HPP
 | 
						|
 | 
						|
#include "base.hpp"
 | 
						|
 | 
						|
namespace Nif
 | 
						|
{
 | 
						|
 | 
						|
    struct NiProperty : NiObjectNET
 | 
						|
    {
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiTextureTransform
 | 
						|
    {
 | 
						|
        enum class Method : uint32_t
 | 
						|
        {
 | 
						|
            // Back = inverse of mOrigin.
 | 
						|
            // FromMaya = inverse of the V axis with a positive translation along V of 1 unit.
 | 
						|
            MayaLegacy = 0, // mOrigin * mRotation * Back * mOffset * mScale
 | 
						|
            Max = 1, // mOrigin * mScale * mRotation * mOffset * Back
 | 
						|
            Maya = 2, // mOrigin * mRotation * Back * FromMaya * mOffset * mScale
 | 
						|
        };
 | 
						|
 | 
						|
        osg::Vec2f mOffset;
 | 
						|
        osg::Vec2f mScale;
 | 
						|
        float mRotation;
 | 
						|
        Method mTransformMethod;
 | 
						|
        osg::Vec2f mOrigin;
 | 
						|
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiTexturingProperty : NiProperty
 | 
						|
    {
 | 
						|
        enum class ApplyMode : uint32_t
 | 
						|
        {
 | 
						|
            Replace = 0,
 | 
						|
            Decal = 1,
 | 
						|
            Modulate = 2,
 | 
						|
            Hilight = 3, // PS2-specific?
 | 
						|
            Hilight2 = 4, // Used for Oblivion parallax
 | 
						|
        };
 | 
						|
 | 
						|
        enum TextureType
 | 
						|
        {
 | 
						|
            BaseTexture = 0,
 | 
						|
            DarkTexture = 1,
 | 
						|
            DetailTexture = 2,
 | 
						|
            GlossTexture = 3,
 | 
						|
            GlowTexture = 4,
 | 
						|
            BumpTexture = 5,
 | 
						|
            DecalTexture = 6,
 | 
						|
        };
 | 
						|
 | 
						|
        // A sub-texture
 | 
						|
        struct Texture
 | 
						|
        {
 | 
						|
            bool mEnabled;
 | 
						|
            NiSourceTexturePtr mSourceTexture;
 | 
						|
            uint32_t mClamp;
 | 
						|
            uint32_t mFilter;
 | 
						|
            uint16_t mMaxAnisotropy;
 | 
						|
            uint32_t mUVSet;
 | 
						|
            bool mHasTransform;
 | 
						|
            NiTextureTransform mTransform;
 | 
						|
 | 
						|
            void read(NIFStream* nif);
 | 
						|
            void post(Reader& nif);
 | 
						|
 | 
						|
            bool wrapT() const { return mClamp & 1; }
 | 
						|
            bool wrapS() const { return mClamp & 2; }
 | 
						|
        };
 | 
						|
 | 
						|
        uint16_t mFlags{ 0u };
 | 
						|
        ApplyMode mApplyMode{ ApplyMode::Modulate };
 | 
						|
 | 
						|
        std::vector<Texture> mTextures;
 | 
						|
        std::vector<Texture> mShaderTextures;
 | 
						|
        std::vector<uint32_t> mShaderIds;
 | 
						|
 | 
						|
        osg::Vec2f mEnvMapLumaBias;
 | 
						|
        osg::Vec4f mBumpMapMatrix;
 | 
						|
        float mParallaxOffset;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
        void post(Reader& nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiShadeProperty : NiProperty
 | 
						|
    {
 | 
						|
        uint16_t mFlags{ 0u };
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    enum class BSShaderType : uint32_t
 | 
						|
    {
 | 
						|
        ShaderType_TallGrass = 0,
 | 
						|
        ShaderType_Default = 1,
 | 
						|
        ShaderType_Sky = 10,
 | 
						|
        ShaderType_Skin = 14,
 | 
						|
        ShaderType_Water = 17,
 | 
						|
        ShaderType_Lighting30 = 29,
 | 
						|
        ShaderType_Tile = 32,
 | 
						|
        ShaderType_NoLighting = 33
 | 
						|
    };
 | 
						|
 | 
						|
    enum BSShaderFlags1
 | 
						|
    {
 | 
						|
        BSSFlag1_Specular = 0x00000001,
 | 
						|
        BSSFlag1_Refraction = 0x00008000,
 | 
						|
        BSSFlag1_FireRefraction = 0x00010000,
 | 
						|
        BSSFlag1_Decal = 0x04000000,
 | 
						|
        BSSFlag1_DepthTest = 0x80000000,
 | 
						|
    };
 | 
						|
 | 
						|
    enum BSShaderFlags2
 | 
						|
    {
 | 
						|
        BSSFlag2_DepthWrite = 0x00000001,
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSSPParallaxParams
 | 
						|
    {
 | 
						|
        float mMaxPasses{ 4.f };
 | 
						|
        float mScale{ 1.f };
 | 
						|
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSSPRefractionParams
 | 
						|
    {
 | 
						|
        float mStrength{ 0.f };
 | 
						|
        int32_t mPeriod{ 0 };
 | 
						|
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSShaderProperty : NiShadeProperty
 | 
						|
    {
 | 
						|
        uint32_t mType{ 0u }, mShaderFlags1{ 0u }, mShaderFlags2{ 0u };
 | 
						|
        float mEnvMapScale{ 0.f };
 | 
						|
        std::vector<uint32_t> mShaderFlags1Hashes, mShaderFlags2Hashes;
 | 
						|
        osg::Vec2f mUVOffset, mUVScale;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
 | 
						|
        // These flags are shared between BSShader and BSLightingShader
 | 
						|
        // Shader-specific flag methods must be handled on per-record basis
 | 
						|
        bool specular() const { return mShaderFlags1 & BSSFlag1_Specular; }
 | 
						|
        bool decal() const { return mShaderFlags1 & BSSFlag1_Decal; }
 | 
						|
        bool depthTest() const { return mShaderFlags1 & BSSFlag1_DepthTest; }
 | 
						|
        bool depthWrite() const { return mShaderFlags2 & BSSFlag2_DepthWrite; }
 | 
						|
        bool refraction() const { return mShaderFlags1 & BSSFlag1_Refraction; }
 | 
						|
        bool fireRefraction() const { return mShaderFlags1 & BSSFlag1_FireRefraction; }
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSShaderLightingProperty : BSShaderProperty
 | 
						|
    {
 | 
						|
        uint32_t mClamp{ 3 };
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
 | 
						|
        bool wrapT() const { return mClamp & 1; }
 | 
						|
        bool wrapS() const { return mClamp & 2; }
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSShaderPPLightingProperty : BSShaderLightingProperty
 | 
						|
    {
 | 
						|
        BSShaderTextureSetPtr mTextureSet;
 | 
						|
        BSSPRefractionParams mRefraction;
 | 
						|
        BSSPParallaxParams mParallax;
 | 
						|
        osg::Vec4f mEmissiveColor;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
        void post(Reader& nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSShaderNoLightingProperty : BSShaderLightingProperty
 | 
						|
    {
 | 
						|
        std::string mFilename;
 | 
						|
        osg::Vec4f mFalloffParams;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    enum class SkyObjectType : uint32_t
 | 
						|
    {
 | 
						|
        SkyTexture = 0,
 | 
						|
        SkySunglare = 1,
 | 
						|
        Sky = 2,
 | 
						|
        SkyClouds = 3,
 | 
						|
        SkyStars = 5,
 | 
						|
        SkyMoonStarsMask = 7,
 | 
						|
    };
 | 
						|
 | 
						|
    struct SkyShaderProperty : BSShaderLightingProperty
 | 
						|
    {
 | 
						|
        std::string mFilename;
 | 
						|
        SkyObjectType mSkyObjectType;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct TallGrassShaderProperty : BSShaderProperty
 | 
						|
    {
 | 
						|
        std::string mFilename;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct TileShaderProperty : BSShaderLightingProperty
 | 
						|
    {
 | 
						|
        std::string mFilename;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    enum class BSLightingShaderType : uint32_t
 | 
						|
    {
 | 
						|
        ShaderType_Default = 0,
 | 
						|
        ShaderType_EnvMap = 1,
 | 
						|
        ShaderType_Glow = 2,
 | 
						|
        ShaderType_Parallax = 3,
 | 
						|
        ShaderType_FaceTint = 4,
 | 
						|
        ShaderType_SkinTint = 5,
 | 
						|
        ShaderType_HairTint = 6,
 | 
						|
        ShaderType_ParallaxOcc = 7,
 | 
						|
        ShaderType_MultitexLand = 8,
 | 
						|
        ShaderType_LODLand = 9,
 | 
						|
        ShaderType_Snow = 10,
 | 
						|
        ShaderType_MultiLayerParallax = 11,
 | 
						|
        ShaderType_TreeAnim = 12,
 | 
						|
        ShaderType_LODObjects = 13,
 | 
						|
        ShaderType_SparkleSnow = 14,
 | 
						|
        ShaderType_LODObjectsHD = 15,
 | 
						|
        ShaderType_EyeEnvmap = 16,
 | 
						|
        ShaderType_Cloud = 17,
 | 
						|
        ShaderType_LODNoise = 18,
 | 
						|
        ShaderType_MultitexLandLODBlend = 19,
 | 
						|
        ShaderType_Dismemberment = 20,
 | 
						|
        ShaderType_Terrain = 21, // FO76+, technically 17
 | 
						|
    };
 | 
						|
 | 
						|
    enum BSLightingShaderFlags1
 | 
						|
    {
 | 
						|
        BSLSFlag1_Falloff = 0x00000040,
 | 
						|
        BSLSFlag1_SoftEffect = 0x40000000,
 | 
						|
    };
 | 
						|
 | 
						|
    enum BSLightingShaderFlags2
 | 
						|
    {
 | 
						|
        BSLSFlag2_DoubleSided = 0x00000010,
 | 
						|
        BSLSFlag2_TreeAnim = 0x20000000,
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSSPLuminanceParams
 | 
						|
    {
 | 
						|
        float mLumEmittance;
 | 
						|
        float mExposureOffset;
 | 
						|
        float mFinalExposureMin, mFinalExposureMax;
 | 
						|
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSSPWetnessParams
 | 
						|
    {
 | 
						|
        float mSpecScale;
 | 
						|
        float mSpecPower;
 | 
						|
        float mMinVar;
 | 
						|
        float mEnvMapScale;
 | 
						|
        float mFresnelPower;
 | 
						|
        float mMetalness;
 | 
						|
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSSPMLParallaxParams
 | 
						|
    {
 | 
						|
        float mInnerLayerThickness;
 | 
						|
        float mRefractionScale;
 | 
						|
        osg::Vec2f mInnerLayerTextureScale;
 | 
						|
        float mEnvMapScale;
 | 
						|
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSSPTranslucencyParams
 | 
						|
    {
 | 
						|
        osg::Vec3f mSubsurfaceColor;
 | 
						|
        float mTransmissiveScale;
 | 
						|
        float mTurbulence;
 | 
						|
        bool mThickObject;
 | 
						|
        bool mMixAlbedo;
 | 
						|
 | 
						|
        void read(NIFStream* nif);
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSLightingShaderProperty : BSShaderProperty
 | 
						|
    {
 | 
						|
        BSShaderTextureSetPtr mTextureSet;
 | 
						|
        osg::Vec3f mEmissive;
 | 
						|
        float mEmissiveMult{ 1.f };
 | 
						|
        std::string mRootMaterial;
 | 
						|
        uint32_t mClamp{ 3 };
 | 
						|
        float mAlpha{ 1.f };
 | 
						|
        float mRefractionStrength;
 | 
						|
        float mGlossiness{ 80.f };
 | 
						|
        float mSmoothness{ 1.f };
 | 
						|
        osg::Vec3f mSpecular;
 | 
						|
        float mSpecStrength{ 1.f };
 | 
						|
        std::array<float, 2> mLightingEffects;
 | 
						|
        float mSubsurfaceRolloff;
 | 
						|
        float mRimlightPower;
 | 
						|
        float mBacklightPower;
 | 
						|
        float mGrayscaleToPaletteScale{ 1.f };
 | 
						|
        float mFresnelPower{ 5.f };
 | 
						|
        BSSPWetnessParams mWetness;
 | 
						|
        bool mDoTranslucency{ false };
 | 
						|
        BSSPTranslucencyParams mTranslucency;
 | 
						|
        std::vector<std::vector<std::string>> mTextureArrays;
 | 
						|
        BSSPLuminanceParams mLuminance;
 | 
						|
 | 
						|
        bool mUseSSR;
 | 
						|
        bool mWetnessUseSSR;
 | 
						|
 | 
						|
        osg::Vec3f mSkinTintColor;
 | 
						|
        float mSkinTintAlpha{ 1.f };
 | 
						|
        osg::Vec3f mHairTintColor;
 | 
						|
 | 
						|
        BSSPParallaxParams mParallax;
 | 
						|
        BSSPMLParallaxParams mMultiLayerParallax;
 | 
						|
        osg::Vec4f mSparkle;
 | 
						|
 | 
						|
        float mCubeMapScale;
 | 
						|
        osg::Vec3f mLeftEyeReflectionCenter;
 | 
						|
        osg::Vec3f mRightEyeReflectionCenter;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
        void post(Reader& nif) override;
 | 
						|
 | 
						|
        bool wrapT() const { return mClamp & 1; }
 | 
						|
        bool wrapS() const { return mClamp & 2; }
 | 
						|
 | 
						|
        bool doubleSided() const { return mShaderFlags2 & BSLSFlag2_DoubleSided; }
 | 
						|
        bool treeAnim() const { return mShaderFlags2 & BSLSFlag2_TreeAnim; }
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSEffectShaderProperty : BSShaderProperty
 | 
						|
    {
 | 
						|
        std::string mSourceTexture;
 | 
						|
        uint8_t mClamp;
 | 
						|
        uint8_t mLightingInfluence;
 | 
						|
        uint8_t mEnvMapMinLOD;
 | 
						|
        osg::Vec4f mFalloffParams;
 | 
						|
        float mRefractionPower;
 | 
						|
        osg::Vec4f mBaseColor;
 | 
						|
        float mBaseColorScale;
 | 
						|
        float mFalloffDepth;
 | 
						|
        std::string mGreyscaleTexture;
 | 
						|
        std::string mEnvMapTexture;
 | 
						|
        std::string mNormalTexture;
 | 
						|
        std::string mEnvMaskTexture;
 | 
						|
        float mEnvMapScale;
 | 
						|
        std::string mReflectanceTexture;
 | 
						|
        std::string mLightingTexture;
 | 
						|
        osg::Vec3f mEmittanceColor;
 | 
						|
        std::string mEmitGradientTexture;
 | 
						|
        BSSPLuminanceParams mLuminance;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
 | 
						|
        bool wrapT() const { return mClamp & 1; }
 | 
						|
        bool wrapS() const { return mClamp & 2; }
 | 
						|
 | 
						|
        bool useFalloff() const { return mShaderFlags1 & BSLSFlag1_Falloff; }
 | 
						|
        bool softEffect() const { return mShaderFlags1 & BSLSFlag1_SoftEffect; }
 | 
						|
        bool doubleSided() const { return mShaderFlags2 & BSLSFlag2_DoubleSided; }
 | 
						|
        bool treeAnim() const { return mShaderFlags2 & BSLSFlag2_TreeAnim; }
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSSkyShaderProperty : BSShaderProperty
 | 
						|
    {
 | 
						|
        std::string mFilename;
 | 
						|
        SkyObjectType mSkyObjectType;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct BSWaterShaderProperty : BSShaderProperty
 | 
						|
    {
 | 
						|
        enum Flags
 | 
						|
        {
 | 
						|
            Flag_Displacement = 0x0001,
 | 
						|
            Flag_LOD = 0x0002,
 | 
						|
            Flag_Depth = 0x0004,
 | 
						|
            Flag_ActorInWater = 0x0008,
 | 
						|
            Flag_ActorInWaterIsMoving = 0x0010,
 | 
						|
            Flag_Underwater = 0x0020,
 | 
						|
            Flag_Reflections = 0x0040,
 | 
						|
            Flag_Refractions = 0x0080,
 | 
						|
            Flag_VertexUV = 0x0100,
 | 
						|
            Flag_VertexAlphaDepth = 0x0200,
 | 
						|
            Flag_Procedural = 0x0400,
 | 
						|
            Flag_Fog = 0x0800,
 | 
						|
            Flag_UpdateConstants = 0x1000,
 | 
						|
            Flag_CubeMap = 0x2000,
 | 
						|
        };
 | 
						|
 | 
						|
        uint32_t mFlags;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiAlphaProperty : NiProperty
 | 
						|
    {
 | 
						|
        enum Flags
 | 
						|
        {
 | 
						|
            Flag_Blending = 0x0001,
 | 
						|
            Flag_Testing = 0x0200,
 | 
						|
            Flag_NoSorter = 0x2000,
 | 
						|
        };
 | 
						|
 | 
						|
        uint16_t mFlags;
 | 
						|
        uint8_t mThreshold;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
 | 
						|
        bool useAlphaBlending() const { return mFlags & Flag_Blending; }
 | 
						|
        bool useAlphaTesting() const { return mFlags & Flag_Testing; }
 | 
						|
        bool noSorter() const { return mFlags & Flag_NoSorter; }
 | 
						|
 | 
						|
        /*
 | 
						|
            NiAlphaProperty blend modes (glBlendFunc):
 | 
						|
            0000 GL_ONE
 | 
						|
            0001 GL_ZERO
 | 
						|
            0010 GL_SRC_COLOR
 | 
						|
            0011 GL_ONE_MINUS_SRC_COLOR
 | 
						|
            0100 GL_DST_COLOR
 | 
						|
            0101 GL_ONE_MINUS_DST_COLOR
 | 
						|
            0110 GL_SRC_ALPHA
 | 
						|
            0111 GL_ONE_MINUS_SRC_ALPHA
 | 
						|
            1000 GL_DST_ALPHA
 | 
						|
            1001 GL_ONE_MINUS_DST_ALPHA
 | 
						|
            1010 GL_SRC_ALPHA_SATURATE
 | 
						|
 | 
						|
            test modes (glAlphaFunc):
 | 
						|
            000 GL_ALWAYS
 | 
						|
            001 GL_LESS
 | 
						|
            010 GL_EQUAL
 | 
						|
            011 GL_LEQUAL
 | 
						|
            100 GL_GREATER
 | 
						|
            101 GL_NOTEQUAL
 | 
						|
            110 GL_GEQUAL
 | 
						|
            111 GL_NEVER
 | 
						|
 | 
						|
            Taken from:
 | 
						|
            http://niftools.sourceforge.net/doc/nif/NiAlphaProperty.html
 | 
						|
        */
 | 
						|
 | 
						|
        int sourceBlendMode() const { return (mFlags >> 1) & 0xF; }
 | 
						|
        int destinationBlendMode() const { return (mFlags >> 5) & 0xF; }
 | 
						|
        int alphaTestMode() const { return (mFlags >> 10) & 0x7; }
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiDitherProperty : NiProperty
 | 
						|
    {
 | 
						|
        uint16_t mFlags;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiFogProperty : NiProperty
 | 
						|
    {
 | 
						|
        enum Flags : uint16_t
 | 
						|
        {
 | 
						|
            Enabled = 0x02,
 | 
						|
            Radial = 0x08,
 | 
						|
            VertexAlpha = 0x10,
 | 
						|
        };
 | 
						|
 | 
						|
        uint16_t mFlags;
 | 
						|
        float mFogDepth;
 | 
						|
        osg::Vec3f mColour;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
 | 
						|
        bool enabled() const { return mFlags & Flags::Enabled; }
 | 
						|
        bool radial() const { return mFlags & Flags::Radial; }
 | 
						|
        bool vertexAlpha() const { return mFlags & Flags::VertexAlpha; }
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiMaterialProperty : NiProperty
 | 
						|
    {
 | 
						|
        uint16_t mFlags{ 0u };
 | 
						|
        osg::Vec3f mAmbient{ 1.f, 1.f, 1.f };
 | 
						|
        osg::Vec3f mDiffuse{ 1.f, 1.f, 1.f };
 | 
						|
        osg::Vec3f mSpecular;
 | 
						|
        osg::Vec3f mEmissive;
 | 
						|
        float mGlossiness{ 0.f };
 | 
						|
        float mAlpha{ 0.f };
 | 
						|
        float mEmissiveMult{ 1.f };
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiSpecularProperty : NiProperty
 | 
						|
    {
 | 
						|
        bool mEnable;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiStencilProperty : NiProperty
 | 
						|
    {
 | 
						|
        enum class TestFunc : uint32_t
 | 
						|
        {
 | 
						|
            Never = 0,
 | 
						|
            Less = 1,
 | 
						|
            Equal = 2,
 | 
						|
            LessEqual = 3,
 | 
						|
            Greater = 4,
 | 
						|
            NotEqual = 5,
 | 
						|
            GreaterEqual = 6,
 | 
						|
            Always = 7,
 | 
						|
        };
 | 
						|
 | 
						|
        enum class Action : uint32_t
 | 
						|
        {
 | 
						|
            Keep = 0,
 | 
						|
            Zero = 1,
 | 
						|
            Replace = 2,
 | 
						|
            Increment = 3,
 | 
						|
            Decrement = 4,
 | 
						|
            Invert = 5,
 | 
						|
        };
 | 
						|
 | 
						|
        enum class DrawMode : uint32_t
 | 
						|
        {
 | 
						|
            Default = 0,
 | 
						|
            CounterClockwise = 1,
 | 
						|
            Clockwise = 2,
 | 
						|
            Both = 3,
 | 
						|
        };
 | 
						|
 | 
						|
        uint16_t mFlags{ 0u };
 | 
						|
        bool mEnabled;
 | 
						|
        TestFunc mTestFunction;
 | 
						|
        uint32_t mStencilRef;
 | 
						|
        uint32_t mStencilMask;
 | 
						|
        Action mFailAction;
 | 
						|
        Action mZFailAction;
 | 
						|
        Action mPassAction;
 | 
						|
        DrawMode mDrawMode;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiVertexColorProperty : NiProperty
 | 
						|
    {
 | 
						|
        enum class VertexMode : uint32_t
 | 
						|
        {
 | 
						|
            VertMode_SrcIgnore = 0,
 | 
						|
            VertMode_SrcEmissive = 1,
 | 
						|
            VertMode_SrcAmbDif = 2
 | 
						|
        };
 | 
						|
 | 
						|
        enum class LightMode : uint32_t
 | 
						|
        {
 | 
						|
            LightMode_Emissive = 0,
 | 
						|
            LightMode_EmiAmbDif = 1
 | 
						|
        };
 | 
						|
 | 
						|
        uint16_t mFlags;
 | 
						|
        VertexMode mVertexMode;
 | 
						|
        LightMode mLightingMode;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiWireframeProperty : NiProperty
 | 
						|
    {
 | 
						|
        bool mEnable;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
    };
 | 
						|
 | 
						|
    struct NiZBufferProperty : NiProperty
 | 
						|
    {
 | 
						|
        uint16_t mFlags;
 | 
						|
        uint32_t mTestFunction;
 | 
						|
 | 
						|
        void read(NIFStream* nif) override;
 | 
						|
 | 
						|
        bool depthTest() const { return mFlags & 1; }
 | 
						|
        bool depthWrite() const { return mFlags & 2; }
 | 
						|
    };
 | 
						|
 | 
						|
}
 | 
						|
#endif
 |