From 2e534ebaa5f2613a84a7c7b39945dbf9ed4ed22f Mon Sep 17 00:00:00 2001 From: jonwd7 <jon.wd7@gmail.com> Date: Sat, 7 Oct 2017 03:07:02 -0400 Subject: [PATCH] Major version condition overhaul for Bethesda NIFs Also some decoding and major corrections. NiParticlesData and NiPSysData were almost completely wrong. NiGeometryData was wrong. NiGeometry was wrong. This was mostly due to Bethesda changing or breaking inheritance for derived types. For Bethesda 20.2 NIFs NiParticlesData now inherits from NiObject directly. NiParticleSystem changes between BSGeometry or NiGeometry based on version. This resulted in NiPSysData and NiParticleSystem being almost completely wrong for later Bethesda versions. Also changed all misuses of `User Version` to differentiate Bethesda versions to `User Version 2`. --- nif.xml | 247 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 137 insertions(+), 110 deletions(-) diff --git a/nif.xml b/nif.xml index 0e706dc..e68686b 100644 --- a/nif.xml +++ b/nif.xml @@ -1660,7 +1660,7 @@ <add name="Triangles" type="Triangle" arr1="Num Triangles" cond="(Has Faces) && (Num Strips == 0)" ver1="10.1.0.0">The triangles.</add> <add name="Has Bone Indices" type="bool">Do we have bone indices?</add> <add name="Bone Indices" type="byte" arr1="Num Vertices" arr2="Num Weights Per Vertex" cond="Has Bone Indices">Bone indices, they index into 'Bones'.</add> - <add name="Unknown Short" type="ushort" vercond="User Version >= 12">Unknown</add> + <add name="Unknown Short" type="ushort" vercond="User Version 2 > 34">Unknown</add> <add name="Vertex Size" type="byte" ver="20.2.0.7" userver2="100" /> <add name="Float Size" type="byte" ver="20.2.0.7" userver2="100" /> <add name="VF3" type="byte" ver="20.2.0.7" userver2="100" /> @@ -1743,12 +1743,12 @@ <compound name="FurniturePosition"> Bethesda Animation. Describes a furniture position? <add name="Offset" type="Vector3">Offset of furniture marker.</add> - <add name="Orientation" type="ushort" vercond="User Version <= 11">Furniture marker orientation.</add> - <add name="Position Ref 1" type="byte" vercond="User Version <= 11">Refers to a furnituremarkerxx.nif file. Always seems to be the same as Position Ref 2.</add> - <add name="Position Ref 2" type="byte" vercond="User Version <= 11">Refers to a furnituremarkerxx.nif file. Always seems to be the same as Position Ref 1.</add> - <add name="Heading" type="float" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Similar to Orientation, in float form.</add> - <add name="Animation Type" type="AnimationType" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Unknown</add> - <add name="Entry Properties" type="FurnitureEntryPoints" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Unknown/unused in nif?</add> + <add name="Orientation" type="ushort" vercond="User Version 2 <= 34">Furniture marker orientation.</add> + <add name="Position Ref 1" type="byte" vercond="User Version 2 <= 34">Refers to a furnituremarkerxx.nif file. Always seems to be the same as Position Ref 2.</add> + <add name="Position Ref 2" type="byte" vercond="User Version 2 <= 34">Refers to a furnituremarkerxx.nif file. Always seems to be the same as Position Ref 1.</add> + <add name="Heading" type="float" vercond="User Version 2 > 34">Similar to Orientation, in float form.</add> + <add name="Animation Type" type="AnimationType" vercond="User Version 2 > 34">Unknown</add> + <add name="Entry Properties" type="FurnitureEntryPoints" vercond="User Version 2 > 34">Unknown/unused in nif?</add> </compound> <compound name="TriangleData"> @@ -2123,6 +2123,16 @@ <add name="Body Part" type="BSDismemberBodyPartType">Body Part Index</add> </compound> + <compound name="BSVertexDesc"> + <add name="VF1" type="byte" /> + <add name="VF2" type="byte" /> + <add name="VF3" type="byte" /> + <add name="VF4" type="byte" /> + <add name="VF5" type="byte" /> + <add name="VF" type="VertexFlags" /> + <add name="VF8" type="byte" /> + </compound> + <compound name="BSGeometrySegmentData"> Bethesda-specific node. <add name="Flags" type="byte" /> @@ -2523,7 +2533,7 @@ <add name="Origin" type="Vector3">Origin of the object in mopp coordinates. This is the minimum of all vertices in the packed shape along each axis, minus 0.1.</add> <add name="Scale" type="float">The scaling factor to quantize the MOPP: the quantization factor is equal to 256*256 divided by this number. In Oblivion files, scale is taken equal to 256*256*254 / (size + 0.2) where size is the largest dimension of the bounding box of the packed shape.</add> <add name="Old MOPP Data" ver2="10.0.1.0" type="byte" binary="1" arr1="MOPP Data Size - 1">The tree of bounding volume data (old style, contains more than just the mopp script).</add> - <add name="Build Type" type="MoppDataBuildType" ver1="20.2.0.7" vercond="User Version >= 12">Tells if MOPP Data was organized into smaller chunks (PS3) or not (PC)</add> + <add name="Build Type" type="MoppDataBuildType" vercond="User Version 2 > 34">Tells if MOPP Data was organized into smaller chunks (PS3) or not (PC)</add> <add name="MOPP Data" ver1="10.0.1.2" type="byte" binary="1" arr1="MOPP Data Size">The tree of bounding volume data.</add> </niobject> @@ -2696,7 +2706,7 @@ <niobject name="NiObjectNET" abstract="1" inherit="NiObject"> Abstract base class for NiObjects that support names, extra data, and time controllers. - <add name="Skyrim Shader Type" type="BSLightingShaderPropertyShaderType" vercond="User Version >= 12" cond="BSLightingShaderProperty">Configures the main shader path</add> + <add name="Skyrim Shader Type" type="BSLightingShaderPropertyShaderType" vercond="User Version 2 >= 83" cond="BSLightingShaderProperty">Configures the main shader path</add> <add name="Name" type="string">Name of this controllable object, used to refer to the object in .kf files.</add> <add name="Has Old Extra Data" type="bool" ver2="2.3">Extra data for pre-3.0 versions.</add> <add name="Old Extra Prop Name" cond="Has Old Extra Data" ver2="2.3" type="string">(=NiStringExtraData)</add> @@ -2769,14 +2779,14 @@ <niobject name="NiAVObject" abstract="1" inherit="NiObjectNET"> Abstract audio-visual base class from which all of Gamebryo's scene graph objects inherit. - <add name="Flags" type="uint" default="14" vercond="(Version == 20.2.0.7) && (User Version >= 11) && (User Version 2 > 26)">Basic flags for AV objects. For Bethesda streams above 26 only.</add> - <add name="Flags" type="Flags" ver1="3.0" vercond="!((Version == 20.2.0.7) && (User Version >= 11) && (User Version 2 > 26))">Basic flags for AV objects; commonly 0x000C or 0x000A.</add> + <add name="Flags" type="uint" default="14" vercond="(User Version 2 > 26)">Basic flags for AV objects. For Bethesda streams above 26 only.</add> + <add name="Flags" type="Flags" ver1="3.0" vercond="(User Version 2 <= 26)">Basic flags for AV objects; commonly 0x000C or 0x000A.</add> <add name="Translation" type="Vector3">The translation vector.</add> <add name="Rotation" type="Matrix33">The rotation part of the transformation matrix.</add> <add name="Scale" type="float" default="1.0">Scaling part (only uniform scaling is supported).</add> <add name="Velocity" type="Vector3" ver2="4.2.2.0">Unknown function. Always seems to be (0, 0, 0)</add> - <add name="Num Properties" type="uint" vercond="((Version < 20.2.0.7) || (User Version <= 11))" /> - <add name="Properties" type="Ref" template="NiProperty" arr1="Num Properties" vercond="((Version < 20.2.0.7) || (User Version <= 11))">All rendering properties attached to this object.</add> + <add name="Num Properties" type="uint" vercond="(User Version 2 <= 34)" /> + <add name="Properties" type="Ref" template="NiProperty" arr1="Num Properties" vercond="(User Version 2 <= 34)">All rendering properties attached to this object.</add> <add name="Unknown 1" type="uint" arr1="4" ver2="2.3">Always 2,0,2,0.</add> <add name="Unknown 2" type="byte" ver2="2.3">0 or 1.</add> <add name="Has Bounding Box" type="bool" ver1="3.0" ver2="4.2.2.0" /> @@ -2881,8 +2891,8 @@ <add name="Num Interpolators" type="uint" ver1="10.1.0.106" /> <add name="Interpolators" type="Ref" template="NiInterpolator" arr1="Num Interpolators" ver1="10.1.0.106" ver2="20.0.0.5" /> <add name="Interpolator Weights" type="MorphWeight" arr1="Num Interpolators" ver1="20.1.0.3" /> - <add name="Num Unknown Ints" type="uint" ver1="20.0.0.4" ver2="20.0.0.5" vercond="(User Version >= 10)" /> - <add name="Unknown Ints" type="uint" arr1="Num Unknown Ints" ver1="20.0.0.4" ver2="20.0.0.5" vercond="(User Version >= 10)">Unknown.</add> + <add name="Num Unknown Ints" type="uint" ver1="20.0.0.4" ver2="20.0.0.5" vercond="(User Version 2 > 0)" /> + <add name="Unknown Ints" type="uint" arr1="Num Unknown Ints" ver1="20.0.0.4" ver2="20.0.0.5" vercond="(User Version 2 > 0)">Unknown.</add> </niobject> <niobject name="NiMorphController" abstract="0" inherit="NiInterpController"> @@ -3089,27 +3099,40 @@ <niobject name="NiBSBoneLODController" abstract="0" inherit="NiBoneLODController"> A simple LOD controller for bones. </niobject> - - <niobject name="NiGeometry" abstract="1" inherit="NiAVObject"> - Describes a visible scene element with vertices like a mesh, a particle system, lines, etc. - <add name="Data" type="Ref" template="NiGeometryData" vercond="!((Version == 20.2.0.7) && (User Version 2 >= 100))">Data index (NiTriShapeData/NiTriStripData).</add> - <add name="Data" type="Ref" template="NiGeometryData" vercond="(Version == 20.2.0.7) && (User Version 2 >= 100)" cond="!NiParticleSystem">Data index (NiTriShapeData/NiTriStripData).</add> - <add name="Data" suffix="BSPS" type="uint" vercond="(Version == 20.2.0.7) && (User Version 2 >= 100)" cond="NiParticleSystem">Data index (NiTriShapeData/NiTriStripData).</add> - <add name="Skin Instance" type="Ref" template="NiSkinInstance" vercond="(Version >= 3.3.0.13) && !((Version == 20.2.0.7) && (User Version 2 >= 100))">Skin instance index.</add> - <add name="Skin Instance" type="Ref" template="NiSkinInstance" vercond="(Version == 20.2.0.7) && (User Version 2 >= 100)" cond="!NiParticleSystem">Skin instance index.</add> - <add name="Skin Instance" suffix="BSPS" type="uint" vercond="(Version == 20.2.0.7) && (User Version 2 >= 100)" cond="NiParticleSystem">Skin instance index.</add> + + <compound name="GeomMaterialData"> + <add name="Has Shader" type="bool" ver1="10.0.1.0" ver2="20.1.0.3">Shader.</add> + <add name="Shader Name" type="string" cond="Has Shader" ver1="10.0.1.0" ver2="20.1.0.3">The shader name.</add> + <add name="Unknown Integer" type="int" cond="Has Shader" ver1="10.0.1.0" ver2="20.1.0.3">Unknown value, usually -1. (Not a link)</add> <add name="Num Materials" type="uint" ver1="20.2.0.7">Num Materials</add> <add name="Material Name" type="string" arr1="Num Materials" ver1="20.2.0.7">Unknown string. Shader?</add> <add name="Material Extra Data" type="int" arr1="Num Materials" ver1="20.2.0.7">Unknown integer; often -1. (Is this a link, array index?)</add> <add name="Active Material" type="int" ver1="20.2.0.7" default="0">Active Material; often -1. (Is this a link, array index?)</add> - <add name="Has Shader" type="bool" ver1="10.0.1.0" ver2="20.1.0.3">Shader.</add> - <add name="Shader Name" type="string" cond="Has Shader" ver1="10.0.1.0" ver2="20.1.0.3">The shader name.</add> - <add name="Unknown Integer" type="int" cond="Has Shader" ver1="10.0.1.0" ver2="20.1.0.3">Unknown value, usually -1. (Not a link)</add> + </compound> + + <niobject name="NiGeometry" abstract="1" inherit="NiAVObject"> + Describes a visible scene element with vertices like a mesh, a particle system, lines, etc. + <!-- Bethesda 20.2.0.7 NIFs: NiGeometry was changed to BSGeometry. + Most new blocks (e.g. BSTriShape) do not refer to NiGeometry except NiParticleSystem was changed to use BSGeometry. + This causes massive inheritance problems so the rows below are doubled up to exclude NiParticleSystem for Bethesda Stream 100+. + --> + <!-- BSGeometry: Used by Bethesda Stream 100+ NiParticleSystem --> + <add name="Bound" type="NiBound" vercond="(User Version 2 >= 100)" cond="NiParticleSystem" /> + <add name="Skin" type="Ref" template="NiObject" vercond="(User Version 2 >= 100)" cond="NiParticleSystem" /> + <!-- NiGeometry: Each row is doubled in order to exclude NiParticleSystem for Bethesda Stream 100+ --> + <add name="Data" type="Ref" template="NiGeometryData" vercond="(User Version 2 < 100)">Data index (NiTriShapeData/NiTriStripData).</add> + <add name="Data" type="Ref" template="NiGeometryData" vercond="(User Version 2 >= 100)" cond="!NiParticleSystem">Data index (NiTriShapeData/NiTriStripData).</add> + <add name="Skin Instance" type="Ref" template="NiSkinInstance" ver1="3.3.0.13" vercond="(User Version 2 < 100)" /> + <add name="Skin Instance" type="Ref" template="NiSkinInstance" vercond="(User Version 2 >= 100)" cond="!NiParticleSystem" /> + <add name="Material Data" type="GeomMaterialData" ver1="10.0.1.0" vercond="(User Version 2 < 100)" /> + <add name="Material Data" type="GeomMaterialData" ver1="10.0.1.0" vercond="(User Version 2 >= 100)" cond="!NiParticleSystem" /> + <!-- Custom Versions --> <add name="Unknown Byte" type="byte" default="255" userver="1">Cyanide extension (only in version 10.2.0.0?).</add> <add name="Unknown Integer 2" type="int" ver1="10.4.0.1" ver2="10.4.0.1">Unknown.</add> - <add name="Dirty Flag" type="bool" vercond="(Version >= 20.2.0.7) && (User Version 2 < 100)">Dirty Flag?</add> - <add name="Dirty Flag" type="bool" cond="NiTriBasedGeom" vercond="(Version == 20.2.0.7) && (User Version 2 == 100)">Dirty Flag?</add> - <add name="Unknown Integer 3" type="int" cond="NiParticleSystem" vercond="(Version == 20.2.0.7) && (User Version 2 >= 100)">Dirty Flag?</add> + <!-- / Custom --> + <add name="Dirty Flag" type="bool" ver1="20.2.0.7" vercond="(User Version 2 < 100)" /> + <add name="Dirty Flag" type="bool" ver1="20.2.0.7" vercond="(User Version 2 >= 100)" cond="!NiParticleSystem" /> + <!-- Bethesda --> <add name="BS Properties" type="Ref" template="NiProperty" arr1="2" ver1="20.2.0.7" userver="12">Two property links, used by Bethesda.</add> </niobject> @@ -3157,25 +3180,30 @@ <niobject name="NiGeometryData" abstract="1" inherit="NiObject"> Mesh data: vertices, vertex normals, etc. + <!-- Bethesda 20.2.0.7 NIFs: NiParticlesData no longer inherits from NiGeometryData and inherits NiObject directly. + "Num Vertices" is renamed to "BS Max Vertices" for Bethesda 20.2 because Vertices, Normals, Tangents, Colors, and UV arrays + do not have length for NiPSysData regardless of "Num" or booleans. + --> <add name="Unknown Int" type="int" ver1="10.2.0.0">Unknown identifier. Always 0.</add> - <!-- special case for Bethesda PSysData (or NiParticlesData?) in Fallout 3 and higher --> <add name="Num Vertices" type="ushort" cond="!NiPSysData">Number of vertices.</add> - <add name="Num Vertices" type="ushort" cond="NiPSysData" vercond="(Version < 20.2.0.7) || (User Version < 11)">Number of vertices.</add> - <add name="BS Max Vertices" type="ushort" cond="NiPSysData" vercond="(Version >= 20.2.0.7) && (User Version >= 11)">Bethesda uses this for max number of particles in NiPSysData.</add> + <add name="Num Vertices" type="ushort" cond="NiPSysData" vercond="(User Version 2 < 34)">Number of vertices.</add> + <add name="BS Max Vertices" type="ushort" cond="NiPSysData" vercond="(User Version 2 >= 34)">Bethesda uses this for max number of particles in NiPSysData.</add> <add name="Keep Flags" type="byte" ver1="10.1.0.0">Used with NiCollision objects when OBB or TRI is set.</add> <add name="Compress Flags" type="byte" ver1="10.1.0.0">Unknown.</add> <add name="Has Vertices" type="bool" default="1">Is the vertex array present? (Always non-zero.)</add> <add name="Vertices" type="Vector3" arr1="Num Vertices" cond="Has Vertices">The mesh vertices.</add> - <add name="Vector Flags" type="VectorFlags" vercond="((Version >= 10.0.1.0) && (Version != 20.2.0.7))" /> - <add name="BS Vector Flags" type="BSVectorFlags" vercond="(Version == 20.2.0.7)" /> - <add name="Unknown Int 2" type="uint" ver1="20.2.0.7" userver="12" cond="!NiPSysData">Unknown, seen in Skyrim.</add> + <add name="Vector Flags" type="VectorFlags" ver1="10.0.1.0" vercond="!((Version == 20.2.0.7) && (User Version 2 > 0))" /> + <add name="BS Vector Flags" type="BSVectorFlags" vercond="((Version == 20.2.0.7) && (User Version 2 > 0))" /> + <add name="Material CRC" type="uint" ver1="20.2.0.7" ver2="20.2.0.7" userver="12" /> <add name="Has Normals" type="bool">Do we have lighting normals? These are essential for proper lighting: if not present, the model will only be influenced by ambient light.</add> <add name="Normals" type="Vector3" arr1="Num Vertices" cond="Has Normals">The lighting normals.</add> <add name="Tangents" type="Vector3" arr1="Num Vertices" cond="(Has Normals) && ((Vector Flags | BS Vector Flags) & 4096)" ver1="10.1.0.0">Tangent vectors.</add> <add name="Bitangents" type="Vector3" arr1="Num Vertices" cond="(Has Normals) && ((Vector Flags | BS Vector Flags) & 4096)" ver1="10.1.0.0">Bitangent vectors.</add> + <!-- TODO: NiBound --> <add name="Center" type="Vector3">Center of the bounding box (smallest box that contains all vertices) of the mesh.</add> <add name="Radius" type="float">Radius of the mesh: maximal Euclidean distance between the center and all vertices.</add> <add name="Unknown 13 shorts" type="short" arr1="13" ver1="20.3.0.9" ver2="20.3.0.9" userver="131072">Unknown, always 0?</add> + <!-- / NiBound --> <add name="Has Vertex Colors" type="bool"> Do we have vertex colors? These are usually used to fine-tune the lighting of the model. @@ -3191,10 +3219,8 @@ Note: for compatibility with NifTexture, set this value to either 0x00000000 or 0xFFFFFFFF. </add> <add name="UV Sets" type="TexCoord" arr1="((Num UV Sets & 63) | (Vector Flags & 63) | (BS Vector Flags & 1))" arr2="Num Vertices">The UV texture coordinates. They follow the OpenGL standard: some programs may require you to flip the second coordinate.</add> - <add name="Consistency Flags" type="ConsistencyType" ver1="10.0.1.0" default="CT_MUTABLE" vercond="User Version < 12">Consistency Flags</add> - <add name="Consistency Flags" type="ConsistencyType" ver1="10.0.1.0" default="CT_MUTABLE" vercond="User Version >= 12" cond="!NiPSysData">Consistency Flags</add> - <add name="Additional Data" type="Ref" template="AbstractAdditionalGeometryData" ver1="20.0.0.4" vercond="User Version < 12">Unknown.</add> - <add name="Additional Data" type="Ref" template="AbstractAdditionalGeometryData" ver1="20.0.0.4" vercond="User Version >= 12" cond="!NiPSysData">Unknown.</add> + <add name="Consistency Flags" type="ConsistencyType" ver1="10.0.1.0" default="CT_MUTABLE">Consistency Flags</add> + <add name="Additional Data" type="Ref" template="AbstractAdditionalGeometryData" ver1="20.0.0.4">Unknown.</add> </niobject> <niobject name="AbstractAdditionalGeometryData" abstract="1" inherit="NiObject"> @@ -3291,25 +3317,32 @@ <niobject name="NiParticlesData" abstract="0" inherit="NiGeometryData"> Generic rotating particles data object. + <!-- Bethesda 20.2.0.7 NIFs: NiParticlesData no longer inherits from NiGeometryData and inherits NiObject directly. + `!((Version == 20.2.0.7) && (User Version 2 > 0))` means "Not Bethesda 20.2" + --> <add name="Num Particles" type="ushort" ver2="4.0.0.2">The maximum number of particles (matches the number of vertices).</add> <add name="Particle Radius" type="float" ver2="10.0.1.0">The particles' size.</add> <add name="Has Radii" type="bool" ver1="10.1.0.0">Is the particle size array present?</add> - <add name="Radii" type="float" arr1="Num Vertices" cond="Has Radii" ver1="10.1.0.0" vercond="!((Version >= 20.2.0.7) && (User Version >= 11))">The individual particel sizes.</add> + <add name="Radii" type="float" arr1="Num Vertices" cond="Has Radii" ver1="10.1.0.0" vercond="!((Version == 20.2.0.7) && (User Version 2 > 0))">The individual particle sizes.</add> <add name="Num Active" type="ushort">The number of active particles at the time the system was saved. This is also the number of valid entries in the following arrays.</add> <add name="Has Sizes" type="bool">Is the particle size array present?</add> - <add name="Sizes" type="float" arr1="Num Vertices" cond="Has Sizes" vercond="!((Version >= 20.2.0.7) && (User Version >= 11))">The individual particel sizes.</add> + <add name="Sizes" type="float" arr1="Num Vertices" cond="Has Sizes" vercond="!((Version == 20.2.0.7) && (User Version 2 > 0))">The individual particle sizes.</add> <add name="Has Rotations" type="bool" ver1="10.0.1.0">Is the particle rotation array present?</add> - <add name="Rotations" type="Quaternion" arr1="Num Vertices" cond="Has Rotations" ver1="10.0.1.0" vercond="!((Version >= 20.2.0.7) && (User Version >= 11))">The individual particle rotations.</add> - <add name="Unknown Byte 1" type="byte" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Unknown, probably a boolean.</add> - <add name="Unknown Link" type="Ref" template="NiObject" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Unknown</add> + <add name="Rotations" type="Quaternion" arr1="Num Vertices" cond="Has Rotations" ver1="10.0.1.0" vercond="!((Version == 20.2.0.7) && (User Version 2 > 0))">The individual particle rotations.</add> <add name="Has Rotation Angles" type="bool" ver1="20.0.0.4">Are the angles of rotation present?</add> - <add name="Rotation Angles" type="float" arr1="Num Vertices" cond="Has Rotation Angles" vercond="!((Version >= 20.2.0.7) && (User Version >= 11))">Angles of rotation</add> + <add name="Rotation Angles" type="float" arr1="Num Vertices" cond="Has Rotation Angles" vercond="!((Version == 20.2.0.7) && (User Version 2 > 0))">Angles of rotation</add> <add name="Has Rotation Axes" type="bool" ver1="20.0.0.4">Are axes of rotation present?</add> - <add name="Rotation Axes" type="Vector3" arr1="Num Vertices" cond="Has Rotation Axes" ver1="20.0.0.4" vercond="!((Version >= 20.2.0.7) && (User Version >= 11))">Unknown</add> - <add name="Has UV Quadrants" type="bool" vercond="(Version >= 20.2.0.7) && (User Version == 11)">if value is no, a single image rendered</add> - <add name="Num UV Quadrants" type="byte" vercond="(Version >= 20.2.0.7) && (User Version == 11)">2,4,8,16,32,64 are potential values. If "Has" was no then this should be 256, which represents a 16x16 framed image, which is invalid</add> - <add name="UV Quadrants" type="Vector4" arr1="Num UV Quadrants" cond="Has UV Quadrants" vercond="(Version >= 20.2.0.7) && (User Version == 11)"></add> - <add name="Unknown Byte 2" type="byte" vercond="(Version == 20.2.0.7) && (User Version >= 11)">Unknown</add> + <add name="Rotation Axes" type="Vector3" arr1="Num Vertices" cond="Has Rotation Axes" ver1="20.0.0.4" vercond="!((Version == 20.2.0.7) && (User Version 2 > 0))">Axes of rotation.</add> + <!-- Bethesda --> + <add name="Has Texture Indices" type="bool" vercond="((Version == 20.2.0.7) && (User Version 2 > 0))" /> + <add name="Num Subtexture Offsets" type="uint" vercond="(User Version 2 > 34)">How many quads to use in BSPSysSubTexModifier for texture atlasing</add> + <add name="Num Subtexture Offsets" type="byte" vercond="(Version == 20.2.0.7) && (User Version 2 <= 34)">2,4,8,16,32,64 are potential values. If "Has" was no then this should be 256, which represents a 16x16 framed image, which is invalid</add> + <add name="Subtexture Offsets" type="Vector4" arr1="Num Subtexture Offsets" vercond="((Version == 20.2.0.7) && (User Version 2 > 0))">Defines UV offsets</add> + <add name="Aspect Ratio" type="float" vercond="(User Version 2 > 34)">Sets aspect ratio for Subtexture Offset UV quads</add> + <add name="Aspect Flags" type="ushort" vercond="(User Version 2 > 34)" /> + <add name="Speed to Aspect Aspect 2" type="float" vercond="(User Version 2 > 34)" /> + <add name="Speed to Aspect Speed 1" type="float" vercond="(User Version 2 > 34)" /> + <add name="Speed to Aspect Speed 2" type="float" vercond="(User Version 2 > 34)" /> </niobject> <niobject name="NiRotatingParticlesData" abstract="0" inherit="NiParticlesData"> @@ -3334,21 +3367,12 @@ <niobject name="NiPSysData" abstract="0" inherit="NiParticlesData"> Particle system data. - <add name="Particle Descriptions" type="ParticleDesc" arr1="Num Vertices" vercond="!((Version >= 20.2.0.7) && (User Version >= 11))">Unknown.</add> - <add name="Has Unknown Floats 3" type="bool" ver1="20.0.0.4" vercond="!((Version >= 20.2.0.7) && (User Version >= 11))">Unknown.</add> - <add name="Unknown Floats 3" type="float" arr1="Num Vertices" cond="Has Unknown Floats 3" ver1="20.0.0.4" vercond="!((Version >= 20.2.0.7) && (User Version >= 11))">Unknown.</add> - <add name="Unknown Short 1" type="ushort" vercond="!((Version >= 20.2.0.7) && (User Version == 11))">Unknown.</add> - <add name="Unknown Short 2" type="ushort" vercond="!((Version >= 20.2.0.7) && (User Version == 11))">Unknown.</add> - - <add name="Has Subtexture Offset UVs" type="bool" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Boolean for Num Subtexture Offset UVs</add> - <add name="Num Subtexture Offset UVs" type="uint" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">How many quads to use in BSPSysSubTexModifier for texture atlasing</add> - <add name="Aspect Ratio" type="float" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Sets aspect ratio for Subtexture Offset UV quads</add> - <add name="Subtexture Offset UVs" type="Vector4" arr1="Num Subtexture Offset UVs" cond="Has Subtexture Offset UVs" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Defines UV offsets</add> - <add name="Unknown Int 4" type="uint" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Unknown</add> - <add name="Unknown Int 5" type="uint" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Unknown</add> - <add name="Unknown Int 6" type="uint" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Unknown</add> - <add name="Unknown Short 3" type="ushort" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Unknown</add> - <add name="Unknown Byte 4" type="byte" vercond="((Version >= 20.2.0.7) && (User Version >= 12))">Unknown</add> + <!-- `!((Version == 20.2.0.7) && (User Version 2 > 0))` means "Not Bethesda 20.2" --> + <add name="Particle Descriptions" type="ParticleDesc" arr1="Num Vertices" vercond="!((Version == 20.2.0.7) && (User Version 2 > 0))" /> + <add name="Has Rotation Speeds" type="bool" ver1="20.0.0.2" /> + <add name="Rotation Speeds" type="float" arr1="Num Vertices" cond="Has Rotation Speeds" ver1="20.0.0.2" vercond="!((Version == 20.2.0.7) && (User Version 2 > 0))" /> + <add name="Num Added Particles" type="ushort" vercond="!((Version == 20.2.0.7) && (User Version 2 > 0))" /> + <add name="Added Particles Base" type="ushort" vercond="!((Version == 20.2.0.7) && (User Version 2 > 0))" /> </niobject> <niobject name="NiMeshPSysData" abstract="0" inherit="NiPSysData"> @@ -3539,9 +3563,9 @@ <add name="Accum Flags" type="AccumFlags" ver1="20.3.0.8" default="ACCUM_X_FRONT" /> <add name="String Palette" type="Ref" template="NiStringPalette" ver1="10.1.0.113" ver2="20.1.0.0" /> <!-- Bethesda --> - <add name="Anim Notes" type="Ref" template="BSAnimNotes" ver1="20.2.0.7" vercond="(User Version >= 11) && (User Version 2 >= 24) && (User Version 2 <= 28)" /> - <add name="Num Anim Note Arrays" type="ushort" ver1="20.2.0.7" vercond="(User Version >= 11) && (User Version 2 > 28)" /> - <add name="Anim Note Arrays" type="Ref" template="BSAnimNotes" arr1="Num Anim Note Arrays" ver1="20.2.0.7" vercond="(User Version >= 11) && (User Version 2 > 28)" /> + <add name="Anim Notes" type="Ref" template="BSAnimNotes" ver1="20.2.0.7" vercond="(User Version 2 >= 24) && (User Version 2 <= 28)" /> + <add name="Num Anim Note Arrays" type="ushort" ver1="20.2.0.7" vercond="(User Version 2 > 28)" /> + <add name="Anim Note Arrays" type="Ref" template="BSAnimNotes" arr1="Num Anim Note Arrays" ver1="20.2.0.7" vercond="(User Version 2 > 28)" /> </niobject> <niobject name="NiAVObjectPalette" abstract="1" inherit="NiObject"> @@ -3680,13 +3704,13 @@ <niobject name="NiMaterialProperty" abstract="0" inherit="NiProperty"> Describes the surface properties of an object e.g. translucency, ambient color, diffuse color, emissive color, and specular color. <add name="Flags" type="Flags" ver1="3.0" ver2="10.0.1.2">Property flags.</add> - <add name="Ambient Color" type="Color3" vercond="!((Version == 20.2.0.7) && (User Version >= 11) && (User Version 2 > 21))">How much the material reflects ambient light.</add> - <add name="Diffuse Color" type="Color3" vercond="!((Version == 20.2.0.7) && (User Version >= 11) && (User Version 2 > 21))">How much the material reflects diffuse light.</add> + <add name="Ambient Color" type="Color3" vercond="(User Version 2 < 26)">How much the material reflects ambient light.</add> + <add name="Diffuse Color" type="Color3" vercond="(User Version 2 < 26)">How much the material reflects diffuse light.</add> <add name="Specular Color" type="Color3">How much light the material reflects in a specular manner.</add> <add name="Emissive Color" type="Color3">How much light the material emits.</add> <add name="Glossiness" type="float">The material glossiness.</add> <add name="Alpha" type="float">The material transparency (1=non-transparant). Refer to a NiAlphaProperty object in this material's parent NiTriShape object, when alpha is not 1.</add> - <add name="Emit Multi" type="float" default="1.0" vercond="(Version == 20.2.0.7) && (User Version >= 11) && (User Version 2 > 21)">Unknown</add> + <add name="Emissive Mult" type="float" default="1.0" vercond="(User Version 2 > 21)" /> </niobject> <niobject name="NiMorphData" abstract="0" inherit="NiObject"> @@ -3830,6 +3854,7 @@ <niobject name="NiParticles" abstract="0" inherit="NiGeometry"> Generic particle system node. + <add name="Vertex Desc" type="BSVertexDesc" vercond="(User Version 2 >= 100)" /> </niobject> <niobject name="NiAutoNormalParticles" abstract="0" inherit="NiParticles"> @@ -3847,13 +3872,14 @@ <niobject name="NiParticleSystem" abstract="0" inherit="NiParticles"> A particle system. - <add name="Unknown Short 2" type="ushort" vercond="User Version >= 12">Unknown</add> - <add name="Unknown Short 3" type="ushort" vercond="User Version >= 12">Unknown</add> - <add name="Unknown Int 1" type="uint" vercond="User Version >= 12">Unknown</add> - <add name="Unknown Int 2" type="int" vercond="(Version == 20.2.0.7) && (User Version 2 >= 100)">Unknown</add> - <add name="Unknown Int 3" type="int" vercond="(Version == 20.2.0.7) && (User Version 2 >= 100)">Unknown</add> - <add name="Data" type="Ref" template="NiPSysData" vercond="(Version == 20.2.0.7) && (User Version 2 >= 100)">Unknown</add> - <add name="World Space" type="bool" ver1="10.1.0.0">If true, Particles are birthed into world space. If false, Particles are birthed into object space.</add> + <!-- Bethesda --> + <add name="Far Begin" type="ushort" vercond="(User Version 2 >= 83)" /> + <add name="Far End" type="ushort" vercond="(User Version 2 >= 83)" /> + <add name="Near Begin" type="ushort" vercond="(User Version 2 >= 83)" /> + <add name="Near End" type="ushort" vercond="(User Version 2 >= 83)" /> + <add name="Data" type="Ref" template="NiPSysData" vercond="(User Version 2 >= 100)" /> + <!-- / Bethesda --> + <add name="World Space" type="bool" ver1="10.1.0.0">If true, Particles are birthed into world space. If false, Particles are birthed into object space.</add> <add name="Num Modifiers" type="uint" ver1="10.1.0.0">The number of modifier references.</add> <add name="Modifiers" type="Ref" template="NiPSysModifier" arr1="Num Modifiers" ver1="10.1.0.0">The list of particle modifiers.</add> </niobject> @@ -4094,7 +4120,7 @@ <add name="Force Type" type="ForceType">The type of gravitational force.</add> <add name="Turbulence" type="float">Adds a degree of randomness.</add> <add name="Turbulence Scale" type="float" default="1.0">Scale for turbulence.</add> - <add name="World Aligned" type="bool" ver1="20.2.0.7" vercond="User Version >= 11" /> + <add name="World Aligned" type="bool" vercond="User Version 2 > 16" /> </niobject> <niobject name="NiPSysGrowFadeModifier" abstract="0" inherit="NiPSysModifier"> @@ -4103,7 +4129,7 @@ <add name="Grow Generation" type="ushort">Specifies the particle generation to which the grow effect should be applied. This is usually generation 0, so that newly created particles will grow.</add> <add name="Fade Time" type="float">The time taken to shrink from their specified size to 0.</add> <add name="Fade Generation" type="ushort">Specifies the particle generation to which the shrink effect should be applied. This is usually the highest supported generation for the particle system.</add> - <add name="Base Scale" type="float" ver1="20.2.0.7" userver="11">A multiplier on the base particle scale.</add> + <add name="Base Scale" type="float" vercond="User Version 2 >= 34">A multiplier on the base particle scale.</add> </niobject> <niobject name="NiPSysMeshEmitter" abstract="0" inherit="NiPSysEmitter"> @@ -5337,31 +5363,32 @@ <add name="Shader Type" type="BSShaderType" default="SHADER_DEFAULT" /> <add name="Shader Flags" type="BSShaderFlags" default="0x82000000" /> <add name="Shader Flags 2" type="BSShaderFlags2" default="1" /> - <add name="Environment Map Scale" type="float" default="1.0" vercond="User Version == 11">Scales the intensity of the environment/cube map.</add> + <add name="Environment Map Scale" type="float" default="1.0" vercond="(User Version 2 <= 34)">Scales the intensity of the environment/cube map.</add> </niobject> <niobject name="BSShaderLightingProperty" abstract="1" inherit="BSShaderProperty"> Bethesda-specific property. - <add name="Texture Clamp Mode" type="TexClampMode" default="3" vercond="User Version <= 11">How to handle texture borders.</add> + <add name="Texture Clamp Mode" type="TexClampMode" default="3" vercond="(User Version 2 <= 34)">How to handle texture borders.</add> </niobject> <niobject name="BSShaderNoLightingProperty" abstract="0" inherit="BSShaderLightingProperty"> Bethesda-specific property. <add name="File Name" type="SizedString">The texture glow map.</add> - <add name="Falloff Start Angle" type="float" default="1.0" vercond="(User Version >= 11) && (User Version 2 > 26)">At this cosine of angle falloff will be equal to Falloff Start Opacity</add> - <add name="Falloff Stop Angle" type="float" default="0.0" vercond="(User Version >= 11) && (User Version 2 > 26)">At this cosine of angle falloff will be equal to Falloff Stop Opacity</add> - <add name="Falloff Start Opacity" type="float" default="1.0" vercond="(User Version >= 11) && (User Version 2 > 26)">Alpha falloff multiplier at start angle</add> - <add name="Falloff Stop Opacity" type="float" default="0.0" vercond="(User Version >= 11) && (User Version 2 > 26)">Alpha falloff multiplier at end angle</add> + <add name="Falloff Start Angle" type="float" default="1.0" vercond="(User Version 2 > 26)">At this cosine of angle falloff will be equal to Falloff Start Opacity</add> + <add name="Falloff Stop Angle" type="float" default="0.0" vercond="(User Version 2 > 26)">At this cosine of angle falloff will be equal to Falloff Stop Opacity</add> + <add name="Falloff Start Opacity" type="float" default="1.0" vercond="(User Version 2 > 26)">Alpha falloff multiplier at start angle</add> + <add name="Falloff Stop Opacity" type="float" default="0.0" vercond="(User Version 2 > 26)">Alpha falloff multiplier at end angle</add> </niobject> <niobject name="BSShaderPPLightingProperty" abstract="0" inherit="BSShaderLightingProperty"> Bethesda-specific property. <add name="Texture Set" type="Ref" template="BSShaderTextureSet">Texture Set</add> - <add name="Refraction Strength" type="float" default="0.0" vercond="(User Version == 11) && (User Version 2 > 14)">The amount of distortion. **Not based on physically accurate refractive index** (0=none) (0-1)</add> - <add name="Refraction Fire Period" type="int" default="0" vercond="(User Version == 11) && (User Version 2 > 14)">Rate of texture movement for refraction shader.</add> - <add name="Parallax Max Passes" type="float" default="4.0" vercond="(User Version == 11) && (User Version 2 > 24)">The number of passes the parallax shader can apply.</add> - <add name="Parallax Scale" type="float" default="1.0" vercond="(User Version == 11) && (User Version 2 > 24)">The strength of the parallax.</add> - <add name="Emissive Color" type="Color4" vercond="User Version >= 12">Glow color and alpha</add> + <add name="Refraction Strength" type="float" default="0.0" vercond="(User Version 2 > 14)">The amount of distortion. **Not based on physically accurate refractive index** (0=none) (0-1)</add> + <add name="Refraction Fire Period" type="int" default="0" vercond="(User Version 2 > 14)">Rate of texture movement for refraction shader.</add> + <add name="Parallax Max Passes" type="float" default="4.0" vercond="(User Version 2 > 24)">The number of passes the parallax shader can apply.</add> + <add name="Parallax Scale" type="float" default="1.0" vercond="(User Version 2 > 24)">The strength of the parallax.</add> + <!-- TODO: Find where this could have even come from as > 34 doesn't exist for this block. --> + <add name="Emissive Color" type="Color4" vercond="(User Version 2 > 34)">Glow color and alpha</add> </niobject> <!-- Skyrim specific Node --> @@ -5632,7 +5659,7 @@ <add name="Texture Set" type="Ref" template="BSShaderTextureSet">Texture Set, can have override in an esm/esp</add> <add name="Emissive Color" type="Color3">Glow color and alpha</add> <add name="Emissive Multiple" type="float">Multiplied emissive colors</add> - <add name="Wet Material" type="string" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> + <add name="Wet Material" type="string" vercond="(User Version 2 == 130)" /> <add name="Texture Clamp Mode" type="TexClampMode">How to handle texture borders.</add> <add name="Alpha" type="float" default="1.0">The material opacity (1=non-transparent).</add> <add name="Refraction Strength" type="float">The amount of distortion. **Not based on physically accurate refractive index** (0=none) (0-1)</add> @@ -5641,21 +5668,21 @@ <add name="Specular Strength" type="float" default="1.0">Brightness of specular highlight. (0=not visible) (0-999)</add> <add name="Lighting Effect 1" type="float" vercond="User Version 2 < 130">Controls strength for envmap/backlight/rim/softlight lighting effect?</add> <add name="Lighting Effect 2" type="float" vercond="User Version 2 < 130">Controls strength for envmap/backlight/rim/softlight lighting effect?</add> - <add name="Subsurface Rolloff" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Unknown Float 1" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Backlight Power" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Grayscale to Palette Scale" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Fresnel Power" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Wetness Spec Scale" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Wetness Spec Power" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Wetness Min Var" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Wetness Env Map Scale" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Wetness Fresnel Power" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Wetness Metalness" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> + <add name="Subsurface Rolloff" type="float" vercond="(User Version 2 == 130)" /> + <add name="Unknown Float 1" type="float" vercond="(User Version 2 == 130)" /> + <add name="Backlight Power" type="float" vercond="(User Version 2 == 130)" /> + <add name="Grayscale to Palette Scale" type="float" vercond="(User Version 2 == 130)" /> + <add name="Fresnel Power" type="float" vercond="(User Version 2 == 130)" /> + <add name="Wetness Spec Scale" type="float" vercond="(User Version 2 == 130)" /> + <add name="Wetness Spec Power" type="float" vercond="(User Version 2 == 130)" /> + <add name="Wetness Min Var" type="float" vercond="(User Version 2 == 130)" /> + <add name="Wetness Env Map Scale" type="float" vercond="(User Version 2 == 130)" /> + <add name="Wetness Fresnel Power" type="float" vercond="(User Version 2 == 130)" /> + <add name="Wetness Metalness" type="float" vercond="(User Version 2 == 130)" /> <add name="Environment Map Scale" type="float" cond="Skyrim Shader Type == 1">Scales the intensity of the environment/cube map. (0-1)</add> - <add name="Unknown Env Map Short" type="ushort" cond="Skyrim Shader Type == 1" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> + <add name="Unknown Env Map Short" type="ushort" cond="Skyrim Shader Type == 1" vercond="(User Version 2 == 130)" /> <add name="Skin Tint Color" type="Color3" cond="Skyrim Shader Type == 5">Tints the base texture. Overridden by game settings.</add> - <add name="Unknown Skin Tint Int" type="uint" cond="Skyrim Shader Type == 5" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> + <add name="Unknown Skin Tint Int" type="uint" cond="Skyrim Shader Type == 5" vercond="(User Version 2 == 130)" /> <add name="Hair Tint Color" type="Color3" cond="Skyrim Shader Type == 6">Tints the base texture. Overridden by game settings.</add> <add name="Max Passes" type="float" cond="Skyrim Shader Type == 7">Max Passes</add> <add name="Scale" type="float" cond="Skyrim Shader Type == 7">Scale</add> @@ -5690,10 +5717,10 @@ <add name="Emissive Multiple" type="float">Multiplier for Emissive Color (RGB part)</add> <add name="Soft Falloff Depth" type="float"></add> <add name="Greyscale Texture" type="SizedString">Points to an external texture, used as palette for SLSF1_Greyscale_To_PaletteColor/SLSF1_Greyscale_To_PaletteAlpha.</add> - <add name="Env Map Texture" type="SizedString" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Normal Texture" type="SizedString" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Env Mask Texture" type="SizedString" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> - <add name="Environment Map Scale" type="float" vercond="(Version == 20.2.0.7) && (User Version 2 == 130)" /> + <add name="Env Map Texture" type="SizedString" vercond="(User Version 2 == 130)" /> + <add name="Normal Texture" type="SizedString" vercond="(User Version 2 == 130)" /> + <add name="Env Mask Texture" type="SizedString" vercond="(User Version 2 == 130)" /> + <add name="Environment Map Scale" type="float" vercond="(User Version 2 == 130)" /> </niobject> <bitflags name="SkyrimWaterShaderFlags" storage="byte"> -- GitLab