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.
600 lines
16 KiB
C++
600 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
|