EasyOptimizer-V-1.2.0
Refactor GUI: menu, toolbar, layout & search
Introduce a new menu bar, status/totals bars and toolbar area; register new window classes and add menu handling (File/Actions/View) with contextual dropdowns and sort/grid/encoder options. Move and restyle the search box into the sidebar/toolbar, add live search filtering across archives and textures, and implement data-driven grid row enumeration and column helpers (GridRow/GridColumn + get_visible_rows and format_size_commas). Update dialog templates to use Segoe UI and larger sizes, adjust control positions/sizes, enable double-clicks for content class, switch several backgrounds to themed brushes, and consistently call layout_children when the dataset changes. Add confirmation prompts for destructive recompress operations, tweak archive card hit-testing/geometry, hide vertical scrollbar on content, and refresh totals/status rendering. Also update some sidebar button labels and include a refreshed application icon (res/app.ico).
Add 'Export All' DDS export for YTD archives
Add a new "Export all textures as DDS" feature for YTD archives. Introduces a new command id (IDM_CTX_EXPORT_DDS_ALL), a context-menu entry, and a DDS button on archive cards and RPF entry rows. Implements do_archive_export_all_dds which prompts the user for an output folder, creates a subfolder named after the archive, sanitizes texture names, avoids overwriting by adding numeric suffixes, converts each texture to DDS (via dds_build) and writes files, and reports success/failure in the GUI and logs. Also wires up click handlers to trigger the export from both the card UI and content clicks.
Add RPF write-back and GUI save integration
Implement rewriting of RPF7 archives and integrate it into the save workflow. Adds a new rpf_rewrite_file API and RpfReplacement type (rpf_scan.h) and implements rewrite_archive (rpf_scan.cpp) which parses the TOC, applies per-entry replacements, preserves nested .rpf blobs, reserializes the table of contents (handling AES-encrypted TOC) and writes a new archive image; NG-encrypted archives are rejected. A crypto.encrypt_aes helper was added to re-encrypt AES TOCs. GUI changes (src/gui.c) introduce helpers to serialize archives to temp files, read whole files, create versioned .bak backups, detect nested RPF entries, and save_into_original_rpfs which batches replacements per source RPF and invokes the rewrite routine. The save dialog text and status reporting were updated to mention repacking non-nested RPFs, keeping .bak copies, and exporting nested-RPF entries as .ytd sidecars. Errors from rewrite are surfaced via an error string and failed/skipped counts are accounted for.
Support YDR model write-back and RSC7 recomposition
Retain original RSC7 payload when loading YDR/YFT/YDD so edited textures can be written back and the model recomposed on save. Changes: gui.c now routes saves of ARCHIVE_MODEL_READONLY with retained payload to ydr_save and keeps .ydr/.yft/.ydd extensions unless no payload is available; types.h adds ArchiveFile.model_meta to track retained model metadata. ydr.c: major additions — ModelMeta struct, parse_texdict now returns texture/data offsets, allocation of retained payload and offset arrays in ydr_load, and new functions ydr_save and ydr_free_model_meta to recompute/patch the RSC7 segments, compress them, and write the header; includes helpers for RSC7 compression and DX9 format mapping. ydr.h: exposed prototypes for save/free. ytd.c: improved rsc7_flags_from_size to prefer page sizes that avoid overflowing the fixed chunk array and added cleanup call to free retained model meta in ytd_free. Behavior notes: if payload retention fails the file remains read-only; ydr_save validates texture count and fails with an error if write-back is not possible.
Full Changelog: 1.1.0...1.2.0