mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-25 17:56:37 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			236 lines
		
	
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			236 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);
 | |
|     }
 | |
| }
 |