Ejemplo n.º 1
0
    def set_shader_presets_item(self, value):
        """
        Receives an actual index of currently selected Shader preset name in the menu,
        sets that Shader name as active in active Material.
        :param value:
        :return:
        """

        material = bpy.context.active_object.active_material
        if value == 0:  # No Shader...
            material.scs_props.active_shader_preset_name = "<none>"
            material.scs_props.mat_effect_name = "None"

            # reset material nodes when user selects none shader
            if material.node_tree:
                material.node_tree.nodes.clear()
                material.use_nodes = False

            material["scs_shader_attributes"] = {}
        else:
            for preset_i, preset in enumerate(_get_shader_presets_inventory()):
                if value == preset_i:

                    # Set Shader Preset in the Material
                    preset_section = _material_utils.get_shader_preset(
                        _get_scs_globals().shader_presets_filepath,
                        preset.name)

                    if preset_section:
                        preset_name = preset_section.get_prop_value(
                            "PresetName")
                        preset_effect = preset_section.get_prop_value("Effect")
                        material.scs_props.mat_effect_name = preset_effect

                        if preset_name:
                            _material_utils.set_shader_data_to_material(
                                material, preset_section)
                            material.scs_props.active_shader_preset_name = preset_name
                        else:
                            material.scs_props.active_shader_preset_name = "<none>"
                            material["scs_shader_attributes"] = {}
                            print('    NO "preset_name"!')
                            # if preset_effect:
                            # print('      preset_effect: "%s"' % preset_effect)
                            # if preset_flags:
                            # print('      preset_flags: "%s"' % preset_flags)
                            # if preset_attribute_cnt:
                            # print('      preset_attribute_cnt: "%s"' % preset_attribute_cnt)
                            # if preset_texture_cnt:
                            # print('      preset_texture_cnt: "%s"' % preset_texture_cnt)
                    else:
                        print('''NO "preset_section"! (Shouldn't happen!)''')
                else:
                    preset.active = False
Ejemplo n.º 2
0
def _find_preset(presets_container, material_effect, material_textures):
    """Tries to find suitable Shader Preset (as defined in shader_presets.txt file) for imported shader. If it cannot be found, it will return None.

    :param presets_container: preset container in which preset shall be searched for; if none presets are readed from file
    :type presets_container: io_scs_tools.internals.structure.SectionData | None
    :param material_effect: Name of the requested Look
    :type material_effect: str
    :param material_textures: material textures dictionary (key: tex_id, value: tex_path)
    :type material_textures: dict
    :return: Preset index and name or None
    :rtype: (int, str) | None
    """

    scs_shader_presets_inventory = bpy.data.worlds[
        0].scs_shader_presets_inventory
    for i, shader_preset in enumerate(scs_shader_presets_inventory):

        if shader_preset.name != "<none>":
            preset_section = _material_utils.get_shader_preset(
                _get_scs_globals().shader_presets_filepath, shader_preset.name,
                presets_container)
            for preset_prop in preset_section.props:
                if preset_prop[0] == "Effect":

                    if preset_prop[1] == material_effect:

                        # also check for matching among locked textures
                        # NOTE: this check is needed because of possible multiple
                        # presets with the same effect name and different locked texture
                        matched_textures = 0
                        matched_textures_avaliable = 0
                        for tex_sec in preset_section.get_sections("Texture"):

                            tex_id = tex_sec.get_prop("Tag")[1]
                            tex_path = tex_sec.get_prop("Value")[1]
                            tex_lock = tex_sec.get_prop("Lock")

                            if tex_lock and tex_lock[1] == "True":
                                matched_textures_avaliable += 1

                                if tex_id in material_textures and (
                                        tex_path == material_textures[tex_id]
                                        or tex_path == ""):
                                    matched_textures += 1

                        if matched_textures == matched_textures_avaliable or matched_textures_avaliable == 0:
                            return i, shader_preset.name, preset_section

    return None, None, None
Ejemplo n.º 3
0
    def set_shader_presets_item(self, value):
        """
        Receives an actual index of currently selected Shader preset name in the menu,
        sets that Shader name as active in active Material.
        :param value:
        :return:
        """

        material = bpy.context.active_object.active_material
        if value == 0:  # No Shader...
            material.scs_props.active_shader_preset_name = "<none>"
            material.scs_props.mat_effect_name = "None"
            material["scs_shader_attributes"] = {}
        else:
            for preset_i, preset in enumerate(bpy.data.worlds[0].scs_shader_presets_inventory):
                if value == preset_i:

                    # Set Shader Preset in the Material
                    preset_section = _material_utils.get_shader_preset(_get_scs_globals().shader_presets_filepath, preset.name)

                    if preset_section:
                        preset_name = preset_section.get_prop_value("PresetName")
                        preset_effect = preset_section.get_prop_value("Effect")
                        material.scs_props.mat_effect_name = preset_effect

                        if preset_name:
                            _material_utils.set_shader_data_to_material(material, preset_section, preset_effect)
                            material.scs_props.active_shader_preset_name = preset_name
                        else:
                            material.scs_props.active_shader_preset_name = "<none>"
                            material["scs_shader_attributes"] = {}
                            print('    NO "preset_name"!')
                            # if preset_effect:
                            # print('      preset_effect: "%s"' % preset_effect)
                            # if preset_flags:
                            # print('      preset_flags: "%s"' % preset_flags)
                            # if preset_attribute_cnt:
                            # print('      preset_attribute_cnt: "%s"' % preset_attribute_cnt)
                            # if preset_texture_cnt:
                            # print('      preset_texture_cnt: "%s"' % preset_texture_cnt)
                    else:
                        print('''NO "preset_section"! (Shouldn't happen!)''')
                else:
                    preset.active = False
Ejemplo n.º 4
0
def _find_preset(presets_container, material_effect, material_textures):
    """Tries to find suitable Shader Preset (as defined in shader_presets.txt file) for imported shader. If it cannot be found, it will return None.

    :param presets_container: preset container in which preset shall be searched for; if none presets are readed from file
    :type presets_container: io_scs_tools.internals.structure.SectionData | None
    :param material_effect: Name of the requested Look
    :type material_effect: str
    :param material_textures: material textures dictionary (key: tex_id, value: tex_path)
    :type material_textures: dict
    :return: Preset index and name or None
    :rtype: (int, str) | None
    """

    scs_shader_presets_inventory = bpy.data.worlds[0].scs_shader_presets_inventory
    for i, shader_preset in enumerate(scs_shader_presets_inventory):

        if shader_preset.name != "<none>":
            preset_section = _material_utils.get_shader_preset(_get_scs_globals().shader_presets_filepath, shader_preset.name, presets_container)
            for preset_prop in preset_section.props:
                if preset_prop[0] == "Effect":

                    if preset_prop[1] == material_effect:

                        # also check for matching among locked textures
                        # NOTE: this check is needed because of possible multiple
                        # presets with the same effect name and different locked texture
                        matched_textures = 0
                        matched_textures_avaliable = 0
                        for tex_sec in preset_section.get_sections("Texture"):

                            tex_id = tex_sec.get_prop("Tag")[1]
                            tex_path = tex_sec.get_prop("Value")[1]
                            tex_lock = tex_sec.get_prop("Lock")

                            if tex_lock and tex_lock[1] == "True":
                                matched_textures_avaliable += 1

                                if tex_id in material_textures and (tex_path == material_textures[tex_id] or tex_path == ""):
                                    matched_textures += 1

                        if matched_textures == matched_textures_avaliable or matched_textures_avaliable == 0:
                            return i, shader_preset.name, preset_section

    return None, None, None
Ejemplo n.º 5
0
def _find_preset(material_effect):
    """Tries to find suitable Shader Preset (as defined in shader_presets.txt file) for imported shader. If it cannot be found, it will return None.

    :param material_effect: Name of the requested Look
    :type material_effect: str
    :return: Preset index and name or None
    :rtype: (int, str) | None
    """

    scs_shader_presets_inventory = bpy.context.scene.scs_shader_presets_inventory
    for i, shader_preset in enumerate(scs_shader_presets_inventory):

        if shader_preset.name != "<none>":
            preset_section = _material_utils.get_shader_preset(_get_scs_globals().shader_presets_filepath, shader_preset.name)
            for preset_prop in preset_section.props:
                if preset_prop[0] == "Effect":

                    if preset_prop[1] == material_effect:

                        return i, shader_preset.name

    return None, None
Ejemplo n.º 6
0
def load(filepath, pim_mats_info):
    """Enty point for importing PIT file

    :param filepath: filepath of PIT file
    :type filepath: str
    :param pim_mats_info: list of material info, one material info consists of list: [ blend_mat_name, mat_effect, original_mat_alias ]
    :type pim_mats_info: list of list
    """
    print("\n************************************")
    print("**      SCS PIT Importer          **")
    print("**      (c)2014 SCS Software      **")
    print("************************************\n")

    ind = '    '
    pit_container = _pix_container.get_data_from_file(filepath, ind)

    # TEST PRINTOUTS
    # ind = '  '
    # for section in pit_container:
    # print('SEC.: "%s"' % section.type)
    # for prop in section.props:
    # print('%sProp: %s' % (ind, prop))
    # for data in section.data:
    # print('%sdata: %s' % (ind, data))
    # for sec in section.sections:
    # print_section(sec, ind)
    # print('\nTEST - Source: "%s"' % pit_container[0].props[1][1])
    # print('')

    # TEST EXPORT
    # path, file = os.path.splitext(filepath)
    # export_filepath = str(path + '_reex' + file)
    # result = pix_write.write_data(pit_container, export_filepath, ind, dump_level)
    # if result == {'FINISHED'}:
    # Print(dump_level, '\nI Test export succesful! The new file:\n  "%s"', export_filepath)
    # else:
    # Print(dump_level, '\nE Test export failed! File:\n  "%s"', export_filepath)

    # LOAD HEADER
    '''
    NOTE: skipped for now as no data needs to be readed
    (format_version, source, f_type, f_name, source_filename, author) = _get_header(pit_container, dump_level)
    '''

    # LOAD GLOBALS
    '''
    NOTE: skipped for now as no data needs to be readed
    (look_count, variant_count, part_count, material_count) = _get_global(pit_container, dump_level)
    '''

    # LOAD LOOKS AND VARIANTS
    loaded_looks = {}
    looks = []
    loaded_variants = []
    for section in pit_container:
        if section.type == 'Look':
            look_name, look_mat_settings = _get_look(section)
            loaded_looks[look_name] = look_mat_settings
            looks.append(look_name)
        elif section.type == 'Variant':
            variant_name, variantparts = _get_variant(section)
            variant_record = (variant_name, variantparts)
            # variant_record = (getVariant(section))
            loaded_variants.append(variant_record)
            # loaded_variants.append((getVariant(section)))

    # PICK ONE LOOK DATA BLOCK, NOTE: This is temporal now as we don't have proper support for Looks.
    if "Default" in loaded_looks:
        look_name = "Default"
    else:
        look_name = looks[0]
    # print(" look_name: %r" % look_name)
    look_mat_settings = loaded_looks[look_name]

    # SETUP ALL THE MATERIALS, NOTE: They should be already created by PIM import.
    for mat_info in pim_mats_info:
        mat = bpy.data.materials[mat_info[0]]
        if mat_info[2] in look_mat_settings:

            # ASSIGN IMPORTED SHADER DATA
            material_effect, material_attributes, material_textures, material_section = _get_shader_data(look_mat_settings[mat_info[2]])

            # TRY TO FIND SUITABLE PRESET
            (preset_index, preset_name) = _find_preset(material_effect)

            if preset_index:  # preset name is found within presets shaders

                mat.scs_props.active_shader_preset_name = preset_name
                preset_section = _material_utils.get_shader_preset(_get_scs_globals().shader_presets_filepath, preset_name)

                if preset_section:

                    preset_effect = preset_section.get_prop_value("Effect")
                    mat.scs_props.mat_effect_name = preset_effect

                    # apply default shader settings
                    _material_utils.set_shader_data_to_material(mat, preset_section, preset_effect,
                                                                is_import=True)

                    # reapply settings from material
                    _material_utils.set_shader_data_to_material(mat, material_section, material_effect,
                                                                is_import=True, override_back_data=False)

                    lprint("I Using shader preset on material %r.", (mat.name,))

                else:
                    print('''NO "preset_section"! (Shouldn't happen!)''')

            else:  # import shader directly from material and mark it as imported

                mat.scs_props.active_shader_preset_name = "<imported>"
                _material_utils.set_shader_data_to_material(mat, material_section, material_effect,
                                                            is_import=True)

                lprint("I Using imported shader on material %r.", (mat.name,))

            # delete not needed data on material
            if "scs_tex_aliases" in mat:
                del mat["scs_tex_aliases"]

    print("************************************")
    return {'FINISHED'}, loaded_variants