Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions io_scene_niftools/modules/nif_export/armature/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
from io_scene_niftools.modules.nif_export import types
from io_scene_niftools.modules.nif_export.animation.transform import TransformAnimation
from io_scene_niftools.modules.nif_export.block_registry import block_store
from io_scene_niftools.utils import math
from io_scene_niftools.utils import math, consts


class Armature:
Expand Down Expand Up @@ -83,6 +83,9 @@ def export_bone(self, b_obj, b_bone, n_parent_node, n_root_node):
for b_child in b_bone.children:
self.export_bone(b_obj, b_child, n_node, n_root_node)

if b_bone.niftools.BSLagBoneController:
Comment thread
HENDRIX-ZT2 marked this conversation as resolved.
Outdated
self.export_BSLagBoneController(b_bone, n_node)

def export_bone_flags(self, b_bone, n_node):
"""Exports or sets the flags according to the custom data in b_bone or the game version if none was set"""
if b_bone.niftools.flags != 0:
Expand Down Expand Up @@ -110,4 +113,26 @@ def export_bone_flags(self, b_bone, n_node):
# default for Div 2 final bones
n_node.flags = 0x0196
else:
n_node.flags = 0x0002 # default for Morrowind bones
n_node.flags = 0x0002 # default for Morrowind bones

def export_BSLagBoneController(self, b_bone, n_node):
"""Exports a BSLagBoneController for the bone"""

#BSLagBoneControllers are only for skyrim and later, afaik
game = bpy.context.scene.niftools_scene.game
if game not in ('SKYRIM'):
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could now be changed to if not bpy.context.scene.niftools_scene.is_skyrim():

return

n_controller = block_store.create_block("BSLagBoneController")
n_controller.name = block_store.get_full_name(b_bone)
#This should be active and cycle, what I've seen in game.
n_controller.flags = b_bone.niftools.BSLagBoneController_flags #0x0048? hexa?
n_controller.frequency = 1.0
n_controller.phase = 0.0
n_controller.start_time = consts.FLOAT_MIN
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you sure these two aren't reversed? Both in the xml and the (admittedly single) BSLagBoneController I checked start_time is FLOAT_MAX and stop_time is FLOAT_MIN.

n_controller.stop_time = consts.FLOAT_MAX
n_controller.linear_velocity = b_bone.niftools.BSLagBoneController_linear_velocity
n_controller.linear_rotation = b_bone.niftools.BSLagBoneController_linear_rotation
n_controller.maximum_distance = b_bone.niftools.BSLagBoneController_maximum_distance
#add controller to _this_ block
n_node.add_controller(n_controller)
33 changes: 31 additions & 2 deletions io_scene_niftools/properties/armature.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@
from bpy.props import (PointerProperty,
IntProperty,
EnumProperty,
StringProperty
StringProperty,
BoolProperty,
FloatProperty
)
from bpy.types import PropertyGroup

Expand All @@ -61,6 +63,34 @@ class BoneProperty(PropertyGroup):
name='Nif Long Name'
)

#BSLagbone properties

BSLagBoneController: BoolProperty(
Comment thread
HENDRIX-ZT2 marked this conversation as resolved.
Outdated
name='BSLagBoneController',
default=False
)

BSLagBoneController_flags: IntProperty(
name='flags',
default=72
)

BSLagBoneController_linear_velocity: FloatProperty(
name='linear velocity',
default=3.0
)

BSLagBoneController_linear_rotation: FloatProperty(
name='linear rotation',
default=1.0
)

BSLagBoneController_maximum_distance: FloatProperty(
name='maximum distance',
default=10.0
)



class ArmatureProperty(PropertyGroup):

Expand Down Expand Up @@ -101,7 +131,6 @@ def register():
bpy.types.Armature.niftools = bpy.props.PointerProperty(type=ArmatureProperty)
bpy.types.Bone.niftools = bpy.props.PointerProperty(type=BoneProperty)


def unregister():
del bpy.types.Armature.niftools
del bpy.types.Bone.niftools
Expand Down
28 changes: 27 additions & 1 deletion io_scene_niftools/ui/armature.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,31 @@ def draw(self, context):
row.prop(nif_bone_props, "priority")
row.prop(nif_bone_props, "longname")

class BoneControllerPanel(Panel):
bl_idname = "NIFTOOLS_PT_BoneControllerPanel"
bl_label = "Niftools Bone Controller Props"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "bone"

# noinspection PyUnusedLocal
@classmethod
def poll(cls, context):
return context.bone is not None

def draw(self, context):
nif_bone_props = context.bone.niftools

row = self.layout.column()
row.prop(nif_bone_props, "BSLagBoneController")
row2 = self.layout.column()
row2.prop(nif_bone_props, "BSLagBoneController_flags")
row2.prop(nif_bone_props, "BSLagBoneController_linear_velocity")
row2.prop(nif_bone_props, "BSLagBoneController_linear_rotation")
row2.prop(nif_bone_props, "BSLagBoneController_maximum_distance")
row2.enabled = nif_bone_props.BSLagBoneController



class ArmaturePanel(Panel):
bl_label = "Niftools Armature Props"
Expand All @@ -88,7 +113,8 @@ def draw(self, context):

classes = [
BonePanel,
ArmaturePanel
ArmaturePanel,
BoneControllerPanel
]


Expand Down