@@ -97,35 +97,27 @@ def get_export_objects(self, only_selected=True):
9797 def export_root_node (self , root_objects , filebase ):
9898 """ Exports a nif's root node; use blender root if there is only one, else create a meta root """
9999 # TODO [collsion] detect root collision -> root collision node (can be mesh or empty)
100- # self.nif_export.collisionhelper. export_collision(b_obj, n_parent)
100+ # self.export_collision(b_obj, n_parent)
101101 # return None # done; stop here
102102 self .n_root = None
103+ node_type = bpy .context .scene .niftools_scene .rootnode
103104 # there is only one root object so that will be our final root
104105 if len (root_objects ) == 1 :
105106 b_obj = root_objects [0 ]
106- self .export_node (b_obj , None )
107+ self .export_node (b_obj , None , n_node_type = node_type )
107108
108109 # there is more than one root object so we create a meta root
109110 else :
110- NifLog .info ("Created meta root because blender scene had multiple root objects" )
111- self .n_root = types .create_ninode ()
111+ NifLog .info (f "Created meta root because blender scene had { len ( root_objects ) } root objects" )
112+ self .n_root = types .create_ninode (n_node_type = node_type )
112113 self .n_root .name = "Scene Root"
113114 for b_obj in root_objects :
114115 self .export_node (b_obj , self .n_root )
115116
116- # TODO [object] How dow we know we are selecting the right node in the case of multi-root?
117- # making root block a fade node
118- root_type = b_obj .niftools .rootnode
119- if bpy .context .scene .niftools_scene .game in ('FALLOUT_3' , 'SKYRIM' ) and root_type == 'BSFadeNode' :
120- NifLog .info ("Making root block a BSFadeNode" )
121- fade_root_block = NifFormat .BSFadeNode ().deepcopy (self .n_root )
122- fade_root_block .replace_global_node (self .n_root , fade_root_block )
123- self .n_root = fade_root_block
124-
125117 # various extra datas
126118 object_property = ObjectDataProperty ()
127119 object_property .export_bsxflags_upb (self .n_root , root_objects )
128- object_property .export_inventory_marker (self .n_root , root_objects )
120+ object_property .export_inventory_marker (self .n_root , b_obj )
129121 object_property .export_weapon_location (self .n_root , b_obj )
130122 types .export_furniture_marker (self .n_root , filebase )
131123 return self .n_root
@@ -147,7 +139,7 @@ def set_node_flags(self, b_obj, n_node):
147139 else :
148140 n_node .flags = 0x000C # morrowind
149141
150- def export_node (self , b_obj , n_parent ):
142+ def export_node (self , b_obj , n_parent , n_node_type = None ):
151143 """Export a mesh/armature/empty object b_obj as child of n_parent.
152144 Export also all children of b_obj.
153145
@@ -190,7 +182,7 @@ def export_node(self, b_obj, n_parent):
190182 b_action = False
191183
192184 # -> everything else (empty/armature) is a (more or less regular) node
193- node = types .create_ninode (b_obj )
185+ node = types .create_ninode (b_obj , n_node_type = n_node_type )
194186 # set parenting here so that it can be accessed
195187 if not self .n_root :
196188 self .n_root = node
@@ -207,32 +199,31 @@ def export_node(self, b_obj, n_parent):
207199 # export object animation
208200 self .transform_anim .export_transforms (node , b_obj , b_action )
209201 self .object_anim .export_visibility (node , b_action )
210- # if it is a mesh, export the mesh as trishape children of this ninode
202+ # if it is a mesh, export the mesh as n_geom children of this ninode
211203 if b_obj .type == 'MESH' :
212204 return self .mesh_helper .export_tri_shapes (b_obj , node , self .n_root )
213205 # if it is an armature, export the bones as ninode children of this ninode
214206 elif b_obj .type == 'ARMATURE' :
215207 self .armaturehelper .export_bones (b_obj , node )
216-
217- # export all children of this b_obj as children of this NiNode
218- self .export_children (b_obj , node )
208+ # special case: objects parented to armature bones
209+ for b_child in b_obj .children :
210+ # find and attach to the right node
211+ if b_child .parent_bone :
212+ b_obj_bone = b_obj .data .bones [b_child .parent_bone ]
213+ # find the correct n_node
214+ # todo [object] this is essentially the same as Mesh.get_bone_block()
215+ n_node = [k for k , v in block_store .block_to_obj .items () if v == b_obj_bone ][0 ]
216+ self .export_node (b_child , n_node )
217+ # just child of the armature itself, so attach to armature root
218+ else :
219+ self .export_node (b_child , node )
220+ else :
221+ # export all children of this empty object as children of this node
222+ for b_child in b_obj .children :
223+ self .export_node (b_child , node )
219224
220225 return node
221226
222- def export_children (self , b_parent , n_parent ):
223- """Export all children of blender object b_parent as children of n_parent."""
224- # loop over all obj's children
225- for b_child in b_parent .children :
226- temp_parent = n_parent
227- # special case: objects parented to armature bones - find the nif parent bone
228- if b_parent .type == 'ARMATURE' and b_child .parent_bone != "" :
229- parent_bone = b_parent .data .bones [b_child .parent_bone ]
230- assert (parent_bone in block_store .block_to_obj .values ())
231- for temp_parent , obj in block_store .block_to_obj .items ():
232- if obj == parent_bone :
233- break
234- self .export_node (b_child , temp_parent )
235-
236227 def export_collision (self , b_obj , n_parent ):
237228 """Main function for adding collision object b_obj to a node.
238229 Returns True if this object is exported as a collision"""
@@ -259,7 +250,7 @@ def export_collision(self, b_obj, n_parent):
259250 else :
260251 # all nodes failed so add new one
261252 node = types .create_ninode (b_obj )
262- node .name = 'collisiondummy{:d}' . format ( n_parent .num_children )
253+ node .name = f 'collisiondummy{ n_parent .num_children } '
263254 if b_obj .niftools .flags != 0 :
264255 node_flag_hex = hex (b_obj .niftools .flags )
265256 else :
@@ -273,4 +264,4 @@ def export_collision(self, b_obj, n_parent):
273264 else :
274265 NifLog .warn (f"Collisions not supported for game '{ bpy .context .scene .niftools_scene .game } ', skipped collision object '{ b_obj .name } '" )
275266
276- return True
267+ return True
0 commit comments