Release 2.1.10 (Oct 10, 2011)
- Fixed bspline data methods to handle invalid kfs with missing basis
data (reported by K’Aviash).
- Fixed mass, center, inertia methods to deal with cases where shape
is missing (reported by rlibiez, see niftools issue #3248754).
- Fixed center calculation of bhkListShape collisions, and fixed zero
division error when creating very small collision shapes (reported
by Koniption, see issues #3334577 and #3308638).
- Fixed shortcut to uninstaller in programs folder (reported by neomonkeus,
see niftools issue #3397540).
- Fixed geometry optimizer to handle cases where number of morph
vertices does not match number of shape vertices (reported by
rlibiez, see issue #3395484).
- Merged ulrim’s optimization kit, along with arthmoor’s improved ini
- Integrated far nif optimization with the general purpose optimize
spell (requested by Gratis_monsta, see issue #3177316).
- New shell_optimize.ini for configuring optimization as executed from
- Allow .ini files that do not have a [main] or [options] section.
- Fix Windows shell integration to point to the new shell_optimize.ini
file (reported by rlibiez, see issue #3415490).
- Fixed zombie process problem on Windows when a toaster was running with
multiple jobs (reported by Alphanos, see issue #3390826).
Release 2.1.9 (Mar 26, 2011)
- Improved documentation of .dir/.img unpack and pack scripts.
- Bugfix in .dir format, so it can now also handle single record
- Added new script to make and apply patches (functionality is identical to
and OnmyojiOmn’s and jonwd7’s pyffi patcher scripts, but it is
written in Python to work on all platforms).
- New fix_emptyskeletonroots spell (automatically included in the
optimize spell) to fix issues with nifs that do not have their
NiSkinInstance skeleton root set (fixes #3174085, reported by
- Fixed logging issue on Windows platform with multithreading enabled
(fixes issue #3174339, reported by xjdhdr).
- Fixed QSkope shortcut issue when path contains spaces (reported by
- Added support for BSPackedAdditionalGeometryData (reported by
Ghostwalker71, niftools issue #3177847).
- Skip terminal chars in mopper output (fixes issues with running
mopper under wine).
- Bugfix in patch_recursive_make/apply scripts for “deep” folder
layouts (fixes issue #3193914, reported by xjdhdr).
- Do not pack collisions in OL_CLUTTER (fixes issue #3194017 reported
- Fixed issue with skipping terminal chars in mopper output on Windows
platform (fixes issue #3205569, reported and diagnosed by ulrim).
- Updates for Bully SE format (fixes issue reported by Tosyk).
- Bully SE nif header reading fix for BBonusB.nft.
- Added initial support for Epic Mickey (reported and test files
provided by Tosyk).
- Bugfix for NiMesh read and write.
- Updated dump_pixeldata spell to enable it to export Bully SE’s nft
- Disabled copy in patch_recursive_apply script (see issue #3219744,
suggested by ulrim).
- Pass additional arguments of patch_recursive_apply/make to the patch
command (see issue #3219744, suggested by ulrim).
- Fix nif optimizer in case it contains tangent space data but no uv
data (see issue #3218751, reported by krimhorn).
- Handle removal of redundant triangles when updating dismember skin
partitions (see issue #3218751, reported by krimhorn).
- Fix vertex cache optimizer to handle more meshes with more than 255
triangles per vertex (see issue #3218751, reported by krimhorn).
- Skipping meshes that have NiAdditionalGeometryData (until we
understand what this data does and how to optimize it).
- Sane default settings for bhkRigidBody unknowns to ensure that
constraints behave properly (contributed by Koniption).
- Added ini file to unpack Bully SE .nft files.
Release 2.1.8 (Feb 4, 2011)
- Quickhull bugfix for precision argument in degenerate cases
(issue #3163949, fix contributed by liuhuanjim013).
- Fixed issue with detecting box shapes on degenerate collision meshes
(fixes issue #3145104, reported by Gratis_monsta).
- Ensure that enum has valid default value.
- Added CStreamableAssetData for Divinity 2 (reported by pertinen,
niftools issue #3164929).
- NiPixelData.save_as_dds fourcc flag bugfix.
- Added Rockstar .dir format (used in Bully SE).
- Added Rockstar .dir/.img unpack and pack scripts (only tested for Bully SE).
Release 2.1.7 (Jan 23, 2011)
- Added support for Fallout New Vegas (contributed by throttlekitty
- Updated geometry optimizer to keep dismember body parts, for Fallout
3 and Fallout New Vegas (fixes issue #3025691 reported by Chaky).
- Added flag to enable debugging in vertex cache algorithm, to assess
how suboptimal the solution is on any particular mesh (testing
reveals that it finds the globally optimal solution in more than 99%
of all iterations, for typical meshes).
- New check_triangles_atvr spell to find optimal parameters for vertex
cache algorithm by simulated annealing.
- Fixed send_geometries_to_bind_position,
send_bones_to_bind_position in case skin instance has empty bone
references (fixes issue #3114079, reported by drakonnen).
- Fix for verbose option in multithread mode (reported by
- Fix optimize spell when no vertices are left after removing duplicate
vertices and degenerate triangles (reported by Gratis_monsta).
- Fixed tangent space issue along uv seams (reported by Gratis_monsta
and Tommy_H, see issue #3120585).
- Log an error instead of raising an exception on invalid enum values
(fixes issue #3127161, reported by rlibiez).
- Disabled 2to3 in Windows installer; the Python 3 version of PyFFI
will be released separately.
Release 2.1.6 (Nov 13, 2010)
- The optimize spell now includes two new spells:
opt_collisiongeometry for optimizing triangle based collisions, and
opt_collisionbox for optimizing simple box collisions. This should
result in faster loads and probably also a small but noticable
- Fixed opt_collisiongeometry for multimaterial mopps (reported by
wildcard_25, see issue #3058096).
- New SpellCleanFarNif spell (suggested by wildcard_25, see issue
- Bad normals are now ignored when packing a bhkNiTriStripsShape
(fixes issue #3060025, reported by rlibiez).
- The opt_delunusedbones spell no longer removes bones if they have a
collision object (fixes issue #3064083, reported by wildcard_25).
- If the jobs option is not specified in the toaster, then the number
of processors is used—requires Python 2.6 or higher (suggested by
chaky2, see issue #3052715, implements issue #3065503).
- New opt_delzeroscale spell to delete branches with zero scale
(suggested by chaky2, see issue #3013004).
- The opt_mergeduplicates spell now ignores (non-special) material
names, so identical materials with different names will get merged
as well (suggested by chaky2, see issue #3013004).
- New spell to fix subshape counts (see issue #3060025, reported by
rlibiez), it is included in the optimize spell.
- New opt_collisionbox spell which automatically converts triangle
based box collisions to primitive box collisions, which are much
faster in-game (contributed by PacificMorrowind).
- Optimizer spell now uses triangles to represent skin partitions
(improves in-game fps).
- Better vertex map calculation when calculating skin partitions
(improves in-game fps).
- Optimizer now always triangulates (improves in-game fps).
Stripification will be readded later in a modularized version of the
optimizer spell, for those that want minimal file size rather than
- Much faster implementation of vertex cache algorithm (now runs in
linear time instead of quadratic time).
- Check triangle count when converting to box shape (fixes issue
- Bugfix in vertex map reordering (fixes most nifs reported in issue
- Bugfix in vertex cache algorithm (fixes a nif reported in issue
- Cover degenerate case in ATVR calculation when there are no vertices
(fixes a nif reported in issue #3071616).
- Cover degenerate case when calculating cache optimized vertex map
(fixes a nif reported in issue #3071616).
- Remove branches if they have no triangles (again fixes a nif
reported in issue #3071616).
Release 2.1.5 (Jul 18, 2010)
- Improved interface for TRI files, and a bugfix in TRI file writing.
- Added EGT file support.
- The fix_texturepath spell now also converts double backslash in
single backslash (suggested by Baphometal).
- Bugfix in save_as_dds function for newer NiPixelData blocks (reported
by norocelmiau, issue #2996800).
- Added support for Laxe Lore nifs (reported by bobsobol, issue
- New spells:
- opt_collisiongeometry: to optimize collision geometry in nifs
(contributed by PacificMorrowind).
- check_materialemissivevalue: checks (and warns) about high values
in material emissive settings (contributed by PacificMorrowind).
- modify_mirroranimation: mirrors an animation (specifically left to
right and vice versa) - use it to for example turn a right hand
punch anim into a left hand punch anim (contributed by
- Added big-endian support.
- Removed **kwargs argument passing for faster and more transparant
implementation (reading and writing is now about 8% faster).
- Do not merge BSShaderProperty blocks (reported by Chaky, niftools issue
- Installer now recognizes Maya 2011.
- Fixed NiPSysData read and write for Fallout 3 (reported by Chaky,
niftools issue #3010861).
Release 2.1.4 (Mar 19, 2010)
- Extra names in oblivion_optimize.ini skip list for known mods
(contributed by Tommy_H).
- New spells
- Windows right-click optimize method now uses default.ini and
- fix_texturepath now fixes paths that include the whole drive path
to just the textures/... path.
- The optimize spell has been fixed to update Fallout 3 style tangent
space (fixes issue #2941568, reported by xjdhdr).
Release 2.1.3 (Feb 20, 2010)
- Added toaster option to process files in archives (not yet functional).
- Added toaster option to resume, by skipping existing files in the
- Toaster now removes incompletely written files on CTRL-C (to avoid
- Fixed makefarnif spell (now no longer deletes vertex colors).
- New spells
- The niftoaster optimize spell now also includes fix_delunusedroots.
- Removed unused pep8 attribute conversion code.
- Toasters can now be configured from an ini file.
- bhkMalleableHinge update_a_b bugfix (reported by Ghostwalker71).
Release 2.1.2 (Jan 16, 2010)
- Fallout 3 skin partition flag bugfix (reported by Ghostwalker71).
- Fixed bug in optimize spell, when has_vertex_colors was False but vertex
color array was present (reported by Baphometal, debugged by
- Initial bsa file support (Morrowind, Oblivion, and Fallout 3).
Release 2.1.1 (Jan 11, 2010)
- Accidently released corrupted nif.xml (affected Fallout 3), so this is just
a quick bugfix release including the correct nif.xml.
Release 2.1.0 (Jan 10, 2010)
- Improved windows installer.
- Compatibility fix for Python 2.5 users (reported by mac1415).
- Renamed some internal modules for pep8 compliance.
- All classes and attributes are now in pep8 style. For compatibility,
camelCase attributes are generated too (however this will be dropped for
- Renamed a few niftoaster spells.
- fix_strip -> modify_delbranches
- fix_disableparallax -> modify_disableparallax
- New niftoaster spells.
- fix_cleanstringpalette: removes unused strings from string palette.
- modify_substitutestringpalette: regular expression substitution of
strings in a string palette.
- modify_scaleanimationtime: numeric scaling of animations.
- modify_reverseanimation: reverses an animation (ie useful for making
only an open animation and then running this to get a close animation).
- modify_collisionmaterial: sets any collision materials in a nif to
- modify_delskinshapes: Delete any geometries with a material name of
- modify_texturepathlowres: Changes the texture path by replacing
‘textures/‘ with ‘textures/lowres/‘. used mainly for making _far.nifs.
- modify_addstencilprop: Adds a NiStencilProperty to each geometry if it is
- modify_substitutetexturepath: regular expression substitution of
a texture path.
- modify_makeskinlessnif: Spell to make fleshless CMR (Custom Model Races)
clothing/armour type nifs. (runs modify_delskinshapes and modify_addstencilprop)
- modify_makefarnif: Spell to make _far type nifs.
- Bugfix for niftoaster dump spell.
- New –suffix option for toaster (similar to the already existing –prefix
- New –skip and –only toaster options to toast files by regular expression.
- New –jobs toaster option which enables multithreaded toasting.
- New –source-dir and –dest-dir options to save toasted nifs in a given
- Added workaround for memory leaks (at the moment requires –jobs >= 2 to be
- The niftoaster opt_geometry spell now always skips nif files when a
similarly named tri or egm file is found.
- Added support for Atlantica nifs.
- Added support for Joymaster Interactive Howling Sword nifs.
Release 2.0.5 (Nov 23, 2009)
- Added regression test and fixed rare bug in stripification (reported by
PacificMorrowind, see issue #2889048).
- Improved strip stitching algorithm: much more efficient, and
now rarely needs more than 2 stitches per strip.
- Improved stripifier algorithm: runs about 30% faster, and usually
yields slightly better strips.
- Added new modify_texturepath and modify_collisiontype niftoaster spells
(contributed by PacificMorrowind).
- Various fixes and improvements for 126.96.36.199+ nifs.
- Check endian type when processing nifs.
- Source release now includes missing egm.xml and tri.xml files (reported
by skomut, fixes issue #2902125).
Release 2.0.4 (Nov 10, 2009)
- Write NaN on float overflow.
- Use pytristrip if it is installed.
- Implemented the FaceGen egm (done) and tri (in progress) file formats
with help of Scanti and Carver13.
- The nif dump_pixeldata spell now also dumps NiPersistentSrcTextureRenderData
(reported by lusht).
- Set TSpace flags 16 to signal presence of tangent space data (fixes Fallout 3
issue, reported by Miaximus).
Release 2.0.3 (Sep 28, 2009)
- Various bugfixes for the Aion cgf format.
- Updates for nif.xml to support more recent nif versions (188.8.131.52,
184.108.40.206, and 220.127.116.11).
Release 2.0.2 (Aug 12, 2009)
- The source has been updated to be Python 3.x compatible via 2to3.
- New unified installer which works for all versions of Python and
Maya at once (at the moment: 2.5, 2.6, 3.0, 3.1) and also for all
versions of Maya that use Python 2.5 and 2.6 (2008, 2009, and 2010,
including the 64 bit variants).
- Added support for Aion cgf files.
- Added support for NeoSteam header and footer.
- Log warning rather than raising exception on invalid links (fixes issue
#2818403 reported by abubakr125).
- Optimizer can now recover from invalid indices in strips (this fixes
some nifs mentioned in issue #2795837 by baphometal).
- Skin updater can now recover when some vertices have no weights
(this fixes some nifs mentioned in issue #2795837 by baphometal).
- Skip zero weights and add up weights of duplicated bones when
calculating vertex weights (this fixes some nifs mentioned in issue
#2795837 by baphometal).
- The nif optimizer can now handle NiTriShapeData attached as a
NiTriStrips data block (fixes some corrupt nifs provided by
baphometal in issue #2795837).
- Optimizer can now recover from NaN values in geometry (sample nifs
provided by baphometal).
- Do not attempt to optimize nifs with an insane amount of triangles,
but put out a warning instead.
- Log error rather than raising exception when end of nif file is not
reached (fixes issue with sample nif provided by baphometal).
Release 2.0.1 (Jul 22, 2009)
- Added Windows installer for Python 2.6.
- Updated mopper.exe compiled with msvc 2008 sp1 (fixes issue #2802413,
reported by pacmorrowind).
- Added pdb session to track cicular references and memory leaks (see
issues #2787602 and #2795837 reported by alexkapi12 and
- Added valgrind script to check memory usage, and to allow keeping
track of it between releases (see issues #2787602 and #2795837
reported by alexkapi12 and xfrancis147).
- Removed parenting in xml model from everywhere except Array, and
using weakrefs to avoid circular references, which helps with
garbage collection. Performance should now be slightly improved.
- Updates to xml object model expression syntax.
- Support for field qualifier ‘.’.
- Support for addition ‘+’.
- Updates to Targa format.
- Support for RLE compressed Targa files (test file contributed by
Alphax, see issue #2790494).
- Read Targa footer, if present (test file contributed by Alphax,
see issue #2790494).
- Improved interface: header, image, and footer are now global nodes.
- Updates to xsd object model.
- Classes and attributes for Collada format are now generated (but not
Release 2.0.0 (May 4, 2009)
- Windows installer now detects Maya 2008 and Maya 2009, and their 64 bit
variants, and can install itself into every Maya version that is found.
- Updates to the XML object model (affects CGF, DDS, KFM, NIF, and TGA).
- Class customizers are taken immediately from the format class, and not
from separate modules — all code from customization modules has been
moved into the main format classes. The result is that parsing is faster
by about 50 percent.
- clsFilePath removed, as it is no longer used.
- Updates and fixes for the KFM format.
- The Data element inherits from Header, and Header includes also all
animations, so it is more straightforward to edit files.
- The KFM files open again in QSkope.
- Updates for the CGF format.
- CHUNK_MAP no longer constructed in Data.__init__ but in a metaclass.
- Deprecated functions in CgfFormat have been removed.
- Updates for the NIF format.
- Synced nif.xml with nifskope’s xml (includes fixes for Lazeska).
- Removed deprecated scripts (niftexdump, nifdump, ffvt3rskinpartition,
- Fixed scaling bug on nifs whose tree has duplicate nodes. Scaling now no
longer works recursively, unless you use the scaling spell which handles
the duplication correctly.
- Updated module names to follow pep8 naming conventions: all modules have
lower case names.
Release 1.2.4 (Apr 21, 2009)
- Documentation is being converted to Sphinx. Currently some parts of the
documentation are slightly broken with epydoc. Hopefully the migration will
be complete in a month or so, resolving this issue.
- removed deprecated PyFFI.Spells code:
- old style spells no longer supported
- almost all old spells have been converted to the new spell system
(the few remaining ones will be ported for the next release)
- nif optimizer can be run on folders from the windows context menu
(right-click on any folder containing nifs and select “Optimize with PyFFI”)
- synced nif.xml with upstream (adds support for Worldshift, bug fixes)
- using weak references for Ptr type (this aids garbage collection)
- added fix_strip niftoaster spell which can remove branches selectively
(feature request #2164309)
- new getTangentSpace function for NiTriBasedGeom (works for both Oblivion
and Fallout 3 style tangent spaces)
- improved mergeSkeletonRoots function (will also merge roots of skins that
have no bones in common, this helps a lot with Morrowind imports)
- new sendDetachedGeometriesToNodePosition function and spell (helps a lot
with Morrowind imports)
- added support for color map and image data in the xml
- uses the new data model
- works again in QSkope
- xml object model:
- added support for multiplication and division operators in expressions
- fixes for unicode support (prepares for py3k)
Release 1.2.3 (Apr 2, 2009)
- removed reduce() calls (py3k compatibility)
- started converting print calls (py3k compatibility)
- removed relative imports (py3k compatibility)
- removed BSDiff module (not useful, very slow, use external bsdiff instead)
- fixed the update mopp spell for fallout 3 nifs
- fixed addShape in bhkPackedNiTriStripsShape for fallout 3 nifs
- niftoaster sends to stdout instead of stderr so output can be captured
(reported by razorwing)
Release 1.2.2 (Feb 15, 2009)
- cgf format:
- fixed various regression bugs that prevented qskope to run on cgf files
- updated to use the new data system
Release 1.2.1 (Feb 2, 2009)
- nif format:
- new addIntegerExtraData function for NiObjectNET
Release 1.2.0 (Jan 25, 2009)
- installer directs to Python 2.5.4 if not installed
- using logging module for log messages
- nif format:
- swapping tangents and binormals in xml; renaming binormals to bitangents
- updates for Fallout 3 format
- updated skin partition algorithm to work for Fallout 3
- new triangles argument
- new facemap argument to pre-define partitions (they will be split further
if needed to meet constraints)
- sort vertex weight list by weight in skin partitions (except if padbones
is true; then sorted by bone index, to keep compatibility with ffvt3r)
- option to maximize bone sharing
- mopps take material indices into account and compute welding info
(attempt to fix mopp multi-material issues, does not yet seem to work though)
- support for niftools bitflags by converting it to a bitstruct on the fly
- better algorithm for sending bones to bind position, including spells for
automating this function over a large number of nifs
- disable fast inverse in bind pos functions to increase numerical precision
- new algorithm to sync geometry bind poses, along with spell (this fixes
many issues with Morrowind imports and a few issues with Fallout 3 imports)
- more doctests for various functions
- a few more matrix functions (supNorm, substraction)
- dds format:
- updated to use the FileFormat.Data method (old inconvenient method removed)
- refactored the tree model
- all parenting functions are delegated to seperate DetailTree and GlobalTree
- the DetailNode and GlobalNode classes only implement the minimal
functions to calculate the hierarchy, but no longer host the more
advanced hierarchy functions and data (this will save memory and
speed up regular use of pyffi outside qskope)
- EdgeFilter for generic edge type filtering; this is now a
parameter for every method that needs to list child nodes
Release 1.1.0 (Nov 18, 2008)
- nif format:
- a large number of functions have moved from the optimizer spell to
to the main interface, so they can be easily used in other scripts
without having to import this spell module
- new convenience functions in NiObjectNET, NiAVObject, and NiNode
(setExtraDatas, setProperties, setEffects, setChildren, etc.)
- updates for Fallout 3
- new fix_addtangentspace spell to add missing tangent space blocks
- new fix_deltangentspace spell to remove tangent space blocks
- new fix_texturepath spell to change / into and to fix corrupted
newline characters (which sometimes resulted from older versions of
nifskope) in NiSourceTexture file paths
- new fix_clampmaterialalpha spell
- new fix_detachhavoktristripsdata spell
- the ffvt3r skin partition spell is now fix_ffvt3rskinpartition
- new opt_cleanreflists spell
- new opt_mergeduplicates spell
- new opt_geometry spell
- the optimize spell is now simply implemented as a combination of other
- new internal implementation of bsdiff algorithm
- removed cry dae filter (an improved version of this filter is now
bundled with ColladaCGF)
- reorganization of file format description code
- all generic format description specific code has been moved to the
- all xml/xsd description specific code has been moved to the
- new NifFormat.Data class which now implements all the nif file read and
- completely revamped spell system, which makes it much easier to customize
spells, and also enables more efficient implementations (thanks to tazpn for
some useful suggestions, see issue #2122196)
- toaster can call multiple spells at once
- toaster takes spell classes instead of modules
- for backwards compatibility, there is a class factory which turns any old
spell module into a new spell class (the Toaster class will automatically
convert any modules that it finds in its list of spells, so you do not need
to be worried about call the factory explicitly)
- early inspection of the header is possible, to avoid having to read all of
the file if no blocks of interest are present
- possibility to prevent the spell to cast itself on particular branches
(mostly useful to speed up the spell casting process)
- spells have callbacks for global initialization and finalization of
data within the toaster
- possibility to write output to a log file instead of to sys.stdout
- better messaging system (auto indentation, list nif tree as spell runs)
- support for spell hierarchies and spell grouping, in parallel or in series
or any combination of these
- replaced ad hoc class customization with partial classes (still wip
converting all the classes)
- xml object model expression parser
- implemented not operator
- expressions can combine multiple operators (only use this if the result
is independent of the order in which these operators are applied)
- new < and > operators
- support for vercond attribute for Fallout 3
- started on a new object model based on an ANTLR parser of a grammar aimed at
file format descriptions; this parser will eventually yield a more streamlined,
more optimized, and more customizable version of the current xml object model
(this is not yet bundled with the release, initial code is on svn)
Release 1.0.5 (Sep 27, 2008)
- niftoaster optimize
- fix for materials named skin, envmap2, etc. (issue #2121098)
- fix for empty source textures in texdesc (issue #2118481)
- new spell to disable parallax (issue #2121283)
- new options –diff and –patch to create and apply patches; interal
patcher uses bsdiff format, but you can also specify an arbitrary
external diff/patch command via –diff-cmd and –patch-cmd options
(the external command must take three arguments: oldfile, newfile,
and patchfile); note that this is still in experimental stage, not ready
for production use yet
Release 1.0.4 (Sep 18, 2008)
- niftoaster optimize
- morph data optimization (issue #2116594, fixes “bow” weapons)
Release 1.0.3 (Sep 17, 2008)
- niftoaster optimize
- detach NiTriStripsData from havok tree when block is
shared with geometry data (fixes issue #2065018, MiddleWolfRug01.NIF)
- fix in case merged properties had controllers (issue #2106668)
- fix writing of block order: bhkConstraint entities now always preceed the
constraint block (this also fixes the “falling sign” issue with the niftoaster
optimize spell, issue #2068090)
Release 1.0.2 (Sep 15, 2008)
- “negative mass” fix in inertia calculation
Release 1.0.1 (Sep 12, 2008)
- small fix in uninstaller (didn’t remove crydaefilter script)
- crydaefilter converts %20 back into spaces (as rc doesn’t recognize %20)
- bugfixes for niftoaster optimize spell (pyffi issue #2065018)
Release 1.0.0 (Jul 24, 2008)
- new NSIS installer (this solves various issues with Vista, and also
allows the documentation to be bundled)
- new filter to prepare collada (.dae) files for CryEngine2 resource compiler
- wraps scenes into CryExportNodes
- corrects id/sid naming
- fixes init_from image paths
- adds phong and lamber shader sid’s
- enforces material instance symbol to coincide with target
- sets material names in correct format for material library and
- started on support for collada format, by parsing the collada xsd schema
description (this is still far from functional, but an initial parser is
already included with the library, although it does not yet create any
- fully optimal mopp generation for Oblivion (using the NifTools mopper.exe
which is a command line utility that calls the mopp functions in the havok
library, credit for writing the original wrapper goes to tazpn)
- minor updates to the nif.xml format description
- refactoring: library reorganized and some interfaces have been
unified, also a lot of code duplication has been reduced; see
README.TXT for more details on how to migrate from 0.x.x to 1.x.x
- main format classes PyFFI.XXX have been moved to PyFFI.Formats.XXX
- “XxxFormat.getVersion(cls, stream)” now always returns two
integers, version and user_version
- “XxxFormat.read(self, stream, version, user_version, ...)” for all
- “XxxFormat.write(self, stream, version, user_version, *readresult, ...)”
for all formats
- in particular, CGF format game argument removed from read and
write functions, but there are new CgfFormat.getGame and
CgfFormat.getGameVersion functions to convert between (version,
user_version) and game
- also for the CGF format, take care that getVersion no longer
returns the file type. It is returned with the CgfFormat.read
function, however there is a new CgfFormat.getFileType function, if
you need to know the file type but you don’t want to parse the whole
- all XxxFormat classes derive from XmlFileFormat base class
- common nameAttribute, walk, and walkFile functions
- XxxTester modules have been moved to PyFFI.Spells.XXX, along with a much
improved PyFFI.Spells module for toasters with loads of new options
- some other internal code has been moved around
- qskopelib -> PyFFI.QSkope
- PyFFI.Bases -> PyFFI.ObjectModels.XML
- a lot more internal code reorganization is in progress...
- much documentation has been added and improved
Release 0.11.0 (Jun 16, 2008)
- fixed updateTangentSpace for nifs with zero normals
- a lot of new physics stuff: MeshPhysicsDataChunk mostly decoded (finally!!)
- fixes for reading and writing caf files (they are missing controller
- activated BoneMeshChunk and BoneInitialPosChunk for Crysis
- improved tga file detection heuristic
Release 0.10.10 (Jun 8, 2008)
- minor updates in xml
- NiPixelData saveAsDDS function now also writes DXT compressed formats,
that is, pixel formats 4, 5, and 6 (contributed by taarna23)
- fixed nifoptimize for nifs with particle systems (niftools issue #1965936)
- fixed nifoptimize for nifs with invalid normals (niftools issue #1987506)
Release 0.10.9 (May 27, 2008)
- bspline interpolator fix if no keys
- fixed bspline scale bug
Release 0.10.8 (Apr 13, 2008)
- more decoded of the mesh physics data chunk
- scaling for constraints
- ported the A -> B spell from nifskope (see the new getTransformAB and
Release 0.10.7 (Apr 5, 2008)
- indices are unsigned shorts now (fixes geometry corruption on import of
- MeshChunk.setGeometry gives useful error message if number of vertices is
- nif.xml has minor updates in naming
- added NiBSplineData access functions (experimental, interface could still
- started on support for compressed B-spline data
- fixed block order writing of bhkConstraints
Release 0.10.6 (Mar 30, 2008)
- tga: added missing xml file
- removed some question marks so the fields can be accessed easily in python
- ControllerLink and StringPalette functions and doctests
- quaternion functions in Matrix33 and Matrix44
- new bspline modules (still to implement later)
- fixed NiTransformInterpolator scaling bug
- use tempfile for write test
- quick install batch file for windows
Release 0.10.5 (Mar 27, 2008)
- qskope: make bitstructs editable
- MeshChunk functions to get vertex colors (game independent).
- Set vertex colors in setGeometry function.
Release 0.10.4 (Mar 26, 2008)
- fixed tangent space doctest
- setGeometry argument sanity checking
- setGeometry fix for empty material list
- setGeometry tangent space update fix if there are no uvs
Release 0.10.3 (Mar 24, 2008)
- added support for the TGA format
- validate normals before calculating tangents
- added new option to get orientation of tangent space relative to texture
space (Crysis needs to know about this)
- installer detects Maya 2008 and copies relevant files to Maya Python
directory for the Maya scripts to work
- tangent space cgftoaster
- new MeshChunk updateTangentSpace function
Release 0.10.2 (Mar 22, 2008)
- fixed “normals” problem by setting last component of tangents to -1.0
- meshchunk function to get all material indices, per triangle (game
- scaling fixes for datastreamchunk, meshchunk, and meshsubsetschunk
- fixed version of BreakablePhysicsChunk
- a few new findings in decoding the physics data (position and rotation)
Release 0.10.1 (Mar 21, 2008)
- some minor xml updates
- setGeometry function for MeshChunk to set geometry for both Far Cry and
Crysis in a unified way
- uv.v opengl flip fix for Crysis MeshChunk data
- MathUtils: new function to calculate bounding box, center, and radius
- qskope: fixed bug which prevented setting material physics type to NONE
Release 0.10.0 (Mar 8, 2008)
- cgf: ported A LOT of stuff from the Crysis Mod SDK 1.2; the most common
CE2 chunks now read and write successfully
Release 0.9.3 (Mar 7, 2008)
- decoded a lot of geometry data
- vertex colors
- mesh material info
- started decoding many other chunk types
- added chr chunk types so files containing them can be processed (the data
- started adding functions to MeshChunk to have unified access to geometry
data for both Far Cry and Crysis cgf files
- windows installer registers chr extension with qskope
Release 0.9.2 (Feb 26, 2008)
- full support for the xml enum tag type, with improved editor in qskope
- new common string types (shared between cgf and nif formats)
- null terminated
- fixed sized
- variable sized starting with integer describing length
- qskope: no more duplicate ptr refs in global view
- qskope: refactored delegate editor system to be more transparent and much
easier to extend
- cgf: crysis chunks have been partially decoded (still very much wip)
- cgf: added extra chunk size check on read to aid decoding
- dds: register dds extension with qskope on windows install
- nif: nifoptimize clamps material alpha to [0,1]
Release 0.9.1 (Feb 22, 2008)
- full support for the xml bitstruct tag (for types that contain bit flags)
- added PyFFI.Formats.DDS library for dds file format
- nif: new function for NiPixelData to save image as dds file
- niftoaster: script for exporting images from NiPixelData blocks
- merge identical shape data blocks
- remove empty NiNode children
- update skin partition only if block already exists
Release 0.9.0 (Feb 11, 2008)
- added PyFFI.Formats.KFM library for kfm file format
- cgf.xml and nif.xml updates
- new qBlockParent function to assign parents if the parent block does not
contain a reference to the child, but the child contains a reference to the
parent (as in MeshMorphTargetChunk and BoneInitialPosChunk)
- QSkope: root blocks sorted by reference number
- QSkope: added kfm format
- niftexdump: bug fixed when reading nifs that have textures without source
Release 0.8.2 (Jan 28, 2008)
- fixed installer bug (nifoptimize would not launch from context menu)
- handle back-references and shared blocks
- blocks are now numbered
- improved display references
Release 0.8.1 (Jan 27, 2008)
- deep copy for structs and arrays
- detects cases where triangulated geometry performs better than stripified
geometry (fixes a performance issue with non-smooth geometry reported by
- can now also optimize NiTriShapes
- throws away empty and/or duplicate children in NiNode lists
Release 0.8.0 (Jan 27, 2008)
- qskope: new general purpose tool for visualizing files loaded with PyFFI
- cgf: corrected the bool implementation (using True/False rather than an int)
- nif: many xml updates, support for Culpa Innata, updates for emerge demo
- support for forward declaration of types (required for UnionBV)
- PyFFI.__hexversion__ for numeric represenation of the version number
Release 0.7.5 (Jan 14, 2008)
- added a DTD for the ‘fileformat’ document type, to validate the xml
- bits tag for bitstructs, instead of add tag, to allow validation
- cgf: write the chunk header table at start, for crysis
- new command line option ‘-x’ to exclude blocks per type
- fixes corrupted texture paths (that is, files that got corrupted with
nifskope 1.0 due to the \r \n bug)
- on windows, the script can now be called from the .nif context menu
- accept both lower and upper case ‘y’ for confirmation
- new command line option ‘-p’ to pause after run
- niftoaster: fix reporting of file size difference in readwrite test
- bug fixed when writing nifs of version <= 3.1
- support for multiple ‘Top Level Object’ (roots) for nifs of version <= 3.1
- various xml fixes
- new version 18.104.22.168 from emerge demo
- NiMeshPSysData bugfix and simplification
- replaced NiTimeController Target with unknown int to cope with invalid
pointers in nif versions <= 3.1
- fixed bug nifmakehsl.py script
- fixed bug in nifdump.py script
- new post installation script for installing/uninstalling registry keys
Release 0.7.4 (Dec 26, 2007)
- fix in nif xml for a long outstanding issue which caused some nifs with mopp
shapes to fail
- fixed file size check bug in readwrite test for nif and cgf
- initial read and write support for crysis cgf files
- support for versions in structs
- updates for controller key types 6, 9, and 10, in cgf xml
Release 0.7.3 (Dec 13, 2007)
- nif: fixed error message when encountering empty block type
- nif: dump script with block selection feature
- cgf: fix transform errors, ported matrix and vector operations from nif
Release 0.7.2 (Dec 3, 2007)
- NifTester: new raisereaderror argument which simplifies the older system and
yields more instructive backtraces
- nif: better support for recent nif versions, if block sizes do not match
with the number of bytes read then the bytes are skipped and a warning is
printed, instead of raising an exception
Release 0.7.1 (Nov 27, 2007)
- nif: fixed applyScale in bhkRigidBody
Release 0.7 (Nov 19, 2007)
- fixed a problem locating the customized functions for Fedora 8 python which
does not look in default locations besides sys.path
- new vector and matrix library under Utils (for internal use)
- new quick hull library for computing convex hulls
- new inertia library for computing mass, center of gravity, and inertia
tensors of solid and hollow objects
- nif: fixed order of bhkCollisionObject when writing nif files
- nif: new bhkRigidBody function for updating inertia, center of gravity, and
mass, for all types of primitives
Release 0.6 (Nov 3, 2007)
- nifoptimize removes duplicate property blocks
- reduced memory footprint in skin data center and radius calculation for the
- new option to ignore strings when calculating hash
- code has been cleaned up using pylint
- added a lot more documentation
- refactored all common functions to take **kwargs as argument
- read and write functions have the file stream as first non-keyword argument
- refactored and simplified attribute parsing, using a common
_filteredAttributeList method used by all methods that need to parse
attributes; the version and user_version checks are now also consistent over
all functions (i.e. getRefs, getLinks, etc.)
- added more doctests
Release 0.5.2 (Oct 25, 2007)
- added hash functions (useful for identifying and comparing objects)
Release 0.5.1 (Oct 19, 2007)
- fixed a bug in the nif.xml file which prevented Oblivion skeleton.nif files
Release 0.5 (Oct 19, 2007)
- new functions to get block size
- various small bugs fixed
- nif: support for new versions (22.214.171.124, 126.96.36.199, 188.8.131.52, 184.108.40.206,
- nif: block sizes are now also written to the nif files, improving support
for writing 220.127.116.11+ nif versions
- nif: fixed flattenSkin bug (reported by Kikai)
Release 0.4.9 (Oct 13, 2007)
- nif: nifoptimize no longer raises an exception on test errors, unless you
pass the -r option
- nif: nifoptimize will try to restore the original file if something goes
wrong during write, so - in theory - it should no longer leave you with
corrupt nifs; still it is recommended to keep your backups around just in case
- nif: niftesters recoded to accept arbitrary argument dictionaries; this
could cause incompatibilities for people writing their own scripts, but the
upgrade to the new system is fairly simple: check the niftemplate.py script
- nif: fixed bug in updateTangentSpace which caused an exception when uvs or
normals were not present
- nif: doctest for unsupported blocks in nifs
Release 0.4.8 (Oct 7, 2007)
- cgf: MeshMorphTargetChunk is now supported too
- nif: new script (niftexdump.py) to dump texture and material info
- nif: added template script for quickly writing new nif scripts
Release 0.4.7 (Oct 4, 2007)
- nif: new optimizer script
Release 0.4.6 (Sep 29, 2007)
- nif and cgf documentation improved
- added a number of new doctests
- nif: new scripts
- niftoaster.py for testing and modifying nif files (contributed by wz)
- nifvisualizer.py for visualizing nif blocks (contributed by wz)
- nifmakehsl.py for making hex workshop structure libraries for all nif
- nif: bundling NifVis and NifTester modules so you can make your own nif
toasters and visualizers
- nif: fixed rare issue with skin partition calculation
- cgf: new script
- cgftoaster.py for testing and modifying cgf files (similar to niftoaster.py)
- cgf: bundling CgfTester module so you can make your own cgf toasters
- cgf: various xml bugs fixed
- cgf: write support improved (but not entirely functional yet)
- cgf: material chunk custom function for extraction material shader and script
- Expression.py: support for empty string check in condition
Release 0.4.5 (Sep 16, 2007)
- issue warning message instead of raising exception for improper rotation
matrix in setScaleRotationTranslation
- fixed skin partition bug during merge
- skin partition bone index padding and sorting for Freedom Force vs. the 3rd
Release 0.4.4 (Sep 2, 2007)
- added mopp parser and simple mopp generator
Release 0.4.3 (Aug 17, 2007)
- fixed bug that occurred if userver = 0 in the xml (fixes geometry morph data
in NIF versions 18.104.22.168 and up)
- tree() function has been extended
- some minor cleanups and more documentation
Release 0.4.2 (Aug 15, 2007)
- kwargs for getRefs
- fixed bug in skin partition calculation
- when writing nif files the refs are written in sequence (instead of the
links, so missing links will yield an exception, which is a good thing)
- new functions to get list of extra data blocks and to add effect
Release 0.4.1 (Aug 14, 2007)
- new function to add collision geometries to packed tristripsshape
- fixed bug in bhkListShape.addShape
Release 0.4 (Aug 12, 2007)
- new function updateBindPosition in NiGeometry to fix a geometry rest
position from current bone positions
- removed deprecated functions
- (!) changed interface of addBone, no longer takes “transform” argument; use
the new function updateBindPosition instead
Release 0.3.4 (Aug 11, 2007)
- improved documentation
- fixed the ‘in’ operator in Bases/Array.py
- doctest for NiNode
- flatten skin fix for skins that consist of multiple shapes
- support for the most common oblivion havok blocks
Release 0.3.3 (Aug 8, 2007)
- fixed a bug in the skin center and radius calculation
- added copy function to Vector3
- fixed NiGeometry doctest
Release 0.3.2 (Aug 7, 2007)
- simplified interface (still wip) by using keyword arguments for common
functions such as read and write
- fix for skin partition blocks in older nif versions such as
Freedom Force vs. 3rd Reich
- support for triangle skin partitions
- added stitchstrips option for skin partitions
- added a NiGeometry function to send bones to bind pose
Release 0.3.1 (Aug 6, 2007)
- new function for getting geometry skin deformation in rest pose
- old rest pose functions are deprecated and will be removed from a future
Release 0.3 (Aug 2, 2007)
- fixed an issue with writing skeleton.nif files
- reading support for the most common blocks in static cgf files;
Release 0.2.1 (Jul 29, 2007)
- fixed bug in getTransform
- new option in findChain to fix block type
Release 0.2 (Jul 29, 2007)
- fixed argument passing when writing arrays
- NIF: added getControllers function to NiObjectNET
Release 0.1 (Jul 22, 2007)
- bug fixed when writing array of strings
- new function to add bones
- XML update, supports newer versions from Emerge Demo
Release 0.0 (Jul 7, 2007)