mirror of https://github.com/OpenMW/openmw.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
237 lines
6.9 KiB
C++
237 lines
6.9 KiB
C++
#include "file.hpp"
|
|
|
|
#include <array>
|
|
#include <stdexcept>
|
|
|
|
#include "stream.hpp"
|
|
|
|
namespace Bgsm
|
|
{
|
|
MaterialFilePtr parse(Files::IStreamPtr&& inputStream)
|
|
{
|
|
std::shared_ptr<Bgsm::MaterialFile> file;
|
|
BGSMStream stream(std::move(inputStream));
|
|
|
|
std::array<char, 4> signature;
|
|
stream.readArray(signature);
|
|
std::string shaderType(signature.data(), 4);
|
|
if (shaderType == "BGEM")
|
|
{
|
|
file = std::make_shared<BGEMFile>();
|
|
file->mShaderType = Bgsm::ShaderType::Effect;
|
|
}
|
|
else if (shaderType == "BGSM")
|
|
{
|
|
file = std::make_shared<BGSMFile>();
|
|
file->mShaderType = Bgsm::ShaderType::Lighting;
|
|
}
|
|
else
|
|
throw std::runtime_error("Invalid material file");
|
|
|
|
file->read(stream);
|
|
return file;
|
|
}
|
|
|
|
void MaterialFile::read(BGSMStream& stream)
|
|
{
|
|
stream.read(mVersion);
|
|
stream.read(mClamp);
|
|
stream.read(mUVOffset);
|
|
stream.read(mUVScale);
|
|
stream.read(mTransparency);
|
|
stream.read(mAlphaBlend);
|
|
stream.read(mSourceBlendMode);
|
|
stream.read(mDestinationBlendMode);
|
|
stream.read(mAlphaTestThreshold);
|
|
stream.read(mAlphaTest);
|
|
stream.read(mDepthWrite);
|
|
stream.read(mDepthTest);
|
|
stream.read(mSSR);
|
|
stream.read(mWetnessControlSSR);
|
|
stream.read(mDecal);
|
|
stream.read(mTwoSided);
|
|
stream.read(mDecalNoFade);
|
|
stream.read(mNonOccluder);
|
|
stream.read(mRefraction);
|
|
stream.read(mRefractionFalloff);
|
|
stream.read(mRefractionPower);
|
|
if (mVersion < 10)
|
|
{
|
|
stream.read(mEnvMapEnabled);
|
|
stream.read(mEnvMapMaskScale);
|
|
}
|
|
else
|
|
{
|
|
stream.read(mDepthBias);
|
|
}
|
|
stream.read(mGrayscaleToPaletteColor);
|
|
if (mVersion >= 6)
|
|
stream.read(mMaskWrites);
|
|
}
|
|
|
|
void BGSMFile::read(BGSMStream& stream)
|
|
{
|
|
MaterialFile::read(stream);
|
|
|
|
stream.read(mDiffuseMap);
|
|
stream.read(mNormalMap);
|
|
stream.read(mSmoothSpecMap);
|
|
stream.read(mGrayscaleMap);
|
|
if (mVersion >= 3)
|
|
{
|
|
stream.read(mGlowMap);
|
|
stream.read(mWrinkleMap);
|
|
stream.read(mSpecularMap);
|
|
stream.read(mLightingMap);
|
|
stream.read(mFlowMap);
|
|
if (mVersion >= 17)
|
|
stream.read(mDistanceFieldAlphaMap);
|
|
}
|
|
else
|
|
{
|
|
stream.read(mEnvMap);
|
|
stream.read(mGlowMap);
|
|
stream.read(mInnerLayerMap);
|
|
stream.read(mWrinkleMap);
|
|
stream.read(mDisplacementMap);
|
|
}
|
|
stream.read(mEnableEditorAlphaThreshold);
|
|
if (mVersion >= 8)
|
|
{
|
|
stream.read(mTranslucency);
|
|
stream.read(mTranslucencyThickObject);
|
|
stream.read(mTranslucencyMixAlbedoWithSubsurfaceColor);
|
|
stream.read(mTranslucencySubsurfaceColor);
|
|
stream.read(mTranslucencyTransmissiveScale);
|
|
stream.read(mTranslucencyTurbulence);
|
|
}
|
|
else
|
|
{
|
|
stream.read(mRimLighting);
|
|
stream.read(mRimPower);
|
|
stream.read(mBackLightPower);
|
|
stream.read(mSubsurfaceLighting);
|
|
stream.read(mSubsurfaceLightingRolloff);
|
|
}
|
|
stream.read(mSpecularEnabled);
|
|
stream.read(mSpecularColor);
|
|
stream.read(mSpecularMult);
|
|
stream.read(mSmoothness);
|
|
stream.read(mFresnelPower);
|
|
stream.read(mWetnessControlSpecScale);
|
|
stream.read(mWetnessControlSpecPowerScale);
|
|
stream.read(mWetnessControlSpecMinvar);
|
|
if (mVersion < 10)
|
|
stream.read(mWetnessControlEnvMapScale);
|
|
stream.read(mWetnessControlFresnelPower);
|
|
stream.read(mWetnessControlMetalness);
|
|
if (mVersion >= 3)
|
|
{
|
|
stream.read(mPBR);
|
|
if (mVersion >= 9)
|
|
{
|
|
stream.read(mCustomPorosity);
|
|
stream.read(mPorosityValue);
|
|
}
|
|
}
|
|
stream.read(mRootMaterialPath);
|
|
stream.read(mAnisoLighting);
|
|
stream.read(mEmitEnabled);
|
|
if (mEmitEnabled)
|
|
stream.read(mEmittanceColor);
|
|
stream.read(mEmittanceMult);
|
|
stream.read(mModelSpaceNormals);
|
|
stream.read(mExternalEmittance);
|
|
if (mVersion >= 12)
|
|
{
|
|
stream.read(mLumEmittance);
|
|
if (mVersion >= 13)
|
|
{
|
|
stream.read(mUseAdaptiveEmissive);
|
|
stream.read(mAdaptiveEmissiveExposureParams);
|
|
}
|
|
}
|
|
else if (mVersion < 8)
|
|
{
|
|
stream.read(mBackLighting);
|
|
}
|
|
stream.read(mReceiveShadows);
|
|
stream.read(mHideSecret);
|
|
stream.read(mCastShadows);
|
|
stream.read(mDissolveFade);
|
|
stream.read(mAssumeShadowmask);
|
|
stream.read(mGlowMapEnabled);
|
|
if (mVersion < 7)
|
|
{
|
|
stream.read(mEnvMapWindow);
|
|
stream.read(mEnvMapEye);
|
|
}
|
|
stream.read(mHair);
|
|
stream.read(mHairTintColor);
|
|
stream.read(mTree);
|
|
stream.read(mFacegen);
|
|
stream.read(mSkinTint);
|
|
stream.read(mTessellate);
|
|
if (mVersion < 3)
|
|
{
|
|
stream.read(mDisplacementMapParams);
|
|
stream.read(mTessellationParams);
|
|
}
|
|
stream.read(mGrayscaleToPaletteScale);
|
|
if (mVersion >= 1)
|
|
{
|
|
stream.read(mSkewSpecularAlpha);
|
|
stream.read(mTerrain);
|
|
if (mTerrain)
|
|
{
|
|
if (mVersion == 3)
|
|
stream.skip(4); // Unknown
|
|
|
|
stream.read(mTerrainParams);
|
|
}
|
|
}
|
|
}
|
|
|
|
void BGEMFile::read(BGSMStream& stream)
|
|
{
|
|
MaterialFile::read(stream);
|
|
|
|
stream.read(mBaseMap);
|
|
stream.read(mGrayscaleMap);
|
|
stream.read(mEnvMap);
|
|
stream.read(mNormalMap);
|
|
stream.read(mEnvMapMask);
|
|
if (mVersion >= 11)
|
|
{
|
|
stream.read(mSpecularMap);
|
|
stream.read(mLightingMap);
|
|
stream.read(mGlowMap);
|
|
}
|
|
if (mVersion >= 10)
|
|
{
|
|
stream.read(mEnvMapEnabled);
|
|
stream.read(mEnvMapMaskScale);
|
|
}
|
|
stream.read(mBlood);
|
|
stream.read(mEffectLighting);
|
|
stream.read(mFalloff);
|
|
stream.read(mFalloffColor);
|
|
stream.read(mGrayscaleToPaletteAlpha);
|
|
stream.read(mSoft);
|
|
stream.read(mBaseColor);
|
|
stream.read(mBaseColorScale);
|
|
stream.read(mFalloffParams);
|
|
stream.read(mLightingInfluence);
|
|
stream.read(mEnvmapMinLOD);
|
|
stream.read(mSoftDepth);
|
|
if (mVersion >= 11)
|
|
stream.read(mEmittanceColor);
|
|
if (mVersion >= 15)
|
|
stream.read(mAdaptiveEmissiveExposureParams);
|
|
if (mVersion >= 16)
|
|
stream.read(mGlowMapEnabled);
|
|
if (mVersion >= 20)
|
|
stream.read(mEffectPbrSpecular);
|
|
}
|
|
}
|