def __gather_base_color_factor(blender_material, export_settings): if not blender_material.use_nodes: return [*blender_material.diffuse_color[:3], 1.0] rgb, alpha = None, None alpha_socket = gltf2_blender_get.get_socket(blender_material, "Alpha") if isinstance(alpha_socket, bpy.types.NodeSocket): if export_settings['gltf_image_format'] != "NONE": alpha = gltf2_blender_get.get_factor_from_socket(alpha_socket, kind='VALUE') else: alpha = gltf2_blender_get.get_const_from_default_value_socket(alpha_socket, kind='VALUE') base_color_socket = gltf2_blender_get.get_socket(blender_material, "Base Color") if base_color_socket is None: base_color_socket = gltf2_blender_get.get_socket(blender_material, "BaseColor") if base_color_socket is None: base_color_socket = gltf2_blender_get.get_socket_old(blender_material, "BaseColorFactor") if isinstance(base_color_socket, bpy.types.NodeSocket): if export_settings['gltf_image_format'] != "NONE": rgb = gltf2_blender_get.get_factor_from_socket(base_color_socket, kind='RGB') else: rgb = gltf2_blender_get.get_const_from_default_value_socket(base_color_socket, kind='RGB') if rgb is None: rgb = [1.0, 1.0, 1.0] if alpha is None: alpha = 1.0 rgba = [*rgb, alpha] if rgba == [1, 1, 1, 1]: return None return rgba
def __gather_base_color_factor(blender_material, export_settings): rgb, alpha = None, None alpha_socket = gltf2_blender_get.get_socket(blender_material, "Alpha") if isinstance(alpha_socket, bpy.types.NodeSocket): alpha = gltf2_blender_get.get_factor_from_socket(alpha_socket, kind='VALUE') base_color_socket = gltf2_blender_get.get_socket(blender_material, "Base Color") if base_color_socket is None: base_color_socket = gltf2_blender_get.get_socket( blender_material, "BaseColor") if base_color_socket is None: base_color_socket = gltf2_blender_get.get_socket_old( blender_material, "BaseColorFactor") if base_color_socket is None: base_color_socket = gltf2_blender_get.get_socket( blender_material, "Background") if isinstance(base_color_socket, bpy.types.NodeSocket): rgb = gltf2_blender_get.get_factor_from_socket(base_color_socket, kind='RGB') if rgb is None: rgb = [1.0, 1.0, 1.0] if alpha is None: alpha = 1.0 rgba = [*rgb, alpha] if rgba == [1, 1, 1, 1]: return None return rgba
def gather_base_color_factor(info, export_settings): rgb, alpha = None, None if 'rgb_socket' in info: rgb = gltf2_blender_get.get_factor_from_socket(info['rgb_socket'], kind='RGB') if 'alpha_socket' in info: alpha = gltf2_blender_get.get_factor_from_socket(info['alpha_socket'], kind='VALUE') if rgb is None: rgb = [1.0, 1.0, 1.0] if alpha is None: alpha = 1.0 rgba = [*rgb, alpha] if rgba == [1, 1, 1, 1]: return None return rgba
def __gather_roughness_factor(blender_material, export_settings): if not blender_material.use_nodes: return blender_material.roughness roughness_socket = gltf2_blender_get.get_socket(blender_material, "Roughness") if roughness_socket is None: roughness_socket = gltf2_blender_get.get_socket_old(blender_material, "RoughnessFactor") if isinstance(roughness_socket, bpy.types.NodeSocket): fac = gltf2_blender_get.get_factor_from_socket(roughness_socket, kind='VALUE') return fac if fac != 1 else None return None
def __gather_metallic_factor(blender_material, export_settings): if not blender_material.use_nodes: return blender_material.metallic metallic_socket = gltf2_blender_get.get_socket(blender_material, "Metallic") if metallic_socket is None: metallic_socket = gltf2_blender_get.get_socket_old(blender_material, "MetallicFactor") if isinstance(metallic_socket, bpy.types.NodeSocket): fac = gltf2_blender_get.get_factor_from_socket(metallic_socket, kind='VALUE') return fac if fac != 1 else None return None
def __gather_emissive_factor(blender_material, export_settings): emissive_socket = gltf2_blender_get.get_socket(blender_material, "Emissive") if emissive_socket is None: emissive_socket = gltf2_blender_get.get_socket_old(blender_material, "EmissiveFactor") if isinstance(emissive_socket, bpy.types.NodeSocket): fac = gltf2_blender_get.get_factor_from_socket(emissive_socket, kind='RGB') if fac is None and emissive_socket.is_linked: # In glTF, the default emissiveFactor is all zeros, so if an emission texture is connected, # we have to manually set it to all ones. fac = [1.0, 1.0, 1.0] if fac == [0, 0, 0]: fac = None return fac return None
def __gather_emissive_factor(blender_material, export_settings): emissive_socket = gltf2_blender_get.get_socket(blender_material, "Emissive") if emissive_socket is None: emissive_socket = gltf2_blender_get.get_socket_old( blender_material, "EmissiveFactor") if isinstance(emissive_socket, bpy.types.NodeSocket): if export_settings['gltf_image_format'] != "NONE": factor = gltf2_blender_get.get_factor_from_socket(emissive_socket, kind='RGB') else: factor = gltf2_blender_get.get_const_from_default_value_socket( emissive_socket, kind='RGB') if factor is None and emissive_socket.is_linked: # In glTF, the default emissiveFactor is all zeros, so if an emission texture is connected, # we have to manually set it to all ones. factor = [1.0, 1.0, 1.0] if factor is None: factor = [0.0, 0.0, 0.0] # Handle Emission Strength strength_socket = None if emissive_socket.node.type == 'EMISSION': strength_socket = emissive_socket.node.inputs['Strength'] elif 'Emission Strength' in emissive_socket.node.inputs: strength_socket = emissive_socket.node.inputs['Emission Strength'] strength = (gltf2_blender_get.get_const_from_socket(strength_socket, kind='VALUE') if strength_socket is not None else None) if strength is not None: factor = [f * strength for f in factor] # Clamp to range [0,1] factor = [min(1.0, f) for f in factor] if factor == [0, 0, 0]: factor = None return factor return None
def __gather_clearcoat_extension(blender_material, export_settings): clearcoat_enabled = False has_clearcoat_texture = False has_clearcoat_roughness_texture = False clearcoat_extension = {} clearcoat_roughness_slots = () clearcoat_socket = gltf2_blender_get.get_socket(blender_material, 'Clearcoat') clearcoat_roughness_socket = gltf2_blender_get.get_socket( blender_material, 'Clearcoat Roughness') clearcoat_normal_socket = gltf2_blender_get.get_socket( blender_material, 'Clearcoat Normal') if isinstance(clearcoat_socket, bpy.types.NodeSocket) and not clearcoat_socket.is_linked: clearcoat_extension['clearcoatFactor'] = clearcoat_socket.default_value clearcoat_enabled = clearcoat_extension['clearcoatFactor'] > 0 elif __has_image_node_from_socket(clearcoat_socket): fac = gltf2_blender_get.get_factor_from_socket(clearcoat_socket, kind='VALUE') # default value in glTF is 0.0, but if there is a texture without factor, use 1 clearcoat_extension['clearcoatFactor'] = fac if fac != None else 1.0 has_clearcoat_texture = True clearcoat_enabled = True if not clearcoat_enabled: return None if isinstance( clearcoat_roughness_socket, bpy.types.NodeSocket) and not clearcoat_roughness_socket.is_linked: clearcoat_extension[ 'clearcoatRoughnessFactor'] = clearcoat_roughness_socket.default_value elif __has_image_node_from_socket(clearcoat_roughness_socket): fac = gltf2_blender_get.get_factor_from_socket( clearcoat_roughness_socket, kind='VALUE') # default value in glTF is 0.0, but if there is a texture without factor, use 1 clearcoat_extension[ 'clearcoatRoughnessFactor'] = fac if fac != None else 1.0 has_clearcoat_roughness_texture = True # Pack clearcoat (R) and clearcoatRoughness (G) channels. if has_clearcoat_texture and has_clearcoat_roughness_texture: clearcoat_roughness_slots = ( clearcoat_socket, clearcoat_roughness_socket, ) elif has_clearcoat_texture: clearcoat_roughness_slots = (clearcoat_socket, ) elif has_clearcoat_roughness_texture: clearcoat_roughness_slots = (clearcoat_roughness_socket, ) if len(clearcoat_roughness_slots) > 0: if has_clearcoat_texture: clearcoat_extension[ 'clearcoatTexture'] = gltf2_blender_gather_texture_info.gather_texture_info( clearcoat_socket, clearcoat_roughness_slots, export_settings, ) if has_clearcoat_roughness_texture: clearcoat_extension[ 'clearcoatRoughnessTexture'] = gltf2_blender_gather_texture_info.gather_texture_info( clearcoat_roughness_socket, clearcoat_roughness_slots, export_settings, ) if __has_image_node_from_socket(clearcoat_normal_socket): clearcoat_extension[ 'clearcoatNormalTexture'] = gltf2_blender_gather_texture_info.gather_material_normal_texture_info_class( clearcoat_normal_socket, (clearcoat_normal_socket, ), export_settings) return Extension('KHR_materials_clearcoat', clearcoat_extension, False)