mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 05:26:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			598 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			598 lines
		
	
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "property.hpp"
 | 
						|
 | 
						|
#include "data.hpp"
 | 
						|
#include "texture.hpp"
 | 
						|
 | 
						|
namespace Nif
 | 
						|
{
 | 
						|
 | 
						|
    void NiTextureTransform::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        nif->read(mOffset);
 | 
						|
        nif->read(mScale);
 | 
						|
        nif->read(mRotation);
 | 
						|
        mTransformMethod = static_cast<Method>(nif->get<uint32_t>());
 | 
						|
        nif->read(mOrigin);
 | 
						|
    }
 | 
						|
 | 
						|
    void NiTexturingProperty::Texture::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        nif->read(mEnabled);
 | 
						|
        if (!mEnabled)
 | 
						|
            return;
 | 
						|
 | 
						|
        if (nif->getVersion() >= NIFStream::generateVersion(3, 3, 0, 13))
 | 
						|
            mSourceTexture.read(nif);
 | 
						|
 | 
						|
        if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
 | 
						|
        {
 | 
						|
            nif->read(mClamp);
 | 
						|
            nif->read(mFilter);
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            uint16_t flags;
 | 
						|
            nif->read(flags);
 | 
						|
            mClamp = flags & 0xF;
 | 
						|
            mFilter = (flags >> 4) & 0xF;
 | 
						|
        }
 | 
						|
 | 
						|
        if (nif->getVersion() >= NIFStream::generateVersion(20, 5, 0, 4))
 | 
						|
            nif->read(mMaxAnisotropy);
 | 
						|
 | 
						|
        if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
 | 
						|
            nif->read(mUVSet);
 | 
						|
 | 
						|
        // PS2 filtering settings
 | 
						|
        if (nif->getVersion() <= NIFStream::generateVersion(10, 4, 0, 1))
 | 
						|
            nif->skip(4);
 | 
						|
 | 
						|
        if (nif->getVersion() <= NIFStream::generateVersion(4, 1, 0, 12))
 | 
						|
            nif->skip(2); // Unknown
 | 
						|
 | 
						|
        if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0))
 | 
						|
        {
 | 
						|
            nif->read(mHasTransform);
 | 
						|
            if (mHasTransform)
 | 
						|
                mTransform.read(nif);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    void NiTexturingProperty::Texture::post(Reader& nif)
 | 
						|
    {
 | 
						|
        mSourceTexture.post(nif);
 | 
						|
    }
 | 
						|
 | 
						|
    void NiTexturingProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB_OLD
 | 
						|
            || nif->getVersion() >= NIFStream::generateVersion(20, 1, 0, 2))
 | 
						|
            nif->read(mFlags);
 | 
						|
        if (nif->getVersion() <= NIFStream::generateVersion(20, 1, 0, 1))
 | 
						|
            mApplyMode = static_cast<ApplyMode>(nif->get<uint32_t>());
 | 
						|
 | 
						|
        mTextures.resize(nif->get<uint32_t>());
 | 
						|
        for (size_t i = 0; i < mTextures.size(); i++)
 | 
						|
        {
 | 
						|
            mTextures[i].read(nif);
 | 
						|
 | 
						|
            if (i == 5 && mTextures[5].mEnabled)
 | 
						|
            {
 | 
						|
                nif->read(mEnvMapLumaBias);
 | 
						|
                nif->read(mBumpMapMatrix);
 | 
						|
            }
 | 
						|
            else if (i == 7 && mTextures[7].mEnabled && nif->getVersion() >= NIFStream::generateVersion(20, 2, 0, 5))
 | 
						|
                nif->read(mParallaxOffset);
 | 
						|
        }
 | 
						|
 | 
						|
        if (nif->getVersion() >= NIFStream::generateVersion(10, 0, 1, 0))
 | 
						|
        {
 | 
						|
            mShaderTextures.resize(nif->get<uint32_t>());
 | 
						|
            mShaderIds.resize(mShaderTextures.size());
 | 
						|
            for (size_t i = 0; i < mShaderTextures.size(); i++)
 | 
						|
            {
 | 
						|
                mShaderTextures[i].read(nif);
 | 
						|
                if (mShaderTextures[i].mEnabled)
 | 
						|
                    nif->read(mShaderIds[i]);
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    void NiTexturingProperty::post(Reader& nif)
 | 
						|
    {
 | 
						|
        NiProperty::post(nif);
 | 
						|
 | 
						|
        for (Texture& tex : mTextures)
 | 
						|
            tex.post(nif);
 | 
						|
        for (Texture& tex : mShaderTextures)
 | 
						|
            tex.post(nif);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSSPParallaxParams::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        nif->read(mMaxPasses);
 | 
						|
        nif->read(mScale);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSSPRefractionParams::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        nif->read(mStrength);
 | 
						|
        nif->read(mPeriod);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSShaderProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        if (nif->getBethVersion() < NIFFile::BethVersion::BETHVER_F76 && recType == RC_BSLightingShaderProperty)
 | 
						|
            nif->read(mType);
 | 
						|
 | 
						|
        NiShadeProperty::read(nif);
 | 
						|
 | 
						|
        if (nif->getUserVersion() <= 11)
 | 
						|
        {
 | 
						|
            nif->read(mType);
 | 
						|
            nif->read(mShaderFlags1);
 | 
						|
            nif->read(mShaderFlags2);
 | 
						|
            nif->read(mEnvMapScale);
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        if (!mName.empty() && nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76)
 | 
						|
            return;
 | 
						|
 | 
						|
        if (nif->getBethVersion() <= 131)
 | 
						|
        {
 | 
						|
            nif->read(mShaderFlags1);
 | 
						|
            nif->read(mShaderFlags2);
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76 && recType == RC_BSLightingShaderProperty)
 | 
						|
            {
 | 
						|
                nif->read(mType);
 | 
						|
 | 
						|
                // Remap FO76+ shader types to FO4 system so that we can actually use them
 | 
						|
                // TODO: NifTools spec doesn't do anything about the misplaced EyeEnvmap. Bug or feature?
 | 
						|
                switch (mType)
 | 
						|
                {
 | 
						|
                    case 3:
 | 
						|
                        mType = static_cast<uint32_t>(BSLightingShaderType::ShaderType_FaceTint);
 | 
						|
                        break;
 | 
						|
                    case 4:
 | 
						|
                        mType = static_cast<uint32_t>(BSLightingShaderType::ShaderType_SkinTint);
 | 
						|
                        break;
 | 
						|
                    case 5:
 | 
						|
                        mType = static_cast<uint32_t>(BSLightingShaderType::ShaderType_HairTint);
 | 
						|
                        break;
 | 
						|
                    case 12:
 | 
						|
                        mType = static_cast<uint32_t>(BSLightingShaderType::ShaderType_EyeEnvmap);
 | 
						|
                        break;
 | 
						|
                    case 17:
 | 
						|
                        mType = static_cast<uint32_t>(BSLightingShaderType::ShaderType_Terrain);
 | 
						|
                        break;
 | 
						|
                    default:
 | 
						|
                        break;
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            uint32_t numShaderFlags1 = 0, numShaderFlags2 = 0;
 | 
						|
            nif->read(numShaderFlags1);
 | 
						|
            if (nif->getBethVersion() >= 152)
 | 
						|
                nif->read(numShaderFlags2);
 | 
						|
            nif->readVector(mShaderFlags1Hashes, numShaderFlags1);
 | 
						|
            nif->readVector(mShaderFlags2Hashes, numShaderFlags2);
 | 
						|
        }
 | 
						|
 | 
						|
        nif->read(mUVOffset);
 | 
						|
        nif->read(mUVScale);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSShaderLightingProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        BSShaderProperty::read(nif);
 | 
						|
 | 
						|
        if (nif->getUserVersion() <= 11)
 | 
						|
            nif->read(mClamp);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSShaderPPLightingProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        BSShaderLightingProperty::read(nif);
 | 
						|
 | 
						|
        mTextureSet.read(nif);
 | 
						|
        if (nif->getUserVersion() == 11)
 | 
						|
        {
 | 
						|
            if (nif->getBethVersion() >= 15)
 | 
						|
                mRefraction.read(nif);
 | 
						|
            if (nif->getBethVersion() >= 25)
 | 
						|
                mParallax.read(nif);
 | 
						|
        }
 | 
						|
        else if (nif->getUserVersion() >= 12)
 | 
						|
            nif->read(mEmissiveColor);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSShaderPPLightingProperty::post(Reader& nif)
 | 
						|
    {
 | 
						|
        BSShaderLightingProperty::post(nif);
 | 
						|
 | 
						|
        mTextureSet.post(nif);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSShaderNoLightingProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        BSShaderLightingProperty::read(nif);
 | 
						|
 | 
						|
        mFilename = nif->getSizedString();
 | 
						|
        if (nif->getBethVersion() >= 27)
 | 
						|
            nif->read(mFalloffParams);
 | 
						|
    }
 | 
						|
 | 
						|
    void SkyShaderProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        BSShaderLightingProperty::read(nif);
 | 
						|
 | 
						|
        mFilename = nif->getSizedString();
 | 
						|
        mSkyObjectType = static_cast<SkyObjectType>(nif->get<uint32_t>());
 | 
						|
    }
 | 
						|
 | 
						|
    void TallGrassShaderProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        BSShaderProperty::read(nif);
 | 
						|
 | 
						|
        mFilename = nif->getSizedString();
 | 
						|
    }
 | 
						|
 | 
						|
    void TileShaderProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        BSShaderLightingProperty::read(nif);
 | 
						|
 | 
						|
        mFilename = nif->getSizedString();
 | 
						|
    }
 | 
						|
 | 
						|
    void BSSPLuminanceParams::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        nif->read(mLumEmittance);
 | 
						|
        nif->read(mExposureOffset);
 | 
						|
        nif->read(mFinalExposureMin);
 | 
						|
        nif->read(mFinalExposureMax);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSSPWetnessParams::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        nif->read(mSpecScale);
 | 
						|
        nif->read(mSpecPower);
 | 
						|
        nif->read(mMinVar);
 | 
						|
        if (nif->getBethVersion() == NIFFile::BethVersion::BETHVER_FO4)
 | 
						|
            nif->read(mEnvMapScale);
 | 
						|
        nif->read(mFresnelPower);
 | 
						|
        nif->read(mMetalness);
 | 
						|
        if (nif->getBethVersion() > NIFFile::BethVersion::BETHVER_FO4)
 | 
						|
            nif->skip(4); // Unknown
 | 
						|
        if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76)
 | 
						|
            nif->skip(4); // Unknown
 | 
						|
    }
 | 
						|
 | 
						|
    void BSSPMLParallaxParams::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        nif->read(mInnerLayerThickness);
 | 
						|
        nif->read(mRefractionScale);
 | 
						|
        nif->read(mInnerLayerTextureScale);
 | 
						|
        nif->read(mEnvMapScale);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSSPTranslucencyParams::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        nif->read(mSubsurfaceColor);
 | 
						|
        nif->read(mTransmissiveScale);
 | 
						|
        nif->read(mTurbulence);
 | 
						|
        nif->read(mThickObject);
 | 
						|
        nif->read(mMixAlbedo);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSLightingShaderProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        BSShaderProperty::read(nif);
 | 
						|
 | 
						|
        if (!mName.empty() && nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76)
 | 
						|
            return;
 | 
						|
 | 
						|
        mTextureSet.read(nif);
 | 
						|
        nif->read(mEmissive);
 | 
						|
        nif->read(mEmissiveMult);
 | 
						|
 | 
						|
        if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO4)
 | 
						|
            nif->read(mRootMaterial);
 | 
						|
 | 
						|
        if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_STF)
 | 
						|
            nif->skip(4); // Unknown float
 | 
						|
 | 
						|
        nif->read(mClamp);
 | 
						|
        nif->read(mAlpha);
 | 
						|
        nif->read(mRefractionStrength);
 | 
						|
 | 
						|
        if (nif->getBethVersion() < NIFFile::BethVersion::BETHVER_FO4)
 | 
						|
            nif->read(mGlossiness);
 | 
						|
        else
 | 
						|
            nif->read(mSmoothness);
 | 
						|
 | 
						|
        nif->read(mSpecular);
 | 
						|
        nif->read(mSpecStrength);
 | 
						|
 | 
						|
        if (nif->getBethVersion() < NIFFile::BethVersion::BETHVER_FO4)
 | 
						|
            nif->readArray(mLightingEffects);
 | 
						|
        else if (nif->getBethVersion() <= 139)
 | 
						|
        {
 | 
						|
            nif->read(mSubsurfaceRolloff);
 | 
						|
            nif->read(mRimlightPower);
 | 
						|
            if (mRimlightPower == std::numeric_limits<float>::max())
 | 
						|
                nif->read(mBacklightPower);
 | 
						|
        }
 | 
						|
 | 
						|
        if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO4)
 | 
						|
        {
 | 
						|
            nif->read(mGrayscaleToPaletteScale);
 | 
						|
            nif->read(mFresnelPower);
 | 
						|
            mWetness.read(nif);
 | 
						|
        }
 | 
						|
 | 
						|
        if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76)
 | 
						|
        {
 | 
						|
            mLuminance.read(nif);
 | 
						|
            if (nif->getBethVersion() == NIFFile::BethVersion::BETHVER_F76)
 | 
						|
            {
 | 
						|
                nif->read(mDoTranslucency);
 | 
						|
                if (mDoTranslucency)
 | 
						|
                    mTranslucency.read(nif);
 | 
						|
                if (nif->get<uint8_t>() != 0)
 | 
						|
                {
 | 
						|
                    mTextureArrays.resize(nif->get<uint32_t>());
 | 
						|
                    for (std::vector<std::string>& textureArray : mTextureArrays)
 | 
						|
                        nif->getSizedStrings(textureArray, nif->get<uint32_t>());
 | 
						|
                }
 | 
						|
            }
 | 
						|
            if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_STF)
 | 
						|
            {
 | 
						|
                nif->skip(4); // Unknown
 | 
						|
                nif->skip(4); // Unknown
 | 
						|
                nif->skip(2); // Unknown
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        switch (static_cast<BSLightingShaderType>(mType))
 | 
						|
        {
 | 
						|
            case BSLightingShaderType::ShaderType_EnvMap:
 | 
						|
                if (nif->getBethVersion() <= 139)
 | 
						|
                    nif->read(mEnvMapScale);
 | 
						|
                if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO4)
 | 
						|
                {
 | 
						|
                    nif->read(mUseSSR);
 | 
						|
                    nif->read(mWetnessUseSSR);
 | 
						|
                }
 | 
						|
                break;
 | 
						|
            case BSLightingShaderType::ShaderType_SkinTint:
 | 
						|
                nif->read(mSkinTintColor);
 | 
						|
                if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO4)
 | 
						|
                    nif->read(mSkinTintAlpha);
 | 
						|
                break;
 | 
						|
            case BSLightingShaderType::ShaderType_HairTint:
 | 
						|
                nif->read(mHairTintColor);
 | 
						|
                break;
 | 
						|
            case BSLightingShaderType::ShaderType_ParallaxOcc:
 | 
						|
                mParallax.read(nif);
 | 
						|
                break;
 | 
						|
            case BSLightingShaderType::ShaderType_MultiLayerParallax:
 | 
						|
                mMultiLayerParallax.read(nif);
 | 
						|
                break;
 | 
						|
            case BSLightingShaderType::ShaderType_SparkleSnow:
 | 
						|
                nif->read(mSparkle);
 | 
						|
                break;
 | 
						|
            case BSLightingShaderType::ShaderType_EyeEnvmap:
 | 
						|
                nif->read(mCubeMapScale);
 | 
						|
                nif->read(mLeftEyeReflectionCenter);
 | 
						|
                nif->read(mRightEyeReflectionCenter);
 | 
						|
                break;
 | 
						|
            default:
 | 
						|
                break;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    void BSLightingShaderProperty::post(Reader& nif)
 | 
						|
    {
 | 
						|
        BSShaderProperty::post(nif);
 | 
						|
 | 
						|
        mTextureSet.post(nif);
 | 
						|
    }
 | 
						|
 | 
						|
    void BSEffectShaderProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        BSShaderProperty::read(nif);
 | 
						|
 | 
						|
        if (!mName.empty() && nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76)
 | 
						|
            return;
 | 
						|
 | 
						|
        mSourceTexture = nif->getSizedString();
 | 
						|
 | 
						|
        if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_STF)
 | 
						|
            nif->skip(4); // Unknown
 | 
						|
 | 
						|
        uint32_t miscParams = nif->get<uint32_t>();
 | 
						|
        mClamp = miscParams & 0xFF;
 | 
						|
        mLightingInfluence = (miscParams >> 8) & 0xFF;
 | 
						|
        mEnvMapMinLOD = (miscParams >> 16) & 0xFF;
 | 
						|
        nif->read(mFalloffParams);
 | 
						|
 | 
						|
        if (nif->getBethVersion() == NIFFile::BethVersion::BETHVER_F76)
 | 
						|
            nif->read(mRefractionPower);
 | 
						|
 | 
						|
        nif->read(mBaseColor);
 | 
						|
        nif->read(mBaseColorScale);
 | 
						|
        nif->read(mFalloffDepth);
 | 
						|
        mGreyscaleTexture = nif->getSizedString();
 | 
						|
 | 
						|
        if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO4)
 | 
						|
        {
 | 
						|
            mEnvMapTexture = nif->getSizedString();
 | 
						|
            mNormalTexture = nif->getSizedString();
 | 
						|
            mEnvMaskTexture = nif->getSizedString();
 | 
						|
            nif->read(mEnvMapScale);
 | 
						|
        }
 | 
						|
 | 
						|
        if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76)
 | 
						|
        {
 | 
						|
            mReflectanceTexture = nif->getSizedString();
 | 
						|
            mLightingTexture = nif->getSizedString();
 | 
						|
            nif->read(mEmittanceColor);
 | 
						|
            mEmitGradientTexture = nif->getSizedString();
 | 
						|
            mLuminance.read(nif);
 | 
						|
        }
 | 
						|
 | 
						|
        if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_STF)
 | 
						|
        {
 | 
						|
            nif->skip(7); // Unknown bytes
 | 
						|
            nif->skip(6 * sizeof(float)); // Unknown floats
 | 
						|
            nif->skip(1); // Unknown byte
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    void BSSkyShaderProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        BSShaderProperty::read(nif);
 | 
						|
 | 
						|
        mFilename = nif->getSizedString();
 | 
						|
        mSkyObjectType = static_cast<SkyObjectType>(nif->get<uint32_t>());
 | 
						|
    }
 | 
						|
 | 
						|
    void BSWaterShaderProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        BSShaderProperty::read(nif);
 | 
						|
 | 
						|
        nif->read(mFlags);
 | 
						|
    }
 | 
						|
 | 
						|
    void NiAlphaProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        nif->read(mFlags);
 | 
						|
        nif->read(mThreshold);
 | 
						|
    }
 | 
						|
 | 
						|
    void NiDitherProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        nif->read(mFlags);
 | 
						|
    }
 | 
						|
 | 
						|
    void NiFogProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        nif->read(mFlags);
 | 
						|
        nif->read(mFogDepth);
 | 
						|
        nif->read(mColour);
 | 
						|
    }
 | 
						|
 | 
						|
    void NiMaterialProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB_OLD)
 | 
						|
            nif->read(mFlags);
 | 
						|
        if (nif->getBethVersion() < 26)
 | 
						|
        {
 | 
						|
            nif->read(mAmbient);
 | 
						|
            nif->read(mDiffuse);
 | 
						|
        }
 | 
						|
        nif->read(mSpecular);
 | 
						|
        nif->read(mEmissive);
 | 
						|
        nif->read(mGlossiness);
 | 
						|
        nif->read(mAlpha);
 | 
						|
        if (nif->getBethVersion() >= 22)
 | 
						|
            nif->read(mEmissiveMult);
 | 
						|
    }
 | 
						|
 | 
						|
    void NiShadeProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        if (nif->getBethVersion() <= NIFFile::BethVersion::BETHVER_FO3)
 | 
						|
            nif->read(mFlags);
 | 
						|
    }
 | 
						|
 | 
						|
    void NiSpecularProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        mEnable = nif->get<uint16_t>() & 1;
 | 
						|
    }
 | 
						|
 | 
						|
    void NiStencilProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
 | 
						|
        {
 | 
						|
            if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB_OLD)
 | 
						|
                nif->read(mFlags);
 | 
						|
            mEnabled = nif->get<uint8_t>() != 0;
 | 
						|
            mTestFunction = static_cast<TestFunc>(nif->get<uint32_t>());
 | 
						|
            nif->read(mStencilRef);
 | 
						|
            nif->read(mStencilMask);
 | 
						|
            mFailAction = static_cast<Action>(nif->get<uint32_t>());
 | 
						|
            mZFailAction = static_cast<Action>(nif->get<uint32_t>());
 | 
						|
            mPassAction = static_cast<Action>(nif->get<uint32_t>());
 | 
						|
            mDrawMode = static_cast<DrawMode>(nif->get<uint32_t>());
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            nif->read(mFlags);
 | 
						|
            mEnabled = mFlags & 0x1;
 | 
						|
            mFailAction = static_cast<Action>((mFlags >> 1) & 0x7);
 | 
						|
            mZFailAction = static_cast<Action>((mFlags >> 4) & 0x7);
 | 
						|
            mPassAction = static_cast<Action>((mFlags >> 7) & 0x7);
 | 
						|
            mDrawMode = static_cast<DrawMode>((mFlags >> 10) & 0x3);
 | 
						|
            mTestFunction = static_cast<TestFunc>((mFlags >> 12) & 0x7);
 | 
						|
            nif->read(mStencilRef);
 | 
						|
            nif->read(mStencilMask);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    void NiVertexColorProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        nif->read(mFlags);
 | 
						|
        if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
 | 
						|
        {
 | 
						|
            mVertexMode = static_cast<VertexMode>(nif->get<uint32_t>());
 | 
						|
            mLightingMode = static_cast<LightMode>(nif->get<uint32_t>());
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            mVertexMode = static_cast<VertexMode>((mFlags >> 4) & 0x3);
 | 
						|
            mLightingMode = static_cast<LightMode>((mFlags >> 3) & 0x1);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    void NiWireframeProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        mEnable = nif->get<uint16_t>() & 1;
 | 
						|
    }
 | 
						|
 | 
						|
    void NiZBufferProperty::read(NIFStream* nif)
 | 
						|
    {
 | 
						|
        NiProperty::read(nif);
 | 
						|
 | 
						|
        nif->read(mFlags);
 | 
						|
        if (nif->getVersion() >= NIFStream::generateVersion(4, 1, 0, 12)
 | 
						|
            && nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
 | 
						|
            nif->read(mTestFunction);
 | 
						|
        else
 | 
						|
            mTestFunction = (mFlags >> 2) & 0x7;
 | 
						|
    }
 | 
						|
 | 
						|
}
 |