About this mod
A SSEEdit script to export textures usage and data. You will know what textures are missing for your meshes, metadata from existant textures, their usage and where they are installed.
- Requirements
- Permissions and credits
- Changelogs
How to use
On SSEEdit, right click on any esp and select "Apply script", then select the script "Export textures usage and data.pas", you see the interface below (after you select 'Apply script', BE SURE TO NOT SAVE when prompted, it's a very common mistake to type something on the script and save it after):
You can process your entire load order, or select a mod directory. If you select your load order, the script will analyze each mesh installed, on Data\ and all .BSAs, then verify if the textures are found in any containers, and tell you where they were found.
If you select a mod directory, the mod meshes will be analyzed and you will know if the meshes inside that directory uses textures that can be found in your game installation or not. For a mod directory, select one that contains textures/ and meshes/ subdirectories.
You will have to wait more than an hour if you have a big load order and select to analyze it. To run the script on a mod directory, it can take one or two minutes on medium sized mods, seconds on smaller ones.
At the end of the processing, you should see an 'Exception Summary', a list of all errors occurred during meshes analysis, like this:
***** Exceptions summary *****
Exception processing mesh: Probably invalid Nif file, NifNumBlocks > 5000. Mesh ignored: meshes\effects\fxtg09nocturnalbirds.nif
******************************
Together with the SSEEdit script, I'm providing Powershell scripts to view and filter the resulting .CSVs files. All scripts have a parameter -csvDirectory, so you can specify where the .CSV files are.
Considering you have PS-Scripts subdirectory inside your SSEEdit directory, the csvs will be searched in the directory of SSEEdit (parent of PS-Scripts), then inside Output directory.
The directory structure would be like this:
Edit Scripts\
PS-Scripts\
Output\
SSEEdit.exe
get-texturesdata.ps1: for TexturesData.csv
get-missingtextures.ps1: for MissingTextures.csv
get-texturesusage.ps1: for TexturesUsage.csv
get-meshesdata.ps1: for MeshesData.csv
Output
Textures data (TexturesData.csv)
This list contains data about textures, the fields are the following:
Texture: texture filename
Format: texture format, textures not compressed will have the name "DDS Uncompressed"
Width: texture width
Height: texture height
Mipmap count: The number of mipmaps the texture have.
AlphaFlag: The alpha flag from 'HEADER\ddspf\dwFlags' or from 'HEADER_DXT10\miscFlags2', depends on texture format.
Container: where the texture was found
OverriddenContainers: other containers the texture was found, that was overridden by the one in the previous field.
Example:
Texture Format Width Height MipmapCount AlphaFlag Container OverriddenContainers
------- ------ ----- ------ ----------- --------- --------- --------------------
textures\!_rudy_misc\candle02.dds DXT3 2048 2048 12 Data\ {Lanterns Of Skyrim II - Textures.bsa}
textures\!_rudy_misc\candle02_g.dds DXT3 2048 2048 12 Data\ {Lanterns Of Skyrim II - Textures.bsa}
textures\!_rudy_misc\candle02_n.dds DXT5 2048 2048 12 Data\ {Lanterns Of Skyrim II - Textures.bsa}
textures\!_rudy_misc\candle02w.dds DXT5 1024 1024 11 Data\ {Lanterns Of Skyrim II - Textures.bsa}
textures\!_rudy_misc\red.dds DXT3 32 32 6 Data\ {Lanterns Of Skyrim II - Textures.bsa}
textures\_byoh\clothes\childrenc... DXGI_FORMAT_BC7_UNORM 4096 4096 13 DDS_ALPHA_MODE_UNKNOWN Data\ {Skyrim - Textures8.bsa}
textures\_byoh\clothes\childrenc... DXGI_FORMAT_BC7_UNORM 4096 4096 13 DDS_ALPHA_MODE_UNKNOWN Data\ {Skyrim - Textures8.bsa}
textures\_byoh\clothes\childrenc... DXT1 4096 4096 13 Data\ {Skyrim - Textures8.bsa}
textures\_byoh\clothes\childrenc... DXT1 4096 4096 13 Data\ {Skyrim - Textures8.bsa}
textures\_byoh\clutter\food\cook... DXGI_FORMAT_BC7_UNORM 2048 2048 12 DDS_ALPHA_MODE_UNKNOWN Data\ {Skyrim - Textures8.bsa}
Missing Textures (MissingTextures.csv)
This list contains the textures name your meshes are trying to use, but are missing.
Container: Container where the mesh was found
Mesh: filename of the mesh
Texture: the texture defined inside the mesh
Example:
Container Mesh Texture
--------- ---- -------
Midwood Isle.bsa meshes\74_w\longsword\longsword_ebony.nif textures\cubemaps\cubemap_smooth.dds
Data\ meshes\actors\alduin\alduin.nif textures\actors\alduin\AlduinEyes_n.dds
Skyrim - Meshes0.bsa meshes\actors\alduin\farskin_alduin.nif textures\actors\alduin\AlduinEyes_n.dds
Data\ meshes\actors\animallica\pheasant\pheasant.nif Textures\AV Packages\Chickenandcow\C...
Data\ meshes\actors\animallica\wolf\hs-dog02.nif textures\actors\hs_dog\hs-dog01.dds
Data\ meshes\actors\animallica\wolf\hs-dog02.nif textures\actors\hs_dog\hs-dog01_n.dds
Data\ meshes\actors\animallica\wolf\hs-dog02.nif textures\actors\hs_dog\hs-dog01_sk.dds
Data\ meshes\actors\animallica\wolf\hs-dog03.nif textures\actors\hs_dog\hs-dog01_n.dds
Data\ meshes\actors\animallica\wolf\hs-dog03.nif textures\actors\hs_dog\hs-dog01_sk.dds
Data\ meshes\actors\animallica\wolf\hs-dog03.nif textures\actors\hs_dog\hs-dog01k.dds
Skyrim - Meshes0.bsa meshes\actors\atronachflame\testfireatronach.nif textures\actors\fireatronach\FireAtr...
Skyrim - Meshes0.bsa meshes\actors\atronachflame\testfireatronach.nif textures\actors\fireatronach\FireAtr...
Skyrim - Meshes0.bsa meshes\actors\atronachflame\testfireatronach.nif textures\actors\fireatronach\FireAtr...
Skyrim - Meshes0.bsa meshes\actors\atronachflame\testfireatronach.nif textures\actors\fireatronach\FireAtr...
Skyrim - Meshes0.bsa meshes\actors\bear\bearstatic.nif textures\actors\bear\BearFurPass.dds
Skyrim - Meshes0.bsa meshes\actors\canine\dogstatic.nif textures\actors\dog\DogNewUV.dds
Skyrim - Meshes0.bsa meshes\actors\canine\dogstatic.nif textures\actors\dog\DogNewUV_N.dds
Textures Usage (TexturesUsage.csv)
This list contains textures usage information and metadata.
Container: Container where the mesh was found
Mesh: filename of the mesh
MeshTexture: the texture defined inside the mesh
Found: true if the texture was found, false if not
TextureFoundMod: if a mod directory is selected for processing, this field will contain the path of the texture inside the mod directory
TextureFoundInstalled: the container where the texture was found installed
TextureDataFrom: indicates the texture used to show the data for the fields below
Format: texture format, not compressed textures will have the name "DDS Uncompressed"
Width: texture width
Height: texture height
Mipmap count: The number of mipmaps the texture have.
AlphaFlag: The alpha flag from 'HEADER\ddspf\dwFlags' or from 'HEADER_DXT10\miscFlags2', depends on texture format.
Example:
Container :
Mesh : meshes\018auri\mouthhumanf.nif
MeshTexture : textures\actors\character\mouth\MouthHuman_N.dds
Found : True
TextureFoundMod :
TextureFoundInstalled : Data\
TextureDataFrom : Data\
Format : DXGI_FORMAT_BC7_UNORM
Width : 1024
Height : 1024
MipmapCount : 11
AlphaFlag : DDS_ALPHA_MODE_UNKNOWN
Container : Midwood Isle.bsa
Mesh : meshes\74_w\bastards\bastard_silver.nif
MeshTexture : 74_w\bastards\sheath_bastard.dds
Found : True
TextureFoundMod :
TextureFoundInstalled : BSAssets - Textures.bsa
TextureDataFrom : BSAssets - Textures.bsa
Format : DXT1
Width : 1024
Height : 1024
MipmapCount : 11
AlphaFlag :
Container :
Mesh : d:\mods\vortexstaging\srp architecture 4k-63148-4-0-1671203858\meshes\architecture\winterhold\winterholdsymbol02.nif
MeshTexture : textures\architecture\winterhold\WinterholdGate01_g.dds
Found : True
TextureFoundMod :
TextureFoundInstalled : Game-'Skyrim - Textures2.bsa'
TextureDataFrom : Game-'Skyrim - Textures2.bsa'
Format : DXGI_FORMAT_BC7_UNORM
Width : 256
Height : 256
MipmapCount : 9
AlphaFlag : DDS_ALPHA_MODE_UNKNOWN
Mesh : d:\mods\vortexstaging\srp architecture 4k-63148-4-0-1671203858\meshes\architecture\farmhouse\farmhouseanimdoor01.nif
MeshTexture : textures\architecture\farmhouse\Farmhouse01.dds
Found : True
TextureFoundMod : d:\mods\vortexstaging\srp architecture 4k-63148-4-0-1671203858\textures\architecture\farmhouse\farmhouse01.dds
TextureFoundInstalled : Data\
TextureDataFrom : d:\mods\vortexstaging\srp architecture 4k-63148-4-0-1671203858
Format : DXGI_FORMAT_BC7_UNORM
Width : 2048
Height : 2048
MipmapCount : 12
AlphaFlag : DDS_ALPHA_MODE_UNKNOWN
Meshes Data (MeshesData.csv)
This list is a convenient way to have a summary of your meshes, it will tell you total number of textures referenced, and how much are missing.
Container: Container where the mesh was found
TextureCount: total number of textures used by the mesh
TextureFound: textures used by the mesh that was found
TextureMiss: textures used by the mesh the was NOT found
Example:
Container Mesh TextureCount TextureFound TextureMiss
--------- ---- ------------ ------------ -----------
Data\ meshes\!kenan\enbparticle\rf-enbparticle.nif 1 1 0
Data\ meshes\!kenan\realistic fireplaces\rf-campfire-land-off.nif 13 13 0
Data\ meshes\!kenan\realistic fireplaces\rf-campfire-land-on.nif 18 18 0
Data\ meshes\!kenan\realistic fireplaces\rf-campfire-off.nif 8 8 0
Data\ meshes\!kenan\realistic fireplaces\rf-campfire-on.nif 18 18 0
Data\ meshes\!kenan\realistic fireplaces\rf-ember-log.nif 15 15 0
Data\ meshes\!kenan\realistic fireplaces\rf-fireplace-off.nif 4 4 0
Data\ meshes\!kenan\realistic fireplaces\rf-fireplace-on.nif 14 14 0
Midwood Isle.bsa meshes\74_w\bastards\bastard_silver.nif 10 10 0
Midwood Isle.bsa meshes\74_w\katanas\katana_dae.nif 9 9 0
Midwood Isle.bsa meshes\74_w\longsword\longsword_dae.nif 12 12 0
Midwood Isle.bsa meshes\74_w\longsword\longsword_ebony.nif 10 9 1
Midwood Isle.bsa meshes\74_w\scimitars\scimitar_glass.nif 8 8 0
Midwood Isle.bsa meshes\74_w\staves\staff_glass.nif 4 4 0
Filtering with Powershell
.\PS-Scripts\get-meshesdata.ps1 -csvDirectory .\Output\test | ?{ $_.mesh -notmatch 'caliente'} | fl
.\PS-Scripts\get-texturesusage.ps1 -csvDirectory .\Output\test | ?{ $_.Container -notmatch 'data\\' }
.\PS-Scripts\get-texturesusage.ps1 -csvDirectory .\Output\test | ?{ $_.Container -match 'data\\' -and $_.width -ge 4096 }
.\PS-Scripts\get-texturesusage.ps1 -csvDirectory .\Output\test | ?{ $_.MipMapCount -eq 0 -and ($_.width -ge 4096 -or $_.height -ge 4096) }
.\PS-Scripts\get-missingtextures.ps1 -csvDirectory .\Output\test | ?{ $_.mesh -match '\\architecture\\'} | ft
To list textures with wrong dimensions:
.\PS-Scripts\get-texturesdata.ps1 -csvDirectory .\Output\test | ?{ -not $_._WidthPowerOf2 -or -not $_._HeightPowerOf2 }
.\PS-Scripts\get-texturesusage.ps1 -csvDirectory .\Output\test | ?{ -not $_._WidthPowerOf2 -or -not $_._HeightPowerOf2 }
Credits
SSEEdit team for their amazing work.