示例#1
0
    def _write_normals(self, object_, bmesh_, mesh_node, geometry_name):
        split_angle = 0
        use_edge_angle = False
        use_edge_sharp = False

        if object_.data.use_auto_smooth:
            use_edge_angle = True
            use_edge_sharp = True
            split_angle = object_.data.auto_smooth_angle
        else:
            for modifier in object_.modifiers:
                if modifier.type == 'EDGE_SPLIT' and modifier.show_viewport:
                    use_edge_angle = modifier.use_edge_angle
                    use_edge_sharp = modifier.use_edge_sharp
                    split_angle = modifier.split_angle

        float_normals = None
        if self._config.custom_normals:
            float_normals = utils.get_custom_normals(bmesh_, use_edge_angle,
                                                     split_angle)
        else:
            float_normals = utils.get_normal_array(bmesh_, use_edge_angle,
                                                   use_edge_sharp, split_angle)

        id_ = "{!s}-normal".format(geometry_name)
        source = utils.write_source(id_, "float", float_normals, "XYZ")
        mesh_node.appendChild(source)
示例#2
0
    def _write_positions(self, bmesh_, mesh_node, geometry_name):
        float_positions = []
        for vertex in bmesh_.verts:
            float_positions.extend(vertex.co)

        id_ = "{!s}-pos".format(geometry_name)
        source = utils.write_source(id_, "float", float_positions, "XYZ")
        mesh_node.appendChild(source)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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)
    def _create_animation_node(self, type_, data, id_prefix):
        id_ = "{!s}-{!s}".format(id_prefix, type_)
        type_map = {
            "input": ["float", ["TIME"]],
            "output": ["float", ["VALUE"]],
            "intangent": ["float", "XY"],
            "outangent": ["float", "XY"],
            "interpolation": ["name", ["INTERPOLATION"]]
        }

        source = utils.write_source(
            id_, type_map[type_][0], data, type_map[type_][1])

        return source
示例#7
0
    def _write_vertex_colors(self, object_, bmesh_, mesh_node, geometry_name):
        float_colors = []
        alpha_found = False

        color_layer = bmesh_.loops.layers.color.active
        if object_.data.vertex_colors:
            for vert in bmesh_.verts:
                loop = vert.link_loops[0]
                float_colors.extend(loop[color_layer])

        if float_colors:
            id_ = "{!s}-vcol".format(geometry_name)
            params = ("RGBA" if alpha_found else "RGB")
            source = utils.write_source(id_, "float", float_colors, params)
            mesh_node.appendChild(source)
示例#8
0
    def _write_uvs(self, object_, bmesh_, mesh_node, geometry_name):
        uv_layer = bmesh_.loops.layers.uv.active
        if object_.data.uv_layers.active is None:
            bcPrint(
                "{} object has no a UV map, creating a default UV...".format(
                    object_.name))
            uv_layer = bmesh_.loops.layers.uv.new()

        float_uvs = []

        for face in bmesh_.faces:
            for loop in face.loops:
                float_uvs.extend(loop[uv_layer].uv)

        id_ = "{!s}-uvs".format(geometry_name)
        source = utils.write_source(id_, "float", float_uvs, "ST")
        mesh_node.appendChild(source)
示例#9
0
    def _write_vertex_colors(self, object_, bmesh_, mesh_node, geometry_name):
        float_colors = []
        alpha_found = False

        active_layer = bmesh_.loops.layers.color.active
        if object_.data.vertex_colors:
            if active_layer.name.lower() == 'alpha':
                alpha_found = True
                for vert in bmesh_.verts:
                    loop = vert.link_loops[0]
                    color = loop[active_layer]
                    alpha_color = (color[0] + color[1] + color[2]) / 3.0
                    float_colors.extend([1.0, 1.0, 1.0, alpha_color])
            else:
                for vert in bmesh_.verts:
                    loop = vert.link_loops[0]
                    float_colors.extend(loop[active_layer])

        if float_colors:
            id_ = "{!s}-vcol".format(geometry_name)
            params = ("RGBA" if alpha_found else "RGB")
            source = utils.write_source(id_, "float", float_colors, params)
            mesh_node.appendChild(source)