def _process_bone_weights(self, object_, armature, skin_node): bones = utils.get_bones(armature) group_weights = [] vw = "" vertex_groups_lengths = "" vertex_count = 0 bone_list = {} for bone_id, bone in enumerate(bones): bone_list[bone.name] = bone_id for vertex in object_.data.vertices: vertex_group_count = 0 for group in vertex.groups: group_name = object_.vertex_groups[group.group].name if (group.weight == 0 or group_name not in bone_list): continue if vertex_group_count == 8: bcPrint("Too many bone references in {}:{} vertex group" .format(object_.name, group_name)) continue group_weights.append(group.weight) vw = "{}{} {} ".format(vw, bone_list[group_name], vertex_count) vertex_count += 1 vertex_group_count += 1 vertex_groups_lengths = "{}{} ".format(vertex_groups_lengths, vertex_group_count) id_ = "{!s}_{!s}-weights".format(armature.name, object_.name) source = utils.write_source(id_, "float", group_weights, []) skin_node.appendChild(source) vertex_weights = self._doc.createElement("vertex_weights") vertex_weights.setAttribute("count", str(len(object_.data.vertices))) id_ = "{!s}_{!s}".format(armature.name, object_.name) input = utils.write_input(id_, 0, "joints", "JOINT") vertex_weights.appendChild(input) input = utils.write_input(id_, 1, "weights", "WEIGHT") vertex_weights.appendChild(input) vcount = self._doc.createElement("vcount") vcount_text = self._doc.createTextNode(vertex_groups_lengths) vcount.appendChild(vcount_text) vertex_weights.appendChild(vcount) v = self._doc.createElement("v") v_text = self._doc.createTextNode(vw) v.appendChild(v_text) vertex_weights.appendChild(v) skin_node.appendChild(vertex_weights)
def _process_bone_joints(self, object_, armature, skin_node, group): bones = utils.get_bones(armature) id_ = "{!s}_{!s}-joints".format(armature.name, object_.name) bone_names = [] for bone in bones: props_name = self._create_properties_name(bone, group) bone_name = "{!s}{!s}".format(bone.name, props_name) bone_names.append(bone_name) source = utils.write_source(id_, "IDREF", bone_names, []) skin_node.appendChild(source)
def _process_bone_matrices(self, object_, armature, skin_node): bones = utils.get_bones(armature) bone_matrices = [] for bone in armature.pose.bones: bone_matrix = utils.transform_bone_matrix(bone) bone_matrices.extend(utils.matrix_to_array(bone_matrix)) id_ = "{!s}_{!s}-matrices".format(armature.name, object_.name) source = utils.write_source(id_, "float4x4", bone_matrices, []) skin_node.appendChild(source)