NIF Animation Controllers

From GECK
Jump to: navigation, search
This article is incomplete. You can help by filling in any blank descriptions.
Further information might be found in a section of the discussion page. Please remove this message when no longer necessary.

Animations in NIFs require special blocks called controllers to manipulate virtually all aspects within them, from movement and rotation to material changes and particle behaviors. They mostly contain all of the same fields with one or two new settings, so for the sake of cleanliness they will all be listed here. This will not cover controller types that are only used internally unless exposed by a plugin.

Contents

Shared Fields

Controllers all pull from the NiTimeController class, and as a result all have the same six fields.

  • Next Controller: Controllers can be nested to affect multiple aspects of the same block. Commonly seen in particle system controllers.
  • Flags: Determines the behavior of the animation, such as whether it is active or if the animation should loop, loop backwards once it ends, or stop animating once it ends.
  • Frequency: Scales the update time units to keyframe time units.
  • Phase: A offset in seconds to the update time.
  • Start Time: The start time of the animation. Some controllers do not specify this themselves and will be listed in their sections.
  • End Time: The end time of the animation. Some controllers do not specify this themselves and will be listed in their sections.
  • Target: The block, property, or particle system this animation affects. Many controllers only target specific things and they will be listed in their sections.

Transform Controllers

Controllers that move or rotate their targets from their original positions.

bhkBlendController

Unknown what it does, attached to a NiTransformController that's attached to Bip01NonAccum on all skeletons.

  • Keys: Always set to 0. Unknown if there's any use.

NiFloatExtraDataController

Controls the value of a NiFloatExtraData. Listed here as it's used in skeletons to allow them to use head tracking. If used in a NiControllerSequence, specify "HeadTrack" as the Controller ID.

NiGeomMorpherController

Animates geometry by moving the position of its vertices using vector frames.

  • Flags: Usually set to 108.
  • Extra Flags: If set to 1, then the normals of the targeted geometry will be updated every time the controller itself updates.
  • Data: A NiMorphData.
  • Always Update: If set to 1, then the vertex data for the controller will be updated every time the controller itself updates, which can concur performance loss and should only be used when necessary.
  • Num Interpolators: The total number of interpolators used to interpolate vertex positions. Should always match the value of Num Morphs in NiMorphData.
  • Interpolator Weights: A list of morph frame interpolators as well as how much influence each frame has over the final shape.
    • Interpolator: In NiControllerManagers, these should be NiBlendFloatInterpolators. On their own, they should be NiFloatInterpolators.
    • Weight: If a dedicated controller in a NIF, it should be set to 0, but if it is being called in a NiControllerSequence in aKF, then it should be set to 1.

NiLookAtController

Reorients blocks to look at other blocks. Superseded by NiLookAtInterpolator, but will be listed here for posterity's sake.

  • Start Time: Might not be functional.
  • End Time: Might not be functional.
  • Look At: The block the targeted block looks at. If two blocks are set to look at each other, then one will be disabled.

NiMultiTargetTransformController

Moves and/or rotates a multiple targeted blocks. Always parented to a NiControllerManager.

  • Flags: Usually set to 108.
  • Target: Should always be the root node of the NIF.
  • Num Extra Targets: Specifies the total number of targeted blocks managed by this controller.
  • Extra Targets: Every targeted block managed by this controller. Null entries appear to be safe.

NiPathController

Moves objects along a defined spline path. Superseded by NiPathInterpolator, but will be listed here for posterity's sake.

  • Bank Dir: If 1, then the object will bank inwards when turning. If -1, it will bank outwards.
  • Max Bank Angle: The maximum angle the object can bank in radians.
  • Smoothing: A threshold value for values in attached NiPosData that if passed, smooths any snapping the object may exhibit when nearing a defined position.
  • Follow Axis: The axis the object travels along. 0 is for X, 1 is for Y, and 3 is for Z.
  • Path Data: A NiPosData that contains all of the positions for the block to follow at given times.
  • Percent Data: A NiFloatData that contains values to parameterize distance along the path? Forward/Backward values are unclear.

NiRollController

Rotates objects around their Z-axis, requires additional controllers to have them rotate in other directions. Deprecated, recommended to use NiTransformControllers to rotate objects instead, but will be listed here for posterity's sake.

  • Interpolator: Doesn't seem to be used, might be erroneous NifSkope formatting.
  • Data: A NiFloatData with quadratic keys and timestamp values with speed values. Supports going backwards.

NiTransformController

Moves and/or rotates a single targeted block.

  • Interpolator: A NiTransformInterpolator with NiTransformData attached.

Visual Controllers

Controllers that animate visual aspects of a block.

BSFrustumFOVController

Animates the left/right/top/bottom frustum values on parented NiCamera blocks to adjust the FOV.

  • Interpolator: All uses are standalone and use NiFloatInterpolators, presumably NiControllerSequences would use NiBlendFloatInterpolators. Data must be a NiFloatData as TCB keys. Appears to subtract and add the value to Frustum Left and Right respectively, and multiplies 75% of the value of Frustum Top with the value and multiplies the value with 25% of Frustum Bottom.

BSMaterialEmittanceMultController

Animates the Emittance Mult value on NiMaterialProperties.

  • Next Controller: Can be a NiAlphaController.
  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data must be a NiFloatData, keys can be either quadratic, linear, or constant.

BSRefractionFirePeriodController

Animates the Refraction Fire Period of either a BSShaderPPLightingProperty or a Lighting30ShaderProperty.

  • Next Controller: Can be a BSRefractionStrengthController.
  • Interpolator: All uses are done in a NiControllerManager with a NiBlendFloatInterpolator, but if standalone uses work, then they'd use a NiFloatInterpolator with a NiFloatData (with only time values seemingly used?).

BSRefractionStrengthController

Animates the Refraction Strength value of either a BSShaderPPLightingProperty or a Lighting30ShaderProperty.

  • Next Controller: Presumably can be a BSRefractionFirePeriodController.
  • Interpolator: All uses are done in a NiControllerManager with a NiBlendFloatInterpolator, but if standalone uses work, then they'd use a NiFloatInterpolator with a NiFloatData (with only time values seemingly used?).

NiAlphaController

Animates the Alpha value on NiMaterialProperties.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data must be a NiFloatData keys can be either quadratic, linear, or constant.

NiBoneLODController

Groups bones into a list of LOD levels and culls bones in a higher LOD group than the current group, and swaps skinned geometry for lower poly versions based on the current LOD level. Imagine a tree with several limbs, each with their own branches, tipped with leaves. The leaves would be LOD 0, the branches LOD 1, the limbs LOD 2, and the trunk LOD 3, with LOD 0 and 1 having the full high poly model and LOD 2 and 3 having a lower poly basic shape.

  • LOD: Defines the current LOD instance. Set at runtime, leave as 0.
  • Num LODs: The total number of LOD instances.
  • Num LOD Groups: The total number of groups of Nodes per LOD.
  • Node Groups
    • Num Nodes: The total number of Nodes in this LOD.
  • Nodes: All of the Nodes in this LOD. Children Nodes that are of a higher number than the Nodes in this LOD will be removed.
  • Num Shape Groups: The total number of skinned geometry.
  • Shape Groups 1
    • Num Skin Info: The total number of paired skinned geometry and NiSkinInstances in this group. The skinned geometry will switch to the appropriate skinning data based on the LOD level.
  • Shape Groups 2: Presumably the skinned geometry instance to switch to when the game removes all LODs from an object.

NiBSBoneLODController

Bethesda-modified version of NiBoneLODController with skin LOD removed as their skeleton system is incompatible with it. Look at the BSBoneLOD#Bone#"number"# string in NiStringExtraData attached to blocks in vanilla skeletons to tell which bones belong to which LOD.

NiColorExtraDataController

Controls the value of NiColorExtraData blocks with some form of NiInterpolator. Not defined in NifSkope.

NiFlipController

Replaces the NiSourceTexture stored in a NiTexturingProperty with additional frames. Might be broken, will list anyway.

  • Target: The NiTexturingProperty you wish to animate.
  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data must be a NiFloatData as constant keys. Value determines which frame to display.
  • Texture Slot: Determines which texture map in a NiTexturingProperty to animate. Everything since Oblivion only uses BASE_MAP so don't use anything else.
  • Num Sources: The total number of frames in the flip controller.
  • Sources: An index of NiSourceTextures.

NiLightColorController

Animates the diffuse/specular and ambient colors of a NiLight.

  • Next Controller: Can presumably be a NiLightDimmerController.
  • Interpolator: A NiPoint3Interpolator if standalone or a NiBlendPoint3Interpolator if in a NiControllerSequence. Data must be a NiPosData, and Values represent the color value of each channel.
  • Target Color: Determines which colors are animated. LC_AMBIENT animates the ambient color and forces the diffuse and specular colors to be black, and LC_DIFFUSE animates the diffuse and specular colors while forcing the ambient color to be black. If used in a NiControllerSequence, specify either "Ambient" or "Diffuse" as the Controller ID.

NiLightDimmerController

Animates the dimmer value on NiLights.

  • Next Controller: Can be a NiLightColorController.
  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data must be a NiFloatData, keys can be either quadratic, linear, or constant.

NiMaterialColorController

Animates color values on NiMaterialProperties.

  • Flags: Whether the animation is active, the playback type, and which color to animate. Ambient, diffuse, specular, or emissive. Needs to match the Target Color?
  • Interpolator: A NiPoint3Interpolator if standalone or a NiBlendPoint3Interpolator if in a NiControllerSequence. Data must be a NiPosData, and Values represent the color value of each channel. Probably dependent on the color type.
  • Target Color: The color field to animate. TC_AMBIENT is ambient color, TC_DIFFUSE is diffuse color, TC_SPECULAR is specular color, and TC_SELF_ILLUM is emissive color. If using in a NiControllerSequence, specify NiMaterialProperty as the Property Type and specify everything past TC_ in the Controller ID.

NiTextureTransformController

Animates textures contained in NiTexturingProperties.

  • Next Controller: Can be chained with more NiTextureTransformControllers.
  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data must be a NiFloatData, keys can be either quadratic, linear, or constant.
  • Shader Map: Unused by Bethesda.
  • Texture Slot: Only BASE_MAP does anything.
  • Operation: TT_TRANSLATE_U moves horizontally, TT_TRANSLATE_V moves vertically, TT_ROTATE rotates the texture, TT_SCALE_U scales the width, and TT_SCALE_V scales the height. If used in a NiControllerSequence, specify "NiTexturingProperty" as the Property Type and append "0-0-" to one of these operators in the Controller ID.

NiUVController

Animates UVs and swaps UV sets on NiGeometry blocks. UV sets in Bethesda titles were removed after Morrowind and NiTextureTransformController should be used to manipulate textures instead. It is listed here for posterity's sake.

  • Unknown Short: Does not seem to actually be a field.
  • Data: A NiUVData block, which contains UV Groups that contain keys that represent U and V translation and U and V scaling, respectively.

NiVisController

Culls and unculls objects. See the dedicated page for more.

  • Start Time: Several instances are set in negative values as a guaranteed inactive point and can't be managed with a NiControllerSequence.
  • Interpolator: A NiBoolInterpolator if standalone or a NiBlendBoolInterpolator if in a NiControllerSequence. Data must be a NiBoolData with constant keys.

Particle Controllers

Controllers that manipulate aspects of particle controllers or their modifiers.

BSPSysMultiTargetEmitterCtlr

Controls multiple emitters for particle systems in NIFs used in AddOnNodes. Being decoded, will list later.

NiPSysAirFieldAirFrictionCtlr

Controls the Air Friction value of a NiPSysAirFieldModifier.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData, but key type is unknown.
  • Modifier Name: Needs to be the same name of a NiPSysAirFieldModifier.

NiPSysAirFieldInheritVelocityCtlr

Controls the Inherit Velocit value of a NiPSysAirFieldModifier.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData, but key type is unknown.
  • Modifier Name: Needs to be the same name of a NiPSysAirFieldModifier.

NiPSysAirFieldSpreadCtlr

Controls the Spread value of a NiPSysAirFieldModifier.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData, but key type is unknown.
  • Modifier Name: Needs to be the same name of a NiPSysAirFieldModifier.

NiPSysEmitterCtlr

Controls when particle emitters emit particles and the rate at which they are spawned.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys. If targeting this field in a NiControllerSequence, specify "BirthRate" as the Interpolator ID.
  • Modifier Name: Needs to be the same name of a NiPSysEmitter.
  • Visibility Interpolator: A NiBoolInterpolator if standalone or NiBlendBoolInterpolator if in a NiControllerSequence. Data should be NiBoolData with constant keys, but may be optional. If targeting this field in a NiControllerSequence, specify "EmitterActive" as the Interpolator ID.

NiPSysEmitterDeclinationCtlr

Controls the Declination value of a particle emitter.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysEmitter.

NiPSysEmitterDeclinationVarCtlr

Controls the Declination Variation value of a particle emitter.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysEmitter.

NiPSysEmitterInitialRadiusCtlr

Controls the Initial Radius value of a particle emitter.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysEmitter.

NiPSysEmitterLifeSpanCtlr

Controls the Life Span value of a particle emitter.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysEmitter.

NiPSysEmitterPlanarAngleCtlr

Controls the Planar Angle value of a particle emitter.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysEmitter.

NiPSysEmitterPlanarAngleVarCtlr

Controls the Planar Angle Variation value of a particle emitter.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysEmitter.

NiPSysEmitterSpeedCtlr

Controls the Speed value of a particle emitter.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysEmitter.

NiPSysFieldAttenuationCtlr

Controls the Attenuation value on Field Modifiers for particle systems.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData, but key type is unknown.
  • Modifier Name: Needs to be the same name of a NiPSysFieldModifier.

NiPSysFieldMagnitudeCtlr

Controls the Magnitude value on Field Modifiers for particle systems.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData, but key type is unknown.
  • Modifier Name: Needs to be the same name of a NiPSysFieldModifier.

NiPSysFieldMaxDistanceCtlr

Controls the Max Distance value on Field Modifiers for particle systems.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData, but key type is unknown.
  • Modifier Name: Needs to be the same name of a NiPSysFieldModifier.

NiPSysGravityStrengthCtlr

Controls the Strength value on a NiPSysGravityModifier.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysGravityModifier.

NiPSysInitialRotAngleCtlr

Controls the Rotation Angle value on a NiPSysRotationModifier.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysRotationModifier.

NiPSysInitialRotAngleVarCtlr

Controls the Rotation Angle Variance value on a NiPSysRotationModifier.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysRotationModifier.

NiPSysInitialRotSpeedCtlr

Controls the Rotation Speed value on a NiPSysRotationModifier.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysRotationModifier.

NiPSysInitialRotSpeedVarCtlr

Controls the Rotation Speed Variance value on a NiPSysRotationModifier.

  • Interpolator: A NiFloatInterpolator if standalone or NiBlendFloatInterpolator if in a NiControllerSequence. Data should be NiFloatData with quadratic keys.
  • Modifier Name: Needs to be the same name of a NiPSysRotationModifier.

NiPSysModifierActiveCtlr

Controls the Active value on a particle modifiers, allowing you to turn on and off modifiers.

  • Interpolator: A NiBoolInterpolator if standalone or NiBlendBoolInterpolator if in a NiControllerSequence. Data should be NiBoolData with constant keys.
  • Modifier Name: Needs to be the same name of a particle modifier. If used in a NiControllerSequence, specify the modifier you're targeting as the Controller ID.

NiPSysResetOnLoopCtlr

Kills all particles in the targeted particle system once the controller reaches its stop time.

NiPSysUpdateCtlr

Updates the particle system at definable times. Required for particle systems to function. Always set to start and end at 0?

Other

Two controller types that don't really have a use but could be used somehow in the future.

NiFloatsExtraDataController

Controls the value in a NiFloatsExtraData.

NiFloatsExtraDataPoint3Controller

Controls the values in a NiFloatsExtraData using NiPoint3Interpolators.