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): 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 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_metallic_roughness_texture(blender_material, orm_texture, export_settings): metallic_socket = gltf2_blender_get.get_socket(blender_material, "Metallic") roughness_socket = gltf2_blender_get.get_socket(blender_material, "Roughness") hasMetal = metallic_socket is not None and __has_image_node_from_socket( metallic_socket) hasRough = roughness_socket is not None and __has_image_node_from_socket( roughness_socket) if not hasMetal and not hasRough: metallic_roughness = gltf2_blender_get.get_socket_old( blender_material, "MetallicRoughness") if metallic_roughness is None or not __has_image_node_from_socket( metallic_roughness): return None texture_input = (metallic_roughness, ) elif not hasMetal: texture_input = (roughness_socket, ) elif not hasRough: texture_input = (metallic_socket, ) else: texture_input = (metallic_socket, roughness_socket) return gltf2_blender_gather_texture_info.gather_texture_info( texture_input[0], orm_texture or texture_input, export_settings, )
def __gather_occlusion_texture(blender_material, orm_texture, export_settings): occlusion = gltf2_blender_get.get_socket(blender_material, "Occlusion") if occlusion is None: occlusion = gltf2_blender_get.get_socket_old(blender_material, "Occlusion") return gltf2_blender_gather_texture_info.gather_material_occlusion_texture_info_class( occlusion, orm_texture or (occlusion,), export_settings)
def __gather_normal_texture(blender_material, export_settings): normal = gltf2_blender_get.get_socket(blender_material, "Normal") if normal is None: normal = gltf2_blender_get.get_socket_old(blender_material, "Normal") return gltf2_blender_gather_texture_info.gather_material_normal_texture_info_class( normal, (normal,), export_settings)
def __gather_double_sided(blender_material, export_settings): if not blender_material.use_backface_culling: return True old_double_sided_socket = gltf2_blender_get.get_socket_old(blender_material, "DoubleSided") if old_double_sided_socket is not None and\ not old_double_sided_socket.is_linked and\ old_double_sided_socket.default_value > 0.5: return True return None
def __gather_orm_texture(blender_material, export_settings): # Check for the presence of Occlusion, Roughness, Metallic sharing a single image. # If not fully shared, return None, so the images will be cached and processed separately. occlusion = gltf2_blender_get.get_socket(blender_material, "Occlusion") if occlusion is None or not __has_image_node_from_socket(occlusion): occlusion = gltf2_blender_get.get_socket_old(blender_material, "Occlusion") if occlusion is None or not __has_image_node_from_socket(occlusion): return None metallic_socket = gltf2_blender_get.get_socket(blender_material, "Metallic") roughness_socket = gltf2_blender_get.get_socket(blender_material, "Roughness") hasMetal = metallic_socket is not None and __has_image_node_from_socket(metallic_socket) hasRough = roughness_socket is not None and __has_image_node_from_socket(roughness_socket) if not hasMetal and not hasRough: metallic_roughness = gltf2_blender_get.get_socket_old(blender_material, "MetallicRoughness") if metallic_roughness is None or not __has_image_node_from_socket(metallic_roughness): return None result = (occlusion, metallic_roughness) elif not hasMetal: result = (occlusion, roughness_socket) elif not hasRough: result = (occlusion, metallic_socket) else: result = (occlusion, roughness_socket, metallic_socket) if not gltf2_blender_gather_texture_info.check_same_size_images(result): print_console("INFO", "Occlusion and metal-roughness texture will be exported separately " "(use same-sized images if you want them combined)") return None # Double-check this will past the filter in texture_info info = gltf2_blender_gather_texture_info.gather_texture_info(result[0], result, export_settings) if info is None: return None return result
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_base_color_texture(blender_material, export_settings): 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, "BaseColor") alpha_socket = gltf2_blender_get.get_socket(blender_material, "Alpha") # keep sockets that have some texture : color and/or alpha inputs = tuple( socket for socket in [base_color_socket, alpha_socket] if socket is not None and __has_image_node_from_socket(socket)) if not inputs: return None return gltf2_blender_gather_texture_info.gather_texture_info( inputs[0], inputs, export_settings)
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): factor = gltf2_blender_get.get_factor_from_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_emissive_texture(blender_material, export_settings): emissive = gltf2_blender_get.get_socket(blender_material, "Emissive") if emissive is None: emissive = gltf2_blender_get.get_socket_old(blender_material, "Emissive") return gltf2_blender_gather_texture_info.gather_texture_info(emissive, (emissive,), export_settings)