- Added pgtools.exe modding tools
- Added pgtools patcher to convert particle lights to light placer lights
- 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
- Existing TXST records will no longer be patched, only new ones will be created
- Added support for PBR fuzz
- Added support for PBR hair
- Removed simplicity of snow warning as the mod is not inherently incompatible
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- Fixed TruePBR nif_filter handling
- Fixed TruePBR slotX handling
- Fixed complex material applying on PBR meshes
- Fixed output zip file capitalization
- Added error handling for failing to load BSA
- BC1 is no longer considered for Complex Material
- Fixed CM lookup memory leak on the GPU
- UTF-16/8 optimizations
- Fixed rename issue for truepbr patching
- No longer checking for mask.dds files for CM
- 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 not 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
- 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
- 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
- Added additional error handling for GPU code
- 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
- 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
- Fixed parallax being applied on soft and rim lighting
- ParallaxGen no longer patches LOD
- Added dynamic cubemaps support
- Fixed already generated complex parallax maps regenerating if a heightmap was also included
- 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
- 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
- Fixed --optimize-meshes CLI arg not doing anything
- Added option to optimize meshes that are generated
- Fixed issue where ignoring parallax caused nothing to work
- 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
- Generation now sorts nif blocks before saving
- Fixed crash from failure to write BSA file to memory buffer
- Ignore shaders with back ligting, which seems to cause flickering
- 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
- Added support for enderal and enderal se
- Fixed crash when reading invalid INI file
- Fixed log level for havok animation warning to trace
- Added additional logging for pre-generation
- Added additional error handling for missing INI files
- 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
- 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
- Fixed an issue that would cause hangs or crashes when loading invalid or corrupt NIFs
- Set log to flush on whatever the verbosity mode is set to (trace, debug, or info). Should help reproducing some issues.
- 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
- 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()
- Added log flush every 3 seconds to prevent log from being lost on app crash
- Added error message if loadorder.txt doesn't exist
- Initial release