[RELz] Oblivion - PyFFI Optimization Kit

Post » Wed Mar 30, 2011 8:55 am

http://www.tesnexus.com/downloads/file.php?id=37463

http://www.tesnexus.com/downloads/file.php?id=37463



    Pre-configured set of ini files, directed primarily at mod users, with instructions for safely and easily optimize any Oblivion meshes with PyFFI.


    1 launch script, 4 ini configuration files, 2 folders "in" and "out".


    Generic PyFFI optimization process in 3 steps:

    • place the meshes (or folders with meshes) to be optimized inside the "in" folder.

    • run or double-click "run_oblivion_optimize.bat".

    • after the optimization finishes, meshes that were optimized are placed inside folder "out", respecting the directory structure inside the "in" folder as usual.



Full Readme and Details:

Spoiler
Name: Oblivion - PyFFI Optimization Kit
Version: 7
Date: 2011/03/11
Category: Utilities
Requirements: Python 2.6.6, PyFFI 2.1.6 or greater
Author(s): ulrim
Source: http://www.tesnexus.com/downloads/file.php?id=37463
Forum: http://www.gamesas.com/index.php?/topic/1172029-relz-oblivion-pyffi-optimization-kit/


Description
======================================================================
Pre-configured set of ini files, directed primarily at mod users, with instructions for safely and easily optimize any Oblivion meshes with PyFFI.


Details
======================================================================
This package contains four ini configuration files, one batch file and the folders 'in' and 'out'.

To use PyFFI optimization safely, this package uses a method comprising four passes, described in each ini file, accordingly:

1st pass - optimizes meshes with a general skip list as safeguard.
2nd pass - applies texture path fixes to skipped meshes, where appropriate.
3rd pass - checks for meshes that should be optimized and were skipped in the earlier general skip list.
4th pass - checks for _far.nif meshes and applies optimisation as needed.


Usage
======================================================================
To start the optimization process, follow these steps:

Step 1 - place the meshes (or folders with meshes) to be optimized inside the 'in' folder.
Step 2 - run or double-click 'run_oblivion_optimize.bat'.
Step 3 - after the optimization finishes, meshes that were optimized are placed inside folder 'out', respecting the directory structure inside the 'in' folder as usual.


Install
======================================================================
Create a folder somewhere at your discretion, i.e. 'C:\Oblivion - PyFFI Optimization Kit\'.
Unpack the contents of this archive to the respective folder.


Uninstall
======================================================================
Delete the folder where you unpacked the contents of this archive.


Upgrade
======================================================================
N/A


Incompatibility
======================================================================
N/A


Release Notes
======================================================================
Tests made using PyFFI 2.1.6 to 2.1.9b5 (using mesh collision bug fix):
- fully optimized Oblivion - Meshes.bsa, DLCShiveringIsles - Meshes.bsa, Knights.bsa: no problems found.
- meshes from mods such as Oscuro's Oblivion Overhaul, FCOM, Warcry, QTP3: no problems found.

The chosen method to use PyFFI allows fine control of each step of the optimization process and easy configuration of each optimization pass. The final result is also kept separate from the original meshes, should you wish to inspect what was optimized and what was not. The log files appear next to the ini files, numbered accordingly and are (re)created after each optimization run.

For further details, follow the current PyFFI thread at the official elderscrolls forums:
http://www.gamesas.com/index.php?/topic/1158842-inforelz-pyffi-python-file-format-interface/

Refer to http://tesivpositive.animolious.com/?page=pyffi for a more comprehensive guide.


Known Issues and Bugs
======================================================================
PyFFI versions 2.1.8 and 2.1.9 beta 5 have a bug affecting the collision mesh optimization.
There's a fix (see source web site) while official PyFFI is not updated.

Variables used in 'run_oblivion_optimize.bat':

If Python 2.6 is not installed in 'C:\Python26\', set 'PYTHON_PATH' to the directory where python is installed.

PyFFI manages threads of execution (jobs) by default. To make the computer more responsive while performing PyFFI, set the variable 'JOBS=n' where 'n' is a number less than the total cores in your cpu (hyper-threading included).

By default, the batch script executes the optimization process immediately. It shows a menu only in case python was not found or if you set 'SHOW_MENU=1'.

Other considerations:

Logging may produce out of order lines due to the number of jobs (threads) writing output simultaneously to the log files. Occasionally, there may be missing log lines. Set JOBS=1 in the batch script for more accurate logging during testing.

Each optimization pass indicates status both in the screen and the window title. Real time progress indicator is not implemented - PyFFI should be running quietly in the background as normal. You can check the logs meanwhile.

Optimization process cannot be resumed.


Version History
======================================================================
Releases follow a version increment approach starting at 1.

7, 2011/03/11
* fixed redundant far.nif optimization.
* updated documentation regarding PyFFI mesh collision bug in versions 2.1.8 and 2.1.9b5.
* added ini installation check.
* updated status information when PyFFI is running.

6, 2011/03/09
* 'run_oblivion_optimize.bat' runs optimization immediately by default.
* extended configurability (still very simple) allows menu to shown up only if set or python is not found.

5, 2011/03/09
* fixed bug affecting path spaces in the batch script.

4, 2011/03/09
* added safeguard for python path in the batch script.
* added pause after optimization completes.
* cleaned 'run_oblivion_optimize.bat' script

3, 2011/03/09
* fixed 'oblivion_optimize_04.ini' for correct optimization of '_far.nif' meshes after the general optimization pass.
* improved 'run_oblivion_optimize.bat' interface.
* removed resuming support.
* cleaned ini configuration.

2, 2011/03/07
* fixed 'oblivion_optimize_02.ini' skip list to allow 'resume = true' work as intended for the next pass.
* fixed 'oblivion_optimize_04.ini' so 'opt_cleanfarnif' spell is applied after the general optimization pass.

1, 2011/03/06
* Initial release.


Contact
======================================================================
You can find me on the Official Elder Scrolls forums and TESNexus as 'ulrim'.
You can send me an e-mail here: ulrimnohraar at gmail dot com.


Credits
======================================================================
Thanks to:
* Bethesda, for making The Elder Scrolls IV: Oblivion.
* TESNexus.com, for the one-stop-shop resource for authors and players.
* Amorilia, for PyFFI and the NIF tools project.
* Arthmoor and H2ODDK, for the regular expressions used in the ini files.
* Tomlong75210, for http://tesivpositive.animolious.com
* All who spend time and effort modding, documenting and building open source software for TES.


Tools Used
======================================================================
7-Zip - http://www.7-zip.org/
Python - http://www.python.org/
PyFFI - http://pyffi.sourceforge.net/


Licensing/Legal
======================================================================
You are free to use any part of this software. It would be nice to let me know of any suggestions, changes or updates you find appropriate.

THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY WHATSOEVER.


Latest news:

2011/03/14
    http://www.gamesas.com/index.php?/topic/1173353-oblivion-pyffi-binary-patch-kit/ available now! Applying a binary patch is faster than processing the file(s) with PyFFI.
    Use together with the http://www.tesnexus.com/downloads/file.php?id=37548 to update your 'Oblivion - Meshes.bsa' with optimized meshes in less time.


2011/03/13
    PyFFI 2.1.9 beta 6 https://github.com/amorilia/pyffi/downloads!


Latest updates:

7, 2011/03/11
  • fixed redundant far.nif optimization.
  • updated documentation regarding PyFFI mesh collision bug in versions 2.1.8 and 2.1.9b5.
  • added ini installation check.
  • updated status information when PyFFI is running.




Example step-by-step tutorial how to make a fully optimized 'Oblivion - Meshes.bsa' using this kit:


    Pre-optimization:

      Open OBMM, go to utilities and use BSA Browser to open 'Oblivion - Meshes.bsa'.

      Click 'Extract all' and select the 'in' folder as the destination directory.

      Double click 'run_oblivion_optimize.bat' and start optimization.


    Post-optimization:

      Rename the original file 'Oblivion - Meshes.bsa' to 'ORIGINAL - Oblivion - Meshes.bsa'
      (Notice the file name must not start with 'Oblivion').

      Open OBMM, use BSA Creator, click 'Add Folders' and select the 'in' folder.

      After adding the 'in' folder, click 'Add Folders' again and select the 'out' folder.
      (This step overwrites the default meshes with the optimized meshes. These two last steps are necessary for people who have i.e. Windows 7 and want to avoid the truncation of leading spaces in some known files.)

      Hit 'Create' button and save it as 'Oblivion - Meshes.bsa'.

      After it finishes creating 'Oblivion - Meshes.bsa'', adjust the modified date with an http://tesivpositive.animolious.com/?page=programs_and_utilities to the same modified date as the original file you renamed.


That's it! You did it!

Check the http://tesivpositive.animolious.com for more insight or drop a message if you're in trouble.
User avatar
Kerri Lee
 
Posts: 3404
Joined: Sun Feb 25, 2007 9:37 pm

Post » Wed Mar 30, 2011 12:01 am

interesting.

I was not aware that the regular PyFFI didn't address what you describe here:
2nd pass - applies texture path fixes to skipped meshes, where appropriate.
3rd pass - checks for meshes that should be optimized and were skipped in the earlier general skip list.
4th pass - checks for _far.nif meshes and applies optimisation as needed.

Or that it was a problem.

Does the later version of Python 2.1.7+ require Python 2.6.6 - I'm trying to remember if moving to 2.6.6 will mess with bash? Checking bash thread - Oh I guess it won't.

thanks
User avatar
Add Me
 
Posts: 3486
Joined: Thu Jul 05, 2007 8:21 am

Post » Wed Mar 30, 2011 1:35 pm

Hah, nicely done. This sure streamlines the process of optimizing meshes from mods. I hadn't even thought about the texture path fix step in my own batch files for the ones that get skipped.

I think it would be a good idea to see about getting your kit added to the OP in the PyFFI main thread. Your setup is safer than the way I've been doing stuff.
User avatar
Katharine Newton
 
Posts: 3318
Joined: Tue Jun 13, 2006 12:33 pm

Post » Wed Mar 30, 2011 1:14 am

This looks quite interesting. I'll give it a try for sure!
User avatar
Wanda Maximoff
 
Posts: 3493
Joined: Mon Jun 12, 2006 7:05 am

Post » Wed Mar 30, 2011 6:09 am

Thank you for these.

I've updated the PyFFI thread to include the download link.
User avatar
Marie Maillos
 
Posts: 3403
Joined: Wed Mar 21, 2007 4:39 pm

Post » Wed Mar 30, 2011 1:15 pm

Hey, thanks for this! :)
User avatar
Timara White
 
Posts: 3464
Joined: Mon Aug 27, 2007 7:39 am

Post » Tue Mar 29, 2011 11:06 pm

I used resume in all the configuration files, the reason being to avoid spending a long time doing something that is already done.

With this in mind, I missed something in oblivion_optimize_02.ini. I've to take out "(?i)gnd[.]nif$ (?i)meshes.clutter" part in its skip list, so the oblivion_optimize_03.ini can go on doing its stuff.

Also, if opt_cleanfarnif spell is supposed to work after the general optimization pass, I've to fix the oblivion_optimize_04.ini to use the out directory. Since the files there are already processed with the general optimize spell, resuming must be set to false.

My apologies for this error. The update is online.


--

For those wondering about the following:
overwrite = Trueresume = True

I used resume in the command line to test the expressions and it worked differently.

"noninteractive = true" enforces overwrite over resume, even though "resume = true" is set after both.

"overwrite = true" must be commented in the ini files 01, 02 ,03 for proper resume.
User avatar
Sophh
 
Posts: 3381
Joined: Tue Aug 08, 2006 11:58 pm

Post » Wed Mar 30, 2011 3:15 pm

Might be in the wrong thread, but after running this I thought that I was ok. Until I got to the Imperial Prison.... See screenshot:

[img]http://img14.imageshack.us/img14/1364/oblivion201103070932575.jpg[/img]

Any idea what happened? Thanks.
User avatar
Kay O'Hara
 
Posts: 3366
Joined: Sun Jan 14, 2007 8:04 pm

Post » Wed Mar 30, 2011 4:56 am

I did my first test-run with the Optimizer this morning. Ran into a bit of a snafu. The Command Window never shows any progress but only repeats the line "No handlers could be found for logger "pyffi.nif.nitribasedgeom". At first I though the program wasn't functioning, but it indeed happily churns away producing modified nifs. All eight CPU cores are fully utilized (100%). Output appears in the proper \out sub-folder. Utility seems to be doing its job, except I can't see progress in the Command Window, as I can with standard PyFFi.

Here's my modified bat:
@echo off
"F:\Utilities\Python26\python.exe" "F:\Utilities\Python26\Scripts\niftoaster.py" --ini-file="oblivion_optimize_01.ini" > "PyFFI_Log_01.txt"
"F:\Utilities\Python26\python.exe" "F:\Utilities\Python26\Scripts\niftoaster.py" --ini-file="oblivion_optimize_02.ini" > "PyFFI_Log_02.txt"
"F:\Utilities\Python26\python.exe" "F:\Utilities\Python26\Scripts\niftoaster.py" --ini-file="oblivion_optimize_03.ini" > "PyFFI_Log_03.txt"
"F:\Utilities\Python26\python.exe" "F:\Utilities\Python26\Scripts\niftoaster.py" --ini-file="oblivion_optimize_04.ini" > "PyFFI_Log_04.txt"

Here's a small portion of my 04 log, showing that so far as I can tell things work as they should?
Spoiler

pyffi.toaster:INFO:toasting with 8 threads in chunks of 256 files
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceMainBuildingInterior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceArcadeTop01Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Orcrest\ArenaBase.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceMainBuilding.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Caravanserie\Caravanserai.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper03.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper05.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Noria\Noria01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceNeedleTower.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceCornerTowerInterior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower01White.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower01Red.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Fortress\FortressGate02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Fortress\FortressGate01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceThrone.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper02a.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Caravanserie\CaravanseraiInterior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceBase.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceDome.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper02b.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceArcadeBottom02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceArcadeBottom01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper04.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceCornerTower.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building06.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Minotaur\MinotaurHut02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower02White.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower02Red.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper02aInterior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Minotaur\MinotaurHut01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building04.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceArcadeTop01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceArcadeBottom01Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Noria\Noria02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\WallLowerOuterGate.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building08Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper02Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building10Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower03.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building10.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building05.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\WallLowerInnerCorner.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceBalconyHouse.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building08.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Orcrest\Building03.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building09.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building09Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceCatStatue.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper04Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper05Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building03.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Caravanserie\CaravanseraiStairs.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\WallLowerOuter02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper01Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Fortress\FortressWall01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceColumn01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceFountain.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpperFountain01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceGateHouse.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building07.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building02BInterior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building02Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower05.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpper03Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building07B.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\CityWallTower.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building05Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\WallLowerInnerStraight.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Palace\BalconySection01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Huts\DomeHut01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building03Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building03BInterior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Fortress\FortressTower01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Palace\PalaceInteriorWallStairs.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building04Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building07Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\WallUpperTowerWooden.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower03Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Palace\ArchSection1024.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Orcrest\Building01B.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\WallUpperInner01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Orcrest\Building01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\WallStairs.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\WallStairs02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Minotaur\MinotaurTotem01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Misc\CarpetFrame.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building06Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower04.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLowerOriel01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpperOriel01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\DoorFrameStone.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceDoor01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingUpperOriel02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\DoorFrameStoneInterior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower04Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\WallLowerOuter01.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower01Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\WallUpperInnerTower.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\WallLowerInnerStraightShort.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\CityArch02.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Building01Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Orcrest\Building01Interior.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLowerOriel03.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Noria\Noria03.nif (skipped) ===
pyffi.toaster:3060:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\Palace\PalaceNeedleTower_far.nif ===
pyffi.toaster:3060:INFO: --- opt_cleanfarnif ---
pyffi.toaster:3060:INFO: ~~~ NiNode [Scene Root] ~~~
pyffi.toaster:3060:INFO: ~~~ NiTriShape [Circle.011] ~~~
pyffi.toaster:3060:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:3060:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:3060:INFO: ~~~ NiMaterialProperty [deco] ~~~
pyffi.toaster:3060:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:3060:INFO: ~~~ NiTriShape [Circlepyffi.toaster:4376:INFO:=== ./out\Meshes\Anequina\Architecture\Orcrest\ArenaGate.nif (skipped) ===
pyffi.toaster:4376:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Palace\PalaceInteriorPillar.nif (skipped) ===
pyffi.toaster:4376:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLowerOriel05.nif (skipped) ===
pyffi.toaster:4376:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLowerOriel06.nif (skipped) ===
pyffi.toaster:4376:INFO:=== ./out\Meshes\Anequina\Architecture\Dune\BuildingLower02Interior.nif (skipped) ===
pyffi.toaster:4376:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Palace\ArchwayEnd02.nif (skipped) ===
pyffi.toaster:4376:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\Palace\ArchwayEnd01.nif (skipped) ===
pyffi.toaster:4376:INFO:=== ./out\Meshes\Anequina\Architecture\Corinthe\CityWallTower_far.nif ===
pyffi.toaster:4376:INFO: --- opt_cleanfarnif ---
pyffi.toaster:4376:INFO: ~~~ NiNode [Scene Root] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:0] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:1] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:2] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:3] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:4] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:5] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:6] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:7] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:8] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:9] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:10] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:11] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:12] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShapeData [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTriShape [Scene Root:13] ~~~
pyffi.toaster:4376:INFO: ~~~ NiMaterialProperty [Material.000001] ~~~
pyffi.toaster:4376:INFO: ~~~ NiTexturingProperty [] ~~~
pyffi.toaster:4376:INFO: ~~~ NiSourceTexture [] ~~~

What might I be doing wrong?

Thanks in advance!
-Decrepit-
User avatar
Karl harris
 
Posts: 3423
Joined: Thu May 17, 2007 3:17 pm

Post » Wed Mar 30, 2011 3:03 am

Might be in the wrong thread, but after running this I thought that I was ok. Until I got to the Imperial Prison.... See screenshot:

[img]http://img14.imageshack.us/img14/1364/oblivion201103070932575.jpg[/img]

Any idea what happened? Thanks.

I'll look around the Imperial Prison to see if I can have that, too. I'm using only Oblivion.bsa meshes after PyFFI optimization.


(Edit)
I have looked around, in and out of the imperial prision and can't find the bug in that image, at least with only Oblivion.bsa PyFFIed.




Utility seems to be doing its job, except I can't see progress in the Command Window, as I can with standard PyFFi.

What might I be doing wrong?

There's nothing wrong.

Since I used a simple batch script to call PyFFI on each subsequent pass, it is performing the actions as long as the window is open. When the program finishes the window closes.

I don't know how to pass the contents of the PyFFI output (besides logging) directly to the batch command line screen, since the progress bar comes from the program itself.
User avatar
Maya Maya
 
Posts: 3511
Joined: Wed Jul 05, 2006 7:35 pm

Post » Wed Mar 30, 2011 2:50 am

:trophy: Big big Kudo ulrim :trophy: !
Everytime I was trying to use Pyffi, the meshes were always staying in the "in" folder (which made me suspicious and not uisng them)
But with your kit, everything run as a charm.

Thank you
User avatar
Code Affinity
 
Posts: 3325
Joined: Wed Jun 13, 2007 11:11 am

Post » Wed Mar 30, 2011 5:50 am

Very nice Ulrim! I'll have to give this a try, thanks.
The documentation states Python 2.6.6 is required; has anyone tried it with the "final" version of Python 2, 2.7.1?
User avatar
Add Me
 
Posts: 3486
Joined: Thu Jul 05, 2007 8:21 am

Post » Wed Mar 30, 2011 5:17 am

There are still some caveats with using PyFFI.

One of them is lack of logging for some meshes. It usualy goes like this in the command prompt screen:
No handlers could be found for logger "pyffi.nif.nitribasedgeom"No handlers could be found for logger "pyffi.utils.mathutils"


This means the mesh that was just optimized did not make it into the log file even though it was processed.

There should be no problem using Python 2.7 but I haven't tested it extensively.
Python 3 support for PyFFI is under development. I bet most of it will be done after the release of Blender 2.5 series.
User avatar
Jessica Phoenix
 
Posts: 3420
Joined: Sat Jun 24, 2006 8:49 am

Post » Wed Mar 30, 2011 2:45 am

You'd have to be careful with installing Python 2.7 though, I don't think Bash supports it yet, and it certainly doesn't support Python 3 yet.
User avatar
Amy Masters
 
Posts: 3277
Joined: Thu Jun 22, 2006 10:26 am

Post » Wed Mar 30, 2011 8:08 am

I forgot to ask something which is probably obvious but here it is:

After the pyffi cycle is over, do I need to copy - no replace to all or does the out folder contains the already/no need to be optimized meshes too ?
User avatar
marina
 
Posts: 3401
Joined: Tue Mar 13, 2007 10:02 pm

Post » Wed Mar 30, 2011 6:19 am

I forgot to ask something which is probably obvious but here it is:

After the pyffi cycle is over, do I need to copy - no replace to all or does the out folder contains the already/no need to be optimized meshes too ?


Assuming you have a complex set of meshes to optimize inside the folder "in", the optimization process only populates the folder "out" with the meshes that were safe to optimize (the skip list expressions suggested in the PyFFI threads and the forums).

In the end, there is the possibility that not every mesh was optimized and placed inside the "out" folder. Again, in there you only find meshes that should be safe to be optimized.

To assemble the complete set of files, you should overwrite the contents of the "in" folder with the contents of the "out" folder.

As an example, to assemble an optimized Oblivion.bsa you would have to follow these steps:
1) unpack the entire bsa to the "in" folder
2) run PyFFI
3) move or copy over everything inside the "out" folder back to the "in" folder
4) create new bsa from directory "in"
User avatar
KIng James
 
Posts: 3499
Joined: Wed Sep 26, 2007 2:54 pm

Post » Wed Mar 30, 2011 7:12 am

Thank you
you just answered the question I had.
Hop to work Pyffi while I'm going to sleep ;)
User avatar
Captian Caveman
 
Posts: 3410
Joined: Thu Sep 20, 2007 5:36 am

Post » Wed Mar 30, 2011 12:21 pm

I'll look around the Imperial Prison to see if I can have that, too. I'm using only Oblivion.bsa meshes after PyFFI optimization.


(Edit)
I have looked around, in and out of the imperial prision and can't find the bug in that image, at least with only Oblivion.bsa PyFFIed.


I am using QTP3. So, probably came from there.
User avatar
Dustin Brown
 
Posts: 3307
Joined: Sun Sep 30, 2007 6:55 am

Post » Wed Mar 30, 2011 2:59 pm

I am using QTP3. So, probably came from there.


I used these configuration files to build my optimized Oblivion.bsa but it was made with PyFFI 2.1.6.

Since I started using PyFFI 2.1.8, I have had no issues on the mods I use so far. However, when I rebuilt my bsa with the 2.1.8 version Oblivion crashes on exteriors. Now that is odd - I'm doing some more testing.

Are you using version 2.1.8 as well?
User avatar
joeK
 
Posts: 3370
Joined: Tue Jul 10, 2007 10:22 am

Post » Wed Mar 30, 2011 12:01 am

I used these configuration files to build my optimized Oblivion.bsa but it was made with PyFFI 2.1.6.

Since I started using PyFFI 2.1.8, I have had no issues on the mods I use so far. However, when I rebuilt my bsa with the 2.1.8 version Oblivion crashes on exteriors. Now that is odd - I'm doing some more testing.

Are you using version 2.1.8 as well?

2.19 actually.

I also asked over at the PYFFI thread, as well. May not be your files.
User avatar
NEGRO
 
Posts: 3398
Joined: Sat Sep 01, 2007 12:14 am

Post » Wed Mar 30, 2011 10:40 am

Isn't there a way to make Pyffi use these ini configurations with right-click->optimize with Pyffi? Also, maybe I have missed the point of this utility - I figured this was one of the 2 ways to run Pyffi, and this now has the ini suggestions that Arthmoor and Vorians made included?
User avatar
Shannon Lockwood
 
Posts: 3373
Joined: Wed Aug 08, 2007 12:38 pm

Post » Wed Mar 30, 2011 3:10 pm

I would like to use this but am hesitant to upgade to PyFFI 2.1.8 because I read that there's an issue with stuff falling through floors. Is this true? I have had some complaints of stuff falling through floors with my Imperial Furniture renovated mod, although it seems to occur mostly with mod homes, not vanilla.

I would also like to second the request to be able to run these ini configurations with right-click -> optimize with PyFFI.
User avatar
Janine Rose
 
Posts: 3428
Joined: Wed Feb 14, 2007 6:59 pm

Post » Wed Mar 30, 2011 6:45 am

I would like to use this but am hesitant to upgade to PyFFI 2.1.8 because I read that there's an issue with stuff falling through floors. Is this true? I have had some complaints of stuff falling through floors with my Imperial Furniture renovated mod, although it seems to occur mostly with mod homes, not vanilla.

I would also like to second the request to be able to run these ini configurations with right-click -> optimize with PyFFI.

nm
User avatar
Amy Gibson
 
Posts: 3540
Joined: Wed Oct 04, 2006 2:11 pm

Post » Wed Mar 30, 2011 3:38 am

@andalaybay:
The stuff falling through floors thing is supposedly fixed int PyFFI v2.1.9b5 according to http://sourceforge.net/tracker/index.php?func=detail&aid=3194017&group_id=199269&atid=968813.
User avatar
daniel royle
 
Posts: 3439
Joined: Thu May 17, 2007 8:44 am

Post » Tue Mar 29, 2011 11:03 pm

I'm a noob with PyFFI so decided to use this to optimize vanilla meshes.

I simply copy/pasted my Data/Meshes folder into the 'In' folder or this kit, ran the .bat file and let it go...and go...and go...and go...and...lol, you get the idea!

It took a long time to optimize the whole folder but when it finished I dropped the optimized Meshes folder into the Data folder, let it overwrite everything it needed to and so far the game's running better than it ever has!

Thanks for this!

Aen
User avatar
Sabrina garzotto
 
Posts: 3384
Joined: Fri Dec 29, 2006 4:58 pm

Next

Return to IV - Oblivion