pyffi.spells.nif — NetImmerse/Gamebryo File/Keyframe (.nif/.kf/.kfa) spells

Last Built: Mar 06, 2020

pyffi.spells.nif — NetImmerse/Gamebryo File/Keyframe (.nif/.kf/.kfa) spells

Module which contains all spells that check something in a NIF file.

Spells for dumping particular blocks from nifs.

pyffi.spells.nif.fix — spells to fix errors

Module which contains all spells that fix something in a nif.

Implementation

class pyffi.spells.nif.fix.SpellDelTangentSpace(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Delete tangentspace if it is present.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.fix.SpellAddTangentSpace(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Add tangentspace if none is present.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.fix.SpellFFVT3RSkinPartition(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Create or update skin partition, with settings that work for Freedom Force vs. The 3rd Reich.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.fix.SpellFixTexturePath(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.fix.SpellParseTexturePath

Fix the texture path. Transforms 0x0a into n and 0x0d into r. This fixes a bug in nifs saved with older versions of nifskope. Also transforms / into . This fixes problems when packing files into a bsa archive. Also if the version is 20.0.0.4 or higher it will check for bad texture path form of e.g. c:program filesbethsoftobtexturesfilepath.dds and replace it with e.g. texturesfilepath.dds.

substitute(old_path)[source]

Helper function to allow subclasses of this spell to change part of the path with minimum of code. This implementation returns path unmodified.

class pyffi.spells.nif.fix.SpellDetachHavokTriStripsData(*args, **kwargs)[source]

Bases: pyffi.spells.nif.NifSpell

For NiTriStrips if their NiTriStripsData also occurs in a bhkNiTriStripsShape, make deep copy of data in havok. This is mainly useful as a preperation for other spells that act on NiTriStripsData, to ensure that the havok data remains untouched.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

dataentry()[source]

Called before all blocks are recursed. The default implementation simply returns True. You can access the data via data, and unlike in the datainspect() method, the full file has been processed at this stage.

Typically, you will override this function to perform a global operation on the file data.

Returns

True if the children must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.fix.SpellClampMaterialAlpha(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Clamp corrupted material alpha values.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.fix.SpellSendGeometriesToBindPosition(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.SpellVisitSkeletonRoots

Transform skinned geometries so similar bones have the same bone data, and hence, the same bind position, over all geometries.

skelrootentry(branch)[source]

Do something with a skeleton root. Return value is ignored.

class pyffi.spells.nif.fix.SpellSendDetachedGeometriesToNodePosition(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.SpellVisitSkeletonRoots

Transform geometries so each set of geometries that shares bones is aligned with the transform of the root bone of that set.

skelrootentry(branch)[source]

Do something with a skeleton root. Return value is ignored.

class pyffi.spells.nif.fix.SpellSendBonesToBindPosition(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.SpellVisitSkeletonRoots

Transform bones so bone data agrees with bone transforms, and hence, all bones are in bind position.

skelrootentry(branch)[source]

Do something with a skeleton root. Return value is ignored.

class pyffi.spells.nif.fix.SpellMergeSkeletonRoots(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Merges skeleton roots in the NIF file so that no skeleton root has another skeleton root as child. Warns if merge is impossible (this happens if the global skin data of the geometry is not the unit transform).

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

dataentry()[source]

Called before all blocks are recursed. The default implementation simply returns True. You can access the data via data, and unlike in the datainspect() method, the full file has been processed at this stage.

Typically, you will override this function to perform a global operation on the file data.

Returns

True if the children must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.fix.SpellApplySkinDeformation(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Apply skin deformation to nif.

class pyffi.spells.nif.fix.SpellScale(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Scale a model.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

dataentry()[source]

Called before all blocks are recursed. The default implementation simply returns True. You can access the data via data, and unlike in the datainspect() method, the full file has been processed at this stage.

Typically, you will override this function to perform a global operation on the file data.

Returns

True if the children must be processed, False otherwise.

Return type

bool

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.fix.SpellFixCenterRadius(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.check.SpellCheckCenterRadius

Recalculate geometry centers and radii.

class pyffi.spells.nif.fix.SpellFixSkinCenterRadius(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.check.SpellCheckSkinCenterRadius

Recalculate skin centers and radii.

class pyffi.spells.nif.fix.SpellFixMopp(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.check.SpellCheckMopp

Recalculate mopp data from collision geometry.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.fix.SpellCleanStringPalette(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Remove unused strings from string palette.

branchentry(branch)[source]

Parses string palette of either a single controller sequence, or of all controller sequences in a controller manager.

>>> seq = NifFormat.NiControllerSequence()
>>> seq.string_palette = NifFormat.NiStringPalette()
>>> block = seq.add_controlled_block()
>>> block.string_palette = seq.string_palette
>>> block.set_variable_1("there")
>>> block.set_node_name("hello")
>>> block.string_palette.palette.add_string("test")
12
>>> seq.string_palette.palette.get_all_strings()
[b'there', b'hello', b'test']
>>> SpellCleanStringPalette().branchentry(seq)
pyffi.toaster:INFO:parsing string palette
False
>>> seq.string_palette.palette.get_all_strings()
[b'hello', b'there']
>>> block.get_variable_1()
b'there'
>>> block.get_node_name()
b'hello'
branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

substitute(old_string)[source]

Helper function to substitute strings in the string palette, to allow subclasses of this spell can modify the strings. This implementation returns string unmodified.

class pyffi.spells.nif.fix.SpellDelUnusedRoots(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Remove root branches that shouldn’t be root branches and are unused in the file such as NiProperty branches that are not properly parented.

dataentry()[source]

Called before all blocks are recursed. The default implementation simply returns True. You can access the data via data, and unlike in the datainspect() method, the full file has been processed at this stage.

Typically, you will override this function to perform a global operation on the file data.

Returns

True if the children must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.fix.SpellFixEmptySkeletonRoots(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Fix empty skeleton roots in an as sane as possible way.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

dataentry()[source]

Called before all blocks are recursed. The default implementation simply returns True. You can access the data via data, and unlike in the datainspect() method, the full file has been processed at this stage.

Typically, you will override this function to perform a global operation on the file data.

Returns

True if the children must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

Regression tests

Spells for optimizing NIF files.

class pyffi.spells.nif.optimize.SpellCleanRefLists(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Remove empty and duplicate entries in reference lists.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

cleanreflist(reflist, category)[source]

Return a cleaned copy of the given list of references.

dataentry()[source]

Called before all blocks are recursed. The default implementation simply returns True. You can access the data via data, and unlike in the datainspect() method, the full file has been processed at this stage.

Typically, you will override this function to perform a global operation on the file data.

Returns

True if the children must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.optimize.SpellMergeDuplicates(*args, **kwargs)[source]

Bases: pyffi.spells.nif.NifSpell

Remove duplicate branches.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.optimize.SpellOptimizeGeometry(*args, **kwargs)[source]

Bases: pyffi.spells.nif.NifSpell

Optimize all geometries: - remove duplicate vertices - triangulate - recalculate skin partition - recalculate tangent space

branchentry(branch)[source]

Optimize a NiTriStrips or NiTriShape block:

  • remove duplicate vertices

  • retriangulate for vertex cache

  • recalculate skin partition

  • recalculate tangent space

Todo

Limit the size of shapes (see operation optimization mod for Oblivion!)

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.optimize.SpellOptimize(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.SpellCleanFarNifSpellDelUnusedRootsSpellCleanRefListsSpellDetachHavokTriStripsDataSpellFixTexturePathSpellClampMaterialAlphaSpellFixBhkSubShapesSpellFixEmptySkeletonRootsSpellOptimizeGeometrySpellOptimizeCollisionBoxSpellOptimizeCollisionGeometrySpellMergeDuplicates

Global fixer and optimizer spell.

class pyffi.spells.nif.optimize.SpellDelUnusedBones(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Remove nodes that are not used for anything.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

dataentry()[source]

Called before all blocks are recursed. The default implementation simply returns True. You can access the data via data, and unlike in the datainspect() method, the full file has been processed at this stage.

Typically, you will override this function to perform a global operation on the file data.

Returns

True if the children must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

pyffi.spells.nif.modify — spells to make modifications

Module which contains all spells that modify a nif.

class pyffi.spells.nif.modify.SpellTexturePath(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.fix.SpellParseTexturePath

Changes the texture path while keeping the texture names.

substitute(old_path)[source]

Helper function to allow subclasses of this spell to change part of the path with minimum of code. This implementation returns path unmodified.

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellSubstituteTexturePath(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.fix.SpellFixTexturePath

Runs a regex replacement on texture paths.

substitute(old_path)[source]

Returns modified texture path, and reports if path was modified.

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellLowResTexturePath(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.modify.SpellSubstituteTexturePath

Changes the texture path by replacing ‘textures*’ with ‘textureslowres*’ - used mainly for making _far.nifs

substitute(old_path)[source]

Returns modified texture path, and reports if path was modified.

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellCollisionType(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Sets the object collision to be a different type

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellCollisionMaterial(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Sets the object’s collision material to be a different type

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellScaleAnimationTime(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Scales the animation time.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellReverseAnimation(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Reverses the animation by reversing datas in relation to the time.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellSubstituteStringPalette(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.fix.SpellCleanStringPalette

Substitute strings in a string palette.

substitute(old_string)[source]

Returns modified string, and reports if string was modified.

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellChangeBonePriorities(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Changes controlled block priorities based on controlled block name.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellSetInterpolatorTransRotScale(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Changes specified bone(s) translations/rotations in their NiTransformInterpolator.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellDelInterpolatorTransformData(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Deletes the specified bone(s) NiTransformData(s).

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

classmethod toastentry(toaster)[source]

Called just before the toaster starts processing all files. If it returns False, then the spell is not used. The default implementation simply returns True.

For example, if the spell only acts on a particular block type, but that block type is excluded, then you can use this function to flag that this spell can be skipped. You can also use this function to initialize statistics data to be aggregated from files, to initialize a log file, and so.

Parameters

toaster (Toaster) – The toaster this spell is called from.

Returns

True if the spell applies, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellDelBranches(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Delete blocks that match the exclude list.

branchentry(branch)[source]

Strip branch if it is flagged for deletion.

is_branch_to_be_deleted(branch)[source]

Returns True for those branches that must be deleted. The default implementation returns True for branches that are not admissible as specified by include/exclude options of the toaster. Override in subclasses that must delete specific branches.

class pyffi.spells.nif.modify._SpellDelBranchClasses(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.modify.SpellDelBranches

Delete blocks that match a given list. Only useful as base class for other spells.

BRANCH_CLASSES_TO_BE_DELETED = ()

List of branch classes that have to be deleted.

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

is_branch_to_be_deleted(branch)[source]

Returns True for those branches that must be deleted. The default implementation returns True for branches that are not admissible as specified by include/exclude options of the toaster. Override in subclasses that must delete specific branches.

class pyffi.spells.nif.modify.SpellDelSkinShapes(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.modify.SpellDelBranches

Delete any geometries with a material name of ‘skin’

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

is_branch_to_be_deleted(branch)[source]

Returns True for those branches that must be deleted. The default implementation returns True for branches that are not admissible as specified by include/exclude options of the toaster. Override in subclasses that must delete specific branches.

class pyffi.spells.nif.modify.SpellDisableParallax(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Disable parallax shader (for Oblivion, but may work on other nifs too).

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellAddStencilProperty(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.NifSpell

Adds a NiStencilProperty to each geometry if it is not present.

branchentry(branch)[source]

Cast the spell on the given branch. First called with branch equal to data’s children, then the grandchildren, and so on. The default implementation simply returns True.

Typically, you will override this function to perform an operation on a particular block type and/or to stop recursion at particular block types.

Parameters

branch (GlobalNode) – The branch to cast the spell on.

Returns

True if the children must be processed, False otherwise.

Return type

bool

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

class pyffi.spells.nif.modify.SpellDelVertexColor(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.nif.modify.SpellDelBranches

Delete vertex color properties and vertex color data.

branchentry(branch)[source]

Strip branch if it is flagged for deletion.

branchinspect(branch)[source]

Like _branchinspect(), but for customization: can be overridden to perform an extra inspection (the default implementation always returns True).

Parameters

branch (GlobalNode) – The branch to check.

Returns

True if the branch must be processed, False otherwise.

Return type

bool

datainspect()[source]

This is called after pyffi.object_models.FileFormat.Data.inspect() has been called, and before pyffi.object_models.FileFormat.Data.read() is called. Override this function for customization.

Returns

True if the file must be processed, False otherwise.

Return type

bool

is_branch_to_be_deleted(branch)[source]

Returns True for those branches that must be deleted. The default implementation returns True for branches that are not admissible as specified by include/exclude options of the toaster. Override in subclasses that must delete specific branches.

class pyffi.spells.nif.modify.SpellMakeSkinlessNif(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.SpellDelSkinShapesSpellAddStencilProperty

Spell to make fleshless CMR (Custom Model Races) clothing/armour type nifs.

class pyffi.spells.nif.modify.SpellCleanFarNif(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.SpellDelVertexColorPropertySpellDelAlphaPropertySpellDelSpecularPropertySpellDelBSXFlagsSpellDelStringExtraDatasSpellDelTangentSpaceSpellDelCollisionDataSpellDelAnimationSpellDisableParallax

Spell to clean _far type nifs (for even more optimizations, combine this with the optimize spell).

datainspect()[source]

Inspect every spell with L{Spell.datainspect} and keep those spells that must be cast.

class pyffi.spells.nif.modify.SpellMakeFarNif(toaster=None, data=None, stream=None)[source]

Bases: pyffi.spells.SpellDelVertexColorPropertySpellDelAlphaPropertySpellDelSpecularPropertySpellDelBSXFlagsSpellDelStringExtraDatasSpellDelTangentSpaceSpellDelCollisionDataSpellDelAnimationSpellDisableParallaxSpellLowResTexturePath

Spell to make _far type nifs (for even more optimizations, combine this with the optimize spell).