Difference between revisions of "Nif Optimization"

From the Oblivion ConstructionSet Wiki
Jump to navigation Jump to search
imported>Razorwing
(New page: Category:Modeling_and_Texturing_Tutorials Category:Tutorials Created by Razorwing from [http://www.silgrad.com/ Silgrad Tower] My name is Razorwing from the [...)
 
imported>Amorilia
(updated info about optimizer script)
Line 4: Line 4:
Created by [[User:Razorwing|Razorwing]] from [http://www.silgrad.com/ Silgrad Tower]
Created by [[User:Razorwing|Razorwing]] from [http://www.silgrad.com/ Silgrad Tower]


==Background==


My name is Razorwing from the [http://www.silgrad.com/ Silgrad Tower] team. If you're a 3D Studio Max modeller like me and haven't tried [http://niftools.sourceforge.net/forum/profile.php?mode=viewprofile&u=4 amorilia]'s script before you'll most likely want to read this information.
My name is Razorwing from the [http://www.silgrad.com/ Silgrad Tower] team. If you're a 3D Studio Max modeller like me and haven't tried [http://niftools.sourceforge.net/forum/profile.php?mode=viewprofile&u=4 amorilia]'s script before you'll most likely want to read this information.
Line 29: Line 30:
The script is written in a different language than Nifskope is, so it's not likely it will be incorporated into the program in the foreseeable future. But one of the great things about using the script vs. importing/re-exporting through Blender is that it can do batch operations.
The script is written in a different language than Nifskope is, so it's not likely it will be incorporated into the program in the foreseeable future. But one of the great things about using the script vs. importing/re-exporting through Blender is that it can do batch operations.


==Installation==


To get the script to work you'll need to get [http://www.python.org/download/ Python 2.5] and [http://sourceforge.net/projects/pyffi/ PyFFI 0.4.7] (or later versions if you're reading this in the future). Python is a freeware programming language and executable, while [http://niftools.sourceforge.net/forum/profile.php?mode=viewprofile&u=4 amorilia]'s PyFFI is an interface of sorts between Python and nif files. You'll also need to work through DOS, but if you're uncomfortable using it then don't worry - I'll explain all the steps.
To get the script to work you need Python and PyFFI. Python is an open source programming language, while PyFFI is an interface between Python and nif files.


# Install [http://www.python.org/download/ Python 2.5] (in this article it will be assume that you use the default installation path, C:\Python25).
# Install [http://sourceforge.net/project/platformdownload.php?group_id=199269&sel_platform=3089 PyFFI].


# Install Python first, and then PyFFI.
==Using the Optimizer from the Windows Explorer==
# Create a folder called "python" on your root C:\ drive.
# Make a full backup of all nifs you plan to optimize before proceeding. The script is not yet fully tested and if it runs into a nif it doesn't understand it may corrupt it and thereby destroy it.
# Copy the nifs you want to optimize to "C:\python". You might be tempted to drop a large number of models there, but I wouldn't advise that since the script stops when it runs into a nif it doesn't understand, so it's best to do it one folder at a time.
# Open the start menu in Windows and select Run ([http://s11.photobucket.com/albums/a177/SilgradTower/AmoriliasScript/RunOnStartMenu.jpg img]). In the popup, write cmd and hit enter ([http://s11.photobucket.com/albums/a177/SilgradTower/AmoriliasScript/cmd.jpg img]). Now a DOS window will appear. Write the following. <enter> means hit the enter key without leaving a blankspace at the end.


For simple usage you can use it directly from the Windows explorer.


cd C:\Program Files\Python25 <enter>
#Right click on the nif you wish to optimize.
#Select "Optimize with PyFFI".
#A DOS window will open, asking for confirmation. Type the letter Y and hit enter.
#You will get to see the results of the optimization.
#Test your optimized nif file with nifskope and in the game to make sure that nothing has been lost. If the script makes a visual change to your nif file, report it on the [http://niftools.sourceforge.net/forum/ niftools forum].


python Scripts\nifoptimize.py "C:\python" <enter>
==Using the Optimizer from the Command Prompt==


To use the more advanced features of the nif optimizer, such as batch processing of many nifs with a single command, and excluding particular block types from optimization, you need to use the script through the command prompt. If you are uncomfortable using the command prompt, then do not worry, all the steps are explained.


[[Image:PythonScriptInDos.jpg|thumb| This is what the DOS window should look like if using the default commands.]]
===Running nifoptimize.py in the Windows shell===
 
# Create a folder called "nifoptimize" on your C: drive (the name is not crucial, you can choose whichever folder name you like).
# Make a full backup of all nifs you plan to optimize before proceeding. If the script runs into a bug then it may corrupt your nif and thereby destroy it.
# Copy the nifs you want to optimize to "C:\nifoptimize".
# Open the start menu in Windows and select Run ([http://s11.photobucket.com/albums/a177/SilgradTower/AmoriliasScript/RunOnStartMenu.jpg img]). In the popup, write cmd and hit enter ([http://s11.photobucket.com/albums/a177/SilgradTower/AmoriliasScript/cmd.jpg img]). Now a Windows shell with command prompt will appear. Write


cd C:\Python25
python.exe Scripts\nifoptimize.py C:\nifoptimize


NOTES.
and hit enter.


* In the first line you tell DOS to browse to your Python install folder. If you didn't install it in the same folder as I did then just replace the local url with your own local url. If you're unsure what the local url is, open the start menu then go to "Programs > Python 2.5", right-click any of the shortcuts and choose properties. Open the Shortcut tab, where the local url is displayed in the "Target:" textbox. Write that url in your DOS window in the same format as the example.
[[Image:PythonScriptInDos.jpg|thumb| This is what the DOS window should look like if using the default commands.]]
* In the second line you're telling DOS to make Python run a script and process everything in the folder C:\python. If you created a different folder, for instance because your harddrive has the device letter D:\, just write that instead.


===Notes===


If everything works like it should, you should get a warning and a confirmation prompt. Write the letter Y (in uppercase) and hit return. Now the program will work it's way through all the nifs in the folder.
* The first line tells the Windows shell to go to your Python install folder. If you did not install Python in the default location then just replace the folder with your Python install folder. If you are unsure about where Python is installed, open the start menu then go to "Programs > Python 2.5", right-click any of the shortcuts and choose properties. Open the Shortcut tab, where the Python path is displayed in the "Target:" textbox. Write that url in your DOS window in the same format as the example.
* The second line makes Python run the nifoptimize.py script, which will process all nif files in the folder C:\nifoptimize.


If everything works like it should, you should get a warning and a confirmation prompt. Write the letter Y and hit return. Now the program will work it's way through all the nifs in the folder.


If the script comes across a nif it doesn't understand it will stop working and display an error. Just to avoid any risk of using a corrupted nif you should delete everything in the C:\python folder and start the process over again - but this time without the nif that caused you problems.
If the script comes across a nif it doesn't understand it will display an error, but it should continue working. The problematic nif should be left untouched, but be sure to check with NifSkope, just to avoid any risk of using a corrupted nif.




Don't forget to doublecheck that all nifs work afterwards. If it opens in Nifskope and look alright then I'd say it's a safe bet it's not corrupted.
Don't forget to doublecheck that all nifs work afterwards. If it opens in Nifskope and look alright then I'd say it's a safe bet it's not corrupted.


===Command Line Options===
(WIP: WILL ADD INFO ABOUT THESE LATER)


Good luck, and happy optimizing!
Good luck, and happy optimizing!

Revision as of 13:10, 14 January 2008


Created by Razorwing from Silgrad Tower

Background

My name is Razorwing from the Silgrad Tower team. If you're a 3D Studio Max modeller like me and haven't tried amorilia's script before you'll most likely want to read this information.


First I'll make a run-of-the-mill disclaimer that you're using this method at your own risk. It's not tested 100% and could cause you problems. All I can say is that I've used it quite a lot myself and haven't experienced any problems at all.


The 3D Studio Max exporter created by the Niftools group has a ton of perks. Whom can't love the ability to set up arrangements of box collision straight in the program, or why not the amazing ability to create convex shapes. But the exporter does have one flaw, and unfortunately it's a very serious one. It bloats your model with hundreds, sometimes thousands, of redundant and invisible faces. If you haven't noticed the effect before, select your model in 3D Studio Max's viewport then right-click and choose 'Properties...'. Note how many faces Max says the model has. Now open the nif in Nifskope and check out how many "Num Triangles" are reported on the NiTriStripsData block (use a calculator if you have multiple NiTriStrips). You can also see the number reported in the status bar of the Construction Set by selecting it in the world window.


File:PythonScriptBeforeOptimize.jpg
My wooden cup exported from Max - 779 faces

In the case of my wooden cup Max says it has 219 faces while Nifskope says it has 779 faces -- in other words, the export process has bloated the model by 350% (!). You can imagine the problem becomes dire if you place ten wooden cups in a home since you'll lose ~5,500 faces from the facecount budget. If you use a lot of custom models like Silgrad Tower does then you can imagine how the problem affects an interior. For instance development ceased on one of our taverns because the facecount budget had been maxed out, tallying 452,349 faces, and the only remedy would have been to divide it into two cells. But after running amorilia's script on our model library the tavern's facecount shrunk to an astonishing 284,257 faces in one fell swoop!


The problem with bloated faces can't be remedied in either 3D Studio Max nor Nifskope. You can achieve a slight optimization by restripifying the model through Nifskope, but it's not a substantial improvement and half the time the process actually increase the number of faces. It would also seem you can save a lot of faces by not stripifying your model -- unticking the "Generate Strips" option on the 3D Studio Max export panel -- but that is a really bad idea, so I won't go into detail on how those methods work. I just wanted to mention them in case the question came up as to why the methods weren't used.


File:PythonScriptAfterOptimize.jpg
My wooden cup after amorilia's script - 219 faces

But as it happens, the Blender exporter does not have the same problem with bloating as the 3D Studio Max exporter does. And thankfully amorilla, head of Blender script development over at Niftools, has created a script that optimizes nif files outside of Blender. As a sweet bonus the script also updates the tangent spaces of your models, which is a real timesaver. The algorhitm for updating tangent spaces seem on par with Nifskopes, while the 3D Studio Max exporter's UTS function is slightly worse (but better than no UTS at all, obviously).


The script is written in a different language than Nifskope is, so it's not likely it will be incorporated into the program in the foreseeable future. But one of the great things about using the script vs. importing/re-exporting through Blender is that it can do batch operations.

Installation

To get the script to work you need Python and PyFFI. Python is an open source programming language, while PyFFI is an interface between Python and nif files.

  1. Install Python 2.5 (in this article it will be assume that you use the default installation path, C:\Python25).
  2. Install PyFFI.

Using the Optimizer from the Windows Explorer

For simple usage you can use it directly from the Windows explorer.

  1. Right click on the nif you wish to optimize.
  2. Select "Optimize with PyFFI".
  3. A DOS window will open, asking for confirmation. Type the letter Y and hit enter.
  4. You will get to see the results of the optimization.
  5. Test your optimized nif file with nifskope and in the game to make sure that nothing has been lost. If the script makes a visual change to your nif file, report it on the niftools forum.

Using the Optimizer from the Command Prompt

To use the more advanced features of the nif optimizer, such as batch processing of many nifs with a single command, and excluding particular block types from optimization, you need to use the script through the command prompt. If you are uncomfortable using the command prompt, then do not worry, all the steps are explained.

Running nifoptimize.py in the Windows shell

  1. Create a folder called "nifoptimize" on your C: drive (the name is not crucial, you can choose whichever folder name you like).
  2. Make a full backup of all nifs you plan to optimize before proceeding. If the script runs into a bug then it may corrupt your nif and thereby destroy it.
  3. Copy the nifs you want to optimize to "C:\nifoptimize".
  4. Open the start menu in Windows and select Run (img). In the popup, write cmd and hit enter (img). Now a Windows shell with command prompt will appear. Write
cd C:\Python25
python.exe Scripts\nifoptimize.py C:\nifoptimize

and hit enter.

File:PythonScriptInDos.jpg
This is what the DOS window should look like if using the default commands.

Notes

  • The first line tells the Windows shell to go to your Python install folder. If you did not install Python in the default location then just replace the folder with your Python install folder. If you are unsure about where Python is installed, open the start menu then go to "Programs > Python 2.5", right-click any of the shortcuts and choose properties. Open the Shortcut tab, where the Python path is displayed in the "Target:" textbox. Write that url in your DOS window in the same format as the example.
  • The second line makes Python run the nifoptimize.py script, which will process all nif files in the folder C:\nifoptimize.

If everything works like it should, you should get a warning and a confirmation prompt. Write the letter Y and hit return. Now the program will work it's way through all the nifs in the folder.

If the script comes across a nif it doesn't understand it will display an error, but it should continue working. The problematic nif should be left untouched, but be sure to check with NifSkope, just to avoid any risk of using a corrupted nif.


Don't forget to doublecheck that all nifs work afterwards. If it opens in Nifskope and look alright then I'd say it's a safe bet it's not corrupted.

Command Line Options

(WIP: WILL ADD INFO ABOUT THESE LATER)

Good luck, and happy optimizing!