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
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
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
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
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
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