2015-02-23 21:06:10 +01:00
|
|
|
#include "property.hpp"
|
|
|
|
|
|
|
|
#include "data.hpp"
|
2023-08-31 18:59:33 +03:00
|
|
|
#include "texture.hpp"
|
2015-02-23 21:06:10 +01:00
|
|
|
|
|
|
|
namespace Nif
|
|
|
|
{
|
|
|
|
|
|
|
|
void NiTexturingProperty::Texture::read(NIFStream* nif)
|
2020-10-04 01:27:49 +03:00
|
|
|
{
|
2023-09-14 01:54:27 +03:00
|
|
|
nif->read(inUse);
|
2015-02-23 21:06:10 +01:00
|
|
|
if (!inUse)
|
2022-09-22 21:26:05 +03:00
|
|
|
return;
|
|
|
|
|
2015-02-23 21:06:10 +01:00
|
|
|
texture.read(nif);
|
2020-10-04 01:27:49 +03:00
|
|
|
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2020-10-04 01:27:49 +03:00
|
|
|
clamp = nif->getInt();
|
|
|
|
nif->skip(4); // Filter mode. Ignoring because global filtering settings are more sensible
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-10-04 01:27:49 +03:00
|
|
|
clamp = nif->getUShort() & 0xF;
|
|
|
|
}
|
|
|
|
// Max anisotropy. I assume we'll always only use the global anisotropy setting.
|
|
|
|
if (nif->getVersion() >= NIFStream::generateVersion(20, 5, 0, 4))
|
|
|
|
nif->getUShort();
|
|
|
|
|
|
|
|
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
|
|
|
|
uvSet = nif->getUInt();
|
2019-10-05 15:02:42 +03:00
|
|
|
|
|
|
|
// Two PS2-specific shorts.
|
2020-10-04 01:27:49 +03:00
|
|
|
if (nif->getVersion() < NIFStream::generateVersion(10, 4, 0, 2))
|
|
|
|
nif->skip(4);
|
|
|
|
if (nif->getVersion() <= NIFStream::generateVersion(4, 1, 0, 18))
|
|
|
|
nif->skip(2); // Unknown short
|
|
|
|
else if (nif->getVersion() >= NIFStream::generateVersion(10, 1, 0, 0))
|
|
|
|
{
|
2023-09-14 01:54:27 +03:00
|
|
|
if (nif->get<bool>()) // Has texture transform
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2020-10-04 01:27:49 +03:00
|
|
|
nif->getVector2(); // UV translation
|
|
|
|
nif->getVector2(); // UV scale
|
|
|
|
nif->getFloat(); // W axis rotation
|
|
|
|
nif->getUInt(); // Transform method
|
|
|
|
nif->getVector2(); // Texture rotation origin
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
2020-10-04 01:27:49 +03:00
|
|
|
}
|
|
|
|
}
|
2015-02-23 21:06:10 +01:00
|
|
|
|
2022-09-17 19:24:42 +02:00
|
|
|
void NiTexturingProperty::Texture::post(Reader& nif)
|
2015-02-23 21:06:10 +01:00
|
|
|
{
|
|
|
|
texture.post(nif);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NiTexturingProperty::read(NIFStream* nif)
|
|
|
|
{
|
|
|
|
Property::read(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
2020-10-04 01:27:49 +03:00
|
|
|
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB_OLD
|
|
|
|
|| nif->getVersion() >= NIFStream::generateVersion(20, 1, 0, 2))
|
|
|
|
flags = nif->getUShort();
|
|
|
|
if (nif->getVersion() <= NIFStream::generateVersion(20, 1, 0, 1))
|
|
|
|
apply = nif->getUInt();
|
2019-10-05 15:02:42 +03:00
|
|
|
|
|
|
|
unsigned int numTextures = nif->getUInt();
|
|
|
|
|
|
|
|
if (!numTextures)
|
|
|
|
return;
|
|
|
|
|
|
|
|
textures.resize(numTextures);
|
|
|
|
for (unsigned int i = 0; i < numTextures; i++)
|
|
|
|
{
|
|
|
|
textures[i].read(nif);
|
|
|
|
if (i == 5 && textures[5].inUse) // Bump map settings
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2020-03-02 04:03:36 +03:00
|
|
|
envMapLumaBias = nif->getVector2();
|
|
|
|
bumpMapMatrix = nif->getVector4();
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
2020-10-04 01:27:49 +03:00
|
|
|
else if (i == 7 && textures[7].inUse && nif->getVersion() >= NIFStream::generateVersion(20, 2, 0, 5))
|
|
|
|
/*float parallaxOffset = */ nif->getFloat();
|
2019-10-05 15:02:42 +03:00
|
|
|
}
|
2020-10-04 01:27:49 +03:00
|
|
|
|
|
|
|
if (nif->getVersion() >= NIFStream::generateVersion(10, 0, 1, 0))
|
|
|
|
{
|
|
|
|
unsigned int numShaderTextures = nif->getUInt();
|
|
|
|
shaderTextures.resize(numShaderTextures);
|
|
|
|
for (unsigned int i = 0; i < numShaderTextures; i++)
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2020-10-04 01:27:49 +03:00
|
|
|
shaderTextures[i].read(nif);
|
|
|
|
if (shaderTextures[i].inUse)
|
|
|
|
nif->getUInt(); // Unique identifier
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
2020-10-04 01:27:49 +03:00
|
|
|
}
|
2015-02-23 21:06:10 +01:00
|
|
|
}
|
|
|
|
|
2022-09-17 19:24:42 +02:00
|
|
|
void NiTexturingProperty::post(Reader& nif)
|
2020-12-13 04:04:14 +03:00
|
|
|
{
|
|
|
|
Property::post(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
2020-12-13 04:04:14 +03:00
|
|
|
for (size_t i = 0; i < textures.size(); i++)
|
|
|
|
textures[i].post(nif);
|
|
|
|
for (size_t i = 0; i < shaderTextures.size(); i++)
|
|
|
|
shaderTextures[i].post(nif);
|
|
|
|
}
|
|
|
|
|
2023-09-17 18:29:30 +03:00
|
|
|
void BSSPParallaxParams::read(NIFStream* nif)
|
|
|
|
{
|
|
|
|
nif->read(mMaxPasses);
|
|
|
|
nif->read(mScale);
|
|
|
|
}
|
|
|
|
|
|
|
|
void BSSPRefractionParams::read(NIFStream* nif)
|
|
|
|
{
|
|
|
|
nif->read(mStrength);
|
|
|
|
nif->read(mPeriod);
|
|
|
|
}
|
|
|
|
|
2020-12-13 04:19:14 +03:00
|
|
|
void BSShaderProperty::read(NIFStream* nif)
|
|
|
|
{
|
|
|
|
NiShadeProperty::read(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
2020-12-13 04:19:14 +03:00
|
|
|
if (nif->getBethVersion() <= NIFFile::BethVersion::BETHVER_FO3)
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2023-09-17 18:29:30 +03:00
|
|
|
nif->read(mType);
|
|
|
|
nif->read(mShaderFlags1);
|
|
|
|
nif->read(mShaderFlags2);
|
|
|
|
nif->read(mEnvMapScale);
|
2020-12-17 00:46:09 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void BSShaderLightingProperty::read(NIFStream* nif)
|
|
|
|
{
|
|
|
|
BSShaderProperty::read(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
2020-12-17 00:46:09 +03:00
|
|
|
if (nif->getBethVersion() <= NIFFile::BethVersion::BETHVER_FO3)
|
2023-09-17 18:29:30 +03:00
|
|
|
nif->read(mClamp);
|
2020-12-17 00:46:09 +03:00
|
|
|
}
|
|
|
|
|
2020-10-08 03:39:27 +03:00
|
|
|
void BSShaderPPLightingProperty::read(NIFStream* nif)
|
|
|
|
{
|
|
|
|
BSShaderLightingProperty::read(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
|
|
|
mTextureSet.read(nif);
|
|
|
|
if (nif->getBethVersion() >= 15)
|
|
|
|
mRefraction.read(nif);
|
|
|
|
if (nif->getBethVersion() >= 25)
|
|
|
|
mParallax.read(nif);
|
2020-10-08 03:39:27 +03:00
|
|
|
}
|
|
|
|
|
2022-09-17 19:24:42 +02:00
|
|
|
void BSShaderPPLightingProperty::post(Reader& nif)
|
2020-10-08 03:39:27 +03:00
|
|
|
{
|
|
|
|
BSShaderLightingProperty::post(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
|
|
|
mTextureSet.post(nif);
|
2020-10-08 03:39:27 +03:00
|
|
|
}
|
|
|
|
|
2015-02-23 21:06:10 +01:00
|
|
|
void BSShaderNoLightingProperty::read(NIFStream* nif)
|
|
|
|
{
|
|
|
|
BSShaderLightingProperty::read(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
|
|
|
mFilename = nif->getSizedString();
|
2015-02-23 21:06:10 +01:00
|
|
|
if (nif->getBethVersion() >= 27)
|
2023-09-17 18:29:30 +03:00
|
|
|
nif->read(mFalloffParams);
|
2015-02-23 21:06:10 +01:00
|
|
|
}
|
|
|
|
|
2023-09-17 18:29:30 +03:00
|
|
|
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);
|
|
|
|
};
|
|
|
|
|
2015-02-23 21:06:10 +01:00
|
|
|
void BSLightingShaderProperty::read(NIFStream* nif)
|
2020-10-04 01:27:49 +03:00
|
|
|
{
|
2023-09-17 18:29:30 +03:00
|
|
|
if (nif->getBethVersion() <= 139)
|
|
|
|
nif->read(mType);
|
|
|
|
|
2020-10-08 03:39:27 +03:00
|
|
|
BSShaderProperty::read(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
|
|
|
if (nif->getBethVersion() <= 130)
|
|
|
|
{
|
|
|
|
nif->read(mShaderFlags1);
|
|
|
|
nif->read(mShaderFlags2);
|
|
|
|
}
|
|
|
|
else if (nif->getBethVersion() >= 132)
|
|
|
|
{
|
|
|
|
uint32_t numShaderFlags1 = 0, numShaderFlags2 = 0;
|
|
|
|
nif->read(numShaderFlags1);
|
|
|
|
if (nif->getBethVersion() >= 152)
|
|
|
|
nif->read(numShaderFlags2);
|
|
|
|
nif->readVector(mShaderFlags1Hashes, numShaderFlags1);
|
|
|
|
nif->readVector(mShaderFlags2Hashes, numShaderFlags2);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76)
|
|
|
|
nif->read(mType);
|
|
|
|
|
|
|
|
nif->read(mUVOffset);
|
|
|
|
nif->read(mUVScale);
|
2020-10-08 03:39:27 +03:00
|
|
|
mTextureSet.read(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
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_STF)
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: consider separating this switch for pre-FO76 and FO76+
|
|
|
|
switch (static_cast<BSLightingShaderType>(mType))
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2020-10-08 03:39:27 +03:00
|
|
|
case BSLightingShaderType::ShaderType_EnvMap:
|
2023-09-17 18:29:30 +03:00
|
|
|
if (nif->getBethVersion() <= 139)
|
|
|
|
nif->read(mEnvMapScale);
|
|
|
|
if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_FO4)
|
|
|
|
{
|
|
|
|
nif->read(mUseSSR);
|
|
|
|
nif->read(mWetnessUseSSR);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case BSLightingShaderType::ShaderType_FaceTint:
|
|
|
|
// Skin tint shader in FO76+
|
|
|
|
if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76)
|
|
|
|
nif->read(mSkinTintColor);
|
2022-09-22 21:26:05 +03:00
|
|
|
break;
|
2020-10-08 03:39:27 +03:00
|
|
|
case BSLightingShaderType::ShaderType_SkinTint:
|
2023-09-17 18:29:30 +03:00
|
|
|
if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76)
|
|
|
|
nif->read(mHairTintColor);
|
|
|
|
else if (nif->getBethVersion() <= 130)
|
|
|
|
mSkinTintColor = { nif->get<osg::Vec3f>(), 1.f };
|
|
|
|
else if (nif->getBethVersion() <= 139)
|
|
|
|
nif->read(mSkinTintColor);
|
|
|
|
// Hair tint shader in FO76+
|
|
|
|
else if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_F76)
|
|
|
|
nif->read(mHairTintColor);
|
|
|
|
break;
|
2020-10-08 03:39:27 +03:00
|
|
|
case BSLightingShaderType::ShaderType_HairTint:
|
2023-09-17 18:29:30 +03:00
|
|
|
if (nif->getBethVersion() <= 139)
|
|
|
|
nif->read(mHairTintColor);
|
2022-09-22 21:26:05 +03:00
|
|
|
break;
|
2020-10-08 03:39:27 +03:00
|
|
|
case BSLightingShaderType::ShaderType_ParallaxOcc:
|
2023-09-17 18:29:30 +03:00
|
|
|
mParallax.read(nif);
|
2022-09-22 21:26:05 +03:00
|
|
|
break;
|
2020-10-08 03:39:27 +03:00
|
|
|
case BSLightingShaderType::ShaderType_MultiLayerParallax:
|
2023-09-17 18:29:30 +03:00
|
|
|
mMultiLayerParallax.read(nif);
|
2022-09-22 21:26:05 +03:00
|
|
|
break;
|
2020-10-08 03:39:27 +03:00
|
|
|
case BSLightingShaderType::ShaderType_SparkleSnow:
|
2023-09-17 18:29:30 +03:00
|
|
|
nif->read(mSparkle);
|
2022-09-22 21:26:05 +03:00
|
|
|
break;
|
2020-10-08 03:39:27 +03:00
|
|
|
case BSLightingShaderType::ShaderType_EyeEnvmap:
|
2023-09-17 18:29:30 +03:00
|
|
|
nif->read(mCubeMapScale);
|
|
|
|
nif->read(mLeftEyeReflectionCenter);
|
|
|
|
nif->read(mRightEyeReflectionCenter);
|
2022-09-22 21:26:05 +03:00
|
|
|
break;
|
2020-10-04 01:27:49 +03:00
|
|
|
default:
|
2022-09-22 21:26:05 +03:00
|
|
|
break;
|
|
|
|
}
|
2020-10-04 01:27:49 +03:00
|
|
|
}
|
2015-02-23 21:06:10 +01:00
|
|
|
|
2022-09-17 19:24:42 +02:00
|
|
|
void BSLightingShaderProperty::post(Reader& nif)
|
2015-02-23 21:06:10 +01:00
|
|
|
{
|
|
|
|
BSShaderProperty::post(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
2015-02-23 21:06:10 +01:00
|
|
|
mTextureSet.post(nif);
|
|
|
|
}
|
|
|
|
|
2023-02-20 00:00:48 +03:00
|
|
|
void BSEffectShaderProperty::read(NIFStream* nif)
|
|
|
|
{
|
|
|
|
BSShaderProperty::read(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
|
|
|
if (nif->getBethVersion() <= 130)
|
|
|
|
{
|
|
|
|
nif->read(mShaderFlags1);
|
|
|
|
nif->read(mShaderFlags2);
|
|
|
|
}
|
|
|
|
else if (nif->getBethVersion() >= 132)
|
|
|
|
{
|
|
|
|
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);
|
2023-02-20 00:00:48 +03:00
|
|
|
mSourceTexture = nif->getSizedString();
|
2023-09-17 18:29:30 +03:00
|
|
|
|
|
|
|
if (nif->getBethVersion() >= NIFFile::BethVersion::BETHVER_STF)
|
|
|
|
nif->skip(4); // Unknown
|
|
|
|
|
|
|
|
uint32_t miscParams = nif->get<uint32_t>();
|
2023-02-20 00:00:48 +03:00
|
|
|
mClamp = miscParams & 0xFF;
|
|
|
|
mLightingInfluence = (miscParams >> 8) & 0xFF;
|
|
|
|
mEnvMapMinLOD = (miscParams >> 16) & 0xFF;
|
2023-09-17 18:29:30 +03:00
|
|
|
nif->read(mFalloffParams);
|
|
|
|
|
|
|
|
if (nif->getBethVersion() == NIFFile::BethVersion::BETHVER_F76)
|
|
|
|
nif->read(mRefractionPower);
|
|
|
|
|
|
|
|
nif->read(mBaseColor);
|
|
|
|
nif->read(mBaseColorScale);
|
|
|
|
nif->read(mFalloffDepth);
|
2023-02-20 00:00:48 +03:00
|
|
|
mGreyscaleTexture = nif->getSizedString();
|
2023-09-17 18:29:30 +03:00
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
nif->read(mRefractionPower);
|
|
|
|
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
|
|
|
|
}
|
2023-02-20 00:00:48 +03:00
|
|
|
}
|
|
|
|
|
2015-02-23 21:06:10 +01:00
|
|
|
void NiFogProperty::read(NIFStream* nif)
|
|
|
|
{
|
|
|
|
Property::read(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
2015-02-23 21:06:10 +01:00
|
|
|
mFlags = nif->getUShort();
|
|
|
|
mFogDepth = nif->getFloat();
|
|
|
|
mColour = nif->getVector3();
|
|
|
|
}
|
|
|
|
|
|
|
|
void S_MaterialProperty::read(NIFStream* nif)
|
2020-10-04 01:27:49 +03:00
|
|
|
{
|
|
|
|
if (nif->getBethVersion() < 26)
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2020-10-04 01:27:49 +03:00
|
|
|
ambient = nif->getVector3();
|
|
|
|
diffuse = nif->getVector3();
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
2020-10-04 01:27:49 +03:00
|
|
|
specular = nif->getVector3();
|
|
|
|
emissive = nif->getVector3();
|
|
|
|
glossiness = nif->getFloat();
|
2015-02-23 21:06:10 +01:00
|
|
|
alpha = nif->getFloat();
|
2020-10-04 01:27:49 +03:00
|
|
|
if (nif->getBethVersion() >= 22)
|
|
|
|
emissiveMult = nif->getFloat();
|
|
|
|
}
|
2022-09-22 21:26:05 +03:00
|
|
|
|
2023-02-10 23:37:54 +03:00
|
|
|
void NiVertexColorProperty::read(NIFStream* nif)
|
2020-10-04 01:27:49 +03:00
|
|
|
{
|
2023-02-10 23:37:54 +03:00
|
|
|
Property::read(nif);
|
2023-09-17 18:29:30 +03:00
|
|
|
|
2023-02-10 23:37:54 +03:00
|
|
|
mFlags = nif->getUShort();
|
|
|
|
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
|
|
|
|
{
|
|
|
|
mVertexMode = static_cast<VertexMode>(nif->getUInt());
|
|
|
|
mLightingMode = static_cast<LightMode>(nif->getUInt());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
mVertexMode = static_cast<VertexMode>((mFlags >> 4) & 0x3);
|
|
|
|
mLightingMode = static_cast<LightMode>((mFlags >> 3) & 0x1);
|
|
|
|
}
|
2020-10-04 01:27:49 +03:00
|
|
|
}
|
2015-02-23 21:06:10 +01:00
|
|
|
|
2020-12-17 00:46:09 +03:00
|
|
|
void S_AlphaProperty::read(NIFStream* nif)
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2020-10-04 01:27:49 +03:00
|
|
|
threshold = nif->getChar();
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
2015-02-23 21:06:10 +01:00
|
|
|
|
2020-12-17 00:46:09 +03:00
|
|
|
void S_StencilProperty::read(NIFStream* nif)
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2020-10-04 01:27:49 +03:00
|
|
|
if (nif->getVersion() <= NIFFile::NIFVersion::VER_OB)
|
2022-09-22 21:26:05 +03:00
|
|
|
{
|
2020-10-04 01:27:49 +03:00
|
|
|
enabled = nif->getChar();
|
|
|
|
compareFunc = nif->getInt();
|
|
|
|
stencilRef = nif->getUInt();
|
|
|
|
stencilMask = nif->getUInt();
|
2020-12-17 00:46:09 +03:00
|
|
|
failAction = nif->getInt();
|
|
|
|
zFailAction = nif->getInt();
|
|
|
|
zPassAction = nif->getInt();
|
|
|
|
drawMode = nif->getInt();
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-10-04 01:27:49 +03:00
|
|
|
unsigned short flags = nif->getUShort();
|
|
|
|
enabled = flags & 0x1;
|
|
|
|
failAction = (flags >> 1) & 0x7;
|
|
|
|
zFailAction = (flags >> 4) & 0x7;
|
|
|
|
zPassAction = (flags >> 7) & 0x7;
|
|
|
|
drawMode = (flags >> 10) & 0x3;
|
|
|
|
compareFunc = (flags >> 12) & 0x7;
|
|
|
|
stencilRef = nif->getUInt();
|
|
|
|
stencilMask = nif->getUInt();
|
2022-09-22 21:26:05 +03:00
|
|
|
}
|
|
|
|
}
|
2015-02-23 21:06:10 +01:00
|
|
|
|
|
|
|
}
|