def run(self): """ Loads rocks.""" rocks_settings = self.config.get_list("batches", []) for subsec_num, subsec_settings in enumerate(rocks_settings): subsec_config = Config(subsec_settings) subsec_objects = RockEssentialsRockLoader.load_rocks( path=subsec_config.get_string("path"), subsec_num=subsec_num, objects=subsec_config.get_list("objects", []), sample_objects=subsec_config.get_bool("sample_objects", False), amount=subsec_config.get_int("amount") if subsec_config.has_param("amount") else None ) RockEssentialsRockLoader.set_rocks_properties( objects=subsec_objects, physics=subsec_config.get_bool("physics", False), render_levels=subsec_config.get_int("render_levels", 3), high_detail_mode=subsec_config.get_bool("high_detail_mode", False), scale=subsec_config.get_vector3d("scale", [1, 1, 1]), reflection_amount=subsec_config.get_float("reflection_amount") if subsec_config.has_param("reflection_amount") else None, reflection_roughness=subsec_config.get_float("reflection_roughness") if subsec_config.has_param("reflection_roughness") else None, hsv=subsec_config.get_list("HSV") if subsec_config.has_param("HSV") else None )
def _infuse_texture(material: Material, config: Config): """ Overlays the selected material with a texture, this can be either a color texture like for example dirt or it can be a texture, which is used as an input to the Principled BSDF of the given material. :param material: Material, which will be changed :param config: containing the config information """ used_mode = config.get_string("mode", "overlay").lower() if used_mode not in ["overlay", "mix", "set"]: raise Exception(f'This mode is unknown here: {used_mode}, only ["overlay", "mix", "set"]!') used_textures = config.get_list("used_texture") if len(used_textures) == 0: raise Exception(f"You have to select a texture, which is {used_mode} over the material!") invert_texture = config.get_bool("invert_texture", False) used_texture = random.choice(used_textures) used_connector = config.get_string("connection", "Base Color").title() texture_scale = config.get_float("texture_scale", 0.05) if config.has_param("strength") and used_mode == "set": raise Exception("The strength can only be used if the mode is not \"set\"!") strength = config.get_float("strength", 0.5) principled_bsdfs = material.get_nodes_with_type("BsdfPrincipled") if len(principled_bsdfs) != 1: raise Exception("This only works with materials, which have exactly one Prinicpled BSDF, " "use a different selector!") principled_bsdf = principled_bsdfs[0] if used_connector not in principled_bsdf.inputs: raise Exception(f"The {used_connector} not an input to Principled BSDF!") node_connected_to_the_connector = None for link in material.links: if link.to_socket == principled_bsdf.inputs[used_connector]: node_connected_to_the_connector = link.from_node # remove this connection material.links.remove(link) if node_connected_to_the_connector is not None or used_mode == "set": texture_node = material.new_node("ShaderNodeTexImage") texture_node.image = used_texture.image # add texture coords to make the scaling of the dust texture possible texture_coords = material.new_node("ShaderNodeTexCoord") mapping_node = material.new_node("ShaderNodeMapping") mapping_node.vector_type = "TEXTURE" mapping_node.inputs["Scale"].default_value = [texture_scale] * 3 material.link(texture_coords.outputs["UV"], mapping_node.inputs["Vector"]) material.link(mapping_node.outputs["Vector"], texture_node.inputs["Vector"]) texture_node_output = texture_node.outputs["Color"] if invert_texture: invert_node = material.new_node("ShaderNodeInvert") invert_node.inputs["Fac"].default_value = 1.0 material.link(texture_node_output, invert_node.inputs["Color"]) texture_node_output = invert_node.outputs["Color"] if node_connected_to_the_connector is not None and used_mode != "set": mix_node = material.new_node("ShaderNodeMixRGB") if used_mode in "mix_node": mix_node.blend_type = "OVERLAY" elif used_mode in "mix": mix_node.blend_type = "MIX" mix_node.inputs["Fac"].default_value = strength material.link(texture_node_output, mix_node.inputs["Color2"]) # hopefully 0 is the color node! material.link(node_connected_to_the_connector.outputs[0], mix_node.inputs["Color1"]) material.link(mix_node.outputs["Color"], principled_bsdf.inputs[used_connector]) elif used_mode == "set": material.link(texture_node_output, principled_bsdf.inputs[used_connector])