File information
Last updated
Original upload
Created by
Several Contributors - See BelowUploaded by
hakasaplVirus scan
Safe to use
Current section
About this mod
Patches your load order for any texture mods you have regardless of shader type (parallax / CM / PBR), plus some other helpful tools
- Requirements
-
Nexus requirements
Mod name Notes Backported Extended ESL Support For older Skyrim versions 1.5.97 through 1.6.659 only Skyrim VR ESL Support For Skyrim VR users Off-site requirements
Mod name Notes .NET 8 Desktop Runtime x64 x64 C++ Redistributable Mods requiring this file
- Permissions and credits
-
Author's instructions
GPL-3 license and everything that entails. Feel free to reach out if you want to collaborate.
File credits
This author has not credited anyone else in this file
Donation Points system
Please log in to find out whether this mod is receiving Donation Points
- Changelogs
-
-
Version 0.8.12
- Improved efficiency of mod folder mapping by only checking relevant folders
- Improved efficiency of loose file mapping by only checking relevant folders
- Improved efficiency of BSA file loading (about 2x speed difference)
- High memory option will now preserve one step up the stack resulting in faster runtimes
- Changed PBR matching behavior - now known suffixes will not be removed from match_diffuse and match_normal
- Map textures from meshes option is removed, it is now always enabled
- Texture patching is split into its own section now
- PG EDIDs are more reable using the diffuse texture name
- Fixed duplicate NIFs leaving behind the MLP flag when it is incompatible
- Fixed MLP meshes having CM applied to them
- Fixed duplicate meshes with no shader type sometimes getting wrong textures due to common texture sets
- Fixed duplicate texture sets being patched incorrectly for some meshes
-
Version 0.8.11
- Fixed issue for Skyrim VR with mismatching formids between output plugins
- Fixed 3d index being calculated incorrectly for some meshes
- Fixed MO2 operator++ crash for cases where MO2 does not put hidden folders in the VFS
- Fixed mohidden files/folders being included in file map
- Fixed existing output folder deletion checks being case-sensitive
- Fixed PBR vertex_color modifiers not triggering a NIF change
- Fixed PBR empty slot commands having "texture" prepended to them causing errors
- Corrupt NIFs should be handled more gracefully now with an error message indicating which NIF
- Texture name base checks will only operate on a per-slot basis now instead of checking suffixes for every slot
- Fixed "textures" appearing more than once in NIF texture paths causing issues
-
Version 0.8.10
- FormIDs will now be kept persistent across runs where possible
- Fixed unhandled exception around UTF8 chars when diagnostics were enabled
- Fixed diagnostics JSON having some data in incorrect places due to stale pointers
- Improved GPU operation performance
- Added "Fix Subsurface Scattering" post-patcher
- Upgraded CM maps will no longer have red channel as this often is mismatched
- Added default fields support for PBR jsons
- Added "vertex_color_lum_mult" to PBR jsons
- Added "vertex_color_sat_mult" to PBR jsons
- Added critical error for modlist.txt from MO2 being empty
- Added metadata to exe (properties > details in Windows)
- Fixed .dds case check for texture hook patchers
- Added "zbuffer_write" option for PBR jsons
- Fix load order not checking case which results in duplicate modkeys when installing CC mods manually
- Fixed invalid shader permutation for CM + rim lighting + soft lighting + back lighting
- Changed wording on some GUI elements to be more clear
- Crash dumps will now include the local memory state
- Fixed crash dumps not having timestamp in the filename
-
Version 0.8.9
- Added a "Enable Diagnostics" advanced option to generate files to help with support
- Added "Check Paths" toggle for advanced options in the TruePBR patcher
- Added "Print Nonexistent Paths" toggle for advanced options in the TruePBR patcher
-
Version 0.8.8
- Added "Fix Mesh Lighting" pre-patcher (Thanks to Catnyss for their article!)
- Fixed bug where texture sets of duplicate NIFs were not being patched even if an alternate texture didn't exist
- Changed alpha message to say "beta"
-
Version 0.8.7
- Added --full-dump CLI argument to ParallaxGen.exe to generate a full crash dump
- Fixed PBR matching bug when multiple full paths were specified as well as a short path
- Disabled patching for CM on shaders with anisotropic_lighting and soft_lighting
- Re-enabled CM patching on texture sets with slots in 3,6,7
- Fixed non-ascii chars not working for paths in modorganizer.ini
- Issues with plugins will now be printed to console instead of an unhandled exception
-
Version 0.8.6
- 3D name is no longer considered for matching alternate textures
- ParallaxGen.esp now holds new TXST records only
- ParallaxGen_X.esp (where X is sequential numbers) will be created automatically as required based on master limit
- Plugin patching for armor weight checks is now verified that it is actually armor instead of just a NIF named as such (very rare edge case)
-
Version 0.8.5
- Fixed "_1" armor being renamed to "_0" in some cases in the plugin
- Fixed some records being copied to ParallaxGen.esp that were not needed
- Fixed non-armor plugin patching being broken
- Reverted localization change on parallaxgen.esp
-
Version 0.8.4
- Fixed some statics in plugins not being patched
- Fixed only one model of two in armor and armor addon records being patched
- Fixed localization breaking for overridden records in ParallaxGen.esp
- Fixed duplicate meshes not being created past PG1
- Fixed vanilla texture sets not being included in duplicate mesh consideration
- Fixed 1st person armor models not being patched
- Fixed duplicate meshes not being created for _0 or_1 armor meshes depending on which is in the plugin
-
Version 0.8.3
- Fixed some duplicate meshes saving with no data
-
Version 0.8.2
- Added `converttohdr` patcher for pgtools
- Temporarily disabled default patcher because it is causing issues, it will come back with revamped conflict resolution system in 0.9.0
- Removed the GPU Acceleration option, which is now required
- Fixed some custom paths in modorganizer.ini with %BASE_DIR% in them that were not properly parsed
- Specular flag will be set if CM map has glosiness
- Fixed duplicate modkeys crash
- Fixed mesh slot size being modified even if nothing is being patched
- Fixed duplicate meshes not being saved in some cases
- Hopefully fixed conversion error crash
-
Version 0.8.1
- Specular strength will be set to 1.0 for complex material
- Fixed repeated TXSTs not applying to STAT records on 2+ iterations
- Fixed new mods not being sorted according to shader type (including no shader)
-
Version 0.8.0
- Added pgtools.exe modding tools
- Added pgtools patcher to convert particle lights to light placer lights
- loadorder.txt is no longer required
- Mods that do not have any special shader type can be prioritized now
- Existing TXST records will no longer be patched, only new ones will be created
- Added support for PBR fuzz
- Added support for PBR hair
- When mixing shaders with alternate texture records meshes will now be duplicated where required
- Fixed 1PX black dynamic cubemap not being black which would cause really shiny surfaces in recent CS releases
- Parallax maps included in the pbr subdirectory will be considered a different "height pbr" texture type
- Closing mod sort dialog will now close the whole app
- BSMeshLODTriShapes will also be patched now
- Meshes that have higher priority than textures can be patched now
- Plugin patching will also be considered when evaluating mods for conflicts now
- Removed simplicity of snow warning as the mod is not inherently incompatible
- Fixed NULL output in ParallaxGen_Diff.json when PG patched nothing
- PBR patcher clears hair_soft_lighting flag now
- PBR texture swap JSONs are automatically generated
- Fixed yellow highlights staying in mod list after deselecting everything
- Fixed deleted texture maps not actually deleting
- Added additional help text to mod sort dialog
- PBR slot commands will have "textures\" added to the beginning automatically if not already there
- Specular color will be set to white for complex material that has metalness
- Crash dumps will be generated automatically upon crashing
- PBR delete: true will now set alpha to 0 instead of deleting the shape
-
Version 0.7.3
- Added a warning for simplicity of snow users if PBR or CM is enabled (SoS is incompatible with these shaders)
- Fixed thread gridlock that casued mesh patching to get suck occasionally
- Fixed PBR JSON delete: true not working
- Fixed uncaught exception if mod folder does not exist in MO2
- Fixed dyncubemap blocklist not saving/loading correctly in the GUI
- Fixed dyncubemap blocklist not showing up on start in the GUI if advanced options is enabled
- Fixed uncaught exception when a NIF has non-ASCII chars as a texture slot
-
Version 0.7.2
- Added mesh allowlist
- Added mesh allowlist, mesh blocklist, texture maps, vanilla bsa list, and dyncubemap blocklist to GUI advanced options
- If using MO2 you now have the option to use the MO2 left pane (loose file) order for PG order
- Added ESMify option for ParallaxGen.esp
- Fixed unicode character handling
- Added critical error if outputting to MO2 mod and mod is enabled in MO2 VFS
- Added critical error if DynDoLOD output is activated
- Added "save config", "load config", and "restore config" buttons to the launcher GUI
- MO2 selection will respect custom paths for mods and profiles folder now
- Fixed exceptions when plugin patching is not enabled
- PBR prefix check accounts for slot commands now too
- Improved warning output for texture mismatches
- Fixed case where multiple PBR entries did not apply together
- Fixed PBR slot check to check at the end of applying all entries for the match
- When PBR is the only shader patcher selected "map textures from meshes" will be automatically unselected
- INI files in the data folder will be read for BSA loading now
- Advanced is now a checkbox with persistence in the launcher GUI
- Fixed failed shader upgrade applying the wrong shader
- Shader transform errors don't post more than once now
- Exceptions in threads will trigger exceptions in main thread now to prevent error spam
- Texture TXST missing warnings are changed to debug level
- If mesh texture set has less than 9 slots it will be resized to 9 slots automatically while patching
- New texture sets will be created if required for two different shader types in meshes now
-
Version 0.7.1
- Fixed PBR applying to shapes with facegen RGB tint
- Fixed exception when file not found in BSA archive for CM check
- Added workaround for MO2 operator++ crash
- Max number of logs has been increased from 100 to 1000
- Fixed warning for missing textures for a texture set when upgrading shaders
- User.json custom entries are no longer deleted
-
Version 0.7.0
- Added a launcher GUI
- All CLI arguments except --autostart and -v/-vv have been removed in favor of the persistent GUI
- Added a mod manager priority conflict resolution system with UI
- Complex material will set env map scale to 1.0 now
- Fixed PBR bug when there were two overlapping matches
- Default textures are applied when TXST record cannot be patched for a shader
- Output directory will only delete items that parallaxgen might have generates (meshes folder, textures folder, PG files)
- BSLODTriShapes are now patched too
- Upgrade shaders only upgrades what is required now
- If user does not have .NET framework an error is posted now
- PBR ignore Skin Tint and Face Tint types now
- meta.ini is not deleted when deleting previous output
- Fixed plugin patching bug that would result in some alternature texture records referencing the wrong TXST record
- Fixed NIF block sorting breaking 3d index in plugins
- ParallaxGen.esp will be flagged as light if possible
- Load order configs in the ParallaxGen folder will no longer do anything - use cfg/user.json instead
-
Version 0.6.0
- Added plugin patching
- Fixed PBR rename not functions with certain suffixes
- Fixed ParallaxGen thinking RMAOS files were CM
- -vv logging mode will only log to file now not the terminal buffer
- Added a function to classify vanilla BSAs in the config, which will ignore complex material and parallax files from them
- Fixed retrieval of game installation directories from the registry
- Normal is matched before diffuse for CM and parallax now
- If multiple textures have the same prefix, a smarter choice will be made based on the existing value
- Only active plugins will be considered when plugin patching and loading BSAs now
- Meshes are only considered in the "meshes" folder now
- Textures are only considered in the "textures" folder now
- Fixed "textures\" being added to end of slots in very rare edge cases
-
Version 0.5.8
- Fixed PBR bug when multilayer: false is defined
- Fixed upgrade-shader not generating mipmaps
- Fixed PBR bug with duplicate texture sets
- New method for mapping textures to types by searching in NIFs
- Added --disable-mlp flag to turn MLP into complex material where possible
- Removed weapons/armor from dynamic cubemap blocklist
- Added --high-mem option for faster processing in exchange for high memory usage
- Added wide string support in NIF filenames
- Fixed issue of blank DDS files being checked for aspect ratio
- CM will be rejected on shapes with textures in slots 3, 7, or 8 now
- Added icon to parallaxgen.exe
- At the end parallaxgen will now report the time it took to run the patcher
-
Version 0.5.7
- Fixed sorting issue that would result in some patches being missed
- Updated nifly library to the latest commit (fixes undefined behavior with badly configured NIFs)
- Logging is more detailed now in -vv mode for mesh patching
-
Version 0.5.6
- PBR multilayer: false is now processed correctly
- More robust CLI argument validation
- Runtime for parallax and CM is now n*log(n) worst-case instead of n^2
- Runtime for truepbr average case is n*log(n) instead of n^2
- Introduced multi-threading for mesh generation
- Added --no-multithread CLI argument
- Added --no-bsa CLI argument to avoid reading any BSAs
- Textures that have non-ASCII chars are skipped because NIFs can't use them
- Fixed TruePBR case issue with Texture being capital T
- upgrade-shaders will now check for _em.dds files when checking if an existing vanilla env mask exists
- actors, effects, and interface folders now included in mesh search
- Diff JSON file is generated with mesh patch results (crc32 hash comparisons)
- PARALLAXGEN_DONT_DELETE file is removed from output and replaced by diff file
- PBR will now not apply if the result prefix doesn't exists
- Logs are now stored in "ParallaxGenLogs" and use a rolling log system to make it more manageable
- Added PBR glint support
-
Version 0.5.5
- Fixed TruePBR nif_filter handling
- Fixed TruePBR slotX handling
-
Version 0.5.4
- Fixed complex material applying on PBR meshes
- Fixed output zip file capitalization
- Added error handling for failing to load BSA
-
Version 0.5.3
- BC1 is no longer considered for Complex Material
- Fixed CM lookup memory leak on the GPU
- UTF-16/8 optimizations
-
Version 0.5.2
- Fixed rename issue for truepbr patching
- No longer checking for mask.dds files for CM
-
Version 0.5.1
- Removed loading screen exclusions from NIF config
- findFilesBySuffix now is findFiles and uses globs exclusively
- _resourcepack.bsa is now ignored for complex material
- Creation club BSAs are now ignored for complex material
- _em.dds files are now checked if they are complex material
- mask.dds files are now checked if they are complex material
- User-defined generic suffixes is now possible
- Added JSON validation for ParallaxGen configs
- Complex material lookup is much smarter now
- Added --no-gpu option to disable GPU use
-
Version 0.5.0
- Initial TruePBR implementation
- Added allowlist and blocklist support
- Added --autostart CLI argument to skip the "Press Enter" prompt
- Existing ParallaxGen meshes in load order is checked after output dir is deleted
- Fixed exit prompt to refer to ENTER specifically
-
Version 0.4.7
- GPU code will now verify textures are a power of 2
- Added "skyrimgog" game type
- Top level directory is now checked to make sure a NIF comes from "meshes", dds from "textures"
- Fixed parallax or complex material texture paths not being set correctly for some edge case NIFs
- Fixed aspect ratio checks happening more than once for the same pair
- Output directory + data dir path checking is done using std::filesystem now instead of string comparison
- Fixed bugs where shaders wouldn't compile when in wrong working directory
- Diffuse maps are checked to make sure they exist now before patching mesh
- Fixed help not showing up with -h or --help argument
-
Version 0.4.6
- Added additional error handling for GPU code
-
Version 0.4.5
- Shaders are no longer pre-compiled, they are compiled at runtime
- Skinned meshes are only checked for vanilla parallax now
- Havok animations are only checked for vanilla parallax now
-
Version 0.4.4
- Fixed non ASCII characters in loose file extension causing crashes
- Added global exception handler w/ stack trace
- Dynamic cubemaps overwrite oold cubemap value for CM meshes now
- Shaders are in their own folder now
-
Version 0.4.3
- Fixed parallax being applied on soft and rim lighting
-
Version 0.4.2
- ParallaxGen no longer patches LOD
- Added dynamic cubemaps support
-
Version 0.4.1
- Fixed already generated complex parallax maps regenerating if a heightmap was also included
-
Version 0.4.0
- Added --upgrade-shader argument to enable upgrading vanilla parallax to complex material
- Implemented DX11 into --upgrade-shader process
- Lots of code cleanup and optimization
- Fixed some typos in log messages
-
Version 0.3.3
- Fixed parallax heightmaps not applying correctly for some meshes
- Aspect ratio of texture maps are checked for complex material now too
- Added additional error handling during BSA read step
- CLI arguments are now printed to console
- Wrong CLI arguments results in a graceful termination now
-
Version 0.3.2
- Fixed --optimize-meshes CLI arg not doing anything
-
Version 0.3.1
- Added option to optimize meshes that are generated
- Fixed issue where ignoring parallax caused nothing to work
-
Version 0.3.0
- Before enabling parallax on mesh heightmap and diffuse map are now checked to make sure they are the same aspect ratio
- Complex parallax checking is now enabled by default
- Added a -o CLI argument to allow the user to specify the output directory
- App will throw a critical error if the output directory is the game data directory
- Fixed bug where loadorder.txt would sometimes not be found
- complex material will now remove parallax flags and texture maps from meshes if required
-
Version 0.2.4
- Generation now sorts nif blocks before saving
-
Version 0.2.3
- Fixed crash from failure to write BSA file to memory buffer
-
Version 0.2.2
- Ignore shaders with back ligting, which seems to cause flickering
-
Version 0.2.1
- Fixed BSAs not being detected due to case insensitivity
- Made --no-zip enable --no-cleanup by default
- NIF processing logs will not show the block id of shapes
- getFile now logs which BSA it's pulling a file from
- Fixed crash that would occur if a shape doesn't have a shader
- Generation will now ignore shaders with the DECAL or DYNAMIC DECAL shader flag set
-
Version 0.2.0
- Added support for enderal and enderal se
- Fixed crash when reading invalid INI file
-
Version 0.1.8
- Fixed log level for havok animation warning to trace
- Added additional logging for pre-generation
- Added additional error handling for missing INI files
-
Version 0.1.7
- Added a helper log message for which file to import at the end of generation
- Meshes now don't process if there are attached havok physics
-
Version 0.1.6
- Added wstring support for all file paths
- Added additional trace logging for building file map
- Stopped using memoryio file buffer, using ifstream now
- After generation state file is now cleaned up properly
-
Version 0.1.5
- Fixed an issue that would cause hangs or crashes when loading invalid or corrupt NIFs
-
Version 0.1.4
- Set log to flush on whatever the verbosity mode is set to (trace, debug, or info). Should help reproducing some issues.
-
Version 0.1.3
- Fixed CLI arg requesting game data path instead of game path.
- Made some messages more descriptive
- Made some CLI arg helps more descriptive
- Added a check to look for Skyrim.esm in the data folder
-
Version 0.1.2
- Added error handling for unable to find ParallaxGen.exe
- Added error handling for invalid data paths
- Added error handling for logger initialization
- Added error handling for registry lookups
- Logs now flush on every INFO level message
- Enabled logging for BethesdaGame
- Fixed log message for deleteOutputDir()
-
Version 0.1.1
- Added log flush every 3 seconds to prevent log from being lost on app crash
- Added error message if loadorder.txt doesn't exist
-
Version 0.1.0
- Initial release
-
PG is in BETA. It has been successfully used by many but is still in development. Please be patient and file detailed bug reports if you encounter any.
The GitHub page for this open-source project can be found here.
Features
Mesh Patching
This is the primary goal of PG. Despite the name, PG can be used for more than just patching meshes for Parallax. Without any configuration, PG will patch any mesh in your load order (including meshes in your BSA archives) for parallax, complex material, and/or truepbr. What shapes being patched for which shader is dependent on the textures you have in your load order. Each of those patchers can be disabled using CLI arguments (see the CLI arguments section below).
Before this, mod authors would need to ship pre-patched meshes with their texture mods. The problem with this is that the mesh can be overwritten, or you may want to use a different mesh with this texture, for example a fixed mesh from one of the many mesh fix mods. The goal of this feature is to completely remove this consideration. The winning mesh is the mesh you want, purely based on mesh things like UV fixes, split meshes, the model itself, etc. The winning texture is the one applied to the matching mesh after running PG.
In addition, sometimes there is a need to combine shaders in a single mesh. For example, your mountains might be complex material, and your whiterun street might be regular parallax, but a single whiterun street mesh has some rocks on the side of the road. Before, this would have to be done manually using applications like NifSkope. PG will know which should be which and patch the mesh automatically for both.
Want to learn more about all the shader types PG supports? Check out this wiki page.
Plugin Patching
Plugins (mainly TXST records) will also be patched according to how the original shapes were patched during mesh patching. A resulting ParallaxGen.esp in the output. PG will also automatically duplicate meshes when mixing shader types if a given alternate texture record cannot be applied to the originally patched shader.
Shader Transforms
Complex parallax has a lot of limitations that I didn't like, so I implemented shader upgrades into PG. What this means is that by chosing "Upgrade Parallax to Complex Material", PG will generate complex material environment mask files for every parallax height map you have in your load order, if an existing complex material map does not already exist. Then, when patching meshes, PG will use those newly generated textures and enable complex material on meshes instead of complex parallax. In most cases you won't see any difference in-game between complex parallax and complex material since PG does not add any extra data such as metalness and roughness (so you should still prefer to get complex material mods, which will). However, this will allow you to use single-pass snow shaders (ie. Vanilla or Better Dynamic Snow v3), see parallax on decals, and many more things that complex material supports where complex parallax doesn't. In most cases I recommend enabling this option always. This also fixes the dreaded blue/white distant mesh bug with parallax meshes. After running with this option the result will be NO complex parallax in your game.
Other Things!
Such as pgtools modding tools, limited texture patching, and a bit more.
A Note to Mod Authors
One of the main goals for PG is to allow texture artists to worry about just that, and not the mesh part. Historically parallax or complex material meshes needed to be included in mods for them to work in-game. With PG you should be able to ship only textures with your mod, and send your users to here to patch their meshes. That being said, the way PG identifies textures is not fool-proof. See this wiki page for more information for mod authors.
Contributors
This is an open-source project. We would love to have others contribute as well; check out the project's GitHub page for more information. The following authors have contributed to PG:Acknowledgements
A special thanks to:
- The very helpful folks on the community shaders discord who answer all my questions.
- Spongeman131 for their SSEedit script NIF Batch Processing Script, which was instrumental on figuring out how to modify meshes to enable parallax
- Kulharin for their SSEedit script itAddsComplexMaterialParallax, which served the same purpose for figuring out how to modify meshes to enable complex material
A ton of libraries were used in this project - send them a thanks!